1 Nhiệm vụ 3.1


1.1 Đọc dữ liệu từ file excel

  • Gán dữ liệu nguồn từ file Excel vào h để xử lý dữ liệu trên RStudio
library(openxlsx)
library(DT)
h <- read.xlsx("/Users/phamxuanhoan/Downloads/population-and-demography.xlsx")
datatable(h)

1.2 Mô tả dữ liệu

  • Bảng dữ liệu mô tả dân số của 254 quốc gia trong từ năm 1950-2021
  • Bảng có 18288 số liệu và 24 biến
  • Bảng có 1 biến định tính là Country name và 23 biến định lượng
  • Year: Thời gian khảo sát
  • Population: Dân số
  • Population of children under the age of 1: Dân số trẻ em dưới 1 tuổi
  • Population of children under the age of 5: Dân số trẻ em dưới 5 tuổi
  • Population of children under the age of 15: Dân số trẻ em 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ố từ 15 đến 64 tuổi
  • Population older than 15 years: Dân số trên 15 tuổi
  • Population older than 18 years: Dân số trên 18 tuổi
  • Population at age 1: Dân số trẻ em 1 tuổi
  • Population aged 1 to 4 years: Dân số từ 1 đến 4 tuổi
  • Population aged 5 to 9 years: Dân số từ 5 đến 9 tuổi
  • Population aged 10 to 14 years: Dân số từ 10 đến 14 tuổi
  • Population aged 15 to 19 years: Dân số từ 15 đến 19 tuổi
  • Population aged 20 to 29 years: Dân số từ 20 đến 29 tuổi
  • Population aged 30 to 39 years: Dân số từ 30 đến 39 tuổi
  • Population aged 40 to 49 years: Dân số từ 40 đến 49 tuổi
  • Population aged 50 to 59 years: Dân số từ 50 đến 59 tuổi
  • Population aged 60 to 69 years: Dân số từ 60 đến 69 tuổi
  • Population aged 70 to 79 years: Dân số từ 70 đến 79 tuổi
  • Population aged 80 to 89 years: Dân số từ 80 đến 89 tuổi
  • Population aged 90 to 99 years: Dân số từ 90 đến 99 tuổi
  • Population older than 100 years: Dân số trên 100 tuổi

1.3 Đặt lại tên cho các cột của objec h

  • Ta gán 24 biến của bảng h cho 24 kí tự phù hợp
  • Country -> C
  • Year -> Y
  • Population -> P
  • Population of children under the age of 1 -> P1
  • Population of children under the age of 5 -> P5
  • Population of children under the age of 15 -> P15
  • Population under the age of 25 -> P25
  • Population aged 15 to 64 years -> P15TO64
  • Population older than 15 years -> PO15
  • Population older than 18 years -> PO18
  • Population at age 1 -> PA1
  • Population aged 1 to 4 years -> P1TO4
  • Population aged 5 to 9 years -> P5TO9
  • Population aged 10 to 14 years -> P10TO14
  • Population aged 15 to 19 years -> P15TO19
  • Population aged 20 to 29 years -> P20TO29
  • Population aged 30 to 39 years -> P30TO39
  • Population aged 40 to 49 years -> P40TO49
  • Population aged 50 to 59 years -> P50TO59
  • Population aged 60 to 69 years -> P60TO69
  • Population aged 70 to 79 years -> P70TO79
  • Population aged 80 to 89 years -> P80TO89
  • Population aged 90 to 99 years -> P90TO99
  • Population older than 100 years -> P100
library(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
names(h) <- c("C","Y","P","P1","P5","P15","P25","P15TO64","PO15","PO18","PA1","P1TO4","P5TO9", "P10TO14", "P15TO19","P20TO29","P30TO39", "P40TO49", "P50TO59", "P60TO69", "P70TO79", "P80TO89", "P90TO99", "P100")
datatable(h)

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

  • Lọc dữ liệu chỉ lấy 5 quốc gia: Andora, Angola, Asia, Canada, Chile và 5 đặc điểm là: Y, P, P1, P5, P15 để xử lý dữ liệu. Ta có bảng số liệu như sau:
library(dplyr)
h1 <- filter(h,C=='Andorra'| C=='Angola'| C=='Asia'| C=='Canada'| C=='Chile' ) %>% select(-c('P25','P15TO64','PO15','PO18','PA1','P1TO4','P5TO9','P10TO14','P15TO19','P20TO29','P30TO39','P40TO49','P50TO59','P60TO69','P70TO79','P80TO89','P90TO99','P100'))
table <- knitr::kable(h1, format="markdown")
datatable(h1)

1.5 Bảng tần số

1.5.1 Bảng tần số theo quốc gia

  • Bảng thể hiện tần số của mỗi quốc gia xuất hiện trong dữ liệu nguồn. Cụ thể: -Các quốc gia đều có tần số xuất hiện bằng nhau
table(h1$C)
## 
## Andorra  Angola  Canada   Chile 
##      72      72      72      72

1.5.2 Ta chia bảng số liệu thành 3 phần theo P

  • Ta chia bảng số liệu h1 thành 3 phần theo dân số. Ta thấy:
    • Tần số các quốc gia có dân số trong khoảng 1 là 153 -> lớn nhất
    • Tần số các quốc gia có dân số trong khoảng 2 là 88 -> lớn thứ nhì
    • Tần số các quốc gia có dân số trong khoảng 3 là 47 -> thấp nhất
table(cut(h1$P,3))
## 
## (-3.28e+04,1.27e+07]  (1.27e+07,2.54e+07]  (2.54e+07,3.82e+07] 
##                  153                   88                   47

1.6 Tính toán các đặc trưng

1.6.1 Bảng tóm tắt theo P và tính tổng P của 4 nước từ 1950- 2021

  • Min là giá trị nhỏ nhất. Cụ thể dân số của 4 quốc gia từ năm 1950 - 2021 là 5335 triệu người
  • 1st Qu. là giá trị thứ nhất của phân vị 25%. -Trong đó có 25% dân số của 4 quốc gia Andora, Angola, Asia, Canada sẽ thấp hơn 3378700 người và 75% sẽ cao hơn 3378700 người
  • Median là trung vị có giá trị lớn hơn 50% số số liệu và bé hơn 50% số số liệu. Cụ thể:
    • 50% dân số sẽ thấp hơn 11722513 người
    • 50% dân số sẽ cao hơn 11722513 người
  • Mean là giá trị trung bình của dân số. Cụ thể:
    • Dân số trung bình cảu 4 quốc gia Andora, Angola, Asia, Canada từ năm 1950- 2021 là 13005253.
  • 3rd Qu. là giá trị phân vị thứ 3 của 75%. Cụ thể.
    • Có 75% dân số thấp của các quốc gia Andora, Angola, Asia, Canada sẽ thấp hơn 19780416 người và 25% sẽ cao hơn 19780416 người
  • Max là giá trị lớn nhất. Dân số lớn nhất của 1 trong năm quốc gia là 38155012 người
summary(h1$P)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##     5335  3378700 11722513 13005253 19780416 38155012
sum(h1$P)
## [1] 3745512794

1.6.2 Phương sai độ lệch chuẩn và chiều dài

  • Lenght là độ dài của dữ liệu
length(h1$Y)
## [1] 288
  • Var là tính phương sai của Y
var(h1$Y)
## [1] 433.4216
  • Ta thấy giá trị của phương sai khá lớn nên độ phân tán của các giá trị xung quanh giá trị trung bình là khá cao

  • Sd là độ lệch chuẩn của Y và bằng căn bậc hai của phương sai

sd(h1$Y)
## [1] 20.81878
  • Ta thấy độ lệch chuẩn cũng có giá trị khá lớn nên độ tin cậy của giá trị tìm được cũng cao

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

1.7.1 Bảng đặc trưng đo lường theo quốc gia

  • Bảng thể hiện giá trị trung bình của cột Population theo từng quốc gia. Cụ thể:
    • Canada là quốc gia có dân số trung bình lớn nhất với 26143393,18 người
    • Xếp thứ 2 là Angola với dân số trung bình là 13175863,57 người
    • Xếp thứ 3 là Chile với dân số trung bình là 12658178,72 người
    • Xếp thứ cuối cùng là Angdora với dân số trung bình là 43575,56 người
k1 <- h1 %>% group_by(C) %>% summarise(mean_of_p = mean(P))
mean(k1$mean_of_p)
## [1] 13005253
library(knitr)
datatable(k1)

1.7.2 Bảng đặc trưng đo lường theo năm

k2 <- h1 %>% group_by(Y) %>% summarise(n = n(),mean_of_p = mean(P))
mean(k2$mean_of_p)
## [1] 13005253
library(knitr)
datatable(k2)
  • Bảng thể hiện tần số và giá trị trung bình của cột Population theo từng năm. Cụ thể:
    • Dân số của 4 quốc gia năm 2021 là đông nhất với 23057757 người
    • Dân số của 4 quốc gia năm 1950 là it nhất với 6212733 người

1.7.3 Bảng đặc trưng đo lường theo nước và theo năm

k3 <- h1 %>% group_by(C,Y) %>% summarise(n = n(),mean_of_P = mean(P1),.groups = 'drop')
mean(k3$P1)
## [1] NA
library(knitr)
datatable(k3)
  • Bảng trên thể hiện tần số và giá trị trung bình của cột Population theo từng quốc gia và từng năm.

2 Nhiệm vụ 3.2


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

  • Gán dữ liệu nguồn từ file Excel vào m để xử lý dữ liệu trên RStudio
library(openxlsx)
m <- read.xlsx("/Users/phamxuanhoan/Downloads/NY-House-Dataset.xlsx")
datatable(m)

2.2 Mô tả dữ liệu

  • Bảng dữ liệu mô tả mã vùng của các quốc gia
  • Bảng có 4801 số liệu và 17 biến
  • Bảng có 6 biến định lượng và 11 biến định tính
  • brokertitle: loại môi giới
  • type: kiểu
  • price: giá
  • beds: giường
  • bath: bồn tắm
  • propertysqft: thuộc tính
  • address: địa chỉ
  • state:trạng thái
  • main address: trụ sở chính
  • administrative area level 2: khu vực hành chính cấp 2
  • locality: địa phương
  • sublocality: tiểu địa phương
  • street name: tên đường
  • long name: tên dài
  • formatted address:địa chỉ
  • latitude: vĩ độ
  • longitude: kinh độ

2.3 Đổi tên

  • brokertitle -> br
  • type -> t
  • price -> p
  • beds -> be
  • bath -> ba
  • propertysqft -> pr
  • address -> a
  • state -> st
  • main address -> m
  • administrative area level 2 -> ad
  • locality -> l
  • sublocality -> s
  • street name -> sn
  • long name -> ln
  • formatted address -> fa
  • latitude -> la
  • longitude -> lo
names(m) <- c("br","t","p","be","ba","pr","a","st","m","ad","l","s","sn","ln","fa","la","lo")
names(m)
##  [1] "br" "t"  "p"  "be" "ba" "pr" "a"  "st" "m"  "ad" "l"  "s"  "sn" "ln" "fa"
## [16] "la" "lo"
datatable(m)

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

  • Lọc dữ liệu chỉ lấy 4 loại: House for sale, Condo for sale, Co-op for sale, Land for sale và 5 biến là BROKERTITLE,TYPE, PRICE, BEDS, BATH để xử lý dữ liệu. Ta có bảng số liệu như sau:
library(dplyr)
m1 <- filter(m,t=='House for sale'| t=='Condo for sale'| t=='Co-op for sale'| t=='Land for sale' ) %>% select(-c('pr','a','st','m','ad','l','s','sn','ln','fa','la','lo'))
table <- knitr::kable(m1, format="markdown")
datatable(m1)

2.5 Bảng tần số

2.5.1 Bảng tần số theo loại

  • Bảng thể hiện tần số xuất hiện của từng quôc gia. Cụ thể:
    • Tần số của Co-op for sale là lớn nhất với 1450
    • Tần số của House for sale xếp thứ nhì với 1012
    • Tần số của COndo for sale xếp thứ ba với 891 -Tần số của Land for sale xếp cuối với 49
table(m1$t)
## 
## Co-op for sale Condo for sale House for sale  Land for sale 
##           1450            891           1012             49

2.5.2 Ta chia bảng số liệu thành 3 phần theo số bồn tắm

  • Ta thấy mức độ phân bổ không đồng đều giữa các loại căn hộ. Cụ thể: -Căn hộ có số bồn tắm từ 0,985-6 là lớn nhiều nhất với 3386 cái
    • Căn hộ có số bồn tắm từ 6-11 xếp thứ nhì với 14 cái
    • Căn hộ có số bồn tắm từ 11-16 là ít nhất với 2 cái
table(cut(m1$ba,3))
## 
## (0.985,6]    (6,11]   (11,16] 
##      3386        14         2

2.6 Tính toán các đặc trưng

2.6.1 Bảng tóm tắt theo be và tính tổng be của 4 laoij căn hộ

  • Min là giá trị nhỏ nhất. Cụ thể: Số giường ít nhất của một căn hộ là 1 cái
  • 1st Qu. là giá trị thứ nhất của phân vị 25%. Tức là:
    • Có 25% số căn hộ có số giường ít hơn 2 cái giường
    • Có 75 % số căn hộ có số giường lớn hơn 2 cái giường
  • Median là trung vị có giá trị lớn hơn 50% số số liệu và bé hơn 50% số số liệu. Tức là:
    • Có 50% số căn hộ có ít hơn 3 cái giường
    • Có 50% số căn hộ có nhiều hơn 3 cái giường
  • Mean là giá trị trung bình của P -Số giường trung bình của 4 loại căn hộ là 2.61
  • 3rd Qu. là giá trị phân vị thứ 3 của 75% . Tức là:
    • Có 75 % số căn hộ có số giường ít hơn 3 cái
    • Có 25 % số Căn hộ có số giường nhiều hơn 3 cái
  • Max là giá trị lớn nhất. Số giường nhiều nhất của 1 phòng là 32 cái
summary(m1$be)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    2.00    3.00    2.61    3.00   32.00
sum(m1$be)
## [1] 8879

2.6.2 Phương sai độ lệch chuẩn và chiều dài

  • Lenght là độ dài của dữ liệu
length(m1$be)
## [1] 3402
  • Var là tính phương sai của Y
var(m1$be)
## [1] 2.186823
  • Ta thấy giá trị của phương sai khá nhỏ nên độ phân tán của các giá trị xung quanh giá trị trung bình là khá thấp

  • Sd là độ lệch chuẩn của Y và bằng căn bậc hai của phương sai

sd(m1$be)
## [1] 1.478791
  • Ta thấy độ lệch chuẩn cũng có giá trị khá nhỏ nên độ tin cậy của giá trị tìm được cũng thấp

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

2.7.1 Bảng tính trung bình giường

n1 <- m1 %>% group_by(t) %>% summarise(mean_of_bed = mean(be))
mean(n1$mean_of_be)
## [1] NA
library(knitr)
datatable(n1)
  • Bảng thể hiện giá trị trung bình của cột BEbs theo từng loại căn hộ. Cụ thể:
    • House for sale là căn hộ có số giường trung bình lớn nhất với 3.738142 cái
    • Xếp thứ 2 là Land for sale với số giường trung bình là 3 cái
    • Xếp thứ 3 là Condo for sale với số giường trung bình là 2.332211 cái
    • Xếp thứ cuối cùng là Co-op for sale với số giường trung bình là 1.98 cái

2.7.2 Bảng thể hiện số giường trung bình theo loại căn hộ

n2 <- m1 %>% group_by(t) %>% summarise(n = n(),mean_of_bed = mean(be))
mean(n2$mean_of_be)
## [1] NA
library(knitr)
datatable(n2)

2.7.3 BẢng thể hiện số bồn tăm trung bình theo loại căn hộ

  • Ta thấy:
    • Số bồn tăm trung bình của House for sale là lớn nhất với 2.535964 cái
    • Số bồn tắm trung bình của Land for sale xếp thứ nhì với 2.366231 cái
    • Số bồn tăm trung bình của Condo for sale xếp thứ ba với 2.008256 cái
    • Số bồn tăm trung bình của Co-op for sale là thấp nhất với 1.437235 cái
n3 <- m1 %>% group_by(t) %>% summarise(mean_of_bath = mean(ba))
mean(n3$mean_of_ba)
## [1] NA
library(knitr)
datatable(n3)
LS0tCnRpdGxlOiAiTmhp4buHbSB24bulIDMiCmF1dGhvcjogInB4aG9hbm4iCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6ICJkZWZhdWx0IgogICAgdG9jX2RlcHRoOiAyCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvYzogdHJ1ZQogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogJzInCiAgcGRmX2RvY3VtZW50OiAKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAojIE5oaeG7h20gduG7pSAzLjEKCi0tLQoKIyMgxJDhu41jIGThu68gbGnhu4d1IHThu6sgZmlsZSBleGNlbAotIEfDoW4gZOG7ryBsaeG7h3Ugbmd14buTbiB04burIGZpbGUgRXhjZWwgdsOgbyBoIMSR4buDIHjhu60gbMO9IGThu68gbGnhu4d1IHRyw6puIFJTdHVkaW8KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KG9wZW54bHN4KQpsaWJyYXJ5KERUKQpoIDwtIHJlYWQueGxzeCgiL1VzZXJzL3BoYW14dWFuaG9hbi9Eb3dubG9hZHMvcG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeS54bHN4IikKZGF0YXRhYmxlKGgpCmBgYAoKIyMgTcO0IHThuqMgZOG7ryBsaeG7h3UKLSBC4bqjbmcgZOG7ryBsaeG7h3UgbcO0IHThuqMgZMOibiBz4buRIGPhu6dhIDI1NCBxdeG7kWMgZ2lhIHRyb25nIHThu6sgbsSDbSAxOTUwLTIwMjEgCi0gQuG6o25nIGPDsyAxODI4OCBz4buRIGxp4buHdSB2w6AgMjQgYmnhur9uCi0gQuG6o25nIGPDsyAxIGJp4bq/biDEkeG7i25oIHTDrW5oIGzDoCAqKkNvdW50cnkgbmFtZSoqIHbDoCAyMyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyAKLSAqKlllYXIqKjogVGjhu51pIGdpYW4ga2jhuqNvIHPDoXQgCi0gKipQb3B1bGF0aW9uKio6IETDom4gc+G7kSAKLSAqKlBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxKio6IETDom4gc+G7kSB0cuG6uyBlbSBkxrDhu5tpIDEgdHXhu5VpIAotICoqUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDUqKjogRMOibiBz4buRIHRy4bq7IGVtIGTGsOG7m2kgNSB0deG7lWkKLSAqKlBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxNSoqOiBEw6JuIHPhu5EgdHLhursgZW0gZMaw4bubaSAxNSB0deG7lWkKLSAqKlBvcHVsYXRpb24gdW5kZXIgdGhlIGFnZSBvZiAyNSoqOiBEw6JuIHPhu5EgZMaw4bubaSAyNSB0deG7lWkKLSAqKlBvcHVsYXRpb24gYWdlZCAxNSB0byA2NCB5ZWFycyoqOiBEw6JuIHPhu5EgdOG7qyAxNSDEkeG6v24gNjQgdHXhu5VpCi0gKipQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTUgeWVhcnMqKjogRMOibiBz4buRIHRyw6puIDE1IHR14buVaSAKLSAqKlBvcHVsYXRpb24gb2xkZXIgdGhhbiAxOCB5ZWFycyoqOiBEw6JuIHPhu5EgdHLDqm4gMTggdHXhu5VpCi0gKipQb3B1bGF0aW9uIGF0IGFnZSAxKio6IETDom4gc+G7kSB0cuG6uyBlbSAxIHR14buVaSAKLSAqKlBvcHVsYXRpb24gYWdlZCAxIHRvIDQgeWVhcnMqKjogRMOibiBz4buRIHThu6sgMSDEkeG6v24gNCB0deG7lWkgCi0gKipQb3B1bGF0aW9uIGFnZWQgNSB0byA5IHllYXJzKio6IETDom4gc+G7kSB04burIDUgxJHhur9uIDkgdHXhu5VpCi0gKipQb3B1bGF0aW9uIGFnZWQgMTAgdG8gMTQgeWVhcnMqKjogRMOibiBz4buRIHThu6sgMTAgxJHhur9uIDE0IHR14buVaQotICoqUG9wdWxhdGlvbiBhZ2VkIDE1IHRvIDE5IHllYXJzKio6IETDom4gc+G7kSB04burIDE1IMSR4bq/biAxOSB0deG7lWkKLSAqKlBvcHVsYXRpb24gYWdlZCAyMCB0byAyOSB5ZWFycyoqOiBEw6JuIHPhu5EgdOG7qyAyMCDEkeG6v24gMjkgdHXhu5VpCi0gKipQb3B1bGF0aW9uIGFnZWQgMzAgdG8gMzkgeWVhcnMqKjogRMOibiBz4buRIHThu6sgMzAgxJHhur9uIDM5IHR14buVaQotICoqUG9wdWxhdGlvbiBhZ2VkIDQwIHRvIDQ5IHllYXJzKio6IETDom4gc+G7kSB04burIDQwIMSR4bq/biA0OSB0deG7lWkKLSAqKlBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFycyoqOiBEw6JuIHPhu5EgdOG7qyA1MCDEkeG6v24gNTkgdHXhu5VpCi0gKipQb3B1bGF0aW9uIGFnZWQgNjAgdG8gNjkgeWVhcnMqKjogRMOibiBz4buRIHThu6sgNjAgxJHhur9uIDY5IHR14buVaQotICoqUG9wdWxhdGlvbiBhZ2VkIDcwIHRvIDc5IHllYXJzKio6IETDom4gc+G7kSB04burIDcwIMSR4bq/biA3OSB0deG7lWkKLSAqKlBvcHVsYXRpb24gYWdlZCA4MCB0byA4OSB5ZWFycyoqOiBEw6JuIHPhu5EgdOG7qyA4MCDEkeG6v24gODkgdHXhu5VpCi0gKipQb3B1bGF0aW9uIGFnZWQgOTAgdG8gOTkgeWVhcnMqKjogRMOibiBz4buRIHThu6sgOTAgxJHhur9uIDk5IHR14buVaQotICoqUG9wdWxhdGlvbiBvbGRlciB0aGFuIDEwMCB5ZWFycyoqOiBEw6JuIHPhu5EgdHLDqm4gMTAwIHR14buVaQoKIyMgxJDhurd0IGzhuqFpIHTDqm4gY2hvIGPDoWMgY+G7mXQgY+G7p2Egb2JqZWMgaAotIFRhIGfDoW4gMjQgYmnhur9uIGPhu6dhIGLhuqNuZyBoIGNobyAyNCBrw60gdOG7sSBwaMO5IGjhu6NwCi0gQ291bnRyeSAtPiAqKkMqKgotIFllYXIgLT4gKipZKioKLSBQb3B1bGF0aW9uIC0+ICoqUCoqCi0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDEgLT4gKipQMSoqCi0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDUgLT4gKipQNSoqCi0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE1IC0+ICoqUDE1KioKLSBQb3B1bGF0aW9uIHVuZGVyIHRoZSBhZ2Ugb2YgMjUgLT4gKipQMjUqKgotIFBvcHVsYXRpb24gYWdlZCAxNSB0byA2NCB5ZWFycyAtPiAqKlAxNVRPNjQqKgotIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxNSB5ZWFycyAtPiAqKlBPMTUqKgotIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxOCB5ZWFycyAtPiAqKlBPMTgqKgotIFBvcHVsYXRpb24gYXQgYWdlIDEgLT4gKipQQTEqKgotIFBvcHVsYXRpb24gYWdlZCAxIHRvIDQgeWVhcnMgLT4gKipQMVRPNCoqCi0gUG9wdWxhdGlvbiBhZ2VkIDUgdG8gOSB5ZWFycyAtPiAqKlA1VE85KioKLSBQb3B1bGF0aW9uIGFnZWQgMTAgdG8gMTQgeWVhcnMgLT4gKipQMTBUTzE0KioKLSBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gMTkgeWVhcnMgLT4gKipQMTVUTzE5KioKLSBQb3B1bGF0aW9uIGFnZWQgMjAgdG8gMjkgeWVhcnMgLT4gKipQMjBUTzI5KioKLSBQb3B1bGF0aW9uIGFnZWQgMzAgdG8gMzkgeWVhcnMgLT4gKipQMzBUTzM5KioKLSBQb3B1bGF0aW9uIGFnZWQgNDAgdG8gNDkgeWVhcnMgLT4gKipQNDBUTzQ5KioKLSBQb3B1bGF0aW9uIGFnZWQgNTAgdG8gNTkgeWVhcnMgLT4gKipQNTBUTzU5KioKLSBQb3B1bGF0aW9uIGFnZWQgNjAgdG8gNjkgeWVhcnMgLT4gKipQNjBUTzY5KioKLSBQb3B1bGF0aW9uIGFnZWQgNzAgdG8gNzkgeWVhcnMgLT4gKipQNzBUTzc5KioKLSBQb3B1bGF0aW9uIGFnZWQgODAgdG8gODkgeWVhcnMgLT4gKipQODBUTzg5KioKLSBQb3B1bGF0aW9uIGFnZWQgOTAgdG8gOTkgeWVhcnMgLT4gKipQOTBUTzk5KioKLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTAwIHllYXJzIC0+ICoqUDEwMCoqCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCm5hbWVzKGgpIDwtIGMoIkMiLCJZIiwiUCIsIlAxIiwiUDUiLCJQMTUiLCJQMjUiLCJQMTVUTzY0IiwiUE8xNSIsIlBPMTgiLCJQQTEiLCJQMVRPNCIsIlA1VE85IiwgIlAxMFRPMTQiLCAiUDE1VE8xOSIsIlAyMFRPMjkiLCJQMzBUTzM5IiwgIlA0MFRPNDkiLCAiUDUwVE81OSIsICJQNjBUTzY5IiwgIlA3MFRPNzkiLCAiUDgwVE84OSIsICJQOTBUTzk5IiwgIlAxMDAiKQpkYXRhdGFibGUoaCkKYGBgCgojIyBSw7p0IHRyw61jaCBk4buvIGxp4buHdSAKLSBM4buNYyBk4buvIGxp4buHdSBjaOG7iSBs4bqleSA1IHF14buRYyBnaWE6IEFuZG9yYSwgQW5nb2xhLCBBc2lhLCBDYW5hZGEsIENoaWxlIHbDoCA1IMSR4bq3YyDEkWnhu4NtIGzDoDogWSwgUCwgUDEsIFA1LCBQMTUgxJHhu4MgeOG7rSBsw70gZOG7ryBsaeG7h3UuClRhIGPDsyBi4bqjbmcgc+G7kSBsaeG7h3UgbmjGsCBzYXU6CmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKaDEgPC0gZmlsdGVyKGgsQz09J0FuZG9ycmEnfCBDPT0nQW5nb2xhJ3wgQz09J0FzaWEnfCBDPT0nQ2FuYWRhJ3wgQz09J0NoaWxlJyApICU+JSBzZWxlY3QoLWMoJ1AyNScsJ1AxNVRPNjQnLCdQTzE1JywnUE8xOCcsJ1BBMScsJ1AxVE80JywnUDVUTzknLCdQMTBUTzE0JywnUDE1VE8xOScsJ1AyMFRPMjknLCdQMzBUTzM5JywnUDQwVE80OScsJ1A1MFRPNTknLCdQNjBUTzY5JywnUDcwVE83OScsJ1A4MFRPODknLCdQOTBUTzk5JywnUDEwMCcpKQp0YWJsZSA8LSBrbml0cjo6a2FibGUoaDEsIGZvcm1hdD0ibWFya2Rvd24iKQpkYXRhdGFibGUoaDEpCmBgYAoKIyMgQuG6o25nIHThuqduIHPhu5EKCiMjIyBC4bqjbmcgdOG6p24gc+G7kSB0aGVvIHF14buRYyBnaWEKLSBC4bqjbmcgdGjhu4MgaGnhu4duIHThuqduIHPhu5EgY+G7p2EgbeG7l2kgcXXhu5FjIGdpYSB4deG6pXQgaGnhu4duIHRyb25nIGThu68gbGnhu4d1IG5ndeG7k24uIEPhu6UgdGjhu4M6IAogIC1Dw6FjIHF14buRYyBnaWEgxJHhu4F1IGPDsyB04bqnbiBz4buRIHh14bqldCBoaeG7h24gYuG6sW5nIG5oYXUgCiAKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQp0YWJsZShoMSRDKQpgYGAKCgojIyMgVGEgY2hpYSBi4bqjbmcgc+G7kSBsaeG7h3UgdGjDoG5oIDMgcGjhuqduIHRoZW8gUAotIFRhIGNoaWEgYuG6o25nIHPhu5EgbGnhu4d1IGgxIHRow6BuaCAzIHBo4bqnbiB0aGVvIGTDom4gc+G7kS4gVGEgdGjhuqV5OgogIC0gVOG6p24gc+G7kSBjw6FjIHF14buRYyBnaWEgY8OzIGTDom4gc+G7kSB0cm9uZyBraG/huqNuZyAxIGzDoCAxNTMgLT4gbOG7m24gbmjhuqV0CiAgLSBU4bqnbiBz4buRIGPDoWMgcXXhu5FjIGdpYSBjw7MgZMOibiBz4buRIHRyb25nIGtob+G6o25nIDIgbMOgIDg4IC0+IGzhu5tuIHRo4bupIG5ow6wKICAtIFThuqduIHPhu5EgY8OhYyBxdeG7kWMgZ2lhIGPDsyBkw6JuIHPhu5EgdHJvbmcga2hv4bqjbmcgMyBsw6AgNDcgLT4gdGjhuqVwIG5o4bqldApgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9CnRhYmxlKGN1dChoMSRQLDMpKQpgYGAKCiMjIFTDrW5oIHRvw6FuIGPDoWMgxJHhurdjIHRyxrBuZwoKIyMjIELhuqNuZyB0w7NtIHThuq90IHRoZW8gUCB2w6AgdMOtbmggdOG7lW5nIFAgY+G7p2EgNCBuxrDhu5tjIHThu6sgMTk1MC0gMjAyMQotIE1pbiBsw6AgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQuIEPhu6UgdGjhu4MgZMOibiBz4buRIGPhu6dhIDQgcXXhu5FjIGdpYSB04burIG7Eg20gMTk1MCAtIDIwMjEgbMOgIDUzMzUgdHJp4buHdSBuZ8aw4budaSAKLSAxc3QgUXUuIGzDoCBnacOhIHRy4buLIHRo4bupIG5o4bqldCBj4bunYSBwaMOibiB24buLIDI1JS4gCiAgLVRyb25nIMSRw7MgY8OzIDI1JSBkw6JuIHPhu5EgY+G7p2EgNCBxdeG7kWMgZ2lhIEFuZG9yYSwgQW5nb2xhLCBBc2lhLCBDYW5hZGEgc+G6vSB0aOG6pXAgaMahbiAzMzc4NzAwIG5nxrDhu51pIHbDoCA3NSUgc+G6vSBjYW8gaMahbiAzMzc4NzAwIG5nxrDhu51pIAotIE1lZGlhbiBsw6AgdHJ1bmcgduG7iyBjw7MgZ2nDoSB0cuG7iyBs4bubbiBoxqFuIDUwJSBz4buRIHPhu5EgbGnhu4d1IHbDoCBiw6kgaMahbiA1MCUgc+G7kSBz4buRIGxp4buHdS4gQ+G7pSB0aOG7gzoKICAtIDUwJSBkw6JuIHPhu5Egc+G6vSB0aOG6pXAgaMahbiAxMTcyMjUxMyBuZ8aw4budaSAKICAtIDUwJSBkw6JuIHPhu5Egc+G6vSBjYW8gaMahbiAxMTcyMjUxMyBuZ8aw4budaSAKLSBNZWFuIGzDoCBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGTDom4gc+G7kS4gQ+G7pSB0aOG7gzoKICAtIETDom4gc+G7kSB0cnVuZyBiw6xuaCBj4bqjdSA0IHF14buRYyBnaWEgQW5kb3JhLCBBbmdvbGEsIEFzaWEsIENhbmFkYSB04burIG7Eg20gMTk1MC0gMjAyMSBsw6AgMTMwMDUyNTMuCi0gM3JkIFF1LiBsw6AgZ2nDoSB0cuG7iyBwaMOibiB24buLIHRo4bupIDMgY+G7p2EgNzUlLiBD4bulIHRo4buDLgogIC0gQ8OzIDc1JSBkw6JuIHPhu5EgdGjhuqVwIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSBBbmRvcmEsIEFuZ29sYSwgQXNpYSwgQ2FuYWRhIHPhur0gdGjhuqVwIGjGoW4gMTk3ODA0MTYgbmfGsOG7nWkgdsOgIDI1JSBz4bq9IGNhbyBoxqFuIDE5NzgwNDE2IG5nxrDhu51pIAotIE1heCBsw6AgZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQuIETDom4gc+G7kSBs4bubbiBuaOG6pXQgY+G7p2EgMSB0cm9uZyBuxINtIHF14buRYyBnaWEgbMOgIDM4MTU1MDEyIG5nxrDhu51pIAoKCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0Kc3VtbWFyeShoMSRQKQpzdW0oaDEkUCkKYGBgCgojIyMgUGjGsMahbmcgc2FpIMSR4buZIGzhu4djaCBjaHXhuqluIHbDoCBjaGnhu4F1IGTDoGkKLSBMZW5naHQgbMOgIMSR4buZIGTDoGkgY+G7p2EgZOG7ryBsaeG7h3UKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpsZW5ndGgoaDEkWSkKYGBgCgotIFZhciBsw6AgdMOtbmggcGjGsMahbmcgc2FpIGPhu6dhIFkKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQp2YXIoaDEkWSkKYGBgCiAgLSBUYSB0aOG6pXkgZ2nDoSB0cuG7iyBj4bunYSBwaMawxqFuZyBzYWkga2jDoSBs4bubbiBuw6puIMSR4buZIHBow6JuIHTDoW4gY+G7p2EgY8OhYyBnacOhIHRy4buLIHh1bmcgcXVhbmggZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBsw6Aga2jDoSBjYW8gCgotIFNkIGzDoCDEkeG7mSBs4buHY2ggY2h14bqpbiBj4bunYSBZIHbDoCBi4bqxbmcgY8SDbiBi4bqtYyBoYWkgY+G7p2EgcGjGsMahbmcgc2FpCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0Kc2QoaDEkWSkKYGBgCiAgLSBUYSB0aOG6pXkgxJHhu5kgbOG7h2NoIGNodeG6qW4gY8WpbmcgY8OzIGdpw6EgdHLhu4sga2jDoSBs4bubbiBuw6puIMSR4buZIHRpbiBj4bqteSBj4bunYSBnacOhIHRy4buLIHTDrG0gxJHGsOG7o2MgY8WpbmcgY2FvCgojIyBUw61uaCB0b8OhbiBjw6FjIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gbmjDs20KCiMjIyBC4bqjbmcgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBxdeG7kWMgZ2lhCi0gQuG6o25nIHRo4buDIGhp4buHbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGPhu5l0IFBvcHVsYXRpb24gdGhlbyB04burbmcgcXXhu5FjIGdpYS4gQ+G7pSB0aOG7gzoKICAtIENhbmFkYSBsw6AgcXXhu5FjIGdpYSBjw7MgZMOibiBz4buRIHRydW5nIGLDrG5oIGzhu5tuIG5o4bqldCB24bubaSAyNjE0MzM5MywxOCBuZ8aw4budaSAKICAtIFjhur9wIHRo4bupIDIgbMOgIEFuZ29sYSB24bubaSBkw6JuIHPhu5EgdHJ1bmcgYsOsbmggbMOgIDEzMTc1ODYzLDU3IG5nxrDhu51pIAogIC0gWOG6v3AgdGjhu6kgMyBsw6AgQ2hpbGUgduG7m2kgZMOibiBz4buRIHRydW5nIGLDrG5oIGzDoCAxMjY1ODE3OCw3MiBuZ8aw4budaSAKICAtIFjhur9wIHRo4bupIGN14buRaSBjw7luZyBsw6AgQW5nZG9yYSB24bubaSBkw6JuIHPhu5EgdHJ1bmcgYsOsbmggbMOgIDQzNTc1LDU2IG5nxrDhu51pIAoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQprMSA8LSBoMSAlPiUgZ3JvdXBfYnkoQykgJT4lIHN1bW1hcmlzZShtZWFuX29mX3AgPSBtZWFuKFApKQptZWFuKGsxJG1lYW5fb2ZfcCkKbGlicmFyeShrbml0cikKZGF0YXRhYmxlKGsxKQpgYGAKCiMjIyBC4bqjbmcgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBuxINtIApgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmsyIDwtIGgxICU+JSBncm91cF9ieShZKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCksbWVhbl9vZl9wID0gbWVhbihQKSkKbWVhbihrMiRtZWFuX29mX3ApCmxpYnJhcnkoa25pdHIpCmRhdGF0YWJsZShrMikKYGBgCi0gQuG6o25nIHRo4buDIGhp4buHbiB04bqnbiBz4buRIHbDoCBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGPhu5l0IFBvcHVsYXRpb24gdGhlbyB04burbmcgbsSDbS4gQ+G7pSB0aOG7gzogCiAgLSBEw6JuIHPhu5EgY+G7p2EgNCBxdeG7kWMgZ2lhIG7Eg20gMjAyMSBsw6AgxJHDtG5nIG5o4bqldCB24bubaSAyMzA1Nzc1NyBuZ8aw4budaSAKICAtIETDom4gc+G7kSBj4bunYSA0IHF14buRYyBnaWEgbsSDbSAxOTUwIGzDoCBpdCBuaOG6pXQgduG7m2kgNjIxMjczMyBuZ8aw4budaSAKCiMjIyBC4bqjbmcgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBuxrDhu5tjIHbDoCB0aGVvIG7Eg20gCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KazMgPC0gaDEgJT4lIGdyb3VwX2J5KEMsWSkgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5fb2ZfUCA9IG1lYW4oUDEpLC5ncm91cHMgPSAnZHJvcCcpCm1lYW4oazMkUDEpCmxpYnJhcnkoa25pdHIpCmRhdGF0YWJsZShrMykKYGBgCiAtIELhuqNuZyB0csOqbiB0aOG7gyBoaeG7h24gdOG6p24gc+G7kSB2w6AgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBj4buZdCBQb3B1bGF0aW9uIHRoZW8gdOG7q25nIHF14buRYyBnaWEgdsOgIHThu6tuZyBuxINtLiAKCgojIE5oaeG7h20gduG7pSAzLjIKCi0tLQoKIyMgxJDhu41jIGThu68gbGnhu4d1IHThu6sgZmlsZSBleGNlbAotIEfDoW4gZOG7ryBsaeG7h3Ugbmd14buTbiB04burIGZpbGUgRXhjZWwgdsOgbyBtIMSR4buDIHjhu60gbMO9IGThu68gbGnhu4d1IHRyw6puIFJTdHVkaW8KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KG9wZW54bHN4KQptIDwtIHJlYWQueGxzeCgiL1VzZXJzL3BoYW14dWFuaG9hbi9Eb3dubG9hZHMvTlktSG91c2UtRGF0YXNldC54bHN4IikKZGF0YXRhYmxlKG0pCmBgYAoKIyMgTcO0IHThuqMgZOG7ryBsaeG7h3UKLSBC4bqjbmcgZOG7ryBsaeG7h3UgbcO0IHThuqMgbcOjIHbDuW5nIGPhu6dhIGPDoWMgcXXhu5FjIGdpYQotIELhuqNuZyBjw7MgKio0ODAxKiogc+G7kSBsaeG7h3UgdsOgICoqMTcqKiBiaeG6v24KLSBC4bqjbmcgY8OzIDYgYmnhur9uIMSR4buLbmggbMaw4bujbmcgdsOgIDExIGJp4bq/biDEkeG7i25oIHTDrW5oCi0gKipicm9rZXJ0aXRsZSoqOiBsb+G6oWkgbcO0aSBnaeG7m2kKLSAqKnR5cGUqKjoga2nhu4N1ICAKLSAqKnByaWNlKio6IGdpw6EgICAKLSAqKmJlZHMqKjogZ2nGsOG7nW5nICAKLSAqKmJhdGgqKjogYuG7k24gdOG6r20KLSAqKnByb3BlcnR5c3FmdCoqOiB0aHXhu5ljIHTDrW5oCi0gKiphZGRyZXNzKio6IMSR4buLYSBjaOG7iQotICoqc3RhdGUqKjp0cuG6oW5nIHRow6FpCi0gKiptYWluIGFkZHJlc3MqKjogdHLhu6Ugc+G7nyBjaMOtbmgKLSAqKmFkbWluaXN0cmF0aXZlIGFyZWEgbGV2ZWwgMioqOiBraHUgduG7sWMgaMOgbmggY2jDrW5oIGPhuqVwIDIKLSAqKmxvY2FsaXR5Kio6IMSR4buLYSBwaMawxqFuZwotICoqc3VibG9jYWxpdHkqKjogdGnhu4N1IMSR4buLYSBwaMawxqFuZwotICoqc3RyZWV0IG5hbWUqKjogdMOqbiDEkcaw4budbmcgCi0gKipsb25nIG5hbWUqKjogdMOqbiBkw6BpIAotICoqZm9ybWF0dGVkKiogYWRkcmVzczrEkeG7i2EgY2jhu4kKLSAqKmxhdGl0dWRlKio6IHbEqSDEkeG7mQotICoqbG9uZ2l0dWRlKio6IGtpbmggxJHhu5kKCiMjIMSQ4buVaSB0w6puIAotIGJyb2tlcnRpdGxlIC0+ICoqYnIqKgotIHR5cGUgLT4gKip0KiogCi0gcHJpY2UgLT4gKipwKiogIAotIGJlZHMgLT4gKipiZSoqCi0gYmF0aCAtPiAqKmJhKioKLSBwcm9wZXJ0eXNxZnQgLT4gKipwcioqCi0gYWRkcmVzcyAtPiAqKmEqKgotIHN0YXRlIC0+ICoqc3QqKgotIG1haW4gYWRkcmVzcyAtPiAqKm0qKgotIGFkbWluaXN0cmF0aXZlIGFyZWEgbGV2ZWwgMiAtPiAqKmFkKioKLSBsb2NhbGl0eSAtPiAqKmwqKgotIHN1YmxvY2FsaXR5IC0+ICoqcyoqCi0gc3RyZWV0IG5hbWUgLT4gKipzbioqCi0gbG9uZyBuYW1lIC0+ICoqbG4qKgotIGZvcm1hdHRlZCBhZGRyZXNzIC0+ICoqZmEqKgotIGxhdGl0dWRlIC0+ICoqbGEqKgotIGxvbmdpdHVkZSAtPiAqKmxvKioKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpuYW1lcyhtKSA8LSBjKCJiciIsInQiLCJwIiwiYmUiLCJiYSIsInByIiwiYSIsInN0IiwibSIsImFkIiwibCIsInMiLCJzbiIsImxuIiwiZmEiLCJsYSIsImxvIikKbmFtZXMobSkKZGF0YXRhYmxlKG0pCmBgYAoKIyMgUsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgCi0gTOG7jWMgZOG7ryBsaeG7h3UgY2jhu4kgbOG6pXkgNCBsb+G6oWk6IEhvdXNlIGZvciBzYWxlLCBDb25kbyBmb3Igc2FsZSwgQ28tb3AgZm9yIHNhbGUsIExhbmQgZm9yIHNhbGUgdsOgIDUgYmnhur9uIGzDoCBCUk9LRVJUSVRMRSxUWVBFLCBQUklDRSwgQkVEUywgQkFUSCAgxJHhu4MgeOG7rSBsw70gZOG7ryBsaeG7h3UuClRhIGPDsyBi4bqjbmcgc+G7kSBsaeG7h3UgbmjGsCBzYXU6CmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKbTEgPC0gZmlsdGVyKG0sdD09J0hvdXNlIGZvciBzYWxlJ3wgdD09J0NvbmRvIGZvciBzYWxlJ3wgdD09J0NvLW9wIGZvciBzYWxlJ3wgdD09J0xhbmQgZm9yIHNhbGUnICkgJT4lIHNlbGVjdCgtYygncHInLCdhJywnc3QnLCdtJywnYWQnLCdsJywncycsJ3NuJywnbG4nLCdmYScsJ2xhJywnbG8nKSkKdGFibGUgPC0ga25pdHI6OmthYmxlKG0xLCBmb3JtYXQ9Im1hcmtkb3duIikKZGF0YXRhYmxlKG0xKQpgYGAKCiMjIELhuqNuZyB04bqnbiBz4buRCgojIyMgQuG6o25nIHThuqduIHPhu5EgdGhlbyBsb+G6oWkKLSBC4bqjbmcgdGjhu4MgaGnhu4duIHThuqduIHPhu5EgeHXhuqV0IGhp4buHbiBj4bunYSB04burbmcgcXXDtGMgZ2lhLiBD4bulIHRo4buDOgogIC0gVOG6p24gc+G7kSBj4bunYSBDby1vcCBmb3Igc2FsZSBsw6AgbOG7m24gbmjhuqV0IHbhu5tpIDE0NTAKICAtIFThuqduIHPhu5EgY+G7p2EgSG91c2UgZm9yIHNhbGUgIHjhur9wIHRo4bupIG5ow6wgduG7m2kgMTAxMiAKICAtIFThuqduIHPhu5EgY+G7p2EgQ09uZG8gZm9yIHNhbGUgeOG6v3AgdGjhu6kgYmEgduG7m2kgODkxCiAgLVThuqduIHPhu5EgY+G7p2EgTGFuZCBmb3Igc2FsZSB44bq/cCBjdeG7kWkgduG7m2kgNDkgCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KdGFibGUobTEkdCkKYGBgCgojIyMgVGEgY2hpYSBi4bqjbmcgc+G7kSBsaeG7h3UgdGjDoG5oIDMgcGjhuqduIHRoZW8gc+G7kSBi4buTbiB04bqvbQotIFRhIHRo4bqleSBt4bupYyDEkeG7mSBwaMOibiBi4buVIGtow7RuZyDEkeG7k25nIMSR4buBdSBnaeG7r2EgY8OhYyBsb+G6oWkgY8SDbiBo4buZLiBD4bulIHRo4buDOgogIC1DxINuIGjhu5kgY8OzIHPhu5EgYuG7k24gdOG6r20gdOG7qyAwLDk4NS02IGzDoCBs4bubbiBuaGnhu4F1IG5o4bqldCB24bubaSAzMzg2IGPDoWkKICAtIEPEg24gaOG7mSBjw7Mgc+G7kSBi4buTbiB04bqvbSB04burIDYtMTEgeOG6v3AgdGjhu6kgbmjDrCB24bubaSAxNCBjw6FpCiAgLSBDxINuIGjhu5kgY8OzIHPhu5EgYuG7k24gdOG6r20gdOG7qyAxMS0xNiBsw6Agw610IG5o4bqldCB24bubaSAyIGPDoWkKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQp0YWJsZShjdXQobTEkYmEsMykpCmBgYAoKIyMgVMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nCgojIyMgQuG6o25nIHTDs20gdOG6r3QgdGhlbyBiZSB2w6AgdMOtbmggdOG7lW5nIGJlIGPhu6dhIDQgbGFvaWogY8SDbiBo4buZIAotIE1pbiBsw6AgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQuIEPhu6UgdGjhu4M6IFPhu5EgZ2nGsOG7nW5nIMOtdCBuaOG6pXQgY+G7p2EgbeG7mXQgY8SDbiBo4buZIGzDoCAxIGPDoWkgCi0gMXN0IFF1LiBsw6AgZ2nDoSB0cuG7iyB0aOG7qSBuaOG6pXQgY+G7p2EgcGjDom4gduG7iyAyNSUuIFThu6ljIGzDoDoKICAtIEPDsyAyNSUgc+G7kSBjxINuIGjhu5kgY8OzIHPhu5EgZ2nGsOG7nW5nIMOtdCBoxqFuIDIgY8OhaSBnacaw4budbmcKICAtIEPDsyA3NSAlIHPhu5EgY8SDbiBo4buZIGPDsyBz4buRIGdpxrDhu51uZyBs4bubbiBoxqFuIDIgY8OhaSBnacaw4budbmcKLSBNZWRpYW4gbMOgIHRydW5nIHbhu4sgY8OzIGdpw6EgdHLhu4sgbOG7m24gaMahbiA1MCUgc+G7kSBz4buRIGxp4buHdSB2w6AgYsOpIGjGoW4gNTAlIHPhu5Egc+G7kSBsaeG7h3UuIFThu6ljIGzDoDoKICAtIEPDsyA1MCUgc+G7kSBjxINuIGjhu5kgY8OzIMOtdCBoxqFuIDMgY8OhaSBnacaw4budbmcgCiAgLSBDw7MgNTAlIHPhu5EgY8SDbiBo4buZIGPDsyBuaGnhu4F1IGjGoW4gMyBjw6FpIGdpxrDhu51uZyAKLSBNZWFuIGzDoCBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIFAKICAtU+G7kSBnacaw4budbmcgdHJ1bmcgYsOsbmggY+G7p2EgNCBsb+G6oWkgY8SDbiBo4buZIGzDoCAyLjYxCi0gM3JkIFF1LiBsw6AgZ2nDoSB0cuG7iyBwaMOibiB24buLIHRo4bupIDMgY+G7p2EgNzUlIC4gVOG7qWMgbMOgOgogIC0gQ8OzIDc1ICUgc+G7kSBjxINuIGjhu5kgY8OzIHPhu5EgZ2nGsOG7nW5nIMOtdCBoxqFuIDMgY8OhaSAKICAtIEPDsyAyNSAlIHPhu5EgQ8SDbiBo4buZIGPDsyBz4buRIGdpxrDhu51uZyBuaGnhu4F1IGjGoW4gMyBjw6FpIAotIE1heCBsw6AgZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQuIFPhu5EgZ2nGsOG7nW5nIG5oaeG7gXUgbmjhuqV0IGPhu6dhIDEgcGjDsm5nIGzDoCAzMiBjw6FpIAoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpzdW1tYXJ5KG0xJGJlKQpzdW0obTEkYmUpCmBgYAoKIyMjIFBoxrDGoW5nIHNhaSDEkeG7mSBs4buHY2ggY2h14bqpbiB2w6AgY2hp4buBdSBkw6BpCi0gTGVuZ2h0IGzDoCDEkeG7mSBkw6BpIGPhu6dhIGThu68gbGnhu4d1CmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KbGVuZ3RoKG0xJGJlKQpgYGAKCi0gVmFyIGzDoCB0w61uaCBwaMawxqFuZyBzYWkgY+G7p2EgWQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9CnZhcihtMSRiZSkKYGBgCiAgLSBUYSB0aOG6pXkgZ2nDoSB0cuG7iyBj4bunYSBwaMawxqFuZyBzYWkga2jDoSBuaOG7jyBuw6puIMSR4buZIHBow6JuIHTDoW4gY+G7p2EgY8OhYyBnacOhIHRy4buLIHh1bmcgcXVhbmggZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBsw6Aga2jDoSB0aOG6pXAgCgotIFNkIGzDoCDEkeG7mSBs4buHY2ggY2h14bqpbiBj4bunYSBZIHbDoCBi4bqxbmcgY8SDbiBi4bqtYyBoYWkgY+G7p2EgcGjGsMahbmcgc2FpCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0Kc2QobTEkYmUpCmBgYAogIC0gVGEgdGjhuqV5IMSR4buZIGzhu4djaCBjaHXhuqluIGPFqW5nIGPDsyBnacOhIHRy4buLIGtow6Egbmjhu48gbsOqbiDEkeG7mSB0aW4gY+G6rXkgY+G7p2EgZ2nDoSB0cuG7iyB0w6xtIMSRxrDhu6NjIGPFqW5nIHRo4bqlcAoKIyMgVMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyB0aGVvIG5ow7NtCgojIyMgQuG6o25nIHTDrW5oIHRydW5nIGLDrG5oIGdpxrDhu51uZwpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9Cm4xIDwtIG0xICU+JSBncm91cF9ieSh0KSAlPiUgc3VtbWFyaXNlKG1lYW5fb2ZfYmVkID0gbWVhbihiZSkpCm1lYW4objEkbWVhbl9vZl9iZSkKbGlicmFyeShrbml0cikKZGF0YXRhYmxlKG4xKQpgYGAKLSBC4bqjbmcgdGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgY+G7mXQgQkVicyB0aGVvIHThu6tuZyBsb+G6oWkgY8SDbiBo4buZLiBD4bulIHRo4buDOgogIC0gSG91c2UgZm9yIHNhbGUgbMOgIGPEg24gaOG7mSBjw7Mgc+G7kSBnacaw4budbmcgdHJ1bmcgYsOsbmggbOG7m24gbmjhuqV0IHbhu5tpIDMuNzM4MTQyIGPDoWkKICAtIFjhur9wIHRo4bupIDIgbMOgIExhbmQgZm9yIHNhbGUgduG7m2kgc+G7kSBnacaw4budbmcgdHJ1bmcgYsOsbmggbMOgIDMgY8OhaSAKICAtIFjhur9wIHRo4bupIDMgbMOgIENvbmRvIGZvciBzYWxlIHbhu5tpIHPhu5EgZ2nGsOG7nW5nIHRydW5nIGLDrG5oIGzDoCAyLjMzMjIxMSBjw6FpIAogIC0gWOG6v3AgdGjhu6kgY3Xhu5FpIGPDuW5nIGzDoCBDby1vcCBmb3Igc2FsZSB24bubaSBz4buRIGdpxrDhu51uZyB0cnVuZyBiw6xuaCBsw6AgMS45OCBjw6FpCgojIyMgQuG6o25nIHRo4buDIGhp4buHbiBz4buRIGdpxrDhu51uZyB0cnVuZyBiw6xuaCB0aGVvIGxv4bqhaSBjxINuIGjhu5kgCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KbjIgPC0gbTEgJT4lIGdyb3VwX2J5KHQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSxtZWFuX29mX2JlZCA9IG1lYW4oYmUpKQptZWFuKG4yJG1lYW5fb2ZfYmUpCmxpYnJhcnkoa25pdHIpCmRhdGF0YWJsZShuMikKYGBgCgojIyMgQuG6om5nIHRo4buDIGhp4buHbiBz4buRIGLhu5NuIHTEg20gdHJ1bmcgYsOsbmggdGhlbyBsb+G6oWkgY8SDbiBo4buZCi0gVGEgdGjhuqV5OgogIC0gU+G7kSBi4buTbiB0xINtIHRydW5nIGLDrG5oIGPhu6dhIEhvdXNlIGZvciBzYWxlIGzDoCBs4bubbiBuaOG6pXQgduG7m2kgMi41MzU5NjQgY8OhaQogIC0gU+G7kSBi4buTbiB04bqvbSB0cnVuZyBiw6xuaCBj4bunYSBMYW5kIGZvciBzYWxlIHjhur9wIHRo4bupIG5ow6wgduG7m2kgMi4zNjYyMzEgY8OhaSAKICAtIFPhu5EgYuG7k24gdMSDbSB0cnVuZyBiw6xuaCBj4bunYSBDb25kbyBmb3Igc2FsZSB44bq/cCB0aOG7qSBiYSB24bubaSAyLjAwODI1NiBjw6FpCiAgLSBT4buRIGLhu5NuIHTEg20gdHJ1bmcgYsOsbmggY+G7p2EgQ28tb3AgZm9yIHNhbGUgbMOgIHRo4bqlcCBuaOG6pXQgduG7m2kgMS40MzcyMzUgY8OhaQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9Cm4zIDwtIG0xICU+JSBncm91cF9ieSh0KSAlPiUgc3VtbWFyaXNlKG1lYW5fb2ZfYmF0aCA9IG1lYW4oYmEpKQptZWFuKG4zJG1lYW5fb2ZfYmEpCmxpYnJhcnkoa25pdHIpCmRhdGF0YWJsZShuMykKYGBgCgo=