NHIỆM VỤ 3.1
Đọc bộ dữ liệu từ
file CVS
data <- read.csv(file.choose(), header = T)
data
Giải thích bộ dữ
liệu
Là một dataframe
Không có dữ liệu trống
Không có dữ liệu trùng lắp
Dữ liệu về dân số của các quốc gia trên thế giới được phân tích
theo các năm và các độ tuổi
Dữ liệu gồm 18288 quan sát và 24 biến
Counry.name: tên của các quốc gia
Year: năm thông kê
Population: dân số của quốc gia trong một năm
Population.of.children.under.the.age.of.1: dân số trẻ em có độ
tuổi dưới 1
Population.of.children.under.the.age.of.5: dân số trẻ em có độ
tuổi dưới 5
Population.of.children.under.the.age.of.15: dân số trẻ em có độ
tuổi dưới 15
Population.under.the.age.of.25: dân số người có độ tuổi dưới
25
Population.aged.15.to.64.year: dân số người có độ tuổi từ 15 đến
64
Population.older.than.15.years: dấn số người có độ tuổi lớn hơn
15
Population.older.than.18.years: dân số người có độ tuổi lớn hơn
18
Population.at.age.1: dân số người có độ tuổi là 1
Population.aged.1.to.4.years: dân số người có độ tuổi từ 1 đến
4
Population.aged.5.to.9.years: dân số người có độ tuổi từ 5 đến
9
Population.aged.10.to.14.years: dân số người có độ tuổi từ 10 đến
14
Population.aged.15.to.19.years: dân số người có độ tuổi từ 15 đến
19
Population.aged.20.to.29.years: dân số người có độ tuổi từ 20 đến
29
Population.aged.30.to.39.years: dân số người có độ tuổi từ 30 đến
39
Population.aged.40.to.49.years: dân số người có độ tuổi từ 40 đến
49
Population.aged.50.to.59.years: dân số người có độ tuổi từ 50 đến
59
Population.aged.60.to.69.years: dân số người có độ tuổi từ 60 đến
69
Population.aged.70.to.79.years: dân số người có độ tuổi từ 70 đến
79
Population.aged.80.to.89.years: dân số người có độ tuổi từ 80 đến
89
Population.aged.90.to.99.years: dân số người có độ tuổi từ 90 đến
99
Population.older.than.100.years: dân số người có độ tuổi lớn hơn
100
str(data)
## '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 ...
18288 observations tương ứng với 18288 quan sát (là các hàng).
24 variables tương ứng với 24 biến (là các cột).
is.na(data) # Sử dụng is.na để kiểm tra NA. Giá trị 'TRUE' phần tử tương ứng là NA và 'FALSE' là không phải NA.
‘NA’ là một giá trị đặc biệt, đại diện cho “Not Available” dữ liệu
hoặc giá trị không xác định hoặc không có sẵn.
sum(is.na(data)) # Được sử dụng để đếm số lượng giá trị NA trong một đối tượng dữ liệu.
## [1] 0
Kết quả 0 có nghĩa bộ dữ liệu không có NA.
duplicated(data) # Dùng xác định xem có sự trùng lặp nào trong data frame hay không.
Giá trị TRUE tương ứng với các hàng trong data frame là trùng lặp và
FALSE nếu không trùng lặp.
sum(duplicated(data)) # Đếm số lượng trùng lặp
## [1] 0
Kết quả 0 có nghĩa bộ dữ liệu không trùng lặp.
Tạo dataframe mới để
phân tích
names(data) <- c('ct', 'y', 'p','under.1', 'under.5', 'under.15','under.25','from.15.to.64','above.15', 'above.18','one.year.old','from.1.to.4','from.5.to.9','from.10.to.14','from.15.to.19','from.20.to.29','from.30.to.39','from.40.to.49','from.50.to.59','from.60.to.69','from.70.to.79','from.80.to.89','from.90.to.99','above.100') # Việc đổi tên các biến giúp dữ liệu được ngắn gọn hơn, tránh được các nhầm lẫn.
names(data)
## [1] "ct" "y" "p" "under.1"
## [5] "under.5" "under.15" "under.25" "from.15.to.64"
## [9] "above.15" "above.18" "one.year.old" "from.1.to.4"
## [13] "from.5.to.9" "from.10.to.14" "from.15.to.19" "from.20.to.29"
## [17] "from.30.to.39" "from.40.to.49" "from.50.to.59" "from.60.to.69"
## [21] "from.70.to.79" "from.80.to.89" "from.90.to.99" "above.100"
Việc đổi tên còn được thực hiện bởi lệnh rename() trong packages
tidyverse. Điểm khác nhau giữa hai lệnh này là names() thực hiện đổi tên
cho tất cả các biến và rename() dành cho việc đặt tên bất kì biến
nào.
- Chọn dữ liệu để phân tích
library(tidyverse) # rút trích dữ liệu thông qua package 'tydyverse' để dùng 'select' và 'filter'
## ── 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
d <- filter(data,ct %in% c('Vietnam','Thailand','China', 'South Korea', 'Japan')) # 'filter' được sử dụng để chọn các quan sát trong dataframe.
d <- select(d,ct,y,p,under.1,under.5,from.15.to.64,one.year.old,above.100) # Sử dụng 'select' để chọn ra các biến.
d
Kết quả trong câu lệnh ‘filter’ nghĩa là chọn các quan sát trong biến
‘ct’ có giá trị tương ứng là ‘Vietnam’, ‘Thailand’, ‘China’, ‘South
Korea’, ‘Japan’.
Ở câu lệnh ‘select’ sẽ trả về một dataframe mới chỉ chứa biến
‘under.1’, ‘under.5’, ‘from.15.to.64’, ‘one.year.old’, ‘above.10’ từ
dataframe vừa tạo ở trên.
Với lệnh ‘filter’ ta lấy ra được 360 quan sát dựa trên dataframe gốc
là ‘data’ và lệnh ‘select’ lấy ra được 8 biến trong datafram mới. Từ đó
ta được một dataframe mới hơn là ‘d’ với 360 quan sát và tương ứng 8
biến.
Mã hóa dữ liệu
- Mã hóa dữu liệu dựa vào tên quốc gia
d$ct.Coded <- ifelse(d$ct == 'Vietnam','Vietnam','Not Vietnam')
‘ifelse’ sẽ kiểm tra điều kiện trong biến ct, nếu trong ct có phần tử
là ‘Vietnam’ thì sẽ trả về ‘Vietnam’, nếu sai điều kiện thì sẽ trả về
‘Not Vietnam’.
- Mã hóa dữ liệu dựa vào số lượng dân số của một nước trong các
năm
d$p.Coded <- case_when(d$p < 70000000 ~ 'Ít',d$p >= 70000000 & d$p <=1000000000 ~ 'Vừa',d$p >1000000000 ~ 'Nhiều') # 'case_when' dùng để thực hiện một loạt các điều kiện và trả về giá trị tương ứng của các điều kiện.
Một cột mới có tên là ‘p.coded’ sẽ được tạo tương ứng với các điều
kiện. Phần tử trong biến sẽ có giá trị là ‘Ít’ nếu quan sát trong biến
‘p’ có giá trị nhỏ hơn 70000000, ‘Vừa’ nếu quan sát trong ‘p’ lớn hơn
bằng 70000000 và nhỏ hơn bằng 1000000000, khi lớn hơn 1000000000 thì
phần tử có giá trị là ‘Nhiều’.
d$under1.Coded <- cut(d$under.1,3,labels = c('Nhóm 1','Nhóm 2','Nhóm 3'))
# Hàm 'cut' được sử dụng để chia dữ liệu thành các khoảng (bins) rồi gán tên cho từng khoảng dựa trên giá trị.
Dữ liệu trong biến ‘under.1’ được chia thành 3 khoảng, và các tên
‘Nhóm 1’, ‘Nhóm 2’, ‘Nhóm 3’ được gán tương ứng với các khoảng đó.
- Mã hóa dữ liệu bằng cách đưa tên các nước về tiếng Việt
d$ct.Coded1 <- recode(d$ct,China ='Trung Quốc', Japan ='Nhật Bản', Vietnam ='Việt Nam', Thailand ='Thái Lan', South.Korea ='Hàn Quốc')
# Hàm 'recode' cho phép thay đổi giá trị của một biến thành giá trị mới dựa trên các quy tắc xác định.
Ở mổi phần tử thuộc biến ‘ct’ có giá trị là ‘China’ thì sẽ được mã
hóa thành ‘Trung Quốc’, tương tự ‘Japan’ sẽ được mã hóa thành ‘Nhật
Bản’,…
d
Qua 4 lệnh mã hóa trên, data frame ‘d’ có tổng cộng là 12 biến và số
quan sát là không đổi với 360 hàng.
Lập bảng tần số
- Xem số lần, số tần suất lặp lại trong một dữ liệu
table(d$ct) # Hàm 'table' được sử dụng để tạo bảng tần suất của các giá trị trong một dữ liệu. Bảng tần suất này cho phép xem xét phân phối của các giá trị và biết được số lần xuất hiện của mỗi giá trị.
##
## China Japan South Korea Thailand Vietnam
## 72 72 72 72 72
Số ‘72’ xuất hiện trong bảng kết quả cho thấy giá trị ‘China’,
‘Japan’, ‘South Korea’, ‘Thailand’ và ‘Vietnam’ được lặp lại hoặc được
xuất hiện 72 lần, tương ứng với 72 năm trong tổng số năm phân tích.
d1 <- filter(d,ct == 'Vietnam') # Dùng lệnh filter để chọn ra các quan sát, để phân tích riêng nước Việt Nam
stem(d1$above.100) # Biểu đồ nhánh và lá là một biểu đồ thường được sử dụng để hiển thị cấu trúc phân cấp của một tập hợp các đối tượng hoặc mẫu.
##
## The decimal point is 3 digit(s) to the right of the |
##
## 0 | 1111111111111111111111122222222233334445566789
## 1 | 012357
## 2 | 02478
## 3 | 01358
## 4 | 1479
## 5 | 1247
## 6 | 04
Lệnh sẽ được phân tích dựa vào điều kiện dấu thập phân là 3 chữ số ở
bên phải. Tương ứng với nhánh là phần số hàng nghìn và lá là phần số
hàng trăm.
Nhánh là gồm các số bên trái dấu ‘|’ và bên phải là lá. Gồm 7 nhánh
là các nhánh các số hàng trăm, 1 nghìn, 2 nghìn,… đến 6 nghìn.
Dễ dàng thấy được ở hàng cuối cùng, có 2 lá nằm trong nhánh 6, nghĩa
là có 2 năm, Việt Nam có dân số ở độ tuổi trên 100 là khoảng 6000 người
và con số tương ứng là 6000 và 6400 (con số đã bao gồm việc làm
tròn).
Tính toán các đặc
trưng đo lường của 5 quốc gia ở độ tuổi từ 15 đến 64
min <- d %>% group_by(ct) %>% summarise(min = min(from.15.to.64), n = n())
min
Trong 72 năm phân tích, dân số thấp nhất trong độ tuổi từ 15 đến 64
lần lượt theo các quốc gia Trung Quốc, Nhật Bản, Hàn Quốc, Thái Lan và
Việt Nam là 327285950, 50380868, 10919575, 11150405 và 15836825.
Tứ phân vị là một khái niệm trong thống kê mô tả để phân chia một tập
dữ liệu thành bốn phần bằng nhau, mỗi phần chiếm 25% tổng số quan
sát.
Q1 <- d %>% group_by(ct) %>% reframe(quantile_1st = quantile(from.15.to.64, probs = c(.25)), n = n())
Q1
Tại điểm này, giá trị chia tập dữ liệu thành 25% giảm dần, nghĩa là
có 25% số liệu bé hơn hoặc bằng Q1 và 75% số liệu lớn hơn Q1.
Nghĩa là tại Trung Quốc, ở độ tuổi này trong các năm, dân số ít hơn
hoặc bằng 427719163 là 25%. Tương tự các nước còn lại.
- Điểm phân vị thứ hai - Trung vị
Q2 <- d %>% group_by(ct) %>% reframe(quantile_2nd = quantile(from.15.to.64, probs = c(.5)), n = n())
Q2
Tứ phân vị thứ hai chính là giá trị trung bình, hoặc median (trung
vị). Là giá trị chia tập dữ liệu thành hai phần bằng nhau, 50% số liệu
bé hơn Q2 và 50% số liệu lớn hơn Q2.
Ở Trung Quốc, qua các năm, một nửa giá trị nhỏ hơn hoặc bằng
686696600 và một nửa giá trị lớn hơn hoặc bằng 686696600. Các nước còn
lại tương tự.
Q3 <- d %>% group_by(ct) %>% reframe(quantile_3rd = quantile(from.15.to.64, probs = c(.75)), n = n())
Q3
Tứ phân vị thứ ba là giá trị chia tập dữ liệu thành 75% giảm dần,
nghĩa là có 75% số liệu bé hơn hoặc bằng Q3 và 25% số liệu lớn hơn
Q3.
Trong độ tuổi từ 15 đến 64, tại Trung Quốc, có 75% dân số bé hơn hoặc
bằng 912309775 hoặc có 25% dân số lớn hơn 912309775. Các nước còn lại
tương tự.
mean <- d %>% group_by(ct) %>% summarise(mean = mean(from.15.to.64), n= n())
mean
Như vậy, trung bình một năm dân số Trung Quốc sẽ có 672094697 người
trong độ tuổi từ 15 đến 64.
Tương tự, trong 72 năm trung bình một năm dân số từ 15 đến 64 tuổi ở
Nhật Bản là 75434732, Hàn Quốc là 25757425, Thái Lan có 31642004 và Việt
Nam có 37136547.
max <- d %>% group_by(ct) %>% summarise(max = max(from.15.to.64), n = n())
max
Trong 72 năm phân tích, dân số cao nhất trong độ tuổi từ 15 đến 64
lần lượt theo các quốc gia Trung Quốc, Nhật Bản, Hàn Quốc, Thái Lan và
Việt Nam là 998226100, 87116616, 37643056, 50431860 và 66962210.
NHIỆM VỤ 3.2
Đọc bộ dữ liệu
nv3 <- read.csv(file.choose(), header = T)
nv3
Giải thích bộ dữ
liệu
Dữ liệu về việc dự báo dân số Hoa Kỳ theo từng độ tuổi từ
2016-2060.
Gồm 2835 quan sát và 106 biến:
Sex: giới tính đang quan sát
Origin: đến từ nơi nào đó
Race: các nhóm chủng tộc và dân tộc
Year: năm dự đoán, từ năm 2016 đến 2060
Total Population: tổng cộng các dân số dự đoán được
Và 101 biến tương ứng với 101 cột với độ tuổi từ 0 đến
100
Là dataframe.
Không có giá trị NA.
Không có dữ liệu bị trùng lắp.
dim(nv3) # Xem tổng số quan sát và tổng số biến
## [1] 2835 106
2835 ứng với 2835 quan sát
106 ứng với 106 biến
is.data.frame(nv3) #Kiểm tra bộ dữ liệu
## [1] TRUE
Kết quả TRUE thể hiện bộ dữ liệu là một dataframe.
is.na(nv3) # Xem bộ dữ liệu có giá trị trống hay không
Kết quả TRUE chỉ tại phần tử đó là một giá trị trống và FALSE khi
không phải giá trị trống.
sum(is.na(nv3)) # Kiểm tra tổng số phần tử có giá trị trống
## [1] 0
Bộ dữ liệu không có giá trị NA.
duplicated(nv3) # Kiểm tra xem sự trùng lặp của dữ liệu
Giá trị TRUE tương ứng với các hàng trong data frame là trùng lặp và
FALSE nếu không trùng lặp.
sum(duplicated(nv3))
## [1] 0
Kết quả trả về 0, bộ dữ liệu không trùng lặp.
Mã hóa dữ liệu
- Mã hóa dữ liệu dựa vào giới tính
nv3$Sex.Coded <- ifelse(nv3$Sex == 'Female','Female','Not Female')
Điều kiện lệnh ở đây là nếu trong biến S có giá trị là ‘Female’ thì
sẽ được mã hóa thành ‘Female’, nếu giá trị khác ‘Female’ (Both hoặc
Male) thì sẽ được mã hóa thành ‘Not Female’.
- Mã hóa giới tính thành các con số
nv3$Sex.Coded1 <- recode(nv3$Sex,Male = '1', Female = '2', Both = '3')
Giới tính sẽ được mã hóa dưới dạng các con số, ở phần tử có giá trị
là ‘Male’ sẽ được mã hóa thành số ‘1’, ‘Female’ thành số ‘2; và ’Both’
là số 3.
- Mã hóa dữ liệu dựa vào số liệu dân số trong độ tuổi 18
nv3$Age.18.Coded <- case_when(nv3$Age.18 < 5000 ~ 'Rất it',nv3$Age.18 >= 5000 & nv3$Age.18 < 10000 ~ 'It',nv3$Age.18 >= 10000 & nv3$Age.18 < 500000 ~ 'Vừa',nv3$Age.18 >= 500000 & nv3$Age.18 < 2000000 ~ 'Nhiều ',nv3$Age.18 >= 2000000 ~ 'Rất nhiều')
Các dân số dự đoán sẽ được mã hóa thành dạng chữ với các điều
kiện.
Bé hơn 5000 -> Rất ít
Từ 5000 đến 10000 -> Ít
Từ 10000 đến 500000 -> Vừa
Từ 500000 đến 2000000 -> Nhiều
Nhiều hơn 2000000 -> Rất nhiều
- Mã hóa dữ liệu theo nhóm dựa vào độ tuổi 20
nv3$Age.20.Coded <- cut(nv3$Age.20,3,labels = c('Nhóm 1','Nhóm 2','Nhóm 3'))
Dữ liệu trong biến ‘Age.20’ được chia thành 3 khoảng, và các tên
‘Nhóm 1’, ‘Nhóm 2’, ‘Nhóm 3’ được gán tương ứng với các khoảng đó.
nv3
Qua 4 lệnh mã hóa trên, data frame ‘nv3’ có tổng cộng là 110 biến và
số quan sát là không đổi với 2835 hàng.
Lập bảng tần số
- Tần số phân tích về giới tính
table(nv3$Sex)
##
## Both Female Male
## 945 945 945
Giới tính nam, nữ và cả hai giới tính đều được dự đoán 945 lần.
nv3.a <- filter(nv3,Race == 'Asian' & Origin == 'Hispanic')
nv3.a
Dùng lệnh filter để chọn ra các quan sát trong biến Race có giá trị
là ‘Asian’ và các giá trị là ‘Hispanic’ trong biến Origin.
stem(nv3.a$Age.60,scale = .5)
##
## The decimal point is 3 digit(s) to the right of the |
##
## 1 | 99
## 2 | 001113334556677788889
## 3 | 0000222333555666677889
## 4 | 00011111112233344444555667777899999
## 5 | 00001111222223334456779
## 6 | 278889
## 7 | 45888
## 8 | 4445568
## 9 | 02778999
## 10 | 123456
Lệnh sẽ được phân tích dựa vào điều kiện dấu thập phân là 3 chữ số ở
bên phải. Tương ứng với nhánh là phần số hàng nghìn và lá là phần số
hàng trăm.
Nhánh là gồm các số bên trái dấu ‘|’ và bên phải là lá. Gồm 10 nhánh
là các nhánh các số hàng 1 nghìn, 2 nghìn,… đến 10 nghìn.
Ở hàng 1 nghìn ta thấy có 2 số, tương ứng có 2 số thuộc hàng 1 nghìn.
Các con số là 1900 và 1900 (các số đã được làm tròn đến hàng đơn vị)
Tương tự ở hàng 6, có 6 số thuộc nhánh 6 nghìn, là các số
6200,6700,6800,6800,6800 và 6900.
Tính toán các đặc
trưng đo lường ở độ tuổi 100 ở Asian qua các năm thuộc giới tính nữ
nv3.b <- filter(nv3.a,Sex %in% c('Female'))
nv3.b
Rút trích dữ liệu để lấy ra dữ liệu chỉ có giới tính nữ.
min1 <- nv3.b %>% group_by(Sex) %>% summarise(min = min(Age.100), n = n())
min1
Trong 45 năm dự đoán, dân số người Asian thuộc giới tính nữ được dự
đoán thấp nhất trong độ tuổi 100 là 27 người.
- Mô tả điểm phân vị thứ nhất
Quantile1 <- nv3.b %>% group_by(Sex) %>% summarise(quantile_1st = quantile(Age.100, probs = c(.25)), n = n())
Quantile1
Tại điểm phân vị thứ nhất thể hiện có 25% thuộc độ tuổi 100 có ít hơn
hoặc bằng 42 người. Hoặc 75% ở tuổi 100 có nhiều hơn 42 người.
- Mô tả điểm phân vị thứ 2 - Trung vị
Quantile2 <- nv3.b %>% group_by(Sex) %>% reframe(quantile_2nd = quantile(Age.100, probs = c(.5)), n = n())
Quantile2
Tại điểm phân vị thứ hai thể hiện một nửa giá trị nhỏ hơn hoặc bằng
85 và một nửa giá trị lớn hơn hoặc bằng 85.
Quantile3 <- nv3.b %>% group_by(Sex) %>% reframe(quantile_3rd = quantile(Age.100, probs = c(.75)), n = n())
Quantile3
Tại điểm phân vị thứ ba thể hiện có 75% thuộc độ tuổi 100 có ít hơn
hoặc bằng 211 người. Hoặc 25% ở tuổi 100 có nhiều hơn 211 người.
mean1 <- nv3.b %>% group_by(Sex) %>% summarise(mean = mean(Age.100), n= n())
mean1
Trung bình trong 45 năm, dân số ở độ tuổi 100 của giới nữ là 143
người.
max1 <- nv3.b %>% group_by(Sex) %>% summarise(max = max(Age.100), n = n())
max1
Trong 45 năm dự đoán, dân số được dự đoán cao nhất nằm trong tuổi 100
ở giới nữ là 477 người.
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAzIg0KYXV0aG9yOiAiTmd1eeG7hW4gVGjDunkgVnkiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHRydWUNCiAgICB0aGVtZTogdW5pdGVkDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdyANCiAgICBkZl9wcmludDogcGFnZWQNCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgTkhJ4buGTSBW4bukIDMuMQ0KDQojIyDEkOG7jWMgYuG7mSBk4buvIGxp4buHdSB04burIGZpbGUgQ1ZTDQoNCmBgYHtyfQ0KZGF0YSA8LSByZWFkLmNzdihmaWxlLmNob29zZSgpLCBoZWFkZXIgPSBUKQ0KZGF0YQ0KYGBgDQoNCiMjIEdp4bqjaSB0aMOtY2ggYuG7mSBk4buvIGxp4buHdSANCg0KLSBMw6AgbeG7mXQgZGF0YWZyYW1lDQoNCi0gS2jDtG5nIGPDsyBk4buvIGxp4buHdSB0cuG7kW5nDQoNCi0gS2jDtG5nIGPDsyBk4buvIGxp4buHdSB0csO5bmcgbOG6r3ANCg0KLSBE4buvIGxp4buHdSB24buBIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgdHLDqm4gdGjhur8gZ2nhu5tpIMSRxrDhu6NjIHBow6JuIHTDrWNoIHRoZW8gY8OhYyBuxINtIHbDoCBjw6FjIMSR4buZIHR14buVaQ0KDQotIEThu68gbGnhu4d1IGfhu5NtIDE4Mjg4IHF1YW4gc8OhdCB2w6AgMjQgYmnhur9uDQoNCiAgLSBDb3VucnkubmFtZTogdMOqbiBj4bunYSBjw6FjIHF14buRYyBnaWENCg0KICAtIFllYXI6IG7Eg20gdGjDtG5nIGvDqg0KDQogIC0gUG9wdWxhdGlvbjogZMOibiBz4buRIGPhu6dhIHF14buRYyBnaWEgdHJvbmcgbeG7mXQgbsSDbQ0KDQogIC0gUG9wdWxhdGlvbi5vZi5jaGlsZHJlbi51bmRlci50aGUuYWdlLm9mLjE6IGTDom4gc+G7kSB0cuG6uyBlbSBjw7MgxJHhu5kgdHXhu5VpIGTGsOG7m2kgMQ0KDQogIC0gUG9wdWxhdGlvbi5vZi5jaGlsZHJlbi51bmRlci50aGUuYWdlLm9mLjU6IGTDom4gc+G7kSB0cuG6uyBlbSBjw7MgxJHhu5kgdHXhu5VpIGTGsOG7m2kgNQ0KDQogIC0gUG9wdWxhdGlvbi5vZi5jaGlsZHJlbi51bmRlci50aGUuYWdlLm9mLjE1OiBkw6JuIHPhu5EgdHLhursgZW0gY8OzIMSR4buZIHR14buVaSBkxrDhu5tpIDE1DQoNCiAgLSBQb3B1bGF0aW9uLnVuZGVyLnRoZS5hZ2Uub2YuMjU6IGTDom4gc+G7kSBuZ8aw4budaSBjw7MgxJHhu5kgdHXhu5VpIGTGsOG7m2kgMjUNCg0KICAtIFBvcHVsYXRpb24uYWdlZC4xNS50by42NC55ZWFyOiBkw6JuIHPhu5EgbmfGsOG7nWkgY8OzIMSR4buZIHR14buVaSB04burIDE1IMSR4bq/biA2NA0KDQogIC0gUG9wdWxhdGlvbi5vbGRlci50aGFuLjE1LnllYXJzOiBk4bqlbiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgbOG7m24gaMahbiAxNQ0KDQogIC0gUG9wdWxhdGlvbi5vbGRlci50aGFuLjE4LnllYXJzOiBkw6JuIHPhu5EgbmfGsOG7nWkgY8OzIMSR4buZIHR14buVaSBs4bubbiBoxqFuIDE4DQoNCiAgLSBQb3B1bGF0aW9uLmF0LmFnZS4xOiBkw6JuIHPhu5EgbmfGsOG7nWkgY8OzIMSR4buZIHR14buVaSBsw6AgMQ0KDQogIC0gUG9wdWxhdGlvbi5hZ2VkLjEudG8uNC55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAxIMSR4bq/biA0DQoNCiAgLSBQb3B1bGF0aW9uLmFnZWQuNS50by45LnllYXJzOiBkw6JuIHPhu5EgbmfGsOG7nWkgY8OzIMSR4buZIHR14buVaSB04burIDUgxJHhur9uIDkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC4xMC50by4xNC55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAxMCDEkeG6v24gMTQNCg0KICAtIFBvcHVsYXRpb24uYWdlZC4xNS50by4xOS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAxNSDEkeG6v24gMTkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC4yMC50by4yOS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAyMCDEkeG6v24gMjkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC4zMC50by4zOS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAzMCDEkeG6v24gMzkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC40MC50by40OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA0MCDEkeG6v24gNDkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC41MC50by41OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA1MCDEkeG6v24gNTkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC42MC50by42OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA2MCDEkeG6v24gNjkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC43MC50by43OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA3MCDEkeG6v24gNzkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC44MC50by44OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA4MCDEkeG6v24gODkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC45MC50by45OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA5MCDEkeG6v24gOTkNCg0KICAtIFBvcHVsYXRpb24ub2xkZXIudGhhbi4xMDAueWVhcnM6IGTDom4gc+G7kSBuZ8aw4budaSBjw7MgxJHhu5kgdHXhu5VpIGzhu5tuIGjGoW4gMTAwDQoNCg0KYGBge3J9DQpzdHIoZGF0YSkNCmBgYA0KDQoxODI4OCBvYnNlcnZhdGlvbnMgdMawxqFuZyDhu6luZyB24bubaSAxODI4OCBxdWFuIHPDoXQgKGzDoCBjw6FjIGjDoG5nKS4NCg0KMjQgdmFyaWFibGVzIHTGsMahbmcg4bupbmcgduG7m2kgMjQgYmnhur9uIChsw6AgY8OhYyBj4buZdCkuDQoNCmBgYHtyLGVjaG89VFJVRSwgcmVzdWx0cz0naGlkZSd9DQppcy5uYShkYXRhKSAjIFPhu60gZOG7pW5nIGlzLm5hIMSR4buDIGtp4buDbSB0cmEgTkEuIEdpw6EgdHLhu4sgJ1RSVUUnIHBo4bqnbiB04butIHTGsMahbmcg4bupbmcgbMOgIE5BIHbDoCAnRkFMU0UnIGzDoCBraMO0bmcgcGjhuqNpIE5BLiANCmBgYA0KDQonTkEnIGzDoCBt4buZdCBnacOhIHRy4buLIMSR4bq3YyBiaeG7h3QsIMSR4bqhaSBkaeG7h24gY2hvICJOb3QgQXZhaWxhYmxlIiBk4buvIGxp4buHdSBob+G6t2MgZ2nDoSB0cuG7iyBraMO0bmcgeMOhYyDEkeG7i25oIGhv4bq3YyBraMO0bmcgY8OzIHPhurVuLg0KDQpgYGB7cn0NCnN1bShpcy5uYShkYXRhKSkgIyDEkMaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6v20gc+G7kSBsxrDhu6NuZyBnacOhIHRy4buLIE5BIHRyb25nIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBk4buvIGxp4buHdS4gDQpgYGANCg0KS+G6v3QgcXXhuqMgMCBjw7MgbmdoxKlhIGLhu5kgZOG7ryBsaeG7h3Uga2jDtG5nIGPDsyBOQS4NCg0KYGBge3IsIGVjaG89VFJVRSwgcmVzdWx0cz0naGlkZSd9DQpkdXBsaWNhdGVkKGRhdGEpICMgRMO5bmcgeMOhYyDEkeG7i25oIHhlbSBjw7Mgc+G7sSB0csO5bmcgbOG6t3AgbsOgbyB0cm9uZyBkYXRhIGZyYW1lIGhheSBraMO0bmcuIA0KYGBgDQoNCkdpw6EgdHLhu4sgVFJVRSB0xrDGoW5nIOG7qW5nIHbhu5tpIGPDoWMgaMOgbmcgdHJvbmcgZGF0YSBmcmFtZSBsw6AgdHLDuW5nIGzhurdwIHbDoCBGQUxTRSBu4bq/dSBraMO0bmcgdHLDuW5nIGzhurdwLg0KDQpgYGB7cn0NCnN1bShkdXBsaWNhdGVkKGRhdGEpKSAjIMSQ4bq/bSBz4buRIGzGsOG7o25nIHRyw7luZyBs4bq3cA0KYGBgDQoNCkvhur90IHF14bqjIDAgY8OzIG5naMSpYSBi4buZIGThu68gbGnhu4d1IGtow7RuZyB0csO5bmcgbOG6t3AuDQoNCiMjIFThuqFvIGRhdGFmcmFtZSBt4bubaSDEkeG7gyBwaMOibiB0w61jaA0KDQoqIMSQ4buVaSB0w6puIGPDoWMgYmnhur9uDQoNCmBgYHtyfQ0KbmFtZXMoZGF0YSkgPC0gYygnY3QnLCAneScsICdwJywndW5kZXIuMScsICd1bmRlci41JywgJ3VuZGVyLjE1JywndW5kZXIuMjUnLCdmcm9tLjE1LnRvLjY0JywnYWJvdmUuMTUnLCAnYWJvdmUuMTgnLCdvbmUueWVhci5vbGQnLCdmcm9tLjEudG8uNCcsJ2Zyb20uNS50by45JywnZnJvbS4xMC50by4xNCcsJ2Zyb20uMTUudG8uMTknLCdmcm9tLjIwLnRvLjI5JywnZnJvbS4zMC50by4zOScsJ2Zyb20uNDAudG8uNDknLCdmcm9tLjUwLnRvLjU5JywnZnJvbS42MC50by42OScsJ2Zyb20uNzAudG8uNzknLCdmcm9tLjgwLnRvLjg5JywnZnJvbS45MC50by45OScsJ2Fib3ZlLjEwMCcpICMgVmnhu4djIMSR4buVaSB0w6puIGPDoWMgYmnhur9uIGdpw7pwIGThu68gbGnhu4d1IMSRxrDhu6NjIG5n4bqvbiBn4buNbiBoxqFuLCB0csOhbmggxJHGsOG7o2MgY8OhYyBuaOG6p20gbOG6q24uDQpuYW1lcyhkYXRhKSANCmBgYA0KDQpWaeG7h2MgxJHhu5VpIHTDqm4gY8OybiDEkcaw4bujYyB0aOG7sWMgaGnhu4duIGLhu59pIGzhu4duaCByZW5hbWUoKSB0cm9uZyBwYWNrYWdlcyB0aWR5dmVyc2UuIMSQaeG7g20ga2jDoWMgbmhhdSBnaeG7r2EgaGFpIGzhu4duaCBuw6B5IGzDoCBuYW1lcygpIHRo4buxYyBoaeG7h24gxJHhu5VpIHTDqm4gY2hvIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gdsOgIHJlbmFtZSgpIGTDoG5oIGNobyB2aeG7h2MgxJHhurd0IHTDqm4gYuG6pXQga8OsIGJp4bq/biBuw6BvLg0KDQoqIENo4buNbiBk4buvIGxp4buHdSDEkeG7gyBwaMOibiB0w61jaA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKSAjIHLDunQgdHLDrWNoIGThu68gbGnhu4d1IHRow7RuZyBxdWEgcGFja2FnZSAndHlkeXZlcnNlJyDEkeG7gyBkw7luZyAnc2VsZWN0JyB2w6AgJ2ZpbHRlcicNCmQgPC0gZmlsdGVyKGRhdGEsY3QgJWluJSBjKCdWaWV0bmFtJywnVGhhaWxhbmQnLCdDaGluYScsICdTb3V0aCBLb3JlYScsICdKYXBhbicpKSAjICdmaWx0ZXInIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGNo4buNbiBjw6FjIHF1YW4gc8OhdCB0cm9uZyBkYXRhZnJhbWUuIA0KZCA8LSBzZWxlY3QoZCxjdCx5LHAsdW5kZXIuMSx1bmRlci41LGZyb20uMTUudG8uNjQsb25lLnllYXIub2xkLGFib3ZlLjEwMCkgIyBT4butIGThu6VuZyAnc2VsZWN0JyDEkeG7gyBjaOG7jW4gcmEgY8OhYyBiaeG6v24uIA0KZA0KYGBgIA0KDQpL4bq/dCBxdeG6oyB0cm9uZyBjw6J1IGzhu4duaCAnZmlsdGVyJyBuZ2jEqWEgbMOgIGNo4buNbiBjw6FjIHF1YW4gc8OhdCB0cm9uZyBiaeG6v24gJ2N0JyBjw7MgZ2nDoSB0cuG7iyB0xrDGoW5nIOG7qW5nIGzDoCAnVmlldG5hbScsICdUaGFpbGFuZCcsICdDaGluYScsICAnU291dGggS29yZWEnLCAnSmFwYW4nLg0KDQrhu54gY8OidSBs4buHbmggJ3NlbGVjdCcgc+G6vSB0cuG6oyB24buBIG3hu5l0IGRhdGFmcmFtZSBt4bubaSBjaOG7iSBjaOG7qWEgYmnhur9uICd1bmRlci4xJywgJ3VuZGVyLjUnLCAnZnJvbS4xNS50by42NCcsICdvbmUueWVhci5vbGQnLCAnYWJvdmUuMTAnIHThu6sgZGF0YWZyYW1lIHbhu6thIHThuqFvIOG7nyB0csOqbi4NCg0KVuG7m2kgbOG7h25oICdmaWx0ZXInIHRhIGzhuqV5IHJhIMSRxrDhu6NjIDM2MCBxdWFuIHPDoXQgZOG7sWEgdHLDqm4gZGF0YWZyYW1lIGfhu5FjIGzDoCAnZGF0YScgdsOgIGzhu4duaCAnc2VsZWN0JyBs4bqleSByYSDEkcaw4bujYyA4IGJp4bq/biB0cm9uZyBkYXRhZnJhbSBt4bubaS4gVOG7qyDEkcOzIHRhIMSRxrDhu6NjIG3hu5l0IGRhdGFmcmFtZSBt4bubaSBoxqFuIGzDoCAnZCcgduG7m2kgMzYwIHF1YW4gc8OhdCB2w6AgdMawxqFuZyDhu6luZyA4IGJp4bq/bi4NCg0KIyMgTcOjIGjDs2EgZOG7ryBsaeG7h3UgDQoNCiogTcOjIGjDs2EgZOG7r3UgbGnhu4d1IGThu7FhIHbDoG8gdMOqbiBxdeG7kWMgZ2lhDQoNCmBgYHtyfQ0KZCRjdC5Db2RlZCA8LSBpZmVsc2UoZCRjdCA9PSAnVmlldG5hbScsJ1ZpZXRuYW0nLCdOb3QgVmlldG5hbScpIA0KYGBgDQoNCidpZmVsc2UnIHPhur0ga2nhu4NtIHRyYSDEkWnhu4F1IGtp4buHbiB0cm9uZyBiaeG6v24gY3QsIG7hur91IHRyb25nIGN0IGPDsyBwaOG6p24gdOG7rSBsw6AgJ1ZpZXRuYW0nIHRow6wgc+G6vSB0cuG6oyB24buBICdWaWV0bmFtJywgbuG6v3Ugc2FpIMSRaeG7gXUga2nhu4duIHRow6wgc+G6vSB0cuG6oyB24buBICdOb3QgVmlldG5hbScuDQoNCiogTcOjIGjDs2EgZOG7ryBsaeG7h3UgZOG7sWEgdsOgbyBz4buRIGzGsOG7o25nIGTDom4gc+G7kSBj4bunYSBt4buZdCBuxrDhu5tjIHRyb25nIGPDoWMgbsSDbSANCg0KYGBge3J9DQpkJHAuQ29kZWQgPC0gY2FzZV93aGVuKGQkcCA8IDcwMDAwMDAwIH4gJ8ONdCcsZCRwID49IDcwMDAwMDAwICYgZCRwIDw9MTAwMDAwMDAwMCB+ICdW4burYScsZCRwID4xMDAwMDAwMDAwIH4gJ05oaeG7gXUnKSAjICdjYXNlX3doZW4nIGTDuW5nIMSR4buDIHRo4buxYyBoaeG7h24gbeG7mXQgbG/huqF0IGPDoWMgxJFp4buBdSBraeG7h24gdsOgIHRy4bqjIHbhu4EgZ2nDoSB0cuG7iyB0xrDGoW5nIOG7qW5nIGPhu6dhIGPDoWMgxJFp4buBdSBraeG7h24uDQpgYGANCg0KTeG7mXQgY+G7mXQgbeG7m2kgY8OzIHTDqm4gbMOgICdwLmNvZGVkJyBz4bq9IMSRxrDhu6NjIHThuqFvIHTGsMahbmcg4bupbmcgduG7m2kgY8OhYyDEkWnhu4F1IGtp4buHbi4gUGjhuqduIHThu60gdHJvbmcgYmnhur9uIHPhur0gY8OzIGdpw6EgdHLhu4sgbMOgICfDjXQnIG7hur91IHF1YW4gc8OhdCB0cm9uZyBiaeG6v24gJ3AnIGPDsyBnacOhIHRy4buLIG5o4buPIGjGoW4gNzAwMDAwMDAsICdW4burYScgbuG6v3UgcXVhbiBzw6F0IHRyb25nICdwJyBs4bubbiBoxqFuIGLhurFuZyA3MDAwMDAwMCB2w6Agbmjhu48gaMahbiBi4bqxbmcgMTAwMDAwMDAwMCwga2hpIGzhu5tuIGjGoW4gMTAwMDAwMDAwMCB0aMOsIHBo4bqnbiB04butIGPDsyBnacOhIHRy4buLIGzDoCAnTmhp4buBdScuDQogDQoqIFBow6JuIGNoaWEgZOG7ryBsaeG7h3UNCg0KYGBge3J9DQpkJHVuZGVyMS5Db2RlZCA8LSBjdXQoZCR1bmRlci4xLDMsbGFiZWxzID0gYygnTmjDs20gMScsJ05ow7NtIDInLCdOaMOzbSAzJykpIA0KIyBIw6BtICdjdXQnIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGNoaWEgZOG7ryBsaeG7h3UgdGjDoG5oIGPDoWMga2hv4bqjbmcgKGJpbnMpIHLhu5NpIGfDoW4gdMOqbiBjaG8gdOG7q25nIGtob+G6o25nIGThu7FhIHRyw6puIGdpw6EgdHLhu4suDQpgYGANCg0KROG7ryBsaeG7h3UgdHJvbmcgYmnhur9uICd1bmRlci4xJyDEkcaw4bujYyBjaGlhIHRow6BuaCAzIGtob+G6o25nLCB2w6AgY8OhYyB0w6puICdOaMOzbSAxJywgJ05ow7NtIDInLCAnTmjDs20gMycgxJHGsOG7o2MgZ8OhbiB0xrDGoW5nIOG7qW5nIHbhu5tpIGPDoWMga2hv4bqjbmcgxJHDsy4NCiANCiogTcOjIGjDs2EgZOG7ryBsaeG7h3UgYuG6sW5nIGPDoWNoIMSRxrBhIHTDqm4gY8OhYyBuxrDhu5tjIHbhu4EgdGnhur9uZyBWaeG7h3QNCg0KYGBge3J9DQpkJGN0LkNvZGVkMSA8LSByZWNvZGUoZCRjdCxDaGluYSA9J1RydW5nIFF14buRYycsIEphcGFuID0nTmjhuq10IELhuqNuJywgVmlldG5hbSA9J1Zp4buHdCBOYW0nLCBUaGFpbGFuZCA9J1Row6FpIExhbicsIFNvdXRoLktvcmVhID0nSMOgbiBRdeG7kWMnKQ0KIyBIw6BtICdyZWNvZGUnIGNobyBwaMOpcCB0aGF5IMSR4buVaSBnacOhIHRy4buLIGPhu6dhIG3hu5l0IGJp4bq/biB0aMOgbmggZ2nDoSB0cuG7iyBt4bubaSBk4buxYSB0csOqbiBjw6FjIHF1eSB04bqvYyB4w6FjIMSR4buLbmguIA0KYGBgDQoNCuG7niBt4buVaSBwaOG6p24gdOG7rSB0aHXhu5ljIGJp4bq/biAnY3QnIGPDsyBnacOhIHRy4buLIGzDoCAnQ2hpbmEnIHRow6wgc+G6vSDEkcaw4bujYyBtw6MgaMOzYSB0aMOgbmggJ1RydW5nIFF14buRYycsIHTGsMahbmcgdOG7sSAnSmFwYW4nIHPhur0gxJHGsOG7o2MgbcOjIGjDs2EgdGjDoG5oICdOaOG6rXQgQuG6o24nLC4uLiANCg0KYGBge3J9DQpkIA0KYGBgDQoNClF1YSA0IGzhu4duaCBtw6MgaMOzYSB0csOqbiwgZGF0YSBmcmFtZSAnZCcgY8OzIHThu5VuZyBj4buZbmcgbMOgIDEyIGJp4bq/biB2w6Agc+G7kSBxdWFuIHPDoXQgbMOgIGtow7RuZyDEkeG7lWkgduG7m2kgMzYwIGjDoG5nLg0KDQojIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kQ0KDQoqIFhlbSBz4buRIGzhuqduLCBz4buRIHThuqduIHN14bqldCBs4bq3cCBs4bqhaSB0cm9uZyBt4buZdCBk4buvIGxp4buHdSANCg0KYGBge3J9DQp0YWJsZShkJGN0KSAjIEjDoG0gJ3RhYmxlJyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBt4buZdCBk4buvIGxp4buHdS4gQuG6o25nIHThuqduIHN14bqldCBuw6B5IGNobyBwaMOpcCB4ZW0geMOpdCBwaMOibiBwaOG7kWkgY+G7p2EgY8OhYyBnacOhIHRy4buLIHbDoCBiaeG6v3QgxJHGsOG7o2Mgc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIG3hu5dpIGdpw6EgdHLhu4suDQpgYGANCg0KU+G7kSAnNzInIHh14bqldCBoaeG7h24gdHJvbmcgYuG6o25nIGvhur90IHF14bqjIGNobyB0aOG6pXkgZ2nDoSB0cuG7iyAnQ2hpbmEnLCAnSmFwYW4nLCAnU291dGggS29yZWEnLCAnVGhhaWxhbmQnIHbDoCAnVmlldG5hbScgxJHGsOG7o2MgbOG6t3AgbOG6oWkgaG/hurdjIMSRxrDhu6NjIHh14bqldCBoaeG7h24gNzIgbOG6p24sIHTGsMahbmcg4bupbmcgduG7m2kgNzIgbsSDbSB0cm9uZyB04buVbmcgc+G7kSBuxINtIHBow6JuIHTDrWNoLg0KDQoqIEzhuq1wIGJp4buDdSDEkeG7kyBuaMOhbmggdsOgIGzDoQ0KDQpgYGB7cn0NCmQxIDwtIGZpbHRlcihkLGN0ID09ICdWaWV0bmFtJykgIyBEw7luZyBs4buHbmggZmlsdGVyIMSR4buDIGNo4buNbiByYSBjw6FjIHF1YW4gc8OhdCwgxJHhu4MgcGjDom4gdMOtY2ggcmnDqm5nIG7GsOG7m2MgVmnhu4d0IE5hbQ0Kc3RlbShkMSRhYm92ZS4xMDApICMgQmnhu4N1IMSR4buTIG5ow6FuaCB2w6AgbMOhIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgdGjGsOG7nW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGhp4buDbiB0aOG7iyBj4bqldSB0csO6YyBwaMOibiBj4bqlcCBj4bunYSBt4buZdCB04bqtcCBo4bujcCBjw6FjIMSR4buRaSB0xrDhu6NuZyBob+G6t2MgbeG6q3UuIA0KYGBgDQoNCkzhu4duaCBz4bq9IMSRxrDhu6NjIHBow6JuIHTDrWNoIGThu7FhIHbDoG8gxJFp4buBdSBraeG7h24gZOG6pXUgdGjhuq1wIHBow6JuIGzDoCAzIGNo4buvIHPhu5Eg4bufIGLDqm4gcGjhuqNpLiBUxrDGoW5nIOG7qW5nIHbhu5tpIG5ow6FuaCBsw6AgcGjhuqduIHPhu5EgaMOgbmcgbmdow6xuIHbDoCBsw6EgbMOgIHBo4bqnbiBz4buRIGjDoG5nIHRyxINtLg0KDQpOaMOhbmggbMOgIGfhu5NtIGPDoWMgc+G7kSBiw6puIHRyw6FpIGThuqV1ICd8JyB2w6AgYsOqbiBwaOG6o2kgbMOgIGzDoS4gR+G7k20gNyBuaMOhbmggbMOgIGPDoWMgbmjDoW5oIGPDoWMgc+G7kSBow6BuZyB0csSDbSwgMSBuZ2jDrG4sIDIgbmdow6xuLC4uLiDEkeG6v24gNiBuZ2jDrG4uDQoNCkThu4UgZMOgbmcgdGjhuqV5IMSRxrDhu6NjIOG7nyBow6BuZyBjdeG7kWkgY8O5bmcsIGPDsyAyIGzDoSBu4bqxbSB0cm9uZyBuaMOhbmggNiwgbmdoxKlhIGzDoCBjw7MgMiBuxINtLCBWaeG7h3QgTmFtIGPDsyBkw6JuIHPhu5Eg4bufIMSR4buZIHR14buVaSB0csOqbiAxMDAgbMOgIGtob+G6o25nIDYwMDAgbmfGsOG7nWkgdsOgIGNvbiBz4buRIHTGsMahbmcg4bupbmcgbMOgIDYwMDAgdsOgIDY0MDAgKGNvbiBz4buRIMSRw6MgYmFvIGfhu5NtICB2aeG7h2MgbMOgbSB0csOybikuIA0KDQojIyBUw61uaCB0b8OhbiBjw6FjIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIGPhu6dhIDUgcXXhu5FjIGdpYSDhu58gxJHhu5kgdHXhu5VpIHThu6sgMTUgxJHhur9uIDY0DQoNCiogTcO0IHThuqMgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQgDQoNCmBgYHtyfQ0KbWluIDwtIGQgJT4lIGdyb3VwX2J5KGN0KSAlPiUgc3VtbWFyaXNlKG1pbiA9IG1pbihmcm9tLjE1LnRvLjY0KSwgbiA9IG4oKSkNCm1pbg0KYGBgDQoNClRyb25nIDcyIG7Eg20gcGjDom4gdMOtY2gsIGTDom4gc+G7kSB0aOG6pXAgbmjhuqV0IHRyb25nIMSR4buZIHR14buVaSB04burIDE1IMSR4bq/biA2NCBs4bqnbiBsxrDhu6N0IHRoZW8gY8OhYyBxdeG7kWMgZ2lhIFRydW5nIFF14buRYywgTmjhuq10IELhuqNuLCBIw6BuIFF14buRYywgVGjDoWkgTGFuIHbDoCBWaeG7h3QgTmFtIGzDoCAzMjcyODU5NTAsIDUwMzgwODY4LCAxMDkxOTU3NSwgMTExNTA0MDUgdsOgIDE1ODM2ODI1Lg0KDQoqIE3DtCB04bqjIHThu6kgcGjDom4gduG7iyANCg0KVOG7qSBwaMOibiB24buLIGzDoCBt4buZdCBraMOhaSBuaeG7h20gdHJvbmcgdGjhu5FuZyBrw6ogbcO0IHThuqMgxJHhu4MgcGjDom4gY2hpYSBt4buZdCB04bqtcCBk4buvIGxp4buHdSB0aMOgbmggYuG7kW4gcGjhuqduIGLhurFuZyBuaGF1LCBt4buXaSBwaOG6p24gY2hp4bq/bSAyNSUgdOG7lW5nIHPhu5EgcXVhbiBzw6F0LiANCg0KICAqIMSQaeG7g20gcGjDom4gduG7iyB0aOG7qSBuaOG6pXQNCiAgDQpgYGB7cn0NClExIDwtIGQgJT4lIGdyb3VwX2J5KGN0KSAlPiUgcmVmcmFtZShxdWFudGlsZV8xc3QgPSBxdWFudGlsZShmcm9tLjE1LnRvLjY0LCBwcm9icyA9IGMoLjI1KSksIG4gPSBuKCkpDQpRMQ0KYGBgDQoNClThuqFpIMSRaeG7g20gbsOgeSwgZ2nDoSB0cuG7iyBjaGlhIHThuq1wIGThu68gbGnhu4d1IHRow6BuaCAyNSUgZ2nhuqNtIGThuqduLCBuZ2jEqWEgbMOgIGPDsyAyNSUgc+G7kSBsaeG7h3UgYsOpIGjGoW4gaG/hurdjIGLhurFuZyBRMSB2w6AgNzUlIHPhu5EgbGnhu4d1IGzhu5tuIGjGoW4gUTEuDQoNCk5naMSpYSBsw6AgdOG6oWkgVHJ1bmcgUXXhu5FjLCDhu58gxJHhu5kgdHXhu5VpIG7DoHkgdHJvbmcgY8OhYyBuxINtLCBkw6JuIHPhu5Egw610IGjGoW4gaG/hurdjIGLhurFuZyA0Mjc3MTkxNjMgbMOgIDI1JS4gVMawxqFuZyB04buxIGPDoWMgbsaw4bubYyBjw7JuIGzhuqFpLg0KDQogICAqIMSQaeG7g20gcGjDom4gduG7iyB0aOG7qSBoYWkgLSBUcnVuZyB24buLIA0KDQpgYGB7cn0NClEyIDwtIGQgJT4lIGdyb3VwX2J5KGN0KSAlPiUgcmVmcmFtZShxdWFudGlsZV8ybmQgPSBxdWFudGlsZShmcm9tLjE1LnRvLjY0LCBwcm9icyA9IGMoLjUpKSwgbiA9IG4oKSkNClEyDQpgYGANCg0KVOG7qSBwaMOibiB24buLIHRo4bupIGhhaSBjaMOtbmggbMOgIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgsIGhv4bq3YyBtZWRpYW4gKHRydW5nIHbhu4spLiBMw6AgZ2nDoSB0cuG7iyBjaGlhIHThuq1wIGThu68gbGnhu4d1IHRow6BuaCBoYWkgcGjhuqduIGLhurFuZyBuaGF1LCA1MCUgc+G7kSBsaeG7h3UgYsOpIGjGoW4gUTIgdsOgIDUwJSBz4buRIGxp4buHdSBs4bubbiBoxqFuIFEyLg0KDQrhu54gVHJ1bmcgUXXhu5FjLCBxdWEgY8OhYyBuxINtLCBt4buZdCBu4butYSBnacOhIHRy4buLIG5o4buPIGjGoW4gaG/hurdjIGLhurFuZyA2ODY2OTY2MDAgdsOgIG3hu5l0IG7hu61hIGdpw6EgdHLhu4sgbOG7m24gaMahbiBob+G6t2MgYuG6sW5nIDY4NjY5NjYwMC4gQ8OhYyBuxrDhu5tjIGPDsm4gbOG6oWkgdMawxqFuZyB04buxLg0KDQogICogxJBp4buDbSBwaMOibiB24buLIHRo4bupIDMNCg0KYGBge3J9DQpRMyA8LSBkICU+JSBncm91cF9ieShjdCkgJT4lIHJlZnJhbWUocXVhbnRpbGVfM3JkID0gcXVhbnRpbGUoZnJvbS4xNS50by42NCwgcHJvYnMgPSBjKC43NSkpLCBuID0gbigpKQ0KUTMNCmBgYA0KDQpU4bupIHBow6JuIHbhu4sgdGjhu6kgYmEgbMOgIGdpw6EgdHLhu4sgY2hpYSB04bqtcCBk4buvIGxp4buHdSB0aMOgbmggNzUlIGdp4bqjbSBk4bqnbiwgbmdoxKlhIGzDoCBjw7MgNzUlIHPhu5EgbGnhu4d1IGLDqSBoxqFuIGhv4bq3YyBi4bqxbmcgUTMgdsOgIDI1JSBz4buRIGxp4buHdSBs4bubbiBoxqFuIFEzLg0KDQpUcm9uZyDEkeG7mSB0deG7lWkgdOG7qyAxNSDEkeG6v24gNjQsIHThuqFpIFRydW5nIFF14buRYywgY8OzIDc1JSBkw6JuIHPhu5EgYsOpIGjGoW4gaG/hurdjIGLhurFuZyA5MTIzMDk3NzUgaG/hurdjIGPDsyAyNSUgZMOibiBz4buRIGzhu5tuIGjGoW4gOTEyMzA5Nzc1LiBDw6FjIG7GsOG7m2MgY8OybiBs4bqhaSB0xrDGoW5nIHThu7EuDQoNCiogTcO0IHThuqMgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaA0KDQpgYGB7cn0NCm1lYW4gPC0gZCAlPiUgZ3JvdXBfYnkoY3QpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4oZnJvbS4xNS50by42NCksIG49IG4oKSkNCm1lYW4NCmBgYA0KIA0KTmjGsCB24bqteSwgdHJ1bmcgYsOsbmggbeG7mXQgbsSDbSBkw6JuIHPhu5EgVHJ1bmcgUXXhu5FjIHPhur0gY8OzIDY3MjA5NDY5NyBuZ8aw4budaSB0cm9uZyDEkeG7mSB0deG7lWkgdOG7qyAxNSDEkeG6v24gNjQuDQoNClTGsMahbmcgdOG7sSwgdHJvbmcgNzIgbsSDbSB0cnVuZyBiw6xuaCBt4buZdCBuxINtIGTDom4gc+G7kSB04burIDE1IMSR4bq/biA2NCB0deG7lWkg4bufIE5o4bqtdCBC4bqjbiBsw6AgNzU0MzQ3MzIsIEjDoG4gUXXhu5FjIGzDoCAyNTc1NzQyNSwgVGjDoWkgTGFuIGPDsyAzMTY0MjAwNCB2w6AgVmnhu4d0IE5hbSBjw7MgMzcxMzY1NDcuDQoNCiogTcO0IHThuqMgZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQNCg0KYGBge3J9DQptYXggPC0gZCAlPiUgZ3JvdXBfYnkoY3QpICU+JSBzdW1tYXJpc2UobWF4ID0gbWF4KGZyb20uMTUudG8uNjQpLCBuID0gbigpKQ0KbWF4DQpgYGANCg0KVHJvbmcgNzIgbsSDbSBwaMOibiB0w61jaCwgZMOibiBz4buRIGNhbyBuaOG6pXQgdHJvbmcgxJHhu5kgdHXhu5VpIHThu6sgMTUgxJHhur9uIDY0IGzhuqduIGzGsOG7o3QgdGhlbyBjw6FjIHF14buRYyBnaWEgVHJ1bmcgUXXhu5FjLCBOaOG6rXQgQuG6o24sIEjDoG4gUXXhu5FjLCBUaMOhaSBMYW4gdsOgIFZp4buHdCBOYW0gbMOgIDk5ODIyNjEwMCwgODcxMTY2MTYsIDM3NjQzMDU2LCA1MDQzMTg2MCB2w6AgNjY5NjIyMTAuDQoNCiMgTkhJ4buGTSBW4bukIDMuMg0KDQojIyDEkOG7jWMgYuG7mSBk4buvIGxp4buHdQ0KDQpgYGB7cn0NCm52MyA8LSByZWFkLmNzdihmaWxlLmNob29zZSgpLCBoZWFkZXIgPSBUKQ0KbnYzDQpgYGANCg0KIyMgR2nhuqNpIHRow61jaCBi4buZIGThu68gbGnhu4d1DQoNCi0gROG7ryBsaeG7h3UgduG7gSB2aeG7h2MgZOG7sSBiw6FvIGTDom4gc+G7kSBIb2EgS+G7syB0aGVvIHThu6tuZyDEkeG7mSB0deG7lWkgdOG7qyAyMDE2LTIwNjAuDQoNCi0gR+G7k20gMjgzNSBxdWFuIHPDoXQgdsOgIDEwNiBiaeG6v246DQoNCiAgLSBTZXg6IGdp4bubaSB0w61uaCDEkWFuZyBxdWFuIHPDoXQNCiAgDQogIC0gT3JpZ2luOiDEkeG6v24gdOG7qyBuxqFpIG7DoG8gxJHDsw0KICANCiAgLSBSYWNlOiAgY8OhYyBuaMOzbSBjaOG7p25nIHThu5ljIHbDoCBkw6JuIHThu5ljIA0KICANCiAgLSBZZWFyOiBuxINtIGThu7EgxJFvw6FuLCB04burIG7Eg20gMjAxNiDEkeG6v24gMjA2MA0KICANCiAgLSBUb3RhbCBQb3B1bGF0aW9uOiB04buVbmcgY+G7mW5nIGPDoWMgZMOibiBz4buRIGThu7EgxJFvw6FuIMSRxrDhu6NjDQogIA0KICAtIFbDoCAxMDEgYmnhur9uIHTGsMahbmcg4bupbmcgduG7m2kgMTAxIGPhu5l0IHbhu5tpIMSR4buZIHR14buVaSB04burIDAgxJHhur9uIDEwMA0KICANCi0gTMOgIGRhdGFmcmFtZS4NCg0KLSBLaMO0bmcgY8OzIGdpw6EgdHLhu4sgTkEuDQoNCi0gS2jDtG5nIGPDsyBk4buvIGxp4buHdSBi4buLIHRyw7luZyBs4bqvcC4NCg0KYGBge3J9DQpkaW0obnYzKSAjIFhlbSB04buVbmcgc+G7kSBxdWFuIHPDoXQgdsOgIHThu5VuZyBz4buRIGJp4bq/bg0KYGBgDQoNCjI4MzUg4bupbmcgduG7m2kgMjgzNSBxdWFuIHPDoXQNCg0KMTA2IOG7qW5nIHbhu5tpIDEwNiBiaeG6v24NCg0KYGBge3J9DQppcy5kYXRhLmZyYW1lKG52MykgI0tp4buDbSB0cmEgYuG7mSBk4buvIGxp4buHdQ0KYGBgDQoNCkvhur90IHF14bqjIFRSVUUgdGjhu4MgaGnhu4duIGLhu5kgZOG7ryBsaeG7h3UgbMOgIG3hu5l0IGRhdGFmcmFtZS4NCg0KYGBge3IgZWNobz1UUlVFLCByZXN1bHRzPSdoaWRlJ30NCmlzLm5hKG52MykgIyBYZW0gYuG7mSBk4buvIGxp4buHdSBjw7MgZ2nDoSB0cuG7iyB0cuG7kW5nIGhheSBraMO0bmcNCmBgYA0KDQpL4bq/dCBxdeG6oyBUUlVFIGNo4buJIHThuqFpIHBo4bqnbiB04butIMSRw7MgbMOgIG3hu5l0IGdpw6EgdHLhu4sgdHLhu5FuZyB2w6AgRkFMU0Uga2hpIGtow7RuZyBwaOG6o2kgZ2nDoSB0cuG7iyB0cuG7kW5nLg0KDQpgYGB7cn0NCnN1bShpcy5uYShudjMpKSAjIEtp4buDbSB0cmEgdOG7lW5nIHPhu5EgcGjhuqduIHThu60gY8OzIGdpw6EgdHLhu4sgdHLhu5FuZw0KYGBgDQoNCkLhu5kgZOG7ryBsaeG7h3Uga2jDtG5nIGPDsyBnacOhIHRy4buLIE5BLg0KDQpgYGB7ciwgZWNobz1UUlVFLCByZXN1bHRzPSdoaWRlJ30NCmR1cGxpY2F0ZWQobnYzKSAjIEtp4buDbSB0cmEgeGVtIHPhu7EgdHLDuW5nIGzhurdwIGPhu6dhIGThu68gbGnhu4d1DQpgYGANCg0KR2nDoSB0cuG7iyBUUlVFIHTGsMahbmcg4bupbmcgduG7m2kgY8OhYyBow6BuZyB0cm9uZyBkYXRhIGZyYW1lIGzDoCB0csO5bmcgbOG6t3AgdsOgIEZBTFNFIG7hur91IGtow7RuZyB0csO5bmcgbOG6t3AuDQoNCmBgYHtyfQ0Kc3VtKGR1cGxpY2F0ZWQobnYzKSkNCmBgYA0KDQpL4bq/dCBxdeG6oyB0cuG6oyB24buBIDAsIGLhu5kgZOG7ryBsaeG7h3Uga2jDtG5nIHRyw7luZyBs4bq3cC4NCg0KIyMgTcOjIGjDs2EgZOG7ryBsaeG7h3UNCg0KKiBNw6MgaMOzYSBk4buvIGxp4buHdSBk4buxYSB2w6BvIGdp4bubaSB0w61uaA0KDQpgYGB7cn0NCm52MyRTZXguQ29kZWQgPC0gaWZlbHNlKG52MyRTZXggPT0gJ0ZlbWFsZScsJ0ZlbWFsZScsJ05vdCBGZW1hbGUnKQ0KYGBgDQoNCsSQaeG7gXUga2nhu4duIGzhu4duaCDhu58gxJHDonkgbMOgIG7hur91IHRyb25nIGJp4bq/biBTIGPDsyBnacOhIHRy4buLIGzDoCAnRmVtYWxlJyB0aMOsIHPhur0gxJHGsOG7o2MgbcOjIGjDs2EgdGjDoG5oICdGZW1hbGUnLCBu4bq/dSBnacOhIHRy4buLIGtow6FjICdGZW1hbGUnIChCb3RoIGhv4bq3YyBNYWxlKSB0aMOsIHPhur0gxJHGsOG7o2MgbcOjIGjDs2EgdGjDoG5oICdOb3QgRmVtYWxlJy4NCg0KKiBNw6MgaMOzYSBnaeG7m2kgdMOtbmggdGjDoG5oIGPDoWMgY29uIHPhu5ENCg0KYGBge3J9DQpudjMkU2V4LkNvZGVkMSA8LSByZWNvZGUobnYzJFNleCxNYWxlID0gJzEnLCBGZW1hbGUgPSAnMicsIEJvdGggPSAnMycpDQpgYGANCg0KR2nhu5tpIHTDrW5oIHPhur0gxJHGsOG7o2MgbcOjIGjDs2EgZMaw4bubaSBk4bqhbmcgY8OhYyBjb24gc+G7kSwg4bufIHBo4bqnbiB04butIGPDsyBnacOhIHRy4buLIGzDoCAnTWFsZScgc+G6vSDEkcaw4bujYyBtw6MgaMOzYSB0aMOgbmggc+G7kSAnMScsICdGZW1hbGUnIHRow6BuaCBz4buRICcyOyB2w6AgJ0JvdGgnIGzDoCBz4buRIDMuDQoNCiogTcOjIGjDs2EgZOG7ryBsaeG7h3UgZOG7sWEgdsOgbyBz4buRIGxp4buHdSBkw6JuIHPhu5EgdHJvbmcgxJHhu5kgdHXhu5VpIDE4DQoNCmBgYHtyfQ0KbnYzJEFnZS4xOC5Db2RlZCA8LSBjYXNlX3doZW4obnYzJEFnZS4xOCA8IDUwMDAgfiAnUuG6pXQgaXQnLG52MyRBZ2UuMTggPj0gNTAwMCAmIG52MyRBZ2UuMTggPCAxMDAwMCB+ICdJdCcsbnYzJEFnZS4xOCA+PSAxMDAwMCAmIG52MyRBZ2UuMTggPCA1MDAwMDAgfiAnVuG7q2EnLG52MyRBZ2UuMTggPj0gNTAwMDAwICYgbnYzJEFnZS4xOCA8ICAyMDAwMDAwIH4gJ05oaeG7gXUgJyxudjMkQWdlLjE4ID49IDIwMDAwMDAgfiAnUuG6pXQgbmhp4buBdScpDQpgYGANCg0KQ8OhYyBkw6JuIHPhu5EgZOG7sSDEkW/DoW4gc+G6vSDEkcaw4bujYyBtw6MgaMOzYSB0aMOgbmggZOG6oW5nIGNo4buvIHbhu5tpIGPDoWMgxJFp4buBdSBraeG7h24uIA0KDQpCw6kgaMahbiA1MDAwIC0+IFLhuqV0IMOtdA0KDQpU4burIDUwMDAgxJHhur9uIDEwMDAwIC0+IMONdA0KDQpU4burIDEwMDAwIMSR4bq/biA1MDAwMDAgLT4gVuG7q2ENCg0KVOG7qyA1MDAwMDAgxJHhur9uIDIwMDAwMDAgLT4gTmhp4buBdSANCg0KTmhp4buBdSBoxqFuIDIwMDAwMDAgLT4gUuG6pXQgbmhp4buBdQ0KDQoqIE3DoyBow7NhIGThu68gbGnhu4d1IHRoZW8gbmjDs20gZOG7sWEgdsOgbyDEkeG7mSB0deG7lWkgMjANCg0KYGBge3J9DQpudjMkQWdlLjIwLkNvZGVkIDwtIGN1dChudjMkQWdlLjIwLDMsbGFiZWxzID0gYygnTmjDs20gMScsJ05ow7NtIDInLCdOaMOzbSAzJykpIA0KYGBgDQoNCkThu68gbGnhu4d1IHRyb25nIGJp4bq/biDigJhBZ2UuMjDigJkgxJHGsOG7o2MgY2hpYSB0aMOgbmggMyBraG/huqNuZywgdsOgIGPDoWMgdMOqbiDigJhOaMOzbSAx4oCZLCDigJhOaMOzbSAy4oCZLCDigJhOaMOzbSAz4oCZIMSRxrDhu6NjIGfDoW4gdMawxqFuZyDhu6luZyB24bubaSBjw6FjIGtob+G6o25nIMSRw7MuDQoNCmBgYHtyfQ0KbnYzIA0KYGBgDQoNClF1YSA0IGzhu4duaCBtw6MgaMOzYSB0csOqbiwgZGF0YSBmcmFtZSAnbnYzJyBjw7MgdOG7lW5nIGPhu5luZyBsw6AgMTEwIGJp4bq/biB2w6Agc+G7kSBxdWFuIHPDoXQgbMOgIGtow7RuZyDEkeG7lWkgduG7m2kgMjgzNSBow6BuZy4NCg0KIyMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgDQoNCiogVOG6p24gc+G7kSBwaMOibiB0w61jaCB24buBIGdp4bubaSB0w61uaA0KDQpgYGB7cn0NCnRhYmxlKG52MyRTZXgpDQpgYGANCg0KR2nhu5tpIHTDrW5oIG5hbSwgbuG7ryB2w6AgY+G6oyBoYWkgZ2nhu5tpIHTDrW5oIMSR4buBdSDEkcaw4bujYyBk4buxIMSRb8OhbiA5NDUgbOG6p24uDQoNCiogUsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgDQoNCmBgYHtyfQ0KbnYzLmEgPC0gZmlsdGVyKG52MyxSYWNlID09ICdBc2lhbicgJiBPcmlnaW4gPT0gJ0hpc3BhbmljJykgDQpudjMuYQ0KYGBgDQoNCkTDuW5nIGzhu4duaCBmaWx0ZXIgxJHhu4MgY2jhu41uIHJhIGPDoWMgcXVhbiBzw6F0IHRyb25nIGJp4bq/biBSYWNlIGPDsyBnacOhIHRy4buLIGzDoCAnQXNpYW4nIHbDoCBjw6FjIGdpw6EgdHLhu4sgbMOgICdIaXNwYW5pYycgdHJvbmcgYmnhur9uIE9yaWdpbi4NCg0KKiBM4bqtcCBiaeG7g3UgxJHhu5MgbmjDoW5oIHbDoCBsw6ENCg0KYGBge3J9DQpzdGVtKG52My5hJEFnZS42MCxzY2FsZSA9IC41KQ0KYGBgDQoNCkzhu4duaCBz4bq9IMSRxrDhu6NjIHBow6JuIHTDrWNoIGThu7FhIHbDoG8gxJFp4buBdSBraeG7h24gZOG6pXUgdGjhuq1wIHBow6JuIGzDoCAzIGNo4buvIHPhu5Eg4bufIGLDqm4gcGjhuqNpLiBUxrDGoW5nIOG7qW5nIHbhu5tpIG5ow6FuaCBsw6AgcGjhuqduIHPhu5EgaMOgbmcgbmdow6xuIHbDoCBsw6EgbMOgIHBo4bqnbiBz4buRIGjDoG5nIHRyxINtLg0KDQpOaMOhbmggbMOgIGfhu5NtIGPDoWMgc+G7kSBiw6puIHRyw6FpIGThuqV1IOKAmHzigJkgdsOgIGLDqm4gcGjhuqNpIGzDoCBsw6EuIEfhu5NtIDEwIG5ow6FuaCBsw6AgY8OhYyBuaMOhbmggY8OhYyBz4buRIGjDoG5nIDEgbmdow6xuLCAyIG5naMOsbizigKYgxJHhur9uIDEwIG5naMOsbi4NCg0K4bueIGjDoG5nIDEgbmdow6xuIHRhIHRo4bqleSBjw7MgMiBz4buRLCB0xrDGoW5nIOG7qW5nIGPDsyAyIHPhu5EgdGh14buZYyBow6BuZyAxIG5naMOsbi4gQ8OhYyBjb24gc+G7kSBsw6AgMTkwMCB2w6AgMTkwMCAoY8OhYyBz4buRIMSRw6MgxJHGsOG7o2MgbMOgbSB0csOybiDEkeG6v24gaMOgbmcgxJHGoW4gduG7iykNCg0KVMawxqFuZyB04buxIOG7nyBow6BuZyA2LCBjw7MgNiBz4buRIHRodeG7mWMgbmjDoW5oIDYgbmdow6xuLCBsw6AgY8OhYyBz4buRIDYyMDAsNjcwMCw2ODAwLDY4MDAsNjgwMCB2w6AgNjkwMC4NCg0KIyMgVMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyDhu58gxJHhu5kgdHXhu5VpIDEwMCDhu58gQXNpYW4gcXVhIGPDoWMgbsSDbSB0aHXhu5ljIGdp4bubaSB0w61uaCBu4buvDQoNCiogUsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgDQoNCmBgYHtyfQ0KbnYzLmIgPC0gZmlsdGVyKG52My5hLFNleCAlaW4lIGMoJ0ZlbWFsZScpKQ0KbnYzLmINCmBgYA0KDQpSw7p0IHRyw61jaCBk4buvIGxp4buHdSDEkeG7gyBs4bqleSByYSBk4buvIGxp4buHdSBjaOG7iSBjw7MgZ2nhu5tpIHTDrW5oIG7hu68uDQoNCiogTcO0IHThuqMgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQNCg0KYGBge3J9DQptaW4xIDwtIG52My5iICU+JSBncm91cF9ieShTZXgpICU+JSBzdW1tYXJpc2UobWluID0gbWluKEFnZS4xMDApLCBuID0gbigpKQ0KbWluMQ0KYGBgDQoNClRyb25nIDQ1IG7Eg20gZOG7sSDEkW/DoW4sIGTDom4gc+G7kSBuZ8aw4budaSBBc2lhbiB0aHXhu5ljIGdp4bubaSB0w61uaCBu4buvIMSRxrDhu6NjIGThu7EgxJFvw6FuIHRo4bqlcCBuaOG6pXQgdHJvbmcgxJHhu5kgdHXhu5VpIDEwMCBsw6AgMjcgbmfGsOG7nWkuDQoNCiogTcO0IHThuqMgxJFp4buDbSBwaMOibiB24buLIHRo4bupIG5o4bqldA0KDQpgYGB7cn0NClF1YW50aWxlMSA8LSBudjMuYiAlPiUgZ3JvdXBfYnkoU2V4KSAlPiUgc3VtbWFyaXNlKHF1YW50aWxlXzFzdCA9IHF1YW50aWxlKEFnZS4xMDAsIHByb2JzID0gYyguMjUpKSwgbiA9IG4oKSkNClF1YW50aWxlMQ0KYGBgDQoNClThuqFpIMSRaeG7g20gcGjDom4gduG7iyB0aOG7qSBuaOG6pXQgdGjhu4MgaGnhu4duIGPDsyAyNSUgdGh14buZYyDEkeG7mSB0deG7lWkgMTAwIGPDsyDDrXQgaMahbiBob+G6t2MgYuG6sW5nIDQyIG5nxrDhu51pLiBIb+G6t2MgNzUlIOG7nyB0deG7lWkgMTAwIGPDsyBuaGnhu4F1IGjGoW4gNDIgbmfGsOG7nWkuDQoNCiogTcO0IHThuqMgxJFp4buDbSBwaMOibiB24buLIHRo4bupIDIgLSBUcnVuZyB24buLDQoNCmBgYHtyfQ0KUXVhbnRpbGUyIDwtIG52My5iICU+JSBncm91cF9ieShTZXgpICU+JSByZWZyYW1lKHF1YW50aWxlXzJuZCA9IHF1YW50aWxlKEFnZS4xMDAsIHByb2JzID0gYyguNSkpLCBuID0gbigpKQ0KUXVhbnRpbGUyDQpgYGANCg0KVOG6oWkgxJFp4buDbSBwaMOibiB24buLIHRo4bupIGhhaSB0aOG7gyBoaeG7h24gbeG7mXQgbuG7rWEgZ2nDoSB0cuG7iyBuaOG7jyBoxqFuIGhv4bq3YyBi4bqxbmcgODUgdsOgIG3hu5l0IG7hu61hIGdpw6EgdHLhu4sgbOG7m24gaMahbiBob+G6t2MgYuG6sW5nIDg1LiANCg0KKiBNw7QgdOG6oyDEkWnhu4NtIHBow6JuIHbhu4sgdGjhu6kgMw0KDQpgYGB7cn0NClF1YW50aWxlMyA8LSBudjMuYiAlPiUgZ3JvdXBfYnkoU2V4KSAlPiUgcmVmcmFtZShxdWFudGlsZV8zcmQgPSBxdWFudGlsZShBZ2UuMTAwLCBwcm9icyA9IGMoLjc1KSksIG4gPSBuKCkpDQpRdWFudGlsZTMNCmBgYA0KDQpU4bqhaSDEkWnhu4NtIHBow6JuIHbhu4sgdGjhu6kgYmEgdGjhu4MgaGnhu4duIGPDsyA3NSUgdGh14buZYyDEkeG7mSB0deG7lWkgMTAwIGPDsyDDrXQgaMahbiBob+G6t2MgYuG6sW5nIDIxMSBuZ8aw4budaS4gSG/hurdjIDI1JSDhu58gdHXhu5VpIDEwMCBjw7Mgbmhp4buBdSBoxqFuIDIxMSBuZ8aw4budaS4NCg0KKiBNw7QgdOG6oyBnacOhIHRy4buLIHRydW5nIGLDrG5oDQoNCmBgYHtyfQ0KbWVhbjEgPC0gbnYzLmIgJT4lIGdyb3VwX2J5KFNleCkgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihBZ2UuMTAwKSwgbj0gbigpKQ0KbWVhbjENCmBgYA0KDQpUcnVuZyBiw6xuaCB0cm9uZyA0NSBuxINtLCBkw6JuIHPhu5Eg4bufIMSR4buZIHR14buVaSAxMDAgY+G7p2EgZ2nhu5tpIG7hu68gbMOgIDE0MyBuZ8aw4budaS4NCg0KKiBNw7QgdOG6oyBnacOhIHRy4buLIGzhu5tuIG5o4bqldA0KDQpgYGB7cn0NCm1heDEgPC0gbnYzLmIgJT4lIGdyb3VwX2J5KFNleCkgJT4lIHN1bW1hcmlzZShtYXggPSBtYXgoQWdlLjEwMCksIG4gPSBuKCkpDQptYXgxDQpgYGANCg0KVHJvbmcgNDUgbsSDbSBk4buxIMSRb8OhbiwgZMOibiBz4buRIMSRxrDhu6NjIGThu7EgxJFvw6FuIGNhbyBuaOG6pXQgbuG6sW0gdHJvbmcgdHXhu5VpIDEwMCDhu58gZ2nhu5tpIG7hu68gbMOgIDQ3NyBuZ8aw4budaS4=