Nội dung của Nhiệm vụ

  • Nhiệm vụ yêu cầu vẽ cũng như phân tích 20 đồ thị khác nhau

  • Bộ dữ liệu tiến hành thực hiện là Bộ dữ liệu về Covid-19 của một số quốc gia

  • Tên của bộ dữ liệu : tạm gọi là Data Covid-19

Tổng quan về Bộ dữ liệu Data Covid-19

1. Nguồn gốc của Bộ dữ liệu

  • Trang web tham khảo của bộ dữ liệu : WHO DATA

  • Ta gán bộ dữ liệu gốc với tên là CV (viết tắt của Covid)

library(csv)
CV <- read.csv('D:/UFM/COVID 19.csv', header = T)

2. Một số thông tin về Bộ dữ liệu

Nội dung của bộ dữ liệu về :

  • Dữ liệu sẽ có các số liệu cung cấp về tình hình dịch bệnh Covid-19 của một số quốc gia

  • Các thông số sẽ cung cấp các trường hợp ghi nhận mắc Covid-19trường hợp ghi nhận đã tử vong vì Covid-19 của một số quốc gia

  • Thời gian được tính từ tháng 1/2020 đến ngày cập nhật mới nhất là tháng 1/2024

  • Mặc dù có nhiều quốc gia trong bộ dữ liệu, nhưng ta cũng sẽ chỉ tiến hành phân tích chủ yếu một số quốc gia như Việt Nam, Trung Quốc,…..

Lưu ý : Số liệu được ghi nhận được tính theo từng ngày báo cáo và sẽ cách đều 7 ngày cho mỗi biến

  • Một ngày báo cáo đó đại diện cho sự tổng hợp của 7 ngày trước đó

  • Ví dụ nếu ngày 7/1/2022 có số liệu là 1,000,000 ca thì không có nghĩa trong 1 ngày có tới 1,000,000 ca mắc, mà là từ ngày 1 đến 7 có tổng 1,000,000 ca được tổng hợp lại

  • Cho nên trong khi phân tích số liệu, ta sẽ tạm gói gọn sự tổng hợp của 7 ngày thành 1 ngày báo cáo đại diện

  • Vì 7 ngày sẽ được tổng hợp lại thành 1 ngày báo cáo, nên số ngày cụ thể của mỗi tháng là khác biệt

  • tổng là 211 ngày cho mỗi quốc gia (tính từ tháng 1/2020 - tháng 1/2024)


Bộ dữ liệu CV bao gồm : 11,605 quan sát12 biến

  • Mỗi quan sát đại diện cho số liệu của một ngày báo cáo của một quốc gia về các ca ghi nhận hoặc tử vong

  • Mỗi biến đại diện cho các thông tin khác nhau : như tên quốc gia, ngày, năm, trường hợp ghi nhận,…

dim(CV)
## [1] 11605    12

Với 12 biến tương ứng, mỗi biến cung cấp các thông tin khác nhau, bao gồm như sau :

  • 1. Date reported : Đây là Ngày báo cáo (cụ thể cả ngày tháng năm) của các số liệu đã được thống kê

  • 2. Month : Đây là tháng của ngày báo cáo trên (chỉ khác là nó được tách ra riêng thành 1 biến)

  • 3. Day : Đây là ngày của ngày báo cáo trên

  • 4. Year : Đây là năm của ngày báo cáo trên

  • 5. Country code : Mã viết tắt của các quốc gia (ví dụ Việt Nam là VN)

  • 6. Country : Tên cụ thể của các quốc gia và vùng lãnh thổ

  • 7. Continents : Châu lục của các quốc gia thuộc về

  • 8. WHO region : Đây chính là khu vực do WHO chia thành để báo cáo, phân tích và quản lý các quốc gia

  • 9. New cases : Số trường hợp ghi nhận mắc covid (theo từng ngày riêng biệt, không cộng dồn)

  • 10. Cumulative cases : Số ca ghi nhận tích lũy mắc covid (có cộng dồn từng ngày)

  • 11. New death : - Sô trường hợp ghi nhận đã tử vong (theo từng ngày riêng biệt, không cộng dồn)

  • 12. Cumulative deaths : - Số trường hợp ghi nhận tích lũy đã tử vong vì covid (có cộng dồn từng ngày)

Ngoài ra trong một số biến gồm các thông tin khác

  • Continents là Châu lục của các quốc gia thuộc về, bao gồm 7 châu lục như sau :

    • Asia - Châu Á

    • Africa - Châu Phi

    • North America - Bắc Mỹ

    • South America - Nam Mỹ

    • Europe - Châu Âu

    • Australia - Châu Úc/ Châu Đại Dương

    • Antarctica - Châu Nam Cực

  • WHO Regions là từng khu vực được đặt dưới sự quản lý của WHO, được chia thành 6 nhóm như sau :

    • AFRO - Khu vực Châu Phi

    • AMRO - Khu vực Châu Mỹ

    • SEARO - Khu vực Đông Nam Á

    • EURO - Khu vực Châu Âu

    • EMRO - Khu vực Đông Địa Trung Hải

    • WPRO - Khu vực Tây Thái Bình Dương

str(CV)
## 'data.frame':    11605 obs. of  12 variables:
##  $ Date.reported    : chr  "1/5/2020" "1/12/2020" "1/19/2020" "1/26/2020" ...
##  $ Month            : int  1 1 1 1 2 2 2 2 3 3 ...
##  $ Day              : int  5 12 19 26 2 9 16 23 1 8 ...
##  $ Year             : int  2020 2020 2020 2020 2020 2020 2020 2020 2020 2020 ...
##  $ Country.code     : chr  "AO" "AO" "AO" "AO" ...
##  $ Country          : chr  "Angola" "Angola" "Angola" "Angola" ...
##  $ Continents       : chr  "Africa" "Africa" "Africa" "Africa" ...
##  $ WHO.region       : chr  "AFRO" "AFRO" "AFRO" "AFRO" ...
##  $ New.cases        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Cumulative.cases : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ New.deaths       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Cumulative.deaths: int  0 0 0 0 0 0 0 0 0 0 ...

Ngoài ra còn có các thông tin khác :

library(skimr)
skim(CV)
Data summary
Name CV
Number of rows 11605
Number of columns 12
_______________________
Column type frequency:
character 5
numeric 7
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Date.reported 0 1 8 10 0 211 0
Country.code 0 1 2 2 0 55 0
Country 0 1 4 52 0 55 0
Continents 0 1 4 13 0 6 0
WHO.region 0 1 4 5 0 6 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Month 0 1 6.44 3.48 1 3 6 10 12 ▇▅▅▅▇
Day 0 1 15.74 8.78 1 8 16 23 31 ▇▇▇▆▆
Year 0 1 2021.35 18.80 0 2021 2022 2023 2024 ▁▁▁▁▇
New.cases 0 1 56823.44 493536.86 -65079 107 2803 23334 40475477 ▇▁▁▁▁
Cumulative.cases 0 1 5795338.74 13966746.91 0 77914 979801 4505220 103436829 ▇▁▁▁▁
New.deaths 0 1 511.56 1738.20 -3432 0 23 247 47687 ▇▁▁▁▁
Cumulative.deaths 0 1 69218.43 150862.12 0 684 12018 63172 1161235 ▇▁▁▁▁

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

  • Ta tiến hành phân tích và vẽ biểu đồ của 6 khu vực này

  • Ta sẽ ghi nhận các ca mắc Covid-19 trong 2 ngày được tổng hợp của năm 2024

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(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 EMROAFRO 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

  • Khu vực EURO ở biểu đồ 2 là có lượng ghi nhận tủ vong nhiều nhất thì ở đây ta đã thấy số lượng các ca ở mỗi ngày như thế nào

    • Ví dụ với số ca tử vong là ở mức 200 ca, thì số ngày ghi nhận 200 ca này là khoảng 1-2 ngày

    • Con số ca tử vong ở mức 100 và 50 cũng như vậy, sẽ có khoảng 1 hoặc 2 ngày sẽ có 100 ca tử vong

  • Các khu vực còn lại giải thích tương tự như khu vực EURO ở phía 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

  • Việt Nam đã vượt qua đại dịch và trở thành một trong những nước “đi sau nhưng về trước”

  • Dịch COVID-19 hiện nay đã được kiểm soát trên phạm vi toàn quốc

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 Ít204 ngày ghi nhận khoảng từ 0 - 461,000 ca

  • Nhóm Vừa3 ngày ghi nhận khoảng từ 461,000 - 923,000 ca

  • Nhóm Nhiều2 ngày ghi nhận khoảng từ 923,000 - 1,300,000 ca

  • Nhóm Rất nhiều2 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ế

  • 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
  • Đầu tiên ta lọc từ dữ liệu thành chỉ còn 2 nước Việt Nam và Trung Quốc

  • Sau đó ta tiến hành chia số ca ghi nhận mắc Covid-19 cũng thành 4 nhóm và thu được kết quả như sau :

    • 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ó 54 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à 302 ngày

    • Nhóm Ghi nhận Vừa có số ca từ 100,000 - 500,000 ca, tổng là 17 ngày

    • Nhóm Ghi nhận Nhiều có số ca hơn 500,000 ca, tổng là 49 ngày

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ì :

  • Màu đỏ chính là đại diện cho số ca của Việt Nam

  • Màu vàng là đại diện cho số ca của Trung Quốc

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à may mắn rằng số ca tử vong ở nước ta so với số ca ghi nhận là thấp hơn rất nhiều

  • Chứng tỏ chúng ta đã rất tích cực trong việc phòng chống dịch bệnh

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 2021tă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=