01/16(TU) Rでデータサイエンス4:貧困 [Main]
データについて
Poverty rates at national poverty lines
Poverty headcount ratio at national poverty lines (% of
population):SI.POV.NAHC [Link]
National poverty headcount ratio is the percentage of the population
living below the national poverty line(s). National estimates are based
on population-weighted subgroup estimates from household surveys. For
economies for which the data are from EU-SILC, the reported year is the
income reference year, which is the year before the survey year.
全国貧困人口比率は、全国貧困線以下で生活している人口の割合です。国の推定値は、世帯調査からの人口加重サブグループ推定値に基づいています。データが
EU-SILC
からのものである経済の場合、報告される年は所得基準年、つまり調査年の前年です。
Poverty and Inequality―Poverty rates at international poverty
lines
Poverty headcount ratio at $2.15 a day (2017 PPP) (% of
population):SI.POV.DDAY [Link]
Poverty headcount ratio at $2.15 a day is the percentage of the
population living on less than $2.15 a day at 2017 purchasing power
adjusted prices. As a result of revisions in PPP exchange rates, poverty
rates for individual countries cannot be compared with poverty rates
reported in earlier editions.
1日2.15ドルの貧困人口比率は、2017年の購買力調整後価格で1日2.15ドル未満で生活している人口の割合です。PPP
為替レートの改定により、各国の貧困率を以前の版で報告された貧困率と比較することができなくなりました。
Poverty headcount ratio at $3.65 a day (2017 PPP) (% of
population):SI.POV.LMIC [Link]
Poverty headcount ratio at $3.65 a day is the percentage of the
population living on less than $3.65 a day at 2017 international
prices.
1 日 3.65 ドルの貧困人口比率は、2017 年の国際価格で 1 日 3.65
ドル未満で生活している人口の割合です。
Poverty headcount ratio at $6.85 a day (2017 PPP) (% of
population):SI.POV.UMIC [Link]
Poverty headcount ratio at $6.85 a day is the percentage of the
population living on less than $6.85 a day at 2017 international
prices.
1日6.85ドルの貧困人口比率は、2017年の国際価格で1日6.85ドル未満で生活している人口の割合です。
貧困者率
生活するための基本的ニーズを賄うために必要とそれぞれの国が考える基準を満たしていない人口の割合
$2.15/日 ($65.4/月, 785/年), $3.65($111.0/月, $1,332/年),
$6.85($208.4/月, $2,500/年)
Poverty headcount ratio at $2.15 a day (2017 PPP) (% of
population):SI.POV.DDAY [Link]
Poverty headcount ratio at $3.65 a day (2017 PPP) (% of
population):SI.POV.LMIC [Link]
Poverty headcount ratio at $6.85 a day (2017 PPP) (% of
population):SI.POV.UMIC [Link]
準備
library(tidyverse)
library(WDI)
データの読み込み(importing)
追加情報(地域・所得レベル)を読み込みたいので、extra=TRUE
としてあります。
最初の1回目は、かならず実行してください。
df_poverty_rate <- WDI(
indicator = c(ratio = "SI.POV.NAHC",
under_2.15 = "SI.POV.DDAY",
under_3.65 = "SI.POV.LMIC",
under_6.85 = "SI.POV.UMIC"),
extra = TRUE)
保存と読み込み
2回目からは、data
から読み込めるようにしておきます。
最初の1回目は、かならず実行してください。
write_csv(df_poverty_rate, "data/poverty_rate.csv")
df_poverty_rate <- read_csv("data/poverty_rate.csv")
Rows: 16758 Columns: 16── Column specification ─────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (7): country, iso2c, iso3c, region, capital, income, lending
dbl (7): year, ratio, under_2.15, under_3.65, under_6.85, longitude, latitude
lgl (1): status
date (1): lastupdated
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
データを見てみよう (viewing)
df_poverty_rate
または、head(df_poverty_rate)
と、str(df_poverty_rate)
df_poverty_rate
str(df_poverty_rate)
spc_tbl_ [16,758 × 16] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
$ country : chr [1:16758] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
$ iso2c : chr [1:16758] "AF" "AF" "AF" "AF" ...
$ iso3c : chr [1:16758] "AFG" "AFG" "AFG" "AFG" ...
$ year : num [1:16758] 2014 1971 2006 2013 1995 ...
$ status : logi [1:16758] NA NA NA NA NA NA ...
$ lastupdated: Date[1:16758], format: "2023-12-18" "2023-12-18" "2023-12-18" ...
$ ratio : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
$ under_2.15 : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
$ under_3.65 : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
$ under_6.85 : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
$ region : chr [1:16758] "South Asia" "South Asia" "South Asia" "South Asia" ...
$ capital : chr [1:16758] "Kabul" "Kabul" "Kabul" "Kabul" ...
$ longitude : num [1:16758] 69.2 69.2 69.2 69.2 69.2 ...
$ latitude : num [1:16758] 34.5 34.5 34.5 34.5 34.5 ...
$ income : chr [1:16758] "Low income" "Low income" "Low income" "Low income" ...
$ lending : chr [1:16758] "IDA" "IDA" "IDA" "IDA" ...
- attr(*, "spec")=
.. cols(
.. country = col_character(),
.. iso2c = col_character(),
.. iso3c = col_character(),
.. year = col_double(),
.. status = col_logical(),
.. lastupdated = col_date(format = ""),
.. ratio = col_double(),
.. under_2.15 = col_double(),
.. under_3.65 = col_double(),
.. under_6.85 = col_double(),
.. region = col_character(),
.. capital = col_character(),
.. longitude = col_double(),
.. latitude = col_double(),
.. income = col_character(),
.. lending = col_character()
.. )
- attr(*, "problems")=<externalptr>
変数の選択(selecting)
利用しない変数もあるので select
を使って変数を減らします。見やすいように、under_2.15
が NA
のものは、削除してあります。
df_poverty_rate_selected <- df_poverty_rate |> drop_na(under_2.15) |>
select(country, year, ratio, under_2.15, under_3.65, under_6.85, region)
df_poverty_rate_selected
練習 最後に少し加えると日本について見ることができます。どうしますか。
df_poverty_rate_selected
変形(Wide to Long Data)
四つの指標を同時にいくつか選択し比較したいので、一つの列(変数)にならべた、縦長データ(long
data)も作成しておきます。
pivot_longer(ratio:under_6.85, names_to = "level", values_to = "value")
ここでは、ratio
から under_6.85
を、level
という名前の列にならべ、値を value
という列に並べるようにしてあります。
確認するときは、value が NA のものは除き、country と、iso2c と、level
と value の部分だけ取り出して確認しています。
df_poverty_rate_long <- df_poverty_rate_selected |>
pivot_longer(ratio:under_6.85, names_to = "level", values_to = "value")
df_poverty_rate_long |> drop_na(value) |> select(country, level, value, region)
年毎のデータの数の確認(number of data in each year)
df_poverty_rate_long |> drop_na(value) |>
group_by(year, level) |> summarize(n = n()) |> arrange(desc(year))
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
考察:それぞれの国での貧困率のデータ(ratio)が
多い場合も、絶対的な貧困率が多い場合もあるようだが、指標ごとに集計してみる。
df_poverty_rate_long |> filter(year %in% c(1960, 1970, 1980, 1990, 2000, 2010, 2020)) |> drop_na(value) |> group_by(year, level) |> summarize(n = n()) |>
ggplot(aes(as.character(year), n, fill = level)) + geom_col(position = "dodge", col = "black", linewidht = 0.1) + labs(x = "year", y = "number of data")
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.Warning: Ignoring unknown parameters: `linewidht`
考察:それぞれの国での貧困率のデータ(ratio)は、2000年以降、under_2.15,
under_3.65, under_6.85
は、同じ数ずつあるので、同時にデータを集めていると思われる。
世界とサハラ砂漠以南のアフリカのデータの経年変化
df_poverty_rate_long |>
filter(country %in% c("World", "Sub-Saharan Africa")) |> drop_na() |>
ggplot(aes(year, value, col = level, linetype = country)) + geom_line()
考察:Sub-Saharan Africa
のデータはないようです。たしかに、ratio
は、国ごとに決めるものですから、地域の場合には、ratio
の値はないのでしょう。
df_poverty_rate_long |> filter(year %in% c(2000, 2010, 2020)) |> drop_na(value) |>
filter(region == "Aggregates") |> filter(level %in% c("ratio", "under_2.15")) |> group_by(country, year, level) |> summarize(n = n())
`summarise()` has grouped output by 'country', 'year'. You can override using the `.groups` argument.
Sub Saharan Africa
はデータはありませんが、統計的に処理して(平均のようなものを取って)表示することは可能です。
loess (Local Polynomial Regression)
は、少しずつ区切って、多項式近似を使っているいます。そこで、マイナスの値も出てきてしまっています。しかし、大体の傾向をみることはできます。上で見たデータの数から、1992年以降にしておくのが良いでしょう。
df_poverty_rate_long |> drop_na(value) |> filter(!is.na(region), region != "Aggregates") |>
filter(level == "under_2.15") |>
ggplot(aes(year, value, col = region)) + geom_smooth(formula = 'y ~ x', se = FALSE)
df_poverty_rate_long |> drop_na(value) |>
filter(!is.na(region), region != "Aggregates", year > 1991) |>
filter(level == "under_2.15") |>
ggplot(aes(year, value, col = region)) + geom_smooth(formula = 'y ~ x', method = 'loess', se = FALSE) + labs(title = "Regionally aggregated ratio under 2.15 USD")
df_poverty_rate_long |> drop_na(value) |>
filter(!is.na(region), region != "Aggregates", year > 1991) |>
filter(level != "ratio") |>
ggplot(aes(year, value, col = region, linetype = level)) + geom_smooth(formula = 'y ~ x', method = 'loess', se = FALSE) + labs(title = "Regionally aggregated ratio")
df_poverty_rate_long |> drop_na(value) |>
filter(!is.na(region), region == "Sub-Saharan Africa", year > 1991) |>
ggplot(aes(year, value, col = level)) + geom_smooth(formula = 'y ~ x', method = 'loess', se = TRUE) + labs(title = "Sub-Saharan region aggregated ratio")
サハラ砂漠以南(Sub-Saharan Africa) の国のデータ
df_poverty_rate_long |> drop_na(value) |>
filter(region == "Sub-Saharan Africa") |> group_by(country, level) |>
summarize(n = n())
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
アフリカ南部5カ国の分析
国のリストの設定
SOUTH_AFRICA_FIVE に、South Africa, Namibia, Eswatini, Botswana,
Lesotho を設定
SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")
5カ国のデータを確認
df_poverty_rate_selected
と、df_poverty_rate_long
について、アフリカ南部5カ国のデータを確認
df_poverty_rate_selected |> filter(country %in% SOUTH_AFRICA_FIVE)
df_poverty_rate_long |> filter(country %in% SOUTH_AFRICA_FIVE)
各貧困率を折れ線グラフで描いてみる
南アフリカについて
df_poverty_rate_long |>
filter(country == "South Africa") |> drop_na(value) |>
ggplot(aes(year, value, col = level)) + geom_line()
考察:2000年から2008年ごろまで減少しているが、その後、上昇傾向が見られる。
5カ国同時に
df_poverty_rate_long |>
filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(value) |>
ggplot(aes(year, value, col = country, linetype = level)) + geom_line()
考察:複雑でわかりやすいとはいえない
df_poverty_rate_long |>
filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(value) |> filter(level != "ratio") |>
ggplot(aes(year, value, col = country, linetype = level)) + geom_line()
考察:国ごとに決めた貧困率をのぞいてみた。多少改善した。しかし、あとは好み。
5カ国の最新のデータ
df_poverty_rate_selected |>
filter(country %in% SOUTH_AFRICA_FIVE) |>
drop_na(under_2.15) |> group_by(country) |> filter(year == max(year)) |>
select(country, year, ratio:under_6.85)
考察:毎年データがあるわけではないので、それぞの国ごとに最新のものを見ることとする
南アフリカ5カ国の貧困度ごとの人口比
df_poverty_rate_long |>
filter(country %in% SOUTH_AFRICA_FIVE) |>
drop_na(value) |> group_by(country) |> filter(year == max(year)) |>
ggplot(aes(country, value, fill = level)) + geom_col(position = "dodge", col = "black", linewidth = 0.1) +
labs(title = "Povert Level Ratio of Five Countries", subtitle = "Botswana in 2015, Eswatini in 2016 ,Lesoto in 2017, Namibia in 2015 \nand South Africa in 2014")
LS0tCnRpdGxlOiAi6LKn5Zuw546HIC0gUG92ZXJ0eSBSYXRlIgphdXRob3I6ICJILiBTdXp1a2kiCmRhdGU6ICIyMDI05bm0MeaciDE25pelIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCi0gICDvvIjliKXjga7jgr/jg5bjgb7jgZ/jga8g44Km44Kj44Oz44OJ44Km44Gn77yJUG9zaXRDbG91ZCDjgavjg63jgrDjgqTjg7PvvIjjgqLjgqvjgqbjg7Pjg4jjga7jgarjgYTkurrjga/jgrXjgqTjg7Pjg7vjgqLjg4Pjg5fvvIlbW1Bvc2l0LmNsb3VkXShodHRwczovL3Bvc2l0LmNsb3VkLyld44O7W1vlhbHmnInjg5fjg63jgrjjgqfjgq/jg4hdKGh0dHBzOi8vcG9zaXQuY2xvdWQvY29udGVudC81NTM5NzYzKV0KCiMjIOism+e+qSAx5pyIMTHml6XvvIjmnKjvvInljZfpg6jjgqLjg5Xjg6rjgqvoq7jlm73jga7nirbms4EKCi0gICBJTkVRVUFMSVRZIElOIFNPVVRIRVJOIEFGUklDQToLQU4gQVNTRVNTTUVOVCBPRiBUSEUgU09VVEhFUk4gQUZSSUNBTgtDVVNUT01TIFVOSU9OIFtbUmVwb3J0XShodHRwczovL2RvY3VtZW50czEud29ybGRiYW5rLm9yZy9jdXJhdGVkL2VuLzA5OTEyNTMwMzA3MjIzNjkwMy9wZGYvUDE2NDkyNzBjMDJhMWYwNmIwYTNhZTAyZTU3ZWFkZDdhODIucGRmKV0gW1tMaW5rXShodHRwczovL29wZW5rbm93bGVkZ2Uud29ybGRiYW5rLm9yZy9lbnRpdGllcy9wdWJsaWNhdGlvbi85ZjhlNDA3My0yNWY5LTU2MmMtOGUzYi01NDFjOTlkZDQyY2IpXQoKLSAgIOWNl+OCouODleODquOCq++8iFNvdXRoIEFmcmljYe+8ieOAgeODrOOCveODiO+8iExldGhvdG/vvInjgIHjgqjjgrnjg6/jg4bjgqPjg4vvvIhFc3dhdGluae+8ieOAgeODiuODn+ODk+OCou+8iE5hbWl2aWHvvInjgIHjg5zjg4Tjg6/jg4rvvIhCb3Rzd2FuYe+8iQoKICAgIC0gICDlj5forJvmhJ/mg7PjgavjgYvjgYjjgabvvJrjgrjjg4vmjIfmlbDjgajmiYDlvpfliIbluIMgLSDntprnt6ggW1tSIE5vdGVib29rXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9naW5pX3VwZGF0ZWQubmIuaHRtbCldLCBbW1JtZF0oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL2dpbmlfdXBkYXRlZC5SbWQpXQoKIyMg5ryU57+SIDHmnIgxNuaXpe+8iOeBq++8iQoKIyMgMDEvMTYoVFUp44CAUuOBp+ODh+ODvOOCv+OCteOCpOOCqOODs+OCuTQ66LKn5ZuwIFtbTWFpbl0oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvZ2VzMDAxLW1haW4ubmIuaHRtbCldCgojIyMg44OH44O844K/44Gr44Gk44GE44GmCgoqKlBvdmVydHkgcmF0ZXMgYXQgbmF0aW9uYWwgcG92ZXJ0eSBsaW5lcyoqCgpQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBuYXRpb25hbCBwb3ZlcnR5IGxpbmVzICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLk5BSEMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLk5BSEMpXQoKTmF0aW9uYWwgcG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvcHVsYXRpb24gbGl2aW5nIGJlbG93IHRoZSBuYXRpb25hbCBwb3ZlcnR5IGxpbmUocykuIE5hdGlvbmFsIGVzdGltYXRlcyBhcmUgYmFzZWQgb24gcG9wdWxhdGlvbi13ZWlnaHRlZCBzdWJncm91cCBlc3RpbWF0ZXMgZnJvbSBob3VzZWhvbGQgc3VydmV5cy4gRm9yIGVjb25vbWllcyBmb3Igd2hpY2ggdGhlIGRhdGEgYXJlIGZyb20gRVUtU0lMQywgdGhlIHJlcG9ydGVkIHllYXIgaXMgdGhlIGluY29tZSByZWZlcmVuY2UgeWVhciwgd2hpY2ggaXMgdGhlIHllYXIgYmVmb3JlIHRoZSBzdXJ2ZXkgeWVhci4KCuWFqOWbveiyp+WbsOS6uuWPo+avlOeOh+OBr+OAgeWFqOWbveiyp+WbsOe3muS7peS4i+OBp+eUn+a0u+OBl+OBpuOBhOOCi+S6uuWPo+OBruWJsuWQiOOBp+OBmeOAguWbveOBruaOqOWumuWApOOBr+OAgeS4luW4r+iqv+afu+OBi+OCieOBruS6uuWPo+WKoOmHjeOCteODluOCsOODq+ODvOODl+aOqOWumuWApOOBq+WfuuOBpeOBhOOBpuOBhOOBvuOBmeOAguODh+ODvOOCv+OBjCBFVS1TSUxDIOOBi+OCieOBruOCguOBruOBp+OBguOCi+e1jOa4iOOBruWgtOWQiOOAgeWgseWRiuOBleOCjOOCi+W5tOOBr+aJgOW+l+Wfuua6luW5tOOAgeOBpOOBvuOCiuiqv+afu+W5tOOBruWJjeW5tOOBp+OBmeOAggoKKipQb3ZlcnR5IGFuZCBJbmVxdWFsaXR54oCVUG92ZXJ0eSByYXRlcyBhdCBpbnRlcm5hdGlvbmFsIHBvdmVydHkgbGluZXMqKgoKUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQyLjE1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuRERBWSBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuRERBWSldCgpQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDIuMTUgYSBkYXkgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvcHVsYXRpb24gbGl2aW5nIG9uIGxlc3MgdGhhbiBcJDIuMTUgYSBkYXkgYXQgMjAxNyBwdXJjaGFzaW5nIHBvd2VyIGFkanVzdGVkIHByaWNlcy4gQXMgYSByZXN1bHQgb2YgcmV2aXNpb25zIGluIFBQUCBleGNoYW5nZSByYXRlcywgcG92ZXJ0eSByYXRlcyBmb3IgaW5kaXZpZHVhbCBjb3VudHJpZXMgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggcG92ZXJ0eSByYXRlcyByZXBvcnRlZCBpbiBlYXJsaWVyIGVkaXRpb25zLgoKMeaXpTIuMTXjg4njg6vjga7osqflm7Dkurrlj6Pmr5Tnjofjga/jgIEyMDE35bm044Gu6LO86LK35Yqb6Kq/5pW05b6M5L6h5qC844GnMeaXpTIuMTXjg4njg6vmnKrmuoDjgafnlJ/mtLvjgZfjgabjgYTjgovkurrlj6Pjga7libLlkIjjgafjgZnjgIJQUFAg54K65pu/44Os44O844OI44Gu5pS55a6a44Gr44KI44KK44CB5ZCE5Zu944Gu6LKn5Zuw546H44KS5Lul5YmN44Gu54mI44Gn5aCx5ZGK44GV44KM44Gf6LKn5Zuw546H44Go5q+U6LyD44GZ44KL44GT44Go44GM44Gn44GN44Gq44GP44Gq44KK44G+44GX44Gf44CCCgpQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDMuNjUgYSBkYXkgKDIwMTcgUFBQKSAoJSBvZiBwb3B1bGF0aW9uKe+8mlNJLlBPVi5MTUlDIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NJLlBPVi5MTUlDKV0KClBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGF0IFwkMy42NSBhIGRheSBpcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiBsaXZpbmcgb24gbGVzcyB0aGFuIFwkMy42NSBhIGRheSBhdCAyMDE3IGludGVybmF0aW9uYWwgcHJpY2VzLgoKMSDml6UgMy42NSDjg4njg6vjga7osqflm7Dkurrlj6Pmr5Tnjofjga/jgIEyMDE3IOW5tOOBruWbvemam+S+oeagvOOBpyAxIOaXpSAzLjY1IOODieODq+acqua6gOOBp+eUn+a0u+OBl+OBpuOBhOOCi+S6uuWPo+OBruWJsuWQiOOBp+OBmeOAggoKUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQ2Ljg1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuVU1JQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuVU1JQyldCgpQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDYuODUgYSBkYXkgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvcHVsYXRpb24gbGl2aW5nIG9uIGxlc3MgdGhhbiBcJDYuODUgYSBkYXkgYXQgMjAxNyBpbnRlcm5hdGlvbmFsIHByaWNlcy4KCjHml6U2Ljg144OJ44Or44Gu6LKn5Zuw5Lq65Y+j5q+U546H44Gv44CBMjAxN+W5tOOBruWbvemam+S+oeagvOOBpzHml6U2Ljg144OJ44Or5pyq5rqA44Gn55Sf5rS744GX44Gm44GE44KL5Lq65Y+j44Gu5Ymy5ZCI44Gn44GZ44CCCgojIyDlvqnnv5IKCuiyp+WbsOOBr+OAgeOBqeOBruOCiOOBhuOBquWwuuW6puOBp+a4rOOCi+OBruOBoOOCjeOBhuOBi+OAggoKMS4gIOS4gOS6uuW9k+OBn+OCiuOBruizvOiyt+WKm+W5s+S+oe+8iFB1cmNoYXNpbmcgUG93ZXIgUGFyaXRpZXPvvInjgavjgojjgovlm73lhoXnt4/nlJ/nlKPvvIhHcm9zcyBEb21lc3RpYyBQcm9kdWN077yJCgogICAgLSAgIEdEUCBwZXIgY2FwaXRhLCBQUFAgKGNvbnN0YW50IDIwMTcgaW50ZXJuYXRpb25hbCBcJCk6IE5ZLkdEUC5QQ0FQLlBQLktEIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL05ZLkdEUC5QQ0FQLlBQLktEKV0KCiAgICAtICAgMTIvMTMg5qW15bqm44Gr6LKn44GX44GE77yB77yfIFtbUiBOb3RlYm9va10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvcG92ZXJ0eS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvcG92ZXJ0eS5SbWQpXQoKICAgIC0gICDlm73jgZTjgajjga7miYDlvpfjga7lubPlnYfjga7jgojjgYbjgarjgoLjga7jga/jgo/jgYvjgovjgYzjgIHmpbXluqbjga7osqflm7Djga7kurrjgYzjganjga7nqIvluqbjgYTjgovjga7jgYvjga/jgo/jgYvjgonjgarjgYTjgIIKCjIuICDkurrlj6Pli5XmhYvvvIhkZW1vZ3JhcGh577yJCgogICAgLSAgIOS6uuWPo+OBruODh+ODvOOCv++8iOe3j+S6uuWPo+OAgeWHuueUn+eOh+OAgeatu+S6oeeOh+OAgeiLpeW5tOiAheaJtumkiueOh+OAgemrmOm9ouiAheaJtumkiueOh++8iQoKICAgIC0gICAxMi8yMCDkurrlj6Pli5XmhYvvvIhkZW1vZ3JhcGh577yJW1tSIE5vdGVib29rXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9kZW1vZ3JhcGh5Lm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS9kZW1vZ3JhcGh5LlJtZCldCgogICAgLSAgIOS6uuWPo+ODh+ODvOOCv+OBr+WfuuacrOeahOOBp+OAgeWbveOBruWApOOBi+OCieWAi+S6uuOBruWApOOCkuaxguOCgeOBn+OCiuOAgeS7luOBruWbveOBqOavlOi8g+OBl+OChOOBmeOBhOWJsuWQiOOBi+OCieWun+mam+OBruaVsOOCkuaxguOCgeOCi+OBquOBqeOBq+W/hemgiAoKMy4gIOOCuOODi+aMh+aVsOOBiuOCiOOBs+aJgOW+l+WIhuW4gwoKICAgIC0gICDjgrjjg4vmjIfmlbDvvIhHaW5p77yJLCDmiYDlvpfjga7kuIvkvY0xMCUsIDIwJSwgMjAlLTQwJSwgNDAlLTYwJSwgNjAlLTgwJSwgODAl5Lul5LiKLCA5MCXku6XkuIoKCiAgICAtICAgMS85IOOCuOODi+OBo+OBpuS9le+8ge+8nyBbW1IgTm90ZWJvb2tdKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3doYXRfaXNfZ2luaS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvd2hhdF9pc19naW5pLlJtZCldCgogICAgLSAgIDEvOSDjgrjjg4vmjIfmlbDjgajmiYDlvpfliIbluIMgW1tSIE5vdGVib29rXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9naW5pLm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS9naW5pLlJtZCld44CA77yI5Y+C6ICDMS/lj4LogIMy5LuYIFtbUiBOb3RlYm9va10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvZ2luaV9sb25nLm5iLmh0bWwpXe+8iQoKICAgIC0gICDlm73jga7kuK3jgafjga7miYDlvpfliIbluIPjgpLopovjgIHjgYvjgaTmiYDlvpfliIbphY3jga7lhazlubPjgZXjgpLkuIDjgaTjga7mjIfmqJnvvIjjgrjjg4vmjIfmlbDvvInjgafooajjgZnjgZPjgajjgavjgojjgorjgIHmr5TovIPjgoLlj6/og73jgavjgarjgaPjgZ/jgYzjgIHmpbXluqbjgavosqflm7DjgarjgbLjgajjgYzjganjga7jgZDjgonjgYTjgYTjgovjga7jgYvjga/jgo/jgYvjgonjgarjgYTjgIIKCiMjIOiyp+WbsOiAheeOhwoKLSAgIOeUn+a0u+OBmeOCi+OBn+OCgeOBruWfuuacrOeahOODi+ODvOOCuuOCkuizhOOBhuOBn+OCgeOBq+W/heimgeOBqOOBneOCjOOBnuOCjOOBruWbveOBjOiAg+OBiOOCi+Wfuua6luOCkua6gOOBn+OBl+OBpuOBhOOBquOBhOS6uuWPo+OBruWJsuWQiAoKICAgIC0gICBQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBuYXRpb25hbCBwb3ZlcnR5IGxpbmVzICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLk5BSEMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLk5BSEMpXQoKICAgIC0gICDml6XmnKzjga/vvJ8gW1tXaWtpcGVkaWFdKGh0dHBzOi8vamEud2lraXBlZGlhLm9yZy93aWtpLyVFNiU5NyVBNSVFNiU5QyVBQyVFMyU4MSVBRSVFOCVCMiVBNyVFNSU5QiVCMCldCgotICAgXCQyLjE1L+aXpSAoXCQ2NS40L+aciCwgNzg1L+W5tCksIFwkMy42Ne+8iFwkMTExLjAv5pyILCBcJDEsMzMyL+W5tO+8iSwgXCQ2Ljg177yIXCQyMDguNC/mnIgsIFwkMiw1MDAv5bm077yJCgogICAgLSAgIFBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGF0IFwkMi4xNSBhIGRheSAoMjAxNyBQUFApICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLkREQVkgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLkREQVkpXQoKICAgIC0gICBQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDMuNjUgYSBkYXkgKDIwMTcgUFBQKSAoJSBvZiBwb3B1bGF0aW9uKe+8mlNJLlBPVi5MTUlDIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NJLlBPVi5MTUlDKV0KCiAgICAtICAgUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQ2Ljg1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuVU1JQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuVU1JQyldCgojIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCiMjIyDjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb/vvIhpbXBvcnRpbmfvvIkKCui/veWKoOaDheWgse+8iOWcsOWfn+ODu+aJgOW+l+ODrOODmeODq++8ieOCkuiqreOBv+i+vOOBv+OBn+OBhOOBruOBp+OAgWV4dHJhPVRSVUUg44Go44GX44Gm44GC44KK44G+44GZ44CCCgoqKirmnIDliJ3jga7vvJHlm57nm67jga/jgIHjgYvjgarjgonjgZrlrp/ooYzjgZfjgabjgY/jgaDjgZXjgYTjgIIqKioKCmBgYHtyIGV2YWw9RkFMU0V9CmRmX3BvdmVydHlfcmF0ZSA8LSBXREkoCiAgaW5kaWNhdG9yID0gYyhyYXRpbyA9ICJTSS5QT1YuTkFIQyIsCiAgICAgICAgICAgICAgICB1bmRlcl8yLjE1ID0gIlNJLlBPVi5EREFZIiwKICAgICAgICAgICAgICAgIHVuZGVyXzMuNjUgPSAiU0kuUE9WLkxNSUMiLAogICAgICAgICAgICAgICAgdW5kZXJfNi44NSA9ICJTSS5QT1YuVU1JQyIpLAogIGV4dHJhID0gVFJVRSkKYGBgCgojIyMjIOS/neWtmOOBqOiqreOBv+i+vOOBvwoK77yS5Zue55uu44GL44KJ44Gv44CBYGRhdGFgIOOBi+OCieiqreOBv+i+vOOCgeOCi+OCiOOBhuOBq+OBl+OBpuOBiuOBjeOBvuOBmeOAggoKKioq5pyA5Yid44Gu77yR5Zue55uu44Gv44CB44GL44Gq44KJ44Ga5a6f6KGM44GX44Gm44GP44Gg44GV44GE44CCKioqCgpgYGB7ciBldmFsPUZBTFNFfQp3cml0ZV9jc3YoZGZfcG92ZXJ0eV9yYXRlLCAiZGF0YS9wb3ZlcnR5X3JhdGUuY3N2IikKYGBgCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlIDwtIHJlYWRfY3N2KCJkYXRhL3BvdmVydHlfcmF0ZS5jc3YiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgpLopovjgabjgb/jgojjgYYgKHZpZXdpbmcpCgpgZGZfcG92ZXJ0eV9yYXRlYCDjgb7jgZ/jga/jgIFgaGVhZChkZl9wb3ZlcnR5X3JhdGUpYCDjgajjgIFgc3RyKGRmX3BvdmVydHlfcmF0ZSlgCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlCmBgYAoKYGBge3J9CnN0cihkZl9wb3ZlcnR5X3JhdGUpCmBgYAoKIyMjIOWkieaVsOOBrumBuOaKnu+8iHNlbGVjdGluZ++8iQoK5Yip55So44GX44Gq44GE5aSJ5pWw44KC44GC44KL44Gu44GnIHNlbGVjdCDjgpLkvb/jgaPjgablpInmlbDjgpLmuJvjgonjgZfjgb7jgZnjgILopovjgoTjgZnjgYTjgojjgYbjgavjgIFgdW5kZXJfMi4xNWAg44GMIE5BIOOBruOCguOBruOBr+OAgeWJiumZpOOBl+OBpuOBguOCiuOBvuOBmeOAggoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZCA8LSBkZl9wb3ZlcnR5X3JhdGUgfD4gZHJvcF9uYSh1bmRlcl8yLjE1KSB8PgogIHNlbGVjdChjb3VudHJ5LCB5ZWFyLCByYXRpbywgdW5kZXJfMi4xNSwgdW5kZXJfMy42NSwgdW5kZXJfNi44NSwgcmVnaW9uKQpkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWQgCmBgYAoKKirnt7Tnv5LjgIDmnIDlvozjgavlsJHjgZfliqDjgYjjgovjgajml6XmnKzjgavjgaTjgYTjgabopovjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgILjganjgYbjgZfjgb7jgZnjgYvjgIIqKgoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZApgYGAKCiMjIyDlpInlvaLvvIhXaWRlIHRvIExvbmcgRGF0Ye+8iQoK5Zub44Gk44Gu5oyH5qiZ44KS5ZCM5pmC44Gr44GE44GP44Gk44GL6YG45oqe44GX5q+U6LyD44GX44Gf44GE44Gu44Gn44CB5LiA44Gk44Gu5YiX77yI5aSJ5pWw77yJ44Gr44Gq44KJ44G544Gf44CB57im6ZW344OH44O844K/77yIbG9uZyBkYXRh77yJ44KC5L2c5oiQ44GX44Gm44GK44GN44G+44GZ44CCCgpgcGl2b3RfbG9uZ2VyKHJhdGlvOnVuZGVyXzYuODUsIG5hbWVzX3RvID0gImxldmVsIiwgdmFsdWVzX3RvID0gInZhbHVlIilgCgrjgZPjgZPjgafjga/jgIFgcmF0aW9gIOOBi+OCiSBgdW5kZXJfNi44NWAg44KS44CBYGxldmVsYCDjgajjgYTjgYblkI3liY3jga7liJfjgavjgarjgonjgbnjgIHlgKTjgpIgYHZhbHVlYCDjgajjgYTjgYbliJfjgavkuKbjgbnjgovjgojjgYbjgavjgZfjgabjgYLjgorjgb7jgZnjgIIKCueiuuiqjeOBmeOCi+OBqOOBjeOBr+OAgXZhbHVlIOOBjCBOQSDjga7jgoLjga7jga/pmaTjgY3jgIFjb3VudHJ5IOOBqOOAgWlzbzJjIOOBqOOAgWxldmVsIOOBqCB2YWx1ZSDjga7pg6jliIbjgaDjgZHlj5bjgorlh7rjgZfjgabnorroqo3jgZfjgabjgYTjgb7jgZnjgIIKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyA8LSBkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWQgfD4gCiAgcGl2b3RfbG9uZ2VyKHJhdGlvOnVuZGVyXzYuODUsIG5hbWVzX3RvID0gImxldmVsIiwgdmFsdWVzX3RvID0gInZhbHVlIikKZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gc2VsZWN0KGNvdW50cnksIGxldmVsLCB2YWx1ZSwgcmVnaW9uKQpgYGAKCiMjIyDlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7norroqo3vvIhudW1iZXIgb2YgZGF0YSBpbiBlYWNoIHllYXLvvIkKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiBkcm9wX25hKHZhbHVlKSB8PiAKICBncm91cF9ieSh5ZWFyLCBsZXZlbCkgfD4gc3VtbWFyaXplKG4gPSBuKCkpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgoqKuiAg+Wvn++8mioq44Gd44KM44Ge44KM44Gu5Zu944Gn44Gu6LKn5Zuw546H44Gu44OH44O844K/77yIcmF0aW/vvInjgYwg5aSa44GE5aC05ZCI44KC44CB57W25a++55qE44Gq6LKn5Zuw546H44GM5aSa44GE5aC05ZCI44KC44GC44KL44KI44GG44Gg44GM44CB5oyH5qiZ44GU44Go44Gr6ZuG6KiI44GX44Gm44G/44KL44CCCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZmlsdGVyKHllYXIgJWluJSBjKDE5NjAsIDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMjApKSB8PiBkcm9wX25hKHZhbHVlKSB8PiBncm91cF9ieSh5ZWFyLCBsZXZlbCkgfD4gc3VtbWFyaXplKG4gPSBuKCkpIHw+CiAgZ2dwbG90KGFlcyhhcy5jaGFyYWN0ZXIoeWVhciksIG4sIGZpbGwgPSBsZXZlbCkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCBjb2wgPSAiYmxhY2siLCBsaW5ld2lkaHQgPSAwLjEpICsgbGFicyh4ID0gInllYXIiLCB5ID0gIm51bWJlciBvZiBkYXRhIikKYGBgCgoqKuiAg+Wvn++8mioq44Gd44KM44Ge44KM44Gu5Zu944Gn44Gu6LKn5Zuw546H44Gu44OH44O844K/77yIcmF0aW/vvInjga/jgIEyMDAw5bm05Lul6ZmN44CBdW5kZXJfMi4xNSwgdW5kZXJfMy42NSwgdW5kZXJfNi44NSDjga/jgIHlkIzjgZjmlbDjgZrjgaTjgYLjgovjga7jgafjgIHlkIzmmYLjgavjg4fjg7zjgr/jgpLpm4bjgoHjgabjgYTjgovjgajmgJ3jgo/jgozjgovjgIIKCiMjIyDkuJbnlYzjgajjgrXjg4/jg6nnoILmvKDku6XljZfjga7jgqLjg5Xjg6rjgqvjga7jg4fjg7zjgr/jga7ntYzlubTlpInljJYKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSAlaW4lIGMoIldvcmxkIiwgIlN1Yi1TYWhhcmFuIEFmcmljYSIpKSB8PiBkcm9wX25hKCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBsZXZlbCwgbGluZXR5cGUgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq6ICD5a+f77yaKipTdWItU2FoYXJhbiBBZnJpY2Eg44Gu44OH44O844K/44Gv44Gq44GE44KI44GG44Gn44GZ44CC44Gf44GX44GL44Gr44CBcmF0aW8g44Gv44CB5Zu944GU44Go44Gr5rG644KB44KL44KC44Gu44Gn44GZ44GL44KJ44CB5Zyw5Z+f44Gu5aC05ZCI44Gr44Gv44CBcmF0aW8g44Gu5YCk44Gv44Gq44GE44Gu44Gn44GX44KH44GG44CCCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZmlsdGVyKHllYXIgJWluJSBjKDIwMDAsIDIwMTAsIDIwMjApKSB8PiBkcm9wX25hKHZhbHVlKSB8PiAKICBmaWx0ZXIocmVnaW9uID09ICJBZ2dyZWdhdGVzIikgfD4gZmlsdGVyKGxldmVsICVpbiUgYygicmF0aW8iLCAidW5kZXJfMi4xNSIpKSB8PiBncm91cF9ieShjb3VudHJ5LCB5ZWFyLCBsZXZlbCkgfD4gc3VtbWFyaXplKG4gPSBuKCkpCmBgYAoKU3ViIFNhaGFyYW4gQWZyaWNhIOOBr+ODh+ODvOOCv+OBr+OBguOCiuOBvuOBm+OCk+OBjOOAgee1seioiOeahOOBq+WHpueQhuOBl+OBpu+8iOW5s+Wdh+OBruOCiOOBhuOBquOCguOBruOCkuWPluOBo+OBpu+8ieihqOekuuOBmeOCi+OBk+OBqOOBr+WPr+iDveOBp+OBmeOAggoKbG9lc3MgKExvY2FsIFBvbHlub21pYWwgUmVncmVzc2lvbikg44Gv44CB5bCR44GX44Ga44Gk5Yy65YiH44Gj44Gm44CB5aSa6aCF5byP6L+R5Ly844KS5L2/44Gj44Gm44GE44KL44GE44G+44GZ44CC44Gd44GT44Gn44CB44Oe44Kk44OK44K544Gu5YCk44KC5Ye644Gm44GN44Gm44GX44G+44Gj44Gm44GE44G+44GZ44CC44GX44GL44GX44CB5aSn5L2T44Gu5YK+5ZCR44KS44G/44KL44GT44Go44Gv44Gn44GN44G+44GZ44CC5LiK44Gn6KaL44Gf44OH44O844K/44Gu5pWw44GL44KJ44CBMTk5MuW5tOS7pemZjeOBq+OBl+OBpuOBiuOBj+OBruOBjOiJr+OBhOOBp+OBl+OCh+OBhuOAggoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGRyb3BfbmEodmFsdWUpIHw+IGZpbHRlcighaXMubmEocmVnaW9uKSwgcmVnaW9uICE9ICJBZ2dyZWdhdGVzIikgfD4KICBmaWx0ZXIobGV2ZWwgPT0gInVuZGVyXzIuMTUiKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IHJlZ2lvbikpICsgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5IH4geCcsIHNlID0gRkFMU0UpCmBgYAoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGRyb3BfbmEodmFsdWUpIHw+IAogIGZpbHRlcighaXMubmEocmVnaW9uKSwgcmVnaW9uICE9ICJBZ2dyZWdhdGVzIiwgeWVhciA+IDE5OTEpIHw+CiAgZmlsdGVyKGxldmVsID09ICJ1bmRlcl8yLjE1IikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSByZWdpb24pKSArIGdlb21fc21vb3RoKGZvcm11bGEgPSAneSB+IHgnLCBtZXRob2QgPSAnbG9lc3MnLCBzZSA9IEZBTFNFKSArIGxhYnModGl0bGUgPSAiUmVnaW9uYWxseSBhZ2dyZWdhdGVkIHJhdGlvIHVuZGVyIDIuMTUgVVNEIikKYGBgCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZmlsdGVyKCFpcy5uYShyZWdpb24pLCByZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiLCB5ZWFyID4gMTk5MSkgfD4KICBmaWx0ZXIobGV2ZWwgIT0gInJhdGlvIikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSByZWdpb24sIGxpbmV0eXBlID0gbGV2ZWwpKSArIGdlb21fc21vb3RoKGZvcm11bGEgPSAneSB+IHgnLCBtZXRob2QgPSAnbG9lc3MnLCBzZSA9IEZBTFNFKSArIGxhYnModGl0bGUgPSAiUmVnaW9uYWxseSBhZ2dyZWdhdGVkIHJhdGlvIikKYGBgCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZmlsdGVyKCFpcy5uYShyZWdpb24pLCByZWdpb24gPT0gIlN1Yi1TYWhhcmFuIEFmcmljYSIsIHllYXIgPiAxOTkxKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGxldmVsKSkgKyBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3kgfiB4JywgbWV0aG9kID0gJ2xvZXNzJywgc2UgPSBUUlVFKSArIGxhYnModGl0bGUgPSAiU3ViLVNhaGFyYW4gcmVnaW9uIGFnZ3JlZ2F0ZWQgcmF0aW8iKQpgYGAKCiMjIyDjgrXjg4/jg6nnoILmvKDku6XljZfvvIhTdWItU2FoYXJhbiBBZnJpY2HvvIkg44Gu5Zu944Gu44OH44O844K/CgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gIGRyb3BfbmEodmFsdWUpIHw+IAogIGZpbHRlcihyZWdpb24gPT0gIlN1Yi1TYWhhcmFuIEFmcmljYSIpIHw+IGdyb3VwX2J5KGNvdW50cnksIGxldmVsKSB8PiAKICBzdW1tYXJpemUobiA9IG4oKSkKYGBgCgojIyDjgqLjg5Xjg6rjgqvljZfpg6jvvJXjgqvlm73jga7liIbmnpAKCiMjIyDlm73jga7jg6rjgrnjg4jjga7oqK3lrpoKClNPVVRIX0FGUklDQV9GSVZFIOOBq+OAgVNvdXRoIEFmcmljYSwgTmFtaWJpYSwgRXN3YXRpbmksIEJvdHN3YW5hLCBMZXNvdGhvIOOCkuioreWumgoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyDvvJXjgqvlm73jga7jg4fjg7zjgr/jgpLnorroqo0KCmBkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWRgIOOBqOOAgWBkZl9wb3ZlcnR5X3JhdGVfbG9uZ2Ag44Gr44Gk44GE44Gm44CB44Ki44OV44Oq44Kr5Y2X6YOo77yV44Kr5Zu944Gu44OH44O844K/44KS56K66KqNCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpCmBgYAoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpCmBgYAoKIyMjIOWQhOiyp+WbsOeOh+OCkuaKmOOCjOe3muOCsOODqeODleOBp+aPj+OBhOOBpuOBv+OCiwoKIyMjIyDljZfjgqLjg5Xjg6rjgqvjgavjgaTjgYTjgaYKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSA9PSAiU291dGggQWZyaWNhIikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBsZXZlbCkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuiAg+Wvn++8mioqMjAwMOW5tOOBi+OCiTIwMDjlubTjgZTjgo3jgb7jgafmuJvlsJHjgZfjgabjgYTjgovjgYzjgIHjgZ3jga7lvozjgIHkuIrmmIflgr7lkJHjgYzopovjgonjgozjgovjgIIKCiMjIyMg77yV44Kr5Zu95ZCM5pmC44GrCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gCiAgZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IGxldmVsKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq6ICD5a+f77yaKiropIfpm5Hjgafjgo/jgYvjgorjgoTjgZnjgYTjgajjga/jgYTjgYjjgarjgYQKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHZhbHVlKSB8PiBmaWx0ZXIobGV2ZWwgIT0gInJhdGlvIikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IGxldmVsKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq6ICD5a+f77yaKirlm73jgZTjgajjgavmsbrjgoHjgZ/osqflm7DnjofjgpLjga7jgZ7jgYTjgabjgb/jgZ/jgILlpJrlsJHmlLnlloTjgZfjgZ/jgILjgZfjgYvjgZfjgIHjgYLjgajjga/lpb3jgb/jgIIKCiMjIyDvvJXjgqvlm73jga7mnIDmlrDjga7jg4fjg7zjgr8KCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWQgfD4gCiAgZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4KICBkcm9wX25hKHVuZGVyXzIuMTUpIHw+IGdyb3VwX2J5KGNvdW50cnkpIHw+IGZpbHRlcih5ZWFyID09IG1heCh5ZWFyKSkgfD4gCiAgc2VsZWN0KGNvdW50cnksIHllYXIsIHJhdGlvOnVuZGVyXzYuODUpCmBgYAoKKirogIPlr5/vvJoqKuavjuW5tOODh+ODvOOCv+OBjOOBguOCi+OCj+OBkeOBp+OBr+OBquOBhOOBruOBp+OAgeOBneOCjOOBnuOBruWbveOBlOOBqOOBq+acgOaWsOOBruOCguOBruOCkuimi+OCi+OBk+OBqOOBqOOBmeOCiwoKIyMjIyDljZfjgqLjg5Xjg6rjgqvvvJXjgqvlm73jga7osqflm7DluqbjgZTjgajjga7kurrlj6Pmr5QKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PgogIGRyb3BfbmEodmFsdWUpIHw+IGdyb3VwX2J5KGNvdW50cnkpIHw+IGZpbHRlcih5ZWFyID09IG1heCh5ZWFyKSkgfD4KICBnZ3Bsb3QoYWVzKGNvdW50cnksIHZhbHVlLCBmaWxsID0gbGV2ZWwpKSArIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIiwgY29sID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4xKSArIAogIGxhYnModGl0bGUgPSAiUG92ZXJ0IExldmVsIFJhdGlvIG9mIEZpdmUgQ291bnRyaWVzIiwgc3VidGl0bGUgPSAiQm90c3dhbmEgaW4gMjAxNSwgRXN3YXRpbmkgaW4gMjAxNiAsTGVzb3RvIGluIDIwMTcsIE5hbWliaWEgaW4gMjAxNSBcbmFuZCBTb3V0aCBBZnJpY2EgaW4gMjAxNCIpCmBgYAoKIyMg5L2c5qWt5omL6aCG44Go44G+44Go44KBCgotICAg44OR44OD44Kx44O844K477yIUGFja2FnZe+8ieOBruWIqeeUqO+8mgoKICAgIC0gICDjgqTjg7Pjgrnjg4jjg7zjg6vvvIhpbnN0YWxsYXRpb27vvInvvJpUb29scyBcPiBJbnN0YWxsIFBhY2thZ2VzCgogICAgLSAgIOODreODvOODie+8iGxvYWTvvIlgbGlicmFyeSh0aWR5dmVyc2UpOyBsaWJyYXJ5KFdESSk7IGxpYnJhcnkoc2hvd3RleHQpOyBsaWJyYXJ5KERlc2NUb29scylgCgotICAg44OH44O844K/44Gu5Y+W5b6X77yaYFdESShpbmRpY2F0b3IgPSBjKHBvcCA9ICJTUC5QT1AuVE9UTCIpKWAKCiAgICAtICAgYGBgIFdESShpbmRpY2F0b3IgPWBgYyhyYXRpbyA9ICJTSS5QT1YuTkFIQyIsIHVuZGVyXzIuMTUgPSAiU0kuUE9WLkREQVkiLCB1bmRlcl8zLjY1ID0gIlNJLlBPVi5MTUlDIiwgdW5kZXJfNi44NSA9ICJTSS5QT1YuVU1JQyIpLCBleHRyYSA9IFRSVUUpIGBgYAoKICAgIC0gICBkYXRhIOOBq+abuOOBjeWHuuOBl+OAgeOBneOBk+OBi+OCieiqreOBv+i+vOOCgOOBqOiJr+OBhOOAggoKICAgICAgICAtICAgYHdyaXRlX2NzdihkZl9wb3ZlcnR5X3JhdGUsICJkYXRhL3BvdmVydHlfcmF0ZS5jc3YiKWAKCiAgICAgICAgLSAgIGByZWFkX2NzdigiZGF0YS9wb3ZlcnR5X3JhdGUuY3N2IilgCgotICAg44OH44O844K/44KS6KaL44KL77yaYGRmX3BvdmVydHlfcmF0ZWAgLCBgaGVhZChkZl9wb3ZlcnR5X3JhdGUpYCwgYHN0cihkZl9wb3ZlcnR5X3JhdGUpYAoKLSAgIOWkieaVsOOBrumBuOaKnu+8mmBzZWxlY3QoY291bnRyeSwgeWVhciwgcmF0aW8sIHVuZGVyXzIuMTUsIHVuZGVyXzMuNjUsIHVuZGVyXzYuODUsIHJlZ2lvbilgCgotICAg44OH44O844K/44Gu5aSJ5b2i77yITG9uZyBkYXRh77yJ77yaYHBpdm90X2xvbmdlcihyYXRpbzp1bmRlcl82Ljg1LCBuYW1lc190byA9ICJsZXZlbCIsIHZhbHVlc190byA9ICJ2YWx1ZSIpYAoKLSAgIOeJueWumuOBruihjOOBruWPluW+l++8mmBmaWx0ZXIoKSwgZHJvcF9uYSgpLCBkaXN0aW5jdCgpYAoKLSAgIOihjOOBrumghueVquOBruS4puOBs+abv+OBiO+8mmBhcnJhbmdlKGRlc2MoeWVhcikpYAoKLSAgIOOCsOODq+ODvOODl+WIhuOBke+8mmBncm91cF9ieSgpYCAsIGBncm91cF9ieSh5ZWFyLCBsZXZlbCkgfD4gc3VtbWFyaXplKG4gPSBuKCkpYAoKIyMjIOWPr+imluWMlgoKLSAgIOaKmOOCjOe3muOCsOODqeODlQoKICAgIC0gICBgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IHVuZGVyXzIuMTUpICsgZ2VvbV9saW5lKClgCgogICAgLSAgIGBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gdW5kZXJfMi4xNSwgY29sID0gY291bnRyeSkgKyBnZW9tX2xpbmUoKWAKCi0gICDjg5Ljgrnjg4jjgrDjg6njg6DvvIjluqbmlbDliIbluIPvvIkKCiAgICAtICAgYGdncGxvdChhZXModW5kZXJfMi4xNSwgZmlsbCA9IHJlZ2lvbikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1KWAKCi0gICDmo5LjgrDjg6njg5UKCiAgICAtICAgYGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKWAKCiAgICAtICAgYGdncGxvdChhZXMobGV2ZWxzLCB2YWx1ZSkpICsgZ2VvbV9jb2woKWAKCiAgICAtICAgYGdncGxvdChhZXMoeCA9IGxldmVscywgeSA9IHZhbHVlLCBmaWxsID0gY291bnRyeSkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKWAKCiAgICAtICAgYGdncGxvdChhZXMoeCA9IGdpbmksIGZpbGwgPSByZWdpb24pKSArIGdlb21faGlzdG9ncmFtKClgCgotICAg5pWj5biD5Zuz77yIK+WbnuW4sOebtOe3mu+8iQoKICAgIC0gICBgZ2dwbG90KGFlcyhnaW5pLCA5MC0xMDApKSArIGdlb21fcG9pbnQoKWAKCiAgICAtICAgYGdncGxvdChhZXMoZ2luaSwgODAtMTAwKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3kgfiB4JywgbWV0aG9kID0gImxtIilgCgoqKirluLjjgavjgIHogIPlr5/jgIHmsJfjgaXjgYTjgZ/jgZPjgajjgpLjgIHoqJjpjLLjgZfjgabjgY/jgaDjgZXjgYTjgIIqKioKCiMjIOiqsumhjAoK44OH44O844K/44Gv44CB5LiK44Gn5L2/44Gj44Gf5LqM44Gk44Gu44OH44O844K/44KS5L2/44GE44G+44GZ44CCCgotICAgYGRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZGAgOiB3aWRlIOODh+ODvOOCv+OBqOiogOOCj+OCjOOCi+OCguOBruOBp+OBmeOAguiyp+WbsOeOh++8iGB1bmRlcl8yLjE1YO+8ieOBruODh+ODvOOCv+OCkuWQq+OBvuOBquOBhOOCguOBruOBr+WJiumZpOOBl+OBpuOBguOCiuOBvuOBmeOAggoKLSAgIGBkZl9wb3ZlcnR5X3JhdGVfbG9uZ2Ag77yabG9uZyDjg4fjg7zjgr/jgajoqIDjgo/jgozjgovjgoLjga7jgafjgZnjgIIKCiMjIyDnt7Tnv5LvvJrjg4fjg7zjgr/jga7norroqo0KCjEuICBgZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkYCDjgajjgIFgZGZfcG92ZXJ0eV9yYXRlX2xvbmdgIOOCkuimi+OBpuOBv+OBvuOBl+OCh+OBhuOAguOBqeOBhuOBl+OBvuOBmeOBi+OAggoKKipIaW5077yaKirjgZ3jga7jgb7jgb7jg4fjg7zjgr/jgIFoZWFkKOODh+ODvOOCvynjgIFFbnZpcm9ubWVudCDjgYvjgonjgIHjg4fjg7zjgr/jgpLpgbjmip4KCmBgYHtyfQoKYGBgCgpgYGB7cn0KCmBgYAoKMi4gIOWNl+OCouODoeODquOCq+OBp+OAgeOCuOODi+aMh+aVsOOBjOWkp+OBjeOBhOOBruOBr+OAgeS7peS4i+OBru+8lOOBpOOBruWbveOBp+OBmeOAglN1cmluYW1lLCBCZWxpemUsIEJyYXppbCwgQ29sb21iaWHjgILjgZ3jgozjgpLjgIFDSE9TRU5fR0lOSV9DT1VOVFJJRVMg44Gr5Luj5YWl44GX44Gm44GP44Gg44GV44GE44CCCgoqKkhpbnTvvJrjgIwqKlNPVVRIX0FGUklDQV9GSVZFIOOBq+OAgVNvdXRoIEFmcmljYSwgTmFtaWJpYSwgRXN3YXRpbmksIEJvdHN3YW5hLCBMZXNvdGhvIOOCkuioreWumuOAjeOCkuWPgueFpwoKYGBge3J9CgpgYGAKCjMuICBgZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkYOOBruWNl+OCouODoeODquOCq++8lOOCq+WbveOBruacgOaWsOOBruODh+ODvOOCv+OBoOOBkeOCkuihqOekuuOBl+OBpuOBv+OBvuOBl+OCh+OBhuOAggoKKipIaW5077yaKipTT1VUSF9BRlJJQ0FfRklWRSDjga7loLTlkIjjganjga7jgojjgYbjgavjgZfjgZ/jgYvogIPjgYjjgabjgb/jgb7jgZfjgofjgYbjgIIKCmBgYHtyfQoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqCoqCgotICAgCgojIyMg5Y2X44Ki44Oh44Oq44Kr77yU44Kr5Zu944Gr44Gk44GE44Gm44Gu5YiG5p6QCgo0LiAg77yU44Kr5Zu944CB44Gd44KM44Ge44KM44Gu44CB6LKn5Zuw546H44Gu5bm05qyh5aSJ5YyW44KS5oqY44KM57ea44Kw44Op44OV44Gr44KI44KK6KGo56S6CgrkuIvjga/jgIHjg5bjg6njgrjjg6vjgavjgaTjgYTjgabjga7jgoLjga7jgafjgZnjgYzjgIHku5bjga7vvJPjgqvlm73jgafjgIHjg4fjg7zjgr/jgYzjgYLjgovjgoLjga7jgavjgaTjgYTjgabjga/jgIHlkIzmp5jjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSA9PSAiQnJhemlsIikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBsZXZlbCkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiUG92ZXJ0eSBSYXRpbyBvZiBCcmFzaWwiKQpgYGAKCmBgYHtyfQoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqCoqCgotICAgCgojIyMjIOWNl+OCouODoeODquOCq++8lOOCq+WbveOBruiyp+WbsOW6puOBlOOBqOOBruS6uuWPo+avlOOBruajkuOCsOODqeODlQoKNS4gIOiyp+WbsOW6puOBlOOBqOOBruS6uuWPo+avlOOBruajkuOCsOODqeODleOCkuaPj+OBhOOBpuOBv+OBvuOBl+OCh+OBhuOAggoKSGludDog5Y2X44Ki44OV44Oq44Kr77yV44Kr5Zu944Gu6LKn5Zuw5bqm44GU44Go44Gu5Lq65Y+j5q+U44Gu5qOS44Kw44Op44OVCgpgYGB7cn0KCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgagqKgoKLSAgIAoKIyMjIOe3tOe/ku+8muiyp+WbsOW6puOBlOOBqOOBruS6uuWPo+avlAoK6Kqy6aGM44Gr44GC44KLIDEg44GL44KJIDUuCgrmj5Dlh7rjga/jgZfjgarjgY/jgaboia/jgYTjgafjgZnjgYzjgIHjgZzjgbLlrp/pmpvjgavmiYvjgpLli5XjgYvjgZfjgablrp/ooYzjgZfjgabjgY/jgaDjgZXjgYTjgIIKCiMjIOWPguiAg+aWh+eMrgoKMS4gIOOAjOOBv+OCk+OBquOBruODh+ODvOOCv+OCteOCpOOCqOODs+OCuSAtIERhdGEgU2NpZW5jZSBmb3IgQWxs44CNW1vjga/jgZjjgoHjgabjga7jg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrldKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqL2ZpcnN0LWV4YW1wbGUuaHRtbCNmaXJzdC1leGFtcGxlKV0KCiAgICAtICAg5bCO5YWl44Go44GX44Gm44CBR0RQ77yI5Zu95YaF57eP55Sf55Sj77yJ44Gu44OH44O844K/44KS5L2/44Gj44Gm6Kqs5piO44GX44Gm44GE44G+44GZ44CCCgoyLiAgUG9zaXQgUmVjaXBlc++8iOaXpyBQb3NpdCBQcmltZXJz77yJOiBUaGUgQmFzaWNzIOWvvuipseWei+OBrua8lOe/kuOCteOCpOODiOOBruacgOWInSBbW0xpbmtdKGh0dHBzOi8vcG9zaXQuY2xvdWQvbGVhcm4vcmVjaXBlcyldCgozLiAgUG9zaXQgQ2hlYXQgU2hlZXQuIOaXqeimi+ihqOOBp+OBmeOAguWNsOWIt+OBl+OBpuS9v+OBhuOBn+OCgeOBq+OAgVBERiDjgoLmj5DkvpvjgZfjgabjgYTjgb7jgZnjgIJbW1NpdGUgTGlua10oaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9jaGVhdHNoZWV0cy8pXQoKNC4gIERhdGFDYW1wIENoZWF0IFNoZWV0OiBUaWR5dmVyc2UgZm9yIEJpZ2lubmVycy4g44OH44O844K/44K144Kk44Ko44Oz44K544Gu5pWZ6IKy44KS44GX44Gm44GE44KL5Lya56S+44Gu5pep6KaL6KGo44Gu5LiA44Gk44Gn44GZ44CC5Z+65pys44GM57Ch5Y2Y44Gr44G+44Go44G+44Gj44Gm44GE44G+44GZ44CCW1tMaW5rXShodHRwczovL2ltYWdlcy5kYXRhY2FtcC5jb20vaW1hZ2UvdXBsb2FkL3YxNjc2MzAyNjk3L01hcmtldGluZy9CbG9nL1RpZHl2ZXJzZV9DaGVhdF9TaGVldC5wZGYpXQo=