難民人口

世界の出身国(origin)ごとの難民数と、庇護国(asylum)ごとの難民数について、特に、世界の7つの地域における難民と、紛争下にある、シリア、ウクライナ、アフガニスタン、南スーダン、ミャンマー、今後民主共和国、トルコ、パレスチナに焦点を合わせ調べる。

データ

データ情報

  1. 難民受け入れ人口:Refugee population by country or territory of asylum:SM.POP.REFG [Link]

  2. 難民となる人口:Refugee population by country or territory of origin:SM.POP.REFG.OR [Link]

  • 難民の庇護国とは、庇護請求が提出され、認められた国のことである。出身国とは、一般的に請求者の国籍または市民権のある国を指す。

  • Description: Refugees are people who are recognized as refugees under the 1951 Convention Relating to the Status of Refugees or its 1967 Protocol, the 1969 Organization of African Unity Convention Governing the Specific Aspects of Refugee Problems in Africa, people recognized as refugees in accordance with the UNHCR statute, people granted refugee-like humanitarian status, and people provided temporary protection. Asylum seekers–people who have applied for asylum or refugee status and who have not yet received a decision or who are registered as asylum seekers–are excluded. Palestinian refugees are people (and their descendants) whose residence was Palestine between June 1946 and May 1948 and who lost their homes and means of livelihood as a result of the 1948 Arab-Israeli conflict. Country of asylum is the country where an asylum claim was filed and granted. Country of origin generally refers to the nationality or country of citizenship of a claimant.

  • 概要: 難民とは、「難民の地位に関する1951年条約」またはその「1967年議定書」、「アフリカにおける難民問題の特定の側面を管理する1969年アフリカ統一機構条約」に基づき難民と認められた人、UNHCRの法令に基づき難民と認められた人、難民に準ずる人道的地位を与えられた人、一時的な保護を与えられた人を指す。庇護申請者–庇護または難民認定を申請し、まだ決定を受けていない人、または庇護申請者として登録されている人–は除外される。パレスチナ難民とは、1946年6月から1948年5月までの間に居住地がパレスチナであり、1948年のアラブ・イスラエル紛争の結果、住居と生計手段を失った人々(およびその子孫)である。庇護国とは、庇護請求が提出され、認められた国のことである。出身国とは、一般的に請求者の国籍または市民権のある国を指す。

データの取得

準備

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

library(tidyverse)
library(WDI)
library(showtext) # グラフの日本語文字化けを防ぐため
knitr::opts_chunk$set(fig.showtext=TRUE) # showtext_auto() でも文字化けは防げるが、タイトルなどの文字が小さくなる。

変数名を指定します。ここでは、refugee_asylum と、refugee_origin としました。なるべくわかりやすい名前にします。

この変数名は、今後使いますから、重要です。一応、例として、わたしが使った、変数名を書いてあります。他の変数名を使っても構いません。extra = TRUE とすると、地域名(region)や、収入レベル(income)などが追加されます。

df_refugee <- WDI(indicator = c(refugee_asylum = "SM.POP.REFG", 
                                 refugee_origin = "SM.POP.REFG.OR"),
                   extra = TRUE)

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

write_csv(df_refugee, "data/refugee.csv")

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

df_refugee <- read_csv("data/refugee.csv")
Rows: 16758 Columns: 14── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (7): country, iso2c, iso3c, region, capital, income, lending
dbl  (5): year, refugee_asylum, refugee_origin, 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_refugee) とすると、6行表示されます。

df_refugee

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

str(df_refugee)
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-19" "2023-12-19" ...
 $ refugee_asylum: num [1:16758] 300421 NA 34 16861 19605 ...
 $ refugee_origin: num [1:16758] 2596259 NA 2107510 2556483 2679132 ...
 $ 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 = ""),
  ..   refugee_asylum = col_double(),
  ..   refugee_origin = 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_ref <- df_refugee |> 
  select(country, iso2c, year, refugee_asylum, refugee_origin, region, income)
df_ref

データには 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_ref |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

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

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

分析する国のリスト

世界の難民を、7つの地域別に調るとともに、個人的に、関心がある、8カ国を選んで調べてみることにする。

世界銀行は、世界を7地域に分けています。

regions <- c("South Asia", "Europe & Central Asia", 
"Middle East & North Africa", "East Asia & Pacific", "Sub-Saharan Africa", 
"Latin America & Caribbean", "North America")

自分で分析したい国のリストを作ってください。ここでは、紛争に関係がありそうな国を CONFLICTS にします。

CONFLICTS <- c("Syrian Arab Republic", "Ukraine", "Afghanistan", "South Sudan", "Myanmar", "Congo, Dem. Rep.", "Turkiye", "West Bank and Gaza")

視覚化

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

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

df_ref |> drop_na(refugee_asylum, refugee_origin) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

気づいたこと・疑問

  • 1995年ごろからは、十分データがあるが、その前は少ない。2022年までありそう。

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

CONFLICTS は、country ですから、下のようにします。6e+06 = 1,000,000 などの、記法になっていますが、0 に近いところが多くなってしまうので、log10 スケールにしてみてみます。

df_ref |> filter(country %in% CONFLICTS) |> drop_na(refugee_origin) |>
  ggplot(aes(year, refugee_origin, col = country)) + geom_line() +
  labs(title = "紛争国の難民数")

df_ref |> filter(country %in% CONFLICTS) |> drop_na(refugee_origin) |>
  ggplot(aes(year, refugee_origin, col = country)) + geom_line() + scale_y_log10()

  labs(title = "紛争国の難民数(log10 スケール)")
$title
[1] "紛争国の難民数(log10 スケール)"

attr(,"class")
[1] "labels"
df_ref |> filter(country %in% CONFLICTS) |> drop_na(refugee_asylum) |>
  ggplot(aes(year, refugee_asylum, col = country)) + geom_line() +
  labs(title = "紛争国の難民受け入れ数")

気づいたこと・疑問

  • ミャンマーは登場していない。
  • 下の方に固まっているので、scale_y_log10() を使ってみる
    • 1e+06 は、1,000,000 人ですから、それ以下の国が多いということになります。
    • scale_y_log10() にすると、1e+02 = 100, 1e+04 = 10,000, 1e+06 = 1,000,000 y 座標軸に現れます。
df_ref |> filter(country %in% CONFLICTS) |> drop_na(refugee_asylum) |>
  ggplot(aes(year, refugee_asylum, col = country)) + geom_line() + scale_y_log10() +
  labs(title = "紛争国の難民受け入れ数(log10 スケール)")

3. 縦長の表(Long Table)

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

df_ref_long <- df_ref |> pivot_longer(cols = c(refugee_asylum, refugee_origin))
df_ref_long
df_ref_long |> filter(country == "World") |> drop_na(value) |>
  ggplot(aes(year, value, col = name)) + geom_line()  +
  labs(title = "世界の難民")

気づいたこと・疑問

  • 世界では、難民受け入れと、難民数が一致している。2010年ごろから、増加している。
df_ref_long |> filter(country %in% regions) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line() +
  labs(title = "地域ごとの難民")

紛争国の難民受け入れ数と難民のこれらの出身国別経年変化のグラフ

df_ref_long |> filter(country %in% CONFLICTS) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line()  + scale_y_log10() +
  labs(title = "紛争国の難民(log10 スケール)")

気づいたこと・疑問

  • もうすこし丁寧にみないとわからない。国の数が多い
  • log10 スケールの方がみやすい。

4. ヒストグラム

それぞれのデータが十分ある最近の年の値のヒストグラム(度数分布)

分け方の数 bins や、幅 binwidth を適切に変更

受け入れ国別難民数

df_ref |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(refugee_asylum) |>
  ggplot(aes(refugee_asylum, fill = region)) + geom_histogram(bins = 10, col = "black", linewidth = 0.2) + scale_x_log10()

出身国別難民数

df_ref |> filter(!(iso2c %in% REGION)) |> filter(year == 2022, refugee_origin >0) |>
  drop_na(refugee_origin) |>
  ggplot(aes(refugee_asylum, fill = region)) + geom_histogram(bins = 10, col = "black", linewidth = 0.2) + scale_x_log10()

5. 棒グラフ

データが十分ある最近の年の値の10カ国の値の棒グラフ

難民受け入れ国

df_ref |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(refugee_asylum) |>
  arrange(desc(refugee_asylum)) |> slice_head(n = 10) |>
  ggplot(aes(fct_rev(fct_inorder(country)), refugee_asylum, fill = region)) + geom_col() + coord_flip() + labs(title = "難民受け入れの多い順", x = "")

出身国の難民数

df_ref |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(refugee_origin) |>
  arrange(desc(refugee_origin)) |> slice_head(n = 10) |>
  ggplot(aes(fct_rev(fct_inorder(country)), refugee_origin, fill = region)) + geom_col() + coord_flip() + labs(title = "難民の多い順", x = "")

6. 散布図

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

LOG10 スケールを使っています。

df_ref |> filter(!(iso2c %in% REGION)) |> drop_na(refugee_asylum, refugee_origin) |>
  ggplot(aes(refugee_asylum, refugee_origin)) + geom_point(aes(col = region)) + scale_x_log10() + scale_y_log10() +
  labs(title = "難民・受け入れ(log10 スケール)")

気づいたこと・疑問

  • 相関はみられないが、地域性はみて取れるように思う。

2022年の(地域を除き)国のみの散布図

df_ref |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(refugee_asylum, refugee_origin) |>
  ggplot(aes(refugee_asylum, refugee_origin)) + geom_point(aes(col = region)) + scale_x_log10() + scale_y_log10() +
  labs(title = "2022年の難民相関")

気づいたこと・疑問

  • 地域ごとの特性があるていどあるように見える。

相関係数

df_ref |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(refugee_asylum, refugee_origin) |> select(refugee_asylum, refugee_origin) |> cor()
               refugee_asylum refugee_origin
refugee_asylum     1.00000000     0.02499224
refugee_origin     0.02499224     1.00000000

相関係数が、0.025 で、ほとんど相関はないと言って良い。

7. 箱ヒゲ図(Boxplot)

df_ref_long |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(value, region) |>
  ggplot(aes(region, value, fill = name)) + geom_boxplot() + coord_flip() +scale_y_log10() +
  labs(title = "難民・地域別箱ひげ図")

気づいたこと・疑問

  • 地域差がある。これだけでは、あまりわからない。
df_ref_long |> filter(country %in% CONFLICTS) |> drop_na(value) |> 
  ggplot(aes(country, value, fill = name)) + geom_boxplot() + coord_flip() + scale_y_log10() +
  labs(title = "紛争国の難民箱ひげ図")

気づいたこと・疑問

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

  • アフガニスタンは、継続して、難民が多いことがわかる。

参考

df_ref_long |> filter(country %in% regions) |> drop_na(value) |>
  ggplot(aes(year, value, fill = country)) + 
  geom_area(col = "black", linewidth = 0.1) +
  facet_wrap(~name) +
  labs(title = "Refugee Population by Region of Asylum and Origin", fill = "") +
  theme(legend.position = "top")

実数で、積み上げグラフを作成すると、 それぞれの地域の和をとったもので割って、百聞率を出すと、下のようになる。

df_ref |> filter(country %in% regions) |> 
  select(country, year, refugee_asylum, refugee_origin) |> drop_na(refugee_origin) |> group_by(year) |> 
  mutate(ASYLUM = refugee_asylum/sum(refugee_asylum), ORIGIN = refugee_origin/sum(refugee_origin)) |> ungroup() |>
  pivot_longer(cols = c(ASYLUM, ORIGIN)) |>
  ggplot(aes(year, value, fill = country)) + 
  geom_area(col = "black", linewidth = 0.1) + 
  facet_wrap(~name) + scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  labs(title = "Refugee Ratio by Region of Asylum and Origin", fill = "", y = "") +
  theme(legend.position = "top")

LS0tCnRpdGxlOiAi5o6i56m255qE44OH44O844K/5YiG5p6Q77ya6Zuj5rCRIgphdXRob3I6ICLpiLTmnKjlr5siCmRhdGU6ICIyMDI05bm0MuaciDIw5pelIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCiMg6Zuj5rCR5Lq65Y+jCgo+IOS4lueVjOOBruWHuui6q+Wbve+8iG9yaWdpbu+8ieOBlOOBqOOBrumbo+awkeaVsOOBqOOAgeW6h+itt+Wbve+8iGFzeWx1be+8ieOBlOOBqOOBrumbo+awkeaVsOOBq+OBpOOBhOOBpuOAgeeJueOBq+OAgeS4lueVjOOBrjfjgaTjga7lnLDln5/jgavjgYrjgZHjgovpm6PmsJHjgajjgIHntJvkuonkuIvjgavjgYLjgovjgIHjgrfjg6rjgqLjgIHjgqbjgq/jg6njgqTjg4rjgIHjgqLjg5Xjgqzjg4vjgrnjgr/jg7PjgIHljZfjgrnjg7zjg4Djg7PjgIHjg5/jg6Pjg7Pjg57jg7zjgIHku4rlvozmsJHkuLvlhbHlkozlm73jgIHjg4jjg6vjgrPjgIHjg5Hjg6zjgrnjg4Hjg4rjgavnhKbngrnjgpLlkIjjgo/jgZvoqr/jgbnjgovjgIIKCiMjIOODh+ODvOOCvwoKIyMjIOODh+ODvOOCv+aDheWgsQoKMS4gICDpm6PmsJHlj5fjgZHlhaXjgozkurrlj6PvvJpSZWZ1Z2VlIHBvcHVsYXRpb24gYnkgY291bnRyeSBvciB0ZXJyaXRvcnkgb2YgYXN5bHVt77yaU00uUE9QLlJFRkcgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU00uUE9QLlJFRkcpXQoKMi4gICDpm6PmsJHjgajjgarjgovkurrlj6PvvJpSZWZ1Z2VlIHBvcHVsYXRpb24gYnkgY291bnRyeSBvciB0ZXJyaXRvcnkgb2Ygb3JpZ2lu77yaU00uUE9QLlJFRkcuT1IgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU00uUE9QLlJFRkcuT1IpXQoKLSAgIOmbo+awkeOBruW6h+itt+WbveOBqOOBr+OAgeW6h+itt+iri+axguOBjOaPkOWHuuOBleOCjOOAgeiqjeOCgeOCieOCjOOBn+WbveOBruOBk+OBqOOBp+OBguOCi+OAguWHuui6q+WbveOBqOOBr+OAgeS4gOiIrOeahOOBq+iri+axguiAheOBruWbveexjeOBvuOBn+OBr+W4guawkeaoqeOBruOBguOCi+WbveOCkuaMh+OBmeOAggoKLSAgICoqRGVzY3JpcHRpb246KiogUmVmdWdlZXMgYXJlIHBlb3BsZSB3aG8gYXJlIHJlY29nbml6ZWQgYXMgcmVmdWdlZXMgdW5kZXIgdGhlIDE5NTEgQ29udmVudGlvbiBSZWxhdGluZyB0byB0aGUgU3RhdHVzIG9mIFJlZnVnZWVzIG9yIGl0cyAxOTY3IFByb3RvY29sLCB0aGUgMTk2OSBPcmdhbml6YXRpb24gb2YgQWZyaWNhbiBVbml0eSBDb252ZW50aW9uIEdvdmVybmluZyB0aGUgU3BlY2lmaWMgQXNwZWN0cyBvZiBSZWZ1Z2VlIFByb2JsZW1zIGluIEFmcmljYSwgcGVvcGxlIHJlY29nbml6ZWQgYXMgcmVmdWdlZXMgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBVTkhDUiBzdGF0dXRlLCBwZW9wbGUgZ3JhbnRlZCByZWZ1Z2VlLWxpa2UgaHVtYW5pdGFyaWFuIHN0YXR1cywgYW5kIHBlb3BsZSBwcm92aWRlZCB0ZW1wb3JhcnkgcHJvdGVjdGlvbi4gQXN5bHVtIHNlZWtlcnMtLXBlb3BsZSB3aG8gaGF2ZSBhcHBsaWVkIGZvciBhc3lsdW0gb3IgcmVmdWdlZSBzdGF0dXMgYW5kIHdobyBoYXZlIG5vdCB5ZXQgcmVjZWl2ZWQgYSBkZWNpc2lvbiBvciB3aG8gYXJlIHJlZ2lzdGVyZWQgYXMgYXN5bHVtIHNlZWtlcnMtLWFyZSBleGNsdWRlZC4gUGFsZXN0aW5pYW4gcmVmdWdlZXMgYXJlIHBlb3BsZSAoYW5kIHRoZWlyIGRlc2NlbmRhbnRzKSB3aG9zZSByZXNpZGVuY2Ugd2FzIFBhbGVzdGluZSBiZXR3ZWVuIEp1bmUgMTk0NiBhbmQgTWF5IDE5NDggYW5kIHdobyBsb3N0IHRoZWlyIGhvbWVzIGFuZCBtZWFucyBvZiBsaXZlbGlob29kIGFzIGEgcmVzdWx0IG9mIHRoZSAxOTQ4IEFyYWItSXNyYWVsaSBjb25mbGljdC4gQ291bnRyeSBvZiBhc3lsdW0gaXMgdGhlIGNvdW50cnkgd2hlcmUgYW4gYXN5bHVtIGNsYWltIHdhcyBmaWxlZCBhbmQgZ3JhbnRlZC4gQ291bnRyeSBvZiBvcmlnaW4gZ2VuZXJhbGx5IHJlZmVycyB0byB0aGUgbmF0aW9uYWxpdHkgb3IgY291bnRyeSBvZiBjaXRpemVuc2hpcCBvZiBhIGNsYWltYW50LgoKLSAgICoq5qaC6KaBOioqIOmbo+awkeOBqOOBr+OAgeOAjOmbo+awkeOBruWcsOS9jeOBq+mWouOBmeOCizE5NTHlubTmnaHntITjgI3jgb7jgZ/jga/jgZ3jga7jgIwxOTY35bm06K2w5a6a5pu444CN44CB44CM44Ki44OV44Oq44Kr44Gr44GK44GR44KL6Zuj5rCR5ZWP6aGM44Gu54m55a6a44Gu5YG06Z2i44KS566h55CG44GZ44KLMTk2OeW5tOOCouODleODquOCq+e1seS4gOapn+ani+adoee0hOOAjeOBq+WfuuOBpeOBjembo+awkeOBqOiqjeOCgeOCieOCjOOBn+S6uuOAgVVOSENS44Gu5rOV5Luk44Gr5Z+644Gl44GN6Zuj5rCR44Go6KqN44KB44KJ44KM44Gf5Lq644CB6Zuj5rCR44Gr5rqW44Ga44KL5Lq66YGT55qE5Zyw5L2N44KS5LiO44GI44KJ44KM44Gf5Lq644CB5LiA5pmC55qE44Gq5L+d6K2344KS5LiO44GI44KJ44KM44Gf5Lq644KS5oyH44GZ44CC5bqH6K2355Sz6KuL6ICFLS3luoforbfjgb7jgZ/jga/pm6PmsJHoqo3lrprjgpLnlLPoq4vjgZfjgIHjgb7jgaDmsbrlrprjgpLlj5fjgZHjgabjgYTjgarjgYTkurrjgIHjgb7jgZ/jga/luoforbfnlLPoq4vogIXjgajjgZfjgabnmbvpjLLjgZXjgozjgabjgYTjgovkurotLeOBr+mZpOWkluOBleOCjOOCi+OAguODkeODrOOCueODgeODiumbo+awkeOBqOOBr+OAgTE5NDblubQ25pyI44GL44KJMTk0OOW5tDXmnIjjgb7jgafjga7plpPjgavlsYXkvY/lnLDjgYzjg5Hjg6zjgrnjg4Hjg4rjgafjgYLjgorjgIExOTQ45bm044Gu44Ki44Op44OW44O744Kk44K544Op44Ko44Or57Sb5LqJ44Gu57WQ5p6c44CB5L2P5bGF44Go55Sf6KiI5omL5q6144KS5aSx44Gj44Gf5Lq644CF77yI44GK44KI44Gz44Gd44Gu5a2Q5a2r77yJ44Gn44GC44KL44CC5bqH6K235Zu944Go44Gv44CB5bqH6K236KuL5rGC44GM5o+Q5Ye644GV44KM44CB6KqN44KB44KJ44KM44Gf5Zu944Gu44GT44Go44Gn44GC44KL44CC5Ye66Lqr5Zu944Go44Gv44CB5LiA6Iis55qE44Gr6KuL5rGC6ICF44Gu5Zu957GN44G+44Gf44Gv5biC5rCR5qip44Gu44GC44KL5Zu944KS5oyH44GZ44CCCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKKuOBk+OCjOOBvuOBp+OBqOOCguWQjOOBmOOCiOOBhuOBq+S6jOOBpOOBruODkeODg+OCseODvOOCuOOCkuiqreOBv+i+vOOBv++8iGxvYWTvvInjgb7jgZnjgIIqCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHNob3d0ZXh0KSAjIOOCsOODqeODleOBruaXpeacrOiqnuaWh+Wtl+WMluOBkeOCkumYsuOBkOOBn+OCgQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLnNob3d0ZXh0PVRSVUUpICMgc2hvd3RleHRfYXV0bygpIOOBp+OCguaWh+Wtl+WMluOBkeOBr+mYsuOBkuOCi+OBjOOAgeOCv+OCpOODiOODq+OBquOBqeOBruaWh+Wtl+OBjOWwj+OBleOBj+OBquOCi+OAggpgYGAKCirlpInmlbDlkI3jgpLmjIflrprjgZfjgb7jgZnjgILjgZPjgZPjgafjga/jgIFgcmVmdWdlZV9hc3lsdW1gIOOBqOOAgWByZWZ1Z2VlX29yaWdpbmAg44Go44GX44G+44GX44Gf44CC44Gq44KL44G544GP44KP44GL44KK44KE44GZ44GE5ZCN5YmN44Gr44GX44G+44GZ44CCKgoKKuOBk+OBruWkieaVsOWQjeOBr+OAgeS7iuW+jOS9v+OBhOOBvuOBmeOBi+OCieOAgemHjeimgeOBp+OBmeOAguS4gOW/nOOAgeS+i+OBqOOBl+OBpuOAgeOCj+OBn+OBl+OBjOS9v+OBo+OBn+OAgeWkieaVsOWQjeOCkuabuOOBhOOBpuOBguOCiuOBvuOBmeOAguS7luOBruWkieaVsOWQjeOCkuS9v+OBo+OBpuOCguani+OBhOOBvuOBm+OCk+OAgmBleHRyYSA9IFRSVUVgIOOBqOOBmeOCi+OBqOOAgeWcsOWfn+WQje+8iHJlZ2lvbu+8ieOChOOAgeWPjuWFpeODrOODmeODq++8iGluY29tZe+8ieOBquOBqeOBjOi/veWKoOOBleOCjOOBvuOBmeOAgioKCgoKYGBge3IgZXZhbCA9IEZBTFNFLCBjYWNoID0gVFJVRX0KZGZfcmVmdWdlZSA8LSBXREkoaW5kaWNhdG9yID0gYyhyZWZ1Z2VlX2FzeWx1bSA9ICJTTS5QT1AuUkVGRyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZ1Z2VlX29yaWdpbiA9ICJTTS5QT1AuUkVGRy5PUiIpLAogICAgICAgICAgICAgICAgICAgZXh0cmEgPSBUUlVFKQpgYGAKCipkYXRhIOODh+OCo+ODrOOCr+ODiOODquOBq+abuOOBjei+vOOCk+OBp+OBiuOBjeOBvuOBmeOAgioKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX3JlZnVnZWUsICJkYXRhL3JlZnVnZWUuY3N2IikKYGBgCgoqZGF0YSDjg4fjgqPjg6zjgq/jg4jjg6rjgYvjgonoqq3jgb/lh7rjgZfjgb7jgZnjgIJSdW4gQWxsIOOChOOAgVJ1biBBbGwgQ2h1bmtzIEFib3ZlIOOCkuOBmeOCi+aZguOBr+OAgeS4iuOBruS6jOOBpOOCkuOCueOCreODg+ODl+OBmeOCi+ioreWumuOBq+OBl+OBpuOBguOCiuOBvuOBmeOAgioKCmBgYHtyIGNhY2hlID0gVFJVRX0KZGZfcmVmdWdlZSA8LSByZWFkX2NzdigiZGF0YS9yZWZ1Z2VlLmNzdiIpCmBgYAojIyMg44OH44O844K/44Gu56K66KqNCgoq44OH44O844K/5ZCN44Gn44CB5Lit6Lqr44KS6KGo56S644Gn44GN44G+44GZ44CCYGhlYWQoZGZfcmVmdWdlZSlgIOOBqOOBmeOCi+OBqOOAgTbooYzooajnpLrjgZXjgozjgb7jgZnjgIIqCgpgYGB7cn0KZGZfcmVmdWdlZQpgYGAKCirlpInmlbDjga7mg4XloLHjgpLlvpfjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIqCgpgYGB7cn0Kc3RyKGRmX3JlZnVnZWUpCmBgYAoKIyMg5aSJ5b2iCgojIyMg5aSJ5pWw44Gu6YG45oqe77yIc2VsZWN0aW5n77yJCgpgYGB7ciBjYWNoZSA9IFRSVUV9CmRmX3JlZiA8LSBkZl9yZWZ1Z2VlIHw+IAogIHNlbGVjdChjb3VudHJ5LCBpc28yYywgeWVhciwgcmVmdWdlZV9hc3lsdW0sIHJlZnVnZWVfb3JpZ2luLCByZWdpb24sIGluY29tZSkKZGZfcmVmCmBgYAoKKuODh+ODvOOCv+OBq+OBryBjb3VudHJ5IOOBruOBqOOBk+OCjeOBq+OAgeWbveOBoOOBkeOBp+OBquOBj+OAgeWcsOWfn+OCguWFpeOBo+OBpuOBhOOCi+OBruOBp+OAgeWcsOWfn+OBruODquOCueODiOOCkuOAgWBpc28yY2Ag44GnIGBSRUdJT05gIOOBq+WFpeOCjOOBpuOBiuOBjeOBvuOBmeOAgioKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiNkYiLCAiNk4iLCAiNlgiLCAiN0UiLCAiOFMiLCAiQTQiLCAiQTUiLCAKIkE5IiwgIkIxIiwgIkIyIiwgIkIzIiwgIkI0IiwgIkI2IiwgIkI3IiwgIkI4IiwgIkM0IiwgIkM1IiwgIkM2IiwgCiJDNyIsICJDOCIsICJDOSIsICJEMiIsICJEMyIsICJENCIsICJENSIsICJENiIsICJENyIsICJFVSIsICJGMSIsIAoiRjYiLCAiTTEiLCAiTTIiLCAiTjYiLCAiT0UiLCAiUjYiLCAiUzEiLCAiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAKIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgCiJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsICJYTSIsICJYTiIsICJYTyIsICJYUCIsIAoiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkIiLCAiWkYiLCAiWkciLCAiWkgiLCAiWkkiLCAKIlpKIiwgIlpRIiwgIlpUIikKYGBgCgoq5Zyw5Z+f5ZCN44Gr44Gv44Gp44Gu44KI44GG44Gq44KC44Gu44GM44GC44KL44GL6KaL44Gm44GK44GN44G+44GZ44CC5LiL44Gu44CB5Zyw5Z+f44Go44CB5Zu95ZCN44KS6YG45oqe44GZ44KL44Go44GN44Gr5Y+C6ICD44Gr44GX44G+44GZ44CCKgoKYGBge3J9CmRmX3JlZiB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCirlm73lkI3jgoLjgIHlnLDln5/vvIhyZWdpb27vvInjgajjgIHmiYDlvpfjg6zjg5njg6vvvIhpbmNvbWXvvInjgajlhbHjgavjgIHooajnpLrjgZfjgabjgYrjgY3jgb7jgZnjgIIqCgpgYGB7cn0KZGZfcmVmIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMsIHJlZ2lvbiwgaW5jb21lKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCuS4lueVjOOBrumbo+awkeOCkuOAgTfjgaTjga7lnLDln5/liKXjgavoqr/jgovjgajjgajjgoLjgavjgIHlgIvkurrnmoTjgavjgIHplqLlv4PjgYzjgYLjgovjgIHvvJjjgqvlm73jgpLpgbjjgpPjgafoqr/jgbnjgabjgb/jgovjgZPjgajjgavjgZnjgovjgIIKCuS4lueVjOmKgOihjOOBr+OAgeS4lueVjOOCku+8l+WcsOWfn+OBq+WIhuOBkeOBpuOBhOOBvuOBmeOAggoKYGBge3J9CnJlZ2lvbnMgPC0gYygiU291dGggQXNpYSIsICJFdXJvcGUgJiBDZW50cmFsIEFzaWEiLCAKIk1pZGRsZSBFYXN0ICYgTm9ydGggQWZyaWNhIiwgIkVhc3QgQXNpYSAmIFBhY2lmaWMiLCAiU3ViLVNhaGFyYW4gQWZyaWNhIiwgCiJMYXRpbiBBbWVyaWNhICYgQ2FyaWJiZWFuIiwgIk5vcnRoIEFtZXJpY2EiKQpgYGAKCiroh6rliIbjgafliIbmnpDjgZfjgZ/jgYTlm73jga7jg6rjgrnjg4jjgpLkvZzjgaPjgabjgY/jgaDjgZXjgYTjgILjgZPjgZPjgafjga/jgIHntJvkuonjgavplqLkv4LjgYzjgYLjgorjgZ3jgYbjgarlm73jgpIgQ09ORkxJQ1RTIOOBq+OBl+OBvuOBmeOAgioKCmBgYHtyfQpDT05GTElDVFMgPC0gYygiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLCAiVWtyYWluZSIsICJBZmdoYW5pc3RhbiIsICJTb3V0aCBTdWRhbiIsICJNeWFubWFyIiwgIkNvbmdvLCBEZW0uIFJlcC4iLCAiVHVya2l5ZSIsICJXZXN0IEJhbmsgYW5kIEdhemEiKQpgYGAKCiMjIOimluimmuWMlgoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKKuOBvuOBmuOBr+OAgU5BIOOBruWApOOCkuWJiumZpOOBl+OBvuOBmeOAguOBneOBruOBguOBqOOBp+OAgeWbveOBruaDheWgseOBruaVsOOCkuaVsOOBiOOBn+OBhOOBruOBp+OAgWAhKGlzbzJjICVpbiUgUkVHSU9OKWAg44Gn44CB5LiK44Gn44GK44GE44Gf44CB5Zyw5Z+f44GuIGlzbzJjIOOCkumBuOaKnuOBl+OAgSEg44Gv5ZCm5a6a44Gn44GX44Gf44GL44KJ44CB5Zyw5Z+f44Gn44Gv44Gq44GE44KC44Gu44KS6YG45oqe44GX44CB44Gd44Gu5pWw44KS5qOS44Kw44Op44OV44Gr44GX44Gm44GE44G+44GZ44CCKgoKYGBge3J9CmRmX3JlZiB8PiBkcm9wX25hKHJlZnVnZWVfYXN5bHVtLCByZWZ1Z2VlX29yaWdpbikgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PgogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAxOTk15bm044GU44KN44GL44KJ44Gv44CB5Y2B5YiG44OH44O844K/44GM44GC44KL44GM44CB44Gd44Gu5YmN44Gv5bCR44Gq44GE44CCMjAyMuW5tOOBvuOBp+OBguOCiuOBneOBhuOAggoKIyMjIDIuIOe1jOW5tOWkieWMluOCkuihqOOBmeaKmOOCjOe3muOCsOODqeODlQoKQ09ORkxJQ1RTIOOBr+OAgWBjb3VudHJ5YCDjgafjgZnjgYvjgonjgIHkuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgII2ZSswNiA9IDEsMDAwLDAwMCDjgarjganjga7jgIHoqJjms5XjgavjgarjgaPjgabjgYTjgb7jgZnjgYzjgIEwIOOBq+i/keOBhOOBqOOBk+OCjeOBjOWkmuOBj+OBquOBo+OBpuOBl+OBvuOBhuOBruOBp+OAgWxvZzEwIOOCueOCseODvOODq+OBq+OBl+OBpuOBv+OBpuOBv+OBvuOBmeOAggoKYGBge3J9CmRmX3JlZiB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENPTkZMSUNUUykgfD4gZHJvcF9uYShyZWZ1Z2VlX29yaWdpbikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHJlZnVnZWVfb3JpZ2luLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLntJvkuonlm73jga7pm6PmsJHmlbAiKQpgYGAKCmBgYHtyfQpkZl9yZWYgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDT05GTElDVFMpIHw+IGRyb3BfbmEocmVmdWdlZV9vcmlnaW4pIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCByZWZ1Z2VlX29yaWdpbiwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKyBzY2FsZV95X2xvZzEwKCkKICBsYWJzKHRpdGxlID0gIue0m+S6ieWbveOBrumbo+awkeaVsO+8iGxvZzEwIOOCueOCseODvOODq++8iSIpCmBgYApgYGB7cn0KZGZfcmVmIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ09ORkxJQ1RTKSB8PiBkcm9wX25hKHJlZnVnZWVfYXN5bHVtKSB8PgogIGdncGxvdChhZXMoeWVhciwgcmVmdWdlZV9hc3lsdW0sIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIue0m+S6ieWbveOBrumbo+awkeWPl+OBkeWFpeOCjOaVsCIpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOODn+ODo+ODs+ODnuODvOOBr+eZu+WgtOOBl+OBpuOBhOOBquOBhOOAggotICAg5LiL44Gu5pa544Gr5Zu644G+44Gj44Gm44GE44KL44Gu44Gn44CBc2NhbGVfeV9sb2cxMCgpIOOCkuS9v+OBo+OBpuOBv+OCiwogICAgLSAxZSswNiDjga/jgIExLDAwMCwwMDAg5Lq644Gn44GZ44GL44KJ44CB44Gd44KM5Lul5LiL44Gu5Zu944GM5aSa44GE44Go44GE44GG44GT44Go44Gr44Gq44KK44G+44GZ44CCCiAgICAtIHNjYWxlX3lfbG9nMTAoKSDjgavjgZnjgovjgajjgIExZSswMiA9IDEwMCwgMWUrMDQgPSAxMCwwMDAsIDFlKzA2ID0gMSwwMDAsMDAwIHkg5bqn5qiZ6Lu444Gr54++44KM44G+44GZ44CCCgpgYGB7cn0KZGZfcmVmIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ09ORkxJQ1RTKSB8PiBkcm9wX25hKHJlZnVnZWVfYXN5bHVtKSB8PgogIGdncGxvdChhZXMoeWVhciwgcmVmdWdlZV9hc3lsdW0sIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsgc2NhbGVfeV9sb2cxMCgpICsKICBsYWJzKHRpdGxlID0gIue0m+S6ieWbveOBrumbo+awkeWPl+OBkeWFpeOCjOaVsO+8iGxvZzEwIOOCueOCseODvOODq++8iSIpCmBgYAoKIyMjIDMuIOe4pumVt+OBruihqO+8iExvbmcgVGFibGXvvIkKCipgY29scyA9IGMocmVmdWdlZV9hc3lsdW0sIHJlZnVnZWVfb3JpZ2luKWAg44Go44CB5LiA44Gk44Gu5oyH5qiZ44Gr44G+44Go44KB44KL44KC44Gu44KS44Oq44K544OI44GZ44KL44Go44CBYG5hbWVgIOOBq+aMh+aomeWQjeOBjOWFpeOCiuOAgWB2YWx1ZWAg44Gr44CB44Gd44Gu5YCk44GM5YWl44KL44CC5pu45byP44Gv44CBYHBpdm90X2xvbmdlcihjb2xzID0gLi4uLCBuYW1lc190byA9IC4uLiwgdmFsdWVzX3RvID0gLi4uKWAg44Gn44CB5Yid5pyf6Kit5a6a44Gn44Gv44CBYG5hbWVzX3RvID0gIm5hbWUiLCB2YWx1ZXNfdG8gPSAidmFsdWUiYCDjgajjgarjgaPjgabjgYTjgovjga7jgafjgIHmjIflrprjgZfjgarjgYTjgajjgIHkuIvjga7jgojjgYbjgavjgarjgovjgIJIZWxwIOWPgueFp+OAgioKCmBgYHtyIGNhY2hlID0gVFJVRX0KZGZfcmVmX2xvbmcgPC0gZGZfcmVmIHw+IHBpdm90X2xvbmdlcihjb2xzID0gYyhyZWZ1Z2VlX2FzeWx1bSwgcmVmdWdlZV9vcmlnaW4pKQpkZl9yZWZfbG9uZwpgYGAKCmBgYHtyfQpkZl9yZWZfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSA9PSAiV29ybGQiKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IG5hbWUpKSArIGdlb21fbGluZSgpICArCiAgbGFicyh0aXRsZSA9ICLkuJbnlYzjga7pm6PmsJEiKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0g5LiW55WM44Gn44Gv44CB6Zuj5rCR5Y+X44GR5YWl44KM44Go44CB6Zuj5rCR5pWw44GM5LiA6Ie044GX44Gm44GE44KL44CCMjAxMOW5tOOBlOOCjeOBi+OCieOAgeWil+WKoOOBl+OBpuOBhOOCi+OAggoKYGBge3J9CmRmX3JlZl9sb25nIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgcmVnaW9ucykgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IG5hbWUpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIuWcsOWfn+OBlOOBqOOBrumbo+awkSIpCmBgYAoKCiMjIyMg57Sb5LqJ5Zu944Gu6Zuj5rCR5Y+X44GR5YWl44KM5pWw44Go6Zuj5rCR44Gu44GT44KM44KJ44Gu5Ye66Lqr5Zu95Yil57WM5bm05aSJ5YyW44Gu44Kw44Op44OVIAoKCmBgYHtyfQpkZl9yZWZfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENPTkZMSUNUUykgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IG5hbWUpKSArIGdlb21fbGluZSgpICArIHNjYWxlX3lfbG9nMTAoKSArCiAgbGFicyh0aXRsZSA9ICLntJvkuonlm73jga7pm6PmsJHvvIhsb2cxMCDjgrnjgrHjg7zjg6vvvIkiKQpgYGAKCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg44KC44GG44GZ44GT44GX5LiB5a+n44Gr44G/44Gq44GE44Go44KP44GL44KJ44Gq44GE44CC5Zu944Gu5pWw44GM5aSa44GECi0gICBsb2cxMCDjgrnjgrHjg7zjg6vjga7mlrnjgYzjgb/jgoTjgZnjgYTjgIIKCgojIyMgNC4g44OS44K544OI44Kw44Op44OgCgrjgZ3jgozjgZ7jgozjga7jg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga7jg5Ljgrnjg4jjgrDjg6njg6DvvIjluqbmlbDliIbluIPvvIkKCl/liIbjgZHmlrnjga7mlbAgYmlucyDjgoTjgIHluYUgYmlud2lkdGgg44KS6YGp5YiH44Gr5aSJ5pu0XwoKIyMjIyDlj5fjgZHlhaXjgozlm73liKXpm6PmsJHmlbAKCmBgYHtyfQpkZl9yZWYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiBkcm9wX25hKHJlZnVnZWVfYXN5bHVtKSB8PgogIGdncGxvdChhZXMocmVmdWdlZV9hc3lsdW0sIGZpbGwgPSByZWdpb24pKSArIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCwgY29sID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4yKSArIHNjYWxlX3hfbG9nMTAoKQpgYGAKCgojIyMjIOWHuui6q+WbveWIpembo+awkeaVsAoKYGBge3J9CmRmX3JlZiB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMjIsIHJlZnVnZWVfb3JpZ2luID4wKSB8PgogIGRyb3BfbmEocmVmdWdlZV9vcmlnaW4pIHw+CiAgZ2dwbG90KGFlcyhyZWZ1Z2VlX2FzeWx1bSwgZmlsbCA9IHJlZ2lvbikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwLCBjb2wgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjIpICsgc2NhbGVfeF9sb2cxMCgpCmBgYAoKCgojIyMgNS4g5qOS44Kw44Op44OVCgrjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyDpm6PmsJHlj5fjgZHlhaXjgozlm70KCmBgYHtyfQpkZl9yZWYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiBkcm9wX25hKHJlZnVnZWVfYXN5bHVtKSB8PgogIGFycmFuZ2UoZGVzYyhyZWZ1Z2VlX2FzeWx1bSkpIHw+IHNsaWNlX2hlYWQobiA9IDEwKSB8PgogIGdncGxvdChhZXMoZmN0X3JldihmY3RfaW5vcmRlcihjb3VudHJ5KSksIHJlZnVnZWVfYXN5bHVtLCBmaWxsID0gcmVnaW9uKSkgKyBnZW9tX2NvbCgpICsgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICLpm6PmsJHlj5fjgZHlhaXjgozjga7lpJrjgYTpoIYiLCB4ID0gIiIpCmBgYAoKIyMjIyDlh7rouqvlm73jga7pm6PmsJHmlbAKCmBgYHtyfQpkZl9yZWYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiBkcm9wX25hKHJlZnVnZWVfb3JpZ2luKSB8PgogIGFycmFuZ2UoZGVzYyhyZWZ1Z2VlX29yaWdpbikpIHw+IHNsaWNlX2hlYWQobiA9IDEwKSB8PgogIGdncGxvdChhZXMoZmN0X3JldihmY3RfaW5vcmRlcihjb3VudHJ5KSksIHJlZnVnZWVfb3JpZ2luLCBmaWxsID0gcmVnaW9uKSkgKyBnZW9tX2NvbCgpICsgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICLpm6PmsJHjga7lpJrjgYTpoIYiLCB4ID0gIiIpCmBgYAoKCiMjIyA2LiDmlaPluIPlm7MKCiMjIyMgYS7vvIjlnLDln5/jgpLpmaTjgY3vvInlm73jga7jgb/jga7mlaPluIPlm7MgCgpfTE9HMTAg44K544Kx44O844Or44KS5L2/44Gj44Gm44GE44G+44GZ44CCXwoKYGBge3J9CmRmX3JlZiB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRyb3BfbmEocmVmdWdlZV9hc3lsdW0sIHJlZnVnZWVfb3JpZ2luKSB8PgogIGdncGxvdChhZXMocmVmdWdlZV9hc3lsdW0sIHJlZnVnZWVfb3JpZ2luKSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSByZWdpb24pKSArIHNjYWxlX3hfbG9nMTAoKSArIHNjYWxlX3lfbG9nMTAoKSArCiAgbGFicyh0aXRsZSA9ICLpm6PmsJHjg7vlj5fjgZHlhaXjgozvvIhsb2cxMCDjgrnjgrHjg7zjg6vvvIkiKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDnm7jplqLjga/jgb/jgonjgozjgarjgYTjgYzjgIHlnLDln5/mgKfjga/jgb/jgablj5bjgozjgovjgojjgYbjgavmgJ3jgYbjgIIKCgojIyMjIDIwMjLlubTjga7vvIjlnLDln5/jgpLpmaTjgY3vvInlm73jga7jgb/jga7mlaPluIPlm7MKCmBgYHtyfQpkZl9yZWYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiAKICBkcm9wX25hKHJlZnVnZWVfYXN5bHVtLCByZWZ1Z2VlX29yaWdpbikgfD4KICBnZ3Bsb3QoYWVzKHJlZnVnZWVfYXN5bHVtLCByZWZ1Z2VlX29yaWdpbikpICsgZ2VvbV9wb2ludChhZXMoY29sID0gcmVnaW9uKSkgKyBzY2FsZV94X2xvZzEwKCkgKyBzY2FsZV95X2xvZzEwKCkgKwogIGxhYnModGl0bGUgPSAiMjAyMuW5tOOBrumbo+awkeebuOmWoiIpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOWcsOWfn+OBlOOBqOOBrueJueaAp+OBjOOBguOCi+OBpuOBhOOBqeOBguOCi+OCiOOBhuOBq+imi+OBiOOCi+OAggoKIyMjIyDnm7jplqLkv4LmlbAKCmBgYHtyfQpkZl9yZWYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiAKICBkcm9wX25hKHJlZnVnZWVfYXN5bHVtLCByZWZ1Z2VlX29yaWdpbikgfD4gc2VsZWN0KHJlZnVnZWVfYXN5bHVtLCByZWZ1Z2VlX29yaWdpbikgfD4gY29yKCkKYGBgCgrnm7jplqLkv4LmlbDjgYzjgIEwLjAyNSDjgafjgIHjgbvjgajjgpPjgannm7jplqLjga/jgarjgYTjgajoqIDjgaPjgaboia/jgYTjgIIKCiMjIyA3LiDnrrHjg5LjgrLlm7PvvIhCb3hwbG9077yJCgpgYGB7cn0KZGZfcmVmX2xvbmcgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiAKICBkcm9wX25hKHZhbHVlLCByZWdpb24pIHw+CiAgZ2dwbG90KGFlcyhyZWdpb24sIHZhbHVlLCBmaWxsID0gbmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBjb29yZF9mbGlwKCkgK3NjYWxlX3lfbG9nMTAoKSArCiAgbGFicyh0aXRsZSA9ICLpm6PmsJHjg7vlnLDln5/liKXnrrHjgbLjgZLlm7MiKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDlnLDln5/lt67jgYzjgYLjgovjgILjgZPjgozjgaDjgZHjgafjga/jgIHjgYLjgb7jgorjgo/jgYvjgonjgarjgYTjgIIKCmBgYHtyfQpkZl9yZWZfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENPTkZMSUNUUykgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZ2dwbG90KGFlcyhjb3VudHJ5LCB2YWx1ZSwgZmlsbCA9IG5hbWUpKSArIGdlb21fYm94cGxvdCgpICsgY29vcmRfZmxpcCgpICsgc2NhbGVfeV9sb2cxMCgpICsKICBsYWJzKHRpdGxlID0gIue0m+S6ieWbveOBrumbo+awkeeuseOBsuOBkuWbsyIpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOOBneOCjOOBnuOCjOOBruWbveOBruODh+ODvOOCv+OBr+OAgeODh+ODvOOCv+OBruOBguOCi+W5tOOBruS4reOBp+OBruOAgeWApOOBp+OBguOCi+OAggoKLSAgIOOCouODleOCrOODi+OCueOCv+ODs+OBr+OAgee2mee2muOBl+OBpuOAgembo+awkeOBjOWkmuOBhOOBk+OBqOOBjOOCj+OBi+OCi+OAggoKIyMg5Y+C6ICDCgpgYGB7cn0KZGZfcmVmX2xvbmcgfD4gZmlsdGVyKGNvdW50cnkgJWluJSByZWdpb25zKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGZpbGwgPSBjb3VudHJ5KSkgKyAKICBnZW9tX2FyZWEoY29sID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4xKSArCiAgZmFjZXRfd3JhcCh+bmFtZSkgKwogIGxhYnModGl0bGUgPSAiUmVmdWdlZSBQb3B1bGF0aW9uIGJ5IFJlZ2lvbiBvZiBBc3lsdW0gYW5kIE9yaWdpbiIsIGZpbGwgPSAiIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQpgYGAKCuWun+aVsOOBp+OAgeepjeOBv+S4iuOBkuOCsOODqeODleOCkuS9nOaIkOOBmeOCi+OBqOOAgQrjgZ3jgozjgZ7jgozjga7lnLDln5/jga7lkozjgpLjgajjgaPjgZ/jgoLjga7jgaflibLjgaPjgabjgIHnmb7ogZ7njofjgpLlh7rjgZnjgajjgIHkuIvjga7jgojjgYbjgavjgarjgovjgIIKCmBgYHtyfQpkZl9yZWYgfD4gZmlsdGVyKGNvdW50cnkgJWluJSByZWdpb25zKSB8PiAKICBzZWxlY3QoY291bnRyeSwgeWVhciwgcmVmdWdlZV9hc3lsdW0sIHJlZnVnZWVfb3JpZ2luKSB8PiBkcm9wX25hKHJlZnVnZWVfb3JpZ2luKSB8PiBncm91cF9ieSh5ZWFyKSB8PiAKICBtdXRhdGUoQVNZTFVNID0gcmVmdWdlZV9hc3lsdW0vc3VtKHJlZnVnZWVfYXN5bHVtKSwgT1JJR0lOID0gcmVmdWdlZV9vcmlnaW4vc3VtKHJlZnVnZWVfb3JpZ2luKSkgfD4gdW5ncm91cCgpIHw+CiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKEFTWUxVTSwgT1JJR0lOKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBmaWxsID0gY291bnRyeSkpICsgCiAgZ2VvbV9hcmVhKGNvbCA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMSkgKyAKICBmYWNldF93cmFwKH5uYW1lKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlJlZnVnZWUgUmF0aW8gYnkgUmVnaW9uIG9mIEFzeWx1bSBhbmQgT3JpZ2luIiwgZmlsbCA9ICIiLCB5ID0gIiIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCg==