library(readr)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(dplyr)
## 
## 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(skimr)
## Warning: package 'skimr' was built under R version 4.3.3
library(psych)
## Warning: package 'psych' was built under R version 4.3.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(csv)
## Warning: package 'csv' was built under R version 4.3.3
library(DT)
## Warning: package 'DT' was built under R version 4.3.3
library(pander)
## Warning: package 'pander' was built under R version 4.3.3
library(formattable)
## Warning: package 'formattable' was built under R version 4.3.3
library(htmltools)
## 
## Attaching package: 'htmltools'
## The following object is masked from 'package:pander':
## 
##     p
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.3
## 
## Attaching package: 'DescTools'
## The following objects are masked from 'package:psych':
## 
##     AUC, ICC, SD
library(epitools)

Phần 1. TÌM HIỂU VÀ CHUẨN BỊ DỮ LIỆU

1. Đọc file dữ liệu

Bộ dữ liệu này mô phỏng hồ sơ bệnh nhân COVID-19 tại Đan Mạch, tập trung vào các yếu tố như lần nhiễm đầu tiên, tái nhiễm, tiêm vắc-xin, hội chứng hậu COVID (long COVID), cùng các thông tin nhân khẩu học và kết quả lâm sàng quan trọng. Dữ liệu bao gồm 3.000 hồ sơ tổng hợp với 26 đặc trưng liên quan, được thiết kế sát với thực tế nhằm phục vụ cho việc phân tích khám phá, mô hình dịch tễ học và mục đích giáo dục.

Toàn bộ dữ liệu đều là dữ liệu tổng hợp (synthetic), tái hiện các xu hướng thực tế từng ghi nhận trong giai đoạn đại dịch 2020–2024, đảm bảo an toàn khi sử dụng công khai. Bộ dữ liệu này phù hợp cho các ứng dụng như học máy, phân tích sống sót (survival analysis), khám phá yếu tố nguy cơ và nhiều nghiên cứu khác.

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

2. Cấu trúc bộ dữ liệu

names(d)
##  [1] "Patient_ID"            "Age"                   "Gender"               
##  [4] "Region"                "Preexisting_Condition" "Date_of_Infection"    
##  [7] "COVID_Strain"          "Symptoms"              "Severity"             
## [10] "Hospitalized"          "ICU_Admission"         "Ventilator_Support"   
## [13] "Recovered"             "Reinfection"           "Vaccination_Status"   
## [16] "Vaccine_Type"          "Doses_Received"        "Long_COVID_Symptoms"  
## [19] "Occupation"            "Smoking_Status"        "BMI"
str(d)
## 'data.frame':    3000 obs. of  21 variables:
##  $ Patient_ID           : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Age                  : int  69 38 41 81 50 66 76 77 79 72 ...
##  $ Gender               : chr  "Male" "Male" "Female" "Female" ...
##  $ Region               : chr  "Hovedstaden" "Sjælland" "Syddanmark" "Hovedstaden" ...
##  $ Preexisting_Condition: chr  "Obesity" "Asthma" "Hypertension" "Asthma" ...
##  $ Date_of_Infection    : chr  "21/06/2022" "02/02/2024" "28/05/2023" "13/08/2023" ...
##  $ COVID_Strain         : chr  "Delta" "XBB.1.5" "Beta" "Delta" ...
##  $ Symptoms             : chr  "Mild" "Mild" "Mild" "Severe" ...
##  $ Severity             : chr  "Moderate" "Moderate" "High" "High" ...
##  $ Hospitalized         : chr  "Yes" "No" "Yes" "No" ...
##  $ ICU_Admission        : chr  "No" "No" "Yes" "No" ...
##  $ Ventilator_Support   : chr  "No" "No" "Yes" "No" ...
##  $ Recovered            : chr  "Yes" "No" "No" "Yes" ...
##  $ Reinfection          : chr  "No" "No" "No" "Yes" ...
##  $ Vaccination_Status   : chr  "Yes" "No" "Yes" "Yes" ...
##  $ Vaccine_Type         : chr  "None" "None" "Janssen" "AstraZeneca" ...
##  $ Doses_Received       : int  1 0 3 1 2 3 0 3 0 1 ...
##  $ Long_COVID_Symptoms  : chr  "None" "None" "None" "None" ...
##  $ Occupation           : chr  "Healthcare" "Healthcare" "Unemployed" "Office Worker" ...
##  $ Smoking_Status       : chr  "Never" "Never" "Never" "Never" ...
##  $ BMI                  : num  27.7 21.9 22.7 27.7 11.9 29.8 22.3 24.4 26.1 21.2 ...
  • Bộ dữ liệu covid_related_disease_data chứa tổng cộng 3.000 bản ghi với 21 biến đặc trưng mô tả thông tin liên quan đến bệnh nhân nhiễm COVID-19. Việc hiểu rõ cấu trúc và ý nghĩa của các biến là bước đầu quan trọng trong quá trình phân tích và xử lý dữ liệu.

  • Các biến trong bộ dữ liệu bao gồm:

Tên biến Mô tả
Patient_ID Mã định danh duy nhất cho từng bệnh nhân
Age Tuổi của bệnh nhân
Gender Giới tính bệnh nhân (Male: nam, Female: nữ)
Region Khu vực địa lý sinh sống (ví dụ: Hovedstaden, Sjælland, …)
Preexisting_Condition Bệnh nền trước khi nhiễm (ví dụ: Obesity, Asthma, Hypertension, …)
Date_of_Infection Ngày nhiễm COVID-19 (định dạng “DD/MM/YYYY”)
COVID_Strain Biến thể virus SARS-CoV-2 mà bệnh nhân nhiễm (ví dụ: Delta, Beta, …)
Symptoms Mức độ triệu chứng ban đầu (ví dụ: Mild, Severe)
Severity Mức độ nghiêm trọng tổng thể của bệnh (ví dụ: Moderate, High)
Hospitalized Bệnh nhân có nhập viện hay không (Yes/No)
ICU_Admission Bệnh nhân có nhập ICU hay không (Yes/No)
Ventilator_Support Bệnh nhân có cần hỗ trợ thở máy không (Yes/No)
Recovered Bệnh nhân đã hồi phục hay chưa (Yes/No)
Reinfection Bệnh nhân có tái nhiễm COVID-19 không (Yes/No)
Vaccination_Status Bệnh nhân đã tiêm vắc-xin hay chưa (Yes/No)
Vaccine_Type Loại vắc-xin đã tiêm (nếu có), ví dụ: AstraZeneca, Janssen
Doses_Received Số liều vắc-xin mà bệnh nhân đã tiêm
Long_COVID_Symptoms Triệu chứng COVID kéo dài sau khi khỏi bệnh (nếu có)
Occupation Nghề nghiệp của bệnh nhân
Smoking_Status Tình trạng hút thuốc (Never, Former, Current, …)
BMI Chỉ số khối cơ thể của bệnh nhân (BMI - Body Mass Index)

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

dldt <- c("Gender", "Region", "Preexisting_Condition", "COVID_Strain",
          "Symptoms", "Severity", "Hospitalized", "ICU_Admission", "Ventilator_Support",
          "Recovered", "Reinfection", "Vaccination_Status", "Vaccine_Type",
          "Long_COVID_Symptoms", "Occupation", "Smoking_Status")
dldt
##  [1] "Gender"                "Region"                "Preexisting_Condition"
##  [4] "COVID_Strain"          "Symptoms"              "Severity"             
##  [7] "Hospitalized"          "ICU_Admission"         "Ventilator_Support"   
## [10] "Recovered"             "Reinfection"           "Vaccination_Status"   
## [13] "Vaccine_Type"          "Long_COVID_Symptoms"   "Occupation"           
## [16] "Smoking_Status"

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

dt <- d[, dldt]

5. Một vài dòng đầu và dòng cuối

head(dt)
##   Gender      Region Preexisting_Condition COVID_Strain Symptoms Severity
## 1   Male Hovedstaden               Obesity        Delta     Mild Moderate
## 2   Male    Sjælland                Asthma      XBB.1.5     Mild Moderate
## 3 Female  Syddanmark          Hypertension         Beta     Mild     High
## 4 Female Hovedstaden                Asthma        Delta   Severe     High
## 5 Female  Syddanmark        Cardiovascular        Delta     Mild     High
## 6   Male    Sjælland        Cardiovascular      Omicron Moderate Moderate
##   Hospitalized ICU_Admission Ventilator_Support Recovered Reinfection
## 1          Yes            No                 No       Yes          No
## 2           No            No                 No        No          No
## 3          Yes           Yes                Yes        No          No
## 4           No            No                 No       Yes         Yes
## 5           No            No                 No        No          No
## 6           No            No                 No       Yes          No
##   Vaccination_Status Vaccine_Type Long_COVID_Symptoms    Occupation
## 1                Yes         None                None    Healthcare
## 2                 No         None                None    Healthcare
## 3                Yes      Janssen                None    Unemployed
## 4                Yes  AstraZeneca                None Office Worker
## 5                Yes         None                None       Student
## 6                Yes  AstraZeneca                None    Healthcare
##   Smoking_Status
## 1          Never
## 2          Never
## 3          Never
## 4          Never
## 5          Never
## 6          Never
tail(dt)
##      Gender      Region Preexisting_Condition COVID_Strain Symptoms Severity
## 2995   Male  Syddanmark                  None        Delta     Mild      Low
## 2996   Male Nordjylland          Hypertension      XBB.1.5   Severe Critical
## 2997 Female  Syddanmark               Obesity      Omicron Moderate      Low
## 2998 Female    Sjælland        Cardiovascular         Beta   Severe Moderate
## 2999 Female Hovedstaden                Asthma        Delta   Severe Moderate
## 3000 Female Midtjylland               Obesity      XBB.1.5 Moderate      Low
##      Hospitalized ICU_Admission Ventilator_Support Recovered Reinfection
## 2995           No            No                 No        No          No
## 2996           No            No                 No        No          No
## 2997           No            No                 No        No          No
## 2998           No            No                 No        No          No
## 2999           No            No                 No        No          No
## 3000           No            No                 No        No          No
##      Vaccination_Status Vaccine_Type Long_COVID_Symptoms Occupation
## 2995                 No         None                None    Student
## 2996                Yes         None                None     Driver
## 2997                Yes       Pfizer                None Healthcare
## 2998                Yes      Moderna                None    Teacher
## 2999                Yes  AstraZeneca                None    Student
## 3000                 No         None                None    Teacher
##      Smoking_Status
## 2995          Never
## 2996          Never
## 2997          Never
## 2998         Former
## 2999          Never
## 3000         Former

6. Kiểm tra NA

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

Vậy bộ dữ liệu không có giá trị thiếu

7. Kiểm tra kiểu dữ liệu và đổi về factor

# Kiểm tra kiểu dữ liệu của từng biến trong dldt
sapply(dt, class) 
##                Gender                Region Preexisting_Condition 
##           "character"           "character"           "character" 
##          COVID_Strain              Symptoms              Severity 
##           "character"           "character"           "character" 
##          Hospitalized         ICU_Admission    Ventilator_Support 
##           "character"           "character"           "character" 
##             Recovered           Reinfection    Vaccination_Status 
##           "character"           "character"           "character" 
##          Vaccine_Type   Long_COVID_Symptoms            Occupation 
##           "character"           "character"           "character" 
##        Smoking_Status 
##           "character"
dt <- data.frame(lapply(dt, as.factor))

Phần 2. PHÂN TÍCH MÔ TẢ MỘT BIẾN ĐỊNH TÍNH

2.1. Biến Gender

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Gender)/sum(nrow(dt))
## 
## Female   Male 
##  0.509  0.491

Bảng tần số

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

Biểu đồ

gender_freq  <- table(dt$Gender)
gender_pct   <- gender_freq / nrow(dt)
# Bước 1: Chuyển bảng sang data.frame
gender_freq <- table(dt$Gender)                     # Đếm số lượng từng nhóm giới tính (ví dụ: "M", "F"), trả về đối tượng table
gender_df <- as.data.frame(gender_freq)             # Chuyển từ table sang data.frame để xử lý dễ hơn trong ggplot2
colnames(gender_df) <- c("Gender", "Count")         # Đặt tên cột rõ ràng: "Gender" là tên nhóm, "Count" là số lượng

# Bước 2: Tính phần trăm
gender_df$Percent <- gender_df$Count / sum(gender_df$Count) * 100

# Bước 3: Tạo nhãn giống như trong pie()
gender_df$Label <- paste0(                             # Ghép chuỗi để tạo nhãn
  gender_df$Gender, " (",                              # Thêm tên giới tính và dấu mở ngoặc
  round(gender_df$Percent, 1), "%)"                    # Làm tròn phần trăm 1 chữ số và thêm dấu %
)

# Bước 4: Vẽ biểu đồ tròn bằng ggplot2
ggplot(gender_df, aes(x = "", y = Count, fill = Gender)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y") +
  theme_void() +
  labs(title = "Biểu đồ 1. Phân bố giới tính (Gender)") +
  geom_text(aes(label = Label), 
            position = position_stack(vjust = 0.5), 
            size = 5) +
  scale_fill_manual(values = c("Female" = "lightpink", 
                               "Male" = "lightblue"))

Nhận xét:

  • Trong bộ dữ liệu, biến định tính Gender (giới tính) gồm hai nhóm chính là Female (nữ) và Male (nam), với số lượng lần lượt là 1.527 và 1.473 người, chiếm tỷ lệ tương ứng khoảng 50,9% và 49,1% trên tổng số 3.000 quan sát.

  • Phân bố này cho thấy sự cân bằng khá rõ rệt giữa hai giới, không có sự thiên lệch lớn nào về số lượng giữa nam và nữ. Điều này mang lại lợi thế khi phân tích dữ liệu theo giới tính, bởi vì mẫu đại diện tương đối đều giúp tránh sai lệch do mất cân bằng nhóm. Bên cạnh đó, sự đồng đều về giới còn góp phần đảm bảo tính khách quan khi đánh giá các yếu tố như mức độ nghiêm trọng của bệnh, tỷ lệ nhập viện, tình trạng phục hồi hay mức độ ảnh hưởng của các biến thể virus hoặc hiệu quả vắc-xin giữa nam và nữ. Tuy mức chênh lệch chỉ khoảng 1,8%, nếu dữ liệu được mở rộng hơn nữa, việc kiểm định thống kê có thể xác nhận xem đây là sự khác biệt ngẫu nhiên hay phản ánh một đặc điểm có ý nghĩa trong dân số nghiên cứu.

2.2. Biến Region

Bảng tần suất

#Lập bảng tần suất của biến
table(dt$Region)/sum(nrow(dt))
## 
## Hovedstaden Midtjylland Nordjylland    Sjælland  Syddanmark 
##   0.2040000   0.2093333   0.1846667   0.2030000   0.1990000

Bảng tần số

#Lập bảng tần số biến 
table(dt$Region)
## 
## Hovedstaden Midtjylland Nordjylland    Sjælland  Syddanmark 
##         612         628         554         609         597

Biểu đồ

# Bước 1: Tính tần suất theo Region
region_freq <- table(dt$Region)                     # Đếm số lượng từng vùng
region_df <- as.data.frame(region_freq)             # Chuyển sang data.frame
colnames(region_df) <- c("Region", "Count")         # Đặt tên cột

# Bước 2: Vẽ biểu đồ cột
ggplot(region_df, aes(x = reorder(Region, -Count), y = Count, fill = Region)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = Count), vjust = -0.5, size = 4) +   # Hiển thị số ở trên mỗi cột
  labs(title = "Biểu đồ 2. Phân bố số lượng theo khu vực (Region)",
       x = "Khu vực",
       y = "Số lượng") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_brewer(palette = "Set3") +
  guides(fill = guide_none()) # Ẩn chú giải nếu bạn muốn

Nhận xét

  • Biến Region (khu vực) trong bộ dữ liệu bao gồm 5 vùng địa lý chính: Hovedstaden, Midtjylland, Nordjylland, Sjælland và Syddanmark. Phân bố số lượng bệnh nhân theo khu vực khá đồng đều, không có sự chênh lệch lớn giữa các nhóm. Cụ thể, Midtjylland có số lượng cao nhất với 628 người (chiếm khoảng 20,9%), theo sau là Hovedstaden với 612 người (20,4%), Sjælland với 609 người (20,3%), và Syddanmark với 597 người (19,9%). Nordjylland có số lượng thấp nhất, với 554 người, chiếm khoảng 18,5%.

  • Mặc dù có sự khác biệt nhỏ về tỷ lệ, nhìn chung, các khu vực đều đóng góp một phần tương đối ngang nhau vào tổng thể dữ liệu. Phân bố cân đối này giúp đảm bảo tính đại diện khi phân tích dữ liệu theo vùng địa lý, đồng thời hạn chế rủi ro thiên lệch do mất cân đối về số lượng mẫu giữa các vùng. Điều này đặc biệt quan trọng trong các phân tích so sánh tác động của COVID-19 theo khu vực cư trú.

2.3. Biến Preexisting_Condition

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Preexisting_Condition)/sum(nrow(dt))
## 
##         Asthma Cardiovascular       Diabetes   Hypertension           None 
##      0.1610000      0.1776667      0.1703333      0.1643333      0.1563333 
##        Obesity 
##      0.1703333

Bảng tần số

#Lập bảng tần số biến 
table(dt$Preexisting_Condition)
## 
##         Asthma Cardiovascular       Diabetes   Hypertension           None 
##            483            533            511            493            469 
##        Obesity 
##            511

Biểu đồ

# Chuyển bảng tần số sang data.frame
condition_freq <- as.data.frame(table(dt$Preexisting_Condition))
colnames(condition_freq) <- c("Condition", "Count")

# Vẽ biểu đồ cột ngang với chú thích
ggplot(condition_freq, aes(x = reorder(Condition, Count), y = Count, fill = Condition)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ 3. Phân bố tình trạng bệnh nền (Preexisting Condition)",
       x = "Tình trạng bệnh nền",
       y = "Số lượng",
       fill = "Tình trạng") +
  theme_minimal() +
  coord_flip() +
  scale_fill_brewer(palette = "Pastel1")

Nhận xét

  • Dữ liệu cho thấy phân bố các bệnh nền trong mẫu nghiên cứu khá đồng đều, với tỷ lệ trung bình từng nhóm bệnh dao động từ 15.6% đến 17.8%. Cụ thể, nhóm bệnh tim mạch (Cardiovascular) chiếm tỷ lệ cao nhất khoảng 17.8%, tiếp theo là các nhóm tiểu đường (Diabetes) và béo phì (Obesity) cùng ở mức 17.0%, tăng huyết áp (Hypertension) 16.4%, hen suyễn (Asthma) 16.1%, và nhóm không có bệnh nền (None) chiếm tỷ lệ thấp nhất khoảng 15.6%.

  • Về số lượng mẫu, sự cân bằng cũng được duy trì khá tốt, với số ca bệnh ở mỗi nhóm dao động từ 469 đến 533 trường hợp, trong đó nhóm bệnh tim mạch có số lượng lớn nhất (533 ca), còn nhóm không có bệnh nền là 469 ca. Sự cân bằng này rất quan trọng trong nghiên cứu y học vì giúp giảm thiểu sai số do sự chênh lệch về kích thước mẫu giữa các nhóm và tăng tính đại diện, từ đó nâng cao độ tin cậy của các kết quả phân tích liên quan đến ảnh hưởng của từng bệnh nền đối với diễn biến và mức độ nghiêm trọng của COVID-19.

  • Ngoài ra, việc các nhóm bệnh nền có tỷ lệ và số lượng gần tương đương cũng cho phép so sánh trực tiếp tác động của từng loại bệnh lên sức khỏe người bệnh mà không bị lệch về mặt mẫu số. Điều này đặc biệt hữu ích trong việc xác định các yếu tố nguy cơ chính, hỗ trợ xây dựng chiến lược điều trị và phòng ngừa phù hợp hơn cho các nhóm bệnh nhân khác nhau.

2.4. Biến COVID_Strainn

Bảng tần suất

#Lập bảng tần suất của biến
table(dt$COVID_Strain)/sum(nrow(dt))
## 
##     Alpha      Beta     Delta   Omicron   XBB.1.5 
## 0.1930000 0.2073333 0.2000000 0.2053333 0.1943333

Bảng tần số

#Lập bảng tần số biến 
table(dt$COVID_Strain)
## 
##   Alpha    Beta   Delta Omicron XBB.1.5 
##     579     622     600     616     583

Biểu đồ

# Lập bảng tần số biến COVID_Strain
strain_freq <- as.data.frame(table(dt$COVID_Strain))
colnames(strain_freq) <- c("COVID_Strain", "Count")

# Vẽ biểu đồ cột ngang với chú thích
ggplot(strain_freq, aes(x = reorder(COVID_Strain, Count), y = Count, fill = COVID_Strain)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ 4. Phân bố biến thể COVID-19 (COVID_Strain)",
       x = "Biến thể COVID-19",
       y = "Số lượng ca",
       fill = "Biến thể") +
  theme_minimal() +
  coord_flip() +
  scale_fill_brewer(palette = "Pastel1")

Nhận xét

  • Dữ liệu cho thấy sự phân bố tương đối đồng đều giữa các biến thể COVID-19 trong mẫu nghiên cứu. Biến thể Beta chiếm tỷ lệ cao nhất với khoảng 20.7% (622 ca), tiếp theo là Omicron (20.5% – 616 ca), Delta (20.0% – 600 ca), XBB.1.5 (19.4% – 583 ca) và Alpha (19.3% – 579 ca). Chênh lệch giữa các nhóm là không lớn, chỉ khoảng 1–2%, cho thấy không có biến thể nào chiếm ưu thế vượt trội trong tổng thể mẫu.

  • Sự phân bố đồng đều này là điều kiện thuận lợi để tiến hành các phân tích so sánh mức độ ảnh hưởng của từng biến thể đến diễn biến bệnh, giúp đảm bảo tính công bằng và độ tin cậy trong các kết luận nghiên cứu.

2.5. Biến Symptoms

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Symptoms)/sum(nrow(dt))
## 
##      Mild  Moderate    Severe 
## 0.3366667 0.3260000 0.3373333

Bảng tần số

#Lập bảng tần số biến 
table(dt$Symptoms)
## 
##     Mild Moderate   Severe 
##     1010      978     1012

Biểu đồ

# Tạo bảng tần số và phần trăm
symptom_freq <- as.data.frame(table(dt$Symptoms))
colnames(symptom_freq) <- c("Symptoms", "Count")
symptom_freq$Percent <- round(100 * symptom_freq$Count / sum(symptom_freq$Count), 1)

# Tạo nhãn hiển thị
symptom_freq$Label <- paste0(symptom_freq$Percent, "%")

# Tính vị trí trung tâm từng phần (cho vị trí nhãn)
symptom_freq$ypos <- cumsum(symptom_freq$Count) - 0.5 * symptom_freq$Count

# Vẽ biểu đồ tròn với nhãn phần trăm
ggplot(symptom_freq, aes(x = "", y = Count, fill = Symptoms)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(y = ypos, label = Label), color = "black", size = 4) +
  labs(title = "Biểu đồ 5. Phân bố mức độ triệu chứng ban đầu (Symptoms)",
       fill = "Triệu chứng") +
  theme_void() +
  scale_fill_brewer(palette = "Pastel2")

Nhận xét

  • Dữ liệu cho thấy mức độ triệu chứng ban đầu của bệnh nhân COVID-19 được phân bố khá đồng đều giữa ba nhóm: Mild (nhẹ), Moderate (vừa) và Severe (nặng). Cụ thể, nhóm Mild chiếm khoảng 33.7% (1.010 ca), nhóm Severe chiếm tỷ lệ tương đương là 33.7% (1.012 ca), trong khi nhóm Moderate chiếm 32.6% (978 ca). Sự chênh lệch giữa các nhóm là rất nhỏ, chỉ khoảng 1–2%, cho thấy không có mức độ triệu chứng nào chiếm ưu thế vượt trội. Phân bố đồng đều này giúp đảm bảo tính cân bằng của mẫu, từ đó hỗ trợ phân tích chính xác hơn mối liên hệ giữa mức độ triệu chứng ban đầu với các yếu tố khác như nhập viện, biến thể virus hay tình trạng hồi phục.

2.6. Biến Severity

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Severity)/sum(nrow(dt))
## 
##  Critical      High       Low  Moderate 
## 0.2370000 0.2553333 0.2440000 0.2636667

Bảng tần số

#Lập bảng tần số biến 
table(dt$Severity)
## 
## Critical     High      Low Moderate 
##      711      766      732      791

Biểu đồ

# Bảng tần suất theo phần trăm
severity_freq <- as.data.frame(prop.table(table(dt$Severity)))
colnames(severity_freq) <- c("Severity", "Percent")

# Đổi thành phần trăm (từ 0–1 sang 0–100)
severity_freq$Percent <- round(100 * severity_freq$Percent, 1)


ggplot(severity_freq, aes(x = Severity, y = Percent, fill = Severity)) +
  geom_bar(stat = "identity", width = 0.6) +
  geom_text(aes(label = paste0(Percent, "%")), vjust = -0.5, size = 4) +
  labs(
    title = "Biểu đồ tần suất mức độ nghiêm trọng (Severity)",
    x = "Mức độ",
    y = "Tỷ lệ (%)"
  ) +
  scale_fill_brewer(palette = "Pastel1") +
  theme_minimal()

Nhận xét:

Dữ liệu cho thấy mức độ nghiêm trọng tổng thể (Severity) của các ca bệnh được phân bổ khá đồng đều giữa bốn nhóm: Low (nhẹ), Moderate (trung bình), High (nặng) và Critical (nguy kịch). Cụ thể, nhóm Moderate chiếm tỷ lệ cao nhất với 26.4% (791 ca), tiếp theo là High với 25.5% (766 ca), Low chiếm 24.4% (732 ca), và Critical thấp nhất với 23.7% (711 ca). Sự phân bố cân bằng này phản ánh mẫu dữ liệu đa dạng về mức độ bệnh, từ nhẹ đến rất nặng, giúp đảm bảo tính khách quan khi phân tích các yếu tố liên quan đến mức độ nghiêm trọng. Điều này cũng tạo thuận lợi để đánh giá chính xác ảnh hưởng của mức độ bệnh đến các kết quả như nhập viện, hồi phục hay biến chứng, đồng thời giảm thiểu nguy cơ sai lệch do mất cân bằng trong dữ liệu.

2.7. Biến Hospitalized

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Hospitalized)/sum(nrow(dt))
## 
##    No   Yes 
## 0.708 0.292

Bảng tần số

#Lập bảng tần số biến 
table(dt$Hospitalized)
## 
##   No  Yes 
## 2124  876

Biểu đồ

# Lập bảng tần số và chuyển thành data.frame
hospital_freq <- as.data.frame(table(dt$Hospitalized))
colnames(hospital_freq) <- c("Hospitalized", "Count")

# Tính phần trăm và tạo nhãn hiển thị
hospital_freq$Percent <- round(100 * hospital_freq$Count / sum(hospital_freq$Count), 1)
hospital_freq$Label <- paste0(hospital_freq$Percent, "%")

# Tính vị trí đặt nhãn trên biểu đồ
hospital_freq$ypos <- cumsum(hospital_freq$Count) - 0.5 * hospital_freq$Count

# Vẽ biểu đồ tròn
ggplot(hospital_freq, aes(x = "", y = Count, fill = Hospitalized)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), color = "black", size = 5) +
  labs(title = "Biểu đồ 7. Tình trạng nhập viện (Hospitalized)",
       fill = "Nhập viện") +
  theme_void() +
  scale_fill_brewer(palette = "Pastel1")

Nhận xét:

Dữ liệu cho thấy trong tổng số các trường hợp được khảo sát, có 876 người (29.2%) đã nhập viện do COVID-19, trong khi 2.124 người (70.8%) không nhập viện. Tỷ lệ bệnh nhân không cần nhập viện cao hơn đáng kể, phản ánh rằng phần lớn các ca nhiễm có thể được theo dõi và điều trị tại nhà hoặc chỉ biểu hiện triệu chứng nhẹ đến trung bình. Tuy nhiên, gần 30% trường hợp nhập viện cũng là một con số đáng chú ý, cho thấy vẫn tồn tại một tỷ lệ không nhỏ bệnh nhân gặp diễn tiến nặng cần được can thiệp y tế tại cơ sở điều trị. Điều này nhấn mạnh vai trò của việc tầm soát yếu tố nguy cơ và theo dõi sát sao các triệu chứng để giảm thiểu tỷ lệ nhập viện.

2.8. Biến ICU_Admission

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$ICU_Admission)/sum(nrow(dt))
## 
##    No   Yes 
## 0.946 0.054

Bảng tần số

#Lập bảng tần số biến 
table(dt$ICU_Admission)
## 
##   No  Yes 
## 2838  162

Biểu đồ

# Lập bảng tần số và chuyển sang data.frame
icu_freq <- as.data.frame(table(dt$ICU_Admission))
colnames(icu_freq) <- c("ICU_Admission", "Count")

# Tính phần trăm và tạo nhãn
icu_freq$Percent <- round(100 * icu_freq$Count / sum(icu_freq$Count), 1)
icu_freq$Label <- paste0(icu_freq$Percent, "%")

# Vẽ biểu đồ tròn với nhãn nằm chính giữa từng phần
ggplot(icu_freq, aes(x = "", y = Count, fill = ICU_Admission)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5) +
  labs(title = "Biểu đồ 8. Tình trạng nhập ICU (ICU Admission)",
       fill = "Nhập ICU") +
  theme_void() +
  scale_fill_brewer(palette = "Pastel1")

Nhận xét

Trong tổng số 3.000 bệnh nhân, chỉ có 162 người (5,4%) được nhập khoa hồi sức tích cực (ICU), trong khi có đến 2.838 người (94,6%) không nhập ICU. Sự chênh lệch lớn này cho thấy biến ICU_Admission là một biến phân loại mất cân bằng mạnh, với nhóm “No” chiếm ưu thế tuyệt đối. Điều này cho thấy việc nhập ICU là một sự kiện tương đối hiếm, có thể gắn liền với các yếu tố nguy cơ nghiêm trọng hơn về sức khỏe.

2.9. Biến Ventilator_Support

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Ventilator_Support)/sum(nrow(dt))
## 
##         No        Yes 
## 0.97066667 0.02933333

Bảng tần số

#Lập bảng tần số biến 
table(dt$Ventilator_Support)
## 
##   No  Yes 
## 2912   88

Biểu đồ

# Lập bảng tần số và chuyển sang data.frame
vent_freq <- as.data.frame(table(dt$Ventilator_Support))
colnames(vent_freq) <- c("Ventilator_Support", "Count")

# Tính phần trăm và tạo nhãn
vent_freq$Percent <- round(100 * vent_freq$Count / sum(vent_freq$Count), 1)
vent_freq$Label <- paste0(vent_freq$Percent, "%")

# Vẽ biểu đồ tròn theo mẫu ICU_Admission
ggplot(vent_freq, aes(x = "", y = Count, fill = Ventilator_Support)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5) +
  labs(title = "Biểu đồ 9. Hỗ trợ thở máy (Ventilator Support)",
       fill = "Thở máy") +
  theme_void() +
  scale_fill_brewer(palette = "Pastel1")

2.10. Biến Recovered

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Recovered)/sum(nrow(dt))
## 
##        No       Yes 
## 0.4973333 0.5026667

Bảng tần số

#Lập bảng tần số biến 
table(dt$Recovered)
## 
##   No  Yes 
## 1492 1508

Biểu đồ

# Lập bảng tần số và chuyển sang data.frame
recovered_freq <- as.data.frame(table(dt$Recovered))
colnames(recovered_freq) <- c("Recovered", "Count")

# Tính phần trăm và tạo nhãn
recovered_freq$Percent <- round(100 * recovered_freq$Count / sum(recovered_freq$Count), 1)
recovered_freq$Label <- paste0(recovered_freq$Percent, "%")

# Vẽ biểu đồ tròn theo mẫu 
ggplot(recovered_freq, aes(x = "", y = Count, fill = Recovered)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = Label),
            position = position_stack(vjust = 0.5),
            size = 5) +
  labs(title = "Biểu đồ 10. Tình trạng hồi phục (Recovered)",
       fill = "Recovered") +
  theme_void() +
  scale_fill_brewer(palette = "Pastel1")

Nhận xét:

Dữ liệu cho thấy tỷ lệ bệnh nhân COVID-19 đã hồi phục (Yes) và chưa hồi phục (No) gần như tương đương, với 1.508 ca (50.3%) đã hồi phục và 1.492 ca (49.7%) chưa hồi phục. Sự chênh lệch chỉ ở mức 0.6%, phản ánh rằng quần thể khảo sát được phân bố khá cân bằng giữa hai trạng thái phục hồi. Điều này cho thấy bộ dữ liệu có tính đại diện tốt và có thể phục vụ hiệu quả cho việc phân tích các yếu tố liên quan đến khả năng hồi phục, chẳng hạn như tình trạng bệnh nền, mức độ nghiêm trọng hoặc tình trạng tiêm chủng.

2.11. Biến Reinfection

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Reinfection)/sum(nrow(dt))
## 
##    No   Yes 
## 0.905 0.095

Bảng tần số

#Lập bảng tần số biến 
table(dt$Reinfection)
## 
##   No  Yes 
## 2715  285

Biểu đồ

# Tạo bảng tần số và chuyển sang data.frame
reinfection_freq <- as.data.frame(table(dt$Reinfection))
colnames(reinfection_freq) <- c("Reinfection", "Count")

# Tính phần trăm và nhãn
reinfection_freq$Percent <- round(100 * reinfection_freq$Count / sum(reinfection_freq$Count), 1)
reinfection_freq$Label <- paste0(reinfection_freq$Percent, "%")

# Vẽ biểu đồ tròn với nhãn phần trăm
ggplot(reinfection_freq, aes(x = "", y = Count, fill = Reinfection)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = Label), 
            position = position_stack(vjust = 0.5), 
            color = "black", size = 5) +
  labs(title = "Biểu đồ 11. Tình trạng tái nhiễm (Reinfection)",
       fill = "Tái nhiễm") +
  theme_void() +
  scale_fill_brewer(palette = "Pastel1")

Nhận xét:

Dữ liệu cho thấy phần lớn bệnh nhân trong mẫu khảo sát không bị tái nhiễm COVID-19, với 2.715 trường hợp (90.5%) ghi nhận không tái nhiễm và chỉ có 285 trường hợp (9.5%) bị tái nhiễm. Tỷ lệ tái nhiễm tương đối thấp cho thấy khả năng miễn dịch tự nhiên hoặc từ vắc-xin có thể vẫn còn hiệu lực trong phần lớn các trường hợp trong khoảng thời gian thu thập dữ liệu. Tuy nhiên, với gần 10% tái nhiễm, điều này cũng nhấn mạnh rằng rủi ro tái mắc vẫn tồn tại, đặc biệt trong bối cảnh các biến thể mới liên tục xuất hiện và có thể né tránh miễn dịch.

2.12. Biến Vaccination_Status

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Vaccination_Status)/sum(nrow(dt))
## 
##        No       Yes 
## 0.5093333 0.4906667

Bảng tần số

#Lập bảng tần số biến 
table(dt$Vaccination_Status)
## 
##   No  Yes 
## 1528 1472

Biểu đồ

# Lập bảng tần số và chuyển sang data.frame
vaccine_freq <- as.data.frame(table(dt$Vaccination_Status))
colnames(vaccine_freq) <- c("Vaccination_Status", "Count")

# Tính phần trăm và gán nhãn
vaccine_freq$Percent <- round(100 * vaccine_freq$Count / sum(vaccine_freq$Count), 1)
vaccine_freq$Label <- paste0(vaccine_freq$Percent, "%")

# Vẽ biểu đồ tròn có phần trăm ở giữa mỗi phần
ggplot(vaccine_freq, aes(x = "", y = Count, fill = Vaccination_Status)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = Label),
            position = position_stack(vjust = 0.5),
            size = 5, color = "black") +
  labs(title = "Biểu đồ 12. Tình trạng tiêm vắc-xin (Vaccination Status)",
       fill = "Đã tiêm vắc-xin") +
  theme_void() +
  scale_fill_brewer(palette = "Pastel1")

Nhận xét:

Dữ liệu cho thấy tỷ lệ bệnh nhân đã tiêm vắc-xin và chưa tiêm vắc-xin gần như tương đương. Cụ thể, có 1.528 người (50.9%) chưa tiêm và 1.472 người (49.1%) đã tiêm vắc-xin phòng COVID-19. Sự chênh lệch chỉ khoảng 1.8% cho thấy quần thể khảo sát có phân bố khá cân bằng về tình trạng tiêm chủng. Điều này giúp tạo điều kiện thuận lợi cho việc phân tích mối liên hệ giữa tiêm vắc-xin và các yếu tố khác như mức độ nghiêm trọng, khả năng hồi phục hay nguy cơ tái nhiễm, từ đó đánh giá hiệu quả của chương trình tiêm chủng một cách khách quan hơn.

2.13. Biến Vaccine_Type

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Vaccine_Type)/sum(nrow(dt))
## 
## AstraZeneca     Janssen     Moderna        None      Pfizer 
##  0.09833333  0.09766667  0.09733333  0.60300000  0.10366667

Bảng tần số

#Lập bảng tần số biến 
table(dt$Vaccine_Type)
## 
## AstraZeneca     Janssen     Moderna        None      Pfizer 
##         295         293         292        1809         311

Biểu đồ

# Lập bảng tần số và chuyển sang data.frame
vaccine_type_freq <- as.data.frame(table(dt$Vaccine_Type))
colnames(vaccine_type_freq) <- c("Vaccine_Type", "Count")

# Vẽ biểu đồ cột đứng
ggplot(vaccine_type_freq, aes(x = reorder(Vaccine_Type, -Count), y = Count, fill = Vaccine_Type)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ 13. Loại vắc-xin đã tiêm (Vaccine Type)",
       x = "Loại vắc-xin",
       y = "Số lượng",
       fill = "Loại vắc-xin") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

Nhận xét:

Dữ liệu cho thấy phần lớn người trong mẫu khảo sát không tiêm vắc-xin, với 1.809 trường hợp (60.3%) thuộc nhóm “None”. Trong khi đó, các loại vắc-xin còn lại được phân bố tương đối đồng đều với tỷ lệ thấp hơn nhiều: Pfizer chiếm 10.4% (311 người), tiếp theo là AstraZeneca (9.8%), Janssen (9.8%), và Moderna (9.7%). Sự chênh lệch lớn giữa nhóm không tiêm và các nhóm có tiêm cho thấy rằng tỷ lệ bao phủ vắc-xin trong dữ liệu này còn hạn chế, hoặc thời điểm thu thập có thể rơi vào giai đoạn đầu của chiến dịch tiêm chủng.

2.14. Biến Long_COVID_Symptoms

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Long_COVID_Symptoms)/sum(nrow(dt))
## 
##           Brain Fog          Chest Pain             Fatigue                None 
##          0.01966667          0.01733333          0.02066667          0.92666667 
## Shortness of Breath 
##          0.01566667

Bảng tần số

#Lập bảng tần số biến 
table(dt$Long_COVID_Symptoms)
## 
##           Brain Fog          Chest Pain             Fatigue                None 
##                  59                  52                  62                2780 
## Shortness of Breath 
##                  47

Biểu đồ

# Lập bảng tần số và chuyển sang data.frame
long_covid_freq <- as.data.frame(table(dt$Long_COVID_Symptoms))
colnames(long_covid_freq) <- c("Symptom", "Count")

# Vẽ biểu đồ cột đứng
ggplot(long_covid_freq, aes(x = reorder(Symptom, -Count), y = Count, fill = Symptom)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ 14. Triệu chứng COVID kéo dài (Long COVID Symptoms)",
       x = "Triệu chứng",
       y = "Số lượng",
       fill = "Triệu chứng") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_brewer(palette = "Set3")

Nhận xét:

Dữ liệu cho thấy phần lớn bệnh nhân không gặp phải triệu chứng COVID kéo dài, với 2.780 trường hợp (92.7%) báo cáo không có triệu chứng kéo dài (None). Trong số các triệu chứng kéo dài, mệt mỏi (Fatigue) là phổ biến nhất với 62 trường hợp (2.1%), tiếp theo là suy giảm trí nhớ (Brain Fog) với 59 trường hợp (2.0%), đau ngực (Chest Pain) với 52 trường hợp (1.7%), và khó thở (Shortness of Breath) với 47 trường hợp (1.6%). Mặc dù tỷ lệ mắc các triệu chứng kéo dài tương đối thấp, nhưng chúng vẫn là vấn đề đáng chú ý bởi ảnh hưởng lâu dài đến chất lượng cuộc sống của người bệnh.

2.15. Biến Occupation

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Occupation)/sum(nrow(dt))
## 
##        Driver    Healthcare Office Worker       Student       Teacher 
##     0.1640000     0.1613333     0.1676667     0.1776667     0.1636667 
##    Unemployed 
##     0.1656667

Bảng tần số

#Lập bảng tần số biến 
table(dt$Occupation)
## 
##        Driver    Healthcare Office Worker       Student       Teacher 
##           492           484           503           533           491 
##    Unemployed 
##           497

Biểu đồ

# Lập bảng tần số và chuyển sang data.frame
occupation_freq <- as.data.frame(table(dt$Occupation))
colnames(occupation_freq) <- c("Occupation", "Count")

# Vẽ biểu đồ cột đứng không có nhãn số
ggplot(occupation_freq, aes(x = reorder(Occupation, -Count), y = Count, fill = Occupation)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ 15. Phân bố nghề nghiệp (Occupation)",
       x = "Nghề nghiệp",
       y = "Số lượng",
       fill = "Nghề nghiệp") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_brewer(palette = "Set2")

Nhận xét:

  • Dữ liệu phân bố nghề nghiệp của mẫu khảo sát cho thấy sự cân bằng tương đối giữa các nhóm với tỷ lệ khá đồng đều, giúp phản ánh đa dạng nghề nghiệp trong cộng đồng nghiên cứu. Cụ thể, nhóm sinh viên chiếm tỷ lệ cao nhất với 17.8% (533 người), thể hiện sự tham gia đông đảo của đối tượng trẻ tuổi và có thể đang trong môi trường học tập, vốn là nhóm có nhiều tương tác xã hội. Nhóm nhân viên văn phòng cũng chiếm tỷ lệ đáng kể với 16.8% (503 người), phản ánh mức độ phổ biến của nghề nghiệp này trong xã hội và khả năng tiếp xúc tại nơi làm việc. Nhóm thất nghiệp chiếm khoảng 16.6% (497 người), đây là một tỷ lệ không nhỏ, có thể ảnh hưởng đến khả năng tiếp cận dịch vụ y tế và thông tin về phòng chống dịch.

  • Các nhóm nghề lái xe, chăm sóc sức khỏe và giáo viên cũng có tỷ lệ gần tương tự, lần lượt là 16.4% (492 người), 16.1% (484 người) và 16.4% (491 người). Sự phân bố đồng đều giữa các ngành nghề này giúp đảm bảo rằng các phân tích liên quan đến ảnh hưởng của COVID-19 đối với từng nhóm nghề nghiệp có tính đại diện và phản ánh chính xác hơn những đặc điểm đa dạng trong cộng đồng. Điều này cũng tạo điều kiện thuận lợi cho việc xây dựng các chính sách y tế, phòng chống dịch phù hợp với đặc điểm và nhu cầu riêng của từng nhóm nghề nghiệp trong xã hội.

2.16. Biến Smoking_Status

Bảng tần suất

#Lập bảng tần suất của biến 
table(dt$Smoking_Status)/sum(nrow(dt))
## 
##   Current    Former     Never 
## 0.3333333 0.3270000 0.3396667

Bảng tần số

#Lập bảng tần số biến 
table(dt$Smoking_Status)
## 
## Current  Former   Never 
##    1000     981    1019

Biểu đồ

# Tạo bảng tần số và chuyển sang data.frame
smoking_freq <- as.data.frame(table(dt$Smoking_Status))
colnames(smoking_freq) <- c("Smoking_Status", "Count")

# Tính tỷ lệ phần trăm
smoking_freq <- smoking_freq %>%
  mutate(Percent = Count / sum(Count) * 100,
         Label = paste0(Smoking_Status, "\n", round(Percent, 1), "%"))

# Vẽ biểu đồ tròn
ggplot(smoking_freq, aes(x = "", y = Count, fill = Smoking_Status)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 4) +
  labs(title = "Biểu đồ 16. Phân bố tình trạng hút thuốc") +
  theme_void() +
  scale_fill_brewer(palette = "Set2")

Nhận xét:

Dữ liệu về tình trạng hút thuốc của mẫu khảo sát cho thấy sự phân bố khá đều giữa ba nhóm. Cụ thể, nhóm những người đang hút thuốc (Current) chiếm khoảng 33.3% (1000 người), nhóm từng hút thuốc nhưng đã bỏ (Former) chiếm khoảng 32.7% (981 người), và nhóm chưa từng hút thuốc (Never) chiếm tỷ lệ cao nhất với 33.9% (1019 người). Sự cân bằng này phản ánh sự đa dạng trong thói quen hút thuốc của cộng đồng được khảo sát, cho thấy cả ba nhóm đều chiếm tỷ trọng tương đối lớn, điều này có thể ảnh hưởng đến các phân tích liên quan đến tác động của hút thuốc đến sức khỏe, đặc biệt trong bối cảnh dịch COVID-19.

Phần 3. ƯỚC LƯỢNG KHOẢNG VÀ KIỂM ĐỊNH GIẢ THUYẾT CHO TỶ LỆ (MỘT BIẾN)

3.1. Recovered_Tình trạng phục hồi (Phục hồi_Yes)

Ước lượng khoảng tin cậy

# Số người đã phục hồi
n_recovered <- sum(dt$Recovered == "Yes")

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

# Ước lượng khoảng tin cậy 95% cho tỷ lệ phục hồi (p = 0.5 là tỷ lệ kỳ vọng để kiểm định)
test_recovered <- prop.test(n_recovered, n_total, p = 0.5, correct = FALSE)

# In kết quả
test_recovered
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_recovered out of n_total, null probability 0.5
## X-squared = 0.085333, df = 1, p-value = 0.7702
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4847830 0.5205435
## sample estimates:
##         p 
## 0.5026667
  • Tỷ lệ phục hồi trong dữ liệu là 0.5027.

  • Khoảng tin cậy 95% cho tỷ lệ này là từ 0.4848 đến 0.5205.

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

  • H₀: Tỷ lệ phục hồi thực tế là 50% (\(p = 0.5\))

  • H₁: Tỷ lệ phục hồi thực tế khác 50% (\(p \ne 0.5\))

Với p-value = 0.7702 > 0.05, ta không có đủ bằng chứng để bác bỏ giả thuyết H₀ ở mức ý nghĩa 5%. Điều này nghĩa là: Tỷ lệ phục hồi trong quần thể không khác biệt có ý nghĩa thống kê so với mức giả định 50%.

3.2. Symptoms_Triệu chứng ban dầu (Nhẹ_Mild)

Ước lượng khoảng tin cậy

# Số người có triệu chứng Mild
n_mild <- sum(dt$Symptoms == "Mild")
n_total <- nrow(dt)

# Kiểm định một phía với p = 0.33
test_mild <- prop.test(n_mild, n_total, p = 0.33,
                          alternative = "less",
                          correct = FALSE)
test_mild
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_mild out of n_total, null probability 0.33
## X-squared = 0.60305, df = 1, p-value = 0.7813
## alternative hypothesis: true p is less than 0.33
## 95 percent confidence interval:
##  0.0000000 0.3509998
## sample estimates:
##         p 
## 0.3366667
  • Tỷ lệ người có triệu chứng ban đầu nhẹ (Mild) là 0.3367.

  • Khoảng tin cậy một phía dưới 95% cho tỷ lệ này là từ 0 đến 0.35.

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

  • H₀: Tỷ lệ người có triệu chứng ban đầu là Mild lớn hơn 33% (p ≥ 0.33)

  • H₁: Tỷ lệ người có triệu chứng ban đầu là Mild không lớn hơn 33% (p < 0.33)

Với mức ý nghĩa α = 0.05, p-value của kiểm định là r round(test_mild$p.value, 4), lớn hơn 0.05, do đó không có đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa tỷ lệ người có triệu chứng ban đầu nhẹ (Mild) lớn hơn 33%.

3.3. Severity_Mức độ nghiêm trọng (Critical_Nguy kịch)

Ước lượng khoảng tin cậy

# Số người ở mức Critical
n_critical <- sum(dt$Severity == "Critical")
n_total <- nrow(dt)

# Kiểm định tỉ lệ một phía với p = 0.23 (26%)
test_critical <- prop.test(n_critical, n_total, p = 0.23,
                          alternative = "less",
                          correct = FALSE)

test_critical
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_critical out of n_total, null probability 0.23
## X-squared = 0.83004, df = 1, p-value = 0.8189
## alternative hypothesis: true p is less than 0.23
## 95 percent confidence interval:
##  0.0000000 0.2500038
## sample estimates:
##     p 
## 0.237
  • Tỷ lệ bệnh nhân ở mức độ nghiêm trọng nguy kịch (Critical) là 0.237.

  • Khoảng tin cậy một phía dưới 95% cho tỷ lệ này là từ 0 đến 0.25 (giá trị dưới của khoảng tin cậy là 0 do đặc trưng của kiểm định một phía nhỏ hơn).

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

  • H₀: Tỷ lệ bệnh nhân nguy kịch (Critical) ≥ 23% (p ≥ 0.23)

  • H₁: Tỷ lệ bệnh nhân nguy kịch (Critical) < 23% (p < 0.23)

Kiểm định cho kết quả p-value = 0.8189.

Với mức ý nghĩa α = 0.05, ta thấy rằng p-value lớn hơn α, do đó không đủ bằng chứng để bác bỏ giả thuyết H₀.

Điều này có nghĩa là chưa thể kết luận rằng tỷ lệ bệnh nhân ở mức độ Critical nhỏ hơn 23% trong quần thể.

3.4. Smoking_Status_Tình trạng hút thuốc (Current_Đang hút thuốc)

Ước lượng khoảng tin cậy

n_current <- sum(dt$Smoking_Status == "Current")
n_total <- nrow(dt)

test_current <- prop.test(n_current, n_total, p = 0.33, alternative = "greater", correct = FALSE)
test_current
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_current out of n_total, null probability 0.33
## X-squared = 0.15076, df = 1, p-value = 0.3489
## alternative hypothesis: true p is greater than 0.33
## 95 percent confidence interval:
##  0.3193324 1.0000000
## sample estimates:
##         p 
## 0.3333333
  • Tỷ lệ bệnh nhân ở mức độ nghiêm trọng nguy kịch (Critical) trong mẫu là 0.33.

  • Khoảng tin cậy 95% một phía dưới cho tỷ lệ bệnh nhân mức độ nguy kịch (Critical) có giá trị trên là 0.319. Điều này có nghĩa rằng với độ tin cậy 95%, tỷ lệ thực tế bệnh nhân nguy kịch lớn hơn hoặc bằng giá trị dưới của khoảng tin cậy và có thể lên đến 1 (100%).

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

  • H₀: Tỷ lệ người đang hút thuốc nhỏ hơn hoặc bằng 33% (p ≤ 0.33)

  • H₁: Tỷ lệ người đang hút thuốc lớn hơn 33% (p > 0.33)

Kết quả kiểm định cho thấy p-value = 0.3489, lớn hơn mức ý nghĩa α = 0.05. Do đó, không đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa là với dữ liệu hiện tại, chúng ta không thể kết luận rằng tỷ lệ người đang hút thuốc lớn hơn 33%.

Phần 4. PHÂN TÍCH MỐI QUAN HỆ GIỮA HAI BIẾN ĐỊNH TÍNH

4.1. Gender và Hospitalized

4.1.1. Bảng tần số và tần suất

Bảng tần số

# Lập bảng tần số chéo giữa Gender và Hospitalized
gender_hosp <- table(dt$Gender, dt$Hospitalized)

# Thêm tổng hàng và tổng cột
gender_hosp1 <- addmargins(gender_hosp)

# Hiển thị bảng
gender_hosp1
##         
##            No  Yes  Sum
##   Female 1090  437 1527
##   Male   1034  439 1473
##   Sum    2124  876 3000

Bảng tần suất

# Tạo bảng tần suất chéo (theo hàng)
gender_hosp_freq <- prop.table(table(dt$Gender, dt$Hospitalized), margin = 1)

# Làm tròn kết quả cho dễ đọc
gender_hosp_freq <- round(gender_hosp_freq, 4)

# Hiển thị bảng
gender_hosp_freq
##         
##              No    Yes
##   Female 0.7138 0.2862
##   Male   0.7020 0.2980

Biểu đồ

# Chuyển thành data frame để vẽ
gender_hosp_df <- as.data.frame(gender_hosp)
colnames(gender_hosp_df) <- c("Gender", "Hospitalized", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(gender_hosp_df, aes(x = Gender, y = Count, fill = Hospitalized)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Biểu đồ 17. Biểu đồ tần số giữa Giới tính và Nhập viện",
       x = "Giới tính",
       y = "Số lượng",
       fill = "Nhập viện") +
  scale_fill_brewer(palette = "Pastel1") +  # hoặc "Pastel2"
  theme_minimal()

Nhận xét:

  • Dữ liệu cho thấy có sự khác biệt nhẹ giữa nam và nữ trong tỷ lệ nhập viện. Cụ thể, 71.4% bệnh nhân nữ không nhập viện, so với 70.2% ở nam, trong khi tỷ lệ nhập viện ở nữ là 28.6%, thấp hơn một chút so với 29.8% ở nam.

  • Mặc dù sự chênh lệch không lớn (khoảng 1.2 điểm phần trăm), nhưng nếu xét trên tổng thể 3.000 bệnh nhân, điều này vẫn có ý nghĩa:

    • Trong tổng số 1.527 nữ, có 437 người nhập viện.

    • Trong 1.473 nam, có 439 người nhập viện.

  • Dù số lượng nữ nhiều hơn nam, nhưng nam lại có số ca nhập viện cao hơn, cho thấy tỷ lệ nhập viện của nam giới thực sự nhỉnh hơn. Điều này có thể gợi ý rằng nam giới dễ có nguy cơ tiến triển nặng hơn khi mắc bệnh, hoặc có khả năng cao hơn cần đến chăm sóc y tế nội trú.

4.1.2. Kiểm định Thống kê

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

  • H₀: Giới tính và việc nhập viện là hai biến độc lập.

  • H₁: Giới tính và việc nhập việc có liên quan.

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

# Thực hiện kiểm định Chi bình phương
chi_gender_hosp <- chisq.test(gender_hosp)

# Hiển thị kết quả
chi_gender_hosp
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  gender_hosp
## X-squared = 0.45349, df = 1, p-value = 0.5007

Kết quả kiểm định:

  • Giá trị thống kê Chi bình phương: X² = 0.45349

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

  • p-value = 0.5007

Với p-value = 0.5007 lớn hơn mức ý nghĩa phổ biến α = 0.05, không đủ bằng chứng để bác bỏ giả thuyết H₀. Nói cách khác, không có mối liên hệ có ý nghĩa thống kê giữa giới tính và tình trạng nhập viện

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

# Lập bảng tần số chéo giữa Gender và Hospitalized
gender_hosp <- table(dt$Gender, dt$Hospitalized)

# Thêm tổng hàng và tổng cột
gender_hosp1 <- addmargins(gender_hosp)

# Hiển thị bảng
gender_hosp1
##         
##            No  Yes  Sum
##   Female 1090  437 1527
##   Male   1034  439 1473
##   Sum    2124  876 3000

\[ p_1 = P(\text{Hospitalized} = \text{Yes} \mid \text{Gender} = F) \quad \text{(Tỷ lệ nữ nhập viện)} \]

\[ p_2 = P(\text{Hospitalized} = \text{Yes} \mid \text{Gender} = M) \quad \text{(Tỷ lệ nam nhập viện)} \]

Hiệu hai tỷ lệ:

\[ d = p_1 - p_2 \]

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

\[ H_0: p_1 - p_2 = 0 \quad \text{(Tỷ lệ nữ nhập viện bằng tỷ lệ nam nhập viện)} \]

\[ H_1: p_1 - p_2 < 0 \quad \text{(Tỷ lệ nữ nhập viện nhỏ hơn tỷ lệ nam nhập viện)} \]

counts <- c(gender_hosp["Female", "Yes"], gender_hosp["Male", "Yes"])
totals <- c(sum(gender_hosp["Female", ]), sum(gender_hosp["Male", ]))

# Thực hiện kiểm định tỷ lệ
test_hosp <-prop.test(counts, totals, alternative = "less", correct = FALSE)
test_hosp
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts out of totals
## X-squared = 0.50919, df = 1, p-value = 0.2377
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000  0.01546772
## sample estimates:
##    prop 1    prop 2 
## 0.2861821 0.2980312
  • Tỷ lệ nữ nhập viện (p₁) = 0.2862 ≈ 28.62%

  • Tỷ lệ nam nhập viện (p₂) =0.298 ≈ 29.80%

  • p-value = 0.2377 ≈ 0.2377

Với mức ý nghĩa α=0.05, p-value = 0.2377 > 0.05, không đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này cho thấy không có sự khác biệt có ý nghĩa thống kê giữa tỷ lệ nhập viện của nữ và nam.

Mặc dù tỷ lệ nữ nhập viện có thấp hơn một chút so với nam (0.59%), nhưng sự chênh lệch này là nhỏ và không đủ để kết luận rằng nữ có xu hướng nhập viện ít hơn nam dựa trên mẫu dữ liệu này.

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

riskratio(gender_hosp, method="wald")
## $data
##         
##            No Yes Total
##   Female 1090 437  1527
##   Male   1034 439  1473
##   Total  2124 876  3000
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate     lower    upper
##   Female 1.000000        NA       NA
##   Male   1.041404 0.9315893 1.164164
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.4758258    0.4948054  0.4754894
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Dữ liệu tổng hợp cho thấy trong số 3.000 bệnh nhân, có 1.527 người là nữ với 437 người nhập viện, và 1.473 người là nam với 439 người nhập viện. Khi so sánh tỷ lệ nhập viện giữa hai nhóm, nữ được chọn làm nhóm tham chiếu với tỷ lệ rủi ro chuẩn là 1.

  • Kết quả tính toán cho thấy tỷ số rủi ro (Risk Ratio) của nam so với nữ là 1.0414. Điều này có nghĩa là nam giới có nguy cơ nhập viện cao hơn khoảng 4.14% so với nữ giới trong mẫu dữ liệu này.

  • Tuy nhiên, khoảng tin cậy 95% của tỷ số rủi ro cho nam dao động từ 0.9316 đến 1.1642. Vì khoảng này bao gồm giá trị 1, điều đó cho thấy sự khác biệt về nguy cơ nhập viện giữa nam và nữ không đạt mức ý nghĩa thống kê. Nói cách khác, không thể chắc chắn rằng sự chênh lệch quan sát được là thực sự có ý nghĩa hay chỉ do biến động ngẫu nhiên trong mẫu.

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

  • H₀: Tỷ lệ nhập viện của nam và nữ là bằng nhau, tức là \(p_{\text{Female}} = p_{\text{Male}}\).

  • H₁: Tỷ lệ nhập viện của nam và nữ là khác nhau, tức là \(p_{\text{Female}} \neq p_{\text{Male}}\).

Với p-value lớn hơn mức ý nghĩa 0.05 từ các phương pháp kiểm định (mid-p exact test, Fisher’s exact test, và chi-squared test), chúng ta không có đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này cho thấy tỷ lệ nhập viện giữa nam và nữ trong mẫu dữ liệu này không có sự khác biệt có ý nghĩa thống kê.

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

or_result <- oddsratio(gender_hosp)
print(or_result)
## $data
##         
##            No Yes Total
##   Female 1090 437  1527
##   Male   1034 439  1473
##   Total  2124 876  3000
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate     lower    upper
##   Female 1.000000        NA       NA
##   Male   1.058959 0.9046577 1.239627
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.4758258    0.4948054  0.4754894
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ số chênh (Odds Ratio - OR) giữa nhóm nam và nhóm nữ là 1.059, với khoảng tin cậy 95% từ 0.905 đến 1.240. Điều này có nghĩa là khả năng nhập viện của nam cao hơn khoảng 5.9% so với nữ. Tuy nhiên, khoảng tin cậy bao gồm giá trị 1, cho thấy sự khác biệt này không có ý nghĩa thống kê và có thể là do biến động ngẫu nhiên trong dữ liệu.

Bên cạnh đó, kết quả kiểm định với các phương pháp phổ biến như mid-p exact test, Fisher’s exact test và chi-squared test đều cho giá trị p-value lần lượt là 0.4758, 0.4948 và 0.4755. Các giá trị này đều lớn hơn mức ý nghĩa α = 0.05, cho thấy không đủ bằng chứng để bác bỏ giả thuyết không, tức là tỷ lệ nhập viện của nam và nữ không khác biệt đáng kể.

4.2. Recovered và Vaccination_Status

4.2.1. Bảng tần số và tần suất

Bảng tần số

# Gán nhãn rõ ràng cho các biến
dt$Recovered <- factor(dt$Recovered,
                       levels = c("No", "Yes"),
                       labels = c("Không hồi phục", "Hồi phục"))

dt$Vaccination_Status <- factor(dt$Vaccination_Status,
                                levels = c("No", "Yes"),
                                labels = c("Chưa tiêm", "Đã tiêm"))

# Lập bảng tần số chéo giữa Recovered và Vaccination_Status
re_vac <- table(dt$Recovered, dt$Vaccination_Status)

# Thêm tổng hàng và tổng cột
re_vac1 <- addmargins(re_vac)

# Hiển thị bảng với nhãn rõ ràng
re_vac1
##                 
##                  Chưa tiêm Đã tiêm  Sum
##   Không hồi phục       743     749 1492
##   Hồi phục             785     723 1508
##   Sum                 1528    1472 3000

Bảng tần suất

# Lập bảng tần suất theo hàng (theo từng trạng thái hồi phục)
re_vac_prop <- prop.table(re_vac, margin = 1)

# Làm tròn để hiển thị đẹp hơn (ví dụ: 4 chữ số thập phân)
re_vac_prop_rounded <- round(re_vac_prop, 4)

# Hiển thị bảng tần suất
re_vac_prop_rounded
##                 
##                  Chưa tiêm Đã tiêm
##   Không hồi phục    0.4980  0.5020
##   Hồi phục          0.5206  0.4794

Biểu đồ

# Chuyển bảng sang dạng data frame
re_vac_df <- as.data.frame(re_vac)

# Đổi tên cột cho rõ ràng
colnames(re_vac_df) <- c("Recovered", "Vaccination_Status", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(re_vac_df, aes(x = Vaccination_Status, y = Count, fill = Recovered)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ 18. Số lượng hồi phục theo tình trạng tiêm vắc xin",
    x = "Tình trạng tiêm vắc xin",
    y = "Số lượng bệnh nhân",
    fill = "Trạng thái hồi phục"
  ) +
  theme_minimal() +
  scale_fill_brewer(palette = "Pastel1")

Nhận xét

Dữ liệu cho thấy sự phân bố trạng thái hồi phục giữa hai nhóm bệnh nhân theo tình trạng tiêm vắc xin là tương đối đồng đều, tuy nhiên vẫn có một số khác biệt nhẹ. Trong nhóm chưa tiêm vắc xin, tỷ lệ hồi phục là khoảng 52.06%, trong khi 47.94% không hồi phục. Ngược lại, trong nhóm đã tiêm vắc xin, tỷ lệ không hồi phục lại nhỉnh hơn một chút, ở mức 50.20%, so với 49.80% hồi phục. Mặc dù sự chênh lệch là không lớn, điều này gợi ý rằng nhóm chưa tiêm có tỷ lệ hồi phục cao hơn một chút so với nhóm đã tiêm.

4.2.2. Kiểm định Thống kê

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

  • H₀: Tình trạng phục hồi và tình trạng tiêm vaccin là hai biến độc lập.

  • H₁: Tình trạng phục hồi và tình trạng tiêm vaccin có liên quan.

# Thực hiện kiểm định Chi bình phương
chi_re_vac <- chisq.test(re_vac)
print(chi_re_vac)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  re_vac
## X-squared = 1.4394, df = 1, p-value = 0.2302

Kết quả kiểm định:

  • Giá trị thống kê Chi bình phương: X² = 1.4394

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

  • p-value = 0.2302

Với p-value = 0.2302 lớn hơn mức ý nghĩa phổ biến α = 0.05, không đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa là, trong mẫu 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 phục của nhóm đã tiêm vắc xin và nhóm chưa tiêm.

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

# Lập bảng tần số chéo giữa Recovered và Vaccination_Status
re_vac <- table(dt$Recovered, dt$Vaccination_Status)

# Thêm tổng hàng và tổng cột
re_vac1 <- addmargins(re_vac)

# Hiển thị bảng với nhãn rõ ràng
re_vac1
##                 
##                  Chưa tiêm Đã tiêm  Sum
##   Không hồi phục       743     749 1492
##   Hồi phục             785     723 1508
##   Sum                 1528    1472 3000

\[ p_1 = P(\text{Recovered} = \text{Yes} \mid \text{Vaccination_Status} = \text{Chưa tiêm}) \quad \text{(Tỷ lệ hồi phục ở nhóm chưa tiêm)} \]

\[ p_2 = P(\text{Recovered} = \text{Yes} \mid \text{Vaccination_Status} = \text{Đã tiêm}) \quad \text{(Tỷ lệ hồi phục ở nhóm đã tiêm)} \]

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

\[ H_0: p_1 - p_2 = 0 \quad \text{(Tỷ lệ hồi phục ở nhóm chưa tiêm bằng tỷ lệ hồi phục ở nhóm đã tiêm)} \]

\[ H_1: p_1 - p_2 < 0 \quad \text{(Tỷ lệ hồi phục ở nhóm chưa tiêm nhỏ hơn tỷ lệ hồi phục ở nhóm đã tiêm)} \]

# Số người hồi phục trong từng nhóm tiêm chủng
counts <- c(re_vac["Hồi phục", "Chưa tiêm"], re_vac["Hồi phục", "Đã tiêm"])

# Tổng số người trong từng nhóm tiêm chủng
totals <- c(sum(re_vac[, "Chưa tiêm"]), sum(re_vac[, "Đã tiêm"]))

# Kiểm định tỉ lệ một phía: p1 < p2
test_recovery_less <- prop.test(counts, totals, alternative = "less", correct = FALSE)
test_recovery_less
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts out of totals
## X-squared = 1.5284, df = 1, p-value = 0.8918
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000  0.05260304
## sample estimates:
##    prop 1    prop 2 
## 0.5137435 0.4911685
  • Kết quả kiểm định tỷ lệ hai mẫu cho thấy:

    • Tỷ lệ hồi phục ở nhóm chưa tiêm (prop 1) là khoảng 51.37%

    • Tỷ lệ hồi phục ở nhóm đã tiêm (prop 2) là khoảng 49.12%

  • Giá trị thống kê Chi bình phương là 1.5284 với bậc tự do 1 và p-value = 0.8918.

  • Vì p-value lớn hơn mức ý nghĩa 0.05, chúng ta không đủ bằng chứng để bác bỏ giả thuyết rằng tỷ lệ hồi phục ở nhóm chưa tiêm và nhóm đã tiêm là bằng nhau.

  • Ngoài ra, khoảng tin cậy 95% cho hiệu hai tỷ lệ bao gồm giá trị 0 (từ -1 đến 0.0526), cũng củng cố nhận định rằng sự khác biệt giữa hai tỷ lệ không có ý nghĩa thống kê.

  • Tóm lại, theo dữ liệu này, tỷ lệ hồi phục của nhóm chưa tiêm và nhóm đã tiêm không khác biệt đáng kể và không có bằng chứng cho thấy nhóm chưa tiêm có tỷ lệ hồi phục thấp hơn nhóm đã tiêm.

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

riskratio(re_vac, method="wald")
## $data
##                 
##                  Chưa tiêm Đã tiêm Total
##   Không hồi phục       743     749  1492
##   Hồi phục             785     723  1508
##   Total               1528    1472  3000
## 
## $measure
##                 risk ratio with 95% C.I.
##                   estimate     lower    upper
##   Không hồi phục 1.0000000        NA       NA
##   Hồi phục       0.9550453 0.8878662 1.027307
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Không hồi phục         NA           NA         NA
##   Hồi phục        0.2166526    0.2281207  0.2163528
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Không hồi phục = nhóm tham chiếu (RR = 1)

Hồi phục = nhóm so sánh

Risk Ratio (RR) ước lượng cho nhóm hồi phục là 0.9550, tức là:

  • Xác suất hồi phục của người đã tiêm thấp hơn khoảng 4.5% so với người chưa tiêm.

Tuy nhiên, khoảng tin cậy 95% cho Risk Ratio nằm trong khoảng từ 0.8879 đến 1.0273:

  • Vì khoảng này bao gồm giá trị 1, nên ta không thể khẳng định có sự khác biệt thật sự về khả năng hồi phục giữa hai nhóm. Nói cách khác, sự khác biệt quan sát được có thể là do ngẫu nhiên trong mẫu khảo sát.

Sau khi thực hiện kiểm định thống kê để so sánh tỷ lệ hồi phục giữa hai nhóm bệnh nhân (Chưa tiêmĐã tiêm), ta thu được các kết quả p-value như sau:

  • Mid-p exact test: 0.2167
  • Fisher’s exact test: 0.2281
  • Chi-squared test: 0.2164

Tất cả các giá trị p-value đều lớn hơn mức ý nghĩa phổ biến\(\\alpha = 0.05\). Điều này đồng nghĩa với việc không đủ bằng chứng thống kê để bác bỏ giả thuyết \(H_0\).

Nói cách khác, không có sự khác biệt có ý nghĩa thống kê về tỷ lệ hồi phục giữa nhóm chưa tiêm và nhóm đã tiêm vắc xin. Sự chênh lệch nhỏ quan sát được trong mẫu có thể là do biến thiên ngẫu nhiên và không phản ánh sự khác biệt thực sự trong tổng thể.

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

or_result1 <- oddsratio(re_vac)
print(or_result1)
## $data
##                 
##                  Chưa tiêm Đã tiêm Total
##   Không hồi phục       743     749  1492
##   Hồi phục             785     723  1508
##   Total               1528    1472  3000
## 
## $measure
##                 odds ratio with 95% C.I.
##                   estimate    lower    upper
##   Không hồi phục 1.0000000       NA       NA
##   Hồi phục       0.9136808 0.791682 1.054367
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Không hồi phục         NA           NA         NA
##   Hồi phục        0.2166526    0.2281207  0.2163528
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả phân tích cho thấy Tỷ số chênh (Odds Ratio) đối với khả năng hồi phục là:

  • OR = 0.914, với khoảng tin cậy 95% là [0.792; 1.054].

Điều này có nghĩa là khả năng hồi phục ở nhóm đã tiêm thấp hơn khoảng 8.6% so với nhóm chưa tiêm (vì 1 − 0.914 = 0.086), tuy nhiên khoảng tin cậy 95% bao gồm giá trị 1, tức là sự khác biệt có thể không tồn tại trên toàn thể dân số.

Kết quả của ba phương pháp kiểm định thống kê đều cho giá trị p-value lớn hơn mức ý nghĩa thông thường α = 0.05, cụ thể:

  • Mid-p exact test: p-value = 0.2167

  • Fisher’s exact test: p-value = 0.2281

  • Chi-squared test: p-value = 0.2164

Các p-value này đều vượt xa ngưỡng 0.05, đồng nghĩa với việc không đủ bằng chứng thống kê để bác bỏ giả thuyết \(H_0\). Nói cách khác, dữ liệu hiện tại không cho thấy sự khác biệt có ý nghĩa thống kê về tỷ số odds hồi phục giữa hai nhóm bệnh nhân đã tiêm và chưa tiêm vắc xin.

4.3. Reinfection và Vaccination_Status

4.3.1. Bảng tần số và tần suất

Bảng tần số

dt$Reinfection <- factor(dt$Reinfection, 
                         levels = c("No", "Yes"),
                         labels = c("Không tái nhiễm", "Tái nhiễm"))

# Lập bảng tần số chéo
rein_vac <- table(dt$Reinfection, dt$Vaccination_Status)

# Thêm tổng hàng và cột
rein_vac1 <- addmargins(rein_vac)

# Hiển thị bảng
rein_vac1
##                  
##                   Chưa tiêm Đã tiêm  Sum
##   Không tái nhiễm      1398    1317 2715
##   Tái nhiễm             130     155  285
##   Sum                  1528    1472 3000

Bảng tần suất

# Lập bảng tần suất theo hàng (row percentages)
rein_vac_prop <- prop.table(rein_vac, margin = 1)

# Làm tròn 4 chữ số thập phân
rein_vac_prop <- round(rein_vac_prop, 4)

# Hiển thị bảng tần suất
rein_vac_prop
##                  
##                   Chưa tiêm Đã tiêm
##   Không tái nhiễm    0.5149  0.4851
##   Tái nhiễm          0.4561  0.5439

Biểu đồ

# Chuyển thành data frame
rein_vac_df <- as.data.frame(rein_vac)

# Đổi tên cột cho dễ hiểu
colnames(rein_vac_df) <- c("Reinfection", "Vaccination_Status", "Count")

# Vẽ biểu đồ
ggplot(rein_vac_df, aes(x = Vaccination_Status, y = Count, fill = Reinfection)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ 19. Tình trạng tái nhiễm theo tình trạng tiêm vắc xin",
    x = "Tình trạng tiêm vắc xin",
    y = "Số lượng bệnh nhân",
    fill = "Tình trạng tái nhiễm"
  ) +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

Nhận xét

Dựa trên bảng tần suất, ta thấy rằng trong nhóm không tái nhiễm, tỷ lệ bệnh nhân chưa tiêm vắc xin chiếm khoảng 51.49%, cao hơn so với nhóm đã tiêm là 48.51%, với mức chênh lệch là 2.98%. Ngược lại, ở nhóm tái nhiễm, tỷ lệ bệnh nhân đã tiêm vắc xin lại cao hơn, đạt 54.39%, so với 45.61% ở nhóm chưa tiêm, tức là chênh lệch khoảng 8.78%.

Những con số này cho thấy rằng trong mẫu dữ liệu này, tỷ lệ tái nhiễm ở nhóm đã tiêm có xu hướng cao hơn so với nhóm chưa tiêm.

4.3.2. Kiểm định Thống kê

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

  • H₀: Tình trạng tái nhiễm và tình trạng tiêm vaccin là hai biến độc lập.

  • H₁: Tình trạng tái nhiễm và tình trạng tiêm vaccin có liên quan.

# Thực hiện kiểm định Chi bình phương
chi_rein_vac <- chisq.test(rein_vac)
print(chi_rein_vac)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  rein_vac
## X-squared = 3.3342, df = 1, p-value = 0.06786

Kết quả kiểm định:

  • Giá trị thống kê Chi bình phương: X² = 3.3342

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

  • p-value = 0.06786

Với mức ý nghĩa thường dùng là α = 0.05, ta thấy p-value = 0.06786 > 0.05, tức là không đủ bằng chứng thống kê để bác bỏ giả thuyết H₀. Nói cách khác, chưa thể kết luận rằng tình trạng tái nhiễm và tình trạng tiêm vắc xin có mối liên hệ rõ ràng trong mẫu dữ liệu này.

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

# Lập bảng tần số chéo
rein_vac <- table(dt$Reinfection, dt$Vaccination_Status)

# Thêm tổng hàng và cột
rein_vac1 <- addmargins(rein_vac)

# Hiển thị bảng
rein_vac1
##                  
##                   Chưa tiêm Đã tiêm  Sum
##   Không tái nhiễm      1398    1317 2715
##   Tái nhiễm             130     155  285
##   Sum                  1528    1472 3000

\[ p_1 = P(\text{Reinfection} = \text{Yes} \mid \text{Vaccination_Status} = \text{Chưa tiêm}) \quad \text{(Tỷ lệ tái nhiễm ở nhóm chưa tiêm)} \]

\[ p_2 = P(\text{Reinfection} = \text{Yes} \mid \text{Vaccination_Status} = \text{Đã tiêm}) \quad \text{(Tỷ lệ tái nhiễm ở nhóm đã tiêm)} \]

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

\[ H_0: p_1 - p_2 = 0 \quad \text{(Tỷ lệ tái nhiễm ở nhóm chưa tiêm bằng tỷ lệ tái nhiễm ở nhóm đã tiêm)} \]

\[ H_1: p_1 - p_2 < 0 \quad \text{(Tỷ lệ tái nhiễm ở nhóm chưa tiêm nhỏ hơn tỷ lệ tái nhiễm ở nhóm đã tiêm)} \]

# Số người tái nhiễm trong từng nhóm tiêm chủng
counts_reinfection <- c(rein_vac["Tái nhiễm", "Chưa tiêm"], rein_vac["Tái nhiễm", "Đã tiêm"])

# Tổng số người trong từng nhóm tiêm chủng
totals_reinfection <- c(sum(rein_vac[, "Chưa tiêm"]), sum(rein_vac[, "Đã tiêm"]))

# Kiểm định tỉ lệ một phía: p1 < p2 (tỷ lệ tái nhiễm ở nhóm chưa tiêm nhỏ hơn nhóm đã tiêm)
test_reinfection_less <- prop.test(counts_reinfection, totals_reinfection, alternative = "less", correct = FALSE)

# Hiển thị kết quả kiểm định
test_reinfection_less
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_reinfection out of totals_reinfection
## X-squared = 3.5655, df = 1, p-value = 0.0295
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.000000000 -0.002585538
## sample estimates:
##     prop 1     prop 2 
## 0.08507853 0.10529891

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

  • Tỷ lệ tái nhiễm ở nhóm chưa tiêm (prop 1) là khoảng 8.51%.

  • Tỷ lệ tái nhiễm ở nhóm đã tiêm (prop 2) là khoảng 10.53%.

Với p-value = 0.0295, nhỏ hơn mức ý nghĩa 0.05, chúng ta có đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa là Tỷ lệ tái nhiễm ở nhóm chưa tiêm nhỏ hơn tỷ lệ tái nhiễm ở nhóm đã tiêm.

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

riskratio(rein_vac, method="wald")
## $data
##                  
##                   Chưa tiêm Đã tiêm Total
##   Không tái nhiễm      1398    1317  2715
##   Tái nhiễm             130     155   285
##   Total                1528    1472  3000
## 
## $measure
##                  risk ratio with 95% C.I.
##                   estimate    lower    upper
##   Không tái nhiễm 1.000000       NA       NA
##   Tái nhiễm       1.121169 1.001205 1.255505
## 
## $p.value
##                  two-sided
##                   midp.exact fisher.exact chi.square
##   Không tái nhiễm         NA           NA         NA
##   Tái nhiễm       0.05943728   0.06179783 0.05899318
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Ước lượng Risk Ratio (RR) cho nhóm tái nhiễm là 1.121 với khoảng tin cậy 95% từ 1.001 đến 1.256. Điều này có nghĩa là nhóm đã tiêm có nguy cơ tái nhiễm cao hơn khoảng 12.1% so với nhóm chưa tiêm. Khoảng tin cậy 95% này không bao gồm giá trị 1, cho thấy sự khác biệt này có thể là có ý nghĩa thống kê.

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

\[ H_0: p_1 = p_2 \quad \text{(Tỷ lệ tái nhiễm ở nhóm chưa tiêm bằng tỷ lệ tái nhiễm ở nhóm đã tiêm)} \]

\[ H_1: p_1 \neq p_2 \quad \text{(Tỷ lệ tái nhiễm ở nhóm chưa tiêm khác tỷ lệ tái nhiễm ở nhóm đã tiêm)} \]

Các kiểm định thống kê cho tình trạng tái nhiễm được thực hiện với ba phương pháp phổ biến là Mid-p exact test, Fisher’s exact test và Chi-squared test đều cho kết quả p-value lớn hơn mức ý nghĩa 0.05:

  • Mid-p exact test: 0.0594

  • Fisher’s exact test: 0.0618

  • Chi-squared test: 0.0590

Do đó, ta không đủ cơ sở để bác bỏ giả thuyết H₀. Nói cách khác, không có bằng chứng thống kê mạnh mẽ để khẳng định sự khác biệt có ý nghĩa giữa tỷ lệ tái nhiễm của hai nhóm.

Mặc dù Risk Ratio (RR) ước lượng nguy cơ tái nhiễm ở nhóm đã tiêm cao hơn nhóm chưa tiêm (RR = 1.121), nhưng do p-value chưa đủ nhỏ nên sự khác biệt này có thể do biến thiên ngẫu nhiên trong mẫu dữ liệu.

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

or_result2 <- oddsratio(rein_vac)
print(or_result2)
## $data
##                  
##                   Chưa tiêm Đã tiêm Total
##   Không tái nhiễm      1398    1317  2715
##   Tái nhiễm             130     155   285
##   Total                1528    1472  3000
## 
## $measure
##                  odds ratio with 95% C.I.
##                   estimate     lower    upper
##   Không tái nhiễm 1.000000        NA       NA
##   Tái nhiễm       1.265329 0.9906896 1.618385
## 
## $p.value
##                  two-sided
##                   midp.exact fisher.exact chi.square
##   Không tái nhiễm         NA           NA         NA
##   Tái nhiễm       0.05943728   0.06179783 0.05899318
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Ước lượng Odds Ratio (OR) cho nhóm tái nhiễm là 1.27 (với khoảng tin cậy 95% từ 0.99 đến 1.62), so với nhóm “Không tái nhiễm” làm nhóm tham chiếu (OR = 1). Điều này gợi ý rằng:

  • Người đã tiêm có khả năng tái nhiễm cao hơn khoảng 27% so với người chưa tiêm.

  • Tuy nhiên, khoảng tin cậy 95% bao gồm giá trị 1 (0.99 – 1.62), do đó sự khác biệt này chưa thực sự chắc chắn về mặt thống kê.

Các kết quả kiểm định với ba phương pháp phổ biến đều cho giá trị p-value lớn hơn 0.05, cụ thể:

  • Mid-p exact test: 0.0594

  • Fisher’s exact test: 0.0618

  • Chi-squared test: 0.0590

Mặc dù các p-value này khá gần mức ý nghĩa 0.05, nhưng vẫn chưa đủ nhỏ để bác bỏ giả thuyết H₀ – tức là không có sự khác biệt có ý nghĩa thống kê về tỷ lệ tái nhiễm giữa nhóm chưa tiêm và nhóm đã tiêm.

Tóm lại, mặc dù ước lượng Odds Ratio cho thấy người đã tiêm có xu hướng có nguy cơ tái nhiễm cao hơn, kết quả kiểm định thống kê không đủ bằng chứng để kết luận sự khác biệt này là có ý nghĩa thực sự. Do đó, sự khác biệt quan sát được có thể là do biến thiên ngẫu nhiên trong mẫu khảo sát.

Phần 5. TỔNG KẾT VÀ THẢO LUẬN

Qua quá trình tìm hiểu, mô tả và kiểm định thống kê trên bộ dữ liệu mô phỏng bệnh nhân COVID-19, báo cáo này đã phác họa nên một bức tranh toàn cảnh về đặc điểm dịch tễ và lâm sàng, đồng thời khám phá những mối liên hệ ban đầu giữa các yếu tố nguy cơ và kết quả điều trị. Các kết quả không chỉ cung cấp những con số cụ thể mà còn mở ra nhiều hướng thảo luận quan trọng.

5.1. Tổng kết các kết quả nổi bật

  • Phân tích mô tả đã cho thấy bộ dữ liệu có chất lượng tốt, không chứa giá trị thiếu và được thiết kế với sự cân bằng đáng kể giữa các nhóm nhân khẩu học. Các biến như Giới tính, Khu vực địa lý, Bệnh nềnBiến thể virus đều có tỷ lệ phân bố khá đồng đều, tạo một nền tảng vững chắc và khách quan cho các phân tích so sánh. Ngược lại, các biến thể hiện mức độ nghiêm trọng như Nhập viện, Nhập ICU, hay Hỗ trợ thở máy lại cho thấy sự mất cân bằng rõ rệt, với phần lớn bệnh nhân (trên 70%) không cần can thiệp y tế chuyên sâu. Điều này phản ánh đúng thực tế của đại dịch, nơi chỉ một bộ phận nhỏ các ca nhiễm tiến triển nặng.

  • Khi tiến hành kiểm định các giả thuyết thống kê, các kết quả nhìn chung cho thấy tỷ lệ quan sát được trong mẫu không có sự khác biệt đáng kể so với các giá trị giả định trong quần thể. Chẳng hạn, tỷ lệ phục hồi trong mẫu (50.3%) không khác biệt có ý nghĩa so với mức 50%, hay tỷ lệ người có triệu chứng ban đầu là “Nhẹ” (33.7%) cũng không cho thấy sự chênh lệch có ý nghĩa so với mốc 33% giả định. Điều này cho thấy bộ dữ liệu tổng hợp này đã được tạo ra để phản ánh các tham số dân số một cách khá chuẩn xác.

  • Kết quả đáng suy ngẫm nhất đến từ việc phân tích mối quan hệ giữa các biến. Trong khi không có mối liên kết có ý nghĩa thống kê được tìm thấy giữa Giới tính và tỷ lệ nhập viện, hoặc giữa Tình trạng tiêm chủng và khả năng hồi phục, thì mối quan hệ giữa Tái nhiễmTiêm chủng lại cho thấy một kết quả thú vị. Dữ liệu chỉ ra rằng nhóm đã tiêm vắc-xin có tỷ lệ tái nhiễm (10.5%) cao hơn một chút so với nhóm chưa tiêm (8.5%). Mặc dù kiểm định Chi-bình phương (p-value ≈ 0.068) chưa đạt mức ý nghĩa thống kê, nhưng kiểm định hiệu tỷ lệ một phía lại cho thấy sự khác biệt này có ý nghĩa (p-value ≈ 0.0295). Kết quả không nhất quán và có phần trái ngược với kỳ vọng này là một điểm thảo luận quan trọng.

5.2. Thảo luận và Hạn chế

  • Trước hết, cần nhấn mạnh rằng đây là một bộ dữ liệu tổng hợp (synthetic). Do đó, mọi kết luận rút ra chỉ mang tính tham khảo, minh họa cho phương pháp phân tích và không thể áp dụng trực tiếp cho các quyết định lâm sàng trong thực tế.

  • Kết quả đáng chú ý nhất về mối liên hệ giữa việc tiêm vắc-xin và nguy cơ tái nhiễm cao hơn cần được diễn giải một cách cẩn trọng. Một số giả thuyết có thể được đưa ra để lý giải hiện tượng này:

    • Yếu tố nhiễu (Confounding Variables): Nhóm đã tiêm vắc-xin có thể bao gồm những người có nguy cơ phơi nhiễm cao hơn do tính chất công việc (nhân viên y tế, giáo viên) hoặc có bệnh nền, khiến họ được ưu tiên tiêm chủng. Chính các yếu tố này, chứ không phải bản thân vắc-xin, mới là nguyên nhân làm tăng nguy cơ tái nhiễm.

    • Khác biệt hành vi: Những người đã tiêm chủng có thể có tâm lý chủ quan hơn, giảm bớt các biện pháp phòng ngừa cá nhân, dẫn đến tăng khả năng tiếp xúc với virus.

    • Yếu tố thời gian và biến thể virus: Dữ liệu kéo dài đến năm 2024, bao gồm cả giai đoạn các biến thể mới có khả năng “né” miễn dịch từ vắc-xin (như Omicron) chiếm ưu thế. Những người đã tiêm từ sớm có thể đã suy giảm miễn dịch theo thời gian, trong khi nhóm chưa tiêm có thể đã có miễn dịch tự nhiên từ lần nhiễm trước đó với một biến thể khác.

    • Sự ngẫu nhiên của mẫu: Vì giá trị p-value của kiểm định Chi-bình phương rất gần ngưỡng 0.05, không thể loại trừ khả năng sự khác biệt này chỉ là do biến thiên ngẫu nhiên trong mẫu.

5.3. Hướng phát triển và Đề xuất

Từ các kết quả và thảo luận trên, các nghiên cứu sâu hơn có thể được thực hiện theo các hướng sau:

  • Phân tích đa biến: Sử dụng các mô hình hồi quy (ví dụ: hồi quy logistic) để đánh giá đồng thời tác động của nhiều yếu tố (tuổi, bệnh nền, nghề nghiệp, tình trạng tiêm chủng) lên các kết quả như nhập viện hoặc tái nhiễm. Cách tiếp cận này sẽ giúp kiểm soát các yếu tố gây nhiễu và làm rõ hơn vai trò của từng biến.

  • Phân tích theo từng giai đoạn: Chia bộ dữ liệu theo các mốc thời gian quan trọng (ví dụ: trước và sau khi biến thể Omicron xuất hiện) để đánh giá sự thay đổi trong hiệu quả của vắc-xin và nguy cơ tái nhiễm.

  • Phân tích nhóm nhỏ (Subgroup Analysis): Đi sâu vào so sánh giữa các loại vắc-xin khác nhau, hoặc đánh giá nguy cơ tái nhiễm trong các nhóm nghề nghiệp có mức độ phơi nhiễm khác nhau để có cái nhìn chi tiết hơn.

LS0tDQp0aXRsZTogIk5WVDQiDQphdXRob3I6ICJMw6ogVGjhu4sgTmfhu41jIMOBbmgiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6ICc0Jw0KICBwZGZfZG9jdW1lbnQ6DQogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KPHN0eWxlPg0KYm9keSB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgc2Fucy1zZXJpZjsNCiAgZm9udC1zaXplOiAxNnB4Ow0KICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICBsaW5lLWhlaWdodDogMS41Ow0KfQ0KaDIgew0KICBjb2xvcjogcmVkOw0KfQ0KaDMgew0KICBjb2xvcjogZGFya2JsdWU7DQp9DQo8L3N0eWxlPg0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KGNzdikNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoZm9ybWF0dGFibGUpDQpsaWJyYXJ5KGh0bWx0b29scykNCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KbGlicmFyeShlcGl0b29scykNCmBgYA0KDQojICoqUGjhuqduIDEuIFTDjE0gSEnhu4JVIFbDgCBDSFXhuqhOIELhu4ogROG7riBMSeG7hlUqKg0KDQojIyAqKjEuIMSQ4buNYyBmaWxlIGThu68gbGnhu4d1KioNCg0KQuG7mSBk4buvIGxp4buHdSBuw6B5IG3DtCBwaOG7j25nIGjhu5Mgc8ahIGLhu4duaCBuaMOibiBDT1ZJRC0xOSB04bqhaSDEkGFuIE3huqFjaCwgdOG6rXAgdHJ1bmcgdsOgbyBjw6FjIHnhur91IHThu5EgbmjGsCBs4bqnbiBuaGnhu4VtIMSR4bqndSB0acOqbiwgdMOhaSBuaGnhu4VtLCB0acOqbSB24bqvYy14aW4sIGjhu5lpIGNo4bupbmcgaOG6rXUgQ09WSUQgKGxvbmcgQ09WSUQpLCBjw7luZyBjw6FjIHRow7RuZyB0aW4gbmjDom4ga2jhuql1IGjhu41jIHbDoCBr4bq/dCBxdeG6oyBsw6JtIHPDoG5nIHF1YW4gdHLhu41uZy4gROG7ryBsaeG7h3UgYmFvIGfhu5NtIDMuMDAwIGjhu5Mgc8ahIHThu5VuZyBo4bujcCB24bubaSAyNiDEkeG6t2MgdHLGsG5nIGxpw6puIHF1YW4sIMSRxrDhu6NjIHRoaeG6v3Qga+G6vyBzw6F0IHbhu5tpIHRo4buxYyB04bq/IG5o4bqxbSBwaOG7pWMgduG7pSBjaG8gdmnhu4djIHBow6JuIHTDrWNoIGtow6FtIHBow6EsIG3DtCBow6xuaCBk4buLY2ggdOG7hSBo4buNYyB2w6AgbeG7pWMgxJHDrWNoIGdpw6FvIGThu6VjLg0KDQpUb8OgbiBi4buZIGThu68gbGnhu4d1IMSR4buBdSBsw6AgZOG7ryBsaeG7h3UgdOG7lW5nIGjhu6NwIChzeW50aGV0aWMpLCB0w6FpIGhp4buHbiBjw6FjIHh1IGjGsOG7m25nIHRo4buxYyB04bq/IHThu6tuZyBnaGkgbmjhuq1uIHRyb25nIGdpYWkgxJFv4bqhbiDEkeG6oWkgZOG7i2NoIDIwMjDigJMyMDI0LCDEkeG6o20gYuG6o28gYW4gdG/DoG4ga2hpIHPhu60gZOG7pW5nIGPDtG5nIGtoYWkuIELhu5kgZOG7ryBsaeG7h3UgbsOgeSBwaMO5IGjhu6NwIGNobyBjw6FjIOG7qW5nIGThu6VuZyBuaMawIGjhu41jIG3DoXksIHBow6JuIHTDrWNoIHPhu5FuZyBzw7N0IChzdXJ2aXZhbCBhbmFseXNpcyksIGtow6FtIHBow6EgeeG6v3UgdOG7kSBuZ3V5IGPGoSB2w6Agbmhp4buBdSBuZ2hpw6puIGPhu6l1IGtow6FjLg0KDQpgYGB7cn0NCmQgPC0gcmVhZC5jc3YoIkQ6L1BURExEVC9jb3ZpZF9yZWxhdGVkX2Rpc2Vhc2VfZGF0YS5jc3YiKQ0KYGBgDQoNCiMjICoqMi4gQ+G6pXUgdHLDumMgYuG7mSBk4buvIGxp4buHdSoqDQoNCmBgYHtyfQ0KbmFtZXMoZCkNCmBgYA0KDQoNCmBgYHtyfQ0Kc3RyKGQpDQpgYGANCg0KLSBC4buZIGThu68gbGnhu4d1ICoqY292aWRfcmVsYXRlZF9kaXNlYXNlX2RhdGEqKiBjaOG7qWEgdOG7lW5nIGPhu5luZyAqKjMuMDAwIGLhuqNuIGdoaSoqIHbhu5tpICoqMjEgYmnhur9uIMSR4bq3YyB0csawbmcqKiBtw7QgdOG6oyB0aMO0bmcgdGluIGxpw6puIHF1YW4gxJHhur9uIGLhu4duaCBuaMOibiBuaGnhu4VtIENPVklELTE5LiBWaeG7h2MgaGnhu4N1IHLDtSBj4bqldSB0csO6YyB2w6Agw70gbmdoxKlhIGPhu6dhIGPDoWMgYmnhur9uIGzDoCBixrDhu5tjIMSR4bqndSBxdWFuIHRy4buNbmcgdHJvbmcgcXXDoSB0csOsbmggcGjDom4gdMOtY2ggdsOgIHjhu60gbMO9IGThu68gbGnhu4d1Lg0KDQotIEPDoWMgYmnhur9uIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgYmFvIGfhu5NtOg0KDQp8IFTDqm4gYmnhur9uICAgICAgICAgICAgICB8IE3DtCB04bqjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBgUGF0aWVudF9JRGAgICAgICAgICAgfCBNw6MgxJHhu4tuaCBkYW5oIGR1eSBuaOG6pXQgY2hvIHThu6tuZyBi4buHbmggbmjDom4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBBZ2VgICAgICAgICAgICAgICAgICB8IFR14buVaSBj4bunYSBi4buHbmggbmjDom4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgR2VuZGVyYCAgICAgICAgICAgICAgfCBHaeG7m2kgdMOtbmggYuG7h25oIG5ow6JuIChNYWxlOiBuYW0sIEZlbWFsZTogbuG7rykgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBSZWdpb25gICAgICAgICAgICAgICB8IEtodSB24buxYyDEkeG7i2EgbMO9IHNpbmggc+G7kW5nICh2w60gZOG7pTogSG92ZWRzdGFkZW4sIFNqw6ZsbGFuZCwgLi4uKSAgICAgICAgICB8DQp8IGBQcmVleGlzdGluZ19Db25kaXRpb25gIHwgQuG7h25oIG7hu4FuIHRyxrDhu5tjIGtoaSBuaGnhu4VtICh2w60gZOG7pTogT2Jlc2l0eSwgQXN0aG1hLCBIeXBlcnRlbnNpb24sIC4uLikgfA0KfCBgRGF0ZV9vZl9JbmZlY3Rpb25gICAgfCBOZ8OgeSBuaGnhu4VtIENPVklELTE5ICjEkeG7i25oIGThuqFuZyAiREQvTU0vWVlZWSIpICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBDT1ZJRF9TdHJhaW5gICAgICAgICB8IEJp4bq/biB0aOG7gyB2aXJ1cyBTQVJTLUNvVi0yIG3DoCBi4buHbmggbmjDom4gbmhp4buFbSAodsOtIGThu6U6IERlbHRhLCBCZXRhLCAuLi4pfA0KfCBgU3ltcHRvbXNgICAgICAgICAgICAgfCBN4bupYyDEkeG7mSB0cmnhu4d1IGNo4bupbmcgYmFuIMSR4bqndSAodsOtIGThu6U6IE1pbGQsIFNldmVyZSkgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgU2V2ZXJpdHlgICAgICAgICAgICAgfCBN4bupYyDEkeG7mSBuZ2hpw6ptIHRy4buNbmcgdOG7lW5nIHRo4buDIGPhu6dhIGLhu4duaCAodsOtIGThu6U6IE1vZGVyYXRlLCBIaWdoKSAgICAgICAgIHwNCnwgYEhvc3BpdGFsaXplZGAgICAgICAgIHwgQuG7h25oIG5ow6JuIGPDsyBuaOG6rXAgdmnhu4duIGhheSBraMO0bmcgKFllcy9ObykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYElDVV9BZG1pc3Npb25gICAgICAgIHwgQuG7h25oIG5ow6JuIGPDsyBuaOG6rXAgSUNVIGhheSBraMO0bmcgKFllcy9ObykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBWZW50aWxhdG9yX1N1cHBvcnRgICB8IELhu4duaCBuaMOibiBjw7MgY+G6p24gaOG7lyB0cuG7oyB0aOG7nyBtw6F5IGtow7RuZyAoWWVzL05vKSAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYFJlY292ZXJlZGAgICAgICAgICAgIHwgQuG7h25oIG5ow6JuIMSRw6MgaOG7k2kgcGjhu6VjIGhheSBjaMawYSAoWWVzL05vKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBSZWluZmVjdGlvbmAgICAgICAgICB8IELhu4duaCBuaMOibiBjw7MgdMOhaSBuaGnhu4VtIENPVklELTE5IGtow7RuZyAoWWVzL05vKSAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYFZhY2NpbmF0aW9uX1N0YXR1c2AgIHwgQuG7h25oIG5ow6JuIMSRw6MgdGnDqm0gduG6r2MteGluIGhheSBjaMawYSAoWWVzL05vKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYFZhY2NpbmVfVHlwZWAgICAgICAgIHwgTG/huqFpIHbhuq9jLXhpbiDEkcOjIHRpw6ptIChu4bq/dSBjw7MpLCB2w60gZOG7pTogQXN0cmFaZW5lY2EsIEphbnNzZW4gICAgICAgICAgICB8DQp8IGBEb3Nlc19SZWNlaXZlZGAgICAgICB8IFPhu5EgbGnhu4F1IHbhuq9jLXhpbiBtw6AgYuG7h25oIG5ow6JuIMSRw6MgdGnDqm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgTG9uZ19DT1ZJRF9TeW1wdG9tc2AgfCBUcmnhu4d1IGNo4bupbmcgQ09WSUQga8OpbyBkw6BpIHNhdSBraGkga2jhu49pIGLhu4duaCAobuG6v3UgY8OzKSAgICAgICAgICAgICAgICAgIHwNCnwgYE9jY3VwYXRpb25gICAgICAgICAgIHwgTmdo4buBIG5naGnhu4dwIGPhu6dhIGLhu4duaCBuaMOibiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBTbW9raW5nX1N0YXR1c2AgICAgICB8IFTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIChOZXZlciwgRm9ybWVyLCBDdXJyZW50LCAuLi4pICAgICAgICAgICAgICAgICAgICAgfA0KfCBgQk1JYCAgICAgICAgICAgICAgICAgfCBDaOG7iSBz4buRIGto4buRaSBjxqEgdGjhu4MgY+G7p2EgYuG7h25oIG5ow6JuIChCTUkgLSBCb2R5IE1hc3MgSW5kZXgpICAgICAgICAgICAgICB8DQoNCiMjICoqMy4gQ2jhu41uIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgqKg0KDQpgYGB7cn0NCmRsZHQgPC0gYygiR2VuZGVyIiwgIlJlZ2lvbiIsICJQcmVleGlzdGluZ19Db25kaXRpb24iLCAiQ09WSURfU3RyYWluIiwNCiAgICAgICAgICAiU3ltcHRvbXMiLCAiU2V2ZXJpdHkiLCAiSG9zcGl0YWxpemVkIiwgIklDVV9BZG1pc3Npb24iLCAiVmVudGlsYXRvcl9TdXBwb3J0IiwNCiAgICAgICAgICAiUmVjb3ZlcmVkIiwgIlJlaW5mZWN0aW9uIiwgIlZhY2NpbmF0aW9uX1N0YXR1cyIsICJWYWNjaW5lX1R5cGUiLA0KICAgICAgICAgICJMb25nX0NPVklEX1N5bXB0b21zIiwgIk9jY3VwYXRpb24iLCAiU21va2luZ19TdGF0dXMiKQ0KZGxkdA0KYGBgDQoNCiMjICoqNC4gVOG6oW8gYuG7mSBk4buvIGxp4buHdSBt4bubaSBjaOG7iSBjaOG7qWEgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCoqDQoNCmBgYHtyfQ0KZHQgPC0gZFssIGRsZHRdDQpgYGANCg0KIyMgKio1LiBN4buZdCB2w6BpIGTDsm5nIMSR4bqndSB2w6AgZMOybmcgY3Xhu5FpKioNCg0KYGBge3J9DQpoZWFkKGR0KQ0KYGBgDQoNCmBgYHtyfQ0KdGFpbChkdCkNCmBgYA0KDQojIyAqKjYuIEtp4buDbSB0cmEgTkEqKg0KDQpgYGB7cn0NCmFueShpcy5uYShkdCkpDQpgYGANCg0KVuG6rXkgYuG7mSBk4buvIGxp4buHdSBraMO0bmcgY8OzIGdpw6EgdHLhu4sgdGhp4bq/dQ0KDQojIyAqKjcuIEtp4buDbSB0cmEga2nhu4N1IGThu68gbGnhu4d1IHbDoCDEkeG7lWkgduG7gSBmYWN0b3IqKg0KYGBge3J9DQojIEtp4buDbSB0cmEga2nhu4N1IGThu68gbGnhu4d1IGPhu6dhIHThu6tuZyBiaeG6v24gdHJvbmcgZGxkdA0Kc2FwcGx5KGR0LCBjbGFzcykgDQpgYGANCg0KYGBge3J9DQpkdCA8LSBkYXRhLmZyYW1lKGxhcHBseShkdCwgYXMuZmFjdG9yKSkNCmBgYA0KDQojICoqUGjhuqduIDIuIFBIw4JOIFTDjUNIIE3DlCBU4bqiIE3hu5hUIEJJ4bq+TiDEkOG7ik5IIFTDjU5IKioNCg0KIyMgKioyLjEuIEJp4bq/biBHZW5kZXIqKg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gDQp0YWJsZShkdCRHZW5kZXIpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biANCnRhYmxlKGR0JEdlbmRlcikNCmBgYA0KKipCaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCmdlbmRlcl9mcmVxICA8LSB0YWJsZShkdCRHZW5kZXIpDQpnZW5kZXJfcGN0ICAgPC0gZ2VuZGVyX2ZyZXEgLyBucm93KGR0KQ0KYGBgDQoNCg0KYGBge3J9DQojIELGsOG7m2MgMTogQ2h1eeG7g24gYuG6o25nIHNhbmcgZGF0YS5mcmFtZQ0KZ2VuZGVyX2ZyZXEgPC0gdGFibGUoZHQkR2VuZGVyKSAgICAgICAgICAgICAgICAgICAgICMgxJDhur9tIHPhu5EgbMaw4bujbmcgdOG7q25nIG5ow7NtIGdp4bubaSB0w61uaCAodsOtIGThu6U6ICJNIiwgIkYiKSwgdHLhuqMgduG7gSDEkeG7kWkgdMaw4bujbmcgdGFibGUNCmdlbmRlcl9kZiA8LSBhcy5kYXRhLmZyYW1lKGdlbmRlcl9mcmVxKSAgICAgICAgICAgICAjIENodXnhu4NuIHThu6sgdGFibGUgc2FuZyBkYXRhLmZyYW1lIMSR4buDIHjhu60gbMO9IGThu4UgaMahbiB0cm9uZyBnZ3Bsb3QyDQpjb2xuYW1lcyhnZW5kZXJfZGYpIDwtIGMoIkdlbmRlciIsICJDb3VudCIpICAgICAgICAgIyDEkOG6t3QgdMOqbiBj4buZdCByw7UgcsOgbmc6ICJHZW5kZXIiIGzDoCB0w6puIG5ow7NtLCAiQ291bnQiIGzDoCBz4buRIGzGsOG7o25nDQoNCiMgQsaw4bubYyAyOiBUw61uaCBwaOG6p24gdHLEg20NCmdlbmRlcl9kZiRQZXJjZW50IDwtIGdlbmRlcl9kZiRDb3VudCAvIHN1bShnZW5kZXJfZGYkQ291bnQpICogMTAwDQoNCiMgQsaw4bubYyAzOiBU4bqhbyBuaMOjbiBnaeG7kW5nIG5oxrAgdHJvbmcgcGllKCkNCmdlbmRlcl9kZiRMYWJlbCA8LSBwYXN0ZTAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEdow6lwIGNodeG7l2kgxJHhu4MgdOG6oW8gbmjDo24NCiAgZ2VuZGVyX2RmJEdlbmRlciwgIiAoIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRow6ptIHTDqm4gZ2nhu5tpIHTDrW5oIHbDoCBk4bqldSBt4bufIG5nb+G6t2MNCiAgcm91bmQoZ2VuZGVyX2RmJFBlcmNlbnQsIDEpLCAiJSkiICAgICAgICAgICAgICAgICAgICAjIEzDoG0gdHLDsm4gcGjhuqduIHRyxINtIDEgY2jhu68gc+G7kSB2w6AgdGjDqm0gZOG6pXUgJQ0KKQ0KDQojIELGsOG7m2MgNDogVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4gYuG6sW5nIGdncGxvdDINCmdncGxvdChnZW5kZXJfZGYsIGFlcyh4ID0gIiIsIHkgPSBDb3VudCwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSkgKw0KICBjb29yZF9wb2xhcigieSIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgMS4gUGjDom4gYuG7kSBnaeG7m2kgdMOtbmggKEdlbmRlcikiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBMYWJlbCksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIA0KICAgICAgICAgICAgc2l6ZSA9IDUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiRmVtYWxlIiA9ICJsaWdodHBpbmsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFsZSIgPSAibGlnaHRibHVlIikpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotIFRyb25nIGLhu5kgZOG7ryBsaeG7h3UsIGJp4bq/biDEkeG7i25oIHTDrW5oICoqR2VuZGVyKiogKGdp4bubaSB0w61uaCkgZ+G7k20gaGFpIG5ow7NtIGNow61uaCBsw6AgKipGZW1hbGUqKiAobuG7rykgdsOgICoqTWFsZSoqIChuYW0pLCB24bubaSBz4buRIGzGsOG7o25nIGzhuqduIGzGsOG7o3QgbMOgIDEuNTI3IHbDoCAxLjQ3MyBuZ8aw4budaSwgY2hp4bq/bSB04bu3IGzhu4cgdMawxqFuZyDhu6luZyBraG/huqNuZyA1MCw5JSB2w6AgNDksMSUgdHLDqm4gdOG7lW5nIHPhu5EgMy4wMDAgcXVhbiBzw6F0LiANCg0KLSBQaMOibiBi4buRIG7DoHkgY2hvIHRo4bqleSBz4buxIGPDom4gYuG6sW5nIGtow6EgcsO1IHLhu4d0IGdp4buvYSBoYWkgZ2nhu5tpLCBraMO0bmcgY8OzIHPhu7EgdGhpw6puIGzhu4djaCBs4bubbiBuw6BvIHbhu4Egc+G7kSBsxrDhu6NuZyBnaeG7r2EgbmFtIHbDoCBu4buvLiDEkGnhu4F1IG7DoHkgbWFuZyBs4bqhaSBs4bujaSB0aOG6vyBraGkgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdGhlbyBnaeG7m2kgdMOtbmgsIGLhu59pIHbDrCBt4bqrdSDEkeG6oWkgZGnhu4duIHTGsMahbmcgxJHhu5FpIMSR4buBdSBnacO6cCB0csOhbmggc2FpIGzhu4djaCBkbyBt4bqldCBjw6JuIGLhurFuZyBuaMOzbS4gQsOqbiBj4bqhbmggxJHDsywgc+G7sSDEkeG7k25nIMSR4buBdSB24buBIGdp4bubaSBjw7JuIGfDs3AgcGjhuqduIMSR4bqjbSBi4bqjbyB0w61uaCBraMOhY2ggcXVhbiBraGkgxJHDoW5oIGdpw6EgY8OhYyB54bq/dSB04buRIG5oxrAgbeG7qWMgxJHhu5kgbmdoacOqbSB0cuG7jW5nIGPhu6dhIGLhu4duaCwgdOG7tyBs4buHIG5o4bqtcCB2aeG7h24sIHTDrG5oIHRy4bqhbmcgcGjhu6VjIGjhu5NpIGhheSBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSBjw6FjIGJp4bq/biB0aOG7gyB2aXJ1cyBob+G6t2MgaGnhu4d1IHF14bqjIHbhuq9jLXhpbiBnaeG7r2EgbmFtIHbDoCBu4buvLiBUdXkgbeG7qWMgY2jDqm5oIGzhu4djaCBjaOG7iSBraG/huqNuZyAxLDglLCBu4bq/dSBk4buvIGxp4buHdSDEkcaw4bujYyBt4bufIHLhu5luZyBoxqFuIG7hu69hLCB2aeG7h2Mga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogY8OzIHRo4buDIHjDoWMgbmjhuq1uIHhlbSDEkcOieSBsw6Agc+G7sSBraMOhYyBiaeG7h3Qgbmfhuqt1IG5oacOqbiBoYXkgcGjhuqNuIMOhbmggbeG7mXQgxJHhurdjIMSRaeG7g20gY8OzIMO9IG5naMSpYSB0cm9uZyBkw6JuIHPhu5EgbmdoacOqbiBj4bupdS4NCg0KIyMgKioyLjIuIEJp4bq/biBSZWdpb24qKg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24NCnRhYmxlKGR0JFJlZ2lvbikvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHPhu5EgYmnhur9uIA0KdGFibGUoZHQkUmVnaW9uKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQojIELGsOG7m2MgMTogVMOtbmggdOG6p24gc3XhuqV0IHRoZW8gUmVnaW9uDQpyZWdpb25fZnJlcSA8LSB0YWJsZShkdCRSZWdpb24pICAgICAgICAgICAgICAgICAgICAgIyDEkOG6v20gc+G7kSBsxrDhu6NuZyB04burbmcgdsO5bmcNCnJlZ2lvbl9kZiA8LSBhcy5kYXRhLmZyYW1lKHJlZ2lvbl9mcmVxKSAgICAgICAgICAgICAjIENodXnhu4NuIHNhbmcgZGF0YS5mcmFtZQ0KY29sbmFtZXMocmVnaW9uX2RmKSA8LSBjKCJSZWdpb24iLCAiQ291bnQiKSAgICAgICAgICMgxJDhurd0IHTDqm4gY+G7mXQNCg0KIyBCxrDhu5tjIDI6IFbhur0gYmnhu4N1IMSR4buTIGPhu5l0DQpnZ3Bsb3QocmVnaW9uX2RmLCBhZXMoeCA9IHJlb3JkZXIoUmVnaW9uLCAtQ291bnQpLCB5ID0gQ291bnQsIGZpbGwgPSBSZWdpb24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDQpICsgICAjIEhp4buDbiB0aOG7iyBz4buRIOG7nyB0csOqbiBt4buXaSBj4buZdA0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyAyLiBQaMOibiBi4buRIHPhu5EgbMaw4bujbmcgdGhlbyBraHUgduG7sWMgKFJlZ2lvbikiLA0KICAgICAgIHggPSAiS2h1IHbhu7FjIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKw0KICBndWlkZXMoZmlsbCA9IGd1aWRlX25vbmUoKSkgIyDhuqhuIGNow7ogZ2nhuqNpIG7hur91IGLhuqFuIG114buRbg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIEJp4bq/biAqKlJlZ2lvbioqIChraHUgduG7sWMpIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgYmFvIGfhu5NtIDUgdsO5bmcgxJHhu4thIGzDvSBjaMOtbmg6IEhvdmVkc3RhZGVuLCBNaWR0anlsbGFuZCwgTm9yZGp5bGxhbmQsIFNqw6ZsbGFuZCB2w6AgU3lkZGFubWFyay4gUGjDom4gYuG7kSBz4buRIGzGsOG7o25nIGLhu4duaCBuaMOibiB0aGVvIGtodSB24buxYyBraMOhIMSR4buTbmcgxJHhu4F1LCBraMO0bmcgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCBs4bubbiBnaeG7r2EgY8OhYyBuaMOzbS4gQ+G7pSB0aOG7gywgTWlkdGp5bGxhbmQgY8OzIHPhu5EgbMaw4bujbmcgY2FvIG5o4bqldCB24bubaSA2MjggbmfGsOG7nWkgKGNoaeG6v20ga2hv4bqjbmcgMjAsOSUpLCB0aGVvIHNhdSBsw6AgSG92ZWRzdGFkZW4gduG7m2kgNjEyIG5nxrDhu51pICgyMCw0JSksIFNqw6ZsbGFuZCB24bubaSA2MDkgbmfGsOG7nWkgKDIwLDMlKSwgdsOgIFN5ZGRhbm1hcmsgduG7m2kgNTk3IG5nxrDhu51pICgxOSw5JSkuIE5vcmRqeWxsYW5kIGPDsyBz4buRIGzGsOG7o25nIHRo4bqlcCBuaOG6pXQsIHbhu5tpIDU1NCBuZ8aw4budaSwgY2hp4bq/bSBraG/huqNuZyAxOCw1JS4gDQoNCi0gTeG6t2MgZMO5IGPDsyBz4buxIGtow6FjIGJp4buHdCBuaOG7jyB24buBIHThu7cgbOG7hywgbmjDrG4gY2h1bmcsIGPDoWMga2h1IHbhu7FjIMSR4buBdSDEkcOzbmcgZ8OzcCBt4buZdCBwaOG6p24gdMawxqFuZyDEkeG7kWkgbmdhbmcgbmhhdSB2w6BvIHThu5VuZyB0aOG7gyBk4buvIGxp4buHdS4gUGjDom4gYuG7kSBjw6JuIMSR4buRaSBuw6B5IGdpw7pwIMSR4bqjbSBi4bqjbyB0w61uaCDEkeG6oWkgZGnhu4duIGtoaSBwaMOibiB0w61jaCBk4buvIGxp4buHdSB0aGVvIHbDuW5nIMSR4buLYSBsw70sIMSR4buTbmcgdGjhu51pIGjhuqFuIGNo4bq/IHLhu6dpIHJvIHRoacOqbiBs4buHY2ggZG8gbeG6pXQgY8OibiDEkeG7kWkgduG7gSBz4buRIGzGsOG7o25nIG3huqt1IGdp4buvYSBjw6FjIHbDuW5nLiDEkGnhu4F1IG7DoHkgxJHhurdjIGJp4buHdCBxdWFuIHRy4buNbmcgdHJvbmcgY8OhYyBwaMOibiB0w61jaCBzbyBzw6FuaCB0w6FjIMSR4buZbmcgY+G7p2EgQ09WSUQtMTkgdGhlbyBraHUgduG7sWMgY8awIHRyw7ouDQoNCiMjICoqMi4zLiBCaeG6v24gUHJlZXhpc3RpbmdfQ29uZGl0aW9uKioNCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIA0KdGFibGUoZHQkUHJlZXhpc3RpbmdfQ29uZGl0aW9uKS9zdW0obnJvdyhkdCkpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gDQp0YWJsZShkdCRQcmVleGlzdGluZ19Db25kaXRpb24pDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCiMgQ2h1eeG7g24gYuG6o25nIHThuqduIHPhu5Egc2FuZyBkYXRhLmZyYW1lDQpjb25kaXRpb25fZnJlcSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGR0JFByZWV4aXN0aW5nX0NvbmRpdGlvbikpDQpjb2xuYW1lcyhjb25kaXRpb25fZnJlcSkgPC0gYygiQ29uZGl0aW9uIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCBuZ2FuZyB24bubaSBjaMO6IHRow61jaA0KZ2dwbG90KGNvbmRpdGlvbl9mcmVxLCBhZXMoeCA9IHJlb3JkZXIoQ29uZGl0aW9uLCBDb3VudCksIHkgPSBDb3VudCwgZmlsbCA9IENvbmRpdGlvbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgMy4gUGjDom4gYuG7kSB0w6xuaCB0cuG6oW5nIGLhu4duaCBu4buBbiAoUHJlZXhpc3RpbmcgQ29uZGl0aW9uKSIsDQogICAgICAgeCA9ICJUw6xuaCB0cuG6oW5nIGLhu4duaCBu4buBbiIsDQogICAgICAgeSA9ICJT4buRIGzGsOG7o25nIiwNCiAgICAgICBmaWxsID0gIlTDrG5oIHRy4bqhbmciKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMSIpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gROG7ryBsaeG7h3UgY2hvIHRo4bqleSBwaMOibiBi4buRIGPDoWMgYuG7h25oIG7hu4FuIHRyb25nIG3huqt1IG5naGnDqm4gY+G7qXUga2jDoSDEkeG7k25nIMSR4buBdSwgduG7m2kgdOG7tyBs4buHIHRydW5nIGLDrG5oIHThu6tuZyBuaMOzbSBi4buHbmggZGFvIMSR4buZbmcgdOG7qyAxNS42JSDEkeG6v24gMTcuOCUuIEPhu6UgdGjhu4MsIG5ow7NtIGLhu4duaCB0aW0gbeG6oWNoIChDYXJkaW92YXNjdWxhcikgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCBraG/huqNuZyAxNy44JSwgdGnhur9wIHRoZW8gbMOgIGPDoWMgbmjDs20gdGnhu4N1IMSRxrDhu51uZyAoRGlhYmV0ZXMpIHbDoCBiw6lvIHBow6wgKE9iZXNpdHkpIGPDuW5nIOG7nyBt4bupYyAxNy4wJSwgdMSDbmcgaHV54bq/dCDDoXAgKEh5cGVydGVuc2lvbikgMTYuNCUsIGhlbiBzdXnhu4VuIChBc3RobWEpIDE2LjElLCB2w6AgbmjDs20ga2jDtG5nIGPDsyBi4buHbmggbuG7gW4gKE5vbmUpIGNoaeG6v20gdOG7tyBs4buHIHRo4bqlcCBuaOG6pXQga2hv4bqjbmcgMTUuNiUuDQoNCi0gVuG7gSBz4buRIGzGsOG7o25nIG3huqt1LCBz4buxIGPDom4gYuG6sW5nIGPFqW5nIMSRxrDhu6NjIGR1eSB0csOsIGtow6EgdOG7kXQsIHbhu5tpIHPhu5EgY2EgYuG7h25oIOG7nyBt4buXaSBuaMOzbSBkYW8gxJHhu5luZyB04burIDQ2OSDEkeG6v24gNTMzIHRyxrDhu51uZyBo4bujcCwgdHJvbmcgxJHDsyBuaMOzbSBi4buHbmggdGltIG3huqFjaCBjw7Mgc+G7kSBsxrDhu6NuZyBs4bubbiBuaOG6pXQgKDUzMyBjYSksIGPDsm4gbmjDs20ga2jDtG5nIGPDsyBi4buHbmggbuG7gW4gbMOgIDQ2OSBjYS4gU+G7sSBjw6JuIGLhurFuZyBuw6B5IHLhuqV0IHF1YW4gdHLhu41uZyB0cm9uZyBuZ2hpw6puIGPhu6l1IHkgaOG7jWMgdsOsIGdpw7pwIGdp4bqjbSB0aGnhu4N1IHNhaSBz4buRIGRvIHPhu7EgY2jDqm5oIGzhu4djaCB24buBIGvDrWNoIHRoxrDhu5tjIG3huqt1IGdp4buvYSBjw6FjIG5ow7NtIHbDoCB0xINuZyB0w61uaCDEkeG6oWkgZGnhu4duLCB04burIMSRw7MgbsOibmcgY2FvIMSR4buZIHRpbiBj4bqteSBj4bunYSBjw6FjIGvhur90IHF14bqjIHBow6JuIHTDrWNoIGxpw6puIHF1YW4gxJHhur9uIOG6o25oIGjGsOG7n25nIGPhu6dhIHThu6tuZyBi4buHbmggbuG7gW4gxJHhu5FpIHbhu5tpIGRp4buFbiBiaeG6v24gdsOgIG3hu6ljIMSR4buZIG5naGnDqm0gdHLhu41uZyBj4bunYSBDT1ZJRC0xOS4NCg0KLSBOZ2/DoGkgcmEsIHZp4buHYyBjw6FjIG5ow7NtIGLhu4duaCBu4buBbiBjw7MgdOG7tyBs4buHIHbDoCBz4buRIGzGsOG7o25nIGfhuqduIHTGsMahbmcgxJHGsMahbmcgY8WpbmcgY2hvIHBow6lwIHNvIHPDoW5oIHRy4buxYyB0aeG6v3AgdMOhYyDEkeG7mW5nIGPhu6dhIHThu6tuZyBsb+G6oWkgYuG7h25oIGzDqm4gc+G7qWMga2jhu49lIG5nxrDhu51pIGLhu4duaCBtw6Aga2jDtG5nIGLhu4sgbOG7h2NoIHbhu4EgbeG6t3QgbeG6q3Ugc+G7kS4gxJBp4buBdSBuw6B5IMSR4bq3YyBiaeG7h3QgaOG7r3Ugw61jaCB0cm9uZyB2aeG7h2MgeMOhYyDEkeG7i25oIGPDoWMgeeG6v3UgdOG7kSBuZ3V5IGPGoSBjaMOtbmgsIGjhu5cgdHLhu6MgeMOieSBk4buxbmcgY2hp4bq/biBsxrDhu6NjIMSRaeG7gXUgdHLhu4sgdsOgIHBow7JuZyBuZ+G7q2EgcGjDuSBo4bujcCBoxqFuIGNobyBjw6FjIG5ow7NtIGLhu4duaCBuaMOibiBraMOhYyBuaGF1Lg0KDQojIyAqKjIuNC4gQmnhur9uIENPVklEX1N0cmFpbm4qKg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24NCnRhYmxlKGR0JENPVklEX1N0cmFpbikvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHPhu5EgYmnhur9uIA0KdGFibGUoZHQkQ09WSURfU3RyYWluKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biBDT1ZJRF9TdHJhaW4NCnN0cmFpbl9mcmVxIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZHQkQ09WSURfU3RyYWluKSkNCmNvbG5hbWVzKHN0cmFpbl9mcmVxKSA8LSBjKCJDT1ZJRF9TdHJhaW4iLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IG5nYW5nIHbhu5tpIGNow7ogdGjDrWNoDQpnZ3Bsb3Qoc3RyYWluX2ZyZXEsIGFlcyh4ID0gcmVvcmRlcihDT1ZJRF9TdHJhaW4sIENvdW50KSwgeSA9IENvdW50LCBmaWxsID0gQ09WSURfU3RyYWluKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyA0LiBQaMOibiBi4buRIGJp4bq/biB0aOG7gyBDT1ZJRC0xOSAoQ09WSURfU3RyYWluKSIsDQogICAgICAgeCA9ICJCaeG6v24gdGjhu4MgQ09WSUQtMTkiLA0KICAgICAgIHkgPSAiU+G7kSBsxrDhu6NuZyBjYSIsDQogICAgICAgZmlsbCA9ICJCaeG6v24gdGjhu4MiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMSIpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gROG7ryBsaeG7h3UgY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5EgdMawxqFuZyDEkeG7kWkgxJHhu5NuZyDEkeG7gXUgZ2nhu69hIGPDoWMgYmnhur9uIHRo4buDIENPVklELTE5IHRyb25nIG3huqt1IG5naGnDqm4gY+G7qXUuIEJp4bq/biB0aOG7gyBCZXRhIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgduG7m2kga2hv4bqjbmcgMjAuNyUgKDYyMiBjYSksIHRp4bq/cCB0aGVvIGzDoCBPbWljcm9uICgyMC41JSDigJMgNjE2IGNhKSwgRGVsdGEgKDIwLjAlIOKAkyA2MDAgY2EpLCBYQkIuMS41ICgxOS40JSDigJMgNTgzIGNhKSB2w6AgQWxwaGEgKDE5LjMlIOKAkyA1NzkgY2EpLiBDaMOqbmggbOG7h2NoIGdp4buvYSBjw6FjIG5ow7NtIGzDoCBraMO0bmcgbOG7m24sIGNo4buJIGtob+G6o25nIDHigJMyJSwgY2hvIHRo4bqleSBraMO0bmcgY8OzIGJp4bq/biB0aOG7gyBuw6BvIGNoaeG6v20gxrB1IHRo4bq/IHbGsOG7o3QgdHLhu5lpIHRyb25nIHThu5VuZyB0aOG7gyBt4bqrdS4gDQoNCi0gU+G7sSBwaMOibiBi4buRIMSR4buTbmcgxJHhu4F1IG7DoHkgbMOgIMSRaeG7gXUga2nhu4duIHRodeG6rW4gbOG7o2kgxJHhu4MgdGnhur9uIGjDoG5oIGPDoWMgcGjDom4gdMOtY2ggc28gc8OhbmggbeG7qWMgxJHhu5kg4bqjbmggaMaw4bufbmcgY+G7p2EgdOG7q25nIGJp4bq/biB0aOG7gyDEkeG6v24gZGnhu4VuIGJp4bq/biBi4buHbmgsIGdpw7pwIMSR4bqjbSBi4bqjbyB0w61uaCBjw7RuZyBi4bqxbmcgdsOgIMSR4buZIHRpbiBj4bqteSB0cm9uZyBjw6FjIGvhur90IGx14bqtbiBuZ2hpw6puIGPhu6l1Lg0KDQojIyAqKjIuNS4gQmnhur9uIFN5bXB0b21zKioNCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIA0KdGFibGUoZHQkU3ltcHRvbXMpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biANCnRhYmxlKGR0JFN5bXB0b21zKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kSB2w6AgcGjhuqduIHRyxINtDQpzeW1wdG9tX2ZyZXEgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkdCRTeW1wdG9tcykpDQpjb2xuYW1lcyhzeW1wdG9tX2ZyZXEpIDwtIGMoIlN5bXB0b21zIiwgIkNvdW50IikNCnN5bXB0b21fZnJlcSRQZXJjZW50IDwtIHJvdW5kKDEwMCAqIHN5bXB0b21fZnJlcSRDb3VudCAvIHN1bShzeW1wdG9tX2ZyZXEkQ291bnQpLCAxKQ0KDQojIFThuqFvIG5ow6NuIGhp4buDbiB0aOG7iw0Kc3ltcHRvbV9mcmVxJExhYmVsIDwtIHBhc3RlMChzeW1wdG9tX2ZyZXEkUGVyY2VudCwgIiUiKQ0KDQojIFTDrW5oIHbhu4sgdHLDrSB0cnVuZyB0w6JtIHThu6tuZyBwaOG6p24gKGNobyB24buLIHRyw60gbmjDo24pDQpzeW1wdG9tX2ZyZXEkeXBvcyA8LSBjdW1zdW0oc3ltcHRvbV9mcmVxJENvdW50KSAtIDAuNSAqIHN5bXB0b21fZnJlcSRDb3VudA0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuIHbhu5tpIG5ow6NuIHBo4bqnbiB0csSDbQ0KZ2dwbG90KHN5bXB0b21fZnJlcSwgYWVzKHggPSAiIiwgeSA9IENvdW50LCBmaWxsID0gU3ltcHRvbXMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDEsIGNvbG9yID0gIndoaXRlIikgKw0KICBjb29yZF9wb2xhcigieSIpICsNCiAgZ2VvbV90ZXh0KGFlcyh5ID0geXBvcywgbGFiZWwgPSBMYWJlbCksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDQpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgNS4gUGjDom4gYuG7kSBt4bupYyDEkeG7mSB0cmnhu4d1IGNo4bupbmcgYmFuIMSR4bqndSAoU3ltcHRvbXMpIiwNCiAgICAgICBmaWxsID0gIlRyaeG7h3UgY2jhu6luZyIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwyIikNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSBE4buvIGxp4buHdSBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIHRyaeG7h3UgY2jhu6luZyBiYW4gxJHhuqd1IGPhu6dhIGLhu4duaCBuaMOibiBDT1ZJRC0xOSDEkcaw4bujYyBwaMOibiBi4buRIGtow6EgxJHhu5NuZyDEkeG7gXUgZ2nhu69hIGJhIG5ow7NtOiBNaWxkIChuaOG6uSksIE1vZGVyYXRlICh24burYSkgdsOgIFNldmVyZSAobuG6t25nKS4gQ+G7pSB0aOG7gywgbmjDs20gTWlsZCBjaGnhur9tIGtob+G6o25nIDMzLjclICgxLjAxMCBjYSksIG5ow7NtIFNldmVyZSBjaGnhur9tIHThu7cgbOG7hyB0xrDGoW5nIMSRxrDGoW5nIGzDoCAzMy43JSAoMS4wMTIgY2EpLCB0cm9uZyBraGkgbmjDs20gTW9kZXJhdGUgY2hp4bq/bSAzMi42JSAoOTc4IGNhKS4gU+G7sSBjaMOqbmggbOG7h2NoIGdp4buvYSBjw6FjIG5ow7NtIGzDoCBy4bqldCBuaOG7jywgY2jhu4kga2hv4bqjbmcgMeKAkzIlLCBjaG8gdGjhuqV5IGtow7RuZyBjw7MgbeG7qWMgxJHhu5kgdHJp4buHdSBjaOG7qW5nIG7DoG8gY2hp4bq/bSDGsHUgdGjhur8gdsaw4bujdCB0cuG7mWkuIFBow6JuIGLhu5EgxJHhu5NuZyDEkeG7gXUgbsOgeSBnacO6cCDEkeG6o20gYuG6o28gdMOtbmggY8OibiBi4bqxbmcgY+G7p2EgbeG6q3UsIHThu6sgxJHDsyBo4buXIHRy4bujIHBow6JuIHTDrWNoIGNow61uaCB4w6FjIGjGoW4gbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgbeG7qWMgxJHhu5kgdHJp4buHdSBjaOG7qW5nIGJhbiDEkeG6p3UgduG7m2kgY8OhYyB54bq/dSB04buRIGtow6FjIG5oxrAgbmjhuq1wIHZp4buHbiwgYmnhur9uIHRo4buDIHZpcnVzIGhheSB0w6xuaCB0cuG6oW5nIGjhu5NpIHBo4bulYy4NCg0KIyMgKioyLjYuIEJp4bq/biBTZXZlcml0eSoqDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biANCnRhYmxlKGR0JFNldmVyaXR5KS9zdW0obnJvdyhkdCkpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gDQp0YWJsZShkdCRTZXZlcml0eSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQpgYGB7cn0NCiMgQuG6o25nIHThuqduIHN14bqldCB0aGVvIHBo4bqnbiB0csSDbQ0Kc2V2ZXJpdHlfZnJlcSA8LSBhcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUoZHQkU2V2ZXJpdHkpKSkNCmNvbG5hbWVzKHNldmVyaXR5X2ZyZXEpIDwtIGMoIlNldmVyaXR5IiwgIlBlcmNlbnQiKQ0KDQojIMSQ4buVaSB0aMOgbmggcGjhuqduIHRyxINtICh04burIDDigJMxIHNhbmcgMOKAkzEwMCkNCnNldmVyaXR5X2ZyZXEkUGVyY2VudCA8LSByb3VuZCgxMDAgKiBzZXZlcml0eV9mcmVxJFBlcmNlbnQsIDEpDQoNCg0KZ2dwbG90KHNldmVyaXR5X2ZyZXEsIGFlcyh4ID0gU2V2ZXJpdHksIHkgPSBQZXJjZW50LCBmaWxsID0gU2V2ZXJpdHkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuNikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKFBlcmNlbnQsICIlIikpLCB2anVzdCA9IC0wLjUsIHNpemUgPSA0KSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCBt4bupYyDEkeG7mSBuZ2hpw6ptIHRy4buNbmcgKFNldmVyaXR5KSIsDQogICAgeCA9ICJN4bupYyDEkeG7mSIsDQogICAgeSA9ICJU4bu3IGzhu4cgKCUpIg0KICApICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgbmdoacOqbSB0cuG7jW5nIHThu5VuZyB0aOG7gyAoU2V2ZXJpdHkpIGPhu6dhIGPDoWMgY2EgYuG7h25oIMSRxrDhu6NjIHBow6JuIGLhu5Uga2jDoSDEkeG7k25nIMSR4buBdSBnaeG7r2EgYuG7kW4gbmjDs206IExvdyAobmjhurkpLCBNb2RlcmF0ZSAodHJ1bmcgYsOsbmgpLCBIaWdoIChu4bq3bmcpIHbDoCBDcml0aWNhbCAobmd1eSBr4buLY2gpLiBD4bulIHRo4buDLCBuaMOzbSBNb2RlcmF0ZSBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHbhu5tpIDI2LjQlICg3OTEgY2EpLCB0aeG6v3AgdGhlbyBsw6AgSGlnaCB24bubaSAyNS41JSAoNzY2IGNhKSwgTG93IGNoaeG6v20gMjQuNCUgKDczMiBjYSksIHbDoCBDcml0aWNhbCB0aOG6pXAgbmjhuqV0IHbhu5tpIDIzLjclICg3MTEgY2EpLiBT4buxIHBow6JuIGLhu5EgY8OibiBi4bqxbmcgbsOgeSBwaOG6o24gw6FuaCBt4bqrdSBk4buvIGxp4buHdSDEkWEgZOG6oW5nIHbhu4EgbeG7qWMgxJHhu5kgYuG7h25oLCB04burIG5o4bq5IMSR4bq/biBy4bqldCBu4bq3bmcsIGdpw7pwIMSR4bqjbSBi4bqjbyB0w61uaCBraMOhY2ggcXVhbiBraGkgcGjDom4gdMOtY2ggY8OhYyB54bq/dSB04buRIGxpw6puIHF1YW4gxJHhur9uIG3hu6ljIMSR4buZIG5naGnDqm0gdHLhu41uZy4gxJBp4buBdSBuw6B5IGPFqW5nIHThuqFvIHRodeG6rW4gbOG7o2kgxJHhu4MgxJHDoW5oIGdpw6EgY2jDrW5oIHjDoWMg4bqjbmggaMaw4bufbmcgY+G7p2EgbeG7qWMgxJHhu5kgYuG7h25oIMSR4bq/biBjw6FjIGvhur90IHF14bqjIG5oxrAgbmjhuq1wIHZp4buHbiwgaOG7k2kgcGjhu6VjIGhheSBiaeG6v24gY2jhu6luZywgxJHhu5NuZyB0aOG7nWkgZ2nhuqNtIHRoaeG7g3Ugbmd1eSBjxqEgc2FpIGzhu4djaCBkbyBt4bqldCBjw6JuIGLhurFuZyB0cm9uZyBk4buvIGxp4buHdS4NCg0KIyMgKioyLjcuIEJp4bq/biBIb3NwaXRhbGl6ZWQqKg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gDQp0YWJsZShkdCRIb3NwaXRhbGl6ZWQpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biANCnRhYmxlKGR0JEhvc3BpdGFsaXplZCkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQpgYGB7cn0NCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIGNodXnhu4NuIHRow6BuaCBkYXRhLmZyYW1lDQpob3NwaXRhbF9mcmVxIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZHQkSG9zcGl0YWxpemVkKSkNCmNvbG5hbWVzKGhvc3BpdGFsX2ZyZXEpIDwtIGMoIkhvc3BpdGFsaXplZCIsICJDb3VudCIpDQoNCiMgVMOtbmggcGjhuqduIHRyxINtIHbDoCB04bqhbyBuaMOjbiBoaeG7g24gdGjhu4sNCmhvc3BpdGFsX2ZyZXEkUGVyY2VudCA8LSByb3VuZCgxMDAgKiBob3NwaXRhbF9mcmVxJENvdW50IC8gc3VtKGhvc3BpdGFsX2ZyZXEkQ291bnQpLCAxKQ0KaG9zcGl0YWxfZnJlcSRMYWJlbCA8LSBwYXN0ZTAoaG9zcGl0YWxfZnJlcSRQZXJjZW50LCAiJSIpDQoNCiMgVMOtbmggduG7iyB0csOtIMSR4bq3dCBuaMOjbiB0csOqbiBiaeG7g3UgxJHhu5MNCmhvc3BpdGFsX2ZyZXEkeXBvcyA8LSBjdW1zdW0oaG9zcGl0YWxfZnJlcSRDb3VudCkgLSAwLjUgKiBob3NwaXRhbF9mcmVxJENvdW50DQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCmdncGxvdChob3NwaXRhbF9mcmVxLCBhZXMoeCA9ICIiLCB5ID0gQ291bnQsIGZpbGwgPSBIb3NwaXRhbGl6ZWQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDEsIGNvbG9yID0gIndoaXRlIikgKw0KICBjb29yZF9wb2xhcigieSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IExhYmVsKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDUpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgNy4gVMOsbmggdHLhuqFuZyBuaOG6rXAgdmnhu4duIChIb3NwaXRhbGl6ZWQpIiwNCiAgICAgICBmaWxsID0gIk5o4bqtcCB2aeG7h24iKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMSIpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQpE4buvIGxp4buHdSBjaG8gdGjhuqV5IHRyb25nIHThu5VuZyBz4buRIGPDoWMgdHLGsOG7nW5nIGjhu6NwIMSRxrDhu6NjIGto4bqjbyBzw6F0LCBjw7MgODc2IG5nxrDhu51pICgyOS4yJSkgxJHDoyBuaOG6rXAgdmnhu4duIGRvIENPVklELTE5LCB0cm9uZyBraGkgMi4xMjQgbmfGsOG7nWkgKDcwLjglKSBraMO0bmcgbmjhuq1wIHZp4buHbi4gVOG7tyBs4buHIGLhu4duaCBuaMOibiBraMO0bmcgY+G6p24gbmjhuq1wIHZp4buHbiBjYW8gaMahbiDEkcOhbmcga+G7gywgcGjhuqNuIMOhbmggcuG6sW5nIHBo4bqnbiBs4bubbiBjw6FjIGNhIG5oaeG7hW0gY8OzIHRo4buDIMSRxrDhu6NjIHRoZW8gZMO1aSB2w6AgxJFp4buBdSB0cuG7iyB04bqhaSBuaMOgIGhv4bq3YyBjaOG7iSBiaeG7g3UgaGnhu4duIHRyaeG7h3UgY2jhu6luZyBuaOG6uSDEkeG6v24gdHJ1bmcgYsOsbmguIFR1eSBuaGnDqm4sIGfhuqduIDMwJSB0csaw4budbmcgaOG7o3Agbmjhuq1wIHZp4buHbiBjxaluZyBsw6AgbeG7mXQgY29uIHPhu5EgxJHDoW5nIGNow7ogw70sIGNobyB0aOG6pXkgduG6q24gdOG7k24gdOG6oWkgbeG7mXQgdOG7tyBs4buHIGtow7RuZyBuaOG7jyBi4buHbmggbmjDom4gZ+G6t3AgZGnhu4VuIHRp4bq/biBu4bq3bmcgY+G6p24gxJHGsOG7o2MgY2FuIHRoaeG7h3AgeSB04bq/IHThuqFpIGPGoSBz4bufIMSRaeG7gXUgdHLhu4suIMSQaeG7gXUgbsOgeSBuaOG6pW4gbeG6oW5oIHZhaSB0csOyIGPhu6dhIHZp4buHYyB04bqnbSBzb8OhdCB54bq/dSB04buRIG5ndXkgY8ahIHbDoCB0aGVvIGTDtWkgc8OhdCBzYW8gY8OhYyB0cmnhu4d1IGNo4bupbmcgxJHhu4MgZ2nhuqNtIHRoaeG7g3UgdOG7tyBs4buHIG5o4bqtcCB2aeG7h24uDQoNCiMjICoqMi44LiBCaeG6v24gSUNVX0FkbWlzc2lvbioqDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biANCnRhYmxlKGR0JElDVV9BZG1pc3Npb24pL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biANCnRhYmxlKGR0JElDVV9BZG1pc3Npb24pDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCBjaHV54buDbiBzYW5nIGRhdGEuZnJhbWUNCmljdV9mcmVxIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZHQkSUNVX0FkbWlzc2lvbikpDQpjb2xuYW1lcyhpY3VfZnJlcSkgPC0gYygiSUNVX0FkbWlzc2lvbiIsICJDb3VudCIpDQoNCiMgVMOtbmggcGjhuqduIHRyxINtIHbDoCB04bqhbyBuaMOjbg0KaWN1X2ZyZXEkUGVyY2VudCA8LSByb3VuZCgxMDAgKiBpY3VfZnJlcSRDb3VudCAvIHN1bShpY3VfZnJlcSRDb3VudCksIDEpDQppY3VfZnJlcSRMYWJlbCA8LSBwYXN0ZTAoaWN1X2ZyZXEkUGVyY2VudCwgIiUiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuIHbhu5tpIG5ow6NuIG7hurFtIGNow61uaCBnaeG7r2EgdOG7q25nIHBo4bqnbg0KZ2dwbG90KGljdV9mcmVxLCBhZXMoeCA9ICIiLCB5ID0gQ291bnQsIGZpbGwgPSBJQ1VfQWRtaXNzaW9uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgY29vcmRfcG9sYXIoInkiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBMYWJlbCksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBzaXplID0gNSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyA4LiBUw6xuaCB0cuG6oW5nIG5o4bqtcCBJQ1UgKElDVSBBZG1pc3Npb24pIiwNCiAgICAgICBmaWxsID0gIk5o4bqtcCBJQ1UiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMSIpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNClRyb25nIHThu5VuZyBz4buRIDMuMDAwIGLhu4duaCBuaMOibiwgY2jhu4kgY8OzIDE2MiBuZ8aw4budaSAoNSw0JSkgxJHGsOG7o2Mgbmjhuq1wIGtob2EgaOG7k2kgc+G7qWMgdMOtY2ggY+G7sWMgKElDVSksIHRyb25nIGtoaSBjw7MgxJHhur9uIDIuODM4IG5nxrDhu51pICg5NCw2JSkga2jDtG5nIG5o4bqtcCBJQ1UuIFPhu7EgY2jDqm5oIGzhu4djaCBs4bubbiBuw6B5IGNobyB0aOG6pXkgYmnhur9uIElDVV9BZG1pc3Npb24gbMOgIG3hu5l0IGJp4bq/biBwaMOibiBsb+G6oWkgbeG6pXQgY8OibiBi4bqxbmcgbeG6oW5oLCB24bubaSBuaMOzbSAiTm8iIGNoaeG6v20gxrB1IHRo4bq/IHR1eeG7h3QgxJHhu5FpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB2aeG7h2Mgbmjhuq1wIElDVSBsw6AgbeG7mXQgc+G7sSBraeG7h24gdMawxqFuZyDEkeG7kWkgaGnhur9tLCBjw7MgdGjhu4MgZ+G6r24gbGnhu4FuIHbhu5tpIGPDoWMgeeG6v3UgdOG7kSBuZ3V5IGPGoSBuZ2hpw6ptIHRy4buNbmcgaMahbiB24buBIHPhu6ljIGto4buPZS4NCg0KIyMgKioyLjkuIEJp4bq/biBWZW50aWxhdG9yX1N1cHBvcnQqKg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gDQp0YWJsZShkdCRWZW50aWxhdG9yX1N1cHBvcnQpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biANCnRhYmxlKGR0JFZlbnRpbGF0b3JfU3VwcG9ydCkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQpgYGB7cn0NCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIGNodXnhu4NuIHNhbmcgZGF0YS5mcmFtZQ0KdmVudF9mcmVxIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZHQkVmVudGlsYXRvcl9TdXBwb3J0KSkNCmNvbG5hbWVzKHZlbnRfZnJlcSkgPC0gYygiVmVudGlsYXRvcl9TdXBwb3J0IiwgIkNvdW50IikNCg0KIyBUw61uaCBwaOG6p24gdHLEg20gdsOgIHThuqFvIG5ow6NuDQp2ZW50X2ZyZXEkUGVyY2VudCA8LSByb3VuZCgxMDAgKiB2ZW50X2ZyZXEkQ291bnQgLyBzdW0odmVudF9mcmVxJENvdW50KSwgMSkNCnZlbnRfZnJlcSRMYWJlbCA8LSBwYXN0ZTAodmVudF9mcmVxJFBlcmNlbnQsICIlIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybiB0aGVvIG3huqt1IElDVV9BZG1pc3Npb24NCmdncGxvdCh2ZW50X2ZyZXEsIGFlcyh4ID0gIiIsIHkgPSBDb3VudCwgZmlsbCA9IFZlbnRpbGF0b3JfU3VwcG9ydCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSwgY29sb3IgPSAid2hpdGUiKSArDQogIGNvb3JkX3BvbGFyKCJ5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gTGFiZWwpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgc2l6ZSA9IDUpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgOS4gSOG7lyB0cuG7oyB0aOG7nyBtw6F5IChWZW50aWxhdG9yIFN1cHBvcnQpIiwNCiAgICAgICBmaWxsID0gIlRo4bufIG3DoXkiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMSIpDQpgYGANCg0KIyMgKioyLjEwLiBCaeG6v24gUmVjb3ZlcmVkKioNCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIA0KdGFibGUoZHQkUmVjb3ZlcmVkKS9zdW0obnJvdyhkdCkpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gDQp0YWJsZShkdCRSZWNvdmVyZWQpDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCBjaHV54buDbiBzYW5nIGRhdGEuZnJhbWUNCnJlY292ZXJlZF9mcmVxIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZHQkUmVjb3ZlcmVkKSkNCmNvbG5hbWVzKHJlY292ZXJlZF9mcmVxKSA8LSBjKCJSZWNvdmVyZWQiLCAiQ291bnQiKQ0KDQojIFTDrW5oIHBo4bqnbiB0csSDbSB2w6AgdOG6oW8gbmjDo24NCnJlY292ZXJlZF9mcmVxJFBlcmNlbnQgPC0gcm91bmQoMTAwICogcmVjb3ZlcmVkX2ZyZXEkQ291bnQgLyBzdW0ocmVjb3ZlcmVkX2ZyZXEkQ291bnQpLCAxKQ0KcmVjb3ZlcmVkX2ZyZXEkTGFiZWwgPC0gcGFzdGUwKHJlY292ZXJlZF9mcmVxJFBlcmNlbnQsICIlIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybiB0aGVvIG3huqt1IA0KZ2dwbG90KHJlY292ZXJlZF9mcmVxLCBhZXMoeCA9ICIiLCB5ID0gQ291bnQsIGZpbGwgPSBSZWNvdmVyZWQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDEsIGNvbG9yID0gIndoaXRlIikgKw0KICBjb29yZF9wb2xhcigieSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IExhYmVsKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLA0KICAgICAgICAgICAgc2l6ZSA9IDUpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgMTAuIFTDrG5oIHRy4bqhbmcgaOG7k2kgcGjhu6VjIChSZWNvdmVyZWQpIiwNCiAgICAgICBmaWxsID0gIlJlY292ZXJlZCIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgdOG7tyBs4buHIGLhu4duaCBuaMOibiBDT1ZJRC0xOSDEkcOjIGjhu5NpIHBo4bulYyAqKihZZXMpKiogdsOgIGNoxrBhIGjhu5NpIHBo4bulYyAqKihObykqKiBn4bqnbiBuaMawIHTGsMahbmcgxJHGsMahbmcsIHbhu5tpIDEuNTA4IGNhICg1MC4zJSkgxJHDoyBo4buTaSBwaOG7pWMgdsOgIDEuNDkyIGNhICg0OS43JSkgY2jGsGEgaOG7k2kgcGjhu6VjLiBT4buxIGNow6puaCBs4buHY2ggY2jhu4kg4bufIG3hu6ljIDAuNiUsIHBo4bqjbiDDoW5oIHLhurFuZyBxdeG6p24gdGjhu4Mga2jhuqNvIHPDoXQgxJHGsOG7o2MgcGjDom4gYuG7kSBraMOhIGPDom4gYuG6sW5nIGdp4buvYSBoYWkgdHLhuqFuZyB0aMOhaSBwaOG7pWMgaOG7k2kuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGLhu5kgZOG7ryBsaeG7h3UgY8OzIHTDrW5oIMSR4bqhaSBkaeG7h24gdOG7kXQgdsOgIGPDsyB0aOG7gyBwaOG7pWMgduG7pSBoaeG7h3UgcXXhuqMgY2hvIHZp4buHYyBwaMOibiB0w61jaCBjw6FjIHnhur91IHThu5EgbGnDqm4gcXVhbiDEkeG6v24ga2jhuqMgbsSDbmcgaOG7k2kgcGjhu6VjLCBjaOG6s25nIGjhuqFuIG5oxrAgdMOsbmggdHLhuqFuZyBi4buHbmggbuG7gW4sIG3hu6ljIMSR4buZIG5naGnDqm0gdHLhu41uZyBob+G6t2MgdMOsbmggdHLhuqFuZyB0acOqbSBjaOG7p25nLg0KDQojIyAqKjIuMTEuIEJp4bq/biBSZWluZmVjdGlvbioqDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biANCnRhYmxlKGR0JFJlaW5mZWN0aW9uKS9zdW0obnJvdyhkdCkpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gDQp0YWJsZShkdCRSZWluZmVjdGlvbikNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5EgdsOgIGNodXnhu4NuIHNhbmcgZGF0YS5mcmFtZQ0KcmVpbmZlY3Rpb25fZnJlcSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGR0JFJlaW5mZWN0aW9uKSkNCmNvbG5hbWVzKHJlaW5mZWN0aW9uX2ZyZXEpIDwtIGMoIlJlaW5mZWN0aW9uIiwgIkNvdW50IikNCg0KIyBUw61uaCBwaOG6p24gdHLEg20gdsOgIG5ow6NuDQpyZWluZmVjdGlvbl9mcmVxJFBlcmNlbnQgPC0gcm91bmQoMTAwICogcmVpbmZlY3Rpb25fZnJlcSRDb3VudCAvIHN1bShyZWluZmVjdGlvbl9mcmVxJENvdW50KSwgMSkNCnJlaW5mZWN0aW9uX2ZyZXEkTGFiZWwgPC0gcGFzdGUwKHJlaW5mZWN0aW9uX2ZyZXEkUGVyY2VudCwgIiUiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuIHbhu5tpIG5ow6NuIHBo4bqnbiB0csSDbQ0KZ2dwbG90KHJlaW5mZWN0aW9uX2ZyZXEsIGFlcyh4ID0gIiIsIHkgPSBDb3VudCwgZmlsbCA9IFJlaW5mZWN0aW9uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgY29vcmRfcG9sYXIoInkiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBMYWJlbCksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gNSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyAxMS4gVMOsbmggdHLhuqFuZyB0w6FpIG5oaeG7hW0gKFJlaW5mZWN0aW9uKSIsDQogICAgICAgZmlsbCA9ICJUw6FpIG5oaeG7hW0iKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMSIpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQpE4buvIGxp4buHdSBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBi4buHbmggbmjDom4gdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQga2jDtG5nIGLhu4sgdMOhaSBuaGnhu4VtIENPVklELTE5LCB24bubaSAyLjcxNSB0csaw4budbmcgaOG7o3AgKDkwLjUlKSBnaGkgbmjhuq1uIGtow7RuZyB0w6FpIG5oaeG7hW0gdsOgIGNo4buJIGPDsyAyODUgdHLGsOG7nW5nIGjhu6NwICg5LjUlKSBi4buLIHTDoWkgbmhp4buFbS4gVOG7tyBs4buHIHTDoWkgbmhp4buFbSB0xrDGoW5nIMSR4buRaSB0aOG6pXAgY2hvIHRo4bqleSBraOG6oyBuxINuZyBtaeG7hW4gZOG7i2NoIHThu7Egbmhpw6puIGhv4bq3YyB04burIHbhuq9jLXhpbiBjw7MgdGjhu4MgduG6q24gY8OybiBoaeG7h3UgbOG7sWMgdHJvbmcgcGjhuqduIGzhu5tuIGPDoWMgdHLGsOG7nW5nIGjhu6NwIHRyb25nIGtob+G6o25nIHRo4budaSBnaWFuIHRodSB0aOG6rXAgZOG7ryBsaeG7h3UuIFR1eSBuaGnDqm4sIHbhu5tpIGfhuqduIDEwJSB0w6FpIG5oaeG7hW0sIMSRaeG7gXUgbsOgeSBjxaluZyBuaOG6pW4gbeG6oW5oIHLhurFuZyBy4bunaSBybyB0w6FpIG3huq9jIHbhuqtuIHThu5NuIHThuqFpLCDEkeG6t2MgYmnhu4d0IHRyb25nIGLhu5FpIGPhuqNuaCBjw6FjIGJp4bq/biB0aOG7gyBt4bubaSBsacOqbiB04bulYyB4deG6pXQgaGnhu4duIHbDoCBjw7MgdGjhu4MgbsOpIHRyw6FuaCBtaeG7hW4gZOG7i2NoLg0KDQojIyAqKjIuMTIuIEJp4bq/biBWYWNjaW5hdGlvbl9TdGF0dXMqKg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gDQp0YWJsZShkdCRWYWNjaW5hdGlvbl9TdGF0dXMpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biANCnRhYmxlKGR0JFZhY2NpbmF0aW9uX1N0YXR1cykNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQpgYGB7cn0NCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIGNodXnhu4NuIHNhbmcgZGF0YS5mcmFtZQ0KdmFjY2luZV9mcmVxIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZHQkVmFjY2luYXRpb25fU3RhdHVzKSkNCmNvbG5hbWVzKHZhY2NpbmVfZnJlcSkgPC0gYygiVmFjY2luYXRpb25fU3RhdHVzIiwgIkNvdW50IikNCg0KIyBUw61uaCBwaOG6p24gdHLEg20gdsOgIGfDoW4gbmjDo24NCnZhY2NpbmVfZnJlcSRQZXJjZW50IDwtIHJvdW5kKDEwMCAqIHZhY2NpbmVfZnJlcSRDb3VudCAvIHN1bSh2YWNjaW5lX2ZyZXEkQ291bnQpLCAxKQ0KdmFjY2luZV9mcmVxJExhYmVsIDwtIHBhc3RlMCh2YWNjaW5lX2ZyZXEkUGVyY2VudCwgIiUiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuIGPDsyBwaOG6p24gdHLEg20g4bufIGdp4buvYSBt4buXaSBwaOG6p24NCmdncGxvdCh2YWNjaW5lX2ZyZXEsIGFlcyh4ID0gIiIsIHkgPSBDb3VudCwgZmlsbCA9IFZhY2NpbmF0aW9uX1N0YXR1cykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSwgY29sb3IgPSAid2hpdGUiKSArDQogIGNvb3JkX3BvbGFyKCJ5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gTGFiZWwpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksDQogICAgICAgICAgICBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIDEyLiBUw6xuaCB0cuG6oW5nIHRpw6ptIHbhuq9jLXhpbiAoVmFjY2luYXRpb24gU3RhdHVzKSIsDQogICAgICAgZmlsbCA9ICLEkMOjIHRpw6ptIHbhuq9jLXhpbiIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgdOG7tyBs4buHIGLhu4duaCBuaMOibiDEkcOjIHRpw6ptIHbhuq9jLXhpbiB2w6AgY2jGsGEgdGnDqm0gduG6r2MteGluIGfhuqduIG5oxrAgdMawxqFuZyDEkcawxqFuZy4gQ+G7pSB0aOG7gywgY8OzIDEuNTI4IG5nxrDhu51pICg1MC45JSkgY2jGsGEgdGnDqm0gdsOgIDEuNDcyIG5nxrDhu51pICg0OS4xJSkgxJHDoyB0acOqbSB24bqvYy14aW4gcGjDsm5nIENPVklELTE5LiBT4buxIGNow6puaCBs4buHY2ggY2jhu4kga2hv4bqjbmcgMS44JSBjaG8gdGjhuqV5IHF14bqnbiB0aOG7gyBraOG6o28gc8OhdCBjw7MgcGjDom4gYuG7kSBraMOhIGPDom4gYuG6sW5nIHbhu4EgdMOsbmggdHLhuqFuZyB0acOqbSBjaOG7p25nLiDEkGnhu4F1IG7DoHkgZ2nDunAgdOG6oW8gxJFp4buBdSBraeG7h24gdGh14bqtbiBs4bujaSBjaG8gdmnhu4djIHBow6JuIHTDrWNoIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHRpw6ptIHbhuq9jLXhpbiB2w6AgY8OhYyB54bq/dSB04buRIGtow6FjIG5oxrAgbeG7qWMgxJHhu5kgbmdoacOqbSB0cuG7jW5nLCBraOG6oyBuxINuZyBo4buTaSBwaOG7pWMgaGF5IG5ndXkgY8ahIHTDoWkgbmhp4buFbSwgdOG7qyDEkcOzIMSRw6FuaCBnacOhIGhp4buHdSBxdeG6oyBj4bunYSBjaMawxqFuZyB0csOsbmggdGnDqm0gY2jhu6duZyBt4buZdCBjw6FjaCBraMOhY2ggcXVhbiBoxqFuLg0KDQojIyAqKjIuMTMuIEJp4bq/biBWYWNjaW5lX1R5cGUqKg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gDQp0YWJsZShkdCRWYWNjaW5lX1R5cGUpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biANCnRhYmxlKGR0JFZhY2NpbmVfVHlwZSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQpgYGB7cn0NCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIGNodXnhu4NuIHNhbmcgZGF0YS5mcmFtZQ0KdmFjY2luZV90eXBlX2ZyZXEgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkdCRWYWNjaW5lX1R5cGUpKQ0KY29sbmFtZXModmFjY2luZV90eXBlX2ZyZXEpIDwtIGMoIlZhY2NpbmVfVHlwZSIsICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgxJHhu6luZw0KZ2dwbG90KHZhY2NpbmVfdHlwZV9mcmVxLCBhZXMoeCA9IHJlb3JkZXIoVmFjY2luZV9UeXBlLCAtQ291bnQpLCB5ID0gQ291bnQsIGZpbGwgPSBWYWNjaW5lX1R5cGUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIDEzLiBMb+G6oWkgduG6r2MteGluIMSRw6MgdGnDqm0gKFZhY2NpbmUgVHlwZSkiLA0KICAgICAgIHggPSAiTG/huqFpIHbhuq9jLXhpbiIsDQogICAgICAgeSA9ICJT4buRIGzGsOG7o25nIiwNCiAgICAgICBmaWxsID0gIkxv4bqhaSB24bqvYy14aW4iKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQpE4buvIGxp4buHdSBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBuZ8aw4budaSB0cm9uZyBt4bqrdSBraOG6o28gc8OhdCBraMO0bmcgdGnDqm0gduG6r2MteGluLCB24bubaSAxLjgwOSB0csaw4budbmcgaOG7o3AgKDYwLjMlKSB0aHXhu5ljIG5ow7NtIOKAnE5vbmXigJ0uIFRyb25nIGtoaSDEkcOzLCBjw6FjIGxv4bqhaSB24bqvYy14aW4gY8OybiBs4bqhaSDEkcaw4bujYyBwaMOibiBi4buRIHTGsMahbmcgxJHhu5FpIMSR4buTbmcgxJHhu4F1IHbhu5tpIHThu7cgbOG7hyB0aOG6pXAgaMahbiBuaGnhu4F1OiBQZml6ZXIgY2hp4bq/bSAxMC40JSAoMzExIG5nxrDhu51pKSwgdGnhur9wIHRoZW8gbMOgIEFzdHJhWmVuZWNhICg5LjglKSwgSmFuc3NlbiAoOS44JSksIHbDoCBNb2Rlcm5hICg5LjclKS4gU+G7sSBjaMOqbmggbOG7h2NoIGzhu5tuIGdp4buvYSBuaMOzbSBraMO0bmcgdGnDqm0gdsOgIGPDoWMgbmjDs20gY8OzIHRpw6ptIGNobyB0aOG6pXkgcuG6sW5nIHThu7cgbOG7hyBiYW8gcGjhu6cgduG6r2MteGluIHRyb25nIGThu68gbGnhu4d1IG7DoHkgY8OybiBo4bqhbiBjaOG6vywgaG/hurdjIHRo4budaSDEkWnhu4NtIHRodSB0aOG6rXAgY8OzIHRo4buDIHLGoWkgdsOgbyBnaWFpIMSRb+G6oW4gxJHhuqd1IGPhu6dhIGNoaeG6v24gZOG7i2NoIHRpw6ptIGNo4bunbmcuIA0KDQojIyAqKjIuMTQuIEJp4bq/biBMb25nX0NPVklEX1N5bXB0b21zKioNCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIA0KdGFibGUoZHQkTG9uZ19DT1ZJRF9TeW1wdG9tcykvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHPhu5EgYmnhur9uIA0KdGFibGUoZHQkTG9uZ19DT1ZJRF9TeW1wdG9tcykNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQpgYGB7cn0NCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIGNodXnhu4NuIHNhbmcgZGF0YS5mcmFtZQ0KbG9uZ19jb3ZpZF9mcmVxIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZHQkTG9uZ19DT1ZJRF9TeW1wdG9tcykpDQpjb2xuYW1lcyhsb25nX2NvdmlkX2ZyZXEpIDwtIGMoIlN5bXB0b20iLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IMSR4bupbmcNCmdncGxvdChsb25nX2NvdmlkX2ZyZXEsIGFlcyh4ID0gcmVvcmRlcihTeW1wdG9tLCAtQ291bnQpLCB5ID0gQ291bnQsIGZpbGwgPSBTeW1wdG9tKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyAxNC4gVHJp4buHdSBjaOG7qW5nIENPVklEIGvDqW8gZMOgaSAoTG9uZyBDT1ZJRCBTeW1wdG9tcykiLA0KICAgICAgIHggPSAiVHJp4buHdSBjaOG7qW5nIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmciLA0KICAgICAgIGZpbGwgPSAiVHJp4buHdSBjaOG7qW5nIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQpE4buvIGxp4buHdSBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBi4buHbmggbmjDom4ga2jDtG5nIGfhurdwIHBo4bqjaSB0cmnhu4d1IGNo4bupbmcgQ09WSUQga8OpbyBkw6BpLCB24bubaSAyLjc4MCB0csaw4budbmcgaOG7o3AgKDkyLjclKSBiw6FvIGPDoW8ga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcga8OpbyBkw6BpIChOb25lKS4gVHJvbmcgc+G7kSBjw6FjIHRyaeG7h3UgY2jhu6luZyBrw6lvIGTDoGksIG3hu4d0IG3hu49pIChGYXRpZ3VlKSBsw6AgcGjhu5UgYmnhur9uIG5o4bqldCB24bubaSA2MiB0csaw4budbmcgaOG7o3AgKDIuMSUpLCB0aeG6v3AgdGhlbyBsw6Agc3V5IGdp4bqjbSB0csOtIG5o4bubIChCcmFpbiBGb2cpIHbhu5tpIDU5IHRyxrDhu51uZyBo4bujcCAoMi4wJSksIMSRYXUgbmfhu7FjIChDaGVzdCBQYWluKSB24bubaSA1MiB0csaw4budbmcgaOG7o3AgKDEuNyUpLCB2w6Aga2jDsyB0aOG7nyAoU2hvcnRuZXNzIG9mIEJyZWF0aCkgduG7m2kgNDcgdHLGsOG7nW5nIGjhu6NwICgxLjYlKS4gTeG6t2MgZMO5IHThu7cgbOG7hyBt4bqvYyBjw6FjIHRyaeG7h3UgY2jhu6luZyBrw6lvIGTDoGkgdMawxqFuZyDEkeG7kWkgdGjhuqVwLCBuaMawbmcgY2jDum5nIHbhuqtuIGzDoCB24bqlbiDEkeG7gSDEkcOhbmcgY2jDuiDDvSBi4bufaSDhuqNuaCBoxrDhu59uZyBsw6J1IGTDoGkgxJHhur9uIGNo4bqldCBsxrDhu6NuZyBjdeG7mWMgc+G7kW5nIGPhu6dhIG5nxrDhu51pIGLhu4duaC4NCg0KIyMgKioyLjE1LiBCaeG6v24gT2NjdXBhdGlvbioqDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biANCnRhYmxlKGR0JE9jY3VwYXRpb24pL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biANCnRhYmxlKGR0JE9jY3VwYXRpb24pDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCBjaHV54buDbiBzYW5nIGRhdGEuZnJhbWUNCm9jY3VwYXRpb25fZnJlcSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGR0JE9jY3VwYXRpb24pKQ0KY29sbmFtZXMob2NjdXBhdGlvbl9mcmVxKSA8LSBjKCJPY2N1cGF0aW9uIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCDEkeG7qW5nIGtow7RuZyBjw7MgbmjDo24gc+G7kQ0KZ2dwbG90KG9jY3VwYXRpb25fZnJlcSwgYWVzKHggPSByZW9yZGVyKE9jY3VwYXRpb24sIC1Db3VudCksIHkgPSBDb3VudCwgZmlsbCA9IE9jY3VwYXRpb24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIDE1LiBQaMOibiBi4buRIG5naOG7gSBuZ2hp4buHcCAoT2NjdXBhdGlvbikiLA0KICAgICAgIHggPSAiTmdo4buBIG5naGnhu4dwIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmciLA0KICAgICAgIGZpbGwgPSAiTmdo4buBIG5naGnhu4dwIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotIEThu68gbGnhu4d1IHBow6JuIGLhu5Egbmdo4buBIG5naGnhu4dwIGPhu6dhIG3huqt1IGto4bqjbyBzw6F0IGNobyB0aOG6pXkgc+G7sSBjw6JuIGLhurFuZyB0xrDGoW5nIMSR4buRaSBnaeG7r2EgY8OhYyBuaMOzbSB24bubaSB04bu3IGzhu4cga2jDoSDEkeG7k25nIMSR4buBdSwgZ2nDunAgcGjhuqNuIMOhbmggxJFhIGThuqFuZyBuZ2jhu4EgbmdoaeG7h3AgdHJvbmcgY+G7mW5nIMSR4buTbmcgbmdoacOqbiBj4bupdS4gQ+G7pSB0aOG7gywgbmjDs20gc2luaCB2acOqbiBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHbhu5tpIDE3LjglICg1MzMgbmfGsOG7nWkpLCB0aOG7gyBoaeG7h24gc+G7sSB0aGFtIGdpYSDEkcO0bmcgxJHhuqNvIGPhu6dhIMSR4buRaSB0xrDhu6NuZyB0cuG6uyB0deG7lWkgdsOgIGPDsyB0aOG7gyDEkWFuZyB0cm9uZyBtw7RpIHRyxrDhu51uZyBo4buNYyB04bqtcCwgduG7kW4gbMOgIG5ow7NtIGPDsyBuaGnhu4F1IHTGsMahbmcgdMOhYyB4w6MgaOG7mWkuIE5ow7NtIG5ow6JuIHZpw6puIHbEg24gcGjDsm5nIGPFqW5nIGNoaeG6v20gdOG7tyBs4buHIMSRw6FuZyBr4buDIHbhu5tpIDE2LjglICg1MDMgbmfGsOG7nWkpLCBwaOG6o24gw6FuaCBt4bupYyDEkeG7mSBwaOG7lSBiaeG6v24gY+G7p2Egbmdo4buBIG5naGnhu4dwIG7DoHkgdHJvbmcgeMOjIGjhu5lpIHbDoCBraOG6oyBuxINuZyB0aeG6v3AgeMO6YyB04bqhaSBuxqFpIGzDoG0gdmnhu4djLiBOaMOzbSB0aOG6pXQgbmdoaeG7h3AgY2hp4bq/bSBraG/huqNuZyAxNi42JSAoNDk3IG5nxrDhu51pKSwgxJHDonkgbMOgIG3hu5l0IHThu7cgbOG7hyBraMO0bmcgbmjhu48sIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgdGnhur9wIGPhuq1uIGThu4tjaCB24bulIHkgdOG6vyB2w6AgdGjDtG5nIHRpbiB24buBIHBow7JuZyBjaOG7kW5nIGThu4tjaC4gDQoNCi0gQ8OhYyBuaMOzbSBuZ2jhu4EgbMOhaSB4ZSwgY2jEg20gc8OzYyBz4bupYyBraOG7j2UgdsOgIGdpw6FvIHZpw6puIGPFqW5nIGPDsyB04bu3IGzhu4cgZ+G6p24gdMawxqFuZyB04buxLCBs4bqnbiBsxrDhu6N0IGzDoCAxNi40JSAoNDkyIG5nxrDhu51pKSwgMTYuMSUgKDQ4NCBuZ8aw4budaSkgdsOgIDE2LjQlICg0OTEgbmfGsOG7nWkpLiBT4buxIHBow6JuIGLhu5EgxJHhu5NuZyDEkeG7gXUgZ2nhu69hIGPDoWMgbmfDoG5oIG5naOG7gSBuw6B5IGdpw7pwIMSR4bqjbSBi4bqjbyBy4bqxbmcgY8OhYyBwaMOibiB0w61jaCBsacOqbiBxdWFuIMSR4bq/biDhuqNuaCBoxrDhu59uZyBj4bunYSBDT1ZJRC0xOSDEkeG7kWkgduG7m2kgdOG7q25nIG5ow7NtIG5naOG7gSBuZ2hp4buHcCBjw7MgdMOtbmggxJHhuqFpIGRp4buHbiB2w6AgcGjhuqNuIMOhbmggY2jDrW5oIHjDoWMgaMahbiBuaOG7r25nIMSR4bq3YyDEkWnhu4NtIMSRYSBk4bqhbmcgdHJvbmcgY+G7mW5nIMSR4buTbmcuIMSQaeG7gXUgbsOgeSBjxaluZyB04bqhbyDEkWnhu4F1IGtp4buHbiB0aHXhuq1uIGzhu6NpIGNobyB2aeG7h2MgeMOieSBk4buxbmcgY8OhYyBjaMOtbmggc8OhY2ggeSB04bq/LCBwaMOybmcgY2jhu5FuZyBk4buLY2ggcGjDuSBo4bujcCB24bubaSDEkeG6t2MgxJFp4buDbSB2w6Agbmh1IGPhuqd1IHJpw6puZyBj4bunYSB04burbmcgbmjDs20gbmdo4buBIG5naGnhu4dwIHRyb25nIHjDoyBo4buZaS4NCg0KIyMgKioyLjE2LiBCaeG6v24gU21va2luZ19TdGF0dXMqKg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gDQp0YWJsZShkdCRTbW9raW5nX1N0YXR1cykvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHPhu5EgYmnhur9uIA0KdGFibGUoZHQkU21va2luZ19TdGF0dXMpDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRIHbDoCBjaHV54buDbiBzYW5nIGRhdGEuZnJhbWUNCnNtb2tpbmdfZnJlcSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGR0JFNtb2tpbmdfU3RhdHVzKSkNCmNvbG5hbWVzKHNtb2tpbmdfZnJlcSkgPC0gYygiU21va2luZ19TdGF0dXMiLCAiQ291bnQiKQ0KDQojIFTDrW5oIHThu7cgbOG7hyBwaOG6p24gdHLEg20NCnNtb2tpbmdfZnJlcSA8LSBzbW9raW5nX2ZyZXEgJT4lDQogIG11dGF0ZShQZXJjZW50ID0gQ291bnQgLyBzdW0oQ291bnQpICogMTAwLA0KICAgICAgICAgTGFiZWwgPSBwYXN0ZTAoU21va2luZ19TdGF0dXMsICJcbiIsIHJvdW5kKFBlcmNlbnQsIDEpLCAiJSIpKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpnZ3Bsb3Qoc21va2luZ19mcmVxLCBhZXMoeCA9ICIiLCB5ID0gQ291bnQsIGZpbGwgPSBTbW9raW5nX1N0YXR1cykpICsNCiAgZ2VvbV9jb2wod2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IExhYmVsKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIHNpemUgPSA0KSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIDE2LiBQaMOibiBi4buRIHTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIikgKw0KICB0aGVtZV92b2lkKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KROG7ryBsaeG7h3UgduG7gSB0w6xuaCB0cuG6oW5nIGjDunQgdGh14buRYyBj4bunYSBt4bqrdSBraOG6o28gc8OhdCBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBraMOhIMSR4buBdSBnaeG7r2EgYmEgbmjDs20uIEPhu6UgdGjhu4MsIG5ow7NtIG5o4buvbmcgbmfGsOG7nWkgxJFhbmcgaMO6dCB0aHXhu5FjIChDdXJyZW50KSBjaGnhur9tIGtob+G6o25nIDMzLjMlICgxMDAwIG5nxrDhu51pKSwgbmjDs20gdOG7q25nIGjDunQgdGh14buRYyBuaMawbmcgxJHDoyBi4buPIChGb3JtZXIpIGNoaeG6v20ga2hv4bqjbmcgMzIuNyUgKDk4MSBuZ8aw4budaSksIHbDoCBuaMOzbSBjaMawYSB04burbmcgaMO6dCB0aHXhu5FjIChOZXZlcikgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCB24bubaSAzMy45JSAoMTAxOSBuZ8aw4budaSkuIFPhu7EgY8OibiBi4bqxbmcgbsOgeSBwaOG6o24gw6FuaCBz4buxIMSRYSBk4bqhbmcgdHJvbmcgdGjDs2kgcXVlbiBow7p0IHRodeG7kWMgY+G7p2EgY+G7mW5nIMSR4buTbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQsIGNobyB0aOG6pXkgY+G6oyBiYSBuaMOzbSDEkeG7gXUgY2hp4bq/bSB04bu3IHRy4buNbmcgdMawxqFuZyDEkeG7kWkgbOG7m24sIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGPDoWMgcGjDom4gdMOtY2ggbGnDqm4gcXVhbiDEkeG6v24gdMOhYyDEkeG7mW5nIGPhu6dhIGjDunQgdGh14buRYyDEkeG6v24gc+G7qWMga2jhu49lLCDEkeG6t2MgYmnhu4d0IHRyb25nIGLhu5FpIGPhuqNuaCBk4buLY2ggQ09WSUQtMTkuDQoNCiMgKipQaOG6p24gMy4gxq/hu5pDIEzGr+G7ok5HIEtIT+G6ok5HIFbDgCBLSeG7gk0gxJDhu4pOSCBHSeG6oiBUSFVZ4bq+VCBDSE8gVOG7tiBM4buGIChN4buYVCBCSeG6vk4pKioNCg0KIyMgKiozLjEuIFJlY292ZXJlZF9Uw6xuaCB0cuG6oW5nIHBo4bulYyBo4buTaSAoUGjhu6VjIGjhu5NpX1llcykqKg0KDQoqKsav4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXkqKg0KDQpgYGB7cn0NCiMgU+G7kSBuZ8aw4budaSDEkcOjIHBo4bulYyBo4buTaQ0Kbl9yZWNvdmVyZWQgPC0gc3VtKGR0JFJlY292ZXJlZCA9PSAiWWVzIikNCg0KIyBU4buVbmcgc+G7kSBxdWFuIHPDoXQNCm5fdG90YWwgPC0gbnJvdyhkdCkNCg0KIyDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHBo4bulYyBo4buTaSAocCA9IDAuNSBsw6AgdOG7tyBs4buHIGvhu7MgduG7jW5nIMSR4buDIGtp4buDbSDEkeG7i25oKQ0KdGVzdF9yZWNvdmVyZWQgPC0gcHJvcC50ZXN0KG5fcmVjb3ZlcmVkLCBuX3RvdGFsLCBwID0gMC41LCBjb3JyZWN0ID0gRkFMU0UpDQoNCiMgSW4ga+G6v3QgcXXhuqMNCnRlc3RfcmVjb3ZlcmVkDQpgYGANCg0KLSBU4bu3IGzhu4cgcGjhu6VjIGjhu5NpIHRyb25nIGThu68gbGnhu4d1IGzDoCBgciByb3VuZChuX3JlY292ZXJlZCAvIG5fdG90YWwsIDQpYC4NCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbsOgeSBsw6AgdOG7qyBgciByb3VuZCh0ZXN0X3JlY292ZXJlZCRjb25mLmludFsxXSwgNClgIMSR4bq/biBgciByb3VuZCh0ZXN0X3JlY292ZXJlZCRjb25mLmludFsyXSwgNClgLg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gKipI4oKAOioqIFThu7cgbOG7hyBwaOG7pWMgaOG7k2kgdGjhu7FjIHThur8gbMOgIDUwJSAoJHAgPSAwLjUkKQ0KDQotICoqSOKCgToqKiBU4bu3IGzhu4cgcGjhu6VjIGjhu5NpIHRo4buxYyB04bq/ICoqa2jDoWMqKiA1MCUgKCRwIFxuZSAwLjUkKQ0KDQpW4bubaSBwLXZhbHVlID0gMC43NzAyID4gMC4wNSwgdGEga2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCDhu58gbeG7qWMgw70gbmdoxKlhIDUlLiDEkGnhu4F1IG7DoHkgbmdoxKlhIGzDoDogVOG7tyBs4buHIHBo4bulYyBo4buTaSB0cm9uZyBxdeG6p24gdGjhu4Mga2jDtG5nIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHNvIHbhu5tpIG3hu6ljIGdp4bqjIMSR4buLbmggNTAlLg0KDQojIyAqKjMuMi4gU3ltcHRvbXNfVHJp4buHdSBjaOG7qW5nIGJhbiBk4bqndSAoTmjhurlfTWlsZCkqKg0KDQoqKsav4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXkqKg0KDQpgYGB7cn0NCiMgU+G7kSBuZ8aw4budaSBjw7MgdHJp4buHdSBjaOG7qW5nIE1pbGQNCm5fbWlsZCA8LSBzdW0oZHQkU3ltcHRvbXMgPT0gIk1pbGQiKQ0Kbl90b3RhbCA8LSBucm93KGR0KQ0KDQojIEtp4buDbSDEkeG7i25oIG3hu5l0IHBow61hIHbhu5tpIHAgPSAwLjMzDQp0ZXN0X21pbGQgPC0gcHJvcC50ZXN0KG5fbWlsZCwgbl90b3RhbCwgcCA9IDAuMzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gImxlc3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0ID0gRkFMU0UpDQp0ZXN0X21pbGQNCmBgYA0KDQotIFThu7cgbOG7hyBuZ8aw4budaSBjw7MgdHJp4buHdSBjaOG7qW5nIGJhbiDEkeG6p3UgbmjhurkgKE1pbGQpIGzDoCBgciByb3VuZChuX21pbGQgLyBuX3RvdGFsLCA0KWAuDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IG3hu5l0IHBow61hIGTGsOG7m2kgOTUlIGNobyB04bu3IGzhu4cgbsOgeSBsw6AgdOG7qyAwIMSR4bq/biAwLjM1Lg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gKipI4oKAOioqIFThu7cgbOG7hyBuZ8aw4budaSBjw7MgdHJp4buHdSBjaOG7qW5nIGJhbiDEkeG6p3UgbMOgIE1pbGQgbOG7m24gaMahbiAzMyUgKHAg4omlIDAuMzMpDQoNCi0gKipI4oKBOioqIFThu7cgbOG7hyBuZ8aw4budaSBjw7MgdHJp4buHdSBjaOG7qW5nIGJhbiDEkeG6p3UgbMOgIE1pbGQga2jDtG5nIGzhu5tuIGjGoW4gMzMlIChwIDwgMC4zMykNCg0KVuG7m2kgbeG7qWMgw70gbmdoxKlhIM6xID0gMC4wNSwgcC12YWx1ZSBj4bunYSBraeG7g20gxJHhu4tuaCBsw6AgciByb3VuZCh0ZXN0X21pbGQkcC52YWx1ZSwgNCksIGzhu5tuIGjGoW4gMC4wNSwgZG8gxJHDsyBraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSB04bu3IGzhu4cgbmfGsOG7nWkgY8OzIHRyaeG7h3UgY2jhu6luZyBiYW4gxJHhuqd1IG5o4bq5IChNaWxkKSBs4bubbiBoxqFuIDMzJS4gDQoNCiMjICoqMy4zLiBTZXZlcml0eV9N4bupYyDEkeG7mSBuZ2hpw6ptIHRy4buNbmcgKENyaXRpY2FsX05ndXkga+G7i2NoKSoqDQoNCioqxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSoqDQoNCmBgYHtyfQ0KIyBT4buRIG5nxrDhu51pIOG7nyBt4bupYyBDcml0aWNhbA0Kbl9jcml0aWNhbCA8LSBzdW0oZHQkU2V2ZXJpdHkgPT0gIkNyaXRpY2FsIikNCm5fdG90YWwgPC0gbnJvdyhkdCkNCg0KIyBLaeG7g20gxJHhu4tuaCB04buJIGzhu4cgbeG7mXQgcGjDrWEgduG7m2kgcCA9IDAuMjMgKDI2JSkNCnRlc3RfY3JpdGljYWwgPC0gcHJvcC50ZXN0KG5fY3JpdGljYWwsIG5fdG90YWwsIHAgPSAwLjIzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdCA9IEZBTFNFKQ0KDQp0ZXN0X2NyaXRpY2FsDQpgYGANCg0KLSBU4bu3IGzhu4cgYuG7h25oIG5ow6JuIOG7nyBt4bupYyDEkeG7mSBuZ2hpw6ptIHRy4buNbmcgbmd1eSBr4buLY2ggKENyaXRpY2FsKSBsw6AgYHIgcm91bmQobl9jcml0aWNhbCAvIG5fdG90YWwsIDQpYC4NCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgbeG7mXQgcGjDrWEgZMaw4bubaSA5NSUgY2hvIHThu7cgbOG7hyBuw6B5IGzDoCB04burIDAgxJHhur9uIGByIHJvdW5kKHRlc3RfY3JpdGljYWwkY29uZi5pbnRbMl0sIDQpYCAoZ2nDoSB0cuG7iyBkxrDhu5tpIGPhu6dhIGtob+G6o25nIHRpbiBj4bqteSBsw6AgMCBkbyDEkeG6t2MgdHLGsG5nIGPhu6dhIGtp4buDbSDEkeG7i25oIG3hu5l0IHBow61hIG5o4buPIGjGoW4pLg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gKipI4oKAOioqIFThu7cgbOG7hyBi4buHbmggbmjDom4gbmd1eSBr4buLY2ggKENyaXRpY2FsKSDiiaUgMjMlIChwIOKJpSAwLjIzKQ0KDQotICoqSOKCgToqKiBU4bu3IGzhu4cgYuG7h25oIG5ow6JuIG5ndXkga+G7i2NoIChDcml0aWNhbCkgPCAyMyUgKHAgPCAwLjIzKQ0KDQpLaeG7g20gxJHhu4tuaCBjaG8ga+G6v3QgcXXhuqMgcC12YWx1ZSA9IDAuODE4OS4gDQoNClbhu5tpIG3hu6ljIMO9IG5naMSpYSDOsSA9IDAuMDUsIHRhIHRo4bqleSBy4bqxbmcgcC12YWx1ZSBs4bubbiBoxqFuIM6xLCBkbyDEkcOzIGtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgC4NCg0KxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGNoxrBhIHRo4buDIGvhur90IGx14bqtbiBy4bqxbmcgdOG7tyBs4buHIGLhu4duaCBuaMOibiDhu58gbeG7qWMgxJHhu5kgQ3JpdGljYWwgbmjhu48gaMahbiAyMyUgdHJvbmcgcXXhuqduIHRo4buDLiANCg0KIyMgKiozLjQuIFNtb2tpbmdfU3RhdHVzX1TDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIChDdXJyZW50X8SQYW5nIGjDunQgdGh14buRYykqKg0KDQoqKsav4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXkqKg0KYGBge3J9DQpuX2N1cnJlbnQgPC0gc3VtKGR0JFNtb2tpbmdfU3RhdHVzID09ICJDdXJyZW50IikNCm5fdG90YWwgPC0gbnJvdyhkdCkNCg0KdGVzdF9jdXJyZW50IDwtIHByb3AudGVzdChuX2N1cnJlbnQsIG5fdG90YWwsIHAgPSAwLjMzLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgY29ycmVjdCA9IEZBTFNFKQ0KdGVzdF9jdXJyZW50DQpgYGANCg0KLSBU4bu3IGzhu4cgYuG7h25oIG5ow6JuIOG7nyBt4bupYyDEkeG7mSBuZ2hpw6ptIHRy4buNbmcgbmd1eSBr4buLY2ggKENyaXRpY2FsKSB0cm9uZyBt4bqrdSBsw6AgMC4zMy4NCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIG3hu5l0IHBow61hIGTGsOG7m2kgY2hvIHThu7cgbOG7hyBi4buHbmggbmjDom4gbeG7qWMgxJHhu5kgbmd1eSBr4buLY2ggKENyaXRpY2FsKSBjw7MgZ2nDoSB0cuG7iyB0csOqbiBsw6AgMC4zMTkuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIHLhurFuZyB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCB04bu3IGzhu4cgdGjhu7FjIHThur8gYuG7h25oIG5ow6JuIG5ndXkga+G7i2NoIGzhu5tuIGjGoW4gaG/hurdjIGLhurFuZyBnacOhIHRy4buLIGTGsOG7m2kgY+G7p2Ega2hv4bqjbmcgdGluIGPhuq15IHbDoCBjw7MgdGjhu4MgbMOqbiDEkeG6v24gMSAoMTAwJSkuDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KLSAqKkjigoA6KiogVOG7tyBs4buHIG5nxrDhu51pIMSRYW5nIGjDunQgdGh14buRYyBuaOG7jyBoxqFuIGhv4bq3YyBi4bqxbmcgMzMlIChwIOKJpCAwLjMzKQ0KDQotICoqSOKCgToqKiBU4bu3IGzhu4cgbmfGsOG7nWkgxJFhbmcgaMO6dCB0aHXhu5FjIGzhu5tuIGjGoW4gMzMlIChwID4gMC4zMykNCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlID0gMC4zNDg5LCBs4bubbiBoxqFuIG3hu6ljIMO9IG5naMSpYSDOsSA9IDAuMDUuIERvIMSRw7MsIGtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIHbhu5tpIGThu68gbGnhu4d1IGhp4buHbiB04bqhaSwgY2jDum5nIHRhIGtow7RuZyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBuZ8aw4budaSDEkWFuZyBow7p0IHRodeG7kWMgbOG7m24gaMahbiAzMyUuDQoNCiMgKipQaOG6p24gNC4gUEjDgk4gVMONQ0ggTeG7kEkgUVVBTiBI4buGIEdJ4buuQSBIQUkgQknhur5OIMSQ4buKTkggVMONTkgqKg0KDQojIyAqKjQuMS4gR2VuZGVyIHbDoCBIb3NwaXRhbGl6ZWQqKg0KDQojIyMgKio0LjEuMS4gQuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCAqKg0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbyBnaeG7r2EgR2VuZGVyIHbDoCBIb3NwaXRhbGl6ZWQNCmdlbmRlcl9ob3NwIDwtIHRhYmxlKGR0JEdlbmRlciwgZHQkSG9zcGl0YWxpemVkKQ0KDQojIFRow6ptIHThu5VuZyBow6BuZyB2w6AgdOG7lW5nIGPhu5l0DQpnZW5kZXJfaG9zcDEgPC0gYWRkbWFyZ2lucyhnZW5kZXJfaG9zcCkNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nDQpnZW5kZXJfaG9zcDENCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gKHRoZW8gaMOgbmcpDQpnZW5kZXJfaG9zcF9mcmVxIDwtIHByb3AudGFibGUodGFibGUoZHQkR2VuZGVyLCBkdCRIb3NwaXRhbGl6ZWQpLCBtYXJnaW4gPSAxKQ0KDQojIEzDoG0gdHLDsm4ga+G6v3QgcXXhuqMgY2hvIGThu4UgxJHhu41jDQpnZW5kZXJfaG9zcF9mcmVxIDwtIHJvdW5kKGdlbmRlcl9ob3NwX2ZyZXEsIDQpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZw0KZ2VuZGVyX2hvc3BfZnJlcQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCmBgYHtyfQ0KIyBDaHV54buDbiB0aMOgbmggZGF0YSBmcmFtZSDEkeG7gyB24bq9DQpnZW5kZXJfaG9zcF9kZiA8LSBhcy5kYXRhLmZyYW1lKGdlbmRlcl9ob3NwKQ0KY29sbmFtZXMoZ2VuZGVyX2hvc3BfZGYpIDwtIGMoIkdlbmRlciIsICJIb3NwaXRhbGl6ZWQiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IG5ow7NtDQpnZ3Bsb3QoZ2VuZGVyX2hvc3BfZGYsIGFlcyh4ID0gR2VuZGVyLCB5ID0gQ291bnQsIGZpbGwgPSBIb3NwaXRhbGl6ZWQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgMTcuIEJp4buDdSDEkeG7kyB04bqnbiBz4buRIGdp4buvYSBHaeG7m2kgdMOtbmggdsOgIE5o4bqtcCB2aeG7h24iLA0KICAgICAgIHggPSAiR2nhu5tpIHTDrW5oIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmciLA0KICAgICAgIGZpbGwgPSAiTmjhuq1wIHZp4buHbiIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikgKyAgIyBob+G6t2MgIlBhc3RlbDIiDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBE4buvIGxp4buHdSBjaG8gdGjhuqV5IGPDsyBz4buxIGtow6FjIGJp4buHdCBuaOG6uSBnaeG7r2EgbmFtIHbDoCBu4buvIHRyb25nIHThu7cgbOG7hyBuaOG6rXAgdmnhu4duLiBD4bulIHRo4buDLCA3MS40JSBi4buHbmggbmjDom4gbuG7ryBraMO0bmcgbmjhuq1wIHZp4buHbiwgc28gduG7m2kgNzAuMiUg4bufIG5hbSwgdHJvbmcga2hpIHThu7cgbOG7hyBuaOG6rXAgdmnhu4duIOG7nyBu4buvIGzDoCAyOC42JSwgdGjhuqVwIGjGoW4gbeG7mXQgY2jDunQgc28gduG7m2kgMjkuOCUg4bufIG5hbS4NCg0KLSBN4bq3YyBkw7kgc+G7sSBjaMOqbmggbOG7h2NoIGtow7RuZyBs4bubbiAoa2hv4bqjbmcgMS4yIMSRaeG7g20gcGjhuqduIHRyxINtKSwgbmjGsG5nIG7hur91IHjDqXQgdHLDqm4gdOG7lW5nIHRo4buDIDMuMDAwIGLhu4duaCBuaMOibiwgxJFp4buBdSBuw6B5IHbhuqtuIGPDsyDDvSBuZ2jEqWE6DQoNCiAgLSBUcm9uZyB04buVbmcgc+G7kSAxLjUyNyBu4buvLCBjw7MgNDM3IG5nxrDhu51pIG5o4bqtcCB2aeG7h24uDQoNCiAgLSBUcm9uZyAxLjQ3MyBuYW0sIGPDsyA0MzkgbmfGsOG7nWkgbmjhuq1wIHZp4buHbi4NCg0KLSBEw7kgc+G7kSBsxrDhu6NuZyBu4buvIG5oaeG7gXUgaMahbiBuYW0sIG5oxrBuZyBuYW0gbOG6oWkgY8OzIHPhu5EgY2Egbmjhuq1wIHZp4buHbiBjYW8gaMahbiwgY2hvIHRo4bqleSB04bu3IGzhu4cgbmjhuq1wIHZp4buHbiBj4bunYSBuYW0gZ2nhu5tpIHRo4buxYyBz4buxIG5o4buJbmggaMahbi4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBn4bujaSDDvSBy4bqxbmcgbmFtIGdp4bubaSBk4buFIGPDsyBuZ3V5IGPGoSB0aeG6v24gdHJp4buDbiBu4bq3bmcgaMahbiBraGkgbeG6r2MgYuG7h25oLCBob+G6t2MgY8OzIGto4bqjIG7Eg25nIGNhbyBoxqFuIGPhuqduIMSR4bq/biBjaMSDbSBzw7NjIHkgdOG6vyBu4buZaSB0csO6Lg0KDQojIyMgKio0LjEuMi4gS2nhu4NtIMSR4buLbmggVGjhu5FuZyBrw6oqKg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gKipI4oKAKio6IEdp4bubaSB0w61uaCB2w6Agdmnhu4djIG5o4bqtcCB2aeG7h24gbMOgIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wLg0KDQotICoqSOKCgSoqOiBHaeG7m2kgdMOtbmggdsOgIHZp4buHYyBuaOG6rXAgdmnhu4djIGPDsyBsacOqbiBxdWFuLg0KDQoqKlRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKioNCmBgYHtyfQ0KIyBUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZw0KY2hpX2dlbmRlcl9ob3NwIDwtIGNoaXNxLnRlc3QoZ2VuZGVyX2hvc3ApDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjDQpjaGlfZ2VuZGVyX2hvc3ANCmBgYA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaSBiw6xuaCBwaMawxqFuZzogWMKyID0gMC40NTM0OQ0KDQotIELhuq1jIHThu7EgZG8gKGRmKSA9IDENCg0KLSBwLXZhbHVlID0gMC41MDA3DQoNClbhu5tpIHAtdmFsdWUgPSAwLjUwMDcgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgcGjhu5UgYmnhur9uIM6xID0gMC4wNSwga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALiBOw7NpIGPDoWNoIGtow6FjLCBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCB0w6xuaCB0cuG6oW5nIG5o4bqtcCB2aeG7h24NCg0KIyMjICoqNC4xLjMgIEhp4buHdSB04bu3IGzhu4cgKFJpc2sgRGlmZmVyZW5jZSAtIFJEKSoqDQoNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbyBnaeG7r2EgR2VuZGVyIHbDoCBIb3NwaXRhbGl6ZWQNCmdlbmRlcl9ob3NwIDwtIHRhYmxlKGR0JEdlbmRlciwgZHQkSG9zcGl0YWxpemVkKQ0KDQojIFRow6ptIHThu5VuZyBow6BuZyB2w6AgdOG7lW5nIGPhu5l0DQpnZW5kZXJfaG9zcDEgPC0gYWRkbWFyZ2lucyhnZW5kZXJfaG9zcCkNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nDQpnZW5kZXJfaG9zcDENCmBgYA0KDQpcWw0KcF8xID0gUChcdGV4dHtIb3NwaXRhbGl6ZWR9ID0gXHRleHR7WWVzfSBcbWlkIFx0ZXh0e0dlbmRlcn0gPSBGKSBccXVhZCBcdGV4dHsoVOG7tyBs4buHIG7hu68gbmjhuq1wIHZp4buHbil9DQpcXQ0KDQpcWw0KcF8yID0gUChcdGV4dHtIb3NwaXRhbGl6ZWR9ID0gXHRleHR7WWVzfSBcbWlkIFx0ZXh0e0dlbmRlcn0gPSBNKSBccXVhZCBcdGV4dHsoVOG7tyBs4buHIG5hbSBuaOG6rXAgdmnhu4duKX0NClxdDQoNCkhp4buHdSBoYWkgdOG7tyBs4buHOg0KDQpcWw0KZCA9IHBfMSAtIHBfMg0KXF0NCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQpcWw0KSF8wOiBwXzEgLSBwXzIgPSAwIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgbuG7ryBuaOG6rXAgdmnhu4duIGLhurFuZyB04bu3IGzhu4cgbmFtIG5o4bqtcCB2aeG7h24pfQ0KXF0NCg0KXFsNCkhfMTogcF8xIC0gcF8yIDwgMCBccXVhZCBcdGV4dHsoVOG7tyBs4buHIG7hu68gbmjhuq1wIHZp4buHbiBuaOG7jyBoxqFuIHThu7cgbOG7hyBuYW0gbmjhuq1wIHZp4buHbil9DQpcXQ0KDQpgYGB7cn0NCmNvdW50cyA8LSBjKGdlbmRlcl9ob3NwWyJGZW1hbGUiLCAiWWVzIl0sIGdlbmRlcl9ob3NwWyJNYWxlIiwgIlllcyJdKQ0KdG90YWxzIDwtIGMoc3VtKGdlbmRlcl9ob3NwWyJGZW1hbGUiLCBdKSwgc3VtKGdlbmRlcl9ob3NwWyJNYWxlIiwgXSkpDQoNCiMgVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCB04bu3IGzhu4cNCnRlc3RfaG9zcCA8LXByb3AudGVzdChjb3VudHMsIHRvdGFscywgYWx0ZXJuYXRpdmUgPSAibGVzcyIsIGNvcnJlY3QgPSBGQUxTRSkNCnRlc3RfaG9zcA0KYGBgDQoNCi0gVOG7tyBs4buHIG7hu68gbmjhuq1wIHZp4buHbiAocOKCgSkgPSBgciByb3VuZCh0ZXN0X2hvc3AkZXN0aW1hdGVbMV0sIDQpYCDiiYggMjguNjIlDQoNCi0gVOG7tyBs4buHIG5hbSBuaOG6rXAgdmnhu4duIChw4oKCKSA9YHIgcm91bmQodGVzdF9ob3NwJGVzdGltYXRlWzJdLCA0KWAg4omIIDI5LjgwJQ0KDQotIHAtdmFsdWUgPSBgciByb3VuZCh0ZXN0X2hvc3AkcC52YWx1ZSwgNClgIOKJiCAwLjIzNzcNCg0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgzrE9MC4wNSwgcC12YWx1ZSA9IDAuMjM3NyA+IDAuMDUsIGtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB04bu3IGzhu4cgbmjhuq1wIHZp4buHbiBj4bunYSBu4buvIHbDoCBuYW0uDQoNCk3hurdjIGTDuSB04bu3IGzhu4cgbuG7ryBuaOG6rXAgdmnhu4duIGPDsyB0aOG6pXAgaMahbiBt4buZdCBjaMO6dCBzbyB24bubaSBuYW0gKDAuNTklKSwgbmjGsG5nIHPhu7EgY2jDqm5oIGzhu4djaCBuw6B5IGzDoCBuaOG7jyB2w6Aga2jDtG5nIMSR4bunIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgbuG7ryBjw7MgeHUgaMaw4bubbmcgbmjhuq1wIHZp4buHbiDDrXQgaMahbiBuYW0gZOG7sWEgdHLDqm4gbeG6q3UgZOG7ryBsaeG7h3UgbsOgeS4NCg0KIyMjICoqNC4xLjQuIFThu7cgc+G7kSBOZ3V5IGPGoSAoUmVsYXRpdmUgUmlzayAtIFJSKToqKg0KDQpgYGB7cn0NCnJpc2tyYXRpbyhnZW5kZXJfaG9zcCwgbWV0aG9kPSJ3YWxkIikNCmBgYA0KDQotIEThu68gbGnhu4d1IHThu5VuZyBo4bujcCBjaG8gdGjhuqV5IHRyb25nIHPhu5EgMy4wMDAgYuG7h25oIG5ow6JuLCBjw7MgMS41MjcgbmfGsOG7nWkgbMOgIG7hu68gduG7m2kgNDM3IG5nxrDhu51pIG5o4bqtcCB2aeG7h24sIHbDoCAxLjQ3MyBuZ8aw4budaSBsw6AgbmFtIHbhu5tpIDQzOSBuZ8aw4budaSBuaOG6rXAgdmnhu4duLiBLaGkgc28gc8OhbmggdOG7tyBs4buHIG5o4bqtcCB2aeG7h24gZ2nhu69hIGhhaSBuaMOzbSwgbuG7ryDEkcaw4bujYyBjaOG7jW4gbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgduG7m2kgdOG7tyBs4buHIHLhu6dpIHJvIGNodeG6qW4gbMOgIDEuDQoNCi0gS+G6v3QgcXXhuqMgdMOtbmggdG/DoW4gY2hvIHRo4bqleSB04bu3IHPhu5EgcuG7p2kgcm8gKFJpc2sgUmF0aW8pIGPhu6dhIG5hbSBzbyB24bubaSBu4buvIGzDoCAxLjA0MTQuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBuYW0gZ2nhu5tpIGPDsyBuZ3V5IGPGoSBuaOG6rXAgdmnhu4duIGNhbyBoxqFuIGtob+G6o25nIDQuMTQlIHNvIHbhu5tpIG7hu68gZ2nhu5tpIHRyb25nIG3huqt1IGThu68gbGnhu4d1IG7DoHkuDQoNCi0gVHV5IG5oacOqbiwga2hv4bqjbmcgdGluIGPhuq15IDk1JSBj4bunYSB04bu3IHPhu5EgcuG7p2kgcm8gY2hvIG5hbSBkYW8gxJHhu5luZyB04burIDAuOTMxNiDEkeG6v24gMS4xNjQyLiBWw6wga2hv4bqjbmcgbsOgeSBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAxLCDEkWnhu4F1IMSRw7MgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCB24buBIG5ndXkgY8ahIG5o4bqtcCB2aeG7h24gZ2nhu69hIG5hbSB2w6AgbuG7ryBraMO0bmcgxJHhuqF0IG3hu6ljIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gTsOzaSBjw6FjaCBraMOhYywga2jDtG5nIHRo4buDIGNo4bqvYyBjaOG6r24gcuG6sW5nIHPhu7EgY2jDqm5oIGzhu4djaCBxdWFuIHPDoXQgxJHGsOG7o2MgbMOgIHRo4buxYyBz4buxIGPDsyDDvSBuZ2jEqWEgaGF5IGNo4buJIGRvIGJp4bq/biDEkeG7mW5nIG5n4bqrdSBuaGnDqm4gdHJvbmcgbeG6q3UuDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KLSAqKkjigoA6KiogVOG7tyBs4buHIG5o4bqtcCB2aeG7h24gY+G7p2EgbmFtIHbDoCBu4buvIGzDoCBi4bqxbmcgbmhhdSwgdOG7qWMgbMOgIFwoIHBfe1x0ZXh0e0ZlbWFsZX19ID0gcF97XHRleHR7TWFsZX19IFwpLg0KDQotICoqSOKCgToqKiBU4bu3IGzhu4cgbmjhuq1wIHZp4buHbiBj4bunYSBuYW0gdsOgIG7hu68gbMOgIGtow6FjIG5oYXUsIHThu6ljIGzDoCBcKCBwX3tcdGV4dHtGZW1hbGV9fSBcbmVxIHBfe1x0ZXh0e01hbGV9fSBcKS4NCg0KVuG7m2kgcC12YWx1ZSBs4bubbiBoxqFuIG3hu6ljIMO9IG5naMSpYSAwLjA1IHThu6sgY8OhYyBwaMawxqFuZyBwaMOhcCBraeG7g20gxJHhu4tuaCAobWlkLXAgZXhhY3QgdGVzdCwgRmlzaGVyJ3MgZXhhY3QgdGVzdCwgdsOgIGNoaS1zcXVhcmVkIHRlc3QpLCBjaMO6bmcgdGEga2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgdOG7tyBs4buHIG5o4bqtcCB2aeG7h24gZ2nhu69hIG5hbSB2w6AgbuG7ryB0cm9uZyBt4bqrdSBk4buvIGxp4buHdSBuw6B5IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KIyMjICoqNC4xLjUuIFThu7cgc+G7kSBDaMOqbmggKE9kZHMgUmF0aW8gLSBPUik6KioNCg0KYGBge3J9DQpvcl9yZXN1bHQgPC0gb2Rkc3JhdGlvKGdlbmRlcl9ob3NwKQ0KcHJpbnQob3JfcmVzdWx0KQ0KYGBgDQoNClThu7cgc+G7kSBjaMOqbmggKE9kZHMgUmF0aW8gLSBPUikgZ2nhu69hIG5ow7NtIG5hbSB2w6AgbmjDs20gbuG7ryBsw6AgMS4wNTksIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAwLjkwNSDEkeG6v24gMS4yNDAuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBraOG6oyBuxINuZyBuaOG6rXAgdmnhu4duIGPhu6dhIG5hbSBjYW8gaMahbiBraG/huqNuZyA1LjklIHNvIHbhu5tpIG7hu68uIFR1eSBuaGnDqm4sIGtob+G6o25nIHRpbiBj4bqteSBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAxLCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdsOgIGPDsyB0aOG7gyBsw6AgZG8gYmnhur9uIMSR4buZbmcgbmfhuqt1IG5oacOqbiB0cm9uZyBk4buvIGxp4buHdS4NCg0KQsOqbiBj4bqhbmggxJHDsywga+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggduG7m2kgY8OhYyBwaMawxqFuZyBwaMOhcCBwaOG7lSBiaeG6v24gbmjGsCBtaWQtcCBleGFjdCB0ZXN0LCBGaXNoZXLigJlzIGV4YWN0IHRlc3QgdsOgIGNoaS1zcXVhcmVkIHRlc3QgxJHhu4F1IGNobyBnacOhIHRy4buLIHAtdmFsdWUgbOG6p24gbMaw4bujdCBsw6AgMC40NzU4LCAwLjQ5NDggdsOgIDAuNDc1NS4gQ8OhYyBnacOhIHRy4buLIG7DoHkgxJHhu4F1IGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIM6xID0gMC4wNSwgY2hvIHRo4bqleSBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZywgdOG7qWMgbMOgIHThu7cgbOG7hyBuaOG6rXAgdmnhu4duIGPhu6dhIG5hbSB2w6AgbuG7ryBraMO0bmcga2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDLg0KDQojIyAqKjQuMi4gUmVjb3ZlcmVkIHbDoCBWYWNjaW5hdGlvbl9TdGF0dXMqKg0KDQojIyMgKio0LjIuMS4gQuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCAqKg0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KIyBHw6FuIG5ow6NuIHLDtSByw6BuZyBjaG8gY8OhYyBiaeG6v24NCmR0JFJlY292ZXJlZCA8LSBmYWN0b3IoZHQkUmVjb3ZlcmVkLA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2jDtG5nIGjhu5NpIHBo4bulYyIsICJI4buTaSBwaOG7pWMiKSkNCg0KZHQkVmFjY2luYXRpb25fU3RhdHVzIDwtIGZhY3RvcihkdCRWYWNjaW5hdGlvbl9TdGF0dXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5vIiwgIlllcyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDaMawYSB0acOqbSIsICLEkMOjIHRpw6ptIikpDQoNCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2jDqW8gZ2nhu69hIFJlY292ZXJlZCB2w6AgVmFjY2luYXRpb25fU3RhdHVzDQpyZV92YWMgPC0gdGFibGUoZHQkUmVjb3ZlcmVkLCBkdCRWYWNjaW5hdGlvbl9TdGF0dXMpDQoNCiMgVGjDqm0gdOG7lW5nIGjDoG5nIHbDoCB04buVbmcgY+G7mXQNCnJlX3ZhYzEgPC0gYWRkbWFyZ2lucyhyZV92YWMpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyB24bubaSBuaMOjbiByw7UgcsOgbmcNCnJlX3ZhYzENCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgdGhlbyBow6BuZyAodGhlbyB04burbmcgdHLhuqFuZyB0aMOhaSBo4buTaSBwaOG7pWMpDQpyZV92YWNfcHJvcCA8LSBwcm9wLnRhYmxlKHJlX3ZhYywgbWFyZ2luID0gMSkNCg0KIyBMw6BtIHRyw7JuIMSR4buDIGhp4buDbiB0aOG7iyDEkeG6uXAgaMahbiAodsOtIGThu6U6IDQgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4pDQpyZV92YWNfcHJvcF9yb3VuZGVkIDwtIHJvdW5kKHJlX3ZhY19wcm9wLCA0KQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgdOG6p24gc3XhuqV0DQpyZV92YWNfcHJvcF9yb3VuZGVkDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KYGBge3J9DQojIENodXnhu4NuIGLhuqNuZyBzYW5nIGThuqFuZyBkYXRhIGZyYW1lDQpyZV92YWNfZGYgPC0gYXMuZGF0YS5mcmFtZShyZV92YWMpDQoNCiMgxJDhu5VpIHTDqm4gY+G7mXQgY2hvIHLDtSByw6BuZw0KY29sbmFtZXMocmVfdmFjX2RmKSA8LSBjKCJSZWNvdmVyZWQiLCAiVmFjY2luYXRpb25fU3RhdHVzIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCBuaMOzbQ0KZ2dwbG90KHJlX3ZhY19kZiwgYWVzKHggPSBWYWNjaW5hdGlvbl9TdGF0dXMsIHkgPSBDb3VudCwgZmlsbCA9IFJlY292ZXJlZCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyAxOC4gU+G7kSBsxrDhu6NuZyBo4buTaSBwaOG7pWMgdGhlbyB0w6xuaCB0cuG6oW5nIHRpw6ptIHbhuq9jIHhpbiIsDQogICAgeCA9ICJUw6xuaCB0cuG6oW5nIHRpw6ptIHbhuq9jIHhpbiIsDQogICAgeSA9ICJT4buRIGzGsOG7o25nIGLhu4duaCBuaMOibiIsDQogICAgZmlsbCA9ICJUcuG6oW5nIHRow6FpIGjhu5NpIHBo4bulYyINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMSIpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buRIHRy4bqhbmcgdGjDoWkgaOG7k2kgcGjhu6VjIGdp4buvYSBoYWkgbmjDs20gYuG7h25oIG5ow6JuIHRoZW8gdMOsbmggdHLhuqFuZyB0acOqbSB24bqvYyB4aW4gbMOgIHTGsMahbmcgxJHhu5FpIMSR4buTbmcgxJHhu4F1LCB0dXkgbmhpw6puIHbhuqtuIGPDsyBt4buZdCBz4buRIGtow6FjIGJp4buHdCBuaOG6uS4gVHJvbmcgbmjDs20gY2jGsGEgdGnDqm0gduG6r2MgeGluLCB04bu3IGzhu4cgaOG7k2kgcGjhu6VjIGzDoCBraG/huqNuZyA1Mi4wNiUsIHRyb25nIGtoaSA0Ny45NCUga2jDtG5nIGjhu5NpIHBo4bulYy4gTmfGsOG7o2MgbOG6oWksIHRyb25nIG5ow7NtIMSRw6MgdGnDqm0gduG6r2MgeGluLCB04bu3IGzhu4cga2jDtG5nIGjhu5NpIHBo4bulYyBs4bqhaSBuaOG7iW5oIGjGoW4gbeG7mXQgY2jDunQsIOG7nyBt4bupYyA1MC4yMCUsIHNvIHbhu5tpIDQ5LjgwJSBo4buTaSBwaOG7pWMuIE3hurdjIGTDuSBz4buxIGNow6puaCBs4buHY2ggbMOgIGtow7RuZyBs4bubbiwgxJFp4buBdSBuw6B5IGfhu6NpIMO9IHLhurFuZyBuaMOzbSBjaMawYSB0acOqbSBjw7MgdOG7tyBs4buHIGjhu5NpIHBo4bulYyBjYW8gaMahbiBt4buZdCBjaMO6dCBzbyB24bubaSBuaMOzbSDEkcOjIHRpw6ptLiANCg0KIyMjICoqNC4yLjIuIEtp4buDbSDEkeG7i25oIFRo4buRbmcga8OqKioNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotICoqSOKCgCoqOiBUw6xuaCB0cuG6oW5nIHBo4bulYyBo4buTaSB2w6AgdMOsbmggdHLhuqFuZyB0acOqbSB2YWNjaW4gbMOgIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wLg0KDQotICoqSOKCgSoqOiBUw6xuaCB0cuG6oW5nIHBo4bulYyBo4buTaSB2w6AgdMOsbmggdHLhuqFuZyB0acOqbSB2YWNjaW4gY8OzIGxpw6puIHF1YW4uDQpgYGB7cn0NCiMgVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcNCmNoaV9yZV92YWMgPC0gY2hpc3EudGVzdChyZV92YWMpDQpwcmludChjaGlfcmVfdmFjKQ0KYGBgDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpIGLDrG5oIHBoxrDGoW5nOiBYwrIgPSAxLjQzOTQNCg0KLSBC4bqtYyB04buxIGRvIChkZikgPSAxDQoNCi0gcC12YWx1ZSA9ICAwLjIzMDINCg0KVuG7m2kgcC12YWx1ZSA9ICAwLjIzMDIgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgcGjhu5UgYmnhur9uIM6xID0gMC4wNSwga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AsIHRyb25nIG3huqt1IGThu68gbGnhu4d1IGhp4buHbiB04bqhaSwga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB04bu3IGzhu4cgaOG7k2kgcGjhu6VjIGPhu6dhIG5ow7NtIMSRw6MgdGnDqm0gduG6r2MgeGluIHbDoCBuaMOzbSBjaMawYSB0acOqbS4gDQoNCiMjIyAqKjQuMi4zICBIaeG7h3UgdOG7tyBs4buHIChSaXNrIERpZmZlcmVuY2UgLSBSRCkqKg0KDQpgYGB7cn0NCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2jDqW8gZ2nhu69hIFJlY292ZXJlZCB2w6AgVmFjY2luYXRpb25fU3RhdHVzDQpyZV92YWMgPC0gdGFibGUoZHQkUmVjb3ZlcmVkLCBkdCRWYWNjaW5hdGlvbl9TdGF0dXMpDQoNCiMgVGjDqm0gdOG7lW5nIGjDoG5nIHbDoCB04buVbmcgY+G7mXQNCnJlX3ZhYzEgPC0gYWRkbWFyZ2lucyhyZV92YWMpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyB24bubaSBuaMOjbiByw7UgcsOgbmcNCnJlX3ZhYzENCmBgYA0KDQpcWw0KcF8xID0gUChcdGV4dHtSZWNvdmVyZWR9ID0gXHRleHR7WWVzfSBcbWlkIFx0ZXh0e1ZhY2NpbmF0aW9uX1N0YXR1c30gPSBcdGV4dHtDaMawYSB0acOqbX0pIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgaOG7k2kgcGjhu6VjIOG7nyBuaMOzbSBjaMawYSB0acOqbSl9DQpcXQ0KDQpcWw0KcF8yID0gUChcdGV4dHtSZWNvdmVyZWR9ID0gXHRleHR7WWVzfSBcbWlkIFx0ZXh0e1ZhY2NpbmF0aW9uX1N0YXR1c30gPSBcdGV4dHvEkMOjIHRpw6ptfSkgXHF1YWQgXHRleHR7KFThu7cgbOG7hyBo4buTaSBwaOG7pWMg4bufIG5ow7NtIMSRw6MgdGnDqm0pfQ0KXF0NCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQpcWw0KSF8wOiBwXzEgLSBwXzIgPSAwIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgaOG7k2kgcGjhu6VjIOG7nyBuaMOzbSBjaMawYSB0acOqbSBi4bqxbmcgdOG7tyBs4buHIGjhu5NpIHBo4bulYyDhu58gbmjDs20gxJHDoyB0acOqbSl9DQpcXQ0KDQpcWw0KSF8xOiBwXzEgLSBwXzIgPCAwIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgaOG7k2kgcGjhu6VjIOG7nyBuaMOzbSBjaMawYSB0acOqbSBuaOG7jyBoxqFuIHThu7cgbOG7hyBo4buTaSBwaOG7pWMg4bufIG5ow7NtIMSRw6MgdGnDqm0pfQ0KXF0NCg0KYGBge3J9DQojIFPhu5EgbmfGsOG7nWkgaOG7k2kgcGjhu6VjIHRyb25nIHThu6tuZyBuaMOzbSB0acOqbSBjaOG7p25nDQpjb3VudHMgPC0gYyhyZV92YWNbIkjhu5NpIHBo4bulYyIsICJDaMawYSB0acOqbSJdLCByZV92YWNbIkjhu5NpIHBo4bulYyIsICLEkMOjIHRpw6ptIl0pDQoNCiMgVOG7lW5nIHPhu5EgbmfGsOG7nWkgdHJvbmcgdOG7q25nIG5ow7NtIHRpw6ptIGNo4bunbmcNCnRvdGFscyA8LSBjKHN1bShyZV92YWNbLCAiQ2jGsGEgdGnDqm0iXSksIHN1bShyZV92YWNbLCAixJDDoyB0acOqbSJdKSkNCg0KIyBLaeG7g20gxJHhu4tuaCB04buJIGzhu4cgbeG7mXQgcGjDrWE6IHAxIDwgcDINCnRlc3RfcmVjb3ZlcnlfbGVzcyA8LSBwcm9wLnRlc3QoY291bnRzLCB0b3RhbHMsIGFsdGVybmF0aXZlID0gImxlc3MiLCBjb3JyZWN0ID0gRkFMU0UpDQp0ZXN0X3JlY292ZXJ5X2xlc3MNCmBgYA0KDQotIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIHThu7cgbOG7hyBoYWkgbeG6q3UgY2hvIHRo4bqleToNCg0KICAtIFThu7cgbOG7hyBo4buTaSBwaOG7pWMg4bufIG5ow7NtIGNoxrBhIHRpw6ptIChwcm9wIDEpIGzDoCBraG/huqNuZyA1MS4zNyUNCg0KICAtIFThu7cgbOG7hyBo4buTaSBwaOG7pWMg4bufIG5ow7NtIMSRw6MgdGnDqm0gKHByb3AgMikgbMOgIGtob+G6o25nIDQ5LjEyJQ0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpIGLDrG5oIHBoxrDGoW5nIGzDoCAxLjUyODQgduG7m2kgYuG6rWMgdOG7sSBkbyAxIHbDoCBwLXZhbHVlID0gMC44OTE4Lg0KDQotIFbDrCBwLXZhbHVlIGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUsIGNow7puZyB0YSBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IHLhurFuZyB04bu3IGzhu4cgaOG7k2kgcGjhu6VjIOG7nyBuaMOzbSBjaMawYSB0acOqbSB2w6AgbmjDs20gxJHDoyB0acOqbSBsw6AgYuG6sW5nIG5oYXUuDQoNCi0gTmdvw6BpIHJhLCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBoaeG7h3UgaGFpIHThu7cgbOG7hyBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAwICh04burIC0xIMSR4bq/biAwLjA1MjYpLCBjxaluZyBj4bunbmcgY+G7kSBuaOG6rW4gxJHhu4tuaCBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGhhaSB04bu3IGzhu4cga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCi0gVMOzbSBs4bqhaSwgdGhlbyBk4buvIGxp4buHdSBuw6B5LCB04bu3IGzhu4cgaOG7k2kgcGjhu6VjIGPhu6dhIG5ow7NtIGNoxrBhIHRpw6ptIHbDoCBuaMOzbSDEkcOjIHRpw6ptIGtow7RuZyBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgdsOgIGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgY2hvIHRo4bqleSBuaMOzbSBjaMawYSB0acOqbSBjw7MgdOG7tyBs4buHIGjhu5NpIHBo4bulYyB0aOG6pXAgaMahbiBuaMOzbSDEkcOjIHRpw6ptLg0KDQojIyMgKio0LjIuNC4gVOG7tyBz4buRIE5ndXkgY8ahIChSZWxhdGl2ZSBSaXNrIC0gUlIpOioqDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKHJlX3ZhYywgbWV0aG9kPSJ3YWxkIikNCmBgYA0KDQpLaMO0bmcgaOG7k2kgcGjhu6VjID0gbmjDs20gdGhhbSBjaGnhur91IChSUiA9IDEpDQoNCkjhu5NpIHBo4bulYyAgICAgICA9IG5ow7NtIHNvIHPDoW5oDQoNCg0KUmlzayBSYXRpbyAoUlIpIMaw4bubYyBsxrDhu6NuZyBjaG8gbmjDs20gaOG7k2kgcGjhu6VjIGzDoCAwLjk1NTAsIHThu6ljIGzDoDoNCg0KLSBYw6FjIHN14bqldCBo4buTaSBwaOG7pWMgY+G7p2EgbmfGsOG7nWkgxJHDoyB0acOqbSB0aOG6pXAgaMahbiBraG/huqNuZyA0LjUlIHNvIHbhu5tpIG5nxrDhu51pIGNoxrBhIHRpw6ptLg0KDQpUdXkgbmhpw6puLCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBSaXNrIFJhdGlvIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMC44ODc5IMSR4bq/biAxLjAyNzM6DQoNCi0gVsOsIGtob+G6o25nIG7DoHkgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMSwgbsOqbiB0YSBraMO0bmcgdGjhu4Mga2jhurNuZyDEkeG7i25oIGPDsyBz4buxIGtow6FjIGJp4buHdCB0aOG6rXQgc+G7sSB24buBIGto4bqjIG7Eg25nIGjhu5NpIHBo4bulYyBnaeG7r2EgaGFpIG5ow7NtLiBOw7NpIGPDoWNoIGtow6FjLCBz4buxIGtow6FjIGJp4buHdCBxdWFuIHPDoXQgxJHGsOG7o2MgY8OzIHRo4buDIGzDoCBkbyBuZ+G6q3Ugbmhpw6puIHRyb25nIG3huqt1IGto4bqjbyBzw6F0Lg0KDQpTYXUga2hpIHRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogxJHhu4Mgc28gc8OhbmggKip04bu3IGzhu4cgaOG7k2kgcGjhu6VjKiogZ2nhu69hIGhhaSBuaMOzbSBi4buHbmggbmjDom4gKCoqQ2jGsGEgdGnDqm0qKiB2w6AgKirEkMOjIHRpw6ptKiopLCB0YSB0aHUgxJHGsOG7o2MgY8OhYyBr4bq/dCBxdeG6oyBwLXZhbHVlIG5oxrAgc2F1Og0KDQotICoqTWlkLXAgZXhhY3QgdGVzdCoqOiAwLjIxNjcgIA0KLSAqKkZpc2hlcuKAmXMgZXhhY3QgdGVzdCoqOiAwLjIyODEgIA0KLSAqKkNoaS1zcXVhcmVkIHRlc3QqKjogMC4yMTY0ICANCg0KVOG6pXQgY+G6oyBjw6FjIGdpw6EgdHLhu4sgcC12YWx1ZSDEkeG7gXUgKips4bubbiBoxqFuIG3hu6ljIMO9IG5naMSpYSBwaOG7lSBiaeG6v24qKiBsw6AgJFxcYWxwaGEgPSAwLjA1JC4gxJBp4buBdSBuw6B5IMSR4buTbmcgbmdoxKlhIHbhu5tpIHZp4buHYyAqKmtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQqKi4NCg0KTsOzaSBjw6FjaCBraMOhYywgKipraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogduG7gSB04bu3IGzhu4cgaOG7k2kgcGjhu6VjIGdp4buvYSBuaMOzbSBjaMawYSB0acOqbSB2w6AgbmjDs20gxJHDoyB0acOqbSB24bqvYyB4aW4qKi4gU+G7sSBjaMOqbmggbOG7h2NoIG5o4buPIHF1YW4gc8OhdCDEkcaw4bujYyB0cm9uZyBt4bqrdSBjw7MgdGjhu4MgbMOgIGRvIGJp4bq/biB0aGnDqm4gbmfhuqt1IG5oacOqbiB2w6AgKipraMO0bmcgcGjhuqNuIMOhbmggc+G7sSBraMOhYyBiaeG7h3QgdGjhu7FjIHPhu7EgdHJvbmcgdOG7lW5nIHRo4buDKiouDQoNCiMjIyAqKjQuMi41LiBU4bu3IHPhu5EgQ2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpOioqDQoNCmBgYHtyfQ0Kb3JfcmVzdWx0MSA8LSBvZGRzcmF0aW8ocmVfdmFjKQ0KcHJpbnQob3JfcmVzdWx0MSkNCmBgYA0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IFThu7cgc+G7kSBjaMOqbmggKE9kZHMgUmF0aW8pIMSR4buRaSB24bubaSBraOG6oyBuxINuZyBo4buTaSBwaOG7pWMgbMOgOg0KDQotIE9SID0gMC45MTQsIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgbMOgIFswLjc5MjsgMS4wNTRdLg0KDQrEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6Aga2jhuqMgbsSDbmcgaOG7k2kgcGjhu6VjIOG7nyBuaMOzbSDEkcOjIHRpw6ptIHRo4bqlcCBoxqFuIGtob+G6o25nIDguNiUgc28gduG7m2kgbmjDs20gY2jGsGEgdGnDqm0gKHbDrCAxIOKIkiAwLjkxNCA9IDAuMDg2KSwgdHV5IG5oacOqbiBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGJhbyBn4buTbSBnacOhIHRy4buLIDEsIHThu6ljIGzDoCBz4buxIGtow6FjIGJp4buHdCBjw7MgdGjhu4Mga2jDtG5nIHThu5NuIHThuqFpIHRyw6puIHRvw6BuIHRo4buDIGTDom4gc+G7kS4NCg0KS+G6v3QgcXXhuqMgY+G7p2EgYmEgcGjGsMahbmcgcGjDoXAga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogxJHhu4F1IGNobyBnacOhIHRy4buLIHAtdmFsdWUgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgdGjDtG5nIHRoxrDhu51uZyDOsSA9IDAuMDUsIGPhu6UgdGjhu4M6DQoNCi0gTWlkLXAgZXhhY3QgdGVzdDogcC12YWx1ZSA9IDAuMjE2Nw0KDQotIEZpc2hlcuKAmXMgZXhhY3QgdGVzdDogcC12YWx1ZSA9IDAuMjI4MQ0KDQotIENoaS1zcXVhcmVkIHRlc3Q6IHAtdmFsdWUgPSAwLjIxNjQNCg0KQ8OhYyBwLXZhbHVlIG7DoHkgxJHhu4F1IHbGsOG7o3QgeGEgbmfGsOG7oW5nIDAuMDUsIMSR4buTbmcgbmdoxKlhIHbhu5tpIHZp4buHYyBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiBOw7NpIGPDoWNoIGtow6FjLCBk4buvIGxp4buHdSBoaeG7h24gdOG6oWkga2jDtG5nIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiB24buBIHThu7cgc+G7kSBvZGRzIGjhu5NpIHBo4bulYyBnaeG7r2EgaGFpIG5ow7NtIGLhu4duaCBuaMOibiDEkcOjIHRpw6ptIHbDoCBjaMawYSB0acOqbSB24bqvYyB4aW4uDQoNCiMjICoqNC4zLiBSZWluZmVjdGlvbiB2w6AgVmFjY2luYXRpb25fU3RhdHVzKioNCg0KIyMjICoqNC4zLjEuIELhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgKioNCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCmR0JFJlaW5mZWN0aW9uIDwtIGZhY3RvcihkdCRSZWluZmVjdGlvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm8iLCAiWWVzIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2jDtG5nIHTDoWkgbmhp4buFbSIsICJUw6FpIG5oaeG7hW0iKSkNCg0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbw0KcmVpbl92YWMgPC0gdGFibGUoZHQkUmVpbmZlY3Rpb24sIGR0JFZhY2NpbmF0aW9uX1N0YXR1cykNCg0KIyBUaMOqbSB04buVbmcgaMOgbmcgdsOgIGPhu5l0DQpyZWluX3ZhYzEgPC0gYWRkbWFyZ2lucyhyZWluX3ZhYykNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nDQpyZWluX3ZhYzENCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgdGhlbyBow6BuZyAocm93IHBlcmNlbnRhZ2VzKQ0KcmVpbl92YWNfcHJvcCA8LSBwcm9wLnRhYmxlKHJlaW5fdmFjLCBtYXJnaW4gPSAxKQ0KDQojIEzDoG0gdHLDsm4gNCBjaOG7ryBz4buRIHRo4bqtcCBwaMOibg0KcmVpbl92YWNfcHJvcCA8LSByb3VuZChyZWluX3ZhY19wcm9wLCA0KQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgdOG6p24gc3XhuqV0DQpyZWluX3ZhY19wcm9wDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KYGBge3J9DQojIENodXnhu4NuIHRow6BuaCBkYXRhIGZyYW1lDQpyZWluX3ZhY19kZiA8LSBhcy5kYXRhLmZyYW1lKHJlaW5fdmFjKQ0KDQojIMSQ4buVaSB0w6puIGPhu5l0IGNobyBk4buFIGhp4buDdQ0KY29sbmFtZXMocmVpbl92YWNfZGYpIDwtIGMoIlJlaW5mZWN0aW9uIiwgIlZhY2NpbmF0aW9uX1N0YXR1cyIsICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MNCmdncGxvdChyZWluX3ZhY19kZiwgYWVzKHggPSBWYWNjaW5hdGlvbl9TdGF0dXMsIHkgPSBDb3VudCwgZmlsbCA9IFJlaW5mZWN0aW9uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIDE5LiBUw6xuaCB0cuG6oW5nIHTDoWkgbmhp4buFbSB0aGVvIHTDrG5oIHRy4bqhbmcgdGnDqm0gduG6r2MgeGluIiwNCiAgICB4ID0gIlTDrG5oIHRy4bqhbmcgdGnDqm0gduG6r2MgeGluIiwNCiAgICB5ID0gIlPhu5EgbMaw4bujbmcgYuG7h25oIG5ow6JuIiwNCiAgICBmaWxsID0gIlTDrG5oIHRy4bqhbmcgdMOhaSBuaGnhu4VtIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KROG7sWEgdHLDqm4gYuG6o25nIHThuqduIHN14bqldCwgdGEgdGjhuqV5IHLhurFuZyB0cm9uZyBuaMOzbSBraMO0bmcgdMOhaSBuaGnhu4VtLCB04bu3IGzhu4cgYuG7h25oIG5ow6JuIGNoxrBhIHRpw6ptIHbhuq9jIHhpbiBjaGnhur9tIGtob+G6o25nIDUxLjQ5JSwgY2FvIGjGoW4gc28gduG7m2kgbmjDs20gxJHDoyB0acOqbSBsw6AgNDguNTElLCB24bubaSBt4bupYyBjaMOqbmggbOG7h2NoIGzDoCAyLjk4JS4gTmfGsOG7o2MgbOG6oWksIOG7nyBuaMOzbSB0w6FpIG5oaeG7hW0sIHThu7cgbOG7hyBi4buHbmggbmjDom4gxJHDoyB0acOqbSB24bqvYyB4aW4gbOG6oWkgY2FvIGjGoW4sIMSR4bqhdCA1NC4zOSUsIHNvIHbhu5tpIDQ1LjYxJSDhu58gbmjDs20gY2jGsGEgdGnDqm0sIHThu6ljIGzDoCBjaMOqbmggbOG7h2NoIGtob+G6o25nIDguNzglLg0KDQpOaOG7r25nIGNvbiBz4buRIG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgdHJvbmcgbeG6q3UgZOG7ryBsaeG7h3UgbsOgeSwgdOG7tyBs4buHIHTDoWkgbmhp4buFbSDhu58gbmjDs20gxJHDoyB0acOqbSBjw7MgeHUgaMaw4bubbmcgY2FvIGjGoW4gc28gduG7m2kgbmjDs20gY2jGsGEgdGnDqm0uIA0KDQojIyMgKio0LjMuMi4gS2nhu4NtIMSR4buLbmggVGjhu5FuZyBrw6oqKg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gKipI4oKAKio6IFTDrG5oIHRy4bqhbmcgdMOhaSBuaGnhu4VtIHbDoCB0w6xuaCB0cuG6oW5nIHRpw6ptIHZhY2NpbiBsw6AgaGFpIGJp4bq/biDEkeG7mWMgbOG6rXAuDQoNCi0gKipI4oKBKio6IFTDrG5oIHRy4bqhbmcgdMOhaSBuaGnhu4VtIHbDoCB0w6xuaCB0cuG6oW5nIHRpw6ptIHZhY2NpbiBjw7MgbGnDqm4gcXVhbi4NCg0KYGBge3J9DQojIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nDQpjaGlfcmVpbl92YWMgPC0gY2hpc3EudGVzdChyZWluX3ZhYykNCnByaW50KGNoaV9yZWluX3ZhYykNCmBgYA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaSBiw6xuaCBwaMawxqFuZzogWMKyID0gMy4zMzQyDQoNCi0gQuG6rWMgdOG7sSBkbyAoZGYpID0gMQ0KDQotIHAtdmFsdWUgPSAgMC4wNjc4Ng0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgdGjGsOG7nW5nIGTDuW5nIGzDoCDOsSA9IDAuMDUsIHRhIHRo4bqleSBwLXZhbHVlID0gMC4wNjc4NiA+IDAuMDUsIHThu6ljIGzDoCBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAuIE7Ds2kgY8OhY2gga2jDoWMsIGNoxrBhIHRo4buDIGvhur90IGx14bqtbiBy4bqxbmcgdMOsbmggdHLhuqFuZyB0w6FpIG5oaeG7hW0gdsOgIHTDrG5oIHRy4bqhbmcgdGnDqm0gduG6r2MgeGluIGPDsyBt4buRaSBsacOqbiBo4buHIHLDtSByw6BuZyB0cm9uZyBt4bqrdSBk4buvIGxp4buHdSBuw6B5Lg0KDQojIyMgKio0LjMuMyAgSGnhu4d1IHThu7cgbOG7hyAoUmlzayBEaWZmZXJlbmNlIC0gUkQpKioNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbw0KcmVpbl92YWMgPC0gdGFibGUoZHQkUmVpbmZlY3Rpb24sIGR0JFZhY2NpbmF0aW9uX1N0YXR1cykNCg0KIyBUaMOqbSB04buVbmcgaMOgbmcgdsOgIGPhu5l0DQpyZWluX3ZhYzEgPC0gYWRkbWFyZ2lucyhyZWluX3ZhYykNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nDQpyZWluX3ZhYzENCmBgYA0KDQpcWw0KcF8xID0gUChcdGV4dHtSZWluZmVjdGlvbn0gPSBcdGV4dHtZZXN9IFxtaWQgXHRleHR7VmFjY2luYXRpb25fU3RhdHVzfSA9IFx0ZXh0e0NoxrBhIHRpw6ptfSkgXHF1YWQgXHRleHR7KFThu7cgbOG7hyB0w6FpIG5oaeG7hW0g4bufIG5ow7NtIGNoxrBhIHRpw6ptKX0NClxdDQoNClxbDQpwXzIgPSBQKFx0ZXh0e1JlaW5mZWN0aW9ufSA9IFx0ZXh0e1llc30gXG1pZCBcdGV4dHtWYWNjaW5hdGlvbl9TdGF0dXN9ID0gXHRleHR7xJDDoyB0acOqbX0pIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgdMOhaSBuaGnhu4VtIOG7nyBuaMOzbSDEkcOjIHRpw6ptKX0NClxdDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KXFsNCkhfMDogcF8xIC0gcF8yID0gMCBccXVhZCBcdGV4dHsoVOG7tyBs4buHIHTDoWkgbmhp4buFbSDhu58gbmjDs20gY2jGsGEgdGnDqm0gYuG6sW5nIHThu7cgbOG7hyB0w6FpIG5oaeG7hW0g4bufIG5ow7NtIMSRw6MgdGnDqm0pfQ0KXF0NCg0KXFsNCkhfMTogcF8xIC0gcF8yIDwgMCBccXVhZCBcdGV4dHsoVOG7tyBs4buHIHTDoWkgbmhp4buFbSDhu58gbmjDs20gY2jGsGEgdGnDqm0gbmjhu48gaMahbiB04bu3IGzhu4cgdMOhaSBuaGnhu4VtIOG7nyBuaMOzbSDEkcOjIHRpw6ptKX0NClxdDQoNCmBgYHtyfQ0KIyBT4buRIG5nxrDhu51pIHTDoWkgbmhp4buFbSB0cm9uZyB04burbmcgbmjDs20gdGnDqm0gY2jhu6duZw0KY291bnRzX3JlaW5mZWN0aW9uIDwtIGMocmVpbl92YWNbIlTDoWkgbmhp4buFbSIsICJDaMawYSB0acOqbSJdLCByZWluX3ZhY1siVMOhaSBuaGnhu4VtIiwgIsSQw6MgdGnDqm0iXSkNCg0KIyBU4buVbmcgc+G7kSBuZ8aw4budaSB0cm9uZyB04burbmcgbmjDs20gdGnDqm0gY2jhu6duZw0KdG90YWxzX3JlaW5mZWN0aW9uIDwtIGMoc3VtKHJlaW5fdmFjWywgIkNoxrBhIHRpw6ptIl0pLCBzdW0ocmVpbl92YWNbLCAixJDDoyB0acOqbSJdKSkNCg0KIyBLaeG7g20gxJHhu4tuaCB04buJIGzhu4cgbeG7mXQgcGjDrWE6IHAxIDwgcDIgKHThu7cgbOG7hyB0w6FpIG5oaeG7hW0g4bufIG5ow7NtIGNoxrBhIHRpw6ptIG5o4buPIGjGoW4gbmjDs20gxJHDoyB0acOqbSkNCnRlc3RfcmVpbmZlY3Rpb25fbGVzcyA8LSBwcm9wLnRlc3QoY291bnRzX3JlaW5mZWN0aW9uLCB0b3RhbHNfcmVpbmZlY3Rpb24sIGFsdGVybmF0aXZlID0gImxlc3MiLCBjb3JyZWN0ID0gRkFMU0UpDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjIGtp4buDbSDEkeG7i25oDQp0ZXN0X3JlaW5mZWN0aW9uX2xlc3MNCmBgYA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5Og0KDQotIFThu7cgbOG7hyB0w6FpIG5oaeG7hW0g4bufIG5ow7NtIGNoxrBhIHRpw6ptIChwcm9wIDEpIGzDoCBraG/huqNuZyA4LjUxJS4NCg0KLSBU4bu3IGzhu4cgdMOhaSBuaGnhu4VtIOG7nyBuaMOzbSDEkcOjIHRpw6ptIChwcm9wIDIpIGzDoCBraG/huqNuZyAxMC41MyUuDQoNClbhu5tpIHAtdmFsdWUgPSAwLjAyOTUsIG5o4buPIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUsIGNow7puZyB0YSBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBU4bu3IGzhu4cgdMOhaSBuaGnhu4VtIOG7nyBuaMOzbSBjaMawYSB0acOqbSBuaOG7jyBoxqFuIHThu7cgbOG7hyB0w6FpIG5oaeG7hW0g4bufIG5ow7NtIMSRw6MgdGnDqm0uDQoNCiMjIyAqKjQuMy40LiBU4bu3IHPhu5EgTmd1eSBjxqEgKFJlbGF0aXZlIFJpc2sgLSBSUik6KioNCmBgYHtyfQ0Kcmlza3JhdGlvKHJlaW5fdmFjLCBtZXRob2Q9IndhbGQiKQ0KYGBgDQoNCsav4bubYyBsxrDhu6NuZyBSaXNrIFJhdGlvIChSUikgY2hvIG5ow7NtIHTDoWkgbmhp4buFbSBsw6AgMS4xMjEgduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JSB04burIDEuMDAxIMSR4bq/biAxLjI1Ni4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIG5ow7NtIMSRw6MgdGnDqm0gY8OzIG5ndXkgY8ahIHTDoWkgbmhp4buFbSBjYW8gaMahbiBraG/huqNuZyAxMi4xJSBzbyB24bubaSBuaMOzbSBjaMawYSB0acOqbS4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBuw6B5IGtow7RuZyBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAxLCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgY8OzIHRo4buDIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNClxbDQpIXzA6IHBfMSA9IHBfMiBccXVhZCBcdGV4dHsoVOG7tyBs4buHIHTDoWkgbmhp4buFbSDhu58gbmjDs20gY2jGsGEgdGnDqm0gYuG6sW5nIHThu7cgbOG7hyB0w6FpIG5oaeG7hW0g4bufIG5ow7NtIMSRw6MgdGnDqm0pfQ0KXF0NCg0KXFsNCkhfMTogcF8xIFxuZXEgcF8yIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgdMOhaSBuaGnhu4VtIOG7nyBuaMOzbSBjaMawYSB0acOqbSBraMOhYyB04bu3IGzhu4cgdMOhaSBuaGnhu4VtIOG7nyBuaMOzbSDEkcOjIHRpw6ptKX0NClxdDQoNCkPDoWMga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogY2hvIHTDrG5oIHRy4bqhbmcgdMOhaSBuaGnhu4VtIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gduG7m2kgYmEgcGjGsMahbmcgcGjDoXAgcGjhu5UgYmnhur9uIGzDoCBNaWQtcCBleGFjdCB0ZXN0LCBGaXNoZXLigJlzIGV4YWN0IHRlc3QgdsOgIENoaS1zcXVhcmVkIHRlc3QgxJHhu4F1IGNobyBr4bq/dCBxdeG6oyBwLXZhbHVlIGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDU6DQoNCi0gTWlkLXAgZXhhY3QgdGVzdDogMC4wNTk0DQoNCi0gRmlzaGVy4oCZcyBleGFjdCB0ZXN0OiAwLjA2MTgNCg0KLSBDaGktc3F1YXJlZCB0ZXN0OiAwLjA1OTANCg0KRG8gxJHDsywgdGEga2jDtG5nIMSR4bunIGPGoSBz4bufIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALiBOw7NpIGPDoWNoIGtow6FjLCBraMO0bmcgY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIG3huqFuaCBt4bq9IMSR4buDIGto4bqzbmcgxJHhu4tuaCBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIGdp4buvYSB04bu3IGzhu4cgdMOhaSBuaGnhu4VtIGPhu6dhIGhhaSBuaMOzbS4NCg0KTeG6t2MgZMO5IFJpc2sgUmF0aW8gKFJSKSDGsOG7m2MgbMaw4bujbmcgbmd1eSBjxqEgdMOhaSBuaGnhu4VtIOG7nyBuaMOzbSDEkcOjIHRpw6ptIGNhbyBoxqFuIG5ow7NtIGNoxrBhIHRpw6ptIChSUiA9IDEuMTIxKSwgbmjGsG5nIGRvIHAtdmFsdWUgY2jGsGEgxJHhu6cgbmjhu48gbsOqbiBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyB0aOG7gyBkbyBiaeG6v24gdGhpw6puIG5n4bqrdSBuaGnDqm4gdHJvbmcgbeG6q3UgZOG7ryBsaeG7h3UuDQoNCiMjIyAqKjQuMy41LiBU4bu3IHPhu5EgQ2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpOioqDQoNCmBgYHtyfQ0Kb3JfcmVzdWx0MiA8LSBvZGRzcmF0aW8ocmVpbl92YWMpDQpwcmludChvcl9yZXN1bHQyKQ0KYGBgDQoNCsav4bubYyBsxrDhu6NuZyBPZGRzIFJhdGlvIChPUikgY2hvIG5ow7NtIHTDoWkgbmhp4buFbSBsw6AgMS4yNyAoduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JSB04burIDAuOTkgxJHhur9uIDEuNjIpLCBzbyB24bubaSBuaMOzbSAiS2jDtG5nIHTDoWkgbmhp4buFbSIgbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgKE9SID0gMSkuIMSQaeG7gXUgbsOgeSBn4bujaSDDvSBy4bqxbmc6DQoNCi0gTmfGsOG7nWkgxJHDoyB0acOqbSBjw7Mga2jhuqMgbsSDbmcgdMOhaSBuaGnhu4VtIGNhbyBoxqFuIGtob+G6o25nIDI3JSBzbyB24bubaSBuZ8aw4budaSBjaMawYSB0acOqbS4NCg0KLSBUdXkgbmhpw6puLCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGJhbyBn4buTbSBnacOhIHRy4buLIDEgKDAuOTkg4oCTIDEuNjIpLCBkbyDEkcOzIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgY2jGsGEgdGjhu7FjIHPhu7EgY2jhuq9jIGNo4bqvbiB24buBIG3hurd0IHRo4buRbmcga8OqLg0KDQpDw6FjIGvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIHbhu5tpIGJhIHBoxrDGoW5nIHBow6FwIHBo4buVIGJp4bq/biDEkeG7gXUgY2hvIGdpw6EgdHLhu4sgcC12YWx1ZSBs4bubbiBoxqFuIDAuMDUsIGPhu6UgdGjhu4M6DQoNCi0gTWlkLXAgZXhhY3QgdGVzdDogMC4wNTk0DQoNCi0gRmlzaGVy4oCZcyBleGFjdCB0ZXN0OiAwLjA2MTgNCg0KLSBDaGktc3F1YXJlZCB0ZXN0OiAwLjA1OTANCg0KTeG6t2MgZMO5IGPDoWMgcC12YWx1ZSBuw6B5IGtow6EgZ+G6p24gbeG7qWMgw70gbmdoxKlhIDAuMDUsIG5oxrBuZyB24bqrbiBjaMawYSDEkeG7pyBuaOG7jyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCDigJMgdOG7qWMgbMOgIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiB24buBIHThu7cgbOG7hyB0w6FpIG5oaeG7hW0gZ2nhu69hIG5ow7NtIGNoxrBhIHRpw6ptIHbDoCBuaMOzbSDEkcOjIHRpw6ptLg0KDQpUw7NtIGzhuqFpLCBt4bq3YyBkw7kgxrDhu5tjIGzGsOG7o25nIE9kZHMgUmF0aW8gY2hvIHRo4bqleSBuZ8aw4budaSDEkcOjIHRpw6ptIGPDsyB4dSBoxrDhu5tuZyBjw7Mgbmd1eSBjxqEgdMOhaSBuaGnhu4VtIGNhbyBoxqFuLCBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4Mga+G6v3QgbHXhuq1uIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu7FjIHPhu7EuIERvIMSRw7MsIHPhu7Ega2jDoWMgYmnhu4d0IHF1YW4gc8OhdCDEkcaw4bujYyBjw7MgdGjhu4MgbMOgIGRvIGJp4bq/biB0aGnDqm4gbmfhuqt1IG5oacOqbiB0cm9uZyBt4bqrdSBraOG6o28gc8OhdC4NCg0KIyAqKlBo4bqnbiA1LiBU4buUTkcgS+G6vlQgVsOAIFRI4bqiTyBMVeG6rE4qKg0KDQpRdWEgcXXDoSB0csOsbmggdMOsbSBoaeG7g3UsIG3DtCB04bqjIHbDoCBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiB0csOqbiBi4buZIGThu68gbGnhu4d1IG3DtCBwaOG7j25nIGLhu4duaCBuaMOibiBDT1ZJRC0xOSwgYsOhbyBjw6FvIG7DoHkgxJHDoyBwaMOhYyBo4buNYSBuw6puIG3hu5l0IGLhu6ljIHRyYW5oIHRvw6BuIGPhuqNuaCB24buBIMSR4bq3YyDEkWnhu4NtIGThu4tjaCB04buFIHbDoCBsw6JtIHPDoG5nLCDEkeG7k25nIHRo4budaSBraMOhbSBwaMOhIG5o4buvbmcgbeG7kWkgbGnDqm4gaOG7hyBiYW4gxJHhuqd1IGdp4buvYSBjw6FjIHnhur91IHThu5Egbmd1eSBjxqEgdsOgIGvhur90IHF14bqjIMSRaeG7gXUgdHLhu4suIEPDoWMga+G6v3QgcXXhuqMga2jDtG5nIGNo4buJIGN1bmcgY+G6pXAgbmjhu69uZyBjb24gc+G7kSBj4bulIHRo4buDIG3DoCBjw7JuIG3hu58gcmEgbmhp4buBdSBoxrDhu5tuZyB0aOG6o28gbHXhuq1uIHF1YW4gdHLhu41uZy4NCg0KIyMgKio1LjEuIFThu5VuZyBr4bq/dCBjw6FjIGvhur90IHF14bqjIG7hu5VpIGLhuq10KioNCg0KLSBQaMOibiB0w61jaCBtw7QgdOG6oyDEkcOjIGNobyB0aOG6pXkgYuG7mSBk4buvIGxp4buHdSBjw7MgY2jhuqV0IGzGsOG7o25nIHThu5F0LCBraMO0bmcgY2jhu6lhIGdpw6EgdHLhu4sgdGhp4bq/dSB2w6AgxJHGsOG7o2MgdGhp4bq/dCBr4bq/IHbhu5tpIHPhu7EgY8OibiBi4bqxbmcgxJHDoW5nIGvhu4MgZ2nhu69hIGPDoWMgbmjDs20gbmjDom4ga2jhuql1IGjhu41jLiBDw6FjIGJp4bq/biBuaMawICoqR2nhu5tpIHTDrW5oKiosICoqS2h1IHbhu7FjIMSR4buLYSBsw70qKiwgKipC4buHbmggbuG7gW4qKiB2w6AgKipCaeG6v24gdGjhu4MgdmlydXMqKiDEkeG7gXUgY8OzIHThu7cgbOG7hyBwaMOibiBi4buRIGtow6EgxJHhu5NuZyDEkeG7gXUsIHThuqFvIG3hu5l0IG7hu4FuIHThuqNuZyB24buvbmcgY2jhuq9jIHbDoCBraMOhY2ggcXVhbiBjaG8gY8OhYyBwaMOibiB0w61jaCBzbyBzw6FuaC4gTmfGsOG7o2MgbOG6oWksIGPDoWMgYmnhur9uIHRo4buDIGhp4buHbiBt4bupYyDEkeG7mSBuZ2hpw6ptIHRy4buNbmcgbmjGsCAqKk5o4bqtcCB2aeG7h24qKiwgKipOaOG6rXAgSUNVKiosIGhheSAqKkjhu5cgdHLhu6MgdGjhu58gbcOheSoqIGzhuqFpIGNobyB0aOG6pXkgc+G7sSBt4bqldCBjw6JuIGLhurFuZyByw7UgcuG7h3QsIHbhu5tpIHBo4bqnbiBs4bubbiBi4buHbmggbmjDom4gKHRyw6puIDcwJSkga2jDtG5nIGPhuqduIGNhbiB0aGnhu4dwIHkgdOG6vyBjaHV5w6puIHPDonUuIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCDEkcO6bmcgdGjhu7FjIHThur8gY+G7p2EgxJHhuqFpIGThu4tjaCwgbsahaSBjaOG7iSBt4buZdCBi4buZIHBo4bqtbiBuaOG7jyBjw6FjIGNhIG5oaeG7hW0gdGnhur9uIHRyaeG7g24gbuG6t25nLg0KDQotIEtoaSB0aeG6v24gaMOgbmgga2nhu4NtIMSR4buLbmggY8OhYyBnaeG6oyB0aHV54bq/dCB0aOG7kW5nIGvDqiwgY8OhYyBr4bq/dCBxdeG6oyBuaMOsbiBjaHVuZyBjaG8gdGjhuqV5IHThu7cgbOG7hyBxdWFuIHPDoXQgxJHGsOG7o2MgdHJvbmcgbeG6q3Uga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyBzbyB24bubaSBjw6FjIGdpw6EgdHLhu4sgZ2nhuqMgxJHhu4tuaCB0cm9uZyBxdeG6p24gdGjhu4MuIENo4bqzbmcgaOG6oW4sIHThu7cgbOG7hyBwaOG7pWMgaOG7k2kgdHJvbmcgbeG6q3UgKDUwLjMlKSBraMO0bmcga2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgc28gduG7m2kgbeG7qWMgNTAlLCBoYXkgdOG7tyBs4buHIG5nxrDhu51pIGPDsyB0cmnhu4d1IGNo4bupbmcgYmFuIMSR4bqndSBsw6AgIk5o4bq5IiAoMzMuNyUpIGPFqW5nIGtow7RuZyBjaG8gdGjhuqV5IHPhu7EgY2jDqm5oIGzhu4djaCBjw7Mgw70gbmdoxKlhIHNvIHbhu5tpIG3hu5FjIDMzJSBnaeG6oyDEkeG7i25oLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBi4buZIGThu68gbGnhu4d1IHThu5VuZyBo4bujcCBuw6B5IMSRw6MgxJHGsOG7o2MgdOG6oW8gcmEgxJHhu4MgcGjhuqNuIMOhbmggY8OhYyB0aGFtIHPhu5EgZMOibiBz4buRIG3hu5l0IGPDoWNoIGtow6EgY2h14bqpbiB4w6FjLg0KDQotIEvhur90IHF14bqjIMSRw6FuZyBzdXkgbmfhuqttIG5o4bqldCDEkeG6v24gdOG7qyB2aeG7h2MgcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/bi4gVHJvbmcga2hpIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4ga+G6v3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDEkcaw4bujYyB0w6xtIHRo4bqleSBnaeG7r2EgKipHaeG7m2kgdMOtbmgqKiB2w6AgdOG7tyBs4buHIG5o4bqtcCB2aeG7h24sIGhv4bq3YyBnaeG7r2EgKipUw6xuaCB0cuG6oW5nIHRpw6ptIGNo4bunbmcqKiB2w6Aga2jhuqMgbsSDbmcgaOG7k2kgcGjhu6VjLCB0aMOsIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgKipUw6FpIG5oaeG7hW0qKiB2w6AgKipUacOqbSBjaOG7p25nKiogbOG6oWkgY2hvIHRo4bqleSBt4buZdCBr4bq/dCBxdeG6oyB0aMO6IHbhu4suIEThu68gbGnhu4d1IGNo4buJIHJhIHLhurFuZyBuaMOzbSDEkcOjIHRpw6ptIHbhuq9jLXhpbiBjw7MgdOG7tyBs4buHIHTDoWkgbmhp4buFbSAoMTAuNSUpIGNhbyBoxqFuIG3hu5l0IGNow7p0IHNvIHbhu5tpIG5ow7NtIGNoxrBhIHRpw6ptICg4LjUlKS4gTeG6t2MgZMO5IGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyAocC12YWx1ZSDiiYggMC4wNjgpIGNoxrBhIMSR4bqhdCBt4bupYyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6osIG5oxrBuZyBraeG7g20gxJHhu4tuaCBoaeG7h3UgdOG7tyBs4buHIG3hu5l0IHBow61hIGzhuqFpIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7Mgw70gbmdoxKlhIChwLXZhbHVlIOKJiCAwLjAyOTUpLiBL4bq/dCBxdeG6oyBraMO0bmcgbmjhuqV0IHF1w6FuIHbDoCBjw7MgcGjhuqduIHRyw6FpIG5nxrDhu6NjIHbhu5tpIGvhu7MgduG7jW5nIG7DoHkgbMOgIG3hu5l0IMSRaeG7g20gdGjhuqNvIGx14bqtbiBxdWFuIHRy4buNbmcuDQoNCiMjICoqNS4yLiBUaOG6o28gbHXhuq1uIHbDoCBI4bqhbiBjaOG6vyoqDQoNCi0gVHLGsOG7m2MgaOG6v3QsIGPhuqduIG5o4bqlbiBt4bqhbmggcuG6sW5nIMSRw6J5IGzDoCBt4buZdCBi4buZIGThu68gbGnhu4d1IHThu5VuZyBo4bujcCAoc3ludGhldGljKS4gRG8gxJHDsywgbeG7jWkga+G6v3QgbHXhuq1uIHLDunQgcmEgY2jhu4kgbWFuZyB0w61uaCB0aGFtIGto4bqjbywgbWluaCBo4buNYSBjaG8gcGjGsMahbmcgcGjDoXAgcGjDom4gdMOtY2ggdsOgIGtow7RuZyB0aOG7gyDDoXAgZOG7pW5nIHRy4buxYyB0aeG6v3AgY2hvIGPDoWMgcXV54bq/dCDEkeG7i25oIGzDom0gc8OgbmcgdHJvbmcgdGjhu7FjIHThur8uDQoNCi0gS+G6v3QgcXXhuqMgxJHDoW5nIGNow7ogw70gbmjhuqV0IHbhu4EgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2Egdmnhu4djIHRpw6ptIHbhuq9jLXhpbiB2w6Agbmd1eSBjxqEgdMOhaSBuaGnhu4VtIGNhbyBoxqFuIGPhuqduIMSRxrDhu6NjIGRp4buFbiBnaeG6o2kgbeG7mXQgY8OhY2ggY+G6qW4gdHLhu41uZy4gTeG7mXQgc+G7kSBnaeG6oyB0aHV54bq/dCBjw7MgdGjhu4MgxJHGsOG7o2MgxJHGsGEgcmEgxJHhu4MgbMO9IGdp4bqjaSBoaeG7h24gdMaw4bujbmcgbsOgeToNCg0KICAtICoqWeG6v3UgdOG7kSBuaGnhu4V1IChDb25mb3VuZGluZyBWYXJpYWJsZXMpOioqIE5ow7NtIMSRw6MgdGnDqm0gduG6r2MteGluIGPDsyB0aOG7gyBiYW8gZ+G7k20gbmjhu69uZyBuZ8aw4budaSBjw7Mgbmd1eSBjxqEgcGjGoWkgbmhp4buFbSBjYW8gaMahbiBkbyB0w61uaCBjaOG6pXQgY8O0bmcgdmnhu4djIChuaMOibiB2acOqbiB5IHThur8sIGdpw6FvIHZpw6puKSBob+G6t2MgY8OzIGLhu4duaCBu4buBbiwga2hp4bq/biBo4buNIMSRxrDhu6NjIMawdSB0acOqbiB0acOqbSBjaOG7p25nLiBDaMOtbmggY8OhYyB54bq/dSB04buRIG7DoHksIGNo4bupIGtow7RuZyBwaOG6o2kgYuG6o24gdGjDom4gduG6r2MteGluLCBt4bubaSBsw6Agbmd1ecOqbiBuaMOibiBsw6BtIHTEg25nIG5ndXkgY8ahIHTDoWkgbmhp4buFbS4NCg0KICAtICoqS2jDoWMgYmnhu4d0IGjDoG5oIHZpOioqIE5o4buvbmcgbmfGsOG7nWkgxJHDoyB0acOqbSBjaOG7p25nIGPDsyB0aOG7gyBjw7MgdMOibSBsw70gY2jhu6cgcXVhbiBoxqFuLCBnaeG6o20gYuG7m3QgY8OhYyBiaeG7h24gcGjDoXAgcGjDsm5nIG5n4burYSBjw6EgbmjDom4sIGThuqtuIMSR4bq/biB0xINuZyBraOG6oyBuxINuZyB0aeG6v3AgeMO6YyB24bubaSB2aXJ1cy4NCg0KICAtICoqWeG6v3UgdOG7kSB0aOG7nWkgZ2lhbiB2w6AgYmnhur9uIHRo4buDIHZpcnVzOioqIEThu68gbGnhu4d1IGvDqW8gZMOgaSDEkeG6v24gbsSDbSAyMDI0LCBiYW8gZ+G7k20gY+G6oyBnaWFpIMSRb+G6oW4gY8OhYyBiaeG6v24gdGjhu4MgbeG7m2kgY8OzIGto4bqjIG7Eg25nICJuw6kiIG1p4buFbiBk4buLY2ggdOG7qyB24bqvYy14aW4gKG5oxrAgT21pY3JvbikgY2hp4bq/bSDGsHUgdGjhur8uIE5o4buvbmcgbmfGsOG7nWkgxJHDoyB0acOqbSB04burIHPhu5ttIGPDsyB0aOG7gyDEkcOjIHN1eSBnaeG6o20gbWnhu4VuIGThu4tjaCB0aGVvIHRo4budaSBnaWFuLCB0cm9uZyBraGkgbmjDs20gY2jGsGEgdGnDqm0gY8OzIHRo4buDIMSRw6MgY8OzIG1p4buFbiBk4buLY2ggdOG7sSBuaGnDqm4gdOG7qyBs4bqnbiBuaGnhu4VtIHRyxrDhu5tjIMSRw7MgduG7m2kgbeG7mXQgYmnhur9uIHRo4buDIGtow6FjLg0KDQogIC0gKipT4buxIG5n4bqrdSBuaGnDqm4gY+G7p2EgbeG6q3U6KiogVsOsIGdpw6EgdHLhu4sgcC12YWx1ZSBj4bunYSBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgcuG6pXQgZ+G6p24gbmfGsOG7oW5nIDAuMDUsIGtow7RuZyB0aOG7gyBsb+G6oWkgdHLhu6sga2jhuqMgbsSDbmcgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjaOG7iSBsw6AgZG8gYmnhur9uIHRoacOqbiBuZ+G6q3Ugbmhpw6puIHRyb25nIG3huqt1Lg0KDQojIyAqKjUuMy4gSMaw4bubbmcgcGjDoXQgdHJp4buDbiB2w6AgxJDhu4EgeHXhuqV0KioNCg0KVOG7qyBjw6FjIGvhur90IHF14bqjIHbDoCB0aOG6o28gbHXhuq1uIHRyw6puLCBjw6FjIG5naGnDqm4gY+G7qXUgc8OidSBoxqFuIGPDsyB0aOG7gyDEkcaw4bujYyB0aOG7sWMgaGnhu4duIHRoZW8gY8OhYyBoxrDhu5tuZyBzYXU6DQoNCi0gKipQaMOibiB0w61jaCDEkWEgYmnhur9uOioqICBT4butIGThu6VuZyBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgKHbDrSBk4bulOiBo4buTaSBxdXkgbG9naXN0aWMpIMSR4buDIMSRw6FuaCBnacOhIMSR4buTbmcgdGjhu51pIHTDoWMgxJHhu5luZyBj4bunYSBuaGnhu4F1IHnhur91IHThu5EgKHR14buVaSwgYuG7h25oIG7hu4FuLCBuZ2jhu4EgbmdoaeG7h3AsIHTDrG5oIHRy4bqhbmcgdGnDqm0gY2jhu6duZykgbMOqbiBjw6FjIGvhur90IHF14bqjIG5oxrAgbmjhuq1wIHZp4buHbiBob+G6t2MgdMOhaSBuaGnhu4VtLiBDw6FjaCB0aeG6v3AgY+G6rW4gbsOgeSBz4bq9IGdpw7pwIGtp4buDbSBzb8OhdCBjw6FjIHnhur91IHThu5EgZ8OieSBuaGnhu4V1IHbDoCBsw6BtIHLDtSBoxqFuIHZhaSB0csOyIGPhu6dhIHThu6tuZyBiaeG6v24uDQoNCi0gKipQaMOibiB0w61jaCB0aGVvIHThu6tuZyBnaWFpIMSRb+G6oW46KiogIENoaWEgYuG7mSBk4buvIGxp4buHdSB0aGVvIGPDoWMgbeG7kWMgdGjhu51pIGdpYW4gcXVhbiB0cuG7jW5nICh2w60gZOG7pTogdHLGsOG7m2MgdsOgIHNhdSBraGkgYmnhur9uIHRo4buDIE9taWNyb24geHXhuqV0IGhp4buHbikgxJHhu4MgxJHDoW5oIGdpw6Egc+G7sSB0aGF5IMSR4buVaSB0cm9uZyBoaeG7h3UgcXXhuqMgY+G7p2EgduG6r2MteGluIHbDoCBuZ3V5IGPGoSB0w6FpIG5oaeG7hW0uDQoNCi0gKipQaMOibiB0w61jaCBuaMOzbSBuaOG7jyAoU3ViZ3JvdXAgQW5hbHlzaXMpOioqICDEkGkgc8OidSB2w6BvIHNvIHPDoW5oIGdp4buvYSBjw6FjIGxv4bqhaSB24bqvYy14aW4ga2jDoWMgbmhhdSwgaG/hurdjIMSRw6FuaCBnacOhIG5ndXkgY8ahIHTDoWkgbmhp4buFbSB0cm9uZyBjw6FjIG5ow7NtIG5naOG7gSBuZ2hp4buHcCBjw7MgbeG7qWMgxJHhu5kgcGjGoWkgbmhp4buFbSBraMOhYyBuaGF1IMSR4buDIGPDsyBjw6FpIG5ow6xuIGNoaSB0aeG6v3QgaMahbi4NCg0KDQoNCg0KDQoNCg0KDQoNCg==