library(AER)
library(tidyverse)
library(DT)
library(DescTools)
library(ggplot2)
library(epitools)
data("CreditCard")
d <- CreditCard
datatable(d)

1 Giải thích biến định tính

  • Biến đầu tiên là card đại diện cho việc đơn đăng ký thẻ tín dụng của một cá nhân có được chấp nhận hay không. Nếu yes là đăng ký được chấp nhận và no là không được chấp nhận

  • Biến định tính thứ hai được chọn lựa là owner biến này phản ánh tình trạng sở hữu nhà của cá nhân. Nó cho biết liệu một cá nhân có sở hữu nhà hay không. Kết quả thu được là yes thì cá nhân có sở hữu nhà và no thì không sở hữu

  • Dựa vào đó chúng ta sẽ kiểm tra liệu việc sở hữu nhà có ảnh hưởng đến khả năng được chấp nhận thẻ tín dụng hay không.

2 Bảng tần số và đồ thị

# Thay đổi giá trị của biến `card`và owner
d$card <- recode(d$card, "yes" = "chapnhan", "no" = "tuchoi")
d$owner <- recode(d$owner, "yes" = "conha", "no" = "khongconha")
  • Trước tiên chúng ta cần thay đổi các giá trị trong biến card thay vì là kết quả là “yes” sẽ được biến đổi thành “chapnhan” đại diện cho tình trạng đơn đăng ký thẻ tín dụng được chấp nhận và ngược lại “no” tương ứng với “tuchoi”.

  • Tương tự với biến owner sẽ thay đổi “yes” thành “conha” và ngược lại “no” sẽ là “khongconha”. Để khi phân tích giữa hai biến tránh bị nhầm lẫn kết quả.

Biến card

table(d$card)%>% addmargins()
## 
##   tuchoi chapnhan      Sum 
##      296     1023     1319
c <- as.data.frame(table(d$card)) 
colnames(c) <- c("Card", "Count")
ggplot(c, aes(x = Card, y = Count, fill = Card)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ cột", x = "Tình trạng đăng ký tín dụng", y = "Số lượng") +
  theme_minimal()

  • Dựa vào kết quả bảng và đồ thị cột cho thấy Có 296 đơn đăng ký thẻ tín dụng bị từ chối trên tổng số 1319 đơn đăng ký.

  • Ngoài ra có 1023 đơn đăng ký thẻ tín dụng được chấp nhận trên tổng số 1319 đơn đăng ký.

prop.table(table(d$card)) %>% addmargins()
## 
##    tuchoi  chapnhan       Sum 
## 0.2244124 0.7755876 1.0000000
# Tính tỷ lệ phần trăm
c1 <- prop.table(table(d$card)) * 100

# Vẽ biểu đồ tròn
pie(c1, labels = paste(names(c1), round(c1, 2), "%"),
    main = "Đồ thị tròn đăng ký thẻ")

  • Dựa vào kết quả trên ta nhận thấy Có 296 đơn đăng ký thẻ tín dụng bị từ chối (no), chiếm khoảng 22.45% tổng số đơn đăng ký.

  • Có 1023 đơn đăng ký thẻ tín dụng được chấp nhận (yes), chiếm khoảng 77.55% tổng số đơn đăng ký.

Biến owner

table(d$owner) %>% as.data.frame() ->o
colnames(o)<-c("value","count")
o
##        value count
## 1 khongconha   738
## 2      conha   581
ggplot(o, aes(x = value, y = count, fill = value)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = count), vjust = -0.3, size = 3.5) +
  labs(title = "Biểu đồ cột", x = "Tình trạng", y = "Số lượng") +
  theme_minimal()

  • Dựa vào kết quả phân tích và độ thị cho thấy Có 738 cá nhân không sở hữu nhà và 581 cá nhân sở hữu nhà.
table(d$owner)  %>% prop.table() %>% addmargins()
## 
## khongconha      conha        Sum 
##  0.5595148  0.4404852  1.0000000
o1 <- prop.table(table(d$owner)) * 100
pie(o1, labels = paste(names(o1), round(o1, 2), "%"),
    main = "biểu đồ tròn")

- Trong tổng số người được khảo sát thì 738 cá nhân không sở hữu nhà chiếm khoảng 55.95% tổng số quan sát.

  • Hơn thế, những cá nhân sở hữu nhà, chiếm khoảng 44.05% tổng số quan sát.

Bảng tần số cho hai biến

d1 <- table(d$owner,d$card)
addmargins(d1)
##             
##              tuchoi chapnhan  Sum
##   khongconha    206      532  738
##   conha          90      491  581
##   Sum           296     1023 1319
barplot(d1, beside = TRUE, legend = TRUE, 
        col = c("skyblue", "lightgreen"),
        main = "Biểu đồ tần suất giữa owner và card",
        xlab = "Card",
        ylab = "Tần suất",
        names.arg = c("tuchoi", "chapnhan"))

  • Trong nhóm không sở hữu nhà, có 532 người được chấp nhận thẻ tín dụng và 206 người bị từ chối.

  • Trong nhóm sở hữu nhà, có 491 người được chấp nhận thẻ tín dụng và 90 người bị từ chối.

table(d$owner,d$card) %>% prop.table() %>% addmargins()
##             
##                  tuchoi   chapnhan        Sum
##   khongconha 0.15617892 0.40333586 0.55951478
##   conha      0.06823351 0.37225171 0.44048522
##   Sum        0.22441243 0.77558757 1.00000000
  • Tỷ lệ người không có nhà bị từ chối đơn tín dụng chiếm tỷ lệ là 15.62% trên tổng số đơn, cao hơn hơn so với tỷ lệ người có nhà bị từ chối giấy đăng ký tín dụng vì tỷ lệ này chiếm khoảng 6.8% so với tổng số đơn.

  • Tỷ lệ người không có nhà được chấp nhận đơn tín dụng chiếm tỷ lệ là 40.33 so với tổng số. Ngược lại tỷ lệ người có nhà được chấp nhận đơn tín dụng chiếm 37.2% trên tổng số đơn tín dụng đăng ký.

3 Ước lượng tỷ lệ

Ước lượng tỷ lệ đối với người sở hữu nhà

# lọc người có sở hữu nhà 
owner_card_yes <- table(d[d$owner == "conha", ]$card)
owner_card_yes
## 
##   tuchoi chapnhan 
##       90      491
  • Trước tiên ta cần lọc kết quả về tình trạng đơn đăng ký tín dụng theo nhóm người có sở hữu nhà. Kết quả thu được như trên.
# Ước lượng tỷ lệ đối với cá nhân được chấp nhận tín dụng 
prop.test(owner_card_yes["chapnhan"], sum(owner_card_yes), p = 0.7)
## 
##  1-sample proportions test with continuity correction
## 
## data:  owner_card_yes["chapnhan"] out of sum(owner_card_yes), null probability 0.7
## X-squared = 57.556, df = 1, p-value = 3.284e-14
## alternative hypothesis: true p is not equal to 0.7
## 95 percent confidence interval:
##  0.8124964 0.8730278
## sample estimates:
##         p 
## 0.8450947
  • Sau đó ước lượng tỷ lệ với giả thuyết không (H0): Tỷ lệ người chấp nhận tín dụng (p) trong nhóm sở hữu nhà là 0.7 (70%).

  • Kết quả từ kiểm định cho thấy giá trị p-value là 3.284e-14, rất gần với 0 và nhỏ hơn giá trị \(\alpha=0.05\). Điều này cho thấy có bằng chứng mạnh mẽ để bác bỏ giả thuyết rằng tỷ lệ người sở hữu thẻ tín dụng trong nhóm sở hữu nhà là 70%.

prop.test(owner_card_yes["tuchoi"], sum(owner_card_yes), p = 0.4)
## 
##  1-sample proportions test with continuity correction
## 
## data:  owner_card_yes["tuchoi"] out of sum(owner_card_yes), null probability 0.4
## X-squared = 144.4, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
##  0.1269722 0.1875036
## sample estimates:
##         p 
## 0.1549053
  • Phần này ước lượng tỷ lệ với giả thuyết không (H0): Tỷ lệ người không chấp nhận tín dụng (p) trong nhóm sở hữu nhà là 0.4 (40%).

  • Dựa trên giá trị p-value rất nhỏ so với giá trị \(\alpha=0.05\), chúng ta có đủ bằng chứng để bác bỏ giả thuyết không và kết luận rằng tỷ lệ bị từ chối tín dụng của nhóm người sở hữu nhà là khác nhau so với giả thuyết ban đầu (40%).

Ước lượng tỷ lệ đối với cá nhân không sở hữu nhà

# lọc người có sở hữu nhà 
owner_card_no <- table(d[d$owner == "khongconha", ]$card)
owner_card_no
## 
##   tuchoi chapnhan 
##      206      532
  • Lọc kết quả về tình trạng đơn đăng ký tín dụng theo nhóm người không sở hữu nhà. Kết quả thu được như trên và đã được giải thích phần lập bảng.
# Ước lượng tỷ lệ 
prop.test(owner_card_no["chapnhan"], sum(owner_card_no), p = 0.4)
## 
##  1-sample proportions test with continuity correction
## 
## data:  owner_card_no["chapnhan"] out of sum(owner_card_no), null probability 0.4
## X-squared = 315.25, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
##  0.6867260 0.7526733
## sample estimates:
##         p 
## 0.7208672
  • H0 (Giả thuyết không): Tỷ lệ chấp nhận tín dụng trong nhóm người không sở hữu nhà là bằng 40%.

  • Dựa trên kết quả ta thấy giá trị p-value rất nhỏ so với giá trị \(\alpha=0.05\), chúng ta có đủ bằng chứng để bác bỏ giả thuyết không. Kết luận rằng tỷ lệ chấp nhận tín dụng của nhóm người không sở hữu nhà là khác nhau so với giả thuyết ban đầu (40%).

prop.test(owner_card_no["tuchoi"], sum(owner_card_no), p = 0.6)
## 
##  1-sample proportions test with continuity correction
## 
## data:  owner_card_no["tuchoi"] out of sum(owner_card_no), null probability 0.6
## X-squared = 315.25, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
##  0.2473267 0.3132740
## sample estimates:
##         p 
## 0.2791328
  • Ta có giả thuyết H0: Tỷ lệ bị từ chối tín dụng trong nhóm người không sở hữu nhà là bằng 60%.

  • Với giá trị p-value rất nhỏ, chúng ta bác bỏ giả thuyết không. Do đó, chúng ta kết luận rằng tỷ lệ bị từ chối tín dụng trong nhóm người không sở hữu nhà không bằng 60%.

Ước lượng chênh lệch tỷ lệ

d_tuchoi <- d[d$card == 'tuchoi',]
d_chapnhan <- d[d$card == 'chapnhan',]

tuchoi_conha <- d_tuchoi[d_tuchoi$owner == 'conha',]
chapnhan_conha <- d_chapnhan[d_chapnhan$owner == 'conha' ,]

a <- c(nrow(d_tuchoi), nrow(d_chapnhan))
a
## [1]  296 1023
b <- c(nrow(tuchoi_conha), nrow(chapnhan_conha))
b
## [1]  90 491
prop.test(b,a)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  b out of a
## X-squared = 28.114, df = 1, p-value = 1.144e-07
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.2387763 -0.1130374
## sample estimates:
##    prop 1    prop 2 
## 0.3040541 0.4799609
  • Giả thuyết của kiểm định là tỷ lệ người sở hữu nhà bị từ chối tín dụng bằng với tỷ lệ người người sở hữu nhà được chấp nhận tín dụng

  • Giá trị p-value rất gần với 0 nhỏ hơn mức ý nghĩa 0.05, cho thấy có bằng chứng mạnh mẽ để bác bỏ giả thuyết không. Vì vậy tỷ lệ người sở hữu nhà bị từ chối tín dụng khác với tỷ lệ người người sở hữu nhà được chấp nhận tín dụng

4 Relative risk

Relative risk

addmargins(d1)
##             
##              tuchoi chapnhan  Sum
##   khongconha    206      532  738
##   conha          90      491  581
##   Sum           296     1023 1319
RelRisk(d1)
## [1] 1.801957
  • RR > 1 trong trường hợp này cho thấy rằng người không sở hữu nhà có mức độ rủi ro cao hơn so với những người sở hữu nhà đối với việc bị từ chối thẻ tín dụng.
riskratio(d1)
## $data
##             
##              tuchoi chapnhan Total
##   khongconha    206      532   738
##   conha          90      491   581
##   Total         296     1023  1319
## 
## $measure
##             risk ratio with 95% C.I.
##              estimate    lower   upper
##   khongconha 1.000000       NA      NA
##   conha      1.172331 1.107586 1.24086
## 
## $p.value
##             two-sided
##                midp.exact fisher.exact   chi.square
##   khongconha           NA           NA           NA
##   conha      5.738991e-08 6.417142e-08 7.928759e-08
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Người không sở hữu nhà có tỷ số rủi ro là 1.000, người sở hữu nhà có tỷ số rủi ro là 1.172331, với khoảng tin cậy 95% từ 1.107586 đến 1.24086.

  • Điều này có nghĩa là người sở hữu nhà có khả năng được chấp nhận tín dụng cao hơn 17.23% so với người không sở hữu nhà.

  • Giá trị p nhỏ hơn 0.05, chúng ta bác bỏ giả thuyết không rằng không có sự khác biệt về tỷ lệ chấp nhận tín dụng giữa hai nhóm.

epitab(d1, method = 'riskratio', rev = 'c')
## $tab
##             
##              chapnhan        p0 tuchoi        p1 riskratio     lower     upper
##   khongconha      532 0.7208672    206 0.2791328 1.0000000        NA        NA
##   conha           491 0.8450947     90 0.1549053 0.5549521 0.4442401 0.6932555
##             
##                   p.value
##   khongconha           NA
##   conha      6.417142e-08
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"
riskratio(d1, rev = 'c')
## $data
##             
##              chapnhan tuchoi Total
##   khongconha      532    206   738
##   conha           491     90   581
##   Total          1023    296  1319
## 
## $measure
##             risk ratio with 95% C.I.
##               estimate     lower     upper
##   khongconha 1.0000000        NA        NA
##   conha      0.5549521 0.4442401 0.6932555
## 
## $p.value
##             two-sided
##                midp.exact fisher.exact   chi.square
##   khongconha           NA           NA           NA
##   conha      5.738991e-08 6.417142e-08 7.928759e-08
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Người sở hữu nhà có tỷ số rủi ro là 0.5549521, với khoảng tin cậy 95% từ 0.4442401 đến 0.6932555.

  • Điều này có nghĩa là người sở hữu nhà có nguy cơ bị từ chối tín dụng thấp hơn 44.50% so với người không sở hữu nhà.

  • Giá trị p nhỏ hơn 0.05, chúng ta bác bỏ giả thuyết không rằng không có sự khác biệt về tỷ lệ từ chối tín dụng giữa hai nhóm.

Khoảng ước lượng cho Relative risk

m <- matrix(c(206 ,90 ,532,491),nrow = 2)
RelRisk(m, conf.level = .95)
## rel. risk    lwr.ci    upr.ci 
##  1.801957  1.445570  2.253737
  • Ước lượng cho Tỷ lệ Rủi ro Tương đối giữa nhóm không sở hữu nhà và nhóm sở hữu nhà là khoảng 1.80.

  • Khoảng tin cậy 95% cho ước lượng này là từ khoảng 1.45 đến 2.25. Điều này ngụ ý rằng có 95% khả năng rằng giá trị thực sự của Tỷ lệ Rủi ro Tương đối nằm trong khoảng từ 1.45 đến 2.25.

5 Odd ratio

OddsRatio(d1)
## [1] 2.11249
oddsratio(d1)
## $data
##             
##              tuchoi chapnhan Total
##   khongconha    206      532   738
##   conha          90      491   581
##   Total         296     1023  1319
## 
## $measure
##             odds ratio with 95% C.I.
##              estimate   lower    upper
##   khongconha  1.00000      NA       NA
##   conha       2.10957 1.60448 2.791356
## 
## $p.value
##             two-sided
##                midp.exact fisher.exact   chi.square
##   khongconha           NA           NA           NA
##   conha      5.738991e-08 6.417142e-08 7.928759e-08
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
  • Odds Ratio: Người sở hữu nhà có tỷ lệ chấp nhận tín dụng cao gấp 2.11 lần so với người không sở hữu nhà.

  • Ý nghĩa thống kê: Giá trị p rất nhỏ cho thấy sự khác biệt này là có ý nghĩa thống kê.

  • Khoảng tin cậy: Khoảng tin cậy 95% (từ 1.60448 đến 2.791356) không chứa giá trị 1, củng cố thêm sự tin cậy vào kết quả này.

oddsratio(d1, rev = 'c')
## $data
##             
##              chapnhan tuchoi Total
##   khongconha      532    206   738
##   conha           491     90   581
##   Total          1023    296  1319
## 
## $measure
##             odds ratio with 95% C.I.
##               estimate     lower     upper
##   khongconha 1.0000000        NA        NA
##   conha      0.4740542 0.3582489 0.6232548
## 
## $p.value
##             two-sided
##                midp.exact fisher.exact   chi.square
##   khongconha           NA           NA           NA
##   conha      5.738991e-08 6.417142e-08 7.928759e-08
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
  • Người sở hữu nhà có odds ratio là 0.4740542, với khoảng tin cậy 95% từ 0.3582489 đến 0.6232548. Điều này có nghĩa là người sở hữu nhà có tỷ lệ bị từ chối tín dụng thấp hơn so với người không sở hữu nhà. Khoảng tin cậy không chứa giá trị 1, cho thấy sự khác biệt này là có ý nghĩa thống kê.

  • Các giá trị p (p-values) cho người sở hữu nhà là rất nhỏ 5,74.10^-8, cho thấy sự khác biệt về tỷ lệ bị từ chối tín dụng giữa người sở hữu nhà và người không sở hữu nhà là rất có ý nghĩa thống kê. Giá trị p nhỏ hơn 0.05, chúng ta bác bỏ giả thuyết không rằng không có sự khác biệt về tỷ lệ bị từ chối tín dụng giữa hai nhóm.

epitab(d1, method = 'oddsratio')
## $tab
##             
##              tuchoi        p0 chapnhan        p1 oddsratio    lower    upper
##   khongconha    206 0.6959459      532 0.5200391   1.00000       NA       NA
##   conha          90 0.3040541      491 0.4799609   2.11249 1.602406 2.784944
##             
##                   p.value
##   khongconha           NA
##   conha      6.417142e-08
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"
  • Odds Ratio cho người sở hữu nhà là 2.11249. Điều này có nghĩa là người sở hữu nhà có tỷ lệ bị chấp nhận tín dụng cao hơn 2.11249 lần so với người không sở hữu nhà.
  • Khoảng Tin Cậy 95% (95% Confidence Interval): từ 1.60 đến 2.78 Khoảng tin cậy này không chứa giá trị 1, cho thấy sự khác biệt về tỷ lệ bị chấp nhận tín dụng giữa hai nhóm là có ý nghĩa thống kê.
LS0tDQp0aXRsZTogIkLDoGkgdOG6rXAiDQphdXRob3I6ICJMw6ogVGjDoG5oIMSQ4bq3bmctIDIxMjEwMTI5NDYiDQpkYXRlOiAiMjAyNC0wNi0wMSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2RlcHRoOiA1DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IHVuaXRlZA0KDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7Y3NzLGVjaG8gPSBGQUxTRX0NCmgxIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMzJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQNCiAgfQ0KDQpoMiB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDI4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KIA0KfQ0KDQpoMyB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXN0eWxlOiBpdGFsaWM7DQp9DQoNCmg0IHtmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LXN0eWxlOiBpdGFsaWN9DQoNCmJvZHkgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAxOHB4Ow0KICANCn0NCnA6bm90KGgxKTpub3QoaDIpOm5vdChoMyk6bm90KGg0KTpub3QoaDUpIHsNCiAgdGV4dC1pbmRlbnQ6IDJlbTt9DQpwIHsNCiAgdGV4dC1hbGlnbjoganVzdGlmeTsNCiAgfQ0KLnRvY2lmeS1oZWFkZXIgew0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KYGBgDQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KEFFUikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShlcGl0b29scykNCmRhdGEoIkNyZWRpdENhcmQiKQ0KZCA8LSBDcmVkaXRDYXJkDQpkYXRhdGFibGUoZCkNCmBgYA0KIyBHaeG6o2kgdGjDrWNoIGJp4bq/biDEkeG7i25oIHTDrW5oIA0KDQotIEJp4bq/biDEkeG6p3UgdGnDqm4gbMOgICpjYXJkKiDEkeG6oWkgZGnhu4duIGNobyB2aeG7h2MgxJHGoW4gxJHEg25nIGvDvSB0aOG6uyB0w61uIGThu6VuZyBj4bunYSBt4buZdCBjw6EgbmjDom4gY8OzIMSRxrDhu6NjIGNo4bqlcCBuaOG6rW4gaGF5IGtow7RuZy4gTuG6v3UgKnllcyogbMOgIMSRxINuZyBrw70gxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiB2w6AgKm5vKiBsw6Aga2jDtG5nIMSRxrDhu6NjIGNo4bqlcCBuaOG6rW4NCg0KLSBCaeG6v24gxJHhu4tuaCB0w61uaCB0aOG7qSBoYWkgxJHGsOG7o2MgY2jhu41uIGzhu7FhIGzDoCAqb3duZXIqIGJp4bq/biBuw6B5IHBo4bqjbiDDoW5oIHTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgIGPhu6dhIGPDoSBuaMOibi4gTsOzIGNobyBiaeG6v3QgbGnhu4d1IG3hu5l0IGPDoSBuaMOibiBjw7Mgc+G7nyBo4buvdSBuaMOgIGhheSBraMO0bmcuIEvhur90IHF14bqjIHRodSDEkcaw4bujYyBsw6AgKnllcyogdGjDrCBjw6EgbmjDom4gY8OzIHPhu58gaOG7r3UgbmjDoCB2w6AgKm5vKiB0aMOsIGtow7RuZyBz4bufIGjhu691IA0KDQotIEThu7FhIHbDoG8gxJHDsyBjaMO6bmcgdGEgc+G6vSBraeG7g20gdHJhIGxp4buHdSB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiB0aOG6uyB0w61uIGThu6VuZyBoYXkga2jDtG5nLg0KDQojIELhuqNuZyB04bqnbiBz4buRIHbDoCDEkeG7kyB0aOG7iw0KIA0KYGBge3J9IA0KIyBUaGF5IMSR4buVaSBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBgY2FyZGB2w6Agb3duZXINCmQkY2FyZCA8LSByZWNvZGUoZCRjYXJkLCAieWVzIiA9ICJjaGFwbmhhbiIsICJubyIgPSAidHVjaG9pIikNCmQkb3duZXIgPC0gcmVjb2RlKGQkb3duZXIsICJ5ZXMiID0gImNvbmhhIiwgIm5vIiA9ICJraG9uZ2NvbmhhIikNCmBgYA0KDQotIFRyxrDhu5tjIHRpw6puIGNow7puZyB0YSBj4bqnbiB0aGF5IMSR4buVaSBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgYmnhur9uIGBjYXJkYCB0aGF5IHbDrCBsw6Aga+G6v3QgcXXhuqMgbMOgICJ5ZXMiIHPhur0gxJHGsOG7o2MgYmnhur9uIMSR4buVaSB0aMOgbmggImNoYXBuaGFuIiDEkeG6oWkgZGnhu4duIGNobyB0w6xuaCB0cuG6oW5nIMSRxqFuIMSRxINuZyBrw70gdGjhursgdMOtbiBk4bulbmcgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiB2w6AgbmfGsOG7o2MgbOG6oWkgIm5vIiB0xrDGoW5nIOG7qW5nIHbhu5tpICJ0dWNob2kiLg0KDQotIFTGsMahbmcgdOG7sSB24bubaSBiaeG6v24gYG93bmVyYCBz4bq9IHRoYXkgxJHhu5VpICJ5ZXMiIHRow6BuaCAiY29uaGEiIHbDoCBuZ8aw4bujYyBs4bqhaSAibm8iIHPhur0gbMOgICJraG9uZ2NvbmhhIi4gxJDhu4Mga2hpIHBow6JuIHTDrWNoIGdp4buvYSBoYWkgYmnhur9uIHRyw6FuaCBi4buLIG5o4bqnbSBs4bqrbiBr4bq/dCBxdeG6oy4NCg0KKipCaeG6v24gY2FyZCoqDQoNCmBgYHtyfQ0KdGFibGUoZCRjYXJkKSU+JSBhZGRtYXJnaW5zKCkNCmMgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkJGNhcmQpKSANCmNvbG5hbWVzKGMpIDwtIGMoIkNhcmQiLCAiQ291bnQiKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChjLCBhZXMoeCA9IENhcmQsIHkgPSBDb3VudCwgZmlsbCA9IENhcmQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IiwgeCA9ICJUw6xuaCB0cuG6oW5nIMSRxINuZyBrw70gdMOtbiBk4bulbmciLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCi0gROG7sWEgdsOgbyBr4bq/dCBxdeG6oyBi4bqjbmcgdsOgIMSR4buTIHRo4buLIGPhu5l0IGNobyB0aOG6pXkgQ8OzIDI5NiDEkcahbiDEkcSDbmcga8O9IHRo4bq7IHTDrW4gZOG7pW5nIGLhu4sgdOG7qyBjaOG7kWkgdHLDqm4gdOG7lW5nIHPhu5EgMTMxOSDEkcahbiDEkcSDbmcga8O9LiAgDQoNCi0gTmdvw6BpIHJhIGPDsyAxMDIzIMSRxqFuIMSRxINuZyBrw70gdGjhursgdMOtbiBk4bulbmcgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiB0csOqbiB04buVbmcgc+G7kSAxMzE5IMSRxqFuIMSRxINuZyBrw70uIA0KDQpgYGB7cn0NCnByb3AudGFibGUodGFibGUoZCRjYXJkKSkgJT4lIGFkZG1hcmdpbnMoKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KIyBUw61uaCB04bu3IGzhu4cgcGjhuqduIHRyxINtDQpjMSA8LSBwcm9wLnRhYmxlKHRhYmxlKGQkY2FyZCkpICogMTAwDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCnBpZShjMSwgbGFiZWxzID0gcGFzdGUobmFtZXMoYzEpLCByb3VuZChjMSwgMiksICIlIiksDQogICAgbWFpbiA9ICLEkOG7kyB0aOG7iyB0csOybiDEkcSDbmcga8O9IHRo4bq7IikNCmBgYA0KDQotIEThu7FhIHbDoG8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgbmjhuq1uIHRo4bqleSBDw7MgMjk2IMSRxqFuIMSRxINuZyBrw70gdGjhursgdMOtbiBk4bulbmcgYuG7iyB04burIGNo4buRaSAobm8pLCBjaGnhur9tIGtob+G6o25nIDIyLjQ1JSB04buVbmcgc+G7kSDEkcahbiDEkcSDbmcga8O9Lg0KDQotIEPDsyAxMDIzIMSRxqFuIMSRxINuZyBrw70gdGjhursgdMOtbiBk4bulbmcgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiAoeWVzKSwgY2hp4bq/bSBraG/huqNuZyA3Ny41NSUgdOG7lW5nIHPhu5EgxJHGoW4gxJHEg25nIGvDvS4NCg0KKipCaeG6v24gb3duZXIqKg0KDQpgYGB7cn0NCnRhYmxlKGQkb3duZXIpICU+JSBhcy5kYXRhLmZyYW1lKCkgLT5vDQpjb2xuYW1lcyhvKTwtYygidmFsdWUiLCJjb3VudCIpDQpvDQpnZ3Bsb3QobywgYWVzKHggPSB2YWx1ZSwgeSA9IGNvdW50LCBmaWxsID0gdmFsdWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3VudCksIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDMuNSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCIsIHggPSAiVMOsbmggdHLhuqFuZyIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KLSBE4buxYSB2w6BvIGvhur90IHF14bqjIHBow6JuIHTDrWNoIHbDoCDEkeG7mSB0aOG7iyBjaG8gdGjhuqV5IEPDsyA3MzggY8OhIG5ow6JuIGtow7RuZyBz4bufIGjhu691IG5ow6AgdsOgIDU4MSBjw6EgbmjDom4gc+G7nyBo4buvdSBuaMOgLg0KDQpgYGB7cn0NCnRhYmxlKGQkb3duZXIpICAlPiUgcHJvcC50YWJsZSgpICU+JSBhZGRtYXJnaW5zKCkNCm8xIDwtIHByb3AudGFibGUodGFibGUoZCRvd25lcikpICogMTAwDQpwaWUobzEsIGxhYmVscyA9IHBhc3RlKG5hbWVzKG8xKSwgcm91bmQobzEsIDIpLCAiJSIpLA0KICAgIG1haW4gPSAiYmnhu4N1IMSR4buTIHRyw7JuIikNCg0KYGBgDQotIFRyb25nIHThu5VuZyBz4buRIG5nxrDhu51pIMSRxrDhu6NjIGto4bqjbyBzw6F0IHRow6wgNzM4IGPDoSBuaMOibiBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGNoaeG6v20ga2hv4bqjbmcgNTUuOTUlIHThu5VuZyBz4buRIHF1YW4gc8OhdC4NCg0KLSBIxqFuIHRo4bq/LCBuaOG7r25nIGPDoSBuaMOibiBz4bufIGjhu691IG5ow6AsIGNoaeG6v20ga2hv4bqjbmcgNDQuMDUlIHThu5VuZyBz4buRIHF1YW4gc8OhdC4NCg0KKipC4bqjbmcgdOG6p24gc+G7kSBjaG8gaGFpIGJp4bq/bioqDQoNCmBgYHtyfQ0KZDEgPC0gdGFibGUoZCRvd25lcixkJGNhcmQpDQphZGRtYXJnaW5zKGQxKQ0KYGBgDQpgYGB7cn0NCmJhcnBsb3QoZDEsIGJlc2lkZSA9IFRSVUUsIGxlZ2VuZCA9IFRSVUUsIA0KICAgICAgICBjb2wgPSBjKCJza3libHVlIiwgImxpZ2h0Z3JlZW4iKSwNCiAgICAgICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IGdp4buvYSBvd25lciB2w6AgY2FyZCIsDQogICAgICAgIHhsYWIgPSAiQ2FyZCIsDQogICAgICAgIHlsYWIgPSAiVOG6p24gc3XhuqV0IiwNCiAgICAgICAgbmFtZXMuYXJnID0gYygidHVjaG9pIiwgImNoYXBuaGFuIikpDQpgYGANCg0KLSBUcm9uZyBuaMOzbSBraMO0bmcgc+G7nyBo4buvdSBuaMOgLCBjw7MgNTMyIG5nxrDhu51pIMSRxrDhu6NjIGNo4bqlcCBuaOG6rW4gdGjhursgdMOtbiBk4bulbmcgdsOgIDIwNiBuZ8aw4budaSBi4buLIHThu6sgY2jhu5FpLg0KDQotIFRyb25nIG5ow7NtIHPhu58gaOG7r3UgbmjDoCwgY8OzIDQ5MSBuZ8aw4budaSDEkcaw4bujYyBjaOG6pXAgbmjhuq1uIHRo4bq7IHTDrW4gZOG7pW5nIHbDoCA5MCBuZ8aw4budaSBi4buLIHThu6sgY2jhu5FpLg0KDQpgYGB7cn0NCnRhYmxlKGQkb3duZXIsZCRjYXJkKSAlPiUgcHJvcC50YWJsZSgpICU+JSBhZGRtYXJnaW5zKCkNCmBgYA0KDQotIFThu7cgbOG7hyBuZ8aw4budaSBraMO0bmcgY8OzIG5ow6AgYuG7iyB04burIGNo4buRaSDEkcahbiB0w61uIGThu6VuZyBjaGnhur9tIHThu7cgbOG7hyBsw6AgMTUuNjIlIHRyw6puIHThu5VuZyBz4buRIMSRxqFuLCBjYW8gaMahbiBoxqFuIHNvIHbhu5tpIHThu7cgbOG7hyBuZ8aw4budaSBjw7MgbmjDoCBi4buLIHThu6sgY2jhu5FpIGdp4bqleSDEkcSDbmcga8O9IHTDrW4gZOG7pW5nIHbDrCB04bu3IGzhu4cgbsOgeSBjaGnhur9tIGtob+G6o25nIDYuOCUgc28gduG7m2kgdOG7lW5nIHPhu5EgxJHGoW4uICANCg0KLSBU4bu3IGzhu4cgbmfGsOG7nWkga2jDtG5nIGPDsyBuaMOgIMSRxrDhu6NjIGNo4bqlcCBuaOG6rW4gxJHGoW4gdMOtbiBk4bulbmcgY2hp4bq/bSB04bu3IGzhu4cgbMOgIDQwLjMzIHNvIHbhu5tpIHThu5VuZyBz4buRLiBOZ8aw4bujYyBs4bqhaSB04bu3IGzhu4cgbmfGsOG7nWkgY8OzIG5ow6AgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiDEkcahbiB0w61uIGThu6VuZyBjaGnhur9tIDM3LjIlIHRyw6puIHThu5VuZyBz4buRIMSRxqFuIHTDrW4gZOG7pW5nIMSRxINuZyBrw70uDQoNCiMgxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyANCg0KKirGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIMSR4buRaSB24bubaSBuZ8aw4budaSBz4bufIGjhu691IG5ow6AqKiANCmBgYHtyfQ0KIyBs4buNYyBuZ8aw4budaSBjw7Mgc+G7nyBo4buvdSBuaMOgIA0Kb3duZXJfY2FyZF95ZXMgPC0gdGFibGUoZFtkJG93bmVyID09ICJjb25oYSIsIF0kY2FyZCkNCm93bmVyX2NhcmRfeWVzDQpgYGANCg0KLSBUcsaw4bubYyB0acOqbiB0YSBj4bqnbiBs4buNYyBr4bq/dCBxdeG6oyB24buBIHTDrG5oIHRy4bqhbmcgxJHGoW4gxJHEg25nIGvDvSB0w61uIGThu6VuZyB0aGVvIG5ow7NtIG5nxrDhu51pIGPDsyBz4bufIGjhu691IG5ow6AuIEvhur90IHF14bqjIHRodSDEkcaw4bujYyBuaMawIHRyw6puLiANCg0KYGBge3J9DQojIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgxJHhu5FpIHbhu5tpIGPDoSBuaMOibiDEkcaw4bujYyBjaOG6pXAgbmjhuq1uIHTDrW4gZOG7pW5nIA0KcHJvcC50ZXN0KG93bmVyX2NhcmRfeWVzWyJjaGFwbmhhbiJdLCBzdW0ob3duZXJfY2FyZF95ZXMpLCBwID0gMC43KQ0KYGBgDQoNCi0gU2F1IMSRw7MgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hyB24bubaSBnaeG6oyB0aHV54bq/dCBraMO0bmcgKEgwKTogVOG7tyBs4buHIG5nxrDhu51pIGNo4bqlcCBuaOG6rW4gdMOtbiBk4bulbmcgKHApIHRyb25nIG5ow7NtIHPhu58gaOG7r3UgbmjDoCBsw6AgMC43ICg3MCUpLg0KDQotIEvhur90IHF14bqjIHThu6sga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBnacOhIHRy4buLIHAtdmFsdWUgbMOgIDMuMjg0ZS0xNCwgcuG6pXQgZ+G6p24gduG7m2kgMCB2w6Agbmjhu48gaMahbiBnacOhIHRy4buLICRcYWxwaGE9MC4wNSQuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDsyBi4bqxbmcgY2jhu6luZyBt4bqhbmggbeG6vSDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgcuG6sW5nIHThu7cgbOG7hyBuZ8aw4budaSBz4bufIGjhu691IHRo4bq7IHTDrW4gZOG7pW5nIHRyb25nIG5ow7NtIHPhu58gaOG7r3UgbmjDoCBsw6AgNzAlLg0KDQpgYGB7cn0NCnByb3AudGVzdChvd25lcl9jYXJkX3llc1sidHVjaG9pIl0sIHN1bShvd25lcl9jYXJkX3llcyksIHAgPSAwLjQpDQpgYGANCg0KLSBQaOG6p24gbsOgeSDGsOG7m2MgbMaw4bujbmcgdOG7tyBs4buHIHbhu5tpIGdp4bqjIHRodXnhur90IGtow7RuZyAoSDApOiBU4bu3IGzhu4cgbmfGsOG7nWkga2jDtG5nIGNo4bqlcCBuaOG6rW4gdMOtbiBk4bulbmcgKHApIHRyb25nIG5ow7NtIHPhu58gaOG7r3UgbmjDoCBsw6AgMC40ICg0MCUpLg0KDQotIEThu7FhIHRyw6puIGdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBuaOG7jyBzbyB24bubaSBnacOhIHRy4buLICRcYWxwaGE9MC4wNSQsIGNow7puZyB0YSBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyB2w6Aga+G6v3QgbHXhuq1uIHLhurFuZyB04bu3IGzhu4cgYuG7iyB04burIGNo4buRaSB0w61uIGThu6VuZyBj4bunYSBuaMOzbSBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgbMOgIGtow6FjIG5oYXUgc28gduG7m2kgZ2nhuqMgdGh1eeG6v3QgYmFuIMSR4bqndSAoNDAlKS4NCg0KDQoqKsav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgxJHhu5FpIHbhu5tpIGPDoSBuaMOibiBraMO0bmcgc+G7nyBo4buvdSBuaMOgKioNCg0KYGBge3J9DQojIGzhu41jIG5nxrDhu51pIGPDsyBz4bufIGjhu691IG5ow6AgDQpvd25lcl9jYXJkX25vIDwtIHRhYmxlKGRbZCRvd25lciA9PSAia2hvbmdjb25oYSIsIF0kY2FyZCkNCm93bmVyX2NhcmRfbm8NCmBgYA0KDQotIEzhu41jIGvhur90IHF14bqjIHbhu4EgdMOsbmggdHLhuqFuZyDEkcahbiDEkcSDbmcga8O9IHTDrW4gZOG7pW5nIHRoZW8gbmjDs20gbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoC4gS+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIG5oxrAgdHLDqm4gdsOgIMSRw6MgxJHGsOG7o2MgZ2nhuqNpIHRow61jaCBwaOG6p24gbOG6rXAgYuG6o25nLg0KDQpgYGB7cn0NCiMgxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyANCnByb3AudGVzdChvd25lcl9jYXJkX25vWyJjaGFwbmhhbiJdLCBzdW0ob3duZXJfY2FyZF9ubyksIHAgPSAwLjQpDQpgYGANCg0KLSBIMCAoR2nhuqMgdGh1eeG6v3Qga2jDtG5nKTogVOG7tyBs4buHIGNo4bqlcCBuaOG6rW4gdMOtbiBk4bulbmcgdHJvbmcgbmjDs20gbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBsw6AgYuG6sW5nIDQwJS4NCg0KLSBE4buxYSB0csOqbiBr4bq/dCBxdeG6oyB0YSB0aOG6pXkgZ2nDoSB0cuG7iyBwLXZhbHVlIHLhuqV0IG5o4buPIHNvIHbhu5tpIGdpw6EgdHLhu4sgJFxhbHBoYT0wLjA1JCwgY2jDum5nIHRhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nLiBL4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBjaOG6pXAgbmjhuq1uIHTDrW4gZOG7pW5nIGPhu6dhIG5ow7NtIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgbMOgIGtow6FjIG5oYXUgc28gduG7m2kgZ2nhuqMgdGh1eeG6v3QgYmFuIMSR4bqndSAoNDAlKS4NCg0KDQpgYGB7cn0NCnByb3AudGVzdChvd25lcl9jYXJkX25vWyJ0dWNob2kiXSwgc3VtKG93bmVyX2NhcmRfbm8pLCBwID0gMC42KQ0KYGBgDQoNCi0gVGEgY8OzIGdp4bqjIHRodXnhur90IEgwOiBU4bu3IGzhu4cgYuG7iyB04burIGNo4buRaSB0w61uIGThu6VuZyB0cm9uZyBuaMOzbSBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGzDoCBi4bqxbmcgNjAlLg0KDQotIFbhu5tpIGdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBuaOG7jywgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcuIERvIMSRw7MsIGNow7puZyB0YSBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBi4buLIHThu6sgY2jhu5FpIHTDrW4gZOG7pW5nIHRyb25nIG5ow7NtIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6Aga2jDtG5nIGLhurFuZyA2MCUuDQoNCg0KKirGr+G7m2MgbMaw4bujbmcgY2jDqm5oIGzhu4djaCB04bu3IGzhu4cgKiogDQoNCmBgYHtyfQ0KZF90dWNob2kgPC0gZFtkJGNhcmQgPT0gJ3R1Y2hvaScsXQ0KZF9jaGFwbmhhbiA8LSBkW2QkY2FyZCA9PSAnY2hhcG5oYW4nLF0NCg0KdHVjaG9pX2NvbmhhIDwtIGRfdHVjaG9pW2RfdHVjaG9pJG93bmVyID09ICdjb25oYScsXQ0KY2hhcG5oYW5fY29uaGEgPC0gZF9jaGFwbmhhbltkX2NoYXBuaGFuJG93bmVyID09ICdjb25oYScgLF0NCg0KYSA8LSBjKG5yb3coZF90dWNob2kpLCBucm93KGRfY2hhcG5oYW4pKQ0KYQ0KYiA8LSBjKG5yb3codHVjaG9pX2NvbmhhKSwgbnJvdyhjaGFwbmhhbl9jb25oYSkpDQpiDQpwcm9wLnRlc3QoYixhKQ0KYGBgDQoNCi0gR2nhuqMgdGh1eeG6v3QgY+G7p2Ega2nhu4NtIMSR4buLbmggbMOgIHThu7cgbOG7hyBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgYuG7iyB04burIGNo4buRaSB0w61uIGThu6VuZyBi4bqxbmcgduG7m2kgdOG7tyBs4buHIG5nxrDhu51pIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCDEkcaw4bujYyBjaOG6pXAgbmjhuq1uIHTDrW4gZOG7pW5nIA0KDQotIEdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBn4bqnbiB24bubaSAwIG5o4buPIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUsIGNobyB0aOG6pXkgY8OzIGLhurFuZyBjaOG7qW5nIG3huqFuaCBt4bq9IMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcuIFbDrCB24bqteSB04bu3IGzhu4cgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGLhu4sgdOG7qyBjaOG7kWkgdMOtbiBk4bulbmcga2jDoWMgduG7m2kgdOG7tyBs4buHIG5nxrDhu51pIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCDEkcaw4bujYyBjaOG6pXAgbmjhuq1uIHTDrW4gZOG7pW5nDQoNCiMgUmVsYXRpdmUgcmlzaw0KDQoqKlJlbGF0aXZlIHJpc2sqKg0KYGBge3J9DQphZGRtYXJnaW5zKGQxKQ0KUmVsUmlzayhkMSkNCg0KYGBgDQotIFJSID4gMSB0cm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGPDsyBt4bupYyDEkeG7mSBy4bunaSBybyBjYW8gaMahbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCDEkeG7kWkgduG7m2kgdmnhu4djIGLhu4sgdOG7qyBjaOG7kWkgdGjhursgdMOtbiBk4bulbmcuDQpgYGB7cn0NCnJpc2tyYXRpbyhkMSkNCmBgYA0KDQotIE5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgY8OzIHThu7cgc+G7kSBy4bunaSBybyBsw6AgMS4wMDAsIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjw7MgdOG7tyBz4buRIHLhu6dpIHJvIGzDoCAxLjE3MjMzMSwgduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JSB04burIDEuMTA3NTg2IMSR4bq/biAxLjI0MDg2Lg0KDQotIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgY8OzIGto4bqjIG7Eg25nIMSRxrDhu6NjIGNo4bqlcCBuaOG6rW4gdMOtbiBk4bulbmcgY2FvIGjGoW4gMTcuMjMlIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AuDQoNCi0gR2nDoSB0cuG7iyBwIG5o4buPIGjGoW4gMC4wNSwgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgcuG6sW5nIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgY2jhuqVwIG5o4bqtbiB0w61uIGThu6VuZyBnaeG7r2EgaGFpIG5ow7NtLg0KDQpgYGB7cn0NCmVwaXRhYihkMSwgbWV0aG9kID0gJ3Jpc2tyYXRpbycsIHJldiA9ICdjJykNCmBgYA0KDQpgYGB7cn0NCnJpc2tyYXRpbyhkMSwgcmV2ID0gJ2MnKQ0KYGBgDQoNCi0gTmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGPDsyB04bu3IHPhu5EgcuG7p2kgcm8gbMOgIDAuNTU0OTUyMSwgduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JSB04burIDAuNDQ0MjQwMSDEkeG6v24gMC42OTMyNTU1Lg0KDQotIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgY8OzIG5ndXkgY8ahIGLhu4sgdOG7qyBjaOG7kWkgdMOtbiBk4bulbmcgdGjhuqVwIGjGoW4gNDQuNTAlIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AuIA0KDQotIEdpw6EgdHLhu4sgcCBuaOG7jyBoxqFuIDAuMDUsIGNow7puZyB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIHLhurFuZyBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIHThu6sgY2jhu5FpIHTDrW4gZOG7pW5nIGdp4buvYSBoYWkgbmjDs20uDQoNCg0KDQoNCioqS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIGNobyBSZWxhdGl2ZSByaXNrKioNCmBgYHtyfQ0KbSA8LSBtYXRyaXgoYygyMDYgLDkwICw1MzIsNDkxKSxucm93ID0gMikNClJlbFJpc2sobSwgY29uZi5sZXZlbCA9IC45NSkNCmBgYA0KLSDGr+G7m2MgbMaw4bujbmcgY2hvIFThu7cgbOG7hyBS4bunaSBybyBUxrDGoW5nIMSR4buRaSBnaeG7r2EgbmjDs20ga2jDtG5nIHPhu58gaOG7r3UgbmjDoCB2w6AgbmjDs20gc+G7nyBo4buvdSBuaMOgIGzDoCBraG/huqNuZyAxLjgwLg0KDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIMaw4bubYyBsxrDhu6NuZyBuw6B5IGzDoCB04burIGtob+G6o25nIDEuNDUgxJHhur9uIDIuMjUuIMSQaeG7gXUgbsOgeSBuZ+G7pSDDvSBy4bqxbmcgY8OzIDk1JSBraOG6oyBuxINuZyBy4bqxbmcgZ2nDoSB0cuG7iyB0aOG7sWMgc+G7sSBj4bunYSBU4bu3IGzhu4cgUuG7p2kgcm8gVMawxqFuZyDEkeG7kWkgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAxLjQ1IMSR4bq/biAyLjI1Lg0KDQojIE9kZCByYXRpbyANCmBgYHtyfQ0KT2Rkc1JhdGlvKGQxKQ0KYGBgDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKGQxKQ0KYGBgDQotIE9kZHMgUmF0aW86IE5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjw7MgdOG7tyBs4buHIGNo4bqlcCBuaOG6rW4gdMOtbiBk4bulbmcgY2FvIGfhuqVwIDIuMTEgbOG6p24gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoC4NCg0KLSDDnSBuZ2jEqWEgdGjhu5FuZyBrw6o6IEdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15OiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlICh04burIDEuNjA0NDggxJHhur9uIDIuNzkxMzU2KSBraMO0bmcgY2jhu6lhIGdpw6EgdHLhu4sgMSwgY+G7p25nIGPhu5EgdGjDqm0gc+G7sSB0aW4gY+G6rXkgdsOgbyBr4bq/dCBxdeG6oyBuw6B5Lg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhkMSwgcmV2ID0gJ2MnKQ0KYGBgDQoNCi0gTmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGPDsyBvZGRzIHJhdGlvIGzDoCAwLjQ3NDA1NDIsIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAwLjM1ODI0ODkgxJHhur9uIDAuNjIzMjU0OC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjw7MgdOG7tyBs4buHIGLhu4sgdOG7qyBjaOG7kWkgdMOtbiBk4bulbmcgdGjhuqVwIGjGoW4gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoC4gS2hv4bqjbmcgdGluIGPhuq15IGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAxLCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCi0gQ8OhYyBnacOhIHRy4buLIHAgKHAtdmFsdWVzKSBjaG8gbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGzDoCBy4bqldCBuaOG7jyA1LDc0LjEwXi04LCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIGLhu4sgdOG7qyBjaOG7kWkgdMOtbiBk4bulbmcgZ2nhu69hIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCB2w6AgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBsw6AgcuG6pXQgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gR2nDoSB0cuG7iyBwIG5o4buPIGjGoW4gMC4wNSwgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgcuG6sW5nIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgYuG7iyB04burIGNo4buRaSB0w61uIGThu6VuZyBnaeG7r2EgaGFpIG5ow7NtLg0KDQpgYGB7cn0NCmVwaXRhYihkMSwgbWV0aG9kID0gJ29kZHNyYXRpbycpDQpgYGANCi0gT2RkcyBSYXRpbyBjaG8gbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGzDoCAyLjExMjQ5LiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGPDsyB04bu3IGzhu4cgYuG7iyBjaOG6pXAgbmjhuq1uIHTDrW4gZOG7pW5nIGNhbyBoxqFuIDIuMTEyNDkgbOG6p24gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoC4NCi0gS2hv4bqjbmcgVGluIEPhuq15IDk1JSAoOTUlIENvbmZpZGVuY2UgSW50ZXJ2YWwpOiB04burIDEuNjAgxJHhur9uIDIuNzgNCktob+G6o25nIHRpbiBj4bqteSBuw6B5IGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAxLCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIGLhu4sgY2jhuqVwIG5o4bqtbiB0w61uIGThu6VuZyBnaeG7r2EgaGFpIG5ow7NtIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0K