精神科後期研修のおすすめ書籍アンケート で収集したデータについて、csvファイルの読み込み・データクリーニング・図示までをRで解析しました。この文章は R Notebookで作成しています。コードは右上の CODEからダウンロードすることができます。

このコード自体は複雑な操作も含まれています。どのような操作をしているか、なるべく読みやすいように補足をつけながらコード記載しています。初めてRのコードを見る方も「このような操作をしているのか」と興味を持っていただけたら嬉しいです。

まずRを勉強するには、2021年5月に改訂2版が出たこちらがおすすめです。 松村優哉, 湯谷啓明, 紀ノ定保礼, 前田和寛. 改訂2版 RユーザのためのRStudio[実践]入門〜tidyverseによるモダンな分析フローの世界. 技術評論社; 2021. https://www.amazon.co.jp/dp/B095W5G8KB

アンケート内容

今回のアンケートはこちらから確認できます。年齢を選ぶ択一式質問、おすすめ書籍の複数選択式質問、その他おすすめ書類を選ぶ自由記載形式質問の3つについて分析していきます。

初期設定

Rを始めるときは、その都度使用する道具(パッケージ)を選択する必要があります。今回は以下のパッケージを利用します。デフォルトでは install.pakeges()library() というコードがありますが、 pacman::p_load() を覚えておくと便利です。install.pakeges()library() を羅列することなく、pacman::p_load() の一行でスマートに記載することができます。

pacmanについてはこちらの記事をご参照ください。

コードの中に # で記載するとコメントとして認識されます。コードの実行に影響することなく、コメントを残すことができます。

if (!require("pacman")) install.packages("pacman")
pacman::p_load(
  tidyverse,  #Rでデータ処理・解析をするための便利なパッケージ群
  gt,         #見栄えの良い表を作るためのパッケージ
  gtsummary,  #gtの拡張で、基礎統計などの集計を簡単に行うパッケージ
  rvest       #ウェブスクレイピングを可能にするパッケージ
  )

データの読み込み

read_csv() で .csv ファイルを読み込みます。読みこんだ .csv ファイルを <- で dat と名前をつけます。今回分析に使用した.csvファイルははこちらからダウンロードしてください。

dat <- read_csv("../materials/list_210606.csv") # csvファイルの読み込み

─ Column specification ────────────────────────────
cols(
  Timestamp = col_character(),
  年齢をお選びください = col_character(),
  `オススメ書籍はどれですか?(複数回答可)` = col_character(),
  他のオススメ本 = col_character()
)
dat

と入力することで、読み込んだ csv ファイルを表示することができます。

dat # datを表示

列名の変更

列名だけを見たい場合は、 names() を使います。 パイプ演算子 %>% を使って dat に続けて入力すると、その指定の処理を続けて行うことができます。 RStudioではShift + Ctrl(⌘) + Mで入力することができます。

dat %>% names() # 列名の表示
[1] "Timestamp"                               
[2] "年齢をお選びください"                    
[3] "オススメ書籍はどれですか?(複数回答可)"
[4] "他のオススメ本"                          

rename() を使って扱いやすい列名に変更しておきます。dat %>% rename()の一連の処理の結果を dat <- として、 dat に結果を反映します。dat <- の部分をdat1 <- など別の名前にした場合は、dat1 にその結果が反映されます。

dat <- dat %>% # 以下の操作を datに渡す
  rename(age = "年齢をお選びください",
         book = "オススメ書籍はどれですか?(複数回答可)",
         comment = "他のオススメ本") # 列名の変更

列の抽出

必要の無い列を select() で選択して外します。外したい列名を - で選択します。行の番号を rownames_to_column() で追加します。これを dat1 とします。comment列はあとの集計にとっておき、これからの操作に不要なので外しておきます。

dat1 <- dat %>% #以下の操作をdat1に渡す
  select(-Timestamp, -comment) %>% # Timestamp, comment 列を除外
  rownames_to_column() # 行番号を追加

dat1 #dat1を表示

最初に比べて必要な列が抽出でき、すっきりとしました。

基礎統計の算出

gtsummary パッケージをつかって、このデータの特徴をみていきます。select()で age列を選択後に gtsummary の一つの機能である tbl_summary() (どのパッケージのコマンドであるかを明示した書き方で、 gtsummary::tbl_summary() と表記する方法もあります) で集計してみます。

dat1 %>% 
  select(age) %>% # age列 を選択
  tbl_summary() # 集計
Characteristic N = 311
age
20代 2 (6.5%)
30代 21 (68%)
40代 8 (26%)

1 n (%)

全体で31人の回答者がいて、約3分の2が30代であることがわかりました。それぞれ一人あたりどのくらいの本を選んだのか計算してみます。book列に注目して、本を選んだ数を計算していきます。

dat1 %>% select(book) # book列を選択

それぞれの書籍名の間を セミコロン ; で区切っていることがわかります。一つも選択していない場合(フリーコメントだけ書いている場合)はbook列は欠損値 NA です。つまりは、 ; の個数がわかれば、それに1を足せば選択した書籍数として計算ができそうです。str_count() を使うと目的の処理が達成できます。mutate() で 集計した count列を作成します。if_else() で条件式を作ります。もし count 列が NAだったら、0 に書き換え、NAでなければ現在の数に1を足すように算出します。

age_count <- dat1 %>% #以下の操作の結果をage_countに渡す
  mutate(count = str_count(book,";")) %>%  # ;の数を数える
  mutate(count = if_else(is.na(count), # もし count 列が NAだったら
                         0,            # 0 にcountを書き換える
                         count+1)) %>% # NAでなければ現在の数に1を足す
  select(age,count)           # age, count 列について抽出

age_count #age_countを表示

これで一人当たり、複数選択肢の質問にどれだけ選択しているかがわかりました。これを gtsummary::tbl_summary で表にします。tbl_summary()の中で by = age と指定することで、 age列のグループごとに集計するように設定できます。

age_count <- age_count %>%  # 以下の操作の結果をage_countに渡す
  tbl_summary(by = age) %>%              # age列のグループごとに集計
  as_gt() # gt オブジェクトにする(表の保存のため)

age_count # age_countを表示
Characteristic 20代, N = 21 30代, N = 211 40代, N = 81
count 14 (14, 14) 14 (7, 19) 14 (10, 23)

1 Median (IQR)


gtsave(data = age_count, "age_count.html") # age_countの表をhtmlで保存する(推奨)
gtsave(data = age_count, "age_count.png") # age_countの表を png で保存する

複数選択肢の回答内容を個別に分けていく

先程もお示ししたように、book列は複数選択したものが セミコロン(;)でつながっています。

dat1 %>% select(book) # book列を選択

これを、 separate(); を区切りに別の列に展開していきます。今回、選択肢が 117あるため、最大120選択しても大丈夫なように空のリストを準備します。str_c() で文字を結合することができます。例えば str_c("a", "b") の結果は "ab" です。今回、1:120 という1から120の連続する数字のベクトルを用意し、パイプ演算子 %>%str_c("f", .)渡すことで、f1 から f120という120個の文字を作ることができます。 このように %>% 以前の結果を . の位置に代入することができます。

col_list <- 1:120 %>% # col_listの作成、1から120の連続する数字の文字ベクトルを用意
  str_c("f", .)  # f1 から f120という120個の文字ベクトルを作成する。

col_list # col_listの表示
  [1] "f1"   "f2"   "f3"   "f4"   "f5"   "f6"   "f7"   "f8"   "f9"   "f10" 
 [11] "f11"  "f12"  "f13"  "f14"  "f15"  "f16"  "f17"  "f18"  "f19"  "f20" 
 [21] "f21"  "f22"  "f23"  "f24"  "f25"  "f26"  "f27"  "f28"  "f29"  "f30" 
 [31] "f31"  "f32"  "f33"  "f34"  "f35"  "f36"  "f37"  "f38"  "f39"  "f40" 
 [41] "f41"  "f42"  "f43"  "f44"  "f45"  "f46"  "f47"  "f48"  "f49"  "f50" 
 [51] "f51"  "f52"  "f53"  "f54"  "f55"  "f56"  "f57"  "f58"  "f59"  "f60" 
 [61] "f61"  "f62"  "f63"  "f64"  "f65"  "f66"  "f67"  "f68"  "f69"  "f70" 
 [71] "f71"  "f72"  "f73"  "f74"  "f75"  "f76"  "f77"  "f78"  "f79"  "f80" 
 [81] "f81"  "f82"  "f83"  "f84"  "f85"  "f86"  "f87"  "f88"  "f89"  "f90" 
 [91] "f91"  "f92"  "f93"  "f94"  "f95"  "f96"  "f97"  "f98"  "f99"  "f100"
[101] "f101" "f102" "f103" "f104" "f105" "f106" "f107" "f108" "f109" "f110"
[111] "f111" "f112" "f113" "f114" "f115" "f116" "f117" "f118" "f119" "f120"

separate()をつかって、特定の文字列でつながった文字を分けていくことができます。bookという列に対して、col_list (f1からf120) の120個の列を用意して、; で区切られた文字を分割していきます。

dat1 <- dat1 %>% # 以下の結果を dat1 に渡す
  separate(book, # bookという列を
           into = col_list, # col_list (f1からf120) の120個の列を用意して
           sep =";", # ; で区切られた文字を分割していく
           extra ="merge") # ; 120個以上の結果が出た場合は、最後の列に処理しきれなかった文字を残す
Expected 120 pieces. Missing pieces filled with `NA` in 29 rows [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, ...].
dat1 # dat1 の表示

縦長データ(整然データ, tidy data)の作成

前回までの作業で横長の列ができました。これを、データで扱いやすいように、pivot_longer() で、縦長のデータセットに変形します。f1からf120の列に対して、もともとの列名を “f” という列の中に格納し、セルの値を “book” という列の中に格納していきます。

dat1 <- dat1 %>% # 以下の結果を da1 に渡す
  pivot_longer( # 縦長のデータセットに変形する
  f1:f120, # f1からf120の列に対して
  names_to = "f", # もともとの列名を "f" という列の中に格納する
  values_to = "book") %>%  # セルの値を "book" という列の中に格納する
  filter(!is.na(book)) # book 列の値が欠損値 NA であった場合、その行を取り除く

dat1 # dat1 の表示

縦長のデータができました。このような縦長のデータのほうがデータ分析の観点からはまとまった扱いやすく、この形式を 整然データ(tidy data) と呼びます。

データの集計

データを集計していきます。group_by()を使って、本の種類毎に集計していきます。group_by(book)とすることで、book列について集計すると宣言し、summarise(count = n())でbook列の要素の個数を count列に挿入していきます。

その後に、arrange()を使って、1. count の大きい順、2. bookの文字数が多い順、に並べて、行番号を rowname_to_column() で挿入し、mutate()で整数にデータ型を指定します。 - この行番号は、図の作成のときに使用します。

dat2 <- dat1 %>% # 以下の計算データをdat2に渡す
  group_by(book) %>% # book列について集計する(グループ化)
  summarise(count = n(), # book列の要素の個数を count列に挿入する
            .groups="drop") # グループ化 の解除

dat2 # dat2 の表示

後の図示の際に扱いやすいように、データを並び替えます。countの多い順に並べ、countが同じ場合、bookの文字数の多い順に並べていきます。並べた順に行番号を振り直し、行番号の列を整数値(integr型)に変更します。mutate() の中のacross()で操作する列名を指定し、~ 以降の .x にその指定した列を代入します。

dat2 <- dat2 %>% # 以下の結果をdat2に渡す
  arrange(desc(count), # countの多い順に並べる
          desc(str_length(book))) %>% #countが同じ場合、bookの文字数の多い順に並べる
  rownames_to_column() %>% # 並べた順に行番号を振り直す
  mutate( #列操作
    across(rowname, # rowname の列について
           ~ as.integer(.x)) # rowname(.x)を整数値にする
         ) 

dat2 # dat2の表示

文字数カウント

この表自体もとても有用なのですが、このデータを図示してみたいと思います。ただ、図示する際に文字数が長すぎると支障がでます。文字数は nchar() でカウントすることができます。

dat2 %>% # dat2について以下の操作を実行
  pull(book) %>% # book列をベクトルとして抽出
  nchar() # 文字数の計算
 [1]   5  23  17  25  35  31  27  19  17  14  30  19  12  15  10  32  29  27
[19]   8  35  21  17  15  32  26  23  21  19  16  39  30  26  18  17  17  16
[37]  13  13  11  31  30  25  23  21  21  20  18  15  15  15  12   8  37  35
[55]  32  28  26  25  23  23  22  19  17  17  14  14  10  10  10   9   7 108
[73]  41  27  21  17  16  15  10   8  58  51  49  48  39  29  23  23  21  20
[91]  19  18  18  18  13  10   5

108文字は可視化の際に支障が出そうです。今回、可視化して全体を把握することが目標なので、本が認識できる最初の20文字のみ抽出します。 str_sub() で指定したの文字を抽出することができます。

titlename <- dat2 %>% # 以下の結果を titlenameに渡す
  pull(book) %>% # book列をベクトルとして抽出
  str_sub(start = 1, end = 20) # 最初の文字から20文字まで抽出

titlename # titlenameの表示
 [1] "精神症候学"                              
 [2] "モーズレイ処方ガイドライン 第13版 日"    
 [3] "精神科における予診・初診・初期治療"      
 [4] "脳波判読step by step 入門編"             
 [5] "カプラン臨床精神医学テキスト DSM-5"      
 [6] "ストール精神薬理学エセンシャルズ 神経科" 
 [7] "西丸四方、西丸甫夫『精神医学入門』(改訂"
 [8] "DSM-5 精神疾患の分類と診断の手引"        
 [9] "精神診療プラチナマニュアル 第2版"        
[10] "看護のための精神医学 第2版"              
[11] "原田憲一『精神症状の把握と理解(精神医学"
[12] "改訂版予診・初診・初期治療笠原診療新社"  
[13] "精神病理学臨床講義第2版"                 
[14] "統合失調症薬物治療ガイドライン"          
[15] "精神科の薬がわかる本"                    
[16] "精神科診療に必要な書式マニュアル 第四版" 
[17] "四訂精神保健福祉法詳解(精神保健福祉研究"
[18] "クラウス・コンラート『分裂病のはじまり』"
[19] "現代臨床精神医学"                        
[20] "宮岡等、内山登紀夫『大人の発達障害ってそ"
[21] "DSM-5 精神疾患の診断・統計マニュア"      
[22] "認知症疾患診療ガイドライン2017"          
[23] "うつ病治療ガイドライン 第2版"            
[24] "古茶大樹『臨床精神病理学 精神医学におけ" 
[25] "脳波判読step by step 症例編"             
[26] "カール・ヤスパース『精神病理学原論』みす"
[27] "精神療法の基本: 支持から認知行動療法ま"  
[28] "改訂版精神療法の第一歩成田善弘診療新社"  
[29] "失踪日記2アル中病棟/吾妻ひでお"          
[30] "内村祐之『精神医学の基本問題 精神病と神" 
[31] "クルト・シュナイダー『臨床精神病理学』("
[32] "摂食障害―食べない、食べられない、食べた"
[33] "こころの治療薬ハンドブック 第13版"       
[34] "今日の治療薬2021: 解説と便覧"            
[35] "精神科身体合併症マニュアル 第2版"        
[36] "てんかん診療ガイドライン2018"            
[37] "こころの病を診るということ"              
[38] "精神科レジデントマニュアル"              
[39] "症例でわかる精神病理学"                  
[40] "認知行動療法トレーニングブック[DVD/"     
[41] "山下格『誤診のおこるとき 精神科診断の宿" 
[42] "脳波判読オープンキャンパス 誰でも学べる" 
[43] "尾久守侑『精神症状から身体疾患を見抜く』"
[44] "大うつ病性障害・双極性障害治療ガイドライ"
[45] "中井久夫『最終講義 分裂病私見』みすず書" 
[46] "医学論文のための統計手法の選び方・使い方"
[47] "精神科リハビリテーションワークブック"    
[48] "誤りやすい異常脳波. 第3版."              
[49] "今日の精神疾患治療指針 第2版"            
[50] "精神・心理機能評価ハンドブック"          
[51] "改訂版意識障害を診わける"                
[52] "ポケット臨床脳波"                        
[53] "Beckの娘のジュディスの認知行動療法実"    
[54] "中安信夫『精神科臨床を始める人のために " 
[55] "不安とうつの統一プロトコル―診断を越えた"
[56] "西丸四方、西丸甫夫『やさしい精神医学』("
[57] "クルト・シュナイダー『臨床精神病理学序説"
[58] "エルンスト・クレッチマー『医学的心理学』"
[59] "中井久夫『精神科治療の覚書』(新版)日本"
[60] "濱田秀伯『精神医学エッセンス』(第2版)" 
[61] "成人期の自閉症スペクトラム診療実践マニュ"
[62] "カプラン精神科薬物ハンドブック 第5版"    
[63] "ICD-10精神科診断ガイドブック"            
[64] "科学的認知症診療 5Lessons"               
[65] "精神科臨床144のQ & A"                    
[66] "精神症状から身体疾患を見抜く"            
[67] "失踪日記/吾妻ひでお"                     
[68] "人間仮免中/卯月妙子"                     
[69] "精神科診断面接のコツ"                    
[70] "支持的精神療法入門"                      
[71] "精神病 笠原嘉"                           
[72] "精神科臨床ニューアプローチ (1 症候か"    
[73] "ケースでわかる! 精神科治療ガイドライン"  
[74] "中安信夫『体験を聴く・症候を読む・病態を"
[75] "原田誠一『精神療法の工夫と楽しみ』金剛出"
[76] "尾久守侑『器質か心因か』中外医学社"      
[77] "メモリークリニック診療マニュアル"        
[78] "軽症うつ病笠原嘉開談社現代新書"          
[79] "縮刷版 精神医学事典"                     
[80] "TEXT精神医学"                            
[81] "ホスピタリストのための内科診療フローチャ"
[82] "近藤伸介監訳『神経精神医学ケースブック " 
[83] "広沢正孝『成人の高機能広汎性発達障害とア"
[84] "心の健康問題により休業した労働者の職場復"
[85] "八木剛平、田辺英『精神病治療の開発思想史"
[86] "安永浩『精神科医のものの考え方 私の臨床" 
[87] "新版精神保健福祉法講義第3版(大谷實、成"
[88] "村松太郎『統合失調症当事者の症状論』中外"
[89] "精神医学ハンドブック医学・保健・福析の基"
[90] "急性中毒診療レジデントマニュアル 第2版"  
[91] "精神・心理症状学ハンドブック[第2版]"     
[92] "DSM-5診断面接ポケットマニュアル"         
[93] "新版 精神療法家の仕事―面接と面接者"     
[94] "精神科臨床Q&A for ビギナーズ"            
[95] "援助者必携はじめての精神科"              
[96] "もったいない患者対応"                    
[97] "ガダラの豚"                              

これをdat2 に結合していきます。cbind()を使います。

dat2 <- cbind(dat2, titlename) # dat2 に titlename のベクトルを列として結合

dat2 # dat2 の表示

棒グラフの図示

これから図示をしていきます。ggplot() できれいなオブジェクトを作成することができます。今回は、棒グラフを作成していきます。aes()で x軸を、book列、 y軸を count列で指定します。x軸の順番を reorder() の X で先程作成した rowname の降順 desc() として指定します。

g1 <- dat2 %>% # 以下の操作を g1 に渡す
  ggplot() + # ggplot() の宣言
  aes(x = reorder(x = titlename, # x 軸に titlenameを選択
                  X = desc(rowname)),  # titlenameをrownameの降順で表示
      y = count, # y軸は count を選択
      fill = count) + # 色塗りを count に合わせて行う
  geom_col() # 棒グラフの作成

g1 # g1 を表示

x軸の文字が潰れて見えなくなっています。x軸の傾きを調整することもできますが、今回は coord_flip() を使って、縦と横を変形します。 先程作成したオブジェクト g1 に + で続きを入力することで、図の設定を書き足していくことができます。

g2 <- g1 + # 以下の操作を g2に渡す
  coord_flip() # x軸とy軸を入れ替える

g2 # g2の表示

x軸とy軸の位置を scale_x_discrete(), scale_y_continuous() で調整します。 scale_fill_continuous() を使って、任意の色でグラデーションを付けてみます。labs() を使って x軸とy軸を非表示にします。scale_fill_continuous()で色塗りをグラデーションで指定します。

g3 <- g2 + # 以下の操作をg3に渡す
  scale_x_discrete(position = "top") + #x軸の位置調整
  scale_y_continuous(position = "right") + #y軸の位置調整
  scale_fill_continuous( # 色塗りをグラデーションで指定
    low = "#DD8A90", # 小さい値を#DD8A90
    high = "#BD4670") + # 大きい値を#DD8A90
  labs(x = "", y = "") + #x軸とy軸の表示をなくす
  theme_minimal() + # すっきりしたテーマに変更
  theme(legend.position = "none") # 凡例の削除

g3 # g3の表示

関数を作成する

これまでの dat2 以降の一連の流れを関数にしてみます。function()で関数を軸することができます。データの集計を、make_aggregate()、グラフの作成を、make_graph()とします。

make_aggregate <- # make_aggregateという関数を作成
  function(df) { # df という引数を指定する
  df <- df %>% # dfに対して以下の操作を行う
    group_by(book) %>% # book列について集計する(グループ化)
    summarise(count = n(),# book列の要素の個数を count列に挿入する
              .groups="drop") %>% # グループ化 の解除
    arrange(desc(count), # countの多い順に並べる
            desc(str_length(book))) %>% #countが同じ場合、bookの文字数の多い順に並べる
    rownames_to_column() %>% # 並べた順に行番号を振り直す
    mutate( #列操作
      across(rowname, # rowname の列について
             ~ as.integer(.x)) # rowname(.x)を整数値にする
      )
  titlename <-df %>% # 以下の結果を titlenameに渡す
    pull(book) %>% # book列をベクトルとして抽出
    str_sub(start = 1, end = 20) # 最初の文字から20文字まで抽出
  df <- cbind(df, titlename) # df に titlename のベクトルを列として結合
  return(df) # 最終的にできたdfを make_aggregateに渡す
  }

make_graph <- # make_graph という関数を作成
  function(df) { # df という引数を指定する
  df %>%
    ggplot() + # ggplot() の宣言
    aes(x = reorder( x = titlename, # x 軸に titlenameを選択
                     X = desc(rowname)), # titlenameをrownameの降順で表示
        y = count, # y軸は count を選択
        fill = count) + # 色塗りを count に合わせて行う
    geom_col() + # 棒グラフの作成
    coord_flip() + # x軸とy軸を入れ替える
    scale_x_discrete(position = "top") + #x軸の位置調整
    scale_y_continuous(position = "right") + #y軸の位置調整
    scale_fill_continuous( # 色塗りをグラデーションで指定
      low = "#DD8A90", # 小さい値を#DD8A90
      high = "#BD4670") + # 大きい値を#DD8A90
    labs(x = "", y = "") + #x軸とy軸の表示をなくす
    theme_minimal() + # すっきりしたテーマに変更
    theme(legend.position = "none") # 凡例の削除
  }

こうして、作成した関数にデータを渡すだけで同様の作業が繰り返すことができます。今回はデータが多いため、5票以上と、1票以上5票未満に分けて図示してみます。

g4 <- dat1 %>% # 以下の操作の結果をg4に渡す
  make_aggregate() %>% # dat1 に対して 関数 make_aggregate()を行う
  filter(count >= 5) %>% # データのcountが5以上を抽出
  make_graph() + # 関数 make_graph() を行う
  ylim(0,17) #スケールの幅を合わせるために0-17の範囲で固定する
Scale for 'y' is already present. Adding another scale for 'y', which will
replace the existing scale.
g4 # g4 の表示

g5 <- dat1 %>% # 以下の操作の結果をg4に渡す
  make_aggregate() %>% # dat1 に対して 関数 make_aggregate()を行う
  filter(count < 5) %>% # データのcountが5未満を抽出
  make_graph() + # 関数 make_graph() を行う
  ylim(0,17) #スケールの幅を合わせるために0-17の範囲で固定する
Scale for 'y' is already present. Adding another scale for 'y', which will
replace the existing scale.
g5 # g5 の表示

Tableにしてみる

先程作った集計表でもいいのですが、せっかくなので、そのままクリックしたら書籍ページに飛べるような table を作成してみます。集計まで終わった dat2 のデータを使用していきます。

dat2
dat_table <- dat2 %>% #以下の結果をdat_tableに渡す
  select(titlename, count, book) # titlename, count, book列の抽出

link <- dat_table %>% # 以下の結果をlinkに渡す
  pull(book) # book列をベクトルとして取り出す

link <- str_c( # 文字の結合
  "https://www.google.com/search?q=", #結合する文字1
  link # 結合する文字2 (book列のベクトル link)
  ) # 結合する文字3

dat_table <- cbind(dat_table, link) # dat_tableにlink列を挿入

dat_table %>% select(link) # link列を選択して表示

これで必要なURLを作成することができました。今回は、Google検索に飛ぶように設定しました。これを反映するためには html の table にする必要があります。book列に上記のlinkを組み込むように設定します。map()map2() を使うことで、一括した列操作が可能です。

html_table <- dat_table %>% # 以下の操作をhtml_tableに渡す
  mutate( # 列操作
    book = map2( # 以下2つの引数に対して ~ 以下の処理を実行する
      book, link, # book列、link列に対して
      ~ .x %>% htmltools::a( # book(.x) に以下の a属性を与える
        href = .y, # .y のリンク情報を与える
        target = "_blank")), # リンクには新規タブを開いてジャンプする
    book = map( # 以下1つの引数に対して ~ 以下の処理を実行する
      book, # book列に対して
      ~ gt::html(as.character(.x)))) # htmlの情報を反映させる

html_table %>% # 以下の操作を実行
  select(book, count) %>% # book列, count列を選択
  rename("書籍名"=book) %>% # 列名の変更
  gt() %>% # gt オブジェクトとして表示
  cols_align(align = "left") # 左寄せにする
書籍名 count
精神症候学 17
モーズレイ処方ガイドライン 第13版 日本語版 15
精神科における予診・初診・初期治療 15
脳波判読step by step 入門編. 第4版 13
カプラン臨床精神医学テキスト DSM-5診断基準の臨床への展開 第3版 11
ストール精神薬理学エセンシャルズ 神経科学的基礎と応用 第4版 11
西丸四方、西丸甫夫『精神医学入門』(改訂25版)南山堂 11
DSM-5 精神疾患の分類と診断の手引 11
精神診療プラチナマニュアル 第2版 11
看護のための精神医学 第2版 11
原田憲一『精神症状の把握と理解(精神医学の知と技)』中山書店 10
改訂版予診・初診・初期治療笠原診療新社 10
精神病理学臨床講義第2版 10
統合失調症薬物治療ガイドライン 9
精神科の薬がわかる本 9
精神科診療に必要な書式マニュアル 第四版 2017年 12 月号 8
四訂精神保健福祉法詳解(精神保健福祉研究会監修、中央法規) 8
クラウス・コンラート『分裂病のはじまり』岩崎学術出版社 8
現代臨床精神医学 8
宮岡等、内山登紀夫『大人の発達障害ってそういうことだったのか』医学書院 7
DSM-5 精神疾患の診断・統計マニュアル 7
認知症疾患診療ガイドライン2017 7
うつ病治療ガイドライン 第2版 7
古茶大樹『臨床精神病理学 精神医学における疾患と診断』日本評論社 6
脳波判読step by step 症例編. 第4版. 6
カール・ヤスパース『精神病理学原論』みすず書房 6
精神療法の基本: 支持から認知行動療法まで 6
改訂版精神療法の第一歩成田善弘診療新社 6
失踪日記2アル中病棟/吾妻ひでお 6
内村祐之『精神医学の基本問題 精神病と神経症の構造論の展望』(復刻版)創造出版 5
クルト・シュナイダー『臨床精神病理学』(原著第15版)文光堂 5
摂食障害―食べない、食べられない、食べたら止まらない 5
こころの治療薬ハンドブック 第13版 5
今日の治療薬2021: 解説と便覧 5
精神科身体合併症マニュアル 第2版 5
てんかん診療ガイドライン2018 5
こころの病を診るということ 5
精神科レジデントマニュアル 5
症例でわかる精神病理学 5
認知行動療法トレーニングブック[DVD/Web動画付] 第2版 4
山下格『誤診のおこるとき 精神科診断の宿命と使命』みすず書房 4
脳波判読オープンキャンパス 誰でも学べる7STEP 4
尾久守侑『精神症状から身体疾患を見抜く』金芳堂 4
大うつ病性障害・双極性障害治療ガイドライン 4
中井久夫『最終講義 分裂病私見』みすず書房 4
医学論文のための統計手法の選び方・使い方 4
精神科リハビリテーションワークブック 4
誤りやすい異常脳波. 第3版. 4
今日の精神疾患治療指針 第2版 4
精神・心理機能評価ハンドブック 4
改訂版意識障害を診わける 4
ポケット臨床脳波 4
Beckの娘のジュディスの認知行動療法実践ガイド:基礎から応用まで 第2版 3
中安信夫『精神科臨床を始める人のために 精神科臨床診断の方法』星和書店 3
不安とうつの統一プロトコル―診断を越えた認知行動療法ワークブック 3
西丸四方、西丸甫夫『やさしい精神医学』(改訂5版)南山堂 3
クルト・シュナイダー『臨床精神病理学序説』みすず書房 3
エルンスト・クレッチマー『医学的心理学』みすず書房 3
中井久夫『精神科治療の覚書』(新版)日本評論社 3
濱田秀伯『精神医学エッセンス』(第2版)弘文堂 3
成人期の自閉症スペクトラム診療実践マニュアル 3
カプラン精神科薬物ハンドブック 第5版 3
ICD-10精神科診断ガイドブック 3
科学的認知症診療 5Lessons 3
精神科臨床144のQ & A 3
精神症状から身体疾患を見抜く 3
失踪日記/吾妻ひでお 3
人間仮免中/卯月妙子 3
精神科診断面接のコツ 3
支持的精神療法入門 3
精神病 笠原嘉 3
精神科臨床ニューアプローチ (1 症候からみた精神医学2気分障害3神経症性障害とストレス関連障害4統合失調症と類縁疾患5パーソナリティ障害・摂食障害6老年期精神障害7児童期の精神医学 8睡眠障害・物質依存) 上島国利 2
ケースでわかる! 精神科治療ガイドラインのトリセツ by EGUIDEプロジェクト 2
中安信夫『体験を聴く・症候を読む・病態を解く』星和書店 2
原田誠一『精神療法の工夫と楽しみ』金剛出版 2
尾久守侑『器質か心因か』中外医学社 2
メモリークリニック診療マニュアル 2
軽症うつ病笠原嘉開談社現代新書 2
縮刷版 精神医学事典 2
TEXT精神医学 2
ホスピタリストのための内科診療フローチャート 第2版―専門的対応が求められる疾患の診療の流れとエビデンス―. 第2版 1
近藤伸介監訳『神経精神医学ケースブック 脳とからだの精神科』メディカル・サイエンス・インターナショナル 1
広沢正孝『成人の高機能広汎性発達障害とアスペルガー症候群 社会に生きる彼らの精神行動特性』医学書院 1
心の健康問題により休業した労働者の職場復帰支援の手引き~メンタルヘルス対策における職場復帰支援~ 1
八木剛平、田辺英『精神病治療の開発思想史 ネオヒポクラティズムの系譜』星和書店 1
安永浩『精神科医のものの考え方 私の臨床経験から』金剛出版 1
新版精神保健福祉法講義第3版(大谷實、成文堂) 1
村松太郎『統合失調症当事者の症状論』中外医学社 1
精神医学ハンドブック医学・保健・福析の基礎 1
急性中毒診療レジデントマニュアル 第2版 1
精神・心理症状学ハンドブック[第2版] 1
DSM-5診断面接ポケットマニュアル 1
新版 精神療法家の仕事―面接と面接者 1
精神科臨床Q&A for ビギナーズ 1
援助者必携はじめての精神科 1
もったいない患者対応 1
ガダラの豚 1

この表でも十分ですが、また、せっかくなので table の中に棒グラフも入れてみます。下記の記事を参考にします。

Mock T. The Mockup Blog: 10+ Guidelines for Better Tables in R. Published online September 4, 2020. Accessed June 9, 2021. https://themockup.blog/posts/2020-09-04-10-table-rules-in-r/

ここに書いてある 10. Barplot にある、bar_chart() の関数を使用します。

# 関数 bar_chartの作成
bar_chart <- function(value, color = "red", display_value = NULL){
  # Choose to display percent of total
  if (is.null(display_value)) {
    display_value <- "&nbsp;"
  } else {
    display_value <- display_value
  }
  # paste color and value into the html string
  glue::glue("<span style=\"display: inline-block; direction: ltr; border-radius: 4px; padding-right: 2px; background-color: {color}; color: {color}; width: {value}%\"> {display_value} </span>")
}

先程作成した、html_table に棒グラフを加えていきます。今回もmapを使用していきます。完成したものを gtsave() でhtmlとpdfに保存します。

html_table_2 <- html_table %>% # 以下の操作をhtml_table_2に渡す
  mutate( # 列操作
    rank = count/max(count) * 100, # 棒グラフのために%でrankを作成
    rank = map( # 以下1つの引数に対して ~ 以下の処理を実行する
      rank, # rank列に対して
      ~ bar_chart(value = .x, # bar_chart関数を実行
                  color = "#BD4670")), # 棒グラフの色は #BD4670 へ
    rank = map( # その後、もう一度 map を実行
           rank, # rank列に対して
           ~ gt::html(as.character(.x)))) %>% # htmlの情報を反映させる
  select(book, count, rank) %>% # book, count, rank 列を選択
  rename( # 名前の変更
    "書籍名" = book, # book を「書籍名」に変更
    " " = count, # count を スペースへ
    "     " = rank) %>% # rank もスペースへ 
  gt() %>%# gt オブジェクトへ
  cols_align(align = "left") # 左寄せ

html_table_2
書籍名      
精神症候学 17  
モーズレイ処方ガイドライン 第13版 日本語版 15  
精神科における予診・初診・初期治療 15  
脳波判読step by step 入門編. 第4版 13  
カプラン臨床精神医学テキスト DSM-5診断基準の臨床への展開 第3版 11  
ストール精神薬理学エセンシャルズ 神経科学的基礎と応用 第4版 11  
西丸四方、西丸甫夫『精神医学入門』(改訂25版)南山堂 11  
DSM-5 精神疾患の分類と診断の手引 11  
精神診療プラチナマニュアル 第2版 11  
看護のための精神医学 第2版 11  
原田憲一『精神症状の把握と理解(精神医学の知と技)』中山書店 10  
改訂版予診・初診・初期治療笠原診療新社 10  
精神病理学臨床講義第2版 10  
統合失調症薬物治療ガイドライン 9  
精神科の薬がわかる本 9  
精神科診療に必要な書式マニュアル 第四版 2017年 12 月号 8  
四訂精神保健福祉法詳解(精神保健福祉研究会監修、中央法規) 8  
クラウス・コンラート『分裂病のはじまり』岩崎学術出版社 8  
現代臨床精神医学 8  
宮岡等、内山登紀夫『大人の発達障害ってそういうことだったのか』医学書院 7  
DSM-5 精神疾患の診断・統計マニュアル 7  
認知症疾患診療ガイドライン2017 7  
うつ病治療ガイドライン 第2版 7  
古茶大樹『臨床精神病理学 精神医学における疾患と診断』日本評論社 6  
脳波判読step by step 症例編. 第4版. 6  
カール・ヤスパース『精神病理学原論』みすず書房 6  
精神療法の基本: 支持から認知行動療法まで 6  
改訂版精神療法の第一歩成田善弘診療新社 6  
失踪日記2アル中病棟/吾妻ひでお 6  
内村祐之『精神医学の基本問題 精神病と神経症の構造論の展望』(復刻版)創造出版 5  
クルト・シュナイダー『臨床精神病理学』(原著第15版)文光堂 5  
摂食障害―食べない、食べられない、食べたら止まらない 5  
こころの治療薬ハンドブック 第13版 5  
今日の治療薬2021: 解説と便覧 5  
精神科身体合併症マニュアル 第2版 5  
てんかん診療ガイドライン2018 5  
こころの病を診るということ 5  
精神科レジデントマニュアル 5  
症例でわかる精神病理学 5  
認知行動療法トレーニングブック[DVD/Web動画付] 第2版 4  
山下格『誤診のおこるとき 精神科診断の宿命と使命』みすず書房 4  
脳波判読オープンキャンパス 誰でも学べる7STEP 4  
尾久守侑『精神症状から身体疾患を見抜く』金芳堂 4  
大うつ病性障害・双極性障害治療ガイドライン 4  
中井久夫『最終講義 分裂病私見』みすず書房 4  
医学論文のための統計手法の選び方・使い方 4  
精神科リハビリテーションワークブック 4  
誤りやすい異常脳波. 第3版. 4  
今日の精神疾患治療指針 第2版 4  
精神・心理機能評価ハンドブック 4  
改訂版意識障害を診わける 4  
ポケット臨床脳波 4  
Beckの娘のジュディスの認知行動療法実践ガイド:基礎から応用まで 第2版 3  
中安信夫『精神科臨床を始める人のために 精神科臨床診断の方法』星和書店 3  
不安とうつの統一プロトコル―診断を越えた認知行動療法ワークブック 3  
西丸四方、西丸甫夫『やさしい精神医学』(改訂5版)南山堂 3  
クルト・シュナイダー『臨床精神病理学序説』みすず書房 3  
エルンスト・クレッチマー『医学的心理学』みすず書房 3  
中井久夫『精神科治療の覚書』(新版)日本評論社 3  
濱田秀伯『精神医学エッセンス』(第2版)弘文堂 3  
成人期の自閉症スペクトラム診療実践マニュアル 3  
カプラン精神科薬物ハンドブック 第5版 3  
ICD-10精神科診断ガイドブック 3  
科学的認知症診療 5Lessons 3  
精神科臨床144のQ & A 3  
精神症状から身体疾患を見抜く 3  
失踪日記/吾妻ひでお 3  
人間仮免中/卯月妙子 3  
精神科診断面接のコツ 3  
支持的精神療法入門 3  
精神病 笠原嘉 3  
精神科臨床ニューアプローチ (1 症候からみた精神医学2気分障害3神経症性障害とストレス関連障害4統合失調症と類縁疾患5パーソナリティ障害・摂食障害6老年期精神障害7児童期の精神医学 8睡眠障害・物質依存) 上島国利 2  
ケースでわかる! 精神科治療ガイドラインのトリセツ by EGUIDEプロジェクト 2  
中安信夫『体験を聴く・症候を読む・病態を解く』星和書店 2  
原田誠一『精神療法の工夫と楽しみ』金剛出版 2  
尾久守侑『器質か心因か』中外医学社 2  
メモリークリニック診療マニュアル 2  
軽症うつ病笠原嘉開談社現代新書 2  
縮刷版 精神医学事典 2  
TEXT精神医学 2  
ホスピタリストのための内科診療フローチャート 第2版―専門的対応が求められる疾患の診療の流れとエビデンス―. 第2版 1  
近藤伸介監訳『神経精神医学ケースブック 脳とからだの精神科』メディカル・サイエンス・インターナショナル 1  
広沢正孝『成人の高機能広汎性発達障害とアスペルガー症候群 社会に生きる彼らの精神行動特性』医学書院 1  
心の健康問題により休業した労働者の職場復帰支援の手引き~メンタルヘルス対策における職場復帰支援~ 1  
八木剛平、田辺英『精神病治療の開発思想史 ネオヒポクラティズムの系譜』星和書店 1  
安永浩『精神科医のものの考え方 私の臨床経験から』金剛出版 1  
新版精神保健福祉法講義第3版(大谷實、成文堂) 1  
村松太郎『統合失調症当事者の症状論』中外医学社 1  
精神医学ハンドブック医学・保健・福析の基礎 1  
急性中毒診療レジデントマニュアル 第2版 1  
精神・心理症状学ハンドブック[第2版] 1  
DSM-5診断面接ポケットマニュアル 1  
新版 精神療法家の仕事―面接と面接者 1  
精神科臨床Q&A for ビギナーズ 1  
援助者必携はじめての精神科 1  
もったいない患者対応 1  
ガダラの豚 1  

gtsave(data = html_table_2, "html_table_2.html") # htmlで保存(推奨)
gtsave(data = html_table_2, "html_table_2.pdf") # pdfで保存

年代ごとに集計する

今度は、今回集計した age 列を活用してみます。group_by() に bookとageの2つを入力することで、ageとbookについて集計する事ができます。

dat3 <- dat1 %>% # 以下の操作をdat3に渡す
  group_by(book, age) %>% # bookとageについてグループ化
  summarise(count = n(), # book, ageについて個数を count列に挿入する
            .groups="drop") # グループ化 の解除

dat3

並び順を先程作成した dat2 と一緒にします。right_join() を使って、データを突合(merge)することができます。先程作成したdat2の並び順 (rowname) をdat3に突合します。

dat3 <- dat2 %>% #以下の操作をdat3に渡す
  select(rowname, book) %>% # dat2 のrowname, book 列を抽出
  right_join(., dat3) # 抽出したものを dat3 と突合
Joining, by = "book"
dat3 # dat3 の表示

先程と同様にして、見やすさのために、本の文字数を20文字にします。

titlename <- dat3 %>% # titlenameの作成
  pull(book) %>% # book列のベクトルを取り出す
  str_sub(start = 1, end = 20)  # 最初の20文字を抽出
dat3 <- cbind(dat3, titlename) # dat3 にtitlenameを追加

年代ごとの棒グラフを図示

先程完成した棒グラフ make_graph() を使ってみます。

h1 <- dat3 %>% # 以下の操作をh1に渡す
  make_graph() # make_graph関数の実行

h1 # h1の表示

このままだと、book列が併せて集計されたままになるので、facet_wrap()を使って、年代ごとに分けて表示します。

h2 <- # 以下の操作をh2に渡す
  h1 + facet_wrap(age ~ .)  # h1 を年代ごとに分ける

h2 # h2の表示

図の保存

ここまでで作成した図をggsave()を使って、論文投稿でよく使う形式である .tiffとして保存します。dpi = 300 とすることで、dpiを設定できます。compression = "lzw" を入れることで、サイズを大幅に圧縮して保存することも可能です。

ggsave(plot = g3, # オブジェクトの指定
       filename = "figure1.tiff", # ファイル名
       width = 10, # 幅 10 inch 
       height = 15, # 縦 15 inch
       dpi =300, # dpi 300
       compression = "lzw") # 圧縮の選択

ggsave(plot = g4, filename = "figure1_sub1.tiff", width = 10, height = 15, dpi =300, compression = "lzw")
ggsave(plot = g5, filename = "figure1_sub2.tiff", width = 10, height = 15, dpi =300, compression = "lzw")
ggsave(plot = h2, filename = "figure2.tiff", width = 10, height = 15, dpi =300, compression = "lzw")

pdfで保存することもできます。

ggsave(plot = g3, filename = "figure1.pdf",  device = cairo_pdf, width = 10, height = 15, dpi =300)
ggsave(plot = h2, "figure2.pdf",  device = cairo_pdf, width = 10, height = 15, dpi =300)

コメント欄

コメント欄をarrange()で文字数の多い順に並べたあと、select()で抜き出して表示します。

t1 <- dat %>% # 以下の操作を t1 に渡す
  arrange(desc(str_length(comment))) %>% # 文字数の多い順に並べる 
  select(comment) %>% # comment列の選択
  na.omit() # 欠損値のある行を削除

t1 # t1の表示

自由記載の場合は、ある程度形式を整える必要があるときがあります。str_replace() を使って、文字を置換していきます。

t1 <- t1 %>% # 以下の操作をt1に渡す
  pull(comment) %>% # comment列についてベクトルを抜き出す
  str_replace( # 文字の置換
    pattern=" https://.*", # http://以下 を 
    replacement="") %>%  # 削除
  tibble() %>% # ベクトルを表(tibble)形式へ
  rename("他のおすすめ本" = ".") # 列名の設定

t1 # t1 の表示

たとえば、2行目の「精神力動学的精神医学(グレン.O.ギャバード)、神経症状の診かた、考え方(福武敏夫)」は、2つの書籍情報が入っています。分割するのに、いろいろな方法があります。最初に使った separate() で「、」で分割したのちに縦長データへする方法もありますが、今回は少し力技で行きます。t1[-2,]で2行目を取り除いたものに、rbind()“精神力動学的精神医学(グレン.O.ギャバード)”と、“神経症状の診かた、考え方(福武敏夫)”を、それぞれ行に追加していきます。

t1 <- rbind( # 行結合
  t1[-2,], # t1から2行目を取り除く
  "精神力動学的精神医学(グレン.O.ギャバード)", #行の追加
  "神経症状の診かた、考え方(福武敏夫)") # 行の追加

t1 # t1の表示

同様にして今、2行目にきている行も操作します。

t1 <- rbind( # 行結合
  t1[-2,], # t1から2行目を取り除く
  "「発想の航跡」神田橋條治", #行の追加
  "「精神療法面接のコツ」神田橋條治") #行の追加

t1 # t1の表示

先ほどと同様の手法でタイトルをクリックするとGoogle検索できるようにリンクを貼っていきます。繰り返す操作は関数をつくってしまいましょう。今回は add_link という関数名にします。

# 関数の作成
add_link <- # add_linkという関数を設定
  function(book_name){ # 引数はbook_nameという書籍名のベクトル
  link_info <- # link情報のベクトルを作成
    str_c("https://www.google.com/search?q=",book_name) # 文字結合
  book_name <- cbind(book_name, link_info) %>% # 列の結合 
    data.frame() %>% # 表形式にする
    setNames(c("book_name","link_info")) %>% # 列名の設定
  mutate( # 列操作
    book_name = map2( # 以下2つの引数に対して ~ 以下の処理を実行する
      book_name, link_info, # book_name, link_info 列について
      ~ .x %>% htmltools::a( # book_name(.x) に以下の a属性を与える
        href = .y, # link_info(.y) のリンク情報を与える
        target = "_blank")), # リンクには新規タブを開いてジャンプする
    book_name = map( # 以下1つの引数に対して ~ 以下の処理を実行する
      book_name, # book_name列に対して
      ~ gt::html(as.character(.x)))) %>% # htmlの情報を反映させる
  select(-link_info)  %>% # link_info列を取り除く
  rename("書籍リスト" = book_name) %>% # 列名の変更
  gt() %>%  # gtオブジェクトへ
  cols_align(align = "left") # 左寄せ
  return(book_name) # できたbook_nameを結果として返す
  }
t2 <- t1 %>% #以下の結果をt2に返す
  pull(他のおすすめ本) %>% # 他のおすすめ本のベクトルを抽出
  add_link() # 自作したadd_link関数を使用

t2 # t2の表示

# html, pdf で保存
gtsave(data = t2, "recommed.html")
gtsave(data = t2, "recommed.pdf")

スクレイピング

今回のWeb調査から、書籍情報を取得してみようと思います。これは R の rvest パッケージを使用します。

source_url <- "https://docs.google.com/forms/d/e/1FAIpQLSeWZdSS3a0lGJ-5A4bRd40sPwxs-HycLA4v0WSBBOAumQpQmg/viewform" # URLの指定
recall_html <- read_html(source_url, encoding = "UTF-8") # 指定したURLを UTF-8で読み込む

recall_html # 読み込んだhtml情報の表示
{html_document}
<html lang="ja" class="m2">
[1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF- ...
[2] <body dir="ltr" itemscope itemtype="http://schema.org/CreativeWork/FormO ...

htmlドキュメントを読み込むことができました。このあとは、Chrome拡張のSelectorGadgetを使うと捗ります。SelectorGadgetを使って取り込みたい要素をクリックすると、“.freebirdFormviewerComponentsQuestionCheckboxHasImage , .freebirdFormviewerComponentsQuestionBaseHeader” と表示されるので、これをコピーします。簡単にいうと htmlドキュメント内の住所のようなものです。html_node() にいれることで、その要素の情報を取得することができます。

booklist <- recall_html %>% # 以下の操作をbooklistへ
  html_nodes(".freebirdFormviewerComponentsQuestionCheckboxHasImage , .freebirdFormviewerComponentsQuestionBaseHeader") %>%  # SelectorGadget で取得した情報を代入
  html_text() # テキストデータのみ抜き出す

booklist # booklistの表示
  [1] "年齢をお選びください"                                                                                                                                                                                      
  [2] "オススメ書籍はどれですか?(複数回答可)"                                                                                                                                                                  
  [3] "誤りやすい異常脳波. 第3版."                                                                                                                                                                                
  [4] "医療福祉総合ガイドブック 2020年度版"                                                                                                                                                                       
  [5] "うつ病治療ガイドライン 第2版"                                                                                                                                                                              
  [6] "カプラン精神科薬物ハンドブック 第5版"                                                                                                                                                                      
  [7] "カプラン臨床精神医学テキスト DSM-5診断基準の臨床への展開 第3版"                                                                                                                                            
  [8] "看護のための精神医学 第2版"                                                                                                                                                                                
  [9] "急性中毒診療レジデントマニュアル 第2版"                                                                                                                                                                    
 [10] "心の健康問題により休業した労働者の職場復帰支援の手引き~メンタルヘルス対策における職場復帰支援~"                                                                                                          
 [11] "こころの病を診るということ"                                                                                                                                                                                
 [12] "支持的精神療法入門"                                                                                                                                                                                        
 [13] "症例でわかる精神病理学"                                                                                                                                                                                    
 [14] "ストール精神薬理学エセンシャルズ 神経科学的基礎と応用 第4版"                                                                                                                                               
 [15] "精神科身体合併症マニュアル 第2版"                                                                                                                                                                          
 [16] "精神科診療に必要な書式マニュアル 第四版 2017年 12 月号"                                                                                                                                                    
 [17] "精神科における予診・初診・初期治療"                                                                                                                                                                        
 [18] "精神科の薬がわかる本"                                                                                                                                                                                      
 [19] "精神科臨床Q&A for ビギナーズ"                                                                                                                                                                              
 [20] "精神症候学"                                                                                                                                                                                                
 [21] "精神症状から身体疾患を見抜く"                                                                                                                                                                              
 [22] "精神診療プラチナマニュアル 第2版"                                                                                                                                                                          
 [23] "大うつ病性障害・双極性障害治療ガイドライン"                                                                                                                                                                
 [24] "治療的柔構造―心理療法の諸理論と実践との架け橋"                                                                                                                                                            
 [25] "てんかん診療ガイドライン2018"                                                                                                                                                                              
 [26] "統合失調症薬物治療ガイドライン"                                                                                                                                                                            
 [27] "認知症疾患診療ガイドライン2017"                                                                                                                                                                            
 [28] "脳波判読step by step 入門編. 第4版"                                                                                                                                                                        
 [29] "脳波判読step by step 症例編. 第4版."                                                                                                                                                                       
 [30] "不明熱・不明炎症レジデントマニュアル"                                                                                                                                                                      
 [31] "ホスピタリストのための内科診療フローチャート 第2版―専門的対応が求められる疾患の診療の流れとエビデンス―. 第2版"                                                                                           
 [32] "もったいない患者対応"                                                                                                                                                                                      
 [33] "モーズレイ処方ガイドライン 第13版 日本語版"                                                                                                                                                                
 [34] "臨床家のための実践的治療構造論"                                                                                                                                                                            
 [35] "DSM-5診断面接ポケットマニュアル"                                                                                                                                                                           
 [36] "DSM-5 精神疾患の診断・統計マニュアル"                                                                                                                                                                      
 [37] "DSM-5 精神疾患の分類と診断の手引"                                                                                                                                                                          
 [38] "DSM-5を使いこなすための臨床精神医学テキスト"                                                                                                                                                               
 [39] "ICD-10精神科診断ガイドブック"                                                                                                                                                                              
 [40] "精神病者の魂への道-ゲルトルート・シュヴィン"                                                                                                                                                               
 [41] "精神病理学臨床講義第2版"                                                                                                                                                                                   
 [42] "こころの治療薬ハンドブック 第13版"                                                                                                                                                                         
 [43] "現代臨床精神医学"                                                                                                                                                                                          
 [44] "縮刷版 精神医学事典"                                                                                                                                                                                       
 [45] "精神療法の基本: 支持から認知行動療法まで"                                                                                                                                                                  
 [46] "ケアする人も楽になる 認知行動療法入門"                                                                                                                                                                     
 [47] "認知行動療法トレーニングブック[DVD/Web動画付] 第2版"                                                                                                                                                       
 [48] "Beckの娘のジュディスの認知行動療法実践ガイド:基礎から応用まで 第2版"                                                                                                                                      
 [49] "四訂精神保健福祉法詳解(精神保健福祉研究会監修、中央法規)"                                                                                                                                                
 [50] "新版精神保健福祉法講義第3版(大谷實、成文堂)"                                                                                                                                                            
 [51] "不安とうつの統一プロトコル―診断を越えた認知行動療法ワークブック"                                                                                                                                          
 [52] "科学的認知症診療 5Lessons"                                                                                                                                                                                 
 [53] "知られていない認知症の治し方(森 悦朗)"                                                                                                                                                                   
 [54] "最新臨床睡眠学(第2版)"                                                                                                                                                                                     
 [55] "失踪日記/吾妻ひでお"                                                                                                                                                                                       
 [56] "失踪日記2アル中病棟/吾妻ひでお"                                                                                                                                                                            
 [57] "人間仮免中/卯月妙子"                                                                                                                                                                                       
 [58] "ガダラの豚"                                                                                                                                                                                                
 [59] "西丸四方、西丸甫夫『やさしい精神医学』(改訂5版)南山堂"                                                                                                                                                   
 [60] "西丸四方、西丸甫夫『精神医学入門』(改訂25版)南山堂"                                                                                                                                                      
 [61] "山下格『誤診のおこるとき 精神科診断の宿命と使命』みすず書房"                                                                                                                                               
 [62] "古茶大樹『臨床精神病理学 精神医学における疾患と診断』日本評論社"                                                                                                                                           
 [63] "中安信夫『精神科臨床を始める人のために 精神科臨床診断の方法』星和書店"                                                                                                                                     
 [64] "中安信夫『体験を聴く・症候を読む・病態を解く』星和書店"                                                                                                                                                    
 [65] "クラウス・コンラート『分裂病のはじまり』岩崎学術出版社"                                                                                                                                                    
 [66] "中井久夫『精神科治療の覚書』(新版)日本評論社"                                                                                                                                                            
 [67] "中井久夫『最終講義 分裂病私見』みすず書房"                                                                                                                                                                 
 [68] "クルト・シュナイダー『臨床精神病理学序説』みすず書房"                                                                                                                                                      
 [69] "鹿島晴雄他『妄想の臨床』新興医学出版社"                                                                                                                                                                    
 [70] "広沢正孝『成人の高機能広汎性発達障害とアスペルガー症候群 社会に生きる彼らの精神行動特性』医学書院"                                                                                                         
 [71] "宮岡等、内山登紀夫『大人の発達障害ってそういうことだったのか』医学書院"                                                                                                                                    
 [72] "濱田秀伯『精神医学エッセンス』(第2版)弘文堂"                                                                                                                                                             
 [73] "原田憲一『精神症状の把握と理解(精神医学の知と技)』中山書店"                                                                                                                                              
 [74] "原田誠一『精神療法の工夫と楽しみ』金剛出版"                                                                                                                                                                
 [75] "近藤伸介監訳『神経精神医学ケースブック 脳とからだの精神科』メディカル・サイエンス・インターナショナル"                                                                                                     
 [76] "尾久守侑『精神症状から身体疾患を見抜く』金芳堂"                                                                                                                                                            
 [77] "尾久守侑『器質か心因か』中外医学社"                                                                                                                                                                        
 [78] "村松太郎『統合失調症当事者の症状論』中外医学社"                                                                                                                                                            
 [79] "竹中星郎『老いの心と臨床』みすず書房"                                                                                                                                                                      
 [80] "八木剛平、田辺英『精神病治療の開発思想史 ネオヒポクラティズムの系譜』星和書店"                                                                                                                             
 [81] "安永浩『精神科医のものの考え方 私の臨床経験から』金剛出版"                                                                                                                                                 
 [82] "エルンスト・クレッチマー『医学的心理学』みすず書房"                                                                                                                                                        
 [83] "クルト・シュナイダー『臨床精神病理学』(原著第15版)文光堂"                                                                                                                                                
 [84] "カール・ヤスパース『精神病理学原論』みすず書房"                                                                                                                                                            
 [85] "内村祐之『精神医学の基本問題 精神病と神経症の構造論の展望』(復刻版)創造出版"                                                                                                                             
 [86] "改訂版予診・初診・初期治療笠原診療新社"                                                                                                                                                                    
 [87] "改訂版精神療法の第一歩成田善弘診療新社"                                                                                                                                                                    
 [88] "改訂版意識障害を診わける"                                                                                                                                                                                  
 [89] "精神病 笠原嘉"                                                                                                                                                                                             
 [90] "軽症うつ病笠原嘉開談社現代新書"                                                                                                                                                                            
 [91] "精神・心理症状学ハンドブック[第2版]"                                                                                                                                                                       
 [92] "援助者必携はじめての精神科"                                                                                                                                                                                
 [93] "精神科・治療と看護のエッセンス"                                                                                                                                                                            
 [94] "精神衛生を始める人の100カ条"                                                                                                                                                                               
 [95] "すべての診療科で役立つ精神科必修ハンドブックー外来や病棟でよく出会う精神症状・疾患への対応"                                                                                                                
 [96] "Primary Care Note うつ病"                                                                                                                                                                                  
 [97] "精神科臨床ニューアプローチ (1 症候からみた精神医学2気分障害3神経症性障害とストレス関連障害4統合失調症と類縁疾患5パーソナリティ障害・摂食障害6老年期精神障害7児童期の精神医学 8睡眠障害・物質依存) 上島国利"
 [98] "神経科精神科卒後研修マニュアル(第1部 基本コース)"                                                                                                                                                          
 [99] "神経科精神科卒後研修マニュアル(第2部疾患別治療ガイドライン)"                                                                                                                                               
[100] "精神医学ハンドブック医学・保健・福析の基礎"                                                                                                                                                                
[101] "精神医学レビューシリーズ"                                                                                                                                                                                  
[102] "精神科ポケット辞典"                                                                                                                                                                                        
[103] "ケースでわかる! 精神科治療ガイドラインのトリセツ by EGUIDEプロジェクト"                                                                                                                                    
[104] "脳波判読オープンキャンパス 誰でも学べる7STEP"                                                                                                                                                              
[105] "ポケット臨床脳波"                                                                                                                                                                                          
[106] "今日の精神疾患治療指針 第2版"                                                                                                                                                                              
[107] "精神・心理機能評価ハンドブック"                                                                                                                                                                            
[108] "メモリークリニック診療マニュアル"                                                                                                                                                                          
[109] "精神科臨床144のQ & A"                                                                                                                                                                                      
[110] "精神科リハビリテーションワークブック"                                                                                                                                                                      
[111] "健康ライブラリーシリーズ"                                                                                                                                                                                  
[112] "摂食障害―食べない、食べられない、食べたら止まらない"                                                                                                                                                      
[113] "医学論文のための統計手法の選び方・使い方"                                                                                                                                                                  
[114] "今日の治療薬2021: 解説と便覧"                                                                                                                                                                              
[115] "精神科レジデントマニュアル"                                                                                                                                                                                
[116] "新版 精神療法家の仕事―面接と面接者"                                                                                                                                                                       
[117] "成人期の自閉症スペクトラム診療実践マニュアル"                                                                                                                                                              
[118] "精神科診断面接のコツ"                                                                                                                                                                                      
[119] "TEXT精神医学"                                                                                                                                                                                              
[120] "他のオススメ本"                                                                                                                                                                                            

1,2 行目と120行目はいらないようなので抜き出します。その後に、これまでと同様Google検索リンクをつけて表示します。

booklist <- booklist[-1:-2] #1,2行目を抜き出す
booklist <- booklist[-118] #120から2行取り除いたので118が該当行

t3 <- booklist %>% # 以下の結果をt3に返す
  add_link() # 自作したadd_link関数を使用する

t3 # t3の表示
書籍リスト
誤りやすい異常脳波. 第3版.
医療福祉総合ガイドブック 2020年度版
うつ病治療ガイドライン 第2版
カプラン精神科薬物ハンドブック 第5版
カプラン臨床精神医学テキスト DSM-5診断基準の臨床への展開 第3版
看護のための精神医学 第2版
急性中毒診療レジデントマニュアル 第2版
心の健康問題により休業した労働者の職場復帰支援の手引き~メンタルヘルス対策における職場復帰支援~
こころの病を診るということ
支持的精神療法入門
症例でわかる精神病理学
ストール精神薬理学エセンシャルズ 神経科学的基礎と応用 第4版
精神科身体合併症マニュアル 第2版
精神科診療に必要な書式マニュアル 第四版 2017年 12 月号
精神科における予診・初診・初期治療
精神科の薬がわかる本
精神科臨床Q&A for ビギナーズ
精神症候学
精神症状から身体疾患を見抜く
精神診療プラチナマニュアル 第2版
大うつ病性障害・双極性障害治療ガイドライン
治療的柔構造―心理療法の諸理論と実践との架け橋
てんかん診療ガイドライン2018
統合失調症薬物治療ガイドライン
認知症疾患診療ガイドライン2017
脳波判読step by step 入門編. 第4版
脳波判読step by step 症例編. 第4版.
不明熱・不明炎症レジデントマニュアル
ホスピタリストのための内科診療フローチャート 第2版―専門的対応が求められる疾患の診療の流れとエビデンス―. 第2版
もったいない患者対応
モーズレイ処方ガイドライン 第13版 日本語版
臨床家のための実践的治療構造論
DSM-5診断面接ポケットマニュアル
DSM-5 精神疾患の診断・統計マニュアル
DSM-5 精神疾患の分類と診断の手引
DSM-5を使いこなすための臨床精神医学テキスト
ICD-10精神科診断ガイドブック
精神病者の魂への道-ゲルトルート・シュヴィン
精神病理学臨床講義第2版
こころの治療薬ハンドブック 第13版
現代臨床精神医学
縮刷版 精神医学事典
精神療法の基本: 支持から認知行動療法まで
ケアする人も楽になる 認知行動療法入門
認知行動療法トレーニングブック[DVD/Web動画付] 第2版
Beckの娘のジュディスの認知行動療法実践ガイド:基礎から応用まで 第2版
四訂精神保健福祉法詳解(精神保健福祉研究会監修、中央法規)
新版精神保健福祉法講義第3版(大谷實、成文堂)
不安とうつの統一プロトコル―診断を越えた認知行動療法ワークブック
科学的認知症診療 5Lessons
知られていない認知症の治し方(森 悦朗)
最新臨床睡眠学(第2版)
失踪日記/吾妻ひでお
失踪日記2アル中病棟/吾妻ひでお
人間仮免中/卯月妙子
ガダラの豚
西丸四方、西丸甫夫『やさしい精神医学』(改訂5版)南山堂
西丸四方、西丸甫夫『精神医学入門』(改訂25版)南山堂
山下格『誤診のおこるとき 精神科診断の宿命と使命』みすず書房
古茶大樹『臨床精神病理学 精神医学における疾患と診断』日本評論社
中安信夫『精神科臨床を始める人のために 精神科臨床診断の方法』星和書店
中安信夫『体験を聴く・症候を読む・病態を解く』星和書店
クラウス・コンラート『分裂病のはじまり』岩崎学術出版社
中井久夫『精神科治療の覚書』(新版)日本評論社
中井久夫『最終講義 分裂病私見』みすず書房
クルト・シュナイダー『臨床精神病理学序説』みすず書房
鹿島晴雄他『妄想の臨床』新興医学出版社
広沢正孝『成人の高機能広汎性発達障害とアスペルガー症候群 社会に生きる彼らの精神行動特性』医学書院
宮岡等、内山登紀夫『大人の発達障害ってそういうことだったのか』医学書院
濱田秀伯『精神医学エッセンス』(第2版)弘文堂
原田憲一『精神症状の把握と理解(精神医学の知と技)』中山書店
原田誠一『精神療法の工夫と楽しみ』金剛出版
近藤伸介監訳『神経精神医学ケースブック 脳とからだの精神科』メディカル・サイエンス・インターナショナル
尾久守侑『精神症状から身体疾患を見抜く』金芳堂
尾久守侑『器質か心因か』中外医学社
村松太郎『統合失調症当事者の症状論』中外医学社
竹中星郎『老いの心と臨床』みすず書房
八木剛平、田辺英『精神病治療の開発思想史 ネオヒポクラティズムの系譜』星和書店
安永浩『精神科医のものの考え方 私の臨床経験から』金剛出版
エルンスト・クレッチマー『医学的心理学』みすず書房
クルト・シュナイダー『臨床精神病理学』(原著第15版)文光堂
カール・ヤスパース『精神病理学原論』みすず書房
内村祐之『精神医学の基本問題 精神病と神経症の構造論の展望』(復刻版)創造出版
改訂版予診・初診・初期治療笠原診療新社
改訂版精神療法の第一歩成田善弘診療新社
改訂版意識障害を診わける
精神病 笠原嘉
軽症うつ病笠原嘉開談社現代新書
精神・心理症状学ハンドブック[第2版]
援助者必携はじめての精神科
精神科・治療と看護のエッセンス
精神衛生を始める人の100カ条
すべての診療科で役立つ精神科必修ハンドブックー外来や病棟でよく出会う精神症状・疾患への対応
Primary Care Note うつ病
精神科臨床ニューアプローチ (1 症候からみた精神医学2気分障害3神経症性障害とストレス関連障害4統合失調症と類縁疾患5パーソナリティ障害・摂食障害6老年期精神障害7児童期の精神医学 8睡眠障害・物質依存) 上島国利
神経科精神科卒後研修マニュアル(第1部 基本コース)
神経科精神科卒後研修マニュアル(第2部疾患別治療ガイドライン)
精神医学ハンドブック医学・保健・福析の基礎
精神医学レビューシリーズ
精神科ポケット辞典
ケースでわかる! 精神科治療ガイドラインのトリセツ by EGUIDEプロジェクト
脳波判読オープンキャンパス 誰でも学べる7STEP
ポケット臨床脳波
今日の精神疾患治療指針 第2版
精神・心理機能評価ハンドブック
メモリークリニック診療マニュアル
精神科臨床144のQ & A
精神科リハビリテーションワークブック
健康ライブラリーシリーズ
摂食障害―食べない、食べられない、食べたら止まらない
医学論文のための統計手法の選び方・使い方
今日の治療薬2021: 解説と便覧
精神科レジデントマニュアル
新版 精神療法家の仕事―面接と面接者
成人期の自閉症スペクトラム診療実践マニュアル
精神科診断面接のコツ
TEXT精神医学

# html, pdf で保存
gtsave(data = t3, "boolkist.html")
gtsave(data = t3, "boolkist.pdf")

重複してないものを探す

先程の表から、アンケートで選択されなかった書籍を抜き出してみます。booklistベクトルを表形式にした、list_1というデータと、アンケートのbook列を抜き出したlist_2というデータを突合します(list_3)。その際にlist_2には目印のためにmarkという名前の列を追加し、値を1に指定します。

list_1 <- booklist %>% data.frame() # booklistベクトルを表形式にする
list_2 <- dat2 %>% select(book) %>% # アンケートのbook列を抜き出す
  mutate(mark = 1) # markという名前の列を追加し、値を1にする
list_3 <- full_join(list_1,list_2, by=c("."="book")) # list_1とlist_2の突合

list_3 #list_3の表示

これで、選択されなかった書籍は mark列が欠損値 NA となりました。filter()で、mark列が欠損値である行を抜き出せば、アンケートで選択された書籍は除いたものを抽出することができます。

list_3 <- list_3 %>% filter(is.na(mark)) # mark列が欠損値である行を抽出
list_4 <- list_3 %>% pull(".") # 書籍名のある . 列 ベクトルを抜き出す

t4 <- list_4 %>% # 以下の結果をt4に渡す
  add_link() # 自作したadd_link関数の使用

t4 # t4 の表示

# html, pdf で保存
gtsave(data = t4, "boolkist2.html")
gtsave(data = t4, "boolkist2.pdf")

最後に

今回のpdfなどの結果はこちらからダウンロードできます。pdfをこれまで gtsave() で作成し保存してきましたが、実のところ現在の仕様だと細かい設定ができません。そのため、html ファイルで保存したものを、ブラウザの印刷→pdfで保存の機能作成したpdfを配布用として作成しています。

今回行った解析は以上です。なるべくシンプルにしたかったのですが、ところどころ複雑で読みづらいコードになっている箇所があったと思います。少しでもRに興味を持っていただけたら嬉しいです。

ご意見や質問等あれば、お問い合わせや、twitter からお気軽にご連絡ください。

最後までお読みいただきありがとうございました。

LS0tCnRpdGxlOiAi57K+56We56eR5b6M5pyf56CU5L+u44GK44GZ44GZ44KB5pu457GNIgphdXRob3I6ICdhdXRob3I6IFtzaG9laTA1XShodHRwczovL3BsYXphLnVtaW4uYWMuanAvc2hvZWkwNS8pe3RhcmdldD0iX2JsYW5rIn0nCmRhdGU6ICdkYXRlOiAyMDIxLzA2LzA2JwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogY2VydWxlYW4KICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDogeWVzCiAgICBkZl9wcmludDogcGFnZWQKc3VidGl0bGU6IOiqreOBv+i+vOOBv+OBi+OCieWPr+imluWMluOBvuOBpwotLS0KClsqKueyvuelnuenkeW+jOacn+eglOS/ruOBruOBiuOBmeOBmeOCgeabuOexjeOCouODs+OCseODvOODiCoqXShodHRwczovL3BsYXphLnVtaW4uYWMuanAvc2hvZWkwNS93cC9pbmRleC5waHAvMjAyMS8wNi8wNi8yMDk5Lyl7dGFyZ2V0PSJfYmxhbmsifSDjgaflj47pm4bjgZfjgZ/jg4fjg7zjgr/jgavjgaTjgYTjgabjgIFjc3bjg5XjgqHjgqTjg6vjga7oqq3jgb/ovrzjgb/jg7vjg4fjg7zjgr/jgq/jg6rjg7zjg4vjg7PjgrDjg7vlm7PnpLrjgb7jgafjgpJS44Gn6Kej5p6Q44GX44G+44GX44Gf44CC44GT44Gu5paH56ug44GvIFIgTm90ZWJvb2vjgafkvZzmiJDjgZfjgabjgYTjgb7jgZnjgIIqKuOCs+ODvOODieOBr+WPs+S4iuOBriBDT0RF44GL44KJ44OA44Km44Oz44Ot44O844OJKirjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKCuOBk+OBruOCs+ODvOODieiHquS9k+OBr+ikh+mbkeOBquaTjeS9nOOCguWQq+OBvuOCjOOBpuOBhOOBvuOBmeOAguOBqeOBruOCiOOBhuOBquaTjeS9nOOCkuOBl+OBpuOBhOOCi+OBi+OAgeOBquOCi+OBueOBj+iqreOBv+OChOOBmeOBhOOCiOOBhuOBq+ijnOi2s+OCkuOBpOOBkeOBquOBjOOCieOCs+ODvOODieiomOi8ieOBl+OBpuOBhOOBvuOBmeOAguWIneOCgeOBplLjga7jgrPjg7zjg4njgpLopovjgovmlrnjgoLjgIzjgZPjga7jgojjgYbjgarmk43kvZzjgpLjgZfjgabjgYTjgovjga7jgYvjgI3jgajoiIjlkbPjgpLmjIHjgaPjgabjgYTjgZ/jgaDjgZHjgZ/jgonlrInjgZfjgYTjgafjgZnjgIIKCuOBvuOBmlLjgpLli4nlvLfjgZnjgovjgavjga/jgIEyMDIx5bm0NeaciOOBq+aUueiogjLniYjjgYzlh7rjgZ/jgZPjgaHjgonjgYzjgYrjgZnjgZnjgoHjgafjgZnjgIIK5p2+5p2R5YSq5ZOJLCDmua/osLfllZPmmI4sIOe0gOODjuWumuS/neekvCwg5YmN55Sw5ZKM5a+bLiDmlLnoqIIy54mIIFLjg6bjg7zjgrbjga7jgZ/jgoHjga5SU3R1ZGlvW+Wun+i3tV3lhaXploDjgJx0aWR5dmVyc2Xjgavjgojjgovjg6Ljg4Djg7PjgarliIbmnpDjg5Xjg63jg7zjga7kuJbnlYwuIOaKgOihk+ipleirluekvjsgMjAyMS4gCltodHRwczovL3d3dy5hbWF6b24uY28uanAvZHAvQjA5NVc1RzhLQl0oaHR0cHM6Ly93d3cuYW1hem9uLmNvLmpwL2RwL0IwOTVXNUc4S0Ipe3RhcmdldD0iX2JsYW5rIn0KCiMg44Ki44Oz44Kx44O844OI5YaF5a65Cgrku4rlm57jga7jgqLjg7PjgrHjg7zjg4jjga9b44GT44Gh44KJXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNlV1pkU1MzYTBsR0otNUE0YlJkNDBzUHd4cy1IeWNMQTR2MFdTQkJPQXVtUXBRbWcvdmlld2Zvcm0pe3RhcmdldD0iX2JsYW5rIn3jgYvjgonnorroqo3jgafjgY3jgb7jgZnjgILlubTpvaLjgpLpgbjjgbbmip7kuIDlvI/os6rllY/jgIHjgYrjgZnjgZnjgoHmm7jnsY3jga7opIfmlbDpgbjmip7lvI/os6rllY/jgIHjgZ3jga7ku5bjgYrjgZnjgZnjgoHmm7jpoZ7jgpLpgbjjgbboh6rnlLHoqJjovInlvaLlvI/os6rllY/jga4z44Gk44Gr44Gk44GE44Gm5YiG5p6Q44GX44Gm44GE44GN44G+44GZ44CCCgojIOWIneacn+ioreWumiAKClLjgpLlp4vjgoHjgovjgajjgY3jga/jgIHjgZ3jga7pg73luqbkvb/nlKjjgZnjgovpgZPlhbfvvIjjg5Hjg4PjgrHjg7zjgrjvvInjgpLpgbjmip7jgZnjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgILku4rlm57jga/ku6XkuIvjga7jg5Hjg4PjgrHjg7zjgrjjgpLliKnnlKjjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjgafjga8gYGluc3RhbGwucGFrZWdlcygpYCDjgoQgYGxpYnJhcnkoKWAg44Go44GE44GG44Kz44O844OJ44GM44GC44KK44G+44GZ44GM44CBIGBwYWNtYW46OnBfbG9hZCgpYCDjgpLopprjgYjjgabjgYrjgY/jgajkvr/liKnjgafjgZnjgIJgaW5zdGFsbC5wYWtlZ2VzKClgIOOChCBgbGlicmFyeSgpYCDjgpLnvoXliJfjgZnjgovjgZPjgajjgarjgY/jgIFgcGFjbWFuOjpwX2xvYWQoKWAg44Gu5LiA6KGM44Gn44K544Oe44O844OI44Gr6KiY6LyJ44GZ44KL44GT44Go44GM44Gn44GN44G+44GZ44CCCgpgcGFjbWFuYOOBq+OBpOOBhOOBpuOBr1vjgZPjgaHjgoldKGh0dHBzOi8vcGxhemEudW1pbi5hYy5qcC9zaG9laTA1L3dwL2luZGV4LnBocC8yMDIwLzEwLzI0LzE0NS8pe3RhcmdldD0iX2JsYW5rIn3jga7oqJjkuovjgpLjgZTlj4LnhafjgY/jgaDjgZXjgYTjgIIKCuOCs+ODvOODieOBruS4reOBqyBgI2Ag44Gn6KiY6LyJ44GZ44KL44Go44Kz44Oh44Oz44OI44Go44GX44Gm6KqN6K2Y44GV44KM44G+44GZ44CC44Kz44O844OJ44Gu5a6f6KGM44Gr5b2x6Z+/44GZ44KL44GT44Go44Gq44GP44CB44Kz44Oh44Oz44OI44KS5q6L44GZ44GT44Go44GM44Gn44GN44G+44GZ44CCCgpgYGB7cn0KaWYgKCFyZXF1aXJlKCJwYWNtYW4iKSkgaW5zdGFsbC5wYWNrYWdlcygicGFjbWFuIikKcGFjbWFuOjpwX2xvYWQoCiAgdGlkeXZlcnNlLCAgI1Ljgafjg4fjg7zjgr/lh6bnkIbjg7vop6PmnpDjgpLjgZnjgovjgZ/jgoHjga7kvr/liKnjgarjg5Hjg4PjgrHjg7zjgrjnvqQKICBndCwgICAgICAgICAj6KaL5qCE44GI44Gu6Imv44GE6KGo44KS5L2c44KL44Gf44KB44Gu44OR44OD44Kx44O844K4CiAgZ3RzdW1tYXJ5LCAgI2d044Gu5ouh5by144Gn44CB5Z+656SO57Wx6KiI44Gq44Gp44Gu6ZuG6KiI44KS57Ch5Y2Y44Gr6KGM44GG44OR44OD44Kx44O844K4CiAgcnZlc3QgICAgICAgI+OCpuOCp+ODluOCueOCr+ODrOOCpOODlOODs+OCsOOCkuWPr+iDveOBq+OBmeOCi+ODkeODg+OCseODvOOCuAogICkKYGBgCgojIOODh+ODvOOCv+OBruiqreOBv+i+vOOBvyAKCmByZWFkX2NzdigpYCDjgacgLmNzdiDjg5XjgqHjgqTjg6vjgpLoqq3jgb/ovrzjgb/jgb7jgZnjgILoqq3jgb/jgZPjgpPjgaAgLmNzdiDjg5XjgqHjgqTjg6vjgpIgPC0g44GnIGRhdCDjgajlkI3liY3jgpLjgaTjgZHjgb7jgZnjgILku4rlm57liIbmnpDjgavkvb/nlKjjgZfjgZ8uY3N244OV44Kh44Kk44Or44Gv44GvW+OBk+OBoeOCiV0oaHR0cHM6Ly9wbGF6YS51bWluLmFjLmpwL3Nob2VpMDUvd3Avd3AtY29udGVudC91cGxvYWRzLzIwMjEvMDYvbGlzdF8yMTA2MDYuY3N2KXt0YXJnZXQ9Il9ibGFuayJ944GL44KJ44OA44Km44Oz44Ot44O844OJ44GX44Gm44GP44Gg44GV44GE44CCCgpgYGB7cn0KZGF0IDwtIHJlYWRfY3N2KCIuLi9tYXRlcmlhbHMvbGlzdF8yMTA2MDYuY3N2IikgIyBjc3bjg5XjgqHjgqTjg6vjga7oqq3jgb/ovrzjgb8KYGBgCgpgYGAKZGF0CmBgYArjgajlhaXlipvjgZnjgovjgZPjgajjgafjgIHoqq3jgb/ovrzjgpPjgaAgY3N2IOODleOCoeOCpOODq+OCkuihqOekuuOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoKYGBge3J9CmRhdCAjIGRhdOOCkuihqOekugpgYGAKCiMg5YiX5ZCN44Gu5aSJ5pu0CgrliJflkI3jgaDjgZHjgpLopovjgZ/jgYTloLTlkIjjga/jgIEgYG5hbWVzKClgIOOCkuS9v+OBhOOBvuOBmeOAgiDjg5HjgqTjg5fmvJTnrpflrZAgYCU+JWAg44KS5L2/44Gj44GmIGBkYXRgIOOBq+e2muOBkeOBpuWFpeWKm+OBmeOCi+OBqOOAgeOBneOBruaMh+WumuOBruWHpueQhuOCkue2muOBkeOBpuihjOOBhuOBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgiBSU3R1ZGlv44Gn44GvYFNoaWZ0ICsgQ3RybCjijJgpICsgTWDjgaflhaXlipvjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKCmBgYHtyfQpkYXQgJT4lIG5hbWVzKCkgIyDliJflkI3jga7ooajnpLoKYGBgCgpyZW5hbWUoKSDjgpLkvb/jgaPjgabmibHjgYTjgoTjgZnjgYTliJflkI3jgavlpInmm7TjgZfjgabjgYrjgY3jgb7jgZnjgIJgZGF0ICU+JSByZW5hbWUoKWDjga7kuIDpgKPjga7lh6bnkIbjga7ntZDmnpzjgpIgYGRhdCA8LSBgIOOBqOOBl+OBpuOAgSBgZGF0YCDjgavntZDmnpzjgpLlj43mmKDjgZfjgb7jgZnjgIJgZGF0IDwtIGAg44Gu6YOo5YiG44KSYGRhdDEgPC0gYCDjgarjganliKXjga7lkI3liY3jgavjgZfjgZ/loLTlkIjjga/jgIFgZGF0MWAg44Gr44Gd44Gu57WQ5p6c44GM5Y+N5pig44GV44KM44G+44GZ44CCCgpgYGB7cn0KZGF0IDwtIGRhdCAlPiUgIyDku6XkuIvjga7mk43kvZzjgpIgZGF044Gr5rih44GZCiAgcmVuYW1lKGFnZSA9ICLlubTpvaLjgpLjgYrpgbjjgbPjgY/jgaDjgZXjgYQiLAogICAgICAgICBib29rID0gIuOCquOCueOCueODoeabuOexjeOBr+OBqeOCjOOBp+OBmeOBi++8n++8iOikh+aVsOWbnuetlOWPr++8iSIsCiAgICAgICAgIGNvbW1lbnQgPSAi5LuW44Gu44Kq44K544K544Oh5pysIikgIyDliJflkI3jga7lpInmm7QKYGBgCgojIOWIl+OBruaKveWHugoK5b+F6KaB44Gu54Sh44GE5YiX44KSIGBzZWxlY3QoKWAg44Gn6YG45oqe44GX44Gm5aSW44GX44G+44GZ44CC5aSW44GX44Gf44GE5YiX5ZCN44KSIGAtYCDjgafpgbjmip7jgZfjgb7jgZnjgILooYzjga7nlarlj7fjgpIgYHJvd25hbWVzX3RvX2NvbHVtbigpYCDjgafov73liqDjgZfjgb7jgZnjgILjgZPjgozjgpIgYGRhdDFgIOOBqOOBl+OBvuOBmeOAgmBjb21tZW505YiXYOOBr+OBguOBqOOBrumbhuioiOOBq+OBqOOBo+OBpuOBiuOBjeOAgeOBk+OCjOOBi+OCieOBruaTjeS9nOOBq+S4jeimgeOBquOBruOBp+WkluOBl+OBpuOBiuOBjeOBvuOBmeOAggoKYGBge3J9CmRhdDEgPC0gZGF0ICU+JSAj5Lul5LiL44Gu5pON5L2c44KSZGF0MeOBq+a4oeOBmQogIHNlbGVjdCgtVGltZXN0YW1wLCAtY29tbWVudCkgJT4lICMgVGltZXN0YW1wLCBjb21tZW50IOWIl+OCkumZpOWklgogIHJvd25hbWVzX3RvX2NvbHVtbigpICMg6KGM55Wq5Y+344KS6L+95YqgCgpkYXQxICNkYXQx44KS6KGo56S6CmBgYAoK5pyA5Yid44Gr5q+U44G544Gm5b+F6KaB44Gq5YiX44GM5oq95Ye644Gn44GN44CB44GZ44Gj44GN44KK44Go44GX44G+44GX44Gf44CCCgojIOWfuuekjue1seioiOOBrueul+WHugoKYGd0c3VtbWFyeWAg44OR44OD44Kx44O844K444KS44Gk44GL44Gj44Gm44CB44GT44Gu44OH44O844K/44Gu54m55b6044KS44G/44Gm44GE44GN44G+44GZ44CCYHNlbGVjdCgpYOOBpyBhZ2XliJfjgpLpgbjmip7lvozjgasgYGd0c3VtbWFyeWAg44Gu5LiA44Gk44Gu5qmf6IO944Gn44GC44KLIGB0Ymxfc3VtbWFyeSgpYCAo44Gp44Gu44OR44OD44Kx44O844K444Gu44Kz44Oe44Oz44OJ44Gn44GC44KL44GL44KS5piO56S644GX44Gf5pu444GN5pa544Gn44CBIGBndHN1bW1hcnk6OnRibF9zdW1tYXJ5KClgIOOBqOihqOiomOOBmeOCi+aWueazleOCguOBguOCiuOBvuOBmSkg44Gn6ZuG6KiI44GX44Gm44G/44G+44GZ44CCCgpgYGB7cn0KZGF0MSAlPiUgCiAgc2VsZWN0KGFnZSkgJT4lICMgYWdl5YiXIOOCkumBuOaKngogIHRibF9zdW1tYXJ5KCkgIyDpm4boqIgKYGBgCgrlhajkvZPjgaczMeS6uuOBruWbnuetlOiAheOBjOOBhOOBpuOAgee0hDPliIbjga4y44GMMzDku6PjgafjgYLjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZfjgZ/jgILjgZ3jgozjgZ7jgozkuIDkurrjgYLjgZ/jgorjganjga7jgY/jgonjgYTjga7mnKzjgpLpgbjjgpPjgaDjga7jgYvoqIjnrpfjgZfjgabjgb/jgb7jgZnjgIJib29r5YiX44Gr5rOo55uu44GX44Gm44CB5pys44KS6YG444KT44Gg5pWw44KS6KiI566X44GX44Gm44GE44GN44G+44GZ44CCCgpgYGB7cn0KZGF0MSAlPiUgc2VsZWN0KGJvb2spICMgYm9va+WIl+OCkumBuOaKngpgYGAKCuOBneOCjOOBnuOCjOOBruabuOexjeWQjeOBrumWk+OCkiDjgrvjg5/jgrPjg63jg7MgYDtgIOOBp+WMuuWIh+OBo+OBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAguS4gOOBpOOCgumBuOaKnuOBl+OBpuOBhOOBquOBhOWgtOWQiO+8iOODleODquODvOOCs+ODoeODs+ODiOOBoOOBkeabuOOBhOOBpuOBhOOCi+WgtOWQiO+8ieOBr2Jvb2vliJfjga/mrKDmkI3lgKQgYE5BYCDjgafjgZnjgILjgaTjgb7jgorjga/jgIEgYDtgIOOBruWAi+aVsOOBjOOCj+OBi+OCjOOBsOOAgeOBneOCjOOBqzHjgpLotrPjgZvjgbDpgbjmip7jgZfjgZ/mm7jnsY3mlbDjgajjgZfjgaboqIjnrpfjgYzjgafjgY3jgZ3jgYbjgafjgZnjgIJgc3RyX2NvdW50KClgIOOCkuS9v+OBhuOBqOebrueahOOBruWHpueQhuOBjOmBlOaIkOOBp+OBjeOBvuOBmeOAgmBtdXRhdGUoKWAg44GnIOmbhuioiOOBl+OBnyBjb3VudOWIl+OCkuS9nOaIkOOBl+OBvuOBmeOAgmBpZl9lbHNlKClgIOOBp+adoeS7tuW8j+OCkuS9nOOCiuOBvuOBmeOAguOCguOBlyBjb3VudCDliJfjgYwgTkHjgaDjgaPjgZ/jgonjgIEwIOOBq+abuOOBjeaPm+OBiOOAgU5B44Gn44Gq44GR44KM44Gw54++5Zyo44Gu5pWw44GrMeOCkui2s+OBmeOCiOOBhuOBq+eul+WHuuOBl+OBvuOBmeOAggoKYGBge3J9CmFnZV9jb3VudCA8LSBkYXQxICU+JSAj5Lul5LiL44Gu5pON5L2c44Gu57WQ5p6c44KSYWdlX2NvdW5044Gr5rih44GZCiAgbXV0YXRlKGNvdW50ID0gc3RyX2NvdW50KGJvb2ssIjsiKSkgJT4lICAjIDvjga7mlbDjgpLmlbDjgYjjgosKICBtdXRhdGUoY291bnQgPSBpZl9lbHNlKGlzLm5hKGNvdW50KSwgIyDjgoLjgZcgY291bnQg5YiX44GMIE5B44Gg44Gj44Gf44KJCiAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICMgMCDjgatjb3VudOOCkuabuOOBjeaPm+OBiOOCiwogICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrMSkpICU+JSAjIE5B44Gn44Gq44GR44KM44Gw54++5Zyo44Gu5pWw44GrMeOCkui2s+OBmQogIHNlbGVjdChhZ2UsY291bnQp44CA44CA44CA44CA44CA44CA44CA44CA44CAICAjIGFnZSwgY291bnQg5YiX44Gr44Gk44GE44Gm5oq95Ye6CgphZ2VfY291bnQgI2FnZV9jb3VudOOCkuihqOekugpgYGAKCuOBk+OCjOOBp+S4gOS6uuW9k+OBn+OCiuOAgeikh+aVsOmBuOaKnuiCouOBruizquWVj+OBq+OBqeOCjOOBoOOBkemBuOaKnuOBl+OBpuOBhOOCi+OBi+OBjOOCj+OBi+OCiuOBvuOBl+OBn+OAguOBk+OCjOOCkiBgZ3RzdW1tYXJ5Ojp0Ymxfc3VtbWFyeWDjgIDjgafooajjgavjgZfjgb7jgZnjgIJgdGJsX3N1bW1hcnkoKWDjga7kuK3jgacgYGJ5ID0gYWdlYCDjgajmjIflrprjgZnjgovjgZPjgajjgafjgIEgYWdl5YiX44Gu44Kw44Or44O844OX44GU44Go44Gr6ZuG6KiI44GZ44KL44KI44GG44Gr6Kit5a6a44Gn44GN44G+44GZ44CCCgpgYGB7cn0KYWdlX2NvdW50IDwtIGFnZV9jb3VudCAlPiUgICMg5Lul5LiL44Gu5pON5L2c44Gu57WQ5p6c44KSYWdlX2NvdW5044Gr5rih44GZCiAgdGJsX3N1bW1hcnkoYnkgPSBhZ2UpICU+JSAgICAgICAgICAgICAgIyBhZ2XliJfjga7jgrDjg6vjg7zjg5fjgZTjgajjgavpm4boqIgKICBhc19ndCgpICMgZ3Qg44Kq44OW44K444Kn44Kv44OI44Gr44GZ44KL77yI6KGo44Gu5L+d5a2Y44Gu44Gf44KB77yJCgphZ2VfY291bnQgIyBhZ2VfY291bnTjgpLooajnpLoKCmd0c2F2ZShkYXRhID0gYWdlX2NvdW50LCAiYWdlX2NvdW50Lmh0bWwiKSAjIGFnZV9jb3VudOOBruihqOOCkmh0bWzjgafkv53lrZjjgZnjgoso5o6o5aWoKQpndHNhdmUoZGF0YSA9IGFnZV9jb3VudCwgImFnZV9jb3VudC5wbmciKSAjIGFnZV9jb3VudOOBruihqOOCkiBwbmcg44Gn5L+d5a2Y44GZ44KLCmBgYAoKCiMg6KSH5pWw6YG45oqe6IKi44Gu5Zue562U5YaF5a6544KS5YCL5Yil44Gr5YiG44GR44Gm44GE44GPCgrlhYjnqIvjgoLjgYrnpLrjgZfjgZfjgZ/jgojjgYbjgavjgIFib29r5YiX44Gv6KSH5pWw6YG45oqe44GX44Gf44KC44Gu44GMICoq44K744Of44Kz44Ot44OzKDspKirjgafjgaTjgarjgYzjgaPjgabjgYTjgb7jgZnjgIIKCmBgYHtyfQpkYXQxICU+JSBzZWxlY3QoYm9vaykgIyBib29r5YiX44KS6YG45oqeCmBgYAoK44GT44KM44KS44CBIGBzZXBhcmF0ZSgpYCDjgacgKio7IOOCkuWMuuWIh+OCiuOBq+WIpeOBruWIl+OBq+WxlemWiyoq44GX44Gm44GE44GN44G+44GZ44CC5LuK5Zue44CB6YG45oqe6IKi44GMICoqMTE3KirjgYLjgovjgZ/jgoHjgIHmnIDlpKcxMjDpgbjmip7jgZfjgabjgoLlpKfkuIjlpKvjgarjgojjgYbjgavnqbrjga7jg6rjgrnjg4jjgpLmupblgpnjgZfjgb7jgZnjgIJgc3RyX2MoKWAg44Gn5paH5a2X44KS57WQ5ZCI44GZ44KL44GT44Go44GM44Gn44GN44G+44GZ44CC5L6L44GI44GwIGBzdHJfYygiYSIsICJiIilgIOOBrue1kOaenOOBryBgImFiImAg44Gn44GZ44CC5LuK5Zue44CBYDE6MTIwYCDjgajjgYTjgYYx44GL44KJMTIw44Gu6YCj57aa44GZ44KL5pWw5a2X44Gu44OZ44Kv44OI44Or44KS55So5oSP44GX44CB44OR44Kk44OX5ryU566X5a2QIGAlPiVgIOOBp2BzdHJfYygiZiIsIC4pIGDmuKHjgZnjgZPjgajjgafjgIFmMSDjgYvjgokgZjEyMOOBqOOBhOOBhjEyMOWAi+OBruaWh+Wtl+OCkuS9nOOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgiDjgZPjga7jgojjgYbjgasgYCU+JWAg5Lul5YmN44Gu57WQ5p6c44KSIGAuYCDjga7kvY3nva7jgavku6PlhaXjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKCmBgYHtyfQpjb2xfbGlzdCA8LSAxOjEyMCAlPiUgIyBjb2xfbGlzdOOBruS9nOaIkOOAgTHjgYvjgokxMjDjga7pgKPntprjgZnjgovmlbDlrZfjga7mloflrZfjg5njgq/jg4jjg6vjgpLnlKjmhI8KICBzdHJfYygiZiIsIC4pICAjIGYxIOOBi+OCiSBmMTIw44Go44GE44GGMTIw5YCL44Gu5paH5a2X44OZ44Kv44OI44Or44KS5L2c5oiQ44GZ44KL44CCCgpjb2xfbGlzdCAjIGNvbF9saXN044Gu6KGo56S6CmBgYAoKYHNlcGFyYXRlKClg44KS44Gk44GL44Gj44Gm44CB54m55a6a44Gu5paH5a2X5YiX44Gn44Gk44Gq44GM44Gj44Gf5paH5a2X44KS5YiG44GR44Gm44GE44GP44GT44Go44GM44Gn44GN44G+44GZ44CCYm9va+OBqOOBhOOBhuWIl+OBq+WvvuOBl+OBpuOAgWNvbF9saXN0IChmMeOBi+OCiWYxMjApIOOBrjEyMOWAi+OBruWIl+OCkueUqOaEj+OBl+OBpuOAgTsg44Gn5Yy65YiH44KJ44KM44Gf5paH5a2X44KS5YiG5Ymy44GX44Gm44GE44GN44G+44GZ44CCCgpgYGB7cn0KZGF0MSA8LSBkYXQxICU+JSAjIOS7peS4i+OBrue1kOaenOOCkiBkYXQxIOOBq+a4oeOBmQogIHNlcGFyYXRlKGJvb2ssICMgYm9va+OBqOOBhOOBhuWIl+OCkgogICAgICAgICAgIGludG8gPSBjb2xfbGlzdCwgIyBjb2xfbGlzdCAoZjHjgYvjgolmMTIwKSDjga4xMjDlgIvjga7liJfjgpLnlKjmhI/jgZfjgaYKICAgICAgICAgICBzZXAgPSI7IiwgIyA7IOOBp+WMuuWIh+OCieOCjOOBn+aWh+Wtl+OCkuWIhuWJsuOBl+OBpuOBhOOBjwogICAgICAgICAgIGV4dHJhID0ibWVyZ2UiKSAjIDsgMTIw5YCL5Lul5LiK44Gu57WQ5p6c44GM5Ye644Gf5aC05ZCI44Gv44CB5pyA5b6M44Gu5YiX44Gr5Yem55CG44GX44GN44KM44Gq44GL44Gj44Gf5paH5a2X44KS5q6L44GZCgpkYXQxICMgZGF0MSDjga7ooajnpLoKYGBgCgojIOe4pumVt+ODh+ODvOOCv++8iOaVtOeEtuODh+ODvOOCvywgdGlkeSBkYXRh77yJ44Gu5L2c5oiQCgrliY3lm57jgb7jgafjga7kvZzmpa3jgafmqKrplbfjga7liJfjgYzjgafjgY3jgb7jgZfjgZ/jgILjgZPjgozjgpLjgIHjg4fjg7zjgr/jgafmibHjgYTjgoTjgZnjgYTjgojjgYbjgavjgIFgcGl2b3RfbG9uZ2VyKClgIOOBp+OAgee4pumVt+OBruODh+ODvOOCv+OCu+ODg+ODiOOBq+WkieW9ouOBl+OBvuOBmeOAgmYx44GL44KJZjEyMOOBruWIl+OBq+WvvuOBl+OBpuOAgeOCguOBqOOCguOBqOOBruWIl+WQjeOCkiAiZiIg44Go44GE44GG5YiX44Gu5Lit44Gr5qC857SN44GX44CB44K744Or44Gu5YCk44KSICJib29rIiDjgajjgYTjgYbliJfjga7kuK3jgavmoLzntI3jgZfjgabjgYTjgY3jgb7jgZnjgIIKCmBgYHtyfQpkYXQxIDwtIGRhdDEgJT4lICMg5Lul5LiL44Gu57WQ5p6c44KSIGRhMSDjgavmuKHjgZkKICBwaXZvdF9sb25nZXIoICMg57im6ZW344Gu44OH44O844K/44K744OD44OI44Gr5aSJ5b2i44GZ44KLCiAgZjE6ZjEyMCwgIyBmMeOBi+OCiWYxMjDjga7liJfjgavlr77jgZfjgaYKICBuYW1lc190byA9ICJmIiwgIyDjgoLjgajjgoLjgajjga7liJflkI3jgpIgImYiIOOBqOOBhOOBhuWIl+OBruS4reOBq+agvOe0jeOBmeOCiwogIHZhbHVlc190byA9ICJib29rIikgJT4lICAjIOOCu+ODq+OBruWApOOCkiAiYm9vayIg44Go44GE44GG5YiX44Gu5Lit44Gr5qC857SN44GZ44KLCiAgZmlsdGVyKCFpcy5uYShib29rKSkgIyBib29rIOWIl+OBruWApOOBjOasoOaQjeWApCBOQSDjgafjgYLjgaPjgZ/loLTlkIjjgIHjgZ3jga7ooYzjgpLlj5bjgorpmaTjgY8KCmRhdDEgIyBkYXQxIOOBruihqOekugpgYGAKCue4pumVt+OBruODh+ODvOOCv+OBjOOBp+OBjeOBvuOBl+OBn+OAguOBk+OBruOCiOOBhuOBque4pumVt+OBruODh+ODvOOCv+OBruOBu+OBhuOBjOODh+ODvOOCv+WIhuaekOOBruims+eCueOBi+OCieOBr+OBvuOBqOOBvuOBo+OBn+aJseOBhOOChOOBmeOBj+OAgeOBk+OBruW9ouW8j+OCkiAqKuaVtOeEtuODh+ODvOOCvyh0aWR5IGRhdGEpKiog44Go5ZG844Gz44G+44GZ44CCCgojIOODh+ODvOOCv+OBrumbhuioiAoK44OH44O844K/44KS6ZuG6KiI44GX44Gm44GE44GN44G+44GZ44CCYGdyb3VwX2J5KClg44KS5L2/44Gj44Gm44CB5pys44Gu56iu6aGe5q+O44Gr6ZuG6KiI44GX44Gm44GE44GN44G+44GZ44CCYGdyb3VwX2J5KGJvb2spYOOBqOOBmeOCi+OBk+OBqOOBp+OAgWJvb2vliJfjgavjgaTjgYTjgabpm4boqIjjgZnjgovjgajlrqPoqIDjgZfjgIFgc3VtbWFyaXNlKGNvdW50ID0gbigpKSBg44GnYm9va+WIl+OBruimgee0oOOBruWAi+aVsOOCkiBjb3VudOWIl+OBq+aMv+WFpeOBl+OBpuOBhOOBjeOBvuOBmeOAggoK44Gd44Gu5b6M44Gr44CBYXJyYW5nZSgp44KS5L2/44Gj44Gm44CBMS4gY291bnQg44Gu5aSn44GN44GE6aCG44CBMi4gYm9va+OBruaWh+Wtl+aVsOOBjOWkmuOBhOmghuOAgeOBq+S4puOBueOBpuOAgeihjOeVquWPt+OCkiByb3duYW1lX3RvX2NvbHVtbigpIOOBp+aMv+WFpeOBl+OAgW11dGF0ZSgp44Gn5pW05pWw44Gr44OH44O844K/5Z6L44KS5oyH5a6a44GX44G+44GZ44CCCi0g44GT44Gu6KGM55Wq5Y+344Gv44CB5Zuz44Gu5L2c5oiQ44Gu44Go44GN44Gr5L2/55So44GX44G+44GZ44CCCgpgYGB7cn0KZGF0MiA8LSBkYXQxICU+JSAjIOS7peS4i+OBruioiOeul+ODh+ODvOOCv+OCkmRhdDLjgavmuKHjgZkKICBncm91cF9ieShib29rKSAlPiUgIyBib29r5YiX44Gr44Gk44GE44Gm6ZuG6KiI44GZ44KLKOOCsOODq+ODvOODl+WMlikKICBzdW1tYXJpc2UoY291bnQgPSBuKCksICMgYm9va+WIl+OBruimgee0oOOBruWAi+aVsOOCkiBjb3VudOWIl+OBq+aMv+WFpeOBmeOCiwogICAgICAgICAgICAuZ3JvdXBzPSJkcm9wIikgIyDjgrDjg6vjg7zjg5fljJYg44Gu6Kej6ZmkCgpkYXQyICMgZGF0MiDjga7ooajnpLoKYGBgCgrlvozjga7lm7PnpLrjga7pmpvjgavmibHjgYTjgoTjgZnjgYTjgojjgYbjgavjgIHjg4fjg7zjgr/jgpLkuKbjgbPmm7/jgYjjgb7jgZnjgIJjb3VudOOBruWkmuOBhOmghuOBq+S4puOBueOAgWNvdW5044GM5ZCM44GY5aC05ZCI44CBYm9va+OBruaWh+Wtl+aVsOOBruWkmuOBhOmghuOBq+S4puOBueOBpuOBhOOBjeOBvuOBmeOAguS4puOBueOBn+mghuOBq+ihjOeVquWPt+OCkuaMr+OCiuebtOOBl+OAgeihjOeVquWPt+OBruWIl+OCkuaVtOaVsOWApChpbnRlZ3Llnosp44Gr5aSJ5pu044GX44G+44GZ44CCbXV0YXRlKCkg44Gu5Lit44GuYGFjcm9zcygpYOOBp+aTjeS9nOOBmeOCi+WIl+WQjeOCkuaMh+WumuOBl+OAgX4g5Lul6ZmN44GuIC54IOOBq+OBneOBruaMh+WumuOBl+OBn+WIl+OCkuS7o+WFpeOBl+OBvuOBmeOAggoKYGBge3J9CmRhdDIgPC0gZGF0MiAlPiUgIyDku6XkuIvjga7ntZDmnpzjgpJkYXQy44Gr5rih44GZCiAgYXJyYW5nZShkZXNjKGNvdW50KSwgIyBjb3VudOOBruWkmuOBhOmghuOBq+S4puOBueOCiwogICAgICAgICAgZGVzYyhzdHJfbGVuZ3RoKGJvb2spKSkgJT4lICNjb3VudOOBjOWQjOOBmOWgtOWQiOOAgWJvb2vjga7mloflrZfmlbDjga7lpJrjgYTpoIbjgavkuKbjgbnjgosKICByb3duYW1lc190b19jb2x1bW4oKSAlPiUgIyDkuKbjgbnjgZ/poIbjgavooYznlarlj7fjgpLmjK/jgornm7TjgZkKICBtdXRhdGUoICPliJfmk43kvZwKICAgIGFjcm9zcyhyb3duYW1lLCAjIHJvd25hbWUg44Gu5YiX44Gr44Gk44GE44GmCiAgICAgICAgICAgfiBhcy5pbnRlZ2VyKC54KSkgIyByb3duYW1lKC54KeOCkuaVtOaVsOWApOOBq+OBmeOCiwogICAgICAgICApIAoKZGF0MiAjIGRhdDLjga7ooajnpLoKYGBgCgojIOaWh+Wtl+aVsOOCq+OCpuODs+ODiAoK44GT44Gu6KGo6Ieq5L2T44KC44Go44Gm44KC5pyJ55So44Gq44Gu44Gn44GZ44GM44CB44GT44Gu44OH44O844K/44KS5Zuz56S644GX44Gm44G/44Gf44GE44Go5oCd44GE44G+44GZ44CC44Gf44Gg44CB5Zuz56S644GZ44KL6Zqb44Gr5paH5a2X5pWw44GM6ZW344GZ44GO44KL44Go5pSv6Zqc44GM44Gn44G+44GZ44CC5paH5a2X5pWw44GvIGBuY2hhcigpYCDjgafjgqvjgqbjg7Pjg4jjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKCmBgYHtyfQpkYXQyICU+JSAjIGRhdDLjgavjgaTjgYTjgabku6XkuIvjga7mk43kvZzjgpLlrp/ooYwKICBwdWxsKGJvb2spICU+JSAjIGJvb2vliJfjgpLjg5njgq/jg4jjg6vjgajjgZfjgabmir3lh7oKICBuY2hhcigpICMg5paH5a2X5pWw44Gu6KiI566XCmBgYAoKMTA45paH5a2X44Gv5Y+v6KaW5YyW44Gu6Zqb44Gr5pSv6Zqc44GM5Ye644Gd44GG44Gn44GZ44CC5LuK5Zue44CB5Y+v6KaW5YyW44GX44Gm5YWo5L2T44KS5oqK5o+h44GZ44KL44GT44Go44GM55uu5qiZ44Gq44Gu44Gn44CB5pys44GM6KqN6K2Y44Gn44GN44KL5pyA5Yid44GuMjDmloflrZfjga7jgb/mir3lh7rjgZfjgb7jgZnjgIIgYHN0cl9zdWIoKWAg44Gn5oyH5a6a44GX44Gf44Gu5paH5a2X44KS5oq95Ye644GZ44KL44GT44Go44GM44Gn44GN44G+44GZ44CCCgpgYGB7cn0KdGl0bGVuYW1lIDwtIGRhdDIgJT4lICMg5Lul5LiL44Gu57WQ5p6c44KSIHRpdGxlbmFtZeOBq+a4oeOBmQogIHB1bGwoYm9vaykgJT4lICMgYm9va+WIl+OCkuODmeOCr+ODiOODq+OBqOOBl+OBpuaKveWHugogIHN0cl9zdWIoc3RhcnQgPSAxLCBlbmQgPSAyMCkgIyDmnIDliJ3jga7mloflrZfjgYvjgokyMOaWh+Wtl+OBvuOBp+aKveWHugoKdGl0bGVuYW1lICMgdGl0bGVuYW1l44Gu6KGo56S6CmBgYAoK44GT44KM44KSZGF0MiDjgavntZDlkIjjgZfjgabjgYTjgY3jgb7jgZnjgIJgY2JpbmQoKWDjgpLkvb/jgYTjgb7jgZnjgIIKCmBgYHtyfQpkYXQyIDwtIGNiaW5kKGRhdDIsIHRpdGxlbmFtZSkgIyBkYXQyIOOBqyB0aXRsZW5hbWUg44Gu44OZ44Kv44OI44Or44KS5YiX44Go44GX44Gm57WQ5ZCICgpkYXQyICMgZGF0MiDjga7ooajnpLoKYGBgCgoKIyDmo5LjgrDjg6njg5Xjga7lm7PnpLoKCuOBk+OCjOOBi+OCieWbs+ekuuOCkuOBl+OBpuOBhOOBjeOBvuOBmeOAgmBnZ3Bsb3QoKWAgIOOBp+OBjeOCjOOBhOOBquOCquODluOCuOOCp+OCr+ODiOOCkuS9nOaIkOOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAguS7iuWbnuOBr+OAgeajkuOCsOODqeODleOCkuS9nOaIkOOBl+OBpuOBhOOBjeOBvuOBmeOAgmBhZXMoKWDjgacgeOi7uOOCkuOAgWJvb2vliJfjgIEgeei7uOOCkiBjb3VudOWIl+OBp+aMh+WumuOBl+OBvuOBmeOAgnjou7jjga7poIbnlarjgpIgYHJlb3JkZXIoKWAg44GuIFgg44Gn5YWI56iL5L2c5oiQ44GX44GfIHJvd25hbWUg44Gu6ZmN6aCGIGBkZXNjKClgIOOBqOOBl+OBpuaMh+WumuOBl+OBvuOBmeOAggoKYGBge3J9CmcxIDwtIGRhdDIgJT4lICMg5Lul5LiL44Gu5pON5L2c44KSIGcxIOOBq+a4oeOBmQogIGdncGxvdCgpICvjgIAjIGdncGxvdCgpIOOBruWuo+iogAogIGFlcyh4ID0gcmVvcmRlcih4ID0gdGl0bGVuYW1lLCAjIHgg6Lu444GrIHRpdGxlbmFtZeOCkumBuOaKngogICAgICAgICAgICAgICAgICBYID0gZGVzYyhyb3duYW1lKSksICAjIHRpdGxlbmFtZeOCknJvd25hbWXjga7pmY3poIbjgafooajnpLoKICAgICAgeSA9IGNvdW50LCAjIHnou7jjga8gY291bnQg44KS6YG45oqeCiAgICAgIGZpbGwgPSBjb3VudCkgK+OAgCMg6Imy5aGX44KK44KSIGNvdW50IOOBq+WQiOOCj+OBm+OBpuihjOOBhgogIGdlb21fY29sKCkgIyDmo5LjgrDjg6njg5Xjga7kvZzmiJAKCmcxICMgZzEg44KS6KGo56S6CmBgYAoKeOi7uOOBruaWh+Wtl+OBjOa9sOOCjOOBpuimi+OBiOOBquOBj+OBquOBo+OBpuOBhOOBvuOBmeOAgnjou7jjga7lgr7jgY3jgpLoqr/mlbTjgZnjgovjgZPjgajjgoLjgafjgY3jgb7jgZnjgYzjgIHku4rlm57jga8gYGNvb3JkX2ZsaXAoKWAg44KS5L2/44Gj44Gm44CB57im44Go5qiq44KS5aSJ5b2i44GX44G+44GZ44CCIOWFiOeoi+S9nOaIkOOBl+OBn+OCquODluOCuOOCp+OCr+ODiCBnMSDjgasgKyDjgafntprjgY3jgpLlhaXlipvjgZnjgovjgZPjgajjgafjgIHlm7Pjga7oqK3lrprjgpLmm7jjgY3otrPjgZfjgabjgYTjgY/jgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTV9IApnMiA8LSBnMSArICMg5Lul5LiL44Gu5pON5L2c44KSIGcy44Gr5rih44GZCiAgY29vcmRfZmxpcCgpICMgeOi7uOOBqHnou7jjgpLlhaXjgozmm7/jgYjjgosKCmcyICMgZzLjga7ooajnpLoKYGBgCgp46Lu444Goeei7uOOBruS9jee9ruOCkiBgc2NhbGVfeF9kaXNjcmV0ZSgpYCwgYHNjYWxlX3lfY29udGludW91cygpYCDjgafoqr/mlbTjgZfjgb7jgZnjgIIKYHNjYWxlX2ZpbGxfY29udGludW91cygpYCDjgpLkvb/jgaPjgabjgIHku7vmhI/jga7oibLjgafjgrDjg6njg4fjg7zjgrfjg6fjg7PjgpLku5jjgZHjgabjgb/jgb7jgZnjgIJgbGFicygpYCDjgpLkvb/jgaPjgaYgeOi7uOOBqHnou7jjgpLpnZ7ooajnpLrjgavjgZfjgb7jgZnjgIJgc2NhbGVfZmlsbF9jb250aW51b3VzKClg44Gn6Imy5aGX44KK44KS44Kw44Op44OH44O844K344On44Oz44Gn5oyH5a6a44GX44G+44GZ44CCCgpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTE1fQpnMyA8LSBnMiArICMg5Lul5LiL44Gu5pON5L2c44KSZzPjgavmuKHjgZkKICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsgI3jou7jjga7kvY3nva7oqr/mlbQKICBzY2FsZV95X2NvbnRpbnVvdXMocG9zaXRpb24gPSAicmlnaHQiKSArICN56Lu444Gu5L2N572u6Kq/5pW0CiAgc2NhbGVfZmlsbF9jb250aW51b3VzKCAjIOiJsuWhl+OCiuOCkuOCsOODqeODh+ODvOOCt+ODp+ODs+OBp+aMh+WumgogICAgbG93ID0gIiNERDhBOTAiLCAjIOWwj+OBleOBhOWApOOCkiNERDhBOTAKICAgIGhpZ2ggPSAiI0JENDY3MCIpICsgIyDlpKfjgY3jgYTlgKTjgpIjREQ4QTkwCiAgbGFicyh4ID0gIiIsIHkgPSAiIikgKyAjeOi7uOOBqHnou7jjga7ooajnpLrjgpLjgarjgY/jgZkKICB0aGVtZV9taW5pbWFsKCkgKyAjIOOBmeOBo+OBjeOCiuOBl+OBn+ODhuODvOODnuOBq+WkieabtAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgIyDlh6Hkvovjga7liYrpmaQKCmczICMgZzPjga7ooajnpLoKYGBgCgojIOmWouaVsOOCkuS9nOaIkOOBmeOCiwoK44GT44KM44G+44Gn44GuIGRhdDIg5Lul6ZmN44Gu5LiA6YCj44Gu5rWB44KM44KS6Zai5pWw44Gr44GX44Gm44G/44G+44GZ44CCYGZ1bmN0aW9uKClg44Gn6Zai5pWw44KS6Lu444GZ44KL44GT44Go44GM44Gn44GN44G+44GZ44CC44OH44O844K/44Gu6ZuG6KiI44KS44CBYG1ha2VfYWdncmVnYXRlKClg44CB44Kw44Op44OV44Gu5L2c5oiQ44KS44CBYG1ha2VfZ3JhcGgoKWDjgajjgZfjgb7jgZnjgIIKCmBgYHtyfQptYWtlX2FnZ3JlZ2F0ZSA8LSAjIG1ha2VfYWdncmVnYXRl44Go44GE44GG6Zai5pWw44KS5L2c5oiQCiAgZnVuY3Rpb24oZGYpIHsgIyBkZiDjgajjgYTjgYblvJXmlbDjgpLmjIflrprjgZnjgosKICBkZiA8LSBkZiAlPiUgIyBkZuOBq+WvvuOBl+OBpuS7peS4i+OBruaTjeS9nOOCkuihjOOBhgogICAgZ3JvdXBfYnkoYm9vaykgJT4lICMgYm9va+WIl+OBq+OBpOOBhOOBpumbhuioiOOBmeOCiyjjgrDjg6vjg7zjg5fljJYpCiAgICBzdW1tYXJpc2UoY291bnQgPSBuKCksIyBib29r5YiX44Gu6KaB57Sg44Gu5YCL5pWw44KSIGNvdW505YiX44Gr5oy/5YWl44GZ44KLCiAgICAgICAgICAgICAgLmdyb3Vwcz0iZHJvcCIpICU+JSAjIOOCsOODq+ODvOODl+WMliDjga7op6PpmaQKICAgIGFycmFuZ2UoZGVzYyhjb3VudCksICMgY291bnTjga7lpJrjgYTpoIbjgavkuKbjgbnjgosKICAgICAgICAgICAgZGVzYyhzdHJfbGVuZ3RoKGJvb2spKSkgJT4lICNjb3VudOOBjOWQjOOBmOWgtOWQiOOAgWJvb2vjga7mloflrZfmlbDjga7lpJrjgYTpoIbjgavkuKbjgbnjgosKICAgIHJvd25hbWVzX3RvX2NvbHVtbigpICU+JSAjIOS4puOBueOBn+mghuOBq+ihjOeVquWPt+OCkuaMr+OCiuebtOOBmQogICAgbXV0YXRlKCAj5YiX5pON5L2cCiAgICAgIGFjcm9zcyhyb3duYW1lLCAjIHJvd25hbWUg44Gu5YiX44Gr44Gk44GE44GmCiAgICAgICAgICAgICB+IGFzLmludGVnZXIoLngpKSAjIHJvd25hbWUoLngp44KS5pW05pWw5YCk44Gr44GZ44KLCiAgICAgICkKICB0aXRsZW5hbWUgPC1kZiAlPiUgIyDku6XkuIvjga7ntZDmnpzjgpIgdGl0bGVuYW1l44Gr5rih44GZCiAgICBwdWxsKGJvb2spICU+JSAjIGJvb2vliJfjgpLjg5njgq/jg4jjg6vjgajjgZfjgabmir3lh7oKICAgIHN0cl9zdWIoc3RhcnQgPSAxLCBlbmQgPSAyMCkgIyDmnIDliJ3jga7mloflrZfjgYvjgokyMOaWh+Wtl+OBvuOBp+aKveWHugogIGRmIDwtIGNiaW5kKGRmLCB0aXRsZW5hbWUpICMgZGYg44GrIHRpdGxlbmFtZSDjga7jg5njgq/jg4jjg6vjgpLliJfjgajjgZfjgabntZDlkIgKICByZXR1cm4oZGYpICMg5pyA57WC55qE44Gr44Gn44GN44GfZGbjgpIgbWFrZV9hZ2dyZWdhdGXjgavmuKHjgZkKICB9CgptYWtlX2dyYXBoIDwtICMgbWFrZV9ncmFwaCDjgajjgYTjgYbplqLmlbDjgpLkvZzmiJAKICBmdW5jdGlvbihkZikgeyAjIGRmIOOBqOOBhOOBhuW8leaVsOOCkuaMh+WumuOBmeOCiwogIGRmICU+JQogICAgZ2dwbG90KCkgKyAjIGdncGxvdCgpIOOBruWuo+iogAogICAgYWVzKHggPSByZW9yZGVyKCB4ID0gdGl0bGVuYW1lLCAjIHgg6Lu444GrIHRpdGxlbmFtZeOCkumBuOaKngogICAgICAgICAgICAgICAgICAgICBYID0gZGVzYyhyb3duYW1lKSksICMgdGl0bGVuYW1l44KScm93bmFtZeOBrumZjemghuOBp+ihqOekugogICAgICAgIHkgPSBjb3VudCwgIyB56Lu444GvIGNvdW50IOOCkumBuOaKngogICAgICAgIGZpbGwgPSBjb3VudCkgKyAjIOiJsuWhl+OCiuOCkiBjb3VudCDjgavlkIjjgo/jgZvjgabooYzjgYYKICAgIGdlb21fY29sKCkgKyAjIOajkuOCsOODqeODleOBruS9nOaIkAogICAgY29vcmRfZmxpcCgpICsgIyB46Lu444Goeei7uOOCkuWFpeOCjOabv+OBiOOCiwogICAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArICN46Lu444Gu5L2N572u6Kq/5pW0CiAgICBzY2FsZV95X2NvbnRpbnVvdXMocG9zaXRpb24gPSAicmlnaHQiKSArICN56Lu444Gu5L2N572u6Kq/5pW0CiAgICBzY2FsZV9maWxsX2NvbnRpbnVvdXMoICMg6Imy5aGX44KK44KS44Kw44Op44OH44O844K344On44Oz44Gn5oyH5a6aCiAgICAgIGxvdyA9ICIjREQ4QTkwIiwgIyDlsI/jgZXjgYTlgKTjgpIjREQ4QTkwCiAgICAgIGhpZ2ggPSAiI0JENDY3MCIpICsgIyDlpKfjgY3jgYTlgKTjgpIjREQ4QTkwCiAgICBsYWJzKHggPSAiIiwgeSA9ICIiKSArICN46Lu444Goeei7uOOBruihqOekuuOCkuOBquOBj+OBmQogICAgdGhlbWVfbWluaW1hbCgpICsgIyDjgZnjgaPjgY3jgorjgZfjgZ/jg4bjg7zjg57jgavlpInmm7QKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgIyDlh6Hkvovjga7liYrpmaQKICB9CmBgYAoK44GT44GG44GX44Gm44CB5L2c5oiQ44GX44Gf6Zai5pWw44Gr44OH44O844K/44KS5rih44GZ44Gg44GR44Gn5ZCM5qeY44Gu5L2c5qWt44GM57mw44KK6L+U44GZ44GT44Go44GM44Gn44GN44G+44GZ44CC5LuK5Zue44Gv44OH44O844K/44GM5aSa44GE44Gf44KB44CBNeelqOS7peS4iuOBqOOAgTHnpajku6XkuIo156Wo5pyq5rqA44Gr5YiG44GR44Gm5Zuz56S644GX44Gm44G/44G+44GZ44CCCgpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwfQpnNCA8LSBkYXQxICU+JSAjIOS7peS4i+OBruaTjeS9nOOBrue1kOaenOOCkmc044Gr5rih44GZCiAgbWFrZV9hZ2dyZWdhdGUoKSAlPiUgIyBkYXQxIOOBq+WvvuOBl+OBpiDplqLmlbAgbWFrZV9hZ2dyZWdhdGUoKeOCkuihjOOBhgogIGZpbHRlcihjb3VudCA+PSA1KSAlPiUgIyDjg4fjg7zjgr/jga5jb3VudOOBjDXku6XkuIrjgpLmir3lh7oKICBtYWtlX2dyYXBoKCkgKyAjIOmWouaVsCBtYWtlX2dyYXBoKCkg44KS6KGM44GGCiAgeWxpbSgwLDE3KSAj44K544Kx44O844Or44Gu5bmF44KS5ZCI44KP44Gb44KL44Gf44KB44GrMC0xN+OBruevhOWbsuOBp+WbuuWumuOBmeOCiwoKZzQgIyBnNCDjga7ooajnpLoKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwfQpnNSA8LSBkYXQxICU+JSAjIOS7peS4i+OBruaTjeS9nOOBrue1kOaenOOCkmc044Gr5rih44GZCiAgbWFrZV9hZ2dyZWdhdGUoKSAlPiUgIyBkYXQxIOOBq+WvvuOBl+OBpiDplqLmlbAgbWFrZV9hZ2dyZWdhdGUoKeOCkuihjOOBhgogIGZpbHRlcihjb3VudCA8IDUpICU+JSAjIOODh+ODvOOCv+OBrmNvdW5044GMNeacqua6gOOCkuaKveWHugogIG1ha2VfZ3JhcGgoKSArICMg6Zai5pWwIG1ha2VfZ3JhcGgoKSDjgpLooYzjgYYKICB5bGltKDAsMTcpICPjgrnjgrHjg7zjg6vjga7luYXjgpLlkIjjgo/jgZvjgovjgZ/jgoHjgaswLTE344Gu56+E5Zuy44Gn5Zu65a6a44GZ44KLCgpnNSAjIGc1IOOBruihqOekugpgYGAKCiMgVGFibGXjgavjgZfjgabjgb/jgosKCuWFiOeoi+S9nOOBo+OBn+mbhuioiOihqOOBp+OCguOBhOOBhOOBruOBp+OBmeOBjOOAgeOBm+OBo+OBi+OBj+OBquOBruOBp+OAgeOBneOBruOBvuOBvuOCr+ODquODg+OCr+OBl+OBn+OCieabuOexjeODmuODvOOCuOOBq+mjm+OBueOCi+OCiOOBhuOBqiB0YWJsZSDjgpLkvZzmiJDjgZfjgabjgb/jgb7jgZnjgILpm4boqIjjgb7jgafntYLjgo/jgaPjgZ8gZGF0MiDjga7jg4fjg7zjgr/jgpLkvb/nlKjjgZfjgabjgYTjgY3jgb7jgZnjgIIKCmBgYHtyfQpkYXQyCmBgYAoKCmBgYHtyfQpkYXRfdGFibGUgPC0gZGF0MiAlPiUgI+S7peS4i+OBrue1kOaenOOCkmRhdF90YWJsZeOBq+a4oeOBmQogIHNlbGVjdCh0aXRsZW5hbWUsIGNvdW50LCBib29rKSAjIHRpdGxlbmFtZSwgY291bnQsIGJvb2vliJfjga7mir3lh7oKCmxpbmsgPC0gZGF0X3RhYmxlICU+JSAjIOS7peS4i+OBrue1kOaenOOCkmxpbmvjgavmuKHjgZkKICBwdWxsKGJvb2spICMgYm9va+WIl+OCkuODmeOCr+ODiOODq+OBqOOBl+OBpuWPluOCiuWHuuOBmQoKbGluayA8LSBzdHJfYyggIyDmloflrZfjga7ntZDlkIgKICAiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT0iLCAj57WQ5ZCI44GZ44KL5paH5a2XMQogIGxpbmsgIyDntZDlkIjjgZnjgovmloflrZcyIChib29r5YiX44Gu44OZ44Kv44OI44OrIGxpbmspCiAgKSAjIOe1kOWQiOOBmeOCi+aWh+WtlzMKCmRhdF90YWJsZSA8LSBjYmluZChkYXRfdGFibGUsIGxpbmspICMgZGF0X3RhYmxl44GrbGlua+WIl+OCkuaMv+WFpQoKZGF0X3RhYmxlICU+JSBzZWxlY3QobGluaykgIyBsaW5r5YiX44KS6YG45oqe44GX44Gm6KGo56S6CmBgYAoK44GT44KM44Gn5b+F6KaB44GqVVJM44KS5L2c5oiQ44GZ44KL44GT44Go44GM44Gn44GN44G+44GX44Gf44CC5LuK5Zue44Gv44CBR29vZ2xl5qSc57Si44Gr6aOb44G244KI44GG44Gr6Kit5a6a44GX44G+44GX44Gf44CC44GT44KM44KS5Y+N5pig44GZ44KL44Gf44KB44Gr44GvIGh0bWwg44GuIHRhYmxlIOOBq+OBmeOCi+W/heimgeOBjOOBguOCiuOBvuOBmeOAgmJvb2vliJfjgavkuIroqJjjga5saW5r44KS57WE44G/6L6844KA44KI44GG44Gr6Kit5a6a44GX44G+44GZ44CCYG1hcCgpYOOChCBgbWFwMigpYCDjgpLkvb/jgYbjgZPjgajjgafjgIHkuIDmi6zjgZfjgZ/liJfmk43kvZzjgYzlj6/og73jgafjgZnjgIIKCmBgYHtyfQpodG1sX3RhYmxlIDwtIGRhdF90YWJsZSAlPiUgIyDku6XkuIvjga7mk43kvZzjgpJodG1sX3RhYmxl44Gr5rih44GZCiAgbXV0YXRlKCAjIOWIl+aTjeS9nAogICAgYm9vayA9IG1hcDIoICMg5Lul5LiLMuOBpOOBruW8leaVsOOBq+WvvuOBl+OBpiB+IOS7peS4i+OBruWHpueQhuOCkuWun+ihjOOBmeOCiwogICAgICBib29rLCBsaW5rLCAjIGJvb2vliJfjgIFsaW5r5YiX44Gr5a++44GX44GmCiAgICAgIH4gLnggJT4lIGh0bWx0b29sczo6YSggIyBib29rKC54KSDjgavku6XkuIvjga4gYeWxnuaAp+OCkuS4juOBiOOCiwogICAgICAgIGhyZWYgPSAueSwgIyAueSDjga7jg6rjg7Pjgq/mg4XloLHjgpLkuI7jgYjjgosKICAgICAgICB0YXJnZXQgPSAiX2JsYW5rIikpLCAjIOODquODs+OCr+OBq+OBr+aWsOimj+OCv+ODluOCkumWi+OBhOOBpuOCuOODo+ODs+ODl+OBmeOCiwogICAgYm9vayA9IG1hcCggIyDku6XkuIsx44Gk44Gu5byV5pWw44Gr5a++44GX44GmIH4g5Lul5LiL44Gu5Yem55CG44KS5a6f6KGM44GZ44KLCiAgICAgIGJvb2ssICMgYm9va+WIl+OBq+WvvuOBl+OBpgogICAgICB+IGd0OjpodG1sKGFzLmNoYXJhY3RlcigueCkpKSkgIyBodG1s44Gu5oOF5aCx44KS5Y+N5pig44GV44Gb44KLCgpodG1sX3RhYmxlICU+JSAjIOS7peS4i+OBruaTjeS9nOOCkuWun+ihjAogIHNlbGVjdChib29rLCBjb3VudCkgJT4lICMgYm9va+WIlywgY291bnTliJfjgpLpgbjmip4KICByZW5hbWUoIuabuOexjeWQjSI9Ym9vaykgJT4lICMg5YiX5ZCN44Gu5aSJ5pu0CiAgZ3QoKSAlPiUgIyBndCDjgqrjg5bjgrjjgqfjgq/jg4jjgajjgZfjgabooajnpLoKICBjb2xzX2FsaWduKGFsaWduID0gImxlZnQiKSAjIOW3puWvhOOBm+OBq+OBmeOCiwpgYGAKCuOBk+OBruihqOOBp+OCguWNgeWIhuOBp+OBmeOBjOOAgeOBvuOBn+OAgeOBm+OBo+OBi+OBj+OBquOBruOBpyB0YWJsZSDjga7kuK3jgavmo5LjgrDjg6njg5XjgoLlhaXjgozjgabjgb/jgb7jgZnjgILkuIvoqJjjga7oqJjkuovjgpLlj4LogIPjgavjgZfjgb7jgZnjgIIKCk1vY2sgVC4gVGhlIE1vY2t1cCBCbG9nOiAxMCsgR3VpZGVsaW5lcyBmb3IgQmV0dGVyIFRhYmxlcyBpbiBSLiBQdWJsaXNoZWQgb25saW5lIFNlcHRlbWJlciA0LCAyMDIwLiBBY2Nlc3NlZCBKdW5lIDksIDIwMjEuIFtodHRwczovL3RoZW1vY2t1cC5ibG9nL3Bvc3RzLzIwMjAtMDktMDQtMTAtdGFibGUtcnVsZXMtaW4tci9dKGh0dHBzOi8vdGhlbW9ja3VwLmJsb2cvcG9zdHMvMjAyMC0wOS0wNC0xMC10YWJsZS1ydWxlcy1pbi1yLyl7dGFyZ2V0PSJfYmxhbmsifQoK44GT44GT44Gr5pu444GE44Gm44GC44KLIFsxMC4gQmFycGxvdF0oaHR0cHM6Ly90aGVtb2NrdXAuYmxvZy9wb3N0cy8yMDIwLTA5LTA0LTEwLXRhYmxlLXJ1bGVzLWluLXIvI2JhcnBsb3Qpe3RhcmdldD0iX2JsYW5rIn0g44Gr44GC44KL44CBYGJhcl9jaGFydCgpYCDjga7plqLmlbDjgpLkvb/nlKjjgZfjgb7jgZnjgIIKCmBgYHtyfQojIOmWouaVsCBiYXJfY2hhcnTjga7kvZzmiJAKYmFyX2NoYXJ0IDwtIGZ1bmN0aW9uKHZhbHVlLCBjb2xvciA9ICJyZWQiLCBkaXNwbGF5X3ZhbHVlID0gTlVMTCl7CiAgIyBDaG9vc2UgdG8gZGlzcGxheSBwZXJjZW50IG9mIHRvdGFsCiAgaWYgKGlzLm51bGwoZGlzcGxheV92YWx1ZSkpIHsKICAgIGRpc3BsYXlfdmFsdWUgPC0gIiZuYnNwOyIKICB9IGVsc2UgewogICAgZGlzcGxheV92YWx1ZSA8LSBkaXNwbGF5X3ZhbHVlCiAgfQogICMgcGFzdGUgY29sb3IgYW5kIHZhbHVlIGludG8gdGhlIGh0bWwgc3RyaW5nCiAgZ2x1ZTo6Z2x1ZSgiPHNwYW4gc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGRpcmVjdGlvbjogbHRyOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDJweDsgYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsgY29sb3I6IHtjb2xvcn07IHdpZHRoOiB7dmFsdWV9JVwiPiB7ZGlzcGxheV92YWx1ZX0gPC9zcGFuPiIpCn0KYGBgCgrlhYjnqIvkvZzmiJDjgZfjgZ/jgIFodG1sX3RhYmxlIOOBq+ajkuOCsOODqeODleOCkuWKoOOBiOOBpuOBhOOBjeOBvuOBmeOAguS7iuWbnuOCgmBtYXBg44KS5L2/55So44GX44Gm44GE44GN44G+44GZ44CC5a6M5oiQ44GX44Gf44KC44Gu44KSIGBndHNhdmUoKWAg44GnaHRtbOOBqHBkZuOBq+S/neWtmOOBl+OBvuOBmeOAggoKYGBge3J9Cmh0bWxfdGFibGVfMiA8LSBodG1sX3RhYmxlICU+JSAjIOS7peS4i+OBruaTjeS9nOOCkmh0bWxfdGFibGVfMuOBq+a4oeOBmQogIG11dGF0ZSggIyDliJfmk43kvZwKICAgIHJhbmsgPSBjb3VudC9tYXgoY291bnQpICogMTAwLCAjIOajkuOCsOODqeODleOBruOBn+OCgeOBq++8heOBp3JhbmvjgpLkvZzmiJAKICAgIHJhbmsgPSBtYXAoICMg5Lul5LiLMeOBpOOBruW8leaVsOOBq+WvvuOBl+OBpiB+IOS7peS4i+OBruWHpueQhuOCkuWun+ihjOOBmeOCiwogICAgICByYW5rLCAjIHJhbmvliJfjgavlr77jgZfjgaYKICAgICAgfiBiYXJfY2hhcnQodmFsdWUgPSAueCwgIyBiYXJfY2hhcnTplqLmlbDjgpLlrp/ooYwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiI0JENDY3MCIpKSwgIyDmo5LjgrDjg6njg5Xjga7oibLjga8gI0JENDY3MCDjgbgKICAgIHJhbmsgPSBtYXAoICMg44Gd44Gu5b6M44CB44KC44GG5LiA5bqmIG1hcCDjgpLlrp/ooYwKICAgICAgICAgICByYW5rLCAjIHJhbmvliJfjgavlr77jgZfjgaYKICAgICAgICAgICB+IGd0OjpodG1sKGFzLmNoYXJhY3RlcigueCkpKSkgJT4lICMgaHRtbOOBruaDheWgseOCkuWPjeaYoOOBleOBm+OCiwogIHNlbGVjdChib29rLCBjb3VudCwgcmFuaykgJT4lICMgYm9vaywgY291bnQsIHJhbmsg5YiX44KS6YG45oqeCiAgcmVuYW1lKCAjIOWQjeWJjeOBruWkieabtAogICAgIuabuOexjeWQjSIgPSBib29rLCAjIGJvb2sg44KS44CM5pu457GN5ZCN44CN44Gr5aSJ5pu0CiAgICAiICIgPSBjb3VudCwgIyBjb3VudCDjgpIg44K544Oa44O844K544G4CiAgICAi44CA44CA44CA44CA44CAIiA9IHJhbmspICU+JSAjIHJhbmsg44KC44K544Oa44O844K544G4IAogIGd0KCkgJT4lIyBndCDjgqrjg5bjgrjjgqfjgq/jg4jjgbgKICBjb2xzX2FsaWduKGFsaWduID0gImxlZnQiKSAjIOW3puWvhOOBmwoKaHRtbF90YWJsZV8yCgpndHNhdmUoZGF0YSA9IGh0bWxfdGFibGVfMiwgImh0bWxfdGFibGVfMi5odG1sIikgIyBodG1s44Gn5L+d5a2YKOaOqOWlqCkKZ3RzYXZlKGRhdGEgPSBodG1sX3RhYmxlXzIsICJodG1sX3RhYmxlXzIucGRmIikgIyBwZGbjgafkv53lrZgKYGBgCgojIOW5tOS7o+OBlOOBqOOBq+mbhuioiOOBmeOCiwoK5LuK5bqm44Gv44CB5LuK5Zue6ZuG6KiI44GX44GfIGFnZSDliJfjgpLmtLvnlKjjgZfjgabjgb/jgb7jgZnjgIJgZ3JvdXBfYnkoKWAg44GrIGJvb2vjgahhZ2Xjga4y44Gk44KS5YWl5Yqb44GZ44KL44GT44Go44Gn44CBYWdl44GoYm9va+OBq+OBpOOBhOOBpumbhuioiOOBmeOCi+S6i+OBjOOBp+OBjeOBvuOBmeOAggoKYGBge3J9CmRhdDMgPC0gZGF0MSAlPiUgIyDku6XkuIvjga7mk43kvZzjgpJkYXQz44Gr5rih44GZCiAgZ3JvdXBfYnkoYm9vaywgYWdlKSAlPiUgIyBib29r44GoYWdl44Gr44Gk44GE44Gm44Kw44Or44O844OX5YyWCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCAjIGJvb2ssIGFnZeOBq+OBpOOBhOOBpuWAi+aVsOOCkiBjb3VudOWIl+OBq+aMv+WFpeOBmeOCiwogICAgICAgICAgICAuZ3JvdXBzPSJkcm9wIikgIyDjgrDjg6vjg7zjg5fljJYg44Gu6Kej6ZmkCgpkYXQzCmBgYAoK5Lim44Gz6aCG44KS5YWI56iL5L2c5oiQ44GX44GfIGRhdDIg44Go5LiA57eS44Gr44GX44G+44GZ44CCYHJpZ2h0X2pvaW4oKWAgIOOCkuS9v+OBo+OBpuOAgeODh+ODvOOCv+OCkueqgeWQiChtZXJnZSnjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgILlhYjnqIvkvZzmiJDjgZfjgZ9kYXQy44Gu5Lim44Gz6aCGIChyb3duYW1lKSDjgpJkYXQz44Gr56qB5ZCI44GX44G+44GZ44CCCgpgYGB7cn0KZGF0MyA8LSBkYXQyICU+JSAj5Lul5LiL44Gu5pON5L2c44KSZGF0M+OBq+a4oeOBmQogIHNlbGVjdChyb3duYW1lLCBib29rKSAlPiUgIyBkYXQyIOOBrnJvd25hbWUsIGJvb2sg5YiX44KS5oq95Ye6CiAgcmlnaHRfam9pbiguLCBkYXQzKSAjIOaKveWHuuOBl+OBn+OCguOBruOCkiBkYXQzIOOBqOeqgeWQiAoKZGF0MyAjIGRhdDMg44Gu6KGo56S6CmBgYAoK5YWI56iL44Go5ZCM5qeY44Gr44GX44Gm44CB6KaL44KE44GZ44GV44Gu44Gf44KB44Gr44CB5pys44Gu5paH5a2X5pWw44KSMjDmloflrZfjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQp0aXRsZW5hbWUgPC0gZGF0MyAlPiUgIyB0aXRsZW5hbWXjga7kvZzmiJAKICBwdWxsKGJvb2spICU+JSAjIGJvb2vliJfjga7jg5njgq/jg4jjg6vjgpLlj5bjgorlh7rjgZkKICBzdHJfc3ViKHN0YXJ0ID0gMSwgZW5kID0gMjApICAjIOacgOWIneOBrjIw5paH5a2X44KS5oq95Ye6CmRhdDMgPC0gY2JpbmQoZGF0MywgdGl0bGVuYW1lKSAjIGRhdDMg44GrdGl0bGVuYW1l44KS6L+95YqgCmBgYAoKIyDlubTku6PjgZTjgajjga7mo5LjgrDjg6njg5XjgpLlm7PnpLoKCuWFiOeoi+WujOaIkOOBl+OBn+ajkuOCsOODqeODlSBtYWtlX2dyYXBoKCkg44KS5L2/44Gj44Gm44G/44G+44GZ44CCCgpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTE1fQpoMSA8LSBkYXQzICU+JSAjIOS7peS4i+OBruaTjeS9nOOCkmgx44Gr5rih44GZCiAgbWFrZV9ncmFwaCgpICMgbWFrZV9ncmFwaOmWouaVsOOBruWun+ihjAoKaDEgIyBoMeOBruihqOekugpgYGAKCuOBk+OBruOBvuOBvuOBoOOBqOOAgWJvb2vliJfjgYzkvbXjgZvjgabpm4boqIjjgZXjgozjgZ/jgb7jgb7jgavjgarjgovjga7jgafjgIFgZmFjZXRfd3JhcCgpYOOCkuS9v+OBo+OBpuOAgeW5tOS7o+OBlOOBqOOBq+WIhuOBkeOBpuihqOekuuOBl+OBvuOBmeOAgiAKCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTV9CmgyIDwtICMg5Lul5LiL44Gu5pON5L2c44KSaDLjgavmuKHjgZkKICBoMSArIGZhY2V0X3dyYXAoYWdlIH4gLikgICMgaDEg44KS5bm05Luj44GU44Go44Gr5YiG44GR44KLCgpoMiAjIGgy44Gu6KGo56S6CmBgYAoKIyDlm7Pjga7kv53lrZgKCuOBk+OBk+OBvuOBp+OBp+S9nOaIkOOBl+OBn+Wbs+OCkmBnZ3NhdmUoKWDjgpLkvb/jgaPjgabjgIHoq5bmlofmipXnqL/jgafjgojjgY/kvb/jgYblvaLlvI/jgafjgYLjgosgLnRpZmbjgajjgZfjgabkv53lrZjjgZfjgb7jgZnjgIJgZHBpID0gMzAwYCDjgajjgZnjgovjgZPjgajjgafjgIFkcGnjgpLoqK3lrprjgafjgY3jgb7jgZnjgIJgY29tcHJlc3Npb24gPSAibHp3ImAg44KS5YWl44KM44KL44GT44Go44Gn44CB44K144Kk44K644KS5aSn5bmF44Gr5Zyn57iu44GX44Gm5L+d5a2Y44GZ44KL44GT44Go44KC5Y+v6IO944Gn44GZ44CCCgpgYGB7cn0KZ2dzYXZlKHBsb3QgPSBnMywgIyDjgqrjg5bjgrjjgqfjgq/jg4jjga7mjIflrpoKICAgICAgIGZpbGVuYW1lID0gImZpZ3VyZTEudGlmZiIsICMg44OV44Kh44Kk44Or5ZCNCiAgICAgICB3aWR0aCA9IDEwLCAjIOW5hSAxMCBpbmNoIAogICAgICAgaGVpZ2h0ID0gMTUsICMg57imIDE1IGluY2gKICAgICAgIGRwaSA9MzAwLCAjIGRwaSAzMDAKICAgICAgIGNvbXByZXNzaW9uID0gImx6dyIpICMg5Zyn57iu44Gu6YG45oqeCgpnZ3NhdmUocGxvdCA9IGc0LCBmaWxlbmFtZSA9ICJmaWd1cmUxX3N1YjEudGlmZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDE1LCBkcGkgPTMwMCwgY29tcHJlc3Npb24gPSAibHp3IikKZ2dzYXZlKHBsb3QgPSBnNSwgZmlsZW5hbWUgPSAiZmlndXJlMV9zdWIyLnRpZmYiLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxNSwgZHBpID0zMDAsIGNvbXByZXNzaW9uID0gImx6dyIpCmdnc2F2ZShwbG90ID0gaDIsIGZpbGVuYW1lID0gImZpZ3VyZTIudGlmZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDE1LCBkcGkgPTMwMCwgY29tcHJlc3Npb24gPSAibHp3IikKYGBgCgpwZGbjgafkv53lrZjjgZnjgovjgZPjgajjgoLjgafjgY3jgb7jgZnjgIIKCmBgYHtyfQpnZ3NhdmUocGxvdCA9IGczLCBmaWxlbmFtZSA9ICJmaWd1cmUxLnBkZiIsICBkZXZpY2UgPSBjYWlyb19wZGYsIHdpZHRoID0gMTAsIGhlaWdodCA9IDE1LCBkcGkgPTMwMCkKZ2dzYXZlKHBsb3QgPSBoMiwgImZpZ3VyZTIucGRmIiwgIGRldmljZSA9IGNhaXJvX3BkZiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTUsIGRwaSA9MzAwKQpgYGAKCiMg44Kz44Oh44Oz44OI5qyECgrjgrPjg6Hjg7Pjg4jmrITjgpJhcnJhbmdlKCnjgafmloflrZfmlbDjga7lpJrjgYTpoIbjgavkuKbjgbnjgZ/jgYLjgajjgIFzZWxlY3QoKeOBp+aKnOOBjeWHuuOBl+OBpuihqOekuuOBl+OBvuOBmeOAggoKYGBge3J9CnQxIDwtIGRhdCAlPiUgIyDku6XkuIvjga7mk43kvZzjgpIgdDEg44Gr5rih44GZCiAgYXJyYW5nZShkZXNjKHN0cl9sZW5ndGgoY29tbWVudCkpKSAlPiXjgIAjIOaWh+Wtl+aVsOOBruWkmuOBhOmghuOBq+S4puOBueOCiyAKICBzZWxlY3QoY29tbWVudCkgJT4lICMgY29tbWVudOWIl+OBrumBuOaKngogIG5hLm9taXQoKSAjIOasoOaQjeWApOOBruOBguOCi+ihjOOCkuWJiumZpAoKdDEgIyB0MeOBruihqOekugpgYGAKCuiHqueUseiomOi8ieOBruWgtOWQiOOBr+OAgeOBguOCi+eoi+W6puW9ouW8j+OCkuaVtOOBiOOCi+W/heimgeOBjOOBguOCi+OBqOOBjeOBjOOBguOCiuOBvuOBmeOAgmBzdHJfcmVwbGFjZSgpYCDjgpLkvb/jgaPjgabjgIHmloflrZfjgpLnva7mj5vjgZfjgabjgYTjgY3jgb7jgZnjgIIKCmBgYHtyfQp0MSA8LSB0MSAlPiUgIyDku6XkuIvjga7mk43kvZzjgpJ0MeOBq+a4oeOBmQogIHB1bGwoY29tbWVudCkgJT4lICMgY29tbWVudOWIl+OBq+OBpOOBhOOBpuODmeOCr+ODiOODq+OCkuaKnOOBjeWHuuOBmQogIHN0cl9yZXBsYWNlKCAjIOaWh+Wtl+OBrue9ruaPmwogICAgcGF0dGVybj0i44CAaHR0cHM6Ly8uKiIsICMgaHR0cDovL+S7peS4iyDjgpIgCiAgICByZXBsYWNlbWVudD0iIikgJT4lICAjIOWJiumZpAogIHRpYmJsZSgpICU+JSAjIOODmeOCr+ODiOODq+OCkuihqCh0aWJibGUp5b2i5byP44G4CiAgcmVuYW1lKCLku5bjga7jgYrjgZnjgZnjgoHmnKwiID0gIi4iKSAjIOWIl+WQjeOBruioreWumgoKdDEgIyB0MSDjga7ooajnpLoKYGBgCiAK44Gf44Go44GI44Gw44CBMuihjOebruOBruOAjOeyvuelnuWKm+WLleWtpueahOeyvuelnuWMu+Wtpu+8iOOCsOODrOODs++8ju+8r++8juOCruODo+ODkOODvOODie+8ieOAgeelnue1jOeXh+eKtuOBruiouuOBi+OBn+OAgeiAg+OBiOaWue+8iOemj+atpuaVj+Wkq++8ieOAjeOBr+OAgTLjgaTjga7mm7jnsY3mg4XloLHjgYzlhaXjgaPjgabjgYTjgb7jgZnjgILliIblibLjgZnjgovjga7jgavjgIHjgYTjgo3jgYTjgo3jgarmlrnms5XjgYzjgYLjgorjgb7jgZnjgILmnIDliJ3jgavkvb/jgaPjgZ8gYHNlcGFyYXRlKClgIOOBp+OAjOOAgeOAjeOBp+WIhuWJsuOBl+OBn+OBruOBoeOBq+e4pumVt+ODh+ODvOOCv+OBuOOBmeOCi+aWueazleOCguOBguOCiuOBvuOBmeOBjOOAgeS7iuWbnuOBr+WwkeOBl+WKm+aKgOOBp+ihjOOBjeOBvuOBmeOAgmB0MVstMixdYOOBpzLooYznm67jgpLlj5bjgorpmaTjgYTjgZ/jgoLjga7jgavjgIFgcmJpbmQoKWDjgacgKioi57K+56We5Yqb5YuV5a2m55qE57K+56We5Yy75a2m77yI44Kw44Os44Oz77yO77yv77yO44Ku44Oj44OQ44O844OJ77yJIioq44Go44CBKioi56We57WM55eH54q244Gu6Ki644GL44Gf44CB6ICD44GI5pa577yI56aP5q2m5pWP5aSr77yJIioq44KS44CB44Gd44KM44Ge44KM6KGM44Gr6L+95Yqg44GX44Gm44GE44GN44G+44GZ44CCCiAKYGBge3J9CnQxIDwtIHJiaW5kKCAjIOihjOe1kOWQiAogIHQxWy0yLF0sICMgdDHjgYvjgoky6KGM55uu44KS5Y+W44KK6Zmk44GPCiAgIueyvuelnuWKm+WLleWtpueahOeyvuelnuWMu+Wtpu+8iOOCsOODrOODs++8ju+8r++8juOCruODo+ODkOODvOODie+8iSIsICPooYzjga7ov73liqAKICAi56We57WM55eH54q244Gu6Ki644GL44Gf44CB6ICD44GI5pa577yI56aP5q2m5pWP5aSr77yJIikgIyDooYzjga7ov73liqAKCnQxICMgdDHjga7ooajnpLoKYGBgCgrlkIzmp5jjgavjgZfjgabku4rjgIEy6KGM55uu44Gr44GN44Gm44GE44KL6KGM44KC5pON5L2c44GX44G+44GZ44CCCgpgYGB7cn0KdDEgPC0gcmJpbmQoICMg6KGM57WQ5ZCICiAgdDFbLTIsXSwgIyB0MeOBi+OCiTLooYznm67jgpLlj5bjgorpmaTjgY8KICAi44CM55m65oOz44Gu6Iiq6Leh44CN56We55Sw5qmL5qKd5rK7IiwgI+ihjOOBrui/veWKoAogICLjgIznsr7npZ7nmYLms5XpnaLmjqXjga7jgrPjg4TjgI3npZ7nlLDmqYvmop3msrsiKSAj6KGM44Gu6L+95YqgCgp0MSAjIHQx44Gu6KGo56S6CmBgYAoK5YWI44G744Gp44Go5ZCM5qeY44Gu5omL5rOV44Gn44K/44Kk44OI44Or44KS44Kv44Oq44OD44Kv44GZ44KL44GoR29vZ2xl5qSc57Si44Gn44GN44KL44KI44GG44Gr44Oq44Oz44Kv44KS6LK844Gj44Gm44GE44GN44G+44GZ44CC57mw44KK6L+U44GZ5pON5L2c44Gv6Zai5pWw44KS44Gk44GP44Gj44Gm44GX44G+44GE44G+44GX44KH44GG44CC5LuK5Zue44GvIGBhZGRfbGlua2Ag44Go44GE44GG6Zai5pWw5ZCN44Gr44GX44G+44GZ44CCCgpgYGB7cn0KIyDplqLmlbDjga7kvZzmiJAKYWRkX2xpbmsgPC0gIyBhZGRfbGlua+OBqOOBhOOBhumWouaVsOOCkuioreWumgogIGZ1bmN0aW9uKGJvb2tfbmFtZSl7ICMg5byV5pWw44GvYm9va19uYW1l44Go44GE44GG5pu457GN5ZCN44Gu44OZ44Kv44OI44OrCiAgbGlua19pbmZvIDwtICMgbGlua+aDheWgseOBruODmeOCr+ODiOODq+OCkuS9nOaIkAogICAgc3RyX2MoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9Iixib29rX25hbWUpICMg5paH5a2X57WQ5ZCICiAgYm9va19uYW1lIDwtIGNiaW5kKGJvb2tfbmFtZSwgbGlua19pbmZvKSAlPiUgIyDliJfjga7ntZDlkIggCiAgICBkYXRhLmZyYW1lKCkgJT4lICMg6KGo5b2i5byP44Gr44GZ44KLCiAgICBzZXROYW1lcyhjKCJib29rX25hbWUiLCJsaW5rX2luZm8iKSkgJT4lICMg5YiX5ZCN44Gu6Kit5a6aCiAgbXV0YXRlKCAjIOWIl+aTjeS9nAogICAgYm9va19uYW1lID0gbWFwMiggIyDku6XkuIsy44Gk44Gu5byV5pWw44Gr5a++44GX44GmIH4g5Lul5LiL44Gu5Yem55CG44KS5a6f6KGM44GZ44KLCiAgICAgIGJvb2tfbmFtZSwgbGlua19pbmZvLCAjIGJvb2tfbmFtZSwgbGlua19pbmZvIOWIl+OBq+OBpOOBhOOBpgogICAgICB+IC54ICU+JSBodG1sdG9vbHM6OmEoICMgYm9va19uYW1lKC54KSDjgavku6XkuIvjga4gYeWxnuaAp+OCkuS4juOBiOOCiwogICAgICAgIGhyZWYgPSAueSwgIyBsaW5rX2luZm8oLnkpIOOBruODquODs+OCr+aDheWgseOCkuS4juOBiOOCiwogICAgICAgIHRhcmdldCA9ICJfYmxhbmsiKSksICMg44Oq44Oz44Kv44Gr44Gv5paw6KaP44K/44OW44KS6ZaL44GE44Gm44K444Oj44Oz44OX44GZ44KLCiAgICBib29rX25hbWUgPSBtYXAoICMg5Lul5LiLMeOBpOOBruW8leaVsOOBq+WvvuOBl+OBpiB+IOS7peS4i+OBruWHpueQhuOCkuWun+ihjOOBmeOCiwogICAgICBib29rX25hbWUsICMgYm9va19uYW1l5YiX44Gr5a++44GX44GmCiAgICAgIH4gZ3Q6Omh0bWwoYXMuY2hhcmFjdGVyKC54KSkpKSAlPiUgIyBodG1s44Gu5oOF5aCx44KS5Y+N5pig44GV44Gb44KLCiAgc2VsZWN0KC1saW5rX2luZm8pICAlPiUgIyBsaW5rX2luZm/liJfjgpLlj5bjgorpmaTjgY8KICByZW5hbWUoIuabuOexjeODquOCueODiCIgPSBib29rX25hbWUpICU+JSAjIOWIl+WQjeOBruWkieabtAogIGd0KCkgJT4lICAjIGd044Kq44OW44K444Kn44Kv44OI44G4CiAgY29sc19hbGlnbihhbGlnbiA9ICJsZWZ0IikgIyDlt6blr4TjgZsKICByZXR1cm4oYm9va19uYW1lKSAjIOOBp+OBjeOBn2Jvb2tfbmFtZeOCkue1kOaenOOBqOOBl+OBpui/lOOBmQogIH0KYGBgCgoKYGBge3J9CnQyIDwtIHQxICU+JSAj5Lul5LiL44Gu57WQ5p6c44KSdDLjgavov5TjgZkKICBwdWxsKOS7luOBruOBiuOBmeOBmeOCgeacrCkgJT4lICMg5LuW44Gu44GK44GZ44GZ44KB5pys44Gu44OZ44Kv44OI44Or44KS5oq95Ye6CiAgYWRkX2xpbmsoKSAjIOiHquS9nOOBl+OBn2FkZF9saW5r6Zai5pWw44KS5L2/55SoCgp0MiAjIHQy44Gu6KGo56S6CgojIGh0bWwsIHBkZiDjgafkv53lrZgKZ3RzYXZlKGRhdGEgPSB0MiwgInJlY29tbWVkLmh0bWwiKQpndHNhdmUoZGF0YSA9IHQyLCAicmVjb21tZWQucGRmIikKYGBgCgojIOOCueOCr+ODrOOCpOODlOODs+OCsAoK5LuK5Zue44GuW1dlYuiqv+afu10oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZVdaZFNTM2EwbEdKLTVBNGJSZDQwc1B3eHMtSHljTEE0djBXU0JCT0F1bVFwUW1nL3ZpZXdmb3JtKXt0YXJnZXQ9Il9ibGFuayJ944GL44KJ44CB5pu457GN5oOF5aCx44KS5Y+W5b6X44GX44Gm44G/44KI44GG44Go5oCd44GE44G+44GZ44CC44GT44KM44GvIFIg44GuIGBydmVzdGAg44OR44OD44Kx44O844K444KS5L2/55So44GX44G+44GZ44CCCgpgYGB7cn0Kc291cmNlX3VybCA8LSAiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZVdaZFNTM2EwbEdKLTVBNGJSZDQwc1B3eHMtSHljTEE0djBXU0JCT0F1bVFwUW1nL3ZpZXdmb3JtIiAjIFVSTOOBruaMh+WumgpyZWNhbGxfaHRtbCA8LSByZWFkX2h0bWwoc291cmNlX3VybCwgZW5jb2RpbmcgPSAiVVRGLTgiKSAjIOaMh+WumuOBl+OBn1VSTOOCkiBVVEYtOOOBp+iqreOBv+i+vOOCgAoKcmVjYWxsX2h0bWwgIyDoqq3jgb/ovrzjgpPjgaBodG1s5oOF5aCx44Gu6KGo56S6CmBgYAoKaHRtbOODieOCreODpeODoeODs+ODiOOCkuiqreOBv+i+vOOCgOOBk+OBqOOBjOOBp+OBjeOBvuOBl+OBn+OAguOBk+OBruOBguOBqOOBr+OAgUNocm9tZeaLoeW8teOBrltTZWxlY3RvckdhZGdldF0oaHR0cHM6Ly9jaHJvbWUuZ29vZ2xlLmNvbS93ZWJzdG9yZS9kZXRhaWwvc2VsZWN0b3JnYWRnZXQvbWhqaG5rY2ZiZGhuamlja2trZGJqb2VtZG1iZmdpbmI/dHlwZT1leHQmaGw9amEtSlApe3RhcmdldD0iX2JsYW5rIn3jgpLkvb/jgYbjgajmjZfjgorjgb7jgZnjgIJTZWxlY3RvckdhZGdldOOCkuS9v+OBo+OBpuWPluOCiui+vOOBv+OBn+OBhOimgee0oOOCkuOCr+ODquODg+OCr+OBmeOCi+OBqOOAgSoqIi5mcmVlYmlyZEZvcm12aWV3ZXJDb21wb25lbnRzUXVlc3Rpb25DaGVja2JveEhhc0ltYWdlICwgLmZyZWViaXJkRm9ybXZpZXdlckNvbXBvbmVudHNRdWVzdGlvbkJhc2VIZWFkZXIiKiog44Go6KGo56S644GV44KM44KL44Gu44Gn44CB44GT44KM44KS44Kz44OU44O844GX44G+44GZ44CC57Ch5Y2Y44Gr44GE44GG44GoIGh0bWzjg4njgq3jg6Xjg6Hjg7Pjg4jlhoXjga7kvY/miYDjga7jgojjgYbjgarjgoLjga7jgafjgZnjgIJodG1sX25vZGUoKSDjgavjgYTjgozjgovjgZPjgajjgafjgIHjgZ3jga7opoHntKDjga7mg4XloLHjgpLlj5blvpfjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKCmBgYHtyfQpib29rbGlzdCA8LSByZWNhbGxfaHRtbCAlPiUgIyDku6XkuIvjga7mk43kvZzjgpJib29rbGlzdOOBuAogIGh0bWxfbm9kZXMoIi5mcmVlYmlyZEZvcm12aWV3ZXJDb21wb25lbnRzUXVlc3Rpb25DaGVja2JveEhhc0ltYWdlICwgLmZyZWViaXJkRm9ybXZpZXdlckNvbXBvbmVudHNRdWVzdGlvbkJhc2VIZWFkZXIiKSAlPiUgICMgU2VsZWN0b3JHYWRnZXQg44Gn5Y+W5b6X44GX44Gf5oOF5aCx44KS5Luj5YWlCiAgaHRtbF90ZXh0KCkgIyDjg4bjgq3jgrnjg4jjg4fjg7zjgr/jga7jgb/mipzjgY3lh7rjgZkKCmJvb2tsaXN0ICMgYm9va2xpc3Tjga7ooajnpLoKYGBgCgoxLDIg6KGM55uu44GoMTIw6KGM55uu44Gv44GE44KJ44Gq44GE44KI44GG44Gq44Gu44Gn5oqc44GN5Ye644GX44G+44GZ44CC44Gd44Gu5b6M44Gr44CB44GT44KM44G+44Gn44Go5ZCM5qeYR29vZ2xl5qSc57Si44Oq44Oz44Kv44KS44Gk44GR44Gm6KGo56S644GX44G+44GZ44CCCgpgYGB7cn0KYm9va2xpc3QgPC0gYm9va2xpc3RbLTE6LTJdICMxLDLooYznm67jgpLmipzjgY3lh7rjgZkKYm9va2xpc3QgPC0gYm9va2xpc3RbLTExOF0gIzEyMOOBi+OCiTLooYzlj5bjgorpmaTjgYTjgZ/jga7jgacxMTjjgYzoqbLlvZPooYwKCnQzIDwtIGJvb2tsaXN0ICU+JSAjIOS7peS4i+OBrue1kOaenOOCknQz44Gr6L+U44GZCiAgYWRkX2xpbmsoKSAjIOiHquS9nOOBl+OBn2FkZF9saW5r6Zai5pWw44KS5L2/55So44GZ44KLCgp0MyAjIHQz44Gu6KGo56S6CgojIGh0bWwsIHBkZiDjgafkv53lrZgKZ3RzYXZlKGRhdGEgPSB0MywgImJvb2xraXN0Lmh0bWwiKQpndHNhdmUoZGF0YSA9IHQzLCAiYm9vbGtpc3QucGRmIikKYGBgCgoKIyDph43opIfjgZfjgabjgarjgYTjgoLjga7jgpLmjqLjgZkKCuWFiOeoi+OBruihqOOBi+OCieOAgeOCouODs+OCseODvOODiOOBp+mBuOaKnuOBleOCjOOBquOBi+OBo+OBn+abuOexjeOCkuaKnOOBjeWHuuOBl+OBpuOBv+OBvuOBmeOAgmJvb2tsaXN044OZ44Kv44OI44Or44KS6KGo5b2i5byP44Gr44GX44Gf44CBbGlzdF8x44Go44GE44GG44OH44O844K/44Go44CB44Ki44Oz44Kx44O844OI44GuYm9va+WIl+OCkuaKnOOBjeWHuuOBl+OBn2xpc3RfMuOBqOOBhOOBhuODh+ODvOOCv+OCkueqgeWQiOOBl+OBvuOBmShsaXN0XzMp44CC44Gd44Gu6Zqb44GrbGlzdF8y44Gr44Gv55uu5Y2w44Gu44Gf44KB44GrbWFya+OBqOOBhOOBhuWQjeWJjeOBruWIl+OCkui/veWKoOOBl+OAgeWApOOCkjHjgavmjIflrprjgZfjgb7jgZnjgIIKCmBgYHtyfQpsaXN0XzEgPC0gYm9va2xpc3QgJT4lIGRhdGEuZnJhbWUoKSAjIGJvb2tsaXN044OZ44Kv44OI44Or44KS6KGo5b2i5byP44Gr44GZ44KLCmxpc3RfMiA8LSBkYXQyICU+JSBzZWxlY3QoYm9vaykgJT4lICMg44Ki44Oz44Kx44O844OI44GuYm9va+WIl+OCkuaKnOOBjeWHuuOBmQogIG11dGF0ZShtYXJrID0gMSkgIyBtYXJr44Go44GE44GG5ZCN5YmN44Gu5YiX44KS6L+95Yqg44GX44CB5YCk44KSMeOBq+OBmeOCiwpsaXN0XzMgPC0gZnVsbF9qb2luKGxpc3RfMSxsaXN0XzIsIGJ5PWMoIi4iPSJib29rIikpICMgbGlzdF8x44GobGlzdF8y44Gu56qB5ZCICgpsaXN0XzMgI2xpc3RfM+OBruihqOekugpgYGAKCuOBk+OCjOOBp+OAgemBuOaKnuOBleOCjOOBquOBi+OBo+OBn+abuOexjeOBryBtYXJr5YiX44GM5qyg5pCN5YCkIE5BIOOBqOOBquOCiuOBvuOBl+OBn+OAgmZpbHRlcigp44Gn44CBbWFya+WIl+OBjOasoOaQjeWApOOBp+OBguOCi+ihjOOCkuaKnOOBjeWHuuOBm+OBsOOAgeOCouODs+OCseODvOODiOOBp+mBuOaKnuOBleOCjOOBn+abuOexjeOBr+mZpOOBhOOBn+OCguOBruOCkuaKveWHuuOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoKYGBge3J9Cmxpc3RfMyA8LSBsaXN0XzMgJT4lIGZpbHRlcihpcy5uYShtYXJrKSkgIyBtYXJr5YiX44GM5qyg5pCN5YCk44Gn44GC44KL6KGM44KS5oq95Ye6Cmxpc3RfNCA8LSBsaXN0XzMgJT4lIHB1bGwoIi4iKSAjIOabuOexjeWQjeOBruOBguOCiyAuIOWIlyDjg5njgq/jg4jjg6vjgpLmipzjgY3lh7rjgZkKCnQ0IDwtIGxpc3RfNCAlPiUgIyDku6XkuIvjga7ntZDmnpzjgpJ0NOOBq+a4oeOBmQogIGFkZF9saW5rKCkgIyDoh6rkvZzjgZfjgZ9hZGRfbGlua+mWouaVsOOBruS9v+eUqAoKdDQgIyB0NCDjga7ooajnpLoKCiMgaHRtbCwgcGRmIOOBp+S/neWtmApndHNhdmUoZGF0YSA9IHQ0LCAiYm9vbGtpc3QyLmh0bWwiKQpndHNhdmUoZGF0YSA9IHQ0LCAiYm9vbGtpc3QyLnBkZiIpCmBgYAoKCiMg5pyA5b6M44GrCgrku4rlm57jga5wZGbjgarjganjga7ntZDmnpzjga9b44GT44Gh44KJXShodHRwczovL3BsYXphLnVtaW4uYWMuanAvc2hvZWkwNS93cC9pbmRleC5waHAvMjAyMS8wNi8wNi8yMDk5Lyl7dGFyZ2V0PSJfYmxhbmsifeOBi+OCieODgOOCpuODs+ODreODvOODieOBp+OBjeOBvuOBmeOAgnBkZuOCkuOBk+OCjOOBvuOBpyBgZ3RzYXZlKClgIOOBp+S9nOaIkOOBl+S/neWtmOOBl+OBpuOBjeOBvuOBl+OBn+OBjOOAgeWun+OBruOBqOOBk+OCjeePvuWcqOOBruS7leanmOOBoOOBqOe0sOOBi+OBhOioreWumuOBjOOBp+OBjeOBvuOBm+OCk+OAguOBneOBruOBn+OCgeOAgWh0bWwg44OV44Kh44Kk44Or44Gn5L+d5a2Y44GX44Gf44KC44Gu44KS44CB44OW44Op44Km44K244Gu5Y2w5Yi34oaScGRm44Gn5L+d5a2Y44Gu5qmf6IO95L2c5oiQ44GX44GfcGRm44KS6YWN5biD55So44Go44GX44Gm5L2c5oiQ44GX44Gm44GE44G+44GZ44CCCgrku4rlm57ooYzjgaPjgZ/op6PmnpDjga/ku6XkuIrjgafjgZnjgILjgarjgovjgbnjgY/jgrfjg7Pjg5fjg6vjgavjgZfjgZ/jgYvjgaPjgZ/jga7jgafjgZnjgYzjgIHjgajjgZPjgo3jganjgZPjgo3opIfpm5Hjgafoqq3jgb/jgaXjgonjgYTjgrPjg7zjg4njgavjgarjgaPjgabjgYTjgovnrofmiYDjgYzjgYLjgaPjgZ/jgajmgJ3jgYTjgb7jgZnjgILlsJHjgZfjgafjgoJS44Gr6IiI5ZGz44KS5oyB44Gj44Gm44GE44Gf44Gg44GR44Gf44KJ5ayJ44GX44GE44Gn44GZ44CCCgrjgZTmhI/opovjgoTos6rllY/nrYnjgYLjgozjgbDjgIFb44GK5ZWP44GE5ZCI44KP44GbXShodHRwczovL3BsYXphLnVtaW4uYWMuanAvc2hvZWkwNS93cC9pbmRleC5waHAvY29udGFjdF91cy8pe3RhcmdldD0iX2JsYW5rIn3jgoTjgIFbdHdpdHRlcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9zaG9laTA1KXt0YXJnZXQ9Il9ibGFuayJ9IOOBi+OCieOBiuawl+i7veOBq+OBlOmAo+e1oeOBj+OBoOOBleOBhOOAggoK5pyA5b6M44G+44Gn44GK6Kqt44G/44GE44Gf44Gg44GN44GC44KK44GM44Go44GG44GU44GW44GE44G+44GX44Gf44CCCg==