1.Về Bộ Dữ Liệu
Mô tả
Bộ dữ liệu có tên “A Statistical Research on the Effects of Mental
Health on Students’ CGPA” được thu thập thông qua khảo sát trực tuyến
bằng Google Forms với đối tượng là sinh viên tại Đại học Hồi giáo Quốc
tế Malaysia (International Islamic University Malaysia - IIUM). Mục tiêu
của nghiên cứu là phân tích mối quan hệ giữa sức khỏe tinh thần (mental
health) và kết quả học tập (CGPA) của sinh viên.
Bộ dữ liệu nhằm hỗ trợ nghiên cứu mối liên hệ giữa các yếu tố liên
quan đến sức khỏe tinh thần – như mức độ căng thẳng, lo âu, trầm cảm –
với kết quả học tập (thể hiện qua điểm trung bình tích lũy – CGPA) của
sinh viên. Đây là một vấn đề mang tính thời sự, đặc biệt trong bối cảnh
học tập áp lực và các vấn đề tâm lý ngày càng được quan tâm trong môi
trường đại học.
#Đọc dữ liệu từ file CSV
data <- read.csv("C:/Users/Hoang Quyen/Downloads/Student Mental health.csv")
#Hiển thị cấu trúc dữ liệu
str(data)
## 'data.frame': 101 obs. of 11 variables:
## $ Timestamp : chr "8/7/2020 12:02" "8/7/2020 12:04" "8/7/2020 12:05" "8/7/2020 12:06" ...
## $ Choose.your.gender : chr "Female" "Male" "Male" "Female" ...
## $ Age : int 18 21 19 22 23 19 23 18 19 18 ...
## $ What.is.your.course. : chr "Engineering" "Islamic education" "BIT" "Laws" ...
## $ Your.current.year.of.Study : chr "year 1" "year 2" "Year 1" "year 3" ...
## $ What.is.your.CGPA. : chr "3.00 - 3.49" "3.00 - 3.49" "3.00 - 3.49" "3.00 - 3.49" ...
## $ Marital.status : chr "No" "No" "No" "Yes" ...
## $ Do.you.have.Depression. : chr "Yes" "No" "Yes" "Yes" ...
## $ Do.you.have.Anxiety. : chr "No" "Yes" "Yes" "No" ...
## $ Do.you.have.Panic.attack. : chr "Yes" "No" "Yes" "No" ...
## $ Did.you.seek.any.specialist.for.a.treatment.: chr "No" "No" "No" "No" ...
View(data)
#Hiển thị 5 dòng đầu và cuối
head(data, 5)
## Timestamp Choose.your.gender Age What.is.your.course.
## 1 8/7/2020 12:02 Female 18 Engineering
## 2 8/7/2020 12:04 Male 21 Islamic education
## 3 8/7/2020 12:05 Male 19 BIT
## 4 8/7/2020 12:06 Female 22 Laws
## 5 8/7/2020 12:13 Male 23 Mathemathics
## Your.current.year.of.Study What.is.your.CGPA. Marital.status
## 1 year 1 3.00 - 3.49 No
## 2 year 2 3.00 - 3.49 No
## 3 Year 1 3.00 - 3.49 No
## 4 year 3 3.00 - 3.49 Yes
## 5 year 4 3.00 - 3.49 No
## Do.you.have.Depression. Do.you.have.Anxiety. Do.you.have.Panic.attack.
## 1 Yes No Yes
## 2 No Yes No
## 3 Yes Yes Yes
## 4 Yes No No
## 5 No No No
## Did.you.seek.any.specialist.for.a.treatment.
## 1 No
## 2 No
## 3 No
## 4 No
## 5 No
tail(data, 5)
## Timestamp Choose.your.gender Age What.is.your.course.
## 97 13/07/2020 19:56:49 Female 21 BCS
## 98 13/07/2020 21:21:42 Male 18 Engineering
## 99 13/07/2020 21:22:56 Female 19 Nursing
## 100 13/07/2020 21:23:57 Female 23 Pendidikan Islam
## 101 18/07/2020 20:16:21 Male 20 Biomedical science
## Your.current.year.of.Study What.is.your.CGPA. Marital.status
## 97 year 1 3.50 - 4.00 No
## 98 Year 2 3.00 - 3.49 No
## 99 Year 3 3.50 - 4.00 Yes
## 100 year 4 3.50 - 4.00 No
## 101 Year 2 3.00 - 3.49 No
## Do.you.have.Depression. Do.you.have.Anxiety. Do.you.have.Panic.attack.
## 97 No Yes No
## 98 Yes Yes No
## 99 Yes No Yes
## 100 No No No
## 101 No No No
## Did.you.seek.any.specialist.for.a.treatment.
## 97 No
## 98 No
## 99 No
## 100 No
## 101 No
Bộ dữ liệu được thu thập thông qua khảo sát sinh viên tại Đại
học Hồi giáo Quốc tế Malaysia (IIUM) với mục tiêu phân tích mối
quan hệ giữa sức khỏe tinh thần và kết quả học tập. Dữ
liệu bao gồm 101 quan sát, tương ứng với 101 sinh viên,
và **11 biến*
Các biến được phân loại như sau:
Biến định lượng (1 biến):
Age
: Tuổi hiện tại của sinh viên (kiểu số thực, liên
tục).
Biến định tính (10 biến):
Trong đó có:
2 biến định tính có thứ bậc (ordinal):
What is your CGPA?
: Điểm trung bình tích lũy, được
ghi nhận theo các khoảng giá trị.
Your current year of Study
: Năm học hiện tại (Year 1
đến Year 4+).
8 biến định tính định danh (nominal):
- Bao gồm các thông tin cá nhân, tình trạng sức khỏe tinh thần, tình
trạng hôn nhân,…
Timestamp |
Định tính |
Thời gian sinh viên hoàn thành khảo sát. |
Choose your gender |
Định tính |
Giới tính của sinh viên. |
Age |
Định lượng |
Tuổi hiện tại của sinh viên. |
What is your course? |
Định tính |
Ngành học của sinh viên. |
Your current year of Study |
Định tính |
Năm học hiện tại của sinh viên. |
What is your CGPA? |
Định tính |
Điểm trung bình tích lũy, được ghi nhận theo nhóm CGPA. |
Marital status |
Định tính |
Tình trạng hôn nhân của sinh viên. |
Do you have Depression? |
Định tính |
Sinh viên có bị trầm cảm hay không. |
Do you have Anxiety? |
Định tính |
Sinh viên có bị lo âu hay không. |
Do you have Panic attack? |
Định tính |
Sinh viên có từng trải qua cơn hoảng loạn hay không. |
Did you seek any specialist for a treatment? |
Định tính |
Sinh viên có từng tìm đến chuyên gia tâm lý hay không. |
# Đổi tên các biến cho gọn gàng, dễ xử lý
names(data)[names(data) == "Timestamp"] <- "timestamp"
names(data)[names(data) == "Choose.your.gender"] <- "Gender"
names(data)[names(data) == "Age"] <- "age"
names(data)[names(data) == "What.is.your.course."] <- "Course"
names(data)[names(data) == "Your.current.year.of.Study"] <- "Year_of_Study"
names(data)[names(data) == "What.is.your.CGPA."] <- "cgpa"
names(data)[names(data) == "Marital.status"] <- "Marital_status"
names(data)[names(data) == "Do.you.have.Depression."] <- "Depression"
names(data)[names(data) == "Do.you.have.Anxiety."] <- "Anxiety"
names(data)[names(data) == "Do.you.have.Panic.attack."] <- "Panic_attack"
names(data)[names(data) == "Did.you.seek.any.specialist.for.a.treatment."] <- "seek_treatment"
names(data)
## [1] "timestamp" "Gender" "age" "Course"
## [5] "Year_of_Study" "cgpa" "Marital_status" "Depression"
## [9] "Anxiety" "Panic_attack" "seek_treatment"
Thang phân nhóm CGPA**
Để thuận tiện cho việc phân tích và so sánh, biến CGPA
đã được phân nhóm thành 5 cấp độ học lực như sau:
0.00 – 1.99 |
Weak (Yếu) |
2.00 – 2.49 |
Below Average (Trung bình dưới) |
2.50 – 2.99 |
Average (Trung bình) |
3.00 – 3.49 |
Good (Khá) |
3.50 – 4.00 |
Excellent (Giỏi) |
Việc phân nhóm giúp xác định xu hướng học lực theo các yếu tố sức
khỏe tinh thần và dễ dàng trình bày kết quả thống kê mô tả hoặc hồi quy
thứ bậc.
unique(data$cgpa)
## [1] "3.00 - 3.49" "3.50 - 4.00" "3.50 - 4.00 " "2.50 - 2.99" "2.00 - 2.49"
## [6] "0 - 1.99"
# Cách dùng base R với ifelse lồng nhau
data$cgpa_level <- ifelse(data$cgpa == "0 - 1.99", "Weak",
ifelse(data$cgpa == "2.00 - 2.49", "Below Average",
ifelse(data$cgpa == "2.50 - 2.99", "Average",
ifelse(data$cgpa == "3.00 - 3.49", "Good",
ifelse(data$cgpa == "3.50 - 4.00", "Excellent", NA)))))
names(data)
## [1] "timestamp" "Gender" "age" "Course"
## [5] "Year_of_Study" "cgpa" "Marital_status" "Depression"
## [9] "Anxiety" "Panic_attack" "seek_treatment" "cgpa_level"
data$Year_of_Study <- dplyr::recode(data$Year_of_Study,
"year 1" = "Year 1",
"Year 1" = "Year 1",
"year 2" = "Year 2",
"Year 2" = "Year 2",
"year 3" = "Year 3",
"Year 3" = "Year 3",
"year 4" = "Year 4",
"Year 4" = "Year 4"
)
# Danh sách tên các biến định tính
categorical_vars <- c( "Gender", "Course", "Year_of_Study", "Marital_status",
"Depression", "Anxiety", "Panic_attack", "seek_treatment", "cgpa_level")
# Chuyển tất cả thành factor
data[categorical_vars] <- lapply(data[categorical_vars], as.factor)
str(data)
## 'data.frame': 101 obs. of 12 variables:
## $ timestamp : chr "8/7/2020 12:02" "8/7/2020 12:04" "8/7/2020 12:05" "8/7/2020 12:06" ...
## $ Gender : Factor w/ 2 levels "Female","Male": 1 2 2 1 2 2 1 1 1 2 ...
## $ age : int 18 21 19 22 23 19 23 18 19 18 ...
## $ Course : Factor w/ 49 levels "Accounting ",..: 19 25 9 36 39 19 42 4 22 24 ...
## $ Year_of_Study : Factor w/ 4 levels "Year 1","Year 2",..: 1 2 1 3 4 2 2 1 2 1 ...
## $ cgpa : chr "3.00 - 3.49" "3.00 - 3.49" "3.00 - 3.49" "3.00 - 3.49" ...
## $ Marital_status: Factor w/ 2 levels "No","Yes": 1 1 1 2 1 1 2 1 1 1 ...
## $ Depression : Factor w/ 2 levels "No","Yes": 2 1 2 2 1 1 2 1 1 1 ...
## $ Anxiety : Factor w/ 2 levels "No","Yes": 1 2 2 1 1 1 1 2 1 2 ...
## $ Panic_attack : Factor w/ 2 levels "No","Yes": 2 1 2 1 1 2 2 1 1 2 ...
## $ seek_treatment: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
## $ cgpa_level : Factor w/ 5 levels "Average","Below Average",..: 4 4 4 4 4 3 NA 3 1 3 ...
2. THỐNG KÊ MÔ TẢ
2.1 Depression (Trầm cảm)
# Tần suất
freq_dep <- table(data$Depression)
# Tỷ lệ phần trăm
percent_dep <- round(prop.table(freq_dep) * 100, 2)
# Kết hợp tần suất và phần trăm thành 1 bảng
summary_table <- data.frame(
Mức_độ = names(freq_dep),
Tần_suất = as.vector(freq_dep),
Tỷ_lệ_phần_trăm = as.vector(percent_dep)
)
# In bảng
cat("📋 Bảng tần suất và tỷ lệ phần trăm cho Depression:\n")
## 📋 Bảng tần suất và tỷ lệ phần trăm cho Depression:
print(summary_table, row.names = FALSE)
## Mức_độ Tần_suất Tỷ_lệ_phần_trăm
## No 66 65.35
## Yes 35 34.65
Kết quả
Trong 101 sinh viên tham gia khảo sát, có 66 sinh viên (65.35%)
không có biểu hiện trầm cảm.
Có 35 sinh viên cho biết họ có biểu hiện trầm cảm, chiểm 34.65%
số người tham gia khảo sát.
# Biểu đồ
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
ggplot(data, aes(x = Depression, fill = Depression)) +
geom_bar() +
labs(title = "Tần suất Trầm cảm (Depression)", x = "Trầm cảm", y = "Số lượng") +
scale_fill_manual(values = c("steelblue", "salmon")) +
theme_minimal()

Nhận xét * Dựa vào biểu đồ ta thấy số sinh viên
không bị trầm cảm gần gấp dôi số sinh viên có trầm cảm. Kết hợp với kết
quả thống kê trên cho thấy tỷ lệ sinh viên có biểu hiện trầm cảm chiếm
khoảng 1/3 tổng mẫu khảo sát. Đây là một vấn đề sức khỏe tâm thần cần
được theo dõi và phân tích sâu hơn, đặc biệt khi nghiên cứu các yếu tố
ảnh hưởng đến học tập và đời sống sinh viên.
2.2 Anxiety (Lo âu)
# Tần suất
freq_anx <- table(data$Anxiety)
# Tỷ lệ phần trăm
percent_anx <- round(prop.table(freq_anx) * 100, 2)
# Tạo bảng tổng hợp
summary_anx <- data.frame(
Mức_độ = names(freq_anx),
Tần_suất = as.vector(freq_anx),
Tỷ_lệ_phần_trăm = as.vector(percent_anx)
)
# In bảng đẹp
cat("\n📋 Bảng tổng hợp tần suất và tỷ lệ phần trăm cho Anxiety:\n")
##
## 📋 Bảng tổng hợp tần suất và tỷ lệ phần trăm cho Anxiety:
print(summary_anx, row.names = FALSE)
## Mức_độ Tần_suất Tỷ_lệ_phần_trăm
## No 67 66.34
## Yes 34 33.66
Nhận xét
Trong tổng số 101 sinh viên tham gia khảo sát:
Có 67 sinh viên (chiếm 66.34%) cho biết không có biểu hiện lo
âu.
Ngược lại, có 34 sinh viên (chiếm 33.66%) cho biết có biểu hiện
lo âu.
# Biểu đồ
ggplot(data, aes(x = Anxiety, fill = Anxiety)) +
geom_bar() +
labs(title = "Tần suất Lo âu (Anxiety)", x = "Lo âu", y = "Số lượng") +
scale_fill_manual(values = c("skyblue", "lightyellow")) +
theme_minimal()

Nhận xét * Dựa vào biểu đồ trên cho thấy số lượng
sinh viên có biểu hiện lo âu thấp hơn sinh viên không có biểu hiển lo âu
trong mẫu quan sát. Kết hợp với phần thống kê mô tả trước đó cho thấy,
tỷ lệ sinh viên có biểu hiện lo âu chiếm khoảng 1/3 tổng số mẫu khảo
sát, cho thấy đây là một vấn đề tâm lý đáng lưu ý trong cộng đồng sinh
viên. Mặc dù phần lớn sinh viên không gặp phải tình trạng này, tỷ lệ
sinh viên lo âu vẫn đủ lớn để cần được quan tâm trong các phân tích tiếp
theo, đặc biệt khi đánh giá tác động đến kết quả học tập và chất lượng
cuộc sống.
3. THỐNG KÊ SUY DIỄN
3.1 Depression
Mục tiêu kiểm định
Xác định xem tỷ lệ sinh viên có biểu hiện trầm cảm
có khác với một tỷ lệ giả định ban đầu (50%) hay không.
Biến Depression được mã hóa là "Yes"
hoặc
"No"
, với:
- \(x = 35\): số sinh viên có biểu
hiện trầm cảm
- \(n = 101\): tổng số sinh viên có
dữ liệu hợp lệ
Giả thuyết thống kê được đặt như sau :
\[
\begin{cases} H_0: p = 0.5 & \text{(Tỷ lệ sinh viên bị trầm cảm
bằng 50%)} \\ H_1: p \ne 0.5 & \text{(Tỷ lệ sinh viên bị trầm cảm
khác 50%)} \end{cases}
\]
x <- sum(data$Depression == "Yes")
n <- sum(!is.na(data$Depression))
# Kiểm định 1 tỷ lệ (H0: p = 0.5)
prop.test(x = x, n = n, p = 0.5, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: x out of n, null probability 0.5
## X-squared = 8.9109, df = 1, p-value = 0.002835
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.2564252 0.4484779
## sample estimates:
## p
## 0.3465347
Kết quả
\[
\hat{p} = \frac{35}{101} \approx 0.3465 \text{ (tức 34.65%)}
\]
Giá trị thống kê kiểm định (chi bình phương):
\(X^2 = 8.9109\)
p-value: \(\text{p-value} = 0.002835\)
Khoảng tin cậy 95% cho tỷ lệ p:
\[
(0.2564; \, 0.4485)
\]
Vì p-value = 0.002835 < 0.05, ta bác
bỏ giả thuyết H₀ ở mức ý nghĩa 5%.
Có bằng chứng thống kê cho thấy tỷ lệ sinh viên bị trầm
cảm khác 50%.
Khoảng tin cậy 95% cho tỷ lệ thực tế nằm trong khoảng
25.6% đến 44.85%, không bao gồm 50%,
càng củng cố kết luận bác bỏ H₀.
Tỷ lệ mẫu là 34.65%, tức là trầm cảm là
vấn đề hiện hữu nhưng không chiếm đa số trong mẫu khảo sát.
Với mức ý nghĩa 5%, có đủ bằng chứng thống kê để bác bỏ giả thuyết
rằng tỷ lệ sinh viên bị trầm cảm là 50%. Tỷ lệ trầm cảm thực tế ước tính
là khoảng 34.65%, với khoảng tin cậy 95% nằm trong
[25.6%, 44.9%]. Điều này cho thấy rằng tỷ lệ
trầm cảm trong cộng đồng sinh viên khảo sát thấp hơn đáng kể so với giả
định 50% ban đầu.
3.2 Anxiety
Mục tiêu là kiểm định xem tỷ lệ sinh viên có biểu hiện lo âu
có khác với tỷ lệ giả định là 50% hay không.
Từ dữ liệu:
- Biến
Anxiety
được mã hóa với hai giá trị
"Yes"
hoặc "No"
.
- \(x_2 = 34\): số sinh viên có biểu
hiện lo âu.
- \(n_2 = 101\): tổng số sinh viên có
dữ liệu hợp lệ.
Giả thuyết thống kê \[
\begin{cases}
H_0: p = 0.5 & \text{(Tỷ lệ sinh viên bị lo âu bằng 50%)} \\
H_1: p \ne 0.5 & \text{(Tỷ lệ sinh viên bị lo âu khác 50%)}
\end{cases}
\]
x2 <- sum(data$Anxiety == "Yes")
n2 <- sum(!is.na(data$Anxiety))
# Kiểm định p > 0.5
prop.test(x = x2, n = n2, p = 0.5, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: x2 out of n2, null probability 0.5
## X-squared = 10.139, df = 1, p-value = 0.001452
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.2475169 0.4383520
## sample estimates:
## p
## 0.3366337
Kết quả * Tỷ lệ mẫu:
\[
\hat{p} = \frac{34}{101} \approx 0.3366 \text{ (tức 33.66%)}
\]
Giá trị thống kê kiểm định (Chi-squared): \(X^2 = 10.139\)
p-value: \(p =
0.001452\)
Khoảng tin cậy 95% cho tỷ lệ p:
\[
(0.2475; \, 0.4384)
\]
- Vì p-value = 0.001452 < 0.05, ta bác bỏ
giả thuyết H₀ ở mức ý nghĩa 5%.
- Có bằng chứng thống kê cho thấy tỷ lệ sinh
viên có biểu hiện lo âu khác 50%.
- Khoảng tin cậy 95% cho tỷ lệ thực tế là từ 24.75% đến
43.84%, không chứa giá trị 0.5.
- Tỷ lệ mẫu là 33.66%, tức là khoảng 1/3 sinh
viên có biểu hiện lo âu.
Kết quả kiểm định chỉ ra rằng với mức ý nghĩa 5%, có đủ bằng chứng để
bác bỏ giả thuyết rằng tỷ lệ sinh viên có biểu hiện lo âu là
50%. Tỷ lệ lo âu thực tế ước tính là khoảng
33.66%, với khoảng tin cậy 95% từ 24.75% đến
43.84%, thấp hơn đáng kể 50%. Điều này cho thấy vấn đề
lo âu là hiện hữu nhưng không chiếm đa số trong nhóm sinh viên
khảo sát.
4. MỐI LIÊN HỆ GIỮA 2 BIẾN
4.1 Depression và Gender
# Bảng chéo
tbl <- table(data$Gender, data$Depression)
addmargins(tbl)
##
## No Yes Sum
## Female 46 29 75
## Male 20 6 26
## Sum 66 35 101
Tỷ lệ trầm cảm theo giới:
- Tỷ lệ trầm cảm theo giới tính nữ: \(\frac{29}{75} \approx 38.7\%\)
- Tỷ lệ trầm cảm theo giới tính nam: \(\frac{6}{26} \approx 23.1\%\)
# Chi bình phương
chisq.test(tbl)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tbl
## X-squared = 1.4409, df = 1, p-value = 0.23
Kết quả * Chi-squared = 1.4409, df
= 1 * p-value = 0.23
Diễn giải:
- Với \(p = 0.23 > 0.05\),
không đủ bằng chứng để bác bỏ H₀.
- Tức là, chưa có bằng chứng thống kê cho thấy có mối liên hệ
giữa giới tính và tình trạng trầm cảm.
- Nói cách khác, tỷ lệ trầm cảm giữa nam và nữ khác nhau về
mặt quan sát, nhưng chưa khác nhau có ý nghĩa thống
kê.
# Hiệu hai tỷ lệ
prop.test(c(tbl["Female", "Yes"], tbl["Male", "Yes"]),
c(sum(tbl["Female", ]), sum(tbl["Male", ])))
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(tbl["Female", "Yes"], tbl["Male", "Yes"]) out of c(sum(tbl["Female", ]), sum(tbl["Male", ]))
## X-squared = 1.4409, df = 1, p-value = 0.23
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.06589412 0.37768899
## sample estimates:
## prop 1 prop 2
## 0.3866667 0.2307692
- Tỷ lệ trầm cảm ở nữ (p1) = 0.3867, ở nam (p2) =
0.2308
- Hiệu tỷ lệ ước lượng = 15.6%
library(epitools)
library(DescTools) # chạy mỗi khi mở lại R
## Warning: package 'DescTools' was built under R version 4.4.3
# Tính Risk Ratio (RR)
riskratio(tbl)
## $data
##
## No Yes Total
## Female 46 29 75
## Male 20 6 26
## Total 66 35 101
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Female 1.000000 NA NA
## Male 0.596817 0.2798223 1.272917
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0.1574026 0.2312876 0.1500096
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
# Tính Odds Ratio (OR)
oddsratio(tbl)
## $data
##
## No Yes Total
## Female 46 29 75
## Male 20 6 26
## Total 66 35 101
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Female 1.0000000 NA NA
## Male 0.4859993 0.1591083 1.306885
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0.1574026 0.2312876 0.1500096
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
4.2 Anxiety và Marital_status
tbl2 <- table(data$Marital_status, data$Anxiety)
addmargins(tbl2)
##
## No Yes Sum
## No 58 27 85
## Yes 9 7 16
## Sum 67 34 101
Trong 101 sinh viên:
- 16 người đã kết hôn, trong đó 7 người (43.75%) có lo âu.
- 85 người độc thân, trong đó 27 người (31.76%) có lo âu.
chisq.test(tbl2)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tbl2
## X-squared = 0.4126, df = 1, p-value = 0.5207
prop.test(
c(tbl2["Yes", "Yes"], tbl2["No", "Yes"]),
c(sum(tbl2["Yes", ]), sum(tbl2["No", ]))
)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(tbl2["Yes", "Yes"], tbl2["No", "Yes"]) out of c(sum(tbl2["Yes", ]), sum(tbl2["No", ]))
## X-squared = 0.4126, df = 1, p-value = 0.5207
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.1797304 0.4194363
## sample estimates:
## prop 1 prop 2
## 0.4375000 0.3176471
- Tỷ lệ có lo âu ở người đã kết hôn: \(\frac{7}{16} = 43.75\%\)
- Tỷ lệ có lo âu ở người chưa kết hôn: \(\frac{27}{85} = 31.76\%\)
- Hiệu tỷ lệ ước lượng = 11.99%
- 95% CI cho hiệu tỷ lệ: (-17.97%; 41.94%)
- p-value = 0.5207
Khoảng tin cậy chứa 0 ⇒ chưa có sự khác biệt đáng kể
giữa hai nhóm.
# Tính Risk Ratio (RR)
riskratio(tbl2)
## $data
##
## No Yes Total
## No 58 27 85
## Yes 9 7 16
## Total 67 34 101
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## No 1.000000 NA NA
## Yes 1.377315 0.7284284 2.604231
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## No NA NA NA
## Yes 0.369388 0.3939337 0.3520173
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
RR (married vs unmarried) = 1.377
- 95% CI: (0.728; 2.604)
- p-value (chi-square) = 0.352
Người đã kết hôn có nguy cơ bị lo âu cao hơn 37.7%
so với người chưa kết hôn, nhưng:
- Khoảng tin cậy chứa 1 ⇒ không có ý nghĩa
thống kê.
# Tính Odds Ratio (OR)
oddsratio(tbl2)
## $data
##
## No Yes Total
## No 58 27 85
## Yes 9 7 16
## Total 67 34 101
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## No 1.000000 NA NA
## Yes 1.667771 0.5340521 5.03645
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## No NA NA NA
## Yes 0.369388 0.3939337 0.3520173
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
- OR = 1.668
- 95% CI: (0.534; 5.036)
- p-value = 0.352
Người đã kết hôn có odds lo âu cao hơn 1.67 lần so với
người chưa kết hôn. Tuy nhiên, p > 0.05 và khoảng tin cậy chứa 1 ⇒
không có ý nghĩa thống kê.
Mặc dù tỷ lệ sinh viên đã kết hôn có biểu hiện lo âu (43.75%) cao hơn
so với sinh viên độc thân (31.76%), các kiểm định thống kê (Chi-squared,
kiểm định hai tỷ lệ, RR và OR) đều cho thấy sự khác biệt này
không có ý nghĩa thống kê ở mức ý nghĩa 5%. Điều này cho thấy
tình trạng hôn nhân không có mối liên hệ rõ ràng với tình trạng
lo âu trong mẫu khảo sát hiện tại.
5. HỒI QUY LOGISTIC
5.1 Đơn biến:
Kết quả mô hình hồi quy nhị phân với hàm liên kết
logit:
Mục tiêu phân tích
Xem xét xem năm học (Year_of_Study) có ảnh hưởng đến
khả năng bị trầm cảm của sinh viên không. → Sử dụng
mô hình hồi quy logistic.
Ý nghĩa của hệ số hồi quy logistic
Trong hồi quy logistic, mỗi hệ số cho biết
mức thay đổi log-odds bị trầm cảm so với nhóm tham
chiếu (Year 1). Sau khi lấy
exponential của hệ số, ta sẽ có odds
ratio (tỷ lệ cược).
logit_model1 <- glm(Depression ~ Year_of_Study, data = data, family = binomial(link = "logit"))
summary(logit_model1)
##
## Call:
## glm(formula = Depression ~ Year_of_Study, family = binomial(link = "logit"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.7282 0.3254 -2.238 0.0252 *
## Year_of_StudyYear 2 0.2582 0.5181 0.498 0.6182
## Year_of_StudyYear 3 0.3918 0.5266 0.744 0.4569
## Year_of_StudyYear 4 -1.2177 1.1175 -1.090 0.2759
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 130.35 on 100 degrees of freedom
## Residual deviance: 127.54 on 97 degrees of freedom
## AIC: 135.54
##
## Number of Fisher Scoring iterations: 4
🔍 Tính xác suất từ log-odds bằng công thức:
\[
p = \frac{e^{\text{log-odds}}}{1 + e^{\text{log-odds}}}
\]
*Diễn giải từng hệ số**
(Intercept) = –0.7282
- Đây là log-odds bị trầm cảm của nhóm tham
chiếu (sinh viên năm 1).
- Đổi sang xác suất:
\[
p = \frac{e^{-0.7282}}{1 + e^{-0.7282}} ≈ 0.325
\]
→ Sinh viên năm 1 có xác suất bị trầm cảm khoảng
32.5%
Year 2: Estimate = +0.2582
- So với sinh viên năm 1, log-odds bị trầm cảm của năm 2 tăng
thêm 0.2582 đơn vị.
- Odds ratio:
\[
\exp(0.2582) ≈ 1.294
\]
→ Sinh viên năm 2 có odds bị trầm cảm cao hơn 29.4%
so với năm 1. * Tuy nhiên, p-value = 0.6182 > 0.05 →
không có ý nghĩa thống kê. → Không thể kết luận có sự khác biệt.
Year 3: Estimate = +0.3918
- So với sinh viên năm 1, log-odds bị trầm cảm tăng
+0.3918 đơn vị.
- Odds ratio:
\[
\exp(0.3918) ≈ 1.479
\]
→ Sinh viên năm 3 có odds bị trầm cảm cao hơn 47.9%
so với năm 1. * p-value = 0.4569 > 0.05 → cũng không
đủ ý nghĩa thống kê.
Year 4: Estimate = –1.2177
- So với sinh viên năm 1, log-odds bị trầm cảm giảm 1.2177 đơn
vị.
- Odds ratio:
\[
\exp(-1.2177) ≈ 0.296
\]
→ Sinh viên năm 4 có odds bị trầm cảm thấp hơn
~70.4% so với năm 1. * Nhưng p-value = 0.2759 >
0.05 → vẫn không có ý nghĩa thống kê.
Tổng kết trực quan
Year 1 |
–0.7282 (Intercept) |
– |
Tỷ lệ trầm cảm nền: ~32.5% |
✅ Có ý nghĩa |
Year 2 |
+0.2582 |
1.294 |
Odds trầm cảm ↑ 29.4% so với Year 1 |
❌ Không rõ ràng |
Year 3 |
+0.3918 |
1.479 |
Odds trầm cảm ↑ 47.9% so với Year 1 |
❌ Không rõ ràng |
Year 4 |
–1.2177 |
0.296 |
Odds trầm cảm ↓ ~70.4% so với Year 1 |
❌ Không rõ ràng |
Mục tiêu mô hình
Xem xét mối quan hệ giữa năm học (Year_of_Study) và
xác suất bị trầm cảm (Depression) thông qua mô hình hồi
quy nhị phân với liên kết probit.
Trong mô hình này:
- Phép biến đổi liên kết là hàm chuẩn nghịch đảo
Φ⁻¹(p).
- Mỗi hệ số thể hiện mức thay đổi trong đơn vị z-score (chuẩn
hóa) của xác suất trầm cảm so với nhóm tham chiếu (Year
1).
Kết quả mô hình hồi quy nhị phân với hàm liên kết
probit:
probit_model1 <- glm(Depression ~ Year_of_Study, data = data, family = binomial(link = "probit"))
summary(probit_model1)
##
## Call:
## glm(formula = Depression ~ Year_of_Study, family = binomial(link = "probit"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.4521 0.1984 -2.279 0.0227 *
## Year_of_StudyYear 2 0.1588 0.3189 0.498 0.6186
## Year_of_StudyYear 3 0.2417 0.3254 0.743 0.4576
## Year_of_StudyYear 4 -0.6982 0.6017 -1.160 0.2459
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 130.35 on 100 degrees of freedom
## Residual deviance: 127.54 on 97 degrees of freedom
## AIC: 135.54
##
## Number of Fisher Scoring iterations: 4
Diễn giải từng hệ số
(Intercept) = –0.4521
- Đây là z-score tương ứng với xác suất trầm cảm của
nhóm sinh viên năm 1.
- Đổi sang xác suất:
\[
p = \Phi(-0.4521) ≈ 0.325
\]
Sinh viên năm 1 có xác suất bị trầm cảm khoảng
32.5%.
p-value = 0.0227 → có ý nghĩa thống kê ở mức 5%.
Year 2: Estimate = +0.1588
- So với sinh viên năm 1, sinh viên năm 2 có z-score tăng thêm
0.1588.
- Xác suất tương đối:
\[
p = \Phi(-0.4521 + 0.1588) ≈ \Phi(-0.2933) ≈ 0.385
\]
→ Xác suất trầm cảm tăng nhẹ lên khoảng 38.5%.
p-value = 0.6186 → không đủ bằng chứng thống
kê.
Year 3: Estimate = +0.2417
- So với năm 1, z-score tăng thêm 0.2417.
- Xác suất:
\[
\Phi(-0.4521 + 0.2417) ≈ \Phi(-0.2104) ≈ 0.417
\]
→ Xác suất trầm cảm ~41.7% cho sinh viên năm 3.
p-value = 0.4576 → không có ý nghĩa thống kê.
Year 4: Estimate = –0.6982
- So với năm 1, z-score giảm thêm 0.6982.
- Tổng z-score:
\[
-0.4521 - 0.6982 = -1.1503
\Rightarrow p ≈ \Phi(-1.1503) ≈ 0.125
\]
→ Xác suất bị trầm cảm giảm xuống ~12.5%.
p-value = 0.2459 → cũng không có ý nghĩa thống
kê.
Tóm tắt bảng diễn giải
Year 1 |
–0.4521 |
32.5% |
— |
✅ Có |
Year 2 |
–0.2933 |
38.5% |
↑ nhẹ |
❌ Không |
Year 3 |
–0.2104 |
41.7% |
↑ nhẹ |
❌ Không |
Year 4 |
–1.1503 |
12.5% |
↓ rõ rệt |
❌ Không |
Kết quả dự báo từ mô hình liên kết logit
Sử dụng mô hình hồi quy logistic để dự đoán xác suất bị trầm
cảm (Depression
) dựa trên biến
Year_of_Study
.
new_student <- data.frame(Year_of_Study = "Year 4")
# Probability prediction (type = "response")
predict(logit_model1, newdata = new_student, type = "response")
## 1
## 0.125
Dựa trên mô hình hồi quy logistic, sinh viên năm 4 có xác
suất bị trầm cảm khoảng 12.5%.
# Log-odds prediction (type = "link")
predict(logit_model1, newdata = new_student, type = "link")
## 1
## -1.94591
Giá trị log-odds tương ứng với xác suất trên là
–1.94591, tức là mức độ rủi ro bị trầm cảm của sinh
viên năm 4 là rất thấp so với trung bình.
# Contribution of each predictor (type = "terms")
predict(logit_model1, newdata = new_student, type = "terms")
## Year_of_Study
## 1 -1.280792
## attr(,"constant")
## [1] -0.6651185
Nhóm “Year 4” làm giảm log-odds đi 1.2808 đơn vị so
với nhóm tham chiếu là sinh viên năm 1.
Kết luận > So với sinh viên năm 1, sinh viên năm
4 có nguy cơ bị trầm cảm thấp hơn đáng kể. Cụ thể, mô
hình ước tính rằng một sinh viên năm 4 có khoảng 12.5% khả năng
bị trầm cảm, thấp hơn gần 22 điểm phần trăm so
với sinh viên năm 1. Tuy nhiên, để khẳng định mối liên hệ này có ý nghĩa
thống kê hay không, cần xem xét thêm giá trị p và
độ tin cậy của mô hình.
# Probability prediction (type = "response")
predict(probit_model1, newdata = new_student, type = "response")
## 1
## 0.125
Kết quả dự báo từ mô hình liên kết probit
# Z-score prediction (type = "link")
predict(probit_model1, newdata = new_student, type = "link")
## 1
## -1.150349
Dự đoán khả năng bị trầm cảm của một sinh viên năm 4
dựa trên mô hình hồi quy probit.
# Contribution of each predictor (type = "terms")
predict(probit_model1, newdata = new_student, type = "terms")
## Year_of_Study
## 1 -0.7412075
## attr(,"constant")
## [1] -0.4091419
Kết luận
Theo mô hình hồi quy probit, sinh viên năm 4 có
xác suất bị trầm cảm là 12.5%, thấp hơn đáng kể so với
sinh viên năm 1 (nhóm tham chiếu). Z-score tương ứng là –1.15, cho thấy
nguy cơ trầm cảm của sinh viên năm 4 là thấp hơn trung bình. Phần đóng
góp của nhóm “Year 4” đã làm giảm Z-score khoảng 0.74 đơn
vị, so với nhóm tham chiếu.
5.2 Đa biến
Kết quả mô hình hồi quy nhị phân với hàm liên kết
logit:
Mục tiêu: Dự đoán khả năng bị trầm cảm của sinh viên
dựa trên hai yếu tố:
- Có từng bị hoảng loạn (Panic attack) hay
không.
- Có bị lo âu (Anxiety) hay không.
logit_model2 <- glm(Depression ~ Panic_attack+ Anxiety, data = data, family = binomial(link = "logit"))
summary(logit_model2)
##
## Call:
## glm(formula = Depression ~ Panic_attack + Anxiety, family = binomial(link = "logit"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.4501 0.3420 -4.240 2.23e-05 ***
## Panic_attackYes 1.0594 0.4611 2.297 0.0216 *
## AnxietyYes 1.1762 0.4575 2.571 0.0101 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 130.35 on 100 degrees of freedom
## Residual deviance: 117.56 on 98 degrees of freedom
## AIC: 123.56
##
## Number of Fisher Scoring iterations: 4
Ý nghĩa từng hệ số hồi quy (logit scale):
(Intercept) = -1.4501 → Đây là
log-odds bị trầm cảm khi cả hai yếu tố Panic
attack = No và Anxiety = No. ⇒ Xác suất bị
trầm cảm ở nhóm này là:
\[
\hat{p}_0 = \frac{1}{1 + \exp(1.4501)} \approx 0.19 \quad \text{(tức
khoảng 19%)}
\]
Panic_attackYes = 1.0594 → Nếu một sinh viên
từng trải qua hoảng loạn, thì log-odds
bị trầm cảm tăng thêm 1.0594 đơn vị so với người chưa
từng hoảng loạn.
Diễn giải theo odds (tỷ số khả năng):
\[
\exp(1.0594) \approx 2.885
\]
→ Nghĩa là sinh viên từng bị hoảng loạn có khả năng bị trầm
cảm cao gấp ~2.9 lần so với người không bị hoảng loạn.
Kết quả này có ý nghĩa thống kê (p = 0.0216 < 0.05).
AnxietyYes = 1.1762 → Nếu một sinh viên bị
lo âu, thì log-odds bị trầm cảm tăng
thêm 1.1762 đơn vị so với người không lo âu.
Diễn giải theo odds:
\[
\exp(1.1762) \approx 3.242
\]
→ Tức là sinh viên bị lo âu có khả năng bị trầm cảm cao hơn
khoảng 3.2 lần so với người không bị lo âu. Kết quả có ý nghĩa
thống kê (p = 0.0101 < 0.05).
Tóm lại * Nếu một sinh viên không có lo âu
và cũng chưa từng hoảng loạn, xác suất bị trầm cảm là khoảng
19%. * Nếu sinh viên từng bị hoảng
loạn, xác suất tăng lên khoảng 40%. * Nếu
có lo âu, xác suất tăng lên khoảng
43%. * Nếu sinh viên vừa lo âu vừa bị hoảng
loạn, xác suất bị trầm cảm tăng vọt lên khoảng
69%.
Kết quả mô hình hồi quy nhị phân với hàm liên kết
probit:
probit_model2 <- glm(Depression ~ Panic_attack+ Anxiety, data = data, family = binomial(link = "probit"))
summary(probit_model2)
##
## Call:
## glm(formula = Depression ~ Panic_attack + Anxiety, family = binomial(link = "probit"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.8755 0.1961 -4.465 8e-06 ***
## Panic_attackYes 0.6402 0.2788 2.296 0.02166 *
## AnxietyYes 0.7130 0.2766 2.577 0.00995 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 130.35 on 100 degrees of freedom
## Residual deviance: 117.65 on 98 degrees of freedom
## AIC: 123.65
##
## Number of Fisher Scoring iterations: 4
Intercept) = -0.8755
Đây là z-score (từ phân phối chuẩn chuẩn hóa) ứng với xác
suất bị trầm cảm của nhóm:
Không bị hoảng loạn (Panic_attack = No
)
Không bị lo âu (Anxiety = No
)
Để tìm xác suất bị trầm cảm ở nhóm này:
\[
P_0 = \Phi(-0.8755) \approx 0.19 \quad \text{(tức khoảng 19%)}
\]
(Trong đó \(\Phi\) là
hàm tích lũy chuẩn)
Panic_attackYes = 0.6402
Nghĩa là nếu sinh viên từng bị hoảng loạn, thì
z-score bị trầm cảm tăng thêm
0.6402.
Điều này tương ứng với xác suất bị trầm cảm tăng lên đáng
kể.
Ví dụ: nếu giữ Anxiety = No
, xác suất bị trầm cảm sẽ
tăng từ 19% lên khoảng 34%.
p-value = 0.02166 < 0.05 ⇒ Có ý nghĩa thống
kê.
AnxietyYes = 0.7130
- Nếu sinh viên có lo âu, thì
z-score bị trầm cảm tăng thêm 0.7130
so với người không lo âu.
- Tức xác suất bị trầm cảm tăng lên rõ rệt – ví dụ có
thể tăng từ 19% lên khoảng 36% (giữ các yếu tố còn lại
không đổi).
- p-value = 0.00995 < 0.01 ⇒ Ý nghĩa thống kê
mạnh.
Tóm tắt theo xác suất (ước lượng gần đúng):
Không hoảng loạn, không lo âu |
≈ 19% |
Có hoảng loạn, không lo âu |
≈ 34% |
Không hoảng loạn, có lo âu |
≈ 36% |
Có hoảng loạn và lo âu |
≈ 60–65% |
Kết luận:
- Mô hình probit cho kết quả tương tự mô hình
logit, nhưng sử dụng phân phối chuẩn thay vì logistic.
- Cả hai yếu tố Panic attack và
Anxiety đều có tác động tích cực và có ý nghĩa
thống kê đến khả năng bị trầm cảm.
- Những sinh viên có cả hai triệu chứng có nguy cơ
trầm cảm tăng mạnh, cần được quan tâm hỗ trợ sớm.
Kết quả dự báo từ mô hình logistic regression với
hai biến độc lập Panic_attack
và Anxiety
, khi
cả hai đều bằng "Yes"
.
new_student2 <- data.frame(Panic_attack = "Yes", Anxiety = "Yes")
# Probability prediction (type = "response")
predict(logit_model2, newdata = new_student2, type = "response")
## 1
## 0.6868588
Sinh viên có cả lo âu và hoảng loạn được dự báo có xác suất ≈
68.7% bị trầm cảm. Đây là một xác suất cao, vượt ngưỡng
50%, cho thấy nguy cơ rõ ràng.
# Log-odds prediction (type = "link")
predict(logit_model2, newdata = new_student2, type = "link")
## 1
## 0.7854746
Giá trị này là log-odds (tức logit – đầu ra của mô
hình tuyến tính):
\[
\text{logit}(p) = \log\left( \frac{p}{1 - p} \right) = 0.7855
\]
Bạn có thể chuyển về xác suất như sau:
\[
p = \frac{e^{0.7855}}{1 + e^{0.7855}} \approx 0.687
\]
# Contribution of each predictor (type = "terms")
predict(logit_model2, newdata = new_student2, type = "terms")
## Panic_attack Anxiety
## 1 0.713257 0.780254
## attr(,"constant")
## [1] -0.7080364
Công thức tuyến tính:
\[
\text{logit}(p) = -0.7080 + 0.7133 + 0.7803 = 0.7855
\]
Kết luận: Mỗi biến (lo âu và hoảng loạn) đều làm tăng
log-odds, dẫn đến xác suất bị trầm cảm tăng mạnh.
*Tóm tắt lời giải dễ hiểu**:
Một sinh viên có lo âu và từng trải qua
hoảng loạn được mô hình dự đoán có xác suất bị trầm cảm
là khoảng 69%. Cả hai yếu tố này đều góp phần làm tăng
nguy cơ bị trầm cảm rõ rệt. Điều này cho thấy sự tác
động đáng kể của sức khỏe tinh thần đến trạng thái trầm cảm của
sinh viên.
Kết quả dự báo từ mô hình probit với hai biến độc
lập Panic_attack
và Anxiety
, khi cả hai biến
đều có giá trị "Yes"
.
# Probability prediction (type = "response")
predict(probit_model2, newdata = new_student2, type = "response")
## 1
## 0.6835641
Sinh viên này có xác suất bị trầm cảm là ≈ 68.4%
theo mô hình hồi quy probit. Điều này tương đối cao
(vượt quá 50%), cho thấy sinh viên có nguy cơ bị trầm cảm khi có
cả lo âu và hoảng loạn.
# Z-score prediction (type = "link")
predict(probit_model2, newdata = new_student2, type = "link")
## 1
## 0.4776887
Đây là giá trị đầu ra của tổ hợp tuyến tính (linear predictor) theo
liên kết probit, tức là:
\[
Z = \Phi^{-1}(p) = 0.4777
\]
Muốn tính xác suất:
\[
p = \Phi(0.4777) \approx 0.6836
\]
→ Đây là Z-score tương ứng với xác suất ≈
68.4% theo phân phối chuẩn chuẩn hóa.
# Contribution of each predictor (type = "terms")
predict(probit_model2, newdata = new_student2, type = "terms")
## Panic_attack Anxiety
## 1 0.4310459 0.4729738
## attr(,"constant")
## [1] -0.4263311
Mô hình tuyến tính có dạng:
\[
Z = \beta_0 + \beta_1 \cdot \text{Panic\_attack} + \beta_2 \cdot
\text{Anxiety}
\]
Trong trường hợp này:
- Intercept (
β₀
) = -0.4263
- Panic_attack = Yes → đóng góp +0.4310
- Anxiety = Yes → đóng góp +0.4730
👉 Tổng Z-score (linear predictor):
\[
Z = -0.4263 + 0.4310 + 0.4730 ≈ 0.478
\]
Xác suất tương ứng:
\[
p = \Phi(0.478) ≈ 68.4\%
\]
Kết luận:
Theo mô hình probit, một sinh viên có lo âu và đã
từng bị hoảng loạn có xác suất ≈ 68.4%
bị trầm cảm. Hai yếu tố Anxiety và
Panic_attack đều đóng góp tích cực vào xác
suất, làm tăng đáng kể nguy cơ trầm cảm. Điều
này phù hợp với trực giác và nhấn mạnh vai trò quan trọng của sức khỏe
tinh thần trong chẩn đoán trầm cảm.
LS0tDQp0aXRsZTogIlBow6JuIHTDrWNoIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmgiDQphdXRob3I6ICJIb8OgbmcgUXV5w6puIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UgIA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCg0KYGBgIHtjc3MsIGVjaG8gPSBGQUxTRX0NCmgxIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMzJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIH0NCg0KaDIgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAyOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiANCn0NCg0KaDMgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zdHlsZTogaXRhbGljOw0KfQ0KDQpoNCB7Zm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC1zdHlsZTogaXRhbGljOw0KICB9DQoNCmJvZHkgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAxOHB4Ow0KICANCn0NCnA6bm90KGgxKTpub3QoaDIpOm5vdChoMyk6bm90KGg0KTpub3QoaDUpIHsNCiAgdGV4dC1pbmRlbnQ6IDJlbTt9DQpwIHsNCiAgdGV4dC1hbGlnbjoganVzdGlmeTsNCiAgfQ0KLnRvY2lmeS1oZWFkZXIgew0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KYGBgICAgDQoNCg0KYGBge3IgZWNobz1UUlVFLCBldmFsPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShlbmVyZ3kpDQpsaWJyYXJ5KHJlYWR4bCkNCmBgYA0KLS0tDQoNCiMgMS4qKlbhu4EgQuG7mSBE4buvIExp4buHdSoqIA0KDQoqKk3DtCB04bqjKioNCg0KQuG7mSBk4buvIGxp4buHdSBjw7MgdMOqbiAiQSBTdGF0aXN0aWNhbCBSZXNlYXJjaCBvbiB0aGUgRWZmZWN0cyBvZiBNZW50YWwgSGVhbHRoIG9uIFN0dWRlbnRz4oCZIENHUEEiIMSRxrDhu6NjIHRodSB0aOG6rXAgdGjDtG5nIHF1YSBraOG6o28gc8OhdCB0cuG7sWMgdHV54bq/biBi4bqxbmcgR29vZ2xlIEZvcm1zIHbhu5tpIMSR4buRaSB0xrDhu6NuZyBsw6Agc2luaCB2acOqbiB04bqhaSDEkOG6oWkgaOG7jWMgSOG7k2kgZ2nDoW8gUXXhu5FjIHThur8gTWFsYXlzaWEgKEludGVybmF0aW9uYWwgSXNsYW1pYyBVbml2ZXJzaXR5IE1hbGF5c2lhIC0gSUlVTSkuIE3hu6VjIHRpw6p1IGPhu6dhIG5naGnDqm4gY+G7qXUgbMOgIHBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2Egc+G7qWMga2jhu49lIHRpbmggdGjhuqduIChtZW50YWwgaGVhbHRoKSB2w6Aga+G6v3QgcXXhuqMgaOG7jWMgdOG6rXAgKENHUEEpIGPhu6dhIHNpbmggdmnDqm4uDQoNCkLhu5kgZOG7ryBsaeG7h3UgbmjhurFtIGjhu5cgdHLhu6MgbmdoacOqbiBj4bupdSBt4buRaSBsacOqbiBo4buHIGdp4buvYSBjw6FjIHnhur91IHThu5EgbGnDqm4gcXVhbiDEkeG6v24gc+G7qWMga2jhu49lIHRpbmggdGjhuqduIOKAkyBuaMawIG3hu6ljIMSR4buZIGPEg25nIHRo4bqzbmcsIGxvIMOidSwgdHLhuqdtIGPhuqNtIOKAkyB24bubaSBr4bq/dCBxdeG6oyBo4buNYyB04bqtcCAodGjhu4MgaGnhu4duIHF1YSDEkWnhu4NtIHRydW5nIGLDrG5oIHTDrWNoIGzFqXkg4oCTIENHUEEpIGPhu6dhIHNpbmggdmnDqm4uIMSQw6J5IGzDoCBt4buZdCB24bqlbiDEkeG7gSBtYW5nIHTDrW5oIHRo4budaSBz4buxLCDEkeG6t2MgYmnhu4d0IHRyb25nIGLhu5FpIGPhuqNuaCBo4buNYyB04bqtcCDDoXAgbOG7sWMgdsOgIGPDoWMgduG6pW4gxJHhu4EgdMOibSBsw70gbmfDoHkgY8OgbmcgxJHGsOG7o2MgcXVhbiB0w6JtIHRyb25nIG3DtGkgdHLGsOG7nW5nIMSR4bqhaSBo4buNYy4NCg0KYGBge3J9DQojxJDhu41jIGThu68gbGnhu4d1IHThu6sgZmlsZSBDU1YNCmRhdGEgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0hvYW5nIFF1eWVuL0Rvd25sb2Fkcy9TdHVkZW50IE1lbnRhbCBoZWFsdGguY3N2IikNCiNIaeG7g24gdGjhu4sgY+G6pXUgdHLDumMgZOG7ryBsaeG7h3UNCnN0cihkYXRhKQ0KVmlldyhkYXRhKQ0KYGBgDQoNCmBgYHtyfQ0KI0hp4buDbiB0aOG7iyA1IGTDsm5nIMSR4bqndSB2w6AgY3Xhu5FpDQpoZWFkKGRhdGEsIDUpDQp0YWlsKGRhdGEsIDUpDQpgYGANCg0KIELhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2MgdGh1IHRo4bqtcCB0aMO0bmcgcXVhIGto4bqjbyBzw6F0IHNpbmggdmnDqm4gdOG6oWkgKirEkOG6oWkgaOG7jWMgSOG7k2kgZ2nDoW8gUXXhu5FjIHThur8gTWFsYXlzaWEgKElJVU0pKiogduG7m2kgbeG7pWMgdGnDqnUgcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSAqKnPhu6ljIGto4buPZSB0aW5oIHRo4bqnbiB2w6Aga+G6v3QgcXXhuqMgaOG7jWMgdOG6rXAqKi4gROG7ryBsaeG7h3UgYmFvIGfhu5NtICoqMTAxIHF1YW4gc8OhdCoqLCB0xrDGoW5nIOG7qW5nIHbhu5tpIDEwMSBzaW5oIHZpw6puLCB2w6AgKioxMSBiaeG6v24qDQoNCkPDoWMgYmnhur9uIMSRxrDhu6NjIHBow6JuIGxv4bqhaSBuaMawIHNhdToNCiAgDQogICogKipCaeG6v24gxJHhu4tuaCBsxrDhu6NuZyAoMSBiaeG6v24pKio6DQogIA0KICAqIGBBZ2VgOiBUdeG7lWkgaGnhu4duIHThuqFpIGPhu6dhIHNpbmggdmnDqm4gKGtp4buDdSBz4buRIHRo4buxYywgbGnDqm4gdOG7pWMpLg0KDQoqICoqQmnhur9uIMSR4buLbmggdMOtbmggKDEwIGJp4bq/bikqKjoNCiAgDQogICogVHJvbmcgxJHDsyBjw7M6DQogIA0KICAqICoqMiBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7MgdGjhu6kgYuG6rWMgKG9yZGluYWwpKio6DQogIA0KICAqIGBXaGF0IGlzIHlvdXIgQ0dQQT9gOiDEkGnhu4NtIHRydW5nIGLDrG5oIHTDrWNoIGzFqXksIMSRxrDhu6NjIGdoaSBuaOG6rW4gdGhlbyBjw6FjIGtob+G6o25nIGdpw6EgdHLhu4suDQoqIGBZb3VyIGN1cnJlbnQgeWVhciBvZiBTdHVkeWA6IE7Eg20gaOG7jWMgaGnhu4duIHThuqFpIChZZWFyIDEgxJHhur9uIFllYXIgNCspLg0KKiAqKjggYmnhur9uIMSR4buLbmggdMOtbmggxJHhu4tuaCBkYW5oIChub21pbmFsKSoqOg0KICANCiAgKiBCYW8gZ+G7k20gY8OhYyB0aMO0bmcgdGluIGPDoSBuaMOibiwgdMOsbmggdHLhuqFuZyBz4bupYyBraOG7j2UgdGluaCB0aOG6p24sIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiwuLi4NCg0KDQp8ICoqVMOqbiBiaeG6v24qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKkxv4bqhaSBk4buvIGxp4buHdSoqIHwgKipNw7QgdOG6oyBuZ+G6r24qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgYFRpbWVzdGFtcGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IMSQ4buLbmggdMOtbmggICAgICAgIHwgVGjhu51pIGdpYW4gc2luaCB2acOqbiBob8OgbiB0aMOgbmgga2jhuqNvIHPDoXQuICAgICAgICAgICAgICAgIHwNCnwgYENob29zZSB5b3VyIGdlbmRlcmAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IMSQ4buLbmggdMOtbmggICAgICAgIHwgR2nhu5tpIHTDrW5oIGPhu6dhIHNpbmggdmnDqm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBBZ2VgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDEkOG7i25oIGzGsOG7o25nICAgICAgIHwgVHXhu5VpIGhp4buHbiB04bqhaSBj4bunYSBzaW5oIHZpw6puLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBXaGF0IGlzIHlvdXIgY291cnNlP2AgICAgICAgICAgICAgICAgICAgICAgICAgfCDEkOG7i25oIHTDrW5oICAgICAgICB8IE5nw6BuaCBo4buNYyBj4bunYSBzaW5oIHZpw6puLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgWW91ciBjdXJyZW50IHllYXIgb2YgU3R1ZHlgICAgICAgICAgICAgICAgICAgIHwgxJDhu4tuaCB0w61uaCAgICAgICAgfCBOxINtIGjhu41jIGhp4buHbiB04bqhaSBj4bunYSBzaW5oIHZpw6puLiAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBXaGF0IGlzIHlvdXIgQ0dQQT9gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDEkOG7i25oIHTDrW5oICAgICAgICB8IMSQaeG7g20gdHJ1bmcgYsOsbmggdMOtY2ggbMWpeSwgxJHGsOG7o2MgZ2hpIG5o4bqtbiB0aGVvIG5ow7NtIENHUEEuIHwNCnwgYE1hcml0YWwgc3RhdHVzYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IMSQ4buLbmggdMOtbmggICAgICAgIHwgVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPhu6dhIHNpbmggdmnDqm4uICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYERvIHlvdSBoYXZlIERlcHJlc3Npb24/YCAgICAgICAgICAgICAgICAgICAgICB8IMSQ4buLbmggdMOtbmggICAgICAgIHwgU2luaCB2acOqbiBjw7MgYuG7iyB0cuG6p20gY+G6o20gaGF5IGtow7RuZy4gICAgICAgICAgICAgICAgICAgICB8DQp8IGBEbyB5b3UgaGF2ZSBBbnhpZXR5P2AgICAgICAgICAgICAgICAgICAgICAgICAgfCDEkOG7i25oIHTDrW5oICAgICAgICB8IFNpbmggdmnDqm4gY8OzIGLhu4sgbG8gw6J1IGhheSBraMO0bmcuICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgRG8geW91IGhhdmUgUGFuaWMgYXR0YWNrP2AgICAgICAgICAgICAgICAgICAgIHwgxJDhu4tuaCB0w61uaCAgICAgICAgfCBTaW5oIHZpw6puIGPDsyB04burbmcgdHLhuqNpIHF1YSBjxqFuIGhv4bqjbmcgbG/huqFuIGhheSBraMO0bmcuICAgIHwNCnwgYERpZCB5b3Ugc2VlayBhbnkgc3BlY2lhbGlzdCBmb3IgYSB0cmVhdG1lbnQ/YCB8IMSQ4buLbmggdMOtbmggICAgICAgIHwgU2luaCB2acOqbiBjw7MgdOG7q25nIHTDrG0gxJHhur9uIGNodXnDqm4gZ2lhIHTDom0gbMO9IGhheSBraMO0bmcuICB8DQoNCg0KDQpgYGB7cn0NCiMgxJDhu5VpIHTDqm4gY8OhYyBiaeG6v24gY2hvIGfhu41uIGfDoG5nLCBk4buFIHjhu60gbMO9DQpuYW1lcyhkYXRhKVtuYW1lcyhkYXRhKSA9PSAiVGltZXN0YW1wIl0gPC0gInRpbWVzdGFtcCINCm5hbWVzKGRhdGEpW25hbWVzKGRhdGEpID09ICJDaG9vc2UueW91ci5nZW5kZXIiXSA8LSAiR2VuZGVyIg0KbmFtZXMoZGF0YSlbbmFtZXMoZGF0YSkgPT0gIkFnZSJdIDwtICJhZ2UiDQpuYW1lcyhkYXRhKVtuYW1lcyhkYXRhKSA9PSAiV2hhdC5pcy55b3VyLmNvdXJzZS4iXSA8LSAiQ291cnNlIg0KbmFtZXMoZGF0YSlbbmFtZXMoZGF0YSkgPT0gIllvdXIuY3VycmVudC55ZWFyLm9mLlN0dWR5Il0gPC0gIlllYXJfb2ZfU3R1ZHkiDQpuYW1lcyhkYXRhKVtuYW1lcyhkYXRhKSA9PSAiV2hhdC5pcy55b3VyLkNHUEEuIl0gPC0gImNncGEiDQpuYW1lcyhkYXRhKVtuYW1lcyhkYXRhKSA9PSAiTWFyaXRhbC5zdGF0dXMiXSA8LSAiTWFyaXRhbF9zdGF0dXMiDQpuYW1lcyhkYXRhKVtuYW1lcyhkYXRhKSA9PSAiRG8ueW91LmhhdmUuRGVwcmVzc2lvbi4iXSA8LSAiRGVwcmVzc2lvbiINCm5hbWVzKGRhdGEpW25hbWVzKGRhdGEpID09ICJEby55b3UuaGF2ZS5BbnhpZXR5LiJdIDwtICJBbnhpZXR5Ig0KbmFtZXMoZGF0YSlbbmFtZXMoZGF0YSkgPT0gIkRvLnlvdS5oYXZlLlBhbmljLmF0dGFjay4iXSA8LSAiUGFuaWNfYXR0YWNrIg0KbmFtZXMoZGF0YSlbbmFtZXMoZGF0YSkgPT0gIkRpZC55b3Uuc2Vlay5hbnkuc3BlY2lhbGlzdC5mb3IuYS50cmVhdG1lbnQuIl0gPC0gInNlZWtfdHJlYXRtZW50Ig0KbmFtZXMoZGF0YSkNCmBgYA0KDQpUaGFuZyBwaMOibiBuaMOzbSBDR1BBKioNCiAgDQogIMSQ4buDIHRodeG6rW4gdGnhu4duIGNobyB2aeG7h2MgcGjDom4gdMOtY2ggdsOgIHNvIHPDoW5oLCBiaeG6v24gYENHUEFgIMSRw6MgxJHGsOG7o2MgcGjDom4gbmjDs20gdGjDoG5oIDUgY+G6pXAgxJHhu5kgaOG7jWMgbOG7sWMgbmjGsCBzYXU6DQogIA0KICB8ICoqS2hv4bqjbmcgQ0dQQSoqIHwgKipN4bupYyBo4buNYyBs4buxYyoqICAgICAgICAgICAgICAgICB8DQogIHwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQogIHwgMC4wMCDigJMgMS45OSAgICAgfCBXZWFrIChZ4bq/dSkgICAgICAgICAgICAgICAgICAgICAgfA0KICB8IDIuMDAg4oCTIDIuNDkgICAgIHwgQmVsb3cgQXZlcmFnZSAoVHJ1bmcgYsOsbmggZMaw4bubaSkgfA0KICB8IDIuNTAg4oCTIDIuOTkgICAgIHwgQXZlcmFnZSAoVHJ1bmcgYsOsbmgpICAgICAgICAgICAgfA0KICB8IDMuMDAg4oCTIDMuNDkgICAgIHwgR29vZCAoS2jDoSkgICAgICAgICAgICAgICAgICAgICAgfA0KICB8IDMuNTAg4oCTIDQuMDAgICAgIHwgRXhjZWxsZW50IChHaeG7j2kpICAgICAgICAgICAgICAgIHwNCiAgDQogIFZp4buHYyBwaMOibiBuaMOzbSBnacO6cCB4w6FjIMSR4buLbmggeHUgaMaw4bubbmcgaOG7jWMgbOG7sWMgdGhlbyBjw6FjIHnhur91IHThu5Egc+G7qWMga2jhu49lIHRpbmggdGjhuqduIHbDoCBk4buFIGTDoG5nIHRyw6xuaCBiw6B5IGvhur90IHF14bqjIHRo4buRbmcga8OqIG3DtCB04bqjIGhv4bq3YyBo4buTaSBxdXkgdGjhu6kgYuG6rWMuDQoNCg0KYGBge3J9DQp1bmlxdWUoZGF0YSRjZ3BhKQ0KDQojIEPDoWNoIGTDuW5nIGJhc2UgUiB24bubaSBpZmVsc2UgbOG7k25nIG5oYXUNCmRhdGEkY2dwYV9sZXZlbCA8LSBpZmVsc2UoZGF0YSRjZ3BhID09ICIwIC0gMS45OSIsICJXZWFrIiwNCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRjZ3BhID09ICIyLjAwIC0gMi40OSIsICJCZWxvdyBBdmVyYWdlIiwNCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRjZ3BhID09ICIyLjUwIC0gMi45OSIsICJBdmVyYWdlIiwNCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRjZ3BhID09ICIzLjAwIC0gMy40OSIsICJHb29kIiwNCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRjZ3BhID09ICIzLjUwIC0gNC4wMCIsICJFeGNlbGxlbnQiLCBOQSkpKSkpDQpgYGANCg0KDQpgYGB7cn0NCm5hbWVzKGRhdGEpDQpgYGANCmBgYHtyfQ0KZGF0YSRZZWFyX29mX1N0dWR5IDwtIGRwbHlyOjpyZWNvZGUoZGF0YSRZZWFyX29mX1N0dWR5LA0KICAieWVhciAxIiA9ICJZZWFyIDEiLA0KICAiWWVhciAxIiA9ICJZZWFyIDEiLA0KICAieWVhciAyIiA9ICJZZWFyIDIiLA0KICAiWWVhciAyIiA9ICJZZWFyIDIiLA0KICAieWVhciAzIiA9ICJZZWFyIDMiLA0KICAiWWVhciAzIiA9ICJZZWFyIDMiLA0KICAieWVhciA0IiA9ICJZZWFyIDQiLA0KICAiWWVhciA0IiA9ICJZZWFyIDQiDQopDQoNCmBgYA0KDQoNCmBgYHtyfQ0KIyBEYW5oIHPDoWNoIHTDqm4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0KY2F0ZWdvcmljYWxfdmFycyA8LSBjKCAiR2VuZGVyIiwgIkNvdXJzZSIsICJZZWFyX29mX1N0dWR5IiwgIk1hcml0YWxfc3RhdHVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAiRGVwcmVzc2lvbiIsICJBbnhpZXR5IiwgIlBhbmljX2F0dGFjayIsICJzZWVrX3RyZWF0bWVudCIsICJjZ3BhX2xldmVsIikNCg0KIyBDaHV54buDbiB04bqldCBj4bqjIHRow6BuaCBmYWN0b3INCmRhdGFbY2F0ZWdvcmljYWxfdmFyc10gPC0gbGFwcGx5KGRhdGFbY2F0ZWdvcmljYWxfdmFyc10sIGFzLmZhY3RvcikNCmBgYA0KDQpgYGB7cn0NCnN0cihkYXRhKQ0KYGBgDQoNCi0tLQ0KDQojIyAqKjIuIFRI4buQTkcgS8OKIE3DlCBU4bqiKioNCg0KIyMjIDIuMSBEZXByZXNzaW9uIChUcuG6p20gY+G6o20pDQoNCmBgYHtyfQ0KIyBU4bqnbiBzdeG6pXQNCmZyZXFfZGVwIDwtIHRhYmxlKGRhdGEkRGVwcmVzc2lvbikNCg0KIyBU4bu3IGzhu4cgcGjhuqduIHRyxINtDQpwZXJjZW50X2RlcCA8LSByb3VuZChwcm9wLnRhYmxlKGZyZXFfZGVwKSAqIDEwMCwgMikNCg0KIyBL4bq/dCBo4bujcCB04bqnbiBzdeG6pXQgdsOgIHBo4bqnbiB0csSDbSB0aMOgbmggMSBi4bqjbmcNCnN1bW1hcnlfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgTeG7qWNfxJHhu5kgPSBuYW1lcyhmcmVxX2RlcCksDQogIFThuqduX3N14bqldCA9IGFzLnZlY3RvcihmcmVxX2RlcCksDQogIFThu7dfbOG7h19waOG6p25fdHLEg20gPSBhcy52ZWN0b3IocGVyY2VudF9kZXApDQopDQoNCiMgSW4gYuG6o25nDQpjYXQoIvCfk4sgQuG6o25nIHThuqduIHN14bqldCB2w6AgdOG7tyBs4buHIHBo4bqnbiB0csSDbSBjaG8gRGVwcmVzc2lvbjpcbiIpDQpwcmludChzdW1tYXJ5X3RhYmxlLCByb3cubmFtZXMgPSBGQUxTRSkNCg0KDQpgYGANCg0KKipL4bq/dCBxdeG6oyoqDQoNCiAgKiBUcm9uZyAxMDEgc2luaCB2acOqbiB0aGFtIGdpYSBraOG6o28gc8OhdCwgY8OzIDY2IHNpbmggdmnDqm4gKDY1LjM1JSkga2jDtG5nIGPDsyBiaeG7g3UgaGnhu4duIHRy4bqnbSBj4bqjbS4gDQoNCiAgKiBDw7MgMzUgc2luaCB2acOqbiBjaG8gYmnhur90IGjhu40gY8OzIGJp4buDdSBoaeG7h24gdHLhuqdtIGPhuqNtLCBjaGnhu4NtIDM0LjY1JSBz4buRIG5nxrDhu51pIHRoYW0gZ2lhIGto4bqjbyBzw6F0Lg0KICANCmBgYHtyfQ0KIyBCaeG7g3UgxJHhu5MNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChkYXRhLCBhZXMoeCA9IERlcHJlc3Npb24sIGZpbGwgPSBEZXByZXNzaW9uKSkgKw0KICBnZW9tX2JhcigpICsNCiAgbGFicyh0aXRsZSA9ICJU4bqnbiBzdeG6pXQgVHLhuqdtIGPhuqNtIChEZXByZXNzaW9uKSIsIHggPSAiVHLhuqdtIGPhuqNtIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJzdGVlbGJsdWUiLCAic2FsbW9uIikpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQogICogROG7sWEgdsOgbyBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IHPhu5Egc2luaCB2acOqbiBraMO0bmcgYuG7iyB0cuG6p20gY+G6o20gZ+G6p24gZ+G6pXAgZMO0aSBz4buRIHNpbmggdmnDqm4gY8OzIHRy4bqnbSBj4bqjbS4gS+G6v3QgaOG7o3AgduG7m2kga+G6v3QgcXXhuqMgdGjhu5FuZyBrw6ogdHLDqm4gY2hvIHRo4bqleSB04bu3IGzhu4cgc2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20gY2hp4bq/bSBraG/huqNuZyAxLzMgdOG7lW5nIG3huqt1IGto4bqjbyBzw6F0LiDEkMOieSBsw6AgbeG7mXQgduG6pW4gxJHhu4Egc+G7qWMga2jhu49lIHTDom0gdGjhuqduIGPhuqduIMSRxrDhu6NjIHRoZW8gZMO1aSB2w6AgcGjDom4gdMOtY2ggc8OidSBoxqFuLCDEkeG6t2MgYmnhu4d0IGtoaSBuZ2hpw6puIGPhu6l1IGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gaOG7jWMgdOG6rXAgdsOgIMSR4budaSBz4buRbmcgc2luaCB2acOqbi4NCg0KIyMjIDIuMiBBbnhpZXR5IChMbyDDonUpDQoNCmBgYHtyfQ0KIyBU4bqnbiBzdeG6pXQNCmZyZXFfYW54IDwtIHRhYmxlKGRhdGEkQW54aWV0eSkNCg0KIyBU4bu3IGzhu4cgcGjhuqduIHRyxINtDQpwZXJjZW50X2FueCA8LSByb3VuZChwcm9wLnRhYmxlKGZyZXFfYW54KSAqIDEwMCwgMikNCiMgVOG6oW8gYuG6o25nIHThu5VuZyBo4bujcA0Kc3VtbWFyeV9hbnggPC0gZGF0YS5mcmFtZSgNCiAgTeG7qWNfxJHhu5kgPSBuYW1lcyhmcmVxX2FueCksDQogIFThuqduX3N14bqldCA9IGFzLnZlY3RvcihmcmVxX2FueCksDQogIFThu7dfbOG7h19waOG6p25fdHLEg20gPSBhcy52ZWN0b3IocGVyY2VudF9hbngpDQopDQoNCiMgSW4gYuG6o25nIMSR4bq5cA0KY2F0KCJcbvCfk4sgQuG6o25nIHThu5VuZyBo4bujcCB04bqnbiBzdeG6pXQgdsOgIHThu7cgbOG7hyBwaOG6p24gdHLEg20gY2hvIEFueGlldHk6XG4iKQ0KcHJpbnQoc3VtbWFyeV9hbngsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpgYGANCg0KDQoqKk5o4bqtbiB4w6l0KioNCg0KVHJvbmcgdOG7lW5nIHPhu5EgMTAxIHNpbmggdmnDqm4gdGhhbSBnaWEga2jhuqNvIHPDoXQ6DQoNCiAgKiBDw7MgNjcgc2luaCB2acOqbiAoY2hp4bq/bSA2Ni4zNCUpIGNobyBiaeG6v3Qga2jDtG5nIGPDsyBiaeG7g3UgaGnhu4duIGxvIMOidS4NCg0KICAqIE5nxrDhu6NjIGzhuqFpLCBjw7MgMzQgc2luaCB2acOqbiAoY2hp4bq/bSAzMy42NiUpIGNobyBiaeG6v3QgY8OzIGJp4buDdSBoaeG7h24gbG8gw6J1Lg0KDQoNCg0KYGBge3J9DQojIEJp4buDdSDEkeG7kw0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gQW54aWV0eSwgZmlsbCA9IEFueGlldHkpKSArDQogIGdlb21fYmFyKCkgKw0KICBsYWJzKHRpdGxlID0gIlThuqduIHN14bqldCBMbyDDonUgKEFueGlldHkpIiwgeCA9ICJMbyDDonUiLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInNreWJsdWUiLCAibGlnaHR5ZWxsb3ciKSkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCiAgKiBE4buxYSB2w6BvIGJp4buDdSDEkeG7kyB0csOqbiBjaG8gdGjhuqV5IHPhu5EgbMaw4bujbmcgc2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiBsbyDDonUgdGjhuqVwIGjGoW4gc2luaCB2acOqbiBraMO0bmcgY8OzIGJp4buDdSBoaeG7g24gbG8gw6J1IHRyb25nIG3huqt1IHF1YW4gc8OhdC4gS+G6v3QgaOG7o3AgduG7m2kgcGjhuqduIHRo4buRbmcga8OqIG3DtCB04bqjIHRyxrDhu5tjIMSRw7MgY2hvIHRo4bqleSwgdOG7tyBs4buHIHNpbmggdmnDqm4gY8OzIGJp4buDdSBoaeG7h24gbG8gw6J1IGNoaeG6v20ga2hv4bqjbmcgMS8zIHThu5VuZyBz4buRIG3huqt1IGto4bqjbyBzw6F0LCBjaG8gdGjhuqV5IMSRw6J5IGzDoCBt4buZdCB24bqlbiDEkeG7gSB0w6JtIGzDvSDEkcOhbmcgbMawdSDDvSB0cm9uZyBj4buZbmcgxJHhu5NuZyBzaW5oIHZpw6puLiBN4bq3YyBkw7kgcGjhuqduIGzhu5tuIHNpbmggdmnDqm4ga2jDtG5nIGfhurdwIHBo4bqjaSB0w6xuaCB0cuG6oW5nIG7DoHksIHThu7cgbOG7hyBzaW5oIHZpw6puIGxvIMOidSB24bqrbiDEkeG7pyBs4bubbiDEkeG7gyBj4bqnbiDEkcaw4bujYyBxdWFuIHTDom0gdHJvbmcgY8OhYyBwaMOibiB0w61jaCB0aeG6v3AgdGhlbywgxJHhurdjIGJp4buHdCBraGkgxJHDoW5oIGdpw6EgdMOhYyDEkeG7mW5nIMSR4bq/biBr4bq/dCBxdeG6oyBo4buNYyB04bqtcCB2w6AgY2jhuqV0IGzGsOG7o25nIGN14buZYyBz4buRbmcuDQoNCiMjICoqMy4gVEjhu5BORyBLw4ogU1VZIERJ4buETioqDQoNCiMjIyAzLjEgRGVwcmVzc2lvbg0KDQoqKk3hu6VjIHRpw6p1IGtp4buDbSDEkeG7i25oKioNCiAgDQogIFjDoWMgxJHhu4tuaCB4ZW0gdOG7tyBs4buHIHNpbmggdmnDqm4gKipjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20qKiBjw7MgKipraMOhYyoqIHbhu5tpIG3hu5l0IHThu7cgbOG7hyBnaeG6oyDEkeG7i25oIGJhbiDEkeG6p3UgKDUwJSkgaGF5IGtow7RuZy4NCiAgQmnhur9uIERlcHJlc3Npb24gxJHGsOG7o2MgbcOjIGjDs2EgbMOgIGAiWWVzImAgaG/hurdjIGAiTm8iYCwgduG7m2k6DQogIA0KICAqICR4ID0gMzUkOiBz4buRIHNpbmggdmnDqm4gY8OzIGJp4buDdSBoaeG7h24gdHLhuqdtIGPhuqNtDQoqICRuID0gMTAxJDogdOG7lW5nIHPhu5Egc2luaCB2acOqbiBjw7MgZOG7ryBsaeG7h3UgaOG7o3AgbOG7hw0KDQoNCioqR2nhuqMgdGh1eeG6v3QgdGjhu5FuZyBrw6ogxJHGsOG7o2MgxJHhurd0IG5oxrAgc2F1IDoqKg0KDQokJA0KICBcYmVnaW57Y2FzZXN9IEhfMDogcCA9IDAuNSAmIFx0ZXh0eyhU4bu3IGzhu4cgc2luaCB2acOqbiBi4buLIHRy4bqnbSBj4bqjbSBi4bqxbmcgNTAlKX0gXFwgSF8xOiBwIFxuZSAwLjUgJiBcdGV4dHsoVOG7tyBs4buHIHNpbmggdmnDqm4gYuG7iyB0cuG6p20gY+G6o20ga2jDoWMgNTAlKX0gXGVuZHtjYXNlc30NCiQkDQoNCmBgYHtyfQ0KeCA8LSBzdW0oZGF0YSREZXByZXNzaW9uID09ICJZZXMiKQ0KbiA8LSBzdW0oIWlzLm5hKGRhdGEkRGVwcmVzc2lvbikpDQoNCiMgS2nhu4NtIMSR4buLbmggMSB04bu3IGzhu4cgKEgwOiBwID0gMC41KQ0KcHJvcC50ZXN0KHggPSB4LCBuID0gbiwgcCA9IDAuNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCmBgYA0KDQoqKkvhur90IHF14bqjKioNCg0KICogKipU4bu3IGzhu4cgbeG6q3U6KioNCiAgDQogICQkDQogIFxoYXR7cH0gPSBcZnJhY3szNX17MTAxfSBcYXBwcm94IDAuMzQ2NSBcdGV4dHsgKHThu6ljIDM0LjY1JSl9DQokJA0KICANCiAgKiAqKkdpw6EgdHLhu4sgdGjhu5FuZyBrw6oga2nhu4NtIMSR4buLbmggKGNoaSBiw6xuaCBwaMawxqFuZyk6KioNCiAgJFheMiA9IDguOTEwOSQNCiAgDQogICogKipwLXZhbHVlOioqDQogICRcdGV4dHtwLXZhbHVlfSA9IDAuMDAyODM1JA0KICANCiAgKiAqKktob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBwOioqDQogIA0KICAkJA0KICAoMC4yNTY0OyBcLCAwLjQ0ODUpDQokJA0KDQogKiAqKlbDrCBwLXZhbHVlID0gMC4wMDI4MzUgPCAwLjA1KiosIHRhICoqYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAqKiDhu58gbeG7qWMgw70gbmdoxKlhIDUlLg0KKiBDw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogY2hvIHRo4bqleSAqKnThu7cgbOG7hyBzaW5oIHZpw6puIGLhu4sgdHLhuqdtIGPhuqNtIGtow6FjIDUwJSoqLg0KKiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgdGjhu7FjIHThur8gbuG6sW0gdHJvbmcga2hv4bqjbmcgKioyNS42JSDEkeG6v24gNDQuODUlKiosICoqa2jDtG5nIGJhbyBn4buTbSA1MCUqKiwgY8OgbmcgY+G7p25nIGPhu5Ega+G6v3QgbHXhuq1uIGLDoWMgYuG7jyBI4oKALg0KKiBU4bu3IGzhu4cgbeG6q3UgbMOgICoqMzQuNjUlKiosIHThu6ljIGzDoCAqKnRy4bqnbSBj4bqjbSBsw6AgduG6pW4gxJHhu4EgaGnhu4duIGjhu691IG5oxrBuZyBraMO0bmcgY2hp4bq/bSDEkWEgc+G7kSoqIHRyb25nIG3huqt1IGto4bqjbyBzw6F0Lg0KICANCiAgPiBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgcuG6sW5nIHThu7cgbOG7hyBzaW5oIHZpw6puIGLhu4sgdHLhuqdtIGPhuqNtIGzDoCA1MCUuIFThu7cgbOG7hyB0cuG6p20gY+G6o20gdGjhu7FjIHThur8gxrDhu5tjIHTDrW5oIGzDoCAqKmtob+G6o25nIDM0LjY1JSoqLCB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlIG7hurFtIHRyb25nICoqXFsyNS42JSwgNDQuOSVdKiouIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyAqKnThu7cgbOG7hyB0cuG6p20gY+G6o20gdHJvbmcgY+G7mW5nIMSR4buTbmcgc2luaCB2acOqbiBraOG6o28gc8OhdCB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBnaeG6oyDEkeG7i25oIDUwJSBiYW4gxJHhuqd1KiouDQoNCg0KIyMjIDMuMiBBbnhpZXR5DQoNCk3hu6VjIHRpw6p1IGzDoCBraeG7g20gxJHhu4tuaCB4ZW0gKip04bu3IGzhu4cgc2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiBsbyDDonUgY8OzIGtow6FjIHbhu5tpIHThu7cgbOG7hyBnaeG6oyDEkeG7i25oIGzDoCA1MCUgaGF5IGtow7RuZyoqLg0KDQpU4burIGThu68gbGnhu4d1Og0KICANCiAgKiBCaeG6v24gYEFueGlldHlgIMSRxrDhu6NjIG3DoyBow7NhIHbhu5tpIGhhaSBnacOhIHRy4buLIGAiWWVzImAgaG/hurdjIGAiTm8iYC4NCiogJHhfMiA9IDM0JDogc+G7kSBzaW5oIHZpw6puIGPDsyBiaeG7g3UgaGnhu4duIGxvIMOidS4NCiogJG5fMiA9IDEwMSQ6IHThu5VuZyBz4buRIHNpbmggdmnDqm4gY8OzIGThu68gbGnhu4d1IGjhu6NwIGzhu4cuDQoNCioqR2nhuqMgdGh1eeG6v3QgdGjhu5FuZyBrw6oqKg0KJCQNCiAgXGJlZ2lue2Nhc2VzfQ0KSF8wOiBwID0gMC41ICYgXHRleHR7KFThu7cgbOG7hyBzaW5oIHZpw6puIGLhu4sgbG8gw6J1IGLhurFuZyA1MCUpfSBcXA0KSF8xOiBwIFxuZSAwLjUgJiBcdGV4dHsoVOG7tyBs4buHIHNpbmggdmnDqm4gYuG7iyBsbyDDonUga2jDoWMgNTAlKX0NClxlbmR7Y2FzZXN9DQokJA0KDQpgYGB7cn0NCngyIDwtIHN1bShkYXRhJEFueGlldHkgPT0gIlllcyIpDQpuMiA8LSBzdW0oIWlzLm5hKGRhdGEkQW54aWV0eSkpDQojIEtp4buDbSDEkeG7i25oIHAgPiAwLjUNCnByb3AudGVzdCh4ID0geDIsIG4gPSBuMiwgcCA9IDAuNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCmBgYA0KDQoqKkvhur90IHF14bqjKioNCiAqICoqVOG7tyBs4buHIG3huqt1OioqDQogIA0KICAkJA0KICBcaGF0e3B9ID0gXGZyYWN7MzR9ezEwMX0gXGFwcHJveCAwLjMzNjYgXHRleHR7ICh04bupYyAzMy42NiUpfQ0KJCQNCiAgDQogICogKipHacOhIHRy4buLIHRo4buRbmcga8OqIGtp4buDbSDEkeG7i25oIChDaGktc3F1YXJlZCk6KioNCiAgJFheMiA9IDEwLjEzOSQNCiAgDQogICogKipwLXZhbHVlOioqDQogICRwID0gMC4wMDE0NTIkDQogIA0KICAqICoqS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHA6KioNCiAgDQogICQkDQogICgwLjI0NzU7IFwsIDAuNDM4NCkNCiQkDQoNCiAgKiBWw6wgKipwLXZhbHVlID0gMC4wMDE0NTIgPCAwLjA1KiosIHRhICoqYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAqKiDhu58gbeG7qWMgw70gbmdoxKlhIDUlLg0KKiBDw7MgKipi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqioqIGNobyB0aOG6pXkgKip04bu3IGzhu4cgc2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiBsbyDDonUga2jDoWMgNTAlKiouDQoqIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyB0aOG7sWMgdOG6vyBsw6AgKip04burIDI0Ljc1JSDEkeG6v24gNDMuODQlKiosIGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAwLjUuDQoqIFThu7cgbOG7hyBt4bqrdSBsw6AgKiozMy42NiUqKiwgdOG7qWMgbMOgICoqa2hv4bqjbmcgMS8zIHNpbmggdmnDqm4gY8OzIGJp4buDdSBoaeG7h24gbG8gw6J1KiouDQoNCiA+IEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNo4buJIHJhIHLhurFuZyB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgcuG6sW5nICoqdOG7tyBs4buHIHNpbmggdmnDqm4gY8OzIGJp4buDdSBoaeG7h24gbG8gw6J1IGzDoCA1MCUqKi4gVOG7tyBs4buHIGxvIMOidSB0aOG7sWMgdOG6vyDGsOG7m2MgdMOtbmggbMOgICoqa2hv4bqjbmcgMzMuNjYlKiosIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAqKjI0Ljc1JSDEkeG6v24gNDMuODQlKiosIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIDUwJS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgKip24bqlbiDEkeG7gSBsbyDDonUgbMOgIGhp4buHbiBo4buvdSBuaMawbmcga2jDtG5nIGNoaeG6v20gxJFhIHPhu5EqKiB0cm9uZyBuaMOzbSBzaW5oIHZpw6puIGto4bqjbyBzw6F0Lg0KDQoNCiMjICoqNC4gTeG7kEkgTEnDik4gSOG7hiBHSeG7rkEgMiBCSeG6vk4qKg0KDQojIyMgNC4xIERlcHJlc3Npb24gdsOgIEdlbmRlcg0KDQpgYGB7cn0NCiMgQuG6o25nIGNow6lvDQp0YmwgPC0gdGFibGUoZGF0YSRHZW5kZXIsIGRhdGEkRGVwcmVzc2lvbikNCmFkZG1hcmdpbnModGJsKQ0KYGBgDQoNCioqVOG7tyBs4buHIHRy4bqnbSBj4bqjbSB0aGVvIGdp4bubaToqKg0KICANCiAgKiBU4bu3IGzhu4cgdHLhuqdtIGPhuqNtIHRoZW8gZ2nhu5tpIHTDrW5oIG7hu686ICRcZnJhY3syOX17NzV9IFxhcHByb3ggMzguN1wlJA0KICAqIFThu7cgbOG7hyB0cuG6p20gY+G6o20gdGhlbyBnaeG7m2kgdMOtbmggbmFtOiAkXGZyYWN7Nn17MjZ9IFxhcHByb3ggMjMuMVwlJA0KIA0KDQpgYGB7cn0NCiMgQ2hpIGLDrG5oIHBoxrDGoW5nDQpjaGlzcS50ZXN0KHRibCkNCmBgYA0KKipL4bq/dCBxdeG6oyoqDQoqICoqQ2hpLXNxdWFyZWQgPSAxLjQ0MDkqKiwgZGYgPSAxDQoqICoqcC12YWx1ZSA9IDAuMjMqKg0KICANCioqRGnhu4VuIGdp4bqjaSoqOg0KICANCiAgKiBW4bubaSAkcCA9IDAuMjMgPiAwLjA1JCwgKipraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIEjigoAqKi4NCiogVOG7qWMgbMOgLCAqKmNoxrBhIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5IGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIHTDrG5oIHRy4bqhbmcgdHLhuqdtIGPhuqNtKiouDQoqIE7Ds2kgY8OhY2gga2jDoWMsIHThu7cgbOG7hyB0cuG6p20gY+G6o20gZ2nhu69hIG5hbSB2w6AgbuG7ryAqKmtow6FjIG5oYXUgduG7gSBt4bq3dCBxdWFuIHPDoXQqKiwgbmjGsG5nICoqY2jGsGEga2jDoWMgbmhhdSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQoNCg0KYGBge3J9DQojIEhp4buHdSBoYWkgdOG7tyBs4buHDQpwcm9wLnRlc3QoYyh0YmxbIkZlbWFsZSIsICJZZXMiXSwgdGJsWyJNYWxlIiwgIlllcyJdKSwNCiAgICAgICAgICBjKHN1bSh0YmxbIkZlbWFsZSIsIF0pLCBzdW0odGJsWyJNYWxlIiwgXSkpKQ0KDQpgYGANCg0KKiAqKlThu7cgbOG7hyB0cuG6p20gY+G6o20g4bufIG7hu68gKHAxKSA9IDAuMzg2NyoqLCDhu58gbmFtIChwMikgPSAwLjIzMDgNCiogKipIaeG7h3UgdOG7tyBs4buHIMaw4bubYyBsxrDhu6NuZyA9IDE1LjYlKioNCiAgKiAqKjk1JSBDSSBj4bunYSBoaeG7h3UgdOG7tyBs4buHOiAoLTYuNiUsIDM3LjglKSoqDQogICogKipwLXZhbHVlID0gMC4yMyoqDQogICAgDQogICAgKipHaeG6o2kgdGjDrWNoKio6DQogICAgDQogICAgKiBLaG/huqNuZyB0aW4gY+G6rXkgYmFvIGfhu5NtIDAg4oeSICoqa2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSAyIGdp4bubaSoqLg0KICAqIEvhur90IHF14bqjIG7DoHkgKipwaMO5IGjhu6NwIHbhu5tpIGtp4buDbSDEkeG7i25oIGNoaS1zcXVhcmVkIOG7nyB0csOqbioqLg0KICANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpsaWJyYXJ5KERlc2NUb29scykgICAgICAgICAgICAgIyBjaOG6oXkgbeG7l2kga2hpIG3hu58gbOG6oWkgUg0KIyBUw61uaCBSaXNrIFJhdGlvIChSUikNCnJpc2tyYXRpbyh0YmwpDQpgYGANCg0KICogKipSUiAoTWFsZSB2cyBGZW1hbGUpID0gMC41OTcqKg0KICAgICogKio5NSUgQ0k6ICgwLjI4MDsgMS4yNzMpKioNCiAgICAqICoqcC12YWx1ZSAoY2hpLXNxdWFyZSkgPSAwLjE1KioNCiAgICANCiAgICAqKkRp4buFbiBnaeG6o2kqKjoNCiAgICANCiAgICAqIFNpbmggdmnDqm4gbmFtIGPDsyAqKm5ndXkgY8ahIGLhu4sgdHLhuqdtIGPhuqNtIHRo4bqlcCBoxqFuIDQwLjMlIHNvIHbhu5tpIG7hu68qKiwgbmjGsG5nIGtob+G6o25nIHRpbiBj4bqteSAqKmNo4bupYSBnacOhIHRy4buLIDEqKiwgbsOqbiAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQogICogcC12YWx1ZSA9IDAuMTUgPiAwLjA1IOKHkiAqKmtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBr4bq/dCBsdeG6rW4gc+G7sSBraMOhYyBiaeG7h3QgduG7gSBuZ3V5IGPGoSoqLg0KICANCg0KYGBge3J9DQojIFTDrW5oIE9kZHMgUmF0aW8gKE9SKQ0Kb2Rkc3JhdGlvKHRibCkNCg0KYGBgDQoNCiogKipPUiAoTWFsZSB2cyBGZW1hbGUpID0gMC40ODYqKg0KICAgICogKio5NSUgQ0k6ICgwLjE1OTsgMS4zMDcpKioNCiAgICAqICoqcC12YWx1ZSA9IDAuMTUqKg0KICAgIA0KICAgICoqRGnhu4VuIGdp4bqjaSoqOg0KICAgIA0KICAgICogU2luaCB2acOqbiBuYW0gY8OzICoqb2RkcyB0cuG6p20gY+G6o20gdGjhuqVwIGjGoW4gNTEuNCUqKiBzbyB24bubaSBu4buvIChvZGRzIGzDoCB4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSBjaGlhIGNobyBraMO0bmcgYuG7iykuDQogICogVHV5IG5oacOqbiwgKipraG/huqNuZyB0aW4gY+G6rXkgY2jhu6lhIDEqKiwgdsOgIHAtdmFsdWUgPiAwLjA1IOKHkiAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQogIA0KICAgPiBN4bq3YyBkw7kgdOG7tyBs4buHIHNpbmggdmnDqm4gbuG7ryBjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20gY2FvIGjGoW4gc2luaCB2acOqbiBuYW0gdHJvbmcgcXVhbiBzw6F0ICgzOC43JSB2cy4gMjMuMSUpLCBuaMawbmcga+G6v3QgcXXhuqMgY8OhYyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiAoQ2hpLXNxdWFyZWQsIGtp4buDbSDEkeG7i25oIGhhaSB04bu3IGzhu4csIFJSLCBPUikgxJHhu4F1IGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSAqKmNoxrBhIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdOG6oWkgbeG7qWMgzrEgPSA1JSoqLiBEbyDEkcOzLCBjaMawYSBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyAqKmdp4bubaSB0w61uaCBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHThu7cgbOG7hyB0cuG6p20gY+G6o20gdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbsOgeSoqLg0KICANCiAgDQoNCiMjIyA0LjIgQW54aWV0eSB2w6AgTWFyaXRhbF9zdGF0dXMNCg0KYGBge3J9DQp0YmwyIDwtIHRhYmxlKGRhdGEkTWFyaXRhbF9zdGF0dXMsIGRhdGEkQW54aWV0eSkNCmFkZG1hcmdpbnModGJsMikNCmBgYA0KDQpUcm9uZyAxMDEgc2luaCB2acOqbjoNCiAgDQogICogMTYgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuLCB0cm9uZyDEkcOzIDcgbmfGsOG7nWkgKDQzLjc1JSkgY8OzIGxvIMOidS4NCiAgKiA4NSBuZ8aw4budaSDEkeG7mWMgdGjDom4sIHRyb25nIMSRw7MgMjcgbmfGsOG7nWkgKDMxLjc2JSkgY8OzIGxvIMOidS4NCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRibDIpDQpgYGANCg0KKiAqKkNoaS1zcXVhcmVkID0gMC40MTI2KiosIGRmID0gMQ0KKiAqKnAtdmFsdWUgPSAwLjUyMDcqKg0KICANCiAgKipEaeG7hW4gZ2nhuqNpKio6DQogIA0KICAqICRIXzAkOiBLaMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6AgbG8gw6J1Lg0KICAqICRwID0gMC41MjA3ID4gMC4wNSQg4oeSICoqS2jDtG5nIGLDoWMgYuG7jyBI4oKAKiouDQogICogKipDaMawYSBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6oqKiBjaG8gdGjhuqV5ICoqdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIOG6o25oIGjGsOG7n25nIMSR4bq/biB0w6xuaCB0cuG6oW5nIGxvIMOidSoqLg0KDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KA0KICBjKHRibDJbIlllcyIsICJZZXMiXSwgdGJsMlsiTm8iLCAiWWVzIl0pLA0KICBjKHN1bSh0YmwyWyJZZXMiLCBdKSwgc3VtKHRibDJbIk5vIiwgXSkpDQopDQpgYGANCg0KKiAqKlThu7cgbOG7hyBjw7MgbG8gw6J1IOG7nyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4qKjogJFxmcmFjezd9ezE2fSA9IDQzLjc1XCUkDQogICogKipU4bu3IGzhu4cgY8OzIGxvIMOidSDhu58gbmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0bioqOiAkXGZyYWN7Mjd9ezg1fSA9IDMxLjc2XCUkDQogICogKipIaeG7h3UgdOG7tyBs4buHIMaw4bubYyBsxrDhu6NuZyA9IDExLjk5JSoqDQogICogKio5NSUgQ0kgY2hvIGhp4buHdSB04bu3IGzhu4c6ICgtMTcuOTclOyA0MS45NCUpKioNCiAgKiAqKnAtdmFsdWUgPSAwLjUyMDcqKg0KICAgIA0KICAqKktob+G6o25nIHRpbiBj4bqteSBjaOG7qWEgMCDih5IgY2jGsGEgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDKiogZ2nhu69hIGhhaSBuaMOzbS4NCiAgDQoNCg0KYGBge3J9DQojIFTDrW5oIFJpc2sgUmF0aW8gKFJSKQ0Kcmlza3JhdGlvKHRibDIpDQpgYGANCg0KICogKipSUiAobWFycmllZCB2cyB1bm1hcnJpZWQpID0gMS4zNzcqKg0KICAgICogKio5NSUgQ0k6ICgwLjcyODsgMi42MDQpKioNCiAgICAqICoqcC12YWx1ZSAoY2hpLXNxdWFyZSkgPSAwLjM1MioqDQogICAgDQogICAgTmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyAqKm5ndXkgY8ahIGLhu4sgbG8gw6J1IGNhbyBoxqFuIDM3LjclKiogc28gduG7m2kgbmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0biwgbmjGsG5nOg0KICAgIA0KICAgICogS2hv4bqjbmcgdGluIGPhuq15ICoqY2jhu6lhIDEqKiDih5IgKipraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqLg0KDQoNCmBgYHtyfQ0KIyBUw61uaCBPZGRzIFJhdGlvIChPUikNCm9kZHNyYXRpbyh0YmwyKQ0KDQpgYGANCg0KKiAqKk9SID0gMS42NjgqKg0KICAgICogKio5NSUgQ0k6ICgwLjUzNDsgNS4wMzYpKioNCiAgICAqICoqcC12YWx1ZSA9IDAuMzUyKioNCiAgICANCiAgICBOZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIG9kZHMgbG8gw6J1ICoqY2FvIGjGoW4gMS42NyBs4bqnbioqIHNvIHbhu5tpIG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4uIFR1eSBuaGnDqm4sIHAgPiAwLjA1IHbDoCBraG/huqNuZyB0aW4gY+G6rXkgY2jhu6lhIDEg4oeSICoqa2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKi4NCiAgDQogPiBN4bq3YyBkw7kgdOG7tyBs4buHIHNpbmggdmnDqm4gxJHDoyBr4bq/dCBow7RuIGPDsyBiaeG7g3UgaGnhu4duIGxvIMOidSAoNDMuNzUlKSBjYW8gaMahbiBzbyB24bubaSBzaW5oIHZpw6puIMSR4buZYyB0aMOibiAoMzEuNzYlKSwgY8OhYyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiAoQ2hpLXNxdWFyZWQsIGtp4buDbSDEkeG7i25oIGhhaSB04bu3IGzhu4csIFJSIHbDoCBPUikgxJHhu4F1IGNobyB0aOG6pXkgKipz4buxIGtow6FjIGJp4buHdCBuw6B5IGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiog4bufIG3hu6ljIMO9IG5naMSpYSA1JS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgKip0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4ga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIHLDtSByw6BuZyB24bubaSB0w6xuaCB0cuG6oW5nIGxvIMOidSoqIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IGhp4buHbiB04bqhaS4NCiAgDQoNCiMjICoqNS4gSOG7kkkgUVVZIExPR0lTVElDKioNCg0KIyMjIDUuMSDEkMahbiBiaeG6v246IA0KIyMjIyBL4bq/dCBxdeG6oyBtw7QgaMOsbmggKipo4buTaSBxdXkgbmjhu4sgcGjDom4gduG7m2kgaMOgbSBsacOqbiBr4bq/dCBsb2dpdCoqOg0KDQoqKk3hu6VjIHRpw6p1IHBow6JuIHTDrWNoKioNCiAgDQogIFhlbSB4w6l0IHhlbSAqKm7Eg20gaOG7jWMgKFllYXJcX29mXF9TdHVkeSkqKiBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uICoqa2jhuqMgbsSDbmcgYuG7iyB0cuG6p20gY+G6o20qKiBj4bunYSBzaW5oIHZpw6puIGtow7RuZy4NCuKGkiBT4butIGThu6VuZyAqKm3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMqKi4NCg0KKirDnSBuZ2jEqWEgY+G7p2EgaOG7hyBz4buRIGjhu5NpIHF1eSBsb2dpc3RpYyoqDQogIA0KICBUcm9uZyBo4buTaSBxdXkgbG9naXN0aWMsICoqbeG7l2kgaOG7hyBz4buRKiogY2hvIGJp4bq/dCAqKm3hu6ljIHRoYXkgxJHhu5VpIGxvZy1vZGRzIGLhu4sgdHLhuqdtIGPhuqNtKiogc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91ICgqKlllYXIgMSoqKS4NClNhdSBraGkgbOG6pXkgKipleHBvbmVudGlhbCoqIGPhu6dhIGjhu4cgc+G7kSwgdGEgc+G6vSBjw7MgKipvZGRzIHJhdGlvKiogKHThu7cgbOG7hyBjxrDhu6NjKS4NCg0KDQoNCmBgYHtyfQ0KbG9naXRfbW9kZWwxIDwtIGdsbShEZXByZXNzaW9uIH4gWWVhcl9vZl9TdHVkeSwgZGF0YSA9IGRhdGEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCnN1bW1hcnkobG9naXRfbW9kZWwxKQ0KYGBgDQogID4g8J+UjSAqKlTDrW5oIHjDoWMgc3XhuqV0IHThu6sgbG9nLW9kZHMgYuG6sW5nIGPDtG5nIHRo4bupYyoqOg0KICANCiAgJCQNCiAgcCA9IFxmcmFje2Vee1x0ZXh0e2xvZy1vZGRzfX19ezEgKyBlXntcdGV4dHtsb2ctb2Rkc319fQ0KJCQNCg0KKkRp4buFbiBnaeG6o2kgdOG7q25nIGjhu4cgc+G7kSoqDQogIA0KICAoSW50ZXJjZXB0KSA9IOKAkzAuNzI4Mg0KICANCiAgKiDEkMOieSBsw6AgKipsb2ctb2RkcyoqIGLhu4sgdHLhuqdtIGPhuqNtIGPhu6dhICoqbmjDs20gdGhhbSBjaGnhur91IChzaW5oIHZpw6puIG7Eg20gMSkqKi4NCiAgKiDEkOG7lWkgc2FuZyB4w6FjIHN14bqldDoNCiAgDQogICQkDQogIHAgPSBcZnJhY3tlXnstMC43MjgyfX17MSArIGVeey0wLjcyODJ9fSDiiYggMC4zMjUNCiQkDQogIA0KICDihpIgKipTaW5oIHZpw6puIG7Eg20gMSBjw7MgeMOhYyBzdeG6pXQgYuG7iyB0cuG6p20gY+G6o20ga2hv4bqjbmcgMzIuNSUqKg0KDQpZZWFyIDI6IEVzdGltYXRlID0gKiorMC4yNTgyKioNCiAgDQogICogU28gduG7m2kgc2luaCB2acOqbiBuxINtIDEsICoqbG9nLW9kZHMgYuG7iyB0cuG6p20gY+G6o20gY+G7p2EgbsSDbSAyIHTEg25nIHRow6ptIDAuMjU4MiDEkcahbiB24buLKiouDQogICogT2RkcyByYXRpbzoNCiAgDQogICQkDQogIFxleHAoMC4yNTgyKSDiiYggMS4yOTQNCiQkDQogIA0KICDihpIgKipTaW5oIHZpw6puIG7Eg20gMiBjw7Mgb2RkcyBi4buLIHRy4bqnbSBj4bqjbSBjYW8gaMahbiAyOS40JSoqIHNvIHbhu5tpIG7Eg20gMS4NCiAgKiBUdXkgbmhpw6puLCAqKnAtdmFsdWUgPSAwLjYxODIgPiAwLjA1Kiog4oaSIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KICDihpIgS2jDtG5nIHRo4buDIGvhur90IGx14bqtbiBjw7Mgc+G7sSBraMOhYyBiaeG7h3QuDQoNClllYXIgMzogRXN0aW1hdGUgPSAqKiswLjM5MTgqKg0KICANCiAgKiBTbyB24bubaSBzaW5oIHZpw6puIG7Eg20gMSwgbG9nLW9kZHMgYuG7iyB0cuG6p20gY+G6o20gdMSDbmcgKiorMC4zOTE4KiogxJHGoW4gduG7iy4NCiAgKiBPZGRzIHJhdGlvOg0KICANCiAgJCQNCiAgXGV4cCgwLjM5MTgpIOKJiCAxLjQ3OQ0KJCQNCiAgDQogIOKGkiAqKlNpbmggdmnDqm4gbsSDbSAzIGPDsyBvZGRzIGLhu4sgdHLhuqdtIGPhuqNtIGNhbyBoxqFuIDQ3LjklKiogc28gduG7m2kgbsSDbSAxLg0KICAqICoqcC12YWx1ZSA9IDAuNDU2OSA+IDAuMDUqKiDihpIgY8Wpbmcga2jDtG5nIMSR4bunIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KICANClllYXIgNDogRXN0aW1hdGUgPSAqKuKAkzEuMjE3NyoqDQogIA0KICAqIFNvIHbhu5tpIHNpbmggdmnDqm4gbsSDbSAxLCAqKmxvZy1vZGRzIGLhu4sgdHLhuqdtIGPhuqNtIGdp4bqjbSAxLjIxNzcgxJHGoW4gduG7iyoqLg0KICAqIE9kZHMgcmF0aW86DQogIA0KICAkJA0KICBcZXhwKC0xLjIxNzcpIOKJiCAwLjI5Ng0KJCQNCiAgDQogIOKGkiAqKlNpbmggdmnDqm4gbsSDbSA0IGPDsyBvZGRzIGLhu4sgdHLhuqdtIGPhuqNtIHRo4bqlcCBoxqFuIFx+NzAuNCUqKiBzbyB24bubaSBuxINtIDEuDQoqIE5oxrBuZyAqKnAtdmFsdWUgPSAwLjI3NTkgPiAwLjA1Kiog4oaSIHbhuqtuIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQoNCioqVOG7lW5nIGvhur90IHRy4buxYyBxdWFuKioNCiAgDQogIHwgTmjDs20gICB8IEjhu4cgc+G7kSDGsOG7m2MgbMaw4bujbmcgKGxvZy1vZGRzKSB8IE9kZHMgcmF0aW8gfCBEaeG7hW4gZ2nhuqNpIG5n4bqvbiAgICAgICAgICAgICAgICAgICAgICAgIHwgw50gbmdoxKlhIHRo4buRbmcga8OqIHwNCiAgfCAtLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLSB8DQogIHwgWWVhciAxIHwg4oCTMC43MjgyIChJbnRlcmNlcHQpICAgICAgICB8IOKAkyAgICAgICAgICB8IFThu7cgbOG7hyB0cuG6p20gY+G6o20gbuG7gW46IFx+MzIuNSUgICAgICAgICAgIHwg4pyFIEPDsyDDvSBuZ2jEqWEgICAgIHwNCiAgfCBZZWFyIDIgfCArMC4yNTgyICAgICAgICAgICAgICAgICAgICB8IDEuMjk0ICAgICAgfCBPZGRzIHRy4bqnbSBj4bqjbSDihpEgMjkuNCUgc28gduG7m2kgWWVhciAxICAgfCDinYwgS2jDtG5nIHLDtSByw6BuZyAgfA0KICB8IFllYXIgMyB8ICswLjM5MTggICAgICAgICAgICAgICAgICAgIHwgMS40NzkgICAgICB8IE9kZHMgdHLhuqdtIGPhuqNtIOKGkSA0Ny45JSBzbyB24bubaSBZZWFyIDEgICB8IOKdjCBLaMO0bmcgcsO1IHLDoG5nICB8DQogIHwgWWVhciA0IHwg4oCTMS4yMTc3ICAgICAgICAgICAgICAgICAgICB8IDAuMjk2ICAgICAgfCBPZGRzIHRy4bqnbSBj4bqjbSDihpMgXH43MC40JSBzbyB24bubaSBZZWFyIDEgfCDinYwgS2jDtG5nIHLDtSByw6BuZyAgfA0KDQoNCg0KKipN4bulYyB0acOqdSBtw7QgaMOsbmgqKg0KICANCiAgWGVtIHjDqXQgbeG7kWkgcXVhbiBo4buHIGdp4buvYSAqKm7Eg20gaOG7jWMgKFllYXJcX29mXF9TdHVkeSkqKiB2w6AgeMOhYyBzdeG6pXQgKipi4buLIHRy4bqnbSBj4bqjbSAoRGVwcmVzc2lvbikqKiB0aMO0bmcgcXVhIG3DtCBow6xuaCBo4buTaSBxdXkgbmjhu4sgcGjDom4gduG7m2kgKipsacOqbiBr4bq/dCBwcm9iaXQqKi4NCg0KVHJvbmcgbcO0IGjDrG5oIG7DoHk6DQogIA0KICAqIFBow6lwIGJp4bq/biDEkeG7lWkgbGnDqm4ga+G6v3QgbMOgICoqaMOgbSBjaHXhuqluIG5naOG7i2NoIMSR4bqjbyDOpuKBu8K5KHApKiouDQoqIE3hu5dpIGjhu4cgc+G7kSB0aOG7gyBoaeG7h24gKipt4bupYyB0aGF5IMSR4buVaSB0cm9uZyDEkcahbiB24buLIHotc2NvcmUgKGNodeG6qW4gaMOzYSkqKiBj4bunYSB4w6FjIHN14bqldCB0cuG6p20gY+G6o20gc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91IChZZWFyIDEpLg0KDQojIyMjIEvhur90IHF14bqjIG3DtCBow6xuaCAqKmjhu5NpIHF1eSBuaOG7iyBwaMOibiB24bubaSBow6BtIGxpw6puIGvhur90IHByb2JpdCoqOg0KDQpgYGB7cn0NCnByb2JpdF9tb2RlbDEgPC0gZ2xtKERlcHJlc3Npb24gfiBZZWFyX29mX1N0dWR5LCBkYXRhID0gZGF0YSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSkNCnN1bW1hcnkocHJvYml0X21vZGVsMSkNCmBgYA0KDQoqKkRp4buFbiBnaeG6o2kgdOG7q25nIGjhu4cgc+G7kSoqDQogIA0KKEludGVyY2VwdCkgPSDigJMwLjQ1MjENCiAgDQogICogxJDDonkgbMOgICoqei1zY29yZSoqIHTGsMahbmcg4bupbmcgduG7m2kgeMOhYyBzdeG6pXQgdHLhuqdtIGPhuqNtIGPhu6dhICoqbmjDs20gc2luaCB2acOqbiBuxINtIDEqKi4NCiAgKiDEkOG7lWkgc2FuZyB4w6FjIHN14bqldDoNCiAgDQogICQkDQogIHAgPSBcUGhpKC0wLjQ1MjEpIOKJiCAwLjMyNQ0KJCQNCiAgDQogICoqU2luaCB2acOqbiBuxINtIDEgY8OzIHjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIGtob+G6o25nIDMyLjUlKiouDQoNCiAgKipwLXZhbHVlID0gMC4wMjI3Kiog4oaSIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIDUlLg0KDQogIFllYXIgMjogRXN0aW1hdGUgPSArMC4xNTg4DQogIA0KICAqIFNvIHbhu5tpIHNpbmggdmnDqm4gbsSDbSAxLCBzaW5oIHZpw6puIG7Eg20gMiBjw7MgKip6LXNjb3JlIHTEg25nIHRow6ptIDAuMTU4OCoqLg0KICAqIFjDoWMgc3XhuqV0IHTGsMahbmcgxJHhu5FpOg0KICANCiAgJCQNCiAgcCA9IFxQaGkoLTAuNDUyMSArIDAuMTU4OCkg4omIIFxQaGkoLTAuMjkzMykg4omIIDAuMzg1DQokJA0KICANCiAg4oaSIFjDoWMgc3XhuqV0IHRy4bqnbSBj4bqjbSB0xINuZyBuaOG6uSBsw6puIGtob+G6o25nICoqMzguNSUqKi4NCg0KICAqKnAtdmFsdWUgPSAwLjYxODYqKiDihpIgKipraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6oqKi4NCg0KICBZZWFyIDM6IEVzdGltYXRlID0gKzAuMjQxNw0KICANCiAgKiBTbyB24bubaSBuxINtIDEsIHotc2NvcmUgdMSDbmcgdGjDqm0gKiowLjI0MTcqKi4NCiAgKiBYw6FjIHN14bqldDoNCiAgDQogICQkDQogIFxQaGkoLTAuNDUyMSArIDAuMjQxNykg4omIIFxQaGkoLTAuMjEwNCkg4omIIDAuNDE3DQokJA0KICANCiAg4oaSICoqWMOhYyBzdeG6pXQgdHLhuqdtIGPhuqNtIFx+NDEuNyUqKiBjaG8gc2luaCB2acOqbiBuxINtIDMuDQoNCiAgKipwLXZhbHVlID0gMC40NTc2Kiog4oaSIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQogIFllYXIgNDogRXN0aW1hdGUgPSDigJMwLjY5ODINCiAgDQogICogU28gduG7m2kgbsSDbSAxLCB6LXNjb3JlIGdp4bqjbSB0aMOqbSAqKjAuNjk4MioqLg0KICAqIFThu5VuZyB6LXNjb3JlOg0KICANCiAgJCQNCiAgLTAuNDUyMSAtIDAuNjk4MiA9IC0xLjE1MDMNClxSaWdodGFycm93IHAg4omIIFxQaGkoLTEuMTUwMykg4omIIDAuMTI1DQokJA0KICANCiAg4oaSICoqWMOhYyBzdeG6pXQgYuG7iyB0cuG6p20gY+G6o20gZ2nhuqNtIHh14buRbmcgXH4xMi41JSoqLg0KDQogICoqcC12YWx1ZSA9IDAuMjQ1OSoqIOKGkiBjxaluZyBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KKipUw7NtIHThuq90IGLhuqNuZyBkaeG7hW4gZ2nhuqNpKioNCiAgDQogIHwgTmjDs20gICB8IFotc2NvcmUgKHThu5VuZykgfCBYw6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSAoxrDhu5tjIHTDrW5oKSB8IFNvIHbhu5tpIFllYXIgMSB8IMOdIG5naMSpYSB0aOG7kW5nIGvDqiB8DQogIHwgLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0gfA0KICB8IFllYXIgMSB8IOKAkzAuNDUyMSAgICAgICAgfCAzMi41JSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg4oCUICAgICAgICAgICAgIHwg4pyFIEPDsyAgICAgICAgICAgICB8DQogIHwgWWVhciAyIHwg4oCTMC4yOTMzICAgICAgICB8IDM4LjUlICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDihpEgbmjhurkgICAgICAgICB8IOKdjCBLaMO0bmcgICAgICAgICAgfA0KICB8IFllYXIgMyB8IOKAkzAuMjEwNCAgICAgICAgfCA0MS43JSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg4oaRIG5o4bq5ICAgICAgICAgfCDinYwgS2jDtG5nICAgICAgICAgIHwNCiAgfCBZZWFyIDQgfCDigJMxLjE1MDMgICAgICAgIHwgMTIuNSUgICAgICAgICAgICAgICAgICAgICAgICAgICB8IOKGkyByw7UgcuG7h3QgICAgICB8IOKdjCBLaMO0bmcgICAgICAgICAgfA0KICANCiMjIyMgS+G6v3QgcXXhuqMgZOG7sSBiw6FvIHThu6sgbcO0IGjDrG5oIGxpw6puIGvhur90IGxvZ2l0DQoNClPhu60gZOG7pW5nIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgxJHhu4MgZOG7sSDEkW/DoW4gKip4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSoqIChgRGVwcmVzc2lvbmApIGThu7FhIHRyw6puIGJp4bq/biBgWWVhcl9vZl9TdHVkeWAuDQoNCg0KYGBge3J9DQpuZXdfc3R1ZGVudCA8LSBkYXRhLmZyYW1lKFllYXJfb2ZfU3R1ZHkgPSAiWWVhciA0IikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBQcm9iYWJpbGl0eSBwcmVkaWN0aW9uICh0eXBlID0gInJlc3BvbnNlIikNCnByZWRpY3QobG9naXRfbW9kZWwxLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQo+IEThu7FhIHRyw6puIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMsIHNpbmggdmnDqm4gbsSDbSA0IGPDsyAqKnjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIGtob+G6o25nIDEyLjUlKiouDQoNCg0KYGBge3J9DQojIExvZy1vZGRzIHByZWRpY3Rpb24gKHR5cGUgPSAibGluayIpDQpwcmVkaWN0KGxvZ2l0X21vZGVsMSwgbmV3ZGF0YSA9IG5ld19zdHVkZW50LCB0eXBlID0gImxpbmsiKQ0KYGBgDQo+IEdpw6EgdHLhu4sgbG9nLW9kZHMgdMawxqFuZyDhu6luZyB24bubaSB4w6FjIHN14bqldCB0csOqbiBsw6AgKirigJMxLjk0NTkxKiosIHThu6ljIGzDoCBt4bupYyDEkeG7mSBy4bunaSBybyBi4buLIHRy4bqnbSBj4bqjbSBj4bunYSBzaW5oIHZpw6puIG7Eg20gNCBsw6AgKipy4bqldCB0aOG6pXAqKiBzbyB24bubaSB0cnVuZyBiw6xuaC4NCg0KDQpgYGB7cn0NCiMgQ29udHJpYnV0aW9uIG9mIGVhY2ggcHJlZGljdG9yICh0eXBlID0gInRlcm1zIikNCnByZWRpY3QobG9naXRfbW9kZWwxLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQsIHR5cGUgPSAidGVybXMiKQ0KDQpgYGANCj4gTmjDs20gIlllYXIgNCIgbMOgbSAqKmdp4bqjbSBsb2ctb2RkcyDEkWkgMS4yODA4IMSRxqFuIHbhu4sqKiBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UgbMOgIHNpbmggdmnDqm4gbsSDbSAxLg0KDQoqKkvhur90IGx14bqtbioqDQo+IFNvIHbhu5tpIHNpbmggdmnDqm4gbsSDbSAxLCBzaW5oIHZpw6puIG7Eg20gNCBjw7MgKipuZ3V5IGPGoSBi4buLIHRy4bqnbSBj4bqjbSB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyoqLiBD4bulIHRo4buDLCBtw7QgaMOsbmggxrDhu5tjIHTDrW5oIHLhurFuZyBt4buZdCBzaW5oIHZpw6puIG7Eg20gNCBjw7Mga2hv4bqjbmcgKioxMi41JSBraOG6oyBuxINuZyBi4buLIHRy4bqnbSBj4bqjbSoqLCB0aOG6pXAgaMahbiBn4bqnbiAqKjIyIMSRaeG7g20gcGjhuqduIHRyxINtKiogc28gduG7m2kgc2luaCB2acOqbiBuxINtIDEuIFR1eSBuaGnDqm4sIMSR4buDIGto4bqzbmcgxJHhu4tuaCBt4buRaSBsacOqbiBo4buHIG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkga2jDtG5nLCBj4bqnbiB4ZW0geMOpdCB0aMOqbSAqKmdpw6EgdHLhu4sgcCoqIHbDoCAqKsSR4buZIHRpbiBj4bqteSoqIGPhu6dhIG3DtCBow6xuaC4NCg0KYGBge3J9DQojIFByb2JhYmlsaXR5IHByZWRpY3Rpb24gKHR5cGUgPSAicmVzcG9uc2UiKQ0KcHJlZGljdChwcm9iaXRfbW9kZWwxLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQojIyMjIEvhur90IHF14bqjIGThu7EgYsOhbyB04burIG3DtCBow6xuaCBsacOqbiBr4bq/dCBwcm9iaXQNCg0KYGBge3J9DQojIFotc2NvcmUgcHJlZGljdGlvbiAodHlwZSA9ICJsaW5rIikNCnByZWRpY3QocHJvYml0X21vZGVsMSwgbmV3ZGF0YSA9IG5ld19zdHVkZW50LCB0eXBlID0gImxpbmsiKQ0KYGBgDQpE4buxIMSRb8OhbiAqKmto4bqjIG7Eg25nIGLhu4sgdHLhuqdtIGPhuqNtKiogY+G7p2EgbeG7mXQgc2luaCB2acOqbiBuxINtIDQgZOG7sWEgdHLDqm4gbcO0IGjDrG5oICoqaOG7k2kgcXV5IHByb2JpdCoqLg0KDQpgYGB7cn0NCiMgQ29udHJpYnV0aW9uIG9mIGVhY2ggcHJlZGljdG9yICh0eXBlID0gInRlcm1zIikNCnByZWRpY3QocHJvYml0X21vZGVsMSwgbmV3ZGF0YSA9IG5ld19zdHVkZW50LCB0eXBlID0gInRlcm1zIikNCg0KYGBgDQoqKkvhur90IGx14bqtbioqDQogIA0KICA+IFRoZW8gbcO0IGjDrG5oIGjhu5NpIHF1eSAqKnByb2JpdCoqLCBzaW5oIHZpw6puIG7Eg20gNCBjw7MgKip4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSBsw6AgMTIuNSUqKiwgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgc2luaCB2acOqbiBuxINtIDEgKG5ow7NtIHRoYW0gY2hp4bq/dSkuIFotc2NvcmUgdMawxqFuZyDhu6luZyBsw6Ag4oCTMS4xNSwgY2hvIHRo4bqleSBuZ3V5IGPGoSB0cuG6p20gY+G6o20gY+G7p2Egc2luaCB2acOqbiBuxINtIDQgbMOgIHRo4bqlcCBoxqFuIHRydW5nIGLDrG5oLiBQaOG6p24gxJHDs25nIGfDs3AgY+G7p2EgbmjDs20g4oCcWWVhciA04oCdIMSRw6MgbMOgbSAqKmdp4bqjbSBaLXNjb3JlIGtob+G6o25nIDAuNzQgxJHGoW4gduG7iyoqLCBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UuDQoNCg0KIyMjIDUuMiDEkGEgYmnhur9uDQoNCiMjIyMgS+G6v3QgcXXhuqMgbcO0IGjDrG5oICoqaOG7k2kgcXV5IG5o4buLIHBow6JuIHbhu5tpIGjDoG0gbGnDqm4ga+G6v3QgbG9naXQqKjoNCg0KTeG7pWMgdGnDqnU6DQogIEThu7EgxJFvw6FuIGto4bqjIG7Eg25nICoqYuG7iyB0cuG6p20gY+G6o20qKiBj4bunYSBzaW5oIHZpw6puIGThu7FhIHRyw6puIGhhaSB54bq/dSB04buROg0KICANCiAgKiBDw7MgdOG7q25nIGLhu4sgKipob+G6o25nIGxv4bqhbiAoUGFuaWMgYXR0YWNrKSoqIGhheSBraMO0bmcuDQogICogQ8OzIGLhu4sgKipsbyDDonUgKEFueGlldHkpKiogaGF5IGtow7RuZy4NCg0KYGBge3J9DQpsb2dpdF9tb2RlbDIgPC0gZ2xtKERlcHJlc3Npb24gfiBQYW5pY19hdHRhY2srIEFueGlldHksIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpDQpzdW1tYXJ5KGxvZ2l0X21vZGVsMikNCg0KYGBgDQoNCioqw50gbmdoxKlhIHThu6tuZyBo4buHIHPhu5EgaOG7k2kgcXV5IChsb2dpdCBzY2FsZSk6KioNCiAgDQogICoqKEludGVyY2VwdCkgPSAtMS40NTAxKioNCiAg4oaSIMSQw6J5IGzDoCAqKmxvZy1vZGRzKiogYuG7iyB0cuG6p20gY+G6o20ga2hpIGPhuqMgaGFpIHnhur91IHThu5EgKipQYW5pYyBhdHRhY2sgPSBObyoqIHbDoCAqKkFueGlldHkgPSBObyoqLg0K4oeSIFjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIOG7nyBuaMOzbSBuw6B5IGzDoDoNCiAgDQogICQkDQogIFxoYXR7cH1fMCA9IFxmcmFjezF9ezEgKyBcZXhwKDEuNDUwMSl9IFxhcHByb3ggMC4xOSBccXVhZCBcdGV4dHsodOG7qWMga2hv4bqjbmcgMTklKX0NCiQkDQogIA0KDQogICoqUGFuaWNcX2F0dGFja1llcyA9IDEuMDU5NCoqDQogIOKGkiBO4bq/dSBt4buZdCBzaW5oIHZpw6puICoqdOG7q25nIHRy4bqjaSBxdWEgaG/huqNuZyBsb+G6oW4qKiwgdGjDrCAqKmxvZy1vZGRzKiogYuG7iyB0cuG6p20gY+G6o20gKip0xINuZyB0aMOqbSAxLjA1OTQgxJHGoW4gduG7iyoqIHNvIHbhu5tpIG5nxrDhu51pIGNoxrBhIHThu6tuZyBob+G6o25nIGxv4bqhbi4NCg0KICBEaeG7hW4gZ2nhuqNpIHRoZW8gb2RkcyAodOG7tyBz4buRIGto4bqjIG7Eg25nKToNCiAgDQogICQkDQogIFxleHAoMS4wNTk0KSBcYXBwcm94IDIuODg1DQokJA0KICANCiAg4oaSIE5naMSpYSBsw6Agc2luaCB2acOqbiB04burbmcgYuG7iyBob+G6o25nIGxv4bqhbiAqKmPDsyBraOG6oyBuxINuZyBi4buLIHRy4bqnbSBj4bqjbSBjYW8gZ+G6pXAgXH4yLjkgbOG6p24qKiBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgYuG7iyBob+G6o25nIGxv4bqhbi4NCg0KICBL4bq/dCBxdeG6oyBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogKHAgPSAwLjAyMTYgPCAwLjA1KS4NCg0KICAqKkFueGlldHlZZXMgPSAxLjE3NjIqKg0KICDihpIgTuG6v3UgbeG7mXQgc2luaCB2acOqbiAqKmLhu4sgbG8gw6J1KiosIHRow6wgKipsb2ctb2RkcyoqIGLhu4sgdHLhuqdtIGPhuqNtICoqdMSDbmcgdGjDqm0gMS4xNzYyIMSRxqFuIHbhu4sqKiBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgbG8gw6J1Lg0KDQogIERp4buFbiBnaeG6o2kgdGhlbyBvZGRzOg0KICANCiAgJCQNCiAgXGV4cCgxLjE3NjIpIFxhcHByb3ggMy4yNDINCiQkDQogIA0KICDihpIgVOG7qWMgbMOgIHNpbmggdmnDqm4gYuG7iyBsbyDDonUgKipjw7Mga2jhuqMgbsSDbmcgYuG7iyB0cuG6p20gY+G6o20gY2FvIGjGoW4ga2hv4bqjbmcgMy4yIGzhuqduKiogc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIGLhu4sgbG8gw6J1Lg0KS+G6v3QgcXXhuqMgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiAocCA9IDAuMDEwMSA8IDAuMDUpLg0KDQoqKlTDs20gbOG6oWkqKg0KKiBO4bq/dSBt4buZdCBzaW5oIHZpw6puICoqa2jDtG5nIGPDsyBsbyDDonUgdsOgIGPFqW5nIGNoxrBhIHThu6tuZyBob+G6o25nIGxv4bqhbioqLCB4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSBsw6Aga2hv4bqjbmcgKioxOSUqKi4NCiogTuG6v3Ugc2luaCB2acOqbiAqKnThu6tuZyBi4buLIGhv4bqjbmcgbG/huqFuKiosIHjDoWMgc3XhuqV0IHTEg25nIGzDqm4ga2hv4bqjbmcgKio0MCUqKi4NCiogTuG6v3UgKipjw7MgbG8gw6J1KiosIHjDoWMgc3XhuqV0IHTEg25nIGzDqm4ga2hv4bqjbmcgKio0MyUqKi4NCiogTuG6v3Ugc2luaCB2acOqbiAqKnbhu6thIGxvIMOidSB24burYSBi4buLIGhv4bqjbmcgbG/huqFuKiosIHjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIHTEg25nIHbhu410IGzDqm4ga2hv4bqjbmcgKio2OSUqKi4NCg0KIyMjIyBL4bq/dCBxdeG6oyBtw7QgaMOsbmggKipo4buTaSBxdXkgbmjhu4sgcGjDom4gduG7m2kgaMOgbSBsacOqbiBr4bq/dCBwcm9iaXQqKjoNCmBgYHtyfQ0KcHJvYml0X21vZGVsMiA8LSBnbG0oRGVwcmVzc2lvbiB+IFBhbmljX2F0dGFjaysgQW54aWV0eSwgZGF0YSA9IGRhdGEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpDQpzdW1tYXJ5KHByb2JpdF9tb2RlbDIpDQoNCmBgYA0KDQpJbnRlcmNlcHQpID0gKiotMC44NzU1KioNCiAgDQogICogxJDDonkgbMOgIHotc2NvcmUgKHThu6sgcGjDom4gcGjhu5FpIGNodeG6qW4gY2h14bqpbiBow7NhKSDhu6luZyB24bubaSAqKnjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtKiogY+G7p2EgbmjDs206DQogIA0KICAqIEtow7RuZyBi4buLIGhv4bqjbmcgbG/huqFuIChgUGFuaWNfYXR0YWNrID0gTm9gKQ0KICAqIEtow7RuZyBi4buLIGxvIMOidSAoYEFueGlldHkgPSBOb2ApDQoNCiAgKiDEkOG7gyB0w6xtIHjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIOG7nyBuaMOzbSBuw6B5Og0KICANCiAgJCQNCiAgUF8wID0gXFBoaSgtMC44NzU1KSBcYXBwcm94IDAuMTkgXHF1YWQgXHRleHR7KHThu6ljIGtob+G6o25nIDE5JSl9DQokJA0KICANCiAgKCpUcm9uZyDEkcOzKiAkXFBoaSQgKmzDoCBow6BtIHTDrWNoIGzFqXkgY2h14bqpbiopDQoNCiAgUGFuaWNcX2F0dGFja1llcyA9ICoqMC42NDAyKioNCiAgDQogICogTmdoxKlhIGzDoCBu4bq/dSBzaW5oIHZpw6puICoqdOG7q25nIGLhu4sgaG/huqNuZyBsb+G6oW4qKiwgdGjDrCAqKnotc2NvcmUqKiBi4buLIHRy4bqnbSBj4bqjbSAqKnTEg25nIHRow6ptIDAuNjQwMioqLg0KDQogICogxJBp4buBdSBuw6B5IHTGsMahbmcg4bupbmcgduG7m2kgKip4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSB0xINuZyBsw6puIMSRw6FuZyBr4buDKiouDQoNCiAgKiBWw60gZOG7pTogbuG6v3UgZ2nhu68gYEFueGlldHkgPSBOb2AsIHjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIHPhur0gdMSDbmcgdOG7qyAxOSUgbMOqbiBraG/huqNuZyAqKjM0JSoqLg0KDQogICogKipwLXZhbHVlID0gMC4wMjE2NiA8IDAuMDUqKiDih5IgQ8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KICBBbnhpZXR5WWVzID0gKiowLjcxMzAqKg0KICANCiAgKiBO4bq/dSBzaW5oIHZpw6puICoqY8OzIGxvIMOidSoqLCB0aMOsICoqei1zY29yZSoqIGLhu4sgdHLhuqdtIGPhuqNtIHTEg25nIHRow6ptICoqMC43MTMwKiogc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIGxvIMOidS4NCiAgKiBU4bupYyB4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSAqKnTEg25nIGzDqm4gcsO1IHLhu4d0Kiog4oCTIHbDrSBk4bulIGPDsyB0aOG7gyB0xINuZyB04burIDE5JSBsw6puIGtob+G6o25nICoqMzYlKiogKGdp4buvIGPDoWMgeeG6v3UgdOG7kSBjw7JuIGzhuqFpIGtow7RuZyDEkeG7lWkpLg0KICAqICoqcC12YWx1ZSA9IDAuMDA5OTUgPCAwLjAxKiog4oeSIMOdIG5naMSpYSB0aOG7kW5nIGvDqiBt4bqhbmguDQoNCiAgKipUw7NtIHThuq90IHRoZW8geMOhYyBzdeG6pXQgKMaw4bubYyBsxrDhu6NuZyBn4bqnbiDEkcO6bmcpOioqDQogIA0KICB8IFRy4bqhbmcgdGjDoWkgICAgICAgICAgICAgICAgICAgIHwgWMOhYyBzdeG6pXQgYuG7iyB0cuG6p20gY+G6o20gfA0KICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0gfA0KICB8IEtow7RuZyBob+G6o25nIGxv4bqhbiwga2jDtG5nIGxvIMOidSB8IOKJiCAxOSUgICAgICAgICAgICAgICAgfA0KICB8IEPDsyBob+G6o25nIGxv4bqhbiwga2jDtG5nIGxvIMOidSAgICB8IOKJiCAzNCUgICAgICAgICAgICAgICAgfA0KICB8IEtow7RuZyBob+G6o25nIGxv4bqhbiwgY8OzIGxvIMOidSAgICB8IOKJiCAzNiUgICAgICAgICAgICAgICAgfA0KICB8IEPDsyBob+G6o25nIGxv4bqhbiAqKnbDoCoqIGxvIMOidSAgICB8IOKJiCA2MOKAkzY1JSAgICAgICAgICAgICB8DQogIA0KICAqKkvhur90IGx14bqtbjoqKg0KICANCiogTcO0IGjDrG5oICoqcHJvYml0KiogY2hvIGvhur90IHF14bqjICoqdMawxqFuZyB04buxIG3DtCBow6xuaCBsb2dpdCoqLCBuaMawbmcgc+G7rSBk4bulbmcgcGjDom4gcGjhu5FpIGNodeG6qW4gdGhheSB2w6wgbG9naXN0aWMuDQoqIEPhuqMgaGFpIHnhur91IHThu5EgKipQYW5pYyBhdHRhY2sqKiB2w6AgKipBbnhpZXR5KiogxJHhu4F1ICoqY8OzIHTDoWMgxJHhu5luZyB0w61jaCBj4buxYyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqIMSR4bq/biBraOG6oyBuxINuZyBi4buLIHRy4bqnbSBj4bqjbS4NCiogTmjhu69uZyBzaW5oIHZpw6puIGPDsyAqKmPhuqMgaGFpIHRyaeG7h3UgY2jhu6luZyoqIGPDsyBuZ3V5IGPGoSB0cuG6p20gY+G6o20gKip0xINuZyBt4bqhbmgqKiwgY+G6p24gxJHGsOG7o2MgcXVhbiB0w6JtIGjhu5cgdHLhu6Mgc+G7m20uDQoNCiMjIyMgS+G6v3QgcXXhuqMgZOG7sSBiw6FvIHThu6sgbcO0IGjDrG5oICoqbG9naXN0aWMgcmVncmVzc2lvbioqIHbhu5tpIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wIGBQYW5pY19hdHRhY2tgIHbDoCBgQW54aWV0eWAsIGtoaSBj4bqjIGhhaSDEkeG7gXUgYuG6sW5nIGAiWWVzImAuDQoNCmBgYHtyfQ0KbmV3X3N0dWRlbnQyIDwtIGRhdGEuZnJhbWUoUGFuaWNfYXR0YWNrID0gIlllcyIsIEFueGlldHkgPSAiWWVzIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBQcm9iYWJpbGl0eSBwcmVkaWN0aW9uICh0eXBlID0gInJlc3BvbnNlIikNCnByZWRpY3QobG9naXRfbW9kZWwyLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQyLCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KPiBTaW5oIHZpw6puIGPDsyBj4bqjIGxvIMOidSB2w6AgaG/huqNuZyBsb+G6oW4gxJHGsOG7o2MgZOG7sSBiw6FvIGPDsyB4w6FjIHN14bqldCAqKuKJiCA2OC43JSoqIGLhu4sgdHLhuqdtIGPhuqNtLiDEkMOieSBsw6AgbeG7mXQgeMOhYyBzdeG6pXQgY2FvLCAqKnbGsOG7o3QgbmfGsOG7oW5nIDUwJSoqLCBjaG8gdGjhuqV5IG5ndXkgY8ahIHLDtSByw6BuZy4NCg0KDQpgYGB7cn0NCiMgTG9nLW9kZHMgcHJlZGljdGlvbiAodHlwZSA9ICJsaW5rIikNCnByZWRpY3QobG9naXRfbW9kZWwyLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQyLCB0eXBlID0gImxpbmsiKQ0KYGBgDQo+IEdpw6EgdHLhu4sgbsOgeSBsw6AgKipsb2ctb2RkcyoqICh04bupYyBsb2dpdCDigJMgxJHhuqd1IHJhIGPhu6dhIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oKToNCiAgDQogICQkDQogIFx0ZXh0e2xvZ2l0fShwKSA9IFxsb2dcbGVmdCggXGZyYWN7cH17MSAtIHB9IFxyaWdodCkgPSAwLjc4NTUNCiQkDQogIA0KICBC4bqhbiBjw7MgdGjhu4MgY2h1eeG7g24gduG7gSB4w6FjIHN14bqldCBuaMawIHNhdToNCiAgDQogICQkDQogIHAgPSBcZnJhY3tlXnswLjc4NTV9fXsxICsgZV57MC43ODU1fX0gXGFwcHJveCAwLjY4Nw0KJCQNCg0KYGBge3J9DQojIENvbnRyaWJ1dGlvbiBvZiBlYWNoIHByZWRpY3RvciAodHlwZSA9ICJ0ZXJtcyIpDQpwcmVkaWN0KGxvZ2l0X21vZGVsMiwgbmV3ZGF0YSA9IG5ld19zdHVkZW50MiwgdHlwZSA9ICJ0ZXJtcyIpDQoNCmBgYA0KPiBDw7RuZyB0aOG7qWMgdHV54bq/biB0w61uaDoNCiAgDQogICQkDQogIFx0ZXh0e2xvZ2l0fShwKSA9IC0wLjcwODAgKyAwLjcxMzMgKyAwLjc4MDMgPSAwLjc4NTUNCiQkDQoNCkvhur90IGx14bqtbjogTeG7l2kgYmnhur9uIChsbyDDonUgdsOgIGhv4bqjbmcgbG/huqFuKSAqKsSR4buBdSBsw6BtIHTEg25nIGxvZy1vZGRzKiosIGThuqtuIMSR4bq/biB4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSB0xINuZyBt4bqhbmguDQoNCipUw7NtIHThuq90IGzhu51pIGdp4bqjaSBk4buFIGhp4buDdSoqOg0KICANCiAgPiBN4buZdCBzaW5oIHZpw6puIGPDsyAqKmxvIMOidSoqIHbDoCAqKnThu6tuZyB0cuG6o2kgcXVhIGhv4bqjbmcgbG/huqFuKiogxJHGsOG7o2MgbcO0IGjDrG5oIGThu7EgxJFvw6FuIGPDsyAqKnjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIGzDoCBraG/huqNuZyA2OSUqKi4gQ+G6oyBoYWkgeeG6v3UgdOG7kSBuw6B5IMSR4buBdSBnw7NwIHBo4bqnbiAqKmzDoG0gdMSDbmcgbmd1eSBjxqEgYuG7iyB0cuG6p20gY+G6o20qKiByw7UgcuG7h3QuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHPhu7EgKip0w6FjIMSR4buZbmcgxJHDoW5nIGvhu4MgY+G7p2Egc+G7qWMga2jhu49lIHRpbmggdGjhuqduIMSR4bq/biB0cuG6oW5nIHRow6FpIHRy4bqnbSBj4bqjbSoqIGPhu6dhIHNpbmggdmnDqm4uDQoNCiMjIyMgIEvhur90IHF14bqjIGThu7EgYsOhbyB04burIG3DtCBow6xuaCAqKnByb2JpdCoqIHbhu5tpIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wIGBQYW5pY19hdHRhY2tgIHbDoCBgQW54aWV0eWAsIGtoaSBj4bqjIGhhaSBiaeG6v24gxJHhu4F1IGPDsyBnacOhIHRy4buLIGAiWWVzImAuDQoNCg0KYGBge3J9DQojIFByb2JhYmlsaXR5IHByZWRpY3Rpb24gKHR5cGUgPSAicmVzcG9uc2UiKQ0KcHJlZGljdChwcm9iaXRfbW9kZWwyLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQyLCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KDQpTaW5oIHZpw6puIG7DoHkgY8OzIHjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIGzDoCAqKuKJiCA2OC40JSoqIHRoZW8gbcO0IGjDrG5oIGjhu5NpIHF1eSAqKnByb2JpdCoqLiDEkGnhu4F1IG7DoHkgdMawxqFuZyDEkeG7kWkgY2FvICh2xrDhu6N0IHF1w6EgNTAlKSwgY2hvIHRo4bqleSBzaW5oIHZpw6puIGPDsyBuZ3V5IGPGoSBi4buLIHRy4bqnbSBj4bqjbSAqKmtoaSBjw7MgY+G6oyBsbyDDonUgdsOgIGhv4bqjbmcgbG/huqFuKiouDQoNCg0KYGBge3J9DQojIFotc2NvcmUgcHJlZGljdGlvbiAodHlwZSA9ICJsaW5rIikNCnByZWRpY3QocHJvYml0X21vZGVsMiwgbmV3ZGF0YSA9IG5ld19zdHVkZW50MiwgdHlwZSA9ICJsaW5rIikNCmBgYA0KDQrEkMOieSBsw6AgZ2nDoSB0cuG7iyDEkeG6p3UgcmEgY+G7p2EgdOG7lSBo4bujcCB0dXnhur9uIHTDrW5oIChsaW5lYXIgcHJlZGljdG9yKSB0aGVvICoqbGnDqm4ga+G6v3QgcHJvYml0KiosIHThu6ljIGzDoDoNCiAgDQogICQkDQogIFogPSBcUGhpXnstMX0ocCkgPSAwLjQ3NzcNCiQkDQogIA0KICBNdeG7kW4gdMOtbmggeMOhYyBzdeG6pXQ6DQogIA0KICAkJA0KICBwID0gXFBoaSgwLjQ3NzcpIFxhcHByb3ggMC42ODM2DQokJA0KICANCiAg4oaSIMSQw6J5IGzDoCAqKlotc2NvcmUqKiB0xrDGoW5nIOG7qW5nIHbhu5tpIHjDoWMgc3XhuqV0ICoq4omIIDY4LjQlKiogdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbiBjaHXhuqluIGjDs2EuDQoNCg0KYGBge3J9DQojIENvbnRyaWJ1dGlvbiBvZiBlYWNoIHByZWRpY3RvciAodHlwZSA9ICJ0ZXJtcyIpDQpwcmVkaWN0KHByb2JpdF9tb2RlbDIsIG5ld2RhdGEgPSBuZXdfc3R1ZGVudDIsIHR5cGUgPSAidGVybXMiKQ0KDQpgYGANCg0KTcO0IGjDrG5oIHR1eeG6v24gdMOtbmggY8OzIGThuqFuZzoNCiAgDQogICQkDQogIFogPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBcdGV4dHtQYW5pY1xfYXR0YWNrfSArIFxiZXRhXzIgXGNkb3QgXHRleHR7QW54aWV0eX0NCiQkDQogIA0KICBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeToNCiAgDQoqIEludGVyY2VwdCAoYM6y4oKAYCkgPSAtMC40MjYzDQoqIFBhbmljXF9hdHRhY2sgPSBZZXMg4oaSIMSRw7NuZyBnw7NwICswLjQzMTANCiogQW54aWV0eSA9IFllcyDihpIgxJHDs25nIGfDs3AgKzAuNDczMA0KDQrwn5GJIFThu5VuZyBaLXNjb3JlIChsaW5lYXIgcHJlZGljdG9yKToNCiAgDQogICQkDQogIFogPSAtMC40MjYzICsgMC40MzEwICsgMC40NzMwIOKJiCAwLjQ3OA0KJCQNCiAgDQogIFjDoWMgc3XhuqV0IHTGsMahbmcg4bupbmc6DQogIA0KICAkJA0KICBwID0gXFBoaSgwLjQ3OCkg4omIIDY4LjRcJQ0KJCQNCg0KKipL4bq/dCBsdeG6rW4qKjoNCiAgDQo+IFRoZW8gbcO0IGjDrG5oIHByb2JpdCwgbeG7mXQgc2luaCB2acOqbiBjw7MgKipsbyDDonUqKiB2w6AgxJHDoyB04burbmcgKipi4buLIGhv4bqjbmcgbG/huqFuKiogY8OzIHjDoWMgc3XhuqV0ICoq4omIIDY4LjQlKiogYuG7iyB0cuG6p20gY+G6o20uDQo+IEhhaSB54bq/dSB04buRICoqQW54aWV0eSoqIHbDoCAqKlBhbmljXF9hdHRhY2sqKiDEkeG7gXUgKirEkcOzbmcgZ8OzcCB0w61jaCBj4buxYyB2w6BvIHjDoWMgc3XhuqV0KiosIGzDoG0gKip0xINuZyDEkcOhbmcga+G7gyBuZ3V5IGPGoSB0cuG6p20gY+G6o20qKi4NCj4gxJBp4buBdSBuw6B5IHBow7kgaOG7o3AgduG7m2kgdHLhu7FjIGdpw6FjIHbDoCBuaOG6pW4gbeG6oW5oIHZhaSB0csOyIHF1YW4gdHLhu41uZyBj4bunYSBz4bupYyBraOG7j2UgdGluaCB0aOG6p24gdHJvbmcgY2jhuqluIMSRb8OhbiB0cuG6p20gY+G6o20uDQo=