PHẦN 1: TÌM HIỂU VÀ CHUẨN BỊ DỮ LIỆU


1.1. Đọc và tìm hiểu cấu trúc file dữ liệu

library(tidyverse)
library(dplyr)
library(knitr)
data <- read.csv(file='C:/Users/Admin/Downloads/data w4.csv', header = T)

#hiển thị cấu trúc dữ liệu
str(data)
## 'data.frame':    14962 obs. of  8 variables:
##  $ Age          : int  39 38 31 23 32 25 32 43 54 59 ...
##  $ WorkClass    : chr  " State-gov" " Private" " Private" " Private" ...
##  $ Education    : chr  " Bachelors" " HS-grad" " Masters" " Bachelors" ...
##  $ MaritalStatus: chr  " Never-married" " Divorced" " Never-married" " Never-married" ...
##  $ Occupation   : chr  " Adm-clerical" " Handlers-cleaners" " Prof-specialty" " Adm-clerical" ...
##  $ Gender       : chr  " Male" " Male" " Female" " Female" ...
##  $ Country      : chr  " United-States" " United-States" " United-States" " United-States" ...
##  $ Income       : chr  " <=50K" " <=50K" " >50K" " <=50K" ...

Dữ liệu được sử dụng để phân tích là bộ Adult Income, thể hiện mức thu nhập của một người lớn trong 1 năm. Bộ dữ liệu bao gồm 14962 quan sát tương ứng với 14962 người tham gia khảo sát và 8 biến bao gồm:

  • Age:Tuổi

  • Work class:Lớp công việc

    • Private: Làm cho công ty tư nhân
    • Self-emp-not-inc: Tự làm chủ, không thành lập công ty (freelancer, hộ kinh doanh)
    • State-gov: Làm cho chính quyền bang
    • Federal-gov: Làm cho chính phủ liên bang
    • Local-gov: Làm cho chính quyền địa phương
    • Self-emp-inc: Tự làm chủ có thành lập công ty
    • Without-pay: Làm không có lương
    • Never-worked: Chưa từng làm việc
  • Education: Học vấn

    • Preschool: Mẫu giáo
    • 1st-4th, 5th-6th, 7th-8th, 9th, 10th, 11th, 12th: Các lớp tiểu học và trung học cơ sở
    • HS-grad: Tốt nghiệp trung học phổ thông
    • Some-college: Học đại học/cao đẳng nhưng chưa tốt nghiệp
    • Assoc-acdm: Bằng cao đẳng học thuật (Associate degree - academic)
    • Assoc-voc: Bằng cao đẳng nghề (vocational)
    • Bachelors: Cử nhân (đại học)
    • Masters: Thạc sĩ
    • Prof-school: Trường chuyên nghiệp (bác sĩ, luật sư, nha sĩ,…)
    • Doctorate: Tiến sĩ
  • Marital Status: Tình trạng hôn nhân

    • Divorced: Đã ly hôn
    • Never-married: Chưa từng kết hôn
    • Separated: Ly thân
    • Widowed: Góa (chồng/vợ đã mất)
  • Occupation: Nghề nghiệp

    • Adm-clerical: Hành chính, văn phòng
    • Armed-Forces: Quân đội
    • Craft-repair: Thợ thủ công, sửa chữa
    • Exec-managerial: Quản lý, điều hành
    • Farming-fishing: Nông – ngư nghiệp
    • Handlers-cleaners: Khuân vác, dọn dẹp
    • Machine-op-inspct: Vận hành máy móc, kiểm tra
    • Other-service: Dịch vụ khác
    • Priv-house-serv: Giúp việc nhà tư
    • Prof-specialty: Nghề chuyên môn cao (bác sĩ, kỹ sư…)
    • Protective-serv: Dịch vụ bảo vệ
    • Sales: Bán hàng
    • Tech-support: Hỗ trợ kỹ thuật
    • Transport-moving: Giao thông, vận tải
  • Gender: Giới tính

    • Female: Nữ
    • Male: Nam
  • Income: Thu nhập

    • <= 50: Thấp hơn 50k đô la/năm
    • > 50: Nhiều hơn 50k đô la/năm

Ngoại trừ biến ‘Age’ thì tất cả các biến còn lại đều là biến định tính.


1.2. Kiểm tra các biến định tính

Kiểm tra NA cho dữ liệu

#gom các biến định tính 
dinhtinh <- c('WorkClass','Education', 'MaritalStatus', 'Occupation', 'Gender', 'Income')
data_dinhtinh <- data[,dinhtinh]

#kiểm tra dữ liệu NA của các biến định tính
sum(is.na(data_dinhtinh))
## [1] 0
colSums(is.na(data_dinhtinh))
##     WorkClass     Education MaritalStatus    Occupation        Gender 
##             0             0             0             0             0 
##        Income 
##             0

Kết quả trả về cho ta thấy rằng, với 7 biến định tính, không có dữ liệu trống (NA).

Sau đó, chúng ta sẽ kiểm tra xem các biến định tính có phải là factor hay không. Nếu chúng không phải là factor thì ta sẽ chuyển đổi chúng sang dạng factor.

Kiểm tra các biến định tính có phải là factor hay chưa

#kiểm tra các biến định tính có phải là factor hay chưa
for (i in 1:ncol(data_dinhtinh)) {
  a <- is.factor(data_dinhtinh[,i])
  cat(colnames(data_dinhtinh)[i],":",a,"\n")
}
## WorkClass : FALSE 
## Education : FALSE 
## MaritalStatus : FALSE 
## Occupation : FALSE 
## Gender : FALSE 
## Income : FALSE

Kết quả kiểm tra cho ta thấy rằng, 7 biến định tính đang không phải là factor. Vì vậy, ta tiến hành chuyển 7 biến này về dạng factor, như sau:

# Chuyển về dạng factor 

for (i in 1:ncol(data_dinhtinh)) {
  data_dinhtinh[,i] <- as.factor(data_dinhtinh[,i])
}

# Kiểm tra lại 
for (i in 1:ncol(data_dinhtinh)) {
  a <- is.factor(data_dinhtinh[,i])
  cat(colnames(data_dinhtinh)[i],":",a,"\n")
}
## WorkClass : TRUE 
## Education : TRUE 
## MaritalStatus : TRUE 
## Occupation : TRUE 
## Gender : TRUE 
## Income : TRUE

Lúc này, kết quả đã cho ra 7 biến định tính đã là factor. Việc chuyển đổi này sẽ giúp R hiểu rõ bản chất của biến phân loại và hỗ trợ tốt hơn cho quá trình trực quan hóa dữ liệu.


PHẦN 2: PHÂN TÍCH MÔ TẢ MỘT BIẾN ĐỊNH TÍNH

2.1. Biến Work Class

a) Thống kê mô tả

# Tạo bảng mô tả thống kê biến Work Class
tanso.workclass <- table(data$WorkClass)
tansuat.workclass <- prop.table(tanso.workclass) * 100

workclass <- data.frame(WorkClass = names(tanso.workclass), TanSo = as.vector(tanso.workclass), TanSuat = as.vector(tansuat.workclass))

kable(workclass, caption = "Bảng 1: Mô tả thống kê của biến Work Class")
Bảng 1: Mô tả thống kê của biến Work Class
WorkClass TanSo TanSuat
Federal-gov 449 3.000936
Local-gov 1004 6.710333
Private 11799 78.859778
Self-emp-inc 263 1.757786
Self-emp-not-inc 772 5.159738
State-gov 670 4.478011
Without-pay 5 0.033418
# Biểu đồ biến Work Class
counts <- data %>% 
  group_by(WorkClass) %>% 
  summarise(Count = n())

ggplot(counts, aes(x = WorkClass, y = Count)) +
  geom_bar(stat = "identity", fill = 'skyblue') +
  geom_text(aes(label = Count), vjust = -0.5, size = 4) +
  labs(
    title = "Hình 1: Biểu đồ cột thể hiện biến Work Class",
    x = 'Lớp công việc',
    y = 'Số lượng người tham gia khảo sát'
  )

Biến Work Class thể hiện sự phân bố không đồng đều rõ rệt giữa các nhóm. Nhóm Private chiếm ưu thế tuyệt đối với 78,86% số quan sát, vượt trội so với các nhóm còn lại. Các nhóm như Self-emp-inc, Federal-gov và đặc biệt làm Without-pay có tần suất rất thấp, cho thấy sự chênh lệch lớn giữa các loại hình công việc trong mẫu khảo sát.

b) Ước lượng khoảng - hạng mục Private

# Ước lượng khoảng Private (Làm cho công ty tư nhân)
data$WorkClass <- trimws(data$WorkClass)

table(data$WorkClass)
## 
##      Federal-gov        Local-gov          Private     Self-emp-inc 
##              449             1004            11799              263 
## Self-emp-not-inc        State-gov      Without-pay 
##              772              670                5
total= sum(table(data$WorkClass))

So.private = table(data$WorkClass)[["Private"]]

#với khoảng tin cậy 95%
prop.test(So.private, total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  So.private out of total, null probability 0.5
## X-squared = 4983.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7819480 0.7950987
## sample estimates:
##         p 
## 0.7885978

Với kết quả trên, ta có được khoảng tin cậy tỷ lệ người tham gia khảo sát làm cho công ty tư nhân trong tổng thể nằm trong khoảng từ 78.19% đến 79.51%.

c) Kiểm định giả thuyết

Giả thuyết kiểm định:

\(H_0\): Tỷ lệ người tham gia khảo sát làm cho công ty tư nhân trong tổng số quan sát bằng 50%

\(H_1\): Tỷ lệ người tham gia khảo sát làm cho công ty tư nhân trong tổng số quan sát khác 50%

# Kiểm định H0: p = 0.5

prop.test(So.private, total, p = 0.5)
## 
##  1-sample proportions test with continuity correction
## 
## data:  So.private out of total, null probability 0.5
## X-squared = 4983.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7819480 0.7950987
## sample estimates:
##         p 
## 0.7885978

Với kết quả vừa kiểm định được, ta thấy rằng \(p-value < 2.2e-16 < 0.05\), ta bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết \(H_1\), tức tỷ lệ người tham gia khảo sát làm cho công ty tư nhân trong tổng số quan sát **khác 50% ở mức ý nghĩa 5%.


2.2. Biến Education

a) Thống kê mô tả

#Tạo bảng mô tả thống kê biến Education
tanso.education <- table(data$Education)
tansuat.education <- prop.table(tanso.education) * 100

education <- data.frame(Education = names(tanso.education), TanSo = as.vector(tanso.education), TanSuat = as.vector(tansuat.education))

kable(education, caption = "Bảng 2: Mô tả thống kê của biến Education")
Bảng 2: Mô tả thống kê của biến Education
Education TanSo TanSuat
10th 443 2.9608341
11th 658 4.3978078
12th 244 1.6307980
1st-4th 58 0.3876487
5th-6th 101 0.6750434
7th-8th 200 1.3367197
9th 211 1.4102393
Assoc-acdm 548 3.6626120
Assoc-voc 621 4.1505146
Bachelors 2324 15.5326828
Doctorate 110 0.7351958
HS-grad 4837 32.3285657
Masters 664 4.4379094
Preschool 24 0.1604064
Prof-school 151 1.0092234
Some-college 3768 25.1837990
# Biểu đồ biến Education
counts <- data %>% 
  group_by(Education) %>% 
  summarise(Count = n())

ggplot(counts, aes(x = Education, y = Count)) +
  geom_bar(stat = "identity", fill = 'darkgreen') +
  geom_text(aes(label = Count), vjust = -0.5, size = 4) +  
  labs(
    title = "Hình 1: Biểu đồ cột thể hiện biến Education",
    x = 'Học vấn',
    y = 'Số lượng người tham gia khảo sát'
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Biến trình độ học vấn có sự phân bố chênh lệch rõ rệt. Nhóm tốt nghiệp trung học phổ thông chiếm tỷ lệ cao nhất (32,33%), tiếp theo là học một phần đại học (25,18%) và cử nhân (15,53%). Ngược lại, các nhóm như mẫu giáo, lớp 1–4 và tiến sĩ có tần suất rất thấp. Điều này cho thấy phần lớn người tham gia khảo sát có trình độ học vấn từ trung học phổ thông trở lên.

b) Ước lượng khoảng - hạng mục HS-grad

# Ước lượng khoảng HS-grad (Tốt nghiệp trung học phổ thông)

data$Education <- trimws(data$Education)

table(data$Education)
## 
##         10th         11th         12th      1st-4th      5th-6th      7th-8th 
##          443          658          244           58          101          200 
##          9th   Assoc-acdm    Assoc-voc    Bachelors    Doctorate      HS-grad 
##          211          548          621         2324          110         4837 
##      Masters    Preschool  Prof-school Some-college 
##          664           24          151         3768
total= sum(table(data$Education))

So.edu = table(data$Education)[["HS-grad"]]

#với khoảng tin cậy 95%
prop.test(So.edu, total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  So.edu out of total, null probability 0.5
## X-squared = 1868.2, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3158040 0.3308584
## sample estimates:
##         p 
## 0.3232857

Với kết quả trên, ta có được khoảng tin cậy tỷ lệ người tham gia khảo sát tốt nghiệp trung học phổ thông trong tổng thể nằm trong khoảng từ 31.58% đến 33.09%.

c) Kiểm định giả thuyết

Giả thuyết kiểm định:

\(H_0\): Tỷ lệ người tham gia khảo sát tốt nghiệp trung học phổ thông trong tổng số quan sát bằng 33%

\(H_1\): Tỷ lệ người tham gia khảo sát tốt nghiệp trung học phổ thông trong tổng số quan sát khác 33%

# Kiểm định H0: p = 0.5

prop.test(So.edu, total, p = 0.33)
## 
##  1-sample proportions test with continuity correction
## 
## data:  So.edu out of total, null probability 0.33
## X-squared = 3.0205, df = 1, p-value = 0.08222
## alternative hypothesis: true p is not equal to 0.33
## 95 percent confidence interval:
##  0.3158040 0.3308584
## sample estimates:
##         p 
## 0.3232857

Với kết quả vừa kiểm định được, ta thấy rằng \(p-value = 0.08222 > 0.05\), ta chưa đủ điều kiện để bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết \(H_0\), tức tỷ lệ người tham gia khảo sát tốt nghiệp trung học phổ thông trong tổng số quan sát bằng 33% ở mức ý nghĩa 5%.


2.3. Biến MaritalStatus

a) Thống kê mô tả

# Tạo bảng mô tả thống kê biến Marital Status
tanso.maritalstatus <- table(data$MaritalStatus)
tansuat.maritalstatus <- prop.table(tanso.maritalstatus) * 100

maritalstatus <- data.frame(MaritalStatus = names(tanso.maritalstatus), TanSo = as.vector(tanso.maritalstatus), TanSuat = as.vector(tansuat.maritalstatus))

kable(maritalstatus, caption = "Bảng 3: Mô tả thống kê của biến Marital Status")
Bảng 3: Mô tả thống kê của biến Marital Status
MaritalStatus TanSo TanSuat
Divorced 4111 27.476273
Never-married 9178 61.342067
Separated 886 5.921668
Widowed 787 5.259992
# Biểu đồ biến Marital Status
data %>% group_by(MaritalStatus) %>% summarise(n = n()) %>%
  mutate(percentage = n / sum(n) * 100) %>%
  ggplot(aes(x = '', y = n,fill = MaritalStatus)) +
    geom_col(color = 'black') +
    coord_polar('y') +
    geom_text(aes(x = 1.3, label = paste0(round(percentage, 1), "%")),position = position_stack(vjust = .5)) +
    theme_void() +
 labs(title = 'Hình 3: Biểu đồ tròn thể hiện tình trạng hôn nhân của mỗi khách hàng', x = ' ', y = ' ')

Biến tình trạng hôn nhân cho thấy phần lớn khách hàng chưa từng kết hôn (61,3%). Nhóm đã ly hôn chiếm tỷ lệ thứ hai với 27,5%. Trong khi đó, hai nhóm ly thân và góa có tỷ lệ khá thấp, lần lượt là 5,9% và 5,3%. Kết quả này cho thấy đa số người tham gia khảo sát thuộc nhóm độc thân.

b) Ước lượng khoảng - hạng mục Never-married

# Ước lượng khoảng Never-married (Chưa từng kết hôn)

data$MaritalStatus <- trimws(data$MaritalStatus)

table(data$MaritalStatus)
## 
##      Divorced Never-married     Separated       Widowed 
##          4111          9178           886           787
total= sum(table(data$MaritalStatus))

So.married = table(data$MaritalStatus)[["Never-married"]]

#với khoảng tin cậy 95%
prop.test(So.married, total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  So.married out of total, null probability 0.5
## X-squared = 769.45, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.6055561 0.6212267
## sample estimates:
##         p 
## 0.6134207

Với kết quả trên, ta có được khoảng tin cậy tỷ lệ người tham gia khảo sát chưa kết hôn trong tổng thể nằm trong khoảng từ 60.56% đến 62.12%.

c) Kiểm định giả thuyết

Giả thuyết kiểm định:

\(H_0\): Tỷ lệ người tham gia khảo sát chưa kết hôn trong tổng số quan sát bằng 62%

\(H_1\): Tỷ lệ người tham gia khảo sát chưa kết hôn trong tổng số quan sát khác 62%

# Kiểm định H0: p = 0.5

prop.test(So.married, total, p = 0.62)
## 
##  1-sample proportions test with continuity correction
## 
## data:  So.married out of total, null probability 0.62
## X-squared = 2.7212, df = 1, p-value = 0.09903
## alternative hypothesis: true p is not equal to 0.62
## 95 percent confidence interval:
##  0.6055561 0.6212267
## sample estimates:
##         p 
## 0.6134207

Với kết quả vừa kiểm định được, ta thấy rằng \(p-value = 0.09903 > 0.05\), ta chưa đủ điều kiện để bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết \(H_0\), tức tỷ lệ người tham gia khảo sát chưa kết hôn trong tổng số quan sát bằng 62% ở mức ý nghĩa 5%.


2.4. Biến Occupation

a) Thống kê mô tả

#Tạo bảng mô tả thống kê biến Occupation
tanso.occupation <- table(data$Occupation)
tansuat.occupation <- prop.table(tanso.occupation) * 100

occupation <- data.frame(Occupation = names(tanso.occupation), TanSo = as.vector(tanso.occupation), TanSuat = as.vector(tansuat.occupation))

kable(occupation, caption = "Bảng 4: Mô tả thống kê của biến Occupation")
Bảng 4: Mô tả thống kê của biến Occupation
Occupation TanSo TanSuat
Adm-clerical 2575 17.210266
Armed-Forces 5 0.033418
Craft-repair 1379 9.216682
Exec-managerial 1529 10.219222
Farming-fishing 365 2.439513
Handlers-cleaners 790 5.280043
Machine-op-inspct 908 6.068707
Other-service 2293 15.325491
Priv-house-serv 112 0.748563
Prof-specialty 1881 12.571849
Protective-serv 250 1.670900
Sales 1833 12.251036
Tech-support 489 3.268280
Transport-moving 553 3.696030
# Biểu đồ biến Occupation
counts <- data %>% 
  group_by(Occupation) %>% 
  summarise(Count = n())

ggplot(counts, aes(x = Occupation, y = Count)) +
  geom_bar(stat = "identity", fill = 'brown') +
  geom_text(aes(label = Count), vjust = -0.5, size = 4) +  
  labs(
    title = "Hình 4: Biểu đồ cột thể hiện biến Occupation",
    x = 'Nghề nghiệp',
    y = 'Số lượng người tham gia khảo sát'
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Biến nghề nghiệp cho thấy nhóm làm công việc hành chính - văn phòng chiếm tỷ lệ cao nhất trong mẫu khảo sát với 17,2%. Theo sau là các nhóm dịch vụ khác (15,3%), quản lý - điều hành (10,2%), chuyên gia (12,6%) và bán hàng (12,3%). Ngược lại, nhóm làm trong lực lượng vũ trang (0,03%) và giúp việc nhà tư nhân (0,75%) có tỷ lệ rất thấp. Phân bố này phản ánh sự đa dạng về nghề nghiệp trong tập dữ liệu, đồng thời cho thấy lực lượng lao động tham gia khảo sát chủ yếu hoạt động trong lĩnh vực văn phòng, dịch vụ và chuyên môn.


2.5. Biến Gender

# Tạo bảng mô tả thống kê biến Gender
tanso.gender <- table(data$Gender)
tansuat.gender <- prop.table(tanso.maritalstatus) * 100

gender <- data.frame(Gender = names(tanso.gender), TanSo = as.vector(tanso.gender), TanSuat = as.vector(tansuat.gender))

kable(gender, caption = "Bảng 5: Mô tả thống kê của biến Gender")
Bảng 5: Mô tả thống kê của biến Gender
Gender TanSo TanSuat
Female 7771 27.476273
Male 7191 61.342067
Female 7771 5.921668
Male 7191 5.259992
# Biểu đồ biến Gender
data %>% group_by(Gender) %>% summarise(n = n()) %>%
  mutate(percentage = n / sum(n) * 100) %>%
  ggplot(aes(x = '', y = n,fill = Gender)) +
    geom_col(color = 'black') +
    coord_polar('y') +
    geom_text(aes(x = 1.3, label = paste0(round(percentage, 1), "%")),position = position_stack(vjust = .5)) +
    theme_void() +
 labs(title = 'Hình 5: Biểu đồ tròn thể hiện giới tính của mỗi khách hàng', x = ' ', y = ' ')

Biểu đồ tròn và bảng mô tả thống kê cho thấy tỉ lệ khách hàng nữ chiếm 51,9%, cao hơn nhẹ so với khách hàng nam với 48,1%. Sự phân bố gần như cân bằng này cho thấy dữ liệu không bị thiên lệch đáng kể về giới tính, giúp đảm bảo tính đại diện cho cả hai nhóm giới trong quá trình phân tích và đánh giá các yếu tố liên quan đến hành vi hoặc đặc điểm của khách hàng.


2.6. Biến Country

#Tạo bảng mô tả thống kê biến Country
tanso.country <- table(data$Country)
tansuat.country <- prop.table(tanso.country) * 100

country <- data.frame(Country = names(tanso.country), TanSo = as.vector(tanso.country), TanSuat = as.vector(tansuat.country))

kable(country, caption = "Bảng 6: Mô tả thống kê của biến Country")
Bảng 6: Mô tả thống kê của biến Country
Country TanSo TanSuat
Cambodia 4 0.0267344
Canada 49 0.3274963
China 15 0.1002540
Columbia 32 0.2138752
Cuba 39 0.2606603
Dominican-Republic 34 0.2272423
Ecuador 7 0.0467852
El-Salvador 47 0.3141291
England 47 0.3141291
France 14 0.0935704
Germany 63 0.4210667
Greece 8 0.0534688
Guatemala 28 0.1871408
Haiti 17 0.1136212
Honduras 8 0.0534688
Hong 4 0.0267344
Hungary 6 0.0401016
India 26 0.1737736
Iran 16 0.1069376
Ireland 15 0.1002540
Italy 18 0.1203048
Jamaica 41 0.2740275
Japan 26 0.1737736
Laos 6 0.0401016
Mexico 214 1.4302901
Nicaragua 14 0.0935704
Outlying-US(Guam-USVI-etc) 11 0.0735196
Peru 17 0.1136212
Philippines 67 0.4478011
Poland 19 0.1269884
Portugal 15 0.1002540
Puerto-Rico 54 0.3609143
Scotland 6 0.0401016
South 26 0.1737736
Taiwan 14 0.0935704
Thailand 8 0.0534688
Trinadad&Tobago 8 0.0534688
United-States 13888 92.8218153
Vietnam 27 0.1804572
Yugoslavia 4 0.0267344

Biểu đồ cột cho thấy đa số người tham gia khảo sát đến từ Hoa Kỳ (United States), chiếm áp đảo với 13.888 người, tương đương 92,82% tổng mẫu. Trong khi đó, các quốc gia còn lại chỉ chiếm tỷ lệ rất nhỏ, mỗi nước dao động từ vài cá nhân đến vài chục người, chiếm dưới 1% mỗi quốc gia. Những quốc gia có số lượng tương đối nổi bật sau Hoa Kỳ gồm Mexico (1,43%), Philippines (0,45%), Germany (0,42%) và Puerto-Rico (0,36%).

Sự mất cân đối nghiêm trọng trong phân bố quốc tịch này cho thấy dữ liệu có thể phản ánh chủ yếu bối cảnh và đặc điểm của cư dân Hoa Kỳ.


2.7. Biến Income

# Tạo bảng mô tả thống kê biến Income
tanso.income <- table(data$Income)
tansuat.income <- prop.table(tanso.income) * 100

income <- data.frame(Income = names(tanso.income), TanSo = as.vector(tanso.income), TanSuat = as.vector(tansuat.income))

kable(income, caption = "Bảng 7: Mô tả thống kê của biến Income")
Bảng 7: Mô tả thống kê của biến Income
Income TanSo TanSuat
<=50K 13910 92.968854
>50K 1052 7.031146
# Biểu đồ biến Income
data %>% group_by(Income) %>% summarise(n = n()) %>%
  mutate(percentage = n / sum(n) * 100) %>%
  ggplot(aes(x = '', y = n,fill = Income)) +
    geom_col(color = 'black') +
    coord_polar('y') +
    geom_text(aes(x = 1.3, label = paste0(round(percentage, 1), "%")),position = position_stack(vjust = .5)) +
    theme_void() +
 labs(title = 'Hình 7: Biểu đồ tròn thể hiện thu nhập của mỗi khách hàng', x = ' ', y = ' ')

Biểu đồ tròn cho thấy phần lớn khách hàng trong tập dữ liệu có thu nhập dưới hoặc bằng 50.000 USD, chiếm 93% tổng số người tham gia khảo sát, tương đương 13.910 người. Trong khi đó, chỉ có 7% khách hàng có thu nhập trên 50.000 USD, tương ứng 1.052 người.


PHẦN 3: PHÂN TÍCH MỖI QUAN HỆ GIỮA HAI BIẾN ĐỊNH TÍNH

Biến phụ thuộc là: IncomeEducation

Biến Income

3.1. Biến Marital Status và Income

a) Bảng tần suất chéo và biểu đồ trực quan hóa

# Bần suất giữa Marital Status và Income
tanso1 <- table(data$MaritalStatus, data$Income) 
tansuat1 <- prop.table(tanso1, margin = 1) * 100

bang1 <- as.data.frame(tanso1)
bang1$Percentage <- round(as.vector(tansuat1), 2)

colnames(bang1) <- c("Marital Status", "Income", "Tần số", "Tần suất")
    
kable(bang1, caption = "Bảng 8: Mô tả thống kê của 2 biến Marital Status và Income")
Bảng 8: Mô tả thống kê của 2 biến Marital Status và Income
Marital Status Income Tần số Tần suất
Divorced <=50K 3664 89.13
Never-married <=50K 8716 94.97
Separated <=50K 822 92.78
Widowed <=50K 708 89.96
Divorced >50K 447 10.87
Never-married >50K 462 5.03
Separated >50K 64 7.22
Widowed >50K 79 10.04
#Trực quan hóa cho mối quan hệ giữa 2 biến
ggplot(data, aes(x = Income, fill = MaritalStatus)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Hình 8: Mối quan hệ giữa Marital Status và Income",
    x = "Thu nhập",
    y = "Số lượng",
    fill = "Tình trạng hôn nhân"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Biểu đồ cho thấy phần lớn những người có thu nhập dưới 50K thuộc nhóm chưa từng kết hôn, tiếp theo là nhóm đã ly hôn, trong khi hai nhóm sống ly thân và góa vợ/chồng chiếm tỷ lệ thấp hơn đáng kể. Ở chiều ngược lại, số người có thu nhập trên 50K ở tất cả các nhóm tình trạng hôn nhân đều rất thấp. Điều này cho thấy thu nhập cao là tương đối hiếm trong tập dữ liệu và không phụ thuộc nhiều vào tình trạng hôn nhân.

b) Kiểm định Chi bình phương

Giả thuyết kiểm định:

\(H_0\): Biến MaritalStatus (tình trạng hôn nhân) không ảnh hưởng đến biến Income (thu nhập)

\(H_1\): Biến MaritalStatus (tình trạng hôn nhân) có ảnh hưởng đến biến Income (thu nhập)

# Kiểm định Chi-bình phương
chi_test <- chisq.test(tanso1)
chi_test
## 
##  Pearson's Chi-squared test
## 
## data:  tanso1
## X-squared = 159.79, df = 3, p-value < 2.2e-16

Với kết quả vừa kiểm định được, ta thấy rằng \(p-value < 2.2e-16 < 0.05\), ta bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết \(H_1\), tức biến MaritalStatus (tình trạng hôn nhân) có ảnh hưởng đến biến Income (thu nhập) ở mức ý nghĩa 5%.

c) Tính Relative Risk và Odds Ratio

Để tính RR và OR chúng ta sẽ giới hạn hạng mục quan tâm. Vì ta cần quan tâm các biến tác động đến thu nhập như thế nào nên ta sẽ giữ nguyên 2 hạng mục của biến Income là <=50>50. Với biến MaritalStatus, hạng mục quan tâm Never-marriedSeparated.

library(epitools)

# Làm sạch dữ liệu trước nếu cần
data$MaritalStatus <- trimws(data$MaritalStatus)
data$Income <- trimws(data$Income)

# Lọc ra những hàng có MaritalStatus và Income như yêu cầu
tsc1 <- subset(data,
               MaritalStatus %in% c("Never-married", "Separated") &
               Income %in% c("<=50K", ">50K"))

# Bỏ levels không còn sử dụng (nếu biến là factor)
tsc1 <- droplevels(tsc1)

table1 <- table(tsc1$MaritalStatus, tsc1$Income)
kable (table1)
<=50K >50K
Never-married 8716 462
Separated 822 64
#Tính RR
riskratio(table1)
## $data
##                
##                 <=50K >50K Total
##   Never-married  8716  462  9178
##   Separated       822   64   886
##   Total          9538  526 10064
## 
## $measure
##                risk ratio with 95% C.I.
##                 estimate    lower    upper
##   Never-married 1.000000       NA       NA
##   Separated     1.435001 1.115172 1.846558
## 
## $p.value
##                two-sided
##                  midp.exact fisher.exact  chi.square
##   Never-married          NA           NA          NA
##   Separated     0.007436189  0.007063501 0.005163426
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
#Tính OR
oddsratio(table1)
## $data
##                
##                 <=50K >50K Total
##   Never-married  8716  462  9178
##   Separated       822   64   886
##   Total          9538  526 10064
## 
## $measure
##                odds ratio with 95% C.I.
##                 estimate    lower    upper
##   Never-married 1.000000       NA       NA
##   Separated     1.471844 1.112743 1.915858
## 
## $p.value
##                two-sided
##                  midp.exact fisher.exact  chi.square
##   Never-married          NA           NA          NA
##   Separated     0.007436189  0.007063501 0.005163426
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả cho thấy: trong nhóm người tham gia khảo sát, những ai đã ly thân (Separated) có khả năng kiếm được trên 50K cao hơn so với người chưa từng kết hôn (Never-married).

Cụ thể, tỷ lệ này cao hơn khoảng 1.47 lần (gọi là odds ratio). Khoảng tin cậy từ 1.11 đến 1.92 nghĩa là kết quả này khá chắc chắn. Ba cách kiểm tra khác nhau đều cho ra giá trị p nhỏ hơn 0.01, tức là sự khác biệt này không phải do ngẫu nhiên, mà có ý nghĩa thống kê.


3.2. Biến Gender và Income

a) Bảng tần suất chéo và biểu đồ trực quan hóa

# Bần suất giữa Gender và Income
tanso2 <- table(data$Gender, data$Income) 
tansuat2 <- prop.table(tanso2, margin = 1) * 100

bang2 <- as.data.frame(tanso2)
bang2$Percentage <- round(as.vector(tansuat2), 2)

colnames(bang2) <- c("Gender", "Income", "Tần số", "Tần suất")
    
kable(bang2, caption = "Bảng 9: Mô tả thống kê của 2 biến Gender và Income")
Bảng 9: Mô tả thống kê của 2 biến Gender và Income
Gender Income Tần số Tần suất
Female <=50K 7380 94.97
Male <=50K 6530 90.81
Female >50K 391 5.03
Male >50K 661 9.19
#Trực quan hóa cho mối quan hệ giữa 2 biến
ggplot(data, aes(x = Income, fill = Gender)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Hình 9: Mối quan hệ giữa Gender và Income",
    x = "Thu nhập",
    y = "Số lượng",
    fill = "Giới tính"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Bảng thống kê và biểu đồ minh họa mối quan hệ giữa giới tính và thu nhập cho thấy sự khác biệt rõ rệt trong phân bố thu nhập giữa hai nhóm giới tính. Cụ thể, với mức thu nhập ≤50K, cả nữ giới (7.380 người, chiếm 94,97%) và nam giới (6.530 người, chiếm 90,81%) đều chiếm tỷ lệ rất cao, cho thấy phần lớn dân số có thu nhập thấp. Tuy nhiên, ở mức thu nhập >50K, tỷ lệ này giảm mạnh, với nữ giới chỉ còn 391 người (5,03%) và nam giới là 661 người (9,19%), phản ánh sự bất cân đối giới trong nhóm thu nhập cao. Biểu đồ cột trực quan hóa dữ liệu này, nhấn mạnh sự chênh lệch đáng kể về số lượng ở cả hai ngưỡng thu nhập, đặc biệt ở nhóm thu nhập cao, nơi nam giới vượt trội hơn nữ giới. Kết quả này có thể là cơ sở để nghiên cứu sâu hơn về các yếu tố xã hội và kinh tế ảnh hưởng đến phân hóa thu nhập theo giới tính.

b) Kiểm định Chi bình phương

Giả thuyết kiểm định:

\(H_0\): Biến Gender (Giới tính) không ảnh hưởng đến biến Income (thu nhập)

\(H_1\): Biến Gender (Giới tính) có ảnh hưởng đến biến Income (thu nhập)

# Kiểm định Chi-bình phương
chi_test <- chisq.test(tanso2)
chi_test
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tanso2
## X-squared = 98.267, df = 1, p-value < 2.2e-16

Với kết quả vừa kiểm định được, ta thấy rằng \(p-value < 2.2e-16 < 0.05\), ta bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết \(H_1\), tức biến Gender (tình trạng hôn nhân) có ảnh hưởng đến biến Income (thu nhập) ở mức ý nghĩa 5%.

c) Tính Relative Risk và Odds Ratio

Để tính RR và OR chúng ta sẽ giới hạn hạng mục quan tâm. Vì ta cần quan tâm các biến tác động đến thu nhập như thế nào nên ta sẽ giữ nguyên 2 hạng mục của biến Income là <=50>50. Với biến Gender, hạng mục quan tâm FemaleMale.

library(epitools)

# Làm sạch dữ liệu trước nếu cần
data$Gender <- trimws(data$Gender)
data$Income <- trimws(data$Income)

# Lọc ra những hàng có Gender và Income như yêu cầu
tsc2 <- subset(data,
               Gender %in% c("Female", "Male") &
               Income %in% c("<=50K", ">50K"))

# Bỏ levels không còn sử dụng (nếu biến là factor)
tsc2 <- droplevels(tsc2)

table2 <- table(tsc2$Gender, tsc2$Income)
kable (table2)
<=50K >50K
Female 7380 391
Male 6530 661
#Tính RR
riskratio(table2)
## $data
##         
##          <=50K >50K Total
##   Female  7380  391  7771
##   Male    6530  661  7191
##   Total  13910 1052 14962
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate    lower   upper
##   Female  1.00000       NA      NA
##   Male    1.82689 1.618909 2.06159
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact   chi.square
##   Female         NA           NA           NA
##   Male            0 2.390587e-23 2.652276e-23
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
#Tính OR
oddsratio(table2)
## $data
##         
##          <=50K >50K Total
##   Female  7380  391  7771
##   Male    6530  661  7191
##   Total  13910 1052 14962
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate    lower    upper
##   Female 1.000000       NA       NA
##   Male   1.910203 1.679273 2.175744
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact   chi.square
##   Female         NA           NA           NA
##   Male            0 2.390587e-23 2.652276e-23
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả phân tích cho thấy: nam giới (Male) có khả năng kiếm được trên 50K cao hơn gần 2 lần so với nữ giới (Female) trong bộ dữ liệu khảo sát.

Cụ thể, tỷ số odds (odds ratio) là 1.91, nghĩa là nam có khả năng có thu nhập trên 50K cao hơn khoảng 1.91 lần so với nữ. Khoảng tin cậy 95% từ 1.68 đến 2.18 cho thấy kết quả này rất chắc chắn, vì nó không bao gồm giá trị 1. Thêm vào đó, các kiểm định thống kê (mid-p exact, Fisher’s exact, và chi-square) đều cho ra giá trị p gần bằng 0, tức là sự khác biệt này có ý nghĩa thống kê cao và không phải do ngẫu nhiên.


3.3. Biến Occupation và Income

a) Bảng tần suất chéo và biểu đồ trực quan hóa

# Bần suất giữa Gender và Income
tanso3 <- table(data$Occupation, data$Income) 
tansuat3 <- prop.table(tanso3, margin = 1) * 100

bang3 <- as.data.frame(tanso3)
bang3$Percentage <- round(as.vector(tansuat3), 2)

colnames(bang3) <- c("Occupation", "Income", "Tần số", "Tần suất")
    
kable(bang3, caption = "Bảng 10: Mô tả thống kê của 2 biến Occupation và Income")
Bảng 10: Mô tả thống kê của 2 biến Occupation và Income
Occupation Income Tần số Tần suất
Adm-clerical <=50K 2507 97.36
Armed-Forces <=50K 5 100.00
Craft-repair <=50K 1295 93.91
Exec-managerial <=50K 1241 81.16
Farming-fishing <=50K 354 96.99
Handlers-cleaners <=50K 785 99.37
Machine-op-inspct <=50K 898 98.90
Other-service <=50K 2266 98.82
Priv-house-serv <=50K 111 99.11
Prof-specialty <=50K 1553 82.56
Protective-serv <=50K 220 88.00
Sales <=50K 1698 92.64
Tech-support <=50K 452 92.43
Transport-moving <=50K 525 94.94
Adm-clerical >50K 68 2.64
Armed-Forces >50K 0 0.00
Craft-repair >50K 84 6.09
Exec-managerial >50K 288 18.84
Farming-fishing >50K 11 3.01
Handlers-cleaners >50K 5 0.63
Machine-op-inspct >50K 10 1.10
Other-service >50K 27 1.18
Priv-house-serv >50K 1 0.89
Prof-specialty >50K 328 17.44
Protective-serv >50K 30 12.00
Sales >50K 135 7.36
Tech-support >50K 37 7.57
Transport-moving >50K 28 5.06
#Trực quan hóa cho mối quan hệ giữa 2 biến
ggplot(data, aes(x = Income, fill = Occupation)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Hình 10: Mối quan hệ giữa Occupation và Income",
    x = "Thu nhập",
    y = "Số lượng",
    fill = "Nghề nghiệp"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Bảng thống kê và biểu đồ minh họa mối quan hệ giữa nghề nghiệp, giới tính và thu nhập cho thấy sự phân bố không đồng đều giữa các nhóm nghề nghiệp theo ngưỡng thu nhập ≤50K và >50K. Ở mức thu nhập ≤50K, các nghề như Hành chính-văn phòng (2.507 người, 97,36%), Dịch vụ khác (2.266 người, 98,82%) và Chuyên môn cao (1.553 người, 82,56%) chiếm tỷ lệ cao, trong khi các nghề như Lực lượng vũ trang (5 người, 100%) và Dịch vụ gia đình (111 người, 99,11%) có số lượng rất thấp. Với thu nhập >50K, nghề Quản lý điều hành (288 người, 18,84%) và Chuyên môn cao (328 người, 17,44%) nổi bật với tỷ lệ cao hơn hẳn, trong khi các nghề như Lao động tay chân (5 người, 0,63%) và Lực lượng vũ trang (0 người, 0%) gần như không có đại diện. Biểu đồ cột trực quan hóa dữ liệu này, nhấn mạnh sự tập trung lớn ở ngưỡng thu nhập thấp và sự khác biệt rõ rệt giữa các nghề ở ngưỡng thu nhập cao, gợi mở các nghiên cứu tiếp theo về ảnh hưởng của nghề nghiệp đến phân hóa thu nhập.

b) Kiểm định Chi bình phương

Giả thuyết kiểm định:

\(H_0\): Biến Occupation (nghề nghiệp) không ảnh hưởng đến biến Income (thu nhập)

\(H_1\): Biến Occupation (nghề nghiệp) có ảnh hưởng đến biến Income (thu nhập)

# Kiểm định Chi-bình phương
chi_test <- chisq.test(tanso3)
## Warning in chisq.test(tanso3): Chi-squared approximation may be incorrect
chi_test
## 
##  Pearson's Chi-squared test
## 
## data:  tanso3
## X-squared = 962.97, df = 13, p-value < 2.2e-16

Với kết quả vừa kiểm định được, ta thấy rằng \(p-value < 2.2e-16 < 0.05\), ta bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết \(H_1\), tức biến Occupation (nghề nghiệp) có ảnh hưởng đến biến Income (thu nhập) ở mức ý nghĩa 5%.

c) Tính Relative Risk và Odds Ratio

Để tính RR và OR chúng ta sẽ giới hạn hạng mục quan tâm. Vì ta cần quan tâm các biến tác động đến thu nhập như thế nào nên ta sẽ giữ nguyên 2 hạng mục của biến Income là <=50>50. Với biến Occupation, hạng mục quan tâm SalesTransport-moving.

library(epitools)

# Làm sạch dữ liệu trước nếu cần
data$Occupation <- trimws(data$Occupation)
data$Income <- trimws(data$Income)

# Lọc ra những hàng có Occupation và Income như yêu cầu
tsc3 <- subset(data,
               Occupation %in% c("Sales", "Transport-moving") &
               Income %in% c("<=50K", ">50K"))

# Bỏ levels không còn sử dụng (nếu biến là factor)
tsc3 <- droplevels(tsc3)

table3 <- table(tsc3$Occupation, tsc3$Income)
kable (table3)
<=50K >50K
Sales 1698 135
Transport-moving 525 28
#Tính RR
riskratio(table3)
## $data
##                   
##                    <=50K >50K Total
##   Sales             1698  135  1833
##   Transport-moving   525   28   553
##   Total             2223  163  2386
## 
## $measure
##                   risk ratio with 95% C.I.
##                     estimate     lower    upper
##   Sales            1.0000000        NA       NA
##   Transport-moving 0.6874824 0.4628019 1.021241
## 
## $p.value
##                   two-sided
##                    midp.exact fisher.exact chi.square
##   Sales                    NA           NA         NA
##   Transport-moving 0.05551996   0.06729622  0.0600471
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
#Tính OR
oddsratio(table3)
## $data
##                   
##                    <=50K >50K Total
##   Sales             1698  135  1833
##   Transport-moving   525   28   553
##   Total             2223  163  2386
## 
## $measure
##                   odds ratio with 95% C.I.
##                     estimate     lower   upper
##   Sales            1.0000000        NA      NA
##   Transport-moving 0.6738799 0.4347032 1.00902
## 
## $p.value
##                   two-sided
##                    midp.exact fisher.exact chi.square
##   Sales                    NA           NA         NA
##   Transport-moving 0.05551996   0.06729622  0.0600471
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả phân tích so sánh giữa hai nhóm nghề nghiệp “Sales” và “Transport-moving” cho thấy:

Tỷ số odds (odds ratio) = 0.67, nghĩa là người làm nghề Transport-moving có khả năng có thu nhập >50K thấp hơn khoảng 33% so với người làm nghề Sales.

Khoảng tin cậy 95% (0.43 đến 1.01) cho thấy mức độ không chắc chắn: vì khoảng này có chứa giá trị 1, ta không thể kết luận chắc chắn rằng sự khác biệt là có thật.

Các giá trị p-value (mid-p = 0.056, Fisher = 0.067, Chi-square = 0.060) đều hơi lớn hơn 0.05, tức là không đủ mạnh để bác bỏ giả thuyết rằng hai nghề có cùng xác suất đạt thu nhập >50K.


Biến Education

3.4. Biến Marital Status và Education

a) Bảng tần suất chéo và biểu đồ trực quan hóa

# Bần suất giữa Marital Status và Education
tanso4 <- table(data$MaritalStatus, data$Education) 
tansuat4 <- prop.table(tanso1, margin = 1) * 100

bang4 <- as.data.frame(tanso4)
bang4$Percentage <- round(as.vector(tansuat4), 2)

colnames(bang4) <- c("Marital Status", "Education", "Tần số", "Tần suất")
    
kable(bang4, caption = "Bảng 11: Mô tả thống kê của 2 biến Marital Status và Education")
Bảng 11: Mô tả thống kê của 2 biến Marital Status và Education
Marital Status Education Tần số Tần suất
Divorced 10th 102 89.13
Never-married 10th 270 94.97
Separated 10th 39 92.78
Widowed 10th 32 89.96
Divorced 11th 113 10.87
Never-married 11th 474 5.03
Separated 11th 40 7.22
Widowed 11th 31 10.04
Divorced 12th 34 89.13
Never-married 12th 192 94.97
Separated 12th 9 92.78
Widowed 12th 9 89.96
Divorced 1st-4th 8 10.87
Never-married 1st-4th 31 5.03
Separated 1st-4th 6 7.22
Widowed 1st-4th 13 10.04
Divorced 5th-6th 17 89.13
Never-married 5th-6th 62 94.97
Separated 5th-6th 15 92.78
Widowed 5th-6th 7 89.96
Divorced 7th-8th 58 10.87
Never-married 7th-8th 82 5.03
Separated 7th-8th 17 7.22
Widowed 7th-8th 43 10.04
Divorced 9th 51 89.13
Never-married 9th 118 94.97
Separated 9th 25 92.78
Widowed 9th 17 89.96
Divorced Assoc-acdm 197 10.87
Never-married Assoc-acdm 302 5.03
Separated Assoc-acdm 30 7.22
Widowed Assoc-acdm 19 10.04
Divorced Assoc-voc 223 89.13
Never-married Assoc-voc 331 94.97
Separated Assoc-voc 38 92.78
Widowed Assoc-voc 29 89.96
Divorced Bachelors 507 10.87
Never-married Bachelors 1664 5.03
Separated Bachelors 83 7.22
Widowed Bachelors 70 10.04
Divorced Doctorate 31 89.13
Never-married Doctorate 66 94.97
Separated Doctorate 7 92.78
Widowed Doctorate 6 89.96
Divorced HS-grad 1489 10.87
Never-married HS-grad 2680 5.03
Separated HS-grad 345 7.22
Widowed HS-grad 323 10.04
Divorced Masters 228 89.13
Never-married Masters 377 94.97
Separated Masters 23 92.78
Widowed Masters 36 89.96
Divorced Preschool 1 10.87
Never-married Preschool 21 5.03
Separated Preschool 1 7.22
Widowed Preschool 1 10.04
Divorced Prof-school 52 89.13
Never-married Prof-school 86 94.97
Separated Prof-school 8 92.78
Widowed Prof-school 5 89.96
Divorced Some-college 1000 10.87
Never-married Some-college 2422 5.03
Separated Some-college 200 7.22
Widowed Some-college 146 10.04
#Trực quan hóa cho mối quan hệ giữa 2 biến
ggplot(data, aes(x = Education, fill = MaritalStatus)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Hình 11: Mối quan hệ giữa Marital Status và Education",
    x = "Học vấn",
    y = "Số lượng",
    fill = "Tình trạng hôn nhân"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Biểu đồ và bảng thống kê cho thấy tình trạng hôn nhân phân bố không đồng đều theo trình độ học vấn. Nhóm chưa từng kết hôn chiếm tỷ lệ cao ở bậc HS-grad (2.680 người) và Some-college (2.422 người), trong khi nhóm ly hôn cũng đáng kể với 1.489 và 1.000 người ở hai bậc này. Nhóm goá và ly thân ít hơn nhưng vẫn trải rộng ở các bậc học. Ở các bậc học thấp như Preschool hay 1st-4th, số lượng người thuộc mọi tình trạng hôn nhân đều rất thấp.

b) Kiểm định Chi bình phương

Giả thuyết kiểm định:

\(H_0\): Biến MaritalStatus (tình trạng hôn nhân) không ảnh hưởng đến biến Education (học vấn)

\(H_1\): Biến MaritalStatus (tình trạng hôn nhân) có ảnh hưởng đến biến Education (học vấn)

# Kiểm định Chi-bình phương
chi_test <- chisq.test(tanso4)
## Warning in chisq.test(tanso4): Chi-squared approximation may be incorrect
chi_test
## 
##  Pearson's Chi-squared test
## 
## data:  tanso4
## X-squared = 561.08, df = 45, p-value < 2.2e-16

Với kết quả vừa kiểm định được, ta thấy rằng \(p-value < 2.2e-16 < 0.05\), ta bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết \(H_1\), tức biến MaritalStatus (tình trạng hôn nhân) có ảnh hưởng đến biến Education (học vấn) ở mức ý nghĩa 5%.

c) Tính Relative Risk và Odds Ratio

Để tính RR và OR chúng ta sẽ giới hạn hạng mục quan tâm. Vì ta cần quan tâm các biến tác động đến thu nhập như thế nào nên ta sẽ giữ nguyên 2 hạng mục của biến Income là BachelorsMasters. Với biến MaritalStatus, hạng mục quan tâm Never-marriedSeparated.

library(epitools)

# Làm sạch dữ liệu trước nếu cần
data$MaritalStatus <- trimws(data$MaritalStatus)
data$Education <- trimws(data$Education)

# Lọc ra những hàng có MaritalStatus và Education như yêu cầu
tsc4 <- subset(data,
               MaritalStatus %in% c("Never-married", "Separated") &
               Education %in% c("Bachelors", "Masters"))

# Bỏ levels không còn sử dụng (nếu biến là factor)
tsc4 <- droplevels(tsc4)

table4 <- table(tsc4$MaritalStatus, tsc4$Education)
kable (table4)
Bachelors Masters
Never-married 1664 377
Separated 83 23
#Tính RR
riskratio(table4)
## $data
##                
##                 Bachelors Masters Total
##   Never-married      1664     377  2041
##   Separated            83      23   106
##   Total              1747     400  2147
## 
## $measure
##                risk ratio with 95% C.I.
##                 estimate     lower    upper
##   Never-married 1.000000        NA       NA
##   Separated     1.174691 0.8090142 1.705655
## 
## $p.value
##                two-sided
##                 midp.exact fisher.exact chi.square
##   Never-married         NA           NA         NA
##   Separated      0.4048749    0.4420317  0.4054528
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
#Tính OR
oddsratio(table4)
## $data
##                
##                 Bachelors Masters Total
##   Never-married      1664     377  2041
##   Separated            83      23   106
##   Total              1747     400  2147
## 
## $measure
##                odds ratio with 95% C.I.
##                 estimate     lower    upper
##   Never-married 1.000000        NA       NA
##   Separated     1.228948 0.7468472 1.945653
## 
## $p.value
##                two-sided
##                 midp.exact fisher.exact chi.square
##   Never-married         NA           NA         NA
##   Separated      0.4048749    0.4420317  0.4054528
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả phân tích so sánh giữa hai nhóm tình trạng hôn nhân Never-marriedSeparate và cho thấy:

Tỷ số odds (odds ratio) = 1.23, nghĩa là người có tình trạng hôn nhân Separated có khả năng có học vấn Masters cao hơn khoảng 33% so với người có tình trạng hôn nhân là Never-married.

Khoảng tin cậy 95% (0.75 đến 1.95) cho thấy mức độ không chắc chắn: vì khoảng này có chứa giá trị 1, ta không thể kết luận chắc chắn rằng sự khác biệt là có thật.

Các giá trị p-value (mid-p = 0.404, Fisher = 0.44, Chi-square = 0.405) đều hơi lớn hơn 0.05, tức là không đủ mạnh để bác bỏ giả thuyết rằng hai tình trạng hồn nhân có cùng xác suất có học vấn Masters.


3.5. Biến Gender và Education

a) Bảng tần suất chéo và biểu đồ trực quan hóa

# Bần suất giữa Gender và Education
tanso5 <- table(data$Gender, data$Education) 
tansuat5 <- prop.table(tanso5, margin = 1) * 100

bang5 <- as.data.frame(tanso5)
bang5$Percentage <- round(as.vector(tansuat5), 2)

colnames(bang5) <- c("Gender", "Education", "Tần số", "Tần suất")
    
kable(bang5, caption = "Bảng 12: Mô tả thống kê của 2 biến Gender và Education")
Bảng 12: Mô tả thống kê của 2 biến Gender và Education
Gender Education Tần số Tần suất
Female 10th 204 2.63
Male 10th 239 3.32
Female 11th 319 4.11
Male 11th 339 4.71
Female 12th 101 1.30
Male 12th 143 1.99
Female 1st-4th 28 0.36
Male 1st-4th 30 0.42
Female 5th-6th 43 0.55
Male 5th-6th 58 0.81
Female 7th-8th 95 1.22
Male 7th-8th 105 1.46
Female 9th 91 1.17
Male 9th 120 1.67
Female Assoc-acdm 313 4.03
Male Assoc-acdm 235 3.27
Female Assoc-voc 363 4.67
Male Assoc-voc 258 3.59
Female Bachelors 1184 15.24
Male Bachelors 1140 15.85
Female Doctorate 60 0.77
Male Doctorate 50 0.70
Female HS-grad 2428 31.24
Male HS-grad 2409 33.50
Female Masters 389 5.01
Male Masters 275 3.82
Female Preschool 10 0.13
Male Preschool 14 0.19
Female Prof-school 60 0.77
Male Prof-school 91 1.27
Female Some-college 2083 26.80
Male Some-college 1685 23.43
#Trực quan hóa cho mối quan hệ giữa 2 biến
ggplot(data, aes(x = Education, fill = Gender)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Hình 12: Mối quan hệ giữa Gender và Education",
    x = "Học vấn",
    y = "Số lượng",
    fill = "Giới tính"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Biểu đồ và bảng thống kê cho thấy nam và nữ phân bố khá tương đồng ở hầu hết các bậc học, nhưng vẫn có sự chênh lệch nhẹ ở một số nhóm. Ở bậc HS-grad và Some-college, cả nam và nữ đều chiếm số lượng cao, trong đó nữ nhỉnh hơn ở Some-college (2.083 so với 1.685 nam), còn nam nhỉnh hơn ở HS-grad (2.409 so với 2.428 nữ). Nữ có tỷ lệ cao hơn ở bậc Assoc-acdm, Assoc-voc và Masters, trong khi nam chiếm ưu thế ở Prof-school và Preschool. Nhìn chung, nữ giới có xu hướng tập trung nhiều ở bậc học trung cấp và cao đẳng, còn nam có phần nổi bật hơn ở các bậc học nghề chuyên sâu.

b) Kiểm định Chi bình phương

Giả thuyết kiểm định:

\(H_0\): Biến Gender (Giới tính) không ảnh hưởng đến biến Education (học vấn) \(H_1\): Biến Gender (Giới tính) có ảnh hưởng đến biến Education (học vấn)

# Kiểm định Chi-bình phương
chi_test <- chisq.test(tanso5)
chi_test
## 
##  Pearson's Chi-squared test
## 
## data:  tanso5
## X-squared = 94.358, df = 15, p-value = 1.515e-13

Với kết quả vừa kiểm định được, ta thấy rằng \(p-value = 1.515e-13 < 0.05\), ta bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết \(H_1\), tức biến Gender (tình trạng hôn nhân) có ảnh hưởng đến biến Education (học vấn) ở mức ý nghĩa 5%.

c) Tính Relative Risk và Odds Ratio

Để tính RR và OR chúng ta sẽ giới hạn hạng mục quan tâm. Vì ta cần quan tâm các biến tác động đến thu nhập như thế nào nên ta sẽ giữ nguyên 2 hạng mục của biến Education là BachelorsMasters. Với biến Gender, hạng mục quan tâm FemaleMale.

library(epitools)

# Làm sạch dữ liệu trước nếu cần
data$Gender <- trimws(data$Gender)
data$Education <- trimws(data$Education)

# Lọc ra những hàng có Gender và Education như yêu cầu
tsc5 <- subset(data,
               Gender %in% c("Female", "Male") &
               Education %in% c("Bachelors", "Masters"))

# Bỏ levels không còn sử dụng (nếu biến là factor)
tsc5 <- droplevels(tsc5)

table5 <- table(tsc5$Gender, tsc5$Education)
kable (table5)
Bachelors Masters
Female 1184 389
Male 1140 275
#Tính RR
riskratio(table5)
## $data
##         
##          Bachelors Masters Total
##   Female      1184     389  1573
##   Male        1140     275  1415
##   Total       2324     664  2988
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate     lower     upper
##   Female 1.0000000        NA        NA
##   Male   0.7858784 0.6854674 0.9009983
## 
## $p.value
##         two-sided
##            midp.exact fisher.exact   chi.square
##   Female           NA           NA           NA
##   Male   0.0005000726 0.0005817005 0.0005084621
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
#Tính OR
oddsratio(table5)
## $data
##         
##          Bachelors Masters Total
##   Female      1184     389  1573
##   Male        1140     275  1415
##   Total       2324     664  2988
## 
## $measure
##         odds ratio with 95% C.I.
##           estimate     lower     upper
##   Female 1.0000000        NA        NA
##   Male   0.7344075 0.6163703 0.8740925
## 
## $p.value
##         two-sided
##            midp.exact fisher.exact   chi.square
##   Female           NA           NA           NA
##   Male   0.0005000726 0.0005817005 0.0005084621
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả phân tích so sánh giữa hai nhóm giới tính MaleFemale và cho thấy:

Tỷ số odds (odds ratio) = 0.73, nghĩa là người có giới tính nam có khả năng có học vấn Masters thấp hơn khoảng 3.82% so với người có giới tính nữ.

Khoảng tin cậy 95% (0.62 đến 0.85) cho thấy mức độ chắc chắn: vì khoảng này không có chứa giá trị 1, ta thể kết luận chắc chắn rằng sự khác biệt là có thật.

Các giá trị p-value (mid-p = 0.0005, Fisher = 0.0005, Chi-square = 0.0005) đều bé hơn 0.05, tức đủ mạnh để bác bỏ giả thuyết rằng hai giới tính có cùng xác suất có học vấn Masters.


3.6. Biến Occupation và Education

a) Bảng tần suất chéo và biểu đồ trực quan hóa

# Bần suất giữa Gender và Education
tanso6 <- table(data$Occupation, data$Education) 
tansuat6 <- prop.table(tanso6, margin = 1) * 100

bang6 <- as.data.frame(tanso6)
bang6$Percentage <- round(as.vector(tansuat6), 2)

colnames(bang6) <- c("Occupation", "Education", "Tần số", "Tần suất")
    
kable(bang6, caption = "Bảng 13: Mô tả thống kê của 2 biến Occupation và Education")
Bảng 13: Mô tả thống kê của 2 biến Occupation và Education
Occupation Education Tần số Tần suất
Adm-clerical 10th 23 0.89
Armed-Forces 10th 0 0.00
Craft-repair 10th 56 4.06
Exec-managerial 10th 6 0.39
Farming-fishing 10th 21 5.75
Handlers-cleaners 10th 39 4.94
Machine-op-inspct 10th 52 5.73
Other-service 10th 150 6.54
Priv-house-serv 10th 5 4.46
Prof-specialty 10th 8 0.43
Protective-serv 10th 2 0.80
Sales 10th 52 2.84
Tech-support 10th 2 0.41
Transport-moving 10th 27 4.88
Adm-clerical 11th 52 2.02
Armed-Forces 11th 0 0.00
Craft-repair 11th 75 5.44
Exec-managerial 11th 15 0.98
Farming-fishing 11th 17 4.66
Handlers-cleaners 11th 80 10.13
Machine-op-inspct 11th 50 5.51
Other-service 11th 179 7.81
Priv-house-serv 11th 12 10.71
Prof-specialty 11th 16 0.85
Protective-serv 11th 5 2.00
Sales 11th 115 6.27
Tech-support 11th 4 0.82
Transport-moving 11th 38 6.87
Adm-clerical 12th 24 0.93
Armed-Forces 12th 0 0.00
Craft-repair 12th 17 1.23
Exec-managerial 12th 7 0.46
Farming-fishing 12th 11 3.01
Handlers-cleaners 12th 30 3.80
Machine-op-inspct 12th 22 2.42
Other-service 12th 66 2.88
Priv-house-serv 12th 3 2.68
Prof-specialty 12th 6 0.32
Protective-serv 12th 4 1.60
Sales 12th 36 1.96
Tech-support 12th 1 0.20
Transport-moving 12th 17 3.07
Adm-clerical 1st-4th 0 0.00
Armed-Forces 1st-4th 0 0.00
Craft-repair 1st-4th 6 0.44
Exec-managerial 1st-4th 1 0.07
Farming-fishing 1st-4th 7 1.92
Handlers-cleaners 1st-4th 6 0.76
Machine-op-inspct 1st-4th 9 0.99
Other-service 1st-4th 15 0.65
Priv-house-serv 1st-4th 9 8.04
Prof-specialty 1st-4th 2 0.11
Protective-serv 1st-4th 0 0.00
Sales 1st-4th 2 0.11
Tech-support 1st-4th 0 0.00
Transport-moving 1st-4th 1 0.18
Adm-clerical 5th-6th 2 0.08
Armed-Forces 5th-6th 0 0.00
Craft-repair 5th-6th 8 0.58
Exec-managerial 5th-6th 0 0.00
Farming-fishing 5th-6th 8 2.19
Handlers-cleaners 5th-6th 16 2.03
Machine-op-inspct 5th-6th 21 2.31
Other-service 5th-6th 23 1.00
Priv-house-serv 5th-6th 10 8.93
Prof-specialty 5th-6th 0 0.00
Protective-serv 5th-6th 0 0.00
Sales 5th-6th 4 0.22
Tech-support 5th-6th 1 0.20
Transport-moving 5th-6th 8 1.45
Adm-clerical 7th-8th 5 0.19
Armed-Forces 7th-8th 0 0.00
Craft-repair 7th-8th 26 1.89
Exec-managerial 7th-8th 3 0.20
Farming-fishing 7th-8th 21 5.75
Handlers-cleaners 7th-8th 19 2.41
Machine-op-inspct 7th-8th 39 4.30
Other-service 7th-8th 55 2.40
Priv-house-serv 7th-8th 7 6.25
Prof-specialty 7th-8th 0 0.00
Protective-serv 7th-8th 2 0.80
Sales 7th-8th 8 0.44
Tech-support 7th-8th 3 0.61
Transport-moving 7th-8th 12 2.17
Adm-clerical 9th 8 0.31
Armed-Forces 9th 0 0.00
Craft-repair 9th 30 2.18
Exec-managerial 9th 3 0.20
Farming-fishing 9th 8 2.19
Handlers-cleaners 9th 22 2.78
Machine-op-inspct 9th 29 3.19
Other-service 9th 66 2.88
Priv-house-serv 9th 9 8.04
Prof-specialty 9th 2 0.11
Protective-serv 9th 1 0.40
Sales 9th 22 1.20
Tech-support 9th 0 0.00
Transport-moving 9th 11 1.99
Adm-clerical Assoc-acdm 132 5.13
Armed-Forces Assoc-acdm 0 0.00
Craft-repair Assoc-acdm 48 3.48
Exec-managerial Assoc-acdm 65 4.25
Farming-fishing Assoc-acdm 3 0.82
Handlers-cleaners Assoc-acdm 11 1.39
Machine-op-inspct Assoc-acdm 15 1.65
Other-service Assoc-acdm 58 2.53
Priv-house-serv Assoc-acdm 1 0.89
Prof-specialty Assoc-acdm 82 4.36
Protective-serv Assoc-acdm 11 4.40
Sales Assoc-acdm 72 3.93
Tech-support Assoc-acdm 36 7.36
Transport-moving Assoc-acdm 14 2.53
Adm-clerical Assoc-voc 113 4.39
Armed-Forces Assoc-voc 0 0.00
Craft-repair Assoc-voc 75 5.44
Exec-managerial Assoc-voc 64 4.19
Farming-fishing Assoc-voc 15 4.11
Handlers-cleaners Assoc-voc 9 1.14
Machine-op-inspct Assoc-voc 26 2.86
Other-service Assoc-voc 74 3.23
Priv-house-serv Assoc-voc 4 3.57
Prof-specialty Assoc-voc 92 4.89
Protective-serv Assoc-voc 20 8.00
Sales Assoc-voc 51 2.78
Tech-support Assoc-voc 66 13.50
Transport-moving Assoc-voc 12 2.17
Adm-clerical Bachelors 314 12.19
Armed-Forces Bachelors 1 20.00
Craft-repair Bachelors 70 5.08
Exec-managerial Bachelors 486 31.79
Farming-fishing Bachelors 26 7.12
Handlers-cleaners Bachelors 25 3.16
Machine-op-inspct Bachelors 22 2.42
Other-service Bachelors 110 4.80
Priv-house-serv Bachelors 5 4.46
Prof-specialty Bachelors 747 39.71
Protective-serv Bachelors 35 14.00
Sales Bachelors 340 18.55
Tech-support Bachelors 125 25.56
Transport-moving Bachelors 18 3.25
Adm-clerical Doctorate 2 0.08
Armed-Forces Doctorate 0 0.00
Craft-repair Doctorate 1 0.07
Exec-managerial Doctorate 13 0.85
Farming-fishing Doctorate 0 0.00
Handlers-cleaners Doctorate 0 0.00
Machine-op-inspct Doctorate 1 0.11
Other-service Doctorate 0 0.00
Priv-house-serv Doctorate 0 0.00
Prof-specialty Doctorate 90 4.78
Protective-serv Doctorate 0 0.00
Sales Doctorate 3 0.16
Tech-support Doctorate 0 0.00
Transport-moving Doctorate 0 0.00
Adm-clerical HS-grad 920 35.73
Armed-Forces HS-grad 3 60.00
Craft-repair HS-grad 652 47.28
Exec-managerial HS-grad 319 20.86
Farming-fishing HS-grad 151 41.37
Handlers-cleaners HS-grad 356 45.06
Machine-op-inspct HS-grad 456 50.22
Other-service HS-grad 864 37.68
Priv-house-serv HS-grad 33 29.46
Prof-specialty HS-grad 111 5.90
Protective-serv HS-grad 82 32.80
Sales HS-grad 526 28.70
Tech-support HS-grad 76 15.54
Transport-moving HS-grad 288 52.08
Adm-clerical Masters 37 1.44
Armed-Forces Masters 0 0.00
Craft-repair Masters 4 0.29
Exec-managerial Masters 156 10.20
Farming-fishing Masters 2 0.55
Handlers-cleaners Masters 3 0.38
Machine-op-inspct Masters 2 0.22
Other-service Masters 13 0.57
Priv-house-serv Masters 0 0.00
Prof-specialty Masters 376 19.99
Protective-serv Masters 8 3.20
Sales Masters 44 2.40
Tech-support Masters 15 3.07
Transport-moving Masters 4 0.72
Adm-clerical Preschool 1 0.04
Armed-Forces Preschool 0 0.00
Craft-repair Preschool 1 0.07
Exec-managerial Preschool 0 0.00
Farming-fishing Preschool 6 1.64
Handlers-cleaners Preschool 2 0.25
Machine-op-inspct Preschool 5 0.55
Other-service Preschool 8 0.35
Priv-house-serv Preschool 1 0.89
Prof-specialty Preschool 0 0.00
Protective-serv Preschool 0 0.00
Sales Preschool 0 0.00
Tech-support Preschool 0 0.00
Transport-moving Preschool 0 0.00
Adm-clerical Prof-school 2 0.08
Armed-Forces Prof-school 0 0.00
Craft-repair Prof-school 1 0.07
Exec-managerial Prof-school 12 0.78
Farming-fishing Prof-school 1 0.27
Handlers-cleaners Prof-school 0 0.00
Machine-op-inspct Prof-school 0 0.00
Other-service Prof-school 3 0.13
Priv-house-serv Prof-school 0 0.00
Prof-specialty Prof-school 123 6.54
Protective-serv Prof-school 0 0.00
Sales Prof-school 4 0.22
Tech-support Prof-school 5 1.02
Transport-moving Prof-school 0 0.00
Adm-clerical Some-college 940 36.50
Armed-Forces Some-college 1 20.00
Craft-repair Some-college 309 22.41
Exec-managerial Some-college 379 24.79
Farming-fishing Some-college 68 18.63
Handlers-cleaners Some-college 172 21.77
Machine-op-inspct Some-college 159 17.51
Other-service Some-college 609 26.56
Priv-house-serv Some-college 13 11.61
Prof-specialty Some-college 226 12.01
Protective-serv Some-college 80 32.00
Sales Some-college 554 30.22
Tech-support Some-college 155 31.70
Transport-moving Some-college 103 18.63
#Trực quan hóa cho mối quan hệ giữa 2 biến
ggplot(data, aes(x = Education, fill = Occupation)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Hình 13: Mối quan hệ giữa Occupation và Education",
    x = "Học vấn",
    y = "Số lượng",
    fill = "Nghề nghiệp"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Biểu đồ và bảng thống kê cho thấy sự phân bố nghề nghiệp khác nhau rõ rệt theo trình độ học vấn. Ở bậc HS-grad và Some-college, các nhóm nghề như Adm-clerical (920 và 940 người), Sales (526 và 554) và Other-service (864 và 609) chiếm tỷ lệ cao. Nghề chuyên môn cao (Prof-specialty) tập trung chủ yếu ở bậc Bachelors (747 người) và Masters (376 người). Trong khi đó, các nhóm lao động tay chân như Handlers-cleaners, Machine-op-inspct và Craft-repair phổ biến hơn ở nhóm học vấn phổ thông và trung cấp. Các nghề như Exec-managerial và Tech-support cũng tăng rõ ở bậc Bachelors và Some-college. Nhìn chung, nghề nghiệp có xu hướng phân hóa mạnh theo học vấn, với các nghề kỹ thuật và chuyên môn tập trung ở nhóm có học vấn cao.

b) Kiểm định Chi bình phương

Giả thuyết kiểm định:

\(H_0\): Biến Occupation (nghề nghiệp) không ảnh hưởng đến biến Education (học vấn)

\(H_1\): Biến Occupation (nghề nghiệp) có ảnh hưởng đến biến Education (học vấn)

# Kiểm định Chi-bình phương
chi_test <- chisq.test(tanso6)
## Warning in chisq.test(tanso6): Chi-squared approximation may be incorrect
chi_test
## 
##  Pearson's Chi-squared test
## 
## data:  tanso6
## X-squared = 7257.9, df = 195, p-value < 2.2e-16

Với kết quả vừa kiểm định được, ta thấy rằng \(p-value < 2.2e-16 < 0.05\), ta bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết \(H_1\), tức biến Occupation (nghề nghiệp) có ảnh hưởng đến biến Education (học vấn) ở mức ý nghĩa 5%.

c) Tính Relative Risk và Odds Ratio

Để tính RR và OR chúng ta sẽ giới hạn hạng mục quan tâm. Vì ta cần quan tâm các biến tác động đến thu nhập như thế nào nên ta sẽ giữ nguyên 2 hạng mục của biến Education là BachelorsMasters. Với biến Occupation, hạng mục quan tâm SalesTransport-moving.

library(epitools)

# Làm sạch dữ liệu trước nếu cần
data$Occupation <- trimws(data$Occupation)
data$Education <- trimws(data$Education)

# Lọc ra những hàng có Occupation và Education như yêu cầu
tsc6 <- subset(data,
               Occupation %in% c("Sales", "Transport-moving") &
               Education %in% c("Bachelors", "Masters"))

# Bỏ levels không còn sử dụng (nếu biến là factor)
tsc6 <- droplevels(tsc6)

table6 <- table(tsc6$Occupation, tsc6$Education)
kable (table6)
Bachelors Masters
Sales 340 44
Transport-moving 18 4
#Tính RR
riskratio(table6)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##                   
##                    Bachelors Masters Total
##   Sales                  340      44   384
##   Transport-moving        18       4    22
##   Total                  358      48   406
## 
## $measure
##                   risk ratio with 95% C.I.
##                    estimate     lower    upper
##   Sales            1.000000        NA       NA
##   Transport-moving 1.586777 0.6266903 4.017711
## 
## $p.value
##                   two-sided
##                    midp.exact fisher.exact chi.square
##   Sales                    NA           NA         NA
##   Transport-moving  0.3588146    0.3128613  0.3421693
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
#Tính OR
oddsratio(table6)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##                   
##                    Bachelors Masters Total
##   Sales                  340      44   384
##   Transport-moving        18       4    22
##   Total                  358      48   406
## 
## $measure
##                   odds ratio with 95% C.I.
##                    estimate     lower    upper
##   Sales             1.00000        NA       NA
##   Transport-moving  1.76253 0.4782936 5.036821
## 
## $p.value
##                   two-sided
##                    midp.exact fisher.exact chi.square
##   Sales                    NA           NA         NA
##   Transport-moving  0.3588146    0.3128613  0.3421693
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả phân tích so sánh giữa hai nhóm nghề nghiệp SalesTransport-moving và cho thấy:

Tỷ số odds (odds ratio) = 1.59, nghĩa là người có nghề nghiệp là Transport-moving có khả năng có học vấn Masters cao hơn khoảng 0.72% so với người có nghề Sales.

Khoảng tin cậy 95% (0.62 đến 4.02) cho thấy mức độ chắc chắn: vì khoảng này không có chứa giá trị 1, ta thể kết luận chắc chắn rằng sự khác biệt là có thật.

Các giá trị p-value (mid-p = 0.36, Fisher = 0.31, Chi-square = 0.34) đều lớn hơn 0.05, tức chưa đủ mạnh để bác bỏ giả thuyết rằng hai nghề nghiệp có cùng xác suất có học vấn Masters.

PHẦN 4: PHÂN TÍCH HỒI QUY LOGISTIC VÀ PROBIT

với phần này, tác giả chọn biến phụ thuộc là biến Income.

4.1. MÔ HÌNH HỒI QUY LOGISTIC

#Chuyển biến Income sang nhị phân
data$Income.np <- ifelse(data$Income == ">50K", 1, 0)

# Ước lượng mô hình logit (link = "logit")
logit <- glm(Income.np ~ WorkClass + Education + MaritalStatus + Occupation + Gender + Country, data = data, family = binomial(link = "logit"))
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(logit)
## 
## Call:
## glm(formula = Income.np ~ WorkClass + Education + MaritalStatus + 
##     Occupation + Gender + Country, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                                      Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                         -19.18844 1693.13033  -0.011  0.99096    
## WorkClassLocal-gov                   -0.79494    0.20044  -3.966 7.31e-05 ***
## WorkClassPrivate                     -0.42249    0.16281  -2.595  0.00946 ** 
## WorkClassSelf-emp-inc                 0.01456    0.23821   0.061  0.95127    
## WorkClassSelf-emp-not-inc            -0.25011    0.20146  -1.241  0.21443    
## WorkClassState-gov                   -1.11571    0.23135  -4.823 1.42e-06 ***
## WorkClassWithout-pay                -13.92685 1736.60233  -0.008  0.99360    
## Education11th                         0.51655    0.46971   1.100  0.27146    
## Education12th                         0.11280    0.64304   0.175  0.86075    
## Education1st-4th                    -13.22702  485.08195  -0.027  0.97825    
## Education5th-6th                    -13.02164  369.53739  -0.035  0.97189    
## Education7th-8th                      0.13132    0.64635   0.203  0.83900    
## Education9th                          0.64261    0.57453   1.118  0.26335    
## EducationAssoc-acdm                   1.06895    0.42990   2.486  0.01290 *  
## EducationAssoc-voc                    1.13544    0.42350   2.681  0.00734 ** 
## EducationBachelors                    1.89441    0.39851   4.754 2.00e-06 ***
## EducationDoctorate                    3.96093    0.45121   8.778  < 2e-16 ***
## EducationHS-grad                      0.45107    0.39747   1.135  0.25644    
## EducationMasters                      2.56064    0.40737   6.286 3.26e-10 ***
## EducationPreschool                  -12.63533  738.17976  -0.017  0.98634    
## EducationProf-school                  3.45723    0.43645   7.921 2.35e-15 ***
## EducationSome-college                 0.72623    0.39933   1.819  0.06897 .  
## MaritalStatusNever-married           -0.98786    0.07952 -12.423  < 2e-16 ***
## MaritalStatusSeparated               -0.23349    0.15586  -1.498  0.13413    
## MaritalStatusWidowed                  0.41570    0.14666   2.834  0.00459 ** 
## OccupationArmed-Forces              -14.49691 1722.82327  -0.008  0.99329    
## OccupationCraft-repair                0.55168    0.17950   3.074  0.00212 ** 
## OccupationExec-managerial             1.40650    0.14769   9.523  < 2e-16 ***
## OccupationFarming-fishing            -0.14636    0.34600  -0.423  0.67229    
## OccupationHandlers-cleaners          -1.38295    0.47082  -2.937  0.00331 ** 
## OccupationMachine-op-inspct          -0.83426    0.34715  -2.403  0.01625 *  
## OccupationOther-service              -0.67070    0.23573  -2.845  0.00444 ** 
## OccupationPriv-house-serv            -0.66313    1.02781  -0.645  0.51880    
## OccupationProf-specialty              0.88540    0.15425   5.740 9.46e-09 ***
## OccupationProtective-serv             1.33699    0.25077   5.332 9.74e-08 ***
## OccupationSales                       0.74109    0.16106   4.601 4.20e-06 ***
## OccupationTech-support                0.62867    0.22083   2.847  0.00442 ** 
## OccupationTransport-moving            0.46553    0.24208   1.923  0.05447 .  
## GenderMale                            0.89374    0.07959  11.230  < 2e-16 ***
## Country Canada                       13.37564 1693.13062   0.008  0.99370    
## Country China                        14.84366 1693.13063   0.009  0.99301    
## Country Columbia                     14.73812 1693.13068   0.009  0.99305    
## Country Cuba                         13.60207 1693.13062   0.008  0.99359    
## Country Dominican-Republic           15.08807 1693.13069   0.009  0.99289    
## Country Ecuador                       2.10949 2198.85830   0.001  0.99923    
## Country El-Salvador                  14.76200 1693.13072   0.009  0.99304    
## Country England                      15.73794 1693.13035   0.009  0.99258    
## Country France                       15.59912 1693.13046   0.009  0.99265    
## Country Germany                      15.27945 1693.13035   0.009  0.99280    
## Country Greece                       17.65283 1693.13052   0.010  0.99168    
## Country Guatemala                    16.29688 1693.13063   0.010  0.99232    
## Country Haiti                         1.36287 1910.60104   0.001  0.99943    
## Country Honduras                      0.81716 2155.80366   0.000  0.99970    
## Country Hong                          0.47375 2495.04737   0.000  0.99985    
## Country Hungary                      15.37718 1693.13067   0.009  0.99275    
## Country India                        15.61051 1693.13038   0.009  0.99264    
## Country Iran                         14.00433 1693.13052   0.008  0.99340    
## Country Ireland                      15.39642 1693.13065   0.009  0.99274    
## Country Italy                        16.75228 1693.13043   0.010  0.99211    
## Country Jamaica                       0.95103 1780.67277   0.001  0.99957    
## Country Japan                        15.53866 1693.13045   0.009  0.99268    
## Country Laos                          1.65127 2257.99323   0.001  0.99942    
## Country Mexico                       15.30481 1693.13035   0.009  0.99279    
## Country Nicaragua                     1.28493 1933.70618   0.001  0.99947    
## Country Outlying-US(Guam-USVI-etc)    0.35246 2027.72521   0.000  0.99986    
## Country Peru                          1.40798 1900.90078   0.001  0.99941    
## Country Philippines                  15.62193 1693.13035   0.009  0.99264    
## Country Poland                       15.13533 1693.13062   0.009  0.99287    
## Country Portugal                     15.87979 1693.13065   0.009  0.99252    
## Country Puerto-Rico                  15.86611 1693.13041   0.009  0.99252    
## Country Scotland                     -0.26941 2225.36575   0.000  0.99990    
## Country South                        14.98791 1693.13047   0.009  0.99294    
## Country Taiwan                       15.01750 1693.13049   0.009  0.99292    
## Country Thailand                      0.07057 2082.11052   0.000  0.99997    
## Country Trinadad&Tobago               0.45660 2068.53973   0.000  0.99982    
## Country United-States                15.27885 1693.13029   0.009  0.99280    
## Country Vietnam                      15.08514 1693.13062   0.009  0.99289    
## Country Yugoslavia                    1.07209 2552.26185   0.000  0.99966    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 7614.0  on 14961  degrees of freedom
## Residual deviance: 5803.7  on 14884  degrees of freedom
## AIC: 5959.7
## 
## Number of Fisher Scoring iterations: 16

Kết quả cho thấy giới tính ảnh hưởng rõ rệt đến mức thu nhập, với nam giới có khả năng đạt thu nhập trên 50K cao hơn nữ giới. Cụ thể, hệ số của biến GenderMale là 0.89, nghĩa là nam giới có lợi thế thu nhập rõ rệt, có thể phản ánh chênh lệch giới trong cơ hội nghề nghiệp hoặc mức lương trên thị trường lao động.

Trình độ học vấn là yếu tố then chốt về kinh tế. Những người có bằng đại học (Bachelors: hệ số 1.89), thạc sĩ (Masters: 2.56), tiến sĩ (Doctorate: 3.96) hay tốt nghiệp trường chuyên môn (Prof-school: 3.46) đều có xác suất thu nhập cao hơn hẳn. Điều này cho thấy giá trị kinh tế của giáo dục bậc cao rất lớn, và đầu tư vào học vấn thực sự mang lại lợi ích tài chính đáng kể.

Tình trạng hôn nhân cũng liên quan đến thu nhập. Người chưa kết hôn (Never-married: -0.99) có khả năng thu nhập cao thấp hơn người đã kết hôn. Điều này có thể phản ánh rằng người kết hôn thường ổn định hơn về mặt xã hội và kinh tế, hoặc họ chọn lựa công việc/lộ trình nghề nghiệp khác với người độc thân.

Về nghề nghiệp, nhóm Exec-managerial (1.41) và Prof-specialty (0.88) là những nghề có hệ số dương lớn, cho thấy đây là những ngành nghề có giá trị kinh tế cao, thường yêu cầu kỹ năng và trình độ cao. Ngược lại, những nghề như lao động phổ thông, dịch vụ (Handlers-cleaners: -1.38) có hệ số âm rõ rệt, phản ánh thu nhập thấp gắn với công việc không đòi hỏi trình độ chuyên môn cao.

Ở góc độ loại hình công việc, những người làm trong khu vực nhà nước (Local-gov: -0.79, State-gov: -1.11) có xu hướng thu nhập thấp hơn khu vực tư nhân, phản ánh mức lương trong khu vực công thường ổn định nhưng thấp hơn thị trường, hoặc ít có cơ hội thưởng và tăng lương.

Cuối cùng, biến Country cho thấy nhiều hệ số cực cao với sai số chuẩn lớn và p-value không có ý nghĩa thống kê, phản ánh mô hình không rút ra được thông tin kinh tế đáng tin cậy từ quốc tịch – có thể do dữ liệu không đồng đều giữa các quốc gia. Về mặt kinh tế, điều này cho thấy cần có thêm dữ liệu hoặc gộp nhóm lại để phân tích có giá trị hơn.

4.2. MÔ HÌNH HỒI QUY PROBIT

#Chuyển biến Income sang nhị phân
data$Income.np <- ifelse(data$Income == ">50K", 1, 0)

# Ước lượng mô hình probit (link = "probit")
probit <- glm(Income.np ~ WorkClass + Education + MaritalStatus + Occupation + Gender + Country, data = data, family = binomial(link = "logit"))
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(probit)
## 
## Call:
## glm(formula = Income.np ~ WorkClass + Education + MaritalStatus + 
##     Occupation + Gender + Country, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                                      Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                         -19.18844 1693.13033  -0.011  0.99096    
## WorkClassLocal-gov                   -0.79494    0.20044  -3.966 7.31e-05 ***
## WorkClassPrivate                     -0.42249    0.16281  -2.595  0.00946 ** 
## WorkClassSelf-emp-inc                 0.01456    0.23821   0.061  0.95127    
## WorkClassSelf-emp-not-inc            -0.25011    0.20146  -1.241  0.21443    
## WorkClassState-gov                   -1.11571    0.23135  -4.823 1.42e-06 ***
## WorkClassWithout-pay                -13.92685 1736.60233  -0.008  0.99360    
## Education11th                         0.51655    0.46971   1.100  0.27146    
## Education12th                         0.11280    0.64304   0.175  0.86075    
## Education1st-4th                    -13.22702  485.08195  -0.027  0.97825    
## Education5th-6th                    -13.02164  369.53739  -0.035  0.97189    
## Education7th-8th                      0.13132    0.64635   0.203  0.83900    
## Education9th                          0.64261    0.57453   1.118  0.26335    
## EducationAssoc-acdm                   1.06895    0.42990   2.486  0.01290 *  
## EducationAssoc-voc                    1.13544    0.42350   2.681  0.00734 ** 
## EducationBachelors                    1.89441    0.39851   4.754 2.00e-06 ***
## EducationDoctorate                    3.96093    0.45121   8.778  < 2e-16 ***
## EducationHS-grad                      0.45107    0.39747   1.135  0.25644    
## EducationMasters                      2.56064    0.40737   6.286 3.26e-10 ***
## EducationPreschool                  -12.63533  738.17976  -0.017  0.98634    
## EducationProf-school                  3.45723    0.43645   7.921 2.35e-15 ***
## EducationSome-college                 0.72623    0.39933   1.819  0.06897 .  
## MaritalStatusNever-married           -0.98786    0.07952 -12.423  < 2e-16 ***
## MaritalStatusSeparated               -0.23349    0.15586  -1.498  0.13413    
## MaritalStatusWidowed                  0.41570    0.14666   2.834  0.00459 ** 
## OccupationArmed-Forces              -14.49691 1722.82327  -0.008  0.99329    
## OccupationCraft-repair                0.55168    0.17950   3.074  0.00212 ** 
## OccupationExec-managerial             1.40650    0.14769   9.523  < 2e-16 ***
## OccupationFarming-fishing            -0.14636    0.34600  -0.423  0.67229    
## OccupationHandlers-cleaners          -1.38295    0.47082  -2.937  0.00331 ** 
## OccupationMachine-op-inspct          -0.83426    0.34715  -2.403  0.01625 *  
## OccupationOther-service              -0.67070    0.23573  -2.845  0.00444 ** 
## OccupationPriv-house-serv            -0.66313    1.02781  -0.645  0.51880    
## OccupationProf-specialty              0.88540    0.15425   5.740 9.46e-09 ***
## OccupationProtective-serv             1.33699    0.25077   5.332 9.74e-08 ***
## OccupationSales                       0.74109    0.16106   4.601 4.20e-06 ***
## OccupationTech-support                0.62867    0.22083   2.847  0.00442 ** 
## OccupationTransport-moving            0.46553    0.24208   1.923  0.05447 .  
## GenderMale                            0.89374    0.07959  11.230  < 2e-16 ***
## Country Canada                       13.37564 1693.13062   0.008  0.99370    
## Country China                        14.84366 1693.13063   0.009  0.99301    
## Country Columbia                     14.73812 1693.13068   0.009  0.99305    
## Country Cuba                         13.60207 1693.13062   0.008  0.99359    
## Country Dominican-Republic           15.08807 1693.13069   0.009  0.99289    
## Country Ecuador                       2.10949 2198.85830   0.001  0.99923    
## Country El-Salvador                  14.76200 1693.13072   0.009  0.99304    
## Country England                      15.73794 1693.13035   0.009  0.99258    
## Country France                       15.59912 1693.13046   0.009  0.99265    
## Country Germany                      15.27945 1693.13035   0.009  0.99280    
## Country Greece                       17.65283 1693.13052   0.010  0.99168    
## Country Guatemala                    16.29688 1693.13063   0.010  0.99232    
## Country Haiti                         1.36287 1910.60104   0.001  0.99943    
## Country Honduras                      0.81716 2155.80366   0.000  0.99970    
## Country Hong                          0.47375 2495.04737   0.000  0.99985    
## Country Hungary                      15.37718 1693.13067   0.009  0.99275    
## Country India                        15.61051 1693.13038   0.009  0.99264    
## Country Iran                         14.00433 1693.13052   0.008  0.99340    
## Country Ireland                      15.39642 1693.13065   0.009  0.99274    
## Country Italy                        16.75228 1693.13043   0.010  0.99211    
## Country Jamaica                       0.95103 1780.67277   0.001  0.99957    
## Country Japan                        15.53866 1693.13045   0.009  0.99268    
## Country Laos                          1.65127 2257.99323   0.001  0.99942    
## Country Mexico                       15.30481 1693.13035   0.009  0.99279    
## Country Nicaragua                     1.28493 1933.70618   0.001  0.99947    
## Country Outlying-US(Guam-USVI-etc)    0.35246 2027.72521   0.000  0.99986    
## Country Peru                          1.40798 1900.90078   0.001  0.99941    
## Country Philippines                  15.62193 1693.13035   0.009  0.99264    
## Country Poland                       15.13533 1693.13062   0.009  0.99287    
## Country Portugal                     15.87979 1693.13065   0.009  0.99252    
## Country Puerto-Rico                  15.86611 1693.13041   0.009  0.99252    
## Country Scotland                     -0.26941 2225.36575   0.000  0.99990    
## Country South                        14.98791 1693.13047   0.009  0.99294    
## Country Taiwan                       15.01750 1693.13049   0.009  0.99292    
## Country Thailand                      0.07057 2082.11052   0.000  0.99997    
## Country Trinadad&Tobago               0.45660 2068.53973   0.000  0.99982    
## Country United-States                15.27885 1693.13029   0.009  0.99280    
## Country Vietnam                      15.08514 1693.13062   0.009  0.99289    
## Country Yugoslavia                    1.07209 2552.26185   0.000  0.99966    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 7614.0  on 14961  degrees of freedom
## Residual deviance: 5803.7  on 14884  degrees of freedom
## AIC: 5959.7
## 
## Number of Fisher Scoring iterations: 16

Giới tính: Nam giới có lợi thế rõ rệt—hệ số 0.89, p < 0.001—nghĩa là sau khi kiểm soát các yếu tố khác, nam có xác suất vượt mốc 50 K cao hơn nữ.

Học vấn: Giá trị kinh tế của giáo dục rất lớn. Cử nhân (1.89, p ≈ 2 × 10‑6), thạc sĩ (2.56, p ≈ 3 × 10‑10) và đặc biệt tiến sĩ (3.96, p < 2 × 10‑16) đều tăng mạnh cơ hội thu nhập cao; trình độ càng cao, xác suất càng lớn.

Nghề nghiệp: Các vị trí chuyên môn/ quản lý mang lại thu nhập tốt—exec‑managerial (1.41, p < 2 × 10‑16), prof‑specialty (0.89, p ≈ 9 × 10‑9), protective‑service (1.34, p ≈ 1 × 10‑7). Ngược lại, lao động phổ thông như handlers‑cleaners (‑1.38, p ≈ 0.003) làm giảm đáng kể cơ hội.

Loại hình công việc: Làm khu vực công kéo thu nhập xuống; state‑gov (‑1.12, p ≈ 1 × 10‑6) và local‑gov (‑0.79, p ≈ 7 × 10‑5) đều giảm xác suất so với nhóm tham chiếu tư nhân.

Tình trạng hôn nhân: Người chưa từng kết hôn chịu bất lợi—hệ số ‑0.99, p < 2 × 10‑16—hàm ý ổn định gia đình có liên quan tới mức lương cao.

Quốc tịch: Hệ số cực lớn (≈ 13–17) nhưng p‑value ≈ 1 và sai số chuẩn khổng lồ cho thấy biến Country không hữu ích; cần gộp nhóm hoặc loại bỏ vì mất cân bằng dữ liệu.

Tóm lại, đầu tư vào giáo dục cao, chọn nghề chuyên môn hoặc quản lý, làm việc khu vực tư nhân và ổn định hôn nhân là các “đòn bẩy” kinh tế lớn nhất giúp cá nhân vươn tới thu nhập trên 50 K.

LS0tDQp0aXRsZTogIk5ISeG7hk0gVuG7pCA0Ig0KYXV0aG9yOiAiTmd1eeG7hW4gUGjhuqFtIFRow7p5IEFuIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICBudW1iZXIgc2VjdGlvbjogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+DQoNCiMgKipQSOG6pk4gMTogVMOMTSBISeG7glUgVsOAIENIVeG6qE4gQuG7iiBE4buuIExJ4buGVSoqDQpfX18NCiMjICoqMS4xLiDEkOG7jWMgdsOgIHTDrG0gaGnhu4N1IGPhuqV1IHRyw7pjIGZpbGUgZOG7ryBsaeG7h3UqKg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCmBgYA0KDQpgYGB7cn0NCmRhdGEgPC0gcmVhZC5jc3YoZmlsZT0nQzovVXNlcnMvQWRtaW4vRG93bmxvYWRzL2RhdGEgdzQuY3N2JywgaGVhZGVyID0gVCkNCg0KI2hp4buDbiB0aOG7iyBj4bqldSB0csO6YyBk4buvIGxp4buHdQ0Kc3RyKGRhdGEpDQpgYGANCg0KROG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgcGjDom4gdMOtY2ggbMOgIGLhu5kgKipBZHVsdCBJbmNvbWUqKiwgdGjhu4MgaGnhu4duIG3hu6ljIHRodSBuaOG6rXAgY+G7p2EgbeG7mXQgbmfGsOG7nWkgbOG7m24gdHJvbmcgMSBuxINtLiBC4buZIGThu68gbGnhu4d1IGJhbyBn4buTbSAqKjE0OTYyIHF1YW4gc8OhdCoqIHTGsMahbmcg4bupbmcgduG7m2kgMTQ5NjIgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQgdsOgICoqOCBiaeG6v24qKiBiYW8gZ+G7k206DQoNCiogKipBZ2UqKjpUdeG7lWkgIA0KDQoqICoqV29yayBjbGFzcyoqOkzhu5twIGPDtG5nIHZp4buHYw0KICAqICpQcml2YXRlKjogTMOgbSBjaG8gY8O0bmcgdHkgdMawIG5ow6JuDQogICogKlNlbGYtZW1wLW5vdC1pbmMqOiBU4buxIGzDoG0gY2jhu6csIGtow7RuZyB0aMOgbmggbOG6rXAgY8O0bmcgdHkgKGZyZWVsYW5jZXIsIGjhu5kga2luaCBkb2FuaCkNCiAgKiAqU3RhdGUtZ292KjogTMOgbSBjaG8gY2jDrW5oIHF1eeG7gW4gYmFuZw0KICAqICpGZWRlcmFsLWdvdio6IEzDoG0gY2hvIGNow61uaCBwaOG7pyBsacOqbiBiYW5nDQogICogKkxvY2FsLWdvdio6IEzDoG0gY2hvIGNow61uaCBxdXnhu4FuIMSR4buLYSBwaMawxqFuZw0KICAqICpTZWxmLWVtcC1pbmMqOiBU4buxIGzDoG0gY2jhu6cgY8OzIHRow6BuaCBs4bqtcCBjw7RuZyB0eQ0KICAqICpXaXRob3V0LXBheSo6IEzDoG0ga2jDtG5nIGPDsyBsxrDGoW5nDQogICogKk5ldmVyLXdvcmtlZCo6IENoxrBhIHThu6tuZyBsw6BtIHZp4buHYw0KICANCiogKipFZHVjYXRpb24qKjogSOG7jWMgduG6pW4NCiAgKiAqUHJlc2Nob29sKjogTeG6q3UgZ2nDoW8NCiAgKiAqMXN0LTR0aCwgNXRoLTZ0aCwgN3RoLTh0aCwgOXRoLCAxMHRoLCAxMXRoLCAxMnRoKjogQ8OhYyBs4bubcCB0aeG7g3UgaOG7jWMgdsOgIHRydW5nIGjhu41jIGPGoSBz4bufDQogICogKkhTLWdyYWQqOiBU4buRdCBuZ2hp4buHcCB0cnVuZyBo4buNYyBwaOG7lSB0aMO0bmcNCiAgKiAqU29tZS1jb2xsZWdlKjogSOG7jWMgxJHhuqFpIGjhu41jL2NhbyDEkeG6s25nIG5oxrBuZyBjaMawYSB04buRdCBuZ2hp4buHcA0KICAqICpBc3NvYy1hY2RtKjogQuG6sW5nIGNhbyDEkeG6s25nIGjhu41jIHRodeG6rXQgKEFzc29jaWF0ZSBkZWdyZWUgLSBhY2FkZW1pYykNCiAgKiAqQXNzb2Mtdm9jKjogQuG6sW5nIGNhbyDEkeG6s25nIG5naOG7gSAodm9jYXRpb25hbCkNCiAgKiAqQmFjaGVsb3JzKjogQ+G7rSBuaMOibiAoxJHhuqFpIGjhu41jKQ0KICAqICpNYXN0ZXJzKjogVGjhuqFjIHPEqQ0KICAqICpQcm9mLXNjaG9vbCo6IFRyxrDhu51uZyBjaHV5w6puIG5naGnhu4dwIChiw6FjIHPEqSwgbHXhuq10IHPGsCwgbmhhIHPEqSwuLi4pDQogICogKkRvY3RvcmF0ZSo6IFRp4bq/biBzxKkNCiAgDQoqICoqTWFyaXRhbCBTdGF0dXMqKjogVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuDQogICogKkRpdm9yY2VkKjogxJDDoyBseSBow7RuDQogICogKk5ldmVyLW1hcnJpZWQqOiBDaMawYSB04burbmcga+G6v3QgaMO0bg0KICAqICpTZXBhcmF0ZWQqOiBMeSB0aMOibiANCiAgKiAqV2lkb3dlZCo6IEfDs2EgKGNo4buTbmcvduG7oyDEkcOjIG3huqV0KQ0KICANCiogKipPY2N1cGF0aW9uKio6IE5naOG7gSBuZ2hp4buHcA0KICAqICpBZG0tY2xlcmljYWwqOiBIw6BuaCBjaMOtbmgsIHbEg24gcGjDsm5nDQogICogKkFybWVkLUZvcmNlcyo6IFF1w6JuIMSR4buZaQ0KICAqICpDcmFmdC1yZXBhaXIqOiBUaOG7oyB0aOG7pyBjw7RuZywgc+G7rWEgY2jhu69hDQogICogKkV4ZWMtbWFuYWdlcmlhbCo6IFF14bqjbiBsw70sIMSRaeG7gXUgaMOgbmgNCiAgKiAqRmFybWluZy1maXNoaW5nKjogTsO0bmcg4oCTIG5nxrAgbmdoaeG7h3ANCiAgKiAqSGFuZGxlcnMtY2xlYW5lcnMqOiBLaHXDom4gdsOhYywgZOG7jW4gZOG6uXANCiAgKiAqTWFjaGluZS1vcC1pbnNwY3QqOiBW4bqtbiBow6BuaCBtw6F5IG3Ds2MsIGtp4buDbSB0cmENCiAgKiAqT3RoZXItc2VydmljZSo6IEThu4tjaCB24bulIGtow6FjDQogICogKlByaXYtaG91c2Utc2Vydio6IEdpw7pwIHZp4buHYyBuaMOgIHTGsA0KICAqICpQcm9mLXNwZWNpYWx0eSo6IE5naOG7gSBjaHV5w6puIG3DtG4gY2FvIChiw6FjIHPEqSwga+G7uSBzxrAuLi4pDQogICogKlByb3RlY3RpdmUtc2Vydio6IEThu4tjaCB24bulIGLhuqNvIHbhu4cNCiAgKiAqU2FsZXMqOiBCw6FuIGjDoG5nDQogICogKlRlY2gtc3VwcG9ydCo6IEjhu5cgdHLhu6Mga+G7uSB0aHXhuq10DQogICogKlRyYW5zcG9ydC1tb3ZpbmcqOiBHaWFvIHRow7RuZywgduG6rW4gdOG6o2kNCiAgDQoqICoqR2VuZGVyKio6IEdp4bubaSB0w61uaA0KICAqICpGZW1hbGUqOiBO4buvDQogICogKk1hbGUqOiBOYW0NCiAgDQoqICoqSW5jb21lKio6IFRodSBuaOG6rXANCiAgKiAqPD0gNTAqOiBUaOG6pXAgaMahbiA1MGsgxJHDtCBsYS9uxINtDQogICogKj4gNTAqOiBOaGnhu4F1IGjGoW4gNTBrIMSRw7QgbGEvbsSDbQ0KDQpOZ2/huqFpIHRy4burIGJp4bq/biAnQWdlJyB0aMOsIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gY8OybiBs4bqhaSDEkeG7gXUgbMOgIGJp4bq/biDEkeG7i25oIHTDrW5oLg0KDQpfX18NCiMjICoqMS4yLiBLaeG7g20gdHJhIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgqKg0KDQoqKktp4buDbSB0cmEgTkEgY2hvIGThu68gbGnhu4d1KioNCg0KYGBge3J9DQojZ29tIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggDQpkaW5odGluaCA8LSBjKCdXb3JrQ2xhc3MnLCdFZHVjYXRpb24nLCAnTWFyaXRhbFN0YXR1cycsICdPY2N1cGF0aW9uJywgJ0dlbmRlcicsICdJbmNvbWUnKQ0KZGF0YV9kaW5odGluaCA8LSBkYXRhWyxkaW5odGluaF0NCg0KI2tp4buDbSB0cmEgZOG7ryBsaeG7h3UgTkEgY+G7p2EgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0Kc3VtKGlzLm5hKGRhdGFfZGluaHRpbmgpKQ0KDQpjb2xTdW1zKGlzLm5hKGRhdGFfZGluaHRpbmgpKQ0KYGBgDQoNCkvhur90IHF14bqjIHRy4bqjIHbhu4EgY2hvIHRhIHRo4bqleSBy4bqxbmcsIHbhu5tpIDcgYmnhur9uIMSR4buLbmggdMOtbmgsIGtow7RuZyBjw7MgZOG7ryBsaeG7h3UgdHLhu5FuZyAoTkEpLg0KDQpTYXUgxJHDsywgY2jDum5nIHRhIHPhur0ga2nhu4NtIHRyYSB4ZW0gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7MgcGjhuqNpIGzDoCBmYWN0b3IgaGF5IGtow7RuZy4gTuG6v3UgY2jDum5nIGtow7RuZyBwaOG6o2kgbMOgIGZhY3RvciB0aMOsIHRhIHPhur0gY2h1eeG7g24gxJHhu5VpIGNow7puZyBzYW5nIGThuqFuZyBmYWN0b3IuICANCg0KKipLaeG7g20gdHJhIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggY8OzIHBo4bqjaSBsw6AgZmFjdG9yIGhheSBjaMawYSoqDQoNCmBgYHtyfQ0KI2tp4buDbSB0cmEgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7MgcGjhuqNpIGzDoCBmYWN0b3IgaGF5IGNoxrBhDQpmb3IgKGkgaW4gMTpuY29sKGRhdGFfZGluaHRpbmgpKSB7DQogIGEgPC0gaXMuZmFjdG9yKGRhdGFfZGluaHRpbmhbLGldKQ0KICBjYXQoY29sbmFtZXMoZGF0YV9kaW5odGluaClbaV0sIjoiLGEsIlxuIikNCn0NCmBgYA0KDQpL4bq/dCBxdeG6oyBraeG7g20gdHJhIGNobyB0YSB0aOG6pXkgcuG6sW5nLCA3IGJp4bq/biDEkeG7i25oIHTDrW5oIMSRYW5nIGtow7RuZyBwaOG6o2kgbMOgIGZhY3Rvci4gVsOsIHbhuq15LCB0YSB0aeG6v24gaMOgbmggY2h1eeG7g24gNyBiaeG6v24gbsOgeSB24buBIGThuqFuZyBmYWN0b3IsIG5oxrAgc2F1Og0KDQpgYGB7cn0NCiMgQ2h1eeG7g24gduG7gSBk4bqhbmcgZmFjdG9yIA0KDQpmb3IgKGkgaW4gMTpuY29sKGRhdGFfZGluaHRpbmgpKSB7DQogIGRhdGFfZGluaHRpbmhbLGldIDwtIGFzLmZhY3RvcihkYXRhX2Rpbmh0aW5oWyxpXSkNCn0NCg0KIyBLaeG7g20gdHJhIGzhuqFpIA0KZm9yIChpIGluIDE6bmNvbChkYXRhX2Rpbmh0aW5oKSkgew0KICBhIDwtIGlzLmZhY3RvcihkYXRhX2Rpbmh0aW5oWyxpXSkNCiAgY2F0KGNvbG5hbWVzKGRhdGFfZGluaHRpbmgpW2ldLCI6IixhLCJcbiIpDQp9DQpgYGANCg0KTMO6YyBuw6B5LCBr4bq/dCBxdeG6oyDEkcOjIGNobyByYSA3IGJp4bq/biDEkeG7i25oIHTDrW5oIMSRw6MgbMOgIGZhY3Rvci4gVmnhu4djIGNodXnhu4NuIMSR4buVaSBuw6B5IHPhur0gZ2nDunAgUiBoaeG7g3UgcsO1IGLhuqNuIGNo4bqldCBj4bunYSBiaeG6v24gcGjDom4gbG/huqFpIHbDoCBo4buXIHRy4bujIHThu5F0IGjGoW4gY2hvIHF1w6EgdHLDrG5oIHRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UuDQoNCl9fXw0KIyAqKlBI4bqmTiAyOiBQSMOCTiBUw41DSCBNw5QgVOG6oiBN4buYVCBCSeG6vk4gxJDhu4pOSCBUw41OSCoqDQojIyAqKjIuMS4gQmnhur9uIFdvcmsgQ2xhc3MqKg0KDQojIyMgKiphKSBUaOG7kW5nIGvDqiBtw7QgdOG6oyoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgbcO0IHThuqMgdGjhu5FuZyBrw6ogYmnhur9uIFdvcmsgQ2xhc3MNCnRhbnNvLndvcmtjbGFzcyA8LSB0YWJsZShkYXRhJFdvcmtDbGFzcykNCnRhbnN1YXQud29ya2NsYXNzIDwtIHByb3AudGFibGUodGFuc28ud29ya2NsYXNzKSAqIDEwMA0KDQp3b3JrY2xhc3MgPC0gZGF0YS5mcmFtZShXb3JrQ2xhc3MgPSBuYW1lcyh0YW5zby53b3JrY2xhc3MpLCBUYW5TbyA9IGFzLnZlY3Rvcih0YW5zby53b3JrY2xhc3MpLCBUYW5TdWF0ID0gYXMudmVjdG9yKHRhbnN1YXQud29ya2NsYXNzKSkNCg0Ka2FibGUod29ya2NsYXNzLCBjYXB0aW9uID0gIkLhuqNuZyAxOiBNw7QgdOG6oyB0aOG7kW5nIGvDqiBj4bunYSBiaeG6v24gV29yayBDbGFzcyIpDQoNCg0KIyBCaeG7g3UgxJHhu5MgYmnhur9uIFdvcmsgQ2xhc3MNCmNvdW50cyA8LSBkYXRhICU+JSANCiAgZ3JvdXBfYnkoV29ya0NsYXNzKSAlPiUgDQogIHN1bW1hcmlzZShDb3VudCA9IG4oKSkNCg0KZ2dwbG90KGNvdW50cywgYWVzKHggPSBXb3JrQ2xhc3MsIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAnc2t5Ymx1ZScpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBzaXplID0gNCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkjDrG5oIDE6IEJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gYmnhur9uIFdvcmsgQ2xhc3MiLA0KICAgIHggPSAnTOG7m3AgY8O0bmcgdmnhu4djJywNCiAgICB5ID0gJ1Phu5EgbMaw4bujbmcgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQnDQogICkNCmBgYA0KDQpCaeG6v24gV29yayBDbGFzcyB0aOG7gyBoaeG7h24gc+G7sSBwaMOibiBi4buRIGtow7RuZyDEkeG7k25nIMSR4buBdSByw7UgcuG7h3QgZ2nhu69hIGPDoWMgbmjDs20uIE5ow7NtIFByaXZhdGUgY2hp4bq/bSDGsHUgdGjhur8gdHV54buHdCDEkeG7kWkgduG7m2kgNzgsODYlIHPhu5EgcXVhbiBzw6F0LCB2xrDhu6N0IHRy4buZaSBzbyB24bubaSBjw6FjIG5ow7NtIGPDsm4gbOG6oWkuIEPDoWMgbmjDs20gbmjGsCBTZWxmLWVtcC1pbmMsIEZlZGVyYWwtZ292IHbDoCDEkeG6t2MgYmnhu4d0IGzDoG0gV2l0aG91dC1wYXkgY8OzIHThuqduIHN14bqldCBy4bqldCB0aOG6pXAsIGNobyB0aOG6pXkgc+G7sSBjaMOqbmggbOG7h2NoIGzhu5tuIGdp4buvYSBjw6FjIGxv4bqhaSBow6xuaCBjw7RuZyB2aeG7h2MgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQuDQoNCiMjIyAqKmIpIMav4bubYyBsxrDhu6NuZyBraG/huqNuZyAtIGjhuqFuZyBt4bulYyBQcml2YXRlKioNCg0KYGBge3J9DQojIMav4bubYyBsxrDhu6NuZyBraG/huqNuZyBQcml2YXRlIChMw6BtIGNobyBjw7RuZyB0eSB0xrAgbmjDom4pDQpkYXRhJFdvcmtDbGFzcyA8LSB0cmltd3MoZGF0YSRXb3JrQ2xhc3MpDQoNCnRhYmxlKGRhdGEkV29ya0NsYXNzKQ0KdG90YWw9IHN1bSh0YWJsZShkYXRhJFdvcmtDbGFzcykpDQoNClNvLnByaXZhdGUgPSB0YWJsZShkYXRhJFdvcmtDbGFzcylbWyJQcml2YXRlIl1dDQoNCiN24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlDQpwcm9wLnRlc3QoU28ucHJpdmF0ZSwgdG90YWwsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KYGBgDQoNClbhu5tpIGvhur90IHF14bqjIHRyw6puLCB0YSBjw7MgxJHGsOG7o2Mga2hv4bqjbmcgdGluIGPhuq15IHThu7cgbOG7hyBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCBsw6BtIGNobyBjw7RuZyB0eSB0xrAgbmjDom4gdHJvbmcgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgKio3OC4xOSUqKiDEkeG6v24gKio3OS41MSUqKi4NCg0KIyMjICoqYykgS2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QqKg0KDQpHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoNCg0KJEhfMCQ6IFThu7cgbOG7hyBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCBsw6BtIGNobyBjw7RuZyB0eSB0xrAgbmjDom4gdHJvbmcgdOG7lW5nIHPhu5EgcXVhbiBzw6F0IGLhurFuZyA1MCUNCg0KJEhfMSQ6IFThu7cgbOG7hyBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCBsw6BtIGNobyBjw7RuZyB0eSB0xrAgbmjDom4gdHJvbmcgdOG7lW5nIHPhu5EgcXVhbiBzw6F0IGtow6FjIDUwJQ0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggSDA6IHAgPSAwLjUNCg0KcHJvcC50ZXN0KFNvLnByaXZhdGUsIHRvdGFsLCBwID0gMC41KQ0KYGBgDQoNClbhu5tpIGvhur90IHF14bqjIHbhu6thIGtp4buDbSDEkeG7i25oIMSRxrDhu6NjLCB0YSB0aOG6pXkgcuG6sW5nICRwLXZhbHVlIDwgMi4yZS0xNiA8IDAuMDUkLCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQgdsOgIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMSQsIHThu6ljIHThu7cgbOG7hyBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCBsw6BtIGNobyBjw7RuZyB0eSB0xrAgbmjDom4gdHJvbmcgdOG7lW5nIHPhu5EgcXVhbiBzw6F0ICoqa2jDoWMgNTAlIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCl9fXw0KIyMgKioyLjIuIEJp4bq/biBFZHVjYXRpb24qKg0KDQojIyMgKiphKSBUaOG7kW5nIGvDqiBtw7QgdOG6oyoqDQoNCmBgYHtyfQ0KI1ThuqFvIGLhuqNuZyBtw7QgdOG6oyB0aOG7kW5nIGvDqiBiaeG6v24gRWR1Y2F0aW9uDQp0YW5zby5lZHVjYXRpb24gPC0gdGFibGUoZGF0YSRFZHVjYXRpb24pDQp0YW5zdWF0LmVkdWNhdGlvbiA8LSBwcm9wLnRhYmxlKHRhbnNvLmVkdWNhdGlvbikgKiAxMDANCg0KZWR1Y2F0aW9uIDwtIGRhdGEuZnJhbWUoRWR1Y2F0aW9uID0gbmFtZXModGFuc28uZWR1Y2F0aW9uKSwgVGFuU28gPSBhcy52ZWN0b3IodGFuc28uZWR1Y2F0aW9uKSwgVGFuU3VhdCA9IGFzLnZlY3Rvcih0YW5zdWF0LmVkdWNhdGlvbikpDQoNCmthYmxlKGVkdWNhdGlvbiwgY2FwdGlvbiA9ICJC4bqjbmcgMjogTcO0IHThuqMgdGjhu5FuZyBrw6ogY+G7p2EgYmnhur9uIEVkdWNhdGlvbiIpDQoNCg0KIyBCaeG7g3UgxJHhu5MgYmnhur9uIEVkdWNhdGlvbg0KY291bnRzIDwtIGRhdGEgJT4lIA0KICBncm91cF9ieShFZHVjYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKENvdW50ID0gbigpKQ0KDQpnZ3Bsb3QoY291bnRzLCBhZXMoeCA9IEVkdWNhdGlvbiwgeSA9IENvdW50KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICdkYXJrZ3JlZW4nKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDQpICsgIA0KICBsYWJzKA0KICAgIHRpdGxlID0gIkjDrG5oIDE6IEJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gYmnhur9uIEVkdWNhdGlvbiIsDQogICAgeCA9ICdI4buNYyB24bqlbicsDQogICAgeSA9ICdT4buRIGzGsOG7o25nIG5nxrDhu51pIHRoYW0gZ2lhIGto4bqjbyBzw6F0Jw0KICApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQpCaeG6v24gdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPDsyBz4buxIHBow6JuIGLhu5EgY2jDqm5oIGzhu4djaCByw7UgcuG7h3QuIE5ow7NtIHThu5F0IG5naGnhu4dwIHRydW5nIGjhu41jIHBo4buVIHRow7RuZyBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0ICgzMiwzMyUpLCB0aeG6v3AgdGhlbyBsw6AgaOG7jWMgbeG7mXQgcGjhuqduIMSR4bqhaSBo4buNYyAoMjUsMTglKSB2w6AgY+G7rSBuaMOibiAoMTUsNTMlKS4gTmfGsOG7o2MgbOG6oWksIGPDoWMgbmjDs20gbmjGsCBt4bqrdSBnacOhbywgbOG7m3AgMeKAkzQgdsOgIHRp4bq/biBzxKkgY8OzIHThuqduIHN14bqldCBy4bqldCB0aOG6pXAuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCBjw7MgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIHThu6sgdHJ1bmcgaOG7jWMgcGjhu5UgdGjDtG5nIHRy4bufIGzDqm4uDQoNCiMjIyAqKmIpIMav4bubYyBsxrDhu6NuZyBraG/huqNuZyAtIGjhuqFuZyBt4bulYyBIUy1ncmFkKioNCg0KYGBge3J9DQojIMav4bubYyBsxrDhu6NuZyBraG/huqNuZyBIUy1ncmFkIChU4buRdCBuZ2hp4buHcCB0cnVuZyBo4buNYyBwaOG7lSB0aMO0bmcpDQoNCmRhdGEkRWR1Y2F0aW9uIDwtIHRyaW13cyhkYXRhJEVkdWNhdGlvbikNCg0KdGFibGUoZGF0YSRFZHVjYXRpb24pDQp0b3RhbD0gc3VtKHRhYmxlKGRhdGEkRWR1Y2F0aW9uKSkNCg0KU28uZWR1ID0gdGFibGUoZGF0YSRFZHVjYXRpb24pW1siSFMtZ3JhZCJdXQ0KDQojduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JQ0KcHJvcC50ZXN0KFNvLmVkdSwgdG90YWwsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KYGBgDQoNClbhu5tpIGvhur90IHF14bqjIHRyw6puLCB0YSBjw7MgxJHGsOG7o2Mga2hv4bqjbmcgdGluIGPhuq15IHThu7cgbOG7hyBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCB04buRdCBuZ2hp4buHcCB0cnVuZyBo4buNYyBwaOG7lSB0aMO0bmcgdHJvbmcgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgKiozMS41OCUqKiDEkeG6v24gKiozMy4wOSUqKi4NCg0KIyMjICoqYykgS2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QqKg0KDQpHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoNCg0KJEhfMCQ6IFThu7cgbOG7hyBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCB04buRdCBuZ2hp4buHcCB0cnVuZyBo4buNYyBwaOG7lSB0aMO0bmcgdHJvbmcgdOG7lW5nIHPhu5EgcXVhbiBzw6F0IGLhurFuZyAzMyUNCg0KJEhfMSQ6IFThu7cgbOG7hyBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCB04buRdCBuZ2hp4buHcCB0cnVuZyBo4buNYyBwaOG7lSB0aMO0bmcgdHJvbmcgdOG7lW5nIHPhu5EgcXVhbiBzw6F0IGtow6FjIDMzJQ0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggSDA6IHAgPSAwLjUNCg0KcHJvcC50ZXN0KFNvLmVkdSwgdG90YWwsIHAgPSAwLjMzKQ0KYGBgDQoNClbhu5tpIGvhur90IHF14bqjIHbhu6thIGtp4buDbSDEkeG7i25oIMSRxrDhu6NjLCB0YSB0aOG6pXkgcuG6sW5nICRwLXZhbHVlID0gMC4wODIyMiA+IDAuMDUkLCB0YSBjaMawYSDEkeG7pyDEkWnhu4F1IGtp4buHbiDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQgdsOgIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMCQsIHThu6ljIHThu7cgbOG7hyBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCB04buRdCBuZ2hp4buHcCB0cnVuZyBo4buNYyBwaOG7lSB0aMO0bmcgdHJvbmcgdOG7lW5nIHPhu5EgcXVhbiBzw6F0ICoqYuG6sW5nIDMzJSoqIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCl9fXw0KIyMgKioyLjMuIEJp4bq/biBNYXJpdGFsU3RhdHVzKioNCg0KIyMjICoqYSkgVGjhu5FuZyBrw6ogbcO0IHThuqMqKg0KDQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIG3DtCB04bqjIHRo4buRbmcga8OqIGJp4bq/biBNYXJpdGFsIFN0YXR1cw0KdGFuc28ubWFyaXRhbHN0YXR1cyA8LSB0YWJsZShkYXRhJE1hcml0YWxTdGF0dXMpDQp0YW5zdWF0Lm1hcml0YWxzdGF0dXMgPC0gcHJvcC50YWJsZSh0YW5zby5tYXJpdGFsc3RhdHVzKSAqIDEwMA0KDQptYXJpdGFsc3RhdHVzIDwtIGRhdGEuZnJhbWUoTWFyaXRhbFN0YXR1cyA9IG5hbWVzKHRhbnNvLm1hcml0YWxzdGF0dXMpLCBUYW5TbyA9IGFzLnZlY3Rvcih0YW5zby5tYXJpdGFsc3RhdHVzKSwgVGFuU3VhdCA9IGFzLnZlY3Rvcih0YW5zdWF0Lm1hcml0YWxzdGF0dXMpKQ0KDQprYWJsZShtYXJpdGFsc3RhdHVzLCBjYXB0aW9uID0gIkLhuqNuZyAzOiBNw7QgdOG6oyB0aOG7kW5nIGvDqiBj4bunYSBiaeG6v24gTWFyaXRhbCBTdGF0dXMiKQ0KDQojIEJp4buDdSDEkeG7kyBiaeG6v24gTWFyaXRhbCBTdGF0dXMNCmRhdGEgJT4lIGdyb3VwX2J5KE1hcml0YWxTdGF0dXMpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gbiAvIHN1bShuKSAqIDEwMCkgJT4lDQogIGdncGxvdChhZXMoeCA9ICcnLCB5ID0gbixmaWxsID0gTWFyaXRhbFN0YXR1cykpICsNCiAgICBnZW9tX2NvbChjb2xvciA9ICdibGFjaycpICsNCiAgICBjb29yZF9wb2xhcigneScpICsNCiAgICBnZW9tX3RleHQoYWVzKHggPSAxLjMsIGxhYmVsID0gcGFzdGUwKHJvdW5kKHBlcmNlbnRhZ2UsIDEpLCAiJSIpKSxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpKSArDQogICAgdGhlbWVfdm9pZCgpICsNCiBsYWJzKHRpdGxlID0gJ0jDrG5oIDM6IEJp4buDdSDEkeG7kyB0csOybiB0aOG7gyBoaeG7h24gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPhu6dhIG3hu5dpIGtow6FjaCBow6BuZycsIHggPSAnICcsIHkgPSAnICcpDQpgYGANCg0KQmnhur9uIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBraMOhY2ggaMOgbmcgY2jGsGEgdOG7q25nIGvhur90IGjDtG4gKDYxLDMlKS4gTmjDs20gxJHDoyBseSBow7RuIGNoaeG6v20gdOG7tyBs4buHIHRo4bupIGhhaSB24bubaSAyNyw1JS4gVHJvbmcga2hpIMSRw7MsIGhhaSBuaMOzbSBseSB0aMOibiB2w6AgZ8OzYSBjw7MgdOG7tyBs4buHIGtow6EgdGjhuqVwLCBs4bqnbiBsxrDhu6N0IGzDoCA1LDklIHbDoCA1LDMlLiBL4bq/dCBxdeG6oyBuw6B5IGNobyB0aOG6pXkgxJFhIHPhu5EgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQgdGh14buZYyBuaMOzbSDEkeG7mWMgdGjDom4uDQoNCiMjIyAqKmIpIMav4bubYyBsxrDhu6NuZyBraG/huqNuZyAtIGjhuqFuZyBt4bulYyBOZXZlci1tYXJyaWVkKioNCg0KYGBge3J9DQojIMav4bubYyBsxrDhu6NuZyBraG/huqNuZyBOZXZlci1tYXJyaWVkIChDaMawYSB04burbmcga+G6v3QgaMO0bikNCg0KZGF0YSRNYXJpdGFsU3RhdHVzIDwtIHRyaW13cyhkYXRhJE1hcml0YWxTdGF0dXMpDQoNCnRhYmxlKGRhdGEkTWFyaXRhbFN0YXR1cykNCnRvdGFsPSBzdW0odGFibGUoZGF0YSRNYXJpdGFsU3RhdHVzKSkNCg0KU28ubWFycmllZCA9IHRhYmxlKGRhdGEkTWFyaXRhbFN0YXR1cylbWyJOZXZlci1tYXJyaWVkIl1dDQoNCiN24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlDQpwcm9wLnRlc3QoU28ubWFycmllZCwgdG90YWwsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KYGBgDQoNClbhu5tpIGvhur90IHF14bqjIHRyw6puLCB0YSBjw7MgxJHGsOG7o2Mga2hv4bqjbmcgdGluIGPhuq15IHThu7cgbOG7hyBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCBjaMawYSBr4bq/dCBow7RuIHRyb25nIHThu5VuZyB0aOG7gyBu4bqxbSB0cm9uZyBraG/huqNuZyB04burICoqNjAuNTYlKiogxJHhur9uICoqNjIuMTIlKiouDQoNCiMjIyAqKmMpIEtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KioNCg0KR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6DQoNCiRIXzAkOiBU4bu3IGzhu4cgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQgY2jGsGEga+G6v3QgaMO0biB0cm9uZyB04buVbmcgc+G7kSBxdWFuIHPDoXQgYuG6sW5nIDYyJQ0KDQokSF8xJDogVOG7tyBs4buHIG5nxrDhu51pIHRoYW0gZ2lhIGto4bqjbyBzw6F0IGNoxrBhIGvhur90IGjDtG4gdHJvbmcgdOG7lW5nIHPhu5EgcXVhbiBzw6F0IGtow6FjIDYyJQ0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggSDA6IHAgPSAwLjUNCg0KcHJvcC50ZXN0KFNvLm1hcnJpZWQsIHRvdGFsLCBwID0gMC42MikNCmBgYA0KDQpW4bubaSBr4bq/dCBxdeG6oyB24burYSBraeG7g20gxJHhu4tuaCDEkcaw4bujYywgdGEgdGjhuqV5IHLhurFuZyAkcC12YWx1ZSA9IDAuMDk5MDMgPiAwLjA1JCwgdGEgY2jGsGEgxJHhu6cgxJFp4buBdSBraeG7h24gxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkIHbDoCBjaOG6pXAgbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bupYyB04bu3IGzhu4cgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQgY2jGsGEga+G6v3QgaMO0biB0cm9uZyB04buVbmcgc+G7kSBxdWFuIHPDoXQgKipi4bqxbmcgNjIlKiog4bufIG3hu6ljIMO9IG5naMSpYSA1JS4NCg0KX19fDQojIyAqKjIuNC4gQmnhur9uIE9jY3VwYXRpb24qKg0KDQojIyMgKiphKSBUaOG7kW5nIGvDqiBtw7QgdOG6oyoqDQoNCmBgYHtyfQ0KI1ThuqFvIGLhuqNuZyBtw7QgdOG6oyB0aOG7kW5nIGvDqiBiaeG6v24gT2NjdXBhdGlvbg0KdGFuc28ub2NjdXBhdGlvbiA8LSB0YWJsZShkYXRhJE9jY3VwYXRpb24pDQp0YW5zdWF0Lm9jY3VwYXRpb24gPC0gcHJvcC50YWJsZSh0YW5zby5vY2N1cGF0aW9uKSAqIDEwMA0KDQpvY2N1cGF0aW9uIDwtIGRhdGEuZnJhbWUoT2NjdXBhdGlvbiA9IG5hbWVzKHRhbnNvLm9jY3VwYXRpb24pLCBUYW5TbyA9IGFzLnZlY3Rvcih0YW5zby5vY2N1cGF0aW9uKSwgVGFuU3VhdCA9IGFzLnZlY3Rvcih0YW5zdWF0Lm9jY3VwYXRpb24pKQ0KDQprYWJsZShvY2N1cGF0aW9uLCBjYXB0aW9uID0gIkLhuqNuZyA0OiBNw7QgdOG6oyB0aOG7kW5nIGvDqiBj4bunYSBiaeG6v24gT2NjdXBhdGlvbiIpDQoNCg0KIyBCaeG7g3UgxJHhu5MgYmnhur9uIE9jY3VwYXRpb24NCmNvdW50cyA8LSBkYXRhICU+JSANCiAgZ3JvdXBfYnkoT2NjdXBhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoQ291bnQgPSBuKCkpDQoNCmdncGxvdChjb3VudHMsIGFlcyh4ID0gT2NjdXBhdGlvbiwgeSA9IENvdW50KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICdicm93bicpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBzaXplID0gNCkgKyAgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSMOsbmggNDogQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBiaeG6v24gT2NjdXBhdGlvbiIsDQogICAgeCA9ICdOZ2jhu4EgbmdoaeG7h3AnLA0KICAgIHkgPSAnU+G7kSBsxrDhu6NuZyBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCcNCiAgKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KQmnhur9uIG5naOG7gSBuZ2hp4buHcCBjaG8gdGjhuqV5IG5ow7NtIGzDoG0gY8O0bmcgdmnhu4djIGjDoG5oIGNow61uaCAtIHbEg24gcGjDsm5nIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgduG7m2kgMTcsMiUuIFRoZW8gc2F1IGzDoCBjw6FjIG5ow7NtIGThu4tjaCB24bulIGtow6FjICgxNSwzJSksIHF14bqjbiBsw70gLSDEkWnhu4F1IGjDoG5oICgxMCwyJSksIGNodXnDqm4gZ2lhICgxMiw2JSkgdsOgIGLDoW4gaMOgbmcgKDEyLDMlKS4gTmfGsOG7o2MgbOG6oWksIG5ow7NtIGzDoG0gdHJvbmcgbOG7sWMgbMaw4bujbmcgdsWpIHRyYW5nICgwLDAzJSkgdsOgIGdpw7pwIHZp4buHYyBuaMOgIHTGsCBuaMOibiAoMCw3NSUpIGPDsyB04bu3IGzhu4cgcuG6pXQgdGjhuqVwLiBQaMOibiBi4buRIG7DoHkgcGjhuqNuIMOhbmggc+G7sSDEkWEgZOG6oW5nIHbhu4Egbmdo4buBIG5naGnhu4dwIHRyb25nIHThuq1wIGThu68gbGnhu4d1LCDEkeG7k25nIHRo4budaSBjaG8gdGjhuqV5IGzhu7FjIGzGsOG7o25nIGxhbyDEkeG7mW5nIHRoYW0gZ2lhIGto4bqjbyBzw6F0IGNo4bunIHnhur91IGhv4bqhdCDEkeG7mW5nIHRyb25nIGzEqW5oIHbhu7FjIHbEg24gcGjDsm5nLCBk4buLY2ggduG7pSB2w6AgY2h1ecOqbiBtw7RuLg0KDQpfX18NCiMjICoqMi41LiBCaeG6v24gR2VuZGVyKioNCg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyBtw7QgdOG6oyB0aOG7kW5nIGvDqiBiaeG6v24gR2VuZGVyDQp0YW5zby5nZW5kZXIgPC0gdGFibGUoZGF0YSRHZW5kZXIpDQp0YW5zdWF0LmdlbmRlciA8LSBwcm9wLnRhYmxlKHRhbnNvLm1hcml0YWxzdGF0dXMpICogMTAwDQoNCmdlbmRlciA8LSBkYXRhLmZyYW1lKEdlbmRlciA9IG5hbWVzKHRhbnNvLmdlbmRlciksIFRhblNvID0gYXMudmVjdG9yKHRhbnNvLmdlbmRlciksIFRhblN1YXQgPSBhcy52ZWN0b3IodGFuc3VhdC5nZW5kZXIpKQ0KDQprYWJsZShnZW5kZXIsIGNhcHRpb24gPSAiQuG6o25nIDU6IE3DtCB04bqjIHRo4buRbmcga8OqIGPhu6dhIGJp4bq/biBHZW5kZXIiKQ0KDQojIEJp4buDdSDEkeG7kyBiaeG6v24gR2VuZGVyDQpkYXRhICU+JSBncm91cF9ieShHZW5kZXIpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gbiAvIHN1bShuKSAqIDEwMCkgJT4lDQogIGdncGxvdChhZXMoeCA9ICcnLCB5ID0gbixmaWxsID0gR2VuZGVyKSkgKw0KICAgIGdlb21fY29sKGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGNvb3JkX3BvbGFyKCd5JykgKw0KICAgIGdlb21fdGV4dChhZXMoeCA9IDEuMywgbGFiZWwgPSBwYXN0ZTAocm91bmQocGVyY2VudGFnZSwgMSksICIlIikpLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSkpICsNCiAgICB0aGVtZV92b2lkKCkgKw0KIGxhYnModGl0bGUgPSAnSMOsbmggNTogQmnhu4N1IMSR4buTIHRyw7JuIHRo4buDIGhp4buHbiBnaeG7m2kgdMOtbmggY+G7p2EgbeG7l2kga2jDoWNoIGjDoG5nJywgeCA9ICcgJywgeSA9ICcgJykNCmBgYA0KDQpCaeG7g3UgxJHhu5MgdHLDsm4gdsOgIGLhuqNuZyBtw7QgdOG6oyB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5IHThu4kgbOG7hyBraMOhY2ggaMOgbmcgbuG7ryBjaGnhur9tIDUxLDklLCBjYW8gaMahbiBuaOG6uSBzbyB24bubaSBraMOhY2ggaMOgbmcgbmFtIHbhu5tpIDQ4LDElLiBT4buxIHBow6JuIGLhu5EgZ+G6p24gbmjGsCBjw6JuIGLhurFuZyBuw6B5IGNobyB0aOG6pXkgZOG7ryBsaeG7h3Uga2jDtG5nIGLhu4sgdGhpw6puIGzhu4djaCDEkcOhbmcga+G7gyB24buBIGdp4bubaSB0w61uaCwgZ2nDunAgxJHhuqNtIGLhuqNvIHTDrW5oIMSR4bqhaSBkaeG7h24gY2hvIGPhuqMgaGFpIG5ow7NtIGdp4bubaSB0cm9uZyBxdcOhIHRyw6xuaCBwaMOibiB0w61jaCB2w6AgxJHDoW5oIGdpw6EgY8OhYyB54bq/dSB04buRIGxpw6puIHF1YW4gxJHhur9uIGjDoG5oIHZpIGhv4bq3YyDEkeG6t2MgxJFp4buDbSBj4bunYSBraMOhY2ggaMOgbmcuDQoNCl9fXw0KIyMgKioyLjYuIEJp4bq/biBDb3VudHJ5KioNCg0KYGBge3J9DQojVOG6oW8gYuG6o25nIG3DtCB04bqjIHRo4buRbmcga8OqIGJp4bq/biBDb3VudHJ5DQp0YW5zby5jb3VudHJ5IDwtIHRhYmxlKGRhdGEkQ291bnRyeSkNCnRhbnN1YXQuY291bnRyeSA8LSBwcm9wLnRhYmxlKHRhbnNvLmNvdW50cnkpICogMTAwDQoNCmNvdW50cnkgPC0gZGF0YS5mcmFtZShDb3VudHJ5ID0gbmFtZXModGFuc28uY291bnRyeSksIFRhblNvID0gYXMudmVjdG9yKHRhbnNvLmNvdW50cnkpLCBUYW5TdWF0ID0gYXMudmVjdG9yKHRhbnN1YXQuY291bnRyeSkpDQoNCmthYmxlKGNvdW50cnksIGNhcHRpb24gPSAiQuG6o25nIDY6IE3DtCB04bqjIHRo4buRbmcga8OqIGPhu6dhIGJp4bq/biBDb3VudHJ5IikNCmBgYA0KDQpCaeG7g3UgxJHhu5MgY+G7mXQgY2hvIHRo4bqleSDEkWEgc+G7kSBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCDEkeG6v24gdOG7qyBIb2EgS+G7syAoVW5pdGVkIFN0YXRlcyksIGNoaeG6v20gw6FwIMSR4bqjbyB24bubaSAxMy44ODggbmfGsOG7nWksIHTGsMahbmcgxJHGsMahbmcgOTIsODIlIHThu5VuZyBt4bqrdS4gVHJvbmcga2hpIMSRw7MsIGPDoWMgcXXhu5FjIGdpYSBjw7JuIGzhuqFpIGNo4buJIGNoaeG6v20gdOG7tyBs4buHIHLhuqV0IG5o4buPLCBt4buXaSBuxrDhu5tjIGRhbyDEkeG7mW5nIHThu6sgdsOgaSBjw6EgbmjDom4gxJHhur9uIHbDoGkgY2jhu6VjIG5nxrDhu51pLCBjaGnhur9tIGTGsOG7m2kgMSUgbeG7l2kgcXXhu5FjIGdpYS4gTmjhu69uZyBxdeG7kWMgZ2lhIGPDsyBz4buRIGzGsOG7o25nIHTGsMahbmcgxJHhu5FpIG7hu5VpIGLhuq10IHNhdSBIb2EgS+G7syBn4buTbSBNZXhpY28gKDEsNDMlKSwgUGhpbGlwcGluZXMgKDAsNDUlKSwgR2VybWFueSAoMCw0MiUpIHbDoCBQdWVydG8tUmljbyAoMCwzNiUpLg0KDQpT4buxIG3huqV0IGPDom4gxJHhu5FpIG5naGnDqm0gdHLhu41uZyB0cm9uZyBwaMOibiBi4buRIHF14buRYyB04buLY2ggbsOgeSBjaG8gdGjhuqV5IGThu68gbGnhu4d1IGPDsyB0aOG7gyBwaOG6o24gw6FuaCBjaOG7pyB54bq/dSBi4buRaSBj4bqjbmggdsOgIMSR4bq3YyDEkWnhu4NtIGPhu6dhIGPGsCBkw6JuIEhvYSBL4buzLiANCg0KX19fDQojIyAqKjIuNy4gQmnhur9uIEluY29tZSoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgbcO0IHThuqMgdGjhu5FuZyBrw6ogYmnhur9uIEluY29tZQ0KdGFuc28uaW5jb21lIDwtIHRhYmxlKGRhdGEkSW5jb21lKQ0KdGFuc3VhdC5pbmNvbWUgPC0gcHJvcC50YWJsZSh0YW5zby5pbmNvbWUpICogMTAwDQoNCmluY29tZSA8LSBkYXRhLmZyYW1lKEluY29tZSA9IG5hbWVzKHRhbnNvLmluY29tZSksIFRhblNvID0gYXMudmVjdG9yKHRhbnNvLmluY29tZSksIFRhblN1YXQgPSBhcy52ZWN0b3IodGFuc3VhdC5pbmNvbWUpKQ0KDQprYWJsZShpbmNvbWUsIGNhcHRpb24gPSAiQuG6o25nIDc6IE3DtCB04bqjIHRo4buRbmcga8OqIGPhu6dhIGJp4bq/biBJbmNvbWUiKQ0KDQojIEJp4buDdSDEkeG7kyBiaeG6v24gSW5jb21lDQpkYXRhICU+JSBncm91cF9ieShJbmNvbWUpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gbiAvIHN1bShuKSAqIDEwMCkgJT4lDQogIGdncGxvdChhZXMoeCA9ICcnLCB5ID0gbixmaWxsID0gSW5jb21lKSkgKw0KICAgIGdlb21fY29sKGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGNvb3JkX3BvbGFyKCd5JykgKw0KICAgIGdlb21fdGV4dChhZXMoeCA9IDEuMywgbGFiZWwgPSBwYXN0ZTAocm91bmQocGVyY2VudGFnZSwgMSksICIlIikpLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSkpICsNCiAgICB0aGVtZV92b2lkKCkgKw0KIGxhYnModGl0bGUgPSAnSMOsbmggNzogQmnhu4N1IMSR4buTIHRyw7JuIHRo4buDIGhp4buHbiB0aHUgbmjhuq1wIGPhu6dhIG3hu5dpIGtow6FjaCBow6BuZycsIHggPSAnICcsIHkgPSAnICcpDQpgYGANCg0KQmnhu4N1IMSR4buTIHRyw7JuIGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIGtow6FjaCBow6BuZyB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBjw7MgdGh1IG5o4bqtcCBkxrDhu5tpIGhv4bq3YyBi4bqxbmcgNTAuMDAwIFVTRCwgY2hp4bq/bSA5MyUgdOG7lW5nIHPhu5EgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQsIHTGsMahbmcgxJHGsMahbmcgMTMuOTEwIG5nxrDhu51pLiBUcm9uZyBraGkgxJHDsywgY2jhu4kgY8OzIDclIGtow6FjaCBow6BuZyBjw7MgdGh1IG5o4bqtcCB0csOqbiA1MC4wMDAgVVNELCB0xrDGoW5nIOG7qW5nIDEuMDUyIG5nxrDhu51pLg0KDQpfX18NCiMgKipQSOG6pk4gMzogUEjDgk4gVMONQ0ggTeG7lkkgUVVBTiBI4buGIEdJ4buuQSBIQUkgQknhur5OIMSQ4buKTkggVMONTkgqKg0KDQpCaeG6v24gcGjhu6UgdGh14buZYyBsw6A6ICoqSW5jb21lKiogdsOgICoqRWR1Y2F0aW9uKioNCg0KIyAqKkJp4bq/biBJbmNvbWUqKg0KDQojIyAqKjMuMS4gQmnhur9uIE1hcml0YWwgU3RhdHVzIHbDoCBJbmNvbWUqKg0KDQojIyMgKiphKSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHbDoCBiaeG7g3UgxJHhu5MgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KIyBC4bqnbiBzdeG6pXQgZ2nhu69hIE1hcml0YWwgU3RhdHVzIHbDoCBJbmNvbWUNCnRhbnNvMSA8LSB0YWJsZShkYXRhJE1hcml0YWxTdGF0dXMsIGRhdGEkSW5jb21lKSANCnRhbnN1YXQxIDwtIHByb3AudGFibGUodGFuc28xLCBtYXJnaW4gPSAxKSAqIDEwMA0KDQpiYW5nMSA8LSBhcy5kYXRhLmZyYW1lKHRhbnNvMSkNCmJhbmcxJFBlcmNlbnRhZ2UgPC0gcm91bmQoYXMudmVjdG9yKHRhbnN1YXQxKSwgMikNCg0KY29sbmFtZXMoYmFuZzEpIDwtIGMoIk1hcml0YWwgU3RhdHVzIiwgIkluY29tZSIsICJU4bqnbiBz4buRIiwgIlThuqduIHN14bqldCIpDQogICAgDQprYWJsZShiYW5nMSwgY2FwdGlvbiA9ICJC4bqjbmcgODogTcO0IHThuqMgdGjhu5FuZyBrw6ogY+G7p2EgMiBiaeG6v24gTWFyaXRhbCBTdGF0dXMgdsOgIEluY29tZSIpDQoNCiNUcuG7sWMgcXVhbiBow7NhIGNobyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIDIgYmnhur9uDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBJbmNvbWUsIGZpbGwgPSBNYXJpdGFsU3RhdHVzKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJIw6xuaCA4OiBN4buRaSBxdWFuIGjhu4cgZ2nhu69hIE1hcml0YWwgU3RhdHVzIHbDoCBJbmNvbWUiLA0KICAgIHggPSAiVGh1IG5o4bqtcCIsDQogICAgeSA9ICJT4buRIGzGsOG7o25nIiwNCiAgICBmaWxsID0gIlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KQmnhu4N1IMSR4buTIGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIG5o4buvbmcgbmfGsOG7nWkgY8OzIHRodSBuaOG6rXAgZMaw4bubaSA1MEsgdGh14buZYyBuaMOzbSBjaMawYSB04burbmcga+G6v3QgaMO0biwgdGnhur9wIHRoZW8gbMOgIG5ow7NtIMSRw6MgbHkgaMO0biwgdHJvbmcga2hpIGhhaSBuaMOzbSBz4buRbmcgbHkgdGjDom4gdsOgIGfDs2EgduG7oy9jaOG7k25nIGNoaeG6v20gdOG7tyBs4buHIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDLiDhu54gY2hp4buBdSBuZ8aw4bujYyBs4bqhaSwgc+G7kSBuZ8aw4budaSBjw7MgdGh1IG5o4bqtcCB0csOqbiA1MEsg4bufIHThuqV0IGPhuqMgY8OhYyBuaMOzbSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gxJHhu4F1IHLhuqV0IHRo4bqlcC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgdGh1IG5o4bqtcCBjYW8gbMOgIHTGsMahbmcgxJHhu5FpIGhp4bq/bSB0cm9uZyB04bqtcCBk4buvIGxp4buHdSB2w6Aga2jDtG5nIHBo4bulIHRodeG7mWMgbmhp4buBdSB2w6BvIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibi4NCg0KIyMjICoqYikgS2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nKioNCg0KR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6DQoNCiRIXzAkOiBCaeG6v24gTWFyaXRhbFN0YXR1cyAodMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKSBraMO0bmcg4bqjbmggaMaw4bufbmcgxJHhur9uIGJp4bq/biBJbmNvbWUgKHRodSBuaOG6rXApDQoNCiRIXzEkOiBCaeG6v24gTWFyaXRhbFN0YXR1cyAodMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGJp4bq/biBJbmNvbWUgKHRodSBuaOG6rXApDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcNCmNoaV90ZXN0IDwtIGNoaXNxLnRlc3QodGFuc28xKQ0KY2hpX3Rlc3QNCmBgYA0KDQpW4bubaSBr4bq/dCBxdeG6oyB24burYSBraeG7g20gxJHhu4tuaCDEkcaw4bujYywgdGEgdGjhuqV5IHLhurFuZyAkcC12YWx1ZSA8IDIuMmUtMTYgPCAwLjA1JCwgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkIHbDoCBjaOG6pXAgbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzEkLCB04bupYyBiaeG6v24gTWFyaXRhbFN0YXR1cyAodMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGJp4bq/biBJbmNvbWUgKHRodSBuaOG6rXApIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCiMjIyAqKmMpIFTDrW5oIFJlbGF0aXZlIFJpc2sgdsOgIE9kZHMgUmF0aW8qKg0KDQrEkOG7gyB0w61uaCBSUiB2w6AgT1IgY2jDum5nIHRhIHPhur0gZ2nhu5tpIGjhuqFuIGjhuqFuZyBt4bulYyBxdWFuIHTDom0uIFbDrCB0YSBj4bqnbiBxdWFuIHTDom0gY8OhYyBiaeG6v24gdMOhYyDEkeG7mW5nIMSR4bq/biB0aHUgbmjhuq1wIG5oxrAgdGjhur8gbsOgbyBuw6puIHRhIHPhur0gZ2nhu68gbmd1ecOqbiAyIGjhuqFuZyBt4bulYyBj4bunYSBiaeG6v24gSW5jb21lIGzDoCAqKjw9NTAqKiB2w6AgKio+NTAqKi4gVuG7m2kgYmnhur9uIE1hcml0YWxTdGF0dXMsIGjhuqFuZyBt4bulYyBxdWFuIHTDom0gKipOZXZlci1tYXJyaWVkKiogdsOgICoqU2VwYXJhdGVkKiouDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCg0KIyBMw6BtIHPhuqFjaCBk4buvIGxp4buHdSB0csaw4bubYyBu4bq/dSBj4bqnbg0KZGF0YSRNYXJpdGFsU3RhdHVzIDwtIHRyaW13cyhkYXRhJE1hcml0YWxTdGF0dXMpDQpkYXRhJEluY29tZSA8LSB0cmltd3MoZGF0YSRJbmNvbWUpDQoNCiMgTOG7jWMgcmEgbmjhu69uZyBow6BuZyBjw7MgTWFyaXRhbFN0YXR1cyB2w6AgSW5jb21lIG5oxrAgecOqdSBj4bqndQ0KdHNjMSA8LSBzdWJzZXQoZGF0YSwNCiAgICAgICAgICAgICAgIE1hcml0YWxTdGF0dXMgJWluJSBjKCJOZXZlci1tYXJyaWVkIiwgIlNlcGFyYXRlZCIpICYNCiAgICAgICAgICAgICAgIEluY29tZSAlaW4lIGMoIjw9NTBLIiwgIj41MEsiKSkNCg0KIyBC4buPIGxldmVscyBraMO0bmcgY8OybiBz4butIGThu6VuZyAobuG6v3UgYmnhur9uIGzDoCBmYWN0b3IpDQp0c2MxIDwtIGRyb3BsZXZlbHModHNjMSkNCg0KdGFibGUxIDwtIHRhYmxlKHRzYzEkTWFyaXRhbFN0YXR1cywgdHNjMSRJbmNvbWUpDQprYWJsZSAodGFibGUxKQ0KYGBgDQoNCg0KYGBge3J9DQojVMOtbmggUlINCnJpc2tyYXRpbyh0YWJsZTEpDQpgYGANCg0KYGBge3J9DQojVMOtbmggT1INCm9kZHNyYXRpbyh0YWJsZTEpDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleTogdHJvbmcgbmjDs20gbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQsIG5o4buvbmcgYWkgxJHDoyBseSB0aMOibiAoU2VwYXJhdGVkKSBjw7Mga2jhuqMgbsSDbmcga2nhur9tIMSRxrDhu6NjIHRyw6puIDUwSyBjYW8gaMahbiBzbyB24bubaSBuZ8aw4budaSBjaMawYSB04burbmcga+G6v3QgaMO0biAoTmV2ZXItbWFycmllZCkuDQoNCkPhu6UgdGjhu4MsIHThu7cgbOG7hyBuw6B5IGNhbyBoxqFuIGtob+G6o25nIDEuNDcgbOG6p24gKGfhu41pIGzDoCBvZGRzIHJhdGlvKS4gS2hv4bqjbmcgdGluIGPhuq15IHThu6sgMS4xMSDEkeG6v24gMS45MiBuZ2jEqWEgbMOgIGvhur90IHF14bqjIG7DoHkga2jDoSBjaOG6r2MgY2jhuq9uLiBCYSBjw6FjaCBraeG7g20gdHJhIGtow6FjIG5oYXUgxJHhu4F1IGNobyByYSBnacOhIHRy4buLIHAgbmjhu48gaMahbiAwLjAxLCB04bupYyBsw6Agc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBraMO0bmcgcGjhuqNpIGRvIG5n4bqrdSBuaGnDqm4sIG3DoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQpfX18NCiMjICoqMy4yLiBCaeG6v24gR2VuZGVyIHbDoCBJbmNvbWUqKg0KDQojIyMgKiphKSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHbDoCBiaeG7g3UgxJHhu5MgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KIyBC4bqnbiBzdeG6pXQgZ2nhu69hIEdlbmRlciB2w6AgSW5jb21lDQp0YW5zbzIgPC0gdGFibGUoZGF0YSRHZW5kZXIsIGRhdGEkSW5jb21lKSANCnRhbnN1YXQyIDwtIHByb3AudGFibGUodGFuc28yLCBtYXJnaW4gPSAxKSAqIDEwMA0KDQpiYW5nMiA8LSBhcy5kYXRhLmZyYW1lKHRhbnNvMikNCmJhbmcyJFBlcmNlbnRhZ2UgPC0gcm91bmQoYXMudmVjdG9yKHRhbnN1YXQyKSwgMikNCg0KY29sbmFtZXMoYmFuZzIpIDwtIGMoIkdlbmRlciIsICJJbmNvbWUiLCAiVOG6p24gc+G7kSIsICJU4bqnbiBzdeG6pXQiKQ0KICAgIA0Ka2FibGUoYmFuZzIsIGNhcHRpb24gPSAiQuG6o25nIDk6IE3DtCB04bqjIHRo4buRbmcga8OqIGPhu6dhIDIgYmnhur9uIEdlbmRlciB2w6AgSW5jb21lIikNCg0KI1Ry4buxYyBxdWFuIGjDs2EgY2hvIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgMiBiaeG6v24NCmdncGxvdChkYXRhLCBhZXMoeCA9IEluY29tZSwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSMOsbmggOTogTeG7kWkgcXVhbiBo4buHIGdp4buvYSBHZW5kZXIgdsOgIEluY29tZSIsDQogICAgeCA9ICJUaHUgbmjhuq1wIiwNCiAgICB5ID0gIlPhu5EgbMaw4bujbmciLA0KICAgIGZpbGwgPSAiR2nhu5tpIHTDrW5oIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQpC4bqjbmcgdGjhu5FuZyBrw6ogdsOgIGJp4buDdSDEkeG7kyBtaW5oIGjhu41hIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCB0aHUgbmjhuq1wIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IHRyb25nIHBow6JuIGLhu5EgdGh1IG5o4bqtcCBnaeG7r2EgaGFpIG5ow7NtIGdp4bubaSB0w61uaC4gQ+G7pSB0aOG7gywgduG7m2kgbeG7qWMgdGh1IG5o4bqtcCDiiaQ1MEssIGPhuqMgbuG7ryBnaeG7m2kgKDcuMzgwIG5nxrDhu51pLCBjaGnhur9tIDk0LDk3JSkgdsOgIG5hbSBnaeG7m2kgKDYuNTMwIG5nxrDhu51pLCBjaGnhur9tIDkwLDgxJSkgxJHhu4F1IGNoaeG6v20gdOG7tyBs4buHIHLhuqV0IGNhbywgY2hvIHRo4bqleSBwaOG6p24gbOG7m24gZMOibiBz4buRIGPDsyB0aHUgbmjhuq1wIHRo4bqlcC4gVHV5IG5oacOqbiwg4bufIG3hu6ljIHRodSBuaOG6rXAgPjUwSywgdOG7tyBs4buHIG7DoHkgZ2nhuqNtIG3huqFuaCwgduG7m2kgbuG7ryBnaeG7m2kgY2jhu4kgY8OybiAzOTEgbmfGsOG7nWkgKDUsMDMlKSB2w6AgbmFtIGdp4bubaSBsw6AgNjYxIG5nxrDhu51pICg5LDE5JSksIHBo4bqjbiDDoW5oIHPhu7EgYuG6pXQgY8OibiDEkeG7kWkgZ2nhu5tpIHRyb25nIG5ow7NtIHRodSBuaOG6rXAgY2FvLiBCaeG7g3UgxJHhu5MgY+G7mXQgdHLhu7FjIHF1YW4gaMOzYSBk4buvIGxp4buHdSBuw6B5LCBuaOG6pW4gbeG6oW5oIHPhu7EgY2jDqm5oIGzhu4djaCDEkcOhbmcga+G7gyB24buBIHPhu5EgbMaw4bujbmcg4bufIGPhuqMgaGFpIG5nxrDhu6FuZyB0aHUgbmjhuq1wLCDEkeG6t2MgYmnhu4d0IOG7nyBuaMOzbSB0aHUgbmjhuq1wIGNhbywgbsahaSBuYW0gZ2nhu5tpIHbGsOG7o3QgdHLhu5lpIGjGoW4gbuG7ryBnaeG7m2kuIEvhur90IHF14bqjIG7DoHkgY8OzIHRo4buDIGzDoCBjxqEgc+G7nyDEkeG7gyBuZ2hpw6puIGPhu6l1IHPDonUgaMahbiB24buBIGPDoWMgeeG6v3UgdOG7kSB4w6MgaOG7mWkgdsOgIGtpbmggdOG6vyDhuqNuaCBoxrDhu59uZyDEkeG6v24gcGjDom4gaMOzYSB0aHUgbmjhuq1wIHRoZW8gZ2nhu5tpIHTDrW5oLg0KDQojIyMgKipiKSBLaeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcqKg0KDQpHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoNCg0KJEhfMCQ6IEJp4bq/biBHZW5kZXIgKEdp4bubaSB0w61uaCkga2jDtG5nIOG6o25oIGjGsOG7n25nIMSR4bq/biBiaeG6v24gSW5jb21lICh0aHUgbmjhuq1wKQ0KDQokSF8xJDogQmnhur9uIEdlbmRlciAoR2nhu5tpIHTDrW5oKSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGJp4bq/biBJbmNvbWUgKHRodSBuaOG6rXApDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcNCmNoaV90ZXN0IDwtIGNoaXNxLnRlc3QodGFuc28yKQ0KY2hpX3Rlc3QNCmBgYA0KDQpW4bubaSBr4bq/dCBxdeG6oyB24burYSBraeG7g20gxJHhu4tuaCDEkcaw4bujYywgdGEgdGjhuqV5IHLhurFuZyAkcC12YWx1ZSA8IDIuMmUtMTYgPCAwLjA1JCwgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkIHbDoCBjaOG6pXAgbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzEkLCB04bupYyBiaeG6v24gR2VuZGVyICh0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4pIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gYmnhur9uIEluY29tZSAodGh1IG5o4bqtcCkg4bufIG3hu6ljIMO9IG5naMSpYSA1JS4NCg0KIyMjICoqYykgVMOtbmggUmVsYXRpdmUgUmlzayB2w6AgT2RkcyBSYXRpbyoqDQoNCsSQ4buDIHTDrW5oIFJSIHbDoCBPUiBjaMO6bmcgdGEgc+G6vSBnaeG7m2kgaOG6oW4gaOG6oW5nIG3hu6VjIHF1YW4gdMOibS4gVsOsIHRhIGPhuqduIHF1YW4gdMOibSBjw6FjIGJp4bq/biB0w6FjIMSR4buZbmcgxJHhur9uIHRodSBuaOG6rXAgbmjGsCB0aOG6vyBuw6BvIG7Dqm4gdGEgc+G6vSBnaeG7ryBuZ3V5w6puIDIgaOG6oW5nIG3hu6VjIGPhu6dhIGJp4bq/biBJbmNvbWUgbMOgICoqPD01MCoqIHbDoCAqKj41MCoqLiBW4bubaSBiaeG6v24gR2VuZGVyLCBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtICoqRmVtYWxlKiogdsOgICoqTWFsZSoqLg0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQoNCiMgTMOgbSBz4bqhY2ggZOG7ryBsaeG7h3UgdHLGsOG7m2MgbuG6v3UgY+G6p24NCmRhdGEkR2VuZGVyIDwtIHRyaW13cyhkYXRhJEdlbmRlcikNCmRhdGEkSW5jb21lIDwtIHRyaW13cyhkYXRhJEluY29tZSkNCg0KIyBM4buNYyByYSBuaOG7r25nIGjDoG5nIGPDsyBHZW5kZXIgdsOgIEluY29tZSBuaMawIHnDqnUgY+G6p3UNCnRzYzIgPC0gc3Vic2V0KGRhdGEsDQogICAgICAgICAgICAgICBHZW5kZXIgJWluJSBjKCJGZW1hbGUiLCAiTWFsZSIpICYNCiAgICAgICAgICAgICAgIEluY29tZSAlaW4lIGMoIjw9NTBLIiwgIj41MEsiKSkNCg0KIyBC4buPIGxldmVscyBraMO0bmcgY8OybiBz4butIGThu6VuZyAobuG6v3UgYmnhur9uIGzDoCBmYWN0b3IpDQp0c2MyIDwtIGRyb3BsZXZlbHModHNjMikNCg0KdGFibGUyIDwtIHRhYmxlKHRzYzIkR2VuZGVyLCB0c2MyJEluY29tZSkNCmthYmxlICh0YWJsZTIpDQpgYGANCg0KYGBge3J9DQojVMOtbmggUlINCnJpc2tyYXRpbyh0YWJsZTIpDQpgYGANCg0KYGBge3J9DQojVMOtbmggT1INCm9kZHNyYXRpbyh0YWJsZTIpDQpgYGANCg0KS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggY2hvIHRo4bqleTogbmFtIGdp4bubaSAoTWFsZSkgY8OzIGto4bqjIG7Eg25nIGtp4bq/bSDEkcaw4bujYyB0csOqbiA1MEsgY2FvIGjGoW4gZ+G6p24gMiBs4bqnbiBzbyB24bubaSBu4buvIGdp4bubaSAoRmVtYWxlKSB0cm9uZyBi4buZIGThu68gbGnhu4d1IGto4bqjbyBzw6F0Lg0KDQpD4bulIHRo4buDLCB04bu3IHPhu5Egb2RkcyAob2RkcyByYXRpbykgbMOgIDEuOTEsIG5naMSpYSBsw6AgbmFtIGPDsyBraOG6oyBuxINuZyBjw7MgdGh1IG5o4bqtcCB0csOqbiA1MEsgY2FvIGjGoW4ga2hv4bqjbmcgMS45MSBs4bqnbiBzbyB24bubaSBu4buvLiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIHThu6sgMS42OCDEkeG6v24gMi4xOCBjaG8gdGjhuqV5IGvhur90IHF14bqjIG7DoHkgcuG6pXQgY2jhuq9jIGNo4bqvbiwgdsOsIG7DsyBraMO0bmcgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMS4gVGjDqm0gdsOgbyDEkcOzLCBjw6FjIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIChtaWQtcCBleGFjdCwgRmlzaGVy4oCZcyBleGFjdCwgdsOgIGNoaS1zcXVhcmUpIMSR4buBdSBjaG8gcmEgZ2nDoSB0cuG7iyBwIGfhuqduIGLhurFuZyAwLCB04bupYyBsw6Agc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGNhbyB2w6Aga2jDtG5nIHBo4bqjaSBkbyBuZ+G6q3Ugbmhpw6puLg0KDQpfX18NCiMjICoqMy4zLiBCaeG6v24gT2NjdXBhdGlvbiB2w6AgSW5jb21lKioNCg0KIyMjICoqYSkgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB2w6AgYmnhu4N1IMSR4buTIHRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCiMgQuG6p24gc3XhuqV0IGdp4buvYSBHZW5kZXIgdsOgIEluY29tZQ0KdGFuc28zIDwtIHRhYmxlKGRhdGEkT2NjdXBhdGlvbiwgZGF0YSRJbmNvbWUpIA0KdGFuc3VhdDMgPC0gcHJvcC50YWJsZSh0YW5zbzMsIG1hcmdpbiA9IDEpICogMTAwDQoNCmJhbmczIDwtIGFzLmRhdGEuZnJhbWUodGFuc28zKQ0KYmFuZzMkUGVyY2VudGFnZSA8LSByb3VuZChhcy52ZWN0b3IodGFuc3VhdDMpLCAyKQ0KDQpjb2xuYW1lcyhiYW5nMykgPC0gYygiT2NjdXBhdGlvbiIsICJJbmNvbWUiLCAiVOG6p24gc+G7kSIsICJU4bqnbiBzdeG6pXQiKQ0KICAgIA0Ka2FibGUoYmFuZzMsIGNhcHRpb24gPSAiQuG6o25nIDEwOiBNw7QgdOG6oyB0aOG7kW5nIGvDqiBj4bunYSAyIGJp4bq/biBPY2N1cGF0aW9uIHbDoCBJbmNvbWUiKQ0KDQojVHLhu7FjIHF1YW4gaMOzYSBjaG8gbeG7kWkgcXVhbiBo4buHIGdp4buvYSAyIGJp4bq/bg0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gSW5jb21lLCBmaWxsID0gT2NjdXBhdGlvbikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSMOsbmggMTA6IE3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgT2NjdXBhdGlvbiB2w6AgSW5jb21lIiwNCiAgICB4ID0gIlRodSBuaOG6rXAiLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyIsDQogICAgZmlsbCA9ICJOZ2jhu4EgbmdoaeG7h3AiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCkLhuqNuZyB0aOG7kW5nIGvDqiB2w6AgYmnhu4N1IMSR4buTIG1pbmggaOG7jWEgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBuZ2jhu4EgbmdoaeG7h3AsIGdp4bubaSB0w61uaCB2w6AgdGh1IG5o4bqtcCBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBraMO0bmcgxJHhu5NuZyDEkeG7gXUgZ2nhu69hIGPDoWMgbmjDs20gbmdo4buBIG5naGnhu4dwIHRoZW8gbmfGsOG7oW5nIHRodSBuaOG6rXAg4omkNTBLIHbDoCA+NTBLLiDhu54gbeG7qWMgdGh1IG5o4bqtcCDiiaQ1MEssIGPDoWMgbmdo4buBIG5oxrAgSMOgbmggY2jDrW5oLXbEg24gcGjDsm5nICgyLjUwNyBuZ8aw4budaSwgOTcsMzYlKSwgROG7i2NoIHbhu6Uga2jDoWMgKDIuMjY2IG5nxrDhu51pLCA5OCw4MiUpIHbDoCBDaHV5w6puIG3DtG4gY2FvICgxLjU1MyBuZ8aw4budaSwgODIsNTYlKSBjaGnhur9tIHThu7cgbOG7hyBjYW8sIHRyb25nIGtoaSBjw6FjIG5naOG7gSBuaMawIEzhu7FjIGzGsOG7o25nIHbFqSB0cmFuZyAoNSBuZ8aw4budaSwgMTAwJSkgdsOgIEThu4tjaCB24bulIGdpYSDEkcOsbmggKDExMSBuZ8aw4budaSwgOTksMTElKSBjw7Mgc+G7kSBsxrDhu6NuZyBy4bqldCB0aOG6pXAuIFbhu5tpIHRodSBuaOG6rXAgPjUwSywgbmdo4buBIFF14bqjbiBsw70gxJFp4buBdSBow6BuaCAoMjg4IG5nxrDhu51pLCAxOCw4NCUpIHbDoCBDaHV5w6puIG3DtG4gY2FvICgzMjggbmfGsOG7nWksIDE3LDQ0JSkgbuG7lWkgYuG6rXQgduG7m2kgdOG7tyBs4buHIGNhbyBoxqFuIGjhurNuLCB0cm9uZyBraGkgY8OhYyBuZ2jhu4EgbmjGsCBMYW8gxJHhu5luZyB0YXkgY2jDom4gKDUgbmfGsOG7nWksIDAsNjMlKSB2w6AgTOG7sWMgbMaw4bujbmcgdsWpIHRyYW5nICgwIG5nxrDhu51pLCAwJSkgZ+G6p24gbmjGsCBraMO0bmcgY8OzIMSR4bqhaSBkaeG7h24uIEJp4buDdSDEkeG7kyBj4buZdCB0cuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1IG7DoHksIG5o4bqlbiBt4bqhbmggc+G7sSB04bqtcCB0cnVuZyBs4bubbiDhu58gbmfGsOG7oW5nIHRodSBuaOG6rXAgdGjhuqVwIHbDoCBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgZ2nhu69hIGPDoWMgbmdo4buBIOG7nyBuZ8aw4buhbmcgdGh1IG5o4bqtcCBjYW8sIGfhu6NpIG3hu58gY8OhYyBuZ2hpw6puIGPhu6l1IHRp4bq/cCB0aGVvIHbhu4Eg4bqjbmggaMaw4bufbmcgY+G7p2Egbmdo4buBIG5naGnhu4dwIMSR4bq/biBwaMOibiBow7NhIHRodSBuaOG6rXAuDQoNCiMjIyAqKmIpIEtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZyoqDQoNCkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOg0KDQokSF8wJDogQmnhur9uIE9jY3VwYXRpb24gKG5naOG7gSBuZ2hp4buHcCkga2jDtG5nIOG6o25oIGjGsOG7n25nIMSR4bq/biBiaeG6v24gSW5jb21lICh0aHUgbmjhuq1wKQ0KDQokSF8xJDogQmnhur9uIE9jY3VwYXRpb24gKG5naOG7gSBuZ2hp4buHcCkgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBiaeG6v24gSW5jb21lICh0aHUgbmjhuq1wKQ0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nDQpjaGlfdGVzdCA8LSBjaGlzcS50ZXN0KHRhbnNvMykNCmNoaV90ZXN0DQpgYGANCg0KVuG7m2kga+G6v3QgcXXhuqMgduG7q2Ega2nhu4NtIMSR4buLbmggxJHGsOG7o2MsIHRhIHRo4bqleSBy4bqxbmcgJHAtdmFsdWUgPCAyLjJlLTE2IDwgMC4wNSQsIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJCB2w6AgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8xJCwgdOG7qWMgYmnhur9uIE9jY3VwYXRpb24gKG5naOG7gSBuZ2hp4buHcCkgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBiaeG6v24gSW5jb21lICh0aHUgbmjhuq1wKSDhu58gbeG7qWMgw70gbmdoxKlhIDUlLg0KDQojIyMgKipjKSBUw61uaCBSZWxhdGl2ZSBSaXNrIHbDoCBPZGRzIFJhdGlvKioNCg0KxJDhu4MgdMOtbmggUlIgdsOgIE9SIGNow7puZyB0YSBz4bq9IGdp4bubaSBo4bqhbiBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtLiBWw6wgdGEgY+G6p24gcXVhbiB0w6JtIGPDoWMgYmnhur9uIHTDoWMgxJHhu5luZyDEkeG6v24gdGh1IG5o4bqtcCBuaMawIHRo4bq/IG7DoG8gbsOqbiB0YSBz4bq9IGdp4buvIG5ndXnDqm4gMiBo4bqhbmcgbeG7pWMgY+G7p2EgYmnhur9uIEluY29tZSBsw6AgKio8PTUwKiogdsOgICoqPjUwKiouIFbhu5tpIGJp4bq/biBPY2N1cGF0aW9uLCBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtICoqU2FsZXMqKiB2w6AgKipUcmFuc3BvcnQtbW92aW5nKiouDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCg0KIyBMw6BtIHPhuqFjaCBk4buvIGxp4buHdSB0csaw4bubYyBu4bq/dSBj4bqnbg0KZGF0YSRPY2N1cGF0aW9uIDwtIHRyaW13cyhkYXRhJE9jY3VwYXRpb24pDQpkYXRhJEluY29tZSA8LSB0cmltd3MoZGF0YSRJbmNvbWUpDQoNCiMgTOG7jWMgcmEgbmjhu69uZyBow6BuZyBjw7MgT2NjdXBhdGlvbiB2w6AgSW5jb21lIG5oxrAgecOqdSBj4bqndQ0KdHNjMyA8LSBzdWJzZXQoZGF0YSwNCiAgICAgICAgICAgICAgIE9jY3VwYXRpb24gJWluJSBjKCJTYWxlcyIsICJUcmFuc3BvcnQtbW92aW5nIikgJg0KICAgICAgICAgICAgICAgSW5jb21lICVpbiUgYygiPD01MEsiLCAiPjUwSyIpKQ0KDQojIELhu48gbGV2ZWxzIGtow7RuZyBjw7JuIHPhu60gZOG7pW5nIChu4bq/dSBiaeG6v24gbMOgIGZhY3RvcikNCnRzYzMgPC0gZHJvcGxldmVscyh0c2MzKQ0KDQp0YWJsZTMgPC0gdGFibGUodHNjMyRPY2N1cGF0aW9uLCB0c2MzJEluY29tZSkNCmthYmxlICh0YWJsZTMpDQpgYGANCg0KYGBge3J9DQojVMOtbmggUlINCnJpc2tyYXRpbyh0YWJsZTMpDQpgYGANCg0KYGBge3J9DQojVMOtbmggT1INCm9kZHNyYXRpbyh0YWJsZTMpDQpgYGANCg0KS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggc28gc8OhbmggZ2nhu69hIGhhaSBuaMOzbSBuZ2jhu4EgbmdoaeG7h3Ag4oCcU2FsZXPigJ0gdsOgIOKAnFRyYW5zcG9ydC1tb3ZpbmfigJ0gY2hvIHRo4bqleToNCg0KVOG7tyBz4buRIG9kZHMgKG9kZHMgcmF0aW8pID0gMC42NywgbmdoxKlhIGzDoCBuZ8aw4budaSBsw6BtIG5naOG7gSBUcmFuc3BvcnQtbW92aW5nIGPDsyBraOG6oyBuxINuZyBjw7MgdGh1IG5o4bqtcCA+NTBLIHRo4bqlcCBoxqFuIGtob+G6o25nIDMzJSBzbyB24bubaSBuZ8aw4budaSBsw6BtIG5naOG7gSBTYWxlcy4NCg0KS2hv4bqjbmcgdGluIGPhuq15IDk1JSAoMC40MyDEkeG6v24gMS4wMSkgY2hvIHRo4bqleSBt4bupYyDEkeG7mSBraMO0bmcgY2jhuq9jIGNo4bqvbjogdsOsIGtob+G6o25nIG7DoHkgY8OzIGNo4bupYSBnacOhIHRy4buLIDEsIHRhIGtow7RuZyB0aOG7gyBr4bq/dCBsdeG6rW4gY2jhuq9jIGNo4bqvbiBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgbMOgIGPDsyB0aOG6rXQuDQoNCkPDoWMgZ2nDoSB0cuG7iyBwLXZhbHVlIChtaWQtcCA9IDAuMDU2LCBGaXNoZXIgPSAwLjA2NywgQ2hpLXNxdWFyZSA9IDAuMDYwKSDEkeG7gXUgaMahaSBs4bubbiBoxqFuIDAuMDUsIHThu6ljIGzDoCBraMO0bmcgxJHhu6cgbeG6oW5oIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBy4bqxbmcgaGFpIG5naOG7gSBjw7MgY8O5bmcgeMOhYyBzdeG6pXQgxJHhuqF0IHRodSBuaOG6rXAgPjUwSy4NCg0KX19fDQoNCiMgKipCaeG6v24gRWR1Y2F0aW9uKioNCg0KIyMgKiozLjQuIEJp4bq/biBNYXJpdGFsIFN0YXR1cyB2w6AgRWR1Y2F0aW9uKioNCg0KIyMjICoqYSkgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB2w6AgYmnhu4N1IMSR4buTIHRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCiMgQuG6p24gc3XhuqV0IGdp4buvYSBNYXJpdGFsIFN0YXR1cyB2w6AgRWR1Y2F0aW9uDQp0YW5zbzQgPC0gdGFibGUoZGF0YSRNYXJpdGFsU3RhdHVzLCBkYXRhJEVkdWNhdGlvbikgDQp0YW5zdWF0NCA8LSBwcm9wLnRhYmxlKHRhbnNvMSwgbWFyZ2luID0gMSkgKiAxMDANCg0KYmFuZzQgPC0gYXMuZGF0YS5mcmFtZSh0YW5zbzQpDQpiYW5nNCRQZXJjZW50YWdlIDwtIHJvdW5kKGFzLnZlY3Rvcih0YW5zdWF0NCksIDIpDQoNCmNvbG5hbWVzKGJhbmc0KSA8LSBjKCJNYXJpdGFsIFN0YXR1cyIsICJFZHVjYXRpb24iLCAiVOG6p24gc+G7kSIsICJU4bqnbiBzdeG6pXQiKQ0KICAgIA0Ka2FibGUoYmFuZzQsIGNhcHRpb24gPSAiQuG6o25nIDExOiBNw7QgdOG6oyB0aOG7kW5nIGvDqiBj4bunYSAyIGJp4bq/biBNYXJpdGFsIFN0YXR1cyB2w6AgRWR1Y2F0aW9uIikNCg0KI1Ry4buxYyBxdWFuIGjDs2EgY2hvIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgMiBiaeG6v24NCmdncGxvdChkYXRhLCBhZXMoeCA9IEVkdWNhdGlvbiwgZmlsbCA9IE1hcml0YWxTdGF0dXMpKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkjDrG5oIDExOiBN4buRaSBxdWFuIGjhu4cgZ2nhu69hIE1hcml0YWwgU3RhdHVzIHbDoCBFZHVjYXRpb24iLA0KICAgIHggPSAiSOG7jWMgduG6pW4iLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyIsDQogICAgZmlsbCA9ICJUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCkJp4buDdSDEkeG7kyB2w6AgYuG6o25nIHRo4buRbmcga8OqIGNobyB0aOG6pXkgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHBow6JuIGLhu5Ega2jDtG5nIMSR4buTbmcgxJHhu4F1IHRoZW8gdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuLiBOaMOzbSBjaMawYSB04burbmcga+G6v3QgaMO0biBjaGnhur9tIHThu7cgbOG7hyBjYW8g4bufIGLhuq1jIEhTLWdyYWQgKDIuNjgwIG5nxrDhu51pKSB2w6AgU29tZS1jb2xsZWdlICgyLjQyMiBuZ8aw4budaSksIHRyb25nIGtoaSBuaMOzbSBseSBow7RuIGPFqW5nIMSRw6FuZyBr4buDIHbhu5tpIDEuNDg5IHbDoCAxLjAwMCBuZ8aw4budaSDhu58gaGFpIGLhuq1jIG7DoHkuIE5ow7NtIGdvw6EgdsOgIGx5IHRow6JuIMOtdCBoxqFuIG5oxrBuZyB24bqrbiB0cuG6o2kgcuG7mW5nIOG7nyBjw6FjIGLhuq1jIGjhu41jLiDhu54gY8OhYyBi4bqtYyBo4buNYyB0aOG6pXAgbmjGsCBQcmVzY2hvb2wgaGF5IDFzdC00dGgsIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgdGh14buZYyBt4buNaSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gxJHhu4F1IHLhuqV0IHRo4bqlcC4NCg0KIyMjICoqYikgS2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nKioNCg0KR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6DQoNCiRIXzAkOiBCaeG6v24gTWFyaXRhbFN0YXR1cyAodMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKSBraMO0bmcg4bqjbmggaMaw4bufbmcgxJHhur9uIGJp4bq/biBFZHVjYXRpb24gKGjhu41jIHbhuqVuKQ0KDQokSF8xJDogQmnhur9uIE1hcml0YWxTdGF0dXMgKHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibikgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBiaeG6v24gRWR1Y2F0aW9uICho4buNYyB24bqlbikNCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZw0KY2hpX3Rlc3QgPC0gY2hpc3EudGVzdCh0YW5zbzQpDQpjaGlfdGVzdA0KYGBgDQoNClbhu5tpIGvhur90IHF14bqjIHbhu6thIGtp4buDbSDEkeG7i25oIMSRxrDhu6NjLCB0YSB0aOG6pXkgcuG6sW5nICRwLXZhbHVlIDwgMi4yZS0xNiA8IDAuMDUkLCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQgdsOgIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMSQsIHThu6ljIGJp4bq/biBNYXJpdGFsU3RhdHVzICh0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4pIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gYmnhur9uIEVkdWNhdGlvbiAoaOG7jWMgduG6pW4pIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCiMjIyAqKmMpIFTDrW5oIFJlbGF0aXZlIFJpc2sgdsOgIE9kZHMgUmF0aW8qKg0KDQrEkOG7gyB0w61uaCBSUiB2w6AgT1IgY2jDum5nIHRhIHPhur0gZ2nhu5tpIGjhuqFuIGjhuqFuZyBt4bulYyBxdWFuIHTDom0uIFbDrCB0YSBj4bqnbiBxdWFuIHTDom0gY8OhYyBiaeG6v24gdMOhYyDEkeG7mW5nIMSR4bq/biB0aHUgbmjhuq1wIG5oxrAgdGjhur8gbsOgbyBuw6puIHRhIHPhur0gZ2nhu68gbmd1ecOqbiAyIGjhuqFuZyBt4bulYyBj4bunYSBiaeG6v24gSW5jb21lIGzDoCAqKkJhY2hlbG9ycyoqIHbDoCAqKk1hc3RlcnMqKi4gVuG7m2kgYmnhur9uIE1hcml0YWxTdGF0dXMsIGjhuqFuZyBt4bulYyBxdWFuIHTDom0gKipOZXZlci1tYXJyaWVkKiogdsOgICoqU2VwYXJhdGVkKiouDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCg0KIyBMw6BtIHPhuqFjaCBk4buvIGxp4buHdSB0csaw4bubYyBu4bq/dSBj4bqnbg0KZGF0YSRNYXJpdGFsU3RhdHVzIDwtIHRyaW13cyhkYXRhJE1hcml0YWxTdGF0dXMpDQpkYXRhJEVkdWNhdGlvbiA8LSB0cmltd3MoZGF0YSRFZHVjYXRpb24pDQoNCiMgTOG7jWMgcmEgbmjhu69uZyBow6BuZyBjw7MgTWFyaXRhbFN0YXR1cyB2w6AgRWR1Y2F0aW9uIG5oxrAgecOqdSBj4bqndQ0KdHNjNCA8LSBzdWJzZXQoZGF0YSwNCiAgICAgICAgICAgICAgIE1hcml0YWxTdGF0dXMgJWluJSBjKCJOZXZlci1tYXJyaWVkIiwgIlNlcGFyYXRlZCIpICYNCiAgICAgICAgICAgICAgIEVkdWNhdGlvbiAlaW4lIGMoIkJhY2hlbG9ycyIsICJNYXN0ZXJzIikpDQoNCiMgQuG7jyBsZXZlbHMga2jDtG5nIGPDsm4gc+G7rSBk4bulbmcgKG7hur91IGJp4bq/biBsw6AgZmFjdG9yKQ0KdHNjNCA8LSBkcm9wbGV2ZWxzKHRzYzQpDQoNCnRhYmxlNCA8LSB0YWJsZSh0c2M0JE1hcml0YWxTdGF0dXMsIHRzYzQkRWR1Y2F0aW9uKQ0Ka2FibGUgKHRhYmxlNCkNCmBgYA0KDQpgYGB7cn0NCiNUw61uaCBSUg0Kcmlza3JhdGlvKHRhYmxlNCkNCmBgYA0KDQpgYGB7cn0NCiNUw61uaCBPUg0Kb2Rkc3JhdGlvKHRhYmxlNCkNCmBgYA0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBzbyBzw6FuaCBnaeG7r2EgaGFpIG5ow7NtIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAqKk5ldmVyLW1hcnJpZWQqKiB2w6AgKipTZXBhcmF0ZSoqIHbDoCBjaG8gdGjhuqV5Og0KDQpU4bu3IHPhu5Egb2RkcyAob2RkcyByYXRpbykgPSAxLjIzLCBuZ2jEqWEgbMOgIG5nxrDhu51pIGPDsyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gU2VwYXJhdGVkIGPDsyBraOG6oyBuxINuZyBjw7MgaOG7jWMgduG6pW4gTWFzdGVycyBjYW8gaMahbiBraG/huqNuZyAzMyUgc28gduG7m2kgbmfGsOG7nWkgY8OzIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBsw6AgTmV2ZXItbWFycmllZC4NCg0KS2hv4bqjbmcgdGluIGPhuq15IDk1JSAoMC43NSDEkeG6v24gMS45NSkgY2hvIHRo4bqleSBt4bupYyDEkeG7mSBraMO0bmcgY2jhuq9jIGNo4bqvbjogdsOsIGtob+G6o25nIG7DoHkgY8OzIGNo4bupYSBnacOhIHRy4buLIDEsIHRhIGtow7RuZyB0aOG7gyBr4bq/dCBsdeG6rW4gY2jhuq9jIGNo4bqvbiBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgbMOgIGPDsyB0aOG6rXQuDQoNCkPDoWMgZ2nDoSB0cuG7iyBwLXZhbHVlIChtaWQtcCA9IDAuNDA0LCBGaXNoZXIgPSAwLjQ0LCBDaGktc3F1YXJlID0gMC40MDUpIMSR4buBdSBoxqFpIGzhu5tuIGjGoW4gMC4wNSwgdOG7qWMgbMOgIGtow7RuZyDEkeG7pyBt4bqhbmggxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IHLhurFuZyBoYWkgdMOsbmggdHLhuqFuZyBo4buTbiBuaMOibiBjw7MgY8O5bmcgeMOhYyBzdeG6pXQgY8OzIGjhu41jIHbhuqVuIE1hc3RlcnMuDQoNCl9fXw0KIyMgKiozLjUuIEJp4bq/biBHZW5kZXIgdsOgIEVkdWNhdGlvbioqDQoNCiMjIyAqKmEpIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdsOgIGJp4buDdSDEkeG7kyB0cuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQojIELhuqduIHN14bqldCBnaeG7r2EgR2VuZGVyIHbDoCBFZHVjYXRpb24NCnRhbnNvNSA8LSB0YWJsZShkYXRhJEdlbmRlciwgZGF0YSRFZHVjYXRpb24pIA0KdGFuc3VhdDUgPC0gcHJvcC50YWJsZSh0YW5zbzUsIG1hcmdpbiA9IDEpICogMTAwDQoNCmJhbmc1IDwtIGFzLmRhdGEuZnJhbWUodGFuc281KQ0KYmFuZzUkUGVyY2VudGFnZSA8LSByb3VuZChhcy52ZWN0b3IodGFuc3VhdDUpLCAyKQ0KDQpjb2xuYW1lcyhiYW5nNSkgPC0gYygiR2VuZGVyIiwgIkVkdWNhdGlvbiIsICJU4bqnbiBz4buRIiwgIlThuqduIHN14bqldCIpDQogICAgDQprYWJsZShiYW5nNSwgY2FwdGlvbiA9ICJC4bqjbmcgMTI6IE3DtCB04bqjIHRo4buRbmcga8OqIGPhu6dhIDIgYmnhur9uIEdlbmRlciB2w6AgRWR1Y2F0aW9uIikNCg0KI1Ry4buxYyBxdWFuIGjDs2EgY2hvIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgMiBiaeG6v24NCmdncGxvdChkYXRhLCBhZXMoeCA9IEVkdWNhdGlvbiwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSMOsbmggMTI6IE3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgR2VuZGVyIHbDoCBFZHVjYXRpb24iLA0KICAgIHggPSAiSOG7jWMgduG6pW4iLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyIsDQogICAgZmlsbCA9ICJHaeG7m2kgdMOtbmgiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCkJp4buDdSDEkeG7kyB2w6AgYuG6o25nIHRo4buRbmcga8OqIGNobyB0aOG6pXkgbmFtIHbDoCBu4buvIHBow6JuIGLhu5Ega2jDoSB0xrDGoW5nIMSR4buTbmcg4bufIGjhuqd1IGjhur90IGPDoWMgYuG6rWMgaOG7jWMsIG5oxrBuZyB24bqrbiBjw7Mgc+G7sSBjaMOqbmggbOG7h2NoIG5o4bq5IOG7nyBt4buZdCBz4buRIG5ow7NtLiDhu54gYuG6rWMgSFMtZ3JhZCB2w6AgU29tZS1jb2xsZWdlLCBj4bqjIG5hbSB2w6AgbuG7ryDEkeG7gXUgY2hp4bq/bSBz4buRIGzGsOG7o25nIGNhbywgdHJvbmcgxJHDsyBu4buvIG5o4buJbmggaMahbiDhu58gU29tZS1jb2xsZWdlICgyLjA4MyBzbyB24bubaSAxLjY4NSBuYW0pLCBjw7JuIG5hbSBuaOG7iW5oIGjGoW4g4bufIEhTLWdyYWQgKDIuNDA5IHNvIHbhu5tpIDIuNDI4IG7hu68pLiBO4buvIGPDsyB04bu3IGzhu4cgY2FvIGjGoW4g4bufIGLhuq1jIEFzc29jLWFjZG0sIEFzc29jLXZvYyB2w6AgTWFzdGVycywgdHJvbmcga2hpIG5hbSBjaGnhur9tIMawdSB0aOG6vyDhu58gUHJvZi1zY2hvb2wgdsOgIFByZXNjaG9vbC4gTmjDrG4gY2h1bmcsIG7hu68gZ2nhu5tpIGPDsyB4dSBoxrDhu5tuZyB04bqtcCB0cnVuZyBuaGnhu4F1IOG7nyBi4bqtYyBo4buNYyB0cnVuZyBj4bqlcCB2w6AgY2FvIMSR4bqzbmcsIGPDsm4gbmFtIGPDsyBwaOG6p24gbuG7lWkgYuG6rXQgaMahbiDhu58gY8OhYyBi4bqtYyBo4buNYyBuZ2jhu4EgY2h1ecOqbiBzw6J1Lg0KDQojIyMgKipiKSBLaeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcqKg0KDQpHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoNCg0KJEhfMCQ6IEJp4bq/biBHZW5kZXIgKEdp4bubaSB0w61uaCkga2jDtG5nIOG6o25oIGjGsOG7n25nIMSR4bq/biBiaeG6v24gRWR1Y2F0aW9uICho4buNYyB24bqlbikNCiRIXzEkOiBCaeG6v24gR2VuZGVyIChHaeG7m2kgdMOtbmgpIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gYmnhur9uIEVkdWNhdGlvbiAoaOG7jWMgduG6pW4pDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcNCmNoaV90ZXN0IDwtIGNoaXNxLnRlc3QodGFuc281KQ0KY2hpX3Rlc3QNCmBgYA0KDQpW4bubaSBr4bq/dCBxdeG6oyB24burYSBraeG7g20gxJHhu4tuaCDEkcaw4bujYywgdGEgdGjhuqV5IHLhurFuZyAkcC12YWx1ZSA9IDEuNTE1ZS0xMyA8IDAuMDUkLCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQgdsOgIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMSQsIHThu6ljIGJp4bq/biBHZW5kZXIgKHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibikgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBiaeG6v24gRWR1Y2F0aW9uICho4buNYyB24bqlbikg4bufIG3hu6ljIMO9IG5naMSpYSA1JS4NCg0KIyMjICoqYykgVMOtbmggUmVsYXRpdmUgUmlzayB2w6AgT2RkcyBSYXRpbyoqDQoNCsSQ4buDIHTDrW5oIFJSIHbDoCBPUiBjaMO6bmcgdGEgc+G6vSBnaeG7m2kgaOG6oW4gaOG6oW5nIG3hu6VjIHF1YW4gdMOibS4gVsOsIHRhIGPhuqduIHF1YW4gdMOibSBjw6FjIGJp4bq/biB0w6FjIMSR4buZbmcgxJHhur9uIHRodSBuaOG6rXAgbmjGsCB0aOG6vyBuw6BvIG7Dqm4gdGEgc+G6vSBnaeG7ryBuZ3V5w6puIDIgaOG6oW5nIG3hu6VjIGPhu6dhIGJp4bq/biBFZHVjYXRpb24gbMOgICoqQmFjaGVsb3JzKiogdsOgICoqTWFzdGVycyoqLiBW4bubaSBiaeG6v24gR2VuZGVyLCBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtICoqRmVtYWxlKiogdsOgICoqTWFsZSoqLg0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQoNCiMgTMOgbSBz4bqhY2ggZOG7ryBsaeG7h3UgdHLGsOG7m2MgbuG6v3UgY+G6p24NCmRhdGEkR2VuZGVyIDwtIHRyaW13cyhkYXRhJEdlbmRlcikNCmRhdGEkRWR1Y2F0aW9uIDwtIHRyaW13cyhkYXRhJEVkdWNhdGlvbikNCg0KIyBM4buNYyByYSBuaOG7r25nIGjDoG5nIGPDsyBHZW5kZXIgdsOgIEVkdWNhdGlvbiBuaMawIHnDqnUgY+G6p3UNCnRzYzUgPC0gc3Vic2V0KGRhdGEsDQogICAgICAgICAgICAgICBHZW5kZXIgJWluJSBjKCJGZW1hbGUiLCAiTWFsZSIpICYNCiAgICAgICAgICAgICAgIEVkdWNhdGlvbiAlaW4lIGMoIkJhY2hlbG9ycyIsICJNYXN0ZXJzIikpDQoNCiMgQuG7jyBsZXZlbHMga2jDtG5nIGPDsm4gc+G7rSBk4bulbmcgKG7hur91IGJp4bq/biBsw6AgZmFjdG9yKQ0KdHNjNSA8LSBkcm9wbGV2ZWxzKHRzYzUpDQoNCnRhYmxlNSA8LSB0YWJsZSh0c2M1JEdlbmRlciwgdHNjNSRFZHVjYXRpb24pDQprYWJsZSAodGFibGU1KQ0KYGBgDQoNCmBgYHtyfQ0KI1TDrW5oIFJSDQpyaXNrcmF0aW8odGFibGU1KQ0KYGBgDQoNCmBgYHtyfQ0KI1TDrW5oIE9SDQpvZGRzcmF0aW8odGFibGU1KQ0KYGBgDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIHNvIHPDoW5oIGdp4buvYSBoYWkgbmjDs20gZ2nhu5tpIHTDrW5oICoqTWFsZSoqIHbDoCAqKkZlbWFsZSoqIHbDoCBjaG8gdGjhuqV5Og0KDQpU4bu3IHPhu5Egb2RkcyAob2RkcyByYXRpbykgPSAwLjczLCBuZ2jEqWEgbMOgIG5nxrDhu51pIGPDsyBnaeG7m2kgdMOtbmggbmFtIGPDsyBraOG6oyBuxINuZyBjw7MgaOG7jWMgduG6pW4gTWFzdGVycyB0aOG6pXAgaMahbiBraG/huqNuZyAzLjgyJSBzbyB24bubaSBuZ8aw4budaSBjw7MgZ2nhu5tpIHTDrW5oIG7hu68uDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgKDAuNjIgxJHhur9uIDAuODUpIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgY2jhuq9jIGNo4bqvbjogdsOsIGtob+G6o25nIG7DoHkga2jDtG5nIGPDsyBjaOG7qWEgZ2nDoSB0cuG7iyAxLCB0YSB0aOG7gyBr4bq/dCBsdeG6rW4gY2jhuq9jIGNo4bqvbiBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgbMOgIGPDsyB0aOG6rXQuDQoNCkPDoWMgZ2nDoSB0cuG7iyBwLXZhbHVlIChtaWQtcCA9IDAuMDAwNSwgRmlzaGVyID0gMC4wMDA1LCBDaGktc3F1YXJlID0gMC4wMDA1KSDEkeG7gXUgYsOpIGjGoW4gMC4wNSwgdOG7qWMgxJHhu6cgbeG6oW5oIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBy4bqxbmcgaGFpIGdp4bubaSB0w61uaCBjw7MgY8O5bmcgeMOhYyBzdeG6pXQgY8OzIGjhu41jIHbhuqVuIE1hc3RlcnMuDQoNCl9fXw0KIyMgKiozLjYuIEJp4bq/biBPY2N1cGF0aW9uIHbDoCBFZHVjYXRpb24qKg0KDQojIyMgKiphKSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHbDoCBiaeG7g3UgxJHhu5MgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KIyBC4bqnbiBzdeG6pXQgZ2nhu69hIEdlbmRlciB2w6AgRWR1Y2F0aW9uDQp0YW5zbzYgPC0gdGFibGUoZGF0YSRPY2N1cGF0aW9uLCBkYXRhJEVkdWNhdGlvbikgDQp0YW5zdWF0NiA8LSBwcm9wLnRhYmxlKHRhbnNvNiwgbWFyZ2luID0gMSkgKiAxMDANCg0KYmFuZzYgPC0gYXMuZGF0YS5mcmFtZSh0YW5zbzYpDQpiYW5nNiRQZXJjZW50YWdlIDwtIHJvdW5kKGFzLnZlY3Rvcih0YW5zdWF0NiksIDIpDQoNCmNvbG5hbWVzKGJhbmc2KSA8LSBjKCJPY2N1cGF0aW9uIiwgIkVkdWNhdGlvbiIsICJU4bqnbiBz4buRIiwgIlThuqduIHN14bqldCIpDQogICAgDQprYWJsZShiYW5nNiwgY2FwdGlvbiA9ICJC4bqjbmcgMTM6IE3DtCB04bqjIHRo4buRbmcga8OqIGPhu6dhIDIgYmnhur9uIE9jY3VwYXRpb24gdsOgIEVkdWNhdGlvbiIpDQoNCiNUcuG7sWMgcXVhbiBow7NhIGNobyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIDIgYmnhur9uDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBFZHVjYXRpb24sIGZpbGwgPSBPY2N1cGF0aW9uKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJIw6xuaCAxMzogTeG7kWkgcXVhbiBo4buHIGdp4buvYSBPY2N1cGF0aW9uIHbDoCBFZHVjYXRpb24iLA0KICAgIHggPSAiSOG7jWMgduG6pW4iLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyIsDQogICAgZmlsbCA9ICJOZ2jhu4EgbmdoaeG7h3AiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCkJp4buDdSDEkeG7kyB2w6AgYuG6o25nIHRo4buRbmcga8OqIGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buRIG5naOG7gSBuZ2hp4buHcCBraMOhYyBuaGF1IHLDtSBy4buHdCB0aGVvIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbi4g4bueIGLhuq1jIEhTLWdyYWQgdsOgIFNvbWUtY29sbGVnZSwgY8OhYyBuaMOzbSBuZ2jhu4EgbmjGsCBBZG0tY2xlcmljYWwgKDkyMCB2w6AgOTQwIG5nxrDhu51pKSwgU2FsZXMgKDUyNiB2w6AgNTU0KSB2w6AgT3RoZXItc2VydmljZSAoODY0IHbDoCA2MDkpIGNoaeG6v20gdOG7tyBs4buHIGNhby4gTmdo4buBIGNodXnDqm4gbcO0biBjYW8gKFByb2Ytc3BlY2lhbHR5KSB04bqtcCB0cnVuZyBjaOG7pyB54bq/dSDhu58gYuG6rWMgQmFjaGVsb3JzICg3NDcgbmfGsOG7nWkpIHbDoCBNYXN0ZXJzICgzNzYgbmfGsOG7nWkpLiBUcm9uZyBraGkgxJHDsywgY8OhYyBuaMOzbSBsYW8gxJHhu5luZyB0YXkgY2jDom4gbmjGsCBIYW5kbGVycy1jbGVhbmVycywgTWFjaGluZS1vcC1pbnNwY3QgdsOgIENyYWZ0LXJlcGFpciBwaOG7lSBiaeG6v24gaMahbiDhu58gbmjDs20gaOG7jWMgduG6pW4gcGjhu5UgdGjDtG5nIHbDoCB0cnVuZyBj4bqlcC4gQ8OhYyBuZ2jhu4EgbmjGsCBFeGVjLW1hbmFnZXJpYWwgdsOgIFRlY2gtc3VwcG9ydCBjxaluZyB0xINuZyByw7Ug4bufIGLhuq1jIEJhY2hlbG9ycyB2w6AgU29tZS1jb2xsZWdlLiBOaMOsbiBjaHVuZywgbmdo4buBIG5naGnhu4dwIGPDsyB4dSBoxrDhu5tuZyBwaMOibiBow7NhIG3huqFuaCB0aGVvIGjhu41jIHbhuqVuLCB24bubaSBjw6FjIG5naOG7gSBr4bu5IHRodeG6rXQgdsOgIGNodXnDqm4gbcO0biB04bqtcCB0cnVuZyDhu58gbmjDs20gY8OzIGjhu41jIHbhuqVuIGNhby4NCg0KIyMjICoqYikgS2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nKioNCg0KR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6DQoNCiRIXzAkOiBCaeG6v24gT2NjdXBhdGlvbiAobmdo4buBIG5naGnhu4dwKSBraMO0bmcg4bqjbmggaMaw4bufbmcgxJHhur9uIGJp4bq/biBFZHVjYXRpb24gKGjhu41jIHbhuqVuKQ0KDQokSF8xJDogQmnhur9uIE9jY3VwYXRpb24gKG5naOG7gSBuZ2hp4buHcCkgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBiaeG6v24gRWR1Y2F0aW9uICho4buNYyB24bqlbikNCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZw0KY2hpX3Rlc3QgPC0gY2hpc3EudGVzdCh0YW5zbzYpDQpjaGlfdGVzdA0KYGBgDQoNClbhu5tpIGvhur90IHF14bqjIHbhu6thIGtp4buDbSDEkeG7i25oIMSRxrDhu6NjLCB0YSB0aOG6pXkgcuG6sW5nICRwLXZhbHVlIDwgMi4yZS0xNiA8IDAuMDUkLCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQgdsOgIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMSQsIHThu6ljIGJp4bq/biBPY2N1cGF0aW9uIChuZ2jhu4EgbmdoaeG7h3ApIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gYmnhur9uIEVkdWNhdGlvbiAoaOG7jWMgduG6pW4pIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCiMjIyAqKmMpIFTDrW5oIFJlbGF0aXZlIFJpc2sgdsOgIE9kZHMgUmF0aW8qKg0KDQrEkOG7gyB0w61uaCBSUiB2w6AgT1IgY2jDum5nIHRhIHPhur0gZ2nhu5tpIGjhuqFuIGjhuqFuZyBt4bulYyBxdWFuIHTDom0uIFbDrCB0YSBj4bqnbiBxdWFuIHTDom0gY8OhYyBiaeG6v24gdMOhYyDEkeG7mW5nIMSR4bq/biB0aHUgbmjhuq1wIG5oxrAgdGjhur8gbsOgbyBuw6puIHRhIHPhur0gZ2nhu68gbmd1ecOqbiAyIGjhuqFuZyBt4bulYyBj4bunYSBiaeG6v24gRWR1Y2F0aW9uIGzDoCAqKkJhY2hlbG9ycyoqIHbDoCAqKk1hc3RlcnMqKi4gVuG7m2kgYmnhur9uIE9jY3VwYXRpb24sIGjhuqFuZyBt4bulYyBxdWFuIHTDom0gKipTYWxlcyoqIHbDoCAqKlRyYW5zcG9ydC1tb3ZpbmcqKi4NCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0KDQojIEzDoG0gc+G6oWNoIGThu68gbGnhu4d1IHRyxrDhu5tjIG7hur91IGPhuqduDQpkYXRhJE9jY3VwYXRpb24gPC0gdHJpbXdzKGRhdGEkT2NjdXBhdGlvbikNCmRhdGEkRWR1Y2F0aW9uIDwtIHRyaW13cyhkYXRhJEVkdWNhdGlvbikNCg0KIyBM4buNYyByYSBuaOG7r25nIGjDoG5nIGPDsyBPY2N1cGF0aW9uIHbDoCBFZHVjYXRpb24gbmjGsCB5w6p1IGPhuqd1DQp0c2M2IDwtIHN1YnNldChkYXRhLA0KICAgICAgICAgICAgICAgT2NjdXBhdGlvbiAlaW4lIGMoIlNhbGVzIiwgIlRyYW5zcG9ydC1tb3ZpbmciKSAmDQogICAgICAgICAgICAgICBFZHVjYXRpb24gJWluJSBjKCJCYWNoZWxvcnMiLCAiTWFzdGVycyIpKQ0KDQojIELhu48gbGV2ZWxzIGtow7RuZyBjw7JuIHPhu60gZOG7pW5nIChu4bq/dSBiaeG6v24gbMOgIGZhY3RvcikNCnRzYzYgPC0gZHJvcGxldmVscyh0c2M2KQ0KDQp0YWJsZTYgPC0gdGFibGUodHNjNiRPY2N1cGF0aW9uLCB0c2M2JEVkdWNhdGlvbikNCmthYmxlICh0YWJsZTYpDQpgYGANCg0KYGBge3J9DQojVMOtbmggUlINCnJpc2tyYXRpbyh0YWJsZTYpDQpgYGANCg0KYGBge3J9DQojVMOtbmggT1INCm9kZHNyYXRpbyh0YWJsZTYpDQpgYGANCg0KS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggc28gc8OhbmggZ2nhu69hIGhhaSBuaMOzbSBuZ2jhu4EgbmdoaeG7h3AgKipTYWxlcyoqIHbDoCAqKlRyYW5zcG9ydC1tb3ZpbmcqKiB2w6AgY2hvIHRo4bqleToNCg0KVOG7tyBz4buRIG9kZHMgKG9kZHMgcmF0aW8pID0gMS41OSwgbmdoxKlhIGzDoCBuZ8aw4budaSBjw7Mgbmdo4buBIG5naGnhu4dwIGzDoCBUcmFuc3BvcnQtbW92aW5nIGPDsyBraOG6oyBuxINuZyBjw7MgaOG7jWMgduG6pW4gTWFzdGVycyBjYW8gaMahbiBraG/huqNuZyAwLjcyJSBzbyB24bubaSBuZ8aw4budaSBjw7Mgbmdo4buBIFNhbGVzLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlICgwLjYyIMSR4bq/biA0LjAyKSBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIGNo4bqvYyBjaOG6r246IHbDrCBraG/huqNuZyBuw6B5IGtow7RuZyBjw7MgY2jhu6lhIGdpw6EgdHLhu4sgMSwgdGEgdGjhu4Mga+G6v3QgbHXhuq1uIGNo4bqvYyBjaOG6r24gcuG6sW5nIHPhu7Ega2jDoWMgYmnhu4d0IGzDoCBjw7MgdGjhuq10Lg0KDQpDw6FjIGdpw6EgdHLhu4sgcC12YWx1ZSAobWlkLXAgPSAwLjM2LCBGaXNoZXIgPSAwLjMxLCBDaGktc3F1YXJlID0gMC4zNCkgxJHhu4F1IGzhu5tuIGjGoW4gMC4wNSwgdOG7qWMgY2jGsGEgxJHhu6cgbeG6oW5oIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBy4bqxbmcgaGFpIG5naOG7gSBuZ2hp4buHcCBjw7MgY8O5bmcgeMOhYyBzdeG6pXQgY8OzIGjhu41jIHbhuqVuIE1hc3RlcnMuDQogDQojICoqUEjhuqZOIDQ6IFBIw4JOIFTDjUNIIEjhu5JJIFFVWSBMT0dJU1RJQyBWw4AgUFJPQklUKioNCg0KduG7m2kgcGjhuqduIG7DoHksIHTDoWMgZ2nhuqMgY2jhu41uIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBiaeG6v24gKipJbmNvbWUqKi4NCg0KIyMgKio0LjEuIE3DlCBIw4xOSCBI4buSSSBRVVkgTE9HSVNUSUMqKg0KDQpgYGB7cn0NCiNDaHV54buDbiBiaeG6v24gSW5jb21lIHNhbmcgbmjhu4sgcGjDom4NCmRhdGEkSW5jb21lLm5wIDwtIGlmZWxzZShkYXRhJEluY29tZSA9PSAiPjUwSyIsIDEsIDApDQoNCiMgxq/hu5tjIGzGsOG7o25nIG3DtCBow6xuaCBsb2dpdCAobGluayA9ICJsb2dpdCIpDQpsb2dpdCA8LSBnbG0oSW5jb21lLm5wIH4gV29ya0NsYXNzICsgRWR1Y2F0aW9uICsgTWFyaXRhbFN0YXR1cyArIE9jY3VwYXRpb24gKyBHZW5kZXIgKyBDb3VudHJ5LCBkYXRhID0gZGF0YSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0Kc3VtbWFyeShsb2dpdCkNCmBgYA0KDQpL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IGdp4bubaSB0w61uaCDhuqNuaCBoxrDhu59uZyByw7UgcuG7h3QgxJHhur9uIG3hu6ljIHRodSBuaOG6rXAsIHbhu5tpIG5hbSBnaeG7m2kgY8OzIGto4bqjIG7Eg25nIMSR4bqhdCB0aHUgbmjhuq1wIHRyw6puIDUwSyBjYW8gaMahbiBu4buvIGdp4bubaS4gQ+G7pSB0aOG7gywgaOG7hyBz4buRIGPhu6dhIGJp4bq/biAqKkdlbmRlck1hbGUqKiBsw6AgMC44OSwgbmdoxKlhIGzDoCBuYW0gZ2nhu5tpIGPDsyBs4bujaSB0aOG6vyB0aHUgbmjhuq1wIHLDtSBy4buHdCwgY8OzIHRo4buDIHBo4bqjbiDDoW5oIGNow6puaCBs4buHY2ggZ2nhu5tpIHRyb25nIGPGoSBo4buZaSBuZ2jhu4EgbmdoaeG7h3AgaG/hurdjIG3hu6ljIGzGsMahbmcgdHLDqm4gdGjhu4sgdHLGsOG7nW5nIGxhbyDEkeG7mW5nLg0KDQoqKlRyw6xuaCDEkeG7mSBo4buNYyB24bqlbioqIGzDoCB54bq/dSB04buRIHRoZW4gY2jhu5F0IHbhu4Ega2luaCB04bq/LiBOaOG7r25nIG5nxrDhu51pIGPDsyBi4bqxbmcgxJHhuqFpIGjhu41jIChCYWNoZWxvcnM6IGjhu4cgc+G7kSAxLjg5KSwgdGjhuqFjIHPEqSAoTWFzdGVyczogMi41NiksIHRp4bq/biBzxKkgKERvY3RvcmF0ZTogMy45NikgaGF5IHThu5F0IG5naGnhu4dwIHRyxrDhu51uZyBjaHV5w6puIG3DtG4gKFByb2Ytc2Nob29sOiAzLjQ2KSDEkeG7gXUgY8OzIHjDoWMgc3XhuqV0IHRodSBuaOG6rXAgY2FvIGjGoW4gaOG6s24uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGdpw6EgdHLhu4sga2luaCB04bq/IGPhu6dhIGdpw6FvIGThu6VjIGLhuq1jIGNhbyBy4bqldCBs4bubbiwgdsOgIMSR4bqndSB0xrAgdsOgbyBo4buNYyB24bqlbiB0aOG7sWMgc+G7sSBtYW5nIGzhuqFpIGzhu6NpIMOtY2ggdMOgaSBjaMOtbmggxJHDoW5nIGvhu4MuDQoNCioqVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKiogY8WpbmcgbGnDqm4gcXVhbiDEkeG6v24gdGh1IG5o4bqtcC4gTmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0biAoTmV2ZXItbWFycmllZDogLTAuOTkpIGPDsyBraOG6oyBuxINuZyB0aHUgbmjhuq1wIGNhbyB0aOG6pXAgaMahbiBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4uIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgcGjhuqNuIMOhbmggcuG6sW5nIG5nxrDhu51pIGvhur90IGjDtG4gdGjGsOG7nW5nIOG7lW4gxJHhu4tuaCBoxqFuIHbhu4EgbeG6t3QgeMOjIGjhu5lpIHbDoCBraW5oIHThur8sIGhv4bq3YyBo4buNIGNo4buNbiBs4buxYSBjw7RuZyB2aeG7h2MvbOG7mSB0csOsbmggbmdo4buBIG5naGnhu4dwIGtow6FjIHbhu5tpIG5nxrDhu51pIMSR4buZYyB0aMOibi4NCg0KVuG7gSAqKm5naOG7gSBuZ2hp4buHcCoqLCBuaMOzbSBFeGVjLW1hbmFnZXJpYWwgKDEuNDEpIHbDoCBQcm9mLXNwZWNpYWx0eSAoMC44OCkgbMOgIG5o4buvbmcgbmdo4buBIGPDsyBo4buHIHPhu5EgZMawxqFuZyBs4bubbiwgY2hvIHRo4bqleSDEkcOieSBsw6Agbmjhu69uZyBuZ8Ogbmggbmdo4buBIGPDsyBnacOhIHRy4buLIGtpbmggdOG6vyBjYW8sIHRoxrDhu51uZyB5w6p1IGPhuqd1IGvhu7kgbsSDbmcgdsOgIHRyw6xuaCDEkeG7mSBjYW8uIE5nxrDhu6NjIGzhuqFpLCBuaOG7r25nIG5naOG7gSBuaMawIGxhbyDEkeG7mW5nIHBo4buVIHRow7RuZywgZOG7i2NoIHbhu6UgKEhhbmRsZXJzLWNsZWFuZXJzOiAtMS4zOCkgY8OzIGjhu4cgc+G7kSDDom0gcsO1IHLhu4d0LCBwaOG6o24gw6FuaCB0aHUgbmjhuq1wIHRo4bqlcCBn4bqvbiB24bubaSBjw7RuZyB2aeG7h2Mga2jDtG5nIMSRw7JpIGjhu49pIHRyw6xuaCDEkeG7mSBjaHV5w6puIG3DtG4gY2FvLg0KDQrhu54gZ8OzYyDEkeG7mSAqKmxv4bqhaSBow6xuaCBjw7RuZyB2aeG7h2MqKiwgbmjhu69uZyBuZ8aw4budaSBsw6BtIHRyb25nIGtodSB24buxYyBuaMOgIG7GsOG7m2MgKExvY2FsLWdvdjogLTAuNzksIFN0YXRlLWdvdjogLTEuMTEpIGPDsyB4dSBoxrDhu5tuZyB0aHUgbmjhuq1wIHRo4bqlcCBoxqFuIGtodSB24buxYyB0xrAgbmjDom4sIHBo4bqjbiDDoW5oIG3hu6ljIGzGsMahbmcgdHJvbmcga2h1IHbhu7FjIGPDtG5nIHRoxrDhu51uZyDhu5VuIMSR4buLbmggbmjGsG5nIHRo4bqlcCBoxqFuIHRo4buLIHRyxrDhu51uZywgaG/hurdjIMOtdCBjw7MgY8ahIGjhu5lpIHRoxrDhu59uZyB2w6AgdMSDbmcgbMawxqFuZy4NCg0KQ3Xhu5FpIGPDuW5nLCBiaeG6v24gKipDb3VudHJ5KiogY2hvIHRo4bqleSBuaGnhu4F1IGjhu4cgc+G7kSBj4buxYyBjYW8gduG7m2kgc2FpIHPhu5EgY2h14bqpbiBs4bubbiB2w6AgcC12YWx1ZSBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiwgcGjhuqNuIMOhbmggbcO0IGjDrG5oIGtow7RuZyByw7p0IHJhIMSRxrDhu6NjIHRow7RuZyB0aW4ga2luaCB04bq/IMSRw6FuZyB0aW4gY+G6rXkgdOG7qyBxdeG7kWMgdOG7i2NoIOKAkyBjw7MgdGjhu4MgZG8gZOG7ryBsaeG7h3Uga2jDtG5nIMSR4buTbmcgxJHhu4F1IGdp4buvYSBjw6FjIHF14buRYyBnaWEuIFbhu4EgbeG6t3Qga2luaCB04bq/LCDEkWnhu4F1IG7DoHkgY2hvIHRo4bqleSBj4bqnbiBjw7MgdGjDqm0gZOG7ryBsaeG7h3UgaG/hurdjIGfhu5lwIG5ow7NtIGzhuqFpIMSR4buDIHBow6JuIHTDrWNoIGPDsyBnacOhIHRy4buLIGjGoW4uDQoNCiMjICoqNC4yLiBNw5QgSMOMTkggSOG7kkkgUVVZIFBST0JJVCoqDQoNCmBgYHtyfQ0KI0NodXnhu4NuIGJp4bq/biBJbmNvbWUgc2FuZyBuaOG7iyBwaMOibg0KZGF0YSRJbmNvbWUubnAgPC0gaWZlbHNlKGRhdGEkSW5jb21lID09ICI+NTBLIiwgMSwgMCkNCg0KIyDGr+G7m2MgbMaw4bujbmcgbcO0IGjDrG5oIHByb2JpdCAobGluayA9ICJwcm9iaXQiKQ0KcHJvYml0IDwtIGdsbShJbmNvbWUubnAgfiBXb3JrQ2xhc3MgKyBFZHVjYXRpb24gKyBNYXJpdGFsU3RhdHVzICsgT2NjdXBhdGlvbiArIEdlbmRlciArIENvdW50cnksIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpDQpzdW1tYXJ5KHByb2JpdCkNCmBgYA0KDQoqKkdp4bubaSB0w61uaCoqOiBOYW0gZ2nhu5tpIGPDsyBs4bujaSB0aOG6vyByw7UgcuG7h3TigJRo4buHIHPhu5HigK8wLjg5LOKAr3DigK884oCvMC4wMDHigJRuZ2jEqWEgbMOgIHNhdSBraGkga2nhu4NtIHNvw6F0IGPDoWMgeeG6v3UgdOG7kSBraMOhYywgbmFtIGPDsyB4w6FjIHN14bqldCB2xrDhu6N0IG3hu5Fj4oCvNTDigK9LIGNhbyBoxqFuIG7hu68uDQoNCioqSOG7jWMgduG6pW4qKjogR2nDoSB0cuG7iyBraW5oIHThur8gY+G7p2EgZ2nDoW8gZOG7pWMgcuG6pXQgbOG7m24uIEPhu60gbmjDom4gKDEuODks4oCvcOKAr+KJiOKArzLigK/Dl+KArzEw4oCRNiksIHRo4bqhYyBzxKkgKDIuNTYs4oCvcOKAr+KJiOKArzPigK/Dl+KArzEw4oCRMTApIHbDoCDEkeG6t2MgYmnhu4d0IHRp4bq/biBzxKkgKDMuOTYs4oCvcOKArzzigK8y4oCvw5figK8xMOKAkTE2KSDEkeG7gXUgdMSDbmcgbeG6oW5oIGPGoSBo4buZaSB0aHUgbmjhuq1wIGNhbzsgdHLDrG5oIMSR4buZIGPDoG5nIGNhbywgeMOhYyBzdeG6pXQgY8OgbmcgbOG7m24uDQoNCioqTmdo4buBIG5naGnhu4dwKio6IEPDoWMgduG7iyB0csOtIGNodXnDqm4gbcO0bi8gcXXhuqNuIGzDvSBtYW5nIGzhuqFpIHRodSBuaOG6rXAgdOG7kXTigJRleGVj4oCRbWFuYWdlcmlhbCAoMS40MSzigK9w4oCvPOKArzLigK/Dl+KArzEw4oCRMTYpLCBwcm9m4oCRc3BlY2lhbHR5ICgwLjg5LOKAr3DigK/iiYjigK854oCvw5figK8xMOKAkTkpLCBwcm90ZWN0aXZl4oCRc2VydmljZSAoMS4zNCzigK9w4oCv4omI4oCvMeKAr8OX4oCvMTDigJE3KS4gTmfGsOG7o2MgbOG6oWksIGxhbyDEkeG7mW5nIHBo4buVIHRow7RuZyBuaMaw4oCvaGFuZGxlcnPigJFjbGVhbmVycyAo4oCRMS4zOCzigK9w4oCv4omI4oCvMC4wMDMpIGzDoG0gZ2nhuqNtIMSRw6FuZyBr4buDIGPGoSBo4buZaS4NCg0KKipMb+G6oWkgaMOsbmggY8O0bmcgdmnhu4djKio6IEzDoG0ga2h1IHbhu7FjIGPDtG5nIGvDqW8gdGh1IG5o4bqtcCB4deG7kW5nOyBzdGF0ZeKAkWdvdiAo4oCRMS4xMizigK9w4oCv4omI4oCvMeKAr8OX4oCvMTDigJE2KSB2w6AgbG9jYWzigJFnb3YgKOKAkTAuNzks4oCvcOKAr+KJiOKArzfigK/Dl+KArzEw4oCRNSkgxJHhu4F1IGdp4bqjbSB4w6FjIHN14bqldCBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UgdMawIG5ow6JuLg0KDQoqKlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibioqOiBOZ8aw4budaSBjaMawYSB04burbmcga+G6v3QgaMO0biBjaOG7i3UgYuG6pXQgbOG7o2nigJRo4buHIHPhu5HigK/igJEwLjk5LOKAr3DigK884oCvMuKAr8OX4oCvMTDigJExNuKAlGjDoG0gw70g4buVbiDEkeG7i25oIGdpYSDEkcOsbmggY8OzIGxpw6puIHF1YW4gdOG7m2kgbeG7qWMgbMawxqFuZyBjYW8uDQoNCioqUXXhu5FjIHThu4tjaCoqOiBI4buHIHPhu5EgY+G7sWMgbOG7m24gKOKJiOKArzEz4oCTMTcpIG5oxrBuZyBw4oCRdmFsdWXigK/iiYjigK8xIHbDoCBzYWkgc+G7kSBjaHXhuqluIGto4buVbmcgbOG7kyBjaG8gdGjhuqV5IGJp4bq/biBDb3VudHJ5IGtow7RuZyBo4buvdSDDrWNoOyBj4bqnbiBn4buZcCBuaMOzbSBob+G6t2MgbG/huqFpIGLhu48gdsOsIG3huqV0IGPDom4gYuG6sW5nIGThu68gbGnhu4d1Lg0KDQpUw7NtIGzhuqFpLCDEkeG6p3UgdMawIHbDoG8gZ2nDoW8gZOG7pWMgY2FvLCBjaOG7jW4gbmdo4buBIGNodXnDqm4gbcO0biBob+G6t2MgcXXhuqNuIGzDvSwgbMOgbSB2aeG7h2Mga2h1IHbhu7FjIHTGsCBuaMOibiB2w6Ag4buVbiDEkeG7i25oIGjDtG4gbmjDom4gbMOgIGPDoWMg4oCcxJHDsm4gYuG6qXnigJ0ga2luaCB04bq/IGzhu5tuIG5o4bqldCBnacO6cCBjw6EgbmjDom4gdsawxqFuIHThu5tpIHRodSBuaOG6rXAgdHLDqm7igK81MOKAr0suDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K