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

Tập dữ liệu Supermarket Sales ghi nhận thông tin chi tiết về các giao dịch tại siêu thị, bao gồm danh mục sản phẩm, đơn giá, số lượng, thu nhập gộp, cùng với các đặc điểm nhân khẩu học của khách hàng như giới tính, phương thức thanh toán và loại thành viên. Tập dữ liệu phù hợp cho phân tích xu hướng bán hàng, hành vi tiêu dùng và hiệu suất doanh thu.

Mô tả Biến:

  • Invoice ID: Mã định danh duy nhất cho mỗi giao dịch.

  • Branch: Chi nhánh thực hiện giao dịch (A, B, C).

  • City: Thành phố nơi chi nhánh tọa lạc.

  • Customer Type: Phân loại khách hàng (Thành viên/Thông thường).

  • Gender: Giới tính khách hàng (Nam/Nữ).

  • Product Line: Danh mục sản phẩm.

  • Unit Price: Đơn giá mỗi sản phẩm.

  • Quantity: Số lượng sản phẩm mua.

  • Tax 5%: Thuế 5% trên tổng giá trị trước thuế.

  • Total: Tổng thanh toán (bao gồm thuế).

  • Payment: Phương thức thanh toán (Tiền mặt/Thẻ tín dụng/Thẻ ghi nợ).

  • COGS: Giá vốn hàng bán.

  • Gross Margin %: Tỷ suất lợi nhuận gộp.

  • Gross Income: Thu nhập gộp từ giao dịch.

  • Rating: Đánh giá của khách hàng (thang điểm 1–5).

1.1 Đọc file dữ liệu

d <- read.csv("D:/PTDLDT/Supermarket Sales.csv")
str(d)
## 'data.frame':    1000 obs. of  14 variables:
##  $ X                    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Branch               : chr  "A" "C" "A" "A" ...
##  $ City                 : chr  "Yangon" "Naypyitaw" "Yangon" "Yangon" ...
##  $ CustomerType         : chr  "Member" "Normal" "Normal" "Member" ...
##  $ Gender               : chr  "Female" "Female" "Male" "Male" ...
##  $ ProductLine          : chr  "Health and beauty" "Electronic accessories" "Home and lifestyle" "Health and beauty" ...
##  $ UnitPrice            : num  74.7 15.3 46.3 58.2 86.3 ...
##  $ Quantity             : int  7 5 7 8 7 7 6 10 2 3 ...
##  $ Tax.5.               : num  26.14 3.82 16.22 23.29 30.21 ...
##  $ Total                : num  549 80.2 340.5 489 634.4 ...
##  $ Payment              : chr  "Ewallet" "Cash" "Credit card" "Ewallet" ...
##  $ GrossMarginPercentage: num  4.76 4.76 4.76 4.76 4.76 ...
##  $ GrossIncome          : num  26.14 3.82 16.22 23.29 30.21 ...
##  $ Rating               : num  9.1 9.6 7.4 8.4 5.3 4.1 5.8 8 7.2 5.9 ...

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

dldt <- c("Branch", "City", "CustomerType", "Gender" ,"ProductLine", "Payment")
dldt
## [1] "Branch"       "City"         "CustomerType" "Gender"       "ProductLine" 
## [6] "Payment"

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':    1000 obs. of  6 variables:
##  $ Branch      : chr  "A" "C" "A" "A" ...
##  $ City        : chr  "Yangon" "Naypyitaw" "Yangon" "Yangon" ...
##  $ CustomerType: chr  "Member" "Normal" "Normal" "Member" ...
##  $ Gender      : chr  "Female" "Female" "Male" "Male" ...
##  $ ProductLine : chr  "Health and beauty" "Electronic accessories" "Home and lifestyle" "Health and beauty" ...
##  $ Payment     : chr  "Ewallet" "Cash" "Credit card" "Ewallet" ...

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

head(dt)
##   Branch      City CustomerType Gender            ProductLine     Payment
## 1      A    Yangon       Member Female      Health and beauty     Ewallet
## 2      C Naypyitaw       Normal Female Electronic accessories        Cash
## 3      A    Yangon       Normal   Male     Home and lifestyle Credit card
## 4      A    Yangon       Member   Male      Health and beauty     Ewallet
## 5      A    Yangon       Normal   Male      Sports and travel     Ewallet
## 6      C Naypyitaw       Normal   Male Electronic accessories     Ewallet
tail(dt)
##      Branch      City CustomerType Gender            ProductLine Payment
## 995       C Naypyitaw       Member Female Electronic accessories Ewallet
## 996       C Naypyitaw       Normal   Male      Health and beauty Ewallet
## 997       B  Mandalay       Normal Female     Home and lifestyle Ewallet
## 998       A    Yangon       Member   Male     Food and beverages    Cash
## 999       A    Yangon       Normal   Male     Home and lifestyle    Cash
## 1000      A    Yangon       Member Female    Fashion accessories    Cash

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)
##       Branch         City CustomerType       Gender  ProductLine      Payment 
##  "character"  "character"  "character"  "character"  "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 Branch

Bảng tần số

#Lập bảng tần số biến Branch
table(dt$Branch)
## 
##   A   B   C 
## 340 332 328

Bảng tần suất

#Lập bảng tần suất của biến Branch
table(dt$Branch)/sum(nrow(dt))
## 
##     A     B     C 
## 0.340 0.332 0.328

Biểu đồ

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

# Vẽ biểu đồ tròn
pie(Branch_freq,
    main   = "Phân bố chi nhánh",
    labels = paste0(names(Branch_freq),
                    " (", round(Branch_pct*100, 1), "%)"),
    col    = c("lightpink", "green","lightblue"))

Nhận xét

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

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

2.2 Biến City

Bảng tần số

#Lập bảng tần số của biến City
table(dt$City)
## 
##  Mandalay Naypyitaw    Yangon 
##       332       328       340

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))
## 
##  Mandalay Naypyitaw    Yangon 
##     0.332     0.328     0.340

Biểu đồ

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

# Vẽ biểu đồ tròn
pie(City_freq,
    main   = "Phân bố thành phố",
    labels = paste0(names(City_freq),
                    " (", round(City_pct*100, 1), "%)"),
    col    = c("red", "blue","yellow"))

Nhận xét

Trong bộ dữ liệu này, thành phố có tỷ lệ giao dịch cao nhất là Yangon với khoảng 34%, tiếp theo là Mandalay (33.2%), cuối cùng là Naypyitaw (32.8%).

Dữ liệu này cho thấy các giao dịch phân bố khá đồng đều ở các thành phố vì tỷ lệ giữa các thành phố không chênh lệch nhau nhiều.

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.3 Biến CustomerType

Bảng tần số

#Lập bảng tần số biến CustomerType
table(dt$CustomerType)
## 
## Member Normal 
##    501    499

Bảng tần suất

#Lập bảng tần suất của biến CustomerType
table(dt$CustomerType)/sum(nrow(dt))
## 
## Member Normal 
##  0.501  0.499

Biểu đồ

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
ggplot(dt, aes(x = CustomerType)) +
  geom_bar(fill = "red") +
  theme_minimal() +
  labs(title = "Biểu đồ phân loại khách hàng", x = "Loại khách hàng", y = "Tần suất")

Nhận xét

Vậy trong bộ dữ liệu này có 50.1 % khách hàng là thành viên và 49.9% khách hàng bình thường.

2.4 Biến Gender

Bảng tần số

#Lập bảng tần số biến Gender
table(dt$Gender)
## 
## Female   Male 
##    501    499

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))
## 
## Female   Male 
##  0.501  0.499

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",
    labels = paste0(names(Gender_freq),
                    " (", round(Gender_pct*100, 1), "%)"),
    col    = c("lightpink","lightblue"))

Nhận xét

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

2.5 Biến ProductLine

Bảng tần số

#Lập bảng tần số của biến ProductLine
table(dt$ProductLine)
## 
## Electronic accessories    Fashion accessories     Food and beverages 
##                    170                    178                    174 
##      Health and beauty     Home and lifestyle      Sports and travel 
##                    152                    160                    166

Bảng tần suất

#Lập bảng tần suất của biến ProductLine
table(dt$ProductLine)/sum(nrow(dt))
## 
## Electronic accessories    Fashion accessories     Food and beverages 
##                  0.170                  0.178                  0.174 
##      Health and beauty     Home and lifestyle      Sports and travel 
##                  0.152                  0.160                  0.166

Biểu đồ

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

Nhận xét

Trong tập dữ liệu, nhóm sản phẩm có tỷ lệ giao dịch cao nhất là Fashion accessories với 17.8%, theo sau là Food and beverages (17.4%) và Electronic accessories (17%). Ngược lại, nhóm Health and beauty (15.2%) và Home and lifestyle (16%), Home and lifestyle với (16%) có tỷ lệ thấp hơn, cho thấy sự ưu tiên của khách hàng đối với các sản phẩm thời trang và tiêu dùng thiết yếu.

2.6 Biến Payment

Bảng tần số

#Lập bảng tần số của biến Payment
table(dt$Payment)
## 
##        Cash Credit card     Ewallet 
##         344         311         345

Bảng tần suất

#Lập bảng tần suất của biến Payment
table(dt$Payment)/sum(nrow(dt))
## 
##        Cash Credit card     Ewallet 
##       0.344       0.311       0.345

Biểu đồ

library(ggplot2)
ggplot(dt, aes(x = Payment)) +
  geom_bar(fill = "orange") +
  theme_minimal() +
  labs(title = "Biểu đồ phân loại phương thức thanh toán", x = "Phương thức thanh toán", y = "Tần suất")

Nhận xét Trong bộ dữ liệu này, phương thức thanh toán có tỷ lệ giao dịch cao nhất là Ewallet với khoảng 34.5%, tiếp theo là Cash (34.4%), cuối cùng là Credit card (31.1%).

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: “Female” (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 == "Female")

#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 = 0.004, df = 1, p-value = 0.9496
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4700658 0.5319265
## sample estimates:
##     p 
## 0.501
  • Ý 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 47.01% đến 53.19%. Đ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 = 0.004, df = 1, p-value = 0.9496
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4700658 0.5319265
## sample estimates:
##     p 
## 0.501
  • Giá trị thống kê chi bình phương: 0.004, với bậc tự do = 1

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

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

  • p-value = 0.9496 > 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: Không có bằng chứng thống kê để cho rằng tỷ lệ khách hàng nữ khác 50%. Tỷ lệ nữ trong mẫu xấp xỉ 50%, cho thấy phân bố giới tính trong dữ liệu là cân bằng và không có sai khác có ý nghĩa thống kê.

3.2 Biến 2: CustomerType - Hạng mục quan tâm: “Normal” (Bình thường)

Ước lượng khoảng tin cậy 95% cho tỷ lệ “Bình thường”

#Số khách hàng bình thường
n_normal <- sum(dt$CustomerType == "Normal")
#Tổng số quan sát
n_total <- nrow(dt)

#Tính khoảng tin cậy 95%
prop.test(n_normal, n_total, correct = FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_normal out of n_total, null probability 0.5
## X-squared = 0.004, df = 1, p-value = 0.9496
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4680735 0.5299342
## sample estimates:
##     p 
## 0.499
  • Ý nghĩa: Với độ tin cậy 95%, ta ước lượng rằng tỷ lệ khách hàng là bình thường trong tổng thể nằm trong khoảng 46.81% đến 52.99%.

Kiểm định giả thuyết

Đặt giả thuyết:

  • \(H_0\): Tỷ lệ khách hàng bình thường = 0.5

  • \(H_1\): Tỷ lệ khách hàng bình thường ≠ 0.5

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

  • Tỷ lệ mẫu (p̂): 0.499 → tức khoảng 49.9% khách hàng là bình thường.

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

  • p-value = 0.9496 > 0.05Không đủ cơ sở để bác bỏ giả thuyết H₀.

  • Kết luận: Không có bằng chứng thống kê để cho rằng tỷ lệ khách hàng không phải thành viên khác 50%. Tỷ lệ này xấp xỉ 50%, cho thấy phân bố giữa khách hàng là thành viên và không thành viên gần như cân bằng, không có sai khác có ý nghĩa thống kê.

3.3 Biến 3: Payment - Hạng mục quan tâm: “Cash” (Tiền mặt)

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

#Số lượng phương thức thanh toán "Cash"
n_cash <-sum(dt$Payment == "Cash")

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


#Tính khoảng tin cậy 95%
prop.test(n_cash, n_total, correct = FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_cash out of n_total, null probability 0.5
## X-squared = 97.344, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3152045 0.3739895
## sample estimates:
##     p 
## 0.344
  • Ý nghĩa: Với độ tin cậy 95%, ta ước lượng rằng tỷ lệ phương thức thanh toán là tiền mặt trong dữ liệu là 34.4% và nằm trong khoảng từ 31.52% đến 37.40%.

Kiểm định giả thuyết

Đặt giả thuyết:

  • \(H_0\): Tỷ lệ phương thức thanh toán là tiền mặt ≤ 0.35

  • \(H_1\): Tỷ lệ phương thức thanh toán là tiền mặt > 0.35

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

  • Tỷ lệ mẫu (p̂): 0.344 → khoảng 34.4% phương thức thanh toán tiền mặt.

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

  • p-value = 0.6546 > 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ệ khách hàng thanh toán bằng tiền mặt không khác biệt có ý nghĩa thống kê so với 35%. Nói cách khác, tỷ lệ thanh toán tiền mặt khoảng 34.4% là phù hợp với giả thuyết ban đầu.

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à Payment

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

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

#Xem bảng chéo
prop.table(bts_gender_payment, margin = 1) * 100  # Tính theo hàng
##         
##              Cash Credit card  Ewallet
##   Female 35.52894    32.53493 31.93613
##   Male   33.26653    29.65932 37.07415
  • Bảng tần suất chéo được tính để so sánh cơ cấu phương thức thanh toán theo giới tính.

  • Tỷ lệ phần trăm tính theo hàng → giúp xem nam và nữ thanh toán bằng phương thức nào nhiều hơn trong nhóm của họ.

  • Nhận xét:

    • Phụ nữ ưu tiên sử dụng tiền mặt (Cash) nhiều nhất với tỷ lệ khoảng 35.53%, cao hơn so với nam giới (33.27%). Điều này cho thấy phụ nữ có xu hướng dùng tiền mặt nhiều hơn trong các giao dịch.

    • Ngược lại, nam giới có xu hướng sử dụng ví điện tử (Ewallet) nhiều hơn, chiếm khoảng 37.07%, so với tỷ lệ của nữ là 31.94%. Điều này có thể phản ánh sự chấp nhận công nghệ thanh toán điện tử cao hơn ở nam giới.

    • Tỷ lệ sử dụng thẻ tín dụng (Credit Card) tương đối thấp và gần như tương đương giữa hai giới, với nữ khoảng 32.53% và nam khoảng 29.66%. Điều này cho thấy thẻ tín dụng không phải là phương thức phổ biến nhất đối với cả hai nhóm giới tính.

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_tt <- as.data.frame(bts_gender_payment)
colnames(gt_tt) <- c("Gender", "Payment", "Count")

# Vẽ biểu đồ
library(ggplot2)
ggplot(gt_tt, aes(Gender, Count, fill = Payment)) + 
  geom_bar(stat = "identity", position = "dodge") + 
  labs(title = "Cơ cấu phương thức thanh toán theo giới tính",
       x = "Giới tính", y = "Số lượng", fill = "Phương thức thanh toán") + 
  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ữ (Female): Sử dụng phương thức thanh toán bằng tiền mặt (Cash) và thẻ tín dụng (Credit card) có tỷ lệ tương đương, trong khi ví điện tử (Ewallet) có tỷ lệ thấp hơn.
  • Nam (Male): Tương tự như nữ, nhưng tỷ lệ sử dụng ví điện tử có vẻ cao 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à phương thức thanh toán. Cụ thể, cả nữ và nam đều có xu hướng sử dụng tiền mặt và thẻ tín dụng tương đương, nhưng nam có xu hướng sử dụng ví điện tử cao hơn nữ.

Xu hướng:

  • Xu hướng cho thấy rằng cả phụ nữ và nam giới đều ưa chuộng sử dụng tiền mặt và thẻ tín dụng, tuy nhiên, nam giới có thể có xu hướng sử dụng ví điện tử nhiều hơn phụ 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à phương thức thanh toán là hai biến độc lập.

  • H₁: Giới tính và phương thức thanh toán 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_gender_payment <- table(dt$Gender, dt$Payment)
btso_gender_payment
##         
##          Cash Credit card Ewallet
##   Female  178         163     160
##   Male    166         148     185
chi_test <- chisq.test(btso_gender_payment)
chi_test
## 
##  Pearson's Chi-squared test
## 
## data:  btso_gender_payment
## X-squared = 2.9497, df = 2, p-value = 0.2288

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

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

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

  • Giá trị p: 0.2288

Kết luận:

  • Dựa vào giá trị p (0.2288) và mức ý nghĩa α = 0.05. Vì p-value = 0.2288 > 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à phương thức thanh toán) 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 sử dụng phương thức thanh toán của hai giới. Cụ thể, nam giới có thể có xu hướng sử dụng ví điện tử cao hơn, trong khi phụ nữ lại ưa chuộng tiền mặt và thẻ tín dụng hơn.

4.2 City và CustomerType

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

#Tạo bảng chéo
bts_city_customertype <- table(dt$City, dt$CustomerType)/sum(nrow(dt))

#Xem bảng chéo
prop.table(bts_city_customertype, margin = 1) * 100  # Tính theo hàng
##            
##               Member   Normal
##   Mandalay  49.69880 50.30120
##   Naypyitaw 51.52439 48.47561
##   Yangon    49.11765 50.88235
  • Bảng tần suất chéo được tính để so sánh cơ cấu thành phố theo tình trạng khách hàng.

  • Tỷ lệ phần trăm tính theo hàng → giúp xem người đến từ Mandalay, Naypyitaw và Yangon là khách hàng thành viên nhiều hơn trong nhóm của họ như thế nào.

Nhận xét:

  • Mandalay: Tỷ lệ người hội viên (Member) là 49.70%, trong khi tỷ lệ người bình thường (Normal) là 50.30%. Điều này cho thấy sự phân bố gần như đồng đều giữa hai nhóm, tuy nhiên, nhóm người bình thường có tỷ lệ cao hơn một chút.

  • Naypyitaw: Tỷ lệ người hội viên cao hơn đáng kể (51.52%) so với người bình thường (48.48%). Điều này cho thấy rằng người hội viên có khả năng tham gia vào các hoạt động hoặc dịch vụ cao hơn so với người bình thường.

  • Yangon: Tỷ lệ người hội viên là 49.12%, trong khi tỷ lệ người bình thường là 50.88%. Tương tự như Mandalay, sự phân bố giữa hai nhóm là gần như đồng đều, với nhóm người bình thường chiếm ưu thế hơn.

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
tp_kh <- as.data.frame(bts_city_customertype)
colnames(tp_kh) <- c("City", "CustomerType", "Count")

# Vẽ biểu đồ
library(ggplot2)
ggplot(tp_kh, aes(City, Count, fill = CustomerType)) + 
  geom_bar(stat = "identity", position = "dodge") + 
  labs(title = "Cơ cấu loại khách hàng theo thành phố",
       x = "Thành phố", y = "Số lượng", fill = "Loại khách hàng") + 
  theme_minimal()

4.2.3 Nhận xét mô tả

Nhận xét về mối quan hệ: Có sự liên kết giữa hai biến: Tỷ lệ khách hàng hội viên (Member) cao hơn ở thành phố Naypyitaw so với hai thành phố còn lại. Điều này cho thấy rằng sự tham gia của khách hàng vào các dịch vụ hoặc chương trình có thể bị ảnh hưởng bởi vị trí địa lý.

Xu hướng:

  • Thành phố Mandalay: Tỷ lệ khách hàng hội viên và khách hàng bình thường (Normal) gần như tương đương, cho thấy sự phân bố khách hàng khá đồng đều giữa hai nhóm.

  • Thành phố Naypyitaw: Tỷ lệ khách hàng hội viên chiếm ưu thế rõ rệt (51.52%), cho thấy rằng người dân ở đây có xu hướng tham gia nhiều hơn vào các chương trình khách hàng.

  • Thành phố Yangon: Tương tự như Mandalay, tỷ lệ giữa hai nhóm khách hàng là khá đồng đều, với khách hàng bình thường có tỷ lệ cao hơn một chút.

Kết luận: Có vẻ như có một sự liên kết giữa thành phố và loại khách hàng, với thành phố Naypyitaw cho thấy tỷ lệ khách hàng hội viên cao hơn. Điều này có thể phản ánh sự khác biệt trong nhu cầu hoặc quyền lợi của khách hàng ở từng khu vực, với Naypyitaw có thể cung cấp nhiều dịch vụ hấp dẫn hơn cho khách hàng hội viê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₀: Loại khách hàng và thành phố là hai biến độc lập.

  • H₁: Loại khách hàng và thành phố 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_city_customertype <- table(dt$City, dt$CustomerType)
btso_city_customertype
##            
##             Member Normal
##   Mandalay     165    167
##   Naypyitaw    169    159
##   Yangon       167    173
chi_test <- chisq.test(btso_city_customertype)
chi_test
## 
##  Pearson's Chi-squared test
## 
## data:  btso_city_customertype
## X-squared = 0.41881, df = 2, p-value = 0.8111

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

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

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

  • Giá trị p: < 0.8111

Kết luận: Dựa vào giá trị p (0.8111) và mức ý nghĩa α = 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 (thành phố và loại khách hàng) là độc lập với nhau ở mức ý nghĩa 0.05.

Kết quả này cho thấy không có mối liên hệ có ý nghĩa thống kê giữa thành phố và loại khách hàng. Điều này cho thấy hai điểm chính:

  • Các loại khách hàng (hội viên và bình thường) không bị ảnh hưởng bởi vị trí địa lý, cho thấy rằng dịch vụ và sản phẩm có thể được tiếp cận đồng đều ở các thành phố khác nhau.

  • Sự tham gia của khách hàng vào các chương trình hội viên có thể phụ thuộc vào các yếu tố khác ngoài địa lý, như nhu cầu cá nhân hoặc tính hấp dẫn của các ưu đãi, hơn là sự khác biệt giữa các thành phố.

4.3 CustomerType và Payment

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

#Tạo bảng chéo
bts_customertype_payment <- table(dt$CustomerType, dt$Payment)/sum(nrow(dt))


#Xem bảng chéo
prop.table(bts_customertype_payment, margin = 1) * 100  # Tính theo hàng
##         
##              Cash Credit card  Ewallet
##   Member 33.53293    34.33134 32.13573
##   Normal 35.27054    27.85571 36.87375

Dữ liệu cho thấy tỷ lệ sử dụng các phương thức thanh toán (Cash, Credit card, Ewallet) giữa hai nhóm khách hàng (Member và Normal). Xu hướng chính:

  • Nhóm khách hàng hội viên (Member): Tỷ lệ sử dụng tiền mặt là 33.53%, thẻ tín dụng là 34.33%, và ví điện tử là 32.14%. Điều này cho thấy rằng khách hàng hội viên có sự phân bố tương đối đồng đều trong việc lựa chọn các phương thức thanh toán.

  • Nhóm khách hàng bình thường (Normal): Tỷ lệ sử dụng tiền mặt cao hơn (35.27%) so với thẻ tín dụng (27.86%), trong khi tỷ lệ sử dụng ví điện tử là 36.87%. Điều này cho thấy rằng khách hàng bình thường có xu hướng ưa chuộng sử dụng tiền mặt và ví điện tử hơn là thẻ tín dụng.

  • So sánh giữa hai nhóm: Nhìn chung, nhóm khách hàng bình thường có tỷ lệ sử dụng tiền mặt và ví điện tử cao hơn nhóm hội viên. Điều này có thể phản ánh sự khác biệt trong thói quen chi tiêu và sự ưu tiên của từng nhóm khách hàng đối với các phương thức thanh toán khác nhau.

# Chuyển sang dataframe
kh_tt <- as.data.frame(bts_customertype_payment)
colnames(kh_tt) <- c("CustomerType","Payment", "Count")

# Vẽ biểu đồ
library(ggplot2)
ggplot(kh_tt, aes(CustomerType, Count , fill = Payment)) + 
  geom_bar(stat = "identity", position = "dodge") + 
  labs(title = "Cơ cấu phương thức thanh toán theo loại khách hàng",
       x = "Loại khách hàng", y = "Số lượng", fill = "Phương thức thanh toán") + 
  theme_minimal()

4.3.3 Nhận xét Mô tả

Biểu đồ thể hiện tỷ lệ sử dụng các phương thức thanh toán (Cash, Credit card, Ewallet) theo từng nhóm khách hàng (Member và Normal). Dưới đây là một số nhận xét chính:

Xu hướng chung:

  • Tỷ lệ sử dụng tiền mặt (Cash) và ví điện tử (Ewallet) có xu hướng cao hơn trong nhóm khách hàng bình thường (Normal) so với nhóm hội viên (Member). Điều này cho thấy rằng khách hàng bình thường có thể ưu tiên các phương thức thanh toán truyền thống hơn.

  • Nhóm khách hàng hội viên (Member): Tỷ lệ sử dụng thẻ tín dụng (Credit card) cao nhất (34.33%), cho thấy rằng khách hàng hội viên có xu hướng tin tưởng vào các phương thức thanh toán không tiền mặt hơn.

  • Nhóm khách hàng bình thường (Normal): Tỷ lệ sử dụng ví điện tử cao nhất (36.87%), cho thấy rằng họ có thể ưa chuộng sự tiện lợi và nhanh chóng mà ví điện tử mang lại. Tuy nhiên, tỷ lệ sử dụng thẻ tín dụng trong nhóm này lại thấp hơn (27.86%).

Kết luận:

Có một sự khác biệt rõ ràng trong thói quen sử dụng phương thức thanh toán giữa hai nhóm khách hàng. Nhóm hội viên có xu hướng sử dụng thẻ tín dụng nhiều hơn, trong khi nhóm bình thường lại ưa chuộng tiền mặt và ví điện tử. Biểu đồ này giúp minh họa rõ ràng mối quan hệ giữa loại khách hàng và phương thức thanh toán, cho thấy rằng sở thích thanh toán có thể bị ảnh hưởng bởi tình trạng hội viên của khách hàng.

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

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

  • H₀: Loại khách hàng và phương thức thanh toán là hai biến độc lập.

  • H₁: Loại khách hàng và phương thức thanh toán 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_customertype_payment <- table(dt$CustomerType, dt$Payment)
btso_customertype_payment
##         
##          Cash Credit card Ewallet
##   Member  168         172     161
##   Normal  176         139     184
chi_test <- chisq.test(btso_customertype_payment)
chi_test
## 
##  Pearson's Chi-squared test
## 
## data:  btso_customertype_payment
## X-squared = 5.217, df = 2, p-value = 0.07364

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

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

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

  • Giá trị p: < 0.07364

Kết luận: Dựa vào giá trị p (0.07364) và mức ý nghĩa α = 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 (loại khách hàng và phương thức thanh toán) là độc lập với nhau ở mức ý nghĩa 0.05.

Nói cách khác, không có mối liên hệ có ý nghĩa thống kê giữa loại khách hàng và phương thức thanh toán. Kết quả này cho thấy rằng sự lựa chọn phương thức thanh toán không bị ảnh hưởng rõ rệt bởi việc khách hàng là hội viên hay bình thường, và có thể cho thấy rằng các yếu tố khác như thói quen chi tiêu hoặc sở thích cá nhân có thể đóng vai trò quan trọng hơn trong quyết định thanh toán của họ.

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

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

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

# Bảng chéo giữa Gender và CustomerType
mh <- table(dt$Gender, dt$CustomerType) 
addmargins(mh)
##         
##          Member Normal  Sum
##   Female    261    240  501
##   Male      240    259  499
##   Sum       501    499 1000

Kiểm định: - H₀: Tỷ lệ là hội viên giữa nữ và nam là bằng nhau. (p₁ - p₂ =0 ) - H₁: Tỷ lệ là hội viên của nữ cao hơn tỷ lệ của nam.(p₁ - p₂ > 0)

Tính toán Tỷ lệ

  • Tỷ lệ nữ là hội viên:
    • \[ p_1^{\text{Member}} = \frac{261}{501} \quad \text{(tỷ lệ nữ là hội viên)} \]
  • Tỷ lệ nam là hội viên:
    • \[ p_2^{\text{Member}} = \frac{240}{499} \quad \text{(tỷ lệ nam là hội viên)} \]

Tính hiệu hai tỷ lệ

  • \[ d^{\text{Member}} = p_1^{\text{Member}} - p_2^{\text{Member}} \]
counts1 <- c(mh["Female", "Member"], mh["Male", "Member"])
totals1 <- c(sum(mh["Female", ]), sum(mh["Male", ]))

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 = 1.5997, df = 1, p-value = 0.103
## alternative hypothesis: greater
## 95 percent confidence interval:
##  -0.01197707  1.00000000
## sample estimates:
##    prop 1    prop 2 
## 0.5209581 0.4809619
  • prop 1 (p1) = 0.5209581: tỷ lệ nữ là hội viên khoảng 52.10%

  • prop 2 (p2) = 0.4809619: tỷ lệ nam là hội viên khoảng 48.10%

  • P-value = 0.103

Giá trị p-value thu được là 0.103, 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ệ hội viên của nữ và nam. Không có bằng chứng cho thấy tỷ lệ nữ hội viên cao hơn tỷ lệ nam.

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

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

mh <- table(dt$Gender, dt$CustomerType)
#Thêm tổng hàng và cột
mh1 <- addmargins(mh)
mh1
##         
##          Member Normal  Sum
##   Female    261    240  501
##   Male      240    259  499
##   Sum       501    499 1000
library(epitools)
riskratio(mh, method="wald")
## $data
##         
##          Member Normal Total
##   Female    261    240   501
##   Male      240    259   499
##   Total     501    499  1000
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate     lower    upper
##   Female 1.000000        NA       NA
##   Male   1.083492 0.9567649 1.227005
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.2068311    0.2294743  0.2059467
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Nhóm nữ (Female) đượ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ơ trở thành hội viên của nhóm nam (M) với nhóm nữ.

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

Tỷ lệ hội viên ở nam bằng khoảng 108.35% so với nữ. Hay nói cách khác, nguy cơ (xác suất) trở thành hội viên của nam cao hơn nữ khoảng 8.35%.

Khoảng tin cậy 95% của RR là (0.9567649 – 1.227005):

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ệ hội viên ở Nam và Nữ không khác nhau, tức là RR = 1.

H₁: Tỷ lệ hội viên ở 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.2068311 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.2294743 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.2059467 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 trở thành hội viên.

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

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

5.3.1. Gender và CustomerType:

# Tính OR và khoảng tin cậy
or_mh <- oddsratio(mh, method = "wald", conf.level = 0.95)
or_mh
## $data
##         
##          Member Normal Total
##   Female    261    240   501
##   Male      240    259   499
##   Total     501    499  1000
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate    lower   upper
##   Female 1.000000       NA      NA
##   Male   1.173594 0.915718 1.50409
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.2068311    0.2294743  0.2059467
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
oddsratio(mh, method = "wald", conf.level = 0.95)
## $data
##         
##          Member Normal Total
##   Female    261    240   501
##   Male      240    259   499
##   Total     501    499  1000
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate    lower   upper
##   Female 1.000000       NA      NA
##   Male   1.173594 0.915718 1.50409
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.2068311    0.2294743  0.2059467
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
oddsratio(mh, method = "wald", conf.level = 0.95)
## $data
##         
##          Member Normal Total
##   Female    261    240   501
##   Male      240    259   499
##   Total     501    499  1000
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate    lower   upper
##   Female 1.000000       NA      NA
##   Male   1.173594 0.915718 1.50409
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.2068311    0.2294743  0.2059467
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Odds Ratio (OR) = 1.173594

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

Giá trị OR = 1.173594 cho thấy odds (cơ hội) trở thành hội viên của nam cao hơn nữ khoảng 17.36%. Tuy nhiên, sự khác biệt này không lớn.

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 trở thành hội viên.

Kết luận: Mặc dù nam có vẻ có odds trở thành hội viên cao hơn nữ 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 trở thành hội viên trong dữ liệu hiện tại.

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

Trong phân tích này, chúng ta đã khám phá hành vi mua sắm của khách hàng qua tập dữ liệu Supermarket Sales. Một số kết luận chính như sau:

6.1 Tổng quan về kết quả

Biến định tính: Tỷ lệ nữ và nam trong mẫu gần như bằng nhau, cho thấy không có thiên lệch giới tính.

Mối quan hệ giữa các biến: Không có mối liên hệ có ý nghĩa giữa giới tính, phương thức thanh toán và vị trí địa lý, cho thấy yếu tố khác có thể ảnh hưởng lớn hơn.

Phương thức thanh toán: Ewallet là phương thức chính được ưa chuộng, phản ánh xu hướng sử dụng công nghệ thanh toán điện tử.

6.2 Thảo luận

Kết quả chỉ ra rằng:

Yếu tố bên ngoài: Các yếu tố như chương trình khuyến mãi và thương hiệu cần được nghiên cứu thêm để hiểu rõ hơn về hành vi mua sắm.

Phân khúc khách hàng: Nghiên cứu theo độ tuổi và thu nhập có thể cung cấp thông tin quý giá.

Thời gian và xu hướng: Nghiên cứu dài hạn sẽ giúp theo dõi sự thay đổi trong hành vi tiêu dùng.

6.3 Kết luận

Phân tích đã giúp hiểu rõ hơn về hành vi tiêu dùng tại siêu thị. Dù có một số xu hướng nhất định, nhiều yếu tố khác cũng cần xem xét để phát triển chiến lược kinh doanh hiệu quả hơn. Hy vọng nghiên cứu tiếp theo sẽ khám phá sâu hơn vấn đề này, cung cấp thông tin giá trị cho ngành bán lẻ.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSB0deG6p24gNCINCmF1dGhvcjogIkxhbSBUYW0gTmh1Ig0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keSB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgc2Fucy1zZXJpZjsNCiAgZm9udC1zaXplOiAxNnB4Ow0KICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICBsaW5lLWhlaWdodDogMS41Ow0KfQ0KaDEgew0KICBjb2xvcjogYmxhY2s7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KaDIgew0KICBjb2xvcjogcmVkOw0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCmgzIHsNCiAgY29sb3I6IGRhcmtibHVlOw0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCjwvc3R5bGU+DQpgYGANCiMgUGjhuqduIDE6IFTDrG0gaGnhu4N1IHbDoCBDaHXhuqluIGLhu4sgROG7ryBsaeG7h3UNCg0KVOG6rXAgZOG7ryBsaeG7h3UgU3VwZXJtYXJrZXQgU2FsZXMgZ2hpIG5o4bqtbiB0aMO0bmcgdGluIGNoaSB0aeG6v3QgduG7gSBjw6FjIGdpYW8gZOG7i2NoIHThuqFpIHNpw6p1IHRo4buLLCBiYW8gZ+G7k20gZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0sIMSRxqFuIGdpw6EsIHPhu5EgbMaw4bujbmcsIHRodSBuaOG6rXAgZ+G7mXAsIGPDuW5nIHbhu5tpIGPDoWMgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jIGPhu6dhIGtow6FjaCBow6BuZyBuaMawIGdp4bubaSB0w61uaCwgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHbDoCBsb+G6oWkgdGjDoG5oIHZpw6puLiBU4bqtcCBk4buvIGxp4buHdSBwaMO5IGjhu6NwIGNobyBwaMOibiB0w61jaCB4dSBoxrDhu5tuZyBiw6FuIGjDoG5nLCBow6BuaCB2aSB0acOqdSBkw7luZyB2w6AgaGnhu4d1IHN14bqldCBkb2FuaCB0aHUuDQoNCk3DtCB04bqjIEJp4bq/bjoNCg0KLSAgIEludm9pY2UgSUQ6IE3DoyDEkeG7i25oIGRhbmggZHV5IG5o4bqldCBjaG8gbeG7l2kgZ2lhbyBk4buLY2guDQoNCi0gICBCcmFuY2g6IENoaSBuaMOhbmggdGjhu7FjIGhp4buHbiBnaWFvIGThu4tjaCAoQSwgQiwgQykuDQoNCi0gICBDaXR5OiBUaMOgbmggcGjhu5EgbsahaSBjaGkgbmjDoW5oIHThu41hIGzhuqFjLg0KDQotICAgQ3VzdG9tZXIgVHlwZTogUGjDom4gbG/huqFpIGtow6FjaCBow6BuZyAoVGjDoG5oIHZpw6puL1Row7RuZyB0aMaw4budbmcpLg0KDQotICAgR2VuZGVyOiBHaeG7m2kgdMOtbmgga2jDoWNoIGjDoG5nIChOYW0vTuG7rykuDQoNCi0gICBQcm9kdWN0IExpbmU6IERhbmggbeG7pWMgc+G6o24gcGjhuqltLg0KDQotICAgVW5pdCBQcmljZTogxJDGoW4gZ2nDoSBt4buXaSBz4bqjbiBwaOG6qW0uDQoNCi0gICBRdWFudGl0eTogU+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gbXVhLg0KDQotICAgVGF4IDUlOiBUaHXhur8gNSUgdHLDqm4gdOG7lW5nIGdpw6EgdHLhu4sgdHLGsOG7m2MgdGh14bq/Lg0KDQotICAgVG90YWw6IFThu5VuZyB0aGFuaCB0b8OhbiAoYmFvIGfhu5NtIHRodeG6vykuDQoNCi0gICBQYXltZW50OiBQaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gKFRp4buBbiBt4bq3dC9UaOG6uyB0w61uIGThu6VuZy9UaOG6uyBnaGkgbuG7oykuDQoNCi0gICBDT0dTOiBHacOhIHbhu5FuIGjDoG5nIGLDoW4uDQoNCi0gICBHcm9zcyBNYXJnaW4gJTogVOG7tyBzdeG6pXQgbOG7o2kgbmh14bqtbiBn4buZcC4NCg0KLSAgIEdyb3NzIEluY29tZTogVGh1IG5o4bqtcCBn4buZcCB04burIGdpYW8gZOG7i2NoLg0KDQotICAgUmF0aW5nOiDEkMOhbmggZ2nDoSBj4bunYSBraMOhY2ggaMOgbmcgKHRoYW5nIMSRaeG7g20gMeKAkzUpLg0KDQojIyAxLjEgxJDhu41jIGZpbGUgZOG7ryBsaeG7h3UNCg0KYGBge3J9DQpkIDwtIHJlYWQuY3N2KCJEOi9QVERMRFQvU3VwZXJtYXJrZXQgU2FsZXMuY3N2IikNCmBgYA0KDQpgYGB7cn0NCnN0cihkKQ0KYGBgDQoNCiMjIDEuMiBDaOG7jW4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0KDQpgYGB7cn0NCmRsZHQgPC0gYygiQnJhbmNoIiwgIkNpdHkiLCAiQ3VzdG9tZXJUeXBlIiwgIkdlbmRlciIgLCJQcm9kdWN0TGluZSIsICJQYXltZW50IikNCmRsZHQNCmBgYA0KDQojIyAxLjMgVOG6oW8gYuG7mSBk4buvIGxp4buHdSBt4bubaSBjaOG7iSBjaOG7qWEgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0KDQpgYGB7cn0NCmR0IDwtIGRbLCBkbGR0XQ0KYGBgDQoNCiMjIDEuNCBYZW0gY+G6pXUgdHLDumMgZOG7ryBsaeG7h3UNCg0KYGBge3J9DQpzdHIoZHQpDQpgYGANCg0KIyMgMS41IFhlbSB0csaw4bubYyBk4buvIGxp4buHdSBt4buZdCB2w6BpIGTDsm5nIMSR4bqndSB2w6AgY3Xhu5FpDQoNCmBgYHtyfQ0KaGVhZChkdCkNCmBgYA0KDQpgYGB7cn0NCnRhaWwoZHQpDQpgYGANCg0KIyMgMS42IEtp4buDbSB0cmEgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkNCg0KYGBge3J9DQphbnkoaXMubmEoZHQpKQ0KYGBgDQoNCkvhur90IHF14bqjIGhp4buHbiB0aOG7iyAiRkFMU0UiLCB24bqteSBk4buvIGxp4buHdSBraMO0bmcgY8OzIGdpw6EgdHLhu4sgYuG7iyB0aGnhur91Lg0KDQojIyAxLjcgS2nhu4NtIHRyYSB2w6AgY2h1eeG7g24gY8OhYyBiaeG6v24gdHJvbmcgZOG7ryBsaeG7h3UgduG7gSBmYWN0b3INCg0KYGBge3J9DQojS2nhu4NtIHRyYSBk4buvIGxp4buHdQ0Kc2FwcGx5KGR0LGNsYXNzKQ0KYGBgDQoNCmBgYHtyfQ0KZHQgPC0gZGF0YS5mcmFtZShsYXBwbHkoZHQsIGFzLmZhY3RvcikpDQpgYGANCg0KIyBQaOG6p24gMjogUGjDom4gdMOtY2ggTcO0IHThuqMgTeG7mXQgYmnhur9uIMSQ4buLbmggdMOtbmggKFVuaXZhcmlhdGUgRGVzY3JpcHRpdmUgQW5hbHlzaXMpDQoNCiMjIDIuMSBCaeG6v24gQnJhbmNoDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gQnJhbmNoDQp0YWJsZShkdCRCcmFuY2gpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gQnJhbmNoDQp0YWJsZShkdCRCcmFuY2gpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgJQ0KQnJhbmNoX2ZyZXEgIDwtIHRhYmxlKGR0JEJyYW5jaCkNCkJyYW5jaF9wY3QgICA8LSBCcmFuY2hfZnJlcSAvIG5yb3coZHQpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCnBpZShCcmFuY2hfZnJlcSwNCiAgICBtYWluICAgPSAiUGjDom4gYuG7kSBjaGkgbmjDoW5oIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoQnJhbmNoX2ZyZXEpLA0KICAgICAgICAgICAgICAgICAgICAiICgiLCByb3VuZChCcmFuY2hfcGN0KjEwMCwgMSksICIlKSIpLA0KICAgIGNvbCAgICA9IGMoImxpZ2h0cGluayIsICJncmVlbiIsImxpZ2h0Ymx1ZSIpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpgYGB7cn0NCmNvdW50cyA8LSB0YWJsZShkdCRCcmFuY2gpDQpkaWZmX2NvdW50IDwtIGFicyhjb3VudHNbIkYiXSAtIGNvdW50c1siTSJdKQ0KYGBgDQoNClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgYHIgdGFibGUoZHQkR2VuZGVyKVsxXS9zdW0obnJvdyhkdCkpKjEwMGAgJSBu4buvIHbDoCBgciB0YWJsZShkdCRHZW5kZXIpWzJdL3N1bShucm93KGR0KSkqMTAwYCUgbmFtLg0KDQojIyAyLjIgQmnhur9uIENpdHkNCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGPhu6dhIGJp4bq/biBDaXR5DQp0YWJsZShkdCRDaXR5KQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIENpdHkNCnRhYmxlKGR0JENpdHkpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgJQ0KQ2l0eV9mcmVxICA8LSB0YWJsZShkdCRDaXR5KQ0KQ2l0eV9wY3QgICA8LSBDaXR5X2ZyZXEgLyBucm93KGR0KQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUoQ2l0eV9mcmVxLA0KICAgIG1haW4gICA9ICJQaMOibiBi4buRIHRow6BuaCBwaOG7kSIsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKENpdHlfZnJlcSksDQogICAgICAgICAgICAgICAgICAgICIgKCIsIHJvdW5kKENpdHlfcGN0KjEwMCwgMSksICIlKSIpLA0KICAgIGNvbCAgICA9IGMoInJlZCIsICJibHVlIiwieWVsbG93IikpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNClRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSwgdGjDoG5oIHBo4buRIGPDsyB04bu3IGzhu4cgZ2lhbyBk4buLY2ggY2FvIG5o4bqldCBsw6AgWWFuZ29uIHbhu5tpIGtob+G6o25nIGByIHJvdW5kKHRhYmxlKGR0JENpdHkpWyJZYW5nb24iXS9ucm93KGR0KSoxMDAsIDIpYCUsIHRp4bq/cCB0aGVvIGzDoCBNYW5kYWxheSAoYHIgcm91bmQodGFibGUoZHQkQ2l0eSlbIk1hbmRhbGF5Il0vbnJvdyhkdCkqMTAwLCAyKWAlKSwgY3Xhu5FpIGPDuW5nIGzDoCBOYXlweWl0YXcgKGByIHJvdW5kKHRhYmxlKGR0JENpdHkpWyJOYXlweWl0YXciXS9ucm93KGR0KSoxMDAsIDIpYCUpLg0KDQpE4buvIGxp4buHdSBuw6B5IGNobyB0aOG6pXkgY8OhYyBnaWFvIGThu4tjaCBwaMOibiBi4buRIGtow6EgxJHhu5NuZyDEkeG7gXUg4bufIGPDoWMgdGjDoG5oIHBo4buRIHbDrCB04bu3IGzhu4cgZ2nhu69hIGPDoWMgdGjDoG5oIHBo4buRIGtow7RuZyBjaMOqbmggbOG7h2NoIG5oYXUgbmhp4buBdS4NCg0KQsOqbiBj4bqhbmggxJHDsywgeHUgaMaw4bubbmcgcGjDom4gYuG7kSBuw6B5IGPFqW5nIHBo4bqnbiBuw6BvIHBo4bqjbiDDoW5oIGNoaeG6v24gbMaw4bujYyB0aeG6v3AgdGjhu4sgdsOgIMSR4buLbmggaMaw4bubbmcga8OqbmggcGjDom4gcGjhu5FpIGPhu6dhIHNpw6p1IHRo4buLLCB24bubaSB0cuG7jW5nIHTDom0gxJHhurd0IHbDoG8gY8OhYyBraHUgduG7sWMgxJHDtCB0aOG7iyBs4bubbi4NCg0KIyMgMi4zIEJp4bq/biBDdXN0b21lclR5cGUNCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biBDdXN0b21lclR5cGUNCnRhYmxlKGR0JEN1c3RvbWVyVHlwZSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBDdXN0b21lclR5cGUNCnRhYmxlKGR0JEN1c3RvbWVyVHlwZSkvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZHQsIGFlcyh4ID0gQ3VzdG9tZXJUeXBlKSkgKw0KICBnZW9tX2JhcihmaWxsID0gInJlZCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIGtow6FjaCBow6BuZyIsIHggPSAiTG/huqFpIGtow6FjaCBow6BuZyIsIHkgPSAiVOG6p24gc3XhuqV0IikNCg0KDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgYHIgdGFibGUoZHQkQ3VzdG9tZXJUeXBlKVsxXS9zdW0obnJvdyhkdCkpKjEwMGAgJSBraMOhY2ggaMOgbmcgbMOgIHRow6BuaCB2acOqbiB2w6AgYHIgdGFibGUoZHQkQ3VzdG9tZXJUeXBlKVsyXS9zdW0obnJvdyhkdCkpKjEwMGAlIGtow6FjaCBow6BuZyBiw6xuaCB0aMaw4budbmcuDQoNCiMjIDIuNCBCaeG6v24gR2VuZGVyDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gR2VuZGVyDQp0YWJsZShkdCRHZW5kZXIpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gR2VuZGVyDQp0YWJsZShkdCRHZW5kZXIpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgJQ0KR2VuZGVyX2ZyZXEgIDwtIHRhYmxlKGR0JEdlbmRlcikNCkdlbmRlcl9wY3QgICA8LSBHZW5kZXJfZnJlcSAvIG5yb3coZHQpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCnBpZShHZW5kZXJfZnJlcSwNCiAgICBtYWluICAgPSAiUGjDom4gYuG7kSBnaeG7m2kgdMOtbmgiLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhHZW5kZXJfZnJlcSksDQogICAgICAgICAgICAgICAgICAgICIgKCIsIHJvdW5kKEdlbmRlcl9wY3QqMTAwLCAxKSwgIiUpIiksDQogICAgY29sICAgID0gYygibGlnaHRwaW5rIiwibGlnaHRibHVlIikpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgYHIgdGFibGUoZHQkR2VuZGVyKVsxXS9zdW0obnJvdyhkdCkpKjEwMGAgJSBu4buvIHbDoCBgciB0YWJsZShkdCRHZW5kZXIpWzJdL3N1bShucm93KGR0KSkqMTAwYCUgbmFtLg0KDQojIyAyLjUgQmnhur9uIFByb2R1Y3RMaW5lDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBj4bunYSBiaeG6v24gUHJvZHVjdExpbmUNCnRhYmxlKGR0JFByb2R1Y3RMaW5lKQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIFByb2R1Y3RMaW5lDQp0YWJsZShkdCRQcm9kdWN0TGluZSkvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQpnZ3Bsb3QoZHQsIGFlcyh4ID0gUHJvZHVjdExpbmUpKSArDQogIGdlb21fYmFyKCkgKw0KICBjb29yZF9mbGlwKCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB4b2F5IG5nYW5nIGNobyBn4buNbg0KICBsYWJzKHRpdGxlID0gIlThuqduIHN14bqldCBnaWFvIGThu4tjaCB0aGVvIFByb2R1Y3RMaW5lIiwNCiAgICAgICB4ID0gIlByb2R1Y3RMaW5lIiwgeSA9ICJT4buRIGdpYW8gZOG7i2NoIikNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KVHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UsIG5ow7NtIHPhuqNuIHBo4bqpbSBjw7MgdOG7tyBs4buHIGdpYW8gZOG7i2NoIGNhbyBuaOG6pXQgbMOgIEZhc2hpb24gYWNjZXNzb3JpZXMgduG7m2kgYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdExpbmUpWyJGYXNoaW9uIGFjY2Vzc29yaWVzIl0vbnJvdyhkdCkqMTAwLCAyKWAlLCB0aGVvIHNhdSBsw6AgRm9vZCBhbmQgYmV2ZXJhZ2VzIChgciByb3VuZCh0YWJsZShkdCRQcm9kdWN0TGluZSlbIkZvb2QgYW5kIGJldmVyYWdlcyJdL25yb3coZHQpKjEwMCwgMilgJSkgdsOgIEVsZWN0cm9uaWMgYWNjZXNzb3JpZXMgKGByIHJvdW5kKHRhYmxlKGR0JFByb2R1Y3RMaW5lKVsiRWxlY3Ryb25pYyBhY2Nlc3NvcmllcyJdL25yb3coZHQpKjEwMCwgMilgJSkuIE5nxrDhu6NjIGzhuqFpLCBuaMOzbSBIZWFsdGggYW5kIGJlYXV0eSAoYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdExpbmUpWyJIZWFsdGggYW5kIGJlYXV0eSJdL25yb3coZHQpKjEwMCwgMilgJSkgdsOgIEhvbWUgYW5kIGxpZmVzdHlsZSAoYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdExpbmUpWyJIb21lIGFuZCBsaWZlc3R5bGUiXS9ucm93KGR0KSoxMDAsIDIpYCUpLCBIb21lIGFuZCBsaWZlc3R5bGUgduG7m2kgKGByIHJvdW5kKHRhYmxlKGR0JFByb2R1Y3RMaW5lKVsiSG9tZSBhbmQgbGlmZXN0eWxlIl0vbnJvdyhkdCkqMTAwLCAyKWAlKSBjw7MgdOG7tyBs4buHIHRo4bqlcCBoxqFuLCBjaG8gdGjhuqV5IHPhu7EgxrB1IHRpw6puIGPhu6dhIGtow6FjaCBow6BuZyDEkeG7kWkgduG7m2kgY8OhYyBz4bqjbiBwaOG6qW0gdGjhu51pIHRyYW5nIHbDoCB0acOqdSBkw7luZyB0aGnhur90IHnhur91Lg0KDQojIyAyLjYgQmnhur9uIFBheW1lbnQNCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGPhu6dhIGJp4bq/biBQYXltZW50DQp0YWJsZShkdCRQYXltZW50KQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIFBheW1lbnQNCnRhYmxlKGR0JFBheW1lbnQpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGR0LCBhZXMoeCA9IFBheW1lbnQpKSArDQogIGdlb21fYmFyKGZpbGwgPSAib3JhbmdlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBwaMOibiBsb+G6oWkgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIiwgeCA9ICJQaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4iLCB5ID0gIlThuqduIHN14bqldCIpDQoNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKiBUcm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHksIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiBjw7MgdOG7tyBs4buHIGdpYW8gZOG7i2NoIGNhbyBuaOG6pXQgbMOgIEV3YWxsZXQgduG7m2kga2hv4bqjbmcgYHIgcm91bmQodGFibGUoZHQkUGF5bWVudClbIkV3YWxsZXQiXS9ucm93KGR0KSoxMDAsIDIpYCUsIHRp4bq/cCB0aGVvIGzDoCBDYXNoIChgciByb3VuZCh0YWJsZShkdCRQYXltZW50KVsiQ2FzaCJdL25yb3coZHQpKjEwMCwgMilgJSksIGN14buRaSBjw7luZyBsw6AgQ3JlZGl0IGNhcmQgKGByIHJvdW5kKHRhYmxlKGR0JFBheW1lbnQpWyJDcmVkaXQgY2FyZCJdL25yb3coZHQpKjEwMCwgMilgJSkuDQoNCiMgUGjhuqduIDM6IMav4bubYyBsxrDhu6NuZyBLaG/huqNuZyB2w6AgS2nhu4NtIMSR4buLbmggR2nhuqMgdGh1eeG6v3QgY2hvIFThu7cgbOG7hyAoTeG7mXQgYmnhur9uKQ0KDQojIyAzLjEgQmnhur9uIDE6IEdlbmRlciAtIEjhuqFuZyBt4bulYyBxdWFuIHTDom06ICJGZW1hbGUiIChO4buvKQ0KDQoqKsav4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgIk7hu68iKioNCg0KYGBge3J9DQojIMSQ4bq/bSBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBu4buvDQpuX2ZlbWFsZSA8LSBzdW0oZHQkR2VuZGVyID09ICJGZW1hbGUiKQ0KDQojVOG7lW5nIHPhu5EgcXVhbiBzw6F0DQpuX3RvdGFsIDwtIG5yb3coZHQpDQoNCiNUw61uaCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbuG7rw0KcHJvcC50ZXN0KG5fZmVtYWxlLCBuX3RvdGFsLCBjb3JyZWN0ID0gRkFMU0UpDQoNCmBgYA0KDQotICAgKirDnSBuZ2jEqWE6KiogS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdGjhuqV5IHLhurFuZyB04bu3IGzhu4cgcGjhu6UgbuG7ryB0cm9uZyB0b8OgbiBi4buZIGtow6FjaCBow6BuZyBu4bqxbSB0cm9uZyBraG/huqNuZyA0Ny4wMSUgxJHhur9uIDUzLjE5JS4gxJBp4buBdSBuw6B5IG5naMSpYSBsw6AgbuG6v3UgdGEgdGjhu7FjIGhp4buHbiBraOG6o28gc8OhdCB0xrDGoW5nIHThu7Egbmhp4buBdSBs4bqnbiwgOTUlIGPDoWMga2jhuqNvIHPDoXQgxJHDsyBz4bq9IGNobyByYSB04bu3IGzhu4cgbuG7ryBu4bqxbSB0cm9uZyBraG/huqNuZyBuw6B5Lg0KDQoqKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KioNCg0KxJDhurd0IGdp4bqjIHRodXnhur90Og0KDQotICAgJEhfMCQ6IFThu7cgbOG7hyBu4buvID0gMC41DQoNCi0gICAkSF8xJDogVOG7tyBs4buHIG7hu68g4omgIDAuNQ0KDQpgYGB7cn0NCnByb3AudGVzdChuX2ZlbWFsZSwgbl90b3RhbCwgcCA9IDAuNSwgY29ycmVjdCA9IEZBTFNFKQ0KDQpgYGANCg0KLSAgIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogY2hpIGLDrG5oIHBoxrDGoW5nOiAwLjAwNCwgduG7m2kgYuG6rWMgdOG7sSBkbyA9IDENCg0KLSAgICoqVOG7tyBs4buHIG3huqt1IChwzIIpKio6IDAuNTAxIOKGkiBraG/huqNuZyAqKjUwLjElKioga2jDoWNoIGjDoG5nIGzDoCBu4buvLg0KDQo8IS0tIC0tPg0KDQotICAgKipLaG/huqNuZyB0aW4gY+G6rXkgOTUlKiogY2hvIHThu7cgbOG7hyBu4buvOiBbMC40NzAxLDAuNTMxOV0NCg0KLSAgICoqcC12YWx1ZSoqID0gMC45NDk2IFw+IDAuMDUsIHbDrCB24bqteSB0YSBraMO0bmcgxJHhu6cgY8ahIHPhu58gxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCi0gICAqKkvhur90IGx14bqtbjoqKiBLaMO0bmcgY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGNobyBy4bqxbmcgdOG7tyBs4buHIGtow6FjaCBow6BuZyBu4buvIGtow6FjIDUwJS4gVOG7tyBs4buHIG7hu68gdHJvbmcgbeG6q3UgeOG6pXAgeOG7iSA1MCUsIGNobyB0aOG6pXkgcGjDom4gYuG7kSBnaeG7m2kgdMOtbmggdHJvbmcgZOG7ryBsaeG7h3UgbMOgIGPDom4gYuG6sW5nIHbDoCBraMO0bmcgY8OzIHNhaSBraMOhYyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQojIyAzLjIgQmnhur9uIDI6IEN1c3RvbWVyVHlwZSAtIEjhuqFuZyBt4bulYyBxdWFuIHTDom06ICJOb3JtYWwiIChCw6xuaCB0aMaw4budbmcpDQoNCioqxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyAiQsOsbmggdGjGsOG7nW5nIioqDQoNCmBgYHtyfQ0KI1Phu5Ega2jDoWNoIGjDoG5nIGLDrG5oIHRoxrDhu51uZw0Kbl9ub3JtYWwgPC0gc3VtKGR0JEN1c3RvbWVyVHlwZSA9PSAiTm9ybWFsIikNCiNU4buVbmcgc+G7kSBxdWFuIHPDoXQNCm5fdG90YWwgPC0gbnJvdyhkdCkNCg0KI1TDrW5oIGtob+G6o25nIHRpbiBj4bqteSA5NSUNCnByb3AudGVzdChuX25vcm1hbCwgbl90b3RhbCwgY29ycmVjdCA9IEZBTFNFKQ0KYGBgDQoNCi0gICAqKsOdIG5naMSpYToqKiBW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCB0YSDGsOG7m2MgbMaw4bujbmcgcuG6sW5nIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbMOgIGLDrG5oIHRoxrDhu51uZyB0cm9uZyB04buVbmcgdGjhu4MgbuG6sW0gdHJvbmcga2hv4bqjbmcgKio0Ni44MSUgxJHhur9uIDUyLjk5JSoqLg0KDQoqKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KioNCg0KxJDhurd0IGdp4bqjIHRodXnhur90Og0KDQotICAgJEhfMCQ6IFThu7cgbOG7hyBraMOhY2ggaMOgbmcgYsOsbmggdGjGsOG7nW5nID0gMC41DQoNCi0gICAkSF8xJDogVOG7tyBs4buHIGtow6FjaCBow6BuZyBiw6xuaCB0aMaw4budbmcg4omgIDAuNQ0KDQpgYGB7cn0NCnByb3AudGVzdChuX25vcm1hbCwgbl90b3RhbCwgcD0wLjUsIGNvcnJlY3QgPSBGQUxTRSkgIA0KYGBgDQoNCi0gICBHacOhIHRy4buLIHRo4buRbmcga8OqIGNoaSBiw6xuaCBwaMawxqFuZzogMC4wMDQsIHbhu5tpIGLhuq1jIHThu7EgZG8gPSAxDQoNCi0gICAqKlThu7cgbOG7hyBt4bqrdSAocMyCKSoqOiAwLjQ5OSDihpIgdOG7qWMga2hv4bqjbmcgKio0OS45JSoqIGtow6FjaCBow6BuZyBsw6AgYsOsbmggdGjGsOG7nW5nLg0KDQotICAgKipLaG/huqNuZyB0aW4gY+G6rXkgOTUlKiogY2hvIHThu7cgbOG7hyDEkeG7mWMgdGjDom46IFswLjQ2ODEsIDAuNTI5OV0NCg0KLSAgICoqcC12YWx1ZSA9IDAuOTQ5NiBcPiAwLjA1Kiog4oeSICoqS2jDtG5nIMSR4bunIGPGoSBz4bufIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKAKiouDQoNCi0gICAqKkvhur90IGx14bqtbjoqKiBLaMO0bmcgY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGNobyBy4bqxbmcgdOG7tyBs4buHIGtow6FjaCBow6BuZyBraMO0bmcgcGjhuqNpIHRow6BuaCB2acOqbiBraMOhYyA1MCUuIFThu7cgbOG7hyBuw6B5IHjhuqVwIHjhu4kgNTAlLCBjaG8gdGjhuqV5IHBow6JuIGLhu5EgZ2nhu69hIGtow6FjaCBow6BuZyBsw6AgdGjDoG5oIHZpw6puIHbDoCBraMO0bmcgdGjDoG5oIHZpw6puIGfhuqduIG5oxrAgY8OibiBi4bqxbmcsIGtow7RuZyBjw7Mgc2FpIGtow6FjIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCiMjIDMuMyBCaeG6v24gMzogUGF5bWVudCAtIEjhuqFuZyBt4bulYyBxdWFuIHTDom06ICJDYXNoIiAoVGnhu4FuIG3hurd0KQ0KDQpcKlwqxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyAiQ2FzaFwqDQoNCmBgYHtyfQ0KI1Phu5EgbMaw4bujbmcgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuICJDYXNoIg0Kbl9jYXNoIDwtc3VtKGR0JFBheW1lbnQgPT0gIkNhc2giKQ0KDQojVOG7lW5nIHPhu5EgcXVhbiBzw6F0DQpuX3RvdGFsIDwtIG5yb3coZHQpDQoNCg0KI1TDrW5oIGtob+G6o25nIHRpbiBj4bqteSA5NSUNCnByb3AudGVzdChuX2Nhc2gsIG5fdG90YWwsIGNvcnJlY3QgPSBGQUxTRSkNCmBgYA0KDQotICAgKirDnSBuZ2jEqWE6KiogVuG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSwgdGEgxrDhu5tjIGzGsOG7o25nIHLhurFuZyB04bu3IGzhu4cgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIGzDoCB0aeG7gW4gbeG6t3QgdHJvbmcgZOG7ryBsaeG7h3UgKipsw6AgMzQuNCUqKiB2w6AgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAzMS41MiUgxJHhur9uIDM3LjQwJS4NCg0KKipLaeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCoqDQoNCsSQ4bq3dCBnaeG6oyB0aHV54bq/dDoNCg0KLSAgICRIXzAkOiBU4bu3IGzhu4cgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIGzDoCB0aeG7gW4gbeG6t3Qg4omkIDAuMzUNCg0KLSAgICRIXzEkOiBU4bu3IGzhu4cgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIGzDoCB0aeG7gW4gbeG6t3QgXD4gMC4zNQ0KDQpgYGB7cn0NCnByb3AudGVzdChuX2Nhc2gsIG5fdG90YWwsIHA9MC4zNSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsIGNvcnJlY3QgPSBGQUxTRSkgIA0KYGBgDQoNCi0gICBHacOhIHRy4buLIHRo4buRbmcga8OqIGNoaSBiw6xuaCBwaMawxqFuZzogMC4xNTgyNCwgYuG6rWMgdOG7sSBkbyA9IDEuDQoNCi0gICAqKlThu7cgbOG7hyBt4bqrdSAocMyCKSoqOiAwLjM0NCDihpIga2hv4bqjbmcgKiozNC40JSoqIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiB0aeG7gW4gbeG6t3QuDQoNCjwhLS0gLS0+DQoNCi0gICAqKktob+G6o25nIHRpbiBj4bqteSA5NSUqKiBjaG8gbmjDs20gQ2FzaDogWzAuMzE5NywxLjAwMDBdIHbDrCBsw6Aga2nhu4NtIMSR4buLbmggMSBwaMOtYQ0KDQotICAgKipwLXZhbHVlKiogPSAwLjY1NDYgXD4gMC4wNSwgdsOsIHbhuq15IHRhIGtow7RuZyDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQg4bufIG3hu6ljIMO9IG5naMSpYSA1JS4NCg0KLSAgICoqS+G6v3QgbHXhuq1uOioqIFThu7cgbOG7hyBraMOhY2ggaMOgbmcgdGhhbmggdG/DoW4gYuG6sW5nIHRp4buBbiBt4bq3dCBraMO0bmcga2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogc28gduG7m2kgMzUlLiBOw7NpIGPDoWNoIGtow6FjLCB04bu3IGzhu4cgdGhhbmggdG/DoW4gdGnhu4FuIG3hurd0IGtob+G6o25nIDM0LjQlIGzDoCBwaMO5IGjhu6NwIHbhu5tpIGdp4bqjIHRodXnhur90IGJhbiDEkeG6p3UuDQoNCiMgUGjhuqduIDQ6IFBow6JuIHTDrWNoIE3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgSGFpIGJp4bq/biDEkOG7i25oIHTDrW5oIChCaXZhcmlhdGUgQW5hbHlzaXMpDQoNCiMjIDQuMSBHZW5kZXIgdsOgIFBheW1lbnQNCg0KIyMjIDQuMS4xIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8NCg0KYGBge3J9DQojVOG6oW8gYuG6o25nIGNow6lvDQpidHNfZ2VuZGVyX3BheW1lbnQgPC0gdGFibGUoZHQkR2VuZGVyLCBkdCRQYXltZW50KS9zdW0obnJvdyhkdCkpDQoNCiNYZW0gYuG6o25nIGNow6lvDQpwcm9wLnRhYmxlKGJ0c19nZW5kZXJfcGF5bWVudCwgbWFyZ2luID0gMSkgKiAxMDAgICMgVMOtbmggdGhlbyBow6BuZw0KYGBgDQoNCi0gICBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIMSRxrDhu6NjIHTDrW5oIMSR4buDIHNvIHPDoW5oIGPGoSBj4bqldSBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gdGhlbyBnaeG7m2kgdMOtbmguDQoNCi0gICBU4bu3IGzhu4cgcGjhuqduIHRyxINtIHTDrW5oIHRoZW8gaMOgbmcg4oaSIGdpw7pwIHhlbSBuYW0gdsOgIG7hu68gdGhhbmggdG/DoW4gYuG6sW5nIHBoxrDGoW5nIHRo4bupYyBuw6BvIG5oaeG7gXUgaMahbiB0cm9uZyBuaMOzbSBj4bunYSBo4buNLg0KDQotICAgTmjhuq1uIHjDqXQ6DQoNCiAgICAtICAgUGjhu6UgbuG7ryDGsHUgdGnDqm4gc+G7rSBk4bulbmcgdGnhu4FuIG3hurd0IChDYXNoKSBuaGnhu4F1IG5o4bqldCB24bubaSB04bu3IGzhu4cga2hv4bqjbmcgMzUuNTMlLCBjYW8gaMahbiBzbyB24bubaSBuYW0gZ2nhu5tpICgzMy4yNyUpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBwaOG7pSBu4buvIGPDsyB4dSBoxrDhu5tuZyBkw7luZyB0aeG7gW4gbeG6t3Qgbmhp4buBdSBoxqFuIHRyb25nIGPDoWMgZ2lhbyBk4buLY2guDQoNCiAgICAtICAgTmfGsOG7o2MgbOG6oWksIG5hbSBnaeG7m2kgY8OzIHh1IGjGsOG7m25nIHPhu60gZOG7pW5nIHbDrSDEkWnhu4duIHThu60gKEV3YWxsZXQpIG5oaeG7gXUgaMahbiwgY2hp4bq/bSBraG/huqNuZyAzNy4wNyUsIHNvIHbhu5tpIHThu7cgbOG7hyBj4bunYSBu4buvIGzDoCAzMS45NCUuIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgcGjhuqNuIMOhbmggc+G7sSBjaOG6pXAgbmjhuq1uIGPDtG5nIG5naOG7hyB0aGFuaCB0b8OhbiDEkWnhu4duIHThu60gY2FvIGjGoW4g4bufIG5hbSBnaeG7m2kuDQoNCiAgICAtICAgVOG7tyBs4buHIHPhu60gZOG7pW5nIHRo4bq7IHTDrW4gZOG7pW5nIChDcmVkaXQgQ2FyZCkgdMawxqFuZyDEkeG7kWkgdGjhuqVwIHbDoCBn4bqnbiBuaMawIHTGsMahbmcgxJHGsMahbmcgZ2nhu69hIGhhaSBnaeG7m2ksIHbhu5tpIG7hu68ga2hv4bqjbmcgMzIuNTMlIHbDoCBuYW0ga2hv4bqjbmcgMjkuNjYlLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB0aOG6uyB0w61uIGThu6VuZyBraMO0bmcgcGjhuqNpIGzDoCBwaMawxqFuZyB0aOG7qWMgcGjhu5UgYmnhur9uIG5o4bqldCDEkeG7kWkgduG7m2kgY+G6oyBoYWkgbmjDs20gZ2nhu5tpIHTDrW5oLg0KDQojIyMgNC4xLjIgVHLhu7FjIHF1YW4gaMOzYQ0KDQpW4bq9IGJp4buDdSDEkeG7kyBj4buZdCDEkeG7gyBjw7MgY8OhaSBuaMOsbiBj4bulIHRo4buDIGjGoW4uDQoNCmBgYHtyfQ0KIyBDaHV54buDbiBzYW5nIGRhdGFmcmFtZQ0KZ3RfdHQgPC0gYXMuZGF0YS5mcmFtZShidHNfZ2VuZGVyX3BheW1lbnQpDQpjb2xuYW1lcyhndF90dCkgPC0gYygiR2VuZGVyIiwgIlBheW1lbnQiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZ3RfdHQsIGFlcyhHZW5kZXIsIENvdW50LCBmaWxsID0gUGF5bWVudCkpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIGxhYnModGl0bGUgPSAiQ8ahIGPhuqV1IHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiB0aGVvIGdp4bubaSB0w61uaCIsDQogICAgICAgeCA9ICJHaeG7m2kgdMOtbmgiLCB5ID0gIlPhu5EgbMaw4bujbmciLCBmaWxsID0gIlBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyA0LjEuMyBOaOG6rW4geMOpdCBNw7QgdOG6ow0KDQoqKk3hu5FpIHF1YW4gaOG7hyB2w6AgeHUgaMaw4bubbmc6KioNCg0KLSAgICoqU+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gdGhlbyBnaeG7m2kgdMOtbmg6KioNCi0gICBO4buvIChGZW1hbGUpOiBT4butIGThu6VuZyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gYuG6sW5nIHRp4buBbiBt4bq3dCAoQ2FzaCkgdsOgIHRo4bq7IHTDrW4gZOG7pW5nIChDcmVkaXQgY2FyZCkgY8OzIHThu7cgbOG7hyB0xrDGoW5nIMSRxrDGoW5nLCB0cm9uZyBraGkgdsOtIMSRaeG7h24gdOG7rSAoRXdhbGxldCkgY8OzIHThu7cgbOG7hyB0aOG6pXAgaMahbi4NCi0gICBOYW0gKE1hbGUpOiBUxrDGoW5nIHThu7EgbmjGsCBu4buvLCBuaMawbmcgdOG7tyBs4buHIHPhu60gZOG7pW5nIHbDrSDEkWnhu4duIHThu60gY8OzIHbhursgY2FvIGjGoW4gc28gduG7m2kgbuG7ry4NCi0gICAqKlPhu7EgbGnDqm4ga+G6v3QgZ2nhu69hIGPDoWMgYmnhur9uOioqDQogICAgLSAgIEPDsyBz4buxIGxpw6puIGvhur90IGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8Ohbi4gQ+G7pSB0aOG7gywgY+G6oyBu4buvIHbDoCBuYW0gxJHhu4F1IGPDsyB4dSBoxrDhu5tuZyBz4butIGThu6VuZyB0aeG7gW4gbeG6t3QgdsOgIHRo4bq7IHTDrW4gZOG7pW5nIHTGsMahbmcgxJHGsMahbmcsIG5oxrBuZyBuYW0gY8OzIHh1IGjGsOG7m25nIHPhu60gZOG7pW5nIHbDrSDEkWnhu4duIHThu60gY2FvIGjGoW4gbuG7ry4NCg0KKipYdSBoxrDhu5tuZzoqKg0KDQotICAgWHUgaMaw4bubbmcgY2hvIHRo4bqleSBy4bqxbmcgY+G6oyBwaOG7pSBu4buvIHbDoCBuYW0gZ2nhu5tpIMSR4buBdSDGsGEgY2h14buZbmcgc+G7rSBk4bulbmcgdGnhu4FuIG3hurd0IHbDoCB0aOG6uyB0w61uIGThu6VuZywgdHV5IG5oacOqbiwgbmFtIGdp4bubaSBjw7MgdGjhu4MgY8OzIHh1IGjGsOG7m25nIHPhu60gZOG7pW5nIHbDrSDEkWnhu4duIHThu60gbmhp4buBdSBoxqFuIHBo4bulIG7hu68uDQoNCiMjIyA0LjEuNCBLaeG7g20gxJHhu4tuaCBUaOG7kW5nIGvDqiAoS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKQ0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gICAqKkjigoAqKjogR2nhu5tpIHTDrW5oIHbDoCBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gbMOgIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wLg0KDQotICAgKipI4oKBKio6IEdp4bubaSB0w61uaCB2w6AgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIGzDoCBjw7MgbGnDqm4gcXVhbi4NCg0KKipUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyoqDQoNCmBgYHtyfQ0KI1ThuqFvIGLhuqNuZyB04bqnbiBz4buRDQpidHNvX2dlbmRlcl9wYXltZW50IDwtIHRhYmxlKGR0JEdlbmRlciwgZHQkUGF5bWVudCkNCmJ0c29fZ2VuZGVyX3BheW1lbnQNCmBgYA0KDQpgYGB7cn0NCmNoaV90ZXN0IDwtIGNoaXNxLnRlc3QoYnRzb19nZW5kZXJfcGF5bWVudCkNCmNoaV90ZXN0DQpgYGANCg0KKipOaOG6rW4geMOpdCBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotICAgR2nDoSB0cuG7iyBDaGktYsOsbmggcGjGsMahbmcgKFjCsik6IDIuOTQ5Nw0KDQotICAgQuG6rWMgdOG7sSBkbyAoZGYpOiAyDQoNCi0gICBHacOhIHRy4buLIHA6IDAuMjI4OA0KDQoqKkvhur90IGx14bqtbjoqKg0KDQotICAgROG7sWEgdsOgbyBnacOhIHRy4buLIHAgKDAuMjI4OCkgdsOgIG3hu6ljIMO9IG5naMSpYSDOsSA9IDAuMDUuIFbDrCBwLXZhbHVlID0gMC4yMjg4IFw+IDAuMDUsIHRhIGtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGhhaSBiaeG6v24gKGdp4bubaSB0w61uaCB2w6AgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuKSBsw6AgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUg4bufIG3hu6ljIMO9IG5naMSpYSAwLjA1Lg0KDQotICAgTeG6t2MgZMO5IGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6osIHZp4buHYyBwaMOibiB0w61jaCB04bqnbiBzdeG6pXQgduG6q24gY8OzIHRo4buDIGN1bmcgY+G6pXAgdGjDtG5nIHRpbiBo4buvdSDDrWNoIHbhu4EgeHUgaMaw4bubbmcgc+G7rSBk4bulbmcgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIGPhu6dhIGhhaSBnaeG7m2kuIEPhu6UgdGjhu4MsIG5hbSBnaeG7m2kgY8OzIHRo4buDIGPDsyB4dSBoxrDhu5tuZyBz4butIGThu6VuZyB2w60gxJFp4buHbiB04butIGNhbyBoxqFuLCB0cm9uZyBraGkgcGjhu6UgbuG7ryBs4bqhaSDGsGEgY2h14buZbmcgdGnhu4FuIG3hurd0IHbDoCB0aOG6uyB0w61uIGThu6VuZyBoxqFuLg0KDQojIyA0LjIgQ2l0eSB2w6AgQ3VzdG9tZXJUeXBlDQoNCiMjIyA0LjIuMSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvDQoNCmBgYHtyfQ0KI1ThuqFvIGLhuqNuZyBjaMOpbw0KYnRzX2NpdHlfY3VzdG9tZXJ0eXBlIDwtIHRhYmxlKGR0JENpdHksIGR0JEN1c3RvbWVyVHlwZSkvc3VtKG5yb3coZHQpKQ0KDQojWGVtIGLhuqNuZyBjaMOpbw0KcHJvcC50YWJsZShidHNfY2l0eV9jdXN0b21lcnR5cGUsIG1hcmdpbiA9IDEpICogMTAwICAjIFTDrW5oIHRoZW8gaMOgbmcNCmBgYA0KDQotICAgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyDEkcaw4bujYyB0w61uaCDEkeG7gyBzbyBzw6FuaCBjxqEgY+G6pXUgdGjDoG5oIHBo4buRIHRoZW8gdMOsbmggdHLhuqFuZyBraMOhY2ggaMOgbmcuDQoNCi0gICBU4bu3IGzhu4cgcGjhuqduIHRyxINtIHTDrW5oIHRoZW8gaMOgbmcg4oaSIGdpw7pwIHhlbSBuZ8aw4budaSDEkeG6v24gdOG7qyBNYW5kYWxheSwgTmF5cHlpdGF3IHbDoCBZYW5nb24gbMOgIGtow6FjaCBow6BuZyB0aMOgbmggdmnDqm4gbmhp4buBdSBoxqFuIHRyb25nIG5ow7NtIGPhu6dhIGjhu40gbmjGsCB0aOG6vyBuw6BvLg0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCi0gICBNYW5kYWxheTogVOG7tyBs4buHIG5nxrDhu51pIGjhu5lpIHZpw6puIChNZW1iZXIpIGzDoCA0OS43MCUsIHRyb25nIGtoaSB04bu3IGzhu4cgbmfGsOG7nWkgYsOsbmggdGjGsOG7nW5nIChOb3JtYWwpIGzDoCA1MC4zMCUuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBn4bqnbiBuaMawIMSR4buTbmcgxJHhu4F1IGdp4buvYSBoYWkgbmjDs20sIHR1eSBuaGnDqm4sIG5ow7NtIG5nxrDhu51pIGLDrG5oIHRoxrDhu51uZyBjw7MgdOG7tyBs4buHIGNhbyBoxqFuIG3hu5l0IGNow7p0Lg0KDQotICAgTmF5cHlpdGF3OiBU4bu3IGzhu4cgbmfGsOG7nWkgaOG7mWkgdmnDqm4gY2FvIGjGoW4gxJHDoW5nIGvhu4MgKDUxLjUyJSkgc28gduG7m2kgbmfGsOG7nWkgYsOsbmggdGjGsOG7nW5nICg0OC40OCUpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgbmfGsOG7nWkgaOG7mWkgdmnDqm4gY8OzIGto4bqjIG7Eg25nIHRoYW0gZ2lhIHbDoG8gY8OhYyBob+G6oXQgxJHhu5luZyBob+G6t2MgZOG7i2NoIHbhu6UgY2FvIGjGoW4gc28gduG7m2kgbmfGsOG7nWkgYsOsbmggdGjGsOG7nW5nLg0KDQotICAgWWFuZ29uOiBU4bu3IGzhu4cgbmfGsOG7nWkgaOG7mWkgdmnDqm4gbMOgIDQ5LjEyJSwgdHJvbmcga2hpIHThu7cgbOG7hyBuZ8aw4budaSBiw6xuaCB0aMaw4budbmcgbMOgIDUwLjg4JS4gVMawxqFuZyB04buxIG5oxrAgTWFuZGFsYXksIHPhu7EgcGjDom4gYuG7kSBnaeG7r2EgaGFpIG5ow7NtIGzDoCBn4bqnbiBuaMawIMSR4buTbmcgxJHhu4F1LCB24bubaSBuaMOzbSBuZ8aw4budaSBiw6xuaCB0aMaw4budbmcgY2hp4bq/bSDGsHUgdGjhur8gaMahbi4NCg0KIyMjIDQuMi4yIFRy4buxYyBxdWFuIGjDs2EgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgxJHhu4MgY8OzIGPDoWkgbmjDrG4gY+G7pSB0aOG7gyBoxqFuLg0KDQpgYGB7cn0NCiMgQ2h1eeG7g24gc2FuZyBkYXRhZnJhbWUNCnRwX2toIDwtIGFzLmRhdGEuZnJhbWUoYnRzX2NpdHlfY3VzdG9tZXJ0eXBlKQ0KY29sbmFtZXModHBfa2gpIDwtIGMoIkNpdHkiLCAiQ3VzdG9tZXJUeXBlIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kw0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KHRwX2toLCBhZXMoQ2l0eSwgQ291bnQsIGZpbGwgPSBDdXN0b21lclR5cGUpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBsYWJzKHRpdGxlID0gIkPGoSBj4bqldSBsb+G6oWkga2jDoWNoIGjDoG5nIHRoZW8gdGjDoG5oIHBo4buRIiwNCiAgICAgICB4ID0gIlRow6BuaCBwaOG7kSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIsIGZpbGwgPSAiTG/huqFpIGtow6FjaCBow6BuZyIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyA0LjIuMyBOaOG6rW4geMOpdCBtw7QgdOG6ow0KDQoqKk5o4bqtbiB4w6l0IHbhu4EgbeG7kWkgcXVhbiBo4buHOioqIEPDsyBz4buxIGxpw6puIGvhur90IGdp4buvYSBoYWkgYmnhur9uOiBU4bu3IGzhu4cga2jDoWNoIGjDoG5nIGjhu5lpIHZpw6puIChNZW1iZXIpIGNhbyBoxqFuIOG7nyB0aMOgbmggcGjhu5EgTmF5cHlpdGF3IHNvIHbhu5tpIGhhaSB0aMOgbmggcGjhu5EgY8OybiBs4bqhaS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIHPhu7EgdGhhbSBnaWEgY+G7p2Ega2jDoWNoIGjDoG5nIHbDoG8gY8OhYyBk4buLY2ggduG7pSBob+G6t2MgY2jGsMahbmcgdHLDrG5oIGPDsyB0aOG7gyBi4buLIOG6o25oIGjGsOG7n25nIGLhu59pIHbhu4sgdHLDrSDEkeG7i2EgbMO9Lg0KDQoqKlh1IGjGsOG7m25nOioqDQoNCi0gICBUaMOgbmggcGjhu5EgTWFuZGFsYXk6IFThu7cgbOG7hyBraMOhY2ggaMOgbmcgaOG7mWkgdmnDqm4gdsOgIGtow6FjaCBow6BuZyBiw6xuaCB0aMaw4budbmcgKE5vcm1hbCkgZ+G6p24gbmjGsCB0xrDGoW5nIMSRxrDGoW5nLCBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBraMOhY2ggaMOgbmcga2jDoSDEkeG7k25nIMSR4buBdSBnaeG7r2EgaGFpIG5ow7NtLg0KDQotICAgVGjDoG5oIHBo4buRIE5heXB5aXRhdzogVOG7tyBs4buHIGtow6FjaCBow6BuZyBo4buZaSB2acOqbiBjaGnhur9tIMawdSB0aOG6vyByw7UgcuG7h3QgKDUxLjUyJSksIGNobyB0aOG6pXkgcuG6sW5nIG5nxrDhu51pIGTDom4g4bufIMSRw6J5IGPDsyB4dSBoxrDhu5tuZyB0aGFtIGdpYSBuaGnhu4F1IGjGoW4gdsOgbyBjw6FjIGNoxrDGoW5nIHRyw6xuaCBraMOhY2ggaMOgbmcuDQoNCi0gICBUaMOgbmggcGjhu5EgWWFuZ29uOiBUxrDGoW5nIHThu7EgbmjGsCBNYW5kYWxheSwgdOG7tyBs4buHIGdp4buvYSBoYWkgbmjDs20ga2jDoWNoIGjDoG5nIGzDoCBraMOhIMSR4buTbmcgxJHhu4F1LCB24bubaSBraMOhY2ggaMOgbmcgYsOsbmggdGjGsOG7nW5nIGPDsyB04bu3IGzhu4cgY2FvIGjGoW4gbeG7mXQgY2jDunQuDQoNCioqS+G6v3QgbHXhuq1uOioqIEPDsyB24bq7IG5oxrAgY8OzIG3hu5l0IHPhu7EgbGnDqm4ga+G6v3QgZ2nhu69hIHRow6BuaCBwaOG7kSB2w6AgbG/huqFpIGtow6FjaCBow6BuZywgduG7m2kgdGjDoG5oIHBo4buRIE5heXB5aXRhdyBjaG8gdGjhuqV5IHThu7cgbOG7hyBraMOhY2ggaMOgbmcgaOG7mWkgdmnDqm4gY2FvIGjGoW4uIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgcGjhuqNuIMOhbmggc+G7sSBraMOhYyBiaeG7h3QgdHJvbmcgbmh1IGPhuqd1IGhv4bq3YyBxdXnhu4FuIGzhu6NpIGPhu6dhIGtow6FjaCBow6BuZyDhu58gdOG7q25nIGtodSB24buxYywgduG7m2kgTmF5cHlpdGF3IGPDsyB0aOG7gyBjdW5nIGPhuqVwIG5oaeG7gXUgZOG7i2NoIHbhu6UgaOG6pXAgZOG6q24gaMahbiBjaG8ga2jDoWNoIGjDoG5nIGjhu5lpIHZpw6puLg0KDQojIyMgNC4yLjQgS2nhu4NtIMSR4buLbmggVGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotICAgKipI4oKAKio6IExv4bqhaSBraMOhY2ggaMOgbmcgdsOgIHRow6BuaCBwaOG7kSBsw6AgaGFpIGJp4bq/biDEkeG7mWMgbOG6rXAuDQoNCi0gICAqKkjigoEqKjogTG/huqFpIGtow6FjaCBow6BuZyB2w6AgdGjDoG5oIHBo4buRIGzDoCBjw7MgbGnDqm4gcXVhbi4NCg0KKipUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZzoqKg0KDQpgYGB7cn0NCiNU4bqhbyBi4bqjbmcgdOG6p24gc+G7kQ0KYnRzb19jaXR5X2N1c3RvbWVydHlwZSA8LSB0YWJsZShkdCRDaXR5LCBkdCRDdXN0b21lclR5cGUpDQpidHNvX2NpdHlfY3VzdG9tZXJ0eXBlDQpgYGANCg0KYGBge3J9DQpjaGlfdGVzdCA8LSBjaGlzcS50ZXN0KGJ0c29fY2l0eV9jdXN0b21lcnR5cGUpDQpjaGlfdGVzdA0KYGBgDQoNCioqTmjhuq1uIHjDqXQga+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSAgIEdpw6EgdHLhu4sgQ2hpLWLDrG5oIHBoxrDGoW5nIChYwrIpOiAwLjQxODgxDQoNCi0gICBC4bqtYyB04buxIGRvIChkZik6IDINCg0KLSAgIEdpw6EgdHLhu4sgcDogXDwgMC44MTExDQoNCioqS+G6v3QgbHXhuq1uOioqIEThu7FhIHbDoG8gZ2nDoSB0cuG7iyBwICgwLjgxMTEpIHbDoCBt4bupYyDDvSBuZ2jEqWEgzrEgPSAwLjA1LCB0YSBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBoYWkgYmnhur9uICh0aMOgbmggcGjhu5EgdsOgIGxv4bqhaSBraMOhY2ggaMOgbmcpIGzDoCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdSDhu58gbeG7qWMgw70gbmdoxKlhIDAuMDUuDQoNCkvhur90IHF14bqjIG7DoHkgY2hvIHRo4bqleSBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdGjDoG5oIHBo4buRIHbDoCBsb+G6oWkga2jDoWNoIGjDoG5nLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBoYWkgxJFp4buDbSBjaMOtbmg6DQoNCi0gICBDw6FjIGxv4bqhaSBraMOhY2ggaMOgbmcgKGjhu5lpIHZpw6puIHbDoCBiw6xuaCB0aMaw4budbmcpIGtow7RuZyBi4buLIOG6o25oIGjGsOG7n25nIGLhu59pIHbhu4sgdHLDrSDEkeG7i2EgbMO9LCBjaG8gdGjhuqV5IHLhurFuZyBk4buLY2ggduG7pSB2w6Agc+G6o24gcGjhuqltIGPDsyB0aOG7gyDEkcaw4bujYyB0aeG6v3AgY+G6rW4gxJHhu5NuZyDEkeG7gXUg4bufIGPDoWMgdGjDoG5oIHBo4buRIGtow6FjIG5oYXUuDQoNCi0gICBT4buxIHRoYW0gZ2lhIGPhu6dhIGtow6FjaCBow6BuZyB2w6BvIGPDoWMgY2jGsMahbmcgdHLDrG5oIGjhu5lpIHZpw6puIGPDsyB0aOG7gyBwaOG7pSB0aHXhu5ljIHbDoG8gY8OhYyB54bq/dSB04buRIGtow6FjIG5nb8OgaSDEkeG7i2EgbMO9LCBuaMawIG5odSBj4bqndSBjw6EgbmjDom4gaG/hurdjIHTDrW5oIGjhuqVwIGThuqtuIGPhu6dhIGPDoWMgxrB1IMSRw6NpLCBoxqFuIGzDoCBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgY8OhYyB0aMOgbmggcGjhu5EuDQoNCiMjIDQuMyBDdXN0b21lclR5cGUgdsOgIFBheW1lbnQNCg0KIyMjIDQuMy4xIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8NCg0KYGBge3J9DQojVOG6oW8gYuG6o25nIGNow6lvDQpidHNfY3VzdG9tZXJ0eXBlX3BheW1lbnQgPC0gdGFibGUoZHQkQ3VzdG9tZXJUeXBlLCBkdCRQYXltZW50KS9zdW0obnJvdyhkdCkpDQoNCg0KI1hlbSBi4bqjbmcgY2jDqW8NCnByb3AudGFibGUoYnRzX2N1c3RvbWVydHlwZV9wYXltZW50LCBtYXJnaW4gPSAxKSAqIDEwMCAgIyBUw61uaCB0aGVvIGjDoG5nDQpgYGANCg0KROG7ryBsaeG7h3UgY2hvIHRo4bqleSB04bu3IGzhu4cgc+G7rSBk4bulbmcgY8OhYyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gKENhc2gsIENyZWRpdCBjYXJkLCBFd2FsbGV0KSBnaeG7r2EgaGFpIG5ow7NtIGtow6FjaCBow6BuZyAoTWVtYmVyIHbDoCBOb3JtYWwpLiBYdSBoxrDhu5tuZyBjaMOtbmg6DQoNCi0gICBOaMOzbSBraMOhY2ggaMOgbmcgaOG7mWkgdmnDqm4gKE1lbWJlcik6IFThu7cgbOG7hyBz4butIGThu6VuZyB0aeG7gW4gbeG6t3QgbMOgIDMzLjUzJSwgdGjhursgdMOtbiBk4bulbmcgbMOgIDM0LjMzJSwgdsOgIHbDrSDEkWnhu4duIHThu60gbMOgIDMyLjE0JS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIGtow6FjaCBow6BuZyBo4buZaSB2acOqbiBjw7Mgc+G7sSBwaMOibiBi4buRIHTGsMahbmcgxJHhu5FpIMSR4buTbmcgxJHhu4F1IHRyb25nIHZp4buHYyBs4buxYSBjaOG7jW4gY8OhYyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4uDQoNCi0gICBOaMOzbSBraMOhY2ggaMOgbmcgYsOsbmggdGjGsOG7nW5nIChOb3JtYWwpOiBU4bu3IGzhu4cgc+G7rSBk4bulbmcgdGnhu4FuIG3hurd0IGNhbyBoxqFuICgzNS4yNyUpIHNvIHbhu5tpIHRo4bq7IHTDrW4gZOG7pW5nICgyNy44NiUpLCB0cm9uZyBraGkgdOG7tyBs4buHIHPhu60gZOG7pW5nIHbDrSDEkWnhu4duIHThu60gbMOgIDM2Ljg3JS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIGtow6FjaCBow6BuZyBiw6xuaCB0aMaw4budbmcgY8OzIHh1IGjGsOG7m25nIMawYSBjaHXhu5luZyBz4butIGThu6VuZyB0aeG7gW4gbeG6t3QgdsOgIHbDrSDEkWnhu4duIHThu60gaMahbiBsw6AgdGjhursgdMOtbiBk4bulbmcuDQoNCi0gICBTbyBzw6FuaCBnaeG7r2EgaGFpIG5ow7NtOiBOaMOsbiBjaHVuZywgbmjDs20ga2jDoWNoIGjDoG5nIGLDrG5oIHRoxrDhu51uZyBjw7MgdOG7tyBs4buHIHPhu60gZOG7pW5nIHRp4buBbiBt4bq3dCB2w6AgdsOtIMSRaeG7h24gdOG7rSBjYW8gaMahbiBuaMOzbSBo4buZaSB2acOqbi4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaCBz4buxIGtow6FjIGJp4buHdCB0cm9uZyB0aMOzaSBxdWVuIGNoaSB0acOqdSB2w6Agc+G7sSDGsHUgdGnDqm4gY+G7p2EgdOG7q25nIG5ow7NtIGtow6FjaCBow6BuZyDEkeG7kWkgduG7m2kgY8OhYyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4ga2jDoWMgbmhhdS4NCg0KYGBge3J9DQojIENodXnhu4NuIHNhbmcgZGF0YWZyYW1lDQpraF90dCA8LSBhcy5kYXRhLmZyYW1lKGJ0c19jdXN0b21lcnR5cGVfcGF5bWVudCkNCmNvbG5hbWVzKGtoX3R0KSA8LSBjKCJDdXN0b21lclR5cGUiLCJQYXltZW50IiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kw0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGtoX3R0LCBhZXMoQ3VzdG9tZXJUeXBlLCBDb3VudCAsIGZpbGwgPSBQYXltZW50KSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgbGFicyh0aXRsZSA9ICJDxqEgY+G6pXUgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHRoZW8gbG/huqFpIGtow6FjaCBow6BuZyIsDQogICAgICAgeCA9ICJMb+G6oWkga2jDoWNoIGjDoG5nIiwgeSA9ICJT4buRIGzGsOG7o25nIiwgZmlsbCA9ICJQaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4iKSArIA0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyMgNC4zLjMgTmjhuq1uIHjDqXQgTcO0IHThuqMNCg0KQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04bu3IGzhu4cgc+G7rSBk4bulbmcgY8OhYyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gKENhc2gsIENyZWRpdCBjYXJkLCBFd2FsbGV0KSB0aGVvIHThu6tuZyBuaMOzbSBraMOhY2ggaMOgbmcgKE1lbWJlciB2w6AgTm9ybWFsKS4gRMaw4bubaSDEkcOieSBsw6AgbeG7mXQgc+G7kSBuaOG6rW4geMOpdCBjaMOtbmg6DQoNCioqWHUgaMaw4bubbmcgY2h1bmc6KioNCg0KLSAgIFThu7cgbOG7hyBz4butIGThu6VuZyB0aeG7gW4gbeG6t3QgKENhc2gpIHbDoCB2w60gxJFp4buHbiB04butIChFd2FsbGV0KSBjw7MgeHUgaMaw4bubbmcgY2FvIGjGoW4gdHJvbmcgbmjDs20ga2jDoWNoIGjDoG5nIGLDrG5oIHRoxrDhu51uZyAoTm9ybWFsKSBzbyB24bubaSBuaMOzbSBo4buZaSB2acOqbiAoTWVtYmVyKS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIGtow6FjaCBow6BuZyBiw6xuaCB0aMaw4budbmcgY8OzIHRo4buDIMawdSB0acOqbiBjw6FjIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiB0cnV54buBbiB0aOG7kW5nIGjGoW4uDQoNCi0gICBOaMOzbSBraMOhY2ggaMOgbmcgaOG7mWkgdmnDqm4gKE1lbWJlcik6IFThu7cgbOG7hyBz4butIGThu6VuZyB0aOG6uyB0w61uIGThu6VuZyAoQ3JlZGl0IGNhcmQpIGNhbyBuaOG6pXQgKDM0LjMzJSksIGNobyB0aOG6pXkgcuG6sW5nIGtow6FjaCBow6BuZyBo4buZaSB2acOqbiBjw7MgeHUgaMaw4bubbmcgdGluIHTGsOG7n25nIHbDoG8gY8OhYyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4ga2jDtG5nIHRp4buBbiBt4bq3dCBoxqFuLg0KDQotICAgTmjDs20ga2jDoWNoIGjDoG5nIGLDrG5oIHRoxrDhu51uZyAoTm9ybWFsKTogVOG7tyBs4buHIHPhu60gZOG7pW5nIHbDrSDEkWnhu4duIHThu60gY2FvIG5o4bqldCAoMzYuODclKSwgY2hvIHRo4bqleSBy4bqxbmcgaOG7jSBjw7MgdGjhu4MgxrBhIGNodeG7mW5nIHPhu7EgdGnhu4duIGzhu6NpIHbDoCBuaGFuaCBjaMOzbmcgbcOgIHbDrSDEkWnhu4duIHThu60gbWFuZyBs4bqhaS4gVHV5IG5oacOqbiwgdOG7tyBs4buHIHPhu60gZOG7pW5nIHRo4bq7IHTDrW4gZOG7pW5nIHRyb25nIG5ow7NtIG7DoHkgbOG6oWkgdGjhuqVwIGjGoW4gKDI3Ljg2JSkuDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNCkPDsyBt4buZdCBz4buxIGtow6FjIGJp4buHdCByw7UgcsOgbmcgdHJvbmcgdGjDs2kgcXVlbiBz4butIGThu6VuZyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gZ2nhu69hIGhhaSBuaMOzbSBraMOhY2ggaMOgbmcuIE5ow7NtIGjhu5lpIHZpw6puIGPDsyB4dSBoxrDhu5tuZyBz4butIGThu6VuZyB0aOG6uyB0w61uIGThu6VuZyBuaGnhu4F1IGjGoW4sIHRyb25nIGtoaSBuaMOzbSBiw6xuaCB0aMaw4budbmcgbOG6oWkgxrBhIGNodeG7mW5nIHRp4buBbiBt4bq3dCB2w6AgdsOtIMSRaeG7h24gdOG7rS4gQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgbWluaCBo4buNYSByw7UgcsOgbmcgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBsb+G6oWkga2jDoWNoIGjDoG5nIHbDoCBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4sIGNobyB0aOG6pXkgcuG6sW5nIHPhu58gdGjDrWNoIHRoYW5oIHRvw6FuIGPDsyB0aOG7gyBi4buLIOG6o25oIGjGsOG7n25nIGLhu59pIHTDrG5oIHRy4bqhbmcgaOG7mWkgdmnDqm4gY+G7p2Ega2jDoWNoIGjDoG5nLg0KDQojIyMgNC4zLjQgS2nhu4NtIMSR4buLbmggVGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotICAgKipI4oKAKio6IExv4bqhaSBraMOhY2ggaMOgbmcgdsOgIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiBsw6AgaGFpIGJp4bq/biDEkeG7mWMgbOG6rXAuDQoNCi0gICAqKkjigoEqKjogTG/huqFpIGtow6FjaCBow6BuZyB2w6AgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIGzDoCBjw7MgbGnDqm4gcXVhbi4NCg0KKipUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyoqDQoNCmBgYHtyfQ0KI1ThuqFvIGLhuqNuZyB04bqnbiBz4buRDQpidHNvX2N1c3RvbWVydHlwZV9wYXltZW50IDwtIHRhYmxlKGR0JEN1c3RvbWVyVHlwZSwgZHQkUGF5bWVudCkNCmJ0c29fY3VzdG9tZXJ0eXBlX3BheW1lbnQNCmBgYA0KDQpgYGB7cn0NCmNoaV90ZXN0IDwtIGNoaXNxLnRlc3QoYnRzb19jdXN0b21lcnR5cGVfcGF5bWVudCkNCmNoaV90ZXN0DQpgYGANCg0KKipOaOG6rW4geMOpdCBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotICAgR2nDoSB0cuG7iyBDaGktYsOsbmggcGjGsMahbmcgKFjCsik6IDUuMjE3DQoNCi0gICBC4bqtYyB04buxIGRvIChkZik6IDINCg0KLSAgIEdpw6EgdHLhu4sgcDogXDwgMC4wNzM2NA0KDQoqKkvhur90IGx14bqtbjoqKiBE4buxYSB2w6BvIGdpw6EgdHLhu4sgcCAoMC4wNzM2NCkgdsOgIG3hu6ljIMO9IG5naMSpYSDOsSA9IDAuMDUsIHRhIGtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGhhaSBiaeG6v24gKGxv4bqhaSBraMOhY2ggaMOgbmcgdsOgIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbikgbMOgIMSR4buZYyBs4bqtcCB24bubaSBuaGF1IOG7nyBt4bupYyDDvSBuZ2jEqWEgMC4wNS4NCg0KTsOzaSBjw6FjaCBraMOhYywga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGxv4bqhaSBraMOhY2ggaMOgbmcgdsOgIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8Ohbi4gS+G6v3QgcXXhuqMgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBz4buxIGzhu7FhIGNo4buNbiBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4ga2jDtG5nIGLhu4sg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IGLhu59pIHZp4buHYyBraMOhY2ggaMOgbmcgbMOgIGjhu5lpIHZpw6puIGhheSBiw6xuaCB0aMaw4budbmcsIHbDoCBjw7MgdGjhu4MgY2hvIHRo4bqleSBy4bqxbmcgY8OhYyB54bq/dSB04buRIGtow6FjIG5oxrAgdGjDs2kgcXVlbiBjaGkgdGnDqnUgaG/hurdjIHPhu58gdGjDrWNoIGPDoSBuaMOibiBjw7MgdGjhu4MgxJHDs25nIHZhaSB0csOyIHF1YW4gdHLhu41uZyBoxqFuIHRyb25nIHF1eeG6v3QgxJHhu4tuaCB0aGFuaCB0b8OhbiBj4bunYSBo4buNLg0KDQojIFBo4bqnbiA1OiBTbyBzw6FuaCB2w6AgdGjGsOG7m2MgxJFvIG3hu5FpIGxpw6puIGjhu4cNCg0KIyMgNS4xLiBIaeG7h3UgaGFpIHThu7cgbOG7hyAoRGlmZmVyZW5jZSBpbiBQcm9wb3J0aW9ucyk6DQoNCiMjIyA1LjEuMS4gQuG6o25nIGNow6lvIDJ4MiBnaeG7r2EgR2VuZGVyIHbDoCBDdXN0b21lclR5cGU6DQoNCmBgYHtyfQ0KIyBC4bqjbmcgY2jDqW8gZ2nhu69hIEdlbmRlciB2w6AgQ3VzdG9tZXJUeXBlDQptaCA8LSB0YWJsZShkdCRHZW5kZXIsIGR0JEN1c3RvbWVyVHlwZSkgDQphZGRtYXJnaW5zKG1oKQ0KYGBgDQoNCktp4buDbSDEkeG7i25oOiAtIEjigoA6IFThu7cgbOG7hyBsw6AgaOG7mWkgdmnDqm4gZ2nhu69hIG7hu68gdsOgIG5hbSBsw6AgYuG6sW5nIG5oYXUuIChw4oKBIC0gcOKCgiA9MCApIC0gSOKCgTogVOG7tyBs4buHIGzDoCBo4buZaSB2acOqbiBj4bunYSBu4buvIGNhbyBoxqFuIHThu7cgbOG7hyBj4bunYSBuYW0uKHDigoEgLSBw4oKCIFw+IDApDQoNCioqVMOtbmggdG/DoW4gVOG7tyBs4buHKioNCg0KLSAgICoqVOG7tyBs4buHIG7hu68gbMOgIGjhu5lpIHZpw6puOioqDQogICAgLSAgICQkIHBfMV57XHRleHR7TWVtYmVyfX0gPSBcZnJhY3syNjF9ezUwMX0gXHF1YWQgXHRleHR7KHThu7cgbOG7hyBu4buvIGzDoCBo4buZaSB2acOqbil9ICQkDQotICAgKipU4bu3IGzhu4cgbmFtIGzDoCBo4buZaSB2acOqbjoqKg0KICAgIC0gICAkJCBwXzJee1x0ZXh0e01lbWJlcn19ID0gXGZyYWN7MjQwfXs0OTl9IFxxdWFkIFx0ZXh0eyh04bu3IGzhu4cgbmFtIGzDoCBo4buZaSB2acOqbil9ICQkXA0KDQoqKlTDrW5oIGhp4buHdSBoYWkgdOG7tyBs4buHKioNCg0KLSAgICQkIGRee1x0ZXh0e01lbWJlcn19ID0gcF8xXntcdGV4dHtNZW1iZXJ9fSAtIHBfMl57XHRleHR7TWVtYmVyfX0gJCQNCg0KYGBge3J9DQpjb3VudHMxIDwtIGMobWhbIkZlbWFsZSIsICJNZW1iZXIiXSwgbWhbIk1hbGUiLCAiTWVtYmVyIl0pDQp0b3RhbHMxIDwtIGMoc3VtKG1oWyJGZW1hbGUiLCBdKSwgc3VtKG1oWyJNYWxlIiwgXSkpDQoNCnRlc3QxIDwtIHByb3AudGVzdChjb3VudHMxLCB0b3RhbHMxLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgY29ycmVjdCA9IEZBTFNFKQ0KdGVzdDENCmBgYA0KDQotICAgcHJvcCAxIChwMSkgPSAwLjUyMDk1ODE6IHThu7cgbOG7hyBu4buvIGzDoCBo4buZaSB2acOqbiBraG/huqNuZyA1Mi4xMCUNCg0KLSAgIHByb3AgMiAocDIpID0gMC40ODA5NjE5OiB04bu3IGzhu4cgbmFtIGzDoCBo4buZaSB2acOqbiBraG/huqNuZyA0OC4xMCUNCg0KLSAgIFAtdmFsdWUgPSAwLjEwMw0KDQpHacOhIHRy4buLIHAtdmFsdWUgdGh1IMSRxrDhu6NjIGzDoCAwLjEwMywgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgMC4wNS4gRG8gxJHDsywgY2jDum5nIHRhICoqa2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKAKiogJEhfMDogcF8xIC0gcF8yID0gMCQuDQoNCsSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCwgdGhlbyBk4buvIGxp4buHdSBoaeG7h24gdOG6oWksIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdOG7tyBs4buHIGjhu5lpIHZpw6puIGPhu6dhIG7hu68gdsOgIG5hbS4gS2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyBjaG8gdGjhuqV5IHThu7cgbOG7hyBu4buvIGjhu5lpIHZpw6puIGNhbyBoxqFuIHThu7cgbOG7hyBuYW0uDQoNCiMjIDUuMi4gVOG7tyBz4buRIE5ndXkgY8ahIChSZWxhdGl2ZSBSaXNrIC0gUlIpOg0KDQojIyMgNS4yLjEuIELhuqNuZyBjaMOpbyAyeDIgZ2nhu69hIEdlbmRlciB2w6AgQ3VzdG9tZXJUeXBlOg0KDQpgYGB7cn0NCm1oIDwtIHRhYmxlKGR0JEdlbmRlciwgZHQkQ3VzdG9tZXJUeXBlKQ0KI1Row6ptIHThu5VuZyBow6BuZyB2w6AgY+G7mXQNCm1oMSA8LSBhZGRtYXJnaW5zKG1oKQ0KbWgxDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0Kcmlza3JhdGlvKG1oLCBtZXRob2Q9IndhbGQiKQ0KYGBgDQoNCi0gICBOaMOzbSBu4buvIChGZW1hbGUpIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSwgbsOqbiBSUiA9IDEuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGNow7puZyB0YSBzbyBzw6FuaCBuZ3V5IGPGoSB0cuG7nyB0aMOgbmggaOG7mWkgdmnDqm4gY+G7p2EgbmjDs20gbmFtIChNKSB24bubaSBuaMOzbSBu4buvLg0KDQotICAgTmjDs20gbmFtIChNYWxlKSBjw7MgUlIgPSAxLjA4MzQ5MiBuZ2jEqWEgbMOgOg0KDQpU4bu3IGzhu4cgaOG7mWkgdmnDqm4g4bufIG5hbSBi4bqxbmcga2hv4bqjbmcgMTA4LjM1JSBzbyB24bubaSBu4buvLiBIYXkgbsOzaSBjw6FjaCBraMOhYywgbmd1eSBjxqEgKHjDoWMgc3XhuqV0KSB0cuG7nyB0aMOgbmggaOG7mWkgdmnDqm4gY+G7p2EgbmFtIGNhbyBoxqFuIG7hu68ga2hv4bqjbmcgOC4zNSUuDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgY+G7p2EgUlIgbMOgICgwLjk1Njc2NDkg4oCTIDEuMjI3MDA1KToNCg0KS2hv4bqjbmcgbsOgeSBiYW8gZ+G7k20gc+G7kSAxLCBuZ2jEqWEgbMOgIGdpw6EgdHLhu4sgUlIgdGjhu7FjIHPhu7EgY8OzIHRo4buDIGzDoCAxIChraMO0bmcgY8OzIGtow6FjIGJp4buHdCkuDQoNCktob+G6o25nIHRpbiBj4bqteSBjaG8gdGEgYmnhur90IG3hu6ljIMSR4buZIGNow61uaCB4w6FjIGPhu6dhIMaw4bubYyBsxrDhu6NuZyBSUjsga2hv4bqjbmcgcuG7mW5nIHbDoCBiYW8gZ+G7k20gMSBjaG8gdGjhuqV5IHPhu7Ega2jDtG5nIGNo4bqvYyBjaOG6r24gdsOgIHRoaeG6v3UgYuG6sW5nIGNo4bupbmcgduG7gSBz4buxIGtow6FjIGJp4buHdCB0aOG7sWMgc+G7sS4NCg0KVGEgY8OzIGdp4bqjIHRodXnhur90Og0KDQpI4oKAOiBU4bu3IGzhu4cgaOG7mWkgdmnDqm4g4bufIE5hbSB2w6AgTuG7ryBraMO0bmcga2jDoWMgbmhhdSwgdOG7qWMgbMOgIFJSID0gMS4NCg0KSOKCgTogVOG7tyBs4buHIGjhu5lpIHZpw6puIOG7nyBOYW0gdsOgIE7hu68ga2jDoWMgbmhhdSwgUlIg4omgIDEuDQoNCnwgS2nhu4NtIMSR4buLbmggICAgfCBwLXZhbHVlIChOYW0gc28gduG7m2kgTuG7rykgfCDDnSBuZ2jEqWEgY2jDrW5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IG1pZHAuZXhhY3QgICB8IDAuMjA2ODMxMSAgICAgICAgICAgICAgIHwgcC12YWx1ZSBjaMOtbmggeMOhYywgc+G7rSBk4bulbmcgcGjGsMahbmcgcGjDoXAg4oCcbWlkLXDigJ0gKG3hu5l0IGJp4bq/biB0aOG7gyBjaMOtbmggeMOhYyBoxqFuIEZpc2hlcikgfA0KfCBmaXNoZXIuZXhhY3QgfCAwLjIyOTQ3NDMgICAgICAgICAgICAgICB8IHAtdmFsdWUgdOG7qyBraeG7g20gxJHhu4tuaCBGaXNoZXIgY2jDrW5oIHjDoWMgKHBow7kgaOG7o3AgduG7m2kgYuG6o25nIG5o4buPIGhv4bq3YyBz4buRIGxp4buHdSDDrXQpICAgICAgIHwNCnwgY2hpLnNxdWFyZSAgIHwgMC4yMDU5NDY3ICAgICAgICAgICAgICAgfCBwLXZhbHVlIHThu6sga2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZSAoeOG6pXAgeOG7iSwgZOG7sWEgdHLDqm4gcGjDom4gcGjhu5FpIGNoaSBiw6xuaCBwaMawxqFuZykgICAgICAgfA0KDQpWw6wgcC12YWx1ZSBcPiAwLjA1LCB0YSBraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIG7Ds2kgcuG6sW5nIGdp4bubaSB0w61uaCDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24ga2jhuqMgbsSDbmcgdHLhu58gdGjDoG5oIGjhu5lpIHZpw6puLg0KDQpOw7NpIGPDoWNoIGtow6FjLCBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgbmjDs20gTmFtIHbDoCBuaMOzbSBO4buvIHbhu4EgdOG7tyBs4buHIGjhu5lpIHZpw6puIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQojIyA1LjMuIFThu7cgc+G7kSBDaMOqbmggKE9kZHMgUmF0aW8gLSBPUik6Og0KDQojIyMgNS4zLjEuIEdlbmRlciB2w6AgQ3VzdG9tZXJUeXBlOg0KDQpgYGB7cn0NCiMgVMOtbmggT1IgdsOgIGtob+G6o25nIHRpbiBj4bqteQ0Kb3JfbWggPC0gb2Rkc3JhdGlvKG1oLCBtZXRob2QgPSAid2FsZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0Kb3JfbWgNCm9kZHNyYXRpbyhtaCwgbWV0aG9kID0gIndhbGQiLCBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQpgYGB7cn0NCm9kZHNyYXRpbyhtaCwgbWV0aG9kID0gIndhbGQiLCBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQotICAgT2RkcyBSYXRpbyAoT1IpID0gMS4xNzM1OTQNCg0KLSAgIEtob+G6o25nIHRpbiBj4bqteSA5NSU6IHThu6sgMC45MTU3MTggxJHhur9uIDEuNTA0MDkNCg0KR2nDoSB0cuG7iyBPUiA9IDEuMTczNTk0IGNobyB0aOG6pXkgb2RkcyAoY8ahIGjhu5lpKSB0cuG7nyB0aMOgbmggaOG7mWkgdmnDqm4gY+G7p2EgbmFtIGNhbyBoxqFuIG7hu68ga2hv4bqjbmcgMTcuMzYlLiBUdXkgbmhpw6puLCBz4buxIGtow6FjIGJp4buHdCBuw6B5IGtow7RuZyBs4bubbi4NCg0KRG8ga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaOG7qWEgZ2nDoSB0cuG7iyAxLCBuw6puOiBLaMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgZ2nhu5tpIHTDrW5oIOG6o25oIGjGsOG7n25nIMSR4bq/biBvZGRzIHRy4bufIHRow6BuaCBo4buZaSB2acOqbi4NCg0KKipL4bq/dCBsdeG6rW46KiogTeG6t2MgZMO5IG5hbSBjw7MgduG6uyBjw7Mgb2RkcyB0cuG7nyB0aMOgbmggaOG7mWkgdmnDqm4gY2FvIGjGoW4gbuG7ryBt4buZdCBjaMO6dCwgbmjGsG5nIHPhu7Ega2jDoWMgYmnhu4d0IGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiBEbyDEkcOzLCBnaeG7m2kgdMOtbmgga2jDtG5nIHBo4bqjaSBsw6AgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyByw7UgcuG7h3QgxJHhur9uIGto4bqjIG7Eg25nIHRy4bufIHRow6BuaCBo4buZaSB2acOqbiB0cm9uZyBk4buvIGxp4buHdSBoaeG7h24gdOG6oWkuDQoNCiMgUGjhuqduIDY6IFThu5VuZyBr4bq/dCB2w6AgVGjhuqNvIGx14bqtbg0KDQpUcm9uZyBwaMOibiB0w61jaCBuw6B5LCBjaMO6bmcgdGEgxJHDoyBraMOhbSBwaMOhIGjDoG5oIHZpIG11YSBz4bqvbSBj4bunYSBraMOhY2ggaMOgbmcgcXVhIHThuq1wIGThu68gbGnhu4d1IFN1cGVybWFya2V0IFNhbGVzLiBN4buZdCBz4buRIGvhur90IGx14bqtbiBjaMOtbmggbmjGsCBzYXU6DQoNCiMjIDYuMSBU4buVbmcgcXVhbiB24buBIGvhur90IHF14bqjDQoNCkJp4bq/biDEkeG7i25oIHTDrW5oOiBU4bu3IGzhu4cgbuG7ryB2w6AgbmFtIHRyb25nIG3huqt1IGfhuqduIG5oxrAgYuG6sW5nIG5oYXUsIGNobyB0aOG6pXkga2jDtG5nIGPDsyB0aGnDqm4gbOG7h2NoIGdp4bubaSB0w61uaC4NCg0KTeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/bjogS2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgZ2nhu69hIGdp4bubaSB0w61uaCwgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHbDoCB24buLIHRyw60gxJHhu4thIGzDvSwgY2hvIHRo4bqleSB54bq/dSB04buRIGtow6FjIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyBs4bubbiBoxqFuLg0KDQpQaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW46IEV3YWxsZXQgbMOgIHBoxrDGoW5nIHRo4bupYyBjaMOtbmggxJHGsOG7o2MgxrBhIGNodeG7mW5nLCBwaOG6o24gw6FuaCB4dSBoxrDhu5tuZyBz4butIGThu6VuZyBjw7RuZyBuZ2jhu4cgdGhhbmggdG/DoW4gxJFp4buHbiB04butLg0KDQojIyA2LjIgVGjhuqNvIGx14bqtbg0KDQpL4bq/dCBxdeG6oyBjaOG7iSByYSBy4bqxbmc6DQoNClnhur91IHThu5EgYsOqbiBuZ2/DoGk6IEPDoWMgeeG6v3UgdOG7kSBuaMawIGNoxrDGoW5nIHRyw6xuaCBraHV54bq/biBtw6NpIHbDoCB0aMawxqFuZyBoaeG7h3UgY+G6p24gxJHGsOG7o2MgbmdoacOqbiBj4bupdSB0aMOqbSDEkeG7gyBoaeG7g3UgcsO1IGjGoW4gduG7gSBow6BuaCB2aSBtdWEgc+G6r20uDQoNClBow6JuIGtow7pjIGtow6FjaCBow6BuZzogTmdoacOqbiBj4bupdSB0aGVvIMSR4buZIHR14buVaSB2w6AgdGh1IG5o4bqtcCBjw7MgdGjhu4MgY3VuZyBj4bqlcCB0aMO0bmcgdGluIHF1w70gZ2nDoS4NCg0KVGjhu51pIGdpYW4gdsOgIHh1IGjGsOG7m25nOiBOZ2hpw6puIGPhu6l1IGTDoGkgaOG6oW4gc+G6vSBnacO6cCB0aGVvIGTDtWkgc+G7sSB0aGF5IMSR4buVaSB0cm9uZyBow6BuaCB2aSB0acOqdSBkw7luZy4NCg0KIyMgNi4zIEvhur90IGx14bqtbg0KDQpQaMOibiB0w61jaCDEkcOjIGdpw7pwIGhp4buDdSByw7UgaMahbiB24buBIGjDoG5oIHZpIHRpw6p1IGTDuW5nIHThuqFpIHNpw6p1IHRo4buLLiBEw7kgY8OzIG3hu5l0IHPhu5EgeHUgaMaw4bubbmcgbmjhuqV0IMSR4buLbmgsIG5oaeG7gXUgeeG6v3UgdOG7kSBraMOhYyBjxaluZyBj4bqnbiB4ZW0geMOpdCDEkeG7gyBwaMOhdCB0cmnhu4NuIGNoaeG6v24gbMaw4bujYyBraW5oIGRvYW5oIGhp4buHdSBxdeG6oyBoxqFuLiBIeSB24buNbmcgbmdoacOqbiBj4bupdSB0aeG6v3AgdGhlbyBz4bq9IGtow6FtIHBow6Egc8OidSBoxqFuIHbhuqVuIMSR4buBIG7DoHksIGN1bmcgY+G6pXAgdGjDtG5nIHRpbiBnacOhIHRy4buLIGNobyBuZ8OgbmggYsOhbiBs4bq7Lg0K