課題

以下の指標の中から、二つ以上(複数)を選択して、データの概要(description)を記録し、データを WDI で取得し、以下の分析をする。

  1. 各年毎のデータの数の棒グラフ
  2. 経年変化を表す折れ線グラフ
    1. 日本、またはデータがある国
    2. 選択したいくつかの国
  3. 複数の指標の値を一列に含む縦長の表(Long Table)を作成し  
    1. 日本、またはデータがある国の、複数の指標を色分けした経年変化のグラフ  
    2. 選択したいくつかの国についての経年変化のグラフを、国を色分けし、指標は線の種類を変えたグラフ
  4. 二つのデータの散布図- NA は取り除くこと。(log10 スケールを用いる場合は値が正のもののみに限定)
    1. (地域を除き)国のみの散布図 (近似(回帰)直線を表示)
    2. 最近の年の(地域を除き)国のみの散布図 (近似(回帰)直線を表示)
    3. b に対応する相関係数
  5. カテゴリー変数(Categorical Variable: region, income, year など)と、数値変数(Numberical Variable)一組についての箱ヒゲ図(Boxplot)

それぞれについて考察(気づいたこと、疑問など)を記す

2023.2.10.23:59 までに Moodle の課題2提出ボックスに提出してください。

できたグラフだけでも構いませんから、期限までに提出してください。解説を加え、課題2再提出ボックスを作成する予定です。

データ

  1. CO2 emissions (metric tons per capita) :EN.ATM.CO2E.PC [Link]

  2. Forest area (% of land area):AG.LND.FRST.ZS [Link]

  3. Renewable electricity output (% of total electricity output):EG.ELC.RNEW.ZS [Link]

  4. Electricity production from oil, gas and coal sources (% of total):EG.ELC.FOSL.ZS [Link]

  5. Electricity production from nuclear sources (% of total):EG.ELC.NUCL.ZS [Link]

  6. Access to electricity, urban (% of urban population):EG.ELC.ACCS.UR.ZS [Link]

  7. Access to electricity, rural (% of rural population):EG.ELC.ACCS.RU.ZS [Link]

  8. People using at least basic drinking water services, urban (% of urban population):SH.H2O.BASW.UR.ZS [Link]

  9. People using at least basic drinking water services, rural (% of rural population):SH.H2O.BASW.RU.ZS [Link]

  10. People using at least basic sanitation services, urban (% of urban population):SH.STA.BASS.UR.ZS [Link]

  11. People using at least basic sanitation services, rural (% of rural population):SH.STA.BASS.RU.ZS [Link]

男女別失業率

データ

データ情報

  • 女性の失業率:Unemployment, female (% of female labor force) (modeled ILO estimate):SL.UEM.TOTL.FE.ZS [Link]

  • 男性の失業率:Unemployment, male (% of male labor force) (modeled ILO estimate):SL.UEM.TOTL.MA.ZS [Link]

  • 失業率とは、労働人口のうちで、失業しており、かつ仕事に就くことを求めている者の率をいう。Unemployment refers to the share of the labor force that is without work but available for and seeking employment.

データの取得

準備

これまでとも同じように二つのパッケージを読み込み(load)ます。

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、under_6.85 に指定。

この変数名は、今後使いますから、重要です。一応、例として、わたしが使った、変数名を書いてあります。他の変数名を使っても構いません。

df_unemploy <- WDI(indicator = c(female_unemploy = "SL.UEM.TOTL.FE.ZS", 
                                 male_unemploy = "SL.UEM.TOTL.MA.ZS"),
                   extra = TRUE)

data ディレクトリに書き込んでおきます。

write_csv(df_unemploy, "data/unemploy.csv")

data ディレクトリから読み出します。Run All や、Run All Chunks Above をする時は、上の二つをスキップする設定にしてあります。

df_unemploy <- read_csv("data/unemploy.csv")
Rows: 16758 Columns: 14── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (7): country, iso2c, iso3c, region, capital, income, lending
dbl  (5): year, female_unemploy, male_unemploy, 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.

データの確認

データ名で、中身を表示できます。head(df_unemploy) とすると、6行表示されます。

df_unemploy

変数の情報を得ることができます。

str(df_unemploy)
spc_tbl_ [16,758 × 14] (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" ...
 $ female_unemploy: num [1:16758] 10.3 NA 10.6 10.4 10.8 ...
 $ male_unemploy  : num [1:16758] 7.34 NA 7.54 7.4 7.73 ...
 $ 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 = ""),
  ..   female_unemploy = col_double(),
  ..   male_unemploy = col_double(),
  ..   region = col_character(),
  ..   capital = col_character(),
  ..   longitude = col_double(),
  ..   latitude = col_double(),
  ..   income = col_character(),
  ..   lending = col_character()
  .. )
 - attr(*, "problems")=<externalptr> 

変形

変数の選択(selecting)

df_unemp <- df_unemploy |> 
  select(country, iso2c, year, female_unemploy, male_unemploy, region, income)
df_unemp

データには country のところに、国だけでなく、地域も入っているので、地域のリストを、iso2cREGION に入れておきます。

REGION <- c("1A", "1W", "4E", "6F", "6N", "6X", "7E", "8S", "A4", "A5", 
"A9", "B1", "B2", "B3", "B4", "B6", "B7", "B8", "C4", "C5", "C6", 
"C7", "C8", "C9", "D2", "D3", "D4", "D5", "D6", "D7", "EU", "F1", 
"F6", "M1", "M2", "N6", "OE", "R6", "S1", "S2", "S3", "S4", "T2", 
"T3", "T4", "T5", "T6", "T7", "V1", "V2", "V3", "V4", "XC", "XD", 
"XE", "XF", "XG", "XH", "XI", "XJ", "XL", "XM", "XN", "XO", "XP", 
"XQ", "XT", "XU", "XY", "Z4", "Z7", "ZB", "ZF", "ZG", "ZH", "ZI", 
"ZJ", "ZQ", "ZT")

地域名にはどのようなものがあるか見ておきます。

df_unemp |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

国名も、地域(region)と、所得レベル(income)と共に、表示しておきます。

df_unemp |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c, region, income)

分析する国のリスト

自分で分析したい国のリストを作ってください。ここでは、ASEAN を iso2c で設定します。国名で選択しても構いません。

ASEAN <- c("BN", "KH", "ID", "LA", "MY", "MM", "PH", "SG", "VN")
asean <- c("Brunei Darussalam", "Cambodia", "Indonesia", "Lao PDR", "Malaysia", "Myanmar", "Philippines", "Singapore", "Viet Nam")

視覚化

1. 各年毎のデータの数の棒グラフ

まずは、NA の値を削除します。そのあとで、国の情報の数を数えたいので、!(iso2c %in% REGION) で、上でおいた、地域の iso2c を選択し、! は否定でしたから、地域ではないものを選択し、その数を棒グラフにしています。

df_unemp |> drop_na(female_unemploy, male_unemploy) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

気づいたこと・疑問

  • 1991年から2022年までデータがある。2021, 2022 は、少しデータが少ないが、2020年とあまり変わらない。

経年変化を表す折れ線グラフ

a. 日本、またはデータがある国

df_unemp |> filter(country == "Japan") |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line() +
  labs(title = "日本の女性労働者失業率")

df_unemp |> filter(country == "Japan") |> drop_na(male_unemploy) |>
  ggplot(aes(year, male_unemploy)) + geom_line() +
  labs(title = "日本の男性労働者失業率")

気づいたこと・疑問

  • 日本の、女性失業率と、男性失業率は、似た傾向であるが、重ねてみてみたい。

b. 選択したいくつかの国

ASEAN は、iso2c ですから、下のようにします。

df_unemp |> filter(iso2c %in% ASEAN) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy, col = country)) + geom_line() +
  labs(title = "ASEAN の女性労働者失業率")

asean は、国名でしたから、下のようにします。今度は、男性の失業率です。

df_unemp |> filter(country %in% asean) |> drop_na(male_unemploy) |>
  ggplot(aes(year, male_unemploy, col = country)) + geom_line() +
  labs(title = "ASEAN の男性労働者失業率")

気づいたこと・疑問

  • 国によって、様相が異なるようだが、これも、重ねてみた方が見やすいように思われる。

縦長の表(Long Table)

cols = c(female_unemploy, male_unemploy) と、一つの指標にまとめるものをリストすると、name に指標名が入り、value に、その値が入る。書式は、pivot_longer(cols = ..., names_to = ..., values_to = ...) で、初期設定では、names_to = "name", values_to = "value" となっているので、指定しないと、下のようになる。Help 参照。

df_unemp_long <- df_unemp |> pivot_longer(cols = c(female_unemploy, male_unemploy))
df_unemp_long

日本の複数の指標を色分けした経年変化のグラフ

col = name と指定すると、色で区別して、一つのグラフに描ける

df_unemp_long |> filter(country == "Japan") |> drop_na(value) |>
  ggplot(aes(year, value, col = name)) + geom_line()  +
  labs(title = "日本の男女別失業率")

気づいたこと・疑問

  • ほぼ、同じ傾向で、推移している。最近は、女性の失業率の方がわずかに低い場合が多い。

選択したいくつかの国の複数の指標を色分けした経年変化のグラフ

df_unemp_long |> filter(iso2c %in% ASEAN) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line()  +
  labs(title = "ASEAN の男女別失業率")

気づいたこと・疑問

  • 国によって、それぞれで、女性の失業率が多い場合のほうが、多いように見えるが、もっとよく見ないとわからない。

散布図

a.(地域を除き)国のみの散布図

df_unemp |> filter(!(iso2c %in% REGION)) |> drop_na(female_unemploy, male_unemploy) |>
  ggplot(aes(female_unemploy, male_unemploy)) + geom_point()  +
  labs(title = "失業率:男女別相関")

気づいたこと・疑問

  • 強い相関がありそうだ。景気の良い悪いが関係するのだろうか。

近似(回帰)直線の表示

df_unemp |> filter(!(iso2c %in% REGION)) |> drop_na(female_unemploy, male_unemploy) |>
  ggplot(aes(female_unemploy, male_unemploy)) + geom_point() + 
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE) +
  labs(title = "失業率:男女別相関(回帰直線付)")

気づいたこと・疑問

  • 直線の傾きから、女性失業率の方が、一般的には高いように見える。

b. 最近の年の(地域を除き)国のみの散布図

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(female_unemploy, male_unemploy) |>
  ggplot(aes(female_unemploy, male_unemploy)) + geom_point() +
  labs(title = "2022年の失業率:男女別相関")

気づいたこと・疑問

  • いろいろな国があるように見える。

近似(回帰)直線の表示

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(female_unemploy, male_unemploy) |>
  ggplot(aes(female_unemploy, male_unemploy)) + geom_point() + 
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE) +
  labs(title = "失業率:男女別相関(回帰直線付)")

気づいたこと・疑問

  • 女性の失業率のほうが高いようだ。

c. 相関係数

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(female_unemploy, male_unemploy) |> select(female_unemploy, male_unemploy) |> cor()
                female_unemploy male_unemploy
female_unemploy       1.0000000     0.8675475
male_unemploy         0.8675475     1.0000000

相関係数が、0.87 で、強い正の相関があることが見て取れる。

箱ヒゲ図(Boxplot)

df_unemp_long |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(value) |>
  ggplot(aes(name, value)) + geom_boxplot() +
  labs(title = "労働者失業率:男女別箱ひげ図")

気づいたこと・疑問

  • 女性の失業率の方が、分布から見ても、高い値になっている。

  • 非常に高いあたいも、特に女性の失業率に存在する。

df_unemp_long |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(value, region) |>
  ggplot(aes(region, value, fill = name)) + geom_boxplot() + coord_flip() +
  labs(title = "労働者失業率:男女・地域別箱ひげ図")

気づいたこと・疑問

  • 地域差がある。北アメリカ、ヨーロッパ、東アジアと太平洋地域では、あまり差異がないが、他の地域では、女性の失業率の方が高いようだ。
df_unemp_long |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(value, income) |> filter(income != "Not classified") |>
  ggplot(aes(income, value, fill = name)) + geom_boxplot() + coord_flip() +
  labs(title = "労働者失業率:男女・収入レベル別箱ひげ図")

気づいたこと・疑問

  • 中央値でみると、Upper middle income では、女性の失業率が非常に高い
df_unemp_long |> filter(!(iso2c %in% REGION)) |> filter(year %in% c(1991, 2001, 2011, 2021)) |>
  drop_na(value) |> 
  ggplot(aes(factor(year), value, fill = name)) + geom_boxplot() +
  labs(title = "労働者失業率:男女別・10年ごとの箱ひげ図")

気づいたこと・疑問

  • この期間では、あまり大きな変化はないように見える。

  • 一般的に、女性の失業率の方が高い。

df_unemp_long |> filter(iso2c %in% ASEAN) |> drop_na(value) |> 
  ggplot(aes(country, value, fill = name)) + geom_boxplot() + coord_flip() +
  labs(title = "ASEAN の労働者失業率:男女別箱ひげ図")

気づいたこと・疑問

  • それぞれの国のデータは、データのある年の中での、値である。

  • 国によって、さまざまである。個別に調べた方がよいように見える。

LS0tCnRpdGxlOiAi6Kqy6aGMMu+8muaOoue0oueahOODh+ODvOOCv+WIhuaekCAtIEVEQSIKYXV0aG9yOiAiSUQsIExhc3QsIEZpcnN0IgpkYXRlOiAiMjAyNOW5tDLmnIg25pelIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCiMjIOiqsumhjAoK5Lul5LiL44Gu5oyH5qiZ44Gu5Lit44GL44KJ44CB5LqM44Gk5Lul5LiK77yI6KSH5pWw77yJ44KS6YG45oqe44GX44Gm44CB44OH44O844K/44Gu5qaC6KaB77yIZGVzY3JpcHRpb27vvInjgpLoqJjpjLLjgZfjgIHjg4fjg7zjgr/jgpIgV0RJIOOBp+WPluW+l+OBl+OAgeS7peS4i+OBruWIhuaekOOCkuOBmeOCi+OAggoKMS4gIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoyLiAg57WM5bm05aSJ5YyW44KS6KGo44GZ5oqY44KM57ea44Kw44Op44OVCiAgICBhLiAg5pel5pys44CB44G+44Gf44Gv44OH44O844K/44GM44GC44KL5Zu9CiAgICBiLiAg6YG45oqe44GX44Gf44GE44GP44Gk44GL44Gu5Zu9CjMuICDopIfmlbDjga7mjIfmqJnjga7lgKTjgpLkuIDliJfjgavlkKvjgoDnuKbplbfjga7ooajvvIhMb25nIFRhYmxl77yJ44KS5L2c5oiQ44GXIOOAgAogICAgYS4g5pel5pys44CB44G+44Gf44Gv44OH44O844K/44GM44GC44KL5Zu944Gu44CB6KSH5pWw44Gu5oyH5qiZ44KS6Imy5YiG44GR44GX44Gf57WM5bm05aSJ5YyW44Gu44Kw44Op44OVIOOAgAogICAgYi4g6YG45oqe44GX44Gf44GE44GP44Gk44GL44Gu5Zu944Gr44Gk44GE44Gm44Gu57WM5bm05aSJ5YyW44Gu44Kw44Op44OV44KS44CB5Zu944KS6Imy5YiG44GR44GX44CB5oyH5qiZ44Gv57ea44Gu56iu6aGe44KS5aSJ44GI44Gf44Kw44Op44OVCjQuICDkuozjgaTjga7jg4fjg7zjgr/jga7mlaPluIPlm7MtIE5BIOOBr+WPluOCiumZpOOBj+OBk+OBqOOAgu+8iGxvZzEwIOOCueOCseODvOODq+OCkueUqOOBhOOCi+WgtOWQiOOBr+WApOOBjOato+OBruOCguOBruOBruOBv+OBq+mZkOWumu+8iQogICAgYS4gIO+8iOWcsOWfn+OCkumZpOOBje+8ieWbveOBruOBv+OBruaVo+W4g+WbsyDvvIjov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjgpLooajnpLrvvIkKICAgIGIuICDmnIDov5Hjga7lubTjga7vvIjlnLDln5/jgpLpmaTjgY3vvInlm73jga7jgb/jga7mlaPluIPlm7PjgIDvvIjov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjgpLooajnpLrvvIkKICAgIGMuICBiIOOBq+WvvuW/nOOBmeOCi+ebuOmWouS/guaVsAo1LiAg44Kr44OG44K044Oq44O85aSJ5pWw77yIQ2F0ZWdvcmljYWwgVmFyaWFibGU6IHJlZ2lvbiwgaW5jb21lLCB5ZWFyIOOBquOBqe+8ieOBqOOAgeaVsOWApOWkieaVsO+8iE51bWJlcmljYWwgVmFyaWFibGXvvInkuIDntYTjgavjgaTjgYTjgabjga7nrrHjg5LjgrLlm7PvvIhCb3hwbG9077yJCgrjgZ3jgozjgZ7jgozjgavjgaTjgYTjgabogIPlr5/vvIjmsJfjgaXjgYTjgZ/jgZPjgajjgIHnlpHllY/jgarjganvvInjgpLoqJjjgZkKCioqMjAyMy4yLjEwLjIzOjU5Kiog44G+44Gn44GrIE1vb2RsZSDjga7oqrLpoYzvvJLmj5Dlh7rjg5zjg4Pjgq/jgrnjgavmj5Dlh7rjgZfjgabjgY/jgaDjgZXjgYTjgIIKCuOBp+OBjeOBn+OCsOODqeODleOBoOOBkeOBp+OCguani+OBhOOBvuOBm+OCk+OBi+OCieOAgeacn+mZkOOBvuOBp+OBq+aPkOWHuuOBl+OBpuOBj+OBoOOBleOBhOOAguino+iqrOOCkuWKoOOBiOOAgeiqsumhjO+8kuWGjeaPkOWHuuODnOODg+OCr+OCueOCkuS9nOaIkOOBmeOCi+S6iOWumuOBp+OBmeOAggoKIyMjIOODh+ODvOOCvwoKMS4gIENPMiBlbWlzc2lvbnMgKG1ldHJpYyB0b25zIHBlciBjYXBpdGEpIO+8mkVOLkFUTS5DTzJFLlBDIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VOLkFUTS5DTzJFLlBDKV0KCjIuICBGb3Jlc3QgYXJlYSAoJSBvZiBsYW5kIGFyZWEp77yaQUcuTE5ELkZSU1QuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvQUcuTE5ELkZSU1QuWlMpXQoKMy4gIFJlbmV3YWJsZSBlbGVjdHJpY2l0eSBvdXRwdXQgKCUgb2YgdG90YWwgZWxlY3RyaWNpdHkgb3V0cHV0Ke+8mkVHLkVMQy5STkVXLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VHLkVMQy5STkVXLlpTKV0KCjQuICBFbGVjdHJpY2l0eSBwcm9kdWN0aW9uIGZyb20gb2lsLCBnYXMgYW5kIGNvYWwgc291cmNlcyAoJSBvZiB0b3RhbCnvvJpFRy5FTEMuRk9TTC5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FRy5FTEMuRk9TTC5aUyldCgo1LiAgRWxlY3RyaWNpdHkgcHJvZHVjdGlvbiBmcm9tIG51Y2xlYXIgc291cmNlcyAoJSBvZiB0b3RhbCnvvJpFRy5FTEMuTlVDTC5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FRy5FTEMuTlVDTC5aUyldCgo2LiAgQWNjZXNzIHRvIGVsZWN0cmljaXR5LCB1cmJhbiAoJSBvZiB1cmJhbiBwb3B1bGF0aW9uKe+8mkVHLkVMQy5BQ0NTLlVSLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VHLkVMQy5BQ0NTLlVSLlpTKV0KCjcuICBBY2Nlc3MgdG8gZWxlY3RyaWNpdHksIHJ1cmFsICglIG9mIHJ1cmFsIHBvcHVsYXRpb24p77yaRUcuRUxDLkFDQ1MuUlUuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRUcuRUxDLkFDQ1MuUlUuWlMpXQoKOC4gIFBlb3BsZSB1c2luZyBhdCBsZWFzdCBiYXNpYyBkcmlua2luZyB3YXRlciBzZXJ2aWNlcywgdXJiYW4gKCUgb2YgdXJiYW4gcG9wdWxhdGlvbinvvJpTSC5IMk8uQkFTVy5VUi5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSC5IMk8uQkFTVy5aUyldCgo5LiAgUGVvcGxlIHVzaW5nIGF0IGxlYXN0IGJhc2ljIGRyaW5raW5nIHdhdGVyIHNlcnZpY2VzLCBydXJhbCAoJSBvZiBydXJhbCBwb3B1bGF0aW9uKe+8mlNILkgyTy5CQVNXLlJVLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NILkgyTy5CQVNXLlJVLlpTKV0KCjEwLiBQZW9wbGUgdXNpbmcgYXQgbGVhc3QgYmFzaWMgc2FuaXRhdGlvbiBzZXJ2aWNlcywgdXJiYW4gKCUgb2YgdXJiYW4gcG9wdWxhdGlvbinvvJpTSC5TVEEuQkFTUy5VUi5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSC5TVEEuQkFTUy5VUi5aUyldCgoxMS4gUGVvcGxlIHVzaW5nIGF0IGxlYXN0IGJhc2ljIHNhbml0YXRpb24gc2VydmljZXMsIHJ1cmFsICglIG9mIHJ1cmFsIHBvcHVsYXRpb24p77yaU0guU1RBLkJBU1MuUlUuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0guU1RBLkJBU1MuUlUuWlMpXQoKIyDnlLflpbPliKXlpLHmpa3njocKCiMjIOODh+ODvOOCvwoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOWls+aAp+OBruWksealreeOh++8mlVuZW1wbG95bWVudCwgZmVtYWxlICglIG9mIGZlbWFsZSBsYWJvciBmb3JjZSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlVFTS5UT1RMLkZFLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlVFTS5UT1RMLkZFLlpTKV0KCi0gICDnlLfmgKfjga7lpLHmpa3njofvvJpVbmVtcGxveW1lbnQsIG1hbGUgKCUgb2YgbWFsZSBsYWJvciBmb3JjZSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlVFTS5UT1RMLk1BLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlVFTS5UT1RMLk1BLlpTKV0KCi0gICDlpLHmpa3njofjgajjga/jgIHlirTlg43kurrlj6Pjga7jgYbjgaHjgafjgIHlpLHmpa3jgZfjgabjgYrjgorjgIHjgYvjgaTku5XkuovjgavlsLHjgY/jgZPjgajjgpLmsYLjgoHjgabjgYTjgovogIXjga7njofjgpLjgYTjgYbjgIJVbmVtcGxveW1lbnQgcmVmZXJzIHRvIHRoZSBzaGFyZSBvZiB0aGUgbGFib3IgZm9yY2UgdGhhdCBpcyB3aXRob3V0IHdvcmsgYnV0IGF2YWlsYWJsZSBmb3IgYW5kIHNlZWtpbmcgZW1wbG95bWVudC4KCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgoq44GT44KM44G+44Gn44Go44KC5ZCM44GY44KI44GG44Gr5LqM44Gk44Gu44OR44OD44Kx44O844K444KS6Kqt44G/6L6844G/77yIbG9hZO+8ieOBvuOBmeOAgioKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShXREkpCmBgYAoKV0RJIOODkeODg+OCseODvOOCuOOCkuS9v+OBo+OBpuOAgeebtOaOpeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OAgeWkieaVsOWQjeOCkuOAgXVuZGVyXzYuODUg44Gr5oyH5a6a44CCCgoq44GT44Gu5aSJ5pWw5ZCN44Gv44CB5LuK5b6M5L2/44GE44G+44GZ44GL44KJ44CB6YeN6KaB44Gn44GZ44CC5LiA5b+c44CB5L6L44Go44GX44Gm44CB44KP44Gf44GX44GM5L2/44Gj44Gf44CB5aSJ5pWw5ZCN44KS5pu444GE44Gm44GC44KK44G+44GZ44CC5LuW44Gu5aSJ5pWw5ZCN44KS5L2/44Gj44Gm44KC5qeL44GE44G+44Gb44KT44CCKgoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl91bmVtcGxveSA8LSBXREkoaW5kaWNhdG9yID0gYyhmZW1hbGVfdW5lbXBsb3kgPSAiU0wuVUVNLlRPVEwuRkUuWlMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFsZV91bmVtcGxveSA9ICJTTC5VRU0uVE9UTC5NQS5aUyIpLAogICAgICAgICAgICAgICAgICAgZXh0cmEgPSBUUlVFKQpgYGAKCipkYXRhIOODh+OCo+ODrOOCr+ODiOODquOBq+abuOOBjei+vOOCk+OBp+OBiuOBjeOBvuOBmeOAgioKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX3VuZW1wbG95LCAiZGF0YS91bmVtcGxveS5jc3YiKQpgYGAKCipkYXRhIOODh+OCo+ODrOOCr+ODiOODquOBi+OCieiqreOBv+WHuuOBl+OBvuOBmeOAglJ1biBBbGwg44KE44CBUnVuIEFsbCBDaHVua3MgQWJvdmUg44KS44GZ44KL5pmC44Gv44CB5LiK44Gu5LqM44Gk44KS44K544Kt44OD44OX44GZ44KL6Kit5a6a44Gr44GX44Gm44GC44KK44G+44GZ44CCKgoKYGBge3J9CmRmX3VuZW1wbG95IDwtIHJlYWRfY3N2KCJkYXRhL3VuZW1wbG95LmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKKuODh+ODvOOCv+WQjeOBp+OAgeS4rei6q+OCkuihqOekuuOBp+OBjeOBvuOBmeOAgmBoZWFkKGRmX3VuZW1wbG95KWAg44Go44GZ44KL44Go44CBNuihjOihqOekuuOBleOCjOOBvuOBmeOAgioKCmBgYHtyfQpkZl91bmVtcGxveQpgYGAKCirlpInmlbDjga7mg4XloLHjgpLlvpfjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIqCgpgYGB7cn0Kc3RyKGRmX3VuZW1wbG95KQpgYGAKCiMjIyDlpInlvaIKCiMjIyMg5aSJ5pWw44Gu6YG45oqe77yIc2VsZWN0aW5n77yJCgpgYGB7cn0KZGZfdW5lbXAgPC0gZGZfdW5lbXBsb3kgfD4gCiAgc2VsZWN0KGNvdW50cnksIGlzbzJjLCB5ZWFyLCBmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3ksIHJlZ2lvbiwgaW5jb21lKQpkZl91bmVtcApgYGAKCirjg4fjg7zjgr/jgavjga8gY291bnRyeSDjga7jgajjgZPjgo3jgavjgIHlm73jgaDjgZHjgafjgarjgY/jgIHlnLDln5/jgoLlhaXjgaPjgabjgYTjgovjga7jgafjgIHlnLDln5/jga7jg6rjgrnjg4jjgpLjgIFgaXNvMmNgIOOBpyBgUkVHSU9OYCDjgavlhaXjgozjgabjgYrjgY3jgb7jgZnjgIIqCgpgYGB7cn0KUkVHSU9OIDwtIGMoIjFBIiwgIjFXIiwgIjRFIiwgIjZGIiwgIjZOIiwgIjZYIiwgIjdFIiwgIjhTIiwgIkE0IiwgIkE1IiwgCiJBOSIsICJCMSIsICJCMiIsICJCMyIsICJCNCIsICJCNiIsICJCNyIsICJCOCIsICJDNCIsICJDNSIsICJDNiIsIAoiQzciLCAiQzgiLCAiQzkiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciLCAiRVUiLCAiRjEiLCAKIkY2IiwgIk0xIiwgIk0yIiwgIk42IiwgIk9FIiwgIlI2IiwgIlMxIiwgIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgCiJUMyIsICJUNCIsICJUNSIsICJUNiIsICJUNyIsICJWMSIsICJWMiIsICJWMyIsICJWNCIsICJYQyIsICJYRCIsIAoiWEUiLCAiWEYiLCAiWEciLCAiWEgiLCAiWEkiLCAiWEoiLCAiWEwiLCAiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAKIlhRIiwgIlhUIiwgIlhVIiwgIlhZIiwgIlo0IiwgIlo3IiwgIlpCIiwgIlpGIiwgIlpHIiwgIlpIIiwgIlpJIiwgCiJaSiIsICJaUSIsICJaVCIpCmBgYAoKKuWcsOWfn+WQjeOBq+OBr+OBqeOBruOCiOOBhuOBquOCguOBruOBjOOBguOCi+OBi+imi+OBpuOBiuOBjeOBvuOBmeOAgioKCmBgYHtyfQpkZl91bmVtcCB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCirlm73lkI3jgoLjgIHlnLDln5/vvIhyZWdpb27vvInjgajjgIHmiYDlvpfjg6zjg5njg6vvvIhpbmNvbWXvvInjgajlhbHjgavjgIHooajnpLrjgZfjgabjgYrjgY3jgb7jgZnjgIIqCgpgYGB7cn0KZGZfdW5lbXAgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYywgcmVnaW9uLCBpbmNvbWUpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKKuiHquWIhuOBp+WIhuaekOOBl+OBn+OBhOWbveOBruODquOCueODiOOCkuS9nOOBo+OBpuOBj+OBoOOBleOBhOOAguOBk+OBk+OBp+OBr+OAgUFTRUFOIOOCkiBpc28yYyDjgafoqK3lrprjgZfjgb7jgZnjgILlm73lkI3jgafpgbjmip7jgZfjgabjgoLmp4vjgYTjgb7jgZvjgpPjgIIqCgpgYGB7cn0KQVNFQU4gPC0gYygiQk4iLCAiS0giLCAiSUQiLCAiTEEiLCAiTVkiLCAiTU0iLCAiUEgiLCAiU0ciLCAiVk4iKQpgYGAKCmBgYHtyfQphc2VhbiA8LSBjKCJCcnVuZWkgRGFydXNzYWxhbSIsICJDYW1ib2RpYSIsICJJbmRvbmVzaWEiLCAiTGFvIFBEUiIsICJNYWxheXNpYSIsICJNeWFubWFyIiwgIlBoaWxpcHBpbmVzIiwgIlNpbmdhcG9yZSIsICJWaWV0IE5hbSIpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMS4g5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCgoq44G+44Ga44Gv44CBTkEg44Gu5YCk44KS5YmK6Zmk44GX44G+44GZ44CC44Gd44Gu44GC44Go44Gn44CB5Zu944Gu5oOF5aCx44Gu5pWw44KS5pWw44GI44Gf44GE44Gu44Gn44CBYCEoaXNvMmMgJWluJSBSRUdJT04pYCDjgafjgIHkuIrjgafjgYrjgYTjgZ/jgIHlnLDln5/jga4gaXNvMmMg44KS6YG45oqe44GX44CBISDjga/lkKblrprjgafjgZfjgZ/jgYvjgonjgIHlnLDln5/jgafjga/jgarjgYTjgoLjga7jgpLpgbjmip7jgZfjgIHjgZ3jga7mlbDjgpLmo5LjgrDjg6njg5XjgavjgZfjgabjgYTjgb7jgZnjgIIqCgpgYGB7cn0KZGZfdW5lbXAgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMTk5MeW5tOOBi+OCiTIwMjLlubTjgb7jgafjg4fjg7zjgr/jgYzjgYLjgovjgIIyMDIxLCAyMDIyIOOBr+OAgeWwkeOBl+ODh+ODvOOCv+OBjOWwkeOBquOBhOOBjOOAgTIwMjDlubTjgajjgYLjgb7jgorlpInjgo/jgonjgarjgYTjgIIKCiMjIyDntYzlubTlpInljJbjgpLooajjgZnmipjjgoznt5rjgrDjg6njg5UKCiMjIyMgYS4g5pel5pys44CB44G+44Gf44Gv44OH44O844K/44GM44GC44KL5Zu9CgpgYGB7cn0KZGZfdW5lbXAgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBmZW1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIuaXpeacrOOBruWls+aAp+WKtOWDjeiAheWksealreeOhyIpCmBgYAoKYGBge3J9CmRmX3VuZW1wIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEobWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIG1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIuaXpeacrOOBrueUt+aAp+WKtOWDjeiAheWksealreeOhyIpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOaXpeacrOOBruOAgeWls+aAp+WksealreeOh+OBqOOAgeeUt+aAp+WksealreeOh+OBr+OAgeS8vOOBn+WCvuWQkeOBp+OBguOCi+OBjOOAgemHjeOBreOBpuOBv+OBpuOBv+OBn+OBhOOAggoKIyMjIyBiLiDpgbjmip7jgZfjgZ/jgYTjgY/jgaTjgYvjga7lm70KCkFTRUFOIOOBr+OAgWlzbzJjIOOBp+OBmeOBi+OCieOAgeS4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CmRmX3VuZW1wIHw+IGZpbHRlcihpc28yYyAlaW4lIEFTRUFOKSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZlbWFsZV91bmVtcGxveSwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiQVNFQU4g44Gu5aWz5oCn5Yq05YON6ICF5aSx5qWt546HIikKYGBgCgphc2VhbiDjga/jgIHlm73lkI3jgafjgZfjgZ/jgYvjgonjgIHkuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgILku4rluqbjga/jgIHnlLfmgKfjga7lpLHmpa3njofjgafjgZnjgIIKCmBgYHtyfQpkZl91bmVtcCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIGFzZWFuKSB8PiBkcm9wX25hKG1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBtYWxlX3VuZW1wbG95LCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJBU0VBTiDjga7nlLfmgKflirTlg43ogIXlpLHmpa3njociKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDlm73jgavjgojjgaPjgabjgIHmp5jnm7jjgYznlbDjgarjgovjgojjgYbjgaDjgYzjgIHjgZPjgozjgoLjgIHph43jga3jgabjgb/jgZ/mlrnjgYzopovjgoTjgZnjgYTjgojjgYbjgavmgJ3jgo/jgozjgovjgIIKCiMjIyDnuKbplbfjga7ooajvvIhMb25nIFRhYmxl77yJCgoqYGNvbHMgPSBjKGZlbWFsZV91bmVtcGxveSwgbWFsZV91bmVtcGxveSlgIOOBqOOAgeS4gOOBpOOBruaMh+aomeOBq+OBvuOBqOOCgeOCi+OCguOBruOCkuODquOCueODiOOBmeOCi+OBqOOAgWBuYW1lYCDjgavmjIfmqJnlkI3jgYzlhaXjgorjgIFgdmFsdWVgIOOBq+OAgeOBneOBruWApOOBjOWFpeOCi+OAguabuOW8j+OBr+OAgWBwaXZvdF9sb25nZXIoY29scyA9IC4uLiwgbmFtZXNfdG8gPSAuLi4sIHZhbHVlc190byA9IC4uLilgIOOBp+OAgeWIneacn+ioreWumuOBp+OBr+OAgWBuYW1lc190byA9ICJuYW1lIiwgdmFsdWVzX3RvID0gInZhbHVlImAg44Go44Gq44Gj44Gm44GE44KL44Gu44Gn44CB5oyH5a6a44GX44Gq44GE44Go44CB5LiL44Gu44KI44GG44Gr44Gq44KL44CCSGVscCDlj4LnhafjgIIqCgpgYGB7cn0KZGZfdW5lbXBfbG9uZyA8LSBkZl91bmVtcCB8PiBwaXZvdF9sb25nZXIoY29scyA9IGMoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSkKZGZfdW5lbXBfbG9uZwpgYGAKCiMjIyMg5pel5pys44Gu6KSH5pWw44Gu5oyH5qiZ44KS6Imy5YiG44GR44GX44Gf57WM5bm05aSJ5YyW44Gu44Kw44Op44OVIAoKKmBjb2wgPSBuYW1lYCDjgajmjIflrprjgZnjgovjgajjgIHoibLjgafljLrliKXjgZfjgabjgIHkuIDjgaTjga7jgrDjg6njg5Xjgavmj4/jgZHjgosqCgpgYGB7cn0KZGZfdW5lbXBfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IG5hbWUpKSArIGdlb21fbGluZSgpICArCiAgbGFicyh0aXRsZSA9ICLml6XmnKzjga7nlLflpbPliKXlpLHmpa3njociKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDjgbvjgbzjgIHlkIzjgZjlgr7lkJHjgafjgIHmjqjnp7vjgZfjgabjgYTjgovjgILmnIDov5Hjga/jgIHlpbPmgKfjga7lpLHmpa3njofjga7mlrnjgYzjgo/jgZrjgYvjgavkvY7jgYTloLTlkIjjgYzlpJrjgYTjgIIKCiMjIyMg6YG45oqe44GX44Gf44GE44GP44Gk44GL44Gu5Zu944Gu6KSH5pWw44Gu5oyH5qiZ44KS6Imy5YiG44GR44GX44Gf57WM5bm05aSJ5YyW44Gu44Kw44Op44OVIAoKYGBge3J9CmRmX3VuZW1wX2xvbmcgfD4gZmlsdGVyKGlzbzJjICVpbiUgQVNFQU4pIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKSAgKwogIGxhYnModGl0bGUgPSAiQVNFQU4g44Gu55S35aWz5Yil5aSx5qWt546HIikKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5Zu944Gr44KI44Gj44Gm44CB44Gd44KM44Ge44KM44Gn44CB5aWz5oCn44Gu5aSx5qWt546H44GM5aSa44GE5aC05ZCI44Gu44G744GG44GM44CB5aSa44GE44KI44GG44Gr6KaL44GI44KL44GM44CB44KC44Gj44Go44KI44GP6KaL44Gq44GE44Go44KP44GL44KJ44Gq44GE44CCCgojIyMg5pWj5biD5ZuzCgojIyMjIGEu77yI5Zyw5Z+f44KS6Zmk44GN77yJ5Zu944Gu44G/44Gu5pWj5biD5ZuzIAoKYGBge3J9CmRmX3VuZW1wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyhmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpKSArIGdlb21fcG9pbnQoKSAgKwogIGxhYnModGl0bGUgPSAi5aSx5qWt546H77ya55S35aWz5Yil55u46ZaiIikKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5by344GE55u46Zai44GM44GC44KK44Gd44GG44Gg44CC5pmv5rCX44Gu6Imv44GE5oKq44GE44GM6Zai5L+C44GZ44KL44Gu44Gg44KN44GG44GL44CCCgojIyMjIOi/keS8vO+8iOWbnuW4sO+8ieebtOe3muOBruihqOekugoKYGBge3J9CmRmX3VuZW1wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyhmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpKSArIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnModGl0bGUgPSAi5aSx5qWt546H77ya55S35aWz5Yil55u46Zai77yI5Zue5biw55u057ea5LuY77yJIikKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg55u057ea44Gu5YK+44GN44GL44KJ44CB5aWz5oCn5aSx5qWt546H44Gu5pa544GM44CB5LiA6Iis55qE44Gr44Gv6auY44GE44KI44GG44Gr6KaL44GI44KL44CCCgojIyMjIGIuIOacgOi/keOBruW5tOOBru+8iOWcsOWfn+OCkumZpOOBje+8ieWbveOBruOBv+OBruaVo+W4g+WbswoKYGBge3J9CmRmX3VuZW1wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgZHJvcF9uYShmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyhmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpKSArIGdlb21fcG9pbnQoKSArCiAgbGFicyh0aXRsZSA9ICIyMDIy5bm044Gu5aSx5qWt546H77ya55S35aWz5Yil55u46ZaiIikKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg44GE44KN44GE44KN44Gq5Zu944GM44GC44KL44KI44GG44Gr6KaL44GI44KL44CCCgojIyMjIOi/keS8vO+8iOWbnuW4sO+8ieebtOe3muOBruihqOekugoKYGBge3J9CmRmX3VuZW1wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgZHJvcF9uYShmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyhmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpKSArIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnModGl0bGUgPSAi5aSx5qWt546H77ya55S35aWz5Yil55u46Zai77yI5Zue5biw55u057ea5LuY77yJIikKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5aWz5oCn44Gu5aSx5qWt546H44Gu44G744GG44GM6auY44GE44KI44GG44Gg44CCCgojIyMjIGMuIOebuOmWouS/guaVsAoKYGBge3J9CmRmX3VuZW1wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgZHJvcF9uYShmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpIHw+IHNlbGVjdChmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpIHw+IGNvcigpCmBgYAoK55u46Zai5L+C5pWw44GM44CBMC44NyDjgafjgIHlvLfjgYTmraPjga7nm7jplqLjgYzjgYLjgovjgZPjgajjgYzopovjgablj5bjgozjgovjgIIKCiMjIyMg566x44OS44Ky5Zuz77yIQm94cGxvdO+8iQoKYGBge3J9CmRmX3VuZW1wX2xvbmcgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiAKICBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMobmFtZSwgdmFsdWUpKSArIGdlb21fYm94cGxvdCgpICsKICBsYWJzKHRpdGxlID0gIuWKtOWDjeiAheWksealreeOh++8mueUt+Wls+WIpeeuseOBsuOBkuWbsyIpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOWls+aAp+OBruWksealreeOh+OBruaWueOBjOOAgeWIhuW4g+OBi+OCieimi+OBpuOCguOAgemrmOOBhOWApOOBq+OBquOBo+OBpuOBhOOCi+OAggoKLSAgIOmdnuW4uOOBq+mrmOOBhOOBguOBn+OBhOOCguOAgeeJueOBq+Wls+aAp+OBruWksealreeOh+OBq+WtmOWcqOOBmeOCi+OAggoKYGBge3J9CmRmX3VuZW1wX2xvbmcgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiAKICBkcm9wX25hKHZhbHVlLCByZWdpb24pIHw+CiAgZ2dwbG90KGFlcyhyZWdpb24sIHZhbHVlLCBmaWxsID0gbmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBjb29yZF9mbGlwKCkgKwogIGxhYnModGl0bGUgPSAi5Yq05YON6ICF5aSx5qWt546H77ya55S35aWz44O75Zyw5Z+f5Yil566x44Gy44GS5ZuzIikKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5Zyw5Z+f5beu44GM44GC44KL44CC5YyX44Ki44Oh44Oq44Kr44CB44Oo44O844Ot44OD44OR44CB5p2x44Ki44K444Ki44Go5aSq5bmz5rSL5Zyw5Z+f44Gn44Gv44CB44GC44G+44KK5beu55Ww44GM44Gq44GE44GM44CB5LuW44Gu5Zyw5Z+f44Gn44Gv44CB5aWz5oCn44Gu5aSx5qWt546H44Gu5pa544GM6auY44GE44KI44GG44Gg44CCCgpgYGB7cn0KZGZfdW5lbXBfbG9uZyB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMjIpIHw+IAogIGRyb3BfbmEodmFsdWUsIGluY29tZSkgfD4gZmlsdGVyKGluY29tZSAhPSAiTm90IGNsYXNzaWZpZWQiKSB8PgogIGdncGxvdChhZXMoaW5jb21lLCB2YWx1ZSwgZmlsbCA9IG5hbWUpKSArIGdlb21fYm94cGxvdCgpICsgY29vcmRfZmxpcCgpICsKICBsYWJzKHRpdGxlID0gIuWKtOWDjeiAheWksealreeOh++8mueUt+Wls+ODu+WPjuWFpeODrOODmeODq+WIpeeuseOBsuOBkuWbsyIpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOS4reWkruWApOOBp+OBv+OCi+OBqOOAgVVwcGVyIG1pZGRsZSBpbmNvbWUg44Gn44Gv44CB5aWz5oCn44Gu5aSx5qWt546H44GM6Z2e5bi444Gr6auY44GECgpgYGB7cn0KZGZfdW5lbXBfbG9uZyB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyICVpbiUgYygxOTkxLCAyMDAxLCAyMDExLCAyMDIxKSkgfD4KICBkcm9wX25hKHZhbHVlKSB8PiAKICBnZ3Bsb3QoYWVzKGZhY3Rvcih5ZWFyKSwgdmFsdWUsIGZpbGwgPSBuYW1lKSkgKyBnZW9tX2JveHBsb3QoKSArCiAgbGFicyh0aXRsZSA9ICLlirTlg43ogIXlpLHmpa3njofvvJrnlLflpbPliKXjg7sxMOW5tOOBlOOBqOOBrueuseOBsuOBkuWbsyIpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOOBk+OBruacn+mWk+OBp+OBr+OAgeOBguOBvuOCiuWkp+OBjeOBquWkieWMluOBr+OBquOBhOOCiOOBhuOBq+imi+OBiOOCi+OAggoKLSAgIOS4gOiIrOeahOOBq+OAgeWls+aAp+OBruWksealreeOh+OBruaWueOBjOmrmOOBhOOAggoKYGBge3J9CmRmX3VuZW1wX2xvbmcgfD4gZmlsdGVyKGlzbzJjICVpbiUgQVNFQU4pIHw+IGRyb3BfbmEodmFsdWUpIHw+IAogIGdncGxvdChhZXMoY291bnRyeSwgdmFsdWUsIGZpbGwgPSBuYW1lKSkgKyBnZW9tX2JveHBsb3QoKSArIGNvb3JkX2ZsaXAoKSArCiAgbGFicyh0aXRsZSA9ICJBU0VBTiDjga7lirTlg43ogIXlpLHmpa3njofvvJrnlLflpbPliKXnrrHjgbLjgZLlm7MiKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDjgZ3jgozjgZ7jgozjga7lm73jga7jg4fjg7zjgr/jga/jgIHjg4fjg7zjgr/jga7jgYLjgovlubTjga7kuK3jgafjga7jgIHlgKTjgafjgYLjgovjgIIKCi0gICDlm73jgavjgojjgaPjgabjgIHjgZXjgb7jgZbjgb7jgafjgYLjgovjgILlgIvliKXjgavoqr/jgbnjgZ/mlrnjgYzjgojjgYTjgojjgYbjgavopovjgYjjgovjgIIK