Kết quả nghiên
cứu và phân tích
Kiểm định
tính dừng chuỗi lợi suất
Trước khi tiến hành ước lượng mô hình CAPM, nghiên cứu đã sử dụng
kiểm định Augmented Dickey-Fuller (ADF) để kiểm tra tính dừng của các
chuỗi lợi suất log của năm cổ phiếu: BID, MBB, ACB, CTG, SHB, cùng với
chỉ số thị trường VNI.
Kiểm định tính dừng cho chuỗi BID
adf_results <- lapply(returns, function(x) summary(ur.df(x, type = "drift", selectlags = "AIC")))
print(adf_results$BID)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.073948 -0.007662 -0.000569 0.006908 0.067783
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.153e-05 7.866e-04 0.027 0.978
## z.lag.1 -9.419e-01 7.073e-02 -13.317 <2e-16 ***
## z.diff.lag 2.700e-02 5.215e-02 0.518 0.605
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01511 on 366 degrees of freedom
## Multiple R-squared: 0.459, Adjusted R-squared: 0.456
## F-statistic: 155.3 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -13.317 88.6714
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
Kết quả kiểm định ADF cho cổ phiếu BID như sau:
Giá trị thống kê kiểm định: –13.317
Ngưỡng tới hạn tại mức ý nghĩa 5%:
–2.87
Vì –13.317 < –2.87, chuỗi lợi suất log của cổ phiếu BID là
dừng tại mức ý nghĩa 5%.
Kiểm định tính dừng cho chuỗi MBB
print(adf_results$MBB)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.073090 -0.007440 -0.000723 0.006646 0.064228
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.001079 0.000792 1.363 0.174
## z.lag.1 -0.959857 0.070715 -13.574 <2e-16 ***
## z.diff.lag 0.012987 0.051550 0.252 0.801
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01511 on 366 degrees of freedom
## Multiple R-squared: 0.4804, Adjusted R-squared: 0.4776
## F-statistic: 169.2 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -13.5736 92.1422
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
Kết quả kiểm định ADF cho cổ phiếu MBB như sau:
Giá trị thống kê kiểm định: –13.574
Ngưỡng tới hạn tại mức ý nghĩa 5%: –2.87
Vì –13.574 < –2.87, chuỗi lợi suất log của cổ phiếu MBB là
dừng tại mức ý nghĩa 5%.
Kiểm định tính dừng cho chuỗi ACB
print(adf_results$ACB)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.177697 -0.004760 0.000090 0.005669 0.063812
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.484e-05 8.224e-04 -0.091 0.928
## z.lag.1 -1.058e+00 7.367e-02 -14.366 <2e-16 ***
## z.diff.lag 5.513e-02 5.202e-02 1.060 0.290
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0158 on 366 degrees of freedom
## Multiple R-squared: 0.5034, Adjusted R-squared: 0.5007
## F-statistic: 185.5 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -14.3656 103.1864
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
Kết quả kiểm định ADF cho cổ phiếu ACB như sau:
Giá trị thống kê kiểm định: –14.366
Ngưỡng tới hạn tại mức ý nghĩa 5%: –2.87
Vì –14.366 < –2.87, chuỗi lợi suất log của cổ phiếu ACB là
dừng tại mức ý nghĩa 5%.
Kiểm định tính dừng cho chuỗi CTG
print(adf_results$CTG)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.073150 -0.007290 0.000316 0.007115 0.070429
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0009888 0.0008731 1.133 0.258
## z.lag.1 -0.9412139 0.0729932 -12.895 <2e-16 ***
## z.diff.lag -0.0534138 0.0518643 -1.030 0.304
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01669 on 366 degrees of freedom
## Multiple R-squared: 0.5012, Adjusted R-squared: 0.4985
## F-statistic: 183.9 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -12.8945 83.1406
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
Kết quả kiểm định ADF cho cổ phiếu CTG như sau:
Giá trị thống kê kiểm định: –12.895
Ngưỡng tới hạn tại mức ý nghĩa 5%: –2.87
Vì –12.895 < –2.87, chuỗi lợi suất log của cổ phiếu CTG là
dừng tại mức ý nghĩa 5%.
Kiểm định tính dừng cho chuỗi SHB
print(adf_results$SHB)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.100207 -0.005366 -0.000443 0.007203 0.067206
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0004713 0.0008205 0.574 0.566
## z.lag.1 -1.0200797 0.0739730 -13.790 <2e-16 ***
## z.diff.lag 0.0070456 0.0520003 0.135 0.892
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01574 on 366 degrees of freedom
## Multiple R-squared: 0.5073, Adjusted R-squared: 0.5046
## F-statistic: 188.4 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -13.7899 95.0835
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
Kết quả kiểm định ADF cho cổ phiếu SHB như sau:
Giá trị thống kê kiểm định: –13.790
Ngưỡng tới hạn tại mức ý nghĩa 5%: –2.87
Vì –13.790 < –2.87, chuỗi lợi suất log của cổ phiếu SHB là
dừng tại mức ý nghĩa 5%.
Kiểm định tính dừng cho chuỗi VNI
print(adf_results$VNI)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.069514 -0.003709 0.000218 0.004592 0.068587
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0004385 0.0005432 0.807 0.420
## z.lag.1 -0.8887485 0.0692700 -12.830 <2e-16 ***
## z.diff.lag 0.0090806 0.0522067 0.174 0.862
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01041 on 366 degrees of freedom
## Multiple R-squared: 0.4406, Adjusted R-squared: 0.4375
## F-statistic: 144.1 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -12.8302 82.3085
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
Kết quả kiểm định ADF cho chỉ số VNI như sau:
Giá trị thống kê kiểm định: –12.830
Ngưỡng tới hạn tại mức ý nghĩa 5%: –2.87
Vì –12.830 < –2.87, chuỗi lợi suất log của chỉ số VNI là
dừng tại mức ý nghĩa 5%
Ước lượng mô
hình CAPM
Mô hình CAPM được ước lượng cho từng cổ phiếu theo phương trình:
\[
R_{it} - R_f = \alpha_i + \beta_i (R_{mt} - R_f) + \varepsilon_{it}
\]
Trong đó:
\(R_{it}\): lợi suất của cổ
phiếu \(i\)
\(R_f\): lãi suất phi rủi ro
(giả định 3%/năm, tương đương 0.03/252 mỗi ngày)
\(R_{mt}\): lợi suất của thị
trường (sử dụng chỉ số VNI)
\(\beta_i\): hệ số đo lường mức
độ nhạy cảm với thị trường
rf <- 0.03 / 252 # lãi suất phi rủi ro theo ngày
stocks <- colnames(returns)[colnames(returns) != "VNI"]
CAPM_models <- lapply(stocks, function(stock) {
Ri_excess <- returns[[stock]] - rf
Rm_excess <- returns$VNI - rf
df <- na.omit(data.frame(Ri_excess, Rm_excess))
if (nrow(df) == 0) {
return(NA)
} else {
return(summary(lm(Ri_excess ~ Rm_excess, data = df)))
}
})
names(CAPM_models) <- stocks
# Trích xuất kết quả từ CAPM_models hợp lệ
valid_CAPM <- CAPM_models[!sapply(CAPM_models, function(x) any(is.na(x)))]
# Tính các đại lượng
beta_vals <- sapply(valid_CAPM, function(x) coef(x)[2])
alpha_vals <- sapply(valid_CAPM, function(x) coef(x)[1])
rsq_vals <- sapply(valid_CAPM, function(x) x$r.squared)
# Lợi suất thực tế trung bình (%/năm)
mean_returns <- colMeans(returns[, names(valid_CAPM)], na.rm = TRUE) * 252 * 100
# Lợi suất kỳ vọng theo CAPM (%/năm)
market_return <- mean(returns$VNI, na.rm = TRUE) * 252
expected_returns <- (rf * 252 + beta_vals * (market_return - rf * 252)) * 100
# Tạo bảng kết quả
CAPM_results <- data.frame(
Stock = names(valid_CAPM),
Alpha = round(alpha_vals * 252 * 100, 4),
Beta = round(beta_vals, 4),
R_Squared = round(rsq_vals, 4),
Return_Actual = round(mean_returns, 2),
Return_CAPM = round(expected_returns, 2)
)
# In kết quả
print(CAPM_results)
## Stock Alpha Beta R_Squared Return_Actual Return_CAPM
## BID BID -12.6728 1.0616 0.5384 1.54 14.21
## MBB MBB 17.9963 1.1071 0.5737 32.69 14.69
## ACB ACB -12.7868 0.9688 0.4109 0.44 13.23
## CTG CTG 13.9585 1.2269 0.5865 29.91 15.95
## SHB SHB 2.7264 0.8390 0.3099 14.58 11.86
Giải thích
| Stock |
Mã cổ phiếu |
| Alpha |
Sai số lợi suất (alpha), phản ánh hiệu suất vượt trội nếu >
0 |
| Beta |
Hệ số nhạy cảm với thị trường – càng cao, càng biến động mạnh |
| R_Squared |
Độ phù hợp của mô hình (giải thích bao nhiêu % biến thiên lợi
suất) |
| Return_Actual |
Lợi suất trung bình thực tế (%/năm) |
| Return_CAPM |
Lợi suất kỳ vọng theo mô hình CAPM (%/năm) |
Nhận xét kết quả ước lượng CAPM
Dựa vào bảng kết quả trên, ta có thể rút ra các điểm chính như
sau:
Kết luận lựa chọn
Theo lý thuyết CAPM, cổ phiếu có Alpha dương, lợi suất thực tế
vượt kỳ vọng là có tiềm năng, ví dụ MBB và
CTG.
Để giảm thiểu rủi ro phi hệ thống, nhà đầu tư nên kết hợp
các cổ phiếu Beta khác nhau thành một danh mục đa dạng
hóa, thay vì nắm riêng lẻ.
Trong trường hợp này, MBB và CTG nên được ưu
tiên tỷ trọng cao hơn trong danh mục.
Danh mục cổ phiếu tối ưu nên ưu tiên MBB & CTG, có thể bổ
sung SHB, đồng thời giảm tỷ trọng ACB & BID nếu mục tiêu là tối đa
hóa lợi suất theo mô hình CAPM.**
# Lọc mô hình hợp lệ
valid_CAPM <- CAPM_models[!sapply(CAPM_models, function(x) any(is.na(x)))]
betas <- sapply(valid_CAPM, function(x) coef(x)[2])
means <- colMeans(returns[, names(betas)], na.rm = TRUE) * 252
market_return <- mean(returns$VNI, na.rm = TRUE) * 252
expected_return_CAPM <- rf * 252 + betas * (market_return - rf * 252)
Phân tích
đường thị trường chứng khoán (SML)
Dựa trên kết quả mô hình CAPM, nghiên cứu tiến hành xây dựng đường
thị trường chứng khoán (Security Market Line – SML), thể hiện mối quan
hệ giữa beta và lợi suất kỳ vọng của các cổ phiếu.
Đường SML được xác định theo công thức:
\[
E(R_i) = R_f + \beta_i (E(R_m) - R_f)
\]
Các điểm dữ liệu đại diện cho các cổ phiếu được vẽ trên hệ tọa độ
\((\beta, E(R))\), với đường SML được
thể hiện bằng đường thẳng. So sánh giữa lợi suất trung bình thực tế và
lợi suất theo mô hình giúp xác định:
# Vẽ đường SML
plot(betas, means, pch = 19, col = "blue",
main = "Security Market Line (SML)",
xlab = "Beta", ylab = "Average Return (Annualized)")
abline(a = rf * 252, b = (market_return - rf * 252), col = "red", lwd = 2)
text(betas, means, labels = names(betas), pos = 4)

Nhận xét đường thị trường chứng khoán (SML)
Quan sát đồ thị SML trên, ta thấy:
Diễn giải cụ thể:
MBB và CTG nằm trên
đường SML, thậm chí cao hơn rõ rệt so với lợi
suất kỳ vọng. Điều này cho thấy chúng có thể đang được định giá
thấp, lợi suất thực tế vượt kỳ vọng, phù hợp với Alpha
dương trong bảng kết quả → có tiềm năng đầu
tư.
SHB nằm gần đường SML, hơi cao hơn một chút, cho
thấy cổ phiếu này được định giá tương đối hợp lý, lợi
suất thực tế xấp xỉ lợi suất kỳ vọng.
BID và ACB nằm dưới
đường SML, nghĩa là lợi suất thực tế thấp hơn so với lợi suất
lý thuyết → có thể đang được định giá cao hơn giá trị hợp
lý, ít hấp dẫn hơn trong ngắn hạn.
Kết luận SML
Những cổ phiếu nằm trên hoặc cao hơn đường SML
(MBB, CTG) nên được ưu tiên trong danh mục nếu nhà đầu tư muốn tìm kiếm
mức sinh lợi vượt trội so với mức rủi ro hệ thống đã
chấp nhận.
Việc đa dạng hóa vẫn cần thiết để giảm rủi ro phi hệ thống, nên
có thể bổ sung SHB, đồng thời cân nhắc tỷ trọng thấp cho ACB và
BID.
Phân tích
rủi ro danh mục đầu tư
Từ dữ liệu log-return, ma trận hiệp phương sai hàng năm giữa các cổ
phiếu được tính toán, từ đó ước lượng rủi ro tổng thể của danh mục đầu
tư gồm các cổ phiếu trên với tỷ trọng bằng nhau.
# Tính ma trận hiệp phương sai & VaR danh mục
cov_matrix <- cov(returns[, names(betas)]) * 252
w <- rep(1 / length(betas), length(betas)) # tỷ trọng đều
var_p <- as.numeric(t(w) %*% cov_matrix %*% w)
sd_p <- sqrt(var_p)
VaR_95 <- qnorm(0.95) * sd_p
list(Var = var_p, SD = sd_p, VaR_95 = VaR_95)
## $Var
## [1] 0.04128751
##
## $SD
## [1] 0.2031933
##
## $VaR_95
## [1] 0.3342232
Phương sai của danh mục (annualized):
0.0413
Độ lệch chuẩn (standard deviation):
20.3%
Giá trị rủi ro (Value at Risk - VaR) ở mức 95%:
33.42%
Ý nghĩa: Với mức độ tin cậy 95%, danh mục có
thể lỗ tối đa khoảng 33.42% giá trị trong một năm trong điều
kiện thị trường bình thường.
Phân tích cho thấy mô hình CAPM tương thích với dữ liệu cổ phiếu ngân
hàng giai đoạn nghiên cứu. Các hệ số beta cho thấy sự khác biệt trong độ
nhạy với thị trường giữa các mã cổ phiếu. Đồng thời, việc so sánh lợi
suất thực tế và kỳ vọng cùng với VaR giúp nhà đầu tư có cái nhìn đầy đủ
hơn về cả rủi ro và kỳ vọng lợi suất.
Nhận xét về rủi ro danh mục đầu tư
Dựa trên kết quả tính toán ma trận hiệp phương sai và phân tích rủi
ro:
Phương sai hàng năm của danh mục (Var):
~0.0413
➔ Đây là mức biến động lợi suất bình phương — chỉ ra mức rủi
ro tổng thể của danh mục khi các cổ phiếu được kết hợp với tỷ
trọng bằng nhau.
Độ lệch chuẩn hàng năm (SD): ~0.2032
➔ Đây chính là rủi ro danh mục tính theo %, tương
đương 20.32%/năm, phản ánh mức độ dao động lợi suất
xung quanh lợi suất kỳ vọng.
Giá trị rủi ro VaR ở mức 95% (VaR_95):
~0.3342
➔ Với mức tin cậy 95%, nhà đầu tư có thể đối mặt mức lỗ tối
đa khoảng 33.42% so với giá trị danh mục nếu biến động bất lợi
xảy ra.
Kết luận về rủi ro
So với phương sai & độ lệch chuẩn của cổ phiếu đơn
lẻ, danh mục này giảm thiểu rủi ro tổng thể
nhờ hiệu ứng đa dạng hóa (Covariance giữa các cổ phiếu < 1).
Kết hợp nhiều cổ phiếu với tỷ trọng đều nhau
giúp giảm thiểu rủi ro phi hệ thống, chỉ còn lại rủi ro
hệ thống (Beta).
Trong bối cảnh thị trường ổn định, danh mục này có rủi ro
ở mức chấp nhận được (SD ~ 20%/năm), phù hợp với khẩu vị nhà
đầu tư ưa thích cân bằng giữa lợi suất và rủi
ro.
Do đó, việc lựa chọn danh mục với tỷ trọng đều, ưu tiên các cổ phiếu
có Alpha dương (MBB, CTG) kết hợp cùng các mã khác, sẽ đảm bảo danh mục
vừa sinh lời tốt, vừa kiểm soát rủi ro hợp lý.
LS0tDQp0aXRsZTogIlVudGl0bGVkIg0KYXV0aG9yOiAiVHLhu4tuaCBUaOG7iyBUaHUgSMOgIg0KZGF0ZTogIjIwMjUtMDctMDMiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGVuY29kaW5nOiBVVEYtOA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICAgIHNtb290aF9zY3JvbGw6IHllcw0KLS0tDQoNCjxzdHlsZT4NCi8qIEluIMSR4bqtbSB0b8OgbiBi4buZIHRpw6p1IMSR4buBICovDQpoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQo8L3N0eWxlPg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KHVyY2EpDQpsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQ0KYGBgDQojICoqxJDhu41jIGThu68gbGnhu4d1KioNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmRhdGEgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvQVRDL0RvY3VtZW50cy9aYWxvIFJlY2VpdmVkIEZpbGVzL2RsMS54bHN4IikNCmNvbG5hbWVzKGRhdGEpIDwtIGMoIkRhdGUiLCAiQklEIiwgIk1CQiIsICJBQ0IiLCAiQ1RHIiwgIlNIQiIsICJWTkkiKSANCmBgYA0KDQojICoqVMOtbmggbG9nIHJldHVybioqDQoNCmBgYHtyfQ0KcmV0dXJucyA8LSBhcy5kYXRhLmZyYW1lKGxhcHBseShkYXRhWy0xXSwgZnVuY3Rpb24oeCkgZGlmZihsb2coeCkpKSkNCmNvbG5hbWVzKHJldHVybnMpIDwtIGNvbG5hbWVzKGRhdGEpWy0xXQ0KcmV0dXJucyA8LSBuYS5vbWl0KHJldHVybnMpDQpgYGANCg0KIyAqKkvhur90IHF14bqjIG5naGnDqm4gY+G7qXUgdsOgIHBow6JuIHTDrWNoKioNCg0KIyMgKipLaeG7g20gxJHhu4tuaCB0w61uaCBk4burbmcgY2h14buXaSBs4bujaSBzdeG6pXQqKg0KDQpUcsaw4bubYyBraGkgdGnhur9uIGjDoG5oIMaw4bubYyBsxrDhu6NuZyBtw7QgaMOsbmggQ0FQTSwgbmdoacOqbiBj4bupdSDEkcOjIHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIEF1Z21lbnRlZCBEaWNrZXktRnVsbGVyIChBREYpIMSR4buDIGtp4buDbSB0cmEgdMOtbmggZOG7q25nIGPhu6dhIGPDoWMgY2h14buXaSBs4bujaSBzdeG6pXQgbG9nIGPhu6dhIG7Eg20gY+G7lSBwaGnhur91OiBCSUQsIE1CQiwgQUNCLCBDVEcsIFNIQiwgY8O5bmcgduG7m2kgY2jhu4kgc+G7kSB0aOG7iyB0csaw4budbmcgVk5JLg0KDQoqKktp4buDbSDEkeG7i25oIHTDrW5oIGThu6tuZyBjaG8gY2h14buXaSBCSUQqKg0KDQpgYGB7cn0NCmFkZl9yZXN1bHRzIDwtIGxhcHBseShyZXR1cm5zLCBmdW5jdGlvbih4KSBzdW1tYXJ5KHVyLmRmKHgsIHR5cGUgPSAiZHJpZnQiLCBzZWxlY3RsYWdzID0gIkFJQyIpKSkNCnByaW50KGFkZl9yZXN1bHRzJEJJRCkNCmBgYA0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIEFERiBjaG8gY+G7lSBwaGnhur91IEJJRCBuaMawIHNhdToqKg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6oga2nhu4NtIMSR4buLbmg6ICoq4oCTMTMuMzE3KioNCg0KLSBOZ8aw4buhbmcgdOG7m2kgaOG6oW4gdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlOiAqKuKAkzIuODcqKg0KDQotIFbDrCDigJMxMy4zMTcgPCDigJMyLjg3LCBjaHXhu5dpIGzhu6NpIHN14bqldCBsb2cgY+G7p2EgY+G7lSBwaGnhur91IEJJRCBsw6AgKipk4burbmcqKiB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCioqS2nhu4NtIMSR4buLbmggdMOtbmggZOG7q25nIGNobyBjaHXhu5dpIE1CQioqDQoNCmBgYHtyfQ0KcHJpbnQoYWRmX3Jlc3VsdHMkTUJCKQ0KYGBgDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIEFERiBjaG8gY+G7lSBwaGnhur91IE1CQiBuaMawIHNhdToqKg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6oga2nhu4NtIMSR4buLbmg6IOKAkzEzLjU3NA0KDQotIE5nxrDhu6FuZyB04bubaSBo4bqhbiB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSU6IOKAkzIuODcNCg0KLSBWw6wg4oCTMTMuNTc0IDwg4oCTMi44NywgY2h14buXaSBs4bujaSBzdeG6pXQgbG9nIGPhu6dhIGPhu5UgcGhp4bq/dSBNQkIgbMOgICoqZOG7q25nKiogdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlLg0KDQoqKktp4buDbSDEkeG7i25oIHTDrW5oIGThu6tuZyBjaG8gY2h14buXaSBBQ0IqKg0KDQpgYGB7cn0NCnByaW50KGFkZl9yZXN1bHRzJEFDQikNCmBgYA0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBBREYgY2hvIGPhu5UgcGhp4bq/dSBBQ0IgbmjGsCBzYXU6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIGtp4buDbSDEkeG7i25oOiDigJMxNC4zNjYNCg0KLSBOZ8aw4buhbmcgdOG7m2kgaOG6oW4gdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlOiDigJMyLjg3DQoNCi0gVsOsIOKAkzE0LjM2NiA8IOKAkzIuODcsIGNodeG7l2kgbOG7o2kgc3XhuqV0IGxvZyBj4bunYSBj4buVIHBoaeG6v3UgQUNCIGzDoCAqKmThu6tuZyoqIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JS4NCg0KKipLaeG7g20gxJHhu4tuaCB0w61uaCBk4burbmcgY2hvIGNodeG7l2kgQ1RHKioNCg0KYGBge3J9DQpwcmludChhZGZfcmVzdWx0cyRDVEcpDQpgYGANCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBBREYgY2hvIGPhu5UgcGhp4bq/dSBDVEcgbmjGsCBzYXU6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIGtp4buDbSDEkeG7i25oOiDigJMxMi44OTUNCg0KLSBOZ8aw4buhbmcgdOG7m2kgaOG6oW4gdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlOiDigJMyLjg3DQoNCi0gVsOsIOKAkzEyLjg5NSA8IOKAkzIuODcsIGNodeG7l2kgbOG7o2kgc3XhuqV0IGxvZyBj4bunYSBj4buVIHBoaeG6v3UgQ1RHIGzDoCAqKmThu6tuZyoqIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JS4NCg0KKipLaeG7g20gxJHhu4tuaCB0w61uaCBk4burbmcgY2hvIGNodeG7l2kgU0hCKioNCg0KYGBge3J9DQpwcmludChhZGZfcmVzdWx0cyRTSEIpDQpgYGANCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBBREYgY2hvIGPhu5UgcGhp4bq/dSBTSEIgbmjGsCBzYXU6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIGtp4buDbSDEkeG7i25oOiDigJMxMy43OTANCg0KLSBOZ8aw4buhbmcgdOG7m2kgaOG6oW4gdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlOiDigJMyLjg3DQoNCi0gVsOsIOKAkzEzLjc5MCA8IOKAkzIuODcsIGNodeG7l2kgbOG7o2kgc3XhuqV0IGxvZyBj4bunYSBj4buVIHBoaeG6v3UgU0hCIGzDoCAqKmThu6tuZyoqIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JS4NCg0KKipLaeG7g20gxJHhu4tuaCB0w61uaCBk4burbmcgY2hvIGNodeG7l2kgVk5JKioNCg0KYGBge3J9DQpwcmludChhZGZfcmVzdWx0cyRWTkkpDQpgYGANCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBBREYgY2hvIGNo4buJIHPhu5EgVk5JIG5oxrAgc2F1OioqDQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaDog4oCTMTIuODMwDQoNCi0gTmfGsOG7oW5nIHThu5tpIGjhuqFuIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JTog4oCTMi44Nw0KDQotIFbDrCDigJMxMi44MzAgPCDigJMyLjg3LCBjaHXhu5dpIGzhu6NpIHN14bqldCBsb2cgY+G7p2EgY2jhu4kgc+G7kSBWTkkgbMOgICoqZOG7q25nKiogdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlDQoNCiMjICoqxq/hu5tjIGzGsOG7o25nIG3DtCBow6xuaCBDQVBNKioNCg0KTcO0IGjDrG5oIENBUE0gxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGNobyB04burbmcgY+G7lSBwaGnhur91IHRoZW8gcGjGsMahbmcgdHLDrG5oOg0KDQokJA0KUl97aXR9IC0gUl9mID0gXGFscGhhX2kgKyBcYmV0YV9pIChSX3ttdH0gLSBSX2YpICsgXHZhcmVwc2lsb25fe2l0fQ0KJCQNCg0KVHJvbmcgxJHDszoNCg0KLSAkUl97aXR9JDogbOG7o2kgc3XhuqV0IGPhu6dhIGPhu5UgcGhp4bq/dSAkaSQNCg0KLSAkUl9mJDogbMOjaSBzdeG6pXQgcGhpIHLhu6dpIHJvIChnaeG6oyDEkeG7i25oIDMlL27Eg20sIHTGsMahbmcgxJHGsMahbmcgMC4wMy8yNTIgbeG7l2kgbmfDoHkpDQoNCi0gJFJfe210fSQ6IGzhu6NpIHN14bqldCBj4bunYSB0aOG7iyB0csaw4budbmcgKHPhu60gZOG7pW5nIGNo4buJIHPhu5EgVk5JKQ0KDQotICRcYmV0YV9pJDogaOG7hyBz4buRIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSBuaOG6oXkgY+G6o20gduG7m2kgdGjhu4sgdHLGsOG7nW5nDQoNCmBgYHtyfQ0KcmYgPC0gMC4wMyAvIDI1MiAgIyBsw6NpIHN14bqldCBwaGkgcuG7p2kgcm8gdGhlbyBuZ8OgeQ0Kc3RvY2tzIDwtIGNvbG5hbWVzKHJldHVybnMpW2NvbG5hbWVzKHJldHVybnMpICE9ICJWTkkiXQ0KDQpDQVBNX21vZGVscyA8LSBsYXBwbHkoc3RvY2tzLCBmdW5jdGlvbihzdG9jaykgew0KICBSaV9leGNlc3MgPC0gcmV0dXJuc1tbc3RvY2tdXSAtIHJmDQogIFJtX2V4Y2VzcyA8LSByZXR1cm5zJFZOSSAtIHJmDQogIGRmIDwtIG5hLm9taXQoZGF0YS5mcmFtZShSaV9leGNlc3MsIFJtX2V4Y2VzcykpDQogIGlmIChucm93KGRmKSA9PSAwKSB7DQogICAgcmV0dXJuKE5BKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihzdW1tYXJ5KGxtKFJpX2V4Y2VzcyB+IFJtX2V4Y2VzcywgZGF0YSA9IGRmKSkpDQogIH0NCn0pDQpuYW1lcyhDQVBNX21vZGVscykgPC0gc3RvY2tzDQpgYGANCg0KDQpgYGB7cn0NCiMgVHLDrWNoIHh14bqldCBr4bq/dCBxdeG6oyB04burIENBUE1fbW9kZWxzIGjhu6NwIGzhu4cNCnZhbGlkX0NBUE0gPC0gQ0FQTV9tb2RlbHNbIXNhcHBseShDQVBNX21vZGVscywgZnVuY3Rpb24oeCkgYW55KGlzLm5hKHgpKSldDQoNCiMgVMOtbmggY8OhYyDEkeG6oWkgbMaw4bujbmcNCmJldGFfdmFscyA8LSBzYXBwbHkodmFsaWRfQ0FQTSwgZnVuY3Rpb24oeCkgY29lZih4KVsyXSkNCmFscGhhX3ZhbHMgPC0gc2FwcGx5KHZhbGlkX0NBUE0sIGZ1bmN0aW9uKHgpIGNvZWYoeClbMV0pDQpyc3FfdmFscyA8LSBzYXBwbHkodmFsaWRfQ0FQTSwgZnVuY3Rpb24oeCkgeCRyLnNxdWFyZWQpDQoNCiMgTOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IHRydW5nIGLDrG5oICglL27Eg20pDQptZWFuX3JldHVybnMgPC0gY29sTWVhbnMocmV0dXJuc1ssIG5hbWVzKHZhbGlkX0NBUE0pXSwgbmEucm0gPSBUUlVFKSAqIDI1MiAqIDEwMA0KDQojIEzhu6NpIHN14bqldCBr4buzIHbhu41uZyB0aGVvIENBUE0gKCUvbsSDbSkNCm1hcmtldF9yZXR1cm4gPC0gbWVhbihyZXR1cm5zJFZOSSwgbmEucm0gPSBUUlVFKSAqIDI1Mg0KZXhwZWN0ZWRfcmV0dXJucyA8LSAocmYgKiAyNTIgKyBiZXRhX3ZhbHMgKiAobWFya2V0X3JldHVybiAtIHJmICogMjUyKSkgKiAxMDANCg0KIyBU4bqhbyBi4bqjbmcga+G6v3QgcXXhuqMNCkNBUE1fcmVzdWx0cyA8LSBkYXRhLmZyYW1lKA0KICBTdG9jayA9IG5hbWVzKHZhbGlkX0NBUE0pLA0KICBBbHBoYSA9IHJvdW5kKGFscGhhX3ZhbHMgKiAyNTIgKiAxMDAsIDQpLCAgICAgICAgICAgIA0KICBCZXRhID0gcm91bmQoYmV0YV92YWxzLCA0KSwNCiAgUl9TcXVhcmVkID0gcm91bmQocnNxX3ZhbHMsIDQpLA0KICBSZXR1cm5fQWN0dWFsID0gcm91bmQobWVhbl9yZXR1cm5zLCAyKSwNCiAgUmV0dXJuX0NBUE0gPSByb3VuZChleHBlY3RlZF9yZXR1cm5zLCAyKQ0KKQ0KDQojIEluIGvhur90IHF14bqjDQpwcmludChDQVBNX3Jlc3VsdHMpDQoNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2gqKg0KDQp8IEPhu5l0ICAgICAgICAgICAgICAgIHwgw50gbmdoxKlhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8ICoqU3RvY2sqKiAgICAgICAgICB8IE3DoyBj4buVIHBoaeG6v3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQWxwaGEqKiAgICAgICAgICB8IFNhaSBz4buRIGzhu6NpIHN14bqldCAoYWxwaGEpLCBwaOG6o24gw6FuaCBoaeG7h3Ugc3XhuqV0IHbGsOG7o3QgdHLhu5lpIG7hur91ID4gMCAgICAgICB8DQp8ICoqQmV0YSoqICAgICAgICAgICB8IEjhu4cgc+G7kSBuaOG6oXkgY+G6o20gduG7m2kgdGjhu4sgdHLGsOG7nW5nIOKAkyBjw6BuZyBjYW8sIGPDoG5nIGJp4bq/biDEkeG7mW5nIG3huqFuaCAgICAgICB8DQp8ICoqUlxfU3F1YXJlZCoqICAgICB8IMSQ4buZIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oIChnaeG6o2kgdGjDrWNoIGJhbyBuaGnDqnUgJSBiaeG6v24gdGhpw6puIGzhu6NpIHN14bqldCkgfA0KfCAqKlJldHVyblxfQWN0dWFsKiogfCBM4bujaSBzdeG6pXQgdHJ1bmcgYsOsbmggdGjhu7FjIHThur8gKCUvbsSDbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqUmV0dXJuXF9DQVBNKiogICB8IEzhu6NpIHN14bqldCBr4buzIHbhu41uZyB0aGVvIG3DtCBow6xuaCBDQVBNICglL27Eg20pICAgICAgICAgICAgICAgICAgICAgICAgICB8DQoNCioqTmjhuq1uIHjDqXQga+G6v3QgcXXhuqMgxrDhu5tjIGzGsOG7o25nIENBUE0qKg0KDQpE4buxYSB2w6BvIGLhuqNuZyBr4bq/dCBxdeG6oyB0csOqbiwgdGEgY8OzIHRo4buDIHLDunQgcmEgY8OhYyDEkWnhu4NtIGNow61uaCBuaMawIHNhdToNCg0KLSAqKkjhu4cgc+G7kSBCZXRhKio6ICANCg0KICAtIEPDoWMgY+G7lSBwaGnhur91IMSR4buBdSBjw7MgQmV0YSBkYW8gxJHhu5luZyBxdWFuaCBt4bupYyAxLCB0aOG7gyBoaeG7h24gbeG7qWMgxJHhu5kgYmnhur9uIMSR4buZbmcgZ+G6p24gdMawxqFuZyDEkcawxqFuZyBob+G6t2MgY2FvIGjGoW4gdGjhu4sgdHLGsOG7nW5nLg0KICANCiAgLSBDVEcgY8OzIEJldGEgY2FvIG5o4bqldCAoKioxLjIyNjkqKiksIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgbmjhuqF5IGPhuqNtIHbhu5tpIHRo4buLIHRyxrDhu51uZyBt4bqhbmggbmjhuqV0LiANCiAgDQogIC0gU0hCIGPDsyBCZXRhIHRo4bqlcCBuaOG6pXQgKCoqMC44MzkwKiopLCBiaeG6v24gxJHhu5luZyB0aOG6pXAgaMahbiB0aOG7iyB0csaw4budbmcuDQoNCi0gKipBbHBoYSoqOiAgDQoNCiAgLSBNQkIgKCoqMTguMTAzNCoqKSB2w6AgQ1RHICgqKjE0LjE4NTQqKikgY8OzIEFscGhhIGTGsMahbmcgbOG7m24sIGNobyB0aOG6pXkgbOG7o2kgc3XhuqV0IHbGsOG7o3QgbeG7qWMga+G7syB24buNbmcgdGhlbyBDQVBNLCDEkcOieSBjw7MgdGjhu4MgbMOgIGThuqV1IGhp4buHdSAqKsSR4buLbmggZ2nDoSB0aOG6pXAqKiDigJQgdGnhu4FtIG7Eg25nIHNpbmggbOG7o2kgY2FvLiAgDQogIA0KICAtIEJJRCAoKirigJMxMi42MTEyKiopIHbDoCBBQ0IgKCoq4oCTMTIuODE4MCoqKSBjw7MgQWxwaGEgw6JtIGtow6EgbOG7m24sIGNobyB0aOG6pXkgbOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IGvDqW0gaMahbiBr4buzIHbhu41uZywgY8OzIHRo4buDIMSRYW5nIGLhu4sgKirEkeG7i25oIGdpw6EgY2FvIGjGoW4gZ2nDoSB0cuG7iyBo4bujcCBsw70qKi4gIA0KICANCiAgLSBTSEIgY8OzIEFscGhhIGTGsMahbmcgbmjhurkgKCoqMi41NjUzKiopLCBn4bqnbiBt4bupYyB0cnVuZyBiw6xuaCwgY2hvIHRo4bqleSBt4bupYyBzaW5oIGzhu6NpIHbhu6thIHBo4bqjaSBzbyB24bubaSBy4bunaSBybyBo4buHIHRo4buRbmcuDQoNCi0gKipSLXNxdWFyZWQqKjogIA0KDQogIC0gQ8OhYyBnacOhIHRy4buLIFLCsiBkYW8gxJHhu5luZyB04burIH4wLjMgxJHhur9uIH4wLjU4LCBuZ2jEqWEgbMOgIG3DtCBow6xuaCBDQVBNIGdp4bqjaSB0aMOtY2ggxJHGsOG7o2MgdOG7qyAqKjMwJeKAkzU4JSoqIGJp4bq/biDEkeG7mW5nIGzhu6NpIHN14bqldCBjw6FjIGPhu5UgcGhp4bq/dS4gIA0KICAtIE1CQiAoKiowLjU3MzcqKikgdsOgIENURyAoKiowLjU4NjUqKikgY8OzIFLCsiBjYW8gbmjhuqV0LCBtw7QgaMOsbmggcGjDuSBo4bujcCB04buRdC4gIA0KICANCiAgLSBTSEIgKCoqMC4zMDk5KiopIGPDsyBSwrIgdGjhuqVwIG5o4bqldCwgY2hvIHRo4bqleSBDQVBNIGdp4bqjaSB0aMOtY2ggY2jGsGEgdOG7kXQgdG/DoG4gYuG7mSBiaeG6v24gxJHhu5luZyDigJQgY8OzIHRo4buDIGLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgeeG6v3UgdOG7kSBwaGkgaOG7hyB0aOG7kW5nLg0KDQotICoqU28gc8OhbmggbOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IHbDoCBr4buzIHbhu41uZyoqOiAgDQoNCiAgLSAqKk1CQiAoMzIuNjklIHRo4buxYyB04bq/ID4gMTQuNTglIGvhu7MgduG7jW5nKSoqIHbDoCAqKkNURyAoMjkuOTElID4gMTUuNzMlKSoqOiBzaW5oIGzhu51pIGNhbyBoxqFuIENBUE0gZOG7sSBiw6FvLCBwaMO5IGjhu6NwIHbhu5tpIEFscGhhIGTGsMahbmcg4oCUIGThuqV1IGhp4buHdSBo4bqlcCBk4bqrbiDEkeG6p3UgdMawLiAgDQogIA0KICAtICoqQklEICgxLjU0JSB0aOG7sWMgdOG6vyA8IDE0LjE1JSBr4buzIHbhu41uZykqKiB2w6AgKipBQ0IgKDAuNDQlIDwgMTMuMjYlKSoqOiBzaW5oIGzhu51pIHRo4bqlcCBoxqFuLCBwaMO5IGjhu6NwIEFscGhhIMOibSDigJQgbmjDoCDEkeG6p3UgdMawIG7Dqm4gdGjhuq1uIHRy4buNbmcuICANCiAgDQogIC0gKipTSEIgKDE0LjU4JSB0aOG7sWMgdOG6vyA+IDEyLjAyJSBr4buzIHbhu41uZykqKjogY2jDqm5oIGzhu4djaCBuaOG6uSwga2jDtG5nIHF1w6Ega2jDoWMgYmnhu4d0LCBt4bupYyDEkeG7i25oIGdpw6Ega2jDoSBjw6JuIGLhurFuZy4NCg0KKipL4bq/dCBsdeG6rW4gbOG7sWEgY2jhu41uKioNCg0KLSBUaGVvIGzDvSB0aHV54bq/dCBDQVBNLCBj4buVIHBoaeG6v3UgY8OzIEFscGhhIGTGsMahbmcsIGzhu6NpIHN14bqldCB0aOG7sWMgdOG6vyB2xrDhu6N0IGvhu7MgduG7jW5nIGzDoCAqKmPDsyB0aeG7gW0gbsSDbmcqKiwgdsOtIGThu6UgKipNQkIgdsOgIENURyoqLg0KDQotIMSQ4buDIGdp4bqjbSB0aGnhu4N1IHLhu6dpIHJvIHBoaSBo4buHIHRo4buRbmcsIG5ow6AgxJHhuqd1IHTGsCBuw6puICoqa+G6v3QgaOG7o3AgY8OhYyBj4buVIHBoaeG6v3UgQmV0YSBraMOhYyBuaGF1KiogdGjDoG5oICoqbeG7mXQgZGFuaCBt4bulYyDEkWEgZOG6oW5nIGjDs2EqKiwgdGhheSB2w6wgbuG6r20gcmnDqm5nIGzhursuDQoNCi0gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksICoqTUJCIHbDoCBDVEcqKiBuw6puIMSRxrDhu6NjIMawdSB0acOqbiB04bu3IHRy4buNbmcgY2FvIGjGoW4gdHJvbmcgZGFuaCBt4bulYy4NCg0KLSBEYW5oIG3hu6VjIGPhu5UgcGhp4bq/dSB04buRaSDGsHUgbsOqbiDGsHUgdGnDqm4gTUJCICYgQ1RHLCBjw7MgdGjhu4MgYuG7lSBzdW5nIFNIQiwgxJHhu5NuZyB0aOG7nWkgZ2nhuqNtIHThu7cgdHLhu41uZyBBQ0IgJiBCSUQgbuG6v3UgbeG7pWMgdGnDqnUgbMOgIHThu5FpIMSRYSBow7NhIGzhu6NpIHN14bqldCB0aGVvIG3DtCBow6xuaCBDQVBNLioqDQoNCg0KYGBge3J9DQojIEzhu41jIG3DtCBow6xuaCBo4bujcCBs4buHDQp2YWxpZF9DQVBNIDwtIENBUE1fbW9kZWxzWyFzYXBwbHkoQ0FQTV9tb2RlbHMsIGZ1bmN0aW9uKHgpIGFueShpcy5uYSh4KSkpXQ0KYmV0YXMgPC0gc2FwcGx5KHZhbGlkX0NBUE0sIGZ1bmN0aW9uKHgpIGNvZWYoeClbMl0pDQptZWFucyA8LSBjb2xNZWFucyhyZXR1cm5zWywgbmFtZXMoYmV0YXMpXSwgbmEucm0gPSBUUlVFKSAqIDI1Mg0KbWFya2V0X3JldHVybiA8LSBtZWFuKHJldHVybnMkVk5JLCBuYS5ybSA9IFRSVUUpICogMjUyDQpleHBlY3RlZF9yZXR1cm5fQ0FQTSA8LSByZiAqIDI1MiArIGJldGFzICogKG1hcmtldF9yZXR1cm4gLSByZiAqIDI1MikNCmBgYA0KDQojIyAqKlBow6JuIHTDrWNoIMSRxrDhu51uZyB0aOG7iyB0csaw4budbmcgY2jhu6luZyBraG/DoW4gKFNNTCkqKg0KDQpE4buxYSB0csOqbiBr4bq/dCBxdeG6oyBtw7QgaMOsbmggQ0FQTSwgbmdoacOqbiBj4bupdSB0aeG6v24gaMOgbmggeMOieSBk4buxbmcgxJHGsOG7nW5nIHRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiAoU2VjdXJpdHkgTWFya2V0IExpbmUg4oCTIFNNTCksIHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGJldGEgdsOgIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyBj4bunYSBjw6FjIGPhu5UgcGhp4bq/dS4NCg0KxJDGsOG7nW5nIFNNTCDEkcaw4bujYyB4w6FjIMSR4buLbmggdGhlbyBjw7RuZyB0aOG7qWM6DQoNCiQkDQpFKFJfaSkgPSBSX2YgKyBcYmV0YV9pIChFKFJfbSkgLSBSX2YpDQokJA0KDQpDw6FjIMSRaeG7g20gZOG7ryBsaeG7h3UgxJHhuqFpIGRp4buHbiBjaG8gY8OhYyBj4buVIHBoaeG6v3UgxJHGsOG7o2MgduG6vSB0csOqbiBo4buHIHThu41hIMSR4buZICQoXGJldGEsIEUoUikpJCwgduG7m2kgxJHGsOG7nW5nIFNNTCDEkcaw4bujYyB0aOG7gyBoaeG7h24gYuG6sW5nIMSRxrDhu51uZyB0aOG6s25nLiBTbyBzw6FuaCBnaeG7r2EgbOG7o2kgc3XhuqV0IHRydW5nIGLDrG5oIHRo4buxYyB04bq/IHbDoCBs4bujaSBzdeG6pXQgdGhlbyBtw7QgaMOsbmggZ2nDunAgeMOhYyDEkeG7i25oOg0KDQotIE7hur91IG3hu5l0IGPhu5UgcGhp4bq/dSBu4bqxbSAqKnRyw6puIMSRxrDhu51uZyBTTUwqKjogY+G7lSBwaGnhur91IGPDsyB0aOG7gyDEkWFuZyAqKsSR4buLbmggZ2nDoSB0aOG6pXAqKi4NCg0KLSBO4bq/dSBu4bqxbSAqKmTGsOG7m2kgxJHGsOG7nW5nIFNNTCoqOiBj4buVIHBoaeG6v3UgY8OzIHRo4buDIMSRYW5nICoqxJHhu4tuaCBnacOhIGNhbyoqLg0KDQpgYGB7cn0NCiMgVuG6vSDEkcaw4budbmcgU01MDQpwbG90KGJldGFzLCBtZWFucywgcGNoID0gMTksIGNvbCA9ICJibHVlIiwNCiAgICAgbWFpbiA9ICJTZWN1cml0eSBNYXJrZXQgTGluZSAoU01MKSIsDQogICAgIHhsYWIgPSAiQmV0YSIsIHlsYWIgPSAiQXZlcmFnZSBSZXR1cm4gKEFubnVhbGl6ZWQpIikNCmFibGluZShhID0gcmYgKiAyNTIsIGIgPSAobWFya2V0X3JldHVybiAtIHJmICogMjUyKSwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQp0ZXh0KGJldGFzLCBtZWFucywgbGFiZWxzID0gbmFtZXMoYmV0YXMpLCBwb3MgPSA0KQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQgxJHGsOG7nW5nIHRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiAoU01MKSoqDQoNClF1YW4gc8OhdCDEkeG7kyB0aOG7iyBTTUwgdHLDqm4sIHRhIHRo4bqleToNCg0KLSAqKsSQxrDhu51uZyBTTUwgKG3DoHUgxJHhu48pKiogYmnhu4N1IGRp4buFbiBt4buRaSBxdWFuIGjhu4cgbMO9IHRodXnhur90IGdp4buvYSAqKkJldGEqKiB2w6AgKips4bujaSBzdeG6pXQga+G7syB24buNbmcqKiB0aGVvIG3DtCBow6xuaCBDQVBNLg0KDQotIEPDoWMgKirEkWnhu4NtIG3DoHUgeGFuaCoqIGzDoCB24buLIHRyw60gbOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IGPhu6dhIHThu6tuZyBj4buVIHBoaeG6v3UuDQoNCioqRGnhu4VuIGdp4bqjaSBj4bulIHRo4buDOioqDQoNCi0gKipNQkIqKiB2w6AgKipDVEcqKiBu4bqxbSAqKnRyw6puIMSRxrDhu51uZyBTTUwqKiwgdGjhuq1tIGNow60gKipjYW8gaMahbiByw7UgcuG7h3QqKiBzbyB24bubaSBs4bujaSBzdeG6pXQga+G7syB24buNbmcuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGNow7puZyAqKmPDsyB0aOG7gyDEkWFuZyDEkcaw4bujYyDEkeG7i25oIGdpw6EgdGjhuqVwKiosIGzhu6NpIHN14bqldCB0aOG7sWMgdOG6vyB2xrDhu6N0IGvhu7MgduG7jW5nLCAqKnBow7kgaOG7o3AgduG7m2kgQWxwaGEgZMawxqFuZyoqIHRyb25nIGLhuqNuZyBr4bq/dCBxdeG6oyDihpIgKipjw7MgdGnhu4FtIG7Eg25nIMSR4bqndSB0xrAqKi4NCg0KLSAqKlNIQioqIG7hurFtIGfhuqduIMSRxrDhu51uZyBTTUwsIGjGoWkgY2FvIGjGoW4gbeG7mXQgY2jDunQsIGNobyB0aOG6pXkgY+G7lSBwaGnhur91IG7DoHkgKirEkcaw4bujYyDEkeG7i25oIGdpw6EgdMawxqFuZyDEkeG7kWkgaOG7o3AgbMO9KiosIGzhu6NpIHN14bqldCB0aOG7sWMgdOG6vyB44bqlcCB44buJIGzhu6NpIHN14bqldCBr4buzIHbhu41uZy4NCg0KLSAqKkJJRCoqIHbDoCAqKkFDQioqIG7hurFtICoqZMaw4bubaSDEkcaw4budbmcgU01MKiosIG5naMSpYSBsw6AgbOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IHRo4bqlcCBoxqFuIHNvIHbhu5tpIGzhu6NpIHN14bqldCBsw70gdGh1eeG6v3Qg4oaSICoqY8OzIHRo4buDIMSRYW5nIMSRxrDhu6NjIMSR4buLbmggZ2nDoSBjYW8gaMahbiBnacOhIHRy4buLIGjhu6NwIGzDvSoqLCDDrXQgaOG6pXAgZOG6q24gaMahbiB0cm9uZyBuZ+G6r24gaOG6oW4uDQoNCioqS+G6v3QgbHXhuq1uIFNNTCoqDQoNCi0gTmjhu69uZyBj4buVIHBoaeG6v3UgKipu4bqxbSB0csOqbiBob+G6t2MgY2FvIGjGoW4gxJHGsOG7nW5nIFNNTCoqIChNQkIsIENURykgbsOqbiDEkcaw4bujYyDGsHUgdGnDqm4gdHJvbmcgZGFuaCBt4bulYyBu4bq/dSBuaMOgIMSR4bqndSB0xrAgbXXhu5FuIHTDrG0ga2nhur9tICoqbeG7qWMgc2luaCBs4bujaSB2xrDhu6N0IHRy4buZaSoqIHNvIHbhu5tpIG3hu6ljIHLhu6dpIHJvIGjhu4cgdGjhu5FuZyDEkcOjIGNo4bqlcCBuaOG6rW4uDQoNCi0gVmnhu4djIMSRYSBk4bqhbmcgaMOzYSB24bqrbiBj4bqnbiB0aGnhur90IMSR4buDIGdp4bqjbSBy4bunaSBybyBwaGkgaOG7hyB0aOG7kW5nLCBuw6puIGPDsyB0aOG7gyBi4buVIHN1bmcgU0hCLCDEkeG7k25nIHRo4budaSBjw6JuIG5o4bqvYyB04bu3IHRy4buNbmcgdGjhuqVwIGNobyBBQ0IgdsOgIEJJRC4NCg0KIyMjICoqUGjDom4gdMOtY2ggcuG7p2kgcm8gZGFuaCBt4bulYyDEkeG6p3UgdMawKioNCg0KVOG7qyBk4buvIGxp4buHdSBsb2ctcmV0dXJuLCBtYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaSBow6BuZyBuxINtIGdp4buvYSBjw6FjIGPhu5UgcGhp4bq/dSDEkcaw4bujYyB0w61uaCB0b8OhbiwgdOG7qyDEkcOzIMaw4bubYyBsxrDhu6NuZyBy4bunaSBybyB04buVbmcgdGjhu4MgY+G7p2EgZGFuaCBt4bulYyDEkeG6p3UgdMawIGfhu5NtIGPDoWMgY+G7lSBwaGnhur91IHRyw6puIHbhu5tpIHThu7cgdHLhu41uZyBi4bqxbmcgbmhhdS4NCg0KDQpgYGB7cn0NCiMgVMOtbmggbWEgdHLhuq1uIGhp4buHcCBwaMawxqFuZyBzYWkgJiBWYVIgZGFuaCBt4bulYw0KY292X21hdHJpeCA8LSBjb3YocmV0dXJuc1ssIG5hbWVzKGJldGFzKV0pICogMjUyDQp3IDwtIHJlcCgxIC8gbGVuZ3RoKGJldGFzKSwgbGVuZ3RoKGJldGFzKSkgICMgdOG7tyB0cuG7jW5nIMSR4buBdQ0KdmFyX3AgPC0gYXMubnVtZXJpYyh0KHcpICUqJSBjb3ZfbWF0cml4ICUqJSB3KQ0Kc2RfcCA8LSBzcXJ0KHZhcl9wKQ0KVmFSXzk1IDwtIHFub3JtKDAuOTUpICogc2RfcA0KDQpsaXN0KFZhciA9IHZhcl9wLCBTRCA9IHNkX3AsIFZhUl85NSA9IFZhUl85NSkNCg0KYGBgDQoNCi0gKipQaMawxqFuZyBzYWkgY+G7p2EgZGFuaCBt4bulYyAoYW5udWFsaXplZCkqKjogMC4wNDEzDQoNCi0gKirEkOG7mSBs4buHY2ggY2h14bqpbiAoc3RhbmRhcmQgZGV2aWF0aW9uKSoqOiAyMC4zJQ0KDQotICoqR2nDoSB0cuG7iyBy4bunaSBybyAoVmFsdWUgYXQgUmlzayAtIFZhUikg4bufIG3hu6ljIDk1JSoqOiAqKjMzLjQyJSoqDQoNCioqw50gbmdoxKlhKio6IFbhu5tpIG3hu6ljIMSR4buZIHRpbiBj4bqteSA5NSUsICoqZGFuaCBt4bulYyBjw7MgdGjhu4MgbOG7lyB04buRaSDEkWEga2hv4bqjbmcgMzMuNDIlIGdpw6EgdHLhu4sgdHJvbmcgbeG7mXQgbsSDbSoqIHRyb25nIMSRaeG7gXUga2nhu4duIHRo4buLIHRyxrDhu51uZyBiw6xuaCB0aMaw4budbmcuDQoNClBow6JuIHTDrWNoIGNobyB0aOG6pXkgbcO0IGjDrG5oIENBUE0gdMawxqFuZyB0aMOtY2ggduG7m2kgZOG7ryBsaeG7h3UgY+G7lSBwaGnhur91IG5nw6JuIGjDoG5nIGdpYWkgxJFv4bqhbiBuZ2hpw6puIGPhu6l1LiBDw6FjIGjhu4cgc+G7kSBiZXRhIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgdHJvbmcgxJHhu5kgbmjhuqF5IHbhu5tpIHRo4buLIHRyxrDhu51uZyBnaeG7r2EgY8OhYyBtw6MgY+G7lSBwaGnhur91LiDEkOG7k25nIHRo4budaSwgdmnhu4djIHNvIHPDoW5oIGzhu6NpIHN14bqldCB0aOG7sWMgdOG6vyB2w6Aga+G7syB24buNbmcgY8O5bmcgduG7m2kgVmFSIGdpw7pwIG5ow6AgxJHhuqd1IHTGsCBjw7MgY8OhaSBuaMOsbiDEkeG6p3kgxJHhu6cgaMahbiB24buBIGPhuqMgcuG7p2kgcm8gdsOgIGvhu7MgduG7jW5nIGzhu6NpIHN14bqldC4NCg0KKipOaOG6rW4geMOpdCB24buBIHLhu6dpIHJvIGRhbmggbeG7pWMgxJHhuqd1IHTGsCoqDQoNCkThu7FhIHRyw6puIGvhur90IHF14bqjIHTDrW5oIHRvw6FuIG1hIHRy4bqtbiBoaeG7h3AgcGjGsMahbmcgc2FpIHbDoCBwaMOibiB0w61jaCBy4bunaSBybzoNCg0KLSAqKlBoxrDGoW5nIHNhaSBow6BuZyBuxINtIGPhu6dhIGRhbmggbeG7pWMgKFZhcikqKjogfjAuMDQxMyAgDQoNCiAg4p6UIMSQw6J5IGzDoCBt4bupYyBiaeG6v24gxJHhu5luZyBs4bujaSBzdeG6pXQgYsOsbmggcGjGsMahbmcg4oCUIGNo4buJIHJhICoqbeG7qWMgcuG7p2kgcm8gdOG7lW5nIHRo4buDKiogY+G7p2EgZGFuaCBt4bulYyBraGkgY8OhYyBj4buVIHBoaeG6v3UgxJHGsOG7o2Mga+G6v3QgaOG7o3AgduG7m2kgdOG7tyB0cuG7jW5nIGLhurFuZyBuaGF1Lg0KDQotICoqxJDhu5kgbOG7h2NoIGNodeG6qW4gaMOgbmcgbsSDbSAoU0QpKio6IH4wLjIwMzIgIA0KDQogIOKelCDEkMOieSBjaMOtbmggbMOgICoqcuG7p2kgcm8gZGFuaCBt4bulYyB0w61uaCB0aGVvICUqKiwgdMawxqFuZyDEkcawxqFuZyAqKjIwLjMyJS9uxINtKiosIHBo4bqjbiDDoW5oIG3hu6ljIMSR4buZIGRhbyDEkeG7mW5nIGzhu6NpIHN14bqldCB4dW5nIHF1YW5oIGzhu6NpIHN14bqldCBr4buzIHbhu41uZy4NCg0KLSAqKkdpw6EgdHLhu4sgcuG7p2kgcm8gVmFSIOG7nyBt4bupYyA5NSUgKFZhUl85NSkqKjogfjAuMzM0MiAgDQoNCiAg4p6UIFbhu5tpIG3hu6ljIHRpbiBj4bqteSA5NSUsIG5ow6AgxJHhuqd1IHTGsCBjw7MgdGjhu4MgxJHhu5FpIG3hurd0ICoqbeG7qWMgbOG7lyB04buRaSDEkWEga2hv4bqjbmcgMzMuNDIlKiogc28gduG7m2kgZ2nDoSB0cuG7iyBkYW5oIG3hu6VjIG7hur91IGJp4bq/biDEkeG7mW5nIGLhuqV0IGzhu6NpIHjhuqN5IHJhLg0KDQoqKkvhur90IGx14bqtbiB24buBIHLhu6dpIHJvKioNCg0KLSBTbyB24bubaSBwaMawxqFuZyBzYWkgJiDEkeG7mSBs4buHY2ggY2h14bqpbiBj4bunYSAqKmPhu5UgcGhp4bq/dSDEkcahbiBs4bq7KiosIGRhbmggbeG7pWMgbsOgeSAqKmdp4bqjbSB0aGnhu4N1IHLhu6dpIHJvIHThu5VuZyB0aOG7gyoqIG5o4budIGhp4buHdSDhu6luZyDEkWEgZOG6oW5nIGjDs2EgKENvdmFyaWFuY2UgZ2nhu69hIGPDoWMgY+G7lSBwaGnhur91IDwgMSkuDQoNCi0gS+G6v3QgaOG7o3Agbmhp4buBdSBj4buVIHBoaeG6v3UgduG7m2kgKip04bu3IHRy4buNbmcgxJHhu4F1IG5oYXUqKiBnacO6cCBnaeG6o20gdGhp4buDdSAqKnLhu6dpIHJvIHBoaSBo4buHIHRo4buRbmcqKiwgY2jhu4kgY8OybiBs4bqhaSBy4bunaSBybyBo4buHIHRo4buRbmcgKEJldGEpLg0KDQotIFRyb25nIGLhu5FpIGPhuqNuaCB0aOG7iyB0csaw4budbmcg4buVbiDEkeG7i25oLCBkYW5oIG3hu6VjIG7DoHkgY8OzICoqcuG7p2kgcm8g4bufIG3hu6ljIGNo4bqlcCBuaOG6rW4gxJHGsOG7o2MqKiAoU0QgfiAyMCUvbsSDbSksIHBow7kgaOG7o3AgduG7m2kga2jhuql1IHbhu4sgbmjDoCDEkeG6p3UgdMawIMawYSB0aMOtY2ggY8OibiBi4bqxbmcgZ2nhu69hICoqbOG7o2kgc3XhuqV0IHbDoCBy4bunaSBybyoqLg0KDQpEbyDEkcOzLCB2aeG7h2MgbOG7sWEgY2jhu41uIGRhbmggbeG7pWMgduG7m2kgdOG7tyB0cuG7jW5nIMSR4buBdSwgxrB1IHRpw6puIGPDoWMgY+G7lSBwaGnhur91IGPDsyBBbHBoYSBkxrDGoW5nIChNQkIsIENURykga+G6v3QgaOG7o3AgY8O5bmcgY8OhYyBtw6Mga2jDoWMsIHPhur0gxJHhuqNtIGLhuqNvIGRhbmggbeG7pWMgduG7q2Egc2luaCBs4budaSB04buRdCwgduG7q2Ega2nhu4NtIHNvw6F0IHLhu6dpIHJvIGjhu6NwIGzDvS4NCg==