Tiến hành phân tích và vẽ đồ thị cho Bộ dữ
liệu
COVID-19 (Coronavirus Disease 2019) là một
bệnh đường hô hấp cấp tính truyền nhiễm gây ra bởi
chủng virus corona SARS-CoV-2 và các biến thể của nó
Nguồn gốc của COVID-19 bắt đầu từ Vũ Hán, Trung Quốc. Virus
corona là một betacorona virus, có nguồn gốc từ vật chủ là loài
dơi
Phương thức lây truyền chính là từ người sang người, qua các giọt
dịch hô hấp của cơ thể
Hiện đã có vắc-xin phòng chống bệnh nhưng việc nghiên cứu phát
triển vắc-xin vẫn tiếp tục
Tính tới hiện tại là năm 2024, mặc dù dịch bệnh đã được kiểm soát và
tình hình đã không còn căng thẳng như lúc trước nhưng vẫn có các trường
hợp ghi nhận mắc Covid-19 ở một số quốc gia
- Ta tiến hành xem coi đến năm 2024 số ca ghi nhận ở các khu vực cũng
như quốc gia là bao nhiêu
1. Biểu đồ thể hiện các ca ghi nhận mắc Covid-19 những ngày
đầu năm 2024
Trong bộ dữ liệu bao gồm có 55 quốc gia và từng quốc
gia này đều được chia thành 6 khu vực do WHO quản lý đã
nêu trên
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.0
## ✔ readr 2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Khuvuc <- CV %>% filter(Year == 2024 & Day>1)
Khuvuc %>% group_by(WHO.region,New.cases) %>%
ggplot(aes(WHO.region,New.cases)) +
geom_col(fill='lightblue') +
labs(title = " Biểu đồ thể hiện ghi nhận mắc Covid-19 những ngày đầu năm 2024 ") +
theme_classic() +
labs(x = 'Khu vực WHO Regions', y = 'Số ca mắc')

Nhận xét
Biểu đồ bên trên thể hiện số lượng ca ghi nhận mắc Covid-19 những
ngày của năm 2024
Dựa theo bộ dữ liệu, ta thấy số lượng được ghi nhận tới 2
ngày cụ thể là 7/1/2024 và ngày 14/1/2024
Mặc dù đã hơn 4 năm kể từ ngày dịch Covid-19 bùng nổ, nhưng tới
hiện này các ca mắc vẫn được ghi nhận khá nhiều ở từng khu vực
WPRO là khu vực Tây Thái Bình Dương có số ca ghi
nhận đến hơn 90,000 ca
3 khu vực gồm EURO - SEARO -
AMRO lần lượt có các ca ghi nhận thấp hơn -
khoảng dưới 30,000 ca
2 khu vực EMRO và AFRO là 2 khu
vực có số lượng không đáng kể
Ta thấy được các nước thuộc khu vực Tây Thái Bình Dương có
số lượng cao hơn hẳn với các nước khu vực còn
lại
Nếu so sánh thì khu vực này gấp hơn 3 lần các khu vực còn
lại
Chứng tỏ dù dịch bệnh đã qua giai đoạn nguy hiểm, nhưng ta vẫn thấy
có các ca ghi nhận mắc bệnh. Vì vậy việc phòng chống dịch Covid-19 và
bảo vệ sức khỏe vẫn luôn là rất quan trọng
2. Biểu đồ thể hiện các ca tử vong vì Covid-19 những ngày
đầu năm 2024
Bên cạnh các ca ghi nhận bên trên, cũng là các ca đã ghi nhận
tử vong vì Covid-19 trong những ngày đầu năm 2024
Ta tiến hành xem biểu đồ dưới đây :
Khuvuc %>% group_by(WHO.region,New.cases) %>%
ggplot(aes(New.deaths,WHO.region)) +
geom_col(fill='red') +
labs(title = " Biểu đồ thể hiện ghi nhận tử vong vì Covid-19 những ngày đầu năm 2024 ") +
theme_classic() +
labs(x = 'Khu vực WHO Regions', y = 'Số ca tử vong')

Nhận xét
May mắn rằng các ca ghi nhận tử vong trong biểu đồ trên không nhiều
như biểu đồ ghi mắc bệnh
Ta thấy rằng số lượng ở mỗi khu vực đều dưới 500 ca, cụ thể như
sau :
Khu vực EURO - Châu Âu có ca ghi nhận tử
vong hơn 300 ca, khoảng 1% trong 30,000 ghi nhận bên
trên
Khu vực WPRO với hơn 90,000 ca mắc bệnh thì
khoảng gần 200 ca tử vong
Khu vực SEARO với khoảng hơn 100 ca tử
vong
3 khu vực còn lại là AMRO -
EMRO - AFRO có số lượng lần lượt thấp
hơn hẳn - dưới 50 ca
Các quốc gia Châu Á, Thái Bình Dương mặc dù có lượng ghi nhận mắc
nhiều nhất nhưng lại chữa bệnh khá tốt, tỷ lệ tử vong là ít hơn
hẳn
So với Châu Á thì các nước Châu Âu có tỷ lệ tử vong cao hơn,
nhưng cũng không quá đáng kể
Còn lại các khu vực khác vừa có số ca mắc không quá nhiều và số
ca tử vong cũng nằm ở mức rất ít
Các ca ghi nhận mắc ở biểu đồ đầu tiên không phải là thấp mà vẫn là
khá cao cộng thêm các ca ghi nhận tử vong bên trên thì đó như là lời
cảnh tỉnh để mọi người biết cách phòng chống dịch một cách hiệu quả
hơn
3. Biểu đồ so sánh các ca tử vong vì Covid-19 những ngày đầu
năm 2024
Để thấy rõ hơn các ca tử vong, ta có thể sử biểu độ cột chồng để dễ
so sánh và nhận xét hơn
Ta xem biểu đồ sau :
Khuvuc %>% ggplot(aes(x=New.deaths, fill=WHO.region)) +
geom_histogram(position = "dodge", binwidth = 50) +
labs(title = " Biểu đồ so sánh các ca ghi nhận tử vong ở các khu vực ") +
labs(x = 'Số ca tử vong', y = 'Số lượng ghi nhận')

Nhận xét
Cũng là số liệu như biểu đồ số 2, nhưng các khu vực đã được tách ra
và xếp chồng ra như biểu đồ trên
4. Biểu đồ thể hiện số ca mắc Covid-19 theo ngày ở Việt
Nam
Sau khi nhìn sơ về tình hình hiện tại bằng 3 biểu đồ bên trên, ta sẽ
tiến hành xét trên các quốc gia riêng lẻ
Trải qua hơn 3 năm phòng, chống đại dịch COVID-19, với tinh thần đặt
sức khỏe, tính mạng của người dân lên trên hết
Và ta sẽ tiến hành xem các ca được ghi nhận mắc Covid-19 của Việt Nam
qua các biểu đồ
VN <- CV %>% filter(Country== 'Viet Nam')
table(cut(VN$New.cases,4))
##
## (-1.85e+03,4.61e+05] (4.61e+05,9.23e+05] (9.23e+05,1.38e+06]
## 204 3 2
## (1.38e+06,1.85e+06]
## 2
Như đã nói ban đầu, mỗi quốc gia riêng biệt sẽ có 211 ngày báo cáo,
và từng ngày đều có số lượng ca ghi nhận hay tử vong khác nhau
Ta tiến hành chia các ngày đó thành 4 nhóm ghi nhận
các ca mắc khác nhau, ta tiến hành đặt tên như sau :
Nhóm Ít có 204 ngày ghi nhận
khoảng từ 0 - 461,000 ca
Nhóm Vừa có 3 ngày ghi nhận
khoảng từ 461,000 - 923,000 ca
Nhóm Nhiều có 2 ngày ghi nhận
khoảng từ 923,000 - 1,300,000 ca
Nhóm Rất nhiều có 2 ngày ghi
nhận khoảng từ 1,300,000 - 1,800,000 ca
Sau đó ta tiến hành vẽ biểu đồ thể hiện
VN1 <- VN %>% mutate(Socaghinhan = cut(New.cases,4, label = c('Ít','Vừa','Nhiều','Rất nhiều')))
VN1 %>% group_by(Socaghinhan) %>% summarise(n = n()) %>%
ggplot(aes(Socaghinhan,n)) +
geom_col(fill='yellow') +
labs(title = " Biểu đồ thể hiện số ca ghi nhận của Việt Nam ") +
geom_text(aes(label = n),vjust = 0, color = 'black') +
labs(x = 'Số ca ghi nhận', y = 'Số ngày ghi nhận')

Nhận xét
Số ca ghi nhận từ 0 - 461,000 ca rơi vào khoảng
204 ngày cho nhóm ít trên biểu đồ
Đương nhiên trong 204 ngày, sẽ có ngày không ghi nhận ca nào, có
ngày ghi nhận tối đa 461,000 ca
Nhóm Vừa ghi nhận có 3 ngày có số ca
461,000 - 923,000 ca
2 nhóm Nhiều và Rất nhiều đều có lượng ghi nhận
trên 1,000,000 ca mắc và có khoảng 4 ngày có số lượng như thế
Và số lượng nhiều nhất mà Việt Nam ghi nhận được
đó là khoảng 1,800,000 ca mắc trong một ngày
Trong tổng 211 ngày báo cáo của Việt Nam thì số lượng mỗi ngày đều
khác nhau, có ngày ghi nhận ghi nhận ít, có ngày ghi nhận đến kỷ lục,
nhưng chúng ta đã vững vàng vượt qua những đợt dịch tàn khốc đó bằng sự
chỉ đạo sát sao, kịp thời của Đảng, Nhà nước, Chính phủ và sự đồng lòng
của người dân
5. Biểu đồ thể hiện số ca mắc Covid-19 theo ngày ở Việt Nam
và Trung Quốc
Ở biểu đồ trên, mặc dù ta đã chia thành các các mức ghi nhận ca mắc
ra thành 4 nhưng số lượng ca ở mức Ít vẫn khá nhiều và ta không thể thấy
cụ thể bên trong có số lượng như thế nào
Bây giờ ta sẽ tiến hành chia theo mong muốn, thành các mức nhỏ hơn
một chút nữa, để thấy được các ca ghi nhận như thế nào
Đồng thời, ta cũng sẽ so sánh mức ghi nhận này với một nước bạn của
Việt Nam - đó là Trung Quốc
VNTQ <- CV %>% filter(CV$Country =='China' | CV$Country == 'Viet Nam')
VNTQ1 <- VNTQ
VNTQ1$New.cases.GN <- case_when(VNTQ1$New.cases <10000 ~ 'Ghi nhận Không đáng kể', VNTQ1$New.cases >=10000 & VNTQ1$New.cases <100000 ~ 'Ghi nhận Ít', VNTQ1$New.cases >=100000 & VNTQ1$New.cases <500000 ~ 'Ghi nhận Vừa', VNTQ1$New.cases >=500000 ~ 'Ghi nhận Nhiều')
table(VNTQ1$New.cases.GN)
##
## Ghi nhận Ít Ghi nhận Không đáng kể Ghi nhận Nhiều
## 54 302 17
## Ghi nhận Vừa
## 49
Số lượng ngày ghi nhận trên là của cả 2 nước Việt Nam và Trung
Quốc
Bây giờ sẽ tiến hành so sánh chúng bằng biểu đồ thể hiện :
VNTQ2 <- VNTQ1 %>% group_by(New.cases.GN, Country) %>% summarise(n = n())
## `summarise()` has grouped output by 'New.cases.GN'. You can override using the
## `.groups` argument.
VNTQ2 %>% ggplot(aes(x= New.cases.GN, y=n)) +
geom_col(data = VNTQ2 %>% filter(Country == 'Viet Nam'), fill = 'red') +
geom_col(data = VNTQ2 %>% filter(Country == 'China'), fill = 'yellow') +
labs(title = " Biểu đồ thể hiện số ca ghi nhận của Việt Nam và Trung Quốc") +
labs(x = 'Số ca ghi nhận chia theo nhóm', y = 'Số ca ghi nhận')

Nhận xét
Theo như biểu đồ thì :
Dựa trên biểu đồ ta có một vài nhận xét sau :
Ở nhóm Ghi nhận Ít (dưới 10,000 ca/ 1 ngày báo
cáo) - số ca ở Việt Nam là nhỉnh hơn so với
Trung Quốc
Ở nhóm Không đáng kể cũng như vậy, khoảng cách
chỉ là khoảng 1-2 ngày mà thôi
Còn ở 2 nhóm ghi nhận Nhiều và Vừa thì số lượng ca của Trung Quốc
đã hoàn toàn che lấp Việt Nam
Chứng tỏ trong các ngày báo cáo như nhau, số lượng ghi nhận ở Trung
Quốc là nhiều hơn so với Việt Nam
6. Biểu đồ thể hiện số ca mắc Covid-19 theo từng mức ở Việt
Nam so với Trung Quốc
Ta đã chia các mức ghi nhận thành 4 nhóm, và biểu đồ số 5 đã thể hiện
của Việt Nam và Trung Quốc
Ở mức ghi nhận Ít có số lượng ca dưới 10,000
ca 1 ngày - tổng thu được từ 2 nước là có 54
ngày ghi nhận
Ta muốn biết cụ thể bên trong 54 ngày, từng ngày có số ca ghi nhận cụ
thể như thế nào, ta có thể xem biểu đồ dưới đây :
ggplot(data = VNTQ %>% filter(New.cases<10000),
mapping = aes(y=Country, x=New.cases, fill = Country)) +
geom_violin() +
labs(title = "B) violin plot by gender")

Nhận xét
Vì nhóm ghi nhận Ít được tổng hợp dựa trên các ngày báo cáo có số ca
dưới 10,000 ca nên ta sẽ lọc từ con số đấy ra
Ta thấy số lượng ca dưới 2,500 là nhiều hơn hẳn, ta thấy trong
biểu đố cả Việt Nam và Trung Quốc đều phình to ra ở phần đáy
Còn trên mức 2,500 thì số lượng hẹp dần - đồng nghĩa số ngày ghi
nhận số ca này cũng ít hơn
Vậy trong 54 ngày của nhóm Ít này, thì số ca đa số sẽ được ghi
nhận ở mức dưới 2,500 ca là nhiều cho một ngày
7. Biểu đồ thể hiện số ca mắc Covid-19 theo từng mức ở Việt
Nam so với Trung Quốc
Như biểu đồ 6, ta lọc dựa trên các ngày báo cáo dưới 10,000 ca
Thì biểu đồ số 7 sẽ lọc dựa trên các ngày báo cáo dưới 100,000 ca
Nếu dưới 100,000 ca thì sẽ bao gồm nhóm ớ mức Ghi nhận Ít và Không
đáng kể đã nêu bên trên
ggplot(data = VNTQ %>% filter(New.cases<100000),
mapping = aes(y=Country, x=New.cases, fill = Country)) +
geom_jitter()

Nhận xét
Ở các ca có mức ghi nhận thấp (dưới 2,500 ca) thì có số lượng
ngày nhiều hơn - ta thấy trong biểu đồ, các chấm hiển thị ở phần đáy dày
đặc hơn
Và ở bên phần của Việt Nam thì số lượng ở mức dưới 2,500 là nhiều
hơn so với Trung Quốc
Còn từ mức 2,500 ca trở lên thì các chấm bắt đầu thưa hơn
hẳn
Ở đây ta lọc để thấy rõ được 2 nhóm mức ghi nhận là Ít và Không đáng
kể, chứ nếu xét tối đa các ca mắc được ghi nhận thì tổng quan sẽ hoàn
toàn thay đổi
8. Biểu đồ tròn thể hiện số ca mắc Covid-19 của các quốc
gia
Tương tự với cách chia theo các nhóm Ghi nhận bên trên - gồm 4 nhóm :
Ít, Không đáng kể, Vừa, Nhiều
Ta tiến hành thể hiện nó với quy mô của tất cả các quốc gia có trong
bộ dữ liệu
Trong bộ dữ liệu có tổng cộng 11,605 ngày báo cáo - tương đương
với 11,605 ngày ghi nhận các ca mắc Covid-19
Ta chia các ngày đó theo 4 nhóm ghi nhận đã nói trên và thể hiện
nó lên biểu đồ Tròn
Việc thể hiện trên biểu đồ tròn như vậy, có thể giúp ta hình dung
trên toàn thế giới, số lượng ca ghi nhận sẽ rơi vào số lượng nhóm nào
nhiều nhất
Ta có biểu đồ tròn sau :
CVV <- CV
CVV$New.cases.GN <- case_when(CVV$New.cases <10000 ~ 'Ghi nhận Không đáng kể', CVV$New.cases >=10000 & CVV$New.cases <100000 ~ 'Ghi nhận Ít', CVV$New.cases >=100000 & CVV$New.cases <500000 ~ 'Ghi nhận Vừa', CVV$New.cases >=500000 ~ 'Ghi nhận Nhiều')
CVV %>% group_by(New.cases.GN) %>% summarise(n = n()) %>%
ggplot(aes(x ='', y = n, fill = New.cases.GN)) +
geom_col(color = 'black') +
coord_polar('y') +
geom_text(aes(x = 1.3, label = n),position = position_stack(vjust = .5)) +
theme_void() +
scale_fill_brewer()

Nhận xét
Dựa trên biểu đồ tròn ta thấy được :
Ở đa số các quốc gia, mức Ghi nhận Không đáng kể là nhiều
nhất - cũng có nghĩa trong 7499 ngày báo cáo sẽ có khoảng
10,000 - 100,000 ca
Lần lượt còn lại là các mức Ghi nhận Ít, Vừa, Nhiều với
Mức Ghi nhận Ít có khoảng 2864 ngày, tương đương
với mức này là số ca ghi nhận dưới 10,000 ca
Còn 2 mức Vừa và Nhiều có ca ghi nhận lần lượt
là 1007 và 235 ngày
Đây chỉ là mức nhận xét tổng quan về tình hình của thế giới về ca ghi
nhận, chưa đánh giá được cụ thể được ở từng quốc gia
9. Biểu đồ tròn thể hiện số ca mắc Covid-19 của từng quốc
gia cụ thể
Nếu muốn thấy rõ ràng từng nhóm ghi nhận ở các quốc gia hay ở từng
khu vực riêng biệt, ta có thể lọc cụ thể nếu muốn
Biểu đồ dưới đây cũng có mức chia như 2 biểu đồ 5 và 6, nhưng cụ thể
ở đây là của nước Mỹ (United States of America)
CVV %>% filter(Country== 'United States of America') %>%
group_by(New.cases.GN) %>% summarise(n = n()) %>%
ggplot(aes(x ='', y = n, fill = New.cases.GN)) +
geom_col(color = 'black') +
coord_polar('y') +
geom_text(aes(x = 1.3, label = n),position = position_stack(vjust = .5)) +
theme_void()

Nhận xét
Dựa vào biểu đồ ta thấy :
Nhóm Ghi nhận Ít có số lượng ca dưới
10,000 ca 1 ngày - tổng thu được từ 2 nước là có 11
ngày ghi nhận
Nhóm Ghi nhận Không đáng kể có số ca từ
10,000 - 100,000 ca, tổng thu được là 46
ngày
Nhóm Ghi nhận Vừa có số ca từ 100,000 -
500,000 ca, tổng là 90 ngày
Nhóm Ghi nhận Nhiều có số ca hơn 500,000
ca, tổng là 64 ngày
Ngược lại với Trung Quốc và Việt Nam hay cả với tổng quan của thế
giới là mức Ít và Không đáng kể sẽ chiếm nhiều nhất
Nước Mỹ lại có số ca ghi nhận ở mức Vừa và Nhiều là nhiều
nhất, nghĩa là số ca ghi nhận đa số sẽ từ 100,000 ca trở
lên
Số ngày của mức ghi nhận Nhiều phải gấp gần 6 lần so với mức ghi
nhận Ít và gấp khoảng 1,3 lần so với Không đáng kể
Số người mắc Covid-19 ở quốc gia này là nhiều hơn hẳn
10. Biểu đồ cột chồng thể hiện số ca mắc Covid-19 của từng
quốc gia
Tương tự biểu đồ tròn số 9, nhưng thì là hình tròn - ta thể hiện nó
bằng cột chồng
Và Quốc gia ta lựa chọn chính là nước có số lượng ca mắc Covid-19
nhiều nhất Châu Á - chính là Ấn Độ India
CVV %>% filter(Country== 'India') %>%
group_by(New.cases.GN) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = New.cases.GN)) +
geom_col() +
geom_text(aes(label = n),position = position_stack(vjust = 1)) +
scale_fill_brewer() +
labs(title = " Biểu đồ cột chồng thể hiện số lượng ca ghi nhận của từng quốc gia") +
labs(x = 'Số ca ghi nhận chia theo nhóm', y = 'Số ca ghi nhận')

Nhận xét
Dựa theo cách chia các nhóm ghi nhận như ở biểu đồ 7,6,5, thì ta thấy
Ấn Độ có :
Nhóm Ghi nhận Không đáng kể đứng đầu với
76 ngày báo cáo
Nhóm Ghi nhận Vừa đứng nhì với 58 ngày
Còn lại lần lượt là nhóm Ít với 55 ngày và nhóm Nhiều với 22
ngày
Nhìn chung so với các nước Châu Á khác - cụ thể là Việt Nam và Trung
Quốc đa nói trên
Số lượng ở 2 nhóm có ca ghi nhận nhiều là Vừa và Nhiều chiếm cao
hơn so với Việt Nam và Trung Quốc
Còn 2 nhóm ghi nhận còn lại thì độ ở nhóm Ít thì là nhiều hơn,
còn với nhóm Không đáng kể là ít hơn
11. Biểu đồ thể hiện tổng quan các ca mắc Covid-19 ở Việt
Nam qua các năm
Trong hơn 4 năm chống dịch của Việt Nam, đất nước ta cũng trải qua
những thời điểm có ca ghi nhận đến kỷ lục
Nhưng với sự đồng lòng của tất cả người dân cùng chính phủ chung tay
chống dịch, số ca mắc và tử vong và giảm đáng kể
Ta có thể xem biểu đồ dưới đây :
VN %>% filter(New.cases>0) %>%
ggplot(aes(x=Year, y=New.cases)) +
geom_point(color = 'red') +
labs(title = "Biểu đồ số ca ghi nhận mắc covid của Việt Nam") +
labs(x = 'Năm ghi nhận', 'Số ca ghi nhận')

Nhận xét
Ta có thể thấy tổng quan về các ca ghi nhận
Năm 2020 - đây là thời điểm mới bắt đầu dịch,
nên số lượng ghi nhận ban đầu không nhiều lắm
Năm 2021 - dịch bệnh đang từ từ bùng nổ, các ca
mắc đã được ghi nhận nhiều hơn
Năm 2022 - đây là năm bùng nổ dịch ở nước ta cao
nhất, các ca ghi nhận mỗi ngày là rất nhiều, kỷ lục nhiều nhất lên đến
hơn 1,500,00 ca
Tới năm 2023 - dịch bệnh đã được kiểm soát tốt,
số lượng ca mắc cũng đã giảm rất nhiều
Bên cạnh đó, ta có thể xem biểu đồ các ca tử vong như dưới đây :
12. Biểu đồ thể hiện tổng quan các ca tử vong vì Covid-19 ở
Việt Nam qua các năm
VN %>% filter(New.cases>0) %>%
ggplot(aes(x=Year, y=New.deaths)) +
geom_line(color = 'black', linewidth = 1) +
geom_point(color = 'red') +
labs(title = "Biểu đồ số ca ghi nhận tử vong covid của Việt Nam") +
labs(x = 'Năm ghi nhận', 'Số ca tử vong')

Nhận xét
So với biểu đồ các ca ghi nhận thì mặc dù năm 2022 có số lượng ghi
nhận nhiều nhất, nhưng năm 2021 lại có số lượng tử vong nhiều hơn
Năm 2021 có số lượng tử vong nhiều hơn các năm
còn lại
Thời điểm năm 2021, chúng ta chỉ mới bước vào giai đoạn đầu, nên
kinh nghiệm hay cách phòng ngừa chưa được cao
Đến năm 2022, ta đã thấy được mức độ nguy hiểm
của Covid mang đến, nên tỷ lệ tỷ vong là ít hơn
Và đến năm 2023 thì số lượng đã giảm cực kỳ đáng
kể
Với tinh thần “Chống dịch như chống giặc”, Việt Nam ta đã thực hiện
rất tốt và còn được công nhận là một trong những nước kiểm soát tốt nhất
thế giới
13. Biểu đồ thể hiện mức tăng tích lũy của các ca mắc
Covid-19 theo ngày/tháng/năm ở Việt Nam
Biểu đồ số 11 và 12 thể hiện các ca ghị nhận và tử vong theo từng
năm
Mỗi năm đều có các số liệu khác nhau, nhưng khoảng cuối năm 2021 đầu
năm 2022 chính là thời điểm bùng nổ nhiều nhất
Ta sẽ tiếp tục tiến hành xem xét 6 tháng cuối của năm
2021, để xem số ca tích lũy có tăng quá nhiều
và đáng kể hay không :
VN %>% filter(Year==2021 & Month>6) %>%
ggplot(aes(x=Month, y=Cumulative.cases)) +
geom_line(color = 'black', linewidth = 1) +
labs(title = "Biểu đồ số ca ghi nhận mắc covid của Việt Nam 6 tháng cuối 2021") +
labs(x = 'Tháng ghi nhận', y = 'Số ca ghi nhận tích lũy')

Lưu ý
Số ca mắc tích lũy là số lượng được cộng dồn để
thấy được tổng cộng có bao nhiêu ca mắc tính từ khi dịch bùng
nổ
Tích lũy cộng dồn không có nghĩa là ngày nào cũng có số ca như
vậy, mà con số có được là được cộng từng ngày từng ngày
với nhau
Vd nếu như có một ngày có ít ca mắc Covid - thì con số tích lũy
sẽ được giữ nguyên hoặc tăng tương ứng
Trong số ca tích lũy, có thể đã có bệnh nhân khỏi bệnh, có thể có
bệnh nhân đã tử vong
Nhận xét
Trong 6 tháng cuối của năm 2021, ta đã thấy số lượng ca tích lũy có
tăng, nhưng cũng có thời điểm nó giữ nguyên
Số ca đã vượt mốc 500,000 ca vào khoảng
tháng 9/2021
Sau đó thì con số này lại tiếp tục tăng
Vào khoảng tháng 11/2021, số ca mắc đã chạm
1,000,000 ca
Và tới cuối năm là tháng 12, Việt Nam đã ghi
nhận hơn 1,600,000 ca mắc Covid-19
Dù có các thời điểm số ca tích lũy không tăng nhiều nhưng nhìn chung
các ca mắc vẫn tăng rất nhiều trong thời điểm này
14. Biểu đồ so sánh số ca mắc và tử vong vì Covid-19 của
Việt Nam
Trong 4 năm thì số ca ghi nhận của Việt Nam cũng là khá nhiều, bên
cạnh đó đã có những bệnh nhân đã không may mắn qua khỏi
Chính phủ và Nhà nước Việt Nam cũng đã cố hết sức để cùng người dân
chung tay chống dịch
Và biểu đồ dưới đây, cho ta thấy rõ 2 mức tích lũy ghi nhận và tử
vong :
(Ta tiến hành vẽ dựa trên tháng 12 của từng năm - có thể thay đổi nếu
muốn)
VN %>% filter(Month==12) %>%
ggplot(aes(x=Year, y=Cumulative.cases)) +
geom_line(aes(color = "Số ca ghi nhận tích lũy"), linewidth = 1) +
geom_line(aes(y = Cumulative.deaths, color = "Số ca tử vong tích lũy"), linewidth = 1) +
scale_y_log10() +
labs(title = "Biểu đồ số ca ghi nhận mắc và tử vong tích lũy của Việt Nam") +
labs(x = 'Năm ghi nhận', y = 'Số ca tích lũy')

Nhận xét
Nhìn tổng quan ta thấy được, đã có rất nhiều bệnh nhân đã được chửa
khỏi Covid-19
Số lượng ca mắc từ năm 2020 đến 2021 là
tăng nhiều nhất và ca tử vong thời
điểm này cũng như vậy
Trong 2 năm tiếp theo, thì số ca tích lũy ghi
nhận cũng tăng nhưng có vẻ không nhiểu như trước
Còn các ca tử vong thì cũng tăng chậm hơn đáng kể
Và tới năm 2023 thì số lượng tích lũy của cả 2
đã gần như tăng với lượng rất ít
15. Biểu đồ tần số các ca tử vong của Việt Nam khi so sánh
với Trung Quốc
Biểu đồ tấn suất về các ca ghi nhận tử vong dưới đây là trong khoảng
thời gian năm 2022
Để biết được giữa Việt Nam và Trung Quốc trong năm 2022, sự khác biệt
về số ca tử vong là quá rõ rệt hay không
CVD <- CV
CVD1 <- CVD
CVD1 %>% filter(Country=="Viet Nam" & Year==2022| Country == "China" & Year==2022) %>%
ggplot(aes(x=New.deaths, color=Country)) +
geom_freqpoly(linewidth = 1) +
labs(title = "Biểu đồ tần số các ca tử vong của Việt Nam khi so sánh với Trung Quốc 2022") +
labs(x = 'Số ca ghi nhận', y = 'Tần số xuất hiện')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Nhận xét
Vào những ngày có số lượng ca từ vong từ 0-2000
ca thì số lượng của Trung Quốc là nhỉnh hơn so
với Việt Nam
Mỗi nước đều có số lượng từ vài trăm đến vài ngàn ca tử
vong
Nhưng số lượng của Trung Quốc là nhiều hơn Việt Nam một
chút
Ngoài ra, Trung Quốc còn ghi nhận số ca tử vong nhiều nhất trong
năm 2022 là gần 6,000 ca
Còn Việt Nam tối đa trong năm 2022 chỉ khoảng 1,400 ca tử
vong
16. Biểu đồ so sánh số ca mắc và tử vong của Việt Nam với
một số nước khác năm 2020
Biểu đồ tần số số 13 đã so sánh nước ta với Trung Quốc về số lượng ca
tử vong
Thì biểu đồ này sẽ thêm một nước là Ấn Độ và cả số ca ghi nhận
nữa
Ta có biểu đồ sau :
CVV %>% filter(Country== 'China' & Year==2022 | Country== 'India'& Year==2022 | Country== 'Viet Nam'& Year==2022) %>%
ggplot(aes(x=New.cases, y=New.deaths, color= Country.code)) +
geom_line(linewidth=1) +
geom_point() +
labs(title = "Biểu đồ so sánh số ca ghi nhận và tử vong của Việt Nam với nước khác 2022") +
labs(x = 'Số ca ghi nhận', y = 'Số ca tử vong')

Nhận xét
Country.code trong biểu đồ có nghĩa là mã viết tắt quốc gia, cụ thể
là :
CN là Trung Quốc (China) - có đường trong biểu
đồ là màu đỏ
IN là Ấn Độ (India) - có đường trong biểu đồ là
màu xanh lá
VN là Việt Nam (Viet Nam) - có đường trong biểu
đồ là màu xanh dương
Ta thấy được từ biểu đồ :
Đường màu đỏ của Trung Quốc có lượng ở số ca ghi
nhận và tử vong đều tăng
Đã có thời điểm trong năm 2022, Trung Quốc đạt số ca ghi
nhận đến hơn 40,000,000 ca, và số ca tử vong là gần
6,000 ca
Ấn Độ với đường màu xanh lá cũng có mức ghi nhận
đáng chú ý
Dù có số lượng ghi nhận không cao như Trung Quốc nhưng đã có
gần 8,000 ca tử vong
Riêng Việt Nam - đường màu xanh dương, cả ở mức
ghi nhận hay tử vong đều ở mức thấp hơn
17. Biểu đồ thể hiện số ca mắc và tử vong của các quốc gia
Châu Âu
Sau khi đã nhìn hết các biểu đồ của Việt Nam, ta tiến hành đi sang
các nước bạn ở thế giới
Ta có thể chọn khu vực châu lục, hay theo khu vực WHO phân
thành,…
Biểu đồ dưới đây thể hiện số ca ghi nhận cũng như tử vong ghi nhận
của các quốc gia Châu Âu
CVV %>% filter(Continents== 'Europe' & Year==2020 & Month== 12) %>%
ggplot(aes(x=New.deaths, y=New.cases, color= Country)) +
geom_point() +
labs(title = "Biểu đồ thể hiện số ca ghi nhận và tử vong của các quốc gia Châu Âu") +
labs(x = 'Số ca tử vong', y = 'Số ca ghi nhận')

Nhận xét
Có tổng cộng 14 quốc gia thuộc khu vực Châu Âu như bên trên
Biểu đồ được vẽ dựa trên số ca ghi nhận và tử vong vào tháng
12/2020
Lúc này, tổng quan cho thấy các quốc gia Châu có số ca ghi nhận
rơi vào khoảng hơn 50,000 ca
Và các ca tử vong cũng chỉ dưới 6,000 ca
Vào thời điểm cuối năm 2020 thì dịch bệnh ở Châu Âu chưa bùng phát
cao nhất nên các con số ta thấy vẫn không phải là quá lớn
18. Biểu đồ thể hiện xu hướng các ca mắc và tử vong của các
quốc gia Châu Âu
CVV %>% filter(Continents== 'Europe' & Year==2020 & Month== 12) %>%
ggplot(aes(x=New.deaths, y=New.cases, color= Country)) +
geom_point(color = 'black') +
geom_smooth(method = 'lm', color = 'red') +
labs(title = "Biểu đồ thể hiện xu hướng các ca ghi nhận và tử vong của các quốc gia Châu Âu") +
labs(x = 'Số ca tử vong', y = 'Số ca ghi nhận')
## `geom_smooth()` using formula = 'y ~ x'

Nhận xét
Ta thấy biểu đồ này gần giống với biểu đồ số 15 bên trên, nhưng vẫn
khác ở nhiều chỗ
Ở biểu đồ này không còn cụ thể các chấm tròn của các quốc gia mà
chỉ thể hiện tổng thể
Ngoài ra ta có thấy thêm Đường xu hướng -
geom_smooth() - giúp thể hiện thêm xu hướng của các chấm
tròn
Các chấm tròn ở đây thể hiện cho số ca ghi nhận và tử vong của
các quốc gia Châu Âu
Các ca ghi nhận tháng 12/2022 của các quốc gia Châu Âu có chiều
hướng nằm ở mức khá cao
19. Biểu đồ thể hiện số ca mắc Covid-19 tích lũy của Châu
Âu
Ta có thể xem mức độ ghi nhận các ca tích lũy ở Châu Âu dựa trên biểu
đồ sau :
CV %>% filter(Continents== 'Europe') %>%
ggplot(aes(x=Cumulative.cases, fill = Continents)) +
geom_density() +
labs(title = "Biểu đồ thể hiện tổng ca ghi nhận tích lũy của Châu Âu") +
labs(x = 'Số ca ghi nhận tích lũy', y = 'Tỷ trọng')

Nhận xét
Biểu đồ thể hiện tổng ca tích lũy của các quốc gia thuộc Châu Âu
Ta thấy mức tích lũy các ca trong biểu đồ là khoảng 40,000,000
ca
Vì là số liệu tích lũy từ những ngày đầu nên số ca ghi nhận trong
biểu đồ sẽ hơi nhiều và không có sự khác biệt rõ rệt
Nhưng ta nhìn vào biểu đồ, ở mức ghi nhận số ca nào có tỉ trọng
càng cao (càng phình lên trên) thì chứng tỏ các ca tích lũy đang được
giữ nguyên
Còn nều các mức có tỷ trọng thấp chứng tỏ đã có các ca ghi nhận
thêm
20. Biểu đồ thể hiện số ca mắc Covid-19 tích lũy của các
Châu Lục
Cũng như biểu đồ số 19, nhưng lần này ta sẽ so sánh thêm với Châu Phi
- Africa
CV %>% filter(Continents== 'Europe' | Continents== 'Africa') %>%
ggplot(aes(x=Cumulative.cases, fill = Continents)) +
geom_density() +
labs(title = "Biểu đồ thể hiện tổng ca ghi nhận tích lũy của Châu Âu và Châu Phi") +
labs(x = 'Số ca ghi nhận tích lũy', y = 'Tỷ trọng')

Nhận xét
Ta cũng có nhận xét tương tự như biểu đồ số 19
Nhưng ta đã thấy ở nhiều mức ghi nhận của Châu Phi đã có phần
vượt cao hơn Châu Âu
Nhưng đa số các mức ghi nhận trên 10,000,000 ca thì Châu Phi đã
có lượng ghi nhận ít hơn hẳn so với Châu Âu
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiVsWpIFF14buzbmggVHLDumMgVnkiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgZGZfcHJpbnQ6IGthYmxlDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICBwZGZfZG9jdW1lbnQ6DQogICAgZXh0cmFfZGVwZW5kZW5jaWVzOg0KICAgICAgdmlldG5hbTogdXRmOA0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgKipO4buZaSBkdW5nIGPhu6dhIE5oaeG7h20gduG7pSoqDQoNCi0gTmhp4buHbSB24bulIHnDqnUgY+G6p3UgduG6vSBjxaluZyBuaMawIHBow6JuIHTDrWNoIDIwIMSR4buTIHRo4buLIGtow6FjIG5oYXUNCg0KLSBC4buZIGThu68gbGnhu4d1IHRp4bq/biBow6BuaCB0aOG7sWMgaGnhu4duIGzDoCAqKkLhu5kgZOG7ryBsaeG7h3UgduG7gSBDb3ZpZC0xOSBj4bunYSBt4buZdCBz4buRIHF14buRYyBnaWEqKg0KDQotIFTDqm4gY+G7p2EgYuG7mSBk4buvIGxp4buHdSA6IHThuqFtIGfhu41pIGzDoCAqKkRhdGEgQ292aWQtMTkqKg0KDQojICoqVOG7lW5nIHF1YW4gduG7gSBC4buZIGThu68gbGnhu4d1IERhdGEgQ292aWQtMTkqKg0KDQojIyAqKjEuIE5ndeG7k24gZ+G7kWMgY+G7p2EgQuG7mSBk4buvIGxp4buHdSoqDQoNCi0gKipUcmFuZyB3ZWIqKiB0aGFtIGto4bqjbyBj4bunYSBi4buZIGThu68gbGnhu4d1IDogW1dITyBEQVRBXShodHRwczovL3d3dy53aG8uaW50L2RhdGEvY29sbGVjdGlvbnMpDQoNCi0gVGEgZ8OhbiBi4buZIGThu68gbGnhu4d1IGfhu5FjIHbhu5tpIHTDqm4gbMOgICoqQ1YqKiAodmnhur90IHThuq90IGPhu6dhIENvdmlkKQ0KDQpgYGB7ciwgY2xhc3Muc291cmNlID0gIm51bWJlckxpbmVzIGxpbmVBbmNob3JzIn0NCmxpYnJhcnkoY3N2KQ0KQ1YgPC0gcmVhZC5jc3YoJ0Q6L1VGTS9DT1ZJRCAxOS5jc3YnLCBoZWFkZXIgPSBUKQ0KYGBgDQoNCg0KIyMgKioyLiBN4buZdCBz4buRIHRow7RuZyB0aW4gduG7gSBC4buZIGThu68gbGnhu4d1KioNCg0KKipO4buZaSBkdW5nKiogY+G7p2EgYuG7mSBk4buvIGxp4buHdSB24buBIDogDQoNCi0gROG7ryBsaeG7h3Ugc+G6vSBjw7MgY8OhYyBz4buRIGxp4buHdSBjdW5nIGPhuqVwIHbhu4EgdMOsbmggaMOsbmggKipk4buLY2ggYuG7h25oIENvdmlkLTE5IGPhu6dhIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSoqDQogICANCi0gQ8OhYyB0aMO0bmcgc+G7kSBz4bq9IGN1bmcgY+G6pXAgY8OhYyAqKnRyxrDhu51uZyBo4bujcCBnaGkgbmjhuq1uIG3huq9jIENvdmlkLTE5KiogdsOgICoqdHLGsOG7nW5nIGjhu6NwIGdoaSBuaOG6rW4gxJHDoyB04butIHZvbmcgdsOsIENvdmlkLTE5KiogY+G7p2EgbeG7mXQgc+G7kSBxdeG7kWMgZ2lhIA0KICAgDQotIFRo4budaSBnaWFuIMSRxrDhu6NjIHTDrW5oIHThu6sgKip0aMOhbmcgMS8yMDIwKiogxJHhur9uIG5nw6B5IGPhuq1wIG5o4bqtdCBt4bubaSBuaOG6pXQgbMOgICoqdGjDoW5nIDEvMjAyNCoqDQoNCi0gTeG6t2MgZMO5IGPDsyBuaGnhu4F1IHF14buRYyBnaWEgdHJvbmcgYuG7mSBk4buvIGxp4buHdSwgbmjGsG5nIHRhIGPFqW5nIHPhur0gY2jhu4kgdGnhur9uIGjDoG5oIHBow6JuIHTDrWNoIGNo4bunIHnhur91IG3hu5l0IHPhu5EgcXXhu5FjIGdpYSBuaMawIFZp4buHdCBOYW0sIFRydW5nIFF14buRYywuLi4uLg0KDQoNCioqTMawdSDDvSoqIDogU+G7kSBsaeG7h3UgxJHGsOG7o2MgZ2hpIG5o4bqtbiDEkcaw4bujYyAqKnTDrW5oIHRoZW8gdOG7q25nIG5nw6B5IGLDoW8gY8OhbyoqIHbDoCBz4bq9IGPDoWNoIMSR4buBdSA3IG5nw6B5IGNobyBt4buXaSBiaeG6v24NCg0KLSAqKk3hu5l0IG5nw6B5IGLDoW8gY8OhbyoqIMSRw7MgxJHhuqFpIGRp4buHbiBjaG8gc+G7sSAqKnThu5VuZyBo4bujcCBj4bunYSA3IG5nw6B5IHRyxrDhu5tjIMSRw7MqKg0KDQotIFbDrSBk4bulIG7hur91IG5nw6B5IDcvMS8yMDIyIGPDsyBz4buRIGxp4buHdSBsw6AgMSwwMDAsMDAwIGNhIHRow6wga2jDtG5nIGPDsyBuZ2jEqWEgdHJvbmcgMSBuZ8OgeSBjw7MgdOG7m2kgMSwwMDAsMDAwIGNhIG3huq9jLCBtw6AgbMOgIHThu6sgbmfDoHkgMSDEkeG6v24gNyBjw7MgdOG7lW5nIDEsMDAwLDAwMCBjYSDEkcaw4bujYyB04buVbmcgaOG7o3AgbOG6oWkNCg0KLSBDaG8gbsOqbiB0cm9uZyBraGkgcGjDom4gdMOtY2ggc+G7kSBsaeG7h3UsIHRhIHPhur0gdOG6oW0gZ8OzaSBn4buNbiBz4buxIHThu5VuZyBo4bujcCBj4bunYSA3IG5nw6B5IHRow6BuaCAxIG5nw6B5IGLDoW8gY8OhbyDEkeG6oWkgZGnhu4duDQoNCi0gVsOsIDcgbmfDoHkgc+G6vSDEkcaw4bujYyB04buVbmcgaOG7o3AgbOG6oWkgdGjDoG5oIDEgbmfDoHkgYsOhbyBjw6FvLCBuw6puIHPhu5EgbmfDoHkgY+G7pSB0aOG7gyBj4bunYSBt4buXaSB0aMOhbmcgbMOgIGtow6FjIGJp4buHdA0KDQotIEPDsyAqKnThu5VuZyBsw6AgMjExIG5nw6B5KiogY2hvIG3hu5dpIHF14buRYyBnaWEgKHTDrW5oIHThu6sgdGjDoW5nIDEvMjAyMCAtIHRow6FuZyAxLzIwMjQpDQoNCi0tLQ0KDQoqKkLhu5kgZOG7ryBsaeG7h3UgQ1YqKiBiYW8gZ+G7k20gOiAqKjExLDYwNSBxdWFuIHPDoXQqKiB2w6AgKioxMiBiaeG6v24qKg0KDQotICoqTeG7l2kgcXVhbiBzw6F0KiogxJHhuqFpIGRp4buHbiBjaG8gc+G7kSBsaeG7h3UgY+G7p2EgKipt4buZdCBuZ8OgeSBiw6FvIGPDoW8gY+G7p2EgbeG7mXQgcXXhu5FjIGdpYSoqIHbhu4EgY8OhYyBjYSBnaGkgbmjhuq1uIGhv4bq3YyB04butIHZvbmcgDQogICAgDQotICoqTeG7l2kgYmnhur9uKiogxJHhuqFpIGRp4buHbiBjaG8gY8OhYyB0aMO0bmcgdGluIGtow6FjIG5oYXUgOiBuaMawIHTDqm4gcXXhu5FjIGdpYSwgbmfDoHksIG7Eg20sIHRyxrDhu51uZyBo4bujcCBnaGkgbmjhuq1uLC4uLg0KDQoNCmBgYHtyfQ0KZGltKENWKQ0KYGBgDQoNCi0tLQ0KDQpW4bubaSAqKjEyIGJp4bq/biB0xrDGoW5nIOG7qW5nKiosIG3hu5dpIGJp4bq/biBjdW5nIGPhuqVwICoqY8OhYyB0aMO0bmcgdGluIGtow6FjIG5oYXUqKiwgYmFvIGfhu5NtIG5oxrAgc2F1IDogDQoNCi0gKioxLiBEYXRlIHJlcG9ydGVkIDoqKiDEkMOieSBsw6AgKipOZ8OgeSBiw6FvIGPDoW8gKGPhu6UgdGjhu4MgY+G6oyBuZ8OgeSB0aMOhbmcgbsSDbSkqKiBj4bunYSBjw6FjIHPhu5EgbGnhu4d1IMSRw6MgxJHGsOG7o2MgdGjhu5FuZyBrw6oNCiAgICANCi0gKioyLiBNb250aCA6KiogxJDDonkgbMOgICoqdGjDoW5nIGPhu6dhIG5nw6B5IGLDoW8gY8OhbyoqIHRyw6puIChjaOG7iSBraMOhYyBsw6AgbsOzIMSRxrDhu6NjIHTDoWNoIHJhIHJpw6puZyB0aMOgbmggMSBiaeG6v24pDQogICAgDQotICoqMy4gRGF5IDoqKiDEkMOieSBsw6AgKipuZ8OgeSBj4bunYSBuZ8OgeSBiw6FvIGPDoW8qKiB0csOqbiANCiAgICANCi0gKio0LiBZZWFyIDoqKiDEkMOieSBsw6AgKipuxINtIGPhu6dhIG5nw6B5IGLDoW8gY8OhbyoqIHRyw6puIA0KICAgIA0KLSAqKjUuIENvdW50cnkgY29kZSA6KiogKipNw6Mgdmnhur90IHThuq90KiogY+G7p2EgY8OhYyBxdeG7kWMgZ2lhICAodsOtIGThu6UgVmnhu4d0IE5hbSBsw6AgVk4pDQogICAgDQotICoqNi4gQ291bnRyeSA6KiogKipUw6puIGPhu6UgdGjhu4MqKiBj4bunYSBjw6FjIHF14buRYyBnaWEgdsOgIHbDuW5nIGzDo25oIHRo4buVDQogICAgDQotICoqNy4gQ29udGluZW50cyA6KiogKipDaMOidSBs4bulYyoqIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSB0aHXhu5ljIHbhu4ENCiAgICANCi0gKio4LiBXSE8gcmVnaW9uIDoqKiDEkMOieSBjaMOtbmggbMOgICoqa2h1IHbhu7FjIGRvIFdITyBjaGlhIHRow6BuaCoqIMSR4buDIGLDoW8gY8OhbywgcGjDom4gdMOtY2ggdsOgIHF14bqjbiBsw70gY8OhYyBxdeG7kWMgZ2lhDQogICAgDQotICoqOS4gTmV3IGNhc2VzIDoqKiBT4buRIHRyxrDhu51uZyBo4bujcCBnaGkgbmjhuq1uIG3huq9jIGNvdmlkICh0aGVvIHThu6tuZyBuZ8OgeSByacOqbmcgYmnhu4d0LCBraMO0bmcgY+G7mW5nIGThu5NuKQ0KICAgIA0KLSAqKjEwLiBDdW11bGF0aXZlIGNhc2VzIDoqKiAgU+G7kSBjYSBnaGkgbmjhuq1uIHTDrWNoIGzFqXkgbeG6r2MgY292aWQgKGPDsyBj4buZbmcgZOG7k24gdOG7q25nIG5nw6B5KQ0KICAgDQotICoqMTEuIE5ldyBkZWF0aCA6KiogLSBTw7QgdHLGsOG7nW5nIGjhu6NwIGdoaSBuaOG6rW4gxJHDoyB04butIHZvbmcgKHRoZW8gdOG7q25nIG5nw6B5IHJpw6puZyBiaeG7h3QsIGtow7RuZyBj4buZbmcgZOG7k24pDQogICANCi0gKioxMi4gQ3VtdWxhdGl2ZSBkZWF0aHMgOioqIC0gU+G7kSB0csaw4budbmcgaOG7o3AgZ2hpIG5o4bqtbiB0w61jaCBsxal5IMSRw6MgdOG7rSB2b25nIHbDrCBjb3ZpZCAoY8OzIGPhu5luZyBk4buTbiB04burbmcgbmfDoHkpDQogICAgDQpOZ2/DoGkgcmEgdHJvbmcgKipt4buZdCBz4buRIGJp4bq/biBn4buTbSBjw6FjIHRow7RuZyB0aW4ga2jDoWMqKiANCg0KLSAqKkNvbnRpbmVudHMqKiBsw6AgQ2jDonUgbOG7pWMgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRodeG7mWMgduG7gSwgYmFvIGfhu5NtIDcgY2jDonUgbOG7pWMgbmjGsCBzYXUgOg0KDQogICAgLSAqKkFzaWEqKiAtIENow6J1IMOBDQogICAgDQogICAgLSAqKkFmcmljYSoqIC0gQ2jDonUgUGhpDQogICAgDQogICAgLSAqKk5vcnRoIEFtZXJpY2EqKiAtIELhuq9jIE3hu7kNCiAgICANCiAgICAtICoqU291dGggQW1lcmljYSoqIC0gTmFtIE3hu7kNCiAgICANCiAgICAtICoqRXVyb3BlKiogLSBDaMOidSDDgnUNCiAgICANCiAgICAtICoqQXVzdHJhbGlhKiogLSBDaMOidSDDmmMvIENow6J1IMSQ4bqhaSBExrDGoW5nDQogICAgDQogICAgLSAqKkFudGFyY3RpY2EqKiAtIENow6J1IE5hbSBD4buxYw0KDQotICoqV0hPIFJlZ2lvbnMqKiBsw6AgdOG7q25nIGtodSB24buxYyDEkcaw4bujYyDEkeG6t3QgZMaw4bubaSBz4buxIHF14bqjbiBsw70gY+G7p2EgV0hPLCDEkcaw4bujYyBjaGlhIHRow6BuaCA2IG5ow7NtIG5oxrAgc2F1IDoNCg0KICAgIC0gKipBRlJPKiogLSBLaHUgduG7sWMgQ2jDonUgUGhpDQoNCiAgICAtICoqQU1STyoqIC0gS2h1IHbhu7FjIENow6J1IE3hu7kNCg0KICAgIC0gKipTRUFSTyoqIC0gS2h1IHbhu7FjIMSQw7RuZyBOYW0gw4ENCg0KICAgIC0gKipFVVJPKiogLSBLaHUgduG7sWMgQ2jDonUgw4J1DQoNCiAgICAtICoqRU1STyoqIC0gS2h1IHbhu7FjIMSQw7RuZyDEkOG7i2EgVHJ1bmcgSOG6o2kNCg0KICAgIC0gKipXUFJPKiogLSBLaHUgduG7sWMgVMOieSBUaMOhaSBCw6xuaCBExrDGoW5nDQoNCg0KYGBge3J9DQpzdHIoQ1YpDQpgYGANCg0KLS0tIA0KDQpOZ2/DoGkgcmEgY8OybiBjw7MgY8OhYyB0aMO0bmcgdGluIGtow6FjIDogDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHNraW1yKQ0Kc2tpbShDVikNCmBgYA0KDQoNCiMgKipUaeG6v24gaMOgbmggcGjDom4gdMOtY2ggdsOgIHbhur0gxJHhu5MgdGjhu4sgY2hvIELhu5kgZOG7ryBsaeG7h3UqKg0KDQoqKkNPVklELTE5IChDb3JvbmF2aXJ1cyBEaXNlYXNlIDIwMTkpKiogbMOgIG3hu5l0ICoqYuG7h25oIMSRxrDhu51uZyBow7QgaOG6pXAgY+G6pXAgdMOtbmggdHJ1eeG7gW4gbmhp4buFbSoqIGfDonkgcmEgYuG7n2kgY2jhu6duZyB2aXJ1cyBjb3JvbmEgU0FSUy1Db1YtMiB2w6AgY8OhYyBiaeG6v24gdGjhu4MgY+G7p2EgbsOzDQoNCi0gTmd14buTbiBn4buRYyBj4bunYSBDT1ZJRC0xOSBi4bqvdCDEkeG6p3UgdOG7qyBWxakgSMOhbiwgVHJ1bmcgUXXhu5FjLiBWaXJ1cyBjb3JvbmEgbMOgIG3hu5l0IGJldGFjb3JvbmEgdmlydXMsIGPDsyBuZ3Xhu5NuIGfhu5FjIHThu6sgduG6rXQgY2jhu6cgbMOgIGxvw6BpIGTGoWkNCg0KLSBQaMawxqFuZyB0aOG7qWMgbMOieSB0cnV54buBbiBjaMOtbmggbMOgIHThu6sgbmfGsOG7nWkgc2FuZyBuZ8aw4budaSwgcXVhIGPDoWMgZ2nhu410IGThu4tjaCBow7QgaOG6pXAgY+G7p2EgY8ahIHRo4buDDQoNCi0gSGnhu4duIMSRw6MgY8OzIHbhuq9jLXhpbiBwaMOybmcgY2jhu5FuZyBi4buHbmggbmjGsG5nIHZp4buHYyBuZ2hpw6puIGPhu6l1IHBow6F0IHRyaeG7g24gduG6r2MteGluIHbhuqtuIHRp4bq/cCB04bulYw0KDQoNClTDrW5oIHThu5tpIGhp4buHbiB04bqhaSBsw6AgbsSDbSAyMDI0LCBt4bq3YyBkw7kgZOG7i2NoIGLhu4duaCDEkcOjIMSRxrDhu6NjIGtp4buDbSBzb8OhdCB2w6AgdMOsbmggaMOsbmggxJHDoyBraMO0bmcgY8OybiBjxINuZyB0aOG6s25nIG5oxrAgbMO6YyB0csaw4bubYyBuaMawbmcgduG6q24gY8OzIGPDoWMgdHLGsOG7nW5nIGjhu6NwIGdoaSBuaOG6rW4gbeG6r2MgQ292aWQtMTkg4bufIG3hu5l0IHPhu5EgcXXhu5FjIGdpYQ0KDQotIFRhIHRp4bq/biBow6BuaCB4ZW0gY29pIMSR4bq/biBuxINtIDIwMjQgc+G7kSBjYSBnaGkgbmjhuq1uIOG7nyBjw6FjIGtodSB24buxYyBjxaluZyBuaMawIHF14buRYyBnaWEgbMOgIGJhbyBuaGnDqnUNCg0KLS0tDQoNCiMjICoqMS4gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBjw6FjIGNhIGdoaSBuaOG6rW4gbeG6r2MgQ292aWQtMTkgbmjhu69uZyBuZ8OgeSDEkeG6p3UgbsSDbSAyMDI0KioNCg0KVHJvbmcgYuG7mSBk4buvIGxp4buHdSBiYW8gZ+G7k20gY8OzICoqNTUgcXXhu5FjIGdpYSoqIHbDoCB04burbmcgcXXhu5FjIGdpYSBuw6B5IMSR4buBdSDEkcaw4bujYyBjaGlhIHRow6BuaCAqKjYga2h1IHbhu7FjIGRvIFdITyBxdeG6o24gbMO9KiogxJHDoyBuw6p1IHRyw6puDQoNCi0gVGEgdGnhur9uIGjDoG5oIHBow6JuIHTDrWNoIHbDoCB24bq9IGJp4buDdSDEkeG7kyBj4bunYSA2IGtodSB24buxYyBuw6B5IA0KDQotIFRhIHPhur0gZ2hpIG5o4bqtbiAqKmPDoWMgY2EgbeG6r2MgQ292aWQtMTkgdHJvbmcgMiBuZ8OgeSDEkcaw4bujYyB04buVbmcgaOG7o3AgY+G7p2EgbsSDbSAyMDI0KioNCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCktodXZ1YyA8LSBDViAlPiUgZmlsdGVyKFllYXIgPT0gMjAyNCAmIERheT4xKQ0KS2h1dnVjICU+JSBncm91cF9ieShXSE8ucmVnaW9uLE5ldy5jYXNlcykgJT4lDQogIGdncGxvdChhZXMoV0hPLnJlZ2lvbixOZXcuY2FzZXMpKSArDQogICAgZ2VvbV9jb2woZmlsbD0nbGlnaHRibHVlJykgKw0KICAgIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gZ2hpIG5o4bqtbiBt4bqvYyBDb3ZpZC0xOSBuaOG7r25nIG5nw6B5IMSR4bqndSBuxINtIDIwMjQgIikgKw0KICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgbGFicyh4ID0gJ0todSB24buxYyBXSE8gUmVnaW9ucycsIHkgPSAnU+G7kSBjYSBt4bqvYycpIA0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNCkJp4buDdSDEkeG7kyBiw6puIHRyw6puIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGNhIGdoaSBuaOG6rW4gbeG6r2MgQ292aWQtMTkgbmjhu69uZyBuZ8OgeSBj4bunYSBuxINtIDIwMjQNCg0KROG7sWEgdGhlbyBi4buZIGThu68gbGnhu4d1LCB0YSB0aOG6pXkgKipz4buRIGzGsOG7o25nIMSRxrDhu6NjIGdoaSBuaOG6rW4gdOG7m2kgMiBuZ8OgeSBj4bulIHRo4buDKiogbMOgIDcvMS8yMDI0IHbDoCBuZ8OgeSAxNC8xLzIwMjQNCg0KLSBN4bq3YyBkw7kgxJHDoyBoxqFuIDQgbsSDbSBr4buDIHThu6sgbmfDoHkgZOG7i2NoIENvdmlkLTE5IGLDuW5nIG7hu5UsIG5oxrBuZyB04bubaSBoaeG7h24gbsOgeSBjw6FjIGNhIG3huq9jIHbhuqtuIMSRxrDhu6NjIGdoaSBuaOG6rW4ga2jDoSBuaGnhu4F1IOG7nyB04burbmcga2h1IHbhu7FjDQoNCiAgICAtICoqV1BSTyoqIGzDoCBraHUgduG7sWMgVMOieSBUaMOhaSBCw6xuaCBExrDGoW5nIGPDsyBz4buRIGNhIGdoaSBuaOG6rW4gxJHhur9uICoqaMahbiA5MCwwMDAgY2EqKiANCg0KICAgIC0gMyBraHUgduG7sWMgZ+G7k20gKipFVVJPKiogLSAqKlNFQVJPKiogLSAqKkFNUk8qKiBs4bqnbiBsxrDhu6N0IGPDsyBjw6FjIGNhIGdoaSBuaOG6rW4gdGjhuqVwIGjGoW4gLSAqKmtob+G6o25nIGTGsOG7m2kgMzAsMDAwIGNhKioNCiAgICANCiAgICAtIDIga2h1IHbhu7FjICoqRU1STyoqIHbDoCAqKkFGUk8qKiBsw6AgMiBraHUgduG7sWMgY8OzIHPhu5EgbMaw4bujbmcgKipraMO0bmcgxJHDoW5nIGvhu4MqKg0KDQotIFRhIHRo4bqleSDEkcaw4bujYyBjw6FjIG7GsOG7m2MgdGh14buZYyBraHUgduG7sWMgVMOieSBUaMOhaSBCw6xuaCBExrDGoW5nIGPDsyAqKnPhu5EgbMaw4bujbmcgY2FvIGjGoW4gaOG6s24qKiB24bubaSBjw6FjIG7GsOG7m2Mga2h1IHbhu7FjIGPDsm4gbOG6oWkNCg0KLSBO4bq/dSBzbyBzw6FuaCB0aMOsIGtodSB24buxYyBuw6B5ICoqZ+G6pXAgaMahbiAzIGzhuqduIGPDoWMga2h1IHbhu7FjIGPDsm4gbOG6oWkqKg0KDQpDaOG7qW5nIHThu48gZMO5IGThu4tjaCBi4buHbmggxJHDoyBxdWEgZ2lhaSDEkW/huqFuIG5ndXkgaGnhu4NtLCBuaMawbmcgdGEgduG6q24gdGjhuqV5IGPDsyBjw6FjIGNhIGdoaSBuaOG6rW4gbeG6r2MgYuG7h25oLiBWw6wgduG6rXkgdmnhu4djIHBow7JuZyBjaOG7kW5nIGThu4tjaCBDb3ZpZC0xOSB2w6AgYuG6o28gduG7hyBz4bupYyBraOG7j2UgduG6q24gbHXDtG4gbMOgIHLhuqV0IHF1YW4gdHLhu41uZyANCg0KLS0tDQoNCiMjICoqMi4gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBjw6FjIGNhIHThu60gdm9uZyB2w6wgQ292aWQtMTkgbmjhu69uZyBuZ8OgeSDEkeG6p3UgbsSDbSAyMDI0KioNCg0KQsOqbiBj4bqhbmggY8OhYyBjYSBnaGkgbmjhuq1uIGLDqm4gdHLDqm4sIGPFqW5nIGzDoCBjw6FjIGNhIMSRw6MgKipnaGkgbmjhuq1uIHThu60gdm9uZyoqIHbDrCBDb3ZpZC0xOSB0cm9uZyBuaOG7r25nIG5nw6B5IMSR4bqndSBuxINtIDIwMjQNCg0KVGEgdGnhur9uIGjDoG5oIHhlbSBiaeG7g3UgxJHhu5MgZMaw4bubaSDEkcOieSA6DQoNCg0KYGBge3J9DQpLaHV2dWMgJT4lIGdyb3VwX2J5KFdITy5yZWdpb24sTmV3LmNhc2VzKSAlPiUNCiAgZ2dwbG90KGFlcyhOZXcuZGVhdGhzLFdITy5yZWdpb24pKSArDQogICAgZ2VvbV9jb2woZmlsbD0ncmVkJykgKw0KICAgIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gZ2hpIG5o4bqtbiB04butIHZvbmcgdsOsIENvdmlkLTE5IG5o4buvbmcgbmfDoHkgxJHhuqd1IG7Eg20gMjAyNCAiKSArDQogICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICBsYWJzKHggPSAnS2h1IHbhu7FjIFdITyBSZWdpb25zJywgeSA9ICdT4buRIGNhIHThu60gdm9uZycpIA0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNCk1heSBt4bqvbiBy4bqxbmcgY8OhYyBjYSBnaGkgbmjhuq1uIHThu60gdm9uZyB0cm9uZyBiaeG7g3UgxJHhu5MgdHLDqm4ga2jDtG5nIG5oaeG7gXUgbmjGsCBiaeG7g3UgxJHhu5MgZ2hpIG3huq9jIGLhu4duaA0KDQotIFRhIHRo4bqleSBy4bqxbmcgc+G7kSBsxrDhu6NuZyDhu58gbeG7l2kga2h1IHbhu7FjIMSR4buBdSBkxrDhu5tpIDUwMCBjYSwgY+G7pSB0aOG7gyBuaMawIHNhdSA6DQoNCiAgICAtIEtodSB24buxYyAqKkVVUk8gLSBDaMOidSDDgnUqKiBjw7MgY2EgZ2hpIG5o4bqtbiAqKnThu60gdm9uZyBoxqFuIDMwMCBjYSoqLCBraG/huqNuZyAxJSB0cm9uZyAzMCwwMDAgZ2hpIG5o4bqtbiBiw6puIHRyw6puDQoNCiAgICAtIEtodSB24buxYyAqKldQUk8qKiB24bubaSBoxqFuIDkwLDAwMCBjYSBt4bqvYyBi4buHbmggdGjDrCBraG/huqNuZyAqKmfhuqduIDIwMCBjYSB04butIHZvbmcqKg0KDQogICAgLSBLaHUgduG7sWMgKipTRUFSTyoqIHbhu5tpIGtob+G6o25nIGjGoW4gMTAwIGNhIHThu60gdm9uZw0KDQogICAgLSAzIGtodSB24buxYyBjw7JuIGzhuqFpIGzDoCAqKkFNUk8qKiAtICoqRU1STyoqIC0gKipBRlJPKiogY8OzIHPhu5EgbMaw4bujbmcgbOG6p24gbMaw4bujdCB0aOG6pXAgaMahbiBo4bqzbiAtIGTGsOG7m2kgNTAgY2ENCg0KLSBDw6FjIHF14buRYyBnaWEgQ2jDonUgw4EsIFRow6FpIELDrG5oIETGsMahbmcgbeG6t2MgZMO5IGPDsyBsxrDhu6NuZyBnaGkgbmjhuq1uIG3huq9jIG5oaeG7gXUgbmjhuqV0IG5oxrBuZyBs4bqhaSBjaOG7r2EgYuG7h25oIGtow6EgdOG7kXQsIHThu7cgbOG7hyB04butIHZvbmcgbMOgIMOtdCBoxqFuIGjhurNuDQoNCi0gU28gduG7m2kgQ2jDonUgw4EgdGjDrCBjw6FjIG7GsOG7m2MgQ2jDonUgw4J1IGPDsyB04bu3IGzhu4cgdOG7rSB2b25nIGNhbyBoxqFuLCBuaMawbmcgY8Wpbmcga2jDtG5nIHF1w6EgxJHDoW5nIGvhu4MNCg0KLSBDw7JuIGzhuqFpIGPDoWMga2h1IHbhu7FjIGtow6FjIHbhu6thIGPDsyBz4buRIGNhIG3huq9jIGtow7RuZyBxdcOhIG5oaeG7gXUgdsOgIHPhu5EgY2EgdOG7rSB2b25nIGPFqW5nIG7hurFtIOG7nyBt4bupYyBy4bqldCDDrXQNCg0KQ8OhYyBjYSBnaGkgbmjhuq1uIG3huq9jIOG7nyBiaeG7g3UgxJHhu5MgxJHhuqd1IHRpw6puIGtow7RuZyBwaOG6o2kgbMOgIHRo4bqlcCBtw6AgduG6q24gbMOgIGtow6EgY2FvIGPhu5luZyB0aMOqbSBjw6FjIGNhIGdoaSBuaOG6rW4gdOG7rSB2b25nIGLDqm4gdHLDqm4gdGjDrCDEkcOzIG5oxrAgbMOgIGzhu51pIGPhuqNuaCB04buJbmggxJHhu4MgbeG7jWkgbmfGsOG7nWkgYmnhur90IGPDoWNoIHBow7JuZyBjaOG7kW5nIGThu4tjaCBt4buZdCBjw6FjaCBoaeG7h3UgcXXhuqMgaMahbg0KDQotLS0NCg0KIyMgKiozLiBCaeG7g3UgxJHhu5Mgc28gc8OhbmggY8OhYyBjYSB04butIHZvbmcgdsOsIENvdmlkLTE5IG5o4buvbmcgbmfDoHkgxJHhuqd1IG7Eg20gMjAyNCoqDQoNCsSQ4buDIHRo4bqleSByw7UgaMahbiBjw6FjIGNhIHThu60gdm9uZywgdGEgY8OzIHRo4buDIHPhu60gYmnhu4N1IMSR4buZIGPhu5l0IGNo4buTbmcgxJHhu4MgZOG7hSBzbyBzw6FuaCB2w6Agbmjhuq1uIHjDqXQgaMahbg0KDQpUYSB4ZW0gYmnhu4N1IMSR4buTIHNhdSA6DQoNCmBgYHtyfQ0KS2h1dnVjICU+JSBnZ3Bsb3QoYWVzKHg9TmV3LmRlYXRocywgZmlsbD1XSE8ucmVnaW9uKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShwb3NpdGlvbiA9ICJkb2RnZSIsIGJpbndpZHRoID0gNTApICsNCiAgbGFicyh0aXRsZSA9ICIgQmnhu4N1IMSR4buTIHNvIHPDoW5oIGPDoWMgY2EgZ2hpIG5o4bqtbiB04butIHZvbmcg4bufIGPDoWMga2h1IHbhu7FjICIpICsNCiAgbGFicyh4ID0gJ1Phu5EgY2EgdOG7rSB2b25nJywgeSA9ICdT4buRIGzGsOG7o25nIGdoaSBuaOG6rW4nKSANCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQqKg0KDQpDxaluZyBsw6Agc+G7kSBsaeG7h3UgbmjGsCBiaeG7g3UgxJHhu5Mgc+G7kSAyLCBuaMawbmcgY8OhYyBraHUgduG7sWMgxJHDoyDEkcaw4bujYyB0w6FjaCByYSB2w6AgeOG6v3AgY2jhu5NuZyByYSBuaMawIGJp4buDdSDEkeG7kyB0csOqbg0KDQotIEtodSB24buxYyAqKkVVUk8qKiDhu58gYmnhu4N1IMSR4buTIDIgbMOgIGPDsyBsxrDhu6NuZyBnaGkgbmjhuq1uIHThu6cgdm9uZyBuaGnhu4F1IG5o4bqldCB0aMOsIOG7nyDEkcOieSB0YSDEkcOjIHRo4bqleSBz4buRIGzGsOG7o25nIGPDoWMgY2Eg4bufIG3hu5dpIG5nw6B5IG5oxrAgdGjhur8gbsOgbw0KDQogICAgLSBWw60gZOG7pSB24bubaSBz4buRIGNhIHThu60gdm9uZyBsw6Ag4bufIG3hu6ljIDIwMCBjYSwgdGjDrCBz4buRIG5nw6B5IGdoaSBuaOG6rW4gMjAwIGNhIG7DoHkgbMOgIGtob+G6o25nIDEtMiBuZ8OgeQ0KICAgIA0KICAgIC0gQ29uIHPhu5EgY2EgdOG7rSB2b25nIOG7nyBt4bupYyAxMDAgdsOgIDUwIGPFqW5nIG5oxrAgduG6rXksIHPhur0gY8OzIGtob+G6o25nIDEgaG/hurdjIDIgbmfDoHkgc+G6vSBjw7MgMTAwIGNhIHThu60gdm9uZw0KDQotIEPDoWMga2h1IHbhu7FjIGPDsm4gbOG6oWkgZ2nhuqNpIHRow61jaCB0xrDGoW5nIHThu7EgbmjGsCBraHUgduG7sWMgKipFVVJPKiog4bufIHBow61hIHRyw6puDQoNCi0tLQ0KDQojIyAqKjQuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBjYSBt4bqvYyBDb3ZpZC0xOSB0aGVvIG5nw6B5IOG7nyBWaeG7h3QgTmFtKioNCg0KU2F1IGtoaSBuaMOsbiBzxqEgduG7gSB0w6xuaCBow6xuaCBoaeG7h24gdOG6oWkgYuG6sW5nIDMgYmnhu4N1IMSR4buTIGLDqm4gdHLDqm4sIHRhIHPhur0gdGnhur9uIGjDoG5oIHjDqXQgdHLDqm4gKipjw6FjIHF14buRYyBnaWEgcmnDqm5nIGzhursqKg0KDQpUcuG6o2kgcXVhIGjGoW4gMyBuxINtIHBow7JuZywgY2jhu5FuZyDEkeG6oWkgZOG7i2NoIENPVklELTE5LCB24bubaSB0aW5oIHRo4bqnbiDEkeG6t3Qgc+G7qWMga2jhu49lLCB0w61uaCBt4bqhbmcgY+G7p2EgbmfGsOG7nWkgZMOibiBsw6puIHRyw6puIGjhur90DQoNCi0gKipWaeG7h3QgTmFtKiogxJHDoyB2xrDhu6N0IHF1YSDEkeG6oWkgZOG7i2NoIHbDoCB0cuG7nyB0aMOgbmggbeG7mXQgdHJvbmcgbmjhu69uZyBuxrDhu5tjICoqIsSRaSBzYXUgbmjGsG5nIHbhu4EgdHLGsOG7m2MiKioNCg0KLSBE4buLY2ggQ09WSUQtMTkgaGnhu4duIG5heSDEkcOjIMSRxrDhu6NjIGtp4buDbSBzb8OhdCB0csOqbiBwaOG6oW0gdmkgdG/DoG4gcXXhu5FjDQoNClbDoCB0YSBz4bq9IHRp4bq/biBow6BuaCB4ZW0gY8OhYyBjYSDEkcaw4bujYyBnaGkgbmjhuq1uIG3huq9jIENvdmlkLTE5IGPhu6dhIFZp4buHdCBOYW0gcXVhIGPDoWMgYmnhu4N1IMSR4buTDQoNCg0KYGBge3J9DQpWTiA8LSBDViAlPiUgZmlsdGVyKENvdW50cnk9PSAnVmlldCBOYW0nKQ0KdGFibGUoY3V0KFZOJE5ldy5jYXNlcyw0KSkNCmBgYA0KDQpOaMawIMSRw6MgbsOzaSBiYW4gxJHhuqd1LCBt4buXaSBxdeG7kWMgZ2lhIHJpw6puZyBiaeG7h3Qgc+G6vSBjw7MgMjExIG5nw6B5IGLDoW8gY8OhbywgdsOgIHThu6tuZyBuZ8OgeSDEkeG7gXUgY8OzIHPhu5EgbMaw4bujbmcgY2EgZ2hpIG5o4bqtbiBoYXkgdOG7rSB2b25nIGtow6FjIG5oYXUNCg0KVGEgdGnhur9uIGjDoG5oIGNoaWEgY8OhYyBuZ8OgeSDEkcOzIHRow6BuaCAqKjQgbmjDs20qKiBnaGkgbmjhuq1uIGPDoWMgY2EgbeG6r2Mga2jDoWMgbmhhdSwgdGEgdGnhur9uIGjDoG5oIMSR4bq3dCB0w6puIG5oxrAgc2F1IDoNCg0KLSAqKk5ow7NtIMONdCoqIGPDsyAqKjIwNCBuZ8OgeSoqIGdoaSBuaOG6rW4ga2hv4bqjbmcgdOG7qyAqKjAgLSA0NjEsMDAwIGNhKiogDQoNCi0gKipOaMOzbSBW4burYSoqIGPDsyAqKjMgbmfDoHkqKiBnaGkgbmjhuq1uIGtob+G6o25nIHThu6sgKio0NjEsMDAwIC0gOTIzLDAwMCBjYSoqDQoNCi0gKipOaMOzbSBOaGnhu4F1KiogY8OzICoqMiBuZ8OgeSoqIGdoaSBuaOG6rW4ga2hv4bqjbmcgdOG7qyAqKjkyMywwMDAgLSAxLDMwMCwwMDAgY2EqKg0KDQotICoqTmjDs20gUuG6pXQgbmhp4buBdSoqIGPDsyAqKjIgbmfDoHkqKiBnaGkgbmjhuq1uIGtob+G6o25nIHThu6sgKioxLDMwMCwwMDAgLSAxLDgwMCwwMDAgY2EqKg0KDQpTYXUgxJHDsyB0YSB0aeG6v24gaMOgbmggduG6vSBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duDQoNCg0KYGBge3J9DQpWTjEgPC0gVk4gJT4lIG11dGF0ZShTb2NhZ2hpbmhhbiA9IGN1dChOZXcuY2FzZXMsNCwgbGFiZWwgPSBjKCfDjXQnLCdW4burYScsJ05oaeG7gXUnLCdS4bqldCBuaGnhu4F1JykpKQ0KVk4xICU+JSBncm91cF9ieShTb2NhZ2hpbmhhbikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhTb2NhZ2hpbmhhbixuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3llbGxvdycpICsNCiAgICBsYWJzKHRpdGxlID0gIiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgY2EgZ2hpIG5o4bqtbiBj4bunYSBWaeG7h3QgTmFtICIpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAwLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnU+G7kSBjYSBnaGkgbmjhuq1uJywgeSA9ICdT4buRIG5nw6B5IGdoaSBuaOG6rW4nKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNCi0gU+G7kSBjYSBnaGkgbmjhuq1uIHThu6sgKiowIC0gNDYxLDAwMCBjYSoqIHLGoWkgdsOgbyBraG/huqNuZyAqKjIwNCBuZ8OgeSoqIGNobyBuaMOzbSDDrXQgdHLDqm4gYmnhu4N1IMSR4buTDQoNCi0gxJDGsMahbmcgbmhpw6puIHRyb25nIDIwNCBuZ8OgeSwgc+G6vSBjw7MgbmfDoHkga2jDtG5nIGdoaSBuaOG6rW4gY2EgbsOgbywgY8OzIG5nw6B5IGdoaSBuaOG6rW4gdOG7kWkgxJFhIDQ2MSwwMDAgY2ENCiAgICANCi0gTmjDs20gVuG7q2EgZ2hpIG5o4bqtbiBjw7MgKiozIG5nw6B5KiogY8OzIHPhu5EgY2EgKio0NjEsMDAwIC0gOTIzLDAwMCBjYSoqDQoNCi0gKioyIG5ow7NtIE5oaeG7gXUgdsOgIFLhuqV0IG5oaeG7gXUqKiDEkeG7gXUgY8OzIGzGsOG7o25nIGdoaSBuaOG6rW4gdHLDqm4gMSwwMDAsMDAwIGNhIG3huq9jIHbDoCBjw7Mga2hv4bqjbmcgNCBuZ8OgeSBjw7Mgc+G7kSBsxrDhu6NuZyBuaMawIHRo4bq/DQoNCi0gVsOgICoqc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCoqIG3DoCBWaeG7h3QgTmFtIGdoaSBuaOG6rW4gxJHGsOG7o2MgxJHDsyBsw6Aga2hv4bqjbmcgKioxLDgwMCwwMDAgY2EgbeG6r2MqKiB0cm9uZyBt4buZdCBuZ8OgeQ0KDQpUcm9uZyB04buVbmcgMjExIG5nw6B5IGLDoW8gY8OhbyBj4bunYSBWaeG7h3QgTmFtIHRow6wgc+G7kSBsxrDhu6NuZyBt4buXaSBuZ8OgeSDEkeG7gXUga2jDoWMgbmhhdSwgY8OzIG5nw6B5IGdoaSBuaOG6rW4gZ2hpIG5o4bqtbiDDrXQsIGPDsyBuZ8OgeSBnaGkgbmjhuq1uIMSR4bq/biBr4bu3IGzhu6VjLCBuaMawbmcgY2jDum5nIHRhIMSRw6MgduG7r25nIHbDoG5nIHbGsOG7o3QgcXVhIG5o4buvbmcgxJHhu6N0IGThu4tjaCB0w6BuIGto4buRYyDEkcOzIGLhurFuZyBz4buxIGNo4buJIMSR4bqhbyBzw6F0IHNhbywga+G7i3AgdGjhu51pIGPhu6dhIMSQ4bqjbmcsIE5ow6Agbsaw4bubYywgQ2jDrW5oIHBo4bunIHbDoCBz4buxIMSR4buTbmcgbMOybmcgY+G7p2EgbmfGsOG7nWkgZMOibg0KDQotLS0NCg0KIyMgKio1LiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgY2EgbeG6r2MgQ292aWQtMTkgdGhlbyBuZ8OgeSDhu58gVmnhu4d0IE5hbSB2w6AgVHJ1bmcgUXXhu5FjKioNCg0K4bueIGJp4buDdSDEkeG7kyB0csOqbiwgbeG6t2MgZMO5IHRhIMSRw6MgY2hpYSB0aMOgbmggY8OhYyBjw6FjIG3hu6ljIGdoaSBuaOG6rW4gY2EgbeG6r2MgcmEgdGjDoG5oIDQgbmjGsG5nIHPhu5EgbMaw4bujbmcgY2Eg4bufIG3hu6ljIMONdCB24bqrbiBraMOhIG5oaeG7gXUgdsOgIHRhIGtow7RuZyB0aOG7gyB0aOG6pXkgY+G7pSB0aOG7gyBiw6puIHRyb25nIGPDsyBz4buRIGzGsOG7o25nIG5oxrAgdGjhur8gbsOgbw0KDQpCw6J5IGdp4budIHRhIHPhur0gdGnhur9uIGjDoG5oIGNoaWEgdGhlbyBtb25nIG114buRbiwgdGjDoG5oIGPDoWMgbeG7qWMgbmjhu48gaMahbiBt4buZdCBjaMO6dCBu4buvYSwgxJHhu4MgdGjhuqV5IMSRxrDhu6NjIGPDoWMgY2EgZ2hpIG5o4bqtbiBuaMawIHRo4bq/IG7DoG8NCg0KxJDhu5NuZyB0aOG7nWksIHRhIGPFqW5nIHPhur0gc28gc8OhbmggbeG7qWMgZ2hpIG5o4bqtbiBuw6B5IHbhu5tpIG3hu5l0IG7GsOG7m2MgYuG6oW4gY+G7p2EgVmnhu4d0IE5hbSAtIMSRw7MgbMOgIFRydW5nIFF14buRYw0KDQpgYGB7cn0NClZOVFEgPC0gQ1YgJT4lIGZpbHRlcihDViRDb3VudHJ5ID09J0NoaW5hJyB8IENWJENvdW50cnkgPT0gJ1ZpZXQgTmFtJykNClZOVFExIDwtIFZOVFENClZOVFExJE5ldy5jYXNlcy5HTiA8LSBjYXNlX3doZW4oVk5UUTEkTmV3LmNhc2VzIDwxMDAwMCB+ICdHaGkgbmjhuq1uIEtow7RuZyDEkcOhbmcga+G7gycsIFZOVFExJE5ldy5jYXNlcyA+PTEwMDAwICYgVk5UUTEkTmV3LmNhc2VzIDwxMDAwMDAgfiAnR2hpIG5o4bqtbiDDjXQnLCBWTlRRMSROZXcuY2FzZXMgPj0xMDAwMDAgJiBWTlRRMSROZXcuY2FzZXMgPDUwMDAwMCB+ICdHaGkgbmjhuq1uIFbhu6thJywgVk5UUTEkTmV3LmNhc2VzID49NTAwMDAwIH4gJ0doaSBuaOG6rW4gTmhp4buBdScpDQp0YWJsZShWTlRRMSROZXcuY2FzZXMuR04pDQpgYGANCg0KLSDEkOG6p3UgdGnDqm4gdGEgbOG7jWMgdOG7qyBk4buvIGxp4buHdSB0aMOgbmggY2jhu4kgY8OybiAyIG7GsOG7m2MgVmnhu4d0IE5hbSB2w6AgVHJ1bmcgUXXhu5FjDQoNCi0gU2F1IMSRw7MgdGEgdGnhur9uIGjDoG5oIGNoaWEgc+G7kSBjYSBnaGkgbmjhuq1uIG3huq9jIENvdmlkLTE5IGPFqW5nIHRow6BuaCA0IG5ow7NtIHbDoCB0aHUgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXUgOg0KDQogICAgLSBOaMOzbSAqKkdoaSBuaOG6rW4gw410KiogY8OzIHPhu5EgbMaw4bujbmcgY2EgKipkxrDhu5tpIDEwLDAwMCBjYSAxIG5nw6B5KiogLSB04buVbmcgdGh1IMSRxrDhu6NjIHThu6sgMiBuxrDhu5tjIGzDoCBjw7MgKio1NCBuZ8OgeSoqIGdoaSBuaOG6rW4NCiAgICANCiAgICAtIE5ow7NtICoqR2hpIG5o4bqtbiBLaMO0bmcgxJHDoW5nIGvhu4MqKiBjw7Mgc+G7kSBjYSAqKnThu6sgMTAsMDAwIC0gMTAwLDAwMCBjYSoqLCB04buVbmcgdGh1IMSRxrDhu6NjIGzDoCAqKjMwMiBuZ8OgeSoqDQogICAgDQogICAgLSBOaMOzbSAqKkdoaSBuaOG6rW4gVuG7q2EqKiBjw7Mgc+G7kSBjYSAqKnThu6sgMTAwLDAwMCAtIDUwMCwwMDAgY2EqKiwgdOG7lW5nIGzDoCAqKjE3IG5nw6B5KioNCiAgICANCiAgICAtIE5ow7NtICoqR2hpIG5o4bqtbiBOaGnhu4F1KiogY8OzIHPhu5EgY2EgKipoxqFuIDUwMCwwMDAgY2EqKiwgdOG7lW5nIGzDoCAqKjQ5IG5nw6B5KioNCiAgICANClPhu5EgbMaw4bujbmcgbmfDoHkgZ2hpIG5o4bqtbiB0csOqbiBsw6AgY+G7p2EgY+G6oyAyIG7GsOG7m2MgVmnhu4d0IE5hbSB2w6AgVHJ1bmcgUXXhu5FjDQoNCkLDonkgZ2nhu50gc+G6vSB0aeG6v24gaMOgbmggc28gc8OhbmggY2jDum5nIGLhurFuZyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIDoNCg0KYGBge3J9DQpWTlRRMiA8LSBWTlRRMSAlPiUgZ3JvdXBfYnkoTmV3LmNhc2VzLkdOLCBDb3VudHJ5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpDQpWTlRRMiAlPiUgZ2dwbG90KGFlcyh4PSBOZXcuY2FzZXMuR04sIHk9bikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IFZOVFEyICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAnVmlldCBOYW0nKSwgZmlsbCA9ICdyZWQnKSArDQogIGdlb21fY29sKGRhdGEgPSBWTlRRMiAlPiUgZmlsdGVyKENvdW50cnkgPT0gJ0NoaW5hJyksIGZpbGwgPSAneWVsbG93JykgKw0KICBsYWJzKHRpdGxlID0gIiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgY2EgZ2hpIG5o4bqtbiBj4bunYSBWaeG7h3QgTmFtIHbDoCBUcnVuZyBRdeG7kWMiKSArDQogIGxhYnMoeCA9ICdT4buRIGNhIGdoaSBuaOG6rW4gY2hpYSB0aGVvIG5ow7NtJywgeSA9ICdT4buRIGNhIGdoaSBuaOG6rW4nKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNClRoZW8gbmjGsCBiaeG7g3UgxJHhu5MgdGjDrCA6DQoNCi0gTcOgdSDEkeG7jyBjaMOtbmggbMOgIMSR4bqhaSBkaeG7h24gY2hvIHPhu5EgY2EgY+G7p2EgVmnhu4d0IE5hbQ0KDQotIE3DoHUgdsOgbmcgbMOgIMSR4bqhaSBkaeG7h24gY2hvIHPhu5EgY2EgY+G7p2EgVHJ1bmcgUXXhu5FjDQoNCkThu7FhIHRyw6puIGJp4buDdSDEkeG7kyB0YSBjw7MgbeG7mXQgdsOgaSBuaOG6rW4geMOpdCBzYXUgOg0KDQotIOG7niBuaMOzbSAqKkdoaSBuaOG6rW4gw410IChkxrDhu5tpIDEwLDAwMCBjYS8gMSBuZ8OgeSBiw6FvIGPDoW8pKiogLSBz4buRIGNhIOG7nyBWaeG7h3QgTmFtIGzDoCAqKm5o4buJbmggaMahbioqIHNvIHbhu5tpIFRydW5nIFF14buRYw0KDQotIOG7niBuaMOzbSAqKktow7RuZyDEkcOhbmcga+G7gyBjxaluZyBuaMawIHbhuq15KiosIGtob+G6o25nIGPDoWNoIGNo4buJIGzDoCBraG/huqNuZyAxLTIgbmfDoHkgbcOgIHRow7RpIA0KDQotIEPDsm4g4bufIDIgbmjDs20gZ2hpIG5o4bqtbiBOaGnhu4F1IHbDoCBW4burYSB0aMOsIHPhu5EgbMaw4bujbmcgY2EgY+G7p2EgVHJ1bmcgUXXhu5FjIMSRw6MgaG/DoG4gdG/DoG4gY2hlIGzhuqVwIFZp4buHdCBOYW0NCg0KQ2jhu6luZyB04buPIHRyb25nIGPDoWMgbmfDoHkgYsOhbyBjw6FvIG5oxrAgbmhhdSwgc+G7kSBsxrDhu6NuZyBnaGkgbmjhuq1uIOG7nyBUcnVuZyBRdeG7kWMgbMOgIG5oaeG7gXUgaMahbiBzbyB24bubaSBWaeG7h3QgTmFtDQoNCg0KLS0tIA0KDQojIyAqKjYuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBjYSBt4bqvYyBDb3ZpZC0xOSB0aGVvIHThu6tuZyBt4bupYyDhu58gVmnhu4d0IE5hbSBzbyB24bubaSBUcnVuZyBRdeG7kWMqKg0KDQpUYSDEkcOjIGNoaWEgY8OhYyBt4bupYyBnaGkgbmjhuq1uIHRow6BuaCA0IG5ow7NtLCB2w6AgYmnhu4N1IMSR4buTIHPhu5EgNSDEkcOjIHRo4buDIGhp4buHbiBj4bunYSBWaeG7h3QgTmFtIHbDoCBUcnVuZyBRdeG7kWMNCg0K4bueIG3hu6ljICoqZ2hpIG5o4bqtbiDDjXQqKiBjw7Mgc+G7kSBsxrDhu6NuZyBjYSAqKmTGsOG7m2kgMTAsMDAwIGNhIDEgbmfDoHkqKiAtIHThu5VuZyB0aHUgxJHGsOG7o2MgdOG7qyAyIG7GsOG7m2MgbMOgIGPDsyAqKjU0IG5nw6B5KiogZ2hpIG5o4bqtbg0KDQpUYSBtdeG7kW4gYmnhur90IGPhu6UgdGjhu4MgYsOqbiB0cm9uZyA1NCBuZ8OgeSwgdOG7q25nIG5nw6B5IGPDsyBz4buRIGNhIGdoaSBuaOG6rW4gY+G7pSB0aOG7gyBuaMawIHRo4bq/IG7DoG8sIHRhIGPDsyB0aOG7gyB4ZW0gYmnhu4N1IMSR4buTIGTGsOG7m2kgxJHDonkgOg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gVk5UUSAlPiUgZmlsdGVyKE5ldy5jYXNlczwxMDAwMCksDQogIG1hcHBpbmcgPSBhZXMoeT1Db3VudHJ5LCB4PU5ldy5jYXNlcywgZmlsbCA9IENvdW50cnkpKSArDQogIGdlb21fdmlvbGluKCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGxhYnModGl0bGUgPSAiQikgdmlvbGluIHBsb3QgYnkgZ2VuZGVyIikNCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQqKg0KDQpWw6wgbmjDs20gZ2hpIG5o4bqtbiDDjXQgxJHGsOG7o2MgdOG7lW5nIGjhu6NwIGThu7FhIHRyw6puIGPDoWMgbmfDoHkgYsOhbyBjw6FvIGPDsyBz4buRIGNhIGTGsOG7m2kgMTAsMDAwIGNhIG7Dqm4gdGEgc+G6vSBs4buNYyB04burIGNvbiBz4buRIMSR4bqleSByYQ0KDQotIFRhIHRo4bqleSBz4buRIGzGsOG7o25nIGNhIGTGsOG7m2kgMiw1MDAgbMOgIG5oaeG7gXUgaMahbiBo4bqzbiwgdGEgdGjhuqV5IHRyb25nIGJp4buDdSDEkeG7kSBj4bqjIFZp4buHdCBOYW0gdsOgIFRydW5nIFF14buRYyDEkeG7gXUgcGjDrG5oIHRvIHJhIOG7nyBwaOG6p24gxJHDoXkNCg0KLSBDw7JuIHRyw6puIG3hu6ljIDIsNTAwIHRow6wgc+G7kSBsxrDhu6NuZyBo4bq5cCBk4bqnbiAtIMSR4buTbmcgbmdoxKlhIHPhu5EgbmfDoHkgZ2hpIG5o4bqtbiBz4buRIGNhIG7DoHkgY8Wpbmcgw610IGjGoW4NCg0KLSBW4bqteSB0cm9uZyA1NCBuZ8OgeSBj4bunYSBuaMOzbSDDjXQgbsOgeSwgdGjDrCBz4buRIGNhIMSRYSBz4buRIHPhur0gxJHGsOG7o2MgZ2hpIG5o4bqtbiDhu58gbeG7qWMgZMaw4bubaSAyLDUwMCBjYSBsw6Agbmhp4buBdSBjaG8gbeG7mXQgbmfDoHkNCg0KDQotLS0NCg0KIyMgKio3LiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgY2EgbeG6r2MgQ292aWQtMTkgdGhlbyB04burbmcgbeG7qWMg4bufIFZp4buHdCBOYW0gc28gduG7m2kgVHJ1bmcgUXXhu5FjKioNCg0KTmjGsCBiaeG7g3UgxJHhu5MgNiwgdGEgbOG7jWMgZOG7sWEgdHLDqm4gY8OhYyBuZ8OgeSBiw6FvIGPDoW8gZMaw4bubaSAxMCwwMDAgY2ENCg0KVGjDrCBiaeG7g3UgxJHhu5Mgc+G7kSA3IHPhur0gbOG7jWMgZOG7sWEgdHLDqm4gY8OhYyBuZ8OgeSBiw6FvIGPDoW8gZMaw4bubaSAxMDAsMDAwIGNhDQoNCk7hur91IGTGsOG7m2kgMTAwLDAwMCBjYSB0aMOsIHPhur0gYmFvIGfhu5NtIG5ow7NtIOG7myBt4bupYyBHaGkgbmjhuq1uIMONdCB2w6AgS2jDtG5nIMSRw6FuZyBr4buDIMSRw6MgbsOqdSBiw6puIHRyw6puDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IFZOVFEgJT4lIGZpbHRlcihOZXcuY2FzZXM8MTAwMDAwKSwNCiAgbWFwcGluZyA9IGFlcyh5PUNvdW50cnksIHg9TmV3LmNhc2VzLCBmaWxsID0gQ291bnRyeSkpICsNCiAgZ2VvbV9qaXR0ZXIoKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNCi0g4bueIGPDoWMgY2EgY8OzIG3hu6ljIGdoaSBuaOG6rW4gdGjhuqVwIChkxrDhu5tpIDIsNTAwIGNhKSB0aMOsIGPDsyBz4buRIGzGsOG7o25nIG5nw6B5IG5oaeG7gXUgaMahbiAtIHRhIHRo4bqleSB0cm9uZyBiaeG7g3UgxJHhu5MsIGPDoWMgY2jhuqVtIGhp4buDbiB0aOG7iyDhu58gcGjhuqduIMSRw6F5IGTDoHkgxJHhurdjIGjGoW4NCg0KLSBWw6Ag4bufIGLDqm4gcGjhuqduIGPhu6dhIFZp4buHdCBOYW0gdGjDrCBz4buRIGzGsOG7o25nIOG7nyBt4bupYyBkxrDhu5tpIDIsNTAwIGzDoCBuaGnhu4F1IGjGoW4gc28gduG7m2kgVHJ1bmcgUXXhu5FjDQoNCi0gQ8OybiB04burIG3hu6ljIDIsNTAwIGNhIHRy4bufIGzDqm4gdGjDrCBjw6FjIGNo4bqlbSBi4bqvdCDEkeG6p3UgdGjGsGEgaMahbiBo4bqzbg0KDQrhu54gxJHDonkgdGEgbOG7jWMgxJHhu4MgdGjhuqV5IHLDtSDEkcaw4bujYyAyIG5ow7NtIG3hu6ljIGdoaSBuaOG6rW4gbMOgIMONdCB2w6AgS2jDtG5nIMSRw6FuZyBr4buDLCBjaOG7qSBu4bq/dSB4w6l0IHThu5FpIMSRYSBjw6FjIGNhIG3huq9jIMSRxrDhu6NjIGdoaSBuaOG6rW4gdGjDrCB04buVbmcgcXVhbiBz4bq9IGhvw6BuIHRvw6BuIHRoYXkgxJHhu5VpDQoNCi0tLQ0KDQojIyAqKjguIEJp4buDdSDEkeG7kyB0csOybiB0aOG7gyBoaeG7h24gc+G7kSBjYSBt4bqvYyBDb3ZpZC0xOSBj4bunYSBjw6FjIHF14buRYyBnaWEqKg0KDQpUxrDGoW5nIHThu7EgduG7m2kgY8OhY2ggY2hpYSB0aGVvIGPDoWMgbmjDs20gR2hpIG5o4bqtbiBiw6puIHRyw6puIC0gZ+G7k20gNCBuaMOzbSA6IMONdCwgS2jDtG5nIMSRw6FuZyBr4buDLCBW4burYSwgTmhp4buBdQ0KDQpUYSB0aeG6v24gaMOgbmggdGjhu4MgaGnhu4duIG7DsyB24bubaSBxdXkgbcO0IGPhu6dhIHThuqV0IGPhuqMgY8OhYyBxdeG7kWMgZ2lhIGPDsyB0cm9uZyBi4buZIGThu68gbGnhu4d1DQoNCi0gVHJvbmcgYuG7mSBk4buvIGxp4buHdSBjw7MgdOG7lW5nIGPhu5luZyAxMSw2MDUgbmfDoHkgYsOhbyBjw6FvIC0gdMawxqFuZyDEkcawxqFuZyB24bubaSAxMSw2MDUgbmfDoHkgZ2hpIG5o4bqtbiBjw6FjIGNhIG3huq9jIENvdmlkLTE5DQoNCi0gVGEgY2hpYSBjw6FjIG5nw6B5IMSRw7MgdGhlbyA0IG5ow7NtIGdoaSBuaOG6rW4gxJHDoyBuw7NpIHRyw6puIHbDoCB0aOG7gyBoaeG7h24gbsOzIGzDqm4gYmnhu4N1IMSR4buTIFRyw7JuDQoNClZp4buHYyB0aOG7gyBoaeG7h24gdHLDqm4gYmnhu4N1IMSR4buTIHRyw7JuIG5oxrAgduG6rXksIGPDsyB0aOG7gyBnacO6cCB0YSBow6xuaCBkdW5nIHRyw6puIHRvw6BuIHRo4bq/IGdp4bubaSwgc+G7kSBsxrDhu6NuZyBjYSBnaGkgbmjhuq1uIHPhur0gcsahaSB2w6BvIHPhu5EgbMaw4bujbmcgbmjDs20gbsOgbyBuaGnhu4F1IG5o4bqldA0KDQpUYSBjw7MgYmnhu4N1IMSR4buTIHRyw7JuIHNhdSA6DQoNCg0KYGBge3J9DQpDVlYgPC0gQ1YNCkNWViROZXcuY2FzZXMuR04gPC0gY2FzZV93aGVuKENWViROZXcuY2FzZXMgPDEwMDAwIH4gJ0doaSBuaOG6rW4gS2jDtG5nIMSRw6FuZyBr4buDJywgQ1ZWJE5ldy5jYXNlcyA+PTEwMDAwICYgQ1ZWJE5ldy5jYXNlcyA8MTAwMDAwIH4gJ0doaSBuaOG6rW4gw410JywgQ1ZWJE5ldy5jYXNlcyA+PTEwMDAwMCAmIENWViROZXcuY2FzZXMgPDUwMDAwMCB+ICdHaGkgbmjhuq1uIFbhu6thJywgQ1ZWJE5ldy5jYXNlcyA+PTUwMDAwMCB+ICdHaGkgbmjhuq1uIE5oaeG7gXUnKQ0KDQpDVlYgJT4lIGdyb3VwX2J5KE5ldy5jYXNlcy5HTikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0nJywgeSA9IG4sIGZpbGwgPSBOZXcuY2FzZXMuR04pKSArDQogIGdlb21fY29sKGNvbG9yID0gJ2JsYWNrJykgKw0KICBjb29yZF9wb2xhcigneScpICsNCiAgZ2VvbV90ZXh0KGFlcyh4ID0gMS4zLCBsYWJlbCA9IG4pLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIoKQ0KICANCmBgYA0KDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNCkThu7FhIHRyw6puIGJp4buDdSDEkeG7kyB0csOybiB0YSB0aOG6pXkgxJHGsOG7o2MgOg0KDQotIOG7niDEkWEgc+G7kSBjw6FjIHF14buRYyBnaWEsIG3hu6ljICoqR2hpIG5o4bqtbiBLaMO0bmcgxJHDoW5nIGvhu4MgbMOgIG5oaeG7gXUgbmjhuqV0KiogLSBjxaluZyBjw7MgbmdoxKlhIHRyb25nIDc0OTkgbmfDoHkgYsOhbyBjw6FvIHPhur0gY8OzIGtob+G6o25nIDEwLDAwMCAtIDEwMCwwMDAgY2EgDQoNCi0gTOG6p24gbMaw4bujdCBjw7JuIGzhuqFpIGzDoCBjw6FjIG3hu6ljIEdoaSBuaOG6rW4gw410LCBW4burYSwgTmhp4buBdSB24bubaSANCg0KLSBN4bupYyBHaGkgbmjhuq1uIMONdCBjw7Mga2hv4bqjbmcgKioyODY0IG5nw6B5KiosIHTGsMahbmcgxJHGsMahbmcgduG7m2kgbeG7qWMgbsOgeSBsw6Agc+G7kSBjYSBnaGkgbmjhuq1uIGTGsOG7m2kgMTAsMDAwIGNhDQoNCi0gQ8OybiAyICoqbeG7qWMgVuG7q2EgdsOgIE5oaeG7gXUqKiBjw7MgY2EgZ2hpIG5o4bqtbiBs4bqnbiBsxrDhu6N0IGzDoCAqKjEwMDcgdsOgIDIzNSBuZ8OgeSoqDQoNCsSQw6J5IGNo4buJIGzDoCBt4bupYyBuaOG6rW4geMOpdCB04buVbmcgcXVhbiB24buBIHTDrG5oIGjDrG5oIGPhu6dhIHRo4bq/IGdp4bubaSB24buBIGNhIGdoaSBuaOG6rW4sIGNoxrBhIMSRw6FuaCBnacOhIMSRxrDhu6NjIGPhu6UgdGjhu4MgxJHGsOG7o2Mg4bufIHThu6tuZyBxdeG7kWMgZ2lhDQoNCi0tLQ0KDQojIyAqKjkuIEJp4buDdSDEkeG7kyB0csOybiB0aOG7gyBoaeG7h24gc+G7kSBjYSBt4bqvYyBDb3ZpZC0xOSBj4bunYSB04burbmcgcXXhu5FjIGdpYSBj4bulIHRo4buDKioNCg0KTuG6v3UgbXXhu5FuIHRo4bqleSByw7UgcsOgbmcgdOG7q25nIG5ow7NtIGdoaSBuaOG6rW4g4bufIGPDoWMgcXXhu5FjIGdpYSBoYXkg4bufIHThu6tuZyBraHUgduG7sWMgcmnDqm5nIGJp4buHdCwgdGEgY8OzIHRo4buDIGzhu41jIGPhu6UgdGjhu4MgbuG6v3UgbXXhu5FuDQoNCkJp4buDdSDEkeG7kyBkxrDhu5tpIMSRw6J5IGPFqW5nIGPDsyBt4bupYyBjaGlhIG5oxrAgMiBiaeG7g3UgxJHhu5MgNSB2w6AgNiwgbmjGsG5nIGPhu6UgdGjhu4Mg4bufIMSRw6J5IGzDoCBj4bunYSAqKm7GsOG7m2MgTeG7uSAoVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhKSoqDQoNCg0KYGBge3J9DQpDVlYgJT4lIGZpbHRlcihDb3VudHJ5PT0gJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpICU+JQ0KICBncm91cF9ieShOZXcuY2FzZXMuR04pICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9JycsIHkgPSBuLCBmaWxsID0gTmV3LmNhc2VzLkdOKSkgKw0KICBnZW9tX2NvbChjb2xvciA9ICdibGFjaycpICsNCiAgY29vcmRfcG9sYXIoJ3knKSArDQogIGdlb21fdGV4dChhZXMoeCA9IDEuMywgbGFiZWwgPSBuKSxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpKSArDQogIHRoZW1lX3ZvaWQoKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNCkThu7FhIHbDoG8gYmnhu4N1IMSR4buTIHRhIHRo4bqleSA6DQoNCi0gTmjDs20gKipHaGkgbmjhuq1uIMONdCoqIGPDsyBz4buRIGzGsOG7o25nIGNhICoqZMaw4bubaSAxMCwwMDAgY2EgMSBuZ8OgeSoqIC0gdOG7lW5nIHRodSDEkcaw4bujYyB04burIDIgbsaw4bubYyBsw6AgY8OzICoqMTEgbmfDoHkqKiBnaGkgbmjhuq1uDQogICAgDQotIE5ow7NtICoqR2hpIG5o4bqtbiBLaMO0bmcgxJHDoW5nIGvhu4MqKiBjw7Mgc+G7kSBjYSAqKnThu6sgMTAsMDAwIC0gMTAwLDAwMCBjYSoqLCB04buVbmcgdGh1IMSRxrDhu6NjIGzDoCAqKjQ2IG5nw6B5KioNCiAgICANCi0gTmjDs20gKipHaGkgbmjhuq1uIFbhu6thKiogY8OzIHPhu5EgY2EgKip04burIDEwMCwwMDAgLSA1MDAsMDAwIGNhKiosIHThu5VuZyBsw6AgKio5MCBuZ8OgeSoqDQogICAgDQotIE5ow7NtICoqR2hpIG5o4bqtbiBOaGnhu4F1KiogY8OzIHPhu5EgY2EgKipoxqFuIDUwMCwwMDAgY2EqKiwgdOG7lW5nIGzDoCAqKjY0IG5nw6B5KioNCg0KTmfGsOG7o2MgbOG6oWkgduG7m2kgVHJ1bmcgUXXhu5FjIHbDoCBWaeG7h3QgTmFtIGhheSBj4bqjIHbhu5tpIHThu5VuZyBxdWFuIGPhu6dhIHRo4bq/IGdp4bubaSBsw6AgbeG7qWMgw410IHbDoCBLaMO0bmcgxJHDoW5nIGvhu4Mgc+G6vSBjaGnhur9tIG5oaeG7gXUgbmjhuqV0DQoNCk7GsOG7m2MgTeG7uSBs4bqhaSBjw7Mgc+G7kSBjYSBnaGkgbmjhuq1uIOG7nyAqKm3hu6ljIFbhu6thIHbDoCBOaGnhu4F1IGzDoCBuaGnhu4F1IG5o4bqldCoqLCBuZ2jEqWEgbMOgIHPhu5EgY2EgZ2hpIG5o4bqtbiDEkWEgc+G7kSBz4bq9IHThu6sgMTAwLDAwMCBjYSB0cuG7nyBsw6puDQoNCi0gU+G7kSBuZ8OgeSBj4bunYSBt4bupYyBnaGkgbmjhuq1uIE5oaeG7gXUgcGjhuqNpIGfhuqVwIGfhuqduIDYgbOG6p24gc28gduG7m2kgbeG7qWMgZ2hpIG5o4bqtbiDDjXQgdsOgIGfhuqVwIGtob+G6o25nIDEsMyBs4bqnbiBzbyB24bubaSBLaMO0bmcgxJHDoW5nIGvhu4MNCg0KLSBT4buRIG5nxrDhu51pIG3huq9jIENvdmlkLTE5IOG7nyBxdeG7kWMgZ2lhIG7DoHkgbMOgIG5oaeG7gXUgaMahbiBo4bqzbg0KDQotLS0NCg0KIyMgKioxMC4gQmnhu4N1IMSR4buTIGPhu5l0IGNo4buTbmcgdGjhu4MgaGnhu4duIHPhu5EgY2EgbeG6r2MgQ292aWQtMTkgY+G7p2EgdOG7q25nIHF14buRYyBnaWEqKg0KDQpUxrDGoW5nIHThu7EgYmnhu4N1IMSR4buTIHRyw7JuIHPhu5EgOSwgbmjGsG5nIHRow6wgbMOgIGjDrG5oIHRyw7JuIC0gdGEgdGjhu4MgaGnhu4duIG7DsyBi4bqxbmcgY+G7mXQgY2jhu5NuZyANCg0KVsOgIFF14buRYyBnaWEgdGEgbOG7sWEgY2jhu41uIGNow61uaCBsw6Agbsaw4bubYyBjw7Mgc+G7kSBsxrDhu6NuZyBjYSBt4bqvYyBDb3ZpZC0xOSBuaGnhu4F1IG5o4bqldCBDaMOidSDDgSAtIGNow61uaCBsw6AgKirhuqRuIMSQ4buZIEluZGlhKioNCg0KDQpgYGB7cn0NCkNWViAlPiUgZmlsdGVyKENvdW50cnk9PSAnSW5kaWEnKSAlPiUNCiAgZ3JvdXBfYnkoTmV3LmNhc2VzLkdOKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAnJywgeSA9IG4sZmlsbCA9IE5ldy5jYXNlcy5HTikpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMSkpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIoKSArDQogIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyBj4buZdCBjaOG7k25nIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGNhIGdoaSBuaOG6rW4gY+G7p2EgdOG7q25nIHF14buRYyBnaWEiKSArDQogIGxhYnMoeCA9ICdT4buRIGNhIGdoaSBuaOG6rW4gY2hpYSB0aGVvIG5ow7NtJywgeSA9ICdT4buRIGNhIGdoaSBuaOG6rW4nKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNCkThu7FhIHRoZW8gY8OhY2ggY2hpYSBjw6FjIG5ow7NtIGdoaSBuaOG6rW4gbmjGsCDhu58gYmnhu4N1IMSR4buTIDcsNiw1LCB0aMOsIHRhIHRo4bqleSDhuqRuIMSQ4buZIGPDsyA6DQoNCi0gTmjDs20gKipHaGkgbmjhuq1uIEtow7RuZyDEkcOhbmcga+G7gyoqIMSR4bupbmcgxJHhuqd1IHbhu5tpICoqNzYgbmfDoHkqKiBiw6FvIGPDoW8NCg0KLSBOaMOzbSAqKkdoaSBuaOG6rW4gVuG7q2EqKiDEkeG7qW5nIG5ow6wgduG7m2kgNTggbmfDoHkNCg0KLSBDw7JuIGzhuqFpIGzhuqduIGzGsOG7o3QgbMOgIG5ow7NtIMONdCB24bubaSA1NSBuZ8OgeSB2w6AgbmjDs20gTmhp4buBdSB24bubaSAyMiBuZ8OgeQ0KDQpOaMOsbiBjaHVuZyBzbyB24bubaSBjw6FjIG7GsOG7m2MgQ2jDonUgw4Ega2jDoWMgLSBj4bulIHRo4buDIGzDoCBWaeG7h3QgTmFtIHbDoCBUcnVuZyBRdeG7kWMgxJFhIG7Ds2kgdHLDqm4NCg0KLSBT4buRIGzGsOG7o25nIOG7nyAyIG5ow7NtIGPDsyBjYSBnaGkgbmjhuq1uIG5oaeG7gXUgbMOgIFbhu6thIHbDoCBOaGnhu4F1IGNoaeG6v20gY2FvIGjGoW4gc28gduG7m2kgVmnhu4d0IE5hbSB2w6AgVHJ1bmcgUXXhu5FjDQoNCi0gQ8OybiAyIG5ow7NtIGdoaSBuaOG6rW4gY8OybiBs4bqhaSB0aMOsIMSR4buZIOG7nyBuaMOzbSDDjXQgdGjDrCBsw6Agbmhp4buBdSBoxqFuLCBjw7JuIHbhu5tpIG5ow7NtIEtow7RuZyDEkcOhbmcga+G7gyBsw6Agw610IGjGoW4NCg0KDQotLS0NCg0KIyMgKioxMS4gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04buVbmcgcXVhbiBjw6FjIGNhIG3huq9jIENvdmlkLTE5IOG7nyBWaeG7h3QgTmFtIHF1YSBjw6FjIG7Eg20qKg0KDQpUcm9uZyBoxqFuIDQgbsSDbSBjaOG7kW5nIGThu4tjaCBj4bunYSBWaeG7h3QgTmFtLCDEkeG6pXQgbsaw4bubYyB0YSBjxaluZyB0cuG6o2kgcXVhIG5o4buvbmcgdGjhu51pIMSRaeG7g20gY8OzIGNhIGdoaSBuaOG6rW4gxJHhur9uIGvhu7cgbOG7pWMNCg0KTmjGsG5nIHbhu5tpIHPhu7EgxJHhu5NuZyBsw7JuZyBj4bunYSB04bqldCBj4bqjIG5nxrDhu51pIGTDom4gY8O5bmcgY2jDrW5oIHBo4bunIGNodW5nIHRheSBjaOG7kW5nIGThu4tjaCwgc+G7kSBjYSBt4bqvYyB2w6AgdOG7rSB2b25nIHbDoCBnaeG6o20gxJHDoW5nIGvhu4MNCg0KVGEgY8OzIHRo4buDIHhlbSBiaeG7g3UgxJHhu5MgZMaw4bubaSDEkcOieSA6DQoNCmBgYHtyfQ0KVk4gJT4lIGZpbHRlcihOZXcuY2FzZXM+MCkgJT4lDQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PU5ldy5jYXNlcykpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICdyZWQnKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHPhu5EgY2EgZ2hpIG5o4bqtbiBt4bqvYyBjb3ZpZCBj4bunYSBWaeG7h3QgTmFtIikgKw0KICBsYWJzKHggPSAnTsSDbSBnaGkgbmjhuq1uJywgJ1Phu5EgY2EgZ2hpIG5o4bqtbicpDQpgYGANCg0KIyMjIyAqKk5o4bqtbiB4w6l0KioNCg0KVGEgY8OzIHRo4buDIHRo4bqleSB04buVbmcgcXVhbiB24buBIGPDoWMgY2EgZ2hpIG5o4bqtbg0KDQotICoqTsSDbSAyMDIwKiogLSDEkcOieSBsw6AgdGjhu51pIMSRaeG7g20gbeG7m2kgYuG6r3QgxJHhuqd1IGThu4tjaCwgbsOqbiBz4buRIGzGsOG7o25nIGdoaSBuaOG6rW4gYmFuIMSR4bqndSBraMO0bmcgbmhp4buBdSBs4bqvbQ0KDQotICoqTsSDbSAyMDIxKiogLSBk4buLY2ggYuG7h25oIMSRYW5nIHThu6sgdOG7qyBiw7luZyBu4buVLCBjw6FjIGNhIG3huq9jIMSRw6MgxJHGsOG7o2MgZ2hpIG5o4bqtbiBuaGnhu4F1IGjGoW4NCg0KLSAqKk7Eg20gMjAyMioqIC0gxJHDonkgbMOgIG7Eg20gYsO5bmcgbuG7lSBk4buLY2gg4bufIG7GsOG7m2MgdGEgY2FvIG5o4bqldCwgY8OhYyBjYSBnaGkgbmjhuq1uIG3hu5dpIG5nw6B5IGzDoCBy4bqldCBuaGnhu4F1LCBr4bu3IGzhu6VjIG5oaeG7gXUgbmjhuqV0IGzDqm4gxJHhur9uIGjGoW4gMSw1MDAsMDAgY2ENCg0KLSAqKlThu5tpIG7Eg20gMjAyMyoqIC0gZOG7i2NoIGLhu4duaCDEkcOjIMSRxrDhu6NjIGtp4buDbSBzb8OhdCB04buRdCwgc+G7kSBsxrDhu6NuZyBjYSBt4bqvYyBjxaluZyDEkcOjIGdp4bqjbSBy4bqldCBuaGnhu4F1DQoNCkLDqm4gY+G6oW5oIMSRw7MsIHRhIGPDsyB0aOG7gyB4ZW0gYmnhu4N1IMSR4buTIGPDoWMgY2EgdOG7rSB2b25nIG5oxrAgZMaw4bubaSDEkcOieSA6DQoNCi0tLQ0KDQojIyAqKjEyLiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu5VuZyBxdWFuIGPDoWMgY2EgdOG7rSB2b25nIHbDrCBDb3ZpZC0xOSDhu58gVmnhu4d0IE5hbSBxdWEgY8OhYyBuxINtKioNCg0KDQpgYGB7cn0NClZOICU+JSBmaWx0ZXIoTmV3LmNhc2VzPjApICU+JQ0KICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1OZXcuZGVhdGhzKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAnYmxhY2snLCBsaW5ld2lkdGggPSAxKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBz4buRIGNhIGdoaSBuaOG6rW4gdOG7rSB2b25nIGNvdmlkIGPhu6dhIFZp4buHdCBOYW0iKSArDQogIGxhYnMoeCA9ICdOxINtIGdoaSBuaOG6rW4nLCAnU+G7kSBjYSB04butIHZvbmcnKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNClNvIHbhu5tpIGJp4buDdSDEkeG7kyBjw6FjIGNhIGdoaSBuaOG6rW4gdGjDrCBt4bq3YyBkw7kgbsSDbSAyMDIyIGPDsyBz4buRIGzGsOG7o25nIGdoaSBuaOG6rW4gbmhp4buBdSBuaOG6pXQsIG5oxrBuZyBuxINtIDIwMjEgbOG6oWkgY8OzIHPhu5EgbMaw4bujbmcgdOG7rSB2b25nIG5oaeG7gXUgaMahbg0KDQotICoqTsSDbSAyMDIxKiogY8OzIHPhu5EgbMaw4bujbmcgdOG7rSB2b25nIG5oaeG7gXUgaMahbiBjw6FjIG7Eg20gY8OybiBs4bqhaQ0KDQotIFRo4budaSDEkWnhu4NtIG7Eg20gMjAyMSwgY2jDum5nIHRhIGNo4buJIG3hu5tpIGLGsOG7m2MgdsOgbyBnaWFpIMSRb+G6oW4gxJHhuqd1LCBuw6puIGtpbmggbmdoaeG7h20gaGF5IGPDoWNoIHBow7JuZyBuZ+G7q2EgY2jGsGEgxJHGsOG7o2MgY2FvDQoNCi0gKirEkOG6v24gbsSDbSAyMDIyKiosIHRhIMSRw6MgdGjhuqV5IMSRxrDhu6NjIG3hu6ljIMSR4buZIG5ndXkgaGnhu4NtIGPhu6dhIENvdmlkIG1hbmcgxJHhur9uLCBuw6puIHThu7cgbOG7hyB04bu3IHZvbmcgbMOgIMOtdCBoxqFuDQoNCi0gKipWw6AgxJHhur9uIG7Eg20gMjAyMyoqIHRow6wgc+G7kSBsxrDhu6NuZyDEkcOjIGdp4bqjbSBj4buxYyBr4buzIMSRw6FuZyBr4buDDQoNClbhu5tpIHRpbmggdGjhuqduICJDaOG7kW5nIGThu4tjaCBuaMawIGNo4buRbmcgZ2nhurdjIiwgVmnhu4d0IE5hbSB0YSDEkcOjIHRo4buxYyBoaeG7h24gcuG6pXQgdOG7kXQgdsOgIGPDsm4gxJHGsOG7o2MgY8O0bmcgbmjhuq1uIGzDoCBt4buZdCB0cm9uZyBuaOG7r25nIG7GsOG7m2Mga2nhu4NtIHNvw6F0IHThu5F0IG5o4bqldCB0aOG6vyBnaeG7m2kNCg0KLS0tDQoNCiMjICoqMTMuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbeG7qWMgdMSDbmcgdMOtY2ggbMWpeSBj4bunYSBjw6FjIGNhIG3huq9jIENvdmlkLTE5IHRoZW8gbmfDoHkvdGjDoW5nL27Eg20g4bufIFZp4buHdCBOYW0qKg0KDQpCaeG7g3UgxJHhu5Mgc+G7kSAxMSB2w6AgMTIgdGjhu4MgaGnhu4duIGPDoWMgY2EgZ2jhu4sgbmjhuq1uIHbDoCB04butIHZvbmcgdGhlbyB04burbmcgbsSDbQ0KDQpN4buXaSBuxINtIMSR4buBdSBjw7MgY8OhYyBz4buRIGxp4buHdSBraMOhYyBuaGF1LCBuaMawbmcga2hv4bqjbmcgY3Xhu5FpIG7Eg20gMjAyMSDEkeG6p3UgbsSDbSAyMDIyIGNow61uaCBsw6AgdGjhu51pIMSRaeG7g20gYsO5bmcgbuG7lSBuaGnhu4F1IG5o4bqldA0KDQpUYSBz4bq9IHRp4bq/cCB04bulYyB0aeG6v24gaMOgbmggeGVtIHjDqXQgKio2IHRow6FuZyBjdeG7kWkgY+G7p2EgbsSDbSAyMDIxKiosIMSR4buDIHhlbSAqKnPhu5EgY2EgdMOtY2ggbMWpeSoqIGPDsyB0xINuZyBxdcOhIG5oaeG7gXUgdsOgIMSRw6FuZyBr4buDIGhheSBraMO0bmcgOg0KDQpgYGB7cn0NClZOICU+JSBmaWx0ZXIoWWVhcj09MjAyMSAmIE1vbnRoPjYpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9TW9udGgsIHk9Q3VtdWxhdGl2ZS5jYXNlcykpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gJ2JsYWNrJywgbGluZXdpZHRoID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBz4buRIGNhIGdoaSBuaOG6rW4gbeG6r2MgY292aWQgY+G7p2EgVmnhu4d0IE5hbSA2IHRow6FuZyBjdeG7kWkgMjAyMSIpICsNCiAgbGFicyh4ID0gJ1Row6FuZyBnaGkgbmjhuq1uJywgeSA9ICdT4buRIGNhIGdoaSBuaOG6rW4gdMOtY2ggbMWpeScpDQpgYGANCg0KIyMjIyAqKkzGsHUgw70qKiANCg0KLSBT4buRIGNhIG3huq9jIHTDrWNoIGzFqXkgbMOgICoqc+G7kSBsxrDhu6NuZyDEkcaw4bujYyBj4buZbmcgZOG7k24qKiDEkeG7gyB0aOG6pXkgxJHGsOG7o2MgKip04buVbmcgY+G7mW5nIGPDsyBiYW8gbmhpw6p1IGNhIG3huq9jIHTDrW5oIHThu6sga2hpIGThu4tjaCBiw7luZyBu4buVKioNCg0KLSBUw61jaCBsxal5IGPhu5luZyBk4buTbiBraMO0bmcgY8OzIG5naMSpYSBsw6AgbmfDoHkgbsOgbyBjxaluZyBjw7Mgc+G7kSBjYSBuaMawIHbhuq15LCBtw6AgY29uIHPhu5EgY8OzIMSRxrDhu6NjIGzDoCDEkcaw4bujYyAqKmPhu5luZyB04burbmcgbmfDoHkgdOG7q25nIG5nw6B5KiogduG7m2kgbmhhdQ0KDQotIFZkIG7hur91IG5oxrAgY8OzIG3hu5l0IG5nw6B5IGPDsyDDrXQgY2EgbeG6r2MgQ292aWQgLSB0aMOsIGNvbiBz4buRIHTDrWNoIGzFqXkgc+G6vSDEkcaw4bujYyBnaeG7ryBuZ3V5w6puIGhv4bq3YyB0xINuZyB0xrDGoW5nIOG7qW5nDQoNCi0gVHJvbmcgc+G7kSBjYSB0w61jaCBsxal5LCBjw7MgdGjhu4MgxJHDoyBjw7MgYuG7h25oIG5ow6JuIGto4buPaSBi4buHbmgsIGPDsyB0aOG7gyBjw7MgYuG7h25oIG5ow6JuIMSRw6MgdOG7rSB2b25nDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNClRyb25nIDYgdGjDoW5nIGN14buRaSBj4bunYSBuxINtIDIwMjEsIHRhIMSRw6MgdGjhuqV5IHPhu5EgbMaw4bujbmcgY2EgdMOtY2ggbMWpeSBjw7MgdMSDbmcsIG5oxrBuZyBjxaluZyBjw7MgdGjhu51pIMSRaeG7g20gbsOzIGdp4buvIG5ndXnDqm4NCg0KLSBT4buRIGNhIMSRw6MgKip2xrDhu6N0IG3hu5FjIDUwMCwwMDAgY2EqKiB2w6BvIGtob+G6o25nICoqdGjDoW5nIDkvMjAyMSoqDQoNCi0gU2F1IMSRw7MgdGjDrCBjb24gc+G7kSBuw6B5IGzhuqFpIHRp4bq/cCB04bulYyB0xINuZw0KDQotIFbDoG8ga2hv4bqjbmcgKip0aMOhbmcgMTEvMjAyMSoqLCBz4buRIGNhIG3huq9jIMSRw6MgY2jhuqFtICoqMSwwMDAsMDAwIGNhKioNCg0KLSBWw6AgdOG7m2kgY3Xhu5FpIG7Eg20gbMOgICoqdGjDoW5nIDEyKiosIFZp4buHdCBOYW0gxJHDoyBnaGkgbmjhuq1uICoqaMahbiAxLDYwMCwwMDAgY2EgbeG6r2MgQ292aWQtMTkqKg0KDQpEw7kgY8OzIGPDoWMgdGjhu51pIMSRaeG7g20gc+G7kSBjYSB0w61jaCBsxal5IGtow7RuZyB0xINuZyBuaGnhu4F1IG5oxrBuZyBuaMOsbiBjaHVuZyBjw6FjIGNhIG3huq9jIHbhuqtuIHTEg25nIHLhuqV0IG5oaeG7gXUgdHJvbmcgdGjhu51pIMSRaeG7g20gbsOgeQ0KDQoNCi0tLQ0KDQojIyAqKjE0LiBCaeG7g3UgxJHhu5Mgc28gc8Ohbmggc+G7kSBjYSBt4bqvYyB2w6AgdOG7rSB2b25nIHbDrCBDb3ZpZC0xOSBj4bunYSBWaeG7h3QgTmFtKioNCg0KVHJvbmcgNCBuxINtIHRow6wgc+G7kSBjYSBnaGkgbmjhuq1uIGPhu6dhIFZp4buHdCBOYW0gY8WpbmcgbMOgIGtow6Egbmhp4buBdSwgYsOqbiBj4bqhbmggxJHDsyDEkcOjIGPDsyBuaOG7r25nIGLhu4duaCBuaMOibiDEkcOjIGtow7RuZyBtYXkgbeG6r24gcXVhIGto4buPaQ0KDQpDaMOtbmggcGjhu6cgdsOgIE5ow6Agbsaw4bubYyBWaeG7h3QgTmFtIGPFqW5nIMSRw6MgY+G7kSBo4bq/dCBz4bupYyDEkeG7gyBjw7luZyBuZ8aw4budaSBkw6JuIGNodW5nIHRheSBjaOG7kW5nIGThu4tjaA0KDQotIFbDoCBtYXkgbeG6r24gcuG6sW5nIHPhu5EgY2EgdOG7rSB2b25nIOG7nyBuxrDhu5tjIHRhIHNvIHbhu5tpIHPhu5EgY2EgZ2hpIG5o4bqtbiBsw6AgdGjhuqVwIGjGoW4gcuG6pXQgbmhp4buBdQ0KDQotIENo4bupbmcgdOG7jyBjaMO6bmcgdGEgxJHDoyBy4bqldCB0w61jaCBj4buxYyB0cm9uZyB2aeG7h2MgcGjDsm5nIGNo4buRbmcgZOG7i2NoIGLhu4duaA0KDQpWw6AgYmnhu4N1IMSR4buTIGTGsOG7m2kgxJHDonksIGNobyB0YSB0aOG6pXkgcsO1IDIgbeG7qWMgdMOtY2ggbMWpeSBnaGkgbmjhuq1uIHbDoCB04butIHZvbmcgOiANCg0KKFRhIHRp4bq/biBow6BuaCB24bq9IGThu7FhIHRyw6puIHRow6FuZyAxMiBj4bunYSB04burbmcgbsSDbSAtIGPDsyB0aOG7gyB0aGF5IMSR4buVaSBu4bq/dSBtdeG7kW4pDQoNCg0KYGBge3J9DQpWTiAlPiUgZmlsdGVyKE1vbnRoPT0xMikgJT4lDQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PUN1bXVsYXRpdmUuY2FzZXMpKSArDQogIGdlb21fbGluZShhZXMoY29sb3IgPSAiU+G7kSBjYSBnaGkgbmjhuq1uIHTDrWNoIGzFqXkiKSwgbGluZXdpZHRoID0gMSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBDdW11bGF0aXZlLmRlYXRocywgY29sb3IgPSAiU+G7kSBjYSB04butIHZvbmcgdMOtY2ggbMWpeSIpLCBsaW5ld2lkdGggPSAxKSArDQogIHNjYWxlX3lfbG9nMTAoKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHPhu5EgY2EgZ2hpIG5o4bqtbiBt4bqvYyB2w6AgdOG7rSB2b25nIHTDrWNoIGzFqXkgY+G7p2EgVmnhu4d0IE5hbSIpICsNCiAgbGFicyh4ID0gJ07Eg20gZ2hpIG5o4bqtbicsIHkgPSAnU+G7kSBjYSB0w61jaCBsxal5JykNCmBgYA0KDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNCk5ow6xuIHThu5VuZyBxdWFuIHRhIHRo4bqleSDEkcaw4bujYywgxJHDoyBjw7MgcuG6pXQgbmhp4buBdSBi4buHbmggbmjDom4gxJHDoyDEkcaw4bujYyBjaOG7rWEga2jhu49pIENvdmlkLTE5DQoNCi0gU+G7kSBsxrDhu6NuZyBjYSBt4bqvYyB04burICoqbsSDbSAyMDIwIMSR4bq/biAyMDIxKiogbMOgICoqdMSDbmcgbmhp4buBdSBuaOG6pXQqKiB2w6AgY2EgKip04butIHZvbmcqKiB0aOG7nWkgxJFp4buDbSBuw6B5IGPFqW5nIG5oxrAgduG6rXkNCg0KLSBUcm9uZyAqKjIgbsSDbSB0aeG6v3AgdGhlbyoqLCB0aMOsIHPhu5EgY2EgdMOtY2ggbMWpeSBnaGkgbmjhuq1uIGPFqW5nIHTEg25nIG5oxrBuZyBjw7MgduG6uyBraMO0bmcgbmhp4buDdSBuaMawIHRyxrDhu5tjDQoNCi0gQ8OybiBjw6FjIGNhIHThu60gdm9uZyB0aMOsIGPFqW5nIHTEg25nIGNo4bqtbSBoxqFuIMSRw6FuZyBr4buDDQoNCi0gVsOgIHThu5tpICoqbsSDbSAyMDIzKiogdGjDrCBz4buRIGzGsOG7o25nIHTDrWNoIGzFqXkgY+G7p2EgY+G6oyAyIMSRw6MgZ+G6p24gbmjGsCB0xINuZyB24bubaSBsxrDhu6NuZyBy4bqldCDDrXQNCg0KLS0tDQoNCiMjICoqMTUuIEJp4buDdSDEkeG7kyB04bqnbiBz4buRIGPDoWMgY2EgdOG7rSB2b25nIGPhu6dhIFZp4buHdCBOYW0ga2hpIHNvIHPDoW5oIHbhu5tpIFRydW5nIFF14buRYyoqDQoNCkJp4buDdSDEkeG7kyB04bqlbiBzdeG6pXQgduG7gSBjw6FjIGNhIGdoaSBuaOG6rW4gdOG7rSB2b25nIGTGsOG7m2kgxJHDonkgbMOgIHRyb25nIGtob+G6o25nIHRo4budaSBnaWFuIG7Eg20gMjAyMg0KDQrEkOG7gyBiaeG6v3QgxJHGsOG7o2MgZ2nhu69hIFZp4buHdCBOYW0gdsOgIFRydW5nIFF14buRYyB0cm9uZyBuxINtIDIwMjIsIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Egc+G7kSBjYSB04butIHZvbmcgbMOgIHF1w6EgcsO1IHLhu4d0IGhheSBraMO0bmcNCg0KDQpgYGB7cn0NCkNWRCA8LSBDVg0KQ1ZEMSA8LSBDVkQNCkNWRDEgJT4lIGZpbHRlcihDb3VudHJ5PT0iVmlldCBOYW0iICYgWWVhcj09MjAyMnwgQ291bnRyeSA9PSAiQ2hpbmEiICYgWWVhcj09MjAyMikgJT4lDQogIGdncGxvdChhZXMoeD1OZXcuZGVhdGhzLCBjb2xvcj1Db3VudHJ5KSkgKyANCiAgZ2VvbV9mcmVxcG9seShsaW5ld2lkdGggPSAxKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHPhu5EgY8OhYyBjYSB04butIHZvbmcgY+G7p2EgVmnhu4d0IE5hbSBraGkgc28gc8OhbmggduG7m2kgVHJ1bmcgUXXhu5FjIDIwMjIiKSArDQogIGxhYnMoeCA9ICdT4buRIGNhIGdoaSBuaOG6rW4nLCB5ID0gJ1ThuqduIHPhu5EgeHXhuqV0IGhp4buHbicpDQpgYGANCg0KIyMjIyAqKk5o4bqtbiB4w6l0KioNCg0KLSBWw6BvIG5o4buvbmcgbmfDoHkgY8OzIHPhu5EgbMaw4bujbmcgY2EgKip04burIHZvbmcgdOG7qyAwLTIwMDAgY2EqKiB0aMOsIHPhu5EgbMaw4bujbmcgY+G7p2EgKipUcnVuZyBRdeG7kWMgbMOgIG5o4buJbmggaMahbioqIHNvIHbhu5tpIFZp4buHdCBOYW0NCg0KLSBN4buXaSBuxrDhu5tjIMSR4buBdSBjw7Mgc+G7kSBsxrDhu6NuZyB04burIHbDoGkgdHLEg20gxJHhur9uIHbDoGkgbmfDoG4gY2EgdOG7rSB2b25nIA0KDQotIE5oxrBuZyBz4buRIGzGsOG7o25nIGPhu6dhIFRydW5nIFF14buRYyBsw6Agbmhp4buBdSBoxqFuIFZp4buHdCBOYW0gbeG7mXQgY2jDunQNCg0KLSBOZ2/DoGkgcmEsIFRydW5nIFF14buRYyBjw7JuIGdoaSBuaOG6rW4gc+G7kSBjYSB04butIHZvbmcgbmhp4buBdSBuaOG6pXQgdHJvbmcgbsSDbSAyMDIyIGzDoCBn4bqnbiA2LDAwMCBjYSANCg0KLSBDw7JuIFZp4buHdCBOYW0gdOG7kWkgxJFhIHRyb25nIG7Eg20gMjAyMiBjaOG7iSBraG/huqNuZyAxLDQwMCBjYSB04butIHZvbmcNCg0KLS0tDQoNCiMjICoqMTYuIEJp4buDdSDEkeG7kyBzbyBzw6FuaCBz4buRIGNhIG3huq9jIHbDoCB04butIHZvbmcgY+G7p2EgVmnhu4d0IE5hbSB24bubaSBt4buZdCBz4buRIG7GsOG7m2Mga2jDoWMgbsSDbSAyMDIwKioNCg0KQmnhu4N1IMSR4buTIHThuqduIHPhu5Egc+G7kSAxMyDEkcOjIHNvIHPDoW5oIG7GsOG7m2MgdGEgduG7m2kgVHJ1bmcgUXXhu5FjIHbhu4Egc+G7kSBsxrDhu6NuZyBjYSB04butIHZvbmcNCg0KVGjDrCBiaeG7g3UgxJHhu5MgbsOgeSBz4bq9IHRow6ptIG3hu5l0IG7GsOG7m2MgbMOgIOG6pG4gxJDhu5kgdsOgIGPhuqMgc+G7kSBjYSBnaGkgbmjhuq1uIG7hu69hDQoNClRhIGPDsyBiaeG7g3UgxJHhu5Mgc2F1IDoNCg0KDQpgYGB7cn0NCkNWViAlPiUgZmlsdGVyKENvdW50cnk9PSAnQ2hpbmEnICYgWWVhcj09MjAyMiB8IENvdW50cnk9PSAnSW5kaWEnJiBZZWFyPT0yMDIyIHwgQ291bnRyeT09ICdWaWV0IE5hbScmIFllYXI9PTIwMjIpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9TmV3LmNhc2VzLCB5PU5ldy5kZWF0aHMsIGNvbG9yPSBDb3VudHJ5LmNvZGUpKSArDQogIGdlb21fbGluZShsaW5ld2lkdGg9MSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBzbyBzw6FuaCBz4buRIGNhIGdoaSBuaOG6rW4gdsOgIHThu60gdm9uZyBj4bunYSBWaeG7h3QgTmFtIHbhu5tpIG7GsOG7m2Mga2jDoWMgMjAyMiIpICsNCiAgbGFicyh4ID0gJ1Phu5EgY2EgZ2hpIG5o4bqtbicsIHkgPSAnU+G7kSBjYSB04butIHZvbmcnKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNCkNvdW50cnkuY29kZSB0cm9uZyBiaeG7g3UgxJHhu5MgY8OzIG5naMSpYSBsw6AgbcOjIHZp4bq/dCB04bqvdCBxdeG7kWMgZ2lhLCBj4bulIHRo4buDIGzDoCA6DQoNCi0gKipDTiBsw6AgVHJ1bmcgUXXhu5FjKiogKENoaW5hKSAtIGPDsyDEkcaw4budbmcgdHJvbmcgYmnhu4N1IMSR4buTIGzDoCAqKm3DoHUgxJHhu48qKg0KDQotICoqSU4gbMOgIOG6pG4gxJDhu5kqKiAoSW5kaWEpIC0gY8OzIMSRxrDhu51uZyB0cm9uZyBiaeG7g3UgxJHhu5MgbMOgICoqbcOgdSB4YW5oIGzDoSoqDQoNCi0gKipWTiBsw6AgVmnhu4d0IE5hbSoqIChWaWV0IE5hbSkgLSBjw7MgxJHGsOG7nW5nIHRyb25nIGJp4buDdSDEkeG7kyBsw6AgKiptw6B1IHhhbmggZMawxqFuZyoqDQoNClRhIHRo4bqleSDEkcaw4bujYyB04burIGJp4buDdSDEkeG7kyA6DQoNCi0gKirEkMaw4budbmcgbcOgdSDEkeG7jyoqIGPhu6dhIFRydW5nIFF14buRYyBjw7MgbMaw4bujbmcg4bufIHPhu5EgY2EgZ2hpIG5o4bqtbiB2w6AgdOG7rSB2b25nICoqxJHhu4F1IHTEg25nKioNCg0KLSDEkMOjIGPDsyB0aOG7nWkgxJFp4buDbSB0cm9uZyBuxINtIDIwMjIsIFRydW5nIFF14buRYyDEkeG6oXQgc+G7kSAqKmNhIGdoaSBuaOG6rW4gxJHhur9uIGjGoW4gNDAsMDAwLDAwMCBjYSoqLCB2w6Agc+G7kSBjYSAqKnThu60gdm9uZyBsw6AgZ+G6p24gNiwwMDAgY2EqKg0KDQotICoq4bqkbiDEkOG7mSB24bubaSDEkcaw4budbmcgbcOgdSB4YW5oIGzDoSoqIGPFqW5nIGPDsyBt4bupYyBnaGkgbmjhuq1uIMSRw6FuZyBjaMO6IMO9DQoNCi0gRMO5IGPDsyBz4buRIGzGsOG7o25nIGdoaSBuaOG6rW4ga2jDtG5nIGNhbyBuaMawIFRydW5nIFF14buRYyBuaMawbmcgxJHDoyBjw7MgKipn4bqnbiA4LDAwMCBjYSB04butIHZvbmcqKg0KDQotIFJpw6puZyAqKlZp4buHdCBOYW0gLSDEkcaw4budbmcgbcOgdSB4YW5oIGTGsMahbmcqKiwgY+G6oyDhu58gbeG7qWMgZ2hpIG5o4bqtbiBoYXkgdOG7rSB2b25nIMSR4buBdSDhu58gbeG7qWMgdGjhuqVwIGjGoW4NCg0KLS0tDQoNCiMjICoqMTcuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBjYSBt4bqvYyB2w6AgdOG7rSB2b25nIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSBDaMOidSDDgnUqKg0KDQpTYXUga2hpIMSRw6MgbmjDrG4gaOG6v3QgY8OhYyBiaeG7g3UgxJHhu5MgY+G7p2EgVmnhu4d0IE5hbSwgdGEgdGnhur9uIGjDoG5oIMSRaSBzYW5nIGPDoWMgbsaw4bubYyBi4bqhbiDhu58gdGjhur8gZ2nhu5tpDQoNClRhIGPDsyB0aOG7gyBjaOG7jW4ga2h1IHbhu7FjIGNow6J1IGzhu6VjLCBoYXkgdGhlbyBraHUgduG7sWMgV0hPIHBow6JuIHRow6BuaCwuLi4gDQoNCkJp4buDdSDEkeG7kyBkxrDhu5tpIMSRw6J5IHRo4buDIGhp4buHbiBz4buRIGNhIGdoaSBuaOG6rW4gY8WpbmcgbmjGsCB04butIHZvbmcgZ2hpIG5o4bqtbiBj4bunYSBjw6FjIHF14buRYyBnaWEgQ2jDonUgw4J1IA0KDQpgYGB7cn0NCkNWViAlPiUgZmlsdGVyKENvbnRpbmVudHM9PSAnRXVyb3BlJyAmIFllYXI9PTIwMjAgJiBNb250aD09IDEyKSAlPiUNCiAgZ2dwbG90KGFlcyh4PU5ldy5kZWF0aHMsIHk9TmV3LmNhc2VzLCBjb2xvcj0gQ291bnRyeSkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgY2EgZ2hpIG5o4bqtbiB2w6AgdOG7rSB2b25nIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSBDaMOidSDDgnUiKSArDQogIGxhYnMoeCA9ICdT4buRIGNhIHThu60gdm9uZycsIHkgPSAnU+G7kSBjYSBnaGkgbmjhuq1uJykNCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQqKg0KDQpDw7MgdOG7lW5nIGPhu5luZyAxNCBxdeG7kWMgZ2lhIHRodeG7mWMga2h1IHbhu7FjIENow6J1IMOCdSBuaMawIGLDqm4gdHLDqm4NCg0KQmnhu4N1IMSR4buTIMSRxrDhu6NjIHbhur0gZOG7sWEgdHLDqm4gc+G7kSBjYSBnaGkgbmjhuq1uIHbDoCB04butIHZvbmcgdsOgbyAqKnRow6FuZyAxMi8yMDIwKioNCg0KLSBMw7pjIG7DoHksIHThu5VuZyBxdWFuIGNobyB0aOG6pXkgY8OhYyBxdeG7kWMgZ2lhIENow6J1IGPDsyBz4buRIGNhIGdoaSBuaOG6rW4gcsahaSB2w6BvIGtob+G6o25nIGjGoW4gNTAsMDAwIGNhDQoNCi0gVsOgIGPDoWMgY2EgdOG7rSB2b25nIGPFqW5nIGNo4buJIGTGsOG7m2kgNiwwMDAgY2ENCg0KVsOgbyB0aOG7nWkgxJFp4buDbSBjdeG7kWkgbsSDbSAyMDIwIHRow6wgZOG7i2NoIGLhu4duaCDhu58gQ2jDonUgw4J1IGNoxrBhIGLDuW5nIHBow6F0IGNhbyBuaOG6pXQgbsOqbiBjw6FjIGNvbiBz4buRIHRhIHRo4bqleSB24bqrbiBraMO0bmcgcGjhuqNpIGzDoCBxdcOhIGzhu5tuDQoNCi0tLQ0KDQojIyAqKjE4LiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHh1IGjGsOG7m25nIGPDoWMgY2EgbeG6r2MgdsOgIHThu60gdm9uZyBj4bunYSBjw6FjIHF14buRYyBnaWEgQ2jDonUgw4J1KioNCg0KDQpgYGB7cn0NCkNWViAlPiUgZmlsdGVyKENvbnRpbmVudHM9PSAnRXVyb3BlJyAmIFllYXI9PTIwMjAgJiBNb250aD09IDEyKSAlPiUNCiAgZ2dwbG90KGFlcyh4PU5ldy5kZWF0aHMsIHk9TmV3LmNhc2VzLCBjb2xvcj0gQ291bnRyeSkpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICdibGFjaycpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24geHUgaMaw4bubbmcgY8OhYyBjYSBnaGkgbmjhuq1uIHbDoCB04butIHZvbmcgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIENow6J1IMOCdSIpICsNCiAgbGFicyh4ID0gJ1Phu5EgY2EgdOG7rSB2b25nJywgeSA9ICdT4buRIGNhIGdoaSBuaOG6rW4nKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNClRhIHRo4bqleSBiaeG7g3UgxJHhu5MgbsOgeSBn4bqnbiBnaeG7kW5nIHbhu5tpIGJp4buDdSDEkeG7kyBz4buRIDE1IGLDqm4gdHLDqm4sIG5oxrBuZyB24bqrbiBraMOhYyDhu58gbmhp4buBdSBjaOG7lw0KDQotIOG7niBiaeG7g3UgxJHhu5MgbsOgeSBraMO0bmcgY8OybiBj4bulIHRo4buDIGPDoWMgY2jhuqVtIHRyw7JuIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSBtw6AgY2jhu4kgdGjhu4MgaGnhu4duIHThu5VuZyB0aOG7gw0KDQotIE5nb8OgaSByYSB0YSBjw7MgdGjhuqV5IHRow6ptICoqxJDGsOG7nW5nIHh1IGjGsOG7m25nIC0gZ2VvbV9zbW9vdGgoKSoqIC0gZ2nDunAgdGjhu4MgaGnhu4duIHRow6ptIHh1IGjGsOG7m25nIGPhu6dhIGPDoWMgY2jhuqVtIHRyw7JuDQoNCi0gQ8OhYyBjaOG6pW0gdHLDsm4g4bufIMSRw6J5IHRo4buDIGhp4buHbiBjaG8gc+G7kSBjYSBnaGkgbmjhuq1uIHbDoCB04butIHZvbmcgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIENow6J1IMOCdQ0KDQotIEPDoWMgY2EgZ2hpIG5o4bqtbiB0aMOhbmcgMTIvMjAyMiBj4bunYSBjw6FjIHF14buRYyBnaWEgQ2jDonUgw4J1IGPDsyBjaGnhu4F1IGjGsOG7m25nIG7hurFtIOG7nyBt4bupYyBraMOhIGNhbw0KDQotLS0NCg0KIyMgKioxOS4gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGNhIG3huq9jIENvdmlkLTE5IHTDrWNoIGzFqXkgY+G7p2EgQ2jDonUgw4J1KioNCg0KVGEgY8OzIHRo4buDIHhlbSBt4bupYyDEkeG7mSBnaGkgbmjhuq1uIGPDoWMgY2EgdMOtY2ggbMWpeSDhu58gQ2jDonUgw4J1IGThu7FhIHRyw6puIGJp4buDdSDEkeG7kyBzYXUgOg0KDQoNCmBgYHtyfQ0KQ1YgJT4lIGZpbHRlcihDb250aW5lbnRzPT0gJ0V1cm9wZScpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9Q3VtdWxhdGl2ZS5jYXNlcywgZmlsbCA9IENvbnRpbmVudHMpKSArDQogIGdlb21fZGVuc2l0eSgpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu5VuZyBjYSBnaGkgbmjhuq1uIHTDrWNoIGzFqXkgY+G7p2EgQ2jDonUgw4J1IikgKw0KICBsYWJzKHggPSAnU+G7kSBjYSBnaGkgbmjhuq1uIHTDrWNoIGzFqXknLCB5ID0gJ1Thu7cgdHLhu41uZycpDQpgYGANCg0KIyMjIyAqKk5o4bqtbiB4w6l0KioNCg0KQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04buVbmcgY2EgdMOtY2ggbMWpeSBj4bunYSBjw6FjIHF14buRYyBnaWEgdGh14buZYyBDaMOidSDDgnUNCg0KLSBUYSB0aOG6pXkgbeG7qWMgdMOtY2ggbMWpeSBjw6FjIGNhIHRyb25nIGJp4buDdSDEkeG7kyBsw6Aga2hv4bqjbmcgNDAsMDAwLDAwMCBjYQ0KDQotIFbDrCBsw6Agc+G7kSBsaeG7h3UgdMOtY2ggbMWpeSB04burIG5o4buvbmcgbmfDoHkgxJHhuqd1IG7Dqm4gc+G7kSBjYSBnaGkgbmjhuq1uIHRyb25nIGJp4buDdSDEkeG7kyBz4bq9IGjGoWkgbmhp4buBdSB2w6Aga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QNCg0KLSBOaMawbmcgdGEgbmjDrG4gdsOgbyBiaeG7g3UgxJHhu5MsIOG7nyBt4bupYyBnaGkgbmjhuq1uIHPhu5EgY2EgbsOgbyBjw7MgdOG7iSB0cuG7jW5nIGPDoG5nIGNhbyAoY8OgbmcgcGjDrG5oIGzDqm4gdHLDqm4pIHRow6wgY2jhu6luZyB04buPIGPDoWMgY2EgdMOtY2ggbMWpeSDEkWFuZyDEkcaw4bujYyBnaeG7ryBuZ3V5w6puDQoNCi0gQ8OybiBu4buBdSBjw6FjIG3hu6ljIGPDsyB04bu3IHRy4buNbmcgdGjhuqVwIGNo4bupbmcgdOG7jyDEkcOjIGPDsyBjw6FjIGNhIGdoaSBuaOG6rW4gdGjDqm0NCg0KDQotLS0NCg0KIyMgKioyMC4gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGNhIG3huq9jIENvdmlkLTE5IHTDrWNoIGzFqXkgY+G7p2EgY8OhYyBDaMOidSBM4bulYyoqDQoNCkPFqW5nIG5oxrAgYmnhu4N1IMSR4buTIHPhu5EgMTksIG5oxrBuZyBs4bqnbiBuw6B5IHRhIHPhur0gc28gc8OhbmggdGjDqm0gduG7m2kgQ2jDonUgUGhpIC0gQWZyaWNhDQoNCmBgYHtyfQ0KQ1YgJT4lIGZpbHRlcihDb250aW5lbnRzPT0gJ0V1cm9wZScgfCBDb250aW5lbnRzPT0gJ0FmcmljYScpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9Q3VtdWxhdGl2ZS5jYXNlcywgZmlsbCA9IENvbnRpbmVudHMpKSArDQogIGdlb21fZGVuc2l0eSgpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu5VuZyBjYSBnaGkgbmjhuq1uIHTDrWNoIGzFqXkgY+G7p2EgQ2jDonUgw4J1IHbDoCBDaMOidSBQaGkiKSArDQogIGxhYnMoeCA9ICdT4buRIGNhIGdoaSBuaOG6rW4gdMOtY2ggbMWpeScsIHkgPSAnVOG7tyB0cuG7jW5nJykNCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQqKg0KDQpUYSBjxaluZyBjw7Mgbmjhuq1uIHjDqXQgdMawxqFuZyB04buxIG5oxrAgYmnhu4N1IMSR4buTIHPhu5EgMTkNCg0KLSBOaMawbmcgdGEgxJHDoyB0aOG6pXkg4bufIG5oaeG7gXUgbeG7qWMgZ2hpIG5o4bqtbiBj4bunYSBDaMOidSBQaGkgxJHDoyBjw7MgcGjhuqduIHbGsOG7o3QgY2FvIGjGoW4gQ2jDonUgw4J1DQoNCi0gTmjGsG5nIMSRYSBz4buRIGPDoWMgbeG7qWMgZ2hpIG5o4bqtbiB0csOqbiAxMCwwMDAsMDAwIGNhIHRow6wgQ2jDonUgUGhpIMSRw6MgY8OzIGzGsOG7o25nIGdoaSBuaOG6rW4gw610IGjGoW4gaOG6s24gc28gduG7m2kgQ2jDonUgw4J1DQoNCg0KDQoNCg0KDQo=