library("DescTools") 
library("epitools")
library("ggplot2")
library("caret")
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following objects are masked from 'package:DescTools':
## 
##     MAE, RMSE
QT <- read.csv("D:/PTDLĐT/Quatrinh.csv")
str(QT)
## 'data.frame':    954 obs. of  7 variables:
##  $ Age  : int  34 34 37 30 30 27 34 34 30 36 ...
##  $ FF   : chr  "No" "Yes" "No" "No" ...
##  $ AIC  : chr  "Middle Income" "Low Income" "Middle Income" "Middle Income" ...
##  $ SO   : int  6 5 3 2 1 1 4 2 3 1 ...
##  $ ASTSM: chr  "No" "Yes" "Yes" "No" ...
##  $ BH   : chr  "Yes" "No" "No" "No" ...
##  $ TG   : chr  "No" "Yes" "No" "No" ...

1 Nhiệm vụ 5: Ước lượng mô hình hồi quy

1.1 Mô hình cloglog

MH1 <- glm(factor (TG) ~ QT$FF + QT$AIC + QT$ASTSM + QT$BH + QT$Age + QT$SO, family = binomial(link = "cloglog"), data= QT)
summary(MH1)
## 
## Call:
## glm(formula = factor(TG) ~ QT$FF + QT$AIC + QT$ASTSM + QT$BH + 
##     QT$Age + QT$SO, family = binomial(link = "cloglog"), data = QT)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          1.04701    0.71389   1.467 0.142473    
## QT$FFNo Record       0.08047    0.37829   0.213 0.831553    
## QT$FFYes             1.35304    0.20740   6.524 6.86e-11 ***
## QT$AICLow Income    -0.22446    0.18647  -1.204 0.228690    
## QT$AICMiddle Income -1.24948    0.30223  -4.134 3.56e-05 ***
## QT$ASTSMYes          0.53956    0.15292   3.528 0.000418 ***
## QT$BHYes            -0.57075    0.17377  -3.285 0.001021 ** 
## QT$Age              -0.09822    0.02241  -4.383 1.17e-05 ***
## QT$SO                0.23231    0.04305   5.396 6.82e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1039.88  on 953  degrees of freedom
## Residual deviance:  772.02  on 945  degrees of freedom
## AIC: 790.02
## 
## Number of Fisher Scoring iterations: 9

AIC = 790.02

Deviance = 772.02

BrierScore(MH1)
## [1] 0.1281922

Giá trị của Brier Score càng nhỏ nghĩa là chênh lệch giữa xác suất thực tế và xác suất tính từ mô hình càng nhỏ, nghĩa là mô hình càng tốt.

# Ma trận nhầm lẫn
a <- predict(MH1, type = "response")
b <- ifelse(a > 0.5, "1", "0")
c <-factor(b, levels = c("0","1"))
d <- factor(QT$TG, labels = c("0","1"))
confusionMatrix(table(c, d))
## Confusion Matrix and Statistics
## 
##    d
## c     0   1
##   0 686 127
##   1  44  97
##                                           
##                Accuracy : 0.8208          
##                  95% CI : (0.7949, 0.8446)
##     No Information Rate : 0.7652          
##     P-Value [Acc > NIR] : 1.844e-05       
##                                           
##                   Kappa : 0.4277          
##                                           
##  Mcnemar's Test P-Value : 3.594e-10       
##                                           
##             Sensitivity : 0.9397          
##             Specificity : 0.4330          
##          Pos Pred Value : 0.8438          
##          Neg Pred Value : 0.6879          
##              Prevalence : 0.7652          
##          Detection Rate : 0.7191          
##    Detection Prevalence : 0.8522          
##       Balanced Accuracy : 0.6864          
##                                           
##        'Positive' Class : 0               
## 

1.2 Mô hình probit

MH2 <- glm(factor (TG) ~ QT$FF + QT$AIC + QT$ASTSM + QT$BH + QT$Age + QT$SO, family = binomial(link = "probit"), data = QT)
summary(MH2)
## 
## Call:
## glm(formula = factor(TG) ~ QT$FF + QT$AIC + QT$ASTSM + QT$BH + 
##     QT$Age + QT$SO, family = binomial(link = "probit"), data = QT)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          1.21797    0.52888   2.303 0.021282 *  
## QT$FFNo Record       0.07389    0.22820   0.324 0.746092    
## QT$FFYes             0.99767    0.15886   6.280 3.38e-10 ***
## QT$AICLow Income    -0.30761    0.16111  -1.909 0.056222 .  
## QT$AICMiddle Income -0.89139    0.21453  -4.155 3.25e-05 ***
## QT$ASTSMYes          0.41732    0.11201   3.726 0.000195 ***
## QT$BHYes            -0.49600    0.11989  -4.137 3.52e-05 ***
## QT$Age              -0.07628    0.01644  -4.639 3.51e-06 ***
## QT$SO                0.20798    0.03457   6.016 1.79e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1039.88  on 953  degrees of freedom
## Residual deviance:  762.53  on 945  degrees of freedom
## AIC: 780.53
## 
## Number of Fisher Scoring iterations: 6

AIC = 780.53

Deviance = 762.53

BrierScore(MH2)
## [1] 0.1276788

Giá trị của Brier Score càng nhỏ nghĩa là chênh lệch giữa xác suất thực tế và xác suất tính từ mô hình càng nhỏ, nghĩa là mô hình càng tốt.

# Ma trận nhầm lẫn
a <- predict(MH2, type = "response")
b <- ifelse(a > 0.5, "1", "0")
c <-factor(b, levels = c("0","1"))
d <- factor(QT$TG, labels = c("0","1"))
confusionMatrix(table(c, d))
## Confusion Matrix and Statistics
## 
##    d
## c     0   1
##   0 679 118
##   1  51 106
##                                           
##                Accuracy : 0.8229          
##                  95% CI : (0.7971, 0.8466)
##     No Information Rate : 0.7652          
##     P-Value [Acc > NIR] : 8.967e-06       
##                                           
##                   Kappa : 0.45            
##                                           
##  Mcnemar's Test P-Value : 3.836e-07       
##                                           
##             Sensitivity : 0.9301          
##             Specificity : 0.4732          
##          Pos Pred Value : 0.8519          
##          Neg Pred Value : 0.6752          
##              Prevalence : 0.7652          
##          Detection Rate : 0.7117          
##    Detection Prevalence : 0.8354          
##       Balanced Accuracy : 0.7017          
##                                           
##        'Positive' Class : 0               
## 

1.3 Mô hình logit

MH3 <- glm(factor (TG) ~ QT$FF + QT$AIC + QT$ASTSM + QT$BH + QT$Age + QT$SO, family = binomial(link = "logit"), data = QT)
summary(MH3)
## 
## Call:
## glm(formula = factor(TG) ~ QT$FF + QT$AIC + QT$ASTSM + QT$BH + 
##     QT$Age + QT$SO, family = binomial(link = "logit"), data = QT)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          2.12159    0.92930   2.283   0.0224 *  
## QT$FFNo Record       0.10632    0.42122   0.252   0.8007    
## QT$FFYes             1.69250    0.27513   6.152 7.67e-10 ***
## QT$AICLow Income    -0.54247    0.26811  -2.023   0.0430 *  
## QT$AICMiddle Income -1.65412    0.37790  -4.377 1.20e-05 ***
## QT$ASTSMYes          0.79072    0.20021   3.949 7.83e-05 ***
## QT$BHYes            -0.85572    0.21835  -3.919 8.89e-05 ***
## QT$Age              -0.13111    0.02928  -4.478 7.54e-06 ***
## QT$SO                0.35356    0.06124   5.773 7.78e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1039.88  on 953  degrees of freedom
## Residual deviance:  762.95  on 945  degrees of freedom
## AIC: 780.95
## 
## Number of Fisher Scoring iterations: 5

AIC = 780.95

Deviance = 762.95

BrierScore(MH3)
## [1] 0.1272698

Giá trị của Brier Score càng nhỏ nghĩa là chênh lệch giữa xác suất thực tế và xác suất tính từ mô hình càng nhỏ, nghĩa là mô hình càng tốt.

# Ma trận nhầm lẫn
a <- predict(MH3, type = "response")
b <- ifelse(a > 0.5, "1", "0")
c <-factor(b, levels = c("0","1"))
d <- factor(QT$TG, labels = c("0","1"))
confusionMatrix(table(c, d))
## Confusion Matrix and Statistics
## 
##    d
## c     0   1
##   0 678 117
##   1  52 107
##                                           
##                Accuracy : 0.8229          
##                  95% CI : (0.7971, 0.8466)
##     No Information Rate : 0.7652          
##     P-Value [Acc > NIR] : 8.967e-06       
##                                           
##                   Kappa : 0.4519          
##                                           
##  Mcnemar's Test P-Value : 8.519e-07       
##                                           
##             Sensitivity : 0.9288          
##             Specificity : 0.4777          
##          Pos Pred Value : 0.8528          
##          Neg Pred Value : 0.6730          
##              Prevalence : 0.7652          
##          Detection Rate : 0.7107          
##    Detection Prevalence : 0.8333          
##       Balanced Accuracy : 0.7032          
##                                           
##        'Positive' Class : 0               
## 

1.4 Lựa chọn mô hình

Mô hình AIC Deviance Brier Score Độ chính xác Độ nhạy Độ đặc hiệu
Logit (MH3) 780.95 762.95 0.1272698 0.8229 0.9288 0.4777
Probit (MH2) 780.53 762.53 0.1276788 0.8229 0.9301 0.4732
Cloglog (MH1) 790.02 772.02 0.1281922 0.8208 0.9397 0.4330
Lựa chọn MH2 MH2 MH1 MH1-2 MH3 MH1

Dựa vào các tiêu chí đánh giá một mô hình bao gồm AIC, Deviance và Confusion Matrix (Độ chính xác, độ nhạy) đều đưa ra kết quả cho thấy mô hình 2 - Mô hình sử dụng hàm Probit là tốt nhất trong 3 mô hình được đề xuất. Do đó mô hình hồi quy logistic với hàm tỷ lệ (complementary Probit link function) là mô hình tốt nhất.

2 Nhiệm vụ 4: Phân tích thống kê mô tả

2.1 Kiểm định tính độc lập cho 2 biến định tính

2.1.1 “TG” và “FF”

  • Kiểm định tính độc lập

Giả thuyết - Đối thuyết:

\(H_{0}\): TG và FF độc lập với nhau

\(H_{1}\): TG và FF không độc lập với nhau

AA <- table(QT$FF, QT$TG)
chisq.test(AA)
## 
##  Pearson's Chi-squared test
## 
## data:  AA
## X-squared = 177.31, df = 2, p-value < 2.2e-16

Vì p_value = 2.2e-16 < 0.05 nên ta thừa nhận giả thuyết \(H_{0}\). Nghĩa là TG và FF độc lập với nhau.

2.1.2 “TG” và “AIC”

  • Kiểm định tính độc lập

Giả thuyết - Đối thuyết:

\(H_{0}\): TG và AIC độc lập với nhau

\(H_{1}\): TG và AIC không độc lập với nhau

BB <- table(QT$AIC, QT$TG)
chisq.test(BB)
## 
##  Pearson's Chi-squared test
## 
## data:  BB
## X-squared = 170.17, df = 2, p-value < 2.2e-16

Vì p_value = 2.2e-16 < 0.05 nên ta thừa nhận giả thuyết \(H_{0}\). Nghĩa là TG và AIC độc lập với nhau.

2.1.3 “TG” và “ASTSM”

  • Kiểm định tính độc lập

Giả thuyết - Đối thuyết:

\(H_{0}\): TG và ASTSM độc lập với nhau

\(H_{1}\): TG và ASTSM không độc lập với nhau

CC <- table(QT$ASTSM, QT$TG)
chisq.test(CC)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  CC
## X-squared = 4.8471, df = 1, p-value = 0.02769

Vì p_value = 0.02769 < 0.05 nên ta thừa nhận giả thuyết \(H_{0}\). Nghĩa là TG và ASTSM độc lập với nhau.

2.1.4 “TG” và “BH”

  • Kiểm định tính độc lập

Giả thuyết - Đối thuyết:

\(H_{0}\): TG và BH độc lập với nhau

\(H_{1}\): TG và BH không độc lập với nhau

DD <- table(QT$BH, QT$TG)
chisq.test(DD)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  DD
## X-squared = 39.518, df = 1, p-value = 3.251e-10

Vì p_value = 3.251e-10 < 0.05 nên ta thừa nhận giả thuyết \(H_{0}\). Nghĩa là TG và BH độc lập với nhau.

2.2 Khoảng ước lượng cho tỷ lệ

Ước lượng tỷ lệ khách hàng không rời đi với trình trạng rời đu=i có phải là 30% hay không (nghĩa là chúng ta kiểm định giả thuyết” \(H_0\): p= 0.30”)

N <- QT[QT$TG == "No",]
prop.test(length(N$TG),length(QT$TG),p= 0.3)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(N$TG) out of length(QT$TG), null probability 0.3
## X-squared = 980.91, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.3
## 95 percent confidence interval:
##  0.7367284 0.7915014
## sample estimates:
##         p 
## 0.7651992

Vì p_value < 0.05 nên ta bác bỏ giả thuyết \(H_0\). Do đó tỷ lệ khách hàng không rời đi không phải bằng 30% với mức ý nghĩa 5%.

3 Nhiệm vụ 3: Thống kê mô tả

Nhiệm vụ: Làm thống kê mô tả để phân tích cho ít nhất 5 biến (vừa định tính định lượng và có 2 biến đã chọn ở câu 2), nhận xét về kết quả phân tích này.

3.1 Thống kê mô tả cho một biến

3.1.1 Biến TG

  • Bảng tần số
table(QT$TG)
## 
##  No Yes 
## 730 224
  • Bảng tần suất
table(QT$TG)/sum(table(QT$TG))
## 
##        No       Yes 
## 0.7651992 0.2348008
  • Biểu đồ
ggplot(QT,aes(TG)) + geom_bar(color ="black", fill = "pink") + ylab("Số khách hàng") + xlab("Tình trạng khách hàng rời đi")

Dựa vào kết quả của bảng tần suất và biểu đồ ta thấy trong 954 khách hàng thì có 730 khách hàng không rời đi chiếm 76,52% và có 224 khách hàng mua bảo hiểm du lịch chiếm 23,48%.

3.1.2 Biến FF

  • Bảng tần số
table(QT$FF)
## 
##        No No Record       Yes 
##       608        60       286
  • Bảng tần suất
table(QT$FF)/sum(table(QT$FF))
## 
##         No  No Record        Yes 
## 0.63731656 0.06289308 0.29979036
  • Biểu đồ
ggplot(QT,aes(FF)) + geom_bar(color ="black", fill = "pink") + ylab("Số khách hàng") + xlab("Tình trạng thường xuyên đi các chuyến bay của khách hàng")

Dựa vào kết quả của bảng tần suất và biểu đồ ta thấy trong 954 khách hàng thì có 608 khách hàng không thường xuyên đi các chuyến bay, chiếm 63,73%, có 286 khách hàng thường xuyên đi các chuyến bay, chiếm 29,98% và có 60 khách hàng không có hồ sơ về tình trạng thường xuyên đi các chuyến bay, chiếm 6,29%.

3.1.3 Biến AIC

  • Bảng tần số
table(QT$AIC)
## 
##   High Income    Low Income Middle Income 
##           159           386           409
  • Bảng tần suất
table(QT$AIC)/sum(table(QT$AIC))
## 
##   High Income    Low Income Middle Income 
##     0.1666667     0.4046122     0.4287212
  • Biểu đồ
pie(table(QT$AIC), col = rainbow(3), main = "Biểu đồ thể hiện tình trạng thu nhập của khách hàng ")

Dựa vào kết quả của bảng tần suất và biểu đồ ta thấy trong 954 khách hàng thì có 159 khách hàng có mức thu nhập cao, chiếm 16,67%, có 386 khách hàng có mức thu nhập thâos, chiếm 40,46% và có 409 khách hàng có mức thu nhập trung bình, chiếm 42,87%.

3.1.4 Biến ASTSM

  • Bảng tần số
table(QT$ASTSM)
## 
##  No Yes 
## 594 360
  • Bảng tần suất
table(QT$ASTSM)/sum(table(QT$ASTSM))
## 
##        No       Yes 
## 0.6226415 0.3773585
  • Biểu đồ
ggplot(QT,aes(ASTSM)) + geom_bar(color ="black", fill = "pink") + ylab("Số khách hàng") + xlab("Tình trạng tài khoản của khách hàng có đồng bộ với MXH của họ không")

Dựa vào kết quả của bảng tần suất và biểu đồ ta thấy trong 954 khách hàng thì có 594 khách hàng có tài khoản công ty không đồng bộ với MXH của họ, chiếm 62,26% và có 360 khách hàng có tài khoản công ty có đồng bộ với MXH của họ, chiếm 37,74%.

3.1.5 Biến BH

  • Bảng tần số
table(QT$BH)
## 
##  No Yes 
## 576 378
  • Bảng tần suất
table(QT$BH)/sum(table(QT$BH))
## 
##        No       Yes 
## 0.6037736 0.3962264
  • Biểu đồ
pie(table(QT$BH), col = rainbow(2), main = "Biểu đồ thể hiện tình trạng khách hàng có sử dụng dịch vụ đặt nơi nghỉ của công ty")

Dựa vào kết quả của bảng tần suất và biểu đồ ta thấy trong 954 khách hàng thì có 576 khách hàng không đặt dịch vụ nơi nghỉ của công ty, chiếm 60,38% và có 378 khách hàng có đặt dịch vụ nơi nghỉ của công ty, chiếm 39,62%.

3.1.6 Biến Age

summary(QT$Age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   27.00   30.00   31.00   32.11   35.00   38.00

Dựa vào kết quả thống kê mô tả, ta thấy khách hàng của công ty du lịch và lữ hành có độ tuổi từ 27 tuổi đến 38 tuổi, trung bình (mean) là 32,11 tuổi. 1st Qu.(first quartile) = 30 có nghĩa là 25% đối tượng nghiên cứu có độ tuổi bằng hoặc nhỏ hơn 30 tuổi. Tương tự, 3rd Qu.(Third quartile) = 35 có nghĩa là 75% đối tượng có độ tuổi bằng hoặc thấp hơn 35 tuổi. Số trung vị (median) 31 cũng có nghĩa là 50% đối tượng có độ tuổi 31 trở xuống (hay 31 tuổi trở lên).

table(QT$Age)
## 
##  27  28  29  30  31  33  34  35  36  37  38 
##  62  71  70 236 103  29 107  52  67 126  31
table(QT$Age)/sum(table(QT$Age))
## 
##         27         28         29         30         31         33         34 
## 0.06498952 0.07442348 0.07337526 0.24737945 0.10796646 0.03039832 0.11215933 
##         35         36         37         38 
## 0.05450734 0.07023061 0.13207547 0.03249476
pie(table(QT$Age), col = rainbow(11), main = "Biểu đồ thể hiện độ tuổi của khách hàng ")

3.1.7 Biến SO

summary(QT$SO)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   2.000   2.437   4.000   6.000

Dựa vào kết quả thống kê mô tả, ta thấy Số dịch vụ được khách hàng chọn trong những năm gần đây của công ty du lịch và lữ hành từ 1 dịch vụ đến 6 dịch vụ, trung bình (mean) là 2.437. 1st Qu.(first quartile) = 1 có nghĩa là 25% đối tượng nghiên cứu có thu nhập hàng năm bằng hoặc nhỏ hơn 1 dịch vụ. Tương tự, 3rd Qu.(Third quartile) = 4 có nghĩa là 75% đối tượng có thu nhập hàng năm bằng hoặc thấp hơn 4 dịch vụ. Số trung vị (median) 2 cũng có nghĩa là 50% đối tượng có thu nhập hàng năm là 2 dịch vụ trở xuống (hay 2 dịch vụ trở lên).

table(QT$SO)
## 
##   1   2   3   4   5   6 
## 404 176 124 117  69  64
table(QT$SO)/sum(table(QT$SO))
## 
##          1          2          3          4          5          6 
## 0.42348008 0.18448637 0.12997904 0.12264151 0.07232704 0.06708595
pie(table(QT$SO), col = rainbow(6), main = "Biểu đồ thể hiện số dịch vụ được khách hàng chọn trong những năm gần đây của công ty")

3.2 Thống kê mô tả cho hai biến

3.2.1 Biến phụ thuộc :TG” và biến độc lập “FF”

  • Biểu đồ
ggplot(QT, aes(FF, fill =TG )) + geom_bar(position = 'dodge')

  • Bảng tần số
A <- table(QT$FF, QT$TG); A
##            
##              No Yes
##   No        539  69
##   No Record  52   8
##   Yes       139 147
  • Bảng tần suất
A1 <- prop.table(A); A1
##            
##                      No         Yes
##   No        0.564989518 0.072327044
##   No Record 0.054507338 0.008385744
##   Yes       0.145702306 0.154088050

Dựa vào kết quả của bảng tần số và tần suất ta thấy: Có 69 khách hàng không thường xuyên đi các chuyến bay rời đi, chiếm 7,23%. Có 147 khách hàng thường xuyên đi các chuyến bay rời đi, chiếm 15,41%. Có 8 khách hàng không rõ thường xuyên đi các chuyến bay rời đi, chiếm 0,48%.

  • Rủi ro tương đối
#Tần số biên
addmargins(A)
##            
##              No Yes Sum
##   No        539  69 608
##   No Record  52   8  60
##   Yes       139 147 286
##   Sum       730 224 954
riskratio(A)
## $data
##            
##              No Yes Total
##   No        539  69   608
##   No Record  52   8    60
##   Yes       139 147   286
##   Total     730 224   954
## 
## $measure
##            risk ratio with 95% C.I.
##             estimate     lower    upper
##   No        1.000000        NA       NA
##   No Record 1.174879 0.5938551 2.324374
##   Yes       4.529036 3.5303573 5.810225
## 
## $p.value
##            two-sided
##             midp.exact fisher.exact   chi.square
##   No                NA           NA           NA
##   No Record  0.6295064 6.707274e-01 6.460462e-01
##   Yes        0.0000000 6.106495e-37 6.473744e-39
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Theo kết quả trên ta thấy tỉ lệ rủi ro tương đối (risk ratio) của những khách hàng rời đi theo tình trạng thường xuyên đi các chuyến bay.

Với nhóm No Record: Tỷ lệ rủi ro tương đối ước tính là 1.174879. Điều này cho thấy nhóm “No Record” có tỷ lệ rủi ro tương đối cao hơn khoảng 1.17 lần so với nhóm tham chiếu “No”. Khoảng tin cậy 95% cho tỷ lệ rủi ro tương đối nằm trong khoảng từ 0.5938551 đến 2.324374. Điều này cho biết rằng chúng ta có độ tin cậy 95% rằng tỷ lệ rủi ro tương đối thực sự nằm trong khoảng này.

Với nhóm Yes: Tỷ lệ rủi ro tương đối ước tính là 4.529036. Điều này cho thấy nhóm “Yes” có tỷ lệ rủi ro tương đối cao hơn khoảng 4.53 lần so với nhóm tham chiếu “No”. Khoảng tin cậy 95% cho tỷ lệ rủi ro tương đối nằm trong khoảng từ 3.5303573 đến 5.810225. Điều này cho biết rằng chúng ta có độ tin cậy 95% rằng tỷ lệ rủi ro tương đối thực sự nằm trong khoảng này.

  • Tỷ lệ chênh lệch
epitab(A, method = 'oddsratio', rev='c') 
## $tab
##            
##             Yes         p0  No         p1 oddsratio      lower     upper
##   No         69 0.30803571 539 0.73835616 1.0000000         NA        NA
##   No Record   8 0.03571429  52 0.07123288 0.8320965 0.37938291 1.8250283
##   Yes       147 0.65625000 139 0.19041096 0.1210480 0.08603596 0.1703082
##            
##                  p.value
##   No                  NA
##   No Record 6.707274e-01
##   Yes       6.106495e-37
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỉ lệ chênh. Tỷ lệ Odds Ratio là 0.8320965, cho thấy tỷ lệ chênh của nhóm “No Record” thấp hơn so với nhóm “No”. Tỷ lệ Odds Ratio là 0.1210480, cho thấy tỷ lệ chênh của nhóm “Yes” thấp hơn đáng kể so với nhóm “No”.

3.2.2 Biến phụ thuộc :TG” và biến độc lập “AIC”

  • Biểu đồ
ggplot(QT, aes(AIC, fill =TG )) + geom_bar(position = 'dodge')

  • Bảng tần số
B <- table(QT$AIC, QT$TG); B
##                
##                  No Yes
##   High Income    67  92
##   Low Income    282 104
##   Middle Income 381  28
  • Bảng tần suất
B1 <- prop.table(B); B1
##                
##                         No        Yes
##   High Income   0.07023061 0.09643606
##   Low Income    0.29559748 0.10901468
##   Middle Income 0.39937107 0.02935010

Dựa vào kết quả của bảng tần số và tần suất ta thấy: Có 92 khách hàng có thu nhập cao rời đi, chiếm 9,64%. Có 104 khách hàng có thu nhập thấp rời đi, chiếm 10,9%. Có 28 khách hàng có thu nhập trung bình rời đi, chiếm 2,94%.

  • Rủi ro tương đối
#Tần số biên
addmargins(B)
##                
##                  No Yes Sum
##   High Income    67  92 159
##   Low Income    282 104 386
##   Middle Income 381  28 409
##   Sum           730 224 954
riskratio(B)
## $data
##                
##                  No Yes Total
##   High Income    67  92   159
##   Low Income    282 104   386
##   Middle Income 381  28   409
##   Total         730 224   954
## 
## $measure
##                risk ratio with 95% C.I.
##                  estimate     lower     upper
##   High Income   1.0000000        NA        NA
##   Low Income    0.4656454 0.3770149 0.5751117
##   Middle Income 0.1183161 0.0808059 0.1732387
## 
## $p.value
##                two-sided
##                   midp.exact fisher.exact   chi.square
##   High Income             NA           NA           NA
##   Low Income    1.686307e-11 2.353008e-11 8.082985e-12
##   Middle Income 0.000000e+00 1.825713e-37 8.770272e-41
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Tỷ lệ chênh lệch
epitab(B, method = "oddsratio")
## $tab
##                
##                  No         p0 Yes        p1  oddsratio      lower      upper
##   High Income    67 0.09178082  92 0.4107143 1.00000000         NA         NA
##   Low Income    282 0.38630137 104 0.4642857 0.26857848 0.18241742 0.39543591
##   Middle Income 381 0.52191781  28 0.1250000 0.05352048 0.03258037 0.08791926
##                
##                      p.value
##   High Income             NA
##   Low Income    2.353008e-11
##   Middle Income 1.825713e-37
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỉ lệ chênh. Tỷ lệ Odds Ratio là 0.26857848, cho thấy tỷ lệ chênh của nhóm “Low Income” thấp hơn so với nhóm “High Income”. Tỷ lệ Odds Ratio là 0.05352048, cho thấy tỷ lệ chênh của nhóm ” Middle Income” thấp hơn đáng kể so với nhóm “High Income”.

3.2.3 Biến phụ thuộc :TG” và biến độc lập “ASTSM”

  • Biểu đồ
ggplot(QT, aes(ASTSM, fill =TG)) + geom_bar(position = 'dodge')

  • Bảng tần số
C <- table(QT$ASTSM, QT$TG); C
##      
##        No Yes
##   No  469 125
##   Yes 261  99
  • Bảng tần suất
C1 <- prop.table(C); C1
##      
##              No       Yes
##   No  0.4916143 0.1310273
##   Yes 0.2735849 0.1037736

Dựa vào kết quả của bảng tần số và tần suất ta thấy: Có 125 khách hàng Tài khoản công ty được đồng bộ hóa với mạng xã hội của họ rời đi, chiếm 13,1%. Có 99 Tài khoản công ty không được đồng bộ hóa với mạng xã hội của họ rời đi, chiếm 10,38%.

  • Rủi ro tương đối
#Tần số biên
addmargins(C)
##      
##        No Yes Sum
##   No  469 125 594
##   Yes 261  99 360
##   Sum 730 224 954
riskratio(C, rev = "c")
## $data
##        
##         Yes  No Total
##   No    125 469   594
##   Yes    99 261   360
##   Total 224 730   954
## 
## $measure
##      risk ratio with 95% C.I.
##        estimate     lower     upper
##   No  1.0000000        NA        NA
##   Yes 0.9182303 0.8510578 0.9907045
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes 0.02371352   0.02723027 0.02258363
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Theo kết quả trên ta thấy tỉ lệ rủi ro tương đối (risk ratio) của những khách hàng không rời đi theo tình trạng Tài khoản công ty được đồng bộ hóa với mạng xã hội của họ là 0.9182303 tức tỷ lệ khách hàng không rời đi là khách hàng Tài khoản công ty được đồng bộ hóa với mạng xã hội của họ ít hơn và xấp xỉ bằng tỷ lệ khách hàng không rời đi là khách hàng Tài khoản công ty không được đồng bộ hóa với mạng xã hội của họ.

  • Tỷ lệ chênh lệch
epitab(C, method = "oddsratio")
## $tab
##      
##        No        p0 Yes        p1 oddsratio    lower    upper    p.value
##   No  469 0.6424658 125 0.5580357  1.000000       NA       NA         NA
##   Yes 261 0.3575342  99 0.4419643  1.423172 1.050056 1.928868 0.02723027
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỉ lệ chênh là 1.423172 tức tỉ lệ những khách hàng không rời đi/những khách hàng rời đi thuộc khách hàng Tài khoản công ty được đồng bộ hóa với mạng xã hội của họ khoảng 4,23% so với tỷ lệ khách hàng không rời đi/những khách hàng rời đi thuộc khách hàng Tài khoản công ty không đồng bộ hóa với mạng xã hội của họ.

3.2.4 Biến phụ thuộc :TG” và biến độc lập “BH”

  • Biểu đồ
ggplot(QT, aes(BH , fill =TG)) + geom_bar(position = 'dodge')

  • Bảng tần số
D <- table(QT$BH, QT$TG); D
##      
##        No Yes
##   No  400 176
##   Yes 330  48
  • Bảng tần suất
D1 <- prop.table(D); D1
##      
##               No        Yes
##   No  0.41928721 0.18448637
##   Yes 0.34591195 0.05031447

Dựa vào kết quả của bảng tần số và tần suất ta thấy: Có 176 khách hàng đặt nhà nghỉ/khách sạn có sử dụng dịch vụ của công ty rời đi, chiếm 18,45%%. Có 48 khách hàng đặt nhà nghỉ/khách sạn có sử dụng dịch vụ của công ty không rời đi, chiếm 5,03%.

  • Rủi ro tương đối
#Tần số biên
addmargins(D)
##      
##        No Yes Sum
##   No  400 176 576
##   Yes 330  48 378
##   Sum 730 224 954
epitab(D, method = "riskratio")
## $tab
##      
##        No        p0 Yes        p1 riskratio     lower     upper      p.value
##   No  400 0.6944444 176 0.3055556 1.0000000        NA        NA           NA
##   Yes 330 0.8730159  48 0.1269841 0.4155844 0.3104724 0.5562826 6.554016e-11
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"
  • Tỷ lệ chênh lệch
oddsratio(D, rev = 'c')
## $data
##        
##         Yes  No Total
##   No    176 400   576
##   Yes    48 330   378
##   Total 224 730   954
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate    lower    upper
##   No  1.000000       NA       NA
##   Yes 3.015503 2.137795 4.322722
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   No            NA           NA           NA
##   Yes 6.269141e-11 6.554016e-11 1.960472e-10
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

4 Nhiệm vụ 2: Phân tích biến phụ thuộc

Nhiệm vụ: Chọn 1 hoặc 2 biến định tính và 1 biến định lượng làm biến phụ thuộc để phân tích, giải thích lý do.

4.1 Chọn biến phụ thuộc là biến định tính

Bài nghiên cứu chọn biến TG là biến phụ thuộc vì tác giả muốn xem xét quyết định rời đi của khách hàng sẽ chịu ảnh hưởng bởi các yếu tố nào.

4.2 Chọn biến phụ thuộc là biến định lượng

Đối với biến định lượng, tác giả chọn biến SO làm biến phụ thuộc, đây là biến cho biết Số lần dịch vụ được chọn trong những năm gần đây.

5 Nhiệm vụ 1: Dữ liệu nghiên cứu

Nhiệm vụ: Tìm một dataset có dữ liệu định tính, dữ liệu định lượng, có trên 5 biến và nhiều hơn 300 quan sát.

5.1 Dữ liệu

Dữ liệu nghiên cứu về một công ty du lịch và lữ hành đang muốn dự đoán liệu một khách hàng sẽ rời đi hay không dựa trên các chỉ số được đưa ra dưới đây. Dữ liệu này bao gồm thông tin về 954 khách hàng. Bộ dữ liệu được lấy của tác giả Tejashvi từ website: https://www.kaggle.com/datasets/tejashvi14/tour-travels-customer-churn-prediction

5.2 Mô tả dữ liệu

Dữ liệu nghiên cứu gồm 954 quan sát với 7 biến bao gồm 5 biến định tính và 2 biến định lượng.

trong đó:

Biến định tính

  • FF: Khách hàng có đi các chuyến bay thường xuyên hay không (Yes: Có; No: Không; No Record: Không có hồ sơ)

  • AIC: Loại thu nhập hàng năm của khách hàng (Middle Income: Thu nhập trung bình; Low Income: Thu nhập thấp; High Income: Thu nhập cao)

  • ASTSM: Tài khoản công ty của khách hàng có được đồng bộ hóa với mạng xã hội của họ hay không (Yes: Có; No: Không)

  • BH: Khách hàng đặt nhà nghỉ/khách sạn có sử dụng dịch vụ của công ty hay không (Yes: Có; No: Không)

  • TG: Tình trạng khách hàng có rời đi hay không (Yes: Khách hàng rời đi; No: Khách hàng không rời đi)

Biến định lượng

  • Age: Số tuổi của khách hàng

  • SO: Số dịch vụ được chọn trong những năm gần đây

LS0tDQp0aXRsZTogIlBURExEVCINCmF1dGhvcjogIlBo4bqhbSBUaOG7iyBOZ+G7jWMiDQpkYXRlOiAiMjAyMy0wNy0xNSINCm91dHB1dDoNCiBodG1sX2RvY3VtZW50Og0KICB0b2M6IHRydWUNCiAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogIHRvY19mbG9hdDoNCiAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgaGlnaGxpZ2h0OiBrYXRlDQogIGNvZGVfZm9sZGluZzogaGlkZQ0KICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KCJEZXNjVG9vbHMiKSANCmxpYnJhcnkoImVwaXRvb2xzIikNCmxpYnJhcnkoImdncGxvdDIiKQ0KbGlicmFyeSgiY2FyZXQiKQ0KUVQgPC0gcmVhZC5jc3YoIkQ6L1BUREzEkFQvUXVhdHJpbmguY3N2IikNCnN0cihRVCkNCmBgYA0KDQoNCiMgTmhp4buHbSB24bulIDU6IMav4bubYyBsxrDhu6NuZyBtw7QgaMOsbmggaOG7k2kgcXV5DQoNCiMjIE3DtCBow6xuaCBjbG9nbG9nDQoNCmBgYHtyfQ0KTUgxIDwtIGdsbShmYWN0b3IgKFRHKSB+IFFUJEZGICsgUVQkQUlDICsgUVQkQVNUU00gKyBRVCRCSCArIFFUJEFnZSArIFFUJFNPLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImNsb2dsb2ciKSwgZGF0YT0gUVQpDQpzdW1tYXJ5KE1IMSkNCg0KYGBgDQpBSUMgPSA3OTAuMDINCg0KRGV2aWFuY2UgPSA3NzIuMDINCg0KYGBge3J9DQpCcmllclNjb3JlKE1IMSkNCmBgYA0KR2nDoSB0cuG7iyBj4bunYSBCcmllciBTY29yZSBjw6BuZyBuaOG7jyBuZ2jEqWEgbMOgIGNow6puaCBs4buHY2ggZ2nhu69hIHjDoWMgc3XhuqV0IHRo4buxYyB04bq/IHbDoCB4w6FjIHN14bqldCB0w61uaCB04burIG3DtCBow6xuaCBjw6BuZyBuaOG7jywgbmdoxKlhIGzDoCBtw7QgaMOsbmggY8OgbmcgdOG7kXQuDQoNCmBgYHtyfQ0KIyBNYSB0cuG6rW4gbmjhuqdtIGzhuqtuDQphIDwtIHByZWRpY3QoTUgxLCB0eXBlID0gInJlc3BvbnNlIikNCmIgPC0gaWZlbHNlKGEgPiAwLjUsICIxIiwgIjAiKQ0KYyA8LWZhY3RvcihiLCBsZXZlbHMgPSBjKCIwIiwiMSIpKQ0KZCA8LSBmYWN0b3IoUVQkVEcsIGxhYmVscyA9IGMoIjAiLCIxIikpDQpjb25mdXNpb25NYXRyaXgodGFibGUoYywgZCkpDQpgYGANCg0KIyMgTcO0IGjDrG5oIHByb2JpdA0KDQpgYGB7cn0NCk1IMiA8LSBnbG0oZmFjdG9yIChURykgfiBRVCRGRiArIFFUJEFJQyArIFFUJEFTVFNNICsgUVQkQkggKyBRVCRBZ2UgKyBRVCRTTywgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSwgZGF0YSA9IFFUKQ0Kc3VtbWFyeShNSDIpDQpgYGANCkFJQyA9IDc4MC41Mw0KDQpEZXZpYW5jZSA9IDc2Mi41Mw0KDQpgYGB7cn0NCkJyaWVyU2NvcmUoTUgyKQ0KYGBgDQpHacOhIHRy4buLIGPhu6dhIEJyaWVyIFNjb3JlIGPDoG5nIG5o4buPIG5naMSpYSBsw6AgY2jDqm5oIGzhu4djaCBnaeG7r2EgeMOhYyBzdeG6pXQgdGjhu7FjIHThur8gdsOgIHjDoWMgc3XhuqV0IHTDrW5oIHThu6sgbcO0IGjDrG5oIGPDoG5nIG5o4buPLCBuZ2jEqWEgbMOgIG3DtCBow6xuaCBjw6BuZyB04buRdC4NCg0KYGBge3J9DQojIE1hIHRy4bqtbiBuaOG6p20gbOG6q24NCmEgPC0gcHJlZGljdChNSDIsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYiA8LSBpZmVsc2UoYSA+IDAuNSwgIjEiLCAiMCIpDQpjIDwtZmFjdG9yKGIsIGxldmVscyA9IGMoIjAiLCIxIikpDQpkIDwtIGZhY3RvcihRVCRURywgbGFiZWxzID0gYygiMCIsIjEiKSkNCmNvbmZ1c2lvbk1hdHJpeCh0YWJsZShjLCBkKSkNCmBgYA0KDQojIyBNw7QgaMOsbmggbG9naXQNCg0KYGBge3J9DQpNSDMgPC0gZ2xtKGZhY3RvciAoVEcpIH4gUVQkRkYgKyBRVCRBSUMgKyBRVCRBU1RTTSArIFFUJEJIICsgUVQkQWdlICsgUVQkU08sIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSwgZGF0YSA9IFFUKQ0Kc3VtbWFyeShNSDMpDQpgYGANCkFJQyA9IDc4MC45NQ0KDQoNCkRldmlhbmNlID0gNzYyLjk1DQoNCmBgYHtyfQ0KQnJpZXJTY29yZShNSDMpDQpgYGANCkdpw6EgdHLhu4sgY+G7p2EgQnJpZXIgU2NvcmUgY8Ogbmcgbmjhu48gbmdoxKlhIGzDoCBjaMOqbmggbOG7h2NoIGdp4buvYSB4w6FjIHN14bqldCB0aOG7sWMgdOG6vyB2w6AgeMOhYyBzdeG6pXQgdMOtbmggdOG7qyBtw7QgaMOsbmggY8Ogbmcgbmjhu48sIG5naMSpYSBsw6AgbcO0IGjDrG5oIGPDoG5nIHThu5F0Lg0KDQpgYGB7cn0NCiMgTWEgdHLhuq1uIG5o4bqnbSBs4bqrbg0KYSA8LSBwcmVkaWN0KE1IMywgdHlwZSA9ICJyZXNwb25zZSIpDQpiIDwtIGlmZWxzZShhID4gMC41LCAiMSIsICIwIikNCmMgPC1mYWN0b3IoYiwgbGV2ZWxzID0gYygiMCIsIjEiKSkNCmQgPC0gZmFjdG9yKFFUJFRHLCBsYWJlbHMgPSBjKCIwIiwiMSIpKQ0KY29uZnVzaW9uTWF0cml4KHRhYmxlKGMsIGQpKQ0KYGBgDQoNCiMjIEzhu7FhIGNo4buNbiBtw7QgaMOsbmgNCg0KfE3DtCBow6xuaCAgICAgIHxBSUMgICB8RGV2aWFuY2UgfEJyaWVyIFNjb3JlIHzEkOG7mSBjaMOtbmggeMOhYyB8xJDhu5kgbmjhuqF5IHzEkOG7mSDEkeG6t2MgaGnhu4d1IHwNCnwtLS0tLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tfA0KfExvZ2l0ICAgKE1IMyl8NzgwLjk1fDc2Mi45NSAgIHwgMC4xMjcyNjk4ICB8ICAgMC44MjI5ICAgIHwwLjkyODggIHwgICAwLjQ3NzcgICB8DQp8UHJvYml0ICAoTUgyKXw3ODAuNTN8NzYyLjUzICAgfCAwLjEyNzY3ODggIHwgICAwLjgyMjkgICAgfDAuOTMwMSAgfCAgIDAuNDczMiAgIHwNCnxDbG9nbG9nIChNSDEpfDc5MC4wMnw3NzIuMDIgICB8IDAuMTI4MTkyMiAgfCAgIDAuODIwOCAgICB8MC45Mzk3ICB8ICAgMC40MzMwICAgfA0KfEzhu7FhIGNo4buNbiAgICAgfE1IMiAgIHwgTUgyICAgICB8ICAgIE1IMSAgICAgfCAgICBNSDEtMiAgICB8IE1IMyAgICB8ICAgICBNSDEgICAgfA0KDQpE4buxYSB2w6BvIGPDoWMgdGnDqnUgY2jDrSDEkcOhbmggZ2nDoSBt4buZdCBtw7QgaMOsbmggYmFvIGfhu5NtIEFJQywgRGV2aWFuY2UgdsOgIENvbmZ1c2lvbiBNYXRyaXggKMSQ4buZIGNow61uaCB4w6FjLCDEkeG7mSBuaOG6oXkpIMSR4buBdSDEkcawYSByYSBr4bq/dCBxdeG6oyBjaG8gdGjhuqV5IG3DtCBow6xuaCAyIC0gTcO0IGjDrG5oIHPhu60gZOG7pW5nIGjDoG0gUHJvYml0IGzDoCB04buRdCBuaOG6pXQgdHJvbmcgMyBtw7QgaMOsbmggxJHGsOG7o2MgxJHhu4EgeHXhuqV0LiBEbyDEkcOzIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgduG7m2kgaMOgbSB04bu3IGzhu4cgKGNvbXBsZW1lbnRhcnkgUHJvYml0IGxpbmsgZnVuY3Rpb24pIGzDoCBtw7QgaMOsbmggdOG7kXQgbmjhuqV0Lg0KDQojIE5oaeG7h20gduG7pSA0OiBQaMOibiB0w61jaCB0aOG7kW5nIGvDqiBtw7QgdOG6ow0KDQojIyBLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgY2hvIDIgYmnhur9uIMSR4buLbmggdMOtbmggDQoNCiMjIyAiVEfigJ0gdsOgIOKAnEZG4oCdDQoNCi0gS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wDQoNCkdp4bqjIHRodXnhur90IC0gxJDhu5FpIHRodXnhur90Og0KDQokSF97MH0kOiBURyB2w6AgRkYgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KJEhfezF9JDogVEcgdsOgIEZGIGtow7RuZyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdQ0KDQoNCmBgYHtyfQ0KQUEgPC0gdGFibGUoUVQkRkYsIFFUJFRHKQ0KY2hpc3EudGVzdChBQSkNCmBgYA0KVsOsIHBfdmFsdWUgPSAyLjJlLTE2IDwgMC4wNSBuw6puIHRhIHRo4burYSBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfezB9JC4gTmdoxKlhIGzDoCBURyB2w6AgRkYgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUuDQoNCiMjIyAiVEciIHbDoCAiQUlDIg0KDQotIEtp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcA0KDQpHaeG6oyB0aHV54bq/dCAtIMSQ4buRaSB0aHV54bq/dDoNCg0KJEhfezB9JDogVEcgdsOgIEFJQyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdQ0KDQokSF97MX0kOiBURyB2w6AgQUlDIGtow7RuZyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdQ0KDQoNCmBgYHtyfQ0KQkIgPC0gdGFibGUoUVQkQUlDLCBRVCRURykNCmNoaXNxLnRlc3QoQkIpDQpgYGANClbDrCBwX3ZhbHVlID0gMi4yZS0xNiA8IDAuMDUgbsOqbiB0YSB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIX3swfSQuIE5naMSpYSBsw6AgVEcgdsOgIEFJQyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdS4NCg0KIyMjICJURyIgdsOgICJBU1RTTSINCg0KLSBLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXANCg0KR2nhuqMgdGh1eeG6v3QgLSDEkOG7kWkgdGh1eeG6v3Q6DQoNCiRIX3swfSQ6IFRHIHbDoCBBU1RTTSDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdQ0KDQokSF97MX0kOiBURyB2w6AgQVNUU00ga2jDtG5nIMSR4buZYyBs4bqtcCB24bubaSBuaGF1DQoNCg0KYGBge3J9DQpDQyA8LSB0YWJsZShRVCRBU1RTTSwgUVQkVEcpDQpjaGlzcS50ZXN0KENDKQ0KYGBgDQpWw6wgcF92YWx1ZSA9IDAuMDI3NjkgPCAwLjA1IG7Dqm4gdGEgdGjhu6thIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF97MH0kLiBOZ2jEqWEgbMOgIFRHIHbDoCBBU1RTTSDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdS4NCg0KIyMjICJURyIgdsOgICJCSCINCg0KLSBLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXANCg0KR2nhuqMgdGh1eeG6v3QgLSDEkOG7kWkgdGh1eeG6v3Q6DQoNCiRIX3swfSQ6IFRHIHbDoCBCSCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdQ0KDQokSF97MX0kOiBURyB2w6AgQkgga2jDtG5nIMSR4buZYyBs4bqtcCB24bubaSBuaGF1DQoNCg0KYGBge3J9DQpERCA8LSB0YWJsZShRVCRCSCwgUVQkVEcpDQpjaGlzcS50ZXN0KEREKQ0KYGBgDQpWw6wgcF92YWx1ZSA9IDMuMjUxZS0xMCA8IDAuMDUgbsOqbiB0YSB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIX3swfSQuIE5naMSpYSBsw6AgVEcgdsOgIEJIIMSR4buZYyBs4bqtcCB24bubaSBuaGF1Lg0KDQojIyBLaG/huqNuZyDGsOG7m2MgbMaw4bujbmcgY2hvIHThu7cgbOG7hw0KDQoqxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyBraMOhY2ggaMOgbmcga2jDtG5nIHLhu51pIMSRaSB24bubaSB0csOsbmggdHLhuqFuZyBy4budaSDEkXU9aSBjw7MgcGjhuqNpIGzDoCAzMCUgaGF5IGtow7RuZyAobmdoxKlhIGzDoCBjaMO6bmcgdGEga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3TigJ0gJEhfMCQ6IHA9IDAuMzDigJ0pKg0KDQpgYGB7cn0NCk4gPC0gUVRbUVQkVEcgPT0gIk5vIixdDQpwcm9wLnRlc3QobGVuZ3RoKE4kVEcpLGxlbmd0aChRVCRURykscD0gMC4zKQ0KYGBgDQoNClbDrCBwX3ZhbHVlIDwgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gRG8gxJHDsyB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGtow7RuZyBy4budaSDEkWkga2jDtG5nIHBo4bqjaSBi4bqxbmcgMzAlIHbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JS4NCg0KDQoNCiMgTmhp4buHbSB24bulIDM6IFRo4buRbmcga8OqIG3DtCB04bqjIA0KDQpOaGnhu4dtIHbhu6U6IEzDoG0gdGjhu5FuZyBrw6ogbcO0IHThuqMgxJHhu4MgcGjDom4gdMOtY2ggY2hvIMOtdCBuaOG6pXQgNSBiaeG6v24gKHbhu6thIMSR4buLbmggdMOtbmggxJHhu4tuaCBsxrDhu6NuZyB2w6AgY8OzIDIgYmnhur9uIMSRw6MgY2jhu41uIOG7nyBjw6J1IDIpLCBuaOG6rW4geMOpdCB24buBIGvhur90IHF14bqjIHBow6JuIHTDrWNoIG7DoHkuDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIGNobyBt4buZdCBiaeG6v24NCg0KIyMjIEJp4bq/biBURyANCg0KLSBC4bqjbmcgdOG6p24gc+G7kQ0KYGBge3J9DQp0YWJsZShRVCRURykNCmBgYA0KLSBC4bqjbmcgdOG6p24gc3XhuqV0DQpgYGB7cn0NCnRhYmxlKFFUJFRHKS9zdW0odGFibGUoUVQkVEcpKQ0KYGBgDQotIEJp4buDdSDEkeG7kw0KYGBge3J9DQpnZ3Bsb3QoUVQsYWVzKFRHKSkgKyBnZW9tX2Jhcihjb2xvciA9ImJsYWNrIiwgZmlsbCA9ICJwaW5rIikgKyB5bGFiKCJT4buRIGtow6FjaCBow6BuZyIpICsgeGxhYigiVMOsbmggdHLhuqFuZyBraMOhY2ggaMOgbmcgcuG7nWkgxJFpIikNCmBgYA0KDQpE4buxYSB2w6BvIGvhur90IHF14bqjIGPhu6dhIGLhuqNuZyB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kyB0YSB0aOG6pXkgdHJvbmcgOTU0IGtow6FjaCBow6BuZyB0aMOsIGPDsyA3MzAga2jDoWNoIGjDoG5nIGtow7RuZyBy4budaSDEkWkgY2hp4bq/bSA3Niw1MiUgdsOgIGPDsyAyMjQga2jDoWNoIGjDoG5nIG11YSBi4bqjbyBoaeG7g20gZHUgbOG7i2NoIGNoaeG6v20gMjMsNDglLg0KDQojIyMgQmnhur9uIEZGDQoNCi0gQuG6o25nIHThuqduIHPhu5ENCmBgYHtyfQ0KdGFibGUoUVQkRkYpDQpgYGANCi0gQuG6o25nIHThuqduIHN14bqldA0KYGBge3J9DQp0YWJsZShRVCRGRikvc3VtKHRhYmxlKFFUJEZGKSkNCmBgYA0KLSBCaeG7g3UgxJHhu5MNCmBgYHtyfQ0KZ2dwbG90KFFULGFlcyhGRikpICsgZ2VvbV9iYXIoY29sb3IgPSJibGFjayIsIGZpbGwgPSAicGluayIpICsgeWxhYigiU+G7kSBraMOhY2ggaMOgbmciKSArIHhsYWIoIlTDrG5oIHRy4bqhbmcgdGjGsOG7nW5nIHh1ecOqbiDEkWkgY8OhYyBjaHV54bq/biBiYXkgY+G7p2Ega2jDoWNoIGjDoG5nIikNCmBgYA0KROG7sWEgdsOgbyBr4bq/dCBxdeG6oyBj4bunYSBi4bqjbmcgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IHRyb25nIDk1NCBraMOhY2ggaMOgbmcgdGjDrCBjw7MgNjA4IGtow6FjaCBow6BuZyBraMO0bmcgdGjGsOG7nW5nIHh1ecOqbiDEkWkgY8OhYyBjaHV54bq/biBiYXksIGNoaeG6v20gNjMsNzMlLCBjw7MgMjg2IGtow6FjaCBow6BuZyB0aMaw4budbmcgeHV5w6puIMSRaSBjw6FjIGNodXnhur9uIGJheSwgY2hp4bq/bSAyOSw5OCUgdsOgIGPDsyA2MCBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBo4buTIHPGoSB24buBIHTDrG5oIHRy4bqhbmcgdGjGsOG7nW5nIHh1ecOqbiDEkWkgY8OhYyBjaHV54bq/biBiYXksIGNoaeG6v20gNiwyOSUuDQoNCg0KIyMjIEJp4bq/biBBSUMNCg0KLSBC4bqjbmcgdOG6p24gc+G7kQ0KYGBge3J9DQp0YWJsZShRVCRBSUMpDQpgYGANCi0gQuG6o25nIHThuqduIHN14bqldA0KYGBge3J9DQp0YWJsZShRVCRBSUMpL3N1bSh0YWJsZShRVCRBSUMpKQ0KYGBgDQotIEJp4buDdSDEkeG7kw0KYGBge3J9DQpwaWUodGFibGUoUVQkQUlDKSwgY29sID0gcmFpbmJvdygzKSwgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHTDrG5oIHRy4bqhbmcgdGh1IG5o4bqtcCBj4bunYSBraMOhY2ggaMOgbmcgIikNCmBgYA0KROG7sWEgdsOgbyBr4bq/dCBxdeG6oyBj4bunYSBi4bqjbmcgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IHRyb25nIDk1NCBraMOhY2ggaMOgbmcgdGjDrCBjw7MgMTU5IGtow6FjaCBow6BuZyBjw7MgbeG7qWMgdGh1IG5o4bqtcCBjYW8sIGNoaeG6v20gMTYsNjclLCBjw7MgMzg2IGtow6FjaCBow6BuZyBjw7MgbeG7qWMgdGh1IG5o4bqtcCB0aMOib3MsIGNoaeG6v20gNDAsNDYlIHbDoCBjw7MgNDA5IGtow6FjaCBow6BuZyBjw7MgbeG7qWMgdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCwgY2hp4bq/bSA0Miw4NyUuDQoNCiMjIyBCaeG6v24gQVNUU00NCg0KLSBC4bqjbmcgdOG6p24gc+G7kQ0KYGBge3J9DQp0YWJsZShRVCRBU1RTTSkNCmBgYA0KLSBC4bqjbmcgdOG6p24gc3XhuqV0DQpgYGB7cn0NCnRhYmxlKFFUJEFTVFNNKS9zdW0odGFibGUoUVQkQVNUU00pKQ0KYGBgDQotIEJp4buDdSDEkeG7kw0KYGBge3J9DQpnZ3Bsb3QoUVQsYWVzKEFTVFNNKSkgKyBnZW9tX2Jhcihjb2xvciA9ImJsYWNrIiwgZmlsbCA9ICJwaW5rIikgKyB5bGFiKCJT4buRIGtow6FjaCBow6BuZyIpICsgeGxhYigiVMOsbmggdHLhuqFuZyB0w6BpIGtob+G6o24gY+G7p2Ega2jDoWNoIGjDoG5nIGPDsyDEkeG7k25nIGLhu5kgduG7m2kgTVhIIGPhu6dhIGjhu40ga2jDtG5nIikNCmBgYA0KROG7sWEgdsOgbyBr4bq/dCBxdeG6oyBj4bunYSBi4bqjbmcgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IHRyb25nIDk1NCBraMOhY2ggaMOgbmcgdGjDrCBjw7MgNTk0IGtow6FjaCBow6BuZyBjw7MgdMOgaSBraG/huqNuIGPDtG5nIHR5IGtow7RuZyDEkeG7k25nIGLhu5kgduG7m2kgTVhIIGPhu6dhIGjhu40sIGNoaeG6v20gNjIsMjYlIHbDoCBjw7MgMzYwIGtow6FjaCBow6BuZyBjw7MgdMOgaSBraG/huqNuIGPDtG5nIHR5IGPDsyDEkeG7k25nIGLhu5kgduG7m2kgTVhIIGPhu6dhIGjhu40sIGNoaeG6v20gMzcsNzQlLg0KDQojIyMgQmnhur9uIEJIDQoNCi0gQuG6o25nIHThuqduIHPhu5ENCmBgYHtyfQ0KdGFibGUoUVQkQkgpDQpgYGANCi0gQuG6o25nIHThuqduIHN14bqldA0KYGBge3J9DQp0YWJsZShRVCRCSCkvc3VtKHRhYmxlKFFUJEJIKSkNCmBgYA0KLSBCaeG7g3UgxJHhu5MNCg0KYGBge3J9DQpwaWUodGFibGUoUVQkQkgpLCBjb2wgPSByYWluYm93KDIpLCBtYWluID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdMOsbmggdHLhuqFuZyBraMOhY2ggaMOgbmcgY8OzIHPhu60gZOG7pW5nIGThu4tjaCB24bulIMSR4bq3dCBuxqFpIG5naOG7iSBj4bunYSBjw7RuZyB0eSIpDQpgYGANCkThu7FhIHbDoG8ga+G6v3QgcXXhuqMgY+G7p2EgYuG6o25nIHThuqduIHN14bqldCB2w6AgYmnhu4N1IMSR4buTIHRhIHRo4bqleSB0cm9uZyA5NTQga2jDoWNoIGjDoG5nIHRow6wgY8OzIDU3NiBraMOhY2ggaMOgbmcga2jDtG5nIMSR4bq3dCBk4buLY2ggduG7pSBuxqFpIG5naOG7iSBj4bunYSBjw7RuZyB0eSwgY2hp4bq/bSA2MCwzOCUgdsOgIGPDsyAzNzgga2jDoWNoIGjDoG5nIGPDsyDEkeG6t3QgZOG7i2NoIHbhu6UgbsahaSBuZ2jhu4kgY+G7p2EgY8O0bmcgdHksIGNoaeG6v20gMzksNjIlLg0KDQojIyMgQmnhur9uIEFnZQ0KDQpgYGB7cn0NCnN1bW1hcnkoUVQkQWdlKQ0KYGBgDQpE4buxYSB2w6BvIGvhur90IHF14bqjIHRo4buRbmcga8OqIG3DtCB04bqjLCB0YSB0aOG6pXkga2jDoWNoIGjDoG5nIGPhu6dhIGPDtG5nIHR5IGR1IGzhu4tjaCB2w6AgbOG7ryBow6BuaCBjw7MgxJHhu5kgdHXhu5VpIHThu6sgMjcgdHXhu5VpIMSR4bq/biAzOCB0deG7lWksIHRydW5nIGLDrG5oIChtZWFuKSBsw6AgMzIsMTEgdHXhu5VpLiAxc3QgUXUuKGZpcnN0IHF1YXJ0aWxlKSA9IDMwIGPDsyBuZ2jEqWEgbMOgIDI1JSDEkeG7kWkgdMaw4bujbmcgbmdoacOqbiBj4bupdSBjw7MgxJHhu5kgdHXhu5VpIGLhurFuZyBob+G6t2Mgbmjhu48gaMahbiAzMCB0deG7lWkuIFTGsMahbmcgdOG7sSwgM3JkIFF1LihUaGlyZCBxdWFydGlsZSkgPSAzNSBjw7MgbmdoxKlhIGzDoCA3NSUgxJHhu5FpIHTGsOG7o25nIGPDsyDEkeG7mSB0deG7lWkgYuG6sW5nIGhv4bq3YyB0aOG6pXAgaMahbiAzNSB0deG7lWkuIFPhu5EgdHJ1bmcgduG7iyAobWVkaWFuKSAzMSBjxaluZyBjw7MgbmdoxKlhIGzDoCA1MCUgxJHhu5FpIHTGsOG7o25nIGPDsyDEkeG7mSB0deG7lWkgMzEgdHLhu58geHXhu5FuZyAoaGF5IDMxIHR14buVaSB0cuG7nyBsw6puKS4NCg0KYGBge3J9DQp0YWJsZShRVCRBZ2UpDQp0YWJsZShRVCRBZ2UpL3N1bSh0YWJsZShRVCRBZ2UpKQ0KcGllKHRhYmxlKFFUJEFnZSksIGNvbCA9IHJhaW5ib3coMTEpLCBtYWluID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gxJHhu5kgdHXhu5VpIGPhu6dhIGtow6FjaCBow6BuZyAiKQ0KYGBgDQoNCiMjIyBCaeG6v24gU08NCg0KYGBge3J9DQpzdW1tYXJ5KFFUJFNPKQ0KYGBgDQpE4buxYSB2w6BvIGvhur90IHF14bqjIHRo4buRbmcga8OqIG3DtCB04bqjLCB0YSB0aOG6pXkgU+G7kSBk4buLY2ggduG7pSDEkcaw4bujYyBraMOhY2ggaMOgbmcgY2jhu41uIHRyb25nIG5o4buvbmcgbsSDbSBn4bqnbiDEkcOieSBj4bunYSBjw7RuZyB0eSBkdSBs4buLY2ggdsOgIGzhu68gaMOgbmggdOG7qyAxIGThu4tjaCB24bulIMSR4bq/biA2IGThu4tjaCB24bulLCB0cnVuZyBiw6xuaCAobWVhbikgbMOgICAyLjQzNy4gMXN0IFF1LihmaXJzdCBxdWFydGlsZSkgPSAxIGPDsyBuZ2jEqWEgbMOgIDI1JSDEkeG7kWkgdMaw4bujbmcgbmdoacOqbiBj4bupdSBjw7MgdGh1IG5o4bqtcCBow6BuZyBuxINtIGLhurFuZyBob+G6t2Mgbmjhu48gaMahbiAxIGThu4tjaCB24bulLiBUxrDGoW5nIHThu7EsIDNyZCBRdS4oVGhpcmQgcXVhcnRpbGUpID0gNCBjw7MgbmdoxKlhIGzDoCA3NSUgxJHhu5FpIHTGsOG7o25nIGPDsyB0aHUgbmjhuq1wIGjDoG5nIG7Eg20gYuG6sW5nIGhv4bq3YyB0aOG6pXAgaMahbiA0IGThu4tjaCB24bulLiBT4buRIHRydW5nIHbhu4sgKG1lZGlhbikgMiBjxaluZyBjw7MgbmdoxKlhIGzDoCA1MCUgxJHhu5FpIHTGsOG7o25nIGPDsyB0aHUgbmjhuq1wIGjDoG5nIG7Eg20gbMOgIDIgZOG7i2NoIHbhu6UgdHLhu58geHXhu5FuZyAoaGF5IDIgZOG7i2NoIHbhu6UgdHLhu58gbMOqbikuDQoNCmBgYHtyfQ0KdGFibGUoUVQkU08pDQp0YWJsZShRVCRTTykvc3VtKHRhYmxlKFFUJFNPKSkNCmBgYA0KYGBge3J9DQpwaWUodGFibGUoUVQkU08pLCBjb2wgPSByYWluYm93KDYpLCBtYWluID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBk4buLY2ggduG7pSDEkcaw4bujYyBraMOhY2ggaMOgbmcgY2jhu41uIHRyb25nIG5o4buvbmcgbsSDbSBn4bqnbiDEkcOieSBj4bunYSBjw7RuZyB0eSIpDQpgYGANCg0KIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGhhaSBiaeG6v24NCg0KIyMjIEJp4bq/biBwaOG7pSB0aHXhu5ljIDpURyIgdsOgIGJp4bq/biDEkeG7mWMgbOG6rXAgIkZGIg0KDQotIEJp4buDdSDEkeG7kyANCmBgYHtyfQ0KZ2dwbG90KFFULCBhZXMoRkYsIGZpbGwgPVRHICkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KYGBgDQoNCi0gQuG6o25nIHThuqduIHPhu5ENCmBgYHtyfQ0KQSA8LSB0YWJsZShRVCRGRiwgUVQkVEcpOyBBDQpgYGANCg0KLSBC4bqjbmcgdOG6p24gc3XhuqV0DQpgYGB7cn0NCkExIDwtIHByb3AudGFibGUoQSk7IEExDQpgYGANCkThu7FhIHbDoG8ga+G6v3QgcXXhuqMgY+G7p2EgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCB0YSB0aOG6pXk6IEPDsyA2OSBraMOhY2ggaMOgbmcga2jDtG5nIHRoxrDhu51uZyB4dXnDqm4gxJFpIGPDoWMgY2h1eeG6v24gYmF5IHLhu51pIMSRaSwgY2hp4bq/bSA3LDIzJS4gQ8OzIDE0NyBraMOhY2ggaMOgbmcgdGjGsOG7nW5nIHh1ecOqbiDEkWkgY8OhYyBjaHV54bq/biBiYXkgcuG7nWkgxJFpLCBjaGnhur9tIDE1LDQxJS4gQ8OzIDgga2jDoWNoIGjDoG5nIGtow7RuZyByw7UgdGjGsOG7nW5nIHh1ecOqbiDEkWkgY8OhYyBjaHV54bq/biBiYXkgcuG7nWkgxJFpLCBjaGnhur9tIDAsNDglLg0KDQotIFLhu6dpIHJvIHTGsMahbmcgxJHhu5FpDQpgYGB7cn0NCiNU4bqnbiBz4buRIGJpw6puDQphZGRtYXJnaW5zKEEpDQpgYGANCmBgYHtyfQ0Kcmlza3JhdGlvKEEpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXkgdOG7iSBs4buHIHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIChyaXNrIHJhdGlvKSBj4bunYSBuaOG7r25nIGtow6FjaCBow6BuZyBy4budaSDEkWkgdGhlbyB0w6xuaCB0cuG6oW5nIHRoxrDhu51uZyB4dXnDqm4gxJFpIGPDoWMgY2h1eeG6v24gYmF5LiANCg0KVuG7m2kgbmjDs20gTm8gUmVjb3JkOiBU4bu3IGzhu4cgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgxrDhu5tjIHTDrW5oIGzDoCAxLjE3NDg3OS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbmjDs20gIk5vIFJlY29yZCIgY8OzIHThu7cgbOG7hyBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBjYW8gaMahbiBraG/huqNuZyAxLjE3IGzhuqduIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dSAiTm8iLiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAwLjU5Mzg1NTEgxJHhur9uIDIuMzI0Mzc0LiDEkGnhu4F1IG7DoHkgY2hvIGJp4bq/dCBy4bqxbmcgY2jDum5nIHRhIGPDsyDEkeG7mSB0aW4gY+G6rXkgOTUlIHLhurFuZyB04bu3IGzhu4cgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgdGjhu7FjIHPhu7EgbuG6sW0gdHJvbmcga2hv4bqjbmcgbsOgeS4NCg0KVuG7m2kgbmjDs20gWWVzOiBU4bu3IGzhu4cgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgxrDhu5tjIHTDrW5oIGzDoCA0LjUyOTAzNi4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbmjDs20gIlllcyIgY8OzIHThu7cgbOG7hyBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBjYW8gaMahbiBraG/huqNuZyA0LjUzIGzhuqduIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dSAiTm8iLiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAzLjUzMDM1NzMgxJHhur9uIDUuODEwMjI1LiDEkGnhu4F1IG7DoHkgY2hvIGJp4bq/dCBy4bqxbmcgY2jDum5nIHRhIGPDsyDEkeG7mSB0aW4gY+G6rXkgOTUlIHLhurFuZyB04bu3IGzhu4cgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgdGjhu7FjIHPhu7EgbuG6sW0gdHJvbmcga2hv4bqjbmcgbsOgeS4NCg0KLSBU4bu3IGzhu4cgY2jDqm5oIGzhu4djaA0KDQpgYGB7cn0NCmVwaXRhYihBLCBtZXRob2QgPSAnb2Rkc3JhdGlvJywgcmV2PSdjJykgDQpgYGANClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHThu4kgbOG7hyBjaMOqbmguIFThu7cgbOG7hyBPZGRzIFJhdGlvIGzDoCAwLjgzMjA5NjUsIGNobyB0aOG6pXkgdOG7tyBs4buHIGNow6puaCBj4bunYSBuaMOzbSAiTm8gUmVjb3JkIiB0aOG6pXAgaMahbiBzbyB24bubaSBuaMOzbSAiTm8iLiBU4bu3IGzhu4cgT2RkcyBSYXRpbyBsw6AgMC4xMjEwNDgwLCBjaG8gdGjhuqV5IHThu7cgbOG7hyBjaMOqbmggY+G7p2EgbmjDs20gIlllcyIgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmjDs20gIk5vIi4NCg0KIyMjIEJp4bq/biBwaOG7pSB0aHXhu5ljIDpURyIgdsOgIGJp4bq/biDEkeG7mWMgbOG6rXAgIkFJQyINCg0KLSBCaeG7g3UgxJHhu5MgDQpgYGB7cn0NCmdncGxvdChRVCwgYWVzKEFJQywgZmlsbCA9VEcgKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpDQpgYGANCg0KLSBC4bqjbmcgdOG6p24gc+G7kQ0KYGBge3J9DQpCIDwtIHRhYmxlKFFUJEFJQywgUVQkVEcpOyBCDQpgYGANCg0KLSBC4bqjbmcgdOG6p24gc3XhuqV0DQpgYGB7cn0NCkIxIDwtIHByb3AudGFibGUoQik7IEIxDQpgYGANCkThu7FhIHbDoG8ga+G6v3QgcXXhuqMgY+G7p2EgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCB0YSB0aOG6pXk6IEPDsyA5MiBraMOhY2ggaMOgbmcgY8OzIHRodSBuaOG6rXAgY2FvIHLhu51pIMSRaSwgY2hp4bq/bSA5LDY0JS4gQ8OzIDEwNCBraMOhY2ggaMOgbmcgY8OzIHRodSBuaOG6rXAgdGjhuqVwIHLhu51pIMSRaSwgY2hp4bq/bSAxMCw5JS4gQ8OzIDI4IGtow6FjaCBow6BuZyBjw7MgdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCBy4budaSDEkWksIGNoaeG6v20gMiw5NCUuDQoNCi0gUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkNCmBgYHtyfQ0KI1ThuqduIHPhu5EgYmnDqm4NCmFkZG1hcmdpbnMoQikNCmBgYA0KYGBge3J9DQpyaXNrcmF0aW8oQikNCmBgYA0KDQotIFThu7cgbOG7hyBjaMOqbmggbOG7h2NoDQoNCmBgYHtyfQ0KZXBpdGFiKEIsIG1ldGhvZCA9ICJvZGRzcmF0aW8iKQ0KYGBgDQpUaGVvIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSB04buJIGzhu4cgY2jDqm5oLiBU4bu3IGzhu4cgT2RkcyBSYXRpbyBsw6AgMC4yNjg1Nzg0OCwgY2hvIHRo4bqleSB04bu3IGzhu4cgY2jDqm5oIGPhu6dhIG5ow7NtICJMb3cgSW5jb21lIiB0aOG6pXAgaMahbiBzbyB24bubaSBuaMOzbSAiSGlnaCBJbmNvbWUiLiBU4bu3IGzhu4cgT2RkcyBSYXRpbyBsw6AgMC4wNTM1MjA0OCwgY2hvIHRo4bqleSB04bu3IGzhu4cgY2jDqm5oIGPhu6dhIG5ow7NtICIgTWlkZGxlIEluY29tZSIgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmjDs20gIkhpZ2ggSW5jb21lIi4NCg0KDQojIyMgQmnhur9uIHBo4bulIHRodeG7mWMgOlRHIiB2w6AgYmnhur9uIMSR4buZYyBs4bqtcCAiQVNUU00iDQoNCi0gQmnhu4N1IMSR4buTIA0KYGBge3J9DQpnZ3Bsb3QoUVQsIGFlcyhBU1RTTSwgZmlsbCA9VEcpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2RvZGdlJykNCmBgYA0KDQotIELhuqNuZyB04bqnbiBz4buRDQpgYGB7cn0NCkMgPC0gdGFibGUoUVQkQVNUU00sIFFUJFRHKTsgQw0KYGBgDQoNCi0gQuG6o25nIHThuqduIHN14bqldA0KYGBge3J9DQpDMSA8LSBwcm9wLnRhYmxlKEMpOyBDMQ0KYGBgDQpE4buxYSB2w6BvIGvhur90IHF14bqjIGPhu6dhIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgdGEgdGjhuqV5OiBDw7MgMTI1IGtow6FjaCBow6BuZyBUw6BpIGtob+G6o24gY8O0bmcgdHkgxJHGsOG7o2MgxJHhu5NuZyBi4buZIGjDs2EgduG7m2kgbeG6oW5nIHjDoyBo4buZaSBj4bunYSBo4buNIHLhu51pIMSRaSwgY2hp4bq/bSAxMywxJS4gQ8OzIDk5IFTDoGkga2hv4bqjbiBjw7RuZyB0eSBraMO0bmcgxJHGsOG7o2MgxJHhu5NuZyBi4buZIGjDs2EgduG7m2kgbeG6oW5nIHjDoyBo4buZaSBj4bunYSBo4buNIHLhu51pIMSRaSwgY2hp4bq/bSAxMCwzOCUuDQoNCi0gUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkNCmBgYHtyfQ0KI1ThuqduIHPhu5EgYmnDqm4NCmFkZG1hcmdpbnMoQykNCmBgYA0KYGBge3J9DQpyaXNrcmF0aW8oQywgcmV2ID0gImMiKQ0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHThu4kgbOG7hyBy4bunaSBybyB0xrDGoW5nIMSR4buRaSAocmlzayByYXRpbykgY+G7p2Egbmjhu69uZyBraMOhY2ggaMOgbmcga2jDtG5nIHLhu51pIMSRaSB0aGVvIHTDrG5oIHRy4bqhbmcgVMOgaSBraG/huqNuIGPDtG5nIHR5IMSRxrDhu6NjIMSR4buTbmcgYuG7mSBow7NhIHbhu5tpIG3huqFuZyB4w6MgaOG7mWkgY+G7p2EgaOG7jSBsw6AgMC45MTgyMzAzIHThu6ljIHThu7cgbOG7hyBraMOhY2ggaMOgbmcga2jDtG5nIHLhu51pIMSRaSBsw6Aga2jDoWNoIGjDoG5nIFTDoGkga2hv4bqjbiBjw7RuZyB0eSDEkcaw4bujYyDEkeG7k25nIGLhu5kgaMOzYSB24bubaSBt4bqhbmcgeMOjIGjhu5lpIGPhu6dhIGjhu40gw610IGjGoW4gdsOgIHjhuqVwIHjhu4kgYuG6sW5nIHThu7cgbOG7hyBraMOhY2ggaMOgbmcga2jDtG5nIHLhu51pIMSRaSBsw6Aga2jDoWNoIGjDoG5nIFTDoGkga2hv4bqjbiBjw7RuZyB0eSBraMO0bmcgxJHGsOG7o2MgxJHhu5NuZyBi4buZIGjDs2EgduG7m2kgbeG6oW5nIHjDoyBo4buZaSBj4bunYSBo4buNLg0KDQotIFThu7cgbOG7hyBjaMOqbmggbOG7h2NoDQoNCmBgYHtyfQ0KZXBpdGFiKEMsIG1ldGhvZCA9ICJvZGRzcmF0aW8iKQ0KYGBgDQpUaGVvIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSB04buJIGzhu4cgY2jDqm5oIGzDoCAxLjQyMzE3MiB04bupYyB04buJIGzhu4cgbmjhu69uZyBraMOhY2ggaMOgbmcga2jDtG5nIHLhu51pIMSRaS9uaOG7r25nIGtow6FjaCBow6BuZyBy4budaSDEkWkgdGh14buZYyBraMOhY2ggaMOgbmcgVMOgaSBraG/huqNuIGPDtG5nIHR5IMSRxrDhu6NjIMSR4buTbmcgYuG7mSBow7NhIHbhu5tpIG3huqFuZyB4w6MgaOG7mWkgY+G7p2EgaOG7jSBraG/huqNuZyA0LDIzJSBzbyB24bubaSB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGtow7RuZyBy4budaSDEkWkvbmjhu69uZyBraMOhY2ggaMOgbmcgcuG7nWkgxJFpIHRodeG7mWMga2jDoWNoIGjDoG5nIFTDoGkga2hv4bqjbiBjw7RuZyB0eSBraMO0bmcgxJHhu5NuZyBi4buZIGjDs2EgduG7m2kgbeG6oW5nIHjDoyBo4buZaSBj4bunYSBo4buNLg0KDQojIyMgQmnhur9uIHBo4bulIHRodeG7mWMgOlRHIiB2w6AgYmnhur9uIMSR4buZYyBs4bqtcCAiQkgiDQoNCi0gQmnhu4N1IMSR4buTIA0KYGBge3J9DQpnZ3Bsb3QoUVQsIGFlcyhCSCAsIGZpbGwgPVRHKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpDQpgYGANCg0KLSBC4bqjbmcgdOG6p24gc+G7kQ0KYGBge3J9DQpEIDwtIHRhYmxlKFFUJEJILCBRVCRURyk7IEQNCmBgYA0KDQotIELhuqNuZyB04bqnbiBzdeG6pXQNCmBgYHtyfQ0KRDEgPC0gcHJvcC50YWJsZShEKTsgRDENCmBgYA0KROG7sWEgdsOgbyBr4bq/dCBxdeG6oyBj4bunYSBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IHRhIHRo4bqleTogQ8OzIDE3NiBraMOhY2ggaMOgbmcgxJHhurd0IG5ow6Agbmdo4buJL2tow6FjaCBz4bqhbiBjw7Mgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY+G7p2EgY8O0bmcgdHkgcuG7nWkgxJFpLCBjaGnhur9tIDE4LDQ1JSUuIEPDsyA0OCBraMOhY2ggaMOgbmcgxJHhurd0IG5ow6Agbmdo4buJL2tow6FjaCBz4bqhbiBjw7Mgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY+G7p2EgY8O0bmcgdHkga2jDtG5nIHLhu51pIMSRaSwgY2hp4bq/bSA1LDAzJS4NCg0KLSBS4bunaSBybyB0xrDGoW5nIMSR4buRaQ0KYGBge3J9DQojVOG6p24gc+G7kSBiacOqbg0KYWRkbWFyZ2lucyhEKQ0KYGBgDQpgYGB7cn0NCmVwaXRhYihELCBtZXRob2QgPSAicmlza3JhdGlvIikNCmBgYA0KDQoNCi0gVOG7tyBs4buHIGNow6puaCBs4buHY2gNCg0KYGBge3J9DQpvZGRzcmF0aW8oRCwgcmV2ID0gJ2MnKQ0KYGBgDQoNCg0KIyBOaGnhu4dtIHbhu6UgMjogUGjDom4gdMOtY2ggYmnhur9uIHBo4bulIHRodeG7mWMNCg0KTmhp4buHbSB24bulOiBDaOG7jW4gMSBob+G6t2MgMiBiaeG6v24gxJHhu4tuaCB0w61uaCB2w6AgMSBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyBsw6BtIGJp4bq/biBwaOG7pSB0aHXhu5ljIMSR4buDIHBow6JuIHTDrWNoLCBnaeG6o2kgdGjDrWNoIGzDvSBkby4NCg0KIyMgQ2jhu41uIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBiaeG6v24gxJHhu4tuaCB0w61uaCANCg0KQsOgaSBuZ2hpw6puIGPhu6l1IGNo4buNbiBiaeG6v24gVEcgbMOgIGJp4bq/biBwaOG7pSB0aHXhu5ljIHbDrCB0w6FjIGdp4bqjIG114buRbiB4ZW0geMOpdCBxdXnhur90IMSR4buLbmggcuG7nWkgxJFpIGPhu6dhIGtow6FjaCBow6BuZyBz4bq9IGNo4buLdSDhuqNuaCBoxrDhu59uZyBi4bufaSBjw6FjIHnhur91IHThu5EgbsOgby4NCg0KIyMgQ2jhu41uIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZw0KDQrEkOG7kWkgduG7m2kgYmnhur9uIMSR4buLbmggbMaw4bujbmcsIHTDoWMgZ2nhuqMgY2jhu41uIGJp4bq/biBTTyBsw6BtIGJp4bq/biBwaOG7pSB0aHXhu5ljLCDEkcOieSBsw6AgYmnhur9uIGNobyBiaeG6v3QgU+G7kSBs4bqnbiBk4buLY2ggduG7pSDEkcaw4bujYyBjaOG7jW4gdHJvbmcgbmjhu69uZyBuxINtIGfhuqduIMSRw6J5LiANCg0KDQojIE5oaeG7h20gduG7pSAxOiBE4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1DQoNCk5oaeG7h20gduG7pTogVMOsbSBt4buZdCBkYXRhc2V0IGPDsyBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oLCBk4buvIGxp4buHdSDEkeG7i25oIGzGsOG7o25nLCBjw7MgdHLDqm4gNSBiaeG6v24gdsOgIG5oaeG7gXUgaMahbiAzMDAgcXVhbiBzw6F0Lg0KDQojIyBE4buvIGxp4buHdQ0KDQpE4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1IHbhu4EgbeG7mXQgY8O0bmcgdHkgZHUgbOG7i2NoIHbDoCBs4buvIGjDoG5oIMSRYW5nIG114buRbiBk4buxIMSRb8OhbiBsaeG7h3UgbeG7mXQga2jDoWNoIGjDoG5nIHPhur0gcuG7nWkgxJFpIGhheSBraMO0bmcgZOG7sWEgdHLDqm4gY8OhYyBjaOG7iSBz4buRIMSRxrDhu6NjIMSRxrBhIHJhIGTGsOG7m2kgxJHDonkuIEThu68gbGnhu4d1IG7DoHkgYmFvIGfhu5NtIHRow7RuZyB0aW4gduG7gSA5NTQga2jDoWNoIGjDoG5nLiBC4buZIGThu68gbGnhu4d1IMSRxrDhu6NjIGzhuqV5IGPhu6dhIHTDoWMgZ2nhuqMgVGVqYXNodmkgdOG7qyB3ZWJzaXRlOiBodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL3RlamFzaHZpMTQvdG91ci10cmF2ZWxzLWN1c3RvbWVyLWNodXJuLXByZWRpY3Rpb24NCg0KIyMgTcO0IHThuqMgZOG7ryBsaeG7h3UNCg0KROG7ryBsaeG7h3UgbmdoacOqbiBj4bupdSBn4buTbSA5NTQgcXVhbiBzw6F0IHbhu5tpIDcgYmnhur9uIGJhbyBn4buTbSA1IGJp4bq/biDEkeG7i25oIHTDrW5oIHbDoCAyIGJp4bq/biDEkeG7i25oIGzGsOG7o25nLg0KDQp0cm9uZyDEkcOzOg0KDQogIEJp4bq/biDEkeG7i25oIHTDrW5oDQogIA0KICAgLSBGRjogS2jDoWNoIGjDoG5nIGPDsyDEkWkgY8OhYyBjaHV54bq/biBiYXkgdGjGsOG7nW5nIHh1ecOqbiBoYXkga2jDtG5nIChZZXM6IEPDszsgTm86IEtow7RuZzsgTm8gUmVjb3JkOiBLaMO0bmcgY8OzIGjhu5Mgc8ahKQ0KICAgDQogICAtIEFJQzogTG/huqFpIHRodSBuaOG6rXAgaMOgbmcgbsSDbSBj4bunYSBraMOhY2ggaMOgbmcgKE1pZGRsZSBJbmNvbWU6IFRodSBuaOG6rXAgdHJ1bmcgYsOsbmg7IExvdyBJbmNvbWU6IFRodSBuaOG6rXAgdGjhuqVwOyBIaWdoIEluY29tZTogVGh1IG5o4bqtcCBjYW8pDQogICANCiAgIC0gQVNUU006IFTDoGkga2hv4bqjbiBjw7RuZyB0eSBj4bunYSBraMOhY2ggaMOgbmcgY8OzIMSRxrDhu6NjIMSR4buTbmcgYuG7mSBow7NhIHbhu5tpIG3huqFuZyB4w6MgaOG7mWkgY+G7p2EgaOG7jSBoYXkga2jDtG5nIChZZXM6IEPDszsgTm86IEtow7RuZykNCiAgIA0KICAgLSBCSDogS2jDoWNoIGjDoG5nIMSR4bq3dCBuaMOgIG5naOG7iS9raMOhY2ggc+G6oW4gY8OzIHPhu60gZOG7pW5nIGThu4tjaCB24bulIGPhu6dhIGPDtG5nIHR5IGhheSBraMO0bmcgKFllczogQ8OzOyBObzogS2jDtG5nKQ0KICAgDQogICAtIFRHOiBUw6xuaCB0cuG6oW5nIGtow6FjaCBow6BuZyBjw7MgcuG7nWkgxJFpIGhheSBraMO0bmcgKFllczogS2jDoWNoIGjDoG5nIHLhu51pIMSRaTsgTm86IEtow6FjaCBow6BuZyBraMO0bmcgcuG7nWkgxJFpKQ0KDQogIEJp4bq/biDEkeG7i25oIGzGsOG7o25nDQogIA0KICAgLSBBZ2U6IFPhu5EgdHXhu5VpIGPhu6dhIGtow6FjaCBow6BuZw0KICAgDQogICAtIFNPOiBT4buRIGThu4tjaCB24bulIMSRxrDhu6NjIGNo4buNbiB0cm9uZyBuaOG7r25nIG7Eg20gZ+G6p24gxJHDonkNCg0K