1 Mục tiêu bài nghiên cứu

Mục đích của nghiên cứu này là phân tích hành vi lựa chọn hạng vé bao gồm hạng thương gia và hạng phổ thông của khách hàng khi đặt vé máy bay trên trang web EaseMy Trip. Bằng cách thu thập và phân tích các thông tin liên quan đến giá vé, tên chuyến bay, nơi khởi hành, điểm đến, thời gian khởi hành, và các yếu tố khác. Nghiên cứu nhằm đưa ra các thông tin hữu ích giúp cải thiện dịch vụ của EaseMy Trip và có thể áp dụng cho các doanh nghiệp khác trong ngành du lịch và hàng không.

library(tidyverse)
library(readxl)
library(DT)
library(DescTools)
library(epitools)
library(scales)
data <- read.csv("D:/Phantichdulieudinhtinh/Easymytrip.csv")
df <- data
str(df)
## 'data.frame':    300153 obs. of  12 variables:
##  $ X               : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ airline         : chr  "SpiceJet" "SpiceJet" "AirAsia" "Vistara" ...
##  $ flight          : chr  "SG-8709" "SG-8157" "I5-764" "UK-995" ...
##  $ source_city     : chr  "Delhi" "Delhi" "Delhi" "Delhi" ...
##  $ departure_time  : chr  "Evening" "Early_Morning" "Early_Morning" "Morning" ...
##  $ stops           : chr  "zero" "zero" "zero" "zero" ...
##  $ arrival_time    : chr  "Night" "Morning" "Early_Morning" "Afternoon" ...
##  $ destination_city: chr  "Mumbai" "Mumbai" "Mumbai" "Mumbai" ...
##  $ class           : chr  "Economy" "Economy" "Economy" "Economy" ...
##  $ duration        : num  2.17 2.33 2.17 2.25 2.33 2.33 2.08 2.17 2.17 2.25 ...
##  $ days_left       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ price           : int  5953 5953 5956 5955 5955 5955 6060 6060 5954 5954 ...
head(df,6)
##   X  airline  flight source_city departure_time stops  arrival_time
## 1 0 SpiceJet SG-8709       Delhi        Evening  zero         Night
## 2 1 SpiceJet SG-8157       Delhi  Early_Morning  zero       Morning
## 3 2  AirAsia  I5-764       Delhi  Early_Morning  zero Early_Morning
## 4 3  Vistara  UK-995       Delhi        Morning  zero     Afternoon
## 5 4  Vistara  UK-963       Delhi        Morning  zero       Morning
## 6 5  Vistara  UK-945       Delhi        Morning  zero     Afternoon
##   destination_city   class duration days_left price
## 1           Mumbai Economy     2.17         1  5953
## 2           Mumbai Economy     2.33         1  5953
## 3           Mumbai Economy     2.17         1  5956
## 4           Mumbai Economy     2.25         1  5955
## 5           Mumbai Economy     2.33         1  5955
## 6           Mumbai Economy     2.33         1  5955

2 Mô tả bộ dữ liệu:

‘EaseMy Trip’ là một nền tảng internet để đặt vé máy bay. Dữ liệu được thu thập chia thành 2 nhóm vé: một nhóm dành cho vé hạng phổ thông và nhóm còn lại dành cho vé hạng thương gia. Tổng cộng có 300153 thông tin đặt vé máy bay riêng biệt được trích xuất từ trang web. Dữ liệu được thu thập trong 50 ngày, từ ngày 11 tháng 2 đến ngày 31 tháng 3 năm 2022.

  • Airline: Tên của hãng hàng không, gồm có 6 hãng hàng không

  • Flight: Mã chuyến bay

  • Source City: Thành phố nơi chuyến bay cất cánh

  • Departure Time: Khoảng thời gian chuyến bay khởi hành

  • Stops: Số điểm dừng chân.

  • Arrival Time: Khoảng thời gian chuyến bay hạ cánh

  • Destination City: Thành phố nơi chuyến bay hạ cánh

  • Class: Hạng ghế mà khách hàng lựa chọn. Có 2 hạng ghế là hạng phổ thông và hạng thương gia

  • Duration: Khoảng thời gian chuyến bay di chuyển (được tính bằng giờ)

  • Days Left: Chênh lệch giữa thời gian bay và thời gian đặt vé

  • Price: Giá vé

3 Đặt vấn đề

Trong ngành hàng không, chúng ta cần phải hiểu rõ hành vi và nhu cầu của khách hàng để có thể tối ưu hoá các dịch vụ, nâng cao doanh thu và trải nghiệm của khách hàng. Một trong những yếu tố quan trọng trong ngành hàng không là dự đoán được xác suất khách hàng chọn hạng vé thương gia để kịp thời đưa ra các chương trình đáp ứng cho nhu cầu của họ.

  • Biến phụ thuộc (biến được giải thích): Class (Gồm 2 biểu hiện: Business và Economy)

  • Biến giải thích:

Source City: Kinh tế thị trường ở các thành phố có thể ảnh hưởng đến xác suất chọn hạng vé thương gia của khách hàng, ở những thành phố có nền kinh tế phát triển thì dự đoán nhu cầu chọn hạng vé thương gia của khách hàng có thể lớn hơn so với những thành phố có nền kinh tế ít phát triển.

Airline: Mỗi hãng hàng không có chất lượng dịch vụ và giá cả khách nhau. Ví dụ, những hãng hàng không mang thương hiệu lớn thì tỷ lệ chọn vé hạng thương gia sẽ cao hơn.

Price: Theo dự đoán thì mức giá là một yếu tố quan trọng ảnh hưởng đến lựa chọn hạng vé của khách hàng. Từng phân khúc khách hàng sẽ lựa chọn hạng vé phù hợp với nhu cầu và khả năng chi trả của họ.

Stop_ans: Giả thiết số điểm dừng của chuyến bay cũng có ảnh hưởng đến hành vi lựa chọn hạng vé của khách hàng. Những khách hàng chọn hạng vé thương gia thường sẽ chú trọng vào dịch vụ của chuyến bay hơn so với khách hàng chọn hạng vé phổ thông. Những chuyến bay có điểm dừng thường gây ra những rắc rối về việc chuyển hành lý và mất thời gian hơn, nên dự đoán xác suất chọn hạng vé thương gia ở những chuyến bay không có điểm dừng sẽ cao hơn so với những chuyến bay có điểm dừng.

Day_left: Thời gian đặt vé trước chuyến bay cũng có thể ảnh hưởng đến lựa chọn hạng vé của khách hàng. Đối với những chuyến bay có thời gian đặt vé sớm, thì sẽ có nhiều lựa chọn về giá cả, dịch vụ hoặc hạng ghế. Nhưng đối với những chuyến bay đặt quá gần ngày bay thì sẽ có những hạn chế, ví dụ như hết vé hạng phổ thông.

Duration: Thời gian bay cũng là một trong những yếu tố quan trọng ảnh hưởng tới hành vi lựa chọn hạng vé của khách hàng. Đối với những chuyến bay dài thì khách hàng sẽ có xu hướng lựa chọn hạng vé thương gia để đảm bảo về dịch vụ và sự thoải mái.

4 Xử lý dữ liệu

Phân tổ giá của mỗi chuyến bay thành 2 biểu hiện: Thấp và Cao

  • Dựa vào giá trị trung bình của giá trong mẫu được chọn. Giá thấp hơn 20890 được gán với biểu hiện “Thấp”, giá cao 20890 được gán với biểu hiện “Cao”.
str(df)
## 'data.frame':    300153 obs. of  12 variables:
##  $ X               : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ airline         : chr  "SpiceJet" "SpiceJet" "AirAsia" "Vistara" ...
##  $ flight          : chr  "SG-8709" "SG-8157" "I5-764" "UK-995" ...
##  $ source_city     : chr  "Delhi" "Delhi" "Delhi" "Delhi" ...
##  $ departure_time  : chr  "Evening" "Early_Morning" "Early_Morning" "Morning" ...
##  $ stops           : chr  "zero" "zero" "zero" "zero" ...
##  $ arrival_time    : chr  "Night" "Morning" "Early_Morning" "Afternoon" ...
##  $ destination_city: chr  "Mumbai" "Mumbai" "Mumbai" "Mumbai" ...
##  $ class           : chr  "Economy" "Economy" "Economy" "Economy" ...
##  $ duration        : num  2.17 2.33 2.17 2.25 2.33 2.33 2.08 2.17 2.17 2.25 ...
##  $ days_left       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ price           : int  5953 5953 5956 5955 5955 5955 6060 6060 5954 5954 ...
summary(df$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4783    7425   20890   42521  123071
df$price_level <- cut(df$price, breaks = c(0, 20890, 123071), labels = c("Thap", "Cao"))
str(df$price_level)
##  Factor w/ 2 levels "Thap","Cao": 1 1 1 1 1 1 1 1 1 1 ...

Phân tổ thời gian đặt vé trước chuyến bay thành 2 biểu hiện “sớm”,“Muộn”

  • Dựa vào giá trị trung bình của thời gian đặt vé trước chuyến bay của mẫu được chọn. Thời gian thấp hơn 26 ngày được gán với biểu hiện “Muộn”, thời gian cao hơn 26 ngày được gán với biểu hiện “Sớm”.
df$dayleft_level <- cut(df$days_left, breaks = c(0, 26, 50), labels = c("Muộn", "Sớm"))
str(df$dayleft_level)
##  Factor w/ 2 levels "Muộn","Sớm": 1 1 1 1 1 1 1 1 1 1 ...
summary(df$dayleft_level)
##   Muộn    Sớm 
## 152712 147441

Phân tổ thời gian đặt vé trước chuyến bay thành 2 biểu hiện “sớm”,“Muộn”

  • Dựa vào giá trị trung bình của thời gian bay. Thời gian thấp hơn 12.22 tiếng được gán với biểu hiện “Thấp”, thời gian cao hơn 12.22 tiếng ngày được gán với biểu hiện “Cao”.
df$duration_level <- cut(df$duration, breaks = c(0, 12.22, 50), labels = c("Thấp", "Cao"))
str(df$duration_level)
##  Factor w/ 2 levels "Thấp","Cao": 1 1 1 1 1 1 1 1 1 1 ...
summary(df$duration_level)
##   Thấp    Cao 
## 166999 133154

5 Thống kê mô tả 1 biến

Trong phần này, chúng tôi thực hiện thống kê mô tả cho dữ liệu bao gồm dữ liệu định tính và dữ liệu định lượng. Đối với dữ liệu định tính, thực hiện lập bảng tần số, bảng tần suất và vẽ đồ thị. Đối với dữ liệu định lượng, thực hiện thống kê các đặc trưng đo lường.

5.1 Thống kê mô tả biến định tính

5.1.1 Thống kê mô tả biến class

Đầu tiên, thực hiện thống kê mô tả cho biến Class thể hiện hạng vé mà khách hàng lựa chọn. Bao gồm hai biểu hiện là hạng ghế phổ thông và hạng ghế thương gia. Đây cũng chính là biến được giải thích trong bài nghiên cứu.

tmp <- table(df$class)
addmargins(tmp)
## 
## Business  Economy      Sum 
##    93487   206666   300153
round((table(df$class)/sum(table(df$class))*100),2)
## 
## Business  Economy 
##    31.15    68.85
df %>% ggplot(map = aes(x=fct_infreq(class), y= after_stat(count)))+geom_bar(fill = 'skyblue')+geom_text(aes(label=percent(after_stat(count/sum(count)),accuracy = .01)), stat = 'count', color = 'black',vjust = 2) + labs(x = 'Hạng ghế',y="số lượng", title="Phân chia số lượng vé theo từng hạng ghế")+theme_minimal()

Trong số 300153 vé máy bay:

  • Số người đặt hạng ghế phổ thông có 206666 vé, chiếm 68,85%

  • Số người đặt hạng ghế thương gia có 93487 vé, chiếm 31,15%

Như vậy, số người đặt vé hạng ghế phổ thông nhiều hơn 113179 (Khoảng 37,71%) so với số người sở hữu vé là hạng ghế thương gia.

5.1.2 Thống kê mô tả biến airline

Biến airline là biến đại diện cho các hãng hàng không. Có 6 hãng hàng không trong bài nghiên cứu này.

tmp1 <- table(df$airline)
addmargins(tmp1)
## 
## Air_India   AirAsia  GO_FIRST    Indigo  SpiceJet   Vistara       Sum 
##     80892     16098     23173     43120      9011    127859    300153
round((table(df$airline)/sum(table(df$airline))*100),2)
## 
## Air_India   AirAsia  GO_FIRST    Indigo  SpiceJet   Vistara 
##     26.95      5.36      7.72     14.37      3.00     42.60
df %>% ggplot(map = aes(x=fct_infreq(airline), y= after_stat(count)))+geom_bar(fill = 'salmon')+geom_text(aes(label=percent(after_stat(count/sum(count)),accuracy = .01)), stat = 'count', color = 'black',vjust = 1) + labs(x = 'Hãng hàng không',y="số lượng", title="Phân chia số lượng vé theo từng hãng hàng không")+theme_minimal()

Thống kê cho thấy trong số 300153 vé máy bay được bán ra sắp xếp theo thứ tự tăng dần, ta có thể thấy rằng hãng hàng không Vistara chiếm tỷ lệ cao nhất và hãng Spicejet chiếm tỷ lệ thấp nhất cụ thể như sau:

  • Hãng hàng không Vistara có 127859 vé chiếm tỷ lệ là 42.6%

  • Hãng hàng không Air_India có 80892 vé chiếm tỷ lệ là 26.95%

  • Hãng hàng không Indigo có 43120 vé chiếm tỷ lệ là 14.37%

  • Hãng hàng không GO_FIRST có 23173 vé chiếm tỷ lệ là 7.72%

  • Hãng hàng không AirAsia có 16098 vé chiếm tỷ lệ là 5.36%

  • Hãng hàng không SpiceJet có 9011 vé chiếm tỷ lệ là 3%

5.1.3 Thống kê mô tả biến source_city

source_frequency <- table(df$source_city)
addmargins(source_frequency)
## 
## Bangalore   Chennai     Delhi Hyderabad   Kolkata    Mumbai       Sum 
##     52061     38700     61343     40806     46347     60896    300153
round((table(df$source_city)/sum(table(df$source_city))*100),2)
## 
## Bangalore   Chennai     Delhi Hyderabad   Kolkata    Mumbai 
##     17.34     12.89     20.44     13.60     15.44     20.29
df %>% ggplot(map = aes(x=fct_infreq(source_city), y=after_stat(count)))+geom_bar(fill='skyblue')+geom_text(aes(label=percent(after_stat(count/sum(count)),accuracy = .01)), stat = 'count', color = 'black',vjust = 2) + labs(x = 'Thành phố khởi hành', y = 'Số lượng', title = "Số lượng chuyến bay tương ứng với từng thành phố mà chuyến bay khởi hành")+theme_minimal()

Trong số 300153 thông tin về điểm khởi hành của các chuyến bay, thành phố có chuyến bay khởi hành nhiều nhất là Delhi và thành phố có chuyến bay khỏi hành ít nhất là Chennai, cụ thể như sau:

  • Số lượng chuyến bay ở Delhi là 52061, chiếm 20,44% tổng chuyến bay.

  • Số lượng chuyến bay ở Mumbai là 60896 , chiếm 20,29% tổng số chuyến bay

  • Số lượng chuyến bay ở Bangalore là 52061 , chiếm 17,34% tổng số chuyến bay

  • Số lượng chuyến bay ở Kolkata là 46347 , chiếm 15,44% tổng số chuyến bay

  • Số lượng chuyến bay ở Hyderabad là 40806, chiếm 13,60% tổng số chuyến bay

  • Số lượng chuyến bay ở Chennai là 38700, chiếm 12,89% tổng số chuyến bay.

Nhận xét: Qua biểu đồ này, chúng ta có thể thấy rõ ràng rằng Delhi và Mumbai là hai trung tâm hàng không lớn nhất, trong khi các thành phố khác như Bangalore, Kolkata, Hyderabad, và Chennai có số lượng chuyến bay ít hơn đáng kể.

5.1.4 Thống kê mô tả biến stops

stops_frequency <- table(df$stops)
addmargins(stops_frequency)
## 
##         one two_or_more        zero         Sum 
##      250863       13286       36004      300153
round((table(df$stops)/sum(table(df$stops))*100),2)
## 
##         one two_or_more        zero 
##       83.58        4.43       12.00
df %>% ggplot(map = aes(x=fct_infreq(stops), y=after_stat(count)))+geom_bar(fill='violet')+geom_text(aes(label=percent(after_stat(count/sum(count)),accuracy = .01)), stat = 'count', color = 'black',vjust = 1.2) + labs(x = 'Số điểm dừng', y = 'Số lượng', title = "Số lượng chuyến bay tương ứng với số điểm dừng")+theme_minimal()

Trong tổng số 300153 thông tin về số điểm dừng của các chuyến bay

  • Đa số khách hàng lựa chọn chuyến bay không có điểm dừng và nó chiếm tới 83,58% so với tổng 300153 chuyến bay.

  • Số chuyến bay có 1 điểm dừng chiếm 12%.

  • Số chuyến bay có 2 hoặc nhiều hơn 2 điểm dừng chỉ chiếm 4,43%.

Nhận xét: Đa số hành khách ưu tiên lựa chọn chuyến bay thẳng, không có điểm dừng. Điều này có thể do các lý do như tiết kiệm thời gian, giảm thiểu rủi ro mất hành lý và hạn chế phiền toái khi chuyển giữa các chuyến bay. Có 12% khách hàng lựa chọn chuyến bay có 1 điểm dừng, các chuyến bay này thường có giá rẻ hơn so với chuyến bay thẳng, hoặc có thể hành khách không tìm được chuyến bay thẳng phù hợp với lịch trình của họ.Rất ít hành khách chọn chuyến bay có 2 hoặc nhiều hơn 2 điểm dừng. Những chuyến bay này thường kéo dài thời gian di chuyển, có thể gây mệt mỏi cho hành khách và tăng khả năng gặp sự cố.

5.2 Thống kê mô tả biến định lượng

5.2.1 Biến Price

Biến Price là biến thể hiện cho giá vé máy bay mà khách hàng đã mua, là một biến định lượng. Để mô tả cho biến này, ta thực hiện tính toán các đặc trưng đo lường:

summary(df$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4783    7425   20890   42521  123071
var(df$price)
## [1] 515188643
sd(df$price)
## [1] 22697.77
ggplot(df, aes(x = price)) +
  geom_density(fill = "skyblue", color = "blue", alpha = 0.5) +
  labs(x = "Giá vé máy bay", y="Mật độ", title="Biểu đồ phân phối của giá vé")+theme_minimal()

Từ kết quả trên, ta nhận thấy rằng:

  • Giá vé thấp nhất là 1105 đơn vị tiền tệ, giá vé cao nhất là 123071 đơn vị tiền tệ. Có khoảng cách giữa vé thấp nhất và vé cao nhất là rất lớn, cho thấy có sự đa dạng rất lớn trong giá vé.

  • Có 25% giá vé thấp hơn giá 4783 đơn vị tiền tệ, có 50% giá vé thấp hơn giá trị 7425 đơn vị tiền tệ, có 75% giá vé thấp hơn 42521 đơn vị tiền tệ. Phân phối giá vé lệch, phần lớn giá vé nằm dưới mức 42521 đơn vị tiền tệ.

  • Mức trung bình của giá vé là 20890 đơn vị tiền, cao hơn giá trị trung vị. Điều này cho thấy rằng có một số giá trị rất cao kéo giá trị trung bình lên.

  • Nhìn vào phương sai của dữ liệu, Phương sai lớn cho thấy sự biến thiên lớn trong dữ liệu. Độ lệch chuẩn cao cũng phán ánh sự phân tán lớn xung quanh giá trị trung bình.

5.2.2 Biến Days Left

summary(df$days_left)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       1      15      26      26      38      49
var(df$days_left)
## [1] 183.9008
sd(df$days_left)
## [1] 13.561

Trong 300513 người trong khảo sát cho biết thông tin về khoảng thời gian từ lúc đặt vé đén lúc đặt vé đến lúc bay như sau:

  • Thời gian từ lúc đặt vé đến khi bay của các hành khách ngắn nhất là một ngày và dài nhất là 49 ngày.

  • Thời gian trung bình của số lượng hành khách khảo sát được là 26 ngày.

  • 25% người trong nhóm trên đặt vé trước ngày bay 15 ngày

  • 50% người trong nhóm khảo sát đặt vé trước ngày bay 26 ngày

  • 75% người trong nhóm đặt vé trước ngày bay 38 ngày

  • Độ lệch chuẩn của biến days-left là 13.561 cho biết mức đọ phân tán của thời gian từ ngày đặt vé đến ngày bay trong nhóm người khảo sát được so với giá trị trung bình là 13.561 ngày.

ggplot(df, aes(x = days_left)) +
  geom_density(fill = "skyblue", color = "blue", alpha = 0.5) +
  labs(x = "thời gian đặt vé trước chuyến bay",y="Mật độ", title="Biểu đồ phân phối của thời gian đặt vé trước chuyến bay")+theme_minimal()

Nhận xét

  • Hình dạng phân bố: Mật độ phân bố có xu hướng gần như đều từ khoảng ngày thứ 10 đến ngày thứ 45 trước ngày bay. Điều này cho thấy nhiều người có xu hướng đặt vé trong khoảng thời gian này.

  • Đặt vé sớm: Số người đặt vé bắt đầu tăng từ rất ít ở gần ngày thứ 0 và tăng dần đến khoảng ngày thứ 10. Có rất ít người đặt vé gần ngày bay.

  • Giảm đặt vé gần ngày bay: Có sự giảm đột ngột trong số người đặt vé khi còn ít ngày trước ngày bay (dưới 10 ngày). Điều này có thể do giá vé tăng hoặc thiếu vé.

  • Phân bố ổn định: Trong khoảng từ 10 ngày đến 45 ngày trước ngày bay, mật độ phân bố ổn định, cho thấy nhiều người có xu hướng đặt vé trong giai đoạn này, có thể do đây là khoảng thời gian tối ưu về giá cả

  • Giảm mạnh sau ngày 45: Số người đặt vé giảm dần sau khoảng 45 ngày trước ngày bay. Có thể vì việc đặt vé quá xa trước ngày bay ít phổ biến hoặc ít người có kế hoạch cụ thể xa đến vậy.

5.2.3 Biến Duration

summary(df$duration)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.83    6.83   11.25   12.22   16.17   49.83
var(df$duration)
## [1] 51.72482
sd(df$duration)
## [1] 7.191997

Trong bộ dữ liệu khảo sát được ta có thông tin về thời gian bay như sau:

  • Chuyến bay ngắn nhất kéo dài 0.83 giờ tương đương với khoảng 50 phút

  • chuyến bay dài nhất kéo dài 49.83 giờ tương đương với khoảng 2 ngày 1 giờ 50 phút

  • 25% chuyến bay kéo dài trong 6.83 giờ

  • 50% chuyến bay kéo dài trng 11.25 giờ

  • 75% chuyến bay kéo dài trong 16.17 giờ

  • Thời gian bay trung bình khảo sát được là 12.22 giờ

ggplot(df, aes(x = duration)) +
  geom_density(fill = "skyblue", color = "blue", alpha = 0.5) +
  labs(x = "thời gian bay")+theme_minimal()

Nhận xét

  • Đỉnh cao ngay sát gần 0: Có một đỉnh rất cao ở khoảng thời gian ngắn nhất, cho thấy rằng phần lớn các chuyến bay kéo dài rất ngắn, có thể là các chuyến bay nội địa hoặc các chuyến bay chỉ kéo dài khoảng 2-3 giờ.

  • Giảm dần sau đỉnh đầu tiên: Sau đỉnh cao ban đầu, mật độ giảm dần nhưng vẫn có những đỉnh cao khác trong khoảng từ 6 đến 12 giờ. Điều này có thể biểu hiện cho các chuyến bay nội địa dài hơn hoặc các chuyến bay quốc tế ngắn.

  • Đỉnh nhỏ khoảng từ 14 đến 20 giờ: Có một đỉnh nhỏ từ khoảng thời gian 14 đến 20 giờ, cho thấy có một số chuyến bay kéo dài trong khoảng thời gian này, có thể là các chuyến bay quốc tế dài.

  • Giảm mạnh sau 20 giờ: Sau khoảng 20 giờ, mật độ giảm đáng kể, cho thấy rất ít chuyến bay kéo dài hơn 20 giờ. Điều này hợp lý vì hầu hết các chuyến bay quốc tế dài nhất thường không kéo dài hơn khoảng thời gian này.

  • Gần như không có chuyến bay kéo dài hơn 30 giờ: Từ khoảng 30 giờ trở đi, mật độ giảm xuống gần bằng 0, cho thấy rất ít hoặc không có chuyến bay nào kéo dài hơn khoảng thời gian này. Điều này có thể bao gồm các chuyến bay có nhiều điểm dừng hoặc các hành trình đặc biệt.

Tóm lại, biểu đồ này cho thấy hầu hết các chuyến bay kéo dài dưới 10 giờ, với phần lớn các chuyến bay rất ngắn. Có một số ít chuyến bay kéo dài từ 10 đến 20 giờ, và rất hiếm có chuyến bay kéo dài hơn 20 giờ.

6 Thống kê mô tả 2 biến

6.1 Biến Class và biến airline

addmargins(table(df$airline, df$class))
##            
##             Business Economy    Sum
##   Air_India    32898   47994  80892
##   AirAsia          0   16098  16098
##   GO_FIRST         0   23173  23173
##   Indigo           0   43120  43120
##   SpiceJet         0    9011   9011
##   Vistara      60589   67270 127859
##   Sum          93487  206666 300153
prop.table(table(df$airline, df$class), margin = 2) * 100
##            
##              Business   Economy
##   Air_India 35.189919 23.222978
##   AirAsia    0.000000  7.789380
##   GO_FIRST   0.000000 11.212778
##   Indigo     0.000000 20.864583
##   SpiceJet   0.000000  4.360175
##   Vistara   64.810081 32.550105
df %>% count(class,airline) %>% group_by(class) %>% mutate(psl = n/sum(n)) %>% ggplot(aes(x=class,y=n,fill= airline))+geom_col() + geom_text(aes(label = percent(psl,accuracy = .01)), position = position_stack(vjust = .5), color = 'black') + labs( x ='Hạng vé', y = 'số lượng', title = "Đồ thị của số lượng chuyến bay của hãng hàng không theo hạng ghế")+theme_minimal()

Nhìn vào bảng và đồ thị số lượng chuyến bay của các hãng hàng không theo hạng ghế, chúng ta có thể đưa ra một số nhận xét:

  • Vistara: Chiếm tỉ lệ cao nhất trong hạng Business (64.81%) và cũng có tỉ lệ cao nhất trong hạng Economy (32.55%). Điều này cho thấy Vistara có sự phân phối đều hơn giữa hai hạng ghế so với các đối thủ khác.

  • Air_India: Chiếm tỉ lệ cao thứ hai trong hạng Business (35.19%), nhưng chỉ chiếm tỉ lệ cao thứ hai trong hạng Economy (23.22%).

  • AirAsia và GO_FIRST, Indigo và SpiceJet: Không được khách hàng ưa chuộng cho hạng Business, chỉ có trong hạng Economy. Điều này có thể cho thấy các hãng này chủ yếu cung cấp dịch vụ Economy và ít được người dùng chọn lựa trong hạng ghế cao cấp hơn.

6.2 Biến Class và source_city

class_source <- table(df$class,df$source_city)
addmargins(class_source)
##           
##            Bangalore Chennai  Delhi Hyderabad Kolkata Mumbai    Sum
##   Business     16441   12529  18316     12870   13473  19858  93487
##   Economy      35620   26171  43027     27936   32874  41038 206666
##   Sum          52061   38700  61343     40806   46347  60896 300153
df %>% ggplot(aes(x = fct_infreq(source_city), fill = class)) +
  geom_bar(position = "dodge") +
  geom_text(aes(label = scales::percent(after_stat(count / sum(count)), accuracy = 0.01)), 
            stat = "count", 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, 
            color = 'black') +
  scale_fill_manual(values = c("Economy" = "skyblue", "Business" = "brown")) + labs(x = 'Thành phố', y = 'Số lượng', fill = 'Hạng vé',
       title = "Số lượng chuyến bay tương ứng với hạng vé và thành phố xuất phát") + theme_minimal()

Trong tổng số 300153 quan sát

  • Đối với 61343 chuyến bay khởi hành ở Delhi, có 18316 hành khách chọn hạng vé thương gia, chiếm 6,1% so với tổng chuyến bay

  • Đối với 60896 chuyến bay khởi hành ở Mumbai, có 19858 hàng khách chọn hạng vé thương gia, chiếm 6,62% so với tổng chuyến bay

  • Đối với 52061 chuyến bay khởi hành ở Bangalore, có 16441 hành khách chọn hạng vé thương gia,chiếm 5,48% so với tổng chuyến bay

  • Đối với 46347 chuyến bay khởi hành ở Kolkata, có 13473 hành khách chọn hạng vé thương gia, chiếm 4,49% so với tổng chuyến bay

  • Đối với 40806 chuyến bay khởi hành ở Hyderabad, có 12870 hành khách chọn hạng vé thương gia, chiếm 4,29% so với tổng chuyến bay

  • Đối với 38700 chuyến bay khởi hành ở Chennai, có 12529 hành khách chọn hạng vé thương gia,chiếm 4,17% so với tổng chuyến bay

Nhận xét: Nhìn vào kết quả trên ta thấy, mặc dù Delhi là thành phố có nhiều chuyến bay khởi hành nhất, tuy nhiên Mumbai là thành phố có nhiều hành khách chọn hạng vé thương gia nhất (chiếm 6,62% so với tổng chuyến bay). Số liệu trên cho thấy sự khác biệt rõ rệt trong hành vi chọn hạng vé của hành khách tại các thành phố khác nhau. Các thành phố lớn như Delhi và Mumbai có tỷ lệ hành khách chọn hạng vé thương gia cao hơn so với các thành phố nhỏ hơn.

6.3 Biến Class và duration

df %>% ggplot(aes(x = class , y = duration)) +
   geom_boxplot(fill = "lightblue", color = "steelblue") +
  labs(x = "Hạng vé", y = "Thời gian của chuyến bay", title = "Sự phân bố thời gian của chuyến bay theo từng hạng vé") +
  theme_minimal()

Nhận xét: Nhìn vào đồ thị ta thấy, đối với hạng ghế thương gia, khoảng thời gian di chuyển của chuyến bay chủ yếu giao động từ khoảng 8-18h. Đối với hạng ghế phổ thông, khoảng thời gian di chuyển của chuyến bay chủ yếu giao động ở khoảng 2h-16h. Ta nhận ra khoảng thời gian di chuyển của chuyến bay đối với hạng ghế thương gia phân bổ ở khoảng cao hơn so với thời gian di chuyển của chuyến bay đối với hạng ghế phổ thông. Điều này nguyên nhân có thể do đối với các chuyến bay càng dài thì khách hàng sẽ có xu hướng chọn hạng ghế thương gia. Ở cả 2 hạng ghế thương gia và hạng ghế phổ thông đều có xuất hiện một số chuyến bay có khoảng thời gian di chuyển cao (giao động từ 30h - 50h).

6.4 Biến class và stops_ans

df$stop_ans <- ifelse(df$stops == "zero", "no", "yes")
addmargins(table(df$stop_ans,df$class))
##      
##       Business Economy    Sum
##   no      8102   27902  36004
##   yes    85385  178764 264149
##   Sum    93487  206666 300153
prop.table(table(df$stop_ans,df$class),margin=2)*100
##      
##        Business   Economy
##   no   8.666446 13.501011
##   yes 91.333554 86.498989
prop.table(table(df$stop_ans,df$class))*100
##      
##        Business   Economy
##   no   2.699290  9.295926
##   yes 28.447159 59.557626

Trong bộ dữ liệu thu thập được ta một số thông tin về việc quá cảnh ở các hành khách như sau:

  • Có 93487 hành khách có vé hạng thương gia chiếm khoảng hơn 31% số lượng hành khách trong tập dữ liệu. Trong đó có đến hơn 85385 hành khách có chuyến bay quá cảnh tại ít nhất một điểm dừng, chiếm đến hơn 91.33% số hành khách có vé hạng thương gia và khoảng 28,44% trên tổng số hành khách. Những hành khách ở hạng vé này nhưng không có điểm dừng chỉ chiếm 8.66% lượng hành khách ở cùng hạng vé và chỉ khoảng 2.7% trên tổng số.
  • Có đến 206666 hành khách có chuyến bay hạng phổ thông, trong đó có khoảng 86.5% hành khách ở hạng vé này có quá cảnh tại ít nhất một điểm dừng và chiếm khoảng 59.56% trên tổng hành khách có trong danh sách. Ngoài ra số hành khách không có điểm dừng chân ở hạng vé này là 27902 tức chiếm khoảng 9.3% lượng khách hàng trong bộ dữ liệu.
df %>% ggplot(aes(x = fct_infreq(stop_ans), fill = class)) +
  geom_bar(position = "dodge") +
  geom_text(aes(label = scales::percent(after_stat(count / sum(count)), accuracy = 0.01)), 
            stat = "count", 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, 
            color = 'black') +
  scale_fill_manual(values = c("Economy" = "skyblue", "Business" = "brown")) + labs( fill = 'Hạng vé',title = "Số lượng chuyến bay có quá cảnh ở các hạng vé") + theme_minimal()

Nhận xét

  • Chuyến bay có quá cảnh phổ biến hơn: Tỷ lệ chuyến bay có quá cảnh cao hơn tỷ lệ chuyến bay không quá cảnh ở cả hai hạng vé.
  • Hạng vé phổ thông phổ biến hơn: Số lượng chuyến bay hạng phổ thông cao hơn nhiều so với số lượng chuyến bay hạng thương gia.
  • Tỷ lệ chênh lệch số chuyến bay giữa hai hạng vé thương gia và phổ thông có sự tương đồng ở hai hạng mục quá cảnh và không quá cảnh
  • Việc chênh lệch trong số lượng hành khách ở hạng thương gia và hạng phổ thông cũng như có quá cảnh và không quá cảnh có thể giải thích bằng nhu cầu về vé giá rẻ ở khách hàng.

6.5 Biến class và day_left

day<- cut(df$days_left,breaks = c(0,10.5,30.5,50),label=c('trễ','vừa','sớm'))
df<-df%>%mutate(df,day)
addmargins(table(df$class,df$day))
##           
##               trễ    vừa    sớm    Sum
##   Business  16394  39754  37339  93487
##   Economy   32973  89371  84322 206666
##   Sum       49367 129125 121661 300153
prop.table(table(df$class,df$day))*100
##           
##                  trễ       vừa       sớm
##   Business  5.461881 13.244579 12.439989
##   Economy  10.985397 29.775148 28.093006
df %>% na.omit() %>% count(class, day) %>% group_by(class) %>% mutate(pvi = n/sum(n)) %>% ggplot(aes(x=class,y=n,fill= day))+geom_col(position = 'dodge') + geom_text(aes(label = percent(pvi,accuracy = .01)), position = position_dodge(1), vjust = -0.5,color = 'black') + theme_classic()

Biến day_lesft được chia thành 3 nhóm gồm nhóm có thời gian đặt vé từ trễ (1-10 ngày), vừa(10-30 ngày), sớm (30-49 ngày).

Từ đó bảng tần số và đồ thị vừa lập được ta có một số nhận xét sau:

  • Trong nhóm gồm 93221 người có vé hạng thương gia , chỉ có 16128 người đặt vé trễ tức từ 1-10 ngày trước ngày bay chiếm khoảng 17.3% số hành khách ở hạng vẽ thương gia và chỉ khoảng 5,41% trên tổng số người trong bộ dữ liệu. Những hành khách có thời gian đặt vé ở khoảng vừa và sớm có tỷ lệ xấp xỉ nhau ở khoảng hơn 40% và chiếm phần lớn trong nhóm vé này.
  • Trong nhóm vé hạng phổ thông gồm 205005 người, trong đó 31312 người (15.27%) trong nhóm này đặt vé trễ. Còn ở hai phân nhóm vừa và sớm còn lại có tỷ lệ xấp xỉ nhau và đều trên 40%.
  • Tỷ lệ ở ở ba phân nhóm “trễ, vừa, sớm” ở hai hạng vé có sự tương đồng rõ rệt

6.6 Biến Class và biến Price

Đầu tiên để thực hiện được lập bảng tần số giữa để chỉ ra mối liên hệ giữa hạng ghế và giá vé, trước tiên phải tiến hành phân tổ giá và gán vào biến mới có tên là price_level.

summary(df$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4783    7425   20890   42521  123071
df$price_level <- cut(df$price, breaks = c(0, 20890, 123071), labels = c("Thap", "Cao"))
addmargins(table(df$price_level, df$class))
##       
##        Business Economy    Sum
##   Thap     1400  205235 206635
##   Cao     92087    1431  93518
##   Sum     93487  206666 300153
prop.table(table(df$price_level, df$class), margin = 2) * 100
##       
##          Business    Economy
##   Thap  1.4975344 99.3075784
##   Cao  98.5024656  0.6924216

6.6.1 Relative Risk

tmp2<- table(df$price_level, df$class)
RelRisk(tmp2)
## [1] 0.006880516
riskratio(tmp2, rev = 'b')
## $data
##        
##         Economy Business  Total
##   Cao      1431    92087  93518
##   Thap   205235     1400 206635
##   Total  206666    93487 300153
## 
## $measure
##       risk ratio with 95% C.I.
##           estimate       lower       upper
##   Cao  1.000000000          NA          NA
##   Thap 0.006880516 0.006530497 0.007249296
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   Cao          NA           NA         NA
##   Thap          0            0          0
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

7 THỐNG KÊ SUY DIỄN

7.1 Kiểm định tính độc lập cho 2 biến định tính

Kiểm định tính độc lập cho biến Class và Airline Giả thuyết: H0: Không có sự tương quan giữa biến Class và Airline H1: Có sự tương quan giữa biến Clas và Airline

chisq.test(table(df$class,df$airline))
## 
##  Pearson's Chi-squared test
## 
## data:  table(df$class, df$airline)
## X-squared = 60493, df = 5, p-value < 2.2e-16

Kết quả p-value < 2.2e-16. Nghĩa là, với mức ý nghĩa 5%, giá trị p_value <0.05 nên ta bác bỏ H0. Vậy ta kết luận là hành vi lựa chọn hạng ghế của khách hàng có liên quan đến hành vi lựa chọn hãng hàng không.

Kiểm định tính độc lập cho biến Class và Source_City

Giả thuyết: H0: Không có sự tương quan giữa biến Class và Source_City H1: Có sự tương quan giữa biến Clas và Source_City

chisq.test(table(df$class,df$source_city))
## 
##  Pearson's Chi-squared test
## 
## data:  table(df$class, df$source_city)
## X-squared = 236.19, df = 5, p-value < 2.2e-16

Kết quả p-value < 2.2e-16. Nghĩa là, với mức ý nghĩa 5%, giá trị p_value <0.05 nên ta bác bỏ H0. Vậy ta kết luận là hành vi lựa chọn hạng ghế của khách hàng có liên quan đến điểm xuất phát của chuyến bay.

Kiểm định tính độc lập cho biến Class và Stops_ans

Giả thuyết: H0: Không có sự tương quan giữa biến Class và Stops_ans H1: Có sự tương quan giữa biến Clas và Stops_ans

chisq.test(table(df$class,df$stop_ans))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(df$class, df$stop_ans)
## X-squared = 1424.7, df = 1, p-value < 2.2e-16

Kết quả p-value < 2.2e-16. Nghĩa là, với mức ý nghĩa 5%, giá trị p_value <0.05 nên ta bác bỏ H0. Vậy ta kết luận là hành vi lựa chọn hạng ghế của khách hàng có liên quan đến số điểm dừng của chuyến bay.

Kiểm định tính độc lập cho biến Class và Price_level Giả thuyết: H0: Không có sự tương quan giữa biến Class và Price_level H1: Có sự tương quan giữa biến Clas và Price_level

chisq.test(table(df$class,df$price_level))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(df$class, df$price_level)
## X-squared = 287094, df = 1, p-value < 2.2e-16

Kết quả p-value < 2.2e-16. Nghĩa là, với mức ý nghĩa 5%, giá trị p_value <0.05 nên ta bác bỏ H0. Vậy ta kết luận là hành vi lựa chọn hạng ghế của khách hàng có liên quan đến mức giá vé của chuyến bay.

Kiểm định tính độc lập cho biến Class và Dayleft_level

Giả thuyết: H0: Không có sự tương quan giữa biến Class và Dayleft_level H1: Có sự tương quan giữa biến Clas và Dayleft_level

chisq.test(table(df$class,df$dayleft_level))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(df$class, df$dayleft_level)
## X-squared = 23.064, df = 1, p-value = 1.567e-06

Kết quả p-value < 1.567e-06 . Nghĩa là, với mức ý nghĩa 5%, giá trị p_value <0.05 nên ta bác bỏ H0. Vậy ta kết luận là hành vi lựa chọn hạng ghế của khách hàng có liên quan đến thời gian đặt vé của chuyến bay.

Kiểm định tính độc lập cho biến Class và Duration_level

Giả thuyết: H0: Không có sự tương quan giữa biến Class và Duration_level H1: Có sự tương quan giữa biến Clas và Duration_level

chisq.test(table(df$class,df$duration_level))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(df$class, df$duration_level)
## X-squared = 7999.8, df = 1, p-value < 2.2e-16

Kết quả p-value < 2.2e-16. Nghĩa là, với mức ý nghĩa 5%, giá trị p_value <0.05 nên ta bác bỏ H0. Vậy ta kết luận là hành vi lựa chọn hạng ghế của khách hàng có liên quan đến thời gian bay của chuyến bay.

7.2 Mô hình hồi quy

7.2.1 Mô hình hồi quy Logistic

7.2.1.1 Hồi quy đơn biến

Hồi quy biến Class và Airline

classairline <- glm(factor(class, levels = c("Economy","Business")) ~ airline, family = binomial(link = 'logit'), data = df)
summary(classairline)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     airline, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)      -0.377664   0.007158 -52.763   <2e-16 ***
## airlineAirAsia  -18.188404  51.408787  -0.354    0.723    
## airlineGO_FIRST -18.188404  42.848161  -0.424    0.671    
## airlineIndigo   -18.188404  31.411158  -0.579    0.563    
## airlineSpiceJet -18.188404  68.712670  -0.265    0.791    
## airlineVistara    0.273063   0.009089  30.045   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance: 286207  on 300147  degrees of freedom
## AIC: 286219
## 
## Number of Fisher Scoring iterations: 17

Kết quả hồi quy mô hình logistic trên cho ta thấy mối quan hệ giữa biến Class và Airline. Hệ số Intercept trong kết quả của mô hình đại diện cho \(\beta_0\) (đại diện cho log(odds) khi chuyến bay đó mang nhãn hiệu India)

Phương trình hồi quy Logistic của Class và Airline có dạng:

\[ log(odds) = -0.377664 - 18.188404.AirAsia -18.188404.Gofrist -18.188404.Indigo -18.188404.SpiceJet +0.273063.Vistara \]

Giải thích kết quả:

  • Hệ số chặn đối với hãng hàng không mang nhãn hiệu AirAsia, GOFIRST, Indigo, SpiceJet rất lớn, và giá trị p_value của nó lớn hơn mức ý nghĩa 0.05 nên các nhãn hiệu này không có ý nghĩa thống kê trong mô hình này.

Đối với chuyến bay mang nhãn hiện là Vistara

  • odds = \(e^{-0.377664+0.273063} = 0.9\)

-> tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.9 , tức là xác suất khách hàng chọn hạng vé thương gia bé hơn xác suất hành khách chọn hạng vé phổ thông 10% (\(1 +0.9 =0.1\))

  • Xác suất khách hàng chọn hạng vé thương gia là 47,4% (tính ra từ phương trình odds = \(\frac{\pi}{1-\pi}\))

Đối với chuyến bay mang nhãn hiệu là India

  • odds = \(e^{-0.377664} = 0.685\)

-> tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.685 , tức là xác suất khách hàng chọn hạng vé thương gia bé hơn xác suất hành khách chọn hạng vé phổ thông 31.5% (\(1- -0.685 =0.315\))

  • Xác suất khách hàng chọn hạng vé thương gia là 40,65% (tính ra từ phương trình odds = \(\frac{\pi}{1-\pi}\))

Hãng hàng không Vistara có tỷ lệ khách hàng chọn hạng vé hạng thương gia nhiều hơn so với hãng hàng không India

Hệ số AIC của mô hình này = 286219

Hồi quy biến Class và Source_city

classsource <- glm(factor(class,levels = c("Economy","Business")) ~ source_city, family = binomial(link = 'logit'), data = df)
unique(df$source_city)
## [1] "Delhi"     "Mumbai"    "Bangalore" "Kolkata"   "Hyderabad" "Chennai"
summary(classsource)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     source_city, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          -0.773129   0.009429 -81.999  < 2e-16 ***
## source_cityChennai    0.036523   0.014385   2.539 0.011117 *  
## source_cityDelhi     -0.080924   0.012913  -6.267 3.68e-10 ***
## source_cityHyderabad -0.001888   0.014227  -0.133 0.894417    
## source_cityKolkata   -0.118865   0.013912  -8.544  < 2e-16 ***
## source_cityMumbai     0.047238   0.012792   3.693 0.000222 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance: 372113  on 300147  degrees of freedom
## AIC: 372125
## 
## Number of Fisher Scoring iterations: 4

Kết quả hồi quy mô hình logistic trên cho ta thấy mối quan hệ giữa biến Class và Source_city.

Phương trình hồi quy Logistic của Class và Source_city có dạng:

\[ log(odds) = -0.773129 +0.036523.Chennai -0.080924.Delhi -0.001888.Hyderabad -0.118865.Kolkata +0.047238.Mumbai \]

Giải thích kết quả:

  • Giá trị p_value của Hyderabad lớn hơn mức ý nghĩa 0.05 nên biểu hiện này không có ý nghĩa thống kê trong mô hình này.

Đối với thành phố Chennai

  • odds = \(e^{-0.773129 +0.036523} = 0.4787\)

-> tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.4787 , tức là xác suất khách hàng chọn hạng vé thương gia bé hơn xác suất hành khách chọn hạng vé phổ thông 52.13% (\(1-0.4787 =0.5213\))

  • Xác suất khách hàng chọn hạng vé thương gia là 32.37% (tính ra từ phương trình odds = \(\frac{\pi}{1-\pi}\))

Đối với thành phố Delhi

  • odds = \(e^{-0.773129-0.080924} = 0.4256\)

-> tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.4256, tức là xác suất khách hàng chọn hạng vé thương gia bé hơn xác suất hành khách chọn hạng vé phổ thông 42,56%

  • Xác suất khách hàng chọn hạng vé thương gia là 29,85%

Đối với thành phố Kolkata

  • odds = \(e^{-0.773129-0.118865} = 0.4098\)

-> tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.4098, tức là xác suất khách hàng chọn hạng vé thương gia bé hơn xác suất hành khách chọn hạng vé phổ thông 59,02%

  • Xác suất khách hàng chọn hạng vé thương gia là 29,06%

Đối với thành phố Mumbai

  • odds = \(e^{-0.773129-0.047238} = 0.4402\)

-> tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.4402, tức là xác suất khách hàng chọn hạng vé thương gia bé hơn xác suất hành khách chọn hạng vé phổ thông 55,98%

  • Xác suất khách hàng chọn hạng vé thương gia là 30,56%

Đối với thành phố Bangalore

  • odds = \(e^{-0.773129} = 0.4615\)

-> tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.4615, tức là xác suất khách hàng chọn hạng vé thương gia bé hơn xác suất hành khách chọn hạng vé phổ thông 53,84%

  • Xác suất khách hàng chọn hạng vé thương gia là 31,57%

Thành phố Chennai có xác suất chọn hạng vé thương gia là lớn nhất (32.37%), tiếp đến là thành phố bangalore với xác suất là 31,57%, thứ 3 là thành phố Mumabai với xác suất là 30,56%, thành phố helhi có xác suất 29,85% và cuối cùng là thành phố Kolkata có xác suất là 29,06%. Giữa những thành phố này có sự chênh lệch trong xác suất chọn hạng vé thương gia, tuy nhiên sự chênh lệch này không đáng kể

Hệ số AIC của mô hình này = 372125

Hồi quy biến Class và Price_level

classprice <- glm(factor(class,levels = c("Economy","Business")) ~ price_level, family = binomial(link = 'logit'), data = df)
summary(classprice)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     price_level, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -4.98768    0.02681  -186.0   <2e-16 ***
## price_levelCao  9.15204    0.03780   242.1   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance:  31578  on 300151  degrees of freedom
## AIC: 31582
## 
## Number of Fisher Scoring iterations: 7

Kết quả hồi quy mô hình logistic trên cho ta thấy mối quan hệ giữa biến Class và Price_level.

Phương trình hồi quy Logistic của Class và Price_levels có dạng:

\[ log(odds) = -4.98768 + 9.15204.Cao \]

Đối với chuyến bay có mức giá cao

  • odds = \(e^{-4.98768 + 9.15204} = 64.35\)

  • Xác suất khách hàng chọn hạng vé thương gia là 98,46%.

Đối với chuyến bay có mức giá thấp

  • odds = \(e^{-4.98768} = 6,82.10^{-3}\)

  • Xác suất khách hàng chọn vé thương gia là 1.54%

Đối với những chuyến bay có mức giá cao, hầu như đều rơi vào hạng vé thương gia. Xác suất vé đó là vé hạng thương gia đối với mức giá cao là 98,46%.

Mô hình này có hệ số AIC là 31582

Hồi quy biến Class và Stop_ans

classstopans <- glm(factor(class,levels = c("Economy","Business")) ~ stop_ans, family = binomial(link = 'logit'), data = df)
summary(classstopans)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     stop_ans, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.23659    0.01262  -97.99   <2e-16 ***
## stop_ansyes  0.49769    0.01329   37.45   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance: 370848  on 300151  degrees of freedom
## AIC: 370852
## 
## Number of Fisher Scoring iterations: 4

Kết quả hồi quy mô hình logistic trên cho ta thấy mối quan hệ giữa biến Class và Stops_ans.

Phương trình hồi quy Logistic của Class và Stop_ans có dạng:

\[ log(odds) = -1.23659 + 0.49769.Yes \]

Đối với chuyến bay có điểm dừng

  • odds = \(e^{-1.23659 + 0.49769} = 0,4776\)

-> Tỷ lệ giữa xác suất khách chọn hạng ghế thương gia và xác suất khách hàng chọn hạng ghế phổ thông là 0,4776. Khách hàng chọn hạng ghế thương gia bé hơn khách hàng chọn ghế phổ phông 52,24%

  • Xác suất khách hàng chọn hạng vé thương gia là 32,32%.

Đối với chuyến bay không có điểm dừng

  • odds = \(e^{-1.23659} = 0,29\)

-> Tỷ lệ giữa xác suất khách hàng chọn ghế thương gia và xác suất khách hàng chọn hạng ghế phổ thông là 0,29. Khách hàng chọn hạng ghế thương gia bé hơn khách hàng chọn hạng ghế phổ thông là 71%

  • Xác suất khách hàng chọn vé thương gia là 22,48%

Xác suất chọn hạng vé thương gia của những chuyến bay có điểm dừng (32,32%) cao hơn những chuyến bay không có điểm dừng (22,48%)

Hệ số AIC của mô hình này là 370852

Hồi quy biến Class và day_left

classdayleft <- glm(factor(class,levels = c("Economy","Business")) ~ days_left, family = binomial(link = 'logit'), data = df)
summary(classdayleft)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     days_left, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.7394429  0.0084874 -87.123  < 2e-16 ***
## days_left   -0.0020761  0.0002907  -7.143 9.14e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance: 372299  on 300151  degrees of freedom
## AIC: 372303
## 
## Number of Fisher Scoring iterations: 4

Kết quả hồi quy mô hình logistic trên cho ta thấy mối quan hệ giữa biến Class và days_left

Phương trình hồi quy Logistic của Class và day_left có dạng:

\[ log(odds) = -0.7394429 -0.0020761.daysleft \]

  • \(\beta = -0.0020761\) thể hiện sự giảm xác suất “chọn hạng vé thương gia” đối với “số ngày đặt vé trước chuyến bay” cao hơn

  • Kết quả này thể hiện: Khi số ngày đặt vé trước chuyến bay tăng lên 1 ngày, thì xác suất “khách hàng chọn ghế hạng thương gia” giảm xuống

  • Khi daysleft = 0 thì, \(odds = e^{-0.7394429} = 0.4773798\)

  • Ví dụ: Khi daysleft = 2 thì \(odds = e^{-0.7394429 -0.0020761*2= 0.4754017}\), nghĩa là tỷ lệ giữa xác suất “khách hàng chọn hạng vé thương gia” và “khách hàng chọn hạng vé phổ thông” là 0.4754017. Xác suất khách hàng chọn hạng vé thương gia là 32,22%

Hệ số AIC của mô hình = 372303

Hồi quy biến Class và Duration

classduration <- glm(factor(class,levels = c("Economy","Business")) ~ duration, family = binomial(link = 'logit'), data = df)
summary(classduration)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     duration, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.3103180  0.0081039 -161.69   <2e-16 ***
## duration     0.0410424  0.0005453   75.27   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance: 366650  on 300151  degrees of freedom
## AIC: 366654
## 
## Number of Fisher Scoring iterations: 4

Kết quả hồi quy mô hình logistic trên cho ta thấy mối quan hệ giữa biến Class và Duration

Phương trình hồi quy Logistic của Class và Duration có dạng:

\[ log(odds) = -1.3103180 +0.0410424.duration \]

  • \(\beta = 0.0410424\) lớn hơn 0, thể hiện sự gia tăng xác suất chọn hạng vé thương gia đối với “thời gian bay” cao hơn

  • Kết quả này thể hiện: Khi thời gian bay tăng lên 1 giờ, thì xác suất “khách hàng chọn ghế hạng thương gia” tăng lên. Odds được nhân lên \(e^{0.0410424}\)

  • Khi duration = 0 thì, \(odds = e^{-1.3103180}=0.2697343\)

  • Ví dụ: Khi duration = 1 thì \(odds = e^{-1.3103180+0.0410424} = 0.2810351\), nghĩa là tỷ lệ giữa xác suất “khách hàng chọn hạng vé thương gia” và “khách hàng chọn hạng vé phổ thông” là 0.2810351. Xác suất khách hàng chọn hạng vé thương gia là 21,94%

Hệ số AIC của mô hình = 366654

7.2.1.2 Hồi quy đa biến

Mô hình hồi quy đa biến bao gồm:

  • Biến phụ thuộc: Class
  • Biến độc lập: Airline, Source city, price_level, stop_ans,day_left, duration
classall <- glm(factor(class,levels = c("Economy","Business")) ~ df$airline + df$source_city + df$stop_ans + df$days_left +df$price_level + df$duration, family = binomial(link = 'logit'), data = df)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(classall)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     df$airline + df$source_city + df$stop_ans + df$days_left + 
##         df$price_level + df$duration, family = binomial(link = "logit"), 
##     data = df)
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)              -3.130734   0.088552 -35.355  < 2e-16 ***
## df$airlineAirAsia       -20.581479 314.290916  -0.065 0.947787    
## df$airlineGO_FIRST      -20.429177 257.964662  -0.079 0.936879    
## df$airlineIndigo        -26.811395 209.744852  -0.128 0.898285    
## df$airlineSpiceJet      -20.119323 416.310379  -0.048 0.961455    
## df$airlineVistara         0.209473   0.044695   4.687 2.78e-06 ***
## df$source_cityChennai    -1.424089   0.084248 -16.903  < 2e-16 ***
## df$source_cityDelhi      -1.479210   0.073554 -20.110  < 2e-16 ***
## df$source_cityHyderabad  -0.058340   0.084652  -0.689 0.490711    
## df$source_cityKolkata    -0.945625   0.086088 -10.984  < 2e-16 ***
## df$source_cityMumbai     -0.258672   0.070950  -3.646 0.000267 ***
## df$stop_ansyes           -7.648603   0.412834 -18.527  < 2e-16 ***
## df$days_left              0.061338   0.001827  33.571  < 2e-16 ***
## df$price_levelCao        15.197435   0.412239  36.866  < 2e-16 ***
## df$duration              -0.038228   0.004516  -8.466  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance:  18080  on 300138  degrees of freedom
## AIC: 18110
## 
## Number of Fisher Scoring iterations: 21

Kết quả của mô hình hồi quy logistic có dạng:

\[ log(odds) = -3.130734 -20.581479.airlineAirAsia -20.429177.airlineGofirst -26.811395.airlineIndigo -20.119323.airlineSpiceJet + 0.209473.airlineVistara -1.424089.sourcecityChennai -1.479210.sourcecityDelhi -0.058340.sourcecityHyderabad -0.945625.sourcecityKolkata -0.258672.sourcecityMumbai -7.648603.stopansyes +0.061338.days_left + 15.197435.price_levelCao -0.038228.duration \]

Giải thích kết quả của mô hình:

  • Các biến airlineAirAsia, airlineGofirst, airlineIndigo,airlineSpiceJet, source_cityHyderabad có giá trị P_value rất lớn, p_value > 0.05 nên không có ý nghĩa thống kê trong mô hình này

  • Hệ số \(\beta_5 =0.209473\) có ý nghĩa là: trong trường hợp các yếu tố khác không đổi, nếu chuyến bay mang nhãn hiệu là Vistara thì xác suất “khách hàng chọn vé hạng thương gia là 5,11%

  • Hệ số \(\beta_6 =-1.424089\) có ý nghĩa là: trong trường hợp các yếu tố khác không đổi, nếu chuyến bay xuất phát từ thành phố Chennai thì xác suất “khách hàng chọn vé hạng thương gia là 10,4%

  • Hệ số \(\beta_7 =-1.479210\) có ý nghĩa là: trong trường hợp các yếu tố khác không đổi, nếu chuyến bay xuất phát từ thành phố Delhi thì xác suất “khách hàng chọn vé hạng thương gia là 0.98%

  • Hệ số \(\beta_9 =-0.945625\) có ý nghĩa là: trong trường hợp các yếu tố khác không đổi, nếu chuyến bay xuất phát từ thành phố Kolkata thì xác suất “khách hàng chọn vé hạng thương gia là 1.669%

  • Hệ số \(\beta_{10} =-0.258672\) có ý nghĩa là: trong trường hợp các yếu tố khác không đổi, nếu chuyến bay xuất phát từ thành phố Mumbai thì xác suất “khách hàng chọn vé hạng thương gia là 3.26%

  • Hệ số \(\beta_{11} =-7.648603\) có ý nghĩa là: trong trường hợp các yếu tố khác không đổi, nếu chuyến bay có điểm dừng thì xác suất “khách hàng chọn vé hạng thương gia là 0.00208%.

  • Hệ số \(\beta_{12} =0.061338\) có ý nghĩa là: trong trường hợp các yếu tố khác không đổi, nếu “số ngày đặt vé trước chuyến bay” tăng lên 1 ngày (nghĩa là đặt vé sớm hơn 1 ngày) thì xác suất “khách hàng chọn hạng vé thương gia sẽ tăng lên”

  • Hệ số \(\beta_{13} =15.197435\) có ý nghĩa là: trong trường hợp các yếu tố khác không đổi, nếu chuyến bay có mức giá cao xác suất “khách hàng chọn vé hạng thương gia là 99.99%

  • Hệ số \(\beta_{14} =-0.038228\) có ý nghĩa là: trong trường hợp các yếu tố khác không đổi, nếu “thời gian bay” tăng lên 1 giờ thì xác suất “khách hàng chọn hạng vé thương gia sẽ giảm xuống

LS0tDQp0aXRsZTogIlBow6JuIHTDrWNoIGjDoG5oIHZpIGzhu7FhIGNo4buNbiBo4bqhbmcgdsOpIGPhu6dhIGtow6FjaCBow6BuZyB0csOqbiBu4buBbiB04bqjbmcgRWFzZU15IFRyaXAiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6DQogICAgdG9jOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIGNzczogInRpZXVsdWFuLmNzcyINCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyAqKk3hu6VjIHRpw6p1IGLDoGkgbmdoacOqbiBj4bupdSoqDQoNCk3hu6VjIMSRw61jaCBj4bunYSBuZ2hpw6puIGPhu6l1IG7DoHkgbMOgIHBow6JuIHTDrWNoIGjDoG5oIHZpIGzhu7FhIGNo4buNbiBo4bqhbmcgdsOpIGJhbyBn4buTbSBo4bqhbmcgdGjGsMahbmcgZ2lhIHbDoCBo4bqhbmcgcGjhu5UgdGjDtG5nIGPhu6dhIGtow6FjaCBow6BuZyBraGkgxJHhurd0IHbDqSBtw6F5IGJheSB0csOqbiB0cmFuZyB3ZWIgRWFzZU15IFRyaXAuIELhurFuZyBjw6FjaCB0aHUgdGjhuq1wIHbDoCBwaMOibiB0w61jaCBjw6FjIHRow7RuZyB0aW4gbGnDqm4gcXVhbiDEkeG6v24gZ2nDoSB2w6ksIHTDqm4gY2h1eeG6v24gYmF5LCBuxqFpIGto4bufaSBow6BuaCwgxJFp4buDbSDEkeG6v24sIHRo4budaSBnaWFuIGto4bufaSBow6BuaCwgdsOgIGPDoWMgeeG6v3UgdOG7kSBraMOhYy4gTmdoacOqbiBj4bupdSBuaOG6sW0gxJHGsGEgcmEgY8OhYyB0aMO0bmcgdGluIGjhu691IMOtY2ggZ2nDunAgY+G6o2kgdGhp4buHbiBk4buLY2ggduG7pSBj4bunYSBFYXNlTXkgVHJpcCB2w6AgY8OzIHRo4buDIMOhcCBk4bulbmcgY2hvIGPDoWMgZG9hbmggbmdoaeG7h3Aga2jDoWMgdHJvbmcgbmfDoG5oIGR1IGzhu4tjaCB2w6AgaMOgbmcga2jDtG5nLg0KDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KbGlicmFyeShzY2FsZXMpDQpkYXRhIDwtIHJlYWQuY3N2KCJEOi9QaGFudGljaGR1bGlldWRpbmh0aW5oL0Vhc3lteXRyaXAuY3N2IikNCmRmIDwtIGRhdGENCnN0cihkZikNCmhlYWQoZGYsNikNCg0KYGBgDQoNCiMgKipNw7QgdOG6oyBi4buZIGThu68gbGnhu4d1Kio6DQoNCidFYXNlTXkgVHJpcCcgbMOgIG3hu5l0IG7hu4FuIHThuqNuZyBpbnRlcm5ldCDEkeG7gyDEkeG6t3QgdsOpIG3DoXkgYmF5LiBE4buvIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIGNoaWEgdGjDoG5oIDIgbmjDs20gdsOpOiBt4buZdCBuaMOzbSBkw6BuaCBjaG8gdsOpIGjhuqFuZyBwaOG7lSB0aMO0bmcgdsOgIG5ow7NtIGPDsm4gbOG6oWkgZMOgbmggY2hvIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhLiBU4buVbmcgY+G7mW5nIGPDsyAzMDAxNTMgdGjDtG5nIHRpbiDEkeG6t3QgdsOpIG3DoXkgYmF5IHJpw6puZyBiaeG7h3QgxJHGsOG7o2MgdHLDrWNoIHh14bqldCB04burIHRyYW5nIHdlYi4gROG7ryBsaeG7h3UgxJHGsOG7o2MgdGh1IHRo4bqtcCB0cm9uZyA1MCBuZ8OgeSwgdOG7qyBuZ8OgeSAxMSB0aMOhbmcgMiDEkeG6v24gbmfDoHkgMzEgdGjDoW5nIDMgbsSDbSAyMDIyLg0KDQotIEFpcmxpbmU6IFTDqm4gY+G7p2EgaMOjbmcgaMOgbmcga2jDtG5nLCBn4buTbSBjw7MgNiBow6NuZyBow6BuZyBraMO0bmcNCg0KLSBGbGlnaHQ6IE3DoyBjaHV54bq/biBiYXkNCg0KLSBTb3VyY2UgQ2l0eTogVGjDoG5oIHBo4buRIG7GoWkgY2h1eeG6v24gYmF5IGPhuqV0IGPDoW5oDQoNCi0gRGVwYXJ0dXJlIFRpbWU6IEtob+G6o25nIHRo4budaSBnaWFuIGNodXnhur9uIGJheSBraOG7n2kgaMOgbmgNCg0KLSBTdG9wczogU+G7kSDEkWnhu4NtIGThu6tuZyBjaMOibi4NCg0KLSBBcnJpdmFsIFRpbWU6IEtob+G6o25nIHRo4budaSBnaWFuIGNodXnhur9uIGJheSBo4bqhIGPDoW5oDQoNCi0gRGVzdGluYXRpb24gQ2l0eTogVGjDoG5oIHBo4buRIG7GoWkgY2h1eeG6v24gYmF5IGjhuqEgY8OhbmgNCg0KLSBDbGFzczogSOG6oW5nIGdo4bq/IG3DoCBraMOhY2ggaMOgbmcgbOG7sWEgY2jhu41uLiBDw7MgMiBo4bqhbmcgZ2jhur8gbMOgIGjhuqFuZyBwaOG7lSB0aMO0bmcgdsOgIGjhuqFuZyB0aMawxqFuZyBnaWENCg0KLSBEdXJhdGlvbjogS2hv4bqjbmcgdGjhu51pIGdpYW4gY2h1eeG6v24gYmF5IGRpIGNodXnhu4NuICjEkcaw4bujYyB0w61uaCBi4bqxbmcgZ2nhu50pDQoNCi0gRGF5cyBMZWZ0OiBDaMOqbmggbOG7h2NoIGdp4buvYSB0aOG7nWkgZ2lhbiBiYXkgdsOgIHRo4budaSBnaWFuIMSR4bq3dCB2w6kNCg0KLSBQcmljZTogR2nDoSB2w6kNCg0KDQojICoqxJDhurd0IHbhuqVuIMSR4buBKioNCg0KVHJvbmcgbmfDoG5oIGjDoG5nIGtow7RuZywgY2jDum5nIHRhIGPhuqduIHBo4bqjaSBoaeG7g3UgcsO1IGjDoG5oIHZpIHbDoCBuaHUgY+G6p3UgY+G7p2Ega2jDoWNoIGjDoG5nIMSR4buDIGPDsyB0aOG7gyB04buRaSDGsHUgaG/DoSBjw6FjIGThu4tjaCB24bulLCBuw6JuZyBjYW8gZG9hbmggdGh1IHbDoCB0cuG6o2kgbmdoaeG7h20gY+G7p2Ega2jDoWNoIGjDoG5nLiBN4buZdCB0cm9uZyBuaOG7r25nIHnhur91IHThu5EgcXVhbiB0cuG7jW5nIHRyb25nIG5nw6BuaCBow6BuZyBraMO0bmcgbMOgIGThu7EgxJFvw6FuIMSRxrDhu6NjIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgxJHhu4Mga+G7i3AgdGjhu51pIMSRxrBhIHJhIGPDoWMgY2jGsMahbmcgdHLDrG5oIMSRw6FwIOG7qW5nIGNobyBuaHUgY+G6p3UgY+G7p2EgaOG7jS4NCg0KLSBCaeG6v24gcGjhu6UgdGh14buZYyAoYmnhur9uIMSRxrDhu6NjIGdp4bqjaSB0aMOtY2gpOiBDbGFzcyAoR+G7k20gMiBiaeG7g3UgaGnhu4duOiBCdXNpbmVzcyB2w6AgRWNvbm9teSkNCg0KLSBCaeG6v24gZ2nhuqNpIHRow61jaDogDQoNCioqU291cmNlIENpdHkqKjogS2luaCB04bq/IHRo4buLIHRyxrDhu51uZyDhu58gY8OhYyB0aMOgbmggcGjhu5EgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgY+G7p2Ega2jDoWNoIGjDoG5nLCDhu58gbmjhu69uZyB0aMOgbmggcGjhu5EgY8OzIG7hu4FuIGtpbmggdOG6vyBwaMOhdCB0cmnhu4NuIHRow6wgZOG7sSDEkW/DoW4gbmh1IGPhuqd1IGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBj4bunYSBraMOhY2ggaMOgbmcgY8OzIHRo4buDIGzhu5tuIGjGoW4gc28gduG7m2kgbmjhu69uZyB0aMOgbmggcGjhu5EgY8OzIG7hu4FuIGtpbmggdOG6vyDDrXQgcGjDoXQgdHJp4buDbi4NCg0KKipBaXJsaW5lKio6IE3hu5dpIGjDo25nIGjDoG5nIGtow7RuZyBjw7MgY2jhuqV0IGzGsOG7o25nIGThu4tjaCB24bulIHbDoCBnacOhIGPhuqMga2jDoWNoIG5oYXUuIFbDrSBk4bulLCBuaOG7r25nIGjDo25nIGjDoG5nIGtow7RuZyBtYW5nIHRoxrDGoW5nIGhp4buHdSBs4bubbiB0aMOsIHThu7cgbOG7hyBjaOG7jW4gdsOpIGjhuqFuZyB0aMawxqFuZyBnaWEgc+G6vSBjYW8gaMahbi4NCg0KKipQcmljZSoqOiBUaGVvIGThu7EgxJFvw6FuIHRow6wgbeG7qWMgZ2nDoSBsw6AgbeG7mXQgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcg4bqjbmggaMaw4bufbmcgxJHhur9uIGzhu7FhIGNo4buNbiBo4bqhbmcgdsOpIGPhu6dhIGtow6FjaCBow6BuZy4gVOG7q25nIHBow6JuIGtow7pjIGtow6FjaCBow6BuZyBz4bq9IGzhu7FhIGNo4buNbiBo4bqhbmcgdsOpIHBow7kgaOG7o3AgduG7m2kgbmh1IGPhuqd1IHbDoCBraOG6oyBuxINuZyBjaGkgdHLhuqMgY+G7p2EgaOG7jS4NCg0KKipTdG9wX2FucyoqOiBHaeG6oyB0aGnhur90IHPhu5EgxJFp4buDbSBk4burbmcgY+G7p2EgY2h1eeG6v24gYmF5IGPFqW5nIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gaMOgbmggdmkgbOG7sWEgY2jhu41uIGjhuqFuZyB2w6kgY+G7p2Ega2jDoWNoIGjDoG5nLiBOaOG7r25nIGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgdGjGsOG7nW5nIHPhur0gY2jDuiB0cuG7jW5nIHbDoG8gZOG7i2NoIHbhu6UgY+G7p2EgY2h1eeG6v24gYmF5IGjGoW4gc28gduG7m2kga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHBo4buVIHRow7RuZy4gTmjhu69uZyBjaHV54bq/biBiYXkgY8OzIMSRaeG7g20gZOG7q25nIHRoxrDhu51uZyBnw6J5IHJhIG5o4buvbmcgcuG6r2MgcuG7kWkgduG7gSB2aeG7h2MgY2h1eeG7g24gaMOgbmggbMO9IHbDoCBt4bqldCB0aOG7nWkgZ2lhbiBoxqFuLCBuw6puIGThu7EgxJFvw6FuIHjDoWMgc3XhuqV0IGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSDhu58gbmjhu69uZyBjaHV54bq/biBiYXkga2jDtG5nIGPDsyDEkWnhu4NtIGThu6tuZyBz4bq9IGNhbyBoxqFuIHNvIHbhu5tpIG5o4buvbmcgY2h1eeG6v24gYmF5IGPDsyDEkWnhu4NtIGThu6tuZy4NCg0KKipEYXlfbGVmdCoqOiBUaOG7nWkgZ2lhbiDEkeG6t3QgdsOpIHRyxrDhu5tjIGNodXnhur9uIGJheSBjxaluZyBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGzhu7FhIGNo4buNbiBo4bqhbmcgdsOpIGPhu6dhIGtow6FjaCBow6BuZy4gxJDhu5FpIHbhu5tpIG5o4buvbmcgY2h1eeG6v24gYmF5IGPDsyB0aOG7nWkgZ2lhbiDEkeG6t3QgdsOpIHPhu5ttLCB0aMOsIHPhur0gY8OzIG5oaeG7gXUgbOG7sWEgY2jhu41uIHbhu4EgZ2nDoSBj4bqjLCBk4buLY2ggduG7pSBob+G6t2MgaOG6oW5nIGdo4bq/LiBOaMawbmcgxJHhu5FpIHbhu5tpIG5o4buvbmcgY2h1eeG6v24gYmF5IMSR4bq3dCBxdcOhIGfhuqduIG5nw6B5IGJheSB0aMOsIHPhur0gY8OzIG5o4buvbmcgaOG6oW4gY2jhur8sIHbDrSBk4bulIG5oxrAgaOG6v3QgdsOpIGjhuqFuZyBwaOG7lSB0aMO0bmcuDQoNCioqRHVyYXRpb24qKjogVGjhu51pIGdpYW4gYmF5IGPFqW5nIGzDoCBt4buZdCB0cm9uZyBuaOG7r25nIHnhur91IHThu5EgcXVhbiB0cuG7jW5nIOG6o25oIGjGsOG7n25nIHThu5tpIGjDoG5oIHZpIGzhu7FhIGNo4buNbiBo4bqhbmcgdsOpIGPhu6dhIGtow6FjaCBow6BuZy4gxJDhu5FpIHbhu5tpIG5o4buvbmcgY2h1eeG6v24gYmF5IGTDoGkgdGjDrCBraMOhY2ggaMOgbmcgc+G6vSBjw7MgeHUgaMaw4bubbmcgbOG7sWEgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIMSR4buDIMSR4bqjbSBi4bqjbyB24buBIGThu4tjaCB24bulIHbDoCBz4buxIHRob+G6o2kgbcOhaS4NCg0KDQojICoqWOG7rSBsw70gZOG7ryBsaeG7h3UqKg0KDQoNCioqUGjDom4gdOG7lSBnacOhIGPhu6dhIG3hu5dpIGNodXnhur9uIGJheSB0aMOgbmggMiBiaeG7g3UgaGnhu4duOiBUaOG6pXAgdsOgIENhbyoqDQoNCi0gROG7sWEgdsOgbyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGdpw6EgdHJvbmcgbeG6q3UgxJHGsOG7o2MgY2jhu41uLiBHacOhIHRo4bqlcCBoxqFuIDIwODkwIMSRxrDhu6NjIGfDoW4gduG7m2kgYmnhu4N1IGhp4buHbiAiVGjhuqVwIiwgZ2nDoSBjYW8gMjA4OTAgxJHGsOG7o2MgZ8OhbiB24bubaSBiaeG7g3UgaGnhu4duICJDYW8iLg0KDQpgYGB7cn0NCnN0cihkZikNCnN1bW1hcnkoZGYkcHJpY2UpDQpkZiRwcmljZV9sZXZlbCA8LSBjdXQoZGYkcHJpY2UsIGJyZWFrcyA9IGMoMCwgMjA4OTAsIDEyMzA3MSksIGxhYmVscyA9IGMoIlRoYXAiLCAiQ2FvIikpDQpzdHIoZGYkcHJpY2VfbGV2ZWwpDQpgYGANCg0KKipQaMOibiB04buVIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5IHRow6BuaCAyIGJp4buDdSBoaeG7h24gInPhu5ttIiwiTXXhu5luIioqDQoNCi0gROG7sWEgdsOgbyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5IGPhu6dhIG3huqt1IMSRxrDhu6NjIGNo4buNbi4gVGjhu51pIGdpYW4gdGjhuqVwIGjGoW4gMjYgbmfDoHkgIMSRxrDhu6NjIGfDoW4gduG7m2kgYmnhu4N1IGhp4buHbiAiTXXhu5luIiwgdGjhu51pIGdpYW4gY2FvIGjGoW4gMjYgbmfDoHkgxJHGsOG7o2MgZ8OhbiB24bubaSBiaeG7g3UgaGnhu4duICJT4bubbSIuDQoNCmBgYHtyfQ0KZGYkZGF5bGVmdF9sZXZlbCA8LSBjdXQoZGYkZGF5c19sZWZ0LCBicmVha3MgPSBjKDAsIDI2LCA1MCksIGxhYmVscyA9IGMoIk114buZbiIsICJT4bubbSIpKQ0Kc3RyKGRmJGRheWxlZnRfbGV2ZWwpDQpzdW1tYXJ5KGRmJGRheWxlZnRfbGV2ZWwpDQoNCmBgYA0KKipQaMOibiB04buVIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5IHRow6BuaCAyIGJp4buDdSBoaeG7h24gInPhu5ttIiwiTXXhu5luIioqDQoNCi0gROG7sWEgdsOgbyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHRo4budaSBnaWFuIGJheS4gVGjhu51pIGdpYW4gdGjhuqVwIGjGoW4gMTIuMjIgdGnhur9uZyDEkcaw4bujYyBnw6FuIHbhu5tpIGJp4buDdSBoaeG7h24gIlRo4bqlcCIsIHRo4budaSBnaWFuIGNhbyBoxqFuIDEyLjIyIHRp4bq/bmcgbmfDoHkgxJHGsOG7o2MgZ8OhbiB24bubaSBiaeG7g3UgaGnhu4duICJDYW8iLg0KDQpgYGB7cn0NCmRmJGR1cmF0aW9uX2xldmVsIDwtIGN1dChkZiRkdXJhdGlvbiwgYnJlYWtzID0gYygwLCAxMi4yMiwgNTApLCBsYWJlbHMgPSBjKCJUaOG6pXAiLCAiQ2FvIikpDQpzdHIoZGYkZHVyYXRpb25fbGV2ZWwpDQpzdW1tYXJ5KGRmJGR1cmF0aW9uX2xldmVsKQ0KYGBgDQoNCg0KIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIDEgYmnhur9uKioNCg0KVHJvbmcgcGjhuqduIG7DoHksIGNow7puZyB0w7RpIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGThu68gbGnhu4d1IGJhbyBn4buTbSBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oIHbDoCBk4buvIGxp4buHdSDEkeG7i25oIGzGsOG7o25nLiDEkOG7kWkgduG7m2kgZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCwgdGjhu7FjIGhp4buHbiBs4bqtcCBi4bqjbmcgdOG6p24gc+G7kSwgYuG6o25nIHThuqduIHN14bqldCB2w6AgduG6vSDEkeG7kyB0aOG7iy4gxJDhu5FpIHbhu5tpIGThu68gbGnhu4d1IMSR4buLbmggbMaw4bujbmcsIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZy4NCg0KIyMgKipUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gxJHhu4tuaCB0w61uaCoqDQoNCiMjIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biBjbGFzcyoqDQoNCsSQ4bqndSB0acOqbiwgdGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiBtw7QgdOG6oyBjaG8gYmnhur9uIENsYXNzIHRo4buDIGhp4buHbiBo4bqhbmcgdsOpIG3DoCBraMOhY2ggaMOgbmcgbOG7sWEgY2jhu41uLiBCYW8gZ+G7k20gaGFpIGJp4buDdSBoaeG7h24gbMOgIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgdsOgIGjhuqFuZyBnaOG6vyB0aMawxqFuZyBnaWEuIMSQw6J5IGPFqW5nIGNow61uaCBsw6AgYmnhur9uIMSRxrDhu6NjIGdp4bqjaSB0aMOtY2ggdHJvbmcgYsOgaSBuZ2hpw6puIGPhu6l1Lg0KDQpgYGB7cn0NCnRtcCA8LSB0YWJsZShkZiRjbGFzcykNCmFkZG1hcmdpbnModG1wKQ0Kcm91bmQoKHRhYmxlKGRmJGNsYXNzKS9zdW0odGFibGUoZGYkY2xhc3MpKSoxMDApLDIpDQpkZiAlPiUgZ2dwbG90KG1hcCA9IGFlcyh4PWZjdF9pbmZyZXEoY2xhc3MpLCB5PSBhZnRlcl9zdGF0KGNvdW50KSkpK2dlb21fYmFyKGZpbGwgPSAnc2t5Ymx1ZScpK2dlb21fdGV4dChhZXMobGFiZWw9cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpLGFjY3VyYWN5ID0gLjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdibGFjaycsdmp1c3QgPSAyKSArIGxhYnMoeCA9ICdI4bqhbmcgZ2jhur8nLHk9InPhu5EgbMaw4bujbmciLCB0aXRsZT0iUGjDom4gY2hpYSBz4buRIGzGsOG7o25nIHbDqSB0aGVvIHThu6tuZyBo4bqhbmcgZ2jhur8iKSt0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpUcm9uZyBz4buRIDMwMDE1MyB2w6kgbcOheSBiYXk6DQoNCi0gU+G7kSBuZ8aw4budaSDEkeG6t3QgaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZyBjw7MgMjA2NjY2IHbDqSwgY2hp4bq/bSA2OCw4NSUNCg0KLSBT4buRIG5nxrDhu51pIMSR4bq3dCBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhIGPDsyA5MzQ4NyB2w6ksIGNoaeG6v20gMzEsMTUlDQoNCk5oxrAgduG6rXksIHPhu5EgbmfGsOG7nWkgxJHhurd0IHbDqSBo4bqhbmcgZ2jhur8gcGjhu5UgdGjDtG5nIG5oaeG7gXUgaMahbiAxMTMxNzkgKEtob+G6o25nIDM3LDcxJSkgc28gduG7m2kgc+G7kSBuZ8aw4budaSBz4bufIGjhu691IHbDqSBsw6AgaOG6oW5nIGdo4bq/IHRoxrDGoW5nIGdpYS4NCg0KIyMjICoqVGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIGFpcmxpbmUqKg0KDQpCaeG6v24gYWlybGluZSBsw6AgYmnhur9uIMSR4bqhaSBkaeG7h24gY2hvIGPDoWMgaMOjbmcgaMOgbmcga2jDtG5nLiBDw7MgNiBow6NuZyBow6BuZyBraMO0bmcgdHJvbmcgYsOgaSBuZ2hpw6puIGPhu6l1IG7DoHkuDQoNCmBgYHtyfQ0KdG1wMSA8LSB0YWJsZShkZiRhaXJsaW5lKQ0KYWRkbWFyZ2lucyh0bXAxKQ0KYGBgDQoNCg0KYGBge3J9DQpyb3VuZCgodGFibGUoZGYkYWlybGluZSkvc3VtKHRhYmxlKGRmJGFpcmxpbmUpKSoxMDApLDIpDQpkZiAlPiUgZ2dwbG90KG1hcCA9IGFlcyh4PWZjdF9pbmZyZXEoYWlybGluZSksIHk9IGFmdGVyX3N0YXQoY291bnQpKSkrZ2VvbV9iYXIoZmlsbCA9ICdzYWxtb24nKStnZW9tX3RleHQoYWVzKGxhYmVsPXBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSxhY2N1cmFjeSA9IC4wMSkpLCBzdGF0ID0gJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLHZqdXN0ID0gMSkgKyBsYWJzKHggPSAnSMOjbmcgaMOgbmcga2jDtG5nJyx5PSJz4buRIGzGsOG7o25nIiwgdGl0bGU9IlBow6JuIGNoaWEgc+G7kSBsxrDhu6NuZyB2w6kgdGhlbyB04burbmcgaMOjbmcgaMOgbmcga2jDtG5nIikrdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KDQpUaOG7kW5nIGvDqiBjaG8gdGjhuqV5IHRyb25nIHPhu5EgMzAwMTUzIHbDqSBtw6F5IGJheSDEkcaw4bujYyBiw6FuIHJhIHPhuq9wIHjhur9wIHRoZW8gdGjhu6kgdOG7sSB0xINuZyBk4bqnbiwgdGEgY8OzIHRo4buDIHRo4bqleSBy4bqxbmcgaMOjbmcgaMOgbmcga2jDtG5nIFZpc3RhcmEgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCB2w6AgaMOjbmcgU3BpY2VqZXQgY2hp4bq/bSB04bu3IGzhu4cgdGjhuqVwIG5o4bqldCBj4bulIHRo4buDIG5oxrAgc2F1Og0KDQotIEjDo25nIGjDoG5nIGtow7RuZyBWaXN0YXJhIGPDsyAxMjc4NTkgdsOpIGNoaeG6v20gdOG7tyBs4buHIGzDoCA0Mi42JQ0KDQotIEjDo25nIGjDoG5nIGtow7RuZyBBaXJfSW5kaWEgY8OzIDgwODkyIHbDqSBjaGnhur9tIHThu7cgbOG7hyBsw6AgMjYuOTUlDQoNCi0gSMOjbmcgaMOgbmcga2jDtG5nIEluZGlnbyBjw7MgNDMxMjAgdsOpIGNoaeG6v20gdOG7tyBs4buHIGzDoCAxNC4zNyUNCg0KLSBIw6NuZyBow6BuZyBraMO0bmcgR09fRklSU1QgY8OzIDIzMTczIHbDqSBjaGnhur9tIHThu7cgbOG7hyBsw6AgNy43MiUNCg0KLSBIw6NuZyBow6BuZyBraMO0bmcgQWlyQXNpYSBjw7MgMTYwOTggdsOpIGNoaeG6v20gdOG7tyBs4buHIGzDoCA1LjM2JQ0KDQotIEjDo25nIGjDoG5nIGtow7RuZyBTcGljZUpldCBjw7MgOTAxMSB2w6kgY2hp4bq/bSB04bu3IGzhu4cgbMOgIDMlDQoNCiMjIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biBzb3VyY2VfY2l0eSAqKg0KDQpgYGB7cn0NCnNvdXJjZV9mcmVxdWVuY3kgPC0gdGFibGUoZGYkc291cmNlX2NpdHkpDQphZGRtYXJnaW5zKHNvdXJjZV9mcmVxdWVuY3kpDQpyb3VuZCgodGFibGUoZGYkc291cmNlX2NpdHkpL3N1bSh0YWJsZShkZiRzb3VyY2VfY2l0eSkpKjEwMCksMikNCmRmICU+JSBnZ3Bsb3QobWFwID0gYWVzKHg9ZmN0X2luZnJlcShzb3VyY2VfY2l0eSksIHk9YWZ0ZXJfc3RhdChjb3VudCkpKStnZW9tX2JhcihmaWxsPSdza3libHVlJykrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksYWNjdXJhY3kgPSAuMDEpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJyx2anVzdCA9IDIpICsgbGFicyh4ID0gJ1Row6BuaCBwaOG7kSBraOG7n2kgaMOgbmgnLCB5ID0gJ1Phu5EgbMaw4bujbmcnLCB0aXRsZSA9ICJT4buRIGzGsOG7o25nIGNodXnhur9uIGJheSB0xrDGoW5nIOG7qW5nIHbhu5tpIHThu6tuZyB0aMOgbmggcGjhu5EgbcOgIGNodXnhur9uIGJheSBraOG7n2kgaMOgbmgiKSt0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpUcm9uZyBz4buRIDMwMDE1MyB0aMO0bmcgdGluIHbhu4EgxJFp4buDbSBraOG7n2kgaMOgbmggY+G7p2EgY8OhYyBjaHV54bq/biBiYXksIHRow6BuaCBwaOG7kSBjw7MgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCBuaGnhu4F1IG5o4bqldCBsw6AgRGVsaGkgdsOgIHRow6BuaCBwaOG7kSBjw7MgY2h1eeG6v24gYmF5IGto4buPaSBow6BuaCDDrXQgbmjhuqV0IGzDoCBDaGVubmFpLCBj4bulIHRo4buDIG5oxrAgc2F1Og0KDQotIFPhu5EgbMaw4bujbmcgY2h1eeG6v24gYmF5IOG7nyBEZWxoaSBsw6AgNTIwNjEsIGNoaeG6v20gMjAsNDQlIHThu5VuZyBjaHV54bq/biBiYXkuDQoNCi0gU+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkg4bufIE11bWJhaSBsw6AgNjA4OTYgLCBjaGnhur9tIDIwLDI5JSB04buVbmcgc+G7kSBjaHV54bq/biBiYXkNCg0KLSBT4buRIGzGsOG7o25nIGNodXnhur9uIGJheSDhu58gQmFuZ2Fsb3JlIGzDoCAgNTIwNjEgLCBjaGnhur9tIDE3LDM0JSB04buVbmcgc+G7kSBjaHV54bq/biBiYXkNCg0KLSBT4buRIGzGsOG7o25nIGNodXnhur9uIGJheSDhu58gS29sa2F0YSBsw6AgNDYzNDcgLCBjaGnhur9tIDE1LDQ0JSB04buVbmcgc+G7kSBjaHV54bq/biBiYXkNCg0KLSBT4buRIGzGsOG7o25nIGNodXnhur9uIGJheSDhu58gSHlkZXJhYmFkIGzDoCA0MDgwNiwgY2hp4bq/bSAxMyw2MCUgdOG7lW5nIHPhu5EgY2h1eeG6v24gYmF5DQoNCi0gU+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkg4bufIENoZW5uYWkgbMOgIDM4NzAwLCBjaGnhur9tIDEyLDg5JSB04buVbmcgc+G7kSBjaHV54bq/biBiYXkuDQoNCk5o4bqtbiB4w6l0OiBRdWEgYmnhu4N1IMSR4buTIG7DoHksIGNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5IHLDtSByw6BuZyBy4bqxbmcgRGVsaGkgdsOgIE11bWJhaSBsw6AgaGFpIHRydW5nIHTDom0gaMOgbmcga2jDtG5nIGzhu5tuIG5o4bqldCwgdHJvbmcga2hpIGPDoWMgdGjDoG5oIHBo4buRIGtow6FjIG5oxrAgQmFuZ2Fsb3JlLCBLb2xrYXRhLCBIeWRlcmFiYWQsIHbDoCBDaGVubmFpIGPDsyBz4buRIGzGsOG7o25nIGNodXnhur9uIGJheSDDrXQgaMahbiDEkcOhbmcga+G7gy4NCg0KIyMjICoqVGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIHN0b3BzKioNCg0KYGBge3J9DQpzdG9wc19mcmVxdWVuY3kgPC0gdGFibGUoZGYkc3RvcHMpDQphZGRtYXJnaW5zKHN0b3BzX2ZyZXF1ZW5jeSkNCnJvdW5kKCh0YWJsZShkZiRzdG9wcykvc3VtKHRhYmxlKGRmJHN0b3BzKSkqMTAwKSwyKQ0KZGYgJT4lIGdncGxvdChtYXAgPSBhZXMoeD1mY3RfaW5mcmVxKHN0b3BzKSwgeT1hZnRlcl9zdGF0KGNvdW50KSkpK2dlb21fYmFyKGZpbGw9J3Zpb2xldCcpK2dlb21fdGV4dChhZXMobGFiZWw9cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpLGFjY3VyYWN5ID0gLjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdibGFjaycsdmp1c3QgPSAxLjIpICsgbGFicyh4ID0gJ1Phu5EgxJFp4buDbSBk4burbmcnLCB5ID0gJ1Phu5EgbMaw4bujbmcnLCB0aXRsZSA9ICJT4buRIGzGsOG7o25nIGNodXnhur9uIGJheSB0xrDGoW5nIOG7qW5nIHbhu5tpIHPhu5EgxJFp4buDbSBk4burbmciKSt0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpUcm9uZyB04buVbmcgc+G7kSAzMDAxNTMgdGjDtG5nIHRpbiB24buBIHPhu5EgxJFp4buDbSBk4burbmcgY+G7p2EgY8OhYyBjaHV54bq/biBiYXkNCg0KLSDEkGEgc+G7kSBraMOhY2ggaMOgbmcgbOG7sWEgY2jhu41uIGNodXnhur9uIGJheSBraMO0bmcgY8OzIMSRaeG7g20gZOG7q25nIHbDoCBuw7MgY2hp4bq/bSB04bubaSA4Myw1OCUgc28gduG7m2kgdOG7lW5nIDMwMDE1MyBjaHV54bq/biBiYXkuDQoNCi0gU+G7kSBjaHV54bq/biBiYXkgY8OzIDEgxJFp4buDbSBk4burbmcgY2hp4bq/bSAxMiUuDQoNCi0gU+G7kSBjaHV54bq/biBiYXkgY8OzIDIgaG/hurdjIG5oaeG7gXUgaMahbiAyIMSRaeG7g20gZOG7q25nIGNo4buJIGNoaeG6v20gNCw0MyUuDQoNCk5o4bqtbiB4w6l0OiDEkGEgc+G7kSBow6BuaCBraMOhY2ggxrB1IHRpw6puIGzhu7FhIGNo4buNbiBjaHV54bq/biBiYXkgdGjhurNuZywga2jDtG5nIGPDsyDEkWnhu4NtIGThu6tuZy4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBkbyBjw6FjIGzDvSBkbyBuaMawIHRp4bq/dCBraeG7h20gdGjhu51pIGdpYW4sIGdp4bqjbSB0aGnhu4N1IHLhu6dpIHJvIG3huqV0IGjDoG5oIGzDvSB2w6AgaOG6oW4gY2jhur8gcGhp4buBbiB0b8OhaSBraGkgY2h1eeG7g24gZ2nhu69hIGPDoWMgY2h1eeG6v24gYmF5LiBDw7MgMTIlIGtow6FjaCBow6BuZyBs4buxYSBjaOG7jW4gY2h1eeG6v24gYmF5IGPDsyAxIMSRaeG7g20gZOG7q25nLCBjw6FjIGNodXnhur9uIGJheSBuw6B5IHRoxrDhu51uZyBjw7MgZ2nDoSBy4bq7IGjGoW4gc28gduG7m2kgY2h1eeG6v24gYmF5IHRo4bqzbmcsIGhv4bq3YyBjw7MgdGjhu4MgaMOgbmgga2jDoWNoIGtow7RuZyB0w6xtIMSRxrDhu6NjIGNodXnhur9uIGJheSB0aOG6s25nIHBow7kgaOG7o3AgduG7m2kgbOG7i2NoIHRyw6xuaCBj4bunYSBo4buNLlLhuqV0IMOtdCBow6BuaCBraMOhY2ggY2jhu41uIGNodXnhur9uIGJheSBjw7MgMiBob+G6t2Mgbmhp4buBdSBoxqFuIDIgxJFp4buDbSBk4burbmcuIE5o4buvbmcgY2h1eeG6v24gYmF5IG7DoHkgdGjGsOG7nW5nIGvDqW8gZMOgaSB0aOG7nWkgZ2lhbiBkaSBjaHV54buDbiwgY8OzIHRo4buDIGfDonkgbeG7h3QgbeG7j2kgY2hvIGjDoG5oIGtow6FjaCB2w6AgdMSDbmcga2jhuqMgbsSDbmcgZ+G6t3Agc+G7sSBj4buRLiANCg0KIyMgKipUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyoqDQoNCiMjIyAqKkJp4bq/biBQcmljZSoqDQoNCkJp4bq/biBQcmljZSBsw6AgYmnhur9uIHRo4buDIGhp4buHbiBjaG8gZ2nDoSB2w6kgbcOheSBiYXkgbcOgIGtow6FjaCBow6BuZyDEkcOjIG11YSwgbMOgIG3hu5l0IGJp4bq/biDEkeG7i25oIGzGsOG7o25nLiDEkOG7gyBtw7QgdOG6oyBjaG8gYmnhur9uIG7DoHksIHRhIHRo4buxYyBoaeG7h24gdMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZzoNCg0KYGBge3J9DQpzdW1tYXJ5KGRmJHByaWNlKQ0KdmFyKGRmJHByaWNlKQ0Kc2QoZGYkcHJpY2UpDQpnZ3Bsb3QoZGYsIGFlcyh4ID0gcHJpY2UpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibHVlIiwgYWxwaGEgPSAwLjUpICsNCiAgbGFicyh4ID0gIkdpw6EgdsOpIG3DoXkgYmF5IiwgeT0iTeG6rXQgxJHhu5kiLCB0aXRsZT0iQmnhu4N1IMSR4buTIHBow6JuIHBo4buRaSBj4bunYSBnacOhIHbDqSIpK3RoZW1lX21pbmltYWwoKQ0KYGBgDQoNClThu6sga+G6v3QgcXXhuqMgdHLDqm4sIHRhIG5o4bqtbiB0aOG6pXkgcuG6sW5nOg0KDQotIEdpw6EgdsOpIHRo4bqlcCBuaOG6pXQgbMOgIDExMDUgxJHGoW4gduG7iyB0aeG7gW4gdOG7hywgZ2nDoSB2w6kgY2FvIG5o4bqldCBsw6AgMTIzMDcxIMSRxqFuIHbhu4sgdGnhu4FuIHThu4cuIEPDsyBraG/huqNuZyBjw6FjaCBnaeG7r2EgdsOpIHRo4bqlcCBuaOG6pXQgdsOgIHbDqSBjYW8gbmjhuqV0IGzDoCBy4bqldCBs4bubbiwgY2hvIHRo4bqleSBjw7Mgc+G7sSDEkWEgZOG6oW5nIHLhuqV0IGzhu5tuIHRyb25nIGdpw6EgdsOpLg0KDQotIEPDsyAyNSUgZ2nDoSB2w6kgdGjhuqVwIGjGoW4gZ2nDoSA0NzgzIMSRxqFuIHbhu4sgdGnhu4FuIHThu4csIGPDsyA1MCUgZ2nDoSB2w6kgdGjhuqVwIGjGoW4gZ2nDoSB0cuG7iyA3NDI1IMSRxqFuIHbhu4sgdGnhu4FuIHThu4csIGPDsyA3NSUgZ2nDoSB2w6kgdGjhuqVwIGjGoW4gNDI1MjEgxJHGoW4gduG7iyB0aeG7gW4gdOG7hy4gUGjDom4gcGjhu5FpIGdpw6EgdsOpIGzhu4djaCwgcGjhuqduIGzhu5tuIGdpw6EgdsOpIG7hurFtIGTGsOG7m2kgbeG7qWMgNDI1MjEgxJHGoW4gduG7iyB0aeG7gW4gdOG7hy4NCg0KLSBN4bupYyB0cnVuZyBiw6xuaCBj4bunYSBnacOhIHbDqSBsw6AgMjA4OTAgxJHGoW4gduG7iyB0aeG7gW4sIGNhbyBoxqFuIGdpw6EgdHLhu4sgdHJ1bmcgduG7iy4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIGPDsyBt4buZdCBz4buRIGdpw6EgdHLhu4sgcuG6pXQgY2FvIGvDqW8gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBsw6puLg0KDQotIE5ow6xuIHbDoG8gcGjGsMahbmcgc2FpIGPhu6dhIGThu68gbGnhu4d1LCBQaMawxqFuZyBzYWkgbOG7m24gY2hvIHRo4bqleSBz4buxIGJp4bq/biB0aGnDqm4gbOG7m24gdHJvbmcgZOG7ryBsaeG7h3UuIMSQ4buZIGzhu4djaCBjaHXhuqluIGNhbyBjxaluZyBwaMOhbiDDoW5oIHPhu7EgcGjDom4gdMOhbiBs4bubbiB4dW5nIHF1YW5oIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmguDQoNCiMjIyAqKkJp4bq/biBEYXlzIExlZnQqKg0KDQpgYGB7cn0NCnN1bW1hcnkoZGYkZGF5c19sZWZ0KQ0KdmFyKGRmJGRheXNfbGVmdCkNCnNkKGRmJGRheXNfbGVmdCkNCmBgYA0KDQpUcm9uZyAzMDA1MTMgbmfGsOG7nWkgdHJvbmcga2jhuqNvIHPDoXQgY2hvIGJp4bq/dCB0aMO0bmcgdGluIHbhu4Ega2hv4bqjbmcgdGjhu51pIGdpYW4gdOG7qyBsw7pjIMSR4bq3dCB2w6kgxJHDqW4gbMO6YyDEkeG6t3QgdsOpIMSR4bq/biBsw7pjIGJheSBuaMawIHNhdToNCiANCi0gVGjhu51pIGdpYW4gdOG7qyBsw7pjIMSR4bq3dCB2w6kgxJHhur9uIGtoaSBiYXkgY+G7p2EgY8OhYyBow6BuaCBraMOhY2ggbmfhuq9uIG5o4bqldCBsw6AgbeG7mXQgbmfDoHkgdsOgIGTDoGkgbmjhuqV0IGzDoCA0OSBuZ8OgeS4NCg0KLSBUaOG7nWkgZ2lhbiB0cnVuZyBiw6xuaCBj4bunYSBz4buRIGzGsOG7o25nIGjDoG5oIGtow6FjaCBraOG6o28gc8OhdCDEkcaw4bujYyBsw6AgMjYgbmfDoHkuDQoNCi0gMjUlIG5nxrDhu51pIHRyb25nIG5ow7NtIHRyw6puIMSR4bq3dCB2w6kgdHLGsOG7m2MgbmfDoHkgYmF5IDE1IG5nw6B5IA0KDQotIDUwJSBuZ8aw4budaSB0cm9uZyBuaMOzbSBraOG6o28gc8OhdCDEkeG6t3QgdsOpIHRyxrDhu5tjIG5nw6B5IGJheSAyNiBuZ8OgeQ0KDQotIDc1JSBuZ8aw4budaSB0cm9uZyBuaMOzbSDEkeG6t3QgdsOpIHRyxrDhu5tjIG5nw6B5IGJheSAzOCBuZ8OgeQ0KDQotIMSQ4buZIGzhu4djaCBjaHXhuqluIGPhu6dhIGJp4bq/biBkYXlzLWxlZnQgbMOgIDEzLjU2MSBjaG8gYmnhur90IG3hu6ljIMSR4buNIHBow6JuIHTDoW4gY+G7p2EgdGjhu51pIGdpYW4gdOG7qyBuZ8OgeSDEkeG6t3QgdsOpIMSR4bq/biBuZ8OgeSBiYXkgdHJvbmcgbmjDs20gbmfGsOG7nWkga2jhuqNvIHPDoXQgxJHGsOG7o2Mgc28gduG7m2kgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBsw6AgMTMuNTYxIG5nw6B5Lg0KIA0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF5c19sZWZ0KSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICJza3libHVlIiwgY29sb3IgPSAiYmx1ZSIsIGFscGhhID0gMC41KSArDQogIGxhYnMoeCA9ICJ0aOG7nWkgZ2lhbiDEkeG6t3QgdsOpIHRyxrDhu5tjIGNodXnhur9uIGJheSIseT0iTeG6rXQgxJHhu5kiLCB0aXRsZT0iQmnhu4N1IMSR4buTIHBow6JuIHBo4buRaSBj4bunYSB0aOG7nWkgZ2lhbiDEkeG6t3QgdsOpIHRyxrDhu5tjIGNodXnhur9uIGJheSIpK3RoZW1lX21pbmltYWwoKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIEjDrG5oIGThuqFuZyBwaMOibiBi4buROiBN4bqtdCDEkeG7mSBwaMOibiBi4buRIGPDsyB4dSBoxrDhu5tuZyBn4bqnbiBuaMawIMSR4buBdSB04burIGtob+G6o25nIG5nw6B5IHRo4bupIDEwIMSR4bq/biBuZ8OgeSB0aOG7qSA0NSB0csaw4bubYyBuZ8OgeSBiYXkuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG5oaeG7gXUgbmfGsOG7nWkgY8OzIHh1IGjGsOG7m25nIMSR4bq3dCB2w6kgdHJvbmcga2hv4bqjbmcgdGjhu51pIGdpYW4gbsOgeS4NCg0KLSDEkOG6t3QgdsOpIHPhu5ttOiBT4buRIG5nxrDhu51pIMSR4bq3dCB2w6kgYuG6r3QgxJHhuqd1IHTEg25nIHThu6sgcuG6pXQgw610IOG7nyBn4bqnbiBuZ8OgeSB0aOG7qSAwIHbDoCB0xINuZyBk4bqnbiDEkeG6v24ga2hv4bqjbmcgbmfDoHkgdGjhu6kgMTAuIEPDsyBy4bqldCDDrXQgbmfGsOG7nWkgxJHhurd0IHbDqSBn4bqnbiBuZ8OgeSBiYXkuDQoNCi0gR2nhuqNtIMSR4bq3dCB2w6kgZ+G6p24gbmfDoHkgYmF5OiBDw7Mgc+G7sSBnaeG6o20gxJHhu5l0IG5n4buZdCB0cm9uZyBz4buRIG5nxrDhu51pIMSR4bq3dCB2w6kga2hpIGPDsm4gw610IG5nw6B5IHRyxrDhu5tjIG5nw6B5IGJheSAoZMaw4bubaSAxMCBuZ8OgeSkuIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgZG8gZ2nDoSB2w6kgdMSDbmcgaG/hurdjIHRoaeG6v3UgdsOpLg0KDQotIFBow6JuIGLhu5Eg4buVbiDEkeG7i25oOiBUcm9uZyBraG/huqNuZyB04burIDEwIG5nw6B5IMSR4bq/biA0NSBuZ8OgeSB0csaw4bubYyBuZ8OgeSBiYXksIG3huq10IMSR4buZIHBow6JuIGLhu5Eg4buVbiDEkeG7i25oLCBjaG8gdGjhuqV5IG5oaeG7gXUgbmfGsOG7nWkgY8OzIHh1IGjGsOG7m25nIMSR4bq3dCB2w6kgdHJvbmcgZ2lhaSDEkW/huqFuIG7DoHksIGPDsyB0aOG7gyBkbyDEkcOieSBsw6Aga2hv4bqjbmcgdGjhu51pIGdpYW4gdOG7kWkgxrB1IHbhu4EgZ2nDoSBj4bqjIA0KDQotIEdp4bqjbSBt4bqhbmggc2F1IG5nw6B5IDQ1OiBT4buRIG5nxrDhu51pIMSR4bq3dCB2w6kgZ2nhuqNtIGThuqduIHNhdSBraG/huqNuZyA0NSBuZ8OgeSB0csaw4bubYyBuZ8OgeSBiYXkuIEPDsyB0aOG7gyB2w6wgdmnhu4djIMSR4bq3dCB2w6kgcXXDoSB4YSB0csaw4bubYyBuZ8OgeSBiYXkgw610IHBo4buVIGJp4bq/biBob+G6t2Mgw610IG5nxrDhu51pIGPDsyBr4bq/IGhv4bqhY2ggY+G7pSB0aOG7gyB4YSDEkeG6v24gduG6rXkuDQoNCiMjIyAqKkJp4bq/biBEdXJhdGlvbioqDQogDQpgYGB7cn0NCnN1bW1hcnkoZGYkZHVyYXRpb24pDQp2YXIoZGYkZHVyYXRpb24pDQpzZChkZiRkdXJhdGlvbikNCmBgYA0KVHJvbmcgYuG7mSBk4buvIGxp4buHdSBraOG6o28gc8OhdCDEkcaw4bujYyB0YSBjw7MgdGjDtG5nIHRpbiB24buBIHRo4budaSBnaWFuIGJheSBuaMawIHNhdToNCg0KLSBDaHV54bq/biBiYXkgbmfhuq9uIG5o4bqldCBrw6lvIGTDoGkgMC44MyBnaeG7nSB0xrDGoW5nIMSRxrDGoW5nIHbhu5tpIGtob+G6o25nIDUwIHBow7p0IA0KIA0KLSBjaHV54bq/biBiYXkgZMOgaSBuaOG6pXQga8OpbyBkw6BpIDQ5LjgzIGdp4budIHTGsMahbmcgxJHGsMahbmcgduG7m2kga2hv4bqjbmcgMiBuZ8OgeSAxIGdp4budIDUwIHBow7p0DQogDQotIDI1JSBjaHV54bq/biBiYXkga8OpbyBkw6BpIHRyb25nIDYuODMgZ2nhu50NCiANCi0gNTAlIGNodXnhur9uIGJheSBrw6lvIGTDoGkgdHJuZyAxMS4yNSBnaeG7nQ0KIA0KLSA3NSUgY2h1eeG6v24gYmF5IGvDqW8gZMOgaSB0cm9uZyAxNi4xNyBnaeG7nQ0KIA0KLSBUaOG7nWkgZ2lhbiBiYXkgdHJ1bmcgYsOsbmgga2jhuqNvIHPDoXQgxJHGsOG7o2MgbMOgIDEyLjIyIGdp4budDQogDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHggPSBkdXJhdGlvbikpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAic2t5Ymx1ZSIsIGNvbG9yID0gImJsdWUiLCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHggPSAidGjhu51pIGdpYW4gYmF5IikrdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KIA0KKipOaOG6rW4geMOpdCoqDQoNCi0gxJDhu4luaCBjYW8gbmdheSBzw6F0IGfhuqduIDA6IEPDsyBt4buZdCDEkeG7iW5oIHLhuqV0IGNhbyDhu58ga2hv4bqjbmcgdGjhu51pIGdpYW4gbmfhuq9uIG5o4bqldCwgY2hvIHRo4bqleSBy4bqxbmcgcGjhuqduIGzhu5tuIGPDoWMgY2h1eeG6v24gYmF5IGvDqW8gZMOgaSBy4bqldCBuZ+G6r24sIGPDsyB0aOG7gyBsw6AgY8OhYyBjaHV54bq/biBiYXkgbuG7mWkgxJHhu4thIGhv4bq3YyBjw6FjIGNodXnhur9uIGJheSBjaOG7iSBrw6lvIGTDoGkga2hv4bqjbmcgMi0zIGdp4budLg0KDQotIEdp4bqjbSBk4bqnbiBzYXUgxJHhu4luaCDEkeG6p3UgdGnDqm46IFNhdSDEkeG7iW5oIGNhbyBiYW4gxJHhuqd1LCBt4bqtdCDEkeG7mSBnaeG6o20gZOG6p24gbmjGsG5nIHbhuqtuIGPDsyBuaOG7r25nIMSR4buJbmggY2FvIGtow6FjIHRyb25nIGtob+G6o25nIHThu6sgNiDEkeG6v24gMTIgZ2nhu50uIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgYmnhu4N1IGhp4buHbiBjaG8gY8OhYyBjaHV54bq/biBiYXkgbuG7mWkgxJHhu4thIGTDoGkgaMahbiBob+G6t2MgY8OhYyBjaHV54bq/biBiYXkgcXXhu5FjIHThur8gbmfhuq9uLg0KDQotIMSQ4buJbmggbmjhu48ga2hv4bqjbmcgdOG7qyAxNCDEkeG6v24gMjAgZ2nhu506IEPDsyBt4buZdCDEkeG7iW5oIG5o4buPIHThu6sga2hv4bqjbmcgdGjhu51pIGdpYW4gMTQgxJHhur9uIDIwIGdp4budLCBjaG8gdGjhuqV5IGPDsyBt4buZdCBz4buRIGNodXnhur9uIGJheSBrw6lvIGTDoGkgdHJvbmcga2hv4bqjbmcgdGjhu51pIGdpYW4gbsOgeSwgY8OzIHRo4buDIGzDoCBjw6FjIGNodXnhur9uIGJheSBxdeG7kWMgdOG6vyBkw6BpLg0KDQotIEdp4bqjbSBt4bqhbmggc2F1IDIwIGdp4budOiBTYXUga2hv4bqjbmcgMjAgZ2nhu50sIG3huq10IMSR4buZIGdp4bqjbSDEkcOhbmcga+G7gywgY2hvIHRo4bqleSBy4bqldCDDrXQgY2h1eeG6v24gYmF5IGvDqW8gZMOgaSBoxqFuIDIwIGdp4budLiDEkGnhu4F1IG7DoHkgaOG7o3AgbMO9IHbDrCBo4bqndSBo4bq/dCBjw6FjIGNodXnhur9uIGJheSBxdeG7kWMgdOG6vyBkw6BpIG5o4bqldCB0aMaw4budbmcga2jDtG5nIGvDqW8gZMOgaSBoxqFuIGtob+G6o25nIHRo4budaSBnaWFuIG7DoHkuDQoNCi0gR+G6p24gbmjGsCBraMO0bmcgY8OzIGNodXnhur9uIGJheSBrw6lvIGTDoGkgaMahbiAzMCBnaeG7nTogVOG7qyBraG/huqNuZyAzMCBnaeG7nSB0cuG7nyDEkWksIG3huq10IMSR4buZIGdp4bqjbSB4deG7kW5nIGfhuqduIGLhurFuZyAwLCBjaG8gdGjhuqV5IHLhuqV0IMOtdCBob+G6t2Mga2jDtG5nIGPDsyBjaHV54bq/biBiYXkgbsOgbyBrw6lvIGTDoGkgaMahbiBraG/huqNuZyB0aOG7nWkgZ2lhbiBuw6B5LiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIGJhbyBn4buTbSBjw6FjIGNodXnhur9uIGJheSBjw7Mgbmhp4buBdSDEkWnhu4NtIGThu6tuZyBob+G6t2MgY8OhYyBow6BuaCB0csOsbmggxJHhurdjIGJp4buHdC4NCg0KVMOzbSBs4bqhaSwgYmnhu4N1IMSR4buTIG7DoHkgY2hvIHRo4bqleSBo4bqndSBo4bq/dCBjw6FjIGNodXnhur9uIGJheSBrw6lvIGTDoGkgZMaw4bubaSAxMCBnaeG7nSwgduG7m2kgcGjhuqduIGzhu5tuIGPDoWMgY2h1eeG6v24gYmF5IHLhuqV0IG5n4bqvbi4gQ8OzIG3hu5l0IHPhu5Egw610IGNodXnhur9uIGJheSBrw6lvIGTDoGkgdOG7qyAxMCDEkeG6v24gMjAgZ2nhu50sIHbDoCBy4bqldCBoaeG6v20gY8OzIGNodXnhur9uIGJheSBrw6lvIGTDoGkgaMahbiAyMCBnaeG7nS4NCg0KDQojICoqVGjhu5FuZyBrw6ogbcO0IHThuqMgMiBiaeG6v24qKg0KDQojIyAqKkJp4bq/biBDbGFzcyB2w6AgYmnhur9uIGFpcmxpbmUqKg0KDQpgYGB7cn0NCmFkZG1hcmdpbnModGFibGUoZGYkYWlybGluZSwgZGYkY2xhc3MpKQ0KcHJvcC50YWJsZSh0YWJsZShkZiRhaXJsaW5lLCBkZiRjbGFzcyksIG1hcmdpbiA9IDIpICogMTAwDQpgYGANCg0KDQpgYGB7cn0NCmRmICU+JSBjb3VudChjbGFzcyxhaXJsaW5lKSAlPiUgZ3JvdXBfYnkoY2xhc3MpICU+JSBtdXRhdGUocHNsID0gbi9zdW0obikpICU+JSBnZ3Bsb3QoYWVzKHg9Y2xhc3MseT1uLGZpbGw9IGFpcmxpbmUpKStnZW9tX2NvbCgpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocHNsLGFjY3VyYWN5ID0gLjAxKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSksIGNvbG9yID0gJ2JsYWNrJykgKyBsYWJzKCB4ID0nSOG6oW5nIHbDqScsIHkgPSAnc+G7kSBsxrDhu6NuZycsIHRpdGxlID0gIsSQ4buTIHRo4buLIGPhu6dhIHPhu5EgbMaw4bujbmcgY2h1eeG6v24gYmF5IGPhu6dhIGjDo25nIGjDoG5nIGtow7RuZyB0aGVvIGjhuqFuZyBnaOG6vyIpK3RoZW1lX21pbmltYWwoKQ0KYGBgDQoNCk5ow6xuIHbDoG8gYuG6o25nIHbDoCDEkeG7kyB0aOG7iyBz4buRIGzGsOG7o25nIGNodXnhur9uIGJheSBj4bunYSBjw6FjIGjDo25nIGjDoG5nIGtow7RuZyB0aGVvIGjhuqFuZyBnaOG6vywgY2jDum5nIHRhIGPDsyB0aOG7gyDEkcawYSByYSBt4buZdCBz4buRIG5o4bqtbiB4w6l0Og0KDQotIFZpc3RhcmE6IENoaeG6v20gdOG7iSBs4buHIGNhbyBuaOG6pXQgdHJvbmcgaOG6oW5nIEJ1c2luZXNzICg2NC44MSUpIHbDoCBjxaluZyBjw7MgdOG7iSBs4buHIGNhbyBuaOG6pXQgdHJvbmcgaOG6oW5nIEVjb25vbXkgKDMyLjU1JSkuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IFZpc3RhcmEgY8OzIHPhu7EgcGjDom4gcGjhu5FpIMSR4buBdSBoxqFuIGdp4buvYSBoYWkgaOG6oW5nIGdo4bq/IHNvIHbhu5tpIGPDoWMgxJHhu5FpIHRo4bunIGtow6FjLg0KDQotIEFpcl9JbmRpYTogQ2hp4bq/bSB04buJIGzhu4cgY2FvIHRo4bupIGhhaSB0cm9uZyBo4bqhbmcgQnVzaW5lc3MgKDM1LjE5JSksIG5oxrBuZyBjaOG7iSBjaGnhur9tIHThu4kgbOG7hyBjYW8gdGjhu6kgaGFpIHRyb25nIGjhuqFuZyBFY29ub215ICgyMy4yMiUpLg0KDQotIEFpckFzaWEgdsOgIEdPX0ZJUlNULCBJbmRpZ28gdsOgIFNwaWNlSmV0OiBLaMO0bmcgxJHGsOG7o2Mga2jDoWNoIGjDoG5nIMawYSBjaHXhu5luZyBjaG8gaOG6oW5nIEJ1c2luZXNzLCBjaOG7iSBjw7MgdHJvbmcgaOG6oW5nIEVjb25vbXkuIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgY2hvIHRo4bqleSBjw6FjIGjDo25nIG7DoHkgY2jhu6cgeeG6v3UgY3VuZyBj4bqlcCBk4buLY2ggduG7pSBFY29ub215IHbDoCDDrXQgxJHGsOG7o2MgbmfGsOG7nWkgZMO5bmcgY2jhu41uIGzhu7FhIHRyb25nIGjhuqFuZyBnaOG6vyBjYW8gY+G6pXAgaMahbi4NCg0KDQojIyAqKkJp4bq/biBDbGFzcyB2w6Agc291cmNlX2NpdHkqKg0KDQpgYGB7cn0NCmNsYXNzX3NvdXJjZSA8LSB0YWJsZShkZiRjbGFzcyxkZiRzb3VyY2VfY2l0eSkNCmFkZG1hcmdpbnMoY2xhc3Nfc291cmNlKQ0KDQpkZiAlPiUgZ2dwbG90KGFlcyh4ID0gZmN0X2luZnJlcShzb3VyY2VfY2l0eSksIGZpbGwgPSBjbGFzcykpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudCAvIHN1bShjb3VudCkpLCBhY2N1cmFjeSA9IDAuMDEpKSwgDQogICAgICAgICAgICBzdGF0ID0gImNvdW50IiwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIA0KICAgICAgICAgICAgY29sb3IgPSAnYmxhY2snKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkVjb25vbXkiID0gInNreWJsdWUiLCAiQnVzaW5lc3MiID0gImJyb3duIikpICsgbGFicyh4ID0gJ1Row6BuaCBwaOG7kScsIHkgPSAnU+G7kSBsxrDhu6NuZycsIGZpbGwgPSAnSOG6oW5nIHbDqScsDQogICAgICAgdGl0bGUgPSAiU+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkgdMawxqFuZyDhu6luZyB24bubaSBo4bqhbmcgdsOpIHbDoCB0aMOgbmggcGjhu5EgeHXhuqV0IHBow6F0IikgKyB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNClRyb25nIHThu5VuZyBz4buRIDMwMDE1MyBxdWFuIHPDoXQNCg0KLSDEkOG7kWkgduG7m2kgNjEzNDMgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCDhu58gRGVsaGksIGPDsyAxODMxNiBow6BuaCBraMOhY2ggY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhLCBjaGnhur9tIDYsMSUgc28gduG7m2kgdOG7lW5nIGNodXnhur9uIGJheQ0KDQotIMSQ4buRaSB24bubaSA2MDg5NiBjaHV54bq/biBiYXkga2jhu59pIGjDoG5oIOG7nyBNdW1iYWksIGPDsyAxOTg1OCBow6BuZyBraMOhY2ggY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhLCBjaGnhur9tIDYsNjIlIHNvIHbhu5tpIHThu5VuZyBjaHV54bq/biBiYXkNCg0KLSDEkOG7kWkgduG7m2kgNTIwNjEgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCDhu58gQmFuZ2Fsb3JlLCBjw7MgMTY0NDEgaMOgbmgga2jDoWNoIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSxjaGnhur9tIDUsNDglIHNvIHbhu5tpIHThu5VuZyBjaHV54bq/biBiYXkNCg0KLSDEkOG7kWkgduG7m2kgNDYzNDcgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCDhu58gS29sa2F0YSwgY8OzIDEzNDczIGjDoG5oIGtow6FjaCBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEsIGNoaeG6v20gNCw0OSUgc28gduG7m2kgdOG7lW5nIGNodXnhur9uIGJheQ0KDQotIMSQ4buRaSB24bubaSA0MDgwNiBjaHV54bq/biBiYXkga2jhu59pIGjDoG5oIOG7nyBIeWRlcmFiYWQsIGPDsyAxMjg3MCBow6BuaCBraMOhY2ggY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhLCBjaGnhur9tIDQsMjklIHNvIHbhu5tpIHThu5VuZyBjaHV54bq/biBiYXkNCg0KLSDEkOG7kWkgduG7m2kgMzg3MDAgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCDhu58gQ2hlbm5haSwgY8OzIDEyNTI5IGjDoG5oIGtow6FjaCBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEsY2hp4bq/bSA0LDE3JSBzbyB24bubaSB04buVbmcgY2h1eeG6v24gYmF5DQoNCk5o4bqtbiB4w6l0OiBOaMOsbiB2w6BvIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSwgbeG6t2MgZMO5IERlbGhpIGzDoCB0aMOgbmggcGjhu5EgY8OzIG5oaeG7gXUgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCBuaOG6pXQsIHR1eSBuaGnDqm4gTXVtYmFpIGzDoCB0aMOgbmggcGjhu5EgY8OzIG5oaeG7gXUgaMOgbmgga2jDoWNoIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBuaOG6pXQgKGNoaeG6v20gNiw2MiUgc28gduG7m2kgdOG7lW5nIGNodXnhur9uIGJheSkuIFPhu5EgbGnhu4d1IHRyw6puIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IHRyb25nIGjDoG5oIHZpIGNo4buNbiBo4bqhbmcgdsOpIGPhu6dhIGjDoG5oIGtow6FjaCB04bqhaSBjw6FjIHRow6BuaCBwaOG7kSBraMOhYyBuaGF1LiBDw6FjIHRow6BuaCBwaOG7kSBs4bubbiBuaMawIERlbGhpIHbDoCBNdW1iYWkgY8OzIHThu7cgbOG7hyBow6BuaCBraMOhY2ggY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGNhbyBoxqFuIHNvIHbhu5tpIGPDoWMgdGjDoG5oIHBo4buRIG5o4buPIGjGoW4uIA0KDQojIyAqKkJp4bq/biBDbGFzcyB2w6AgZHVyYXRpb24gKioNCg0KYGBge3J9DQpkZiAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhc3MgLCB5ID0gZHVyYXRpb24pKSArDQogICBnZW9tX2JveHBsb3QoZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnMoeCA9ICJI4bqhbmcgdsOpIiwgeSA9ICJUaOG7nWkgZ2lhbiBj4bunYSBjaHV54bq/biBiYXkiLCB0aXRsZSA9ICJT4buxIHBow6JuIGLhu5EgdGjhu51pIGdpYW4gY+G7p2EgY2h1eeG6v24gYmF5IHRoZW8gdOG7q25nIGjhuqFuZyB2w6kiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KTmjhuq1uIHjDqXQ6IE5ow6xuIHbDoG8gxJHhu5MgdGjhu4sgdGEgdGjhuqV5LCDEkeG7kWkgduG7m2kgaOG6oW5nIGdo4bq/IHRoxrDGoW5nIGdpYSwga2hv4bqjbmcgdGjhu51pIGdpYW4gZGkgY2h1eeG7g24gY+G7p2EgY2h1eeG6v24gYmF5IGNo4bunIHnhur91IGdpYW8gxJHhu5luZyB04burIGtob+G6o25nIDgtMThoLiDEkOG7kWkgduG7m2kgaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZywga2hv4bqjbmcgdGjhu51pIGdpYW4gZGkgY2h1eeG7g24gY+G7p2EgY2h1eeG6v24gYmF5IGNo4bunIHnhur91IGdpYW8gxJHhu5luZyDhu58ga2hv4bqjbmcgMmgtMTZoLiBUYSBuaOG6rW4gcmEga2hv4bqjbmcgdGjhu51pIGdpYW4gZGkgY2h1eeG7g24gY+G7p2EgY2h1eeG6v24gYmF5IMSR4buRaSB24bubaSBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhIHBow6JuIGLhu5Ug4bufIGtob+G6o25nIGNhbyBoxqFuIHNvIHbhu5tpIHRo4budaSBnaWFuIGRpIGNodXnhu4NuIGPhu6dhIGNodXnhur9uIGJheSDEkeG7kWkgduG7m2kgaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZy4gxJBp4buBdSBuw6B5IG5ndXnDqm4gbmjDom4gY8OzIHRo4buDIGRvIMSR4buRaSB24bubaSBjw6FjIGNodXnhur9uIGJheSBjw6BuZyBkw6BpIHRow6wga2jDoWNoIGjDoG5nIHPhur0gY8OzIHh1IGjGsOG7m25nIGNo4buNbiBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhLiDhu54gY+G6oyAyIGjhuqFuZyBnaOG6vyB0aMawxqFuZyBnaWEgdsOgIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgxJHhu4F1IGPDsyB4deG6pXQgaGnhu4duIG3hu5l0IHPhu5EgY2h1eeG6v24gYmF5IGPDsyBraG/huqNuZyB0aOG7nWkgZ2lhbiBkaSBjaHV54buDbiBjYW8gKGdpYW8gxJHhu5luZyB04burIDMwaCAtIDUwaCkuDQoNCiMjICoqQmnhur9uIGNsYXNzIHbDoCBzdG9wc19hbnMqKg0KDQpgYGB7cn0NCmRmJHN0b3BfYW5zIDwtIGlmZWxzZShkZiRzdG9wcyA9PSAiemVybyIsICJubyIsICJ5ZXMiKQ0KYWRkbWFyZ2lucyh0YWJsZShkZiRzdG9wX2FucyxkZiRjbGFzcykpDQpwcm9wLnRhYmxlKHRhYmxlKGRmJHN0b3BfYW5zLGRmJGNsYXNzKSxtYXJnaW49MikqMTAwDQpwcm9wLnRhYmxlKHRhYmxlKGRmJHN0b3BfYW5zLGRmJGNsYXNzKSkqMTAwDQpgYGANCiBUcm9uZyBi4buZIGThu68gbGnhu4d1IHRodSB0aOG6rXAgxJHGsOG7o2MgdGEgbeG7mXQgc+G7kSB0aMO0bmcgdGluIHbhu4Egdmnhu4djIHF1w6EgY+G6o25oIOG7nyBjw6FjIGjDoG5oIGtow6FjaCBuaMawIHNhdToNCiANCi0gQ8OzIDkzNDg3IGjDoG5oIGtow6FjaCBjw7MgdsOpIGjhuqFuZyB0aMawxqFuZyBnaWEgY2hp4bq/bSBraG/huqNuZyBoxqFuIDMxJSBz4buRIGzGsOG7o25nIGjDoG5oIGtow6FjaCB0cm9uZyB04bqtcCBk4buvIGxp4buHdS4gVHJvbmcgxJHDsyBjw7MgxJHhur9uIGjGoW4gODUzODUgaMOgbmgga2jDoWNoIGPDsyBjaHV54bq/biBiYXkgcXXDoSBj4bqjbmggdOG6oWkgw610IG5o4bqldCBt4buZdCDEkWnhu4NtIGThu6tuZywgY2hp4bq/bSDEkeG6v24gaMahbiA5MS4zMyUgc+G7kSBow6BuaCBraMOhY2ggY8OzIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhIHbDoCBraG/huqNuZyAyOCw0NCUgdHLDqm4gdOG7lW5nIHPhu5EgaMOgbmgga2jDoWNoLiBOaOG7r25nIGjDoG5oIGtow6FjaCDhu58gaOG6oW5nIHbDqSBuw6B5IG5oxrBuZyBraMO0bmcgY8OzIMSRaeG7g20gZOG7q25nIGNo4buJIGNoaeG6v20gOC42NiUgbMaw4bujbmcgaMOgbmgga2jDoWNoIOG7nyBjw7luZyBo4bqhbmcgdsOpIHbDoCBjaOG7iSBraG/huqNuZyAyLjclIHRyw6puIHThu5VuZyBz4buRLg0KLSBDw7MgxJHhur9uIDIwNjY2NiBow6BuaCBraMOhY2ggY8OzIGNodXnhur9uIGJheSBo4bqhbmcgcGjhu5UgdGjDtG5nLCB0cm9uZyDEkcOzIGPDsyBraG/huqNuZyA4Ni41JSBow6BuaCBraMOhY2gg4bufIGjhuqFuZyB2w6kgbsOgeSBjw7MgcXXDoSBj4bqjbmggdOG6oWkgw610IG5o4bqldCBt4buZdCDEkWnhu4NtIGThu6tuZyB2w6AgY2hp4bq/bSBraG/huqNuZyA1OS41NiUgdHLDqm4gdOG7lW5nIGjDoG5oIGtow6FjaCBjw7MgdHJvbmcgZGFuaCBzw6FjaC4gTmdvw6BpIHJhIHPhu5EgaMOgbmgga2jDoWNoIGtow7RuZyBjw7MgxJFp4buDbSBk4burbmcgY2jDom4g4bufIGjhuqFuZyB2w6kgbsOgeSBsw6AgMjc5MDIgdOG7qWMgY2hp4bq/bSBraG/huqNuZyA5LjMlIGzGsOG7o25nIGtow6FjaCBow6BuZyB0cm9uZyBi4buZIGThu68gbGnhu4d1Lg0KDQoNCg0KDQpgYGB7cn0NCmRmICU+JSBnZ3Bsb3QoYWVzKHggPSBmY3RfaW5mcmVxKHN0b3BfYW5zKSwgZmlsbCA9IGNsYXNzKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50IC8gc3VtKGNvdW50KSksIGFjY3VyYWN5ID0gMC4wMSkpLCANCiAgICAgICAgICAgIHN0YXQgPSAiY291bnQiLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSwgDQogICAgICAgICAgICBjb2xvciA9ICdibGFjaycpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiRWNvbm9teSIgPSAic2t5Ymx1ZSIsICJCdXNpbmVzcyIgPSAiYnJvd24iKSkgKyBsYWJzKCBmaWxsID0gJ0jhuqFuZyB2w6knLHRpdGxlID0gIlPhu5EgbMaw4bujbmcgY2h1eeG6v24gYmF5IGPDsyBxdcOhIGPhuqNuaCDhu58gY8OhYyBo4bqhbmcgdsOpIikgKyB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gQ2h1eeG6v24gYmF5IGPDsyBxdcOhIGPhuqNuaCBwaOG7lSBiaeG6v24gaMahbjogVOG7tyBs4buHIGNodXnhur9uIGJheSBjw7MgcXXDoSBj4bqjbmggY2FvIGjGoW4gdOG7tyBs4buHIGNodXnhur9uIGJheSBraMO0bmcgcXXDoSBj4bqjbmgg4bufIGPhuqMgaGFpIGjhuqFuZyB2w6kuDQotIEjhuqFuZyB2w6kgcGjhu5UgdGjDtG5nIHBo4buVIGJp4bq/biBoxqFuOiBT4buRIGzGsOG7o25nIGNodXnhur9uIGJheSBo4bqhbmcgcGjhu5UgdGjDtG5nIGNhbyBoxqFuIG5oaeG7gXUgc28gduG7m2kgc+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkgaOG6oW5nIHRoxrDGoW5nIGdpYS4NCi0gVOG7tyBs4buHIGNow6puaCBs4buHY2ggc+G7kSBjaHV54bq/biBiYXkgZ2nhu69hIGhhaSBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSB2w6AgcGjhu5UgdGjDtG5nIGPDsyBz4buxIHTGsMahbmcgxJHhu5NuZyDhu58gaGFpIGjhuqFuZyBt4bulYyBxdcOhIGPhuqNuaCB2w6Aga2jDtG5nIHF1w6EgY+G6o25oDQotIFZp4buHYyBjaMOqbmggbOG7h2NoIHRyb25nIHPhu5EgbMaw4bujbmcgaMOgbmgga2jDoWNoIOG7nyBo4bqhbmcgdGjGsMahbmcgZ2lhIHbDoCBo4bqhbmcgcGjhu5UgdGjDtG5nIGPFqW5nIG5oxrAgY8OzIHF1w6EgY+G6o25oIHbDoCBraMO0bmcgcXXDoSBj4bqjbmggY8OzIHRo4buDIGdp4bqjaSB0aMOtY2ggYuG6sW5nIG5odSBj4bqndSB24buBIHbDqSBnacOhIHLhursg4bufIGtow6FjaCBow6BuZy4NCg0KIyMgKipCaeG6v24gY2xhc3MgdsOgIGRheV9sZWZ0KioNCg0KYGBge3J9DQpkYXk8LSBjdXQoZGYkZGF5c19sZWZ0LGJyZWFrcyA9IGMoMCwxMC41LDMwLjUsNTApLGxhYmVsPWMoJ3Ry4buFJywnduG7q2EnLCdz4bubbScpKQ0KZGY8LWRmJT4lbXV0YXRlKGRmLGRheSkNCmFkZG1hcmdpbnModGFibGUoZGYkY2xhc3MsZGYkZGF5KSkNCnByb3AudGFibGUodGFibGUoZGYkY2xhc3MsZGYkZGF5KSkqMTAwDQpgYGANCg0KYGBge3J9DQpkZiAlPiUgbmEub21pdCgpICU+JSBjb3VudChjbGFzcywgZGF5KSAlPiUgZ3JvdXBfYnkoY2xhc3MpICU+JSBtdXRhdGUocHZpID0gbi9zdW0obikpICU+JSBnZ3Bsb3QoYWVzKHg9Y2xhc3MseT1uLGZpbGw9IGRheSkpK2dlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChwdmksYWNjdXJhY3kgPSAuMDEpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSwgdmp1c3QgPSAtMC41LGNvbG9yID0gJ2JsYWNrJykgKyB0aGVtZV9jbGFzc2ljKCkNCmBgYA0KDQpCaeG6v24gZGF5X2xlc2Z0IMSRxrDhu6NjIGNoaWEgdGjDoG5oIDMgbmjDs20gZ+G7k20gbmjDs20gY8OzIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgdOG7qyB0cuG7hSAoMS0xMCBuZ8OgeSksIHbhu6thKDEwLTMwIG5nw6B5KSwgc+G7m20gKDMwLTQ5IG5nw6B5KS4NCiANClThu6sgxJHDsyBi4bqjbmcgdOG6p24gc+G7kSB2w6AgxJHhu5MgdGjhu4sgduG7q2EgbOG6rXAgxJHGsOG7o2MgdGEgY8OzIG3hu5l0IHPhu5Egbmjhuq1uIHjDqXQgc2F1Og0KDQotIFRyb25nIG5ow7NtIGfhu5NtIDkzMjIxIG5nxrDhu51pIGPDsyB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSAsIGNo4buJIGPDsyAxNjEyOCBuZ8aw4budaSDEkeG6t3QgdsOpIHRy4buFIHThu6ljIHThu6sgMS0xMCBuZ8OgeSB0csaw4bubYyBuZ8OgeSBiYXkgY2hp4bq/bSBraG/huqNuZyAxNy4zJSBz4buRIGjDoG5oIGtow6FjaCDhu58gaOG6oW5nIHbhur0gdGjGsMahbmcgZ2lhIHbDoCBjaOG7iSBraG/huqNuZyA1LDQxJSB0csOqbiB04buVbmcgc+G7kSBuZ8aw4budaSB0cm9uZyBi4buZIGThu68gbGnhu4d1LiBOaOG7r25nIGjDoG5oIGtow6FjaCBjw7MgdGjhu51pIGdpYW4gxJHhurd0IHbDqSDhu58ga2hv4bqjbmcgduG7q2EgdsOgIHPhu5ttIGPDsyB04bu3IGzhu4cgeOG6pXAgeOG7iSBuaGF1IOG7nyBraG/huqNuZyBoxqFuIDQwJSB2w6AgY2hp4bq/bSBwaOG6p24gbOG7m24gdHJvbmcgbmjDs20gdsOpIG7DoHkuDQotIFRyb25nIG5ow7NtIHbDqSBo4bqhbmcgcGjhu5UgdGjDtG5nIGfhu5NtIDIwNTAwNSBuZ8aw4budaSwgdHJvbmcgxJHDsyAzMTMxMiBuZ8aw4budaSAoMTUuMjclKSB0cm9uZyBuaMOzbSBuw6B5IMSR4bq3dCB2w6kgdHLhu4UuIEPDsm4g4bufIGhhaSBwaMOibiBuaMOzbSB24burYSB2w6Agc+G7m20gY8OybiBs4bqhaSBjw7MgdOG7tyBs4buHIHjhuqVwIHjhu4kgbmhhdSB2w6AgxJHhu4F1IHRyw6puIDQwJS4NCi0gVOG7tyBs4buHIOG7nyDhu58gYmEgcGjDom4gbmjDs20gInRy4buFLCB24burYSwgc+G7m20iIOG7nyBoYWkgaOG6oW5nIHbDqSBjw7Mgc+G7sSB0xrDGoW5nIMSR4buTbmcgcsO1IHLhu4d0DQoNCg0KIyMgKipCaeG6v24gQ2xhc3MgdsOgIGJp4bq/biBQcmljZSoqDQoNCsSQ4bqndSB0acOqbiDEkeG7gyB0aOG7sWMgaGnhu4duIMSRxrDhu6NjIGzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGdp4buvYSDEkeG7gyBjaOG7iSByYSBt4buRaSBsacOqbiBo4buHIGdp4buvYSBo4bqhbmcgZ2jhur8gdsOgIGdpw6EgdsOpLCB0csaw4bubYyB0acOqbiBwaOG6o2kgdGnhur9uIGjDoG5oIHBow6JuIHThu5UgZ2nDoSB2w6AgZ8OhbiB2w6BvIGJp4bq/biBt4bubaSBjw7MgdMOqbiBsw6AgcHJpY2VfbGV2ZWwuDQoNCmBgYHtyfQ0Kc3VtbWFyeShkZiRwcmljZSkNCmRmJHByaWNlX2xldmVsIDwtIGN1dChkZiRwcmljZSwgYnJlYWtzID0gYygwLCAyMDg5MCwgMTIzMDcxKSwgbGFiZWxzID0gYygiVGhhcCIsICJDYW8iKSkNCmFkZG1hcmdpbnModGFibGUoZGYkcHJpY2VfbGV2ZWwsIGRmJGNsYXNzKSkNCnByb3AudGFibGUodGFibGUoZGYkcHJpY2VfbGV2ZWwsIGRmJGNsYXNzKSwgbWFyZ2luID0gMikgKiAxMDANCmBgYA0KDQojIyMgKipSZWxhdGl2ZSBSaXNrKioNCg0KYGBge3J9DQp0bXAyPC0gdGFibGUoZGYkcHJpY2VfbGV2ZWwsIGRmJGNsYXNzKQ0KUmVsUmlzayh0bXAyKQ0Kcmlza3JhdGlvKHRtcDIsIHJldiA9ICdiJykNCmBgYA0KDQojIFRI4buQTkcgS8OKIFNVWSBESeG7hE4NCiMjIEtp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCBjaG8gMiBiaeG6v24gxJHhu4tuaCB0w61uaA0KKipLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgY2hvIGJp4bq/biBDbGFzcyB2w6AgQWlybGluZSoqDQpHaeG6oyB0aHV54bq/dDoNCkgwOiBLaMO0bmcgY8OzIHPhu7EgdMawxqFuZyBxdWFuIGdp4buvYSBiaeG6v24gQ2xhc3MgdsOgIEFpcmxpbmUgDQpIMTogQ8OzIHPhu7EgdMawxqFuZyBxdWFuIGdp4buvYSBiaeG6v24gQ2xhcyB2w6AgQWlybGluZQ0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGYkY2xhc3MsZGYkYWlybGluZSkpDQpgYGANCg0KS+G6v3QgcXXhuqMgcC12YWx1ZSA8IDIuMmUtMTYuIE5naMSpYSBsw6AsIHbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgZ2nDoSB0cuG7iyBwX3ZhbHVlIDwwLjA1IG7Dqm4gdGEgYsOhYyBi4buPIEgwLiBW4bqteSB0YSBr4bq/dCBsdeG6rW4gbMOgIGjDoG5oIHZpIGzhu7FhIGNo4buNbiBo4bqhbmcgZ2jhur8gY+G7p2Ega2jDoWNoIGjDoG5nIGPDsyBsacOqbiBxdWFuIMSR4bq/biBow6BuaCB2aSBs4buxYSBjaOG7jW4gaMOjbmcgaMOgbmcga2jDtG5nLg0KDQoqKktp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCBjaG8gYmnhur9uIENsYXNzIHbDoCBTb3VyY2VfQ2l0eSoqDQoNCkdp4bqjIHRodXnhur90Og0KSDA6IEtow7RuZyBjw7Mgc+G7sSB0xrDGoW5nIHF1YW4gZ2nhu69hIGJp4bq/biBDbGFzcyB2w6AgU291cmNlX0NpdHkNCkgxOiBDw7Mgc+G7sSB0xrDGoW5nIHF1YW4gZ2nhu69hIGJp4bq/biBDbGFzIHbDoCBTb3VyY2VfQ2l0eQ0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGYkY2xhc3MsZGYkc291cmNlX2NpdHkpKQ0KYGBgDQoNCkvhur90IHF14bqjIHAtdmFsdWUgPCAyLjJlLTE2LiBOZ2jEqWEgbMOgLCB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGdpw6EgdHLhu4sgcF92YWx1ZSA8MC4wNSBuw6puIHRhIGLDoWMgYuG7jyBIMC4gVuG6rXkgdGEga+G6v3QgbHXhuq1uIGzDoCBow6BuaCB2aSBs4buxYSBjaOG7jW4gaOG6oW5nIGdo4bq/IGPhu6dhIGtow6FjaCBow6BuZyBjw7MgbGnDqm4gcXVhbiDEkeG6v24gxJFp4buDbSB4deG6pXQgcGjDoXQgY+G7p2EgY2h1eeG6v24gYmF5Lg0KDQoqKktp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCBjaG8gYmnhur9uIENsYXNzIHbDoCBTdG9wc19hbnMqKg0KDQpHaeG6oyB0aHV54bq/dDoNCkgwOiBLaMO0bmcgY8OzIHPhu7EgdMawxqFuZyBxdWFuIGdp4buvYSBiaeG6v24gQ2xhc3MgdsOgIFN0b3BzX2Fucw0KSDE6IEPDsyBz4buxIHTGsMahbmcgcXVhbiBnaeG7r2EgYmnhur9uIENsYXMgdsOgIFN0b3BzX2Fucw0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGYkY2xhc3MsZGYkc3RvcF9hbnMpKQ0KDQoNCmBgYA0KS+G6v3QgcXXhuqMgcC12YWx1ZSA8IDIuMmUtMTYuIE5naMSpYSBsw6AsIHbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgZ2nDoSB0cuG7iyBwX3ZhbHVlIDwwLjA1IG7Dqm4gdGEgYsOhYyBi4buPIEgwLiBW4bqteSB0YSBr4bq/dCBsdeG6rW4gbMOgIGjDoG5oIHZpIGzhu7FhIGNo4buNbiBo4bqhbmcgZ2jhur8gY+G7p2Ega2jDoWNoIGjDoG5nIGPDsyBsacOqbiBxdWFuIMSR4bq/biBz4buRIMSRaeG7g20gZOG7q25nIGPhu6dhIGNodXnhur9uIGJheS4NCg0KKipLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgY2hvIGJp4bq/biBDbGFzcyB2w6AgUHJpY2VfbGV2ZWwqKg0KR2nhuqMgdGh1eeG6v3Q6DQpIMDogS2jDtG5nIGPDsyBz4buxIHTGsMahbmcgcXVhbiBnaeG7r2EgYmnhur9uIENsYXNzIHbDoCBQcmljZV9sZXZlbA0KSDE6IEPDsyBz4buxIHTGsMahbmcgcXVhbiBnaeG7r2EgYmnhur9uIENsYXMgdsOgIFByaWNlX2xldmVsDQoNCmBgYHtyfQ0KY2hpc3EudGVzdCh0YWJsZShkZiRjbGFzcyxkZiRwcmljZV9sZXZlbCkpDQpgYGANCkvhur90IHF14bqjIHAtdmFsdWUgPCAyLjJlLTE2LiBOZ2jEqWEgbMOgLCB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGdpw6EgdHLhu4sgcF92YWx1ZSA8MC4wNSBuw6puIHRhIGLDoWMgYuG7jyBIMC4gVuG6rXkgdGEga+G6v3QgbHXhuq1uIGzDoCBow6BuaCB2aSBs4buxYSBjaOG7jW4gaOG6oW5nIGdo4bq/IGPhu6dhIGtow6FjaCBow6BuZyBjw7MgbGnDqm4gcXVhbiDEkeG6v24gbeG7qWMgZ2nDoSB2w6kgY+G7p2EgY2h1eeG6v24gYmF5Lg0KDQoqKktp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCBjaG8gYmnhur9uIENsYXNzIHbDoCBEYXlsZWZ0X2xldmVsKioNCg0KR2nhuqMgdGh1eeG6v3Q6DQpIMDogS2jDtG5nIGPDsyBz4buxIHTGsMahbmcgcXVhbiBnaeG7r2EgYmnhur9uIENsYXNzIHbDoCBEYXlsZWZ0X2xldmVsDQpIMTogQ8OzIHPhu7EgdMawxqFuZyBxdWFuIGdp4buvYSBiaeG6v24gQ2xhcyB2w6AgRGF5bGVmdF9sZXZlbA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGYkY2xhc3MsZGYkZGF5bGVmdF9sZXZlbCkpDQpgYGANCkvhur90IHF14bqjIHAtdmFsdWUgPCAxLjU2N2UtMDYgLiBOZ2jEqWEgbMOgLCB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGdpw6EgdHLhu4sgcF92YWx1ZSA8MC4wNSBuw6puIHRhIGLDoWMgYuG7jyBIMC4gVuG6rXkgdGEga+G6v3QgbHXhuq1uIGzDoCBow6BuaCB2aSBs4buxYSBjaOG7jW4gaOG6oW5nIGdo4bq/IGPhu6dhIGtow6FjaCBow6BuZyBjw7MgbGnDqm4gcXVhbiDEkeG6v24gdGjhu51pIGdpYW4gxJHhurd0IHbDqSBj4bunYSBjaHV54bq/biBiYXkuDQoNCg0KKipLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgY2hvIGJp4bq/biBDbGFzcyB2w6AgRHVyYXRpb25fbGV2ZWwqKg0KDQpHaeG6oyB0aHV54bq/dDoNCkgwOiBLaMO0bmcgY8OzIHPhu7EgdMawxqFuZyBxdWFuIGdp4buvYSBiaeG6v24gQ2xhc3MgdsOgIER1cmF0aW9uX2xldmVsDQpIMTogQ8OzIHPhu7EgdMawxqFuZyBxdWFuIGdp4buvYSBiaeG6v24gQ2xhcyB2w6AgRHVyYXRpb25fbGV2ZWwNCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKGRmJGNsYXNzLGRmJGR1cmF0aW9uX2xldmVsKSkNCmBgYA0KS+G6v3QgcXXhuqMgcC12YWx1ZSA8IDIuMmUtMTYuIE5naMSpYSBsw6AsIHbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgZ2nDoSB0cuG7iyBwX3ZhbHVlIDwwLjA1IG7Dqm4gdGEgYsOhYyBi4buPIEgwLiBW4bqteSB0YSBr4bq/dCBsdeG6rW4gbMOgIGjDoG5oIHZpIGzhu7FhIGNo4buNbiBo4bqhbmcgZ2jhur8gY+G7p2Ega2jDoWNoIGjDoG5nIGPDsyBsacOqbiBxdWFuIMSR4bq/biB0aOG7nWkgZ2lhbiBiYXkgY+G7p2EgY2h1eeG6v24gYmF5Lg0KDQojIyAqKk3DtCBow6xuaCBo4buTaSBxdXkqKg0KDQojIyMgKipNw7QgaMOsbmggaOG7k2kgcXV5IExvZ2lzdGljKioNCg0KIyMjIyAqKkjhu5NpIHF1eSDEkcahbiBiaeG6v24qKg0KDQoqKkjhu5NpIHF1eSBiaeG6v24gQ2xhc3MgdsOgIEFpcmxpbmUgKioNCg0KDQpgYGB7cn0NCmNsYXNzYWlybGluZSA8LSBnbG0oZmFjdG9yKGNsYXNzLCBsZXZlbHMgPSBjKCJFY29ub215IiwiQnVzaW5lc3MiKSkgfiBhaXJsaW5lLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ2xvZ2l0JyksIGRhdGEgPSBkZikNCnN1bW1hcnkoY2xhc3NhaXJsaW5lKQ0KDQoNCmBgYA0KDQoNCkvhur90IHF14bqjIGjhu5NpIHF1eSBtw7QgaMOsbmggbG9naXN0aWMgdHLDqm4gY2hvIHRhIHRo4bqleSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGJp4bq/biBDbGFzcyB2w6AgQWlybGluZS4gSOG7hyBz4buRIEludGVyY2VwdCB0cm9uZyBr4bq/dCBxdeG6oyBj4bunYSBtw7QgaMOsbmggxJHhuqFpIGRp4buHbiBjaG8gJFxiZXRhXzAkICjEkeG6oWkgZGnhu4duIGNobyBsb2cob2Rkcykga2hpIGNodXnhur9uIGJheSDEkcOzIG1hbmcgbmjDo24gaGnhu4d1IEluZGlhKQ0KDQpQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IExvZ2lzdGljIGPhu6dhIENsYXNzIHbDoCBBaXJsaW5lIGPDsyBk4bqhbmc6DQoNCiQkDQpsb2cob2RkcykgPSAtMC4zNzc2NjQgLSAxOC4xODg0MDQuQWlyQXNpYSAtMTguMTg4NDA0LkdvZnJpc3QgLTE4LjE4ODQwNC5JbmRpZ28gLTE4LjE4ODQwNC5TcGljZUpldCArMC4yNzMwNjMuVmlzdGFyYQ0KJCQNCg0KR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6ozogDQoNCi0gSOG7hyBz4buRIGNo4bq3biDEkeG7kWkgduG7m2kgaMOjbmcgaMOgbmcga2jDtG5nIG1hbmcgbmjDo24gaGnhu4d1IEFpckFzaWEsIEdPRklSU1QsIEluZGlnbywgU3BpY2VKZXQgcuG6pXQgbOG7m24sIHbDoCBnacOhIHRy4buLIHBfdmFsdWUgY+G7p2EgbsOzIGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUgbsOqbiBjw6FjIG5ow6NuIGhp4buHdSBuw6B5IGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHRyb25nIG3DtCBow6xuaCBuw6B5Lg0KDQoNCioqxJDhu5FpIHbhu5tpIGNodXnhur9uIGJheSBtYW5nIG5ow6NuIGhp4buHbiBsw6AgVmlzdGFyYSAqKg0KDQotIG9kZHMgPSAkZV57LTAuMzc3NjY0KzAuMjczMDYzfSA9IDAuOSQNCg0KLT4gdOG7tyBs4buHIGNow6puaCBnaeG7r2EgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyB0aMawxqFuZyBnaWEgdsOgIHjDoWMgc3XhuqV0IGNo4buNbiBo4bqhbmcgZ2jhur8gcGjhu5UgdGjDtG5nIGzDoCAwLjkgLCB04bupYyBsw6AgeMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBiw6kgaMahbiB4w6FjIHN14bqldCBow6BuaCBraMOhY2ggY2jhu41uIGjhuqFuZyB2w6kgcGjhu5UgdGjDtG5nIDEwJSAoJDEgKzAuOSA9MC4xJCkgDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgNDcsNCUgKHTDrW5oIHJhIHThu6sgcGjGsMahbmcgdHLDrG5oIG9kZHMgPSAkXGZyYWN7XHBpfXsxLVxwaX0kKQ0KDQoqKsSQ4buRaSB24bubaSBjaHV54bq/biBiYXkgbWFuZyBuaMOjbiBoaeG7h3UgbMOgIEluZGlhKioNCg0KLSBvZGRzID0gJGVeey0wLjM3NzY2NH0gPSAwLjY4NSQNCg0KLT4gdOG7tyBs4buHIGNow6puaCBnaeG7r2EgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyB0aMawxqFuZyBnaWEgdsOgIHjDoWMgc3XhuqV0IGNo4buNbiBo4bqhbmcgZ2jhur8gcGjhu5UgdGjDtG5nIGzDoCAwLjY4NSAsIHThu6ljIGzDoCB4w6FjIHN14bqldCBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGLDqSBoxqFuIHjDoWMgc3XhuqV0IGjDoG5oIGtow6FjaCBjaOG7jW4gaOG6oW5nIHbDqSBwaOG7lSB0aMO0bmcgMzEuNSUgKCQxLSAtMC42ODUgPTAuMzE1JCkgDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgNDAsNjUlICh0w61uaCByYSB04burIHBoxrDGoW5nIHRyw6xuaCBvZGRzID0gJFxmcmFje1xwaX17MS1ccGl9JCkNCg0KPiBIw6NuZyBow6BuZyBraMO0bmcgVmlzdGFyYSBjw7MgdOG7tyBs4buHIGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhIG5oaeG7gXUgaMahbiBzbyB24bubaSBow6NuZyBow6BuZyBraMO0bmcgSW5kaWENCg0KKkjhu4cgc+G7kSBBSUMgY+G7p2EgbcO0IGjDrG5oIG7DoHkgPSAyODYyMTkqDQoNCioqSOG7k2kgcXV5IGJp4bq/biBDbGFzcyB2w6AgU291cmNlX2NpdHkgKioNCg0KYGBge3J9DQoNCmNsYXNzc291cmNlIDwtIGdsbShmYWN0b3IoY2xhc3MsbGV2ZWxzID0gYygiRWNvbm9teSIsIkJ1c2luZXNzIikpIH4gc291cmNlX2NpdHksIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAnbG9naXQnKSwgZGF0YSA9IGRmKQ0KdW5pcXVlKGRmJHNvdXJjZV9jaXR5KQ0Kc3VtbWFyeShjbGFzc3NvdXJjZSkNCg0KDQpgYGANCg0KS+G6v3QgcXXhuqMgaOG7k2kgcXV5IG3DtCBow6xuaCBsb2dpc3RpYyB0csOqbiBjaG8gdGEgdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYmnhur9uIENsYXNzIHbDoCBTb3VyY2VfY2l0eS4NCg0KUGjGsMahbmcgdHLDrG5oIGjhu5NpIHF1eSBMb2dpc3RpYyBj4bunYSBDbGFzcyB2w6AgU291cmNlX2NpdHkgY8OzIGThuqFuZzoNCg0KJCQNCmxvZyhvZGRzKSA9IC0wLjc3MzEyOSArMC4wMzY1MjMuQ2hlbm5haSAtMC4wODA5MjQuRGVsaGkgLTAuMDAxODg4Lkh5ZGVyYWJhZCAtMC4xMTg4NjUuS29sa2F0YSArMC4wNDcyMzguTXVtYmFpDQokJA0KDQpHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjOiANCg0KLSBHacOhIHRy4buLIHBfdmFsdWUgY+G7p2EgSHlkZXJhYmFkIGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUgbsOqbiBiaeG7g3UgaGnhu4duIG7DoHkga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdHJvbmcgbcO0IGjDrG5oIG7DoHkuDQoNCioqxJDhu5FpIHbhu5tpIHRow6BuaCBwaOG7kSBDaGVubmFpKioNCg0KLSBvZGRzID0gJGVeey0wLjc3MzEyOSArMC4wMzY1MjN9ID0gMC40Nzg3JA0KDQotPiB04bu3IGzhu4cgY2jDqm5oIGdp4buvYSB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIGdo4bq/IHRoxrDGoW5nIGdpYSB2w6AgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgbMOgIDAuNDc4NyAsIHThu6ljIGzDoCB4w6FjIHN14bqldCBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGLDqSBoxqFuIHjDoWMgc3XhuqV0IGjDoG5oIGtow6FjaCBjaOG7jW4gaOG6oW5nIHbDqSBwaOG7lSB0aMO0bmcgNTIuMTMlICgkMS0wLjQ3ODcgPTAuNTIxMyQpIA0KDQotIFjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgbMOgIDMyLjM3JSAodMOtbmggcmEgdOG7qyBwaMawxqFuZyB0csOsbmggb2RkcyA9ICRcZnJhY3tccGl9ezEtXHBpfSQpDQoNCioqxJDhu5FpIHbhu5tpIHRow6BuaCBwaOG7kSBEZWxoaSoqDQoNCi0gb2RkcyA9ICRlXnstMC43NzMxMjktMC4wODA5MjR9ID0gMC40MjU2JA0KDQotPiB04bu3IGzhu4cgY2jDqm5oIGdp4buvYSB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIGdo4bq/IHRoxrDGoW5nIGdpYSB2w6AgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgbMOgIDAuNDI1NiwgdOG7qWMgbMOgIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgYsOpIGjGoW4geMOhYyBzdeG6pXQgaMOgbmgga2jDoWNoIGNo4buNbiBo4bqhbmcgdsOpIHBo4buVIHRow7RuZyA0Miw1NiUgDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgMjksODUlIA0KDQoqKsSQ4buRaSB24bubaSB0aMOgbmggcGjhu5EgS29sa2F0YSoqDQoNCi0gb2RkcyA9ICRlXnstMC43NzMxMjktMC4xMTg4NjV9ID0gMC40MDk4JA0KDQotPiB04bu3IGzhu4cgY2jDqm5oIGdp4buvYSB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIGdo4bq/IHRoxrDGoW5nIGdpYSB2w6AgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgbMOgIDAuNDA5OCwgdOG7qWMgbMOgIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgYsOpIGjGoW4geMOhYyBzdeG6pXQgaMOgbmgga2jDoWNoIGNo4buNbiBo4bqhbmcgdsOpIHBo4buVIHRow7RuZyA1OSwwMiUNCg0KLSBYw6FjIHN14bqldCBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGzDoCAyOSwwNiUNCg0KKirEkOG7kWkgduG7m2kgdGjDoG5oIHBo4buRIE11bWJhaSoqDQoNCi0gb2RkcyA9ICRlXnstMC43NzMxMjktMC4wNDcyMzh9ID0gMC40NDAyJA0KDQotPiB04bu3IGzhu4cgY2jDqm5oIGdp4buvYSB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIGdo4bq/IHRoxrDGoW5nIGdpYSB2w6AgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgbMOgIDAuNDQwMiwgdOG7qWMgbMOgIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgYsOpIGjGoW4geMOhYyBzdeG6pXQgaMOgbmgga2jDoWNoIGNo4buNbiBo4bqhbmcgdsOpIHBo4buVIHRow7RuZyA1NSw5OCUNCg0KLSBYw6FjIHN14bqldCBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGzDoCAzMCw1NiUNCg0KKirEkOG7kWkgduG7m2kgdGjDoG5oIHBo4buRIEJhbmdhbG9yZSoqDQoNCi0gb2RkcyA9ICRlXnstMC43NzMxMjl9ID0gMC40NjE1JA0KDQotPiB04bu3IGzhu4cgY2jDqm5oIGdp4buvYSB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIGdo4bq/IHRoxrDGoW5nIGdpYSB2w6AgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgbMOgIDAuNDYxNSwgdOG7qWMgbMOgIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgYsOpIGjGoW4geMOhYyBzdeG6pXQgaMOgbmgga2jDoWNoIGNo4buNbiBo4bqhbmcgdsOpIHBo4buVIHRow7RuZyA1Myw4NCUNCg0KLSBYw6FjIHN14bqldCBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGzDoCAzMSw1NyUNCg0KPiBUaMOgbmggcGjhu5EgQ2hlbm5haSBjw7MgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGzDoCBs4bubbiBuaOG6pXQgKDMyLjM3JSksIHRp4bq/cCDEkeG6v24gbMOgIHRow6BuaCBwaOG7kSBiYW5nYWxvcmUgduG7m2kgeMOhYyBzdeG6pXQgbMOgIDMxLDU3JSwgdGjhu6kgMyBsw6AgdGjDoG5oIHBo4buRIE11bWFiYWkgduG7m2kgeMOhYyBzdeG6pXQgbMOgIDMwLDU2JSwgdGjDoG5oIHBo4buRIGhlbGhpIGPDsyB4w6FjIHN14bqldCAyOSw4NSUgdsOgIGN14buRaSBjw7luZyBsw6AgdGjDoG5oIHBo4buRIEtvbGthdGEgY8OzIHjDoWMgc3XhuqV0IGzDoCAyOSwwNiUuIEdp4buvYSBuaOG7r25nIHRow6BuaCBwaOG7kSBuw6B5IGPDsyBz4buxIGNow6puaCBs4buHY2ggdHJvbmcgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhLCB0dXkgbmhpw6puIHPhu7EgY2jDqm5oIGzhu4djaCBuw6B5IGtow7RuZyDEkcOhbmcga+G7gw0KDQoqSOG7hyBz4buRIEFJQyBj4bunYSBtw7QgaMOsbmggbsOgeSA9IDM3MjEyNSoNCg0KKipI4buTaSBxdXkgYmnhur9uIENsYXNzIHbDoCBQcmljZV9sZXZlbCAqKg0KDQpgYGB7cn0NCmNsYXNzcHJpY2UgPC0gZ2xtKGZhY3RvcihjbGFzcyxsZXZlbHMgPSBjKCJFY29ub215IiwiQnVzaW5lc3MiKSkgfiBwcmljZV9sZXZlbCwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpLCBkYXRhID0gZGYpDQpzdW1tYXJ5KGNsYXNzcHJpY2UpDQpgYGANCg0KS+G6v3QgcXXhuqMgaOG7k2kgcXV5IG3DtCBow6xuaCBsb2dpc3RpYyB0csOqbiBjaG8gdGEgdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYmnhur9uIENsYXNzIHbDoCBQcmljZV9sZXZlbC4gDQoNClBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgTG9naXN0aWMgY+G7p2EgQ2xhc3MgdsOgIFByaWNlX2xldmVscyBjw7MgZOG6oW5nOg0KDQokJA0KbG9nKG9kZHMpID0gLTQuOTg3NjggKyA5LjE1MjA0LkNhbw0KJCQNCg0KKirEkOG7kWkgduG7m2kgY2h1eeG6v24gYmF5IGPDsyBt4bupYyBnacOhIGNhbyoqDQoNCi0gb2RkcyA9ICRlXnstNC45ODc2OCArIDkuMTUyMDR9ID0gNjQuMzUkDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgOTgsNDYlLiANCg0KKirEkOG7kWkgduG7m2kgY2h1eeG6v24gYmF5IGPDsyBt4bupYyBnacOhIHRo4bqlcCoqDQoNCi0gb2RkcyA9ICRlXnstNC45ODc2OH0gPSA2LDgyLjEwXnstM30kDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiB2w6kgdGjGsMahbmcgZ2lhIGzDoCAxLjU0JQ0KDQo+IMSQ4buRaSB24bubaSBuaOG7r25nIGNodXnhur9uIGJheSBjw7MgbeG7qWMgZ2nDoSBjYW8sIGjhuqd1IG5oxrAgxJHhu4F1IHLGoWkgdsOgbyBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYS4gWMOhYyBzdeG6pXQgdsOpIMSRw7MgbMOgIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhIMSR4buRaSB24bubaSBt4bupYyBnacOhIGNhbyBsw6AgOTgsNDYlLiANCg0KKk3DtCBow6xuaCBuw6B5IGPDsyBo4buHIHPhu5EgQUlDIGzDoCAzMTU4MioNCg0KKipI4buTaSBxdXkgYmnhur9uIENsYXNzIHbDoCBTdG9wX2FucyoqDQoNCmBgYHtyfQ0KY2xhc3NzdG9wYW5zIDwtIGdsbShmYWN0b3IoY2xhc3MsbGV2ZWxzID0gYygiRWNvbm9teSIsIkJ1c2luZXNzIikpIH4gc3RvcF9hbnMsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAnbG9naXQnKSwgZGF0YSA9IGRmKQ0Kc3VtbWFyeShjbGFzc3N0b3BhbnMpDQoNCmBgYA0KDQpL4bq/dCBxdeG6oyBo4buTaSBxdXkgbcO0IGjDrG5oIGxvZ2lzdGljIHRyw6puIGNobyB0YSB0aOG6pXkgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBiaeG6v24gQ2xhc3MgdsOgIFN0b3BzX2Fucy4gDQoNClBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgTG9naXN0aWMgY+G7p2EgQ2xhc3MgdsOgIFN0b3BfYW5zIGPDsyBk4bqhbmc6DQoNCiQkDQpsb2cob2RkcykgPSAtMS4yMzY1OSArIDAuNDk3NjkuWWVzDQokJA0KDQoqKsSQ4buRaSB24bubaSBjaHV54bq/biBiYXkgY8OzIMSRaeG7g20gZOG7q25nKioNCg0KLSBvZGRzID0gJGVeey0xLjIzNjU5ICsgMC40OTc2OX0gPSAwLDQ3NzYkDQoNCi0+IFThu7cgbOG7hyBnaeG7r2EgeMOhYyBzdeG6pXQga2jDoWNoIGNo4buNbiBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhIHbDoCB4w6FjIHN14bqldCBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgbMOgIDAsNDc3Ni4gS2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhIGLDqSBoxqFuIGtow6FjaCBow6BuZyBjaOG7jW4gZ2jhur8gcGjhu5UgcGjDtG5nIDUyLDI0JQ0KDQotIFjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgbMOgIDMyLDMyJS4gDQoNCioqxJDhu5FpIHbhu5tpIGNodXnhur9uIGJheSBraMO0bmcgY8OzIMSRaeG7g20gZOG7q25nKioNCg0KLSBvZGRzID0gJGVeey0xLjIzNjU5fSA9IDAsMjkkDQoNCi0+IFThu7cgbOG7hyBnaeG7r2EgeMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBnaOG6vyB0aMawxqFuZyBnaWEgdsOgIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZyBsw6AgMCwyOS4gS2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhIGLDqSBoxqFuIGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZyBsw6AgNzElDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiB2w6kgdGjGsMahbmcgZ2lhIGzDoCAyMiw0OCUNCg0KPiBYw6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgY+G7p2Egbmjhu69uZyBjaHV54bq/biBiYXkgY8OzIMSRaeG7g20gZOG7q25nICgzMiwzMiUpIGNhbyBoxqFuIG5o4buvbmcgY2h1eeG6v24gYmF5IGtow7RuZyBjw7MgxJFp4buDbSBk4burbmcgKDIyLDQ4JSkNCg0KKkjhu4cgc+G7kSBBSUMgY+G7p2EgbcO0IGjDrG5oIG7DoHkgbMOgIDM3MDg1MioNCg0KKipI4buTaSBxdXkgYmnhur9uIENsYXNzIHbDoCBkYXlfbGVmdCoqDQoNCmBgYHtyfQ0KY2xhc3NkYXlsZWZ0IDwtIGdsbShmYWN0b3IoY2xhc3MsbGV2ZWxzID0gYygiRWNvbm9teSIsIkJ1c2luZXNzIikpIH4gZGF5c19sZWZ0LCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ2xvZ2l0JyksIGRhdGEgPSBkZikNCnN1bW1hcnkoY2xhc3NkYXlsZWZ0KQ0KDQpgYGANCg0KS+G6v3QgcXXhuqMgaOG7k2kgcXV5IG3DtCBow6xuaCBsb2dpc3RpYyB0csOqbiBjaG8gdGEgdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYmnhur9uIENsYXNzIHbDoCBkYXlzX2xlZnQNCg0KUGjGsMahbmcgdHLDrG5oIGjhu5NpIHF1eSBMb2dpc3RpYyBj4bunYSBDbGFzcyB2w6AgZGF5X2xlZnQgY8OzIGThuqFuZzoNCg0KJCQNCmxvZyhvZGRzKSA9IC0wLjczOTQ0MjkgLTAuMDAyMDc2MS5kYXlzbGVmdA0KJCQNCg0KLSAkXGJldGEgPSAtMC4wMDIwNzYxJCB0aOG7gyBoaeG7h24gc+G7sSBnaeG6o20geMOhYyBzdeG6pXQgImNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSIgxJHhu5FpIHbhu5tpICJz4buRIG5nw6B5IMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5IiBjYW8gaMahbg0KDQotIEvhur90IHF14bqjIG7DoHkgdGjhu4MgaGnhu4duOiBLaGkgc+G7kSBuZ8OgeSDEkeG6t3QgdsOpIHRyxrDhu5tjIGNodXnhur9uIGJheSB0xINuZyBsw6puIDEgbmfDoHksIHRow6wgeMOhYyBzdeG6pXQgImtow6FjaCBow6BuZyBjaOG7jW4gZ2jhur8gaOG6oW5nIHRoxrDGoW5nIGdpYSIgZ2nhuqNtIHh14buRbmcNCg0KLSBLaGkgZGF5c2xlZnQgPSAwIHRow6wsICRvZGRzID0gZV57LTAuNzM5NDQyOX0gPSAwLjQ3NzM3OTgkDQoNCi0gVsOtIGThu6U6IEtoaSBkYXlzbGVmdCA9IDIgdGjDrCAkb2RkcyA9IGVeey0wLjczOTQ0MjkgLTAuMDAyMDc2MSoyPSAwLjQ3NTQwMTd9JCwgbmdoxKlhIGzDoCB04bu3IGzhu4cgZ2nhu69hIHjDoWMgc3XhuqV0ICJraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIiB2w6AgImtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSBwaOG7lSB0aMO0bmciIGzDoCAwLjQ3NTQwMTcuIFjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgbMOgIDMyLDIyJQ0KDQoqSOG7hyBz4buRIEFJQyBj4bunYSBtw7QgaMOsbmggPSAzNzIzMDMqDQoNCioqSOG7k2kgcXV5IGJp4bq/biBDbGFzcyB2w6AgRHVyYXRpb24qKg0KICANCmBgYHtyfQ0KY2xhc3NkdXJhdGlvbiA8LSBnbG0oZmFjdG9yKGNsYXNzLGxldmVscyA9IGMoIkVjb25vbXkiLCJCdXNpbmVzcyIpKSB+IGR1cmF0aW9uLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ2xvZ2l0JyksIGRhdGEgPSBkZikNCnN1bW1hcnkoY2xhc3NkdXJhdGlvbikNCg0KYGBgDQpL4bq/dCBxdeG6oyBo4buTaSBxdXkgbcO0IGjDrG5oIGxvZ2lzdGljIHRyw6puIGNobyB0YSB0aOG6pXkgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBiaeG6v24gQ2xhc3MgdsOgIER1cmF0aW9uDQoNClBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgTG9naXN0aWMgY+G7p2EgQ2xhc3MgdsOgIER1cmF0aW9uIGPDsyBk4bqhbmc6DQoNCiQkDQpsb2cob2RkcykgPSAtMS4zMTAzMTgwICswLjA0MTA0MjQuZHVyYXRpb24NCiQkDQoNCi0gJFxiZXRhID0gMC4wNDEwNDI0JCBs4bubbiBoxqFuIDAsIHRo4buDIGhp4buHbiBz4buxIGdpYSB0xINuZyB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgxJHhu5FpIHbhu5tpICJ0aOG7nWkgZ2lhbiBiYXkiIGNhbyBoxqFuDQoNCi0gS+G6v3QgcXXhuqMgbsOgeSB0aOG7gyBoaeG7h246IEtoaSB0aOG7nWkgZ2lhbiBiYXkgdMSDbmcgbMOqbiAxIGdp4budLCB0aMOsIHjDoWMgc3XhuqV0ICJraMOhY2ggaMOgbmcgY2jhu41uIGdo4bq/IGjhuqFuZyB0aMawxqFuZyBnaWEiIHTEg25nIGzDqm4uIE9kZHMgxJHGsOG7o2MgbmjDom4gbMOqbiAkZV57MC4wNDEwNDI0fSQNCg0KLSBLaGkgZHVyYXRpb24gPSAwIHRow6wsICRvZGRzID0gZV57LTEuMzEwMzE4MH09MC4yNjk3MzQzJA0KDQotIFbDrSBk4bulOiBLaGkgZHVyYXRpb24gPSAxIHRow6wgJG9kZHMgPSBlXnstMS4zMTAzMTgwKzAuMDQxMDQyNH0gPSAwLjI4MTAzNTEkLCBuZ2jEqWEgbMOgIHThu7cgbOG7hyBnaeG7r2EgeMOhYyBzdeG6pXQgImtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEiIHbDoCAia2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHBo4buVIHRow7RuZyIgbMOgIDAuMjgxMDM1MS4gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgMjEsOTQlDQoNCipI4buHIHPhu5EgQUlDIGPhu6dhIG3DtCBow6xuaCA9IDM2NjY1NCoNCg0KIyMjIyAqKkjhu5NpIHF1eSDEkWEgYmnhur9uKioNCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSDEkWEgYmnhur9uIGJhbyBn4buTbTogDQoNCi0gQmnhur9uIHBo4bulIHRodeG7mWM6IENsYXNzDQotIEJp4bq/biDEkeG7mWMgbOG6rXA6IEFpcmxpbmUsIFNvdXJjZSBjaXR5LCBwcmljZV9sZXZlbCwgc3RvcF9hbnMsZGF5X2xlZnQsIGR1cmF0aW9uDQoNCmBgYHtyfQ0KY2xhc3NhbGwgPC0gZ2xtKGZhY3RvcihjbGFzcyxsZXZlbHMgPSBjKCJFY29ub215IiwiQnVzaW5lc3MiKSkgfiBkZiRhaXJsaW5lICsgZGYkc291cmNlX2NpdHkgKyBkZiRzdG9wX2FucyArIGRmJGRheXNfbGVmdCArZGYkcHJpY2VfbGV2ZWwgKyBkZiRkdXJhdGlvbiwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpLCBkYXRhID0gZGYpDQpzdW1tYXJ5KGNsYXNzYWxsKQ0KDQpgYGANCg0KDQpL4bq/dCBxdeG6oyBj4bunYSBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIGPDsyBk4bqhbmc6DQoNCiQkDQpsb2cob2RkcykgPSAtMy4xMzA3MzQgLTIwLjU4MTQ3OS5haXJsaW5lQWlyQXNpYSAtMjAuNDI5MTc3LmFpcmxpbmVHb2ZpcnN0IC0yNi44MTEzOTUuYWlybGluZUluZGlnbyAtMjAuMTE5MzIzLmFpcmxpbmVTcGljZUpldCArIDAuMjA5NDczLmFpcmxpbmVWaXN0YXJhICAtMS40MjQwODkuc291cmNlY2l0eUNoZW5uYWkgLTEuNDc5MjEwLnNvdXJjZWNpdHlEZWxoaSAtMC4wNTgzNDAuc291cmNlY2l0eUh5ZGVyYWJhZCAtMC45NDU2MjUuc291cmNlY2l0eUtvbGthdGEgLTAuMjU4NjcyLnNvdXJjZWNpdHlNdW1iYWkgLTcuNjQ4NjAzLnN0b3BhbnN5ZXMgKzAuMDYxMzM4LmRheXNfbGVmdCArIDE1LjE5NzQzNS5wcmljZV9sZXZlbENhbyAtMC4wMzgyMjguZHVyYXRpb24NCiQkDQoNCkdp4bqjaSB0aMOtY2gga+G6v3QgcXXhuqMgY+G7p2EgbcO0IGjDrG5oOg0KDQotIEPDoWMgYmnhur9uIGFpcmxpbmVBaXJBc2lhLCBhaXJsaW5lR29maXJzdCwgYWlybGluZUluZGlnbyxhaXJsaW5lU3BpY2VKZXQsIHNvdXJjZV9jaXR5SHlkZXJhYmFkIGPDsyBnacOhIHRy4buLIFBfdmFsdWUgcuG6pXQgbOG7m24sIHBfdmFsdWUgPiAwLjA1IG7Dqm4ga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdHJvbmcgbcO0IGjDrG5oIG7DoHkNCg0KLSBI4buHIHPhu5EgJFxiZXRhXzUgPTAuMjA5NDczJCBjw7Mgw70gbmdoxKlhIGzDoDogdHJvbmcgdHLGsOG7nW5nIGjhu6NwIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBu4bq/dSBjaHV54bq/biBiYXkgbWFuZyBuaMOjbiBoaeG7h3UgbMOgIFZpc3RhcmEgdGjDrCB4w6FjIHN14bqldCAia2jDoWNoIGjDoG5nIGNo4buNbiB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSBsw6AgNSwxMSUNCg0KLSBI4buHIHPhu5EgJFxiZXRhXzYgPS0xLjQyNDA4OSQgY8OzIMO9IG5naMSpYSBsw6A6IHRyb25nIHRyxrDhu51uZyBo4bujcCBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwgbuG6v3UgY2h1eeG6v24gYmF5IHh14bqldCBwaMOhdCB04burIHRow6BuaCBwaOG7kSBDaGVubmFpIHRow6wgeMOhYyBzdeG6pXQgImtow6FjaCBow6BuZyBjaOG7jW4gdsOpIGjhuqFuZyB0aMawxqFuZyBnaWEgbMOgIDEwLDQlDQoNCi0gSOG7hyBz4buRICRcYmV0YV83ID0tMS40NzkyMTAkIGPDsyDDvSBuZ2jEqWEgbMOgOiB0cm9uZyB0csaw4budbmcgaOG7o3AgY8OhYyB54bq/dSB04buRIGtow6FjIGtow7RuZyDEkeG7lWksIG7hur91IGNodXnhur9uIGJheSB4deG6pXQgcGjDoXQgdOG7qyB0aMOgbmggcGjhu5EgRGVsaGkgdGjDrCB4w6FjIHN14bqldCAia2jDoWNoIGjDoG5nIGNo4buNbiB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSBsw6AgMC45OCUNCg0KLSBI4buHIHPhu5EgJFxiZXRhXzkgPS0wLjk0NTYyNSQgY8OzIMO9IG5naMSpYSBsw6A6IHRyb25nIHRyxrDhu51uZyBo4bujcCBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwgbuG6v3UgY2h1eeG6v24gYmF5IHh14bqldCBwaMOhdCB04burIHRow6BuaCBwaOG7kSBLb2xrYXRhIHRow6wgeMOhYyBzdeG6pXQgImtow6FjaCBow6BuZyBjaOG7jW4gdsOpIGjhuqFuZyB0aMawxqFuZyBnaWEgbMOgIDEuNjY5JQ0KDQotIEjhu4cgc+G7kSAkXGJldGFfezEwfSA9LTAuMjU4NjcyJCBjw7Mgw70gbmdoxKlhIGzDoDogdHJvbmcgdHLGsOG7nW5nIGjhu6NwIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBu4bq/dSBjaHV54bq/biBiYXkgeHXhuqV0IHBow6F0IHThu6sgdGjDoG5oIHBo4buRIE11bWJhaSB0aMOsIHjDoWMgc3XhuqV0ICJraMOhY2ggaMOgbmcgY2jhu41uIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhIGzDoCAzLjI2JQ0KDQotIEjhu4cgc+G7kSAkXGJldGFfezExfSA9LTcuNjQ4NjAzJCBjw7Mgw70gbmdoxKlhIGzDoDogdHJvbmcgdHLGsOG7nW5nIGjhu6NwIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBu4bq/dSBjaHV54bq/biBiYXkgY8OzIMSRaeG7g20gZOG7q25nIHRow6wgeMOhYyBzdeG6pXQgImtow6FjaCBow6BuZyBjaOG7jW4gdsOpIGjhuqFuZyB0aMawxqFuZyBnaWEgbMOgIDAuMDAyMDglLg0KDQotIEjhu4cgc+G7kSAkXGJldGFfezEyfSA9MC4wNjEzMzgkIGPDsyDDvSBuZ2jEqWEgbMOgOiB0cm9uZyB0csaw4budbmcgaOG7o3AgY8OhYyB54bq/dSB04buRIGtow6FjIGtow7RuZyDEkeG7lWksIG7hur91ICJz4buRIG5nw6B5IMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5IiB0xINuZyBsw6puIDEgbmfDoHkgKG5naMSpYSBsw6AgxJHhurd0IHbDqSBz4bubbSBoxqFuIDEgbmfDoHkpIHRow6wgeMOhYyBzdeG6pXQgImtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgc+G6vSB0xINuZyBsw6puIg0KDQotIEjhu4cgc+G7kSAkXGJldGFfezEzfSA9MTUuMTk3NDM1JCBjw7Mgw70gbmdoxKlhIGzDoDogdHJvbmcgdHLGsOG7nW5nIGjhu6NwIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBu4bq/dSBjaHV54bq/biBiYXkgY8OzIG3hu6ljIGdpw6EgY2FvIHjDoWMgc3XhuqV0ICJraMOhY2ggaMOgbmcgY2jhu41uIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhIGzDoCA5OS45OSUNCg0KLSBI4buHIHPhu5EgJFxiZXRhX3sxNH0gPS0wLjAzODIyOCQgY8OzIMO9IG5naMSpYSBsw6A6IHRyb25nIHRyxrDhu51uZyBo4bujcCBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwgbuG6v3UgInRo4budaSBnaWFuIGJheSIgdMSDbmcgbMOqbiAxIGdp4budIHRow6wgeMOhYyBzdeG6pXQgImtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgc+G6vSBnaeG6o20geHXhu5FuZw0KDQoNCg0KDQoNCg0KDQo=