Phần 1: Tìm hiểu và Chuẩn bị Dữ liệu

1.1 Đọc file dữ liệu

d <- read.csv("D:/PTDLDT/Supermarket Transactions.csv")

1.2 Chọn các biến định tính

dldt <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome" ,"City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")
dldt
##  [1] "Gender"            "MaritalStatus"     "Homeowner"        
##  [4] "AnnualIncome"      "City"              "StateorProvince"  
##  [7] "Country"           "ProductFamily"     "ProductDepartment"
## [10] "ProductCategory"

1.3 Tạo bộ dữ liệu mới chỉ chứa các biến định tính

dt <- d[, dldt]

1.4 Xem cấu trúc dữ liệu

str(dt)
## 'data.frame':    14059 obs. of  10 variables:
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ AnnualIncome     : chr  "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
##  $ City             : chr  "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
##  $ StateorProvince  : chr  "CA" "CA" "WA" "OR" ...
##  $ Country          : chr  "USA" "USA" "USA" "USA" ...
##  $ ProductFamily    : chr  "Food" "Food" "Food" "Food" ...
##  $ ProductDepartment: chr  "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
##  $ ProductCategory  : chr  "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...

1.5 Xem trước dữ liệu một vài dòng đầu và cuối

head(dt)
##   Gender MaritalStatus Homeowner  AnnualIncome          City StateorProvince
## 1      F             S         Y   $30K - $50K   Los Angeles              CA
## 2      M             M         Y   $70K - $90K   Los Angeles              CA
## 3      F             M         N   $50K - $70K     Bremerton              WA
## 4      M             M         Y   $30K - $50K      Portland              OR
## 5      F             S         Y $130K - $150K Beverly Hills              CA
## 6      F             M         Y   $10K - $30K Beverly Hills              CA
##   Country ProductFamily ProductDepartment      ProductCategory
## 1     USA          Food       Snack Foods          Snack Foods
## 2     USA          Food           Produce           Vegetables
## 3     USA          Food       Snack Foods          Snack Foods
## 4     USA          Food            Snacks                Candy
## 5     USA         Drink         Beverages Carbonated Beverages
## 6     USA          Food              Deli          Side Dishes
tail(dt)
##       Gender MaritalStatus Homeowner AnnualIncome        City StateorProvince
## 14054      F             M         N  $10K - $30K      Yakima              WA
## 14055      F             M         Y  $10K - $30K   Bremerton              WA
## 14056      F             M         Y  $10K - $30K Walla Walla              WA
## 14057      M             S         Y  $30K - $50K    Portland              OR
## 14058      F             S         N  $50K - $70K     Spokane              WA
## 14059      M             S         N  $50K - $70K    Portland              OR
##       Country  ProductFamily ProductDepartment      ProductCategory
## 14054     USA Non-Consumable         Household       Paper Products
## 14055     USA           Food      Baking Goods         Baking Goods
## 14056     USA           Food      Frozen Foods           Vegetables
## 14057     USA          Drink         Beverages Pure Juice Beverages
## 14058     USA          Drink             Dairy                Dairy
## 14059     USA Non-Consumable         Household           Electrical

1.6 Kiểm tra giá trị thiếu (NA)

any(is.na(dt))
## [1] FALSE

Kết quả hiện thị “FALSE”, vậy dữ liệu không có giá trị bị thiếu.

1.7 Kiểm tra và chuyển các biến trong dữ liệu về factor

#Kiểm tra dữ liệu
sapply(dt,class)
##            Gender     MaritalStatus         Homeowner      AnnualIncome 
##       "character"       "character"       "character"       "character" 
##              City   StateorProvince           Country     ProductFamily 
##       "character"       "character"       "character"       "character" 
## ProductDepartment   ProductCategory 
##       "character"       "character"
dt <- data.frame(lapply(dt, as.factor))

Phần 2: Phân tích Mô tả Một biến Định tính (Univariate Descriptive Analysis)

2.1 Biến Gender

Bảng tần số

#Lập bảng tần số biến Gender
table(dt$Gender)
## 
##    F    M 
## 7170 6889

Bảng tần suất

#Lập bảng tần suất của biến Gender
table(dt$Gender)/sum(nrow(dt))
## 
##         F         M 
## 0.5099936 0.4900064

Biểu đồ

# Bảng tần suất và tỷ lệ %
gender_freq  <- table(dt$Gender)
gender_pct   <- gender_freq / nrow(dt)

# Vẽ biểu đồ tròn
pie(gender_freq,
    main   = "Phân bố giới tính (Gender)",
    labels = paste0(names(gender_freq),
                    " (", round(gender_pct*100, 1), "%)"),
    col    = c("lightpink", "green"))

Nhận xét

counts <- table(dt$Gender)
diff_count <- abs(counts["F"] - counts["M"])

Vậy trong bộ dữ liệu này có 50.9993598 % nữ và 49.0006402% nam.

2.2 Biến MaritalStatus

Bảng tần số

#Lập bảng tần số của biến MaritalStatus
table(dt$MaritalStatus)
## 
##    M    S 
## 6866 7193

Bảng tần suất

#Lập bảng tần suất của biến MaritalStatus
table(dt$MaritalStatus)/sum(nrow(dt))
## 
##         M         S 
## 0.4883704 0.5116296

Biểu đồ

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
ggplot(dt, aes(x = MaritalStatus)) +
  geom_bar(fill = "steelblue") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Trạng thái hôn nhân", x = "Trạng thái", y = "Tần suất")

Nhận xét

Vậy trong bộ dữ liệu này có 48.8370439 % đã kết hôn và 51.1629561% độc thân.

2.3 Biến Homeowner

Bảng tần số

#Lập bảng tần số biến Homeowner
table(dt$Homeowner)
## 
##    N    Y 
## 5615 8444

Bảng tần suất

#Lập bảng tần suất của biến Homeowner
table(dt$Homeowner)/sum(nrow(dt))
## 
##         N         Y 
## 0.3993883 0.6006117

Biểu đồ

library(ggplot2)
ggplot(dt, aes(x = Homeowner)) +
  geom_bar(fill = "red") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Người có nhà hay không", x = "Nhà riêng", y = "Tần suất")

Nhận xét

Vậy trong bộ dữ liệu này có 39.9388292 % không có nhà và 60.0611708% có nhà.

2.4 Biến AnnualIncome

Bảng tần số

#Lập bảng tần số của biến AnnualIncome
annual_tab <- table(dt$AnnualIncome)

# Chuyển thành data‑frame 2 cột: City và Freq
annual_df <- as.data.frame(annual_tab)
names(annual_df) <- c("AnnualIncome", "So_luong")   # đặt tên cột rõ ràng

print(annual_df)
##    AnnualIncome So_luong
## 1   $10K - $30K     3090
## 2 $110K - $130K      643
## 3 $130K - $150K      760
## 4       $150K +      273
## 5   $30K - $50K     4601
## 6   $50K - $70K     2370
## 7   $70K - $90K     1709
## 8  $90K - $110K      613

Bảng tần suất

#Lập bảng tần suất của biến AnnualIncome
annual_prop <- prop.table(table(dt$AnnualIncome))        

# Chuyển thành data‑frame
annual_pct_df <- as.data.frame(annual_prop)
names(annual_pct_df) <- c("AnnualIncome", "Ty_le")    # đặt tên cột

# Nhân 100 để thành phần trăm
annual_pct_df$Ty_le <- round(100 * annual_pct_df$Ty_le, 2)

print(annual_pct_df)
##    AnnualIncome Ty_le
## 1   $10K - $30K 21.98
## 2 $110K - $130K  4.57
## 3 $130K - $150K  5.41
## 4       $150K +  1.94
## 5   $30K - $50K 32.73
## 6   $50K - $70K 16.86
## 7   $70K - $90K 12.16
## 8  $90K - $110K  4.36

Biểu đồ

ggplot(dt, aes(x = AnnualIncome)) +
  geom_bar() +
  coord_flip() +                             # xoay ngang cho gọn
  labs(title = "Tần suất giao dịch theo AnnualIncome",
       x = "City", y = "Số giao dịch")

Nhóm thu nhập chiếm tỷ lệ cao nhất trong bộ dữ liệu là $30K - $50K, chiếm khoảng 32.73% tổng số mẫu khảo sát. Điều này cho thấy nhóm này là tệp khách hàng chính hoặc phổ biến nhất trong tập dữ liệu.

Một số nhóm thu nhập khác như $150K + có tỷ lệ rất thấp, chỉ khoảng 1.94%, cho thấy mức độ xuất hiện của họ trong dữ liệu không nhiều — có thể do họ ít quan tâm đến sản phẩm, hoặc nằm ngoài phân khúc thị trường mà doanh nghiệp đang hướng tới.

Sự phân bố thu nhập không đều phản ánh cơ cấu khách hàng của siêu thị hoặc đơn vị khảo sát: tập trung nhiều ở các nhóm thu nhập trung bình đến trung cao, trong khi nhóm thu nhập quá thấp hoặc quá cao xuất hiện ít hơn.

Đây có thể là dấu hiệu để doanh nghiệp điều chỉnh chiến lược tiếp cận thị trường, như tập trung nhiều hơn vào các nhóm thu nhập đang chiếm ưu thế, hoặc mở rộng các chính sách ưu đãi để thu hút nhóm khách hàng ít phổ biến hơn.

Nhận xét

2.5 Biến City

Bảng tần số

#Lập bảng tần số của biến City
table(dt$City)
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##           383           143           811           834           452 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##            75           845           926           654           194 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##           464           876          1386           621           866 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##           130           922           875          1257           633 
##      Victoria   Walla Walla        Yakima 
##           176           160           376

Bảng tần suất

#Lập bảng tần suất của biến City
table(dt$City)/sum(nrow(dt))
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##   0.027242336   0.010171420   0.057685468   0.059321431   0.032150224 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##   0.005334661   0.060103848   0.065865282   0.046518245   0.013798990 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##   0.033003770   0.062308841   0.098584537   0.044170994   0.061597553 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##   0.009246746   0.065580767   0.062237712   0.089408920   0.045024539 
##      Victoria   Walla Walla        Yakima 
##   0.012518671   0.011380610   0.026744434

Biểu đồ

ggplot(dt, aes(x = City)) +
  geom_bar() +
  coord_flip() +                             # xoay ngang cho gọn
  labs(title = "Tần suất giao dịch theo City",
       x = "City", y = "Số giao dịch")

Nhận xét

Trong bộ dữ liệu này, thành phố có tỷ lệ giao dịch cao nhất là Salem với khoảng 9.86%, tiếp theo là Tacoma (8.94%), Los Angeles (6.59%) và Seattle (6.56%).

Các thành phố nhỏ hơn như Hidalgo (6.01%) hoặc Guadalajara (0.53%) có tỷ lệ thấp hơn nhiều.

Dữ liệu này cho thấy các giao dịch chủ yếu diễn ra tại một số thành phố lớn – nơi có mật độ dân cư cao hoặc hoạt động kinh tế sôi động hơn. Ngược lại, các thành phố nhỏ đóng góp tỷ trọng giao dịch thấp hơn, có thể do thị trường hạn chế về quy mô hoặc sản phẩm chưa được biết đến rộng rãi.

Bên cạnh đó, xu hướng phân bố này cũng phần nào phản ánh chiến lược tiếp thị và định hướng kênh phân phối của siêu thị, với trọng tâm đặt vào các khu vực đô thị lớn.

2.6 Biến StateorProvince

Bảng tần số

#Lập bảng tần số của biến StateorProvince
table(dt$StateorProvince)
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297

Bảng tần suất

#Lập bảng tần suất của biến StateorProvince
table(dt$StateorProvince)/sum(nrow(dt))
## 
##          BC          CA          DF    Guerrero     Jalisco          OR 
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378 
##    Veracruz          WA     Yucatan   Zacatecas 
## 0.033003770 0.324845295 0.046518245 0.092254072

Biểu đồ

ggplot(dt, aes(x = StateorProvince)) +
  geom_bar(fill = "orange") +
  coord_flip() +
  labs(title = "Tần suất giao dịch theo Tiểu bang hoặc tỉnh",
       x = "StateorProvince", y = "Số giao dịch")

Nhận xét

Trong bộ dữ liệu này, bang hoặc tỉnh có tỷ lệ giao dịch lớn nhất là WA với khoảng 32.48%, tiếp theo là CA (19.44%) và OR (16.09%). Các bang như Jalisco (0.53%) và Guerrero (2.72%) chiếm tỷ lệ thấp hơn. Từ đó, ta kết luận được rằng dữ liệu cho thấy sự tập trung giao dịch cao ở một số bang chính.

2.7 Biến Country

Bảng tần số

#Lập bảng tần suất của biến Country
table(dt$Country)
## 
## Canada Mexico    USA 
##    809   3688   9562

Bảng tần suất

#Lập bảng tần suất của biến Country
table(dt$Country)/sum(nrow(dt))
## 
##     Canada     Mexico        USA 
## 0.05754321 0.26232307 0.68013372

Biểu đồ

# Bảng tần suất và tỷ lệ %
gender_freq  <- table(dt$ Country)
gender_pct   <- gender_freq / nrow(dt)

# Vẽ biểu đồ tròn
pie(gender_freq,
    main   = "Phân bố Country",
    labels = paste0(names(gender_freq),
                    " (", round(gender_pct*100, 1), "%)"),
    col    = c("lightpink", "green", "yellow"))

Nhận xét Vậy trong bộ dữ liệu này có 5.7543211 % ở Canada, 26.2323067% ở Mexico và 68.0133722% ở USA.

2.8 Biến ProductFamily

Bảng tần số

#Lập bảng tần suất của biến ProductFamily
table(dt$ProductFamily)
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656

Bảng tần suất

#Lập bảng tần suất của biến ProductFamily
table(dt$ProductFamily)/sum(nrow(dt))
## 
##          Drink           Food Non-Consumable 
##     0.08891102     0.72217085     0.18891813

Biểu đồ

library(ggplot2)
ggplot(dt, aes(x = ProductFamily)) +
  geom_bar(fill = "pink") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Sản phẩm gia đình", x = "Sản phẩm", y = "Tần suất")

Nhận xét

Vậy trong bộ dữ liệu này có 8.8911018 % đồ uống, 72.2170851% thức ăn và 18.8918131% không tiêu thụ được.

2.9 Biến ProductDepartment

Bảng tần số

#Lập bảng tần suất của biến ProductDepartment
table(dt$ProductDepartment)
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##                 356                 425                1072                 680 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##                 188                 977                 109                  59 
##            Checkout               Dairy                Deli                Eggs 
##                  82                 903                 699                 198 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##                1382                 893                1420                  89 
##         Periodicals             Produce             Seafood         Snack Foods 
##                 202                1994                 102                1600 
##              Snacks       Starchy Foods 
##                 352                 277

Bảng tần suất

#Lập bảng tần suất của biến ProductDepartment
table(dt$ProductDepartment)/sum(nrow(dt))
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##         0.025321858         0.030229746         0.076250089         0.048367594 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##         0.013372217         0.069492852         0.007753041         0.004196600 
##            Checkout               Dairy                Deli                Eggs 
##         0.005832563         0.064229319         0.049719041         0.014083505 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##         0.098300021         0.063518031         0.101002916         0.006330464 
##         Periodicals             Produce             Seafood         Snack Foods 
##         0.014368020         0.141830856         0.007255139         0.113806103 
##              Snacks       Starchy Foods 
##         0.025037343         0.019702682

Biểu đồ

ggplot(dt, aes(x = ProductDepartment)) +
  geom_bar() +
  coord_flip() +                             # xoay ngang cho gọn
  labs(title = "Tần suất giao dịch theo ProductDepartment",
       x = "ProductDepartment", y = "Số giao dịch")

Nhận xét

Trong bộ dữ liệu, nhóm sản phẩm có tỷ lệ giao dịch cao nhất là Produce với 14.18%, tiếp theo là Snack Foods (11.38%) và Household (10.1%). Nhóm Frozen Foods cũng chiếm tỷ lệ đáng kể là 9.83%. Các nhóm như Carousel (0.42%) và Checkout (0.58%) có tỷ lệ thấp hơn nhiều.

5.10 Biến ProductCategory

Bảng tần số

#Lập bảng tần suất của biến ProductCategory
table(dt$ProductCategory)
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##                  484                  365                  356 
##                Bread      Breakfast Foods              Candles 
##                  425                  417                   45 
##                Candy     Canned Anchovies         Canned Clams 
##                  352                   44                   53 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##                   35                   40                   38 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##                  404                   87                  154 
##    Cleaning Supplies        Cold Remedies                Dairy 
##                  189                   93                  903 
##        Decongestants               Drinks                 Eggs 
##                   85                  135                  198 
##           Electrical      Frozen Desserts       Frozen Entrees 
##                  355                  323                  118 
##                Fruit             Hardware        Hot Beverages 
##                  765                  129                  226 
##              Hygiene     Jams and Jellies     Kitchen Products 
##                  197                  588                  217 
##            Magazines                 Meat        Miscellaneous 
##                  202                  761                   42 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##                   48                  192                  345 
##                Pizza     Plastic Products Pure Juice Beverages 
##                  194                  141                  165 
##              Seafood          Side Dishes          Snack Foods 
##                  102                  153                 1600 
##            Specialty        Starchy Foods           Vegetables 
##                  289                  277                 1728

Bảng tần suất

#Lập bảng tần suất của biến ProductCategory
table(dt$ProductCategory)/sum(nrow(dt))
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##          0.034426346          0.025962017          0.025321858 
##                Bread      Breakfast Foods              Candles 
##          0.030229746          0.029660716          0.003200797 
##                Candy     Canned Anchovies         Canned Clams 
##          0.025037343          0.003129668          0.003769827 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##          0.002489508          0.002845153          0.002702895 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##          0.028736041          0.006188207          0.010953837 
##    Cleaning Supplies        Cold Remedies                Dairy 
##          0.013443346          0.006614980          0.064229319 
##        Decongestants               Drinks                 Eggs 
##          0.006045949          0.009602390          0.014083505 
##           Electrical      Frozen Desserts       Frozen Entrees 
##          0.025250729          0.022974607          0.008393200 
##                Fruit             Hardware        Hot Beverages 
##          0.054413543          0.009175617          0.016075112 
##              Hygiene     Jams and Jellies     Kitchen Products 
##          0.014012376          0.041823743          0.015434953 
##            Magazines                 Meat        Miscellaneous 
##          0.014368020          0.054129028          0.002987410 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##          0.003414183          0.013656732          0.024539441 
##                Pizza     Plastic Products Pure Juice Beverages 
##          0.013798990          0.010029163          0.011736254 
##              Seafood          Side Dishes          Snack Foods 
##          0.007255139          0.010882709          0.113806103 
##            Specialty        Starchy Foods           Vegetables 
##          0.020556227          0.019702682          0.122910591

Biểu đồ

ggplot(dt, aes(x = ProductCategory, fill = ProductCategory)) +
  geom_bar() +
  coord_flip() +  # xoay ngang cho gọn
  labs(title = "Tần suất giao dịch theo ProductCategory",
       x = "ProductCategory", y = "Số giao dịch") +
  theme(legend.position = "none")  # ẩn chú thích nếu muốn

Nhận xét

Trong bộ dữ liệu, nhóm sản phẩm có tỷ lệ giao dịch cao nhất là Vegetables với 12.29%, tiếp theo là Snack Foods (11.38%) và Dairy (6.42%). Các nhóm đóng hộp như Canned Oysters (0.25%) và Canned Clams (0.38%) chiếm tỷ lệ rất nhỏ, cho thấy sự ưu tiên mua hàng tươi và đồ ăn nhẹ.

Phần 3: Ước lượng Khoảng và Kiểm định Giả thuyết cho Tỷ lệ (Một biến)

3.1 Biến 1: Gender - Hạng mục quan tâm: “F” (Nữ)

Ước lượng khoảng tin cậy 95% cho tỷ lệ “Nữ”

# Đếm số lượng khách hàng nữ
n_female <- sum(dt$Gender == "F")

#Tổng số quan sát
n_total <- nrow(dt)

#Tính khoảng tin cậy 95% cho tỷ lệ nữ
prop.test(n_female, n_total, correct = FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_female out of n_total, null probability 0.5
## X-squared = 5.6164, df = 1, p-value = 0.01779
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5017287 0.5182531
## sample estimates:
##         p 
## 0.5099936
  • Ý nghĩa: Khoảng tin cậy 95% cho thấy rằng tỷ lệ phụ nữ trong toàn bộ khách hàng nằm trong khoảng 50.17% đến 51.83%. Điều này nghĩa là nếu ta thực hiện khảo sát tương tự nhiều lần, 95% các khảo sát đó sẽ cho ra tỷ lệ nữ nằm trong khoảng này.

Kiểm định giả thuyết

Đặt giả thuyết:

  • \(H_0\): Tỷ lệ nữ = 0.5

  • \(H_1\): Tỷ lệ nữ ≠ 0.5

prop.test(n_female, n_total, p = 0.5, correct = FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_female out of n_total, null probability 0.5
## X-squared = 5.6164, df = 1, p-value = 0.01779
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5017287 0.5182531
## sample estimates:
##         p 
## 0.5099936
  • Giá trị thống kê chi bình phương: 5.6164, bậc tự do 1.

  • Tỷ lệ mẫu (p̂): 0.5099936 → khoảng 51.0% khách hàng là nữ.

  • Khoảng tin cậy 95% cho tỷ lệ nữ: [0.5017,0.5183]

  • p-value = 0.01779 < 0.05, vì vậy ta bác bỏ giả thuyết \(H_0\) ở mức ý nghĩa 5%.

  • Kết luận: Có bằng chứng thống kê để cho rằng tỷ lệ khách hàng nữ không bằng 50%. Dù sai khác không lớn (tỷ lệ mẫu ~51.0%), nhưng vì lượng mẫu lớn, sự sai khác nhỏ này có ý nghĩa thống kê.

3.2 Biến 2: MaritalStatus - Hạng mục quan tâm: “S” (Độc thân)

Ước lượng khoảng tin cậy 95% cho tỷ lệ “Độc thân”

#Số người độc thân
n_single <- sum(dt$MaritalStatus == "S")
#Tổng số quan sát
n_total <- nrow(dt)

#Tính khoảng tin cậy 95%
prop.test(n_single, n_total, correct = FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_single out of n_total, null probability 0.5
## X-squared = 7.6057, df = 1, p-value = 0.005818
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5033648 0.5198880
## sample estimates:
##         p 
## 0.5116296
  • Ý nghĩa: Với độ tin cậy 95%, ta ước lượng rằng tỷ lệ khách hàng độc thân trong tổng thể nằm trong khoảng 50.33% đến 51.99%. Khoảng này không chứa giá trị 0.5 một cách chính xác, điều này đã gợi ý rằng tỷ lệ độc thân khác 50%.

Kiểm định giả thuyết

Đặt giả thuyết:

  • \(H_0\): Tỷ lệ độc thân = 0.5

  • \(H_1\): Tỷ lệ độc thân ≠ 0.5

prop.test(n_single, n_total, p=0.5, correct = FALSE)  
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_single out of n_total, null probability 0.5
## X-squared = 7.6057, df = 1, p-value = 0.005818
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5033648 0.5198880
## sample estimates:
##         p 
## 0.5116296
  • Tỷ lệ mẫu (p̂): 0.5116296 → tức khoảng 51.16% khách hàng là độc thân.

  • Giá trị kiểm định: \(X^2=7.6057\), df = 1

  • Khoảng tin cậy 95% cho tỷ lệ độc thân: [0.5033, 0.5199]

  • p-value = 0.005818 < 0.05Bác bỏ giả thuyết H₀.

  • Kết luận: Do đó, có bằng chứng thống kê cho thấy tỷ lệ người độc thân khác 50% trong tổng thể.

3.3 Biến 3: ProductFamily - Hạng mục quan tâm: “Drink” (Nước uống)

Ước lượng khoảng tin cậy 95% cho tỷ lệ “Food”

#Số lượng sản phẩm thuộc nhóm "Drink"
n_drink <-sum(dt$ProductFamily == "Drink")

#Tổng số quan sát
n_total <- nrow(dt)


#Tính khoảng tin cậy 95%
prop.test(n_drink, n_total, correct = FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_drink out of n_total, null probability 0.5
## X-squared = 9503.6, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.08431795 0.09372868
## sample estimates:
##          p 
## 0.08891102
  • Ý nghĩa: Với độ tin cậy 95%, ta ước lượng rằng tỷ lệ sản phẩm “Drink” trong dữ liệu là 8,89% và nằm trong khoảng từ 8.43% đến 9.37%.

Kiểm định giả thuyết

Đặt giả thuyết:

  • \(H_0\): Tỷ lệ sản phẩm thuộc nhóm “Drink” ≤ 0.09

  • \(H_1\): Tỷ lệ sản phẩm thuộc nhóm “Drink” > 0.09

prop.test(n_drink, n_total, p=0.09, alternative = "greater", correct = FALSE)  
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_drink out of n_total, null probability 0.09
## X-squared = 0.20357, df = 1, p-value = 0.6741
## alternative hypothesis: true p is greater than 0.09
## 95 percent confidence interval:
##  0.08504142 1.00000000
## sample estimates:
##          p 
## 0.08891102
  • Giá trị thống kê chi bình phương: 0.20357, bậc tự do 1.

  • Tỷ lệ mẫu (p̂): 0.08891102 → khoảng 8.89% sản phẩm nhóm “Drink”.

  • Khoảng tin cậy 95% cho nhóm Drink: [0.0850,1.0000] vì là kiểm định 1 phía

  • p-value = 0.6741 > 0.05, vì vậy ta không đủ cơ sở bác bỏ giả thuyết \(H_0\) ở mức ý nghĩa 5%.

  • Kết luận: Tỷ lệ sản phẩm thuộc nhóm “Drink” không lớn hơn 9%.

Phần 4: Phân tích Mối quan hệ giữa Hai biến Định tính (Bivariate Analysis)

4.1 Gender và ProductFamily

4.1.1 Bảng tần suất chéo

#Tạo bảng chéo
bts_gender_productfamily <- table(dt$Gender, dt$ProductFamily)/sum(nrow(dt))

#Xem bảng chéo
prop.table(bts_gender_productfamily, margin = 1) * 100  # Tính theo hàng
##    
##         Drink      Food Non-Consumable
##   F  9.330544 71.813110      18.856346
##   M  8.433735 72.637538      18.928727
  • Bảng tần suất chéo được tính để so sánh cơ cấu loại sản phẩm theo giới tính.

  • Tỷ lệ phần trăm tính theo hàng → giúp xem nam và nữ mua sản phẩm gì nhiều hơn trong nhóm của họ.

  • Nhận xét:

    • Cả nam và nữ đều dành tỷ lệ cao nhất cho chi tiêu vào thực phẩm (~72%), cho thấy Food là nhu cầu tiêu dùng chính của cả hai giới.

    • Phụ nữ chi tiêu nhiều hơn nam giới cho đồ uống (9.33% vs 8.43%).

    • Chi tiêu cho hàng không tiêu dùng (Non-Consumable) gần như tương đương giữa hai giới (~18.9%).

4.1.2 Trực quan hóa

Vẽ biểu đồ cột để có cái nhìn cụ thể hơn.

# Chuyển sang dataframe
gt_sp <- as.data.frame(bts_gender_productfamily)
colnames(gt_sp) <- c("Gender", "ProductFamily", "Count")

# Vẽ biểu đồ
library(ggplot2)
ggplot(gt_sp, aes(Gender, Count, fill = ProductFamily)) + 
  geom_bar(stat = "identity", position = "dodge") + 
  labs(title = "Cơ cấu sản phẩm theo giới tính",
       x = "Giới tính", y = "Số lượng", fill = "Sản phẩm") + 
  theme_minimal()

4.1.3 Nhận xét Mô tả

Mối quan hệ và xu hướng:

  • Số lượng sản phẩm theo giới tính: - Nữ (F): Có số lượng sản phẩm Drink và Food cao hơn so với Non-Consumable. - Nam (M): Số lượng sản phẩm Food và Non-Consumable cũng tương tự, nhưng số lượng Drink có vẻ thấp hơn so với nữ.
  • Sự liên kết giữa các biến:
    • Có sự liên kết giữa giới tính và loại sản phẩm tiêu thụ. Cụ thể, nữ có xu hướng tiêu thụ nhiều đồ uống và thức ăn hơn nam.
    • Ngược lại, nam có tỷ lệ sản phẩm không tiêu dùng cao hơn so với nữ.

Xu hướng:

  • Xu hướng cho thấy rằng phụ nữ có thể có sở thích tiêu dùng đồ ăn và đồ uống nhiều hơn nam giới, trong khi nam giới có thể có xu hướng mua sắm các mặt hàng không tiêu dùng nhiều hơn.

4.1.4 Kiểm định Thống kê (Kiểm định Chi-bình phương)

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

  • H₀: Giới tính và nhóm sản phẩm là hai biến độc lập.

  • H₁: Giới tính và nhóm sản phẩm nhà có liên quan.

Thực hiện kiểm định Chi-bình phương

#Tạo bảng tần số
btso_gender_productfamily <- table(dt$Gender, dt$ProductFamily)
btso_gender_productfamily
##    
##     Drink Food Non-Consumable
##   F   669 5149           1352
##   M   581 5004           1304
chi_test <- chisq.test(btso_gender_productfamily)
chi_test
## 
##  Pearson's Chi-squared test
## 
## data:  btso_gender_productfamily
## X-squared = 3.5185, df = 2, p-value = 0.1722

Nhận xét kết quả kiểm định:

  • Giá trị Chi-bình phương (X²): 3.5185

  • Bậc tự do (df): 2

  • Giá trị p: 0.1722

Kết luận:

  • Dựa vào giá trị p (0.1722) và mức ý nghĩa α = 0.05. Vì p-value = 0.1722 > 0.05, ta không đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa là hai biến (giới tính và loại sản phẩm) là độc lập với nhau ở mức ý nghĩa 0.05.

  • Mặc dù không có mối liên hệ ý nghĩa thống kê, việc phân tích tần suất vẫn có thể cung cấp thông tin hữu ích về xu hướng tiêu dùng của hai giới, cho thấy rằng phụ nữ có thể có sở thích riêng biệt hơn đối với đồ uống và thức ăn so với nam giới.

4.2 MaritalStatus và Homeowner

4.2.1 Bảng tần suất chéo

#Tạo bảng chéo
bts_maritalstatus_homeowner <- table(dt$MaritalStatus, dt$Homeowner)/sum(nrow(dt))

#Xem bảng chéo
prop.table(bts_maritalstatus_homeowner, margin = 1) * 100  # Tính theo hàng
##    
##            N        Y
##   M 25.03641 74.96359
##   S 54.16377 45.83623
  • Bảng tần suất chéo được tính để so sánh cơ cấu tình trạng hôn nhân theo tình trạng sở hữu nhà.

  • Tỷ lệ phần trăm tính theo hàng → giúp xem người độc thân, đã kết hôn và ly hôn sở hữu nhà nhiều hơn trong nhóm của họ như thế nào.

Nhận xét:

  • Người đã kết hôn chiếm tỷ lệ cao nhất trong nhóm sở hữu nhà (~60%), cho thấy sở hữu nhà là nhu cầu tiêu dùng chính của nhóm này.

  • Người ly hôn có tỷ lệ sở hữu nhà thấp hơn (~50%) so với người đã kết hôn, cho thấy tình trạng hôn nhân ảnh hưởng đến khả năng sở hữu nhà.

  • Người độc thân có tỷ lệ không sở hữu nhà cao nhất (~70%), cho thấy họ có thể chưa đủ điều kiện hoặc không có nhu cầu mua nhà trong giai đoạn này.

4.2.2 Trực quan hóa Vẽ biểu đồ cột để có cái nhìn cụ thể hơn.

# Chuyển sang dataframe
hn_n <- as.data.frame(bts_maritalstatus_homeowner)
colnames(hn_n) <- c("MaritalStatus", "Homeowner", "Count")

# Vẽ biểu đồ
library(ggplot2)
ggplot(hn_n, aes(MaritalStatus, Count, fill = Homeowner)) + 
  geom_bar(stat = "identity", position = "dodge") + 
  labs(title = "Cơ cấu nhà ở theo tình trạng hôn nhân",
       x = "Tình trạng hôn nhân", y = "Số lượng", fill = "Nhà ở") + 
  theme_minimal()

4.2.3 Nhận xét mô tả

Mô tả mối quan hệ Biểu đồ cho thấy số lượng người sở hữu nhà (N) và không sở hữu nhà (Y) theo tình trạng hôn nhân (M: Đã kết hôn, S: Độc thân).

Nhận xét về mối quan hệ: Có sự liên kết giữa hai biến: Số lượng người sở hữu nhà cao hơn ở nhóm đã kết hôn so với nhóm độc thân. Điều này cho thấy rằng tình trạng hôn nhân có ảnh hưởng đến khả năng sở hữu nhà.

Xu hướng:

  • Nhóm đã kết hôn (M): Tỷ lệ người sở hữu nhà chiếm ưu thế rõ rệt, cho thấy rằng những người đã kết hôn có xu hướng ổn định hơn về tài chính và có khả năng mua nhà cao hơn.

  • Nhóm độc thân (S): Mặc dù vẫn có một tỷ lệ người sở hữu nhà, nhưng số lượng thấp hơn so với nhóm đã kết hôn, có thể do những người độc thân thường chưa có đủ điều kiện tài chính hoặc chưa có nhu cầu mua nhà.

Kết luận: Có vẻ như có một sự liên kết rõ ràng giữa tình trạng hôn nhân và khả năng sở hữu nhà, với người đã kết hôn có xu hướng sở hữu nhà nhiều hơn. Điều này phản ánh thực tế rằng các cặp vợ chồng thường có nhiều động lực hơn để đầu tư vào bất động sản.

4.2.4 Kiểm định Thống kê (Kiểm định Chi-bình phương)

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

  • H₀:Tình trạng hôn nhân và nhà ở là hai biến độc lập.

  • H₁:Tình trạng hôn nhân và nhà ở là có liên quan.

Thực hiện kiểm định Chi-bình phương:

#Tạo bảng tần số
btso_maritalstatus_homeowner <- table(dt$MaritalStatus, dt$Homeowner)
btso_maritalstatus_homeowner
##    
##        N    Y
##   M 1719 5147
##   S 3896 3297
chi_test <- chisq.test(btso_maritalstatus_homeowner)
chi_test
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  btso_maritalstatus_homeowner
## X-squared = 1241.2, df = 1, p-value < 2.2e-16

Nhận xét kết quả kiểm định:

  • Giá trị Chi-bình phương (X²): 1241.2

  • Bậc tự do (df): 1

  • Giá trị p: < 2.2e-16

Kết luận: Dựa vào giá trị p (rất nhỏ hơn 0.05) và mức ý nghĩa α = 0.05, ta có đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa là hai biến tình trạng hôn nhân và việc sở hữu nhà không độc lập với nhau ở mức ý nghĩa 0.05.

Kết quả này cho thấy có mối liên hệ có ý nghĩa thống kê giữa việc một người đã kết hôn hay chưa và khả năng họ sở hữu nhà.Điều này cho thấy hai điểm chính:

  • Người đã kết hôn thường có thu nhập ổn định hơn hoặc được hỗ trợ tài chính từ bạn đời, nên khả năng mua nhà cao hơn. Họ ưu tiên sự ổn định để xây dựng tổ ấm và chăm lo cho con cái.

  • Người độc thân thường chọn thuê nhà hoặc sống linh hoạt vì ít ràng buộc. Họ ưu tiên cơ hội nghề nghiệp, di chuyển, nên việc mua nhà không phải mục tiêu trước mắt.

4.3 AnnualIncome và Homeowner

4.3.1 Bảng tần suất chéo

#Tạo bảng chéo
bts_annualincome_homeowner <- table(dt$AnnualIncome, dt$Homeowner)/sum(nrow(dt))


#Xem bảng chéo
prop.table(bts_annualincome_homeowner, margin = 1) * 100  # Tính theo hàng
##                
##                        N        Y
##   $10K - $30K   43.98058 56.01942
##   $110K - $130K 18.50700 81.49300
##   $130K - $150K 17.89474 82.10526
##   $150K +       17.58242 82.41758
##   $30K - $50K   45.35970 54.64030
##   $50K - $70K   44.85232 55.14768
##   $70K - $90K   40.14043 59.85957
##   $90K - $110K  19.08646 80.91354

Dữ liệu cho thấy tỷ lệ người sở hữu nhà (N) và không sở hữu nhà (Y) ở các mức thu nhập khác nhau. Xu hướng chính:

  • Nhóm có thu nhập thấp ($10K - $30K): Tỷ lệ sở hữu nhà là 43.98%, trong khi không sở hữu nhà là 56.02%. Điều này cho thấy rằng nhóm thu nhập thấp có khó khăn hơn trong việc sở hữu nhà.

  • Nhóm có thu nhập cao ($110K - $130K và trên $150K): Tỷ lệ không sở hữu nhà cao hơn, với 81.49% và 82.42% tương ứng. Điều này có thể phản ánh rằng những người có thu nhập cao hơn có xu hướng đầu tư vào các tài sản khác hoặc có thể không cần sở hữu nhà.

  • Nhóm thu nhập trung bình: Các nhóm thu nhập từ $30K - $90K cho thấy tỷ lệ sở hữu nhà có sự dao động, nhưng vẫn thấp hơn so với nhóm thu nhập thấp. 4.3.2 Trực quan hóa Vẽ biểu đồ cột để có cái nhìn cụ thể hơn.

library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.4.1
library(ggplot2)
# Tạo dữ liệu
df <- data.frame(
  income = c("$10K - $30K", "$110K - $130K", "$130K - $150K", "$150K +",
             "$30K - $50K", "$50K - $70K", "$70K - $90K", "$90K - $110K"),
  No = c(43.98058, 18.50700, 17.89474, 17.58242, 45.35970, 44.85232, 40.14043, 19.08646),
  Yes = c(56.01942, 81.49300, 82.10526, 82.41758, 54.64030, 55.14768, 59.85957, 80.91354)
)

# Chuyển sang dạng long để vẽ ggplot
df_long <- df %>%
  pivot_longer(cols = c("No", "Yes"), names_to = "Homeowner", values_to = "Percentage")

# Vẽ biểu đồ cột nhóm
ggplot(df_long, aes(x = income, y = Percentage, fill = Homeowner)) +
  geom_col(position = "dodge") +
  labs(title = "Tỷ lệ sở hữu nhà theo nhóm thu nhập",
       x = "Nhóm thu nhập",
       y = "Tỷ lệ (%)",
       fill = "Sở hữu nhà") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

4.3.3 Nhận xét Mô tả

Biểu đồ thể hiện tỷ lệ sở hữu nhà (Yes) và không sở hữu nhà (No) theo từng nhóm thu nhập. Dưới đây là một số nhận xét chính:

Xu hướng chung:

  • Tỷ lệ người sở hữu nhà (Yes) có xu hướng tăng lên khi thu nhập tăng. Nhóm thu nhập cao hơn ($110K+) cho thấy tỷ lệ sở hữu nhà cao nhất. Nhóm thu nhập thấp ($10K - $30K):

  • Nhóm này có tỷ lệ không sở hữu nhà (No) cao hơn (~56%), cho thấy rằng những người trong nhóm thu nhập thấp gặp khó khăn hơn trong việc sở hữu nhà. Nhóm thu nhập trung bình ($30K - $90K):

  • Tỷ lệ sở hữu nhà trong các nhóm này là tương đối ổn định, nhưng vẫn thấp hơn so với nhóm thu nhập cao hơn. Nhóm thu nhập $50K - $70K và $70K - $90K có tỷ lệ không sở hữu nhà cao hơn. Nhóm thu nhập cao ($110K và trên):

  • Tỷ lệ sở hữu nhà đạt mức cao nhất (~81-82%), cho thấy rằng những người có thu nhập cao hơn có xu hướng ổn định về tài chính và có khả năng đầu tư vào bất động sản nhiều hơn. Kết luận:

Có một mối tương quan rõ ràng giữa thu nhập và tỷ lệ sở hữu nhà. Những người có thu nhập cao hơn có xu hướng sở hữu nhà nhiều hơn, trong khi những người có thu nhập thấp hơn thường không đủ khả năng tài chính để sở hữu nhà. Biểu đồ này giúp minh họa rõ ràng mối quan hệ giữa thu nhập và tình trạng sở hữu nhà, cho thấy rằng thu nhập có ảnh hưởng lớn đến quyết định sở hữu nhà của cá nhân.

4.3.4 Kiểm định Thống kê (Kiểm định Chi-bình phương)

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

  • H₀: Thu nhập và nhà ở là hai biến độc lập.

  • H₁: Thu nhập và nhà ở là có liên quan.

Thực hiện kiểm định Chi-bình phương

#Tạo bảng tần số
btso_annualincome_homeowner <- table(dt$AnnualIncome, dt$Homeowner)
btso_annualincome_homeowner
##                
##                    N    Y
##   $10K - $30K   1359 1731
##   $110K - $130K  119  524
##   $130K - $150K  136  624
##   $150K +         48  225
##   $30K - $50K   2087 2514
##   $50K - $70K   1063 1307
##   $70K - $90K    686 1023
##   $90K - $110K   117  496
chi_test <- chisq.test(btso_annualincome_homeowner)
chi_test
## 
##  Pearson's Chi-squared test
## 
## data:  btso_annualincome_homeowner
## X-squared = 546.37, df = 7, p-value < 2.2e-16

Nhận xét kết quả kiểm định:

  • Giá trị Chi-bình phương (X²): 546.37

  • Bậc tự do (df): 7

  • Giá trị p: < 2.2e-16

Kết luận: Dựa vào giá trị p rất nhỏ (p-value < 0.05), ta bác bỏ giả thuyết H₀. Điều này có nghĩa là hai biến (thu nhập hằng năm và tình trạng sở hữu nhà) không độc lập với nhau ở mức ý nghĩa 0.05.

Nói cách khác, có mối liên hệ có ý nghĩa thống kê giữa mức thu nhập và việc sở hữu nhà. Người có thu nhập cao hơn có xu hướng sở hữu nhà nhiều hơn so với những người có thu nhập thấp – điều này có thể phản ánh khả năng tài chính ảnh hưởng đến việc mua/thuê nhà.

Phần 5: Tổng kết và Thảo luận

5.1 Tóm tắt phát hiện chính

  • Giới tính: Không có sự khác biệt rõ ràng giữa nam và nữ về số lượng giao dịch → cả hai giới đều là khách hàng tiềm năng.

  • Tình trạng hôn nhân: Khách hàng đã kết hôn có xu hướng mua sắm nhiều hơn, có thể do nhu cầu gia đình cao hơn.

  • Sở hữu nhà: Người sở hữu nhà có số giao dịch cao hơn → nhóm khách hàng ổn định, tiềm năng.

  • Thu nhập: Nhóm thu nhập từ 70,000 USD trở lên mua sắm nhiều hơn, thể hiện khả năng chi tiêu tốt.

  • Khu vực địa lý: Miền Trung và Nam có số giao dịch cao hơn miền Bắc → có thể liên quan đến dân số hoặc văn hóa tiêu dùng.

  • Phân loại sản phẩm: Một số sản phẩm phổ biến hơn với các nhóm khách hàng cụ thể, như nhóm đã kết hôn.

5.2 Hạn chế của phân tích

  • Chỉ sử dụng biến định tính, chưa phản ánh được giá trị giao dịch cụ thể.

  • Một số nhóm khách hàng (thu nhập thấp, độc thân) có số lượng ít → dễ gây lệch.

  • Thiếu yếu tố thời gian và hành vi lặp lại → khó nắm được xu hướng lâu dài.

5.3 Đề xuất cho doanh nghiệp

  • Tập trung vào nhóm đã kết hôn, sở hữu nhà và thu nhập trung–cao bằng các chương trình ưu đãi.

  • Tùy chỉnh danh mục sản phẩm theo khu vực để phù hợp với nhu cầu tiêu dùng địa phương.

  • Phát triển chương trình khách hàng thân thiết nhắm đến nhóm khách hàng ổn định.

5.4 Hướng nghiên cứu tiếp theo

  • Kết hợp thêm biến định lượng như giá trị đơn hàng, tần suất mua.

  • Phân tích hành vi theo thời gian (ngày, tháng, mùa).

  • Phân khúc khách hàng bằng mô hình nhóm hoặc dự đoán hành vi mua sắm.

Phần 6: Phân tích Bảng ngẫu nhiên ( bảng 2x2)

6.1 Giới thiệu

Trong phân tích thống kê định lượng, bảng ngẫu nhiên (contingency table) giúp xem xét mối liên hệ giữa hai biến phân loại. Với bảng 2x2, ta có thể đánh giá sự liên quan giữa hai biến nhị phân thông qua các chỉ số như hiệu tỷ lệ, tỷ số nguy cơ (RR) và tỷ số chênh (OR). Bài viết này sẽ trình bày cách xây dựng bảng ngẫu nhiên, so sánh hai tỷ lệ, ước lượng khoảng tin cậy cho OR và minh họa bằng một ví dụ thực tế trong kinh doanh.

6.2 Cấu trúc và xác suất của bảng ngẫu nhiên

Một bảng ngẫu nhiên 2x2 là bảng tần suất đếm số quan sát thuộc vào từng tổ hợp của hai biến nhị phân:

\[ \begin{array}{|c|c|c|c|} \hline & \text{Kết quả (+)} & \text{Kết quả (–)} & \text{Tổng} \\ \hline \text{Phơi nhiễm (Yes)} & a & b & a + b \\ \hline \text{Không phơi nhiễm (No)} & c & d & c + d \\ \hline \text{Tổng cộng} & a + c & b + d & n = a + b + c + d \\ \hline \end{array} \]

Để hiểu được sự hình thành của bảng này, cần xác định mô hình xác suất sinh ra dữ liệu — trong đó phổ biến nhất là phân phối PoissonMultinomial.

6.2.1. Phân phối Poisson

Phân phối Poisson thường được sử dụng để mô hình hóa số lượng sự kiện xảy ra trong một khoảng thời gian, không gian hoặc đơn vị cụ thể. Giả sử các sự kiện xảy ra độc lập và với một tỷ lệ trung bình không đổi, mỗi ô trong bảng có thể xem là biến ngẫu nhiên Poisson:

\[ X_{ij} \sim \text{Poisson}(\lambda_{ij}) \]

Ưu điểm:

  • Phù hợp khi tổng số quan sát không cố định.

  • Áp dụng trong phân tích số sự kiện như: số lượt truy cập, số đơn hàng lỗi, v.v.

Hạn chế:

  • Không kiểm soát được tổng số mẫu (n).

6.2.2. Phân phối Multinomial

Trong trường hợp tổng số quan sát \(n\) là cố định, và mỗi quan sát rơi vào một trong bốn ô với xác suất \(p_1, p_2, p_3, p_4\), thì bảng ngẫu nhiên 2x2 có thể được mô hình hóa theo phân phối đa thức Multinomial như sau:

\[ (a, b, c, d) \sim \text{Multinomial}(n; p_1, p_2, p_3, p_4) \]

Phân phối này thường được sử dụng trong các tình huống mà dữ liệu được thu thập từ khảo sát hoặc nghiên cứu xã hội học với kích thước mẫu cố định. Khi đó, các xác suất \(p_1, p_2, p_3, p_4\) biểu diễn xác suất mà một cá thể rơi vào từng ô trong bảng 2x2.

Ưu điểm của mô hình Multinomial:

  • Kiểm soát được tổng số mẫu.

  • Phù hợp cho dữ liệu khảo sát, thử nghiệm.

So sánh giữa phân phối Poisson và Multinomial

Tiêu chí Poisson Multinomial
Tổng số mẫu Không cố định Cố định
Ứng dụng chính Số sự kiện Tần suất khảo sát
Dữ liệu phù hợp Giao dịch, lỗi, tai nạn Trả lời khảo sát, phân nhóm

6.3. Các chỉ số đo mối liên hệ

6.3.1. Hiệu tỷ lệ (Risk Difference - RD)

\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]

Ý nghĩa:

  • Đo lường chênh lệch tuyệt đối giữa xác suất xảy ra kết quả ở nhóm phơi nhiễm và nhóm không phơi nhiễm.

  • Thường được sử dụng trong đánh giá tác động của chính sách, can thiệp hoặc chương trình thí điểm, khi sự khác biệt về xác suất là quan trọng hơn so với tỷ số.

Khoảng tin cậy 95% (CI) cho RD có thể được ước lượng bằng:

\[ CI_{RD} = RD \pm Z_{1 - \alpha/2} \cdot SE_{RD} \]

Trong đó: - \(Z_{1 - \alpha/2}\) là giá trị tới hạn (thường ≈ 1.96 với 95% CI),

  • \(SE_{RD} = \sqrt{\frac{a(a+b-a)}{(a+b)^3} + \frac{c(c+d-c)}{(c+d)^3}}\)

6.3.2. Tỷ số nguy cơ (Relative Risk - RR)

\[ RR = \frac{a / (a + b)}{c / (c + d)} \]

Ý nghĩa:

  • \(RR > 1\): nguy cơ xảy ra kết quả cao hơn ở nhóm phơi nhiễm.

  • \(RR < 1\): nguy cơ xảy ra kết quả thấp hơn ở nhóm phơi nhiễm.

  • \(RR = 1\): không có mối liên hệ giữa phơi nhiễm và kết quả.

Ta thường lấy log của RR để tính khoảng tin cậy:

\[ CI_{RR} = \exp \left[ \ln(RR) \pm Z_{1 - \alpha/2} \cdot SE_{\ln(RR)} \right] \]

Trong đó:

\[ SE_{\ln(RR)} = \sqrt{ \frac{1}{a} - \frac{1}{a + b} + \frac{1}{c} - \frac{1}{c + d} } \]

Ví dụ trong kinh doanh:

  • Tỷ lệ khách mua hàng khi có khuyến mãi: \(80/100 = 0.8\)

  • Khi không có khuyến mãi: \(40/100 = 0.4\)

  • \(RR = 0.8 / 0.4 = 2\)

⇒ Khuyến mãi làm tăng gấp đôi khả năng khách mua hàng.

Hạn chế:

  • Không sử dụng được trong nghiên cứu bệnh chứng (case-control) vì ta không biết nguy cơ tuyệt đối.

  • Dễ gây hiểu nhầm nếu không đi kèm nguy cơ tuyệt đối. Ví dụ: RR = 2 có vẻ cao, nhưng nếu nguy cơ ban đầu là 1%, thì tăng lên 2% vẫn là rất thấp.

  • Không đối xứng: Nếu đổi nhóm tham chiếu thì giá trị RR thay đổi, khác với OR.

6.3.3. Tỷ số chênh (Odds Ratio - OR)

6.3.3.1. Odds

  • Odds (tỷ số cơ hội):
    \[ \text{Odds} = \frac{p}{1 - p} \] Trong đó, \(p\) là xác suất xảy ra của một biến nhị phân (như việc sở hữu nhà).

6.3.3.2. Odds Ratio - OR

\[ OR = \frac{a / b}{c / d} = \frac{ad}{bc} \]

Hay

\[ \text{OR} = \frac{\text{Odds ở nhóm 1}}{\text{Odds ở nhóm 2}} \] OR thường dùng để đo lường mối liên hệ giữa một yếu tố và một kết quả trong bảng 2x2.

  • OR = 1: Không có sự khác biệt về odds giữa hai nhóm.

  • OR > 1: Nhóm 1 có odds xảy ra kết quả cao hơn nhóm 2.

  • OR < 1: Nhóm 1 có odds xảy ra kết quả thấp hơn nhóm 2.

Ví dụ: OR = 2 nghĩa là odds xảy ra kết quả ở nhóm 1 cao gấp 2 lần nhóm 2.

  • Lưu ý: OR khác với RR, đặc biệt khi biến phụ thuộc không hiếm gặp. Khi kết quả là hiếm (p nhỏ), thì OR ≈ RR.

Ý nghĩa:

  • OR cho biết tỷ lệ odds (tức là “xác suất chia cho 1 trừ xác suất”) giữa hai nhóm.

  • Thường được sử dụng phổ biến trong mô hình logistic regression.

  • Trong các nghiên cứu bệnh hiếm (rare disease assumption), OR xấp xỉ với RR.

Ưu điểm của Odds Ratio:

  • Dễ tính và dễ diễn giải.

  • Ổn định về mặt toán học khi sử dụng trong các mô hình hồi quy.

  • Không phụ thuộc vào tỷ lệ hiện diện trong mẫu (đặc biệt trong các thiết kế bệnh – chứng: case-control study).

6.4. Khoảng ước lượng tin cậy cho ODDS RATIO

Để xác định xem OR có ý nghĩa thống kê hay không, cần xây dựng khoảng tin cậy.

Logarithm tự nhiên của Odds Ratio:

\[ \log(OR) = \log\left( \frac{a \cdot d}{b \cdot c} \right) \]

Sai số chuẩn (Standard Error):

\[ SE = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } \]

Khoảng tin cậy 95% cho \(\log(OR)\):

\[ \log(OR) \pm 1.96 \cdot SE \]

Lấy mũ để có khoảng tin cậy 95% cho OR:

\[ CI_{95\%} = \left[ e^{\log(OR) - 1.96 \cdot SE},\quad e^{\log(OR) + 1.96 \cdot SE} \right] \]

  • Nếu khoảng tin cậy không chứa 1, ta có thể kết luận rằng mối liên hệ có ý nghĩa thống kê ở mức ý nghĩa 5%.

6.5. Ứng dụng trong kinh doanh: HIỆU QUẢ CỦA KHUYẾN MÃI

Một công ty thương mại điện tử thử nghiệm chiến dịch khuyến mãi để kiểm tra xem liệu có ảnh hưởng đến hành vi mua hàng không. Họ lấy mẫu 200 khách hàng ngẫu nhiên và thu được bảng sau:

Mua hàng Không mua Tổng
Có khuyến mãi 80 20 100
Không khuyến mãi 40 60 100
  • Tính Odds Ratio (OR):

\[ OR = \frac{80 \cdot 60}{20 \cdot 40} = \frac{4800}{800} = 6 \]

→ Odds mua hàng khi có khuyến mãi cao gấp 6 lần so với khi không có khuyến mãi.

  • Logarithm tự nhiên của OR:

\[ \log(OR) = \log(6) \approx 1.79 \]

  • Sai số chuẩn (SE):

\[ SE = \sqrt{ \frac{1}{80} + \frac{1}{20} + \frac{1}{40} + \frac{1}{60} } \approx 0.35 \]

  • Khoảng tin cậy 95% cho OR:

\[ CI = \left[ e^{1.79 - 1.96 \cdot 0.35},\quad e^{1.79 + 1.96 \cdot 0.35} \right] \approx \left[ e^{1.11},\quad e^{2.47} \right] = [3.03,\ 11.81] \]

  • Vì khoảng tin cậy không chứa 1, có thể kết luận rằng khuyến mãi có ảnh hưởng có ý nghĩa thống kê đến hành vi mua hàng.

  • Với \(OR = 6\)\(CI = (3.03,\ 11.81)\), doanh nghiệp có thể tự tin triển khai chiến lược khuyến mãi quy mô lớn hơn.

Phần 7: So sánh và thước đo mối liên hệ

7.1. Hiệu hai tỷ lệ (Difference in Proportions):

7.1.1. Bảng chéo 2x2 giữa Gender và Homeowner:

# Bảng chéo giữa Gender và Homeowner
gh <- table(dt$Gender, dt$Homeowner) 
addmargins(gh)
##      
##           N     Y   Sum
##   F    2826  4344  7170
##   M    2789  4100  6889
##   Sum  5615  8444 14059

\[ p_1 = P(\text{Homeowner} = Y \mid \text{Gender} = F) \quad \text{(tỷ lệ nữ sở hữu nhà)} \]

\[ p_2 = P(\text{Homeowner} = Y \mid \text{Gender} = M) \quad \text{(tỷ lệ nam sở hữu nhà)} \]

Tính hiệu hai tỷ lệ:

\[ d = p_1 - p_2 \]

Kiểm định:

H₀: p₁ - p₂ = 0 (tỷ lệ nữ sở hữu nhà bằng tỷ lệ nam sở hữu nhà)

H₁: p₁ - p₂ < 0 (Tỷ lệ nữ sở hữu nhà nhỏ hơn tỷ lệ nam sở hữu nhà )

counts <- c(gh["F", "Y"], gh["M", "Y"])   # Số người sở hữu nhà theo từng giới tính
totals <- c(sum(gh["F", ]), sum(gh["M", ]))  # Tổng số người theo từng giới tính

test <- prop.test(counts, totals, alternative = "less", correct = FALSE)
test
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts out of totals
## X-squared = 1.6788, df = 1, p-value = 0.9025
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000  0.02429777
## sample estimates:
##    prop 1    prop 2 
## 0.6058577 0.5951517
  • prop 1 (p1) = 0.6059: tỷ lệ nữ sở hữu nhà khoảng 60.59%

  • prop 2 (p2) = 0.5952: tỷ lệ nam sở hữu nhà khoảng 59.52%

  • P-value = 0.9025

Giá trị p-value thu được là 0.9025, lớn hơn mức ý nghĩa 0.05. Do đó, chúng ta không đủ bằng chứng để bác bỏ giả thuyết H₀ \(H_0: p_1 - p_2 = 0\).

Điều này có nghĩa là, theo dữ liệu hiện tại, không có sự khác biệt có ý nghĩa thống kê giữa tỷ lệ sở hữu nhà của nữ và nam, và không có bằng chứng cho thấy tỷ lệ nữ sở hữu nhà thấp hơn tỷ lệ nam.

7.1.2. Bảng chéo 2x2 giữa MaritalStatus và Homeowner:

mh <- table(dt$MaritalStatus, dt$Homeowner)
mh1 <- addmargins(mh)
print(mh1)
##      
##           N     Y   Sum
##   M    1719  5147  6866
##   S    3896  3297  7193
##   Sum  5615  8444 14059

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

\[ H_0: p_1 - p_2 = 0 \quad \text{(tỷ lệ sở hữu nhà của nhóm Đã kết hôn bằng nhóm Độc thân)} \]

\[ H_1: p_1 - p_2 > 0 \quad \text{(tỷ lệ sở hữu nhà của nhóm Đã kết hôn cao hơn nhóm Độc thân)} \]

Trong đó:
- \(p_1 = P(\text{Homeowner} = Y \mid \text{MaritalStatus} = M)\) là tỷ lệ sở hữu nhà của nhóm Đã kết hôn (Married, M).
- \(p_2 = P(\text{Homeowner} = Y \mid \text{MaritalStatus} = S)\) là tỷ lệ sở hữu nhà của nhóm Độc thân (Single, S).

counts1 <- c(mh["M", "Y"], mh["S", "Y"])
totals1 <- c(sum(mh["M", ]), sum(mh["S", ]))

test1 <- prop.test(counts1, totals1, alternative = "greater", correct = FALSE)
test1
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts1 out of totals1
## X-squared = 1242.4, df = 1, p-value < 2.2e-16
## alternative hypothesis: greater
## 95 percent confidence interval:
##  0.2783377 1.0000000
## sample estimates:
##    prop 1    prop 2 
## 0.7496359 0.4583623
  • prop 1 = 0.7496: tỷ lệ sở hữu nhà của nhóm Đã kết hôn (M) là khoảng 74.96%

  • prop 2 = 0.4584: tỷ lệ sở hữu nhà của nhóm Độc thân (S) là khoảng 45.84%

  • Giá trị p-value rất nhỏ (< 2.2e-16), nhỏ hơn mức ý nghĩa 0.05, cho thấy có bằng chứng thống kê mạnh mẽ để bác bỏ giả thuyết H0. Vậy tỷ lệ sở hữu nhà của nhóm đã kết hôn nhiều hơn của nhóm độc thân.

7.1.3. Bảng chéo 2x2 giữa Gender và MaritalStatus:

# 1. Lập bảng chéo 2x2 giữa Gender và MaritalStatus
gm <- table(dt$Gender, dt$MaritalStatus)
addmargins(gm)  # Thêm hàng và cột tổng
##      
##           M     S   Sum
##   F    3602  3568  7170
##   M    3264  3625  6889
##   Sum  6866  7193 14059

Giả thuyết kiểm định

\[ H_0: p_1 - p_2 = 0 \quad \text{(Tỷ lệ đã kết hôn của nữ bằng nam)} \]

\[ H_1: p_1 - p_2 > 0 \quad \text{(Tỷ lệ đã kết hôn của nữ lớn hơn nam)} \]

Trong đó: - \(p_1 = P(\text{MaritalStatus} = M \mid \text{Gender} = F)\): tỷ lệ nữ đã kết hôn

  • \(p_2 = P(\text{MaritalStatus} = M \mid \text{Gender} = M)\): tỷ lệ nam đã kết hôn
# Trích số lượng người đã kết hôn theo giới
counts3 <- c(gm["F", "M"], gm["M", "M"])
totals3 <- c(sum(gm["F", ]), sum(gm["M", ]))

# Thực hiện kiểm định hiệu hai tỷ lệ
test3 <- prop.test(counts3, totals3, alternative = "greater", correct = FALSE)
test3
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts3 out of totals3
## X-squared = 11.479, df = 1, p-value = 0.0003519
## alternative hypothesis: greater
## 95 percent confidence interval:
##  0.01470685 1.00000000
## sample estimates:
##    prop 1    prop 2 
## 0.5023710 0.4737988

Kết quả kiểm định cho thấy:

  • Tỷ lệ nữ đã kết hôn (\(p_1\)) ≈ 50.24%

  • Tỷ lệ nam đã kết hôn (\(p_2\)) ≈ 47.38%

  • Hiệu hai tỷ lệ: \(d = p_1 - p_2 \approx 0.0286\)

  • Giá trị p-value = 0.00035

  • Khoảng tin cậy 95% cho hiệu tỷ lệ: [0.0147; 1]

p-value < 0.05, ta bác bỏ giả thuyết \(H_0\). Điều này cho thấy có bằng chứng thống kê để kết luận rằng: Tỷ lệ nữ đã kết hôn cao hơn tỷ lệ nam đã kết hôn trong tập dữ liệu khảo sát.

7.2. Tỷ số Nguy cơ (Relative Risk - RR):

7.2.1. Bảng chéo 2x2 giữa Gender và Homeowner:

gh <- table(dt$Gender, dt$Homeowner)
#Thêm tổng hàng và cột
gh1 <- addmargins(gh)
gh1
##      
##           N     Y   Sum
##   F    2826  4344  7170
##   M    2789  4100  6889
##   Sum  5615  8444 14059
library(epitools)
riskratio(gh, method="wald")
## $data
##        
##            N    Y Total
##   F     2826 4344  7170
##   M     2789 4100  6889
##   Total 5615 8444 14059
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate     lower    upper
##   F 1.0000000        NA       NA
##   M 0.9823291 0.9561812 1.009192
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M   0.195158    0.1964833  0.1950884
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Nhóm nữ (F) được chọn làm nhóm tham chiếu, nên RR = 1. Điều này có nghĩa chúng ta so sánh nguy cơ sở hữu nhà của nhóm nam (M) với nhóm nữ.

  • Nhóm nam (M) có RR = 0.9823 nghĩa là:

    • Tỷ lệ sở hữu nhà ở nam bằng khoảng 98.23% so với nữ.

` - Hay nói cách khác, nguy cơ (xác suất) sở hữu nhà của nam thấp hơn nữ khoảng 1.77%.

  • Khoảng tin cậy 95% của RR là (0.9562 – 1.0092):

    • Khoảng này bao gồm số 1, nghĩa là giá trị RR thực sự có thể là 1 (không có khác biệt).

    • Khoảng tin cậy cho ta biết mức độ chính xác của ước lượng RR; khoảng rộng và bao gồm 1 cho thấy sự không chắc chắn và thiếu bằng chứng về sự khác biệt thực sự.

Ta có giả thuyết:

H₀: Tỷ lệ sở hữu nhà ở Nam và Nữ không khác nhau, tức là RR = 1.

H₁: Tỷ lệ sở hữu nhà ở Nam và Nữ khác nhau, RR ≠ 1.

Kiểm định p-value (Nam so với Nữ) Ý nghĩa chính
midp.exact 0.1952 p-value chính xác, sử dụng phương pháp “mid-p” (một biến thể chính xác hơn Fisher)
fisher.exact 0.1965 p-value từ kiểm định Fisher chính xác (phù hợp với bảng nhỏ hoặc số liệu ít)
chi.square 0.1951 p-value từ kiểm định Chi-square (xấp xỉ, dựa trên phân phối chi bình phương)

Vì p-value > 0.05, ta không có đủ bằng chứng để nói rằng giới tính ảnh hưởng đáng kể đến khả năng sở hữu nhà.

Nói cách khác, sự khác biệt giữa nhóm Nam và nhóm Nữ về tỷ lệ sở hữu nhà không có ý nghĩa thống kê.

7.2.2. Bảng chéo 2x2 giữa MaritalStatus và Homeowner:

mh <- table(dt$MaritalStatus, dt$Homeowner)
mh1 <- addmargins(mh)
print(mh1)
##      
##           N     Y   Sum
##   M    1719  5147  6866
##   S    3896  3297  7193
##   Sum  5615  8444 14059
riskratio(mh)
## $data
##        
##            N    Y Total
##   M     1719 5147  6866
##   S     3896 3297  7193
##   Total 5615 8444 14059
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate     lower     upper
##   M 1.0000000        NA        NA
##   S 0.6114466 0.5942071 0.6291862
## 
## $p.value
##    two-sided
##     midp.exact  fisher.exact    chi.square
##   M         NA            NA            NA
##   S          0 1.822183e-277 3.663022e-272
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhóm đã kết hôn (M) được dùng làm nhóm tham chiếu với RR = 1.

Nhóm độc thân (S) có:

  • RR = 0.6114 (khoảng tin cậy 95%: 0.5942 – 0.6292).

  • Điều này có nghĩa là người độc thân có nguy cơ sở hữu nhà thấp hơn khoảng 38.86% so với người đã kết hôn.

  • Khoảng tin cậy 95% khá hẹp và không bao gồm giá trị 1, cho thấy sự khác biệt này là rõ ràng và đáng tin cậy.

Ta thực hiện kiểm định giả thuyết như sau:

  • H₀: Tỷ lệ sở hữu nhà của người đã kết hôn và độc thân là như nhau (RR = 1).

  • H₁: Tỷ lệ sở hữu nhà của hai nhóm là khác nhau (RR ≠ 1).

Kết quả phân tích chỉ ra RR = 0.6114 với khoảng tin cậy 95% (0.5942 – 0.6292), và các kiểm định cho p-value ≈ 0 < mức ý nghĩa 0.05. Do đó, ta bác bỏ H₀ và kết luận rằng tình trạng hôn nhân có mối liên hệ thống kê rõ rệt với khả năng sở hữu nhà. Người độc thân có khả năng sở hữu nhà thấp hơn đáng kể so với người đã kết hôn.

7.2.3. Bảng chéo 2x2 giữa Gender và MaritalStatus:

# 1. Lập bảng chéo 2x2 giữa Gender và MaritalStatus
gm <- table(dt$Gender, dt$MaritalStatus)
addmargins(gm)  # Thêm hàng và cột tổng
##      
##           M     S   Sum
##   F    3602  3568  7170
##   M    3264  3625  6889
##   Sum  6866  7193 14059
# 3. Tính RR
riskratio(gm)
## $data
##        
##            M    S Total
##   F     3602 3568  7170
##   M     3264 3625  6889
##   Total 6866 7193 14059
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate    lower    upper
##   F 1.000000       NA       NA
##   M 1.057417 1.023813 1.092123
## 
## $p.value
##    two-sided
##       midp.exact fisher.exact   chi.square
##   F           NA           NA           NA
##   M 0.0007045092 0.0007373895 0.0007038837
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nam giới có nguy cơ đã kết hôn cao hơn nữ giới khoảng 5.7%. Vì RR > 1, điều này cho thấy tỷ lệ kết hôn ở nam cao hơn nữ trong dữ liệu này.

Với p-value < 0.05 và khoảng tin cậy không chứa 1, chúng ta có bằng chứng thống kê để bác bỏ giả thuyết không.
Như vậy, nam giới có tỷ lệ kết hôn cao hơn nữ giới trong bộ dữ liệu này.

7.3. Tỷ số Chênh (Odds Ratio - OR)::

7.3.1. Gender và Homeowner:

# Tính OR và khoảng tin cậy
or_gh <- oddsratio(gh, method = "wald", conf.level = 0.95)
or_gh
## $data
##        
##            N    Y Total
##   F     2826 4344  7170
##   M     2789 4100  6889
##   Total 5615 8444 14059
## 
## $measure
##    odds ratio with 95% C.I.
##      estimate     lower    upper
##   F 1.0000000        NA       NA
##   M 0.9563518 0.8939173 1.023147
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M   0.195158    0.1964833  0.1950884
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
oddsratio(gh, method = "wald", conf.level = 0.95)
## $data
##        
##            N    Y Total
##   F     2826 4344  7170
##   M     2789 4100  6889
##   Total 5615 8444 14059
## 
## $measure
##    odds ratio with 95% C.I.
##      estimate     lower    upper
##   F 1.0000000        NA       NA
##   M 0.9563518 0.8939173 1.023147
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M   0.195158    0.1964833  0.1950884
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Kết quả phân tích Odds Ratio giữa giới tính và khả năng sở hữu nhà như sau:

    • Odds Ratio (OR) = 0.956

    • Khoảng tin cậy 95%: từ 0.894 đến 1.023

  • Diễn giải:

    • Giá trị OR = 0.956 cho thấy odds (cơ hội) sở hữu nhà của nữ thấp hơn nam khoảng 4.4%. Tuy nhiên, sự khác biệt là nhỏ.

    • Do khoảng tin cậy 95% chứa giá trị 1, nên:

      • Không có đủ bằng chứng thống kê để kết luận rằng giới tính ảnh hưởng đến odds sở hữu nhà.
  • Kết luận: Mặc dù nữ có vẻ có odds sở hữu nhà thấp hơn nam một chút, nhưng sự khác biệt không có ý nghĩa thống kê. Do đó, giới tính không phải là yếu tố ảnh hưởng rõ rệt đến khả năng sở hữu nhà trong dữ liệu hiện tại.

7.3.2. MaritalStatus và Homeowner:

# Tính OR và khoảng tin cậy
or_mh <- oddsratio(mh, method = "wald", conf.level = 0.95)
or_mh
## $data
##        
##            N    Y Total
##   M     1719 5147  6866
##   S     3896 3297  7193
##   Total 5615 8444 14059
## 
## $measure
##    odds ratio with 95% C.I.
##      estimate     lower     upper
##   M 1.0000000        NA        NA
##   S 0.2826322 0.2630929 0.3036227
## 
## $p.value
##    two-sided
##     midp.exact  fisher.exact    chi.square
##   M         NA            NA            NA
##   S          0 1.822183e-277 3.663022e-272
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Odds Ratio (OR) = 0.283

  • Khoảng tin cậy 95%: từ 0.263 đến 0.304

  • Diễn giải:

    • Giá trị Odds Ratio 0.283 có nghĩa là odds sở hữu nhà của nhóm người độc thân chỉ bằng khoảng 28.3% odds của nhóm người đã kết hôn. Nói cách khác, người đã kết hôn có khả năng sở hữu nhà cao hơn gần 3.5 lần so với người độc thân (vì 1/0.283≈3.53).

    • Khoảng tin cậy 95% cho Odds Ratio nằm hoàn toàn dưới 1, từ 0.263 đến 0.304, điều này cho thấy sự khác biệt về odds sở hữu nhà giữa hai nhóm là có ý nghĩa thống kê và không phải do ngẫu nhiên.

  • Kết luận:

Dữ liệu cho thấy tình trạng hôn nhân ảnh hưởng rõ ràng đến khả năng sở hữu nhà. Người đã kết hôn có odds sở hữu nhà cao hơn đáng kể so với người độc thân, và khác biệt này là có ý nghĩa thống kê với mức độ tin cậy 95%. Đây là bằng chứng cho thấy việc đã kết hôn có liên quan chặt chẽ đến khả năng sở hữu nhà trong mẫu khảo sát này.

7.3.3. Gender và MaritalStatus:

# Tính OR và khoảng tin cậy
or_gm <- oddsratio(gm, method = "wald", conf.level = 0.95)
or_gm
## $data
##        
##            M    S Total
##   F     3602 3568  7170
##   M     3264 3625  6889
##   Total 6866 7193 14059
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate    lower    upper
##   F 1.000000       NA       NA
##   M 1.121184 1.049386 1.197893
## 
## $p.value
##    two-sided
##       midp.exact fisher.exact   chi.square
##   F           NA           NA           NA
##   M 0.0007045092 0.0007373895 0.0007038837
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Odds Ratio (OR) = 1.121

  • Khoảng tin cậy 95%: từ 1.049 đến 1.198

  • Diễn giải:

    • Giá trị Odds Ratio 1.121 có nghĩa là odds (cơ hội) đã kết hôn của nữ cao hơn odds đã kết hôn của nam khoảng 12.1%, hay nói cách khác, nữ có khả năng đã kết hôn cao hơn nam khoảng 1.12 lần.

    • Khoảng tin cậy 95% từ 1.049 đến 1.198, không chứa giá trị 1, chứng tỏ sự khác biệt này là có ý nghĩa thống kê. Điều này nghĩa là với mức tin cậy 95%, chúng ta chắc chắn rằng tỷ lệ đã kết hôn của nữ và nam không bằng nhau.

  • Kết luận:

Dữ liệu cho thấy nữ giới có odds đã kết hôn cao hơn nam giới khoảng 12%, tương đương với việc nữ có khả năng đã kết hôn gấp 1.12 lần so với nam giới.

Nguy cơ tương đối (RR) là một tỷ số giữa hai tỷ lệ (proportions).

\[ RR = \frac{EER}{CER} \]

Trong đó:

  • EER (Experimental Event Rate): Tỷ lệ xảy ra sự kiện ở nhóm can thiệp
  • CER (Control Event Rate): Tỷ lệ xảy ra sự kiện ở nhóm đối chứng

RR < 1 nếu nhóm nằm ở tử số có nguy cơ xảy ra sự kiện thấp hơn. Đây là điều mong muốn nếu sự kiện là kết cục xấu (ví dụ: tử vong).

RR > 1 nếu nhóm nằm ở tử số có nguy cơ xảy ra sự kiện cao hơn. Đây là điều mong muốn nếu sự kiện là kết cục tốt (ví dụ: bỏ thuốc lá thành công).

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSB0deG6p24gMiINCmF1dGhvcjogIkxhbSBUYW0gTmh1Ig0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keSB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgc2Fucy1zZXJpZjsNCiAgZm9udC1zaXplOiAxNnB4Ow0KICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICBsaW5lLWhlaWdodDogMS41Ow0KfQ0KaDEgew0KICBjb2xvcjogYmxhY2s7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KaDIgew0KICBjb2xvcjogcmVkOw0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCmgzIHsNCiAgY29sb3I6IGRhcmtibHVlOw0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCjwvc3R5bGU+DQpgYGANCiMgUGjhuqduIDE6IFTDrG0gaGnhu4N1IHbDoCBDaHXhuqluIGLhu4sgROG7ryBsaeG7h3UNCg0KIyMgMS4xIMSQ4buNYyBmaWxlIGThu68gbGnhu4d1DQoNCmBgYHtyfQ0KZCA8LSByZWFkLmNzdigiRDovUFRETERUL1N1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YiKQ0KYGBgDQoNCiMjIDEuMiBDaOG7jW4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0KDQpgYGB7cn0NCmRsZHQgPC0gYygiR2VuZGVyIiwgIk1hcml0YWxTdGF0dXMiLCAiSG9tZW93bmVyIiwgIkFubnVhbEluY29tZSIgLCJDaXR5IiwgIlN0YXRlb3JQcm92aW5jZSIsICJDb3VudHJ5IiwgIlByb2R1Y3RGYW1pbHkiLCAiUHJvZHVjdERlcGFydG1lbnQiLCAiUHJvZHVjdENhdGVnb3J5IikNCmRsZHQNCmBgYA0KDQojIyAxLjMgVOG6oW8gYuG7mSBk4buvIGxp4buHdSBt4bubaSBjaOG7iSBjaOG7qWEgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0KDQpgYGB7cn0NCmR0IDwtIGRbLCBkbGR0XQ0KYGBgDQoNCiMjIDEuNCBYZW0gY+G6pXUgdHLDumMgZOG7ryBsaeG7h3UNCg0KYGBge3J9DQpzdHIoZHQpDQpgYGANCg0KIyMgMS41IFhlbSB0csaw4bubYyBk4buvIGxp4buHdSBt4buZdCB2w6BpIGTDsm5nIMSR4bqndSB2w6AgY3Xhu5FpDQoNCmBgYHtyfQ0KaGVhZChkdCkNCmBgYA0KDQpgYGB7cn0NCnRhaWwoZHQpDQpgYGANCg0KIyMgMS42IEtp4buDbSB0cmEgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkNCg0KYGBge3J9DQphbnkoaXMubmEoZHQpKQ0KYGBgDQoNCkvhur90IHF14bqjIGhp4buHbiB0aOG7iyAiRkFMU0UiLCB24bqteSBk4buvIGxp4buHdSBraMO0bmcgY8OzIGdpw6EgdHLhu4sgYuG7iyB0aGnhur91Lg0KDQojIyAxLjcgS2nhu4NtIHRyYSB2w6AgY2h1eeG7g24gY8OhYyBiaeG6v24gdHJvbmcgZOG7ryBsaeG7h3UgduG7gSBmYWN0b3INCg0KYGBge3J9DQojS2nhu4NtIHRyYSBk4buvIGxp4buHdQ0Kc2FwcGx5KGR0LGNsYXNzKQ0KYGBgDQoNCmBgYHtyfQ0KZHQgPC0gZGF0YS5mcmFtZShsYXBwbHkoZHQsIGFzLmZhY3RvcikpDQpgYGANCg0KIyBQaOG6p24gMjogUGjDom4gdMOtY2ggTcO0IHThuqMgTeG7mXQgYmnhur9uIMSQ4buLbmggdMOtbmggKFVuaXZhcmlhdGUgRGVzY3JpcHRpdmUgQW5hbHlzaXMpDQoNCiMjIDIuMSBCaeG6v24gR2VuZGVyDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gR2VuZGVyDQp0YWJsZShkdCRHZW5kZXIpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gR2VuZGVyDQp0YWJsZShkdCRHZW5kZXIpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgJQ0KZ2VuZGVyX2ZyZXEgIDwtIHRhYmxlKGR0JEdlbmRlcikNCmdlbmRlcl9wY3QgICA8LSBnZW5kZXJfZnJlcSAvIG5yb3coZHQpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCnBpZShnZW5kZXJfZnJlcSwNCiAgICBtYWluICAgPSAiUGjDom4gYuG7kSBnaeG7m2kgdMOtbmggKEdlbmRlcikiLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhnZW5kZXJfZnJlcSksDQogICAgICAgICAgICAgICAgICAgICIgKCIsIHJvdW5kKGdlbmRlcl9wY3QqMTAwLCAxKSwgIiUpIiksDQogICAgY29sICAgID0gYygibGlnaHRwaW5rIiwgImdyZWVuIikpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCmBgYHtyfQ0KY291bnRzIDwtIHRhYmxlKGR0JEdlbmRlcikNCmRpZmZfY291bnQgPC0gYWJzKGNvdW50c1siRiJdIC0gY291bnRzWyJNIl0pDQpgYGANCg0KVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyBgciB0YWJsZShkdCRHZW5kZXIpWzFdL3N1bShucm93KGR0KSkqMTAwYCAlIG7hu68gdsOgIGByIHRhYmxlKGR0JEdlbmRlcilbMl0vc3VtKG5yb3coZHQpKSoxMDBgJSBuYW0uDQoNCiMjIDIuMiBCaeG6v24gTWFyaXRhbFN0YXR1cw0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY+G7p2EgYmnhur9uIE1hcml0YWxTdGF0dXMNCnRhYmxlKGR0JE1hcml0YWxTdGF0dXMpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gTWFyaXRhbFN0YXR1cw0KdGFibGUoZHQkTWFyaXRhbFN0YXR1cykvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZHQsIGFlcyh4ID0gTWFyaXRhbFN0YXR1cykpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCB0aGVvIFRy4bqhbmcgdGjDoWkgaMO0biBuaMOibiIsIHggPSAiVHLhuqFuZyB0aMOhaSIsIHkgPSAiVOG6p24gc3XhuqV0IikNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpW4bqteSB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIGByIHRhYmxlKGR0JE1hcml0YWxTdGF0dXMpWzFdL3N1bShucm93KGR0KSkqMTAwYCAlIMSRw6Mga+G6v3QgaMO0biB2w6AgYHIgdGFibGUoZHQkTWFyaXRhbFN0YXR1cylbMl0vc3VtKG5yb3coZHQpKSoxMDBgJSDEkeG7mWMgdGjDom4uDQoNCiMjIDIuMyBCaeG6v24gSG9tZW93bmVyDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gSG9tZW93bmVyDQp0YWJsZShkdCRIb21lb3duZXIpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gSG9tZW93bmVyDQp0YWJsZShkdCRIb21lb3duZXIpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGR0LCBhZXMoeCA9IEhvbWVvd25lcikpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJyZWQiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCB0aGVvIE5nxrDhu51pIGPDsyBuaMOgIGhheSBraMO0bmciLCB4ID0gIk5ow6AgcmnDqm5nIiwgeSA9ICJU4bqnbiBzdeG6pXQiKQ0KDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyBgciB0YWJsZShkdCRIb21lb3duZXIpWzFdL3N1bShucm93KGR0KSkqMTAwYCAlIGtow7RuZyBjw7MgbmjDoCB2w6AgYHIgdGFibGUoZHQkSG9tZW93bmVyKVsyXS9zdW0obnJvdyhkdCkpKjEwMGAlIGPDsyBuaMOgLg0KDQojIyAyLjQgQmnhur9uIEFubnVhbEluY29tZQ0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY+G7p2EgYmnhur9uIEFubnVhbEluY29tZQ0KYW5udWFsX3RhYiA8LSB0YWJsZShkdCRBbm51YWxJbmNvbWUpDQoNCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGHigJFmcmFtZSAyIGPhu5l0OiBDaXR5IHbDoCBGcmVxDQphbm51YWxfZGYgPC0gYXMuZGF0YS5mcmFtZShhbm51YWxfdGFiKQ0KbmFtZXMoYW5udWFsX2RmKSA8LSBjKCJBbm51YWxJbmNvbWUiLCAiU29fbHVvbmciKSAgICMgxJHhurd0IHTDqm4gY+G7mXQgcsO1IHLDoG5nDQoNCnByaW50KGFubnVhbF9kZikNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBBbm51YWxJbmNvbWUNCmFubnVhbF9wcm9wIDwtIHByb3AudGFibGUodGFibGUoZHQkQW5udWFsSW5jb21lKSkgICAgICAgIA0KDQojIENodXnhu4NuIHRow6BuaCBkYXRh4oCRZnJhbWUNCmFubnVhbF9wY3RfZGYgPC0gYXMuZGF0YS5mcmFtZShhbm51YWxfcHJvcCkNCm5hbWVzKGFubnVhbF9wY3RfZGYpIDwtIGMoIkFubnVhbEluY29tZSIsICJUeV9sZSIpICAgICMgxJHhurd0IHTDqm4gY+G7mXQNCg0KIyBOaMOibiAxMDAgxJHhu4MgdGjDoG5oIHBo4bqnbiB0csSDbQ0KYW5udWFsX3BjdF9kZiRUeV9sZSA8LSByb3VuZCgxMDAgKiBhbm51YWxfcGN0X2RmJFR5X2xlLCAyKQ0KDQpwcmludChhbm51YWxfcGN0X2RmKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQpnZ3Bsb3QoZHQsIGFlcyh4ID0gQW5udWFsSW5jb21lKSkgKw0KICBnZW9tX2JhcigpICsNCiAgY29vcmRfZmxpcCgpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeG9heSBuZ2FuZyBjaG8gZ+G7jW4NCiAgbGFicyh0aXRsZSA9ICJU4bqnbiBzdeG6pXQgZ2lhbyBk4buLY2ggdGhlbyBBbm51YWxJbmNvbWUiLA0KICAgICAgIHggPSAiQ2l0eSIsIHkgPSAiU+G7kSBnaWFvIGThu4tjaCIpDQpgYGANCg0KTmjDs20gdGh1IG5o4bqtcCBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbMOgIFwkMzBLIC0gXCQ1MEssIGNoaeG6v20ga2hv4bqjbmcgMzIuNzMlIHThu5VuZyBz4buRIG3huqt1IGto4bqjbyBzw6F0LiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBuaMOzbSBuw6B5IGzDoCB04buHcCBraMOhY2ggaMOgbmcgY2jDrW5oIGhv4bq3YyBwaOG7lSBiaeG6v24gbmjhuqV0IHRyb25nIHThuq1wIGThu68gbGnhu4d1Lg0KDQpN4buZdCBz4buRIG5ow7NtIHRodSBuaOG6rXAga2jDoWMgbmjGsCBcJDE1MEsgKyBjw7MgdOG7tyBs4buHIHLhuqV0IHRo4bqlcCwgY2jhu4kga2hv4bqjbmcgMS45NCUsIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgeHXhuqV0IGhp4buHbiBj4bunYSBo4buNIHRyb25nIGThu68gbGnhu4d1IGtow7RuZyBuaGnhu4F1IOKAlCBjw7MgdGjhu4MgZG8gaOG7jSDDrXQgcXVhbiB0w6JtIMSR4bq/biBz4bqjbiBwaOG6qW0sIGhv4bq3YyBu4bqxbSBuZ2/DoGkgcGjDom4ga2jDumMgdGjhu4sgdHLGsOG7nW5nIG3DoCBkb2FuaCBuZ2hp4buHcCDEkWFuZyBoxrDhu5tuZyB04bubaS4NCg0KU+G7sSBwaMOibiBi4buRIHRodSBuaOG6rXAga2jDtG5nIMSR4buBdSBwaOG6o24gw6FuaCBjxqEgY+G6pXUga2jDoWNoIGjDoG5nIGPhu6dhIHNpw6p1IHRo4buLIGhv4bq3YyDEkcahbiB24buLIGto4bqjbyBzw6F0OiB04bqtcCB0cnVuZyBuaGnhu4F1IOG7nyBjw6FjIG5ow7NtIHRodSBuaOG6rXAgdHJ1bmcgYsOsbmggxJHhur9uIHRydW5nIGNhbywgdHJvbmcga2hpIG5ow7NtIHRodSBuaOG6rXAgcXXDoSB0aOG6pXAgaG/hurdjIHF1w6EgY2FvIHh14bqldCBoaeG7h24gw610IGjGoW4uDQoNCsSQw6J5IGPDsyB0aOG7gyBsw6AgZOG6pXUgaGnhu4d1IMSR4buDIGRvYW5oIG5naGnhu4dwIMSRaeG7gXUgY2jhu4luaCBjaGnhur9uIGzGsOG7o2MgdGnhur9wIGPhuq1uIHRo4buLIHRyxrDhu51uZywgbmjGsCB04bqtcCB0cnVuZyBuaGnhu4F1IGjGoW4gdsOgbyBjw6FjIG5ow7NtIHRodSBuaOG6rXAgxJFhbmcgY2hp4bq/bSDGsHUgdGjhur8sIGhv4bq3YyBt4bufIHLhu5luZyBjw6FjIGNow61uaCBzw6FjaCDGsHUgxJHDo2kgxJHhu4MgdGh1IGjDunQgbmjDs20ga2jDoWNoIGjDoG5nIMOtdCBwaOG7lSBiaeG6v24gaMahbi4NCg0KKipOaOG6rW4geMOpdCoqDQoNCiMjIDIuNSBCaeG6v24gQ2l0eQ0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY+G7p2EgYmnhur9uIENpdHkNCnRhYmxlKGR0JENpdHkpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gQ2l0eQ0KdGFibGUoZHQkQ2l0eSkvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQpnZ3Bsb3QoZHQsIGFlcyh4ID0gQ2l0eSkpICsNCiAgZ2VvbV9iYXIoKSArDQogIGNvb3JkX2ZsaXAoKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHhvYXkgbmdhbmcgY2hvIGfhu41uDQogIGxhYnModGl0bGUgPSAiVOG6p24gc3XhuqV0IGdpYW8gZOG7i2NoIHRoZW8gQ2l0eSIsDQogICAgICAgeCA9ICJDaXR5IiwgeSA9ICJT4buRIGdpYW8gZOG7i2NoIikNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KVHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5LCB0aMOgbmggcGjhu5EgY8OzIHThu7cgbOG7hyBnaWFvIGThu4tjaCBjYW8gbmjhuqV0IGzDoCBTYWxlbSB24bubaSBraG/huqNuZyBgciByb3VuZCh0YWJsZShkdCRDaXR5KVsiU2FsZW0iXS9ucm93KGR0KSoxMDAsIDIpYCUsIHRp4bq/cCB0aGVvIGzDoCBUYWNvbWEgKGByIHJvdW5kKHRhYmxlKGR0JENpdHkpWyJUYWNvbWEiXS9ucm93KGR0KSoxMDAsIDIpYCUpLCBMb3MgQW5nZWxlcyAoYHIgcm91bmQodGFibGUoZHQkQ2l0eSlbIkxvcyBBbmdlbGVzIl0vbnJvdyhkdCkqMTAwLCAyKWAlKSB2w6AgU2VhdHRsZSAoYHIgcm91bmQodGFibGUoZHQkQ2l0eSlbIlNlYXR0bGUiXS9ucm93KGR0KSoxMDAsIDIpYCUpLg0KDQpDw6FjIHRow6BuaCBwaOG7kSBuaOG7jyBoxqFuIG5oxrAgSGlkYWxnbyAoYHIgcm91bmQodGFibGUoZHQkQ2l0eSlbIkhpZGFsZ28iXS9ucm93KGR0KSoxMDAsIDIpYCUpIGhv4bq3YyBHdWFkYWxhamFyYSAoYHIgcm91bmQodGFibGUoZHQkQ2l0eSlbIkd1YWRhbGFqYXJhIl0vbnJvdyhkdCkqMTAwLCAyKWAlKSBjw7MgdOG7tyBs4buHIHRo4bqlcCBoxqFuIG5oaeG7gXUuDQoNCkThu68gbGnhu4d1IG7DoHkgY2hvIHRo4bqleSBjw6FjIGdpYW8gZOG7i2NoIGNo4bunIHnhur91IGRp4buFbiByYSB04bqhaSBt4buZdCBz4buRIHRow6BuaCBwaOG7kSBs4bubbiDigJMgbsahaSBjw7MgbeG6rXQgxJHhu5kgZMOibiBjxrAgY2FvIGhv4bq3YyBob+G6oXQgxJHhu5luZyBraW5oIHThur8gc8O0aSDEkeG7mW5nIGjGoW4uIE5nxrDhu6NjIGzhuqFpLCBjw6FjIHRow6BuaCBwaOG7kSBuaOG7jyDEkcOzbmcgZ8OzcCB04bu3IHRy4buNbmcgZ2lhbyBk4buLY2ggdGjhuqVwIGjGoW4sIGPDsyB0aOG7gyBkbyB0aOG7iyB0csaw4budbmcgaOG6oW4gY2jhur8gduG7gSBxdXkgbcO0IGhv4bq3YyBz4bqjbiBwaOG6qW0gY2jGsGEgxJHGsOG7o2MgYmnhur90IMSR4bq/biBy4buZbmcgcsOjaS4NCg0KQsOqbiBj4bqhbmggxJHDsywgeHUgaMaw4bubbmcgcGjDom4gYuG7kSBuw6B5IGPFqW5nIHBo4bqnbiBuw6BvIHBo4bqjbiDDoW5oIGNoaeG6v24gbMaw4bujYyB0aeG6v3AgdGjhu4sgdsOgIMSR4buLbmggaMaw4bubbmcga8OqbmggcGjDom4gcGjhu5FpIGPhu6dhIHNpw6p1IHRo4buLLCB24bubaSB0cuG7jW5nIHTDom0gxJHhurd0IHbDoG8gY8OhYyBraHUgduG7sWMgxJHDtCB0aOG7iyBs4bubbi4NCg0KIyMgMi42IEJp4bq/biBTdGF0ZW9yUHJvdmluY2UNCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGPhu6dhIGJp4bq/biBTdGF0ZW9yUHJvdmluY2UNCnRhYmxlKGR0JFN0YXRlb3JQcm92aW5jZSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBTdGF0ZW9yUHJvdmluY2UNCnRhYmxlKGR0JFN0YXRlb3JQcm92aW5jZSkvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQpnZ3Bsb3QoZHQsIGFlcyh4ID0gU3RhdGVvclByb3ZpbmNlKSkgKw0KICBnZW9tX2JhcihmaWxsID0gIm9yYW5nZSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh0aXRsZSA9ICJU4bqnbiBzdeG6pXQgZ2lhbyBk4buLY2ggdGhlbyBUaeG7g3UgYmFuZyBob+G6t2MgdOG7iW5oIiwNCiAgICAgICB4ID0gIlN0YXRlb3JQcm92aW5jZSIsIHkgPSAiU+G7kSBnaWFvIGThu4tjaCIpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNClRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSwgYmFuZyBob+G6t2MgdOG7iW5oIGPDsyB04bu3IGzhu4cgZ2lhbyBk4buLY2ggbOG7m24gbmjhuqV0IGzDoCBXQSB24bubaSBraG/huqNuZyBgciByb3VuZCh0YWJsZShkdCRTdGF0ZW9yUHJvdmluY2UpWyJXQSJdL25yb3coZHQpKjEwMCwgMilgJSwgdGnhur9wIHRoZW8gbMOgIENBIChgciByb3VuZCh0YWJsZShkdCRTdGF0ZW9yUHJvdmluY2UpWyJDQSJdL25yb3coZHQpKjEwMCwgMilgJSkgdsOgIE9SIChgciByb3VuZCh0YWJsZShkdCRTdGF0ZW9yUHJvdmluY2UpWyJPUiJdL25yb3coZHQpKjEwMCwgMilgJSkuIEPDoWMgYmFuZyBuaMawIEphbGlzY28gKGByIHJvdW5kKHRhYmxlKGR0JFN0YXRlb3JQcm92aW5jZSlbIkphbGlzY28iXS9ucm93KGR0KSoxMDAsIDIpYCUpIHbDoCBHdWVycmVybyAoYHIgcm91bmQodGFibGUoZHQkU3RhdGVvclByb3ZpbmNlKVsiR3VlcnJlcm8iXS9ucm93KGR0KSoxMDAsIDIpYCUpIGNoaeG6v20gdOG7tyBs4buHIHRo4bqlcCBoxqFuLiBU4burIMSRw7MsIHRhIGvhur90IGx14bqtbiDEkcaw4bujYyBy4bqxbmcgZOG7ryBsaeG7h3UgY2hvIHRo4bqleSBz4buxIHThuq1wIHRydW5nIGdpYW8gZOG7i2NoIGNhbyDhu58gbeG7mXQgc+G7kSBiYW5nIGNow61uaC4NCg0KIyMgMi43IEJp4bq/biBDb3VudHJ5DQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBDb3VudHJ5DQp0YWJsZShkdCRDb3VudHJ5KQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIENvdW50cnkNCnRhYmxlKGR0JENvdW50cnkpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgJQ0KZ2VuZGVyX2ZyZXEgIDwtIHRhYmxlKGR0JCBDb3VudHJ5KQ0KZ2VuZGVyX3BjdCAgIDwtIGdlbmRlcl9mcmVxIC8gbnJvdyhkdCkNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKGdlbmRlcl9mcmVxLA0KICAgIG1haW4gICA9ICJQaMOibiBi4buRIENvdW50cnkiLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhnZW5kZXJfZnJlcSksDQogICAgICAgICAgICAgICAgICAgICIgKCIsIHJvdW5kKGdlbmRlcl9wY3QqMTAwLCAxKSwgIiUpIiksDQogICAgY29sICAgID0gYygibGlnaHRwaW5rIiwgImdyZWVuIiwgInllbGxvdyIpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKiBW4bqteSB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIGByIHRhYmxlKGR0JENvdW50cnkpWzFdL3N1bShucm93KGR0KSkqMTAwYCAlIOG7nyBDYW5hZGEsIGByIHRhYmxlKGR0JENvdW50cnkpWzJdL3N1bShucm93KGR0KSkqMTAwYCUg4bufIE1leGljbyB2w6AgYHIgdGFibGUoZHQkQ291bnRyeSlbM10vc3VtKG5yb3coZHQpKSoxMDBgJSDhu58gVVNBLg0KDQojIyAyLjggQmnhur9uIFByb2R1Y3RGYW1pbHkNCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIFByb2R1Y3RGYW1pbHkNCnRhYmxlKGR0JFByb2R1Y3RGYW1pbHkpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gUHJvZHVjdEZhbWlseQ0KdGFibGUoZHQkUHJvZHVjdEZhbWlseSkvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZHQsIGFlcyh4ID0gUHJvZHVjdEZhbWlseSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJwaW5rIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgdGhlbyBT4bqjbiBwaOG6qW0gZ2lhIMSRw6xuaCIsIHggPSAiU+G6o24gcGjhuqltIiwgeSA9ICJU4bqnbiBzdeG6pXQiKQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgYHIgdGFibGUoZHQkUHJvZHVjdEZhbWlseSlbMV0vc3VtKG5yb3coZHQpKSoxMDBgICUgxJHhu5MgdeG7kW5nLCBgciB0YWJsZShkdCRQcm9kdWN0RmFtaWx5KVsyXS9zdW0obnJvdyhkdCkpKjEwMGAlIHRo4bupYyDEg24gdsOgIGByIHRhYmxlKGR0JFByb2R1Y3RGYW1pbHkpWzNdL3N1bShucm93KGR0KSkqMTAwYCUga2jDtG5nIHRpw6p1IHRo4bulIMSRxrDhu6NjLg0KDQojIyAyLjkgQmnhur9uIFByb2R1Y3REZXBhcnRtZW50DQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBQcm9kdWN0RGVwYXJ0bWVudA0KdGFibGUoZHQkUHJvZHVjdERlcGFydG1lbnQpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gUHJvZHVjdERlcGFydG1lbnQNCnRhYmxlKGR0JFByb2R1Y3REZXBhcnRtZW50KS9zdW0obnJvdyhkdCkpDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCmdncGxvdChkdCwgYWVzKHggPSBQcm9kdWN0RGVwYXJ0bWVudCkpICsNCiAgZ2VvbV9iYXIoKSArDQogIGNvb3JkX2ZsaXAoKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHhvYXkgbmdhbmcgY2hvIGfhu41uDQogIGxhYnModGl0bGUgPSAiVOG6p24gc3XhuqV0IGdpYW8gZOG7i2NoIHRoZW8gUHJvZHVjdERlcGFydG1lbnQiLA0KICAgICAgIHggPSAiUHJvZHVjdERlcGFydG1lbnQiLCB5ID0gIlPhu5EgZ2lhbyBk4buLY2giKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpUcm9uZyBi4buZIGThu68gbGnhu4d1LCBuaMOzbSBz4bqjbiBwaOG6qW0gY8OzIHThu7cgbOG7hyBnaWFvIGThu4tjaCBjYW8gbmjhuqV0IGzDoCBQcm9kdWNlIHbhu5tpIGByIHJvdW5kKHRhYmxlKGR0JFByb2R1Y3REZXBhcnRtZW50KVsiUHJvZHVjZSJdL25yb3coZHQpKjEwMCwgMilgJSwgdGnhur9wIHRoZW8gbMOgIFNuYWNrIEZvb2RzIChgciByb3VuZCh0YWJsZShkdCRQcm9kdWN0RGVwYXJ0bWVudClbIlNuYWNrIEZvb2RzIl0vbnJvdyhkdCkqMTAwLCAyKWAlKSB2w6AgSG91c2Vob2xkIChgciByb3VuZCh0YWJsZShkdCRQcm9kdWN0RGVwYXJ0bWVudClbIkhvdXNlaG9sZCJdL25yb3coZHQpKjEwMCwgMilgJSkuIE5ow7NtIEZyb3plbiBGb29kcyBjxaluZyBjaGnhur9tIHThu7cgbOG7hyDEkcOhbmcga+G7gyBsw6AgYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdERlcGFydG1lbnQpWyJGcm96ZW4gRm9vZHMiXS9ucm93KGR0KSoxMDAsIDIpYCUuIEPDoWMgbmjDs20gbmjGsCBDYXJvdXNlbCAoYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdERlcGFydG1lbnQpWyJDYXJvdXNlbCJdL25yb3coZHQpKjEwMCwgMilgJSkgdsOgIENoZWNrb3V0IChgciByb3VuZCh0YWJsZShkdCRQcm9kdWN0RGVwYXJ0bWVudClbIkNoZWNrb3V0Il0vbnJvdyhkdCkqMTAwLCAyKWAlKSBjw7MgdOG7tyBs4buHIHRo4bqlcCBoxqFuIG5oaeG7gXUuDQoNCiMjIDUuMTAgQmnhur9uIFByb2R1Y3RDYXRlZ29yeQ0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gUHJvZHVjdENhdGVnb3J5DQp0YWJsZShkdCRQcm9kdWN0Q2F0ZWdvcnkpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gUHJvZHVjdENhdGVnb3J5DQp0YWJsZShkdCRQcm9kdWN0Q2F0ZWdvcnkpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KZ2dwbG90KGR0LCBhZXMoeCA9IFByb2R1Y3RDYXRlZ29yeSwgZmlsbCA9IFByb2R1Y3RDYXRlZ29yeSkpICsNCiAgZ2VvbV9iYXIoKSArDQogIGNvb3JkX2ZsaXAoKSArICAjIHhvYXkgbmdhbmcgY2hvIGfhu41uDQogIGxhYnModGl0bGUgPSAiVOG6p24gc3XhuqV0IGdpYW8gZOG7i2NoIHRoZW8gUHJvZHVjdENhdGVnb3J5IiwNCiAgICAgICB4ID0gIlByb2R1Y3RDYXRlZ29yeSIsIHkgPSAiU+G7kSBnaWFvIGThu4tjaCIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAgIyDhuqluIGNow7ogdGjDrWNoIG7hur91IG114buRbg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpUcm9uZyBi4buZIGThu68gbGnhu4d1LCBuaMOzbSBz4bqjbiBwaOG6qW0gY8OzIHThu7cgbOG7hyBnaWFvIGThu4tjaCBjYW8gbmjhuqV0IGzDoCBWZWdldGFibGVzIHbhu5tpIGByIHJvdW5kKHRhYmxlKGR0JFByb2R1Y3RDYXRlZ29yeSlbIlZlZ2V0YWJsZXMiXS9ucm93KGR0KSoxMDAsIDIpYCUsIHRp4bq/cCB0aGVvIGzDoCBTbmFjayBGb29kcyAoYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdENhdGVnb3J5KVsiU25hY2sgRm9vZHMiXS9ucm93KGR0KSoxMDAsIDIpYCUpIHbDoCBEYWlyeSAoYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdENhdGVnb3J5KVsiRGFpcnkiXS9ucm93KGR0KSoxMDAsIDIpYCUpLiBDw6FjIG5ow7NtIMSRw7NuZyBo4buZcCBuaMawIENhbm5lZCBPeXN0ZXJzIChgciByb3VuZCh0YWJsZShkdCRQcm9kdWN0Q2F0ZWdvcnkpWyJDYW5uZWQgT3lzdGVycyJdL25yb3coZHQpKjEwMCwgMilgJSkgdsOgIENhbm5lZCBDbGFtcyAoYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdENhdGVnb3J5KVsiQ2FubmVkIENsYW1zIl0vbnJvdyhkdCkqMTAwLCAyKWAlKSBjaGnhur9tIHThu7cgbOG7hyBy4bqldCBuaOG7jywgY2hvIHRo4bqleSBz4buxIMawdSB0acOqbiBtdWEgaMOgbmcgdMawxqFpIHbDoCDEkeG7kyDEg24gbmjhurkuDQoNCiMgUGjhuqduIDM6IMav4bubYyBsxrDhu6NuZyBLaG/huqNuZyB2w6AgS2nhu4NtIMSR4buLbmggR2nhuqMgdGh1eeG6v3QgY2hvIFThu7cgbOG7hyAoTeG7mXQgYmnhur9uKQ0KDQojIyAzLjEgQmnhur9uIDE6IEdlbmRlciAtIEjhuqFuZyBt4bulYyBxdWFuIHTDom06ICJGIiAoTuG7rykNCg0KKirGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHICJO4buvIioqDQoNCmBgYHtyfQ0KIyDEkOG6v20gc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgbuG7rw0Kbl9mZW1hbGUgPC0gc3VtKGR0JEdlbmRlciA9PSAiRiIpDQoNCiNU4buVbmcgc+G7kSBxdWFuIHPDoXQNCm5fdG90YWwgPC0gbnJvdyhkdCkNCg0KI1TDrW5oIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBu4buvDQpwcm9wLnRlc3Qobl9mZW1hbGUsIG5fdG90YWwsIGNvcnJlY3QgPSBGQUxTRSkNCg0KYGBgDQoNCi0gICAqKsOdIG5naMSpYToqKiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB0aOG6pXkgcuG6sW5nIHThu7cgbOG7hyBwaOG7pSBu4buvIHRyb25nIHRvw6BuIGLhu5kga2jDoWNoIGjDoG5nIG7hurFtIHRyb25nIGtob+G6o25nIDUwLjE3JSDEkeG6v24gNTEuODMlLiDEkGnhu4F1IG7DoHkgbmdoxKlhIGzDoCBu4bq/dSB0YSB0aOG7sWMgaGnhu4duIGto4bqjbyBzw6F0IHTGsMahbmcgdOG7sSBuaGnhu4F1IGzhuqduLCA5NSUgY8OhYyBraOG6o28gc8OhdCDEkcOzIHPhur0gY2hvIHJhIHThu7cgbOG7hyBu4buvIG7hurFtIHRyb25nIGtob+G6o25nIG7DoHkuDQoNCioqS2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QqKg0KDQrEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6DQoNCi0gICAkSF8wJDogVOG7tyBs4buHIG7hu68gPSAwLjUNCg0KLSAgICRIXzEkOiBU4bu3IGzhu4cgbuG7ryDiiaAgMC41DQoNCmBgYHtyfQ0KcHJvcC50ZXN0KG5fZmVtYWxlLCBuX3RvdGFsLCBwID0gMC41LCBjb3JyZWN0ID0gRkFMU0UpDQoNCmBgYA0KDQotICAgR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBjaGkgYsOsbmggcGjGsMahbmc6IDUuNjE2NCwgYuG6rWMgdOG7sSBkbyAxLg0KDQotICAgKipU4bu3IGzhu4cgbeG6q3UgKHDMgikqKjogMC41MDk5OTM2IOKGkiBraG/huqNuZyAqKjUxLjAlKioga2jDoWNoIGjDoG5nIGzDoCBu4buvLg0KDQo8IS0tIC0tPg0KDQotICAgKipLaG/huqNuZyB0aW4gY+G6rXkgOTUlKiogY2hvIHThu7cgbOG7hyBu4buvOiBbMC41MDE3LDAuNTE4M10NCg0KLSAgICoqcC12YWx1ZSoqID0gMC4wMTc3OSBcPCAwLjA1LCB2w6wgduG6rXkgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCi0gICAqKkvhur90IGx14bqtbjoqKiBDw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4MgY2hvIHLhurFuZyB04bu3IGzhu4cga2jDoWNoIGjDoG5nIG7hu68ga2jDtG5nIGLhurFuZyA1MCUuIETDuSBzYWkga2jDoWMga2jDtG5nIGzhu5tuICh04bu3IGzhu4cgbeG6q3UgXH41MS4wJSksIG5oxrBuZyB2w6wgbMaw4bujbmcgbeG6q3UgbOG7m24sIHPhu7Egc2FpIGtow6FjIG5o4buPIG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KIyMgMy4yIEJp4bq/biAyOiBNYXJpdGFsU3RhdHVzIC0gSOG6oW5nIG3hu6VjIHF1YW4gdMOibTogIlMiICjEkOG7mWMgdGjDom4pDQoNCioqxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyAixJDhu5ljIHRow6JuIioqDQoNCmBgYHtyfQ0KI1Phu5EgbmfGsOG7nWkgxJHhu5ljIHRow6JuDQpuX3NpbmdsZSA8LSBzdW0oZHQkTWFyaXRhbFN0YXR1cyA9PSAiUyIpDQojVOG7lW5nIHPhu5EgcXVhbiBzw6F0DQpuX3RvdGFsIDwtIG5yb3coZHQpDQoNCiNUw61uaCBraG/huqNuZyB0aW4gY+G6rXkgOTUlDQpwcm9wLnRlc3Qobl9zaW5nbGUsIG5fdG90YWwsIGNvcnJlY3QgPSBGQUxTRSkNCmBgYA0KDQotICAgKirDnSBuZ2jEqWE6KiogVuG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSwgdGEgxrDhu5tjIGzGsOG7o25nIHLhurFuZyB04bu3IGzhu4cga2jDoWNoIGjDoG5nIMSR4buZYyB0aMOibiB0cm9uZyB04buVbmcgdGjhu4MgbuG6sW0gdHJvbmcga2hv4bqjbmcgKio1MC4zMyUgxJHhur9uIDUxLjk5JSoqLiBLaG/huqNuZyBuw6B5IGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAwLjUgbeG7mXQgY8OhY2ggY2jDrW5oIHjDoWMsIMSRaeG7gXUgbsOgeSDEkcOjIGfhu6NpIMO9IHLhurFuZyB04bu3IGzhu4cgxJHhu5ljIHRow6JuICoqa2jDoWMqKiA1MCUuDQoNCioqS2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QqKg0KDQrEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6DQoNCi0gICAkSF8wJDogVOG7tyBs4buHIMSR4buZYyB0aMOibiA9IDAuNQ0KDQotICAgJEhfMSQ6IFThu7cgbOG7hyDEkeG7mWMgdGjDom4g4omgIDAuNQ0KDQpgYGB7cn0NCnByb3AudGVzdChuX3NpbmdsZSwgbl90b3RhbCwgcD0wLjUsIGNvcnJlY3QgPSBGQUxTRSkgIA0KYGBgDQoNCi0gICAqKlThu7cgbOG7hyBt4bqrdSAocMyCKSoqOiAwLjUxMTYyOTYg4oaSIHThu6ljIGtob+G6o25nICoqNTEuMTYlKioga2jDoWNoIGjDoG5nIGzDoCDEkeG7mWMgdGjDom4uDQoNCi0gICAqKkdpw6EgdHLhu4sga2nhu4NtIMSR4buLbmgqKjogJFheMj03LjYwNTckLCBkZiA9IDENCg0KLSAgICoqS2hv4bqjbmcgdGluIGPhuq15IDk1JSoqIGNobyB04bu3IGzhu4cgxJHhu5ljIHRow6JuOiBbMC41MDMzLCAwLjUxOTldDQoNCi0gICAqKnAtdmFsdWUgPSAwLjAwNTgxOCBcPCAwLjA1Kiog4oeSICoqQsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAqKi4NCg0KLSAgICoqS+G6v3QgbHXhuq1uOioqIERvIMSRw7MsIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5wqAqKnThu7cgbOG7hyBuZ8aw4budaSDEkeG7mWMgdGjDom4ga2jDoWMgNTAlKirCoHRyb25nIHThu5VuZyB0aOG7gy4NCg0KIyMgMy4zIEJp4bq/biAzOiBQcm9kdWN0RmFtaWx5IC0gSOG6oW5nIG3hu6VjIHF1YW4gdMOibTogIkRyaW5rIiAoTsaw4bubYyB14buRbmcpDQoNCioqxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyAiRm9vZCIqKg0KDQpgYGB7cn0NCiNT4buRIGzGsOG7o25nIHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtICJEcmluayINCm5fZHJpbmsgPC1zdW0oZHQkUHJvZHVjdEZhbWlseSA9PSAiRHJpbmsiKQ0KDQojVOG7lW5nIHPhu5EgcXVhbiBzw6F0DQpuX3RvdGFsIDwtIG5yb3coZHQpDQoNCg0KI1TDrW5oIGtob+G6o25nIHRpbiBj4bqteSA5NSUNCnByb3AudGVzdChuX2RyaW5rLCBuX3RvdGFsLCBjb3JyZWN0ID0gRkFMU0UpDQpgYGANCg0KLSAgICoqw50gbmdoxKlhOioqIFbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIHRhIMaw4bubYyBsxrDhu6NuZyBy4bqxbmcgdOG7tyBs4buHIHPhuqNuIHBo4bqpbSAiRHJpbmsiIHRyb25nIGThu68gbGnhu4d1ICoqbMOgIDgsODklKiogdsOgIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgOC40MyUgxJHhur9uIDkuMzclLg0KDQoqKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KioNCg0KxJDhurd0IGdp4bqjIHRodXnhur90Og0KDQotICAgJEhfMCQ6IFThu7cgbOG7hyBz4bqjbiBwaOG6qW0gdGh14buZYyBuaMOzbSAiRHJpbmsiIOKJpCAwLjA5DQoNCi0gICAkSF8xJDogVOG7tyBs4buHIHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtICJEcmluayIgXD4gMC4wOQ0KDQpgYGB7cn0NCnByb3AudGVzdChuX2RyaW5rLCBuX3RvdGFsLCBwPTAuMDksIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBjb3JyZWN0ID0gRkFMU0UpICANCmBgYA0KDQotICAgR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBjaGkgYsOsbmggcGjGsMahbmc6IDAuMjAzNTcsIGLhuq1jIHThu7EgZG8gMS4NCg0KLSAgICoqVOG7tyBs4buHIG3huqt1IChwzIIpKio6IDAuMDg4OTExMDIg4oaSIGtob+G6o25nICoqOC44OSUqKiBz4bqjbiBwaOG6qW0gbmjDs20gIkRyaW5rIi4NCg0KPCEtLSAtLT4NCg0KLSAgICoqS2hv4bqjbmcgdGluIGPhuq15IDk1JSoqIGNobyBuaMOzbSBEcmluazogWzAuMDg1MCwxLjAwMDBdIHbDrCBsw6Aga2nhu4NtIMSR4buLbmggMSBwaMOtYQ0KDQotICAgKipwLXZhbHVlKiogPSAwLjY3NDEgXD4gMC4wNSwgdsOsIHbhuq15IHRhIGtow7RuZyDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQg4bufIG3hu6ljIMO9IG5naMSpYSA1JS4NCg0KLSAgICoqS+G6v3QgbHXhuq1uOioqIFThu7cgbOG7hyBz4bqjbiBwaOG6qW0gdGh14buZYyBuaMOzbSAiRHJpbmsiIGtow7RuZyBs4bubbiBoxqFuIDklLg0KDQojIFBo4bqnbiA0OiBQaMOibiB0w61jaCBN4buRaSBxdWFuIGjhu4cgZ2nhu69hIEhhaSBiaeG6v24gxJDhu4tuaCB0w61uaCAoQml2YXJpYXRlIEFuYWx5c2lzKQ0KDQojIyA0LjEgR2VuZGVyIHbDoCBQcm9kdWN0RmFtaWx5DQoNCiMjIyA0LjEuMSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvDQoNCmBgYHtyfQ0KI1ThuqFvIGLhuqNuZyBjaMOpbw0KYnRzX2dlbmRlcl9wcm9kdWN0ZmFtaWx5IDwtIHRhYmxlKGR0JEdlbmRlciwgZHQkUHJvZHVjdEZhbWlseSkvc3VtKG5yb3coZHQpKQ0KDQojWGVtIGLhuqNuZyBjaMOpbw0KcHJvcC50YWJsZShidHNfZ2VuZGVyX3Byb2R1Y3RmYW1pbHksIG1hcmdpbiA9IDEpICogMTAwICAjIFTDrW5oIHRoZW8gaMOgbmcNCmBgYA0KDQotICAgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyDEkcaw4bujYyB0w61uaCDEkeG7gyBzbyBzw6FuaCBjxqEgY+G6pXUgbG/huqFpIHPhuqNuIHBo4bqpbSB0aGVvIGdp4bubaSB0w61uaC4NCg0KLSAgIFThu7cgbOG7hyBwaOG6p24gdHLEg20gdMOtbmggdGhlbyBow6BuZyDihpIgZ2nDunAgeGVtIG5hbSB2w6AgbuG7ryBtdWEgc+G6o24gcGjhuqltIGfDrCBuaGnhu4F1IGjGoW4gdHJvbmcgbmjDs20gY+G7p2EgaOG7jS4NCg0KLSAgIE5o4bqtbiB4w6l0Og0KDQogICAgLSAgIEPhuqMgbmFtIHbDoCBu4buvIMSR4buBdSBkw6BuaCB04bu3IGzhu4cgY2FvIG5o4bqldCBjaG8gY2hpIHRpw6p1IHbDoG8gdGjhu7FjIHBo4bqpbSAoXH43MiUpLCBjaG8gdGjhuqV5ICoqRm9vZCoqIGzDoCBuaHUgY+G6p3UgdGnDqnUgZMO5bmcgY2jDrW5oIGPhu6dhIGPhuqMgaGFpIGdp4bubaS4NCg0KICAgIC0gICBQaOG7pSBu4buvIGNoaSB0acOqdSBuaGnhu4F1IGjGoW4gbmFtIGdp4bubaSBjaG8gxJHhu5MgdeG7kW5nICg5LjMzJSB2cyA4LjQzJSkuDQoNCiAgICAtICAgQ2hpIHRpw6p1IGNobyBow6BuZyBraMO0bmcgdGnDqnUgZMO5bmcgKE5vbi1Db25zdW1hYmxlKSBn4bqnbiBuaMawIHTGsMahbmcgxJHGsMahbmcgZ2nhu69hIGhhaSBnaeG7m2kgKFx+MTguOSUpLg0KDQojIyMgNC4xLjIgVHLhu7FjIHF1YW4gaMOzYQ0KDQpW4bq9IGJp4buDdSDEkeG7kyBj4buZdCDEkeG7gyBjw7MgY8OhaSBuaMOsbiBj4bulIHRo4buDIGjGoW4uDQoNCmBgYHtyfQ0KIyBDaHV54buDbiBzYW5nIGRhdGFmcmFtZQ0KZ3Rfc3AgPC0gYXMuZGF0YS5mcmFtZShidHNfZ2VuZGVyX3Byb2R1Y3RmYW1pbHkpDQpjb2xuYW1lcyhndF9zcCkgPC0gYygiR2VuZGVyIiwgIlByb2R1Y3RGYW1pbHkiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZ3Rfc3AsIGFlcyhHZW5kZXIsIENvdW50LCBmaWxsID0gUHJvZHVjdEZhbWlseSkpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIGxhYnModGl0bGUgPSAiQ8ahIGPhuqV1IHPhuqNuIHBo4bqpbSB0aGVvIGdp4bubaSB0w61uaCIsDQogICAgICAgeCA9ICJHaeG7m2kgdMOtbmgiLCB5ID0gIlPhu5EgbMaw4bujbmciLCBmaWxsID0gIlPhuqNuIHBo4bqpbSIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyA0LjEuMyBOaOG6rW4geMOpdCBNw7QgdOG6ow0KDQoqKk3hu5FpIHF1YW4gaOG7hyB2w6AgeHUgaMaw4bubbmc6KioNCg0KLSAgICoqU+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gdGhlbyBnaeG7m2kgdMOtbmg6KiogLSBO4buvIChGKTogQ8OzIHPhu5EgbMaw4bujbmcgc+G6o24gcGjhuqltIERyaW5rIHbDoCBGb29kIGNhbyBoxqFuIHNvIHbhu5tpIE5vbi1Db25zdW1hYmxlLiAtIE5hbSAoTSk6IFPhu5EgbMaw4bujbmcgc+G6o24gcGjhuqltIEZvb2QgdsOgIE5vbi1Db25zdW1hYmxlIGPFqW5nIHTGsMahbmcgdOG7sSwgbmjGsG5nIHPhu5EgbMaw4bujbmcgRHJpbmsgY8OzIHbhursgdGjhuqVwIGjGoW4gc28gduG7m2kgbuG7ry4NCi0gICAqKlPhu7EgbGnDqm4ga+G6v3QgZ2nhu69hIGPDoWMgYmnhur9uOioqDQogICAgLSAgIEPDsyBz4buxIGxpw6puIGvhur90IGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIGxv4bqhaSBz4bqjbiBwaOG6qW0gdGnDqnUgdGjhu6UuIEPhu6UgdGjhu4MsIG7hu68gY8OzIHh1IGjGsOG7m25nIHRpw6p1IHRo4bulIG5oaeG7gXUgxJHhu5MgdeG7kW5nIHbDoCB0aOG7qWMgxINuIGjGoW4gbmFtLg0KICAgIC0gICBOZ8aw4bujYyBs4bqhaSwgbmFtIGPDsyB04bu3IGzhu4cgc+G6o24gcGjhuqltIGtow7RuZyB0acOqdSBkw7luZyBjYW8gaMahbiBzbyB24bubaSBu4buvLg0KDQoqKlh1IGjGsOG7m25nOioqDQoNCi0gICBYdSBoxrDhu5tuZyBjaG8gdGjhuqV5IHLhurFuZyBwaOG7pSBu4buvIGPDsyB0aOG7gyBjw7Mgc+G7nyB0aMOtY2ggdGnDqnUgZMO5bmcgxJHhu5MgxINuIHbDoCDEkeG7kyB14buRbmcgbmhp4buBdSBoxqFuIG5hbSBnaeG7m2ksIHRyb25nIGtoaSBuYW0gZ2nhu5tpIGPDsyB0aOG7gyBjw7MgeHUgaMaw4bubbmcgbXVhIHPhuq9tIGPDoWMgbeG6t3QgaMOgbmcga2jDtG5nIHRpw6p1IGTDuW5nIG5oaeG7gXUgaMahbi4NCg0KIyMjIDQuMS40IEtp4buDbSDEkeG7i25oIFRo4buRbmcga8OqIChLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcpDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KLSAgICoqSOKCgCoqOiBHaeG7m2kgdMOtbmggdsOgIG5ow7NtIHPhuqNuIHBo4bqpbSBsw6AgaGFpIGJp4bq/biDEkeG7mWMgbOG6rXAuDQoNCi0gICAqKkjigoEqKjogR2nhu5tpIHTDrW5oIHbDoCBuaMOzbSBz4bqjbiBwaOG6qW0gbmjDoCBjw7MgbGnDqm4gcXVhbi4NCg0KKipUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyoqDQoNCmBgYHtyfQ0KI1ThuqFvIGLhuqNuZyB04bqnbiBz4buRDQpidHNvX2dlbmRlcl9wcm9kdWN0ZmFtaWx5IDwtIHRhYmxlKGR0JEdlbmRlciwgZHQkUHJvZHVjdEZhbWlseSkNCmJ0c29fZ2VuZGVyX3Byb2R1Y3RmYW1pbHkNCmBgYA0KDQpgYGB7cn0NCmNoaV90ZXN0IDwtIGNoaXNxLnRlc3QoYnRzb19nZW5kZXJfcHJvZHVjdGZhbWlseSkNCmNoaV90ZXN0DQpgYGANCg0KKipOaOG6rW4geMOpdCBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotICAgR2nDoSB0cuG7iyBDaGktYsOsbmggcGjGsMahbmcgKFjCsik6IDMuNTE4NQ0KDQotICAgQuG6rWMgdOG7sSBkbyAoZGYpOiAyDQoNCi0gICBHacOhIHRy4buLIHA6IDAuMTcyMg0KDQoqKkvhur90IGx14bqtbjoqKg0KDQotICAgROG7sWEgdsOgbyBnacOhIHRy4buLIHAgKDAuMTcyMikgdsOgIG3hu6ljIMO9IG5naMSpYSDOsSA9IDAuMDUuIFbDrCBwLXZhbHVlID0gMC4xNzIyIFw+IDAuMDUsIHRhIGtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGhhaSBiaeG6v24gKGdp4bubaSB0w61uaCB2w6AgbG/huqFpIHPhuqNuIHBo4bqpbSkgbMOgIMSR4buZYyBs4bqtcCB24bubaSBuaGF1IOG7nyBt4bupYyDDvSBuZ2jEqWEgMC4wNS4NCg0KLSAgIE3hurdjIGTDuSBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgw70gbmdoxKlhIHRo4buRbmcga8OqLCB2aeG7h2MgcGjDom4gdMOtY2ggdOG6p24gc3XhuqV0IHbhuqtuIGPDsyB0aOG7gyBjdW5nIGPhuqVwIHRow7RuZyB0aW4gaOG7r3Ugw61jaCB24buBIHh1IGjGsOG7m25nIHRpw6p1IGTDuW5nIGPhu6dhIGhhaSBnaeG7m2ksIGNobyB0aOG6pXkgcuG6sW5nIHBo4bulIG7hu68gY8OzIHRo4buDIGPDsyBz4bufIHRow61jaCByacOqbmcgYmnhu4d0IGjGoW4gxJHhu5FpIHbhu5tpIMSR4buTIHXhu5FuZyB2w6AgdGjhu6ljIMSDbiBzbyB24bubaSBuYW0gZ2nhu5tpLg0KDQojIyA0LjIgTWFyaXRhbFN0YXR1cyB2w6AgSG9tZW93bmVyDQoNCiMjIyA0LjIuMSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvDQoNCmBgYHtyfQ0KI1ThuqFvIGLhuqNuZyBjaMOpbw0KYnRzX21hcml0YWxzdGF0dXNfaG9tZW93bmVyIDwtIHRhYmxlKGR0JE1hcml0YWxTdGF0dXMsIGR0JEhvbWVvd25lcikvc3VtKG5yb3coZHQpKQ0KDQojWGVtIGLhuqNuZyBjaMOpbw0KcHJvcC50YWJsZShidHNfbWFyaXRhbHN0YXR1c19ob21lb3duZXIsIG1hcmdpbiA9IDEpICogMTAwICAjIFTDrW5oIHRoZW8gaMOgbmcNCmBgYA0KDQotICAgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyDEkcaw4bujYyB0w61uaCDEkeG7gyBzbyBzw6FuaCBjxqEgY+G6pXUgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHRoZW8gdMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6AuDQoNCi0gICBU4bu3IGzhu4cgcGjhuqduIHRyxINtIHTDrW5oIHRoZW8gaMOgbmcg4oaSIGdpw7pwIHhlbSBuZ8aw4budaSDEkeG7mWMgdGjDom4sIMSRw6Mga+G6v3QgaMO0biB2w6AgbHkgaMO0biBz4bufIGjhu691IG5ow6Agbmhp4buBdSBoxqFuIHRyb25nIG5ow7NtIGPhu6dhIGjhu40gbmjGsCB0aOG6vyBuw6BvLg0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCi0gICBOZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCB0cm9uZyBuaMOzbSBz4bufIGjhu691IG5ow6AgKFx+NjAlKSwgY2hvIHRo4bqleSBz4bufIGjhu691IG5ow6AgbMOgIG5odSBj4bqndSB0acOqdSBkw7luZyBjaMOtbmggY+G7p2EgbmjDs20gbsOgeS4NCg0KLSAgIE5nxrDhu51pIGx5IGjDtG4gY8OzIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgdGjhuqVwIGjGoW4gKFx+NTAlKSBzbyB24bubaSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4sIGNobyB0aOG6pXkgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AuDQoNCi0gICBOZ8aw4budaSDEkeG7mWMgdGjDom4gY8OzIHThu7cgbOG7hyBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGNhbyBuaOG6pXQgKFx+NzAlKSwgY2hvIHRo4bqleSBo4buNIGPDsyB0aOG7gyBjaMawYSDEkeG7pyDEkWnhu4F1IGtp4buHbiBob+G6t2Mga2jDtG5nIGPDsyBuaHUgY+G6p3UgbXVhIG5ow6AgdHJvbmcgZ2lhaSDEkW/huqFuIG7DoHkuDQoNCiMjIyA0LjIuMiBUcuG7sWMgcXVhbiBow7NhIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IMSR4buDIGPDsyBjw6FpIG5ow6xuIGPhu6UgdGjhu4MgaMahbi4NCg0KYGBge3J9DQojIENodXnhu4NuIHNhbmcgZGF0YWZyYW1lDQpobl9uIDwtIGFzLmRhdGEuZnJhbWUoYnRzX21hcml0YWxzdGF0dXNfaG9tZW93bmVyKQ0KY29sbmFtZXMoaG5fbikgPC0gYygiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoaG5fbiwgYWVzKE1hcml0YWxTdGF0dXMsIENvdW50LCBmaWxsID0gSG9tZW93bmVyKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgbGFicyh0aXRsZSA9ICJDxqEgY+G6pXUgbmjDoCDhu58gdGhlbyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4iLA0KICAgICAgIHggPSAiVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIiwgeSA9ICJT4buRIGzGsOG7o25nIiwgZmlsbCA9ICJOaMOgIOG7nyIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyA0LjIuMyBOaOG6rW4geMOpdCBtw7QgdOG6ow0KDQpNw7QgdOG6oyBt4buRaSBxdWFuIGjhu4cgQmnhu4N1IMSR4buTIGNobyB0aOG6pXkgc+G7kSBsxrDhu6NuZyBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgKE4pIHbDoCBraMO0bmcgc+G7nyBo4buvdSBuaMOgIChZKSB0aGVvIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAoTTogxJDDoyBr4bq/dCBow7RuLCBTOiDEkOG7mWMgdGjDom4pLg0KDQoqKk5o4bqtbiB4w6l0IHbhu4EgbeG7kWkgcXVhbiBo4buHOioqIEPDsyBz4buxIGxpw6puIGvhur90IGdp4buvYSBoYWkgYmnhur9uOiBT4buRIGzGsOG7o25nIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbiDhu58gbmjDs20gxJHDoyBr4bq/dCBow7RuIHNvIHbhu5tpIG5ow7NtIMSR4buZYyB0aMOibi4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoC4NCg0KKipYdSBoxrDhu5tuZzoqKg0KDQotICAgTmjDs20gxJHDoyBr4bq/dCBow7RuIChNKTogVOG7tyBs4buHIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjaGnhur9tIMawdSB0aOG6vyByw7UgcuG7h3QsIGNobyB0aOG6pXkgcuG6sW5nIG5o4buvbmcgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyDhu5VuIMSR4buLbmggaMahbiB24buBIHTDoGkgY2jDrW5oIHbDoCBjw7Mga2jhuqMgbsSDbmcgbXVhIG5ow6AgY2FvIGjGoW4uDQoNCi0gICBOaMOzbSDEkeG7mWMgdGjDom4gKFMpOiBN4bq3YyBkw7kgduG6q24gY8OzIG3hu5l0IHThu7cgbOG7hyBuZ8aw4budaSBz4bufIGjhu691IG5ow6AsIG5oxrBuZyBz4buRIGzGsOG7o25nIHRo4bqlcCBoxqFuIHNvIHbhu5tpIG5ow7NtIMSRw6Mga+G6v3QgaMO0biwgY8OzIHRo4buDIGRvIG5o4buvbmcgbmfGsOG7nWkgxJHhu5ljIHRow6JuIHRoxrDhu51uZyBjaMawYSBjw7MgxJHhu6cgxJFp4buBdSBraeG7h24gdMOgaSBjaMOtbmggaG/hurdjIGNoxrBhIGPDsyBuaHUgY+G6p3UgbXVhIG5ow6AuDQoNCioqS+G6v3QgbHXhuq1uOioqIEPDsyB24bq7IG5oxrAgY8OzIG3hu5l0IHPhu7EgbGnDqm4ga+G6v3QgcsO1IHLDoG5nIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCwgduG7m2kgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyBz4bufIGjhu691IG5ow6Agbmhp4buBdSBoxqFuLiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmggdGjhu7FjIHThur8gcuG6sW5nIGPDoWMgY+G6t3AgduG7oyBjaOG7k25nIHRoxrDhu51uZyBjw7Mgbmhp4buBdSDEkeG7mW5nIGzhu7FjIGjGoW4gxJHhu4MgxJHhuqd1IHTGsCB2w6BvIGLhuqV0IMSR4buZbmcgc+G6o24uDQoNCiMjIyA0LjIuNCBLaeG7g20gxJHhu4tuaCBUaOG7kW5nIGvDqiAoS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKQ0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gICAqKkjigoAqKjpUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIG5ow6Ag4bufIGzDoCBoYWkgYmnhur9uIMSR4buZYyBs4bqtcC4NCg0KLSAgICoqSOKCgSoqOlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6AgbmjDoCDhu58gbMOgIGPDsyBsacOqbiBxdWFuLg0KDQoqKlRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nOioqDQoNCmBgYHtyfQ0KI1ThuqFvIGLhuqNuZyB04bqnbiBz4buRDQpidHNvX21hcml0YWxzdGF0dXNfaG9tZW93bmVyIDwtIHRhYmxlKGR0JE1hcml0YWxTdGF0dXMsIGR0JEhvbWVvd25lcikNCmJ0c29fbWFyaXRhbHN0YXR1c19ob21lb3duZXINCmBgYA0KDQpgYGB7cn0NCmNoaV90ZXN0IDwtIGNoaXNxLnRlc3QoYnRzb19tYXJpdGFsc3RhdHVzX2hvbWVvd25lcikNCmNoaV90ZXN0DQpgYGANCg0KKipOaOG6rW4geMOpdCBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotICAgR2nDoSB0cuG7iyBDaGktYsOsbmggcGjGsMahbmcgKFjCsik6IDEyNDEuMg0KDQotICAgQuG6rWMgdOG7sSBkbyAoZGYpOiAxDQoNCi0gICBHacOhIHRy4buLIHA6IFw8IDIuMmUtMTYNCg0KKipL4bq/dCBsdeG6rW46KiogROG7sWEgdsOgbyBnacOhIHRy4buLIHAgKHLhuqV0IG5o4buPIGjGoW4gMC4wNSkgdsOgIG3hu6ljIMO9IG5naMSpYSDOsSA9IDAuMDUsIHRhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGhhaSBiaeG6v24gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIGtow7RuZyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdSDhu58gbeG7qWMgw70gbmdoxKlhIDAuMDUuDQoNCkvhur90IHF14bqjIG7DoHkgY2hvIHRo4bqleSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB2aeG7h2MgbeG7mXQgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGhheSBjaMawYSB2w6Aga2jhuqMgbsSDbmcgaOG7jSBz4bufIGjhu691IG5ow6AuxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgaGFpIMSRaeG7g20gY2jDrW5oOg0KDQotICAgTmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIHRoxrDhu51uZyBjw7MgdGh1IG5o4bqtcCDhu5VuIMSR4buLbmggaMahbiBob+G6t2MgxJHGsOG7o2MgaOG7lyB0cuG7oyB0w6BpIGNow61uaCB04burIGLhuqFuIMSR4budaSwgbsOqbiBraOG6oyBuxINuZyBtdWEgbmjDoCBjYW8gaMahbi4gSOG7jSDGsHUgdGnDqm4gc+G7sSDhu5VuIMSR4buLbmggxJHhu4MgeMOieSBk4buxbmcgdOG7lSDhuqVtIHbDoCBjaMSDbSBsbyBjaG8gY29uIGPDoWkuDQoNCi0gICBOZ8aw4budaSDEkeG7mWMgdGjDom4gdGjGsOG7nW5nIGNo4buNbiB0aHXDqiBuaMOgIGhv4bq3YyBz4buRbmcgbGluaCBob+G6oXQgdsOsIMOtdCByw6BuZyBideG7mWMuIEjhu40gxrB1IHRpw6puIGPGoSBo4buZaSBuZ2jhu4EgbmdoaeG7h3AsIGRpIGNodXnhu4NuLCBuw6puIHZp4buHYyBtdWEgbmjDoCBraMO0bmcgcGjhuqNpIG3hu6VjIHRpw6p1IHRyxrDhu5tjIG3huq90Lg0KDQojIyA0LjMgQW5udWFsSW5jb21lIHbDoCBIb21lb3duZXINCg0KIyMjIDQuMy4xIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8NCg0KYGBge3J9DQojVOG6oW8gYuG6o25nIGNow6lvDQpidHNfYW5udWFsaW5jb21lX2hvbWVvd25lciA8LSB0YWJsZShkdCRBbm51YWxJbmNvbWUsIGR0JEhvbWVvd25lcikvc3VtKG5yb3coZHQpKQ0KDQoNCiNYZW0gYuG6o25nIGNow6lvDQpwcm9wLnRhYmxlKGJ0c19hbm51YWxpbmNvbWVfaG9tZW93bmVyLCBtYXJnaW4gPSAxKSAqIDEwMCAgIyBUw61uaCB0aGVvIGjDoG5nDQpgYGANCg0KROG7ryBsaeG7h3UgY2hvIHRo4bqleSB04bu3IGzhu4cgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIChOKSB2w6Aga2jDtG5nIHPhu58gaOG7r3UgbmjDoCAoWSkg4bufIGPDoWMgbeG7qWMgdGh1IG5o4bqtcCBraMOhYyBuaGF1LiBYdSBoxrDhu5tuZyBjaMOtbmg6DQoNCi0gICAqKk5ow7NtIGPDsyB0aHUgbmjhuq1wIHRo4bqlcCAoXCQxMEsgLSBcJDMwSyk6KiogVOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBsw6AgNDMuOTglLCB0cm9uZyBraGkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBsw6AgNTYuMDIlLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAgY8OzIGtow7Mga2jEg24gaMahbiB0cm9uZyB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgLg0KDQotICAgKipOaMOzbSBjw7MgdGh1IG5o4bqtcCBjYW8gKFwkMTEwSyAtIFwkMTMwSyB2w6AgdHLDqm4gXCQxNTBLKToqKiBU4bu3IGzhu4cga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbiwgduG7m2kgODEuNDklIHbDoCA4Mi40MiUgdMawxqFuZyDhu6luZy4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaCBy4bqxbmcgbmjhu69uZyBuZ8aw4budaSBjw7MgdGh1IG5o4bqtcCBjYW8gaMahbiBjw7MgeHUgaMaw4bubbmcgxJHhuqd1IHTGsCB2w6BvIGPDoWMgdMOgaSBz4bqjbiBraMOhYyBob+G6t2MgY8OzIHRo4buDIGtow7RuZyBj4bqnbiBz4bufIGjhu691IG5ow6AuDQoNCi0gICAqKk5ow7NtIHRodSBuaOG6rXAgdHJ1bmcgYsOsbmg6KiogQ8OhYyBuaMOzbSB0aHUgbmjhuq1wIHThu6sgXCQzMEsgLSBcJDkwSyBjaG8gdGjhuqV5IHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY8OzIHPhu7EgZGFvIMSR4buZbmcsIG5oxrBuZyB24bqrbiB0aOG6pXAgaMahbiBzbyB24bubaSBuaMOzbSB0aHUgbmjhuq1wIHRo4bqlcC4gNC4zLjIgVHLhu7FjIHF1YW4gaMOzYSBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCDEkeG7gyBjw7MgY8OhaSBuaMOsbiBj4bulIHRo4buDIGjGoW4uDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGdncGxvdDIpDQojIFThuqFvIGThu68gbGnhu4d1DQpkZiA8LSBkYXRhLmZyYW1lKA0KICBpbmNvbWUgPSBjKCIkMTBLIC0gJDMwSyIsICIkMTEwSyAtICQxMzBLIiwgIiQxMzBLIC0gJDE1MEsiLCAiJDE1MEsgKyIsDQogICAgICAgICAgICAgIiQzMEsgLSAkNTBLIiwgIiQ1MEsgLSAkNzBLIiwgIiQ3MEsgLSAkOTBLIiwgIiQ5MEsgLSAkMTEwSyIpLA0KICBObyA9IGMoNDMuOTgwNTgsIDE4LjUwNzAwLCAxNy44OTQ3NCwgMTcuNTgyNDIsIDQ1LjM1OTcwLCA0NC44NTIzMiwgNDAuMTQwNDMsIDE5LjA4NjQ2KSwNCiAgWWVzID0gYyg1Ni4wMTk0MiwgODEuNDkzMDAsIDgyLjEwNTI2LCA4Mi40MTc1OCwgNTQuNjQwMzAsIDU1LjE0NzY4LCA1OS44NTk1NywgODAuOTEzNTQpDQopDQoNCiMgQ2h1eeG7g24gc2FuZyBk4bqhbmcgbG9uZyDEkeG7gyB24bq9IGdncGxvdA0KZGZfbG9uZyA8LSBkZiAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKCJObyIsICJZZXMiKSwgbmFtZXNfdG8gPSAiSG9tZW93bmVyIiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2UiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IG5ow7NtDQpnZ3Bsb3QoZGZfbG9uZywgYWVzKHggPSBpbmNvbWUsIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gSG9tZW93bmVyKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJU4bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIHRoZW8gbmjDs20gdGh1IG5o4bqtcCIsDQogICAgICAgeCA9ICJOaMOzbSB0aHUgbmjhuq1wIiwNCiAgICAgICB5ID0gIlThu7cgbOG7hyAoJSkiLA0KICAgICAgIGZpbGwgPSAiU+G7nyBo4buvdSBuaMOgIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiMjIyA0LjMuMyBOaOG6rW4geMOpdCBNw7QgdOG6ow0KDQpCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgKFllcykgdsOgIGtow7RuZyBz4bufIGjhu691IG5ow6AgKE5vKSB0aGVvIHThu6tuZyBuaMOzbSB0aHUgbmjhuq1wLiBExrDhu5tpIMSRw6J5IGzDoCBt4buZdCBz4buRIG5o4bqtbiB4w6l0IGNow61uaDoNCg0KKipYdSBoxrDhu5tuZyBjaHVuZzoqKg0KDQotICAgVOG7tyBs4buHIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCAoWWVzKSBjw7MgeHUgaMaw4bubbmcgdMSDbmcgbMOqbiBraGkgdGh1IG5o4bqtcCB0xINuZy4gTmjDs20gdGh1IG5o4bqtcCBjYW8gaMahbiAoXCQxMTBLKykgY2hvIHRo4bqleSB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIGNhbyBuaOG6pXQuIE5ow7NtIHRodSBuaOG6rXAgdGjhuqVwIChcJDEwSyAtIFwkMzBLKToNCg0KLSAgIE5ow7NtIG7DoHkgY8OzIHThu7cgbOG7hyBraMO0bmcgc+G7nyBo4buvdSBuaMOgIChObykgY2FvIGjGoW4gKFx+NTYlKSwgY2hvIHRo4bqleSBy4bqxbmcgbmjhu69uZyBuZ8aw4budaSB0cm9uZyBuaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCBn4bq3cCBraMOzIGtoxINuIGjGoW4gdHJvbmcgdmnhu4djIHPhu58gaOG7r3UgbmjDoC4gTmjDs20gdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCAoXCQzMEsgLSBcJDkwSyk6DQoNCi0gICBU4bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIHRyb25nIGPDoWMgbmjDs20gbsOgeSBsw6AgdMawxqFuZyDEkeG7kWkg4buVbiDEkeG7i25oLCBuaMawbmcgduG6q24gdGjhuqVwIGjGoW4gc28gduG7m2kgbmjDs20gdGh1IG5o4bqtcCBjYW8gaMahbi4gTmjDs20gdGh1IG5o4bqtcCBcJDUwSyAtIFwkNzBLIHbDoCBcJDcwSyAtIFwkOTBLIGPDsyB04bu3IGzhu4cga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbi4gTmjDs20gdGh1IG5o4bqtcCBjYW8gKFwkMTEwSyB2w6AgdHLDqm4pOg0KDQotICAgVOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCDEkeG6oXQgbeG7qWMgY2FvIG5o4bqldCAoXH44MS04MiUpLCBjaG8gdGjhuqV5IHLhurFuZyBuaOG7r25nIG5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIGNhbyBoxqFuIGPDsyB4dSBoxrDhu5tuZyDhu5VuIMSR4buLbmggduG7gSB0w6BpIGNow61uaCB2w6AgY8OzIGto4bqjIG7Eg25nIMSR4bqndSB0xrAgdsOgbyBi4bqldCDEkeG7mW5nIHPhuqNuIG5oaeG7gXUgaMahbi4gS+G6v3QgbHXhuq1uOg0KDQpDw7MgbeG7mXQgbeG7kWkgdMawxqFuZyBxdWFuIHLDtSByw6BuZyBnaeG7r2EgdGh1IG5o4bqtcCB2w6AgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoC4gTmjhu69uZyBuZ8aw4budaSBjw7MgdGh1IG5o4bqtcCBjYW8gaMahbiBjw7MgeHUgaMaw4bubbmcgc+G7nyBo4buvdSBuaMOgIG5oaeG7gXUgaMahbiwgdHJvbmcga2hpIG5o4buvbmcgbmfGsOG7nWkgY8OzIHRodSBuaOG6rXAgdGjhuqVwIGjGoW4gdGjGsOG7nW5nIGtow7RuZyDEkeG7pyBraOG6oyBuxINuZyB0w6BpIGNow61uaCDEkeG7gyBz4bufIGjhu691IG5ow6AuIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIG1pbmggaOG7jWEgcsO1IHLDoG5nIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgdGh1IG5o4bqtcCB2w6AgdMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6AsIGNobyB0aOG6pXkgcuG6sW5nIHRodSBuaOG6rXAgY8OzIOG6o25oIGjGsOG7n25nIGzhu5tuIMSR4bq/biBxdXnhur90IMSR4buLbmggc+G7nyBo4buvdSBuaMOgIGPhu6dhIGPDoSBuaMOibi4NCg0KIyMjIDQuMy40IEtp4buDbSDEkeG7i25oIFRo4buRbmcga8OqIChLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcpDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KLSAgICoqSOKCgCoqOiBUaHUgbmjhuq1wIHbDoCBuaMOgIOG7nyBsw6AgaGFpIGJp4bq/biDEkeG7mWMgbOG6rXAuDQoNCi0gICAqKkjigoEqKjogVGh1IG5o4bqtcCB2w6AgbmjDoCDhu58gbMOgIGPDsyBsacOqbiBxdWFuLg0KDQoqKlRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKioNCg0KYGBge3J9DQojVOG6oW8gYuG6o25nIHThuqduIHPhu5ENCmJ0c29fYW5udWFsaW5jb21lX2hvbWVvd25lciA8LSB0YWJsZShkdCRBbm51YWxJbmNvbWUsIGR0JEhvbWVvd25lcikNCmJ0c29fYW5udWFsaW5jb21lX2hvbWVvd25lcg0KYGBgDQoNCmBgYHtyfQ0KY2hpX3Rlc3QgPC0gY2hpc3EudGVzdChidHNvX2FubnVhbGluY29tZV9ob21lb3duZXIpDQpjaGlfdGVzdA0KYGBgDQoNCioqTmjhuq1uIHjDqXQga+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSAgIEdpw6EgdHLhu4sgQ2hpLWLDrG5oIHBoxrDGoW5nIChYwrIpOiA1NDYuMzcNCg0KLSAgIELhuq1jIHThu7EgZG8gKGRmKTogNw0KDQotICAgR2nDoSB0cuG7iyBwOiBcPCAyLjJlLTE2DQoNCioqS+G6v3QgbHXhuq1uOioqIEThu7FhIHbDoG8gZ2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPIChwLXZhbHVlIFw8IDAuMDUpLCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGhhaSBiaeG6v24gKHRodSBuaOG6rXAgaOG6sW5nIG7Eg20gdsOgIHTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgKSBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUg4bufIG3hu6ljIMO9IG5naMSpYSAwLjA1Lg0KDQpOw7NpIGPDoWNoIGtow6FjLCBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBt4bupYyB0aHUgbmjhuq1wIHbDoCB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgLiBOZ8aw4budaSBjw7MgdGh1IG5o4bqtcCBjYW8gaMahbiBjw7MgeHUgaMaw4bubbmcgc+G7nyBo4buvdSBuaMOgIG5oaeG7gXUgaMahbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIHRo4bqlcCDigJMgxJFp4buBdSBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaCBraOG6oyBuxINuZyB0w6BpIGNow61uaCDhuqNuaCBoxrDhu59uZyDEkeG6v24gdmnhu4djIG11YS90aHXDqiBuaMOgLg0KDQojIFBo4bqnbiA1OiBU4buVbmcga+G6v3QgdsOgIFRo4bqjbyBsdeG6rW4NCg0KIyMgNS4xIFTDs20gdOG6r3QgcGjDoXQgaGnhu4duIGNow61uaA0KDQotICAgKipHaeG7m2kgdMOtbmg6KiogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCByw7UgcsOgbmcgZ2nhu69hIG5hbSB2w6AgbuG7ryB24buBIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2gg4oaSIGPhuqMgaGFpIGdp4bubaSDEkeG7gXUgbMOgIGtow6FjaCBow6BuZyB0aeG7gW0gbsSDbmcuDQoNCi0gICAqKlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibioqOiBLaMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyBtdWEgc+G6r20gbmhp4buBdSBoxqFuLCBjw7MgdGjhu4MgZG8gbmh1IGPhuqd1IGdpYSDEkcOsbmggY2FvIGjGoW4uDQoNCi0gICAqKlPhu58gaOG7r3UgbmjDoDoqKiBOZ8aw4budaSBz4bufIGjhu691IG5ow6AgY8OzIHPhu5EgZ2lhbyBk4buLY2ggY2FvIGjGoW4g4oaSIG5ow7NtIGtow6FjaCBow6BuZyDhu5VuIMSR4buLbmgsIHRp4buBbSBuxINuZy4NCg0KLSAgICoqVGh1IG5o4bqtcDoqKiBOaMOzbSB0aHUgbmjhuq1wIHThu6sgNzAsMDAwIFVTRCB0cuG7nyBsw6puIG11YSBz4bqvbSBuaGnhu4F1IGjGoW4sIHRo4buDIGhp4buHbiBraOG6oyBuxINuZyBjaGkgdGnDqnUgdOG7kXQuDQoNCi0gICAqKktodSB24buxYyDEkeG7i2EgbMO9OioqIE1p4buBbiBUcnVuZyB2w6AgTmFtIGPDsyBz4buRIGdpYW8gZOG7i2NoIGNhbyBoxqFuIG1p4buBbiBC4bqvYyDihpIgY8OzIHRo4buDIGxpw6puIHF1YW4gxJHhur9uIGTDom4gc+G7kSBob+G6t2MgdsSDbiBow7NhIHRpw6p1IGTDuW5nLg0KDQotICAgKipQaMOibiBsb+G6oWkgc+G6o24gcGjhuqltOioqIE3hu5l0IHPhu5Egc+G6o24gcGjhuqltIHBo4buVIGJp4bq/biBoxqFuIHbhu5tpIGPDoWMgbmjDs20ga2jDoWNoIGjDoG5nIGPhu6UgdGjhu4MsIG5oxrAgbmjDs20gxJHDoyBr4bq/dCBow7RuLg0KDQojIyA1LjIgSOG6oW4gY2jhur8gY+G7p2EgcGjDom4gdMOtY2gNCg0KLSAgIENo4buJIHPhu60gZOG7pW5nIGJp4bq/biDEkeG7i25oIHTDrW5oLCBjaMawYSBwaOG6o24gw6FuaCDEkcaw4bujYyBnacOhIHRy4buLIGdpYW8gZOG7i2NoIGPhu6UgdGjhu4MuDQoNCi0gICBN4buZdCBz4buRIG5ow7NtIGtow6FjaCBow6BuZyAodGh1IG5o4bqtcCB0aOG6pXAsIMSR4buZYyB0aMOibikgY8OzIHPhu5EgbMaw4bujbmcgw610IOKGkiBk4buFIGfDonkgbOG7h2NoLg0KDQotICAgVGhp4bq/dSB54bq/dSB04buRIHRo4budaSBnaWFuIHbDoCBow6BuaCB2aSBs4bq3cCBs4bqhaSDihpIga2jDsyBu4bqvbSDEkcaw4bujYyB4dSBoxrDhu5tuZyBsw6J1IGTDoGkuDQoNCiMjIDUuMyDEkOG7gSB4deG6pXQgY2hvIGRvYW5oIG5naGnhu4dwDQoNCi0gICBU4bqtcCB0cnVuZyB2w6BvIG5ow7NtIMSRw6Mga+G6v3QgaMO0biwgc+G7nyBo4buvdSBuaMOgIHbDoCB0aHUgbmjhuq1wIHRydW5n4oCTY2FvIGLhurFuZyBjw6FjIGNoxrDGoW5nIHRyw6xuaCDGsHUgxJHDo2kuDQoNCi0gICBUw7l5IGNo4buJbmggZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gdGhlbyBraHUgduG7sWMgxJHhu4MgcGjDuSBo4bujcCB24bubaSBuaHUgY+G6p3UgdGnDqnUgZMO5bmcgxJHhu4thIHBoxrDGoW5nLg0KDQotICAgUGjDoXQgdHJp4buDbiBjaMawxqFuZyB0csOsbmgga2jDoWNoIGjDoG5nIHRow6JuIHRoaeG6v3Qgbmjhuq9tIMSR4bq/biBuaMOzbSBraMOhY2ggaMOgbmcg4buVbiDEkeG7i25oLg0KDQojIyA1LjQgSMaw4bubbmcgbmdoacOqbiBj4bupdSB0aeG6v3AgdGhlbw0KDQotICAgS+G6v3QgaOG7o3AgdGjDqm0gYmnhur9uIMSR4buLbmggbMaw4bujbmcgbmjGsCBnacOhIHRy4buLIMSRxqFuIGjDoG5nLCB04bqnbiBzdeG6pXQgbXVhLg0KDQotICAgUGjDom4gdMOtY2ggaMOgbmggdmkgdGhlbyB0aOG7nWkgZ2lhbiAobmfDoHksIHRow6FuZywgbcO5YSkuDQoNCi0gICBQaMOibiBraMO6YyBraMOhY2ggaMOgbmcgYuG6sW5nIG3DtCBow6xuaCBuaMOzbSBob+G6t2MgZOG7sSDEkW/DoW4gaMOgbmggdmkgbXVhIHPhuq9tLg0KDQojIFBo4bqnbiA2OiBQaMOibiB0w61jaCBC4bqjbmcgbmfhuqt1IG5oacOqbiAoIGLhuqNuZyAyeDIpDQoNCiMjIDYuMSBHaeG7m2kgdGhp4buHdQ0KDQpUcm9uZyBwaMOibiB0w61jaCB0aOG7kW5nIGvDqiDEkeG7i25oIGzGsOG7o25nLCBi4bqjbmcgbmfhuqt1IG5oacOqbiAoY29udGluZ2VuY3kgdGFibGUpIGdpw7pwIHhlbSB4w6l0IG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGhhaSBiaeG6v24gcGjDom4gbG/huqFpLiBW4bubaSBi4bqjbmcgMngyLCB0YSBjw7MgdGjhu4MgxJHDoW5oIGdpw6Egc+G7sSBsacOqbiBxdWFuIGdp4buvYSBoYWkgYmnhur9uIG5o4buLIHBow6JuIHRow7RuZyBxdWEgY8OhYyBjaOG7iSBz4buRIG5oxrAgaGnhu4d1IHThu7cgbOG7hywgdOG7tyBz4buRIG5ndXkgY8ahIChSUikgdsOgIHThu7cgc+G7kSBjaMOqbmggKE9SKS4gQsOgaSB2aeG6v3QgbsOgeSBz4bq9IHRyw6xuaCBiw6B5IGPDoWNoIHjDonkgZOG7sW5nIGLhuqNuZyBuZ+G6q3Ugbmhpw6puLCBzbyBzw6FuaCBoYWkgdOG7tyBs4buHLCDGsOG7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IGNobyBPUiB2w6AgbWluaCBo4buNYSBi4bqxbmcgbeG7mXQgdsOtIGThu6UgdGjhu7FjIHThur8gdHJvbmcga2luaCBkb2FuaC4NCg0KIyMgNi4yIEPhuqV1IHRyw7pjIHbDoCB4w6FjIHN14bqldCBj4bunYSBi4bqjbmcgbmfhuqt1IG5oacOqbg0KDQpN4buZdCBi4bqjbmcgbmfhuqt1IG5oacOqbiAyeDIgbMOgIGLhuqNuZyB04bqnbiBzdeG6pXQgxJHhur9tIHPhu5EgcXVhbiBzw6F0IHRodeG7mWMgdsOgbyB04burbmcgdOG7lSBo4bujcCBj4bunYSBoYWkgYmnhur9uIG5o4buLIHBow6JuOg0KDQokJCBcYmVnaW57YXJyYXl9e3xjfGN8Y3xjfH0gXGhsaW5lICAmIFx0ZXh0e0vhur90IHF14bqjICgrKX0gJiBcdGV4dHtL4bq/dCBxdeG6oyAo4oCTKX0gJiBcdGV4dHtU4buVbmd9IFxcIFxobGluZSBcdGV4dHtQaMahaSBuaGnhu4VtIChZZXMpfSAmIGEgJiBiICYgYSArIGIgXFwgXGhsaW5lIFx0ZXh0e0tow7RuZyBwaMahaSBuaGnhu4VtIChObyl9ICYgYyAmIGQgJiBjICsgZCBcXCBcaGxpbmUgXHRleHR7VOG7lW5nIGPhu5luZ30gJiBhICsgYyAmIGIgKyBkICYgbiA9IGEgKyBiICsgYyArIGQgXFwgXGhsaW5lIFxlbmR7YXJyYXl9ICQkDQoNCsSQ4buDIGhp4buDdSDEkcaw4bujYyBz4buxIGjDrG5oIHRow6BuaCBj4bunYSBi4bqjbmcgbsOgeSwgY+G6p24geMOhYyDEkeG7i25oIG3DtCBow6xuaCB4w6FjIHN14bqldCBzaW5oIHJhIGThu68gbGnhu4d1IOKAlCB0cm9uZyDEkcOzIHBo4buVIGJp4bq/biBuaOG6pXQgbMOgIHBow6JuIHBo4buRaSAqKlBvaXNzb24qKiB2w6AgKipNdWx0aW5vbWlhbCoqLg0KDQojIyMgNi4yLjEuIFBow6JuIHBo4buRaSBQb2lzc29uDQoNClBow6JuIHBo4buRaSBQb2lzc29uIHRoxrDhu51uZyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBtw7QgaMOsbmggaMOzYSBz4buRIGzGsOG7o25nIHPhu7Ega2nhu4duIHjhuqN5IHJhIHRyb25nIG3hu5l0IGtob+G6o25nIHRo4budaSBnaWFuLCBraMO0bmcgZ2lhbiBob+G6t2MgxJHGoW4gduG7iyBj4bulIHRo4buDLiBHaeG6oyBz4butIGPDoWMgc+G7sSBraeG7h24geOG6o3kgcmEgxJHhu5ljIGzhuq1wIHbDoCB24bubaSBt4buZdCB04bu3IGzhu4cgdHJ1bmcgYsOsbmgga2jDtG5nIMSR4buVaSwgbeG7l2kgw7QgdHJvbmcgYuG6o25nIGPDsyB0aOG7gyB4ZW0gbMOgIGJp4bq/biBuZ+G6q3Ugbmhpw6puIFBvaXNzb246DQoNCiQkIFhfe2lqfSBcc2ltIFx0ZXh0e1BvaXNzb259KFxsYW1iZGFfe2lqfSkgJCQNCg0KKirGr3UgxJFp4buDbToqKg0KDQotICAgUGjDuSBo4bujcCBraGkgdOG7lW5nIHPhu5EgcXVhbiBzw6F0IGtow7RuZyBj4buRIMSR4buLbmguDQoNCi0gICDDgXAgZOG7pW5nIHRyb25nIHBow6JuIHTDrWNoIHPhu5Egc+G7sSBraeG7h24gbmjGsDogc+G7kSBsxrDhu6N0IHRydXkgY+G6rXAsIHPhu5EgxJHGoW4gaMOgbmcgbOG7l2ksIHYudi4NCg0KKipI4bqhbiBjaOG6vzoqKg0KDQotICAgS2jDtG5nIGtp4buDbSBzb8OhdCDEkcaw4bujYyB04buVbmcgc+G7kSBt4bqrdSAobikuDQoNCiMjIyA2LjIuMi4gUGjDom4gcGjhu5FpIE11bHRpbm9taWFsDQoNClRyb25nIHRyxrDhu51uZyBo4bujcCB04buVbmcgc+G7kSBxdWFuIHPDoXQgJG4kIGzDoCBj4buRIMSR4buLbmgsIHbDoCBt4buXaSBxdWFuIHPDoXQgcsahaSB2w6BvIG3hu5l0IHRyb25nIGLhu5FuIMO0IHbhu5tpIHjDoWMgc3XhuqV0ICRwXzEsIHBfMiwgcF8zLCBwXzQkLCB0aMOsIGLhuqNuZyBuZ+G6q3Ugbmhpw6puIDJ4MiBjw7MgdGjhu4MgxJHGsOG7o2MgbcO0IGjDrG5oIGjDs2EgdGhlbyBwaMOibiBwaOG7kWkgxJFhIHRo4bupYyBNdWx0aW5vbWlhbCBuaMawIHNhdToNCg0KJCQgKGEsIGIsIGMsIGQpIFxzaW0gXHRleHR7TXVsdGlub21pYWx9KG47IHBfMSwgcF8yLCBwXzMsIHBfNCkgJCQNCg0KUGjDom4gcGjhu5FpIG7DoHkgdGjGsOG7nW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIGPDoWMgdMOsbmggaHXhu5FuZyBtw6AgZOG7ryBsaeG7h3UgxJHGsOG7o2MgdGh1IHRo4bqtcCB04burIGto4bqjbyBzw6F0IGhv4bq3YyBuZ2hpw6puIGPhu6l1IHjDoyBo4buZaSBo4buNYyB24bubaSBrw61jaCB0aMaw4bubYyBt4bqrdSBj4buRIMSR4buLbmguIEtoaSDEkcOzLCBjw6FjIHjDoWMgc3XhuqV0ICRwXzEsIHBfMiwgcF8zLCBwXzQkIGJp4buDdSBkaeG7hW4geMOhYyBzdeG6pXQgbcOgIG3hu5l0IGPDoSB0aOG7gyByxqFpIHbDoG8gdOG7q25nIMO0IHRyb25nIGLhuqNuZyAyeDIuDQoNCioqxq91IMSRaeG7g20gY+G7p2EgbcO0IGjDrG5oIE11bHRpbm9taWFsOioqDQoNCi0gICBLaeG7g20gc2/DoXQgxJHGsOG7o2MgdOG7lW5nIHPhu5EgbeG6q3UuDQoNCi0gICBQaMO5IGjhu6NwIGNobyBk4buvIGxp4buHdSBraOG6o28gc8OhdCwgdGjhu60gbmdoaeG7h20uDQoNCioqU28gc8OhbmggZ2nhu69hIHBow6JuIHBo4buRaSBQb2lzc29uIHbDoCBNdWx0aW5vbWlhbCoqDQoNCnwgVGnDqnUgY2jDrSAgICAgICAgfCBQb2lzc29uICAgICAgICAgICAgICAgICB8IE11bHRpbm9taWFsICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgVOG7lW5nIHPhu5EgbeG6q3UgICAgIHwgS2jDtG5nIGPhu5EgxJHhu4tuaCAgICAgICAgICAgfCBD4buRIMSR4buLbmggICAgICAgICAgICAgICAgICAgICB8DQp8IOG7qG5nIGThu6VuZyBjaMOtbmggIHwgU+G7kSBz4buxIGtp4buHbiAgICAgICAgICAgICAgfCBU4bqnbiBzdeG6pXQga2jhuqNvIHPDoXQgICAgICAgICAgIHwNCnwgROG7ryBsaeG7h3UgcGjDuSBo4bujcCB8IEdpYW8gZOG7i2NoLCBs4buXaSwgdGFpIG7huqFuIHwgVHLhuqMgbOG7nWkga2jhuqNvIHPDoXQsIHBow6JuIG5ow7NtIHwNCg0KIyMgKio2LjMuIEPDoWMgY2jhu4kgc+G7kSDEkW8gbeG7kWkgbGnDqm4gaOG7hyoqDQoNCiMjIyAqKjYuMy4xLiBIaeG7h3UgdOG7tyBs4buHIChSaXNrIERpZmZlcmVuY2UgLSBSRCkqKg0KDQokJCBSRCA9IFxmcmFje2F9e2EgKyBifSAtIFxmcmFje2N9e2MgKyBkfSAkJA0KDQoqKsOdIG5naMSpYSoqOg0KDQotICAgxJBvIGzGsOG7nW5nICoqY2jDqm5oIGzhu4djaCB0dXnhu4d0IMSR4buRaSoqIGdp4buvYSB4w6FjIHN14bqldCB44bqjeSByYSBr4bq/dCBxdeG6oyDhu58gbmjDs20gcGjGoWkgbmhp4buFbSB2w6AgbmjDs20ga2jDtG5nIHBoxqFpIG5oaeG7hW0uDQoNCi0gICBUaMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgxJHDoW5oIGdpw6EgKip0w6FjIMSR4buZbmcgY+G7p2EgY2jDrW5oIHPDoWNoKiosIGNhbiB0aGnhu4dwIGhv4bq3YyBjaMawxqFuZyB0csOsbmggdGjDrSDEkWnhu4NtLCBraGkgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB4w6FjIHN14bqldCBsw6AgcXVhbiB0cuG7jW5nIGjGoW4gc28gduG7m2kgdOG7tyBz4buRLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlIChDSSkgY2hvIFJEIGPDsyB0aOG7gyDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgYuG6sW5nOg0KDQokJCBDSV97UkR9ID0gUkQgXHBtIFpfezEgLSBcYWxwaGEvMn0gXGNkb3QgU0Vfe1JEfSAkJA0KDQpUcm9uZyDEkcOzOiAtICRaX3sxIC0gXGFscGhhLzJ9JCBsw6AgZ2nDoSB0cuG7iyB04bubaSBo4bqhbiAodGjGsOG7nW5nIOKJiCAxLjk2IHbhu5tpIDk1JSBDSSksDQoNCi0gICAkU0Vfe1JEfSA9IFxzcXJ0e1xmcmFje2EoYStiLWEpfXsoYStiKV4zfSArIFxmcmFje2MoYytkLWMpfXsoYytkKV4zfX0kDQoNCiMjIyA2LjMuMi4gVOG7tyBz4buRIG5ndXkgY8ahIChSZWxhdGl2ZSBSaXNrIC0gUlIpDQoNCiQkIFJSID0gXGZyYWN7YSAvIChhICsgYil9e2MgLyAoYyArIGQpfSAkJA0KDQoqKsOdIG5naMSpYSoqOg0KDQotICAgJFJSID4gMSQ6IG5ndXkgY8ahIHjhuqN5IHJhIGvhur90IHF14bqjIGNhbyBoxqFuIOG7nyBuaMOzbSBwaMahaSBuaGnhu4VtLg0KDQotICAgJFJSIDwgMSQ6IG5ndXkgY8ahIHjhuqN5IHJhIGvhur90IHF14bqjIHRo4bqlcCBoxqFuIOG7nyBuaMOzbSBwaMahaSBuaGnhu4VtLg0KDQotICAgJFJSID0gMSQ6IGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgcGjGoWkgbmhp4buFbSB2w6Aga+G6v3QgcXXhuqMuDQoNClRhIHRoxrDhu51uZyBs4bqleSAqKmxvZyoqIGPhu6dhIFJSIMSR4buDIHTDrW5oIGtob+G6o25nIHRpbiBj4bqteToNCg0KJCQgQ0lfe1JSfSA9IFxleHAgXGxlZnRbIFxsbihSUikgXHBtIFpfezEgLSBcYWxwaGEvMn0gXGNkb3QgU0Vfe1xsbihSUil9IFxyaWdodF0gJCQNCg0KVHJvbmcgxJHDszoNCg0KJCQgU0Vfe1xsbihSUil9ID0gXHNxcnR7IFxmcmFjezF9e2F9IC0gXGZyYWN7MX17YSArIGJ9ICsgXGZyYWN7MX17Y30gLSBcZnJhY3sxfXtjICsgZH0gfSAkJA0KDQoqKlbDrSBk4bulIHRyb25nIGtpbmggZG9hbmgqKjoNCg0KLSAgIFThu7cgbOG7hyBraMOhY2ggbXVhIGjDoG5nIGtoaSBjw7Mga2h1eeG6v24gbcOjaTogJDgwLzEwMCA9IDAuOCQNCg0KLSAgIEtoaSBraMO0bmcgY8OzIGtodXnhur9uIG3Do2k6ICQ0MC8xMDAgPSAwLjQkDQoNCi0gICAkUlIgPSAwLjggLyAwLjQgPSAyJA0KDQrih5IgS2h1eeG6v24gbcOjaSBsw6BtIHTEg25nIGfhuqVwIMSRw7RpIGto4bqjIG7Eg25nIGtow6FjaCBtdWEgaMOgbmcuDQoNCkjhuqFuIGNo4bq/Og0KDQotICAgS2jDtG5nIHPhu60gZOG7pW5nIMSRxrDhu6NjIHRyb25nIG5naGnDqm4gY+G7qXUgYuG7h25oIGNo4bupbmcgKGNhc2UtY29udHJvbCkgdsOsIHRhIGtow7RuZyBiaeG6v3Qgbmd1eSBjxqEgdHV54buHdCDEkeG7kWkuDQoNCi0gICBE4buFIGfDonkgaGnhu4N1IG5o4bqnbSBu4bq/dSBraMO0bmcgxJFpIGvDqG0gbmd1eSBjxqEgdHV54buHdCDEkeG7kWkuIFbDrSBk4bulOiBSUiA9IDIgY8OzIHbhursgY2FvLCBuaMawbmcgbuG6v3Ugbmd1eSBjxqEgYmFuIMSR4bqndSBsw6AgMSUsIHRow6wgdMSDbmcgbMOqbiAyJSB24bqrbiBsw6AgcuG6pXQgdGjhuqVwLg0KDQotICAgS2jDtG5nIMSR4buRaSB44bupbmc6IE7hur91IMSR4buVaSBuaMOzbSB0aGFtIGNoaeG6v3UgdGjDrCBnacOhIHRy4buLIFJSIHRoYXkgxJHhu5VpLCBraMOhYyB24bubaSBPUi4NCg0KIyMjIDYuMy4zLiBU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpDQoNCiMjIyMgNi4zLjMuMS4gT2Rkcw0KDQotICAgKipPZGRzICh04bu3IHPhu5EgY8ahIGjhu5lpKSoqOlwNCiAgICAkJCBcdGV4dHtPZGRzfSA9IFxmcmFje3B9ezEgLSBwfSAkJCBUcm9uZyDEkcOzLCAkcCQgbMOgIHjDoWMgc3XhuqV0IHjhuqN5IHJhIGPhu6dhIG3hu5l0IGJp4bq/biBuaOG7iyBwaMOibiAobmjGsCB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgKS4NCg0KIyMjIyA2LjMuMy4yLiBPZGRzIFJhdGlvIC0gT1INCg0KJCQgT1IgPSBcZnJhY3thIC8gYn17YyAvIGR9ID0gXGZyYWN7YWR9e2JjfSAkJA0KDQpIYXkNCg0KJCQgICBcdGV4dHtPUn0gPSBcZnJhY3tcdGV4dHtPZGRzIOG7nyBuaMOzbSAxfX17XHRleHR7T2RkcyDhu58gbmjDs20gMn19ICQkIE9SIHRoxrDhu51uZyBkw7luZyDEkeG7gyDEkW8gbMaw4budbmcgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgbeG7mXQgeeG6v3UgdOG7kSB2w6AgbeG7mXQga+G6v3QgcXXhuqMgdHJvbmcgYuG6o25nIDJ4Mi4NCg0KLSAgICoqT1IgPSAxKio6IEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSBvZGRzIGdp4buvYSBoYWkgbmjDs20uDQoNCi0gICAqKk9SIFw+IDEqKjogTmjDs20gMSBjw7Mgb2RkcyB44bqjeSByYSBr4bq/dCBxdeG6oyBjYW8gaMahbiBuaMOzbSAyLg0KDQotICAgKipPUiBcPCAxKio6IE5ow7NtIDEgY8OzIG9kZHMgeOG6o3kgcmEga+G6v3QgcXXhuqMgdGjhuqVwIGjGoW4gbmjDs20gMi4NCg0KPiBWw60gZOG7pTogT1IgPSAyIG5naMSpYSBsw6AgKipvZGRzIHjhuqN5IHJhIGvhur90IHF14bqjIOG7nyBuaMOzbSAxIGNhbyBn4bqlcCAyIGzhuqduIG5ow7NtIDIqKi4NCg0KLSAgICoqTMawdSDDvSoqOiBPUiBraMOhYyB24bubaSBSUiwgxJHhurdjIGJp4buHdCBraGkgYmnhur9uIHBo4bulIHRodeG7mWMga2jDtG5nIGhp4bq/bSBn4bq3cC4gS2hpIGvhur90IHF14bqjIGzDoCBoaeG6v20gKHAgbmjhu48pLCB0aMOsIE9SIOKJiCBSUi4NCg0KKirDnSBuZ2jEqWEqKjoNCg0KLSAgIE9SIGNobyBiaeG6v3QgdOG7tyBs4buHICoqb2RkcyoqICh04bupYyBsw6AgInjDoWMgc3XhuqV0IGNoaWEgY2hvIDEgdHLhu6sgeMOhYyBzdeG6pXQiKSBnaeG7r2EgaGFpIG5ow7NtLg0KDQotICAgVGjGsOG7nW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIHBo4buVIGJp4bq/biB0cm9uZyBtw7QgaMOsbmggKipsb2dpc3RpYyByZWdyZXNzaW9uKiouDQoNCi0gICBUcm9uZyBjw6FjIG5naGnDqm4gY+G7qXUgYuG7h25oIGhp4bq/bSAocmFyZSBkaXNlYXNlIGFzc3VtcHRpb24pLCBPUiB44bqlcCB44buJIHbhu5tpIFJSLg0KDQoqKsavdSDEkWnhu4NtIGPhu6dhIE9kZHMgUmF0aW8qKjoNCg0KLSAgIEThu4UgdMOtbmggdsOgIGThu4UgZGnhu4VuIGdp4bqjaS4NCg0KLSAgIOG7lG4gxJHhu4tuaCB24buBIG3hurd0IHRvw6FuIGjhu41jIGtoaSBz4butIGThu6VuZyB0cm9uZyBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkuDQoNCi0gICBLaMO0bmcgcGjhu6UgdGh14buZYyB2w6BvIHThu7cgbOG7hyBoaeG7h24gZGnhu4duIHRyb25nIG3huqt1ICjEkeG6t2MgYmnhu4d0IHRyb25nIGPDoWMgdGhp4bq/dCBr4bq/ICoqYuG7h25oIOKAkyBjaOG7qW5nKio6ICpjYXNlLWNvbnRyb2wgc3R1ZHkqKS4NCg0KIyMgNi40LiBLaG/huqNuZyDGsOG7m2MgbMaw4bujbmcgdGluIGPhuq15IGNobyBPRERTIFJBVElPDQoNCsSQ4buDIHjDoWMgxJHhu4tuaCB4ZW0gT1IgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkga2jDtG5nLCBj4bqnbiB4w6J5IGThu7FuZyBraG/huqNuZyB0aW4gY+G6rXkuDQoNCioqTG9nYXJpdGhtIHThu7Egbmhpw6puIGPhu6dhIE9kZHMgUmF0aW86KioNCg0KJCQgXGxvZyhPUikgPSBcbG9nXGxlZnQoIFxmcmFje2EgXGNkb3QgZH17YiBcY2RvdCBjfSBccmlnaHQpICQkDQoNCioqU2FpIHPhu5EgY2h14bqpbiAoU3RhbmRhcmQgRXJyb3IpOioqDQoNCiQkIFNFID0gXHNxcnR7IFxmcmFjezF9e2F9ICsgXGZyYWN7MX17Yn0gKyBcZnJhY3sxfXtjfSArIFxmcmFjezF9e2R9IH0gJCQNCg0KKipLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyoqICRcbG9nKE9SKSQ6DQoNCiQkIFxsb2coT1IpIFxwbSAxLjk2IFxjZG90IFNFICQkDQoNCioqTOG6pXkgbcWpIMSR4buDIGPDsyBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBPUjoqKg0KDQokJCBDSV97OTVcJX0gPSBcbGVmdFsgZV57XGxvZyhPUikgLSAxLjk2IFxjZG90IFNFfSxccXVhZCBlXntcbG9nKE9SKSArIDEuOTYgXGNkb3QgU0V9IFxyaWdodF0gJCQNCg0KLSAgIE7hur91IGtob+G6o25nIHRpbiBj4bqteSAqKmtow7RuZyBjaOG7qWEgMSoqLCB0YSBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyAqKm3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCiMjIDYuNS4g4buobmcgZOG7pW5nIHRyb25nIGtpbmggZG9hbmg6IEhJ4buGVSBRVeG6oiBD4bumQSBLSFVZ4bq+TiBNw4NJDQoNCk3hu5l0IGPDtG5nIHR5IHRoxrDGoW5nIG3huqFpIMSRaeG7h24gdOG7rSB0aOG7rSBuZ2hp4buHbSBjaGnhur9uIGThu4tjaCBraHV54bq/biBtw6NpIMSR4buDIGtp4buDbSB0cmEgeGVtIGxp4buHdSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGjDoG5oIHZpIG11YSBow6BuZyBraMO0bmcuIEjhu40gbOG6pXkgbeG6q3UgMjAwIGtow6FjaCBow6BuZyBuZ+G6q3Ugbmhpw6puIHbDoCB0aHUgxJHGsOG7o2MgYuG6o25nIHNhdToNCg0KfCAgICAgICAgICAgICAgICAgIHwgTXVhIGjDoG5nIHwgS2jDtG5nIG11YSB8IFThu5VuZyB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfA0KfCBDw7Mga2h1eeG6v24gbcOjaSAgICB8IDgwICAgICAgIHwgMjAgICAgICAgIHwgMTAwICB8DQp8IEtow7RuZyBraHV54bq/biBtw6NpIHwgNDAgICAgICAgfCA2MCAgICAgICAgfCAxMDAgIHwNCg0KLSAgIFTDrW5oIE9kZHMgUmF0aW8gKE9SKToNCg0KJCQgT1IgPSBcZnJhY3s4MCBcY2RvdCA2MH17MjAgXGNkb3QgNDB9ID0gXGZyYWN7NDgwMH17ODAwfSA9IDYgJCQNCg0K4oaSIE9kZHMgbXVhIGjDoG5nIGtoaSBjw7Mga2h1eeG6v24gbcOjaSAqKmNhbyBn4bqlcCA2IGzhuqduKiogc28gduG7m2kga2hpIGtow7RuZyBjw7Mga2h1eeG6v24gbcOjaS4NCg0KLSAgIExvZ2FyaXRobSB04buxIG5oacOqbiBj4bunYSBPUjoNCg0KJCQgXGxvZyhPUikgPSBcbG9nKDYpIFxhcHByb3ggMS43OSAkJA0KDQotICAgU2FpIHPhu5EgY2h14bqpbiAoU0UpOg0KDQokJCBTRSA9IFxzcXJ0eyBcZnJhY3sxfXs4MH0gKyBcZnJhY3sxfXsyMH0gKyBcZnJhY3sxfXs0MH0gKyBcZnJhY3sxfXs2MH0gfSBcYXBwcm94IDAuMzUgJCQNCg0KLSAgIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIE9SOg0KDQokJCBDSSA9IFxsZWZ0WyBlXnsxLjc5IC0gMS45NiBcY2RvdCAwLjM1fSxccXVhZCBlXnsxLjc5ICsgMS45NiBcY2RvdCAwLjM1fSBccmlnaHRdICBcYXBwcm94IFxsZWZ0WyBlXnsxLjExfSxccXVhZCBlXnsyLjQ3fSBccmlnaHRdICA9IFszLjAzLFwgMTEuODFdICQkDQoNCi0gICBWw6wga2hv4bqjbmcgdGluIGPhuq15ICoqa2jDtG5nIGNo4bupYSAxKiosIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nICoqa2h1eeG6v24gbcOjaSBjw7Mg4bqjbmggaMaw4bufbmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqIMSR4bq/biBow6BuaCB2aSBtdWEgaMOgbmcuDQoNCi0gICBW4bubaSAkT1IgPSA2JCB2w6AgJENJID0gKDMuMDMsXCAxMS44MSkkLCBkb2FuaCBuZ2hp4buHcCBjw7MgdGjhu4MgdOG7sSB0aW4gdHJp4buDbiBraGFpICoqY2hp4bq/biBsxrDhu6NjIGtodXnhur9uIG3Do2kgcXV5IG3DtCBs4bubbiBoxqFuKiouDQoNCiMgUGjhuqduIDc6IFNvIHPDoW5oIHbDoCB0aMaw4bubYyDEkW8gbeG7kWkgbGnDqm4gaOG7hw0KDQojIyA3LjEuIEhp4buHdSBoYWkgdOG7tyBs4buHIChEaWZmZXJlbmNlIGluIFByb3BvcnRpb25zKToNCg0KIyMjIDcuMS4xLiBC4bqjbmcgY2jDqW8gMngyIGdp4buvYSBHZW5kZXIgdsOgIEhvbWVvd25lcjoNCg0KYGBge3J9DQojIELhuqNuZyBjaMOpbyBnaeG7r2EgR2VuZGVyIHbDoCBIb21lb3duZXINCmdoIDwtIHRhYmxlKGR0JEdlbmRlciwgZHQkSG9tZW93bmVyKSANCmFkZG1hcmdpbnMoZ2gpDQpgYGANCg0KJCQgcF8xID0gUChcdGV4dHtIb21lb3duZXJ9ID0gWSBcbWlkIFx0ZXh0e0dlbmRlcn0gPSBGKSBccXVhZCBcdGV4dHsodOG7tyBs4buHIG7hu68gc+G7nyBo4buvdSBuaMOgKX0gJCQNCg0KJCQgcF8yID0gUChcdGV4dHtIb21lb3duZXJ9ID0gWSBcbWlkIFx0ZXh0e0dlbmRlcn0gPSBNKSBccXVhZCBcdGV4dHsodOG7tyBs4buHIG5hbSBz4bufIGjhu691IG5ow6ApfSAkJA0KDQpUw61uaCBoaeG7h3UgaGFpIHThu7cgbOG7hzoNCg0KJCQgZCA9IHBfMSAtIHBfMiAkJA0KDQpLaeG7g20gxJHhu4tuaDoNCg0KSOKCgDogcOKCgSAtIHDigoIgPSAwICh04bu3IGzhu4cgbuG7ryBz4bufIGjhu691IG5ow6AgYuG6sW5nIHThu7cgbOG7hyBuYW0gc+G7nyBo4buvdSBuaMOgKQ0KDQpI4oKBOiBw4oKBIC0gcOKCgiBcPCAwIChU4bu3IGzhu4cgbuG7ryBz4bufIGjhu691IG5ow6Agbmjhu48gaMahbiB04bu3IGzhu4cgbmFtIHPhu58gaOG7r3UgbmjDoCApDQoNCmBgYHtyfQ0KY291bnRzIDwtIGMoZ2hbIkYiLCAiWSJdLCBnaFsiTSIsICJZIl0pICAgIyBT4buRIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCB0aGVvIHThu6tuZyBnaeG7m2kgdMOtbmgNCnRvdGFscyA8LSBjKHN1bShnaFsiRiIsIF0pLCBzdW0oZ2hbIk0iLCBdKSkgICMgVOG7lW5nIHPhu5EgbmfGsOG7nWkgdGhlbyB04burbmcgZ2nhu5tpIHTDrW5oDQoNCnRlc3QgPC0gcHJvcC50ZXN0KGNvdW50cywgdG90YWxzLCBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgY29ycmVjdCA9IEZBTFNFKQ0KdGVzdA0KYGBgDQoNCi0gICBwcm9wIDEgKHAxKSA9IDAuNjA1OTogdOG7tyBs4buHIG7hu68gc+G7nyBo4buvdSBuaMOgIGtob+G6o25nIDYwLjU5JQ0KDQotICAgcHJvcCAyIChwMikgPSAwLjU5NTI6IHThu7cgbOG7hyBuYW0gc+G7nyBo4buvdSBuaMOgIGtob+G6o25nIDU5LjUyJQ0KDQotICAgUC12YWx1ZSA9IDAuOTAyNQ0KDQpHacOhIHRy4buLIHAtdmFsdWUgdGh1IMSRxrDhu6NjIGzDoCAwLjkwMjUsIGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUuIERvIMSRw7MsIGNow7puZyB0YSAqKmtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCoqICRIXzA6IHBfMSAtIHBfMiA9IDAkLg0KDQrEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AsIHRoZW8gZOG7ryBsaeG7h3UgaGnhu4duIHThuqFpLCBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY+G7p2EgbuG7ryB2w6AgbmFtLCB2w6Aga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyBjaG8gdGjhuqV5IHThu7cgbOG7hyBu4buvIHPhu58gaOG7r3UgbmjDoCB0aOG6pXAgaMahbiB04bu3IGzhu4cgbmFtLg0KDQojIyMgNy4xLjIuIELhuqNuZyBjaMOpbyAyeDIgZ2nhu69hIE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lcjoNCg0KYGBge3J9DQptaCA8LSB0YWJsZShkdCRNYXJpdGFsU3RhdHVzLCBkdCRIb21lb3duZXIpDQptaDEgPC0gYWRkbWFyZ2lucyhtaCkNCnByaW50KG1oMSkNCmBgYA0KDQpHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoNCg0KJCQgSF8wOiBwXzEgLSBwXzIgPSAwIFxxdWFkIFx0ZXh0eyh04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIGPhu6dhIG5ow7NtIMSQw6Mga+G6v3QgaMO0biBi4bqxbmcgbmjDs20gxJDhu5ljIHRow6JuKX0gJCQNCg0KJCQgSF8xOiBwXzEgLSBwXzIgPiAwIFxxdWFkIFx0ZXh0eyh04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIGPhu6dhIG5ow7NtIMSQw6Mga+G6v3QgaMO0biBjYW8gaMahbiBuaMOzbSDEkOG7mWMgdGjDom4pfSAkJA0KDQpUcm9uZyDEkcOzOlwNCi0gJHBfMSA9IFAoXHRleHR7SG9tZW93bmVyfSA9IFkgXG1pZCBcdGV4dHtNYXJpdGFsU3RhdHVzfSA9IE0pJCBsw6AgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBj4bunYSBuaMOzbSAqKsSQw6Mga+G6v3QgaMO0biAoTWFycmllZCwgTSkqKi5cDQotICRwXzIgPSBQKFx0ZXh0e0hvbWVvd25lcn0gPSBZIFxtaWQgXHRleHR7TWFyaXRhbFN0YXR1c30gPSBTKSQgbMOgIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY+G7p2EgbmjDs20gKirEkOG7mWMgdGjDom4gKFNpbmdsZSwgUykqKi4NCg0KYGBge3J9DQpjb3VudHMxIDwtIGMobWhbIk0iLCAiWSJdLCBtaFsiUyIsICJZIl0pDQp0b3RhbHMxIDwtIGMoc3VtKG1oWyJNIiwgXSksIHN1bShtaFsiUyIsIF0pKQ0KDQp0ZXN0MSA8LSBwcm9wLnRlc3QoY291bnRzMSwgdG90YWxzMSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsIGNvcnJlY3QgPSBGQUxTRSkNCnRlc3QxDQpgYGANCg0KLSAgIHByb3AgMSA9IDAuNzQ5NjogdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBj4bunYSBuaMOzbSDEkMOjIGvhur90IGjDtG4gKE0pIGzDoCBraG/huqNuZyA3NC45NiUNCg0KLSAgIHByb3AgMiA9IDAuNDU4NDogdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBj4bunYSBuaMOzbSDEkOG7mWMgdGjDom4gKFMpIGzDoCBraG/huqNuZyA0NS44NCUNCg0KLSAgIEdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBuaOG7jyAoXDwgMi4yZS0xNiksIG5o4buPIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUsIGNobyB0aOG6pXkgY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIG3huqFuaCBt4bq9IMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMC4gVuG6rXkgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBj4bunYSBuaMOzbSDEkcOjIGvhur90IGjDtG4gbmhp4buBdSBoxqFuIGPhu6dhIG5ow7NtIMSR4buZYyB0aMOibi4NCg0KIyMjIDcuMS4zLiBC4bqjbmcgY2jDqW8gMngyIGdp4buvYSBHZW5kZXIgdsOgIE1hcml0YWxTdGF0dXM6DQoNCmBgYHtyfQ0KIyAxLiBM4bqtcCBi4bqjbmcgY2jDqW8gMngyIGdp4buvYSBHZW5kZXIgdsOgIE1hcml0YWxTdGF0dXMNCmdtIDwtIHRhYmxlKGR0JEdlbmRlciwgZHQkTWFyaXRhbFN0YXR1cykNCmFkZG1hcmdpbnMoZ20pICAjIFRow6ptIGjDoG5nIHbDoCBj4buZdCB04buVbmcNCmBgYA0KDQpHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaA0KDQokJCBIXzA6IHBfMSAtIHBfMiA9IDAgXHF1YWQgXHRleHR7KFThu7cgbOG7hyDEkcOjIGvhur90IGjDtG4gY+G7p2EgbuG7ryBi4bqxbmcgbmFtKX0gJCQNCg0KJCQgSF8xOiBwXzEgLSBwXzIgPiAwIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgxJHDoyBr4bq/dCBow7RuIGPhu6dhIG7hu68gbOG7m24gaMahbiBuYW0pfSAkJA0KDQpUcm9uZyDEkcOzOiAtICRwXzEgPSBQKFx0ZXh0e01hcml0YWxTdGF0dXN9ID0gTSBcbWlkIFx0ZXh0e0dlbmRlcn0gPSBGKSQ6IHThu7cgbOG7hyAqKm7hu68qKiDEkcOjIGvhur90IGjDtG4NCg0KLSAgICRwXzIgPSBQKFx0ZXh0e01hcml0YWxTdGF0dXN9ID0gTSBcbWlkIFx0ZXh0e0dlbmRlcn0gPSBNKSQ6IHThu7cgbOG7hyAqKm5hbSoqIMSRw6Mga+G6v3QgaMO0bg0KDQpgYGB7cn0NCiMgVHLDrWNoIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIHRoZW8gZ2nhu5tpDQpjb3VudHMzIDwtIGMoZ21bIkYiLCAiTSJdLCBnbVsiTSIsICJNIl0pDQp0b3RhbHMzIDwtIGMoc3VtKGdtWyJGIiwgXSksIHN1bShnbVsiTSIsIF0pKQ0KDQojIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggaGnhu4d1IGhhaSB04bu3IGzhu4cNCnRlc3QzIDwtIHByb3AudGVzdChjb3VudHMzLCB0b3RhbHMzLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgY29ycmVjdCA9IEZBTFNFKQ0KdGVzdDMNCmBgYA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5Og0KDQotICAgVOG7tyBs4buHIG7hu68gxJHDoyBr4bq/dCBow7RuICgkcF8xJCkg4omIIDUwLjI0JQ0KDQotICAgVOG7tyBs4buHIG5hbSDEkcOjIGvhur90IGjDtG4gKCRwXzIkKSDiiYggNDcuMzglDQoNCi0gICBIaeG7h3UgaGFpIHThu7cgbOG7hzogJGQgPSBwXzEgLSBwXzIgXGFwcHJveCAwLjAyODYkDQoNCi0gICBHacOhIHRy4buLIHAtdmFsdWUgPSAwLjAwMDM1DQoNCi0gICBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBoaeG7h3UgdOG7tyBs4buHOiBbMC4wMTQ3OyAxXQ0KDQpWw6wgKipwLXZhbHVlIFw8IDAuMDUqKiwgdGEgKipiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QqKiAkSF8wJC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmc6ICoqVOG7tyBs4buHIG7hu68gxJHDoyBr4bq/dCBow7RuIGNhbyBoxqFuIHThu7cgbOG7hyBuYW0gxJHDoyBr4bq/dCBow7RuKiogdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3Uga2jhuqNvIHPDoXQuDQoNCiMjIDcuMi4gVOG7tyBz4buRIE5ndXkgY8ahIChSZWxhdGl2ZSBSaXNrIC0gUlIpOg0KDQojIyMgNy4yLjEuIELhuqNuZyBjaMOpbyAyeDIgZ2nhu69hIEdlbmRlciB2w6AgSG9tZW93bmVyOg0KDQpgYGB7cn0NCmdoIDwtIHRhYmxlKGR0JEdlbmRlciwgZHQkSG9tZW93bmVyKQ0KI1Row6ptIHThu5VuZyBow6BuZyB2w6AgY+G7mXQNCmdoMSA8LSBhZGRtYXJnaW5zKGdoKQ0KZ2gxDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0Kcmlza3JhdGlvKGdoLCBtZXRob2Q9IndhbGQiKQ0KYGBgDQoNCi0gICBOaMOzbSBu4buvIChGKSDEkcaw4bujYyBjaOG7jW4gbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UsIG7Dqm4gUlIgPSAxLiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBjaMO6bmcgdGEgc28gc8Ohbmggbmd1eSBjxqEgc+G7nyBo4buvdSBuaMOgIGPhu6dhIG5ow7NtIG5hbSAoTSkgduG7m2kgbmjDs20gbuG7ry4NCg0KLSAgIE5ow7NtIG5hbSAoTSkgY8OzIFJSID0gMC45ODIzIG5naMSpYSBsw6A6DQoNCiAgICAtICAgVOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCDhu58gbmFtIGLhurFuZyBraG/huqNuZyA5OC4yMyUgc28gduG7m2kgbuG7ry4NCg0KXGAgLSBIYXkgbsOzaSBjw6FjaCBraMOhYywgbmd1eSBjxqEgKHjDoWMgc3XhuqV0KSBz4bufIGjhu691IG5ow6AgY+G7p2EgbmFtIHRo4bqlcCBoxqFuIG7hu68ga2hv4bqjbmcgMS43NyUuDQoNCi0gICBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGPhu6dhIFJSIGzDoCAoMC45NTYyIOKAkyAxLjAwOTIpOg0KDQogICAgLSAgIEtob+G6o25nIG7DoHkgYmFvIGfhu5NtIHPhu5EgMSwgbmdoxKlhIGzDoCBnacOhIHRy4buLIFJSIHRo4buxYyBz4buxIGPDsyB0aOG7gyBsw6AgMSAoa2jDtG5nIGPDsyBraMOhYyBiaeG7h3QpLg0KDQogICAgLSAgIEtob+G6o25nIHRpbiBj4bqteSBjaG8gdGEgYmnhur90IG3hu6ljIMSR4buZIGNow61uaCB4w6FjIGPhu6dhIMaw4bubYyBsxrDhu6NuZyBSUjsga2hv4bqjbmcgcuG7mW5nIHbDoCBiYW8gZ+G7k20gMSBjaG8gdGjhuqV5IHPhu7Ega2jDtG5nIGNo4bqvYyBjaOG6r24gdsOgIHRoaeG6v3UgYuG6sW5nIGNo4bupbmcgduG7gSBz4buxIGtow6FjIGJp4buHdCB0aOG7sWMgc+G7sS4NCg0KVGEgY8OzIGdp4bqjIHRodXnhur90Og0KDQpI4oKAOiBU4bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIOG7nyBOYW0gdsOgIE7hu68ga2jDtG5nIGtow6FjIG5oYXUsIHThu6ljIGzDoCBSUiA9IDEuDQoNCkjigoE6IFThu7cgbOG7hyBz4bufIGjhu691IG5ow6Ag4bufIE5hbSB2w6AgTuG7ryBraMOhYyBuaGF1LCBSUiDiiaAgMS4NCg0KfCBLaeG7g20gxJHhu4tuaCAgICB8IHAtdmFsdWUgKE5hbSBzbyB24bubaSBO4buvKSB8IMOdIG5naMSpYSBjaMOtbmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBtaWRwLmV4YWN0ICAgfCAwLjE5NTIgICAgICAgICAgICAgICAgICB8IHAtdmFsdWUgY2jDrW5oIHjDoWMsIHPhu60gZOG7pW5nIHBoxrDGoW5nIHBow6FwIOKAnG1pZC1w4oCdICht4buZdCBiaeG6v24gdGjhu4MgY2jDrW5oIHjDoWMgaMahbiBGaXNoZXIpIHwNCnwgZmlzaGVyLmV4YWN0IHwgMC4xOTY1ICAgICAgICAgICAgICAgICAgfCBwLXZhbHVlIHThu6sga2nhu4NtIMSR4buLbmggRmlzaGVyIGNow61uaCB4w6FjIChwaMO5IGjhu6NwIHbhu5tpIGLhuqNuZyBuaOG7jyBob+G6t2Mgc+G7kSBsaeG7h3Ugw610KSAgICAgICB8DQp8IGNoaS5zcXVhcmUgICB8IDAuMTk1MSAgICAgICAgICAgICAgICAgIHwgcC12YWx1ZSB04burIGtp4buDbSDEkeG7i25oIENoaS1zcXVhcmUgKHjhuqVwIHjhu4ksIGThu7FhIHRyw6puIHBow6JuIHBo4buRaSBjaGkgYsOsbmggcGjGsMahbmcpICAgICAgIHwNCg0KVsOsIHAtdmFsdWUgXD4gMC4wNSwgdGEga2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBuw7NpIHLhurFuZyBnaeG7m2kgdMOtbmgg4bqjbmggaMaw4bufbmcgxJHDoW5nIGvhu4MgxJHhur9uIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoC4NCg0KTsOzaSBjw6FjaCBraMOhYywgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIG5ow7NtIE5hbSB2w6AgbmjDs20gTuG7ryB24buBIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6Aga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCiMjIyA3LjIuMi4gQuG6o25nIGNow6lvIDJ4MiBnaeG7r2EgTWFyaXRhbFN0YXR1cyB2w6AgSG9tZW93bmVyOg0KDQpgYGB7cn0NCm1oIDwtIHRhYmxlKGR0JE1hcml0YWxTdGF0dXMsIGR0JEhvbWVvd25lcikNCm1oMSA8LSBhZGRtYXJnaW5zKG1oKQ0KcHJpbnQobWgxKQ0KYGBgDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKG1oKQ0KYGBgDQoNCk5ow7NtIMSRw6Mga+G6v3QgaMO0biAoTSkgxJHGsOG7o2MgZMO5bmcgbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgduG7m2kgUlIgPSAxLg0KDQpOaMOzbSDEkeG7mWMgdGjDom4gKFMpIGPDszoNCg0KLSAgIFJSID0gMC42MTE0IChraG/huqNuZyB0aW4gY+G6rXkgOTUlOiAwLjU5NDIg4oCTIDAuNjI5MikuDQoNCi0gICDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgbmfGsOG7nWkgxJHhu5ljIHRow6JuIGPDsyBuZ3V5IGPGoSBz4bufIGjhu691IG5ow6AgdGjhuqVwIGjGoW4ga2hv4bqjbmcgMzguODYlIHNvIHbhu5tpIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0bi4NCg0KLSAgIEtob+G6o25nIHRpbiBj4bqteSA5NSUga2jDoSBo4bq5cCB2w6Aga2jDtG5nIGJhbyBn4buTbSBnacOhIHRy4buLIDEsIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBsw6AgcsO1IHLDoG5nIHbDoCDEkcOhbmcgdGluIGPhuq15Lg0KDQpUYSB0aOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IG5oxrAgc2F1Og0KDQotICAgKipI4oKAOioqIFThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY+G7p2EgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIHbDoCDEkeG7mWMgdGjDom4gbMOgIG5oxrAgbmhhdSAoUlIgPSAxKS4NCg0KLSAgICoqSOKCgToqKiBU4bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIGPhu6dhIGhhaSBuaMOzbSBsw6Aga2jDoWMgbmhhdSAoUlIg4omgIDEpLg0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaOG7iSByYSBSUiA9IDAuNjExNCB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlICgwLjU5NDIg4oCTIDAuNjI5MiksIHbDoCBjw6FjIGtp4buDbSDEkeG7i25oIGNobyBwLXZhbHVlIOKJiCAwIFw8IG3hu6ljIMO9IG5naMSpYSAwLjA1LiBEbyDEkcOzLCB0YSBiw6FjIGLhu48gSOKCgCB2w6Aga+G6v3QgbHXhuq1uIHLhurFuZyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8OzIG3hu5FpIGxpw6puIGjhu4cgdGjhu5FuZyBrw6ogcsO1IHLhu4d0IHbhu5tpIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoC4gTmfGsOG7nWkgxJHhu5ljIHRow6JuIGPDsyBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuLg0KDQojIyMgNy4yLjMuIELhuqNuZyBjaMOpbyAyeDIgZ2nhu69hIEdlbmRlciB2w6AgTWFyaXRhbFN0YXR1czoNCg0KYGBge3J9DQojIDEuIEzhuq1wIGLhuqNuZyBjaMOpbyAyeDIgZ2nhu69hIEdlbmRlciB2w6AgTWFyaXRhbFN0YXR1cw0KZ20gPC0gdGFibGUoZHQkR2VuZGVyLCBkdCRNYXJpdGFsU3RhdHVzKQ0KYWRkbWFyZ2lucyhnbSkgICMgVGjDqm0gaMOgbmcgdsOgIGPhu5l0IHThu5VuZw0KYGBgDQoNCmBgYHtyfQ0KIyAzLiBUw61uaCBSUg0Kcmlza3JhdGlvKGdtKQ0KYGBgDQoNCk5hbSBnaeG7m2kgY8OzIG5ndXkgY8ahIMSRw6Mga+G6v3QgaMO0biBjYW8gaMahbiBu4buvIGdp4bubaSBraG/huqNuZyA1LjclLiBWw6wgUlIgXD4gMSwgxJFp4buBdSBuw6B5IGNobyB0aOG6pXkgdOG7tyBs4buHIGvhur90IGjDtG4g4bufIG5hbSBjYW8gaMahbiBu4buvIHRyb25nIGThu68gbGnhu4d1IG7DoHkuDQoNClbhu5tpIHAtdmFsdWUgXDwgMC4wNSB2w6Aga2hv4bqjbmcgdGluIGPhuq15IGtow7RuZyBjaOG7qWEgMSwgY2jDum5nIHRhIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyAqKmLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcqKi5cDQpOaMawIHbhuq15LCAqKm5hbSBnaeG7m2kgY8OzIHThu7cgbOG7hyBr4bq/dCBow7RuIGNhbyBoxqFuIG7hu68gZ2nhu5tpKiogdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5Lg0KDQojIyA3LjMuIFThu7cgc+G7kSBDaMOqbmggKE9kZHMgUmF0aW8gLSBPUik6Og0KDQojIyMgNy4zLjEuIEdlbmRlciB2w6AgSG9tZW93bmVyOg0KDQpgYGB7cn0NCiMgVMOtbmggT1IgdsOgIGtob+G6o25nIHRpbiBj4bqteQ0Kb3JfZ2ggPC0gb2Rkc3JhdGlvKGdoLCBtZXRob2QgPSAid2FsZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0Kb3JfZ2gNCm9kZHNyYXRpbyhnaCwgbWV0aG9kID0gIndhbGQiLCBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQotICAgS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggT2RkcyBSYXRpbyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AgbmjGsCBzYXU6DQoNCiAgICAtICAgT2RkcyBSYXRpbyAoT1IpID0gMC45NTYNCg0KICAgIC0gICBLaG/huqNuZyB0aW4gY+G6rXkgOTUlOiB04burIDAuODk0IMSR4bq/biAxLjAyMw0KDQotICAgRGnhu4VuIGdp4bqjaToNCg0KICAgIC0gICBHacOhIHRy4buLIE9SID0gMC45NTYgY2hvIHRo4bqleSBvZGRzIChjxqEgaOG7mWkpIHPhu58gaOG7r3UgbmjDoCBj4bunYSBu4buvIHRo4bqlcCBoxqFuIG5hbSBraG/huqNuZyA0LjQlLiBUdXkgbmhpw6puLCBz4buxIGtow6FjIGJp4buHdCBsw6Agbmjhu48uDQoNCiAgICAtICAgRG8ga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaOG7qWEgZ2nDoSB0cuG7iyAxLCBuw6puOg0KDQogICAgICAgIC0gICBLaMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgZ2nhu5tpIHTDrW5oIOG6o25oIGjGsOG7n25nIMSR4bq/biBvZGRzIHPhu58gaOG7r3UgbmjDoC4NCg0KLSAgICoqS+G6v3QgbHXhuq1uOioqIE3hurdjIGTDuSBu4buvIGPDsyB24bq7IGPDsyBvZGRzIHPhu58gaOG7r3UgbmjDoCB0aOG6pXAgaMahbiBuYW0gbeG7mXQgY2jDunQsIG5oxrBuZyBz4buxIGtow6FjIGJp4buHdCBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gRG8gxJHDsywgZ2nhu5tpIHTDrW5oIGtow7RuZyBwaOG6o2kgbMOgIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IMSR4bq/biBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AgdHJvbmcgZOG7ryBsaeG7h3UgaGnhu4duIHThuqFpLg0KDQojIyMgNy4zLjIuIE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lcjoNCg0KYGBge3J9DQojIFTDrW5oIE9SIHbDoCBraG/huqNuZyB0aW4gY+G6rXkNCm9yX21oIDwtIG9kZHNyYXRpbyhtaCwgbWV0aG9kID0gIndhbGQiLCBjb25mLmxldmVsID0gMC45NSkNCm9yX21oDQpgYGANCg0KLSAgIE9kZHMgUmF0aW8gKE9SKSA9IDAuMjgzDQoNCi0gICBLaG/huqNuZyB0aW4gY+G6rXkgOTUlOiB04burIDAuMjYzIMSR4bq/biAwLjMwNA0KDQotICAgRGnhu4VuIGdp4bqjaToNCg0KICAgIC0gICBHacOhIHRy4buLIE9kZHMgUmF0aW8gMC4yODMgY8OzIG5naMSpYSBsw6Agb2RkcyBz4bufIGjhu691IG5ow6AgY+G7p2EgbmjDs20gbmfGsOG7nWkgxJHhu5ljIHRow6JuIGNo4buJIGLhurFuZyBraG/huqNuZyAyOC4zJSBvZGRzIGPhu6dhIG5ow7NtIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0bi4gTsOzaSBjw6FjaCBraMOhYywgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4gZ+G6p24gMy41IGzhuqduIHNvIHbhu5tpIG5nxrDhu51pIMSR4buZYyB0aMOibiAodsOsIDEvMC4yODPiiYgzLjUzKS4NCg0KICAgIC0gICBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBPZGRzIFJhdGlvIG7hurFtIGhvw6BuIHRvw6BuIGTGsOG7m2kgMSwgdOG7qyAwLjI2MyDEkeG6v24gMC4zMDQsIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Egb2RkcyBz4bufIGjhu691IG5ow6AgZ2nhu69hIGhhaSBuaMOzbSBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiB2w6Aga2jDtG5nIHBo4bqjaSBkbyBuZ+G6q3Ugbmhpw6puLg0KDQotICAgS+G6v3QgbHXhuq1uOg0KDQpE4buvIGxp4buHdSBjaG8gdGjhuqV5IHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiDhuqNuaCBoxrDhu59uZyByw7UgcsOgbmcgxJHhur9uIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoC4gTmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyBvZGRzIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuZ8aw4budaSDEkeG7mWMgdGjDom4sIHbDoCBraMOhYyBiaeG7h3QgbsOgeSBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiB24bubaSBt4bupYyDEkeG7mSB0aW4gY+G6rXkgOTUlLiDEkMOieSBsw6AgYuG6sW5nIGNo4bupbmcgY2hvIHRo4bqleSB2aeG7h2MgxJHDoyBr4bq/dCBow7RuIGPDsyBsacOqbiBxdWFuIGNo4bq3dCBjaOG6vSDEkeG6v24ga2jhuqMgbsSDbmcgc+G7nyBo4buvdSBuaMOgIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IG7DoHkuDQoNCiMjIyA3LjMuMy4gR2VuZGVyIHbDoCBNYXJpdGFsU3RhdHVzOg0KDQpgYGB7cn0NCiMgVMOtbmggT1IgdsOgIGtob+G6o25nIHRpbiBj4bqteQ0Kb3JfZ20gPC0gb2Rkc3JhdGlvKGdtLCBtZXRob2QgPSAid2FsZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0Kb3JfZ20NCmBgYA0KDQotICAgT2RkcyBSYXRpbyAoT1IpID0gMS4xMjENCg0KLSAgIEtob+G6o25nIHRpbiBj4bqteSA5NSU6IHThu6sgMS4wNDkgxJHhur9uIDEuMTk4DQoNCi0gICBEaeG7hW4gZ2nhuqNpOg0KDQogICAgLSAgIEdpw6EgdHLhu4sgT2RkcyBSYXRpbyAxLjEyMSBjw7MgbmdoxKlhIGzDoCBvZGRzIChjxqEgaOG7mWkpIMSRw6Mga+G6v3QgaMO0biBj4bunYSBu4buvIGNhbyBoxqFuIG9kZHMgxJHDoyBr4bq/dCBow7RuIGPhu6dhIG5hbSBraG/huqNuZyAxMi4xJSwgaGF5IG7Ds2kgY8OhY2gga2jDoWMsIG7hu68gY8OzIGto4bqjIG7Eg25nIMSRw6Mga+G6v3QgaMO0biBjYW8gaMahbiBuYW0ga2hv4bqjbmcgMS4xMiBs4bqnbi4NCg0KICAgIC0gICBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIHThu6sgMS4wNDkgxJHhur9uIDEuMTk4LCBraMO0bmcgY2jhu6lhIGdpw6EgdHLhu4sgMSwgY2jhu6luZyB04buPIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIMSQaeG7gXUgbsOgeSBuZ2jEqWEgbMOgIHbhu5tpIG3hu6ljIHRpbiBj4bqteSA5NSUsIGNow7puZyB0YSBjaOG6r2MgY2jhuq9uIHLhurFuZyB04bu3IGzhu4cgxJHDoyBr4bq/dCBow7RuIGPhu6dhIG7hu68gdsOgIG5hbSBraMO0bmcgYuG6sW5nIG5oYXUuDQoNCi0gICBL4bq/dCBsdeG6rW46DQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgbuG7ryBnaeG7m2kgY8OzIG9kZHMgxJHDoyBr4bq/dCBow7RuIGNhbyBoxqFuIG5hbSBnaeG7m2kga2hv4bqjbmcgMTIlLCB0xrDGoW5nIMSRxrDGoW5nIHbhu5tpIHZp4buHYyBu4buvIGPDsyBraOG6oyBuxINuZyDEkcOjIGvhur90IGjDtG4gZ+G6pXAgMS4xMiBs4bqnbiBzbyB24bubaSBuYW0gZ2nhu5tpLg0KDQoqKk5ndXkgY8ahIHTGsMahbmcgxJHhu5FpIChSUikqKiBsw6AgbeG7mXQgKnThu7cgc+G7kSBnaeG7r2EgaGFpIHThu7cgbOG7hyAocHJvcG9ydGlvbnMpKi4NCg0KJCQgUlIgPSBcZnJhY3tFRVJ9e0NFUn0gJCQNCg0KVHJvbmcgxJHDszoNCg0KLSAgICoqRUVSIChFeHBlcmltZW50YWwgRXZlbnQgUmF0ZSkqKjogVOG7tyBs4buHIHjhuqN5IHJhIHPhu7Ega2nhu4duIOG7nyBuaMOzbSBjYW4gdGhp4buHcA0KLSAgICoqQ0VSIChDb250cm9sIEV2ZW50IFJhdGUpKio6IFThu7cgbOG7hyB44bqjeSByYSBz4buxIGtp4buHbiDhu58gbmjDs20gxJHhu5FpIGNo4bupbmcNCg0KKipSUiBcPCAxKiogbuG6v3UgbmjDs20gbuG6sW0g4bufICoqdOG7rSBz4buRKiogY8OzIG5ndXkgY8ahIHjhuqN5IHJhIHPhu7Ega2nhu4duICoqdGjhuqVwIGjGoW4qKi4gxJDDonkgbMOgIMSRaeG7gXUgKiptb25nIG114buRbioqIG7hur91IHPhu7Ega2nhu4duIGzDoCAqKmvhur90IGPhu6VjIHjhuqV1KiogKHbDrSBk4bulOiB04butIHZvbmcpLg0KDQoqKlJSIFw+IDEqKiBu4bq/dSBuaMOzbSBu4bqxbSDhu58gKip04butIHPhu5EqKiBjw7Mgbmd1eSBjxqEgeOG6o3kgcmEgc+G7sSBraeG7h24gKipjYW8gaMahbioqLiDEkMOieSBsw6AgxJFp4buBdSAqKm1vbmcgbXXhu5FuKiogbuG6v3Ugc+G7sSBraeG7h24gbMOgICoqa+G6v3QgY+G7pWMgdOG7kXQqKiAodsOtIGThu6U6IGLhu48gdGh14buRYyBsw6EgdGjDoG5oIGPDtG5nKS4NCg==