準備

第2週

12/14(TH) 所得と富の不平等の現状1

       所得と富の不平等の現状2

講義では、第2週、第3週とWorld Inequality report 2022を使って、所得と富の不平等について議論します。

12/19(TU) Rでデータサイエンス2:人口の少子高齢化  [Main]

講義 12月14日(木)所得と富の不平等

演習 12月19日(木)人口と少子高齢化

演習の内容

パッケージとそのインストール

R のパッケージは、R の機能を拡張するもので、コード(プログラム)や、データなどが収められています。インストール(install: コンピュータに入れて使えるようにすること)と、ロード(load: いつでも使えるようにすること)が必要です。

インストール

  • RStudio (または、Posit Cloud)の、上のメニュー・バーの、Tools の Pull down から、Install Packages を選び、Packages にパッケージ名を入れて、インストール。途中まで、パッケージ名を入れると下に候補がでるので、tab キーを押すと、自動入力になり、スペルミスが防げます。(右下の窓枠(Pane)の、Packages タブの、左上の Install を押しても、同じものが出ます。)

    • install.packages("パッケージ名") でも、インストールできます。

パッケージのロード

毎回 tidyverse と WDI を使いますから、R Notebook の最初には、次のコードチャンクを作成し、実行(Run)します。

library(tidyverse)
library(WDI)
#library(showtext)

日本語表示のために

図のタイトルなどが、日本語で文字化けしないようにおまじないです。

R Notebook の Preview で図のタイトルが小さい場合には、2行目(showtext_auto())を # で、コメントアウト。

#showtext_auto(FALSE) 
#showtext_auto() # for slides etc remove # 

データの読み込み(1)

データの読み込み方法はデータの種類などにより何種類もありますが、まず、WDI パッケージの、WDI という名前のデータ取得のコード(命令、プログラム)を使って、総人口のデータを読み込みます。それには、WDI コードと呼ばれる、SP.POP.TOTL を使います。

総人口 Population, total:SP.POP.TOTL

取得した、データをそのあとで、呼び出して使うために、<- を使って、名前をつけ(assign)ます。データの形式が、data frame と呼ばれるものなので、わたしは、いつも、最初に df として、簡単な名前をつけます。名前はなんでも良いのですが、覚えやすいように、また、日本語も受け付けますが、扱いが複雑になるので、英数のみ、スペースや、ハイフンは使えないので、区切りには、_ を使っています。

読み込みには、少し時間がかかります。

df_pop <- WDI(indicator = c(pop = "SP.POP.TOTL"))
Rows: 16758 Columns: 5── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, pop
ℹ 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.

データを見てみましょう

df_pop

REGION

地域名に対応する iso2c コードの取得

REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "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", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")

地域名の確認

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

国名確認

df_pop |> filter(!(iso2c %in% REGION)) |> 
  distinct(country, iso2c) |> arrange(country)

行の選択(filter()

パイプ・折れ線グラフ


df_pop |> filter(country == "World") |> 
  ggplot(aes(year, pop)) + geom_line() + 
  labs(title = "世界の総人口")


df_pop |> filter(country == "Japan") |> 
  ggplot(aes(year, pop)) + geom_line() +
  labs(title = "日本の総人口")


練習1:Germany と ドイツの部分を他の国名に変えてみてください。

COUNTRY <- "Germany"
df_pop |> filter(country == COUNTRY) |> 
  ggplot(aes(year, pop)) + geom_line() +
  labs(title = "ドイツの総人口")

COUNTRY <- "France"
df_pop |> filter(country == COUNTRY) |> 
  ggplot(aes(year, pop)) + geom_line() +
  labs(title = "フランスの総人口")

COUNTRY <- "Korea, Rep."
df_pop |> filter(country == COUNTRY) |> 
  ggplot(aes(year, pop)) + geom_line() +
  labs(title = paste0(COUNTRY,"の総人口"))

COUNTRY <- "Sub-Saharan Africa"
df_pop |> filter(country == COUNTRY) |> 
  ggplot(aes(year, pop)) + geom_line() +
  labs(title = paste(COUNTRY,"の総人口"))


練習2. COUNTRIES を編集して、イギリスとドイツとフランスと日本を他の国に変えてみてください。

COUNTRIES <- c("United Kingdom", "Germany", "France", "Japan")
df_pop |> filter(country %in% COUNTRIES) |> 
  ggplot(aes(year, pop, col =  country)) + geom_line() +
  labs(title = "イギリスとドイツとフランスと日本の総人口")

COUNTRIES <- c("Brazil", "Russian Federation", "India", "China", "South Africa")
df_pop |> filter(country %in% COUNTRIES) |> 
  ggplot(aes(year, pop, col =  country)) + geom_line() +
  labs(title = "BRICS の総人口")

2022年の総人口の多い順

df_pop |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  arrange(desc(pop))

2022年の総人口の TOP 11

pop_top11 <- df_pop |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  arrange(desc(pop)) |> slice_head(n=11) |> pull(iso2c)
pop_top11
 [1] "IN" "CN" "US" "ID" "PK" "NG" "BR" "BD" "RU" "MX" "JP"
dput(pop_top11)
c("IN", "CN", "US", "ID", "PK", "NG", "BR", "BD", "RU", "MX", 
"JP")

練習4. 1960年の総人口が多い順に五番目までリストしてください。

pop_top5 <- df_pop |> filter(!(iso2c %in% REGION)) |> 
  filter(year == 1960) |> 
  arrange(desc(pop)) |> slice_head(n=5) |> pull(iso2c)
pop_top5
[1] "CN" "IN" "US" "RU" "JP"
dput(pop_top5)
c("CN", "IN", "US", "RU", "JP")
df_pop |> filter(!(iso2c %in% REGION)) |> 
  filter(year == 1960) |> 
  arrange(desc(pop)) |> slice_head(n=5)

TOP11 の人口推移

df_pop |> filter(iso2c %in% pop_top11) |>
  ggplot(aes(year, pop, color = iso2c)) + geom_line() + labs(title = "TOP11の総人口")

中国とインド以外のTOP11 の人口推移

df_pop |> filter(iso2c %in% pop_top11) |> 
  filter(!(iso2c %in% c("CN", "IN"))) |> 
  ggplot(aes(year, pop, color = country)) + geom_line() +
  labs(title = "中国とインド以外のTOP11の総人口")

地域ごとの人口推移

df_pop |> filter(country %in% c("South Asia", "Europe & Central Asia", "Middle East & North Africa", 
"East Asia & Pacific", "Sub-Saharan Africa", "Latin America & Caribbean", "North America")) |>
  ggplot(aes(year, pop, color = country)) + geom_line() + labs(title = "地域ごとの総人口")

LS0tCnRpdGxlOiAiR0VTIDAwMSDmvJTnv5IyIgphdXRob3I6ICJJRCwgWW91ciBOYW1lIgpkYXRlOiAiMjAyM+W5tDEy5pyIMTnml6UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIOa6luWCmQoKLSAgIOiHquWIhuOBrlBD44G+44Gf44Gv5pWZ5a6k44GuUEMKCiAgICAxLiAg44Ot44Kw44Kk44OzCgogICAgMi4gIOOCpuOCp+ODg+ODluODu+ODluODqeOCpuOCtuODvO+8iEdvb2dsZSBDaHJvbWUg44Gq44Gp77yJ44KS6LW35YuVCgogICAgICAgIC0gICBNb29kbGUg44GuIEdFUzAwMSDntYzmuIjjgajntYzmuIjlrabjga7jgrXjgqTjg4jjgYvjgonjgIHjgZPjga7jgrnjg6njgqTjg4njga7jg5rjg7zjgrjjgpLooajnpLrvvIjjg6rjg7Pjgq/jgIxS44Gn44OH44O844K/44K144Kk44Ko44Oz44K544CN44Gu56ysMumAse+8iQoKICAgICAgICAtICAg77yI5Yil44Gu44K/44OW44G+44Gf44GvIOOCpuOCo+ODs+ODieOCpuOBp++8iVBvc2l0Q2xvdWQg44Gr44Ot44Kw44Kk44Oz77yI44Ki44Kr44Km44Oz44OI44Gu44Gq44GE5Lq644Gv44K144Kk44Oz44O744Ki44OD44OX77yJCgogICAgMy4gIFJTdHVkaW8g44KS6LW35YuVCgogICAgICAgIC0gICDoh6rliIbjga5QQ+OBq1Ig44GoIFJTdHVkaW8g44KS44Kk44Oz44K544OI44O844Or44GX44Gm44GE44Gq44GE44Gy44Go44Gv5LiN6KaB44CCCgogICAgICAgIC0gICDmnIDlvozjgavmmYLplpPjgYzjgYLjgozjgbDjgIHjgqTjg7Pjgrnjg4jjg7zjg6vjgavjgaTjgYTjgaboqqzmmI7jgZfjgb7jgZnjgIIKCiMjIOesrDLpgLEKCjEyLzE0KFRIKeOAgOaJgOW+l+OBqOWvjOOBruS4jeW5s+etieOBruePvueKtu+8kQoK44CA44CA44CA44CA44CAIMKg5omA5b6X44Go5a+M44Gu5LiN5bmz562J44Gu54++54q277ySCgrorJvnvqnjgafjga/jgIHnrKwy6YCx44CB56ysM+mAseOBqFdvcmxkIEluZXF1YWxpdHkgcmVwb3J0IDIwMjLjgpLkvb/jgaPjgabjgIHmiYDlvpfjgajlr4zjga7kuI3lubPnrYnjgavjgaTjgYTjgaborbDoq5bjgZfjgb7jgZnjgIIKCjEyLzE5KFRVKeOAgFLjgafjg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrnvvJLvvJrkurrlj6Pjga7lsJHlrZDpq5jpvaLljJbjgIAgW1tNYWluXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9pbmRleC5odG1sKV0KCiMjIOism+e+qSAxMuaciDE05pel77yI5pyo77yJ5omA5b6X44Go5a+M44Gu5LiN5bmz562JCgojIyMgV29ybGQgSW5lcXVhbGl0eSBSZXBvcnQgMjAyMiBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQpXQoKLSAgIEV4ZWN1dGl2ZSBTdW1tYXJ5IFtbTGlua10oaHR0cHM6Ly93aXIyMDIyLndpZC53b3JsZC9leGVjdXRpdmUtc3VtbWFyeS8pXeODu1tb44G/44KT44Gq44Gu44OH44O844K/44K144Kk44Ko44Oz44K544G444Gu44Oq44Oz44KvXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai93aWQuaHRtbCN3aWQpXQoKLSAgIEludHJvZHVjdGlvbiBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvaW50cm9kdWN0aW9uLyldCgotICAgQ2hhcHRlciAxIEdsb2JhbCBlY29ub21pYyBpbmVxdWFsaXR5OiBpbnNpZ2h0czogW1tMaW5rXShodHRwczovL3dpcjIwMjIud2lkLndvcmxkL2NoYXB0ZXItMS8pXQoKLSAgIENoYXB0ZXIgMiBHbG9iYWwgaW5lcXVhbGl0eSBmcm9tIDE4MjAgdG8gbm93OiB0aGUgcGVyc2lzdGVuY2UgYW5kIG11dGF0aW9uIG9mIGV4dHJlbWUgaW5lcXVhbGl0eSBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvY2hhcHRlci0yLyldCgotICAgQ2hhcHRlciAzIFJpY2ggY291bnRyaWVzLCBwb29yIGdvdmVybm1lbnRzIFtbTGlua10oaHR0cHM6Ly93aXIyMDIyLndpZC53b3JsZC9jaGFwdGVyLTMvKV0KCi0gICBDaGFwdGVyIDQgR2xvYmFsIHdlYWx0aCBpbmVxdWFsaXR5OiB0aGUgcmlzZSBvZiBtdWx0aW1pbGxpb25haXJlcyBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvY2hhcHRlci00LyldCgojIyDmvJTnv5IgMTLmnIgxOeaXpe+8iOacqO+8ieS6uuWPo+OBqOWwkeWtkOmrmOm9ouWMlgoKIyMjIOS4lueVjOmWi+eZuuaMh+aome+8iFdvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnPvvIlbW0xpbmtdKGh0dHBzOi8vZGF0YXRvcGljcy53b3JsZGJhbmsub3JnL3dvcmxkLWRldmVsb3BtZW50LWluZGljYXRvcnMvKV0KCioq57e057+SMS4qKiBXREkg44Gu44K144Kk44OI44Gn44CB6IiI5ZGz44Gu44GC44KL5oyH5qiZ44Gu44CB5ZCN5YmN44Go44CBV0RJIOOCs+ODvOODieOCkumBuOOCk+OBp+OBj+OBoOOBleOBhOOAguOBp+OBjeOCjOOBsOOAgemBuOaKnuOBl+OBn+eQhueUseOCguiomOmMsuOBl+OBpuOBj+OBoOOBleOBhOOAggoKIyMjIyAqKuS6uuOAhe+8iFBlb3BsZe+8iS0g5Lq65Y+j5YuV5oWL77yIUG9wdWxhdGlvbiBkeW5hbWljc++8iSoqCgrnt4/kurrlj6PjgIBQb3B1bGF0aW9uLCB0b3RhbO+8mlNQLlBPUC5UT1RMIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLlBPUC5UT1RMKV0KCuWHuueUn+eOh++8iOWNg+S6uu+8iUJpcnRoIHJhdGUsIGNydWRlIChwZXIgMSwwMDAgcGVvcGxlKe+8mlNQLkRZTi5DQlJULklOIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DQlJULklOKV0KCuatu+S6oeeOh++8iOWNg+S6uu+8iURlYXRoIHJhdGUsIGNydWRlIChwZXIgMSwwMDAgcGVvcGxlKe+8mlNQLkRZTi5DRFJULklOIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DRFJULklOKV0KCuiLpeW5tOWKtOWDjeS6uuWPo+eOh+OAgEFnZSBkZXBlbmRlbmN5IHJhdGlvLCB5b3VuZyAoJSBvZiB3b3JraW5nLWFnZSBwb3B1bGF0aW9uKe+8mlNQLlBPUC5EUE5ELllHIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLlBPUC5EUE5ELllHKV0KCumrmOm9ouiAheWKtOWDjeS6uuWPo+eOh+OAgEFnZSBkZXBlbmRlbmN5IHJhdGlvLCBvbGQgKCUgb2Ygd29ya2luZy1hZ2UgcG9wdWxhdGlvbinvvJpTUC5QT1AuRFBORC5PTCBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5QT1AuRFBORC5PTCldCgojIyDmvJTnv5Ljga7lhoXlrrkKCi0gICDjg5Hjg4PjgrHjg7zjgrjvvIhQYWNrYWdl77yJ44Kk44Oz44K544OI44O844Or77yI44Kz44Oz44OU44Ol44O844K/44Gr5YWl44KM44Gm44GK44GP77yJCgotICAg44OR44OD44Kx44O844K444Gu44Ot44O844OJ77yI44GZ44GQ5L2/44GI44KL44KI44GG44Gr44GZ44KL77yJ77yadGlkeXZlcnNlLCBXREksIHNob3d0ZXh0CgotICAg44OH44O844K/44Gu5Y+W5b6X77yaV0RJKCkKCi0gICDnibnlrprjga7mnaHku7bjgavjgYLjgaPjgZ/ooYzjgpLpgbjmip7vvJpmaWx0ZXIoKQoKLSAgIOmghueVquOBq+OAgeWkieW9ouOAgeimluimmuWMluOBquOBqeOCkuOBmeOCi+OBn+OCgeOBruODkeOCpOODl++8mmB8PmAg77yI44G+44Gf44Gv44CBYCU+JWDvvIkKCi0gICDmipjjgoznt5rjgrDjg6njg5XvvJpnZ3Bsb3QoLi4uKSArIGdlb21fcG9pbnQoKQoKIyMg44OR44OD44Kx44O844K444Go44Gd44Gu44Kk44Oz44K544OI44O844OrCgo+IFIg44Gu44OR44OD44Kx44O844K444Gv44CBUiDjga7mqZ/og73jgpLmi6HlvLXjgZnjgovjgoLjga7jgafjgIHjgrPjg7zjg4nvvIjjg5fjg63jgrDjg6njg6DvvInjgoTjgIHjg4fjg7zjgr/jgarjganjgYzlj47jgoHjgonjgozjgabjgYTjgb7jgZnjgILjgqTjg7Pjgrnjg4jjg7zjg6vvvIhpbnN0YWxsOiDjgrPjg7Pjg5Tjg6Xjg7zjgr/jgavlhaXjgozjgabkvb/jgYjjgovjgojjgYbjgavjgZnjgovjgZPjgajvvInjgajjgIHjg63jg7zjg4nvvIhsb2FkOiDjgYTjgaTjgafjgoLkvb/jgYjjgovjgojjgYbjgavjgZnjgovjgZPjgajvvInjgYzlv4XopoHjgafjgZnjgIIKCiMjIyDjgqTjg7Pjgrnjg4jjg7zjg6sKCi0gICBSU3R1ZGlvIO+8iOOBvuOBn+OBr+OAgVBvc2l0IENsb3Vk77yJ44Gu44CB5LiK44Gu44Oh44OL44Ol44O844O744OQ44O844Gu44CBVG9vbHMg44GuIFB1bGwgZG93biDjgYvjgonjgIFJbnN0YWxsIFBhY2thZ2VzIOOCkumBuOOBs+OAgVBhY2thZ2VzIOOBq+ODkeODg+OCseODvOOCuOWQjeOCkuWFpeOCjOOBpuOAgeOCpOODs+OCueODiOODvOODq+OAgumAlOS4reOBvuOBp+OAgeODkeODg+OCseODvOOCuOWQjeOCkuWFpeOCjOOCi+OBqOS4i+OBq+WAmeijnOOBjOOBp+OCi+OBruOBp+OAgXRhYiDjgq3jg7zjgpLmirzjgZnjgajjgIHoh6rli5XlhaXlipvjgavjgarjgorjgIHjgrnjg5rjg6vjg5/jgrnjgYzpmLLjgZLjgb7jgZnjgILvvIjlj7PkuIvjga7nqpPmnqDvvIhQYW5l77yJ44Gu44CBUGFja2FnZXMg44K/44OW44Gu44CB5bem5LiK44Gu44CASW5zdGFsbCDjgpLmirzjgZfjgabjgoLjgIHlkIzjgZjjgoLjga7jgYzlh7rjgb7jgZnjgILvvIkKCiAgICAtICAgYGluc3RhbGwucGFja2FnZXMoIuODkeODg+OCseODvOOCuOWQjSIpYCDjgafjgoLjgIHjgqTjg7Pjgrnjg4jjg7zjg6vjgafjgY3jgb7jgZnjgIIKCiMjIOODkeODg+OCseODvOOCuOOBruODreODvOODiQoKLSAgIOODkeODg+OCseODvOOCuOOBq+WPjuOCgeOCieOCjOOBpuOBhOOCi+OAgeOCs+ODvOODie+8iOODl+ODreOCsOODqeODoOOAgeWRveS7pO+8ieOChOOAgeODh+ODvOOCv+OCkuOBmeOBkOOBq+S9v+OBiOOCi+OCiOOBhuOBq+OBl+OBvuOBmeOAgmBsaWJyYXJ5KOODkeODg+OCseODvOOCuOWQjSlgIOOBqOOBl+OBvuOBmeOAggoK5q+O5ZueIHRpZHl2ZXJzZSDjgaggV0RJIOOCkuS9v+OBhOOBvuOBmeOBi+OCieOAgVIgTm90ZWJvb2sg44Gu5pyA5Yid44Gr44Gv44CB5qyh44Gu44Kz44O844OJ44OB44Oj44Oz44Kv44KS5L2c5oiQ44GX44CB5a6f6KGM77yIUnVu77yJ44GX44G+44GZ44CCCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQojbGlicmFyeShzaG93dGV4dCkKYGBgCgojIyDml6XmnKzoqp7ooajnpLrjga7jgZ/jgoHjgasKCuWbs+OBruOCv+OCpOODiOODq+OBquOBqeOBjOOAgeaXpeacrOiqnuOBp+aWh+Wtl+WMluOBkeOBl+OBquOBhOOCiOOBhuOBq+OBiuOBvuOBmOOBquOBhOOBp+OBmeOAggoKUiBOb3RlYm9vayDjga4gUHJldmlldyDjgaflm7Pjga7jgr/jgqTjg4jjg6vjgYzlsI/jgZXjgYTloLTlkIjjgavjga/jgIHvvJLooYznm67vvIhgc2hvd3RleHRfYXV0bygpYO+8ieOCkiBcIyDjgafjgIHjgrPjg6Hjg7Pjg4jjgqLjgqbjg4jjgIIKCmBgYHtyfQojc2hvd3RleHRfYXV0byhGQUxTRSkgCiNzaG93dGV4dF9hdXRvKCkgIyBmb3Igc2xpZGVzIGV0YyByZW1vdmUgIyAKYGBgCgojIyDjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb/vvIgx77yJCgrjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb/mlrnms5Xjga/jg4fjg7zjgr/jga7nqK7poZ7jgarjganjgavjgojjgorkvZXnqK7poZ7jgoLjgYLjgorjgb7jgZnjgYzjgIHjgb7jgZrjgIFXREkg44OR44OD44Kx44O844K444Gu44CBV0RJIOOBqOOBhOOBhuWQjeWJjeOBruODh+ODvOOCv+WPluW+l+OBruOCs+ODvOODie+8iOWRveS7pOOAgeODl+ODreOCsOODqeODoO+8ieOCkuS9v+OBo+OBpuOAgee3j+S6uuWPo+OBruODh+ODvOOCv+OCkuiqreOBv+i+vOOBv+OBvuOBmeOAguOBneOCjOOBq+OBr+OAgVdESSDjgrPjg7zjg4njgajlkbzjgbDjgozjgovjgIFTUC5QT1AuVE9UTCDjgpLkvb/jgYTjgb7jgZnjgIIKCue3j+S6uuWPo+OAgFBvcHVsYXRpb24sIHRvdGFs77yaU1AuUE9QLlRPVEwKCuWPluW+l+OBl+OBn+OAgeODh+ODvOOCv+OCkuOBneOBruOBguOBqOOBp+OAgeWRvOOBs+WHuuOBl+OBpuS9v+OBhuOBn+OCgeOBq+OAgWA8LWAg44KS5L2/44Gj44Gm44CB5ZCN5YmN44KS44Gk44GR77yIYXNzaWdu77yJ44G+44GZ44CC44OH44O844K/44Gu5b2i5byP44GM44CBZGF0YSBmcmFtZSDjgajlkbzjgbDjgozjgovjgoLjga7jgarjga7jgafjgIHjgo/jgZ/jgZfjga/jgIHjgYTjgaTjgoLjgIHmnIDliJ3jgasgZGYg44Go44GX44Gm44CB57Ch5Y2Y44Gq5ZCN5YmN44KS44Gk44GR44G+44GZ44CC5ZCN5YmN44Gv44Gq44KT44Gn44KC6Imv44GE44Gu44Gn44GZ44GM44CB6Kaa44GI44KE44GZ44GE44KI44GG44Gr44CB44G+44Gf44CB5pel5pys6Kqe44KC5Y+X44GR5LuY44GR44G+44GZ44GM44CB5omx44GE44GM6KSH6ZuR44Gr44Gq44KL44Gu44Gn44CB6Iux5pWw44Gu44G/44CB44K544Oa44O844K544KE44CB44OP44Kk44OV44Oz44Gv5L2/44GI44Gq44GE44Gu44Gn44CB5Yy65YiH44KK44Gr44Gv44CBXF8g44KS5L2/44Gj44Gm44GE44G+44GZ44CCCgroqq3jgb/ovrzjgb/jgavjga/jgIHlsJHjgZfmmYLplpPjgYzjgYvjgYvjgorjgb7jgZnjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfcG9wIDwtIFdESShpbmRpY2F0b3IgPSBjKHBvcCA9ICJTUC5QT1AuVE9UTCIpKQpgYGAKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CndyaXRlX2NzdihkZl9wb3AsICJkYXRhL3BvcC5jc3YiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CmRmX3BvcCA8LSByZWFkX2NzdigiZGF0YS9wb3AuY3N2IikKYGBgCgojIyDjg4fjg7zjgr/jgpLopovjgabjgb/jgb7jgZfjgofjgYYKCmBgYHtyfQpkZl9wb3AKYGBgCgojIyBgUkVHSU9OYAoK5Zyw5Z+f5ZCN44Gr5a++5b+c44GZ44KLIGlzbzJjIOOCs+ODvOODieOBruWPluW+lwoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCiMjIOWcsOWfn+WQjeOBrueiuuiqjQoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIOWbveWQjeeiuuiqjQoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IAogIGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKSB8PiBhcnJhbmdlKGNvdW50cnkpCmBgYAoKIyMg6KGM44Gu6YG45oqe77yIYGZpbHRlcigpYO+8iQoKLSAgIGBmaWx0ZXJgKCrmnaHku7YqKSDvvJrmnaHku7bjgavjgYLjgaPjgZ/ooYzjgpLpgbjmip7mir3lh7rjgZfjgb7jgZnjgIIKCiAgICAtICAgYGZpbHRlcmAoKuWkieaVsCogYD09YCAiKuaWh+Wtl+WIlyoiKSDvvJrlpInmlbDjgYzmloflrZfliJfjgajkuIDoh7TjgZnjgovjgoLjga7jgpLmir3lh7rvvIg9IOOBp+OBr+OBquOBj+OAgT09IOOBq+azqOaEj++8iQoKICAgIC0gICBgZmlsdGVyYCgq5aSJ5pWwKiBgJWluJSBjYCgqIuaWh+Wtl+WIlzEiLCAuLi4sICLmloflrZfliJduIiopIO+8miDlpInmlbDjgYzmloflrZfliJcxIOOBi+OCiSDmloflrZfliJduIOOBruOBqeOCjOOBi+OBq+S4gOiHtOOBl+OBn+OCguOBruOCkuaKveWHugoKICAgIC0gICBgZmlsdGVyYChgIWAq5p2h5Lu2Kikg77ya5p2h5Lu244Go5LiA6Ie044GX44Gq44GE44KC44Gu44KS5oq95Ye644CCCgogICAgLSAgIGBmaWx0ZXJgKCrmnaHku7YxLCDmnaHku7YyKinvvJrmnaHku7YxIOOBq+S4gOiHtOOBmeOCi+OCguOBruOBruOBquOBi+OBp+OAgeadoeS7tjIg44Gr5LiA6Ie044GZ44KL44KC44Gu44KS5oq95Ye644CCCgogICAgLSAgIGBmaWx0ZXJgKCrmnaHku7YxIFx8IOadoeS7tjIqKe+8muadoeS7tjEg44Gr5LiA6Ie044GZ44KL44GL44CB5p2h5Lu2MiDjgavkuIDoh7TjgZnjgovjgoLjga7jgpLmir3lh7rjgIIKCiAgICAtICAgYGZpbHRlcmAoKuWkieaVsCogYDxgICrmlbDlgKQqKe+8muaVsOWApOOBruOBqOOBjeOBr+OAgeW8leeUqOespuOBquOBl+OAgmA8PSwgPiwgPj1gIOOCguWQjOanmOOAggoKLSAgIGBkaXN0aW5jdGAo5aSJ5pWwKe+8muWkieaVsOOBruWApOOBjOeVsOOBquOCi+OCguOBruOBruOBv+aKveWHugoKLSAgIGBkcm9wX25hYCjlpInmlbAp77ya5aSJ5pWw44Gu5YCk44GMICpOQSog44Gu44KC44Gu44Gv44CB5YmK6ZmkCgojIyDjg5HjgqTjg5fjg7vmipjjgoznt5rjgrDjg6njg5UKCi0gICBgfD5gIDog44OR44Kk44OX77yIcGlwZSBvcGVyYXRvcu+8ieasoeOAheOBq+ODh+ODvOOCv+OCkumAgeOBo+OBpuWun+ihjOOBleOBm+OCi+OBn+OCgeOBq+S9v+OBhOOBvuOBmeOAggoKICAgIC0gICBgZGF0YSB8PiBmaWx0ZXIo5p2h5Lu2KWAg44Gv44CBYGZpbHRlcihkYXRhLCDmnaHku7YpYCDjgajlkIzjgZgKCiAgICAtICAgYGRhdGEgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKWAg44Gv44CBYGZpbHRlcihkYXRhLCBpc28yYyAlaW4lIFJFR0lPTilgIOOBqOWQjOOBmOOAggoKLSAgIGBnZ3Bsb3QoYWVzKHllYXIsIHBvcCkpICsgZ2VvbV9saW5lKClg77ya5oqY44KM57ea44Kw44Op44OV44KS5o+P55S744GX44G+44GZ44CCCgogICAgLSAgIGBhZXMoeWVhciwgcG9wKWDvvJp5ZWFyIOOBjCB4IOi7uOOAgXBvcO+8iOe3j+S6uuWPo++8ieOCkiB5IOi7uOOBq+aMh+WumuOBl+OBvuOBmeOAggoKICAgICAgICAtICAgYGFlcyh4ID0geWVhciwgeSA9IHBvcClgIOOBruecgeeVpeW9ouOAggoKICAgIC0gICDjgrDjg6njg5Xjga7mj4/nlLvjgavjgaTjgYTjgabjga/jgIHmrKHlm57ku6XpmY3jgavlsJHjgZfjgZrjgaToqqzmmI7jgIIKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoY291bnRyeSA9PSAiV29ybGQiKSB8PiAKICBnZ3Bsb3QoYWVzKHllYXIsIHBvcCkpICsgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gIuS4lueVjOOBrue3j+S6uuWPoyIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KZGZfcG9wIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLml6XmnKzjga7nt4/kurrlj6MiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKirnt7Tnv5Ix77yaR2VybWFueSDjgagg44OJ44Kk44OE44Gu6YOo5YiG44KS5LuW44Gu5Zu95ZCN44Gr5aSJ44GI44Gm44G/44Gm44GP44Gg44GV44GE44CCKioKCmBgYHtyfQpDT1VOVFJZIDwtICJHZXJtYW55IgpkZl9wb3AgfD4gZmlsdGVyKGNvdW50cnkgPT0gQ09VTlRSWSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3ApKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIuODieOCpOODhOOBrue3j+S6uuWPoyIpCmBgYAoKYGBge3J9CkNPVU5UUlkgPC0gIkZyYW5jZSIKZGZfcG9wIHw+IGZpbHRlcihjb3VudHJ5ID09IENPVU5UUlkpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjg5Xjg6njg7Pjgrnjga7nt4/kurrlj6MiKQpgYGAKCmBgYHtyfQpDT1VOVFJZIDwtICJLb3JlYSwgUmVwLiIKZGZfcG9wIHw+IGZpbHRlcihjb3VudHJ5ID09IENPVU5UUlkpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlMChDT1VOVFJZLCLjga7nt4/kurrlj6MiKSkKYGBgCgpgYGB7cn0KQ09VTlRSWSA8LSAiU3ViLVNhaGFyYW4gQWZyaWNhIgpkZl9wb3AgfD4gZmlsdGVyKGNvdW50cnkgPT0gQ09VTlRSWSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3ApKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoQ09VTlRSWSwi44Gu57eP5Lq65Y+jIikpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKue3tOe/kjIuIENPVU5UUklFUyDjgpLnt6jpm4bjgZfjgabjgIHjgqTjgq7jg6rjgrnjgajjg4njgqTjg4Tjgajjg5Xjg6njg7Pjgrnjgajml6XmnKzjgpLku5bjga7lm73jgavlpInjgYjjgabjgb/jgabjgY/jgaDjgZXjgYTjgIIqKgoKYGBge3J9CkNPVU5UUklFUyA8LSBjKCJVbml0ZWQgS2luZ2RvbSIsICJHZXJtYW55IiwgIkZyYW5jZSIsICJKYXBhbiIpCmRmX3BvcCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENPVU5UUklFUykgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3AsIGNvbCA9ICBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjgqTjgq7jg6rjgrnjgajjg4njgqTjg4Tjgajjg5Xjg6njg7Pjgrnjgajml6XmnKzjga7nt4/kurrlj6MiKQpgYGAKCmBgYHtyfQpDT1VOVFJJRVMgPC0gYygiQnJhemlsIiwgIlJ1c3NpYW4gRmVkZXJhdGlvbiIsICJJbmRpYSIsICJDaGluYSIsICJTb3V0aCBBZnJpY2EiKQpkZl9wb3AgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDT1VOVFJJRVMpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wLCBjb2wgPSAgY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiQlJJQ1Mg44Gu57eP5Lq65Y+jIikKYGBgCgojIyAyMDIy5bm044Gu57eP5Lq65Y+j44Gu5aSa44GE6aCGCgpgYGB7cn0KZGZfcG9wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgYXJyYW5nZShkZXNjKHBvcCkpCmBgYAoKIyMgMjAyMuW5tOOBrue3j+S6uuWPo+OBriBUT1AgMTEKCmBgYHtyfQpwb3BfdG9wMTEgPC0gZGZfcG9wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgYXJyYW5nZShkZXNjKHBvcCkpIHw+IHNsaWNlX2hlYWQobj0xMSkgfD4gcHVsbChpc28yYykKcG9wX3RvcDExCmRwdXQocG9wX3RvcDExKQpgYGAKCioq57e057+SNC4gMTk2MOW5tOOBrue3j+S6uuWPo+OBjOWkmuOBhOmghuOBq+S6lOeVquebruOBvuOBp+ODquOCueODiOOBl+OBpuOBj+OBoOOBleOBhOOAgioqCgpgYGB7cn0KcG9wX3RvcDUgPC0gZGZfcG9wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gCiAgZmlsdGVyKHllYXIgPT0gMTk2MCkgfD4gCiAgYXJyYW5nZShkZXNjKHBvcCkpIHw+IHNsaWNlX2hlYWQobj01KSB8PiBwdWxsKGlzbzJjKQpwb3BfdG9wNQpkcHV0KHBvcF90b3A1KQpgYGAKCmBgYHtyfQpkZl9wb3AgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiAKICBmaWx0ZXIoeWVhciA9PSAxOTYwKSB8PiAKICBhcnJhbmdlKGRlc2MocG9wKSkgfD4gc2xpY2VfaGVhZChuPTUpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBUT1AxMSDjga7kurrlj6Pmjqjnp7sKCmBgYHtyfQpkZl9wb3AgfD4gZmlsdGVyKGlzbzJjICVpbiUgcG9wX3RvcDExKSB8PgogIGdncGxvdChhZXMoeWVhciwgcG9wLCBjb2xvciA9IGlzbzJjKSkgKyBnZW9tX2xpbmUoKSArIGxhYnModGl0bGUgPSAiVE9QMTHjga7nt4/kurrlj6MiKQpgYGAKCiMjIOS4reWbveOBqOOCpOODs+ODieS7peWkluOBrlRPUDExIOOBruS6uuWPo+aOqOenuwoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoaXNvMmMgJWluJSBwb3BfdG9wMTEpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgYygiQ04iLCAiSU4iKSkpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wLCBjb2xvciA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIuS4reWbveOBqOOCpOODs+ODieS7peWkluOBrlRPUDEx44Gu57eP5Lq65Y+jIikKYGBgCgojIyDlnLDln5/jgZTjgajjga7kurrlj6Pmjqjnp7sKCmBgYHtyfQpkZl9wb3AgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBjKCJTb3V0aCBBc2lhIiwgIkV1cm9wZSAmIENlbnRyYWwgQXNpYSIsICJNaWRkbGUgRWFzdCAmIE5vcnRoIEFmcmljYSIsIAoiRWFzdCBBc2lhICYgUGFjaWZpYyIsICJTdWItU2FoYXJhbiBBZnJpY2EiLCAiTGF0aW4gQW1lcmljYSAmIENhcmliYmVhbiIsICJOb3J0aCBBbWVyaWNhIikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3AsIGNvbG9yID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIuWcsOWfn+OBlOOBqOOBrue3j+S6uuWPoyIpCmBgYAo=