knitr::opts_chunk$set(echo = TRUE)
library(quantmod)
## Warning: package 'quantmod' was built under R version 4.3.3
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::first() masks xts::first()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::last() masks xts::last()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(broom)
library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.3
##
## Attaching package: 'PerformanceAnalytics'
##
## The following object is masked from 'package:graphics':
##
## legend
library(dplyr)
library(xts)
library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.3.3
library(sandwich)
## Warning: package 'sandwich' was built under R version 4.3.3
library(broom)
library(ggplot2)
1. TỔNG QUAN DỮ LIỆU
Bộ dữ liệu được sử dụng trong nghiên cứu bao gồm chỉ số VN-Index
(VNI) và giá cổ phiếu của sáu ngân hàng thương mại cổ phần tiêu biểu tại
Việt Nam: ACB, BID, OCB, VPB, CTG. Đây là nhóm cổ phiếu thuộc ngành tài
chính – ngân hàng, có mức vốn hóa lớn, thanh khoản cao và được niêm yết
trên sàn chứng khoán trong thời gian dài, phản ánh tương đối rõ nét biến
động của thị trường tài chính Việt Nam.
Việc kết hợp VN-Index – đại diện cho toàn thị trường – với nhóm cổ
phiếu ngân hàng – đại diện cho một ngành có vai trò trung tâm – tạo nên
một tập dữ liệu vừa đủ đa dạng về mặt cấu trúc ngành nghề, vừa đủ đại
diện về mặt thị trường. Nhờ vậy, bộ dữ liệu này cho phép thực hiện hiệu
quả các phân tích kinh tế – tài chính quan trọng như kiểm định tính dừng
chuỗi thời gian, ước lượng mô hình CAPM và đường thị trường chứng khoán
(SML), xây dựng ma trận hiệp phương sai giữa các cổ phiếu, và tính toán
Value at Risk (VaR). Sự lựa chọn có chủ đích này không chỉ đảm bảo tính
tin cậy về mặt thống kê, mà còn giúp so sánh kết quả mô hình một cách rõ
ràng và có ý nghĩa thực tiễn cao.
df <- read.csv("C:/Users/admin/OneDrive - UFM/Documents/dulieubang/DULIEUMHDBTS.csv")
df$Ngày <- as.Date(df$Ngày, format = "%d/%m/%Y")
df <- df[order(df$Ngày), ] # sắp xếp tăng dần theo ngày
# Loại dấu phẩy, chuyển cột số sang numeric
for (i in 2:ncol(df)) {
df[[i]] <- as.numeric(gsub(",", "", df[[i]]))
}
# Tạo xts từ dữ liệu giá
prices_xts <- xts(df[, -1], order.by = df$Ngày)
# **3. TÍNH LỢI SUẤT LOG**
returns_xts <- diff(log(prices_xts))[-1, ]
head(returns_xts)
## VNI ACB BID OCB VPB
## 2024-01-03 0.010940884 0.022233474 0.018429461 0.029311989 0.013154798
## 2024-01-04 0.005708350 0.011934571 -0.003431484 0.014331428 0.013038423
## 2024-01-05 0.003435416 0.005891701 0.019300266 0.014137358 -0.007813607
## 2024-01-08 0.004760535 -0.003939063 0.041803648 0.024267362 0.002629562
## 2024-01-09 -0.001380036 -0.013887209 -0.007564986 -0.006878378 -0.005211059
## 2024-01-10 0.002542962 0.009978113 0.028901950 0.006878378 0.023211979
## CTG
## 2024-01-03 0.01459880
## 2024-01-04 0.03559095
## 2024-01-05 0.01388911
## 2024-01-08 0.01878791
## 2024-01-09 0.01511364
## 2024-01-10 0.03278982
2. KIỂM ĐỊNH TÍNH DỪNG
# Tạo danh sách tên cổ phiếu
tickers <- colnames(returns_xts)
# Vòng lặp kiểm định ADF cho từng chuỗi lợi suất
for (ticker in tickers) {
cat("=== Kiểm định ADF cho:", ticker, "===\n")
result <- suppressWarnings(adf.test(returns_xts[, ticker], alternative = "stationary"))
print(result)
cat("\n")
}
## === Kiểm định ADF cho: VNI ===
##
## Augmented Dickey-Fuller Test
##
## data: returns_xts[, ticker]
## Dickey-Fuller = -7.3256, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
##
##
## === Kiểm định ADF cho: ACB ===
##
## Augmented Dickey-Fuller Test
##
## data: returns_xts[, ticker]
## Dickey-Fuller = -8.1575, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
##
##
## === Kiểm định ADF cho: BID ===
##
## Augmented Dickey-Fuller Test
##
## data: returns_xts[, ticker]
## Dickey-Fuller = -7.7449, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
##
##
## === Kiểm định ADF cho: OCB ===
##
## Augmented Dickey-Fuller Test
##
## data: returns_xts[, ticker]
## Dickey-Fuller = -7.2642, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
##
##
## === Kiểm định ADF cho: VPB ===
##
## Augmented Dickey-Fuller Test
##
## data: returns_xts[, ticker]
## Dickey-Fuller = -7.2472, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
##
##
## === Kiểm định ADF cho: CTG ===
##
## Augmented Dickey-Fuller Test
##
## data: returns_xts[, ticker]
## Dickey-Fuller = -7.2973, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
NHẬN XÉT
Kết quả kiểm định Augmented Dickey-Fuller (ADF) đối với các chuỗi tỷ
suất lợi nhuận logarit (log return) của chỉ số VN-Index (VNI) và nhóm cổ
phiếu ngân hàng (ACB, BID, OCB, VPB, CTG) cho thấy tất cả các chuỗi đều
có thống kê Dickey-Fuller âm lớn, với giá trị p nhỏ hơn hoặc bằng 0.01.
Trong một số trường hợp, cảnh báo từ phần mềm cho biết p-value thực tế
còn nhỏ hơn mức hiển thị, điều này càng củng cố thêm độ tin cậy của kết
quả kiểm định.
Với mức ý nghĩa 1%, ta bác bỏ giả thuyết rỗng về tồn tại đơn vị gốc
trong tất cả các chuỗi, đồng nghĩa với việc các chuỗi lợi suất log đều
là chuỗi dừng. Đây là điều kiện cần thiết để đảm bảo tính hợp lệ cho các
phân tích hồi quy và đo lường rủi ro tiếp theo trong nghiên cứu.
Về mặt thực tiễn, tính dừng của các chuỗi tỷ suất lợi nhuận cho phép
tiến hành ước lượng các mô hình tài chính như CAPM và đường thị trường
chứng khoán (SML), tính toán Value at Risk (VaR), cũng như xây dựng ma
trận hiệp phương sai một cách đáng tin cậy. Nhờ đó, các kết quả thu được
không chỉ đảm bảo về mặt thống kê mà còn có ý nghĩa thực tiễn trong việc
hỗ trợ ra quyết định đầu tư và quản trị rủi ro tài chính.
3. ƯỚC LƯỢNG MÔ HÌNH CAMP
# 1. Đặt tên dữ liệu cho rõ ràng
rets <- returns_xts
# 2. Thiết lập lãi suất phi rủi ro
rf_annual <- 0.05 # 5%/năm
rf_daily <- rf_annual / 252 # Giả định 252 ngày giao dịch/năm
# 3. Tính lợi suất kỳ vọng thị trường annualized
mean_mkt_daily <- mean(rets[, "VNI"], na.rm = TRUE)
exp_ret_ann <- mean_mkt_daily * 252
# 4. Danh sách các cổ phiếu (bỏ VNI)
tickers <- setdiff(colnames(rets), "VNI")
# 5. Ước lượng CAPM với robust SE
capm_list <- lapply(tickers, function(sym) {
y <- rets[, sym] - rf_daily
x <- rets[, "VNI"] - rf_daily
fit <- lm(y ~ x)
rob <- coeftest(fit, vcov = vcovHC(fit, type = "HC1"))
beta_val <- rob[2, 1]
alpha_val <- rob[1, 1]
t_beta <- rob[2, 3]
er_capm <- rf_annual + beta_val * (exp_ret_ann - rf_annual)
data.frame(
Stock = sym,
Alpha = alpha_val,
Beta = beta_val,
t_Beta = t_beta,
R2 = summary(fit)$r.squared,
ER_CAPM = er_capm
)
})
# 6. Gộp lại thành data frame
capm_df <- do.call(rbind, capm_list)
# 7. Hiển thị kết quả
cat("\nKẾT QUẢ ƯỚC LƯỢNG CAPM\n")
##
## KẾT QUẢ ƯỚC LƯỢNG CAPM
print(capm_df, row.names = FALSE)
## Stock Alpha Beta t_Beta R2 ER_CAPM
## ACB -0.0005098875 0.9688301 15.34197 0.4108732 0.1329180
## BID -0.0004979988 1.0616275 19.95763 0.5383858 0.1408601
## OCB -0.0003483270 0.9830889 16.28413 0.4091828 0.1341383
## VPB -0.0004299222 1.0083021 18.56153 0.5297904 0.1362962
## CTG 0.0005719174 1.2269331 19.66197 0.5864899 0.1550079
NHẬN XÉT
Kết quả ước lượng mô hình định giá tài sản vốn (CAPM) cho nhóm cổ
phiếu ngân hàng ACB, BID, OCB, VPB và CTG cho thấy cả năm cổ phiếu đều
có hệ số beta dương và có ý nghĩa thống kê rất cao, với giá trị thống kê
t lớn hơn 15 trong tất cả các trường hợp. Điều này khẳng định mối quan
hệ tuyến tính và cùng chiều giữa lợi suất của từng cổ phiếu với lợi suất
thị trường, phù hợp với giả định lý thuyết của mô hình CAPM.
Cụ thể, các cổ phiếu ACB, OCB, VPB có beta xấp xỉ 1 (lần lượt là
0.969, 0.983 và 1.008), cho thấy mức độ rủi ro hệ thống tương đương với
thị trường chung. BID có beta cao hơn nhẹ (1.062), trong khi CTG có beta
lớn nhất (1.227), cho thấy mức độ nhạy cảm với biến động thị trường cao
hơn đáng kể. Các hệ số \(R^2\) dao động
từ khoảng 0.41 đến 0.59, cho thấy mô hình CAPM giải thích được từ 41%
đến gần 59% biến động trong lợi suất cổ phiếu – mức độ phù hợp tương đối
cao trong bối cảnh dữ liệu tài chính thực nghiệm.
Về alpha – phần lợi suất vượt trội không do thị trường giải thích –
hầu hết cổ phiếu đều có alpha âm và nhỏ về giá trị tuyệt đối, thể hiện
rằng phần chênh lệch so với lợi suất kỳ vọng là không đáng kể. Riêng CTG
là cổ phiếu duy nhất có alpha dương (+0.00057), gợi ý rằng cổ phiếu này
có thể đạt được mức lợi suất cao hơn so với kỳ vọng từ CAPM trong giai
đoạn quan sát.
Lợi suất kỳ vọng tính theo CAPM (annualized) nằm trong khoảng từ
13.29% (ACB) đến 15.50% (CTG), phản ánh phần thưởng rủi ro tương ứng với
hệ số beta của từng cổ phiếu. Các cổ phiếu có beta cao hơn, như CTG,
được kỳ vọng mang lại lợi suất cao hơn, đúng với lý thuyết của CAPM.
4. ĐƯỜNG THỊ TRƯỜNG CHỨNG KHOÁN SML
# Gọi thư viện
library(ggplot2)
library(RColorBrewer)
# 1. Chuẩn bị dữ liệu SML từ capm_df (đã có từ phần CAPM)
df_sml <- data.frame(
Beta = capm_df$Beta,
ExpReturn = capm_df$ER_CAPM,
Stock = capm_df$Stock
)
# 2. Ước lượng đường SML
sml_fit <- lm(ExpReturn ~ Beta, data = df_sml)
# 3. Vẽ biểu đồ SML
library(ggplot2)
scale_y_continuous(labels = scales::percent_format(accuracy = 0.01))
## <ScaleContinuousPosition>
## Range:
## Limits: 0 -- 1
# cần thiết để dùng percent_format
ggplot(df_sml, aes(x = Beta, y = ExpReturn, color = Stock)) +
geom_point(size = 4) +
geom_text(aes(label = Stock), nudge_y = 0.002, size = 3, show.legend = FALSE) +
geom_abline(intercept = coef(sml_fit)[1],
slope = coef(sml_fit)[2],
color = "#E69F00",
linetype = "dashed",
linewidth = 1.2) +
scale_color_brewer(palette = "Dark2") +
scale_y_continuous(labels = scales::percent_format(accuracy = 0.01)) +
labs(
title = "Security Market Line – các cổ phiếu ngân hàng",
x = expression(beta),
y = "Lợi suất kỳ vọng (annualized)",
color = "Cổ phiếu"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold", size = 16),
plot.subtitle = element_text(size = 12, color = "gray40"),
legend.position = "bottom",
legend.title = element_text(face = "bold"),
panel.grid.minor = element_blank()
)

Biểu đồ đường thị trường chứng khoán (Security Market Line – SML)
thể hiện mối quan hệ giữa rủi ro hệ thống (thông qua hệ số beta) và lợi
suất kỳ vọng annualized của năm cổ phiếu thuộc nhóm ngân hàng: ACB, BID,
CTG, OCB và VPB. Đường SML được ước lượng từ dữ liệu thực nghiệm với độ
dốc phản ánh phần thưởng rủi ro thị trường, còn phần chặn đứng biểu thị
mức lợi suất phi rủi ro (risk-free rate) giả định.
Tất cả các cổ phiếu trong mẫu đều nằm gần hoặc ngay trên đường SML,
cho thấy rằng mức lợi suất kỳ vọng của chúng phù hợp với mức độ rủi ro
hệ thống mà nhà đầu tư phải đối mặt, tức là được định giá hợp lý theo lý
thuyết CAPM. Cụ thể:
CTG có hệ số beta cao nhất (~1.23), đồng nghĩa với mức độ nhạy
cảm lớn nhất với thị trường và cũng có lợi suất kỳ vọng cao nhất
(~15.5%), đúng như lý thuyết CAPM dự đoán.
ACB và OCB có beta gần bằng 1, phản ánh mức rủi ro hệ thống tương
đương thị trường, với lợi suất kỳ vọng ~13.3–13.4%.
BID và VPB có beta xấp xỉ từ 1.01–1.06, nằm giữa nhóm còn lại, và
lợi suất kỳ vọng cũng nằm tương ứng trong khoảng ~13.6–14.1%.
Tổng thể, các điểm dữ liệu phân bố nhất quán quanh đường SML với độ
lệch nhỏ, cho thấy mô hình CAPM có mức độ phù hợp cao trong việc mô tả
phần thưởng rủi ro của các cổ phiếu ngân hàng tại thời điểm phân tích.
Không có cổ phiếu nào rõ ràng bị định giá thấp (nằm cao hơn SML) hay
định giá cao (nằm thấp hơn SML), gợi ý thị trường đang phản ánh đúng mức
độ rủi ro trong định giá nhóm tài sản này.
5. ƯỚC LƯỢNG MA TRẬN HIỆP PHƯƠNG SAI
stocks <- colnames(returns_xts)
cov_matrix <- cov(returns_xts[, stocks])
cat("\n=== Ma trận hiệp phương sai ===\n")
##
## === Ma trận hiệp phương sai ===
print(cov_matrix)
## VNI ACB BID OCB VPB
## VNI 0.0001091569 0.0001057545 0.0001158840 0.0001073109 0.0001100631
## ACB 0.0001057545 0.0002493668 0.0001294722 0.0001204513 0.0001302771
## BID 0.0001158840 0.0001294722 0.0002285082 0.0001172610 0.0001242101
## OCB 0.0001073109 0.0001204513 0.0001172610 0.0002578217 0.0001282812
## VPB 0.0001100631 0.0001302771 0.0001242101 0.0001282812 0.0002094732
## CTG 0.0001339282 0.0001578595 0.0001764581 0.0001425717 0.0001526888
## CTG
## VNI 0.0001339282
## ACB 0.0001578595
## BID 0.0001764581
## OCB 0.0001425717
## VPB 0.0001526888
## CTG 0.0002801770
NHẬN XÉT
Ma trận hiệp phương sai giữa các chuỗi tỷ suất lợi nhuận log cho
thấy sự biến động đồng thời giữa các tài sản trong danh mục nghiên cứu.
Giá trị trên đường chéo chính đại diện cho phương sai riêng của từng tài
sản – hay mức độ biến động nội tại của cổ phiếu – trong khi các phần tử
ngoài đường chéo mô tả mức độ tương quan tuyến tính về mặt biến động
giữa các cặp tài sản.
Cụ thể:
Cổ phiếu CTG có phương sai cao nhất (0.00028018), cho thấy đây là
cổ phiếu có biến động lớn nhất trong nhóm. Tiếp theo là OCB
(0.00025782), ACB (0.00024937), BID (0.00022851), và VPB (0.00020947).
VN-Index có phương sai nhỏ nhất (0.00010916), phản ánh tính chất trung
bình hóa của chỉ số thị trường.
Các hiệp phương sai đều mang giá trị dương, cho thấy các cổ phiếu
có xu hướng biến động cùng chiều với nhau và với thị trường. Điều này
phù hợp với thực tế khi các cổ phiếu thuộc cùng ngành (ngân hàng) thường
bị chi phối bởi các yếu tố kinh tế vĩ mô chung.
Một số cặp có hiệp phương sai nổi bật như:
CTG–BID (0.00017646): mức đồng biến cao, thể hiện mối liên hệ
mạnh giữa hai cổ phiếu lớn trong ngành ngân hàng.
CTG–ACB (0.00015786) và CTG–VPB (0.00015269): cũng thể hiện mức
độ đồng biến đáng kể.
Ngược lại, các cặp như OCB–BID (0.00011726) hay OCB–ACB (0.00012045)
có mức đồng biến thấp hơn, phản ánh sự khác biệt nhất định trong phản
ứng giá giữa các cổ phiếu này.
Tổng thể, ma trận hiệp phương sai cho thấy mức độ liên kết mạnh mẽ
giữa các cổ phiếu ngân hàng và với thị trường, làm cơ sở quan trọng cho
việc xây dựng danh mục đầu tư, ước lượng rủi ro hệ thống, cũng như tính
toán giá trị rủi ro (VaR) sau này.
6. ƯỚC LƯỢNG VAR
6.1. VAR CHO TỪNG CỔ PHIẾU
# Thông số đầu vào
conf_level <- 0.99
z_alpha <- qnorm(1 - conf_level)
portfolio_value <- 1e9 # 1 tỷ mỗi cổ phiếu
# Tính toán trung bình và độ lệch chuẩn
mu <- colMeans(returns_xts, na.rm = TRUE)
sd <- apply(returns_xts, 2, sd, na.rm = TRUE)
# Tính VaR theo phần trăm và theo tiền
var_pct <- - (mu + z_alpha * sd)
var_vnd <- var_pct * portfolio_value
# Gộp vào bảng
VaR_df <- data.frame(
Stock = colnames(returns_xts),
Mean_Return = round(mu, 6),
Std_Dev = round(sd, 6),
VaR_Pct_99 = round(var_pct * 100, 4),
VaR_VND_99 = round(var_vnd)
)
print(VaR_df)
## Stock Mean_Return Std_Dev VaR_Pct_99 VaR_VND_99
## VNI VNI 0.000538 0.010448 2.3767 23767220
## ACB ACB 0.000018 0.015791 3.6719 36718610
## BID BID 0.000061 0.015116 3.5105 35105243
## OCB OCB 0.000184 0.016057 3.7170 37169796
## VPB VPB 0.000111 0.014473 3.3559 33558736
## CTG CTG 0.001187 0.016738 3.7753 37752516
NHẬN XÉT
Bảng kết quả thể hiện VaR hàng ngày với độ tin cậy 99% cho mỗi cổ
phiếu, tức là trong điều kiện thị trường bình thường, xác suất lỗ vượt
quá mức VaR là 1%, còn lại 99% là trong phạm vi tổn thất dự đoán. Giá
trị VaR được tính bằng cả tỷ suất phần trăm lỗ tối đa kỳ vọng, lẫn giá
trị tiền tệ (VNĐ) trên giả định đầu tư 1 tỷ đồng cho mỗi mã.
Một số nhận xét đáng chú ý:
Cổ phiếu CTG có rủi ro lớn nhất, với VaR đạt 3,78%, tương đương
khoảng 37,75 triệu VNĐ lỗ kỳ vọng trong một ngày với xác suất 1%. Đây là
mức VaR cao nhất trong danh mục, phản ánh mức biến động lớn (Std_Dev =
0.016738).
Tiếp theo là OCB và ACB, với VaR lần lượt là 3,72% và 3,67%,
tương ứng tổn thất kỳ vọng khoảng 37 triệu và 36,7 triệu đồng mỗi ngày
nếu rơi vào vùng rủi ro.
Cổ phiếu BID và VPB có mức VaR thấp hơn, lần lượt khoảng 3,51% và
3,36%, tức rủi ro thấp hơn nhẹ so với các cổ phiếu còn lại.
VN-Index có VaR thấp nhất (2,38%), tương ứng tổn thất khoảng
23,77 triệu đồng, điều này phù hợp do chỉ số thị trường có tính chất
tổng hợp, trung hòa rủi ro và biến động so với các mã đơn lẻ.
Về tổng thể, kết quả cho thấy các cổ phiếu ngân hàng có mức rủi ro
cao hơn chỉ số thị trường, với mức VaR từ 3,3% đến 3,8%, so với khoảng
2,4% của VN-Index. Điều này nhấn mạnh rằng đầu tư vào cổ phiếu ngành
ngân hàng, dù mang lại tiềm năng sinh lời, cũng đồng thời kéo theo rủi
ro biến động cao hơn đáng kể so với danh mục thị trường chung.
6.2. VAR CHO DANH MỤC ĐẦU TƯ
# 1. Thông số đầu vào
confidence_level <- 0.99
alpha <- 1 - confidence_level
z_alpha <- qnorm(alpha)
holding_period <- 1 # 1 ngày
# 2. Giả định danh mục đầu tư: đầu tư 1 tỷ mỗi cổ phiếu
tickers <- colnames(returns_xts)
weights <- rep(1e9, length(tickers)) # 1 tỷ mỗi mã
names(weights) <- tickers
# 3. Tính lợi suất kỳ vọng và ma trận hiệp phương sai
mean_returns <- colMeans(returns_xts, na.rm = TRUE)
cov_matrix <- cov(returns_xts, use = "complete.obs")
# 4. Tính VaR danh mục (theo phân phối chuẩn có hiệp phương sai)
# 4.1. Tổng giá trị danh mục
portfolio_value <- sum(weights)
# 4.2. Tính tỷ trọng (% vốn) theo từng cổ phiếu
w_pct <- weights / portfolio_value
# 4.3. Lợi suất kỳ vọng danh mục
mu_p <- sum(w_pct * mean_returns)
# 4.4. Độ lệch chuẩn danh mục
sigma_p <- sqrt(t(w_pct) %*% cov_matrix %*% w_pct)
# 4.5. Tính VaR
VaR_pct <- - (mu_p + z_alpha * sigma_p) # theo phần trăm
VaR_vnd <- VaR_pct * portfolio_value # theo tiền
# 5. Kết quả
cat("=== VaR DANH MỤC (99%, 1 ngày) ===\n")
## === VaR DANH MỤC (99%, 1 ngày) ===
cat("Lợi suất kỳ vọng:", round(mu_p, 6), "\n")
## Lợi suất kỳ vọng: 0.00035
cat("Độ lệch chuẩn danh mục:", round(sigma_p, 6), "\n")
## Độ lệch chuẩn danh mục: 0.012064
cat("VaR (tỷ lệ %):", round(VaR_pct * 100, 4), "%\n")
## VaR (tỷ lệ %): 2.7715 %
cat("VaR (VNĐ):", round(VaR_vnd), "VND\n")
## VaR (VNĐ): 166291915 VND
NHẬN XÉT
Kết quả ước lượng VaR cho danh mục đầu tư với giả định đầu tư đồng
đều (mỗi mã 1 tỷ VNĐ) và tổng giá trị danh mục là 6 tỷ đồng cho
thấy:
Lợi suất kỳ vọng hàng ngày của danh mục ở mức 0.035% (tương đương
0.00035), phản ánh mức sinh lợi trung bình tích cực, dù khá thấp – điều
dễ hiểu trong bối cảnh biến động ngắn hạn của thị trường chứng
khoán.
Độ lệch chuẩn lợi suất danh mục đạt 0.012064, cho thấy mức biến
động hàng ngày là khoảng 1.2%. Đây là mức biến động vừa phải, thấp hơn
so với các cổ phiếu riêng lẻ, nhờ vào tác động đa dạng hóa rủi ro giữa
các tài sản trong danh mục.
Giá trị VaR tại mức tin cậy 99% là 2.77%, tức là với xác suất
99%, mức lỗ tối đa kỳ vọng của danh mục trong một ngày không vượt quá
mức này.
Chuyển đổi sang giá trị tuyệt đối, VaR danh mục là khoảng 166,29
triệu VNĐ. Điều này đồng nghĩa với việc nhà đầu tư có thể mất tối đa
khoảng 166 triệu đồng trong một ngày (với 1% xác suất xảy ra tình huống
bất lợi), trong điều kiện thị trường bình thường.
Kết luận, danh mục đầu tư này, dù có mức lợi suất kỳ vọng thấp, đã
tận dụng hiệu quả lợi ích của đa dạng hóa, thể hiện qua độ lệch chuẩn
danh mục thấp hơn nhiều cổ phiếu thành phần, và VaR tương đối kiểm soát
được so với VaR riêng lẻ của các mã trong cùng danh mục. Đây là một minh
chứng thực nghiệm tốt cho vai trò của tối ưu hóa phân bổ tài sản trong
quản trị rủi ro tài chính.
7. SO SÁNH LỢI SUẤT DỰ BÁO VÀ LỢI SUẤT THỰC TẾ
library(PerformanceAnalytics)
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
# 1. Tính lợi suất thực tế annualized từ rets (log return)
actual_df <- data.frame(
Stock = colnames(rets),
Actual_ER = as.numeric(Return.annualized(rets, scale = 252)) * 100
)
# 2. Gộp với kết quả từ CAPM
compare_df <- merge(
capm_df[, c("Stock", "ER_CAPM")],
actual_df,
by = "Stock"
)
compare_df$ER_CAPM <- compare_df$ER_CAPM * 100
compare_df$Diff <- compare_df$Actual_ER - compare_df$ER_CAPM
# 3. Hiển thị bảng
kable(
compare_df,
col.names = c("Mã", "CAPM (%)", "Thực tế (%)", "Chênh lệch (%)"),
digits = 2,
caption = "So sánh lợi suất kỳ vọng CAPM và lợi suất thực tế (Annualized)"
)
So sánh lợi suất kỳ vọng CAPM và lợi suất thực tế
(Annualized)
| ACB |
13.29 |
-2.80 |
-16.09 |
| BID |
14.09 |
-1.33 |
-15.42 |
| CTG |
15.50 |
30.18 |
14.68 |
| OCB |
13.41 |
1.40 |
-12.01 |
| VPB |
13.63 |
0.16 |
-13.47 |
NHẬN XÉT
Bảng kết quả cho thấy sự khác biệt đáng kể giữa lợi suất kỳ vọng
theo mô hình CAPM và lợi suất thực tế annualized của các cổ phiếu ngân
hàng trong danh mục. Đa phần các cổ phiếu đều có lợi suất thực tế thấp
hơn nhiều so với mức lợi suất mà mô hình CAPM dự đoán.
Cụ thể, ACB và BID có mức chênh lệch lần lượt là -16.09% và
-15.42%, cho thấy hiệu quả sinh lời thực tế rất kém so với mức phần bù
rủi ro kỳ vọng.
OCB và VPB cũng ghi nhận mức chênh lệch âm đáng kể, lần lượt là
-12.01% và -13.47%, điều này cho thấy các cổ phiếu này có thể đang bị
định giá cao so với giá trị thực tế trên thị trường, hoặc chịu ảnh hưởng
từ các yếu tố phi hệ thống mà mô hình CAPM không phản ánh được.
Ngược lại, CTG là cổ phiếu duy nhất có lợi suất thực tế vượt xa
lợi suất kỳ vọng từ mô hình, với chênh lệch dương 14.68%. Điều này hàm ý
rằng CTG có thể đang bị định giá thấp hoặc sở hữu những yếu tố nội tại
tích cực vượt ngoài phạm vi lý giải của CAPM, chẳng hạn như khả năng
sinh lời cao hơn, quản trị hiệu quả, hoặc triển vọng tăng trưởng tích
cực trong mắt nhà đầu tư.
LS0tDQp0aXRsZTogIk3DtCBow6xuaCDEkeG7i25oIGdpw6EgdMOgaSBz4bqjbiINCmF1dGhvcjogIlBo4bqhbSBUaOG7iyBRdeG7s25oIEdpYW8iDQpkYXRlOiAiMjAyNS0wNy0wMyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY3NzOiAic3R5bGUuY3NzIg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShxdWFudG1vZCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh4dHMpDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoc2FuZHdpY2gpDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQoNCiMgKioxLiBU4buUTkcgUVVBTiBE4buuIExJ4buGVSoqDQoNCiZlbXNwO0Lhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgbmdoacOqbiBj4bupdSBiYW8gZ+G7k20gY2jhu4kgc+G7kSBWTi1JbmRleCAoVk5JKSB2w6AgZ2nDoSBj4buVIHBoaeG6v3UgY+G7p2Egc8OhdSBuZ8OibiBow6BuZyB0aMawxqFuZyBt4bqhaSBj4buVIHBo4bqnbiB0acOqdSBiaeG7g3UgdOG6oWkgVmnhu4d0IE5hbTogQUNCLCBCSUQsIE9DQiwgVlBCLCBDVEcuIMSQw6J5IGzDoCBuaMOzbSBj4buVIHBoaeG6v3UgdGh14buZYyBuZ8OgbmggdMOgaSBjaMOtbmgg4oCTIG5nw6JuIGjDoG5nLCBjw7MgbeG7qWMgduG7kW4gaMOzYSBs4bubbiwgdGhhbmgga2hv4bqjbiBjYW8gdsOgIMSRxrDhu6NjIG5pw6ptIHnhur90IHRyw6puIHPDoG4gY2jhu6luZyBraG/DoW4gdHJvbmcgdGjhu51pIGdpYW4gZMOgaSwgcGjhuqNuIMOhbmggdMawxqFuZyDEkeG7kWkgcsO1IG7DqXQgYmnhur9uIMSR4buZbmcgY+G7p2EgdGjhu4sgdHLGsOG7nW5nIHTDoGkgY2jDrW5oIFZp4buHdCBOYW0uDQoNCiZlbXNwO1Zp4buHYyBr4bq/dCBo4bujcCBWTi1JbmRleCDigJMgxJHhuqFpIGRp4buHbiBjaG8gdG/DoG4gdGjhu4sgdHLGsOG7nW5nIOKAkyB24bubaSBuaMOzbSBj4buVIHBoaeG6v3UgbmfDom4gaMOgbmcg4oCTIMSR4bqhaSBkaeG7h24gY2hvIG3hu5l0IG5nw6BuaCBjw7MgdmFpIHRyw7IgdHJ1bmcgdMOibSDigJMgdOG6oW8gbsOqbiBt4buZdCB04bqtcCBk4buvIGxp4buHdSB24burYSDEkeG7pyDEkWEgZOG6oW5nIHbhu4EgbeG6t3QgY+G6pXUgdHLDumMgbmfDoG5oIG5naOG7gSwgduG7q2EgxJHhu6cgxJHhuqFpIGRp4buHbiB24buBIG3hurd0IHRo4buLIHRyxrDhu51uZy4gTmjhu50gduG6rXksIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjaG8gcGjDqXAgdGjhu7FjIGhp4buHbiBoaeG7h3UgcXXhuqMgY8OhYyBwaMOibiB0w61jaCBraW5oIHThur8g4oCTIHTDoGkgY2jDrW5oIHF1YW4gdHLhu41uZyBuaMawIGtp4buDbSDEkeG7i25oIHTDrW5oIGThu6tuZyBjaHXhu5dpIHRo4budaSBnaWFuLCDGsOG7m2MgbMaw4bujbmcgbcO0IGjDrG5oIENBUE0gdsOgIMSRxrDhu51uZyB0aOG7iyB0csaw4budbmcgY2jhu6luZyBraG/DoW4gKFNNTCksIHjDonkgZOG7sW5nIG1hIHRy4bqtbiBoaeG7h3AgcGjGsMahbmcgc2FpIGdp4buvYSBjw6FjIGPhu5UgcGhp4bq/dSwgdsOgIHTDrW5oIHRvw6FuIFZhbHVlIGF0IFJpc2sgKFZhUikuIFPhu7EgbOG7sWEgY2jhu41uIGPDsyBjaOG7pyDEkcOtY2ggbsOgeSBraMO0bmcgY2jhu4kgxJHhuqNtIGLhuqNvIHTDrW5oIHRpbiBj4bqteSB24buBIG3hurd0IHRo4buRbmcga8OqLCBtw6AgY8OybiBnacO6cCBzbyBzw6FuaCBr4bq/dCBxdeG6oyBtw7QgaMOsbmggbeG7mXQgY8OhY2ggcsO1IHLDoG5nIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buxYyB0aeG7hW4gY2FvLg0KDQpgYGB7cn0NCmRmIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9hZG1pbi9PbmVEcml2ZSAtIFVGTS9Eb2N1bWVudHMvZHVsaWV1YmFuZy9EVUxJRVVNSERCVFMuY3N2IikNCmRmJE5nw6B5IDwtIGFzLkRhdGUoZGYkTmfDoHksIGZvcm1hdCA9ICIlZC8lbS8lWSIpDQpkZiA8LSBkZltvcmRlcihkZiROZ8OgeSksIF0gICMgc+G6r3AgeOG6v3AgdMSDbmcgZOG6p24gdGhlbyBuZ8OgeQ0KIyBMb+G6oWkgZOG6pXUgcGjhuql5LCBjaHV54buDbiBj4buZdCBz4buRIHNhbmcgbnVtZXJpYw0KZm9yIChpIGluIDI6bmNvbChkZikpIHsNCiAgZGZbW2ldXSA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgZGZbW2ldXSkpDQp9DQoNCiMgVOG6oW8geHRzIHThu6sgZOG7ryBsaeG7h3UgZ2nDoQ0KcHJpY2VzX3h0cyA8LSB4dHMoZGZbLCAtMV0sIG9yZGVyLmJ5ID0gZGYkTmfDoHkpDQojICoqMy4gVMONTkggTOG7okkgU1XhuqRUIExPRyoqDQpyZXR1cm5zX3h0cyA8LSBkaWZmKGxvZyhwcmljZXNfeHRzKSlbLTEsIF0NCmhlYWQocmV0dXJuc194dHMpDQpgYGANCg0KIyAqKjIuIEtJ4buCTSDEkOG7ik5IIFTDjU5IIEThu6pORyoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBkYW5oIHPDoWNoIHTDqm4gY+G7lSBwaGnhur91DQp0aWNrZXJzIDwtIGNvbG5hbWVzKHJldHVybnNfeHRzKQ0KDQojIFbDsm5nIGzhurdwIGtp4buDbSDEkeG7i25oIEFERiBjaG8gdOG7q25nIGNodeG7l2kgbOG7o2kgc3XhuqV0DQpmb3IgKHRpY2tlciBpbiB0aWNrZXJzKSB7DQogIGNhdCgiPT09IEtp4buDbSDEkeG7i25oIEFERiBjaG86IiwgdGlja2VyLCAiPT09XG4iKQ0KIHJlc3VsdCA8LSBzdXBwcmVzc1dhcm5pbmdzKGFkZi50ZXN0KHJldHVybnNfeHRzWywgdGlja2VyXSwgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpKQ0KICBwcmludChyZXN1bHQpDQogIGNhdCgiXG4iKQ0KfQ0KYGBgDQoNCioqTkjhuqxOIFjDiVQqKg0KDQomZW1zcDtL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBBdWdtZW50ZWQgRGlja2V5LUZ1bGxlciAoQURGKSDEkeG7kWkgduG7m2kgY8OhYyBjaHXhu5dpIHThu7cgc3XhuqV0IGzhu6NpIG5odeG6rW4gbG9nYXJpdCAobG9nIHJldHVybikgY+G7p2EgY2jhu4kgc+G7kSBWTi1JbmRleCAoVk5JKSB2w6AgbmjDs20gY+G7lSBwaGnhur91IG5nw6JuIGjDoG5nIChBQ0IsIEJJRCwgT0NCLCBWUEIsIENURykgY2hvIHRo4bqleSB04bqldCBj4bqjIGPDoWMgY2h14buXaSDEkeG7gXUgY8OzIHRo4buRbmcga8OqIERpY2tleS1GdWxsZXIgw6JtIGzhu5tuLCB24bubaSBnacOhIHRy4buLIHAgbmjhu48gaMahbiBob+G6t2MgYuG6sW5nIDAuMDEuIFRyb25nIG3hu5l0IHPhu5EgdHLGsOG7nW5nIGjhu6NwLCBj4bqjbmggYsOhbyB04burIHBo4bqnbiBt4buBbSBjaG8gYmnhur90IHAtdmFsdWUgdGjhu7FjIHThur8gY8OybiBuaOG7jyBoxqFuIG3hu6ljIGhp4buDbiB0aOG7iywgxJFp4buBdSBuw6B5IGPDoG5nIGPhu6duZyBj4buRIHRow6ptIMSR4buZIHRpbiBj4bqteSBj4bunYSBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaC4NCg0KJmVtc3A7VuG7m2kgbeG7qWMgw70gbmdoxKlhIDElLCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgcuG7l25nIHbhu4EgdOG7k24gdOG6oWkgxJHGoW4gduG7iyBn4buRYyB0cm9uZyB04bqldCBj4bqjIGPDoWMgY2h14buXaSwgxJHhu5NuZyBuZ2jEqWEgduG7m2kgdmnhu4djIGPDoWMgY2h14buXaSBs4bujaSBzdeG6pXQgbG9nIMSR4buBdSBsw6AgY2h14buXaSBk4burbmcuIMSQw6J5IGzDoCDEkWnhu4F1IGtp4buHbiBj4bqnbiB0aGnhur90IMSR4buDIMSR4bqjbSBi4bqjbyB0w61uaCBo4bujcCBs4buHIGNobyBjw6FjIHBow6JuIHTDrWNoIGjhu5NpIHF1eSB2w6AgxJFvIGzGsOG7nW5nIHLhu6dpIHJvIHRp4bq/cCB0aGVvIHRyb25nIG5naGnDqm4gY+G7qXUuDQoNCiZlbXNwO1bhu4EgbeG6t3QgdGjhu7FjIHRp4buFbiwgdMOtbmggZOG7q25nIGPhu6dhIGPDoWMgY2h14buXaSB04bu3IHN14bqldCBs4bujaSBuaHXhuq1uIGNobyBwaMOpcCB0aeG6v24gaMOgbmggxrDhu5tjIGzGsOG7o25nIGPDoWMgbcO0IGjDrG5oIHTDoGkgY2jDrW5oIG5oxrAgQ0FQTSB2w6AgxJHGsOG7nW5nIHRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiAoU01MKSwgdMOtbmggdG/DoW4gVmFsdWUgYXQgUmlzayAoVmFSKSwgY8WpbmcgbmjGsCB4w6J5IGThu7FuZyBtYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaSBt4buZdCBjw6FjaCDEkcOhbmcgdGluIGPhuq15LiBOaOG7nSDEkcOzLCBjw6FjIGvhur90IHF14bqjIHRodSDEkcaw4bujYyBraMO0bmcgY2jhu4kgxJHhuqNtIGLhuqNvIHbhu4EgbeG6t3QgdGjhu5FuZyBrw6ogbcOgIGPDsm4gY8OzIMO9IG5naMSpYSB0aOG7sWMgdGnhu4VuIHRyb25nIHZp4buHYyBo4buXIHRy4bujIHJhIHF1eeG6v3QgxJHhu4tuaCDEkeG6p3UgdMawIHbDoCBxdeG6o24gdHLhu4sgcuG7p2kgcm8gdMOgaSBjaMOtbmguDQoNCiMgKiozLiDGr+G7mkMgTMav4buiTkcgTcOUIEjDjE5IIENBTVAqKg0KDQpgYGB7cn0NCiMgMS4gxJDhurd0IHTDqm4gZOG7ryBsaeG7h3UgY2hvIHLDtSByw6BuZw0KcmV0cyA8LSByZXR1cm5zX3h0cw0KDQojIDIuIFRoaeG6v3QgbOG6rXAgbMOjaSBzdeG6pXQgcGhpIHLhu6dpIHJvDQpyZl9hbm51YWwgPC0gMC4wNSAgICAgICAgICAgICAjIDUlL27Eg20NCnJmX2RhaWx5ICA8LSByZl9hbm51YWwgLyAyNTIgICMgR2nhuqMgxJHhu4tuaCAyNTIgbmfDoHkgZ2lhbyBk4buLY2gvbsSDbQ0KDQojIDMuIFTDrW5oIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyB0aOG7iyB0csaw4budbmcgYW5udWFsaXplZA0KbWVhbl9ta3RfZGFpbHkgPC0gbWVhbihyZXRzWywgIlZOSSJdLCBuYS5ybSA9IFRSVUUpDQpleHBfcmV0X2FubiAgICA8LSBtZWFuX21rdF9kYWlseSAqIDI1Mg0KDQojIDQuIERhbmggc8OhY2ggY8OhYyBj4buVIHBoaeG6v3UgKGLhu48gVk5JKQ0KdGlja2VycyA8LSBzZXRkaWZmKGNvbG5hbWVzKHJldHMpLCAiVk5JIikNCg0KIyA1LiDGr+G7m2MgbMaw4bujbmcgQ0FQTSB24bubaSByb2J1c3QgU0UNCmNhcG1fbGlzdCA8LSBsYXBwbHkodGlja2VycywgZnVuY3Rpb24oc3ltKSB7DQogIHkgPC0gcmV0c1ssIHN5bV0gLSByZl9kYWlseQ0KICB4IDwtIHJldHNbLCAiVk5JIl0gLSByZl9kYWlseQ0KICBmaXQgPC0gbG0oeSB+IHgpDQogIHJvYiA8LSBjb2VmdGVzdChmaXQsIHZjb3YgPSB2Y292SEMoZml0LCB0eXBlID0gIkhDMSIpKQ0KICBiZXRhX3ZhbCAgPC0gcm9iWzIsIDFdDQogIGFscGhhX3ZhbCA8LSByb2JbMSwgMV0NCiAgdF9iZXRhICAgIDwtIHJvYlsyLCAzXQ0KICBlcl9jYXBtICAgPC0gcmZfYW5udWFsICsgYmV0YV92YWwgKiAoZXhwX3JldF9hbm4gLSByZl9hbm51YWwpDQogIGRhdGEuZnJhbWUoDQogICAgU3RvY2sgICA9IHN5bSwNCiAgICBBbHBoYSAgID0gYWxwaGFfdmFsLA0KICAgIEJldGEgICAgPSBiZXRhX3ZhbCwNCiAgICB0X0JldGEgID0gdF9iZXRhLA0KICAgIFIyICAgICAgPSBzdW1tYXJ5KGZpdCkkci5zcXVhcmVkLA0KICAgIEVSX0NBUE0gPSBlcl9jYXBtDQogICkNCn0pDQoNCiMgNi4gR+G7mXAgbOG6oWkgdGjDoG5oIGRhdGEgZnJhbWUNCmNhcG1fZGYgPC0gZG8uY2FsbChyYmluZCwgY2FwbV9saXN0KQ0KDQojIDcuIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KY2F0KCJcbkvhur5UIFFV4bqiIMav4buaQyBMxq/hu6JORyBDQVBNXG4iKQ0KcHJpbnQoY2FwbV9kZiwgcm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCg0KKipOSOG6rE4gWMOJVCoqDQoNCiZlbXNwO0vhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZyBtw7QgaMOsbmggxJHhu4tuaCBnacOhIHTDoGkgc+G6o24gduG7kW4gKENBUE0pIGNobyBuaMOzbSBj4buVIHBoaeG6v3UgbmfDom4gaMOgbmcgQUNCLCBCSUQsIE9DQiwgVlBCIHbDoCBDVEcgY2hvIHRo4bqleSBj4bqjIG7Eg20gY+G7lSBwaGnhur91IMSR4buBdSBjw7MgaOG7hyBz4buRIGJldGEgZMawxqFuZyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBjYW8sIHbhu5tpIGdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogdCBs4bubbiBoxqFuIDE1IHRyb25nIHThuqV0IGPhuqMgY8OhYyB0csaw4budbmcgaOG7o3AuIMSQaeG7gXUgbsOgeSBraOG6s25nIMSR4buLbmggbeG7kWkgcXVhbiBo4buHIHR1eeG6v24gdMOtbmggdsOgIGPDuW5nIGNoaeG7gXUgZ2nhu69hIGzhu6NpIHN14bqldCBj4bunYSB04burbmcgY+G7lSBwaGnhur91IHbhu5tpIGzhu6NpIHN14bqldCB0aOG7iyB0csaw4budbmcsIHBow7kgaOG7o3AgduG7m2kgZ2nhuqMgxJHhu4tuaCBsw70gdGh1eeG6v3QgY+G7p2EgbcO0IGjDrG5oIENBUE0uDQoNCiZlbXNwO0Phu6UgdGjhu4MsIGPDoWMgY+G7lSBwaGnhur91IEFDQiwgT0NCLCBWUEIgY8OzIGJldGEgeOG6pXAgeOG7iSAxIChs4bqnbiBsxrDhu6N0IGzDoCAwLjk2OSwgMC45ODMgdsOgIDEuMDA4KSwgY2hvIHRo4bqleSBt4bupYyDEkeG7mSBy4bunaSBybyBo4buHIHRo4buRbmcgdMawxqFuZyDEkcawxqFuZyB24bubaSB0aOG7iyB0csaw4budbmcgY2h1bmcuIEJJRCBjw7MgYmV0YSBjYW8gaMahbiBuaOG6uSAoMS4wNjIpLCB0cm9uZyBraGkgQ1RHIGPDsyBiZXRhIGzhu5tuIG5o4bqldCAoMS4yMjcpLCBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIG5o4bqheSBj4bqjbSB24bubaSBiaeG6v24gxJHhu5luZyB0aOG7iyB0csaw4budbmcgY2FvIGjGoW4gxJHDoW5nIGvhu4MuIEPDoWMgaOG7hyBz4buRICRSXjIkIGRhbyDEkeG7mW5nIHThu6sga2hv4bqjbmcgMC40MSDEkeG6v24gMC41OSwgY2hvIHRo4bqleSBtw7QgaMOsbmggQ0FQTSBnaeG6o2kgdGjDrWNoIMSRxrDhu6NjIHThu6sgNDElIMSR4bq/biBn4bqnbiA1OSUgYmnhur9uIMSR4buZbmcgdHJvbmcgbOG7o2kgc3XhuqV0IGPhu5UgcGhp4bq/dSDigJMgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCB0xrDGoW5nIMSR4buRaSBjYW8gdHJvbmcgYuG7kWkgY+G6o25oIGThu68gbGnhu4d1IHTDoGkgY2jDrW5oIHRo4buxYyBuZ2hp4buHbS4NCg0KJmVtc3A7VuG7gSBhbHBoYSDigJMgcGjhuqduIGzhu6NpIHN14bqldCB2xrDhu6N0IHRy4buZaSBraMO0bmcgZG8gdGjhu4sgdHLGsOG7nW5nIGdp4bqjaSB0aMOtY2gg4oCTIGjhuqd1IGjhur90IGPhu5UgcGhp4bq/dSDEkeG7gXUgY8OzIGFscGhhIMOibSB2w6Agbmjhu48gduG7gSBnacOhIHRy4buLIHR1eeG7h3QgxJHhu5FpLCB0aOG7gyBoaeG7h24gcuG6sW5nIHBo4bqnbiBjaMOqbmggbOG7h2NoIHNvIHbhu5tpIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyBsw6Aga2jDtG5nIMSRw6FuZyBr4buDLiBSacOqbmcgQ1RHIGzDoCBj4buVIHBoaeG6v3UgZHV5IG5o4bqldCBjw7MgYWxwaGEgZMawxqFuZyAoKzAuMDAwNTcpLCBn4bujaSDDvSBy4bqxbmcgY+G7lSBwaGnhur91IG7DoHkgY8OzIHRo4buDIMSR4bqhdCDEkcaw4bujYyBt4bupYyBs4bujaSBzdeG6pXQgY2FvIGjGoW4gc28gduG7m2kga+G7syB24buNbmcgdOG7qyBDQVBNIHRyb25nIGdpYWkgxJFv4bqhbiBxdWFuIHPDoXQuDQoNCiZlbXNwO0zhu6NpIHN14bqldCBr4buzIHbhu41uZyB0w61uaCB0aGVvIENBUE0gKGFubnVhbGl6ZWQpIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMTMuMjklIChBQ0IpIMSR4bq/biAxNS41MCUgKENURyksIHBo4bqjbiDDoW5oIHBo4bqnbiB0aMaw4bufbmcgcuG7p2kgcm8gdMawxqFuZyDhu6luZyB24bubaSBo4buHIHPhu5EgYmV0YSBj4bunYSB04burbmcgY+G7lSBwaGnhur91LiBDw6FjIGPhu5UgcGhp4bq/dSBjw7MgYmV0YSBjYW8gaMahbiwgbmjGsCBDVEcsIMSRxrDhu6NjIGvhu7MgduG7jW5nIG1hbmcgbOG6oWkgbOG7o2kgc3XhuqV0IGNhbyBoxqFuLCDEkcO6bmcgduG7m2kgbMO9IHRodXnhur90IGPhu6dhIENBUE0uDQoNCiMgKio0LiDEkMav4bucTkcgVEjhu4ogVFLGr+G7nE5HIENI4buoTkcgS0hPw4FOIFNNTCoqDQoNCmBgYHtyfQ0KDQojIEfhu41pIHRoxrAgdmnhu4duDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCiMgMS4gQ2h14bqpbiBi4buLIGThu68gbGnhu4d1IFNNTCB04burIGNhcG1fZGYgKMSRw6MgY8OzIHThu6sgcGjhuqduIENBUE0pDQpkZl9zbWwgPC0gZGF0YS5mcmFtZSgNCiAgQmV0YSAgICAgID0gY2FwbV9kZiRCZXRhLA0KICBFeHBSZXR1cm4gPSBjYXBtX2RmJEVSX0NBUE0sDQogIFN0b2NrICAgICA9IGNhcG1fZGYkU3RvY2sNCikNCiMgMi4gxq/hu5tjIGzGsOG7o25nIMSRxrDhu51uZyBTTUwNCnNtbF9maXQgPC0gbG0oRXhwUmV0dXJuIH4gQmV0YSwgZGF0YSA9IGRmX3NtbCkNCg0KIyAzLiBW4bq9IGJp4buDdSDEkeG7kyBTTUwNCmxpYnJhcnkoZ2dwbG90MikNCnNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMC4wMSkpDQogICMgY+G6p24gdGhp4bq/dCDEkeG7gyBkw7luZyBwZXJjZW50X2Zvcm1hdA0KDQpnZ3Bsb3QoZGZfc21sLCBhZXMoeCA9IEJldGEsIHkgPSBFeHBSZXR1cm4sIGNvbG9yID0gU3RvY2spKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFN0b2NrKSwgbnVkZ2VfeSA9IDAuMDAyLCBzaXplID0gMywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSBjb2VmKHNtbF9maXQpWzFdLA0KICAgICAgICAgICAgICBzbG9wZSAgICAgPSBjb2VmKHNtbF9maXQpWzJdLA0KICAgICAgICAgICAgICBjb2xvciAgICAgPSAiI0U2OUYwMCIsDQogICAgICAgICAgICAgIGxpbmV0eXBlICA9ICJkYXNoZWQiLA0KICAgICAgICAgICAgICBsaW5ld2lkdGggPSAxLjIpICsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMC4wMSkpICsNCiAgbGFicygNCiAgICB0aXRsZSAgICA9ICJTZWN1cml0eSBNYXJrZXQgTGluZSDigJMgY8OhYyBj4buVIHBoaeG6v3UgbmfDom4gaMOgbmciLA0KICAgIHggICAgICAgID0gZXhwcmVzc2lvbihiZXRhKSwNCiAgICB5ICAgICAgICA9ICJM4bujaSBzdeG6pXQga+G7syB24buNbmcgKGFubnVhbGl6ZWQpIiwNCiAgICBjb2xvciAgICA9ICJD4buVIHBoaeG6v3UiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgICAgICAgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE2KSwNCiAgICBwbG90LnN1YnRpdGxlICAgID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiZ3JheTQwIiksDQogICAgbGVnZW5kLnBvc2l0aW9uICA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50aXRsZSAgICAgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQoNCmBgYA0KDQomZW1zcDtCaeG7g3UgxJHhu5MgxJHGsOG7nW5nIHRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiAoU2VjdXJpdHkgTWFya2V0IExpbmUg4oCTIFNNTCkgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgcuG7p2kgcm8gaOG7hyB0aOG7kW5nICh0aMO0bmcgcXVhIGjhu4cgc+G7kSBiZXRhKSB2w6AgbOG7o2kgc3XhuqV0IGvhu7MgduG7jW5nIGFubnVhbGl6ZWQgY+G7p2EgbsSDbSBj4buVIHBoaeG6v3UgdGh14buZYyBuaMOzbSBuZ8OibiBow6BuZzogQUNCLCBCSUQsIENURywgT0NCIHbDoCBWUEIuIMSQxrDhu51uZyBTTUwgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIHThu6sgZOG7ryBsaeG7h3UgdGjhu7FjIG5naGnhu4dtIHbhu5tpIMSR4buZIGThu5FjIHBo4bqjbiDDoW5oIHBo4bqnbiB0aMaw4bufbmcgcuG7p2kgcm8gdGjhu4sgdHLGsOG7nW5nLCBjw7JuIHBo4bqnbiBjaOG6t24gxJHhu6luZyBiaeG7g3UgdGjhu4sgbeG7qWMgbOG7o2kgc3XhuqV0IHBoaSBy4bunaSBybyAocmlzay1mcmVlIHJhdGUpIGdp4bqjIMSR4buLbmguDQoNCiZlbXNwO1ThuqV0IGPhuqMgY8OhYyBj4buVIHBoaeG6v3UgdHJvbmcgbeG6q3UgxJHhu4F1IG7hurFtIGfhuqduIGhv4bq3YyBuZ2F5IHRyw6puIMSRxrDhu51uZyBTTUwsIGNobyB0aOG6pXkgcuG6sW5nIG3hu6ljIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyBj4bunYSBjaMO6bmcgcGjDuSBo4bujcCB24bubaSBt4bupYyDEkeG7mSBy4bunaSBybyBo4buHIHRo4buRbmcgbcOgIG5ow6AgxJHhuqd1IHTGsCBwaOG6o2kgxJHhu5FpIG3hurd0LCB04bupYyBsw6AgxJHGsOG7o2MgxJHhu4tuaCBnacOhIGjhu6NwIGzDvSB0aGVvIGzDvSB0aHV54bq/dCBDQVBNLiBD4bulIHRo4buDOg0KDQotIENURyBjw7MgaOG7hyBz4buRIGJldGEgY2FvIG5o4bqldCAofjEuMjMpLCDEkeG7k25nIG5naMSpYSB24bubaSBt4bupYyDEkeG7mSBuaOG6oXkgY+G6o20gbOG7m24gbmjhuqV0IHbhu5tpIHRo4buLIHRyxrDhu51uZyB2w6AgY8WpbmcgY8OzIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyBjYW8gbmjhuqV0ICh+MTUuNSUpLCDEkcO6bmcgbmjGsCBsw70gdGh1eeG6v3QgQ0FQTSBk4buxIMSRb8Ohbi4NCg0KLSBBQ0IgdsOgIE9DQiBjw7MgYmV0YSBn4bqnbiBi4bqxbmcgMSwgcGjhuqNuIMOhbmggbeG7qWMgcuG7p2kgcm8gaOG7hyB0aOG7kW5nIHTGsMahbmcgxJHGsMahbmcgdGjhu4sgdHLGsOG7nW5nLCB24bubaSBs4bujaSBzdeG6pXQga+G7syB24buNbmcgfjEzLjPigJMxMy40JS4NCg0KLSBCSUQgdsOgIFZQQiBjw7MgYmV0YSB44bqlcCB44buJIHThu6sgMS4wMeKAkzEuMDYsIG7hurFtIGdp4buvYSBuaMOzbSBjw7JuIGzhuqFpLCB2w6AgbOG7o2kgc3XhuqV0IGvhu7MgduG7jW5nIGPFqW5nIG7hurFtIHTGsMahbmcg4bupbmcgdHJvbmcga2hv4bqjbmcgfjEzLjbigJMxNC4xJS4NCg0KVOG7lW5nIHRo4buDLCBjw6FjIMSRaeG7g20gZOG7ryBsaeG7h3UgcGjDom4gYuG7kSBuaOG6pXQgcXXDoW4gcXVhbmggxJHGsOG7nW5nIFNNTCB24bubaSDEkeG7mSBs4buHY2ggbmjhu48sIGNobyB0aOG6pXkgbcO0IGjDrG5oIENBUE0gY8OzIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgY2FvIHRyb25nIHZp4buHYyBtw7QgdOG6oyBwaOG6p24gdGjGsOG7n25nIHLhu6dpIHJvIGPhu6dhIGPDoWMgY+G7lSBwaGnhur91IG5nw6JuIGjDoG5nIHThuqFpIHRo4budaSDEkWnhu4NtIHBow6JuIHTDrWNoLiBLaMO0bmcgY8OzIGPhu5UgcGhp4bq/dSBuw6BvIHLDtSByw6BuZyBi4buLIMSR4buLbmggZ2nDoSB0aOG6pXAgKG7hurFtIGNhbyBoxqFuIFNNTCkgaGF5IMSR4buLbmggZ2nDoSBjYW8gKG7hurFtIHRo4bqlcCBoxqFuIFNNTCksIGfhu6NpIMO9IHRo4buLIHRyxrDhu51uZyDEkWFuZyBwaOG6o24gw6FuaCDEkcO6bmcgbeG7qWMgxJHhu5kgcuG7p2kgcm8gdHJvbmcgxJHhu4tuaCBnacOhIG5ow7NtIHTDoGkgc+G6o24gbsOgeS4NCg0KIyAqKjUuIMav4buaQyBMxq/hu6JORyBNQSBUUuG6rE4gSEnhu4ZQIFBIxq/GoE5HIFNBSSoqDQoNCmBgYHtSfQ0Kc3RvY2tzIDwtIGNvbG5hbWVzKHJldHVybnNfeHRzKQ0KY292X21hdHJpeCA8LSBjb3YocmV0dXJuc194dHNbLCBzdG9ja3NdKQ0KY2F0KCJcbj09PSBNYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaSA9PT1cbiIpDQpwcmludChjb3ZfbWF0cml4KQ0KYGBgDQoNCioqTkjhuqxOIFjDiVQqKg0KDQomZW1zcDtNYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaSBnaeG7r2EgY8OhYyBjaHXhu5dpIHThu7cgc3XhuqV0IGzhu6NpIG5odeG6rW4gbG9nIGNobyB0aOG6pXkgc+G7sSBiaeG6v24gxJHhu5luZyDEkeG7k25nIHRo4budaSBnaeG7r2EgY8OhYyB0w6BpIHPhuqNuIHRyb25nIGRhbmggbeG7pWMgbmdoacOqbiBj4bupdS4gR2nDoSB0cuG7iyB0csOqbiDEkcaw4budbmcgY2jDqW8gY2jDrW5oIMSR4bqhaSBkaeG7h24gY2hvIHBoxrDGoW5nIHNhaSByacOqbmcgY+G7p2EgdOG7q25nIHTDoGkgc+G6o24g4oCTIGhheSBt4bupYyDEkeG7mSBiaeG6v24gxJHhu5luZyBu4buZaSB04bqhaSBj4bunYSBj4buVIHBoaeG6v3Ug4oCTIHRyb25nIGtoaSBjw6FjIHBo4bqnbiB04butIG5nb8OgaSDEkcaw4budbmcgY2jDqW8gbcO0IHThuqMgbeG7qWMgxJHhu5kgdMawxqFuZyBxdWFuIHR1eeG6v24gdMOtbmggduG7gSBt4bq3dCBiaeG6v24gxJHhu5luZyBnaeG7r2EgY8OhYyBj4bq3cCB0w6BpIHPhuqNuLg0KDQomZW1zcDtD4bulIHRo4buDOg0KDQotIEPhu5UgcGhp4bq/dSBDVEcgY8OzIHBoxrDGoW5nIHNhaSBjYW8gbmjhuqV0ICgwLjAwMDI4MDE4KSwgY2hvIHRo4bqleSDEkcOieSBsw6AgY+G7lSBwaGnhur91IGPDsyBiaeG6v24gxJHhu5luZyBs4bubbiBuaOG6pXQgdHJvbmcgbmjDs20uIFRp4bq/cCB0aGVvIGzDoCBPQ0IgKDAuMDAwMjU3ODIpLCBBQ0IgKDAuMDAwMjQ5MzcpLCBCSUQgKDAuMDAwMjI4NTEpLCB2w6AgVlBCICgwLjAwMDIwOTQ3KS4gVk4tSW5kZXggY8OzIHBoxrDGoW5nIHNhaSBuaOG7jyBuaOG6pXQgKDAuMDAwMTA5MTYpLCBwaOG6o24gw6FuaCB0w61uaCBjaOG6pXQgdHJ1bmcgYsOsbmggaMOzYSBj4bunYSBjaOG7iSBz4buRIHRo4buLIHRyxrDhu51uZy4NCg0KLSBDw6FjIGhp4buHcCBwaMawxqFuZyBzYWkgxJHhu4F1IG1hbmcgZ2nDoSB0cuG7iyBkxrDGoW5nLCBjaG8gdGjhuqV5IGPDoWMgY+G7lSBwaGnhur91IGPDsyB4dSBoxrDhu5tuZyBiaeG6v24gxJHhu5luZyBjw7luZyBjaGnhu4F1IHbhu5tpIG5oYXUgdsOgIHbhu5tpIHRo4buLIHRyxrDhu51uZy4gxJBp4buBdSBuw6B5IHBow7kgaOG7o3AgduG7m2kgdGjhu7FjIHThur8ga2hpIGPDoWMgY+G7lSBwaGnhur91IHRodeG7mWMgY8O5bmcgbmfDoG5oIChuZ8OibiBow6BuZykgdGjGsOG7nW5nIGLhu4sgY2hpIHBo4buRaSBi4bufaSBjw6FjIHnhur91IHThu5Ega2luaCB04bq/IHbEqSBtw7QgY2h1bmcuDQoNCiZlbXNwO03hu5l0IHPhu5EgY+G6t3AgY8OzIGhp4buHcCBwaMawxqFuZyBzYWkgbuG7lWkgYuG6rXQgbmjGsDoNCg0KLSBDVEfigJNCSUQgKDAuMDAwMTc2NDYpOiBt4bupYyDEkeG7k25nIGJp4bq/biBjYW8sIHRo4buDIGhp4buHbiBt4buRaSBsacOqbiBo4buHIG3huqFuaCBnaeG7r2EgaGFpIGPhu5UgcGhp4bq/dSBs4bubbiB0cm9uZyBuZ8OgbmggbmfDom4gaMOgbmcuDQoNCi0gQ1RH4oCTQUNCICgwLjAwMDE1Nzg2KSB2w6AgQ1RH4oCTVlBCICgwLjAwMDE1MjY5KTogY8WpbmcgdGjhu4MgaGnhu4duIG3hu6ljIMSR4buZIMSR4buTbmcgYmnhur9uIMSRw6FuZyBr4buDLg0KDQomZW1zcDtOZ8aw4bujYyBs4bqhaSwgY8OhYyBj4bq3cCBuaMawIE9DQuKAk0JJRCAoMC4wMDAxMTcyNikgaGF5IE9DQuKAk0FDQiAoMC4wMDAxMjA0NSkgY8OzIG3hu6ljIMSR4buTbmcgYmnhur9uIHRo4bqlcCBoxqFuLCBwaOG6o24gw6FuaCBz4buxIGtow6FjIGJp4buHdCBuaOG6pXQgxJHhu4tuaCB0cm9uZyBwaOG6o24g4bupbmcgZ2nDoSBnaeG7r2EgY8OhYyBj4buVIHBoaeG6v3UgbsOgeS4NCg0KJmVtc3A7VOG7lW5nIHRo4buDLCBtYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaSBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIGxpw6puIGvhur90IG3huqFuaCBt4bq9IGdp4buvYSBjw6FjIGPhu5UgcGhp4bq/dSBuZ8OibiBow6BuZyB2w6AgduG7m2kgdGjhu4sgdHLGsOG7nW5nLCBsw6BtIGPGoSBz4bufIHF1YW4gdHLhu41uZyBjaG8gdmnhu4djIHjDonkgZOG7sW5nIGRhbmggbeG7pWMgxJHhuqd1IHTGsCwgxrDhu5tjIGzGsOG7o25nIHLhu6dpIHJvIGjhu4cgdGjhu5FuZywgY8WpbmcgbmjGsCB0w61uaCB0b8OhbiBnacOhIHRy4buLIHLhu6dpIHJvIChWYVIpIHNhdSBuw6B5Lg0KDQojICoqNi4gxq/hu5pDIEzGr+G7ok5HIFZBUioqDQoNCiMjICoqNi4xLiBWQVIgQ0hPIFThu6pORyBD4buUIFBISeG6vlUqKg0KDQpgYGB7cn0NCiMgVGjDtG5nIHPhu5EgxJHhuqd1IHbDoG8NCmNvbmZfbGV2ZWwgPC0gMC45OQ0Kel9hbHBoYSA8LSBxbm9ybSgxIC0gY29uZl9sZXZlbCkNCnBvcnRmb2xpb192YWx1ZSA8LSAxZTkgICMgMSB04bu3IG3hu5dpIGPhu5UgcGhp4bq/dQ0KDQojIFTDrW5oIHRvw6FuIHRydW5nIGLDrG5oIHbDoCDEkeG7mSBs4buHY2ggY2h14bqpbg0KbXUgPC0gY29sTWVhbnMocmV0dXJuc194dHMsIG5hLnJtID0gVFJVRSkNCnNkIDwtIGFwcGx5KHJldHVybnNfeHRzLCAyLCBzZCwgbmEucm0gPSBUUlVFKQ0KDQojIFTDrW5oIFZhUiB0aGVvIHBo4bqnbiB0csSDbSB2w6AgdGhlbyB0aeG7gW4NCnZhcl9wY3QgPC0gLSAobXUgKyB6X2FscGhhICogc2QpDQp2YXJfdm5kIDwtIHZhcl9wY3QgKiBwb3J0Zm9saW9fdmFsdWUNCg0KIyBH4buZcCB2w6BvIGLhuqNuZw0KVmFSX2RmIDwtIGRhdGEuZnJhbWUoDQogIFN0b2NrICAgICAgICAgICAgPSBjb2xuYW1lcyhyZXR1cm5zX3h0cyksDQogIE1lYW5fUmV0dXJuICAgICAgPSByb3VuZChtdSwgNiksDQogIFN0ZF9EZXYgICAgICAgICAgPSByb3VuZChzZCwgNiksDQogIFZhUl9QY3RfOTkgICAgICAgPSByb3VuZCh2YXJfcGN0ICogMTAwLCA0KSwNCiAgVmFSX1ZORF85OSAgICAgICA9IHJvdW5kKHZhcl92bmQpDQopDQoNCnByaW50KFZhUl9kZikNCmBgYA0KDQoqKk5I4bqsTiBYw4lUKioNCg0KJmVtc3A7QuG6o25nIGvhur90IHF14bqjIHRo4buDIGhp4buHbiBWYVIgaMOgbmcgbmfDoHkgduG7m2kgxJHhu5kgdGluIGPhuq15IDk5JSBjaG8gbeG7l2kgY+G7lSBwaGnhur91LCB04bupYyBsw6AgdHJvbmcgxJFp4buBdSBraeG7h24gdGjhu4sgdHLGsOG7nW5nIGLDrG5oIHRoxrDhu51uZywgeMOhYyBzdeG6pXQgbOG7lyB2xrDhu6N0IHF1w6EgbeG7qWMgVmFSIGzDoCAxJSwgY8OybiBs4bqhaSA5OSUgbMOgIHRyb25nIHBo4bqhbSB2aSB04buVbiB0aOG6pXQgZOG7sSDEkW/DoW4uIEdpw6EgdHLhu4sgVmFSIMSRxrDhu6NjIHTDrW5oIGLhurFuZyBj4bqjIHThu7cgc3XhuqV0IHBo4bqnbiB0csSDbSBs4buXIHThu5FpIMSRYSBr4buzIHbhu41uZywgbOG6q24gZ2nDoSB0cuG7iyB0aeG7gW4gdOG7hyAoVk7EkCkgdHLDqm4gZ2nhuqMgxJHhu4tuaCDEkeG6p3UgdMawIDEgdOG7tyDEkeG7k25nIGNobyBt4buXaSBtw6MuDQoNCiZlbXNwO03hu5l0IHPhu5Egbmjhuq1uIHjDqXQgxJHDoW5nIGNow7ogw706DQoNCi0gQ+G7lSBwaGnhur91IENURyBjw7MgcuG7p2kgcm8gbOG7m24gbmjhuqV0LCB24bubaSBWYVIgxJHhuqF0IDMsNzglLCB0xrDGoW5nIMSRxrDGoW5nIGtob+G6o25nIDM3LDc1IHRyaeG7h3UgVk7EkCBs4buXIGvhu7MgduG7jW5nIHRyb25nIG3hu5l0IG5nw6B5IHbhu5tpIHjDoWMgc3XhuqV0IDElLiDEkMOieSBsw6AgbeG7qWMgVmFSIGNhbyBuaOG6pXQgdHJvbmcgZGFuaCBt4bulYywgcGjhuqNuIMOhbmggbeG7qWMgYmnhur9uIMSR4buZbmcgbOG7m24gKFN0ZF9EZXYgPSAwLjAxNjczOCkuDQoNCi0gVGnhur9wIHRoZW8gbMOgIE9DQiB2w6AgQUNCLCB24bubaSBWYVIgbOG6p24gbMaw4bujdCBsw6AgMyw3MiUgdsOgIDMsNjclLCB0xrDGoW5nIOG7qW5nIHThu5VuIHRo4bqldCBr4buzIHbhu41uZyBraG/huqNuZyAzNyB0cmnhu4d1IHbDoCAzNiw3IHRyaeG7h3UgxJHhu5NuZyBt4buXaSBuZ8OgeSBu4bq/dSByxqFpIHbDoG8gdsO5bmcgcuG7p2kgcm8uDQoNCi0gQ+G7lSBwaGnhur91IEJJRCB2w6AgVlBCIGPDsyBt4bupYyBWYVIgdGjhuqVwIGjGoW4sIGzhuqduIGzGsOG7o3Qga2hv4bqjbmcgMyw1MSUgdsOgIDMsMzYlLCB04bupYyBy4bunaSBybyB0aOG6pXAgaMahbiBuaOG6uSBzbyB24bubaSBjw6FjIGPhu5UgcGhp4bq/dSBjw7JuIGzhuqFpLg0KDQotIFZOLUluZGV4IGPDsyBWYVIgdGjhuqVwIG5o4bqldCAoMiwzOCUpLCB0xrDGoW5nIOG7qW5nIHThu5VuIHRo4bqldCBraG/huqNuZyAyMyw3NyB0cmnhu4d1IMSR4buTbmcsIMSRaeG7gXUgbsOgeSBwaMO5IGjhu6NwIGRvIGNo4buJIHPhu5EgdGjhu4sgdHLGsOG7nW5nIGPDsyB0w61uaCBjaOG6pXQgdOG7lW5nIGjhu6NwLCB0cnVuZyBow7JhIHLhu6dpIHJvIHbDoCBiaeG6v24gxJHhu5luZyBzbyB24bubaSBjw6FjIG3DoyDEkcahbiBs4bq7Lg0KDQomZW1zcDtW4buBIHThu5VuZyB0aOG7gywga+G6v3QgcXXhuqMgY2hvIHRo4bqleSBjw6FjIGPhu5UgcGhp4bq/dSBuZ8OibiBow6BuZyBjw7MgbeG7qWMgcuG7p2kgcm8gY2FvIGjGoW4gY2jhu4kgc+G7kSB0aOG7iyB0csaw4budbmcsIHbhu5tpIG3hu6ljIFZhUiB04burIDMsMyUgxJHhur9uIDMsOCUsIHNvIHbhu5tpIGtob+G6o25nIDIsNCUgY+G7p2EgVk4tSW5kZXguIMSQaeG7gXUgbsOgeSBuaOG6pW4gbeG6oW5oIHLhurFuZyDEkeG6p3UgdMawIHbDoG8gY+G7lSBwaGnhur91IG5nw6BuaCBuZ8OibiBow6BuZywgZMO5IG1hbmcgbOG6oWkgdGnhu4FtIG7Eg25nIHNpbmggbOG7nWksIGPFqW5nIMSR4buTbmcgdGjhu51pIGvDqW8gdGhlbyBy4bunaSBybyBiaeG6v24gxJHhu5luZyBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBkYW5oIG3hu6VjIHRo4buLIHRyxrDhu51uZyBjaHVuZy4NCg0KIyMgKio2LjIuIFZBUiBDSE8gREFOSCBN4bukQyDEkOG6plUgVMavKioNCg0KYGBge3J9DQojIDEuIFRow7RuZyBz4buRIMSR4bqndSB2w6BvDQpjb25maWRlbmNlX2xldmVsIDwtIDAuOTkNCmFscGhhIDwtIDEgLSBjb25maWRlbmNlX2xldmVsDQp6X2FscGhhIDwtIHFub3JtKGFscGhhKQ0KaG9sZGluZ19wZXJpb2QgPC0gMSAgIyAxIG5nw6B5DQoNCiMgMi4gR2nhuqMgxJHhu4tuaCBkYW5oIG3hu6VjIMSR4bqndSB0xrA6IMSR4bqndSB0xrAgMSB04bu3IG3hu5dpIGPhu5UgcGhp4bq/dQ0KdGlja2VycyA8LSBjb2xuYW1lcyhyZXR1cm5zX3h0cykNCndlaWdodHMgPC0gcmVwKDFlOSwgbGVuZ3RoKHRpY2tlcnMpKSAgIyAxIHThu7cgbeG7l2kgbcOjDQpuYW1lcyh3ZWlnaHRzKSA8LSB0aWNrZXJzDQoNCiMgMy4gVMOtbmggbOG7o2kgc3XhuqV0IGvhu7MgduG7jW5nIHbDoCBtYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaQ0KbWVhbl9yZXR1cm5zIDwtIGNvbE1lYW5zKHJldHVybnNfeHRzLCBuYS5ybSA9IFRSVUUpDQpjb3ZfbWF0cml4IDwtIGNvdihyZXR1cm5zX3h0cywgdXNlID0gImNvbXBsZXRlLm9icyIpDQoNCiMgNC4gVMOtbmggVmFSIGRhbmggbeG7pWMgKHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4gY8OzIGhp4buHcCBwaMawxqFuZyBzYWkpDQojIDQuMS4gVOG7lW5nIGdpw6EgdHLhu4sgZGFuaCBt4bulYw0KcG9ydGZvbGlvX3ZhbHVlIDwtIHN1bSh3ZWlnaHRzKQ0KDQojIDQuMi4gVMOtbmggdOG7tyB0cuG7jW5nICglIHbhu5FuKSB0aGVvIHThu6tuZyBj4buVIHBoaeG6v3UNCndfcGN0IDwtIHdlaWdodHMgLyBwb3J0Zm9saW9fdmFsdWUNCg0KIyA0LjMuIEzhu6NpIHN14bqldCBr4buzIHbhu41uZyBkYW5oIG3hu6VjDQptdV9wIDwtIHN1bSh3X3BjdCAqIG1lYW5fcmV0dXJucykNCg0KIyA0LjQuIMSQ4buZIGzhu4djaCBjaHXhuqluIGRhbmggbeG7pWMNCnNpZ21hX3AgPC0gc3FydCh0KHdfcGN0KSAlKiUgY292X21hdHJpeCAlKiUgd19wY3QpDQoNCiMgNC41LiBUw61uaCBWYVINClZhUl9wY3QgPC0gLSAobXVfcCArIHpfYWxwaGEgKiBzaWdtYV9wKSAgIyB0aGVvIHBo4bqnbiB0csSDbQ0KVmFSX3ZuZCA8LSBWYVJfcGN0ICogcG9ydGZvbGlvX3ZhbHVlICAgICAjIHRoZW8gdGnhu4FuDQoNCiMgNS4gS+G6v3QgcXXhuqMNCmNhdCgiPT09IFZhUiBEQU5IIE3hu6RDICg5OSUsIDEgbmfDoHkpID09PVxuIikNCmNhdCgiTOG7o2kgc3XhuqV0IGvhu7MgduG7jW5nOiIsIHJvdW5kKG11X3AsIDYpLCAiXG4iKQ0KY2F0KCLEkOG7mSBs4buHY2ggY2h14bqpbiBkYW5oIG3hu6VjOiIsIHJvdW5kKHNpZ21hX3AsIDYpLCAiXG4iKQ0KY2F0KCJWYVIgKHThu7cgbOG7hyAlKToiLCByb3VuZChWYVJfcGN0ICogMTAwLCA0KSwgIiVcbiIpDQpjYXQoIlZhUiAoVk7EkCk6Iiwgcm91bmQoVmFSX3ZuZCksICJWTkRcbiIpDQpgYGANCg0KKipOSOG6rE4gWMOJVCoqDQoNCiZlbXNwO0vhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZyBWYVIgY2hvIGRhbmggbeG7pWMgxJHhuqd1IHTGsCB24bubaSBnaeG6oyDEkeG7i25oIMSR4bqndSB0xrAgxJHhu5NuZyDEkeG7gXUgKG3hu5dpIG3DoyAxIHThu7cgVk7EkCkgdsOgIHThu5VuZyBnacOhIHRy4buLIGRhbmggbeG7pWMgbMOgIDYgdOG7tyDEkeG7k25nIGNobyB0aOG6pXk6DQoNCi0gTOG7o2kgc3XhuqV0IGvhu7MgduG7jW5nIGjDoG5nIG5nw6B5IGPhu6dhIGRhbmggbeG7pWMg4bufIG3hu6ljIDAuMDM1JSAodMawxqFuZyDEkcawxqFuZyAwLjAwMDM1KSwgcGjhuqNuIMOhbmggbeG7qWMgc2luaCBs4bujaSB0cnVuZyBiw6xuaCB0w61jaCBj4buxYywgZMO5IGtow6EgdGjhuqVwIOKAkyDEkWnhu4F1IGThu4UgaGnhu4N1IHRyb25nIGLhu5FpIGPhuqNuaCBiaeG6v24gxJHhu5luZyBuZ+G6r24gaOG6oW4gY+G7p2EgdGjhu4sgdHLGsOG7nW5nIGNo4bupbmcga2hvw6FuLg0KDQotIMSQ4buZIGzhu4djaCBjaHXhuqluIGzhu6NpIHN14bqldCBkYW5oIG3hu6VjIMSR4bqhdCAwLjAxMjA2NCwgY2hvIHRo4bqleSBt4bupYyBiaeG6v24gxJHhu5luZyBow6BuZyBuZ8OgeSBsw6Aga2hv4bqjbmcgMS4yJS4gxJDDonkgbMOgIG3hu6ljIGJp4bq/biDEkeG7mW5nIHbhu6thIHBo4bqjaSwgdGjhuqVwIGjGoW4gc28gduG7m2kgY8OhYyBj4buVIHBoaeG6v3UgcmnDqm5nIGzhurssIG5o4budIHbDoG8gdMOhYyDEkeG7mW5nIMSRYSBk4bqhbmcgaMOzYSBy4bunaSBybyBnaeG7r2EgY8OhYyB0w6BpIHPhuqNuIHRyb25nIGRhbmggbeG7pWMuDQoNCi0gR2nDoSB0cuG7iyBWYVIgdOG6oWkgbeG7qWMgdGluIGPhuq15IDk5JSBsw6AgMi43NyUsIHThu6ljIGzDoCB24bubaSB4w6FjIHN14bqldCA5OSUsIG3hu6ljIGzhu5cgdOG7kWkgxJFhIGvhu7MgduG7jW5nIGPhu6dhIGRhbmggbeG7pWMgdHJvbmcgbeG7mXQgbmfDoHkga2jDtG5nIHbGsOG7o3QgcXXDoSBt4bupYyBuw6B5Lg0KDQotIENodXnhu4NuIMSR4buVaSBzYW5nIGdpw6EgdHLhu4sgdHV54buHdCDEkeG7kWksIFZhUiBkYW5oIG3hu6VjIGzDoCBraG/huqNuZyAxNjYsMjkgdHJp4buHdSBWTsSQLiDEkGnhu4F1IG7DoHkgxJHhu5NuZyBuZ2jEqWEgduG7m2kgdmnhu4djIG5ow6AgxJHhuqd1IHTGsCBjw7MgdGjhu4MgbeG6pXQgdOG7kWkgxJFhIGtob+G6o25nIDE2NiB0cmnhu4d1IMSR4buTbmcgdHJvbmcgbeG7mXQgbmfDoHkgKHbhu5tpIDElIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHTDrG5oIGh14buRbmcgYuG6pXQgbOG7o2kpLCB0cm9uZyDEkWnhu4F1IGtp4buHbiB0aOG7iyB0csaw4budbmcgYsOsbmggdGjGsOG7nW5nLg0KDQomZW1zcDtL4bq/dCBsdeG6rW4sIGRhbmggbeG7pWMgxJHhuqd1IHTGsCBuw6B5LCBkw7kgY8OzIG3hu6ljIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyB0aOG6pXAsIMSRw6MgdOG6rW4gZOG7pW5nIGhp4buHdSBxdeG6oyBs4bujaSDDrWNoIGPhu6dhIMSRYSBk4bqhbmcgaMOzYSwgdGjhu4MgaGnhu4duIHF1YSDEkeG7mSBs4buHY2ggY2h14bqpbiBkYW5oIG3hu6VjIHRo4bqlcCBoxqFuIG5oaeG7gXUgY+G7lSBwaGnhur91IHRow6BuaCBwaOG6p24sIHbDoCBWYVIgdMawxqFuZyDEkeG7kWkga2nhu4NtIHNvw6F0IMSRxrDhu6NjIHNvIHbhu5tpIFZhUiByacOqbmcgbOG6uyBj4bunYSBjw6FjIG3DoyB0cm9uZyBjw7luZyBkYW5oIG3hu6VjLiDEkMOieSBsw6AgbeG7mXQgbWluaCBjaOG7qW5nIHRo4buxYyBuZ2hp4buHbSB04buRdCBjaG8gdmFpIHRyw7IgY+G7p2EgdOG7kWkgxrB1IGjDs2EgcGjDom4gYuG7lSB0w6BpIHPhuqNuIHRyb25nIHF14bqjbiB0cuG7iyBy4bunaSBybyB0w6BpIGNow61uaC4NCg0KIyAqKjcuIFNPIFPDgU5IIEzhu6JJIFNV4bqkVCBE4buwIELDgU8gVsOAIEzhu6JJIFNV4bqkVCBUSOG7sEMgVOG6vioqDQoNCmBgYHtyfQ0KbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykNCmxpYnJhcnkoa25pdHIpDQoNCiMgMS4gVMOtbmggbOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IGFubnVhbGl6ZWQgdOG7qyByZXRzIChsb2cgcmV0dXJuKQ0KYWN0dWFsX2RmIDwtIGRhdGEuZnJhbWUoDQogIFN0b2NrICAgICA9IGNvbG5hbWVzKHJldHMpLA0KICBBY3R1YWxfRVIgPSBhcy5udW1lcmljKFJldHVybi5hbm51YWxpemVkKHJldHMsIHNjYWxlID0gMjUyKSkgKiAxMDANCikNCg0KIyAyLiBH4buZcCB24bubaSBr4bq/dCBxdeG6oyB04burIENBUE0NCmNvbXBhcmVfZGYgPC0gbWVyZ2UoDQogIGNhcG1fZGZbLCBjKCJTdG9jayIsICJFUl9DQVBNIildLA0KICBhY3R1YWxfZGYsDQogIGJ5ID0gIlN0b2NrIg0KKQ0KY29tcGFyZV9kZiRFUl9DQVBNIDwtIGNvbXBhcmVfZGYkRVJfQ0FQTSAqIDEwMA0KY29tcGFyZV9kZiREaWZmICAgIDwtIGNvbXBhcmVfZGYkQWN0dWFsX0VSIC0gY29tcGFyZV9kZiRFUl9DQVBNDQoNCiMgMy4gSGnhu4NuIHRo4buLIGLhuqNuZw0Ka2FibGUoDQogIGNvbXBhcmVfZGYsDQogIGNvbC5uYW1lcyA9IGMoIk3DoyIsICJDQVBNICglKSIsICJUaOG7sWMgdOG6vyAoJSkiLCAiQ2jDqm5oIGzhu4djaCAoJSkiKSwNCiAgZGlnaXRzID0gMiwNCiAgY2FwdGlvbiA9ICJTbyBzw6FuaCBs4bujaSBzdeG6pXQga+G7syB24buNbmcgQ0FQTSB2w6AgbOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IChBbm51YWxpemVkKSINCikNCmBgYA0KDQoqKk5I4bqsTiBYw4lUKioNCg0KJmVtc3A7QuG6o25nIGvhur90IHF14bqjIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgZ2nhu69hIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyB0aGVvIG3DtCBow6xuaCBDQVBNIHbDoCBs4bujaSBzdeG6pXQgdGjhu7FjIHThur8gYW5udWFsaXplZCBj4bunYSBjw6FjIGPhu5UgcGhp4bq/dSBuZ8OibiBow6BuZyB0cm9uZyBkYW5oIG3hu6VjLiDEkGEgcGjhuqduIGPDoWMgY+G7lSBwaGnhur91IMSR4buBdSBjw7MgbOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IHRo4bqlcCBoxqFuIG5oaeG7gXUgc28gduG7m2kgbeG7qWMgbOG7o2kgc3XhuqV0IG3DoCBtw7QgaMOsbmggQ0FQTSBk4buxIMSRb8Ohbi4gDQoNCi0gQ+G7pSB0aOG7gywgQUNCIHbDoCBCSUQgY8OzIG3hu6ljIGNow6puaCBs4buHY2ggbOG6p24gbMaw4bujdCBsw6AgLTE2LjA5JSB2w6AgLTE1LjQyJSwgY2hvIHRo4bqleSBoaeG7h3UgcXXhuqMgc2luaCBs4budaSB0aOG7sWMgdOG6vyBy4bqldCBrw6ltIHNvIHbhu5tpIG3hu6ljIHBo4bqnbiBiw7kgcuG7p2kgcm8ga+G7syB24buNbmcuIA0KDQotIE9DQiB2w6AgVlBCIGPFqW5nIGdoaSBuaOG6rW4gbeG7qWMgY2jDqm5oIGzhu4djaCDDom0gxJHDoW5nIGvhu4MsIGzhuqduIGzGsOG7o3QgbMOgIC0xMi4wMSUgdsOgIC0xMy40NyUsIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDoWMgY+G7lSBwaGnhur91IG7DoHkgY8OzIHRo4buDIMSRYW5nIGLhu4sgxJHhu4tuaCBnacOhIGNhbyBzbyB24bubaSBnacOhIHRy4buLIHRo4buxYyB04bq/IHRyw6puIHRo4buLIHRyxrDhu51uZywgaG/hurdjIGNo4buLdSDhuqNuaCBoxrDhu59uZyB04burIGPDoWMgeeG6v3UgdOG7kSBwaGkgaOG7hyB0aOG7kW5nIG3DoCBtw7QgaMOsbmggQ0FQTSBraMO0bmcgcGjhuqNuIMOhbmggxJHGsOG7o2MuDQoNCi0gTmfGsOG7o2MgbOG6oWksIENURyBsw6AgY+G7lSBwaGnhur91IGR1eSBuaOG6pXQgY8OzIGzhu6NpIHN14bqldCB0aOG7sWMgdOG6vyB2xrDhu6N0IHhhIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyB04burIG3DtCBow6xuaCwgduG7m2kgY2jDqm5oIGzhu4djaCBkxrDGoW5nIDE0LjY4JS4gxJBp4buBdSBuw6B5IGjDoG0gw70gcuG6sW5nIENURyBjw7MgdGjhu4MgxJFhbmcgYuG7iyDEkeG7i25oIGdpw6EgdGjhuqVwIGhv4bq3YyBz4bufIGjhu691IG5o4buvbmcgeeG6v3UgdOG7kSBu4buZaSB04bqhaSB0w61jaCBj4buxYyB2xrDhu6N0IG5nb8OgaSBwaOG6oW0gdmkgbMO9IGdp4bqjaSBj4bunYSBDQVBNLCBjaOG6s25nIGjhuqFuIG5oxrAga2jhuqMgbsSDbmcgc2luaCBs4budaSBjYW8gaMahbiwgcXXhuqNuIHRy4buLIGhp4buHdSBxdeG6oywgaG/hurdjIHRyaeG7g24gduG7jW5nIHTEg25nIHRyxrDhu59uZyB0w61jaCBj4buxYyB0cm9uZyBt4bqvdCBuaMOgIMSR4bqndSB0xrAuDQoNCg0KDQo=