NHIỆM VỤ 3.1


1. Tóm tắt

Nhiệm vụ 3.1 thực hiện các thao tác đã học trên bộ dữ liệu population and demography - một set data miêu tả về dân số của 254 quốc gia trên thế giới từ năm 1950 đến năm 2021.

2. Giới thiệu

2.1. Đọc dữ liệu từ file cvs

Set data population and demograph là file cvs nên để đọc được dữ liệu thì ta gán bộ dữ liệu vào a và sử dụng lệnh read.csv.

a <- read.csv(file = 'C:/Users/Admin/Downloads/population-and-demography.csv', header = T)

2.2. Thông tin tổng quan của dữ liệu

is.data.frame(a) #kiểm tra a có phải là 1 data frame hay không, nếu ra true thì a là một data frame, ra false thì a không là một data frame
## [1] TRUE
length(a) #kiểm tra độ dài của bộ dữ liệu
## [1] 24
names(a) #kiểm tra tên và bộ dữ liệu có bao nhiêu cột (biến)
##  [1] "Country.name"                              
##  [2] "Year"                                      
##  [3] "Population"                                
##  [4] "Population.of.children.under.the.age.of.1" 
##  [5] "Population.of.children.under.the.age.of.5" 
##  [6] "Population.of.children.under.the.age.of.15"
##  [7] "Population.under.the.age.of.25"            
##  [8] "Population.aged.15.to.64.years"            
##  [9] "Population.older.than.15.years"            
## [10] "Population.older.than.18.years"            
## [11] "Population.at.age.1"                       
## [12] "Population.aged.1.to.4.years"              
## [13] "Population.aged.5.to.9.years"              
## [14] "Population.aged.10.to.14.years"            
## [15] "Population.aged.15.to.19.years"            
## [16] "Population.aged.20.to.29.years"            
## [17] "Population.aged.30.to.39.years"            
## [18] "Population.aged.40.to.49.years"            
## [19] "Population.aged.50.to.59.years"            
## [20] "Population.aged.60.to.69.years"            
## [21] "Population.aged.70.to.79.years"            
## [22] "Population.aged.80.to.89.years"            
## [23] "Population.aged.90.to.99.years"            
## [24] "Population.older.than.100.years"
dim(a) #kiểm tra bộ dữ liệu có bao nhiêu quan sát (obs) và biến (variables), hay kiểm tra bộ dữ liệu có bao nhiêu dòng và cột
## [1] 18288    24
str(a) #kiểm tra cấu trúc của bộ dữ liệu
## 'data.frame':    18288 obs. of  24 variables:
##  $ Country.name                              : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ Year                                      : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ Population                                : num  7480464 7571542 7667534 7764549 7864289 ...
##  $ Population.of.children.under.the.age.of.1 : num  301735 299368 305393 311574 317584 ...
##  $ Population.of.children.under.the.age.of.5 : int  1248282 1246857 1248220 1254725 1267817 1291129 1322342 1354752 1387274 1421808 ...
##  $ Population.of.children.under.the.age.of.15: int  3068855 3105444 3145070 3186382 3231060 3281470 3337026 3396048 3455343 3518528 ...
##  $ Population.under.the.age.of.25            : num  4494349 4552138 4613604 4676232 4741371 ...
##  $ Population.aged.15.to.64.years            : num  4198587 4250002 4303436 4356242 4408474 ...
##  $ Population.older.than.15.years            : num  4411609 4466098 4522464 4578167 4633229 ...
##  $ Population.older.than.18.years            : num  3946595 3993640 4041439 4088379 4136116 ...
##  $ Population.at.age.1                       : num  258652 254304 252906 258717 264765 ...
##  $ Population.aged.1.to.4.years              : num  946547 947489 942827 943151 950233 ...
##  $ Population.aged.5.to.9.years              : int  966210 991791 1017993 1039950 1055592 1062420 1063212 1065357 1071666 1084972 ...
##  $ Population.aged.10.to.14.years            : int  854363 866796 878857 891707 907651 927921 951472 975939 996403 1011748 ...
##  $ Population.aged.15.to.19.years            : int  757113 768616 781411 794308 806216 817550 828600 839588 851433 867048 ...
##  $ Population.aged.20.to.29.years            : int  1241348 1260904 1280288 1298803 1316768 1334989 1353958 1374043 1393789 1414034 ...
##  $ Population.aged.30.to.39.years            : int  909953 922765 935638 948321 961484 975801 991166 1007440 1023595 1040441 ...
##  $ Population.aged.40.to.49.years            : int  661807 667015 672491 678064 684153 691279 699431 708537 717938 728233 ...
##  $ Population.aged.50.to.59.years            : int  467170 468881 470898 472969 475117 477664 480665 484018 487393 491447 ...
##  $ Population.aged.60.to.69.years            : int  271905 273286 274852 276577 278210 279789 281376 282918 284592 286551 ...
##  $ Population.aged.70.to.79.years            : int  92691 94358 96026 97705 99298 100839 102385 103932 105508 107136 ...
##  $ Population.aged.80.to.89.years            : int  9499 10155 10721 11254 11793 12342 12890 13428 13959 14495 ...
##  $ Population.aged.90.to.99.years            : int  123 118 139 166 190 210 233 255 277 307 ...
##  $ Population.older.than.100.years           : num  0 0 0 0 0 0 0 0 0 0 ...
sum(is.na(a)) #kiểm tra số ô trống của bộ dữ liệu
## [1] 0
table(duplicated(a)) #kiểm tra số dữ liệu bị trùng
## 
## FALSE 
## 18288

Kết quả trả về cho ta biết:

  • Bộ dữ liệu có cấu trúc là một data frame, có 18288 quan sát (obs) và 24 biến (variables)

    • 18288 quan sát tương ứng với 18288 hàng

    • 24 biến tương ứng với 24 cột

    • Cột đầu tiên là biến định lượng, 23 cột sau là biến định tính, trong đó:

      • chr: Kiểu biến là ký tự

      • int: Kiểu biến là số nguyên

      • num: Kiểu biến là số thực

    • Bộ dữ liệu không có dữ liệu trống và bị trùng nhau

  • Ý nghĩa tên biến của bộ dữ liệu:

    • Country.name: Tên quốc gia

    • Year: Năm

    • Population: Tổng dân số của quốc gia

    • Population of children under the age of 1: Dân số dưới 1 tuổi

    • Population of children under the age of 5: Dân số dưới 5 tuổi

    • Population of children under the age of 15: Dân số dưới 15 tuổi

    • Population under the age of 25: Dân số dưới 25 tuổi

    • Population aged 15 to 64 years: Dân số có độ tuổi từ 15 tới 64

    • Population older than 15 years: Dân số có độ tuổi lớn hơn 15

    • Population older than 18 years: Dân số có độ tuổi lớn hơn 18

    • Population at age 1: Dân số có độ tuổi là 1

    • Population aged 1 to 4 years: Dân số có độ tuổi từ 1 tới 4

    • Population aged 5 to 9 years: Dân số có độ tuổi từ 5 tới 9

    • Population aged 10 to 14 years: Dân số có độ tuổi từ 10 tới 14

    • Population aged 15 to 19 years: Dân số có độ tuổi từ 15 tới 19

    • Population aged 20 to 29 years: Dân số có độ tuổi từ 20 tới 29

    • Population aged 30 to 39 years: Dân số có độ tuổi từ 30 tới 39

    • Population aged 40 to 49 years: Dân số có độ tuổi từ 40 tới 49

    • Population aged 50 to 59 years: Dân số có độ tuổi từ 50 tới 59

    • Population aged 60 to 69 years: Dân số có độ tuổi từ 60 tới 69

    • Population aged 70 to 79 years: Dân số có độ tuổi từ 70 tới 79

    • Population aged 80 to 89 years: Dân số có độ tuổi từ 80 tới 89

    • Population aged 90 to 99 years: Dân số có độ tuổi từ 90 tới 99

    • Population older than 100 years: Dân số có độ tuổi trên 100

3. Phân tích chi tiết dân số của 6 nước ở 6 độ tuổi khác nhau

3.1. Đổi tên cho các biến cần dùng

Để thuận tiện cho việc phân tích, trước hết ta đổi tên cột của bộ dữ liệu mà ta sẽ sử dụng với câu lệnh names()

names(a)[names(a) == "Country.name"] <- "name"
names(a)[names(a) == "Year"] <- "Y"
names(a)[names(a) == "Population"] <- "P"
names(a)[names(a) == "Population.aged.1.to.4.years"] <- "a1to4"
names(a)[names(a) == "Population.aged.5.to.9.years"] <- "a5to9"
names(a)[names(a) == "Population.aged.10.to.14.years"] <- "a10to14"
names(a)[names(a) == "Population.aged.15.to.19.years"] <- "a15to19"
names(a)[names(a) == "Population.aged.20.to.29.years"] <- "a20to29"
names(a)[names(a) == "Population.aged.30.to.39.years"] <- "a30to39"

Với câu lệnh names, kết quả trả về cho chúng ta thấy:

  • Cột ‘Country.name’ đổi tên thành name

  • Cột ‘Year’ đổi thành Y

  • Cột ‘Population’ đổi thành P

  • Cột ‘Population.aged.1.to.4.years’ đổi thành a1to4

  • Cột ‘Population.aged.5.to.9.years’ đổi thành a5to9

  • Cột ‘Population.aged.10.to.14.years’ đổi thành a10to14

  • Cột ‘Population.aged.15.to.19.years’ đổi thành a15to19

  • Cột ‘Population.aged.20.to.29.years’ đổi thành a20to29

  • Cột ‘Population.aged.30.to.39.years’ đổi thành a30to39

3.2. Rút trích dữ liệu

Set data population and demography có tới 254 quốc gia và nhiều độ tuổi khác nhau, tuy nhiên nhiều khi chúng ta không dùng hết được dữ liệu thu về mà chỉ dùng một lượng nhỏ dữ liệu thôi. Để thực hiện rút trích dữ liệu ta thao tác như sau:

library('tidyverse') #gọi package 'tidyverse'
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── 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
b <- a %>% select(name, Y, P, a1to4, a5to9, a10to14, a15to19, a20to29, a30to39)
c <- b[b$name=='Argentina' | b$name=='Japan' | b$name=='Brazil' | b$name=='South Korea' | b$name=='France' | b$name=='Canada', ]
d <- c[c$Y==2019 | c$Y==2020 | c$Y==2021, ]

Kết quả trả về cho ta biết:

  • Trong 254 quốc gia, ta chỉ chọn ra dân số của 6 quốc gia bao gồm: Argentina, Brazil, Canada, France, Japan, South Korea.

  • Với 6 độ tuổi đó khác nhau: từ 1 tới 4 tuổi, 5 tới 9 tuổi, 10 tới 14 tuổi, 15 tới 19 tuổi, 20 tới 29 tuổi, 30 tới 39 tuổi.

  • Ở 3 năm liên tiếp 2019, 2020, 2021.

  • Và chọn thêm 1 cột tổng dân số của 6 nước trên.

3.3. Mã hóa dữ liệu

Đôi khi, dữ liệu chúng ta thu về là dữ liệu định lượng, mà trong một vài trường hợp, dữ liệu định lượng không thể phản ánh được kết quả chúng ta cần tìm. Khi đó, chúng ta sẽ phải chuyển đổi dữ liệu định lượng sang dữ liệu định tính bằng các câu lệnh case_when, cut(), case_matchifelse().

library('tidyverse') #gọi package 'tidyverse'

d$Dân.Số <- case_when(d$P<=39999999 ~ 'Thưa thớt', d$P>=40000000 & d$P<=79999999 ~ 'Trung bình', d$P>=80000000 & d$P<=99999999 ~ 'Đông đúc', d$P>=100000000 ~ 'Rất đông đúc' )

d$CL <- cut(d$P,4, labels = c('Thưa thớt', 'Trung bình', 'Đông đúc', 'Rất đông đúc'))
  • Câu lệnh thứ nhất: Ta tạo một cột mới tên là Dân.số dựa trên cột Population (đã đổi tên thành P). Với dân số nhỏ hơn 39.999.999 thì được xem là “thưa thớt”, dân số trong khoảng từ 40.000.000 đến 79.999.999 được xem là “trung bình”, dân số trong khoảng 80.000.000 đến 99.999.999 được xem là “đông đúc” và cuối cùng, dân số lớn hơn 100.000.000 được xem là “rất đông đúc”.

=> Ta dùng để so sánh dân số của các quốc gia với nhau, xem rằng một quốc gia trong một năm nào đó đó thưa thớt hay đông dân.

  • Tương tự, ở câu lệnh thứ hai: Ta tạo một cột mới tên là CL dựa trên cột Population (P). Dùng lệnh cut() chia cột P thành 4 nhóm: “Thưa thớt”, “Trung bình”, “Đông đúc”“Rất đông đúc”.
d$Châu.Lục <- d$name %>% case_match('Argentina' ~ 'Châu Mỹ', 'Brazil' ~ 'Châu Mỹ', 'Canada' ~ 'Bắc Mỹ', 'France' ~ 'Châu Âu', 'Japan' ~ 'Châu Á', 'South Korea' ~ 'Châu Á')
  • Câu lệnh thứ ba: Ta tiếp tục tạo một cột mới tên Châu.Lục dựa trên cột Country.name (đã đổi tên thành name). Những quốc gia nào thuộc châu Âu thì ta xếp vào “Châu Âu” và ta làm tương tự với những quốc gia thuộc “Châu Á”, “Châu Mỹ”“Bắc Mỹ”.

=> Việc mã hóa các quốc gia theo châu lục, có thể giúp các nhà phân tích dễ làm việc với dữ liệu theo nhóm châu lục, so sánh dân số của các quốc gia trong cùng một châu lục, hoặc so sánh dân số châu lục này với châu lục khác.

d$Dân.số.từ.20.đến.29.tuổi <- ifelse(d$a20to29<=7000000, 'Ít ỏi', 'Dày đặc')
  • Câu lệnh thứ bốn: Ta cũng tạo một cột mới tên Dân.số.từ.20.đến.29.tuổi dựa trên cột Population.aged.20.to.29 (đã đổi tên thành a20to29). Với dân số nhỏ hơn 7.000.000 được xem là “ít ỏi” và ngược lại, dân số trên 7.000.000 được xem là “Dày đặc”.

=> Câu lệnh này ta có thể dùng để phân tích xem dân số đang trong độ tuổi lao động (20 đến 29 tuổi) của một quốc gia này trong một năm là nhiều hay ít.

3.4. Lập bảng tần số

Câu lệnh của lập bảng tần số là table(), có công dụng xem một đối tượng đã xuất hiện bao nhiêu lần trong bộ dữ liệu.

Câu lệnh cut() có công dụng chia nhóm các đối tượng lại với nhau.

cut(d$a1to4,4) #chia các giá trị ở cột a1to4 thành 4 nhóm
##  [1] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06]
##  [4] (9.11e+06,1.17e+07] (9.11e+06,1.17e+07] (9.11e+06,1.17e+07]
##  [7] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06]
## [10] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06]
## [13] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06]
## [16] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06]
## 4 Levels: (1.35e+06,3.94e+06] (3.94e+06,6.53e+06] ... (9.11e+06,1.17e+07]
table(cut(d$a1to4,4)) 
## 
## (1.35e+06,3.94e+06] (3.94e+06,6.53e+06] (6.53e+06,9.11e+06] (9.11e+06,1.17e+07] 
##                  15                   0                   0                   3

Câu lệnh đầu tiên, kết quả trả về cho ta biết:

Cột a1to4 được chia làm 4 nhóm.

  • Nhóm đầu tiên nhận 15 giá trị.

  • Nhóm thứ 2 và thứ 3 không có giá trị.

  • Nhóm thứ 4 nhận 4 giá trị.

e <- d %>% group_by(Châu.Lục) %>% summarise(n = n()) #kểm tra tần số xuất hiện của các quốc gia theo cột Châu.Lục

Câu lệnh thứ hai, kết quả trả về cho ta biết:

Số lần xuất hiện của các châu lục lần lượt là:

  • Bắc Mỹ: 3 lần

  • Châu Mỹ: 6 lần

  • Châu Á: 6 lần

  • Châu Âu: 3 lần

f <- d %>% group_by('a5to9', 'a10to14') %>% summarise(n=n(), .groups='drop')

Câu lệnh thứ ba, kết quả trả về cho ta biết, nhóm 2 cột a5to9a10to14, tần số xuất hiện của nhóm này là 18 lần.

3.5. Tính toán các đặc trưng đo lường

Bước phân tích này sẽ cho chúng ta những kết quả chi tiết nhất của bộ dữ liệu, cụ thể như sau:

summary(d$P)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##  37522584  45096220  58122225  89581607 125086702 214326220

Câu lệnh thứ nhất, kết quả trả về cho ta biết, trên cột P:

  • Số nhỏ nhất là: 37.522.584

  • Có 25% tổng dân số có giá trị nhỏ hơn: 45.096.220 hay có 75% tổng dân số có giá trị lớn hơn: 45.096.220

  • Có 50% tổng dân số có giá trị nhỏ hơn: 58.122.225 hay có 50% tổng dân số có giá trị lớn hơn: 58.122.225

  • Cột P có tổng giá trị trung bình là: 89.581.607

  • Có 75% tổng dân số có giá trị nhỏ hơn 125.086.702 hay có 25% tổng dân số có giá trị lớn hơn: 125.086.702

  • Số lớn nhất là: 214.326.220

sum(d$a1to4) #tính tổng giá trị của cột
## [1] 71495439

Câu lệnh thứ hai, kết quả trả về cho biết, tổng dân số trong độ tuổi từ 1 đến 4 của 6 quốc giá trong 3 năm là: 71.495.439

length(d$a5to9)
## [1] 18

Câu lệnh thứ ba, kết quả trả về cho biết, dân số từ 5 đến 9 tuổi của 6 quốc gia trong 3 năm có độ dài bằng: 18

var(d$a10to14)
## [1] 2.17204e+13

Câu lệnh thứ tư, kết quả trả về cho biết, dân số từ 10 đến 14 tuổi của 6 quốc gia trong 3 năm bằng có độ giao động bằng: 2.17204e+13

sd(d$a15to19)
## [1] 4971691

Câu lệnh thứ năm, kết quả trả về cho ta biết, dân số từ 15 đến 19 tuổi của 6 quốc gia trong 3 năm bằng có độ lệch chuẩn bằng: 4971.691

quantile(d$a30to39)
##       0%      25%      50%      75%     100% 
##  5177290  6520997  7582803 13632965 34847430

Câu lệnh thứ sau, kết quả trả về cho ta biết, dân số từ 30 đến 39 tuổi của 6 quốc gia trong 3 năm:

  • Có 0% dân số có giá trị nhỏ hơn: 5.177.290

  • Có 25% dân số có giá trị nhỏ hơn: 6.520.997

  • Có 50% dân số có giá trị nhỏ hơn: 7.582.803

  • Có 75% dân số có giá trị nhỏ hơn: 13.632.965

  • Có 100% dân số có giá trị nhỏ hơn: 34.847.430

3.6. Tính toán các đặc trưng đo lường theo nhóm

Để tính toán trung vị của cột có dân số từ 1 đến 4 tuổi theo nhóm quốc gia, ta thực hiện như sau:

g <- d %>% group_by(name) %>% summarise(med_of_pop = median(a1to4))

Câu lệnh này, kết quả trả về cho ta biết:

  • Có 50% dân số Argentina trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 2.797.080

  • Có 50% dân số Brazil trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 11.620.684

  • Có 50% dân số Canada trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 1.543.425

  • Có 50% dân số France trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 2.801.423

  • Có 50% dân số Japan trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 3.609.702

  • Có 50% dân số South Korea trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 1.479.129

Để tính toán độ lệch chuẩn của cột có dân số từ 1 đến 4 tuổi theo nhóm thời gian, ta thực hiện như sau:

h <- d %>% group_by(Y) %>% summarise(med_of_pop = sd(a1to4))

Kết quả trả về cho ta biết, dân số từ 1 đến 4 tuổi:

  • Năm 2019 có độ lệch chuẩn bằng: 3.838.389

  • Năm 2020 có độ lệch chuẩn bằng: 3.833.970

  • Năm 2021 có độ lệch chuẩn bằng: 3.814.198

NHIỆM VỤ 3.2


GLOBAL EDUCATION


1. Mục tiêu nghiên cứu

Set Data Global Education là một bộ dữ liệu cung cấp cái nhìn toàn cảnh về giáo dục trên quy mô toàn cầu, mang lại những hiểu biết sâu sắc về bối cảnh giáo dục năng động ở nhiều quốc gia và khu vực khác nhau.

Bộ dữ liệu này là tài sản không thể thiếu đối với các nhà nghiên cứu, các nhà giáo dục và các nhà hoạch định chính sách có tư duy tiến bộ, giúp họ đánh giá, nâng cao và định hình lại các hệ thống giáo dục trên toàn thế giới.

2. Phương pháp nghiên cứu

Sử dụng các phương pháp thống kê mô tả dữ liệu:

  • Rút trích dữ liệu

  • Mã hóa dữ liệu

  • Lập bảng tần số

  • Tính toán các đặc trưng đo lường

3. Giới thiệu về bộ dữ liệu

3.1. Đọc dữ liệu từ file cvs

Bộ dữ liệu Global Education được lấy từ Kaggle - một kho tàng dữ liệu khổng lồ cho những ai đặc biệt quan tâm về phân tích dữ liệu.

Global Education là một file cvs, tương tự như các file khác, ta cũng gán bộ dữ liệu vào i và dụng lệnh read.cvs để đọc dữ liệu.

i <- read.csv(file = 'C:/Users/Admin/Downloads/Global_Education.csv', header = T)

3.2. Thông tin tổng quan của dữ liệu

is.data.frame(i) #kiểm tra i có phải là 1 data frame hay không, nếu ra true thì i là một data frame, ngược lại thì i không là một data frame
## [1] TRUE
length(i) #kiểm tra độ dài của bộ dữ liệu
## [1] 29
names(i) #kiểm tra tên và bộ dữ liệu có bao nhiêu cột (biến)
##  [1] "Countries.and.areas"                    
##  [2] "Latitude"                               
##  [3] "Longitude"                              
##  [4] "OOSR_Pre0Primary_Age_Male"              
##  [5] "OOSR_Pre0Primary_Age_Female"            
##  [6] "OOSR_Primary_Age_Male"                  
##  [7] "OOSR_Primary_Age_Female"                
##  [8] "OOSR_Lower_Secondary_Age_Male"          
##  [9] "OOSR_Lower_Secondary_Age_Female"        
## [10] "OOSR_Upper_Secondary_Age_Male"          
## [11] "OOSR_Upper_Secondary_Age_Female"        
## [12] "Completion_Rate_Primary_Male"           
## [13] "Completion_Rate_Primary_Female"         
## [14] "Completion_Rate_Lower_Secondary_Male"   
## [15] "Completion_Rate_Lower_Secondary_Female" 
## [16] "Completion_Rate_Upper_Secondary_Male"   
## [17] "Completion_Rate_Upper_Secondary_Female" 
## [18] "Grade_2_3_Proficiency_Reading"          
## [19] "Grade_2_3_Proficiency_Math"             
## [20] "Primary_End_Proficiency_Reading"        
## [21] "Primary_End_Proficiency_Math"           
## [22] "Lower_Secondary_End_Proficiency_Reading"
## [23] "Lower_Secondary_End_Proficiency_Math"   
## [24] "Youth_15_24_Literacy_Rate_Male"         
## [25] "Youth_15_24_Literacy_Rate_Female"       
## [26] "Birth_Rate"                             
## [27] "Gross_Primary_Education_Enrollment"     
## [28] "Gross_Tertiary_Education_Enrollment"    
## [29] "Unemployment_Rate"
dim(i) #kiểm tra bộ dữ liệu có bao nhiêu quan sát (obs) và biến (variables), hay kiểm tra bộ dữ liệu có bao nhiêu dòng và cột
## [1] 202  29
str(i) #kiểm tra cấu trúc của bộ dữ liệu
## 'data.frame':    202 obs. of  29 variables:
##  $ Countries.and.areas                    : chr  "Afghanistan" "Albania" "Algeria" "Andorra" ...
##  $ Latitude                               : num  33.9 41.2 28 42.5 11.2 ...
##  $ Longitude                              : num  67.71 20.17 1.66 1.52 17.87 ...
##  $ OOSR_Pre0Primary_Age_Male              : int  0 4 0 0 31 14 14 2 52 13 ...
##  $ OOSR_Pre0Primary_Age_Female            : int  0 2 0 0 39 0 4 2 50 14 ...
##  $ OOSR_Primary_Age_Male                  : int  0 6 0 0 0 0 4 0 9 0 ...
##  $ OOSR_Primary_Age_Female                : int  0 3 0 0 0 0 1 0 9 0 ...
##  $ OOSR_Lower_Secondary_Age_Male          : int  0 6 0 0 0 0 1 0 11 2 ...
##  $ OOSR_Lower_Secondary_Age_Female        : int  0 1 0 0 0 0 2 0 9 3 ...
##  $ OOSR_Upper_Secondary_Age_Male          : int  44 21 0 0 0 0 14 15 16 10 ...
##  $ OOSR_Upper_Secondary_Age_Female        : int  69 15 0 0 0 0 12 7 4 6 ...
##  $ Completion_Rate_Primary_Male           : int  67 94 93 0 63 0 0 91 99 0 ...
##  $ Completion_Rate_Primary_Female         : int  40 96 93 0 57 0 0 94 99 0 ...
##  $ Completion_Rate_Lower_Secondary_Male   : int  49 98 49 0 42 0 0 70 95 0 ...
##  $ Completion_Rate_Lower_Secondary_Female : int  26 97 65 0 32 0 0 79 99 0 ...
##  $ Completion_Rate_Upper_Secondary_Male   : int  32 76 22 0 24 0 0 46 69 0 ...
##  $ Completion_Rate_Upper_Secondary_Female : int  14 80 37 0 15 0 0 53 79 0 ...
##  $ Grade_2_3_Proficiency_Reading          : int  22 0 0 0 0 0 0 76 0 94 ...
##  $ Grade_2_3_Proficiency_Math             : int  25 0 0 0 0 0 0 71 0 70 ...
##  $ Primary_End_Proficiency_Reading        : int  13 0 0 0 0 0 0 46 0 0 ...
##  $ Primary_End_Proficiency_Math           : int  11 0 0 0 0 0 0 56 55 64 ...
##  $ Lower_Secondary_End_Proficiency_Reading: int  0 48 21 0 0 0 0 48 0 80 ...
##  $ Lower_Secondary_End_Proficiency_Math   : int  0 58 19 0 0 0 0 31 50 78 ...
##  $ Youth_15_24_Literacy_Rate_Male         : int  74 99 98 0 0 0 0 99 0 0 ...
##  $ Youth_15_24_Literacy_Rate_Female       : int  56 100 97 0 0 0 0 100 0 0 ...
##  $ Birth_Rate                             : num  32.5 11.8 24.3 7.2 40.7 ...
##  $ Gross_Primary_Education_Enrollment     : num  104 107 110 106 114 ...
##  $ Gross_Tertiary_Education_Enrollment    : num  9.7 55 51.4 0 9.3 ...
##  $ Unemployment_Rate                      : num  11.12 12.33 11.7 0 6.89 ...
sum(is.na(i)) #kiểm tra số ô trống của bộ dữ liệu
## [1] 0
table(duplicated(i)) #kiểm tra số dữ liệu bị trùng
## 
## FALSE 
##   202

Kết quả trả về cho ta biết:

  • Bộ dữ liệu có cấu trúc là một data frame, có 202 quan sát (obs) và 29 biến (variables)

    • 202 quan sát tương ứng với 202 hàng

    • 29 biến tương ứng với 29 cột

    • Cột đầu tiên là biến định lượng, 28 cột sau là biến định tính, trong đó:

      • chr: Kiểu biến là ký tự

      • int: Kiểu biến là số nguyên

      • num: Kiểu biến là số thực

    • Bộ dữ liệu không có dữ liệu trống và bị trùng nhau

  • Ý nghĩa tên biến của bộ dữ liệu:

    • Countries.and.areas: Tên quốc gia và khu vực

    • Latitude: Tọa độ vĩ độ của vị trí địa lý

    • Longitude: Tọa độ kinh độ của vị trí địa lý

    • OOSR_Pre0Primary_Age_Male: Tỷ lệ bỏ học của nam độ tuổi mầm non

    • OOSR_Pre0Primary_Age_Female: Tỷ lệ bỏ học của nữ độ tuổi mầm non

    • OOSR_Primary_Age_Male: Tỷ lệ bỏ học của nam độ tuổi tiểu học

    • OOSR_Primary_Age_Female: Tỷ lệ bỏ học của nữ độ tuổi tiểu học

    • OOSR_Lower_Secondary_Age_Male: Tỷ lệ bỏ học của nam độ tuổi THCS

    • OOSR_Lower_Secondary_Age_Female: Tỷ lệ bỏ học của nữ độ tuổi THCS

    • OOSR_Upper_Secondary_Age_Male: Tỷ lệ bỏ học của nam độ tuổi THPT

    • OOSR_Upper_Secondary_Age_Female: Tỷ lệ bỏ học của nữ độ tuổi THPT

    • Completion_Rate_Primary_Male: Tỷ lệ hoàn thành bậc tiểu học của nam

    • Completion_Rate_Primary_Female: Tỷ lệ hoàn thành bậc tiểu học của nữ

    • Completion_Rate_Lower_Secondary_Male: Tỷ lệ hoàn thành bậc THCS của nam

    • Completion_Rate_Lower_Secondary_Female: Tỷ lệ hoàn thành bậc THCS của nữ

    • Completion_Rate_Upper_Secondary_Male: Tỷ lệ hoàn thành bậc THPT của nam

    • Completion_Rate_Upper_Secondary_Female: Tỷ lệ hoàn thành bậc THPT của nữ

    • Grade_2_3_Thành thạo_Reading: Thành thạo kỹ năng đọc dành cho học sinh lớp 2-3

    • Grade_2_3_Proficiency_Math: Thành thạo môn toán dành cho học sinh lớp 2-3

    • Primary_End_Proficiency_Reading: Thành thạo kỹ năng đọc khi kết thúc bậc tiểu học

    • Primary_End_Proficiency_Math: Thành thạo toán khi kết thúc bậc tiểu học

    • Lower_Secondary_End_Proficiency_Reading: Thành thạo kỹ năng đọc khi kết thúc bậc THCS

    • Lower_Secondary_End_Proficiency_Math: Thành thạo môn toán khi kết thúc bậc THCS

    • Youth_15_24_Literacy_Rate_Male: Tỷ lệ biết chữ của thanh niên nam độ tuổi 15-24

    • Youth_15_24_Literacy_Rate_Female: Tỷ lệ biết chữ của thanh niên nữ độ tuổi 15-24

    • Birth_Rate: Tỷ lệ sinh ở các quốc gia/khu vực tương ứng

    • Gross_Primary_Education_Enrollment: Tổng số tuyển sinh tiểu học

    • Gross_Tertiary_Education_Enrollment: Tổng số tuyển sinh vào giáo dục đại học

    • Unemployment_Rate: Tỷ lệ thất nghiệp ở các quốc gia/khu vực tương ứng

4. Một số thao tác cơ bản chuẩn bị cho việc phân tích

4.1. Đổi tên cho các biến cần dùng

Ở bộ dữ liệu gốc, tên biến của dữ liệu được đặt khá dài. Vì vậy để tiện cho việc phân tích, ta sẽ sử dụng lệnh names() đổi tên các biến ngắn gọn hơn, dễ sử dụng hơn. Ta thực hiện thao tác đổi tên biến như sau:

names(i)[names(i) == "Countries.and.areas"] <- "name"
names(i)[names(i) == "OOSR_Upper_Secondary_Age_Male"] <- "drop.m"
names(i)[names(i) == "OOSR_Upper_Secondary_Age_Female"] <- "drop.f"
names(i)[names(i) == "Youth_15_24_Literacy_Rate_Male"] <- "read.m"
names(i)[names(i) == "Youth_15_24_Literacy_Rate_Female"] <- "read.f"
names(i)[names(i) == "Unemployment_Rate"] <- "UnE"

Kết quả trả về cho ta thấy:

  • Cột “Countries.and.areas” được đổi tên thành name

  • Cột “OOSR_Upper_Secondary_Age_Male” được đổi tên thành drop.m

  • Cột “OOSR_Upper_Secondary_Age_Female” được đổi tên thành drop.f

  • Cột “Youth_15_24_Literacy_Rate_Male” được đổi tên thành read.m

  • Cột “Youth_15_24_Literacy_Rate_Female” được đổi tên thành read.f

  • Cột “Unemployment_Rate” được đổi tên thành UnE

=> Tên các biến đã trở nên ngắn gọn, ta dễ dàng thực hiện các thao tác phân tích.

4.2. Rút trích dữ liệu: 6 quốc gia khu vực châu Á

Chúng ta sẽ không phân tích tất thảy 202 quan sát và 29 biến mà chúng ta sẽ chỉ phân tích 6 quốc gia trong khu vực Châu Á bao gồm: Brunei, Đông Timo, Indonesia, Nepal, Malaysia và Ấn Độ, ở các mảng:

  • Tỷ lệ bỏ học THPT của nam giới

  • Tỷ lệ bỏ học THPT của nữ giới

  • Tỷ lệ nam từ 15 đến 24 tuổi biết chữ

  • Tỷ lệ nữ từ 15 đến 24 tuổi biết chữ

  • Tỷ lệ thất nghiệp

library('tidyverse') #gọi package 'tidyverse'

k <- i %>% select(name, drop.m, drop.f, read.m, read.f, UnE)

m <- k[k$name=='Brunei' | k$name=='Malaysia' | k$name=='East Timor' | k$name=='Indonesia' | k$name=='India' |k$name=='Nepal', ]

5. Phân tích tỷ lệ bỏ học THPT

Dữ liệu chúng ta thu về là dữ liệu định tính, để phân tích chúng ta sẽ mã hóa dữ liệu sang dữ liệu định lượng bằng lệnh case_when như sau:

library('tidyverse') #gọi package 'tidyverse'

m$Bỏ.học.nam <- case_when(m$drop.m<=19 ~ 'Thấp', m$drop.m>=20 & m$drop.m<=49 ~ 'Trung bình', m$drop.m>=50 ~ 'Cao') #mã hóa dữ liệu định tính sang dữ liệu định lượng của cột biến bỏ học là nam

m$Bỏ.học.nữ <- case_when(m$drop.f<=19 ~ 'Thấp', m$drop.f>=20 & m$drop.f<=49 ~ 'Trung bình', m$drop.f>=50 ~ 'Cao') #mã hóa dữ liệu định tính sang dữ liệu định lượng của cột biến bỏ học là nam

Kết quả trả về cho chúng ta thấy:

  • 6 quốc gia đều có tỷ lệ bỏ học THPT ở mức thấp hoặc mức trung bình cho cả giới tính nam và nữ.

  • Không có quốc gia nào có tỷ lệ bỏ học THPT trên trung bình. (>=50)

Sau khi mã hóa dữ liệu xong, để tiếp tục xem tỷ lệ bỏ học THPT ở mức thấp/trung bình của nam và nữ xuất hiện bao nhiêu lần, với tần số bao nhiêu, thì ta thực hiện như sau:

r1 <- m %>% group_by(Bỏ.học.nam) %>% summarise(n = n()) #kiểm tra tần số tỷ lệ bỏ học THPT ở nam giới

r2 <- m %>% group_by(Bỏ.học.nữ) %>% summarise(n = n())#kiểm tra tần số tỷ lệ bỏ học THPT ở nữ giới

Với nam giới, có 1/6 quốc gia có tỷ lệ bỏ học là thấp, 5/6 quốc gia có tỷ lệ bỏ học là trung bình. Với nữ giới 2/6 quốc gia có tỷ lệ bỏ học là thấp, 4/6 quốc gia có tỷ lệ bỏ học là trung bình.

summary(m$drop.m)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   19.00   23.75   26.50   30.50   37.50   47.00
summary(m$drop.f)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    13.0    17.5    22.0    25.5    29.5    48.0

Chi tiết hơn, ta thấy rằng:

  • Với nam giới:

    • Tỷ lệ bỏ học THPT bé nhất bằng 19 (Brunei)

    • Tỷ lệ bỏ học THPT lớn nhất bằng 47 (Ấn Độ)

    • Tỷ lệ bỏ học THPT trung bình bằng 30.5 (mức trung bình)

    • 25% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 23.75

    • 50% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 26.5

    • 75% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 37.5

  • Với nữ giới:

    • Tỷ lệ bỏ học THPT bé nhất bằng 13 (Napel)

    • Tỷ lệ bỏ học THPT lớn nhất bằng 48 (Ấn ĐỘ )

    • Tỷ lệ bỏ học THPT trung bình bằng 22.5 (mức trung bình)

    • 25% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 17.5

    • 50% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 22

    • 75% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 29.5

NHẬN XÉT

=> Điều này cho thấy, tuy các 6 quốc gia đã hạn chế việc bỏ học THPT, nhưng vẫn không giảm triệt để được việc bỏ học cho cả nhóm đối tượng là nam và nữ. Các quốc gia cần tiếp tục đẩy mạnh các chiến lược/chính sách để giảm thiểu việc bỏ học THPT (đặc biệt là Ấn Độ) sao cho chỉ còn mức tỷ lệ là thấp, trung bình thấp hoặc lý tưởng hơn là không có quốc gia nào có học sinh bỏ học.

6. Phân tích tỷ lệ biết đọc từ 15 đến 24 tuổi

Tương tự tỷ lệ bỏ học THPT, ta tiếp tục sử dụng lệnh case_when để mã hóa dữ liệu sang dữ liệu định lượng như sau:

library('tidyverse') #gọi package 'tidyverse'

m$Biết.đọc.nam <- case_when(m$read.m<=29 ~ 'Thấp', m$read.m>=30 & m$read.m<=79 ~ 'Trung bình', m$read.m>=80 & m$read.m<=89 ~ 'Trung bình cao', m$read.m>=90 ~ 'Cao') #mã hóa dữ liệu định tính sang dữ liệu định lượng của cột biến biết đọc là nam từ 15 đến 24 tuổi

m$Biết.đọc.nữ <- case_when(m$read.f<=29 ~ 'Thấp', m$read.f>=30 & m$read.f<=79 ~ 'Trung bình', m$read.f>=80 & m$read.f<=89 ~ 'Trung bình cao', m$read.f>=90 ~ 'Cao') #mã hóa dữ liệu định tính sang dữ liệu định lượng của cột biến biết đọc là nữ từ 15 đến 25 tuổi

Trái ngược với tỷ lệ bỏ học THPT, từ kết quả ta có thể thấy rằng đa số người dân trong độ tuổi từ 15 đến 24 dù nam hay nữ thì đều biết đọc - một điều tối thiểu mà một nền giáo dục quốc gia nên làm. Tỷ lệ của 6 quốc gia đều đạt mức từ trung bình cao cho đến cao, cho thấy đây là một điều đáng mừng của nên giáo dục thế giới.

u1 <- m %>% group_by(Biết.đọc.nam) %>% summarise(n = n()) #kiểm tra tần số tỷ lệ biết đọc ở nam giới

u2 <- m %>% group_by(Biết.đọc.nữ) %>% summarise(n = n())#kiểm tra tần số tỷ lệ biết đọc ở nữ giới

Mặc dù, tỷ lệ biết đọc của 6 quốc gia trong khu vực châu Á khá cao (5/6 đạt mức tỷ lệ cao), thế nhưng có vẻ Brunei đang bị “tụt lại” so với các “anh em” khác của mình. Brunei là quốc gia duy nhất đạt mức tỷ lệ trung bình cao.

NHẬN XÉT

5 quốc gia bao gồm: East Timor, Indonesia, Nepal, Malaysia và India cần tiếp tục triển khai diện rộng cho đến khi đạt được mục tiêu tất cả cả các đều có tỷ lệ người biết đọc trong độ tuổi từ 15 đến 24 là 100%. Riêng Brunei thì cần nổ lực nhiều hơn nữa để đưa tỷ lệ biết đọc trong độ tuổi 15 đến 24 lên mức cao.

7. Phân tích tỷ lệ thất nghiệp

m$Thất.nghiệp <- case_when(m$UnE<=2.9 ~ 'Thấp', m$UnE>=3 & m$UnE<=6.9 ~ 'Vừa phải', m$UnE>=7 ~ 'Cao') #mã hóa dữ liệu
p <- m %>% group_by(Thất.nghiệp) %>% summarise(n = n()) #kiểm tra tần số

Kết quả trả về cho chúng ta biết, trong 6 nước thì có bao gồm 4 nước: India, Indonesia, Malaysia và East Timor có tỷ lệ thất nghiệp ở mức vừa phải, Nepal ở mức thấp và Brunei ở mức cao.

o <- m %>% group_by(name) %>% summarise(sum_of_edu = sum(UnE))

Và theo kết quả của tổng tỷ lệ thất nghiệp theo nhóm quốc gia, điều kỳ lạ là cho dù Brunei có tỷ lệ bỏ học THPT ở cả nam và nữ đều ở mức thấp và tỷ lệ biết đọc từ 15 đến 24 tuổi mức cao thì tổng tỷ lệ thất nghiệp của Brunei lại vô cùng cao. Đặt ra một dấu nghi vấn vô cùng to lớn (= 9.12)

Trong khi đó, chúng ta có thể quan sát một ví dụ tích cực từ Nepal - một quốc gia với tỷ lệ thất nghiệp thấp nhất trong số 6 quốc gia được nghiên cứu. Nepal đáng được đánh giá cao khi họ không chỉ giảm thiểu tỷ lệ bỏ học ở cấp trung học phổ thông xuống mức thấp/trung bình, mà còn tăng cường tỷ lệ biết đọc của nhóm dân số từ 15 đến 24 tuổi lên mức cao và giảm thiểu tình trạng thất nghiệp. Các quốc gia khác có thể học hỏi từ những thành tựu của Nepal và áp dụng những biện pháp tương tự để cải thiện tình hình giáo dục và thị trường lao động của mình.

8. Tổng kết

Giáo dục đóng vai trò quan trọng trong việc định hình sự phồn thịnh của một quốc gia. “Ai có tri thức người đó có sức mạnh” vì vậy, không chỉ 6 quốc gia trong khu vực châu Á được nghiên cứu trước đó, mà mọi quốc gia, không phụ thuộc vào giới tính hay độ tuổi, đều cần phải đặt ưu tiên cao và đầu tư mạnh mẽ vào lĩnh vực giáo dục.

Quan trọng là không để những vấn đề như lạm phát hay thành tích ảo xuất hiện trong hệ thống giáo dục. Cần luôn tôn trọng và đánh giá cao những người tài năng, giúp họ phát huy tối đa khả năng và từ đó giảm thiểu tỷ lệ thất nghiệp. Việc này không chỉ tạo điều kiện thuận lợi cho sự phát triển cá nhân mà còn đóng góp tích cực vào sự thịnh vượng của cả xã hội.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAzIg0KYXV0aG9yOiAiTmd1eeG7hW4gUGjhuqFtIFRow7p5IEFuIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlciBzZWN0aW9uOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojICoqTkhJ4buGTSBW4bukIDMuMSoqDQoqKioNCg0KIyMgKioxLiBUw7NtIHThuq90KioNCg0KTmhp4buHbSB24bulIDMuMSB0aOG7sWMgaGnhu4duIGPDoWMgdGhhbyB0w6FjIMSRw6MgaOG7jWMgdHLDqm4gYuG7mSBk4buvIGxp4buHdSAqKnBvcHVsYXRpb24gYW5kIGRlbW9ncmFwaHkqKiAtIG3hu5l0IHNldCBkYXRhIG1pw6p1IHThuqMgduG7gSBkw6JuIHPhu5EgY+G7p2EgMjU0IHF14buRYyBnaWEgdHLDqm4gdGjhur8gZ2nhu5tpIHThu6sgbsSDbSAxOTUwIMSR4bq/biBuxINtIDIwMjEuDQoNCiMjICoqMi4gR2nhu5tpIHRoaeG7h3UqKg0KIyMjICoqMi4xLiDEkOG7jWMgZOG7ryBsaeG7h3UgdOG7qyBmaWxlIGN2cyoqDQoNClNldCBkYXRhICoqcG9wdWxhdGlvbiBhbmQgZGVtb2dyYXBoKiogbMOgIGZpbGUgY3ZzIG7Dqm4gxJHhu4MgxJHhu41jIMSRxrDhu6NjIGThu68gbGnhu4d1IHRow6wgdGEgZ8OhbiBi4buZIGThu68gbGnhu4d1IHbDoG8gKiphKiogdsOgIHPhu60gZOG7pW5nIGzhu4duaCAqKnJlYWQuY3N2KiouDQoNCmBgYHtyfQ0KYSA8LSByZWFkLmNzdihmaWxlID0gJ0M6L1VzZXJzL0FkbWluL0Rvd25sb2Fkcy9wb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5LmNzdicsIGhlYWRlciA9IFQpDQpgYGANCg0KIyMjICoqMi4yLiBUaMO0bmcgdGluIHThu5VuZyBxdWFuIGPhu6dhIGThu68gbGnhu4d1KioNCg0KYGBge3J9DQppcy5kYXRhLmZyYW1lKGEpICNraeG7g20gdHJhIGEgY8OzIHBo4bqjaSBsw6AgMSBkYXRhIGZyYW1lIGhheSBraMO0bmcsIG7hur91IHJhIHRydWUgdGjDrCBhIGzDoCBt4buZdCBkYXRhIGZyYW1lLCByYSBmYWxzZSB0aMOsIGEga2jDtG5nIGzDoCBt4buZdCBkYXRhIGZyYW1lDQoNCmxlbmd0aChhKSAja2nhu4NtIHRyYSDEkeG7mSBkw6BpIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UNCg0KbmFtZXMoYSkgI2tp4buDbSB0cmEgdMOqbiB2w6AgYuG7mSBk4buvIGxp4buHdSBjw7MgYmFvIG5oacOqdSBj4buZdCAoYmnhur9uKQ0KDQpkaW0oYSkgI2tp4buDbSB0cmEgYuG7mSBk4buvIGxp4buHdSBjw7MgYmFvIG5oacOqdSBxdWFuIHPDoXQgKG9icykgdsOgIGJp4bq/biAodmFyaWFibGVzKSwgaGF5IGtp4buDbSB0cmEgYuG7mSBk4buvIGxp4buHdSBjw7MgYmFvIG5oacOqdSBkw7JuZyB2w6AgY+G7mXQNCg0Kc3RyKGEpICNraeG7g20gdHJhIGPhuqV1IHRyw7pjIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UNCg0Kc3VtKGlzLm5hKGEpKSAja2nhu4NtIHRyYSBz4buRIMO0IHRy4buRbmcgY+G7p2EgYuG7mSBk4buvIGxp4buHdQ0KDQp0YWJsZShkdXBsaWNhdGVkKGEpKSAja2nhu4NtIHRyYSBz4buRIGThu68gbGnhu4d1IGLhu4sgdHLDuW5nDQpgYGANCkvhur90IHF14bqjIHRy4bqjIHbhu4EgY2hvIHRhIGJp4bq/dDoNCg0KKiBC4buZIGThu68gbGnhu4d1IGPDsyBj4bqldSB0csO6YyBsw6AgbeG7mXQgZGF0YSBmcmFtZSwgY8OzIDE4Mjg4IHF1YW4gc8OhdCAob2JzKSB2w6AgMjQgYmnhur9uICh2YXJpYWJsZXMpDQoNCiAgKiAxODI4OCBxdWFuIHPDoXQgdMawxqFuZyDhu6luZyB24bubaSAxODI4OCBow6BuZw0KICANCiAgKiAyNCBiaeG6v24gdMawxqFuZyDhu6luZyB24bubaSAyNCBj4buZdA0KICANCiAgKiBD4buZdCDEkeG6p3UgdGnDqm4gbMOgIGJp4bq/biDEkeG7i25oIGzGsOG7o25nLCAyMyBj4buZdCBzYXUgbMOgIGJp4bq/biDEkeG7i25oIHTDrW5oLCB0cm9uZyDEkcOzOiANCiAgICANCiAgICAqIGNocjogS2nhu4N1IGJp4bq/biBsw6Aga8O9IHThu7ENCiAgICANCiAgICAqIGludDogS2nhu4N1IGJp4bq/biBsw6Agc+G7kSBuZ3V5w6puIA0KICAgIA0KICAgICogbnVtOiBLaeG7g3UgYmnhur9uIGzDoCBz4buRIHRo4buxYw0KICANCiAgKiBC4buZIGThu68gbGnhu4d1IGtow7RuZyBjw7MgZOG7ryBsaeG7h3UgdHLhu5FuZyB2w6AgYuG7iyB0csO5bmcgbmhhdQ0KICANCiogw50gbmdoxKlhIHTDqm4gYmnhur9uIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3U6DQoNCiAgKiBDb3VudHJ5Lm5hbWU6IFTDqm4gcXXhu5FjIGdpYQ0KICANCiAgKiBZZWFyOiBOxINtDQogIA0KICAqIFBvcHVsYXRpb246IFThu5VuZyBkw6JuIHPhu5EgY+G7p2EgcXXhu5FjIGdpYQ0KICANCiAgKiBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgMTogRMOibiBz4buRIGTGsOG7m2kgMSB0deG7lWkNCiAgDQogICogUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDU6IETDom4gc+G7kSBkxrDhu5tpIDUgdHXhu5VpDQogIA0KICAqIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxNTogRMOibiBz4buRIGTGsOG7m2kgMTUgdHXhu5VpDQogIA0KICAqIFBvcHVsYXRpb24gdW5kZXIgdGhlIGFnZSBvZiAyNTogRMOibiBz4buRIGTGsOG7m2kgMjUgdHXhu5VpIA0KICANCiAgKiBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gNjQgeWVhcnM6IETDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIHThu6sgMTUgdOG7m2kgNjQNCiAgDQogICogUG9wdWxhdGlvbiBvbGRlciB0aGFuIDE1IHllYXJzOiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSBs4bubbiBoxqFuIDE1DQogIA0KICAqIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxOCB5ZWFyczogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgbOG7m24gaMahbiAxOA0KICANCiAgKiBQb3B1bGF0aW9uIGF0IGFnZSAxOiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSBsw6AgMQ0KICANCiAgKiBQb3B1bGF0aW9uIGFnZWQgMSB0byA0IHllYXJzOiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDEgdOG7m2kgNA0KICANCiAgKiBQb3B1bGF0aW9uIGFnZWQgNSB0byA5IHllYXJzOiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDUgdOG7m2kgOQ0KICANCiAgKiBQb3B1bGF0aW9uIGFnZWQgMTAgdG8gMTQgeWVhcnM6IETDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIHThu6sgMTAgdOG7m2kgMTQNCiAgDQogICogUG9wdWxhdGlvbiBhZ2VkIDE1IHRvIDE5IHllYXJzOiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDE1IHThu5tpIDE5DQogIA0KICAqIFBvcHVsYXRpb24gYWdlZCAyMCB0byAyOSB5ZWFyczogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAyMCB04bubaSAyOQ0KICANCiAgKiBQb3B1bGF0aW9uIGFnZWQgMzAgdG8gMzkgeWVhcnM6IETDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIHThu6sgMzAgdOG7m2kgMzkNCiAgDQogICogUG9wdWxhdGlvbiBhZ2VkIDQwIHRvIDQ5IHllYXJzOiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDQwIHThu5tpIDQ5DQogIA0KICAqIFBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFyczogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA1MCB04bubaSA1OQ0KICANCiAgKiBQb3B1bGF0aW9uIGFnZWQgNjAgdG8gNjkgeWVhcnM6IETDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIHThu6sgNjAgdOG7m2kgNjkNCiAgDQogICogUG9wdWxhdGlvbiBhZ2VkIDcwIHRvIDc5IHllYXJzOiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDcwIHThu5tpIDc5DQogIA0KICAqIFBvcHVsYXRpb24gYWdlZCA4MCB0byA4OSB5ZWFyczogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA4MCB04bubaSA4OQ0KICANCiAgKiBQb3B1bGF0aW9uIGFnZWQgOTAgdG8gOTkgeWVhcnM6IETDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIHThu6sgOTAgdOG7m2kgOTkNCiAgDQogICogUG9wdWxhdGlvbiBvbGRlciB0aGFuIDEwMCB5ZWFyczogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdHLDqm4gMTAwDQoNCiMjICoqMy4gUGjDom4gdMOtY2ggY2hpIHRp4bq/dCBkw6JuIHPhu5EgY+G7p2EgNiBuxrDhu5tjIOG7nyA2IMSR4buZIHR14buVaSBraMOhYyBuaGF1KioNCiMjIyAqKjMuMS4gxJDhu5VpIHTDqm4gY2hvIGPDoWMgYmnhur9uIGPhuqduIGTDuW5nKioNCg0KxJDhu4MgdGh14bqtbiB0aeG7h24gY2hvIHZp4buHYyBwaMOibiB0w61jaCwgdHLGsOG7m2MgaOG6v3QgdGEgxJHhu5VpIHTDqm4gY+G7mXQgY+G7p2EgYuG7mSBk4buvIGxp4buHdSBtw6AgdGEgc+G6vSBz4butIGThu6VuZyB24bubaSBjw6J1IGzhu4duaCAqKm5hbWVzKCkqKg0KYGBge3J9DQpuYW1lcyhhKVtuYW1lcyhhKSA9PSAiQ291bnRyeS5uYW1lIl0gPC0gIm5hbWUiDQpuYW1lcyhhKVtuYW1lcyhhKSA9PSAiWWVhciJdIDwtICJZIg0KbmFtZXMoYSlbbmFtZXMoYSkgPT0gIlBvcHVsYXRpb24iXSA8LSAiUCINCm5hbWVzKGEpW25hbWVzKGEpID09ICJQb3B1bGF0aW9uLmFnZWQuMS50by40LnllYXJzIl0gPC0gImExdG80Ig0KbmFtZXMoYSlbbmFtZXMoYSkgPT0gIlBvcHVsYXRpb24uYWdlZC41LnRvLjkueWVhcnMiXSA8LSAiYTV0bzkiDQpuYW1lcyhhKVtuYW1lcyhhKSA9PSAiUG9wdWxhdGlvbi5hZ2VkLjEwLnRvLjE0LnllYXJzIl0gPC0gImExMHRvMTQiDQpuYW1lcyhhKVtuYW1lcyhhKSA9PSAiUG9wdWxhdGlvbi5hZ2VkLjE1LnRvLjE5LnllYXJzIl0gPC0gImExNXRvMTkiDQpuYW1lcyhhKVtuYW1lcyhhKSA9PSAiUG9wdWxhdGlvbi5hZ2VkLjIwLnRvLjI5LnllYXJzIl0gPC0gImEyMHRvMjkiDQpuYW1lcyhhKVtuYW1lcyhhKSA9PSAiUG9wdWxhdGlvbi5hZ2VkLjMwLnRvLjM5LnllYXJzIl0gPC0gImEzMHRvMzkiDQpgYGANClbhu5tpIGPDonUgbOG7h25oIG5hbWVzLCBr4bq/dCBxdeG6oyB0cuG6oyB24buBIGNobyBjaMO6bmcgdGEgdGjhuqV5Og0KDQoqIEPhu5l0IF8nQ291bnRyeS5uYW1lJ18gxJHhu5VpIHTDqm4gdGjDoG5oICoqbmFtZSoqDQoNCiogQ+G7mXQgXydZZWFyJ18gxJHhu5VpIHRow6BuaCAqKlkqKg0KDQoqIEPhu5l0IF8nUG9wdWxhdGlvbidfIMSR4buVaSB0aMOgbmggKipQKioNCg0KKiBD4buZdCBfJ1BvcHVsYXRpb24uYWdlZC4xLnRvLjQueWVhcnMnXyDEkeG7lWkgdGjDoG5oICoqYTF0bzQqKg0KDQoqIEPhu5l0IF8nUG9wdWxhdGlvbi5hZ2VkLjUudG8uOS55ZWFycydfIMSR4buVaSB0aMOgbmggKiphNXRvOSoqDQoNCiogQ+G7mXQgXydQb3B1bGF0aW9uLmFnZWQuMTAudG8uMTQueWVhcnMnXyDEkeG7lWkgdGjDoG5oICoqYTEwdG8xNCoqDQoNCiogQ+G7mXQgXydQb3B1bGF0aW9uLmFnZWQuMTUudG8uMTkueWVhcnMnXyDEkeG7lWkgdGjDoG5oICoqYTE1dG8xOSoqDQoNCiogQ+G7mXQgXydQb3B1bGF0aW9uLmFnZWQuMjAudG8uMjkueWVhcnMnXyDEkeG7lWkgdGjDoG5oICoqYTIwdG8yOSoqDQoNCiogQ+G7mXQgXydQb3B1bGF0aW9uLmFnZWQuMzAudG8uMzkueWVhcnMnXyDEkeG7lWkgdGjDoG5oICoqYTMwdG8zOSoqDQoNCiMjIyAqKjMuMi4gUsO6dCB0csOtY2ggZOG7ryBsaeG7h3UqKg0KDQpTZXQgZGF0YSAqKnBvcHVsYXRpb24gYW5kIGRlbW9ncmFwaHkqKiBjw7MgdOG7m2kgMjU0IHF14buRYyBnaWEgdsOgIG5oaeG7gXUgxJHhu5kgdHXhu5VpIGtow6FjIG5oYXUsIHR1eSBuaGnDqm4gbmhp4buBdSBraGkgY2jDum5nIHRhIGtow7RuZyBkw7luZyBo4bq/dCDEkcaw4bujYyBk4buvIGxp4buHdSB0aHUgduG7gSBtw6AgY2jhu4kgZMO5bmcgbeG7mXQgbMaw4bujbmcgbmjhu48gZOG7ryBsaeG7h3UgdGjDtGkuIMSQ4buDIHRo4buxYyBoaeG7h24gcsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgdGEgdGhhbyB0w6FjIG5oxrAgc2F1OiANCg0KYGBge3J9DQpsaWJyYXJ5KCd0aWR5dmVyc2UnKSAjZ+G7jWkgcGFja2FnZSAndGlkeXZlcnNlJw0KYiA8LSBhICU+JSBzZWxlY3QobmFtZSwgWSwgUCwgYTF0bzQsIGE1dG85LCBhMTB0bzE0LCBhMTV0bzE5LCBhMjB0bzI5LCBhMzB0bzM5KQ0KYyA8LSBiW2IkbmFtZT09J0FyZ2VudGluYScgfCBiJG5hbWU9PSdKYXBhbicgfCBiJG5hbWU9PSdCcmF6aWwnIHwgYiRuYW1lPT0nU291dGggS29yZWEnIHwgYiRuYW1lPT0nRnJhbmNlJyB8IGIkbmFtZT09J0NhbmFkYScsIF0NCmQgPC0gY1tjJFk9PTIwMTkgfCBjJFk9PTIwMjAgfCBjJFk9PTIwMjEsIF0NCmBgYA0KDQpL4bq/dCBxdeG6oyB0cuG6oyB24buBIGNobyB0YSBiaeG6v3Q6DQoNCiogVHJvbmcgMjU0IHF14buRYyBnaWEsIHRhIGNo4buJIGNo4buNbiByYSBkw6JuIHPhu5EgY+G7p2EgNiBxdeG7kWMgZ2lhIGJhbyBn4buTbTogQXJnZW50aW5hLCBCcmF6aWwsIENhbmFkYSwgRnJhbmNlLCBKYXBhbiwgU291dGggS29yZWEuDQoNCiogVuG7m2kgNiDEkeG7mSB0deG7lWkgxJHDsyBraMOhYyBuaGF1OiB04burIDEgdOG7m2kgNCB0deG7lWksIDUgdOG7m2kgOSB0deG7lWksIDEwIHThu5tpIDE0IHR14buVaSwgMTUgdOG7m2kgMTkgdHXhu5VpLCAyMCB04bubaSAyOSB0deG7lWksIDMwIHThu5tpIDM5IHR14buVaS4NCg0KKiDhu54gMyBuxINtIGxpw6puIHRp4bq/cCAyMDE5LCAyMDIwLCAyMDIxLg0KDQoqIFbDoCBjaOG7jW4gdGjDqm0gMSBj4buZdCB04buVbmcgZMOibiBz4buRIGPhu6dhIDYgbsaw4bubYyB0csOqbi4NCg0KIyMjICoqMy4zLiBNw6MgaMOzYSBk4buvIGxp4buHdSoqDQoNCsSQw7RpIGtoaSwgZOG7ryBsaeG7h3UgY2jDum5nIHRhIHRodSB24buBIGzDoCBk4buvIGxp4buHdSDEkeG7i25oIGzGsOG7o25nLCBtw6AgdHJvbmcgbeG7mXQgdsOgaSB0csaw4budbmcgaOG7o3AsIGThu68gbGnhu4d1IMSR4buLbmggbMaw4bujbmcga2jDtG5nIHRo4buDIHBo4bqjbiDDoW5oIMSRxrDhu6NjIGvhur90IHF14bqjIGNow7puZyB0YSBj4bqnbiB0w6xtLiBLaGkgxJHDsywgY2jDum5nIHRhIHPhur0gcGjhuqNpIGNodXnhu4NuIMSR4buVaSBk4buvIGxp4buHdSDEkeG7i25oIGzGsOG7o25nIHNhbmcgZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCBi4bqxbmcgY8OhYyBjw6J1IGzhu4duaCAqKmNhc2Vfd2hlbioqLCAqKmN1dCgpKiosICoqY2FzZV9tYXRjaCoqIHbDoCAqKmlmZWxzZSgpKiouDQoNCmBgYHtyfQ0KbGlicmFyeSgndGlkeXZlcnNlJykgI2fhu41pIHBhY2thZ2UgJ3RpZHl2ZXJzZScNCg0KZCREw6JuLlPhu5EgPC0gY2FzZV93aGVuKGQkUDw9Mzk5OTk5OTkgfiAnVGjGsGEgdGjhu5t0JywgZCRQPj00MDAwMDAwMCAmIGQkUDw9Nzk5OTk5OTkgfiAnVHJ1bmcgYsOsbmgnLCBkJFA+PTgwMDAwMDAwICYgZCRQPD05OTk5OTk5OSB+ICfEkMO0bmcgxJHDumMnLCBkJFA+PTEwMDAwMDAwMCB+ICdS4bqldCDEkcO0bmcgxJHDumMnICkNCg0KZCRDTCA8LSBjdXQoZCRQLDQsIGxhYmVscyA9IGMoJ1RoxrBhIHRo4bubdCcsICdUcnVuZyBiw6xuaCcsICfEkMO0bmcgxJHDumMnLCAnUuG6pXQgxJHDtG5nIMSRw7pjJykpDQpgYGANCg0KKiBDw6J1IGzhu4duaCB0aOG7qSBuaOG6pXQ6IFRhIHThuqFvIG3hu5l0IGPhu5l0IG3hu5tpIHTDqm4gbMOgICoqRMOibi5z4buRKiogZOG7sWEgdHLDqm4gY+G7mXQgUG9wdWxhdGlvbiAoxJHDoyDEkeG7lWkgdMOqbiB0aMOgbmggUCkuIFbhu5tpIGTDom4gc+G7kSBuaOG7jyBoxqFuIDM5Ljk5OS45OTkgdGjDrCDEkcaw4bujYyB4ZW0gbMOgIF8idGjGsGEgdGjhu5t0Il8sIGTDom4gc+G7kSB0cm9uZyBraG/huqNuZyB04burIDQwLjAwMC4wMDAgxJHhur9uIDc5Ljk5OS45OTkgxJHGsOG7o2MgeGVtIGzDoCBfInRydW5nIGLDrG5oIl8sIGTDom4gc+G7kSB0cm9uZyBraG/huqNuZyA4MC4wMDAuMDAwIMSR4bq/biA5OS45OTkuOTk5IMSRxrDhu6NjIHhlbSBsw6AgXyLEkcO0bmcgxJHDumMiXyB2w6AgY3Xhu5FpIGPDuW5nLCBkw6JuIHPhu5EgbOG7m24gaMahbiAxMDAuMDAwLjAwMCDEkcaw4bujYyB4ZW0gbMOgIF8icuG6pXQgxJHDtG5nIMSRw7pjIl8uDQoNCj0+IFRhIGTDuW5nIMSR4buDIHNvIHPDoW5oIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgduG7m2kgbmhhdSwgeGVtIHLhurFuZyBt4buZdCBxdeG7kWMgZ2lhIHRyb25nIG3hu5l0IG7Eg20gbsOgbyDEkcOzIMSRw7MgdGjGsGEgdGjhu5t0IGhheSDEkcO0bmcgZMOibi4NCg0KKiBUxrDGoW5nIHThu7EsIOG7nyBjw6J1IGzhu4duaCB0aOG7qSBoYWk6IFRhIHThuqFvIG3hu5l0IGPhu5l0IG3hu5tpIHTDqm4gbMOgICoqQ0wqKiBk4buxYSB0csOqbiBj4buZdCBQb3B1bGF0aW9uIChQKS4gRMO5bmcgbOG7h25oICoqY3V0KCkqKiBjaGlhIGPhu5l0IFAgdGjDoG5oIDQgbmjDs206IF8iVGjGsGEgdGjhu5t0Il8sIF8iVHJ1bmcgYsOsbmgiXywgXyLEkMO0bmcgxJHDumMiXyB2w6AgXyJS4bqldCDEkcO0bmcgxJHDumMiXy4NCg0KYGBge3J9DQpkJENow6J1Lkzhu6VjIDwtIGQkbmFtZSAlPiUgY2FzZV9tYXRjaCgnQXJnZW50aW5hJyB+ICdDaMOidSBN4bu5JywgJ0JyYXppbCcgfiAnQ2jDonUgTeG7uScsICdDYW5hZGEnIH4gJ0Lhuq9jIE3hu7knLCAnRnJhbmNlJyB+ICdDaMOidSDDgnUnLCAnSmFwYW4nIH4gJ0Now6J1IMOBJywgJ1NvdXRoIEtvcmVhJyB+ICdDaMOidSDDgScpDQpgYGANCg0KKiBDw6J1IGzhu4duaCB0aOG7qSBiYTogVGEgdGnhur9wIHThu6VjIHThuqFvIG3hu5l0IGPhu5l0IG3hu5tpIHTDqm4gKipDaMOidS5M4bulYyoqIGThu7FhIHRyw6puIGPhu5l0IENvdW50cnkubmFtZSAoxJHDoyDEkeG7lWkgdMOqbiB0aMOgbmggbmFtZSkuIE5o4buvbmcgcXXhu5FjIGdpYSBuw6BvIHRodeG7mWMgY2jDonUgw4J1IHRow6wgdGEgeOG6v3AgdsOgbyBfIkNow6J1IMOCdSJfIHbDoCB0YSBsw6BtIHTGsMahbmcgdOG7sSB24bubaSBuaOG7r25nIHF14buRYyBnaWEgdGh14buZYyBfIkNow6J1IMOBIl8sIF8iQ2jDonUgTeG7uSJfIHbDoCBfIkLhuq9jIE3hu7kiXy4NCg0KPT4gVmnhu4djIG3DoyBow7NhIGPDoWMgcXXhu5FjIGdpYSB0aGVvIGNow6J1IGzhu6VjLCBjw7MgdGjhu4MgZ2nDunAgY8OhYyBuaMOgIHBow6JuIHTDrWNoIGThu4UgbMOgbSB2aeG7h2MgduG7m2kgZOG7ryBsaeG7h3UgdGhlbyBuaMOzbSBjaMOidSBs4bulYywgc28gc8OhbmggZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSB0cm9uZyBjw7luZyBt4buZdCBjaMOidSBs4bulYywgaG/hurdjIHNvIHPDoW5oIGTDom4gc+G7kSBjaMOidSBs4bulYyBuw6B5IHbhu5tpIGNow6J1IGzhu6VjIGtow6FjLg0KDQpgYGB7cn0NCmQkRMOibi5z4buRLnThu6suMjAuxJHhur9uLjI5LnR14buVaSA8LSBpZmVsc2UoZCRhMjB0bzI5PD03MDAwMDAwLCAnw410IOG7j2knLCAnRMOgeSDEkeG6t2MnKQ0KYGBgDQoNCiogQ8OidSBs4buHbmggdGjhu6kgYuG7kW46IFRhIGPFqW5nIHThuqFvIG3hu5l0IGPhu5l0IG3hu5tpIHTDqm4gKipEw6JuLnPhu5EudOG7qy4yMC7EkeG6v24uMjkudHXhu5VpKiogZOG7sWEgdHLDqm4gY+G7mXQgUG9wdWxhdGlvbi5hZ2VkLjIwLnRvLjI5ICjEkcOjIMSR4buVaSB0w6puIHRow6BuaCBhMjB0bzI5KS4gVuG7m2kgZMOibiBz4buRIG5o4buPIGjGoW4gNy4wMDAuMDAwIMSRxrDhu6NjIHhlbSBsw6AgXyLDrXQg4buPaSJfIHbDoCBuZ8aw4bujYyBs4bqhaSwgZMOibiBz4buRIHRyw6puIDcuMDAwLjAwMCDEkcaw4bujYyB4ZW0gbMOgIF8iRMOgeSDEkeG6t2MiXy4NCg0KPT4gQ8OidSBs4buHbmggbsOgeSB0YSBjw7MgdGjhu4MgZMO5bmcgxJHhu4MgcGjDom4gdMOtY2ggeGVtIGTDom4gc+G7kSDEkWFuZyB0cm9uZyDEkeG7mSB0deG7lWkgbGFvIMSR4buZbmcgKDIwIMSR4bq/biAyOSB0deG7lWkpIGPhu6dhIG3hu5l0IHF14buRYyBnaWEgbsOgeSB0cm9uZyBt4buZdCBuxINtIGzDoCBuaGnhu4F1IGhheSDDrXQuDQoNCiMjIyAqKjMuNC4gTOG6rXAgYuG6o25nIHThuqduIHPhu5EqKg0KDQpDw6J1IGzhu4duaCBj4bunYSBs4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBsw6AgKip0YWJsZSgpKiosIGPDsyBjw7RuZyBk4bulbmcgeGVtIG3hu5l0IMSR4buRaSB0xrDhu6NuZyDEkcOjIHh14bqldCBoaeG7h24gYmFvIG5oacOqdSBs4bqnbiB0cm9uZyBi4buZIGThu68gbGnhu4d1Lg0KDQpDw6J1IGzhu4duaCAqKmN1dCgpKiogY8OzIGPDtG5nIGThu6VuZyBjaGlhIG5ow7NtIGPDoWMgxJHhu5FpIHTGsOG7o25nIGzhuqFpIHbhu5tpIG5oYXUuDQoNCmBgYHtyfQ0KY3V0KGQkYTF0bzQsNCkgI2NoaWEgY8OhYyBnacOhIHRy4buLIOG7nyBj4buZdCBhMXRvNCB0aMOgbmggNCBuaMOzbQ0KdGFibGUoY3V0KGQkYTF0bzQsNCkpIA0KYGBgDQoNCkPDonUgbOG7h25oIMSR4bqndSB0acOqbiwga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBjaG8gdGEgYmnhur90Og0KDQpD4buZdCAqKmExdG80KiogxJHGsOG7o2MgY2hpYSBsw6BtIDQgbmjDs20uDQoNCiogTmjDs20gxJHhuqd1IHRpw6puIG5o4bqtbiAxNSBnacOhIHRy4buLLg0KDQoqIE5ow7NtIHRo4bupIDIgdsOgIHRo4bupIDMga2jDtG5nIGPDsyBnacOhIHRy4buLLg0KICANCiogTmjDs20gdGjhu6kgNCBuaOG6rW4gNCBnacOhIHRy4buLLg0KICANCmBgYHtyfQ0KZSA8LSBkICU+JSBncm91cF9ieShDaMOidS5M4bulYykgJT4lIHN1bW1hcmlzZShuID0gbigpKSAja+G7g20gdHJhIHThuqduIHPhu5EgeHXhuqV0IGhp4buHbiBj4bunYSBjw6FjIHF14buRYyBnaWEgdGhlbyBj4buZdCBDaMOidS5M4bulYw0KYGBgDQoNCkPDonUgbOG7h25oIHRo4bupIGhhaSwga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBjaG8gdGEgYmnhur90Og0KDQpT4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBjaMOidSBs4bulYyBs4bqnbiBsxrDhu6N0IGzDoDoNCiAgDQoqIELhuq9jIE3hu7k6IDMgbOG6p24NCg0KKiBDaMOidSBN4bu5OiA2IGzhuqduDQoNCiogQ2jDonUgw4E6IDYgbOG6p24NCg0KKiBDaMOidSDDgnU6IDMgbOG6p24NCiAgDQpgYGB7cn0NCmYgPC0gZCAlPiUgZ3JvdXBfYnkoJ2E1dG85JywgJ2ExMHRvMTQnKSAlPiUgc3VtbWFyaXNlKG49bigpLCAuZ3JvdXBzPSdkcm9wJykNCmBgYA0KDQpDw6J1IGzhu4duaCB0aOG7qSBiYSwga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBjaG8gdGEgYmnhur90LCBuaMOzbSAyIGPhu5l0ICoqYTV0bzkqKiB2w6AgKiphMTB0bzE0KiosIHThuqduIHPhu5EgeHXhuqV0IGhp4buHbiBj4bunYSBuaMOzbSBuw6B5IGzDoCAxOCBs4bqnbi4NCiAgDQojIyMgKiozLjUuIFTDrW5oIHRvw6FuIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcqKg0KDQpCxrDhu5tjIHBow6JuIHTDrWNoIG7DoHkgc+G6vSBjaG8gY2jDum5nIHRhIG5o4buvbmcga+G6v3QgcXXhuqMgY2hpIHRp4bq/dCBuaOG6pXQgY+G7p2EgYuG7mSBk4buvIGxp4buHdSwgY+G7pSB0aOG7gyBuaMawIHNhdTogDQogDQpgYGB7cn0NCnN1bW1hcnkoZCRQKQ0KYGBgDQoNCkPDonUgbOG7h25oIHRo4bupIG5o4bqldCwga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBjaG8gdGEgYmnhur90LCB0csOqbiBj4buZdCAqKlAqKjoNCg0KKiBT4buRIG5o4buPIG5o4bqldCBsw6A6IDM3LjUyMi41ODQNCg0KKiBDw7MgMjUlIHThu5VuZyBkw6JuIHPhu5EgY8OzIGdpw6EgdHLhu4sgbmjhu48gaMahbjogNDUuMDk2LjIyMCBoYXkgY8OzIDc1JSB04buVbmcgZMOibiBz4buRIGPDsyBnacOhIHRy4buLIGzhu5tuIGjGoW46IDQ1LjA5Ni4yMjANCg0KKiBDw7MgNTAlIHThu5VuZyBkw6JuIHPhu5EgY8OzIGdpw6EgdHLhu4sgbmjhu48gaMahbjogNTguMTIyLjIyNSBoYXkgY8OzIDUwJSB04buVbmcgZMOibiBz4buRIGPDsyBnacOhIHRy4buLIGzhu5tuIGjGoW46IDU4LjEyMi4yMjUNCg0KKiBD4buZdCBQIGPDsyB04buVbmcgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBsw6A6IDg5LjU4MS42MDcNCg0KKiBDw7MgNzUlIHThu5VuZyBkw6JuIHPhu5EgY8OzIGdpw6EgdHLhu4sgbmjhu48gaMahbiAxMjUuMDg2LjcwMiBoYXkgY8OzIDI1JSB04buVbmcgZMOibiBz4buRIGPDsyBnacOhIHRy4buLIGzhu5tuIGjGoW46IDEyNS4wODYuNzAyDQoNCiogU+G7kSBs4bubbiBuaOG6pXQgbMOgOiAyMTQuMzI2LjIyMA0KDQpgYGB7cn0NCnN1bShkJGExdG80KSAjdMOtbmggdOG7lW5nIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQNCmBgYA0KDQpDw6J1IGzhu4duaCB0aOG7qSBoYWksIGvhur90IHF14bqjIHRy4bqjIHbhu4EgY2hvIGJp4bq/dCwgdOG7lW5nIGTDom4gc+G7kSB0cm9uZyDEkeG7mSB0deG7lWkgdOG7qyAxIMSR4bq/biA0IGPhu6dhIDYgcXXhu5FjIGdpw6EgdHJvbmcgMyBuxINtIGzDoDogNzEuNDk1LjQzOQ0KDQpgYGB7cn0NCmxlbmd0aChkJGE1dG85KQ0KYGBgDQoNCkPDonUgbOG7h25oIHRo4bupIGJhLCBr4bq/dCBxdeG6oyB0cuG6oyB24buBIGNobyBiaeG6v3QsIGTDom4gc+G7kSB04burIDUgxJHhur9uIDkgdHXhu5VpIGPhu6dhIDYgcXXhu5FjIGdpYSB0cm9uZyAzIG7Eg20gY8OzIMSR4buZIGTDoGkgYuG6sW5nOiAxOA0KDQpgYGB7cn0NCnZhcihkJGExMHRvMTQpDQpgYGANCg0KQ8OidSBs4buHbmggdGjhu6kgdMawLCBr4bq/dCBxdeG6oyB0cuG6oyB24buBIGNobyBiaeG6v3QsIGTDom4gc+G7kSB04burIDEwIMSR4bq/biAxNCB0deG7lWkgY+G7p2EgNiBxdeG7kWMgZ2lhIHRyb25nIDMgbsSDbSBi4bqxbmcgY8OzIMSR4buZIGdpYW8gxJHhu5luZyBi4bqxbmc6IDIuMTcyMDRlKzEzDQoNCmBgYHtyfQ0Kc2QoZCRhMTV0bzE5KQ0KYGBgDQoNCkPDonUgbOG7h25oIHRo4bupIG7Eg20sIGvhur90IHF14bqjIHRy4bqjIHbhu4EgY2hvIHRhIGJp4bq/dCwgZMOibiBz4buRIHThu6sgMTUgxJHhur9uIDE5IHR14buVaSBj4bunYSA2IHF14buRYyBnaWEgdHJvbmcgMyBuxINtIGLhurFuZyBjw7MgxJHhu5kgbOG7h2NoIGNodeG6qW4gYuG6sW5nOiA0OTcxLjY5MQ0KDQpgYGB7cn0NCnF1YW50aWxlKGQkYTMwdG8zOSkNCmBgYA0KDQpDw6J1IGzhu4duaCB0aOG7qSBzYXUsIGvhur90IHF14bqjIHRy4bqjIHbhu4EgY2hvIHRhIGJp4bq/dCwgZMOibiBz4buRIHThu6sgMzAgxJHhur9uIDM5IHR14buVaSBj4bunYSA2IHF14buRYyBnaWEgdHJvbmcgMyBuxINtOg0KDQoqIEPDsyAwJSBkw6JuIHPhu5EgY8OzIGdpw6EgdHLhu4sgbmjhu48gaMahbjogNS4xNzcuMjkwIA0KDQoqIEPDsyAyNSUgZMOibiBz4buRIGPDsyBnacOhIHRy4buLIG5o4buPIGjGoW46IDYuNTIwLjk5Nw0KDQoqIEPDsyA1MCUgZMOibiBz4buRIGPDsyBnacOhIHRy4buLIG5o4buPIGjGoW46IDcuNTgyLjgwMw0KDQoqIEPDsyA3NSUgZMOibiBz4buRIGPDsyBnacOhIHRy4buLIG5o4buPIGjGoW46IDEzLjYzMi45NjUNCg0KKiBDw7MgMTAwJSBkw6JuIHPhu5EgY8OzIGdpw6EgdHLhu4sgbmjhu48gaMahbjogMzQuODQ3LjQzMA0KDQojIyMgKiozLjYuIFTDrW5oIHRvw6FuIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBuaMOzbSoqDQoNCsSQ4buDIHTDrW5oIHRvw6FuIHRydW5nIHbhu4sgY+G7p2EgY+G7mXQgY8OzIGTDom4gc+G7kSB04burIDEgxJHhur9uIDQgdHXhu5VpIHRoZW8gbmjDs20gcXXhu5FjIGdpYSwgdGEgdGjhu7FjIGhp4buHbiBuaMawIHNhdToNCg0KYGBge3J9DQpnIDwtIGQgJT4lIGdyb3VwX2J5KG5hbWUpICU+JSBzdW1tYXJpc2UobWVkX29mX3BvcCA9IG1lZGlhbihhMXRvNCkpDQpgYGANCg0KQ8OidSBs4buHbmggbsOgeSwga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBjaG8gdGEgYmnhur90OiANCg0KKiBDw7MgNTAlIGTDom4gc+G7kSBBcmdlbnRpbmEgdHJvbmcgxJHhu5kgdHXhu5VpIHThu6sgMSDEkeG6v24gNCB0deG7lWkgY8OzIGdpw6EgdHLhu4sgbmjhu48gaMahbjogMi43OTcuMDgwDQoNCiogQ8OzIDUwJSBkw6JuIHPhu5EgQnJhemlsIHRyb25nIMSR4buZIHR14buVaSB04burIDEgxJHhur9uIDQgdHXhu5VpIGPDsyBnacOhIHRy4buLIG5o4buPIGjGoW46IDExLjYyMC42ODQNCg0KKiBDw7MgNTAlIGTDom4gc+G7kSBDYW5hZGEgdHJvbmcgxJHhu5kgdHXhu5VpIHThu6sgMSDEkeG6v24gNCB0deG7lWkgY8OzIGdpw6EgdHLhu4sgbmjhu48gaMahbjogMS41NDMuNDI1DQoNCiogQ8OzIDUwJSBkw6JuIHPhu5EgRnJhbmNlIHRyb25nIMSR4buZIHR14buVaSB04burIDEgxJHhur9uIDQgdHXhu5VpIGPDsyBnacOhIHRy4buLIG5o4buPIGjGoW46IDIuODAxLjQyMw0KDQoqIEPDsyA1MCUgZMOibiBz4buRIEphcGFuIHRyb25nIMSR4buZIHR14buVaSB04burIDEgxJHhur9uIDQgdHXhu5VpIGPDsyBnacOhIHRy4buLIG5o4buPIGjGoW46IDMuNjA5LjcwMg0KDQoqIEPDsyA1MCUgZMOibiBz4buRIFNvdXRoIEtvcmVhIHRyb25nIMSR4buZIHR14buVaSB04burIDEgxJHhur9uIDQgdHXhu5VpIGPDsyBnacOhIHRy4buLIG5o4buPIGjGoW46IDEuNDc5LjEyOQ0KDQrEkOG7gyB0w61uaCB0b8OhbiDEkeG7mSBs4buHY2ggY2h14bqpbiBj4bunYSBj4buZdCBjw7MgZMOibiBz4buRIHThu6sgMSDEkeG6v24gNCB0deG7lWkgdGhlbyBuaMOzbSB0aOG7nWkgZ2lhbiwgdGEgdGjhu7FjIGhp4buHbiBuaMawIHNhdToNCg0KYGBge3J9DQpoIDwtIGQgJT4lIGdyb3VwX2J5KFkpICU+JSBzdW1tYXJpc2UobWVkX29mX3BvcCA9IHNkKGExdG80KSkNCmBgYA0KDQpL4bq/dCBxdeG6oyB0cuG6oyB24buBIGNobyB0YSBiaeG6v3QsIGTDom4gc+G7kSB04burIDEgxJHhur9uIDQgdHXhu5VpOg0KDQoqIE7Eg20gMjAxOSBjw7MgxJHhu5kgbOG7h2NoIGNodeG6qW4gYuG6sW5nOiAzLjgzOC4zODkNCg0KKiBOxINtIDIwMjAgY8OzIMSR4buZIGzhu4djaCBjaHXhuqluIGLhurFuZzogMy44MzMuOTcwDQoNCiogTsSDbSAyMDIxIGPDsyDEkeG7mSBs4buHY2ggY2h14bqpbiBi4bqxbmc6IDMuODE0LjE5OA0KDQojICoqTkhJ4buGTSBW4bukIDMuMioqDQoqKioNCiMjICoqR0xPQkFMIEVEVUNBVElPTioqDQoqKioNCg0KIyMgKioxLiBN4bulYyB0acOqdSBuZ2hpw6puIGPhu6l1KioNCg0KU2V0IERhdGEgKipHbG9iYWwgRWR1Y2F0aW9uKiogbMOgIG3hu5l0IGLhu5kgZOG7ryBsaeG7h3UgY3VuZyBj4bqlcCBjw6FpIG5ow6xuIHRvw6BuIGPhuqNuaCB24buBIGdpw6FvIGThu6VjIHRyw6puIHF1eSBtw7QgdG/DoG4gY+G6p3UsIG1hbmcgbOG6oWkgbmjhu69uZyBoaeG7g3UgYmnhur90IHPDonUgc+G6r2MgduG7gSBi4buRaSBj4bqjbmggZ2nDoW8gZOG7pWMgbsSDbmcgxJHhu5luZyDhu58gbmhp4buBdSBxdeG7kWMgZ2lhIHbDoCBraHUgduG7sWMga2jDoWMgbmhhdS4gDQoNCkLhu5kgZOG7ryBsaeG7h3UgbsOgeSBsw6AgdMOgaSBz4bqjbiBraMO0bmcgdGjhu4MgdGhp4bq/dSDEkeG7kWkgduG7m2kgY8OhYyBuaMOgIG5naGnDqm4gY+G7qXUsIGPDoWMgbmjDoCBnacOhbyBk4bulYyB2w6AgY8OhYyBuaMOgIGhv4bqhY2ggxJHhu4tuaCBjaMOtbmggc8OhY2ggY8OzIHTGsCBkdXkgdGnhur9uIGLhu5ksIGdpw7pwIGjhu40gxJHDoW5oIGdpw6EsIG7Dom5nIGNhbyB2w6AgxJHhu4tuaCBow6xuaCBs4bqhaSBjw6FjIGjhu4cgdGjhu5FuZyBnacOhbyBk4bulYyB0csOqbiB0b8OgbiB0aOG6vyBnaeG7m2kuDQoNCiMjICoqMi4gUGjGsMahbmcgcGjDoXAgbmdoacOqbiBj4bupdSoqDQoNClPhu60gZOG7pW5nIGPDoWMgcGjGsMahbmcgcGjDoXAgdGjhu5FuZyBrw6ogbcO0IHThuqMgZOG7ryBsaeG7h3U6DQoNCiogUsO6dCB0csOtY2ggZOG7ryBsaeG7h3UNCg0KKiBNw6MgaMOzYSBk4buvIGxp4buHdQ0KDQoqIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRDQoNCiogVMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyANCg0KIyMgKiozLiBHaeG7m2kgdGhp4buHdSB24buBIGLhu5kgZOG7ryBsaeG7h3UqKg0KIyMjICoqMy4xLiDEkOG7jWMgZOG7ryBsaeG7h3UgdOG7qyBmaWxlIGN2cyoqDQoNCkLhu5kgZOG7ryBsaeG7h3UgKipHbG9iYWwgRWR1Y2F0aW9uKiogxJHGsOG7o2MgbOG6pXkgdOG7qyBbS2FnZ2xlXShodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL25lbGdpcml5ZXdpdGhhbmEvd29ybGQtZWR1Y2F0aW9uYWwtZGF0YSkgLSBt4buZdCBraG8gdMOgbmcgZOG7ryBsaeG7h3Uga2jhu5VuZyBs4buTIGNobyBuaOG7r25nIGFpIMSR4bq3YyBiaeG7h3QgcXVhbiB0w6JtIHbhu4EgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UuDQoNCioqR2xvYmFsIEVkdWNhdGlvbioqIGzDoCBt4buZdCBmaWxlIGN2cywgdMawxqFuZyB04buxIG5oxrAgY8OhYyBmaWxlIGtow6FjLCB0YSBjxaluZyBnw6FuIGLhu5kgZOG7ryBsaeG7h3UgdsOgbyAqKmkqKiB2w6AgZOG7pW5nIGzhu4duaCAqKnJlYWQuY3ZzKiogxJHhu4MgxJHhu41jIGThu68gbGnhu4d1Lg0KDQpgYGB7cn0NCmkgPC0gcmVhZC5jc3YoZmlsZSA9ICdDOi9Vc2Vycy9BZG1pbi9Eb3dubG9hZHMvR2xvYmFsX0VkdWNhdGlvbi5jc3YnLCBoZWFkZXIgPSBUKQ0KYGBgDQoNCiMjIyAqKjMuMi4gVGjDtG5nIHRpbiB04buVbmcgcXVhbiBj4bunYSBk4buvIGxp4buHdSoqDQoNCmBgYHtyfQ0KaXMuZGF0YS5mcmFtZShpKSAja2nhu4NtIHRyYSBpIGPDsyBwaOG6o2kgbMOgIDEgZGF0YSBmcmFtZSBoYXkga2jDtG5nLCBu4bq/dSByYSB0cnVlIHRow6wgaSBsw6AgbeG7mXQgZGF0YSBmcmFtZSwgbmfGsOG7o2MgbOG6oWkgdGjDrCBpIGtow7RuZyBsw6AgbeG7mXQgZGF0YSBmcmFtZQ0KDQpsZW5ndGgoaSkgI2tp4buDbSB0cmEgxJHhu5kgZMOgaSBj4bunYSBi4buZIGThu68gbGnhu4d1DQoNCm5hbWVzKGkpICNraeG7g20gdHJhIHTDqm4gdsOgIGLhu5kgZOG7ryBsaeG7h3UgY8OzIGJhbyBuaGnDqnUgY+G7mXQgKGJp4bq/bikNCg0KZGltKGkpICNraeG7g20gdHJhIGLhu5kgZOG7ryBsaeG7h3UgY8OzIGJhbyBuaGnDqnUgcXVhbiBzw6F0IChvYnMpIHbDoCBiaeG6v24gKHZhcmlhYmxlcyksIGhheSBraeG7g20gdHJhIGLhu5kgZOG7ryBsaeG7h3UgY8OzIGJhbyBuaGnDqnUgZMOybmcgdsOgIGPhu5l0DQoNCnN0cihpKSAja2nhu4NtIHRyYSBj4bqldSB0csO6YyBj4bunYSBi4buZIGThu68gbGnhu4d1DQoNCnN1bShpcy5uYShpKSkgI2tp4buDbSB0cmEgc+G7kSDDtCB0cuG7kW5nIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UNCg0KdGFibGUoZHVwbGljYXRlZChpKSkgI2tp4buDbSB0cmEgc+G7kSBk4buvIGxp4buHdSBi4buLIHRyw7luZw0KYGBgDQoNCkvhur90IHF14bqjIHRy4bqjIHbhu4EgY2hvIHRhIGJp4bq/dDoNCg0KKiBC4buZIGThu68gbGnhu4d1IGPDsyBj4bqldSB0csO6YyBsw6AgbeG7mXQgZGF0YSBmcmFtZSwgY8OzIDIwMiBxdWFuIHPDoXQgKG9icykgdsOgIDI5IGJp4bq/biAodmFyaWFibGVzKQ0KDQogICogMjAyIHF1YW4gc8OhdCB0xrDGoW5nIOG7qW5nIHbhu5tpIDIwMiBow6BuZw0KICANCiAgKiAyOSBiaeG6v24gdMawxqFuZyDhu6luZyB24bubaSAyOSBj4buZdA0KICANCiAgKiBD4buZdCDEkeG6p3UgdGnDqm4gbMOgIGJp4bq/biDEkeG7i25oIGzGsOG7o25nLCAyOCBj4buZdCBzYXUgbMOgIGJp4bq/biDEkeG7i25oIHTDrW5oLCB0cm9uZyDEkcOzOiANCiAgICANCiAgICAqIGNocjogS2nhu4N1IGJp4bq/biBsw6Aga8O9IHThu7ENCiAgICANCiAgICAqIGludDogS2nhu4N1IGJp4bq/biBsw6Agc+G7kSBuZ3V5w6puIA0KICAgIA0KICAgICogbnVtOiBLaeG7g3UgYmnhur9uIGzDoCBz4buRIHRo4buxYw0KICANCiAgKiBC4buZIGThu68gbGnhu4d1IGtow7RuZyBjw7MgZOG7ryBsaeG7h3UgdHLhu5FuZyB2w6AgYuG7iyB0csO5bmcgbmhhdQ0KICANCiogw50gbmdoxKlhIHTDqm4gYmnhur9uIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3U6DQoNCiAgKiBDb3VudHJpZXMuYW5kLmFyZWFzOiBUw6puIHF14buRYyBnaWEgdsOgIGtodSB24buxYw0KICAgDQogICogTGF0aXR1ZGU6IFThu41hIMSR4buZIHbEqSDEkeG7mSBj4bunYSB24buLIHRyw60gxJHhu4thIGzDvQ0KDQogICogTG9uZ2l0dWRlOiBU4buNYSDEkeG7mSBraW5oIMSR4buZIGPhu6dhIHbhu4sgdHLDrSDEkeG7i2EgbMO9DQogIA0KICAqIE9PU1JfUHJlMFByaW1hcnlfQWdlX01hbGU6IFThu7cgbOG7hyBi4buPIGjhu41jIGPhu6dhIG5hbSDEkeG7mSB0deG7lWkgbeG6p20gbm9uDQogIA0KICAqIE9PU1JfUHJlMFByaW1hcnlfQWdlX0ZlbWFsZTogVOG7tyBs4buHIGLhu48gaOG7jWMgY+G7p2EgbuG7ryDEkeG7mSB0deG7lWkgbeG6p20gbm9uDQogIA0KICAqIE9PU1JfUHJpbWFyeV9BZ2VfTWFsZTogVOG7tyBs4buHIGLhu48gaOG7jWMgY+G7p2EgbmFtIMSR4buZIHR14buVaSB0aeG7g3UgaOG7jWMNCiAgIA0KICAqIE9PU1JfUHJpbWFyeV9BZ2VfRmVtYWxlOiBU4bu3IGzhu4cgYuG7jyBo4buNYyBj4bunYSBu4buvIMSR4buZIHR14buVaSB0aeG7g3UgaOG7jWMNCiAgDQogICogT09TUl9Mb3dlcl9TZWNvbmRhcnlfQWdlX01hbGU6IFThu7cgbOG7hyBi4buPIGjhu41jIGPhu6dhIG5hbSDEkeG7mSB0deG7lWkgVEhDUw0KICANCiAgKiBPT1NSX0xvd2VyX1NlY29uZGFyeV9BZ2VfRmVtYWxlOiBU4bu3IGzhu4cgYuG7jyBo4buNYyBj4bunYSBu4buvIMSR4buZIHR14buVaSBUSENTDQogIA0KICAqIE9PU1JfVXBwZXJfU2Vjb25kYXJ5X0FnZV9NYWxlOiBU4bu3IGzhu4cgYuG7jyBo4buNYyBj4bunYSBuYW0gxJHhu5kgdHXhu5VpIFRIUFQgDQogIA0KICAqIE9PU1JfVXBwZXJfU2Vjb25kYXJ5X0FnZV9GZW1hbGU6IFThu7cgbOG7hyBi4buPIGjhu41jIGPhu6dhIG7hu68gxJHhu5kgdHXhu5VpIFRIUFQNCiAgDQogICogQ29tcGxldGlvbl9SYXRlX1ByaW1hcnlfTWFsZTogVOG7tyBs4buHIGhvw6BuIHRow6BuaCBi4bqtYyB0aeG7g3UgaOG7jWMgY+G7p2EgbmFtIA0KICANCiAgKiBDb21wbGV0aW9uX1JhdGVfUHJpbWFyeV9GZW1hbGU6IFThu7cgbOG7hyBob8OgbiB0aMOgbmggYuG6rWMgdGnhu4N1IGjhu41jIGPhu6dhIG7hu68NCiAgDQogICogQ29tcGxldGlvbl9SYXRlX0xvd2VyX1NlY29uZGFyeV9NYWxlOiBU4bu3IGzhu4cgaG/DoG4gdGjDoG5oIGLhuq1jIFRIQ1MgY+G7p2EgbmFtIA0KICANCiAgKiBDb21wbGV0aW9uX1JhdGVfTG93ZXJfU2Vjb25kYXJ5X0ZlbWFsZTogVOG7tyBs4buHIGhvw6BuIHRow6BuaCBi4bqtYyBUSENTIGPhu6dhIG7hu68NCiAgDQogICogQ29tcGxldGlvbl9SYXRlX1VwcGVyX1NlY29uZGFyeV9NYWxlOiBU4bu3IGzhu4cgaG/DoG4gdGjDoG5oIGLhuq1jIFRIUFQgY+G7p2EgbmFtIA0KICANCiAgKiBDb21wbGV0aW9uX1JhdGVfVXBwZXJfU2Vjb25kYXJ5X0ZlbWFsZTogVOG7tyBs4buHIGhvw6BuIHRow6BuaCBi4bqtYyBUSFBUIGPhu6dhIG7hu68NCiAgDQogICogR3JhZGVfMl8zX1Row6BuaCB0aOG6oW9fUmVhZGluZzogVGjDoG5oIHRo4bqhbyBr4bu5IG7Eg25nIMSR4buNYyBkw6BuaCBjaG8gaOG7jWMgc2luaCBs4bubcCAyLTMNCiAgDQogICogR3JhZGVfMl8zX1Byb2ZpY2llbmN5X01hdGg6IFRow6BuaCB0aOG6oW8gbcO0biB0b8OhbiBkw6BuaCBjaG8gaOG7jWMgc2luaCBs4bubcCAyLTMNCiAgDQogICogUHJpbWFyeV9FbmRfUHJvZmljaWVuY3lfUmVhZGluZzogVGjDoG5oIHRo4bqhbyBr4bu5IG7Eg25nIMSR4buNYyBraGkga+G6v3QgdGjDumMgYuG6rWMgdGnhu4N1IGjhu41jDQogIA0KICAqIFByaW1hcnlfRW5kX1Byb2ZpY2llbmN5X01hdGg6IFRow6BuaCB0aOG6oW8gdG/DoW4ga2hpIGvhur90IHRow7pjIGLhuq1jIHRp4buDdSBo4buNYw0KICANCiAgKiBMb3dlcl9TZWNvbmRhcnlfRW5kX1Byb2ZpY2llbmN5X1JlYWRpbmc6IFRow6BuaCB0aOG6oW8ga+G7uSBuxINuZyDEkeG7jWMga2hpIGvhur90IHRow7pjIGLhuq1jIFRIQ1MNCiAgDQogICogTG93ZXJfU2Vjb25kYXJ5X0VuZF9Qcm9maWNpZW5jeV9NYXRoOiBUaMOgbmggdGjhuqFvIG3DtG4gdG/DoW4ga2hpIGvhur90IHRow7pjIGLhuq1jIFRIQ1MNCiAgDQogICogWW91dGhfMTVfMjRfTGl0ZXJhY3lfUmF0ZV9NYWxlOiBU4bu3IGzhu4cgYmnhur90IGNo4buvIGPhu6dhIHRoYW5oIG5pw6puIG5hbSDEkeG7mSB0deG7lWkgMTUtMjQNCg0KICAqIFlvdXRoXzE1XzI0X0xpdGVyYWN5X1JhdGVfRmVtYWxlOiBU4bu3IGzhu4cgYmnhur90IGNo4buvIGPhu6dhIHRoYW5oIG5pw6puIG7hu68gxJHhu5kgdHXhu5VpIDE1LTI0DQoNCiAgKiBCaXJ0aF9SYXRlOiBU4bu3IGzhu4cgc2luaCDhu58gY8OhYyBxdeG7kWMgZ2lhL2todSB24buxYyB0xrDGoW5nIOG7qW5nDQogIA0KICAqIEdyb3NzX1ByaW1hcnlfRWR1Y2F0aW9uX0Vucm9sbG1lbnQ6IFThu5VuZyBz4buRIHR1eeG7g24gc2luaCB0aeG7g3UgaOG7jWMNCiAgIA0KICAqIEdyb3NzX1RlcnRpYXJ5X0VkdWNhdGlvbl9FbnJvbGxtZW50OiBU4buVbmcgc+G7kSB0dXnhu4NuIHNpbmggdsOgbyBnacOhbyBk4bulYyDEkeG6oWkgaOG7jWMNCg0KICAqIFVuZW1wbG95bWVudF9SYXRlOiBU4bu3IGzhu4cgdGjhuqV0IG5naGnhu4dwIOG7nyBjw6FjIHF14buRYyBnaWEva2h1IHbhu7FjIHTGsMahbmcg4bupbmcNCiAgDQojIyAqKjQuIE3hu5l0IHPhu5EgdGhhbyB0w6FjIGPGoSBi4bqjbiBjaHXhuqluIGLhu4sgY2hvIHZp4buHYyBwaMOibiB0w61jaCoqDQojIyMgKio0LjEuIMSQ4buVaSB0w6puIGNobyBjw6FjIGJp4bq/biBj4bqnbiBkw7luZyoqDQoNCuG7niBi4buZIGThu68gbGnhu4d1IGfhu5FjLCB0w6puIGJp4bq/biBj4bunYSBk4buvIGxp4buHdSDEkcaw4bujYyDEkeG6t3Qga2jDoSBkw6BpLiBWw6wgduG6rXkgxJHhu4MgdGnhu4duIGNobyB2aeG7h2MgcGjDom4gdMOtY2gsIHRhIHPhur0gc+G7rSBk4bulbmcgbOG7h25oICoqbmFtZXMoKSoqIMSR4buVaSB0w6puIGPDoWMgYmnhur9uIG5n4bqvbiBn4buNbiBoxqFuLCBk4buFIHPhu60gZOG7pW5nIGjGoW4uIFRhIHRo4buxYyBoaeG7h24gdGhhbyB0w6FjIMSR4buVaSB0w6puIGJp4bq/biBuaMawIHNhdToNCg0KYGBge3J9DQpuYW1lcyhpKVtuYW1lcyhpKSA9PSAiQ291bnRyaWVzLmFuZC5hcmVhcyJdIDwtICJuYW1lIg0KbmFtZXMoaSlbbmFtZXMoaSkgPT0gIk9PU1JfVXBwZXJfU2Vjb25kYXJ5X0FnZV9NYWxlIl0gPC0gImRyb3AubSINCm5hbWVzKGkpW25hbWVzKGkpID09ICJPT1NSX1VwcGVyX1NlY29uZGFyeV9BZ2VfRmVtYWxlIl0gPC0gImRyb3AuZiINCm5hbWVzKGkpW25hbWVzKGkpID09ICJZb3V0aF8xNV8yNF9MaXRlcmFjeV9SYXRlX01hbGUiXSA8LSAicmVhZC5tIg0KbmFtZXMoaSlbbmFtZXMoaSkgPT0gIllvdXRoXzE1XzI0X0xpdGVyYWN5X1JhdGVfRmVtYWxlIl0gPC0gInJlYWQuZiINCm5hbWVzKGkpW25hbWVzKGkpID09ICJVbmVtcGxveW1lbnRfUmF0ZSJdIDwtICJVbkUiDQpgYGANCg0KS+G6v3QgcXXhuqMgdHLhuqMgduG7gSBjaG8gdGEgdGjhuqV5Og0KDQoqIEPhu5l0IF8iQ291bnRyaWVzLmFuZC5hcmVhcyJfIMSRxrDhu6NjIMSR4buVaSB0w6puIHRow6BuaCAqKm5hbWUqKg0KDQoqIEPhu5l0IF8iT09TUl9VcHBlcl9TZWNvbmRhcnlfQWdlX01hbGUiXyDEkcaw4bujYyDEkeG7lWkgdMOqbiB0aMOgbmggKipkcm9wLm0qKg0KDQoqIEPhu5l0IF8iT09TUl9VcHBlcl9TZWNvbmRhcnlfQWdlX0ZlbWFsZSJfIMSRxrDhu6NjIMSR4buVaSB0w6puIHRow6BuaCAqKmRyb3AuZioqDQoNCiogQ+G7mXQgXyJZb3V0aF8xNV8yNF9MaXRlcmFjeV9SYXRlX01hbGUiXyDEkcaw4bujYyDEkeG7lWkgdMOqbiB0aMOgbmggKipyZWFkLm0qKg0KDQoqIEPhu5l0IF8iWW91dGhfMTVfMjRfTGl0ZXJhY3lfUmF0ZV9GZW1hbGUiXyDEkcaw4bujYyDEkeG7lWkgdMOqbiB0aMOgbmggKipyZWFkLmYqKg0KDQoqIEPhu5l0IF8iVW5lbXBsb3ltZW50X1JhdGUiXyDEkcaw4bujYyDEkeG7lWkgdMOqbiB0aMOgbmggKipVbkUqKg0KDQo9PiBUw6puIGPDoWMgYmnhur9uIMSRw6MgdHLhu58gbsOqbiBuZ+G6r24gZ+G7jW4sIHRhIGThu4UgZMOgbmcgdGjhu7FjIGhp4buHbiBjw6FjIHRoYW8gdMOhYyBwaMOibiB0w61jaC4NCg0KIyMjICoqNC4yLiBSw7p0IHRyw61jaCBk4buvIGxp4buHdTogNiBxdeG7kWMgZ2lhIGtodSB24buxYyBjaMOidSDDgSoqDQoNCkNow7puZyB0YSBz4bq9IGtow7RuZyBwaMOibiB0w61jaCB04bqldCB0aOG6o3kgMjAyIHF1YW4gc8OhdCB2w6AgMjkgYmnhur9uIG3DoCBjaMO6bmcgdGEgc+G6vSBjaOG7iSBwaMOibiB0w61jaCA2IHF14buRYyBnaWEgdHJvbmcga2h1IHbhu7FjIENow6J1IMOBIGJhbyBn4buTbTogQnJ1bmVpLCDEkMO0bmcgVGltbywgSW5kb25lc2lhLCBOZXBhbCwgTWFsYXlzaWEgdsOgIOG6pG4gxJDhu5ksIOG7nyBjw6FjIG3huqNuZzoNCg0KKiBU4bu3IGzhu4cgYuG7jyBo4buNYyBUSFBUIGPhu6dhIG5hbSBnaeG7m2kNCg0KKiBU4bu3IGzhu4cgYuG7jyBo4buNYyBUSFBUIGPhu6dhIG7hu68gZ2nhu5tpDQoNCiogVOG7tyBs4buHIG5hbSB04burIDE1IMSR4bq/biAyNCB0deG7lWkgYmnhur90IGNo4buvDQoNCiogVOG7tyBs4buHIG7hu68gdOG7qyAxNSDEkeG6v24gMjQgdHXhu5VpIGJp4bq/dCBjaOG7rw0KDQoqIFThu7cgbOG7hyB0aOG6pXQgbmdoaeG7h3ANCg0KYGBge3J9DQpsaWJyYXJ5KCd0aWR5dmVyc2UnKSAjZ+G7jWkgcGFja2FnZSAndGlkeXZlcnNlJw0KDQprIDwtIGkgJT4lIHNlbGVjdChuYW1lLCBkcm9wLm0sIGRyb3AuZiwgcmVhZC5tLCByZWFkLmYsIFVuRSkNCg0KbSA8LSBrW2skbmFtZT09J0JydW5laScgfCBrJG5hbWU9PSdNYWxheXNpYScgfCBrJG5hbWU9PSdFYXN0IFRpbW9yJyB8IGskbmFtZT09J0luZG9uZXNpYScgfCBrJG5hbWU9PSdJbmRpYScgfGskbmFtZT09J05lcGFsJywgXQ0KYGBgDQoNCiMjICoqNS4gUGjDom4gdMOtY2ggdOG7tyBs4buHIGLhu48gaOG7jWMgVEhQVCAqKg0KDQpE4buvIGxp4buHdSBjaMO6bmcgdGEgdGh1IHbhu4EgbMOgIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmgsIMSR4buDIHBow6JuIHTDrWNoIGNow7puZyB0YSBz4bq9IG3DoyBow7NhIGThu68gbGnhu4d1IHNhbmcgZOG7ryBsaeG7h3UgxJHhu4tuaCBsxrDhu6NuZyBi4bqxbmcgbOG7h25oICoqY2FzZV93aGVuKiogbmjGsCBzYXU6DQoNCmBgYHtyfQ0KbGlicmFyeSgndGlkeXZlcnNlJykgI2fhu41pIHBhY2thZ2UgJ3RpZHl2ZXJzZScNCg0KbSRC4buPLmjhu41jLm5hbSA8LSBjYXNlX3doZW4obSRkcm9wLm08PTE5IH4gJ1Ro4bqlcCcsIG0kZHJvcC5tPj0yMCAmIG0kZHJvcC5tPD00OSB+ICdUcnVuZyBiw6xuaCcsIG0kZHJvcC5tPj01MCB+ICdDYW8nKSAjbcOjIGjDs2EgZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCBzYW5nIGThu68gbGnhu4d1IMSR4buLbmggbMaw4bujbmcgY+G7p2EgY+G7mXQgYmnhur9uIGLhu48gaOG7jWMgbMOgIG5hbQ0KDQptJELhu48uaOG7jWMubuG7ryA8LSBjYXNlX3doZW4obSRkcm9wLmY8PTE5IH4gJ1Ro4bqlcCcsIG0kZHJvcC5mPj0yMCAmIG0kZHJvcC5mPD00OSB+ICdUcnVuZyBiw6xuaCcsIG0kZHJvcC5mPj01MCB+ICdDYW8nKSAjbcOjIGjDs2EgZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCBzYW5nIGThu68gbGnhu4d1IMSR4buLbmggbMaw4bujbmcgY+G7p2EgY+G7mXQgYmnhur9uIGLhu48gaOG7jWMgbMOgIG5hbQ0KYGBgDQoNCkvhur90IHF14bqjIHRy4bqjIHbhu4EgY2hvIGNow7puZyB0YSB0aOG6pXk6DQoNCiogNiBxdeG7kWMgZ2lhIMSR4buBdSBjw7MgdOG7tyBs4buHIGLhu48gaOG7jWMgVEhQVCDhu58gbeG7qWMgdGjhuqVwIGhv4bq3YyBt4bupYyB0cnVuZyBiw6xuaCBjaG8gY+G6oyBnaeG7m2kgdMOtbmggbmFtIHbDoCBu4buvLg0KDQoqIEtow7RuZyBjw7MgcXXhu5FjIGdpYSBuw6BvIGPDsyB04bu3IGzhu4cgYuG7jyBo4buNYyBUSFBUIHRyw6puIHRydW5nIGLDrG5oLiAoPj01MCkNCg0KU2F1IGtoaSBtw6MgaMOzYSBk4buvIGxp4buHdSB4b25nLCDEkeG7gyB0aeG6v3AgdOG7pWMgeGVtIHThu7cgbOG7hyBi4buPIGjhu41jIFRIUFQg4bufIG3hu6ljIHRo4bqlcC90cnVuZyBiw6xuaCBj4bunYSBuYW0gdsOgIG7hu68geHXhuqV0IGhp4buHbiBiYW8gbmhpw6p1IGzhuqduLCB24bubaSB04bqnbiBz4buRIGJhbyBuaGnDqnUsIHRow6wgdGEgdGjhu7FjIGhp4buHbiBuaMawIHNhdTogDQoNCmBgYHtyfQ0KcjEgPC0gbSAlPiUgZ3JvdXBfYnkoQuG7jy5o4buNYy5uYW0pICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgI2tp4buDbSB0cmEgdOG6p24gc+G7kSB04bu3IGzhu4cgYuG7jyBo4buNYyBUSFBUIOG7nyBuYW0gZ2nhu5tpDQoNCnIyIDwtIG0gJT4lIGdyb3VwX2J5KELhu48uaOG7jWMubuG7rykgJT4lIHN1bW1hcmlzZShuID0gbigpKSNraeG7g20gdHJhIHThuqduIHPhu5EgdOG7tyBs4buHIGLhu48gaOG7jWMgVEhQVCDhu58gbuG7ryBnaeG7m2kNCmBgYA0KDQpW4bubaSBuYW0gZ2nhu5tpLCBjw7MgMS82IHF14buRYyBnaWEgY8OzIHThu7cgbOG7hyBi4buPIGjhu41jIGzDoCB0aOG6pXAsIDUvNiBxdeG7kWMgZ2lhIGPDsyB04bu3IGzhu4cgYuG7jyBo4buNYyBsw6AgdHJ1bmcgYsOsbmguIFbhu5tpIG7hu68gZ2nhu5tpIDIvNiBxdeG7kWMgZ2lhIGPDsyB04bu3IGzhu4cgYuG7jyBo4buNYyBsw6AgdGjhuqVwLCA0LzYgcXXhu5FjIGdpYSBjw7MgdOG7tyBs4buHIGLhu48gaOG7jWMgbMOgIHRydW5nIGLDrG5oLg0KDQpgYGB7cn0NCnN1bW1hcnkobSRkcm9wLm0pDQpzdW1tYXJ5KG0kZHJvcC5mKQ0KYGBgDQoNCkNoaSB0aeG6v3QgaMahbiwgdGEgdGjhuqV5IHLhurFuZzoNCg0KKiBW4bubaSBuYW0gZ2nhu5tpOiANCiAgDQogICogVOG7tyBs4buHIGLhu48gaOG7jWMgVEhQVCBiw6kgbmjhuqV0IGLhurFuZyAxOSAoQnJ1bmVpKQ0KICANCiAgKiBU4bu3IGzhu4cgYuG7jyBo4buNYyBUSFBUIGzhu5tuIG5o4bqldCBi4bqxbmcgNDcgKOG6pG4gxJDhu5kpDQogIA0KICAqIFThu7cgbOG7hyBi4buPIGjhu41jIFRIUFQgdHJ1bmcgYsOsbmggYuG6sW5nIDMwLjUgKG3hu6ljIHRydW5nIGLDrG5oKQ0KDQogICogMjUlIHPhu5EgdOG7tyBs4buHIGLhu48gaOG7jWMgVEhQVCBjw7MgZ2nDoSB0cuG7iyBuaOG7jyBoxqFuIDIzLjc1DQogIA0KICAqIDUwJSBz4buRIHThu7cgbOG7hyBi4buPIGjhu41jIFRIUFQgY8OzIGdpw6EgdHLhu4sgbmjhu48gaMahbiAyNi41DQogIA0KICAqIDc1JSBz4buRIHThu7cgbOG7hyBi4buPIGjhu41jIFRIUFQgY8OzIGdpw6EgdHLhu4sgbmjhu48gaMahbiAzNy41DQoNCiogVuG7m2kgbuG7ryBnaeG7m2k6IA0KDQogICogVOG7tyBs4buHIGLhu48gaOG7jWMgVEhQVCBiw6kgbmjhuqV0IGLhurFuZyAxMyAoTmFwZWwpDQogIA0KICAqIFThu7cgbOG7hyBi4buPIGjhu41jIFRIUFQgbOG7m24gbmjhuqV0IGLhurFuZyA0OCAo4bqkbiDEkOG7mCApDQogIA0KICAqIFThu7cgbOG7hyBi4buPIGjhu41jIFRIUFQgdHJ1bmcgYsOsbmggYuG6sW5nIDIyLjUgKG3hu6ljIHRydW5nIGLDrG5oKQ0KDQogICogMjUlIHPhu5EgdOG7tyBs4buHIGLhu48gaOG7jWMgVEhQVCBjw7MgZ2nDoSB0cuG7iyBuaOG7jyBoxqFuIDE3LjUNCiAgDQogICogNTAlIHPhu5EgdOG7tyBs4buHIGLhu48gaOG7jWMgVEhQVCBjw7MgZ2nDoSB0cuG7iyBuaOG7jyBoxqFuIDIyDQogIA0KICAqIDc1JSBz4buRIHThu7cgbOG7hyBi4buPIGjhu41jIFRIUFQgY8OzIGdpw6EgdHLhu4sgbmjhu48gaMahbiAyOS41DQoNCioqTkjhuqxOIFjDiVQqKg0KICANCj0+IMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5LCB0dXkgY8OhYyA2IHF14buRYyBnaWEgxJHDoyBo4bqhbiBjaOG6vyB2aeG7h2MgYuG7jyBo4buNYyBUSFBULCBuaMawbmcgduG6q24ga2jDtG5nIGdp4bqjbSB0cmnhu4d0IMSR4buDIMSRxrDhu6NjIHZp4buHYyBi4buPIGjhu41jIGNobyBj4bqjIG5ow7NtIMSR4buRaSB0xrDhu6NuZyBsw6AgbmFtIHbDoCBu4buvLiBDw6FjIHF14buRYyBnaWEgY+G6p24gdGnhur9wIHThu6VjIMSR4bqpeSBt4bqhbmggY8OhYyBjaGnhur9uIGzGsOG7o2MvY2jDrW5oIHPDoWNoIMSR4buDIGdp4bqjbSB0aGnhu4N1IHZp4buHYyBi4buPIGjhu41jIFRIUFQgKMSR4bq3YyBiaeG7h3QgbMOgIOG6pG4gxJDhu5kpIHNhbyBjaG8gY2jhu4kgY8OybiBt4bupYyB04bu3IGzhu4cgbMOgIHRo4bqlcCwgdHJ1bmcgYsOsbmggdGjhuqVwIGhv4bq3YyBsw70gdMaw4bufbmcgaMahbiBsw6Aga2jDtG5nIGPDsyBxdeG7kWMgZ2lhIG7DoG8gY8OzIGjhu41jIHNpbmggYuG7jyBo4buNYy4NCg0KIyMgKio2LiBQaMOibiB0w61jaCB04bu3IGzhu4cgYmnhur90IMSR4buNYyB04burIDE1IMSR4bq/biAyNCB0deG7lWkqKg0KDQpUxrDGoW5nIHThu7EgdOG7tyBs4buHIGLhu48gaOG7jWMgVEhQVCwgdGEgdGnhur9wIHThu6VjIHPhu60gZOG7pW5nIGzhu4duaCAqKmNhc2Vfd2hlbioqIMSR4buDIG3DoyBow7NhIGThu68gbGnhu4d1IHNhbmcgZOG7ryBsaeG7h3UgxJHhu4tuaCBsxrDhu6NuZyBuaMawIHNhdToNCg0KYGBge3J9DQpsaWJyYXJ5KCd0aWR5dmVyc2UnKSAjZ+G7jWkgcGFja2FnZSAndGlkeXZlcnNlJw0KDQptJEJp4bq/dC7EkeG7jWMubmFtIDwtIGNhc2Vfd2hlbihtJHJlYWQubTw9MjkgfiAnVGjhuqVwJywgbSRyZWFkLm0+PTMwICYgbSRyZWFkLm08PTc5IH4gJ1RydW5nIGLDrG5oJywgbSRyZWFkLm0+PTgwICYgbSRyZWFkLm08PTg5IH4gJ1RydW5nIGLDrG5oIGNhbycsIG0kcmVhZC5tPj05MCB+ICdDYW8nKSAjbcOjIGjDs2EgZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCBzYW5nIGThu68gbGnhu4d1IMSR4buLbmggbMaw4bujbmcgY+G7p2EgY+G7mXQgYmnhur9uIGJp4bq/dCDEkeG7jWMgbMOgIG5hbSB04burIDE1IMSR4bq/biAyNCB0deG7lWkNCg0KbSRCaeG6v3QuxJHhu41jLm7hu68gPC0gY2FzZV93aGVuKG0kcmVhZC5mPD0yOSB+ICdUaOG6pXAnLCBtJHJlYWQuZj49MzAgJiBtJHJlYWQuZjw9NzkgfiAnVHJ1bmcgYsOsbmgnLCBtJHJlYWQuZj49ODAgJiBtJHJlYWQuZjw9ODkgfiAnVHJ1bmcgYsOsbmggY2FvJywgbSRyZWFkLmY+PTkwIH4gJ0NhbycpICNtw6MgaMOzYSBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oIHNhbmcgZOG7ryBsaeG7h3UgxJHhu4tuaCBsxrDhu6NuZyBj4bunYSBj4buZdCBiaeG6v24gYmnhur90IMSR4buNYyBsw6AgbuG7ryB04burIDE1IMSR4bq/biAyNSB0deG7lWkNCmBgYA0KDQpUcsOhaSBuZ8aw4bujYyB24bubaSB04bu3IGzhu4cgYuG7jyBo4buNYyBUSFBULCB04burIGvhur90IHF14bqjIHRhIGPDsyB0aOG7gyB0aOG6pXkgcuG6sW5nIMSRYSBz4buRIG5nxrDhu51pIGTDom4gdHJvbmcgxJHhu5kgdHXhu5VpIHThu6sgMTUgxJHhur9uIDI0IGTDuSBuYW0gaGF5IG7hu68gdGjDrCDEkeG7gXUgYmnhur90IMSR4buNYyAtIG3hu5l0IMSRaeG7gXUgdOG7kWkgdGhp4buDdSBtw6AgbeG7mXQgbuG7gW4gZ2nDoW8gZOG7pWMgcXXhu5FjIGdpYSBuw6puIGzDoG0uIFThu7cgbOG7hyBj4bunYSA2IHF14buRYyBnaWEgxJHhu4F1IMSR4bqhdCBt4bupYyB04burIHRydW5nIGLDrG5oIGNhbyBjaG8gxJHhur9uIGNhbywgY2hvIHRo4bqleSDEkcOieSBsw6AgbeG7mXQgxJFp4buBdSDEkcOhbmcgbeG7q25nIGPhu6dhIG7Dqm4gZ2nDoW8gZOG7pWMgdGjhur8gZ2nhu5tpLg0KDQpgYGB7cn0NCnUxIDwtIG0gJT4lIGdyb3VwX2J5KEJp4bq/dC7EkeG7jWMubmFtKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICNraeG7g20gdHJhIHThuqduIHPhu5EgdOG7tyBs4buHIGJp4bq/dCDEkeG7jWMg4bufIG5hbSBnaeG7m2kNCg0KdTIgPC0gbSAlPiUgZ3JvdXBfYnkoQmnhur90LsSR4buNYy5u4buvKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpI2tp4buDbSB0cmEgdOG6p24gc+G7kSB04bu3IGzhu4cgYmnhur90IMSR4buNYyDhu58gbuG7ryBnaeG7m2kNCmBgYA0KDQpN4bq3YyBkw7ksIHThu7cgbOG7hyBiaeG6v3QgxJHhu41jIGPhu6dhIDYgcXXhu5FjIGdpYSB0cm9uZyBraHUgduG7sWMgY2jDonUgw4Ega2jDoSBjYW8gKDUvNiDEkeG6oXQgbeG7qWMgdOG7tyBs4buHIGNhbyksIHRo4bq/IG5oxrBuZyBjw7MgduG6uyBCcnVuZWkgxJFhbmcgYuG7iyAidOG7pXQgbOG6oWkiIHNvIHbhu5tpIGPDoWMgImFuaCBlbSIga2jDoWMgY+G7p2EgbcOsbmguIEJydW5laSBsw6AgcXXhu5FjIGdpYSBkdXkgbmjhuqV0IMSR4bqhdCBt4bupYyB04bu3IGzhu4cgdHJ1bmcgYsOsbmggY2FvLiANCg0KKipOSOG6rE4gWMOJVCoqDQoNCjUgcXXhu5FjIGdpYSBiYW8gZ+G7k206IEVhc3QgVGltb3IsIEluZG9uZXNpYSwgTmVwYWwsIE1hbGF5c2lhIHbDoCBJbmRpYSBj4bqnbiB0aeG6v3AgdOG7pWMgdHJp4buDbiBraGFpIGRp4buHbiBy4buZbmcgY2hvIMSR4bq/biBraGkgxJHhuqF0IMSRxrDhu6NjIG3hu6VjIHRpw6p1IHThuqV0IGPhuqMgY+G6oyBjw6FjIMSR4buBdSBjw7MgdOG7tyBs4buHIG5nxrDhu51pIGJp4bq/dCDEkeG7jWMgdHJvbmcgxJHhu5kgdHXhu5VpIHThu6sgMTUgxJHhur9uIDI0IGzDoCAxMDAlLiBSacOqbmcgQnJ1bmVpIHRow6wgY+G6p24gbuG7lSBs4buxYyBuaGnhu4F1IGjGoW4gbuG7r2EgxJHhu4MgxJHGsGEgdOG7tyBs4buHIGJp4bq/dCDEkeG7jWMgdHJvbmcgxJHhu5kgdHXhu5VpIDE1IMSR4bq/biAyNCBsw6puIG3hu6ljIGNhby4gDQoNCiMjICoqNy4gUGjDom4gdMOtY2ggdOG7tyBs4buHIHRo4bqldCBuZ2hp4buHcCoqDQoNCmBgYHtyfQ0KbSRUaOG6pXQubmdoaeG7h3AgPC0gY2FzZV93aGVuKG0kVW5FPD0yLjkgfiAnVGjhuqVwJywgbSRVbkU+PTMgJiBtJFVuRTw9Ni45IH4gJ1bhu6thIHBo4bqjaScsIG0kVW5FPj03IH4gJ0NhbycpICNtw6MgaMOzYSBk4buvIGxp4buHdQ0KcCA8LSBtICU+JSBncm91cF9ieShUaOG6pXQubmdoaeG7h3ApICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgI2tp4buDbSB0cmEgdOG6p24gc+G7kQ0KYGBgDQoNCkvhur90IHF14bqjIHRy4bqjIHbhu4EgY2hvIGNow7puZyB0YSBiaeG6v3QsIHRyb25nIDYgbsaw4bubYyB0aMOsIGPDsyBiYW8gZ+G7k20gNCBuxrDhu5tjOiBJbmRpYSwgSW5kb25lc2lhLCBNYWxheXNpYSB2w6AgRWFzdCBUaW1vciBjw7MgdOG7tyBs4buHIHRo4bqldCBuZ2hp4buHcCDhu58gbeG7qWMgduG7q2EgcGjhuqNpLCBOZXBhbCDhu58gbeG7qWMgdGjhuqVwIHbDoCBCcnVuZWkg4bufIG3hu6ljIGNhby4NCg0KYGBge3J9DQpvIDwtIG0gJT4lIGdyb3VwX2J5KG5hbWUpICU+JSBzdW1tYXJpc2Uoc3VtX29mX2VkdSA9IHN1bShVbkUpKQ0KYGBgDQoNClbDoCB0aGVvIGvhur90IHF14bqjIGPhu6dhIHThu5VuZyB04bu3IGzhu4cgdGjhuqV0IG5naGnhu4dwIHRoZW8gbmjDs20gcXXhu5FjIGdpYSwgxJFp4buBdSBr4buzIGzhuqEgbMOgIGNobyBkw7kgQnJ1bmVpIGPDsyB04bu3IGzhu4cgYuG7jyBo4buNYyBUSFBUIOG7nyBj4bqjIG5hbSB2w6AgbuG7ryDEkeG7gXUg4bufIG3hu6ljIHRo4bqlcCB2w6AgdOG7tyBs4buHIGJp4bq/dCDEkeG7jWMgdOG7qyAxNSDEkeG6v24gMjQgdHXhu5VpIG3hu6ljIGNhbyB0aMOsIHThu5VuZyB04bu3IGzhu4cgdGjhuqV0IG5naGnhu4dwIGPhu6dhIEJydW5laSBs4bqhaSB2w7QgY8O5bmcgY2FvLiDEkOG6t3QgcmEgbeG7mXQgZOG6pXUgbmdoaSB24bqlbiB2w7QgY8O5bmcgdG8gbOG7m24gKD0gOS4xMikNCg0KVHJvbmcga2hpIMSRw7MsIGNow7puZyB0YSBjw7MgdGjhu4MgcXVhbiBzw6F0IG3hu5l0IHbDrSBk4bulIHTDrWNoIGPhu7FjIHThu6sgTmVwYWwgLSBt4buZdCBxdeG7kWMgZ2lhIHbhu5tpIHThu7cgbOG7hyB0aOG6pXQgbmdoaeG7h3AgdGjhuqVwIG5o4bqldCB0cm9uZyBz4buRIDYgcXXhu5FjIGdpYSDEkcaw4bujYyBuZ2hpw6puIGPhu6l1LiBOZXBhbCDEkcOhbmcgxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2FvIGtoaSBo4buNIGtow7RuZyBjaOG7iSBnaeG6o20gdGhp4buDdSB04bu3IGzhu4cgYuG7jyBo4buNYyDhu58gY+G6pXAgdHJ1bmcgaOG7jWMgcGjhu5UgdGjDtG5nIHh14buRbmcgbeG7qWMgdGjhuqVwL3RydW5nIGLDrG5oLCBtw6AgY8OybiB0xINuZyBjxrDhu51uZyB04bu3IGzhu4cgYmnhur90IMSR4buNYyBj4bunYSBuaMOzbSBkw6JuIHPhu5EgdOG7qyAxNSDEkeG6v24gMjQgdHXhu5VpIGzDqm4gbeG7qWMgY2FvIHbDoCBnaeG6o20gdGhp4buDdSB0w6xuaCB0cuG6oW5nIHRo4bqldCBuZ2hp4buHcC4gQ8OhYyBxdeG7kWMgZ2lhIGtow6FjIGPDsyB0aOG7gyBo4buNYyBo4buPaSB04burIG5o4buvbmcgdGjDoG5oIHThu7F1IGPhu6dhIE5lcGFsIHbDoCDDoXAgZOG7pW5nIG5o4buvbmcgYmnhu4duIHBow6FwIHTGsMahbmcgdOG7sSDEkeG7gyBj4bqjaSB0aGnhu4duIHTDrG5oIGjDrG5oIGdpw6FvIGThu6VjIHbDoCB0aOG7iyB0csaw4budbmcgbGFvIMSR4buZbmcgY+G7p2EgbcOsbmguDQoNCiMjICoqOC4gVOG7lW5nIGvhur90KioNCg0KR2nDoW8gZOG7pWMgxJHDs25nIHZhaSB0csOyIHF1YW4gdHLhu41uZyB0cm9uZyB2aeG7h2MgxJHhu4tuaCBow6xuaCBz4buxIHBo4buTbiB0aOG7i25oIGPhu6dhIG3hu5l0IHF14buRYyBnaWEuICJBaSBjw7MgdHJpIHRo4bupYyBuZ8aw4budaSDEkcOzIGPDsyBz4bupYyBt4bqhbmgiIHbDrCB24bqteSwga2jDtG5nIGNo4buJIDYgcXXhu5FjIGdpYSB0cm9uZyBraHUgduG7sWMgY2jDonUgw4EgxJHGsOG7o2MgbmdoacOqbiBj4bupdSB0csaw4bubYyDEkcOzLCBtw6AgbeG7jWkgcXXhu5FjIGdpYSwga2jDtG5nIHBo4bulIHRodeG7mWMgdsOgbyBnaeG7m2kgdMOtbmggaGF5IMSR4buZIHR14buVaSwgxJHhu4F1IGPhuqduIHBo4bqjaSDEkeG6t3QgxrB1IHRpw6puIGNhbyB2w6AgxJHhuqd1IHTGsCBt4bqhbmggbeG6vSB2w6BvIGzEqW5oIHbhu7FjIGdpw6FvIGThu6VjLg0KDQpRdWFuIHRy4buNbmcgbMOgIGtow7RuZyDEkeG7gyBuaOG7r25nIHbhuqVuIMSR4buBIG5oxrAgbOG6oW0gcGjDoXQgaGF5IHRow6BuaCB0w61jaCDhuqNvIHh14bqldCBoaeG7h24gdHJvbmcgaOG7hyB0aOG7kW5nIGdpw6FvIGThu6VjLiBD4bqnbiBsdcO0biB0w7RuIHRy4buNbmcgdsOgIMSRw6FuaCBnacOhIGNhbyBuaOG7r25nIG5nxrDhu51pIHTDoGkgbsSDbmcsIGdpw7pwIGjhu40gcGjDoXQgaHV5IHThu5FpIMSRYSBraOG6oyBuxINuZyB2w6AgdOG7qyDEkcOzIGdp4bqjbSB0aGnhu4N1IHThu7cgbOG7hyB0aOG6pXQgbmdoaeG7h3AuIFZp4buHYyBuw6B5IGtow7RuZyBjaOG7iSB04bqhbyDEkWnhu4F1IGtp4buHbiB0aHXhuq1uIGzhu6NpIGNobyBz4buxIHBow6F0IHRyaeG7g24gY8OhIG5ow6JuIG3DoCBjw7JuIMSRw7NuZyBnw7NwIHTDrWNoIGPhu7FjIHbDoG8gc+G7sSB0aOG7i25oIHbGsOG7o25nIGPhu6dhIGPhuqMgeMOjIGjhu5lpLg==