讀取資料

載入新聞資料

資料描述

  • 透過中山管院文字分析平台在聯合新聞網、東森新聞網、中國時報新聞網,搜尋關鍵字:[肺炎、新型冠狀病毒、冠狀病毒、武漢肺炎、防疫、疫情],時間從2019-12-01~2020-05-01,六個月的資料。 總篇數為22803篇,其中聯合新聞網9128篇、東森新聞網2006篇、中國時報新聞網11669篇

可以觀察到資料主要分佈在 1月底之後

Tokenization

將資料轉換為Document Term Matrix (DTM)

<<DocumentTermMatrix (documents: 22803, terms: 145608)>>
Non-/sparse entries: 3192554/3317106670
Sparsity           : 100%
Maximal term length: 16
Weighting          : term frequency (tf)
<<DocumentTermMatrix (documents: 10, terms: 10)>>
Non-/sparse entries: 25/75
Sparsity           : 75%
Maximal term length: 4
Weighting          : term frequency (tf)
Sample             :
                                             Terms
Docs                                          癌症 癌症病人 安慰 半夜 辦法 爆發 北部 比較 表示 病床
  https://news.ebc.net.tw/news/article/189213    2        1    1    1    1    1    1    1    1    5
  https://news.ebc.net.tw/news/article/192073    0        0    0    0    0    2    0    0    1    0
  https://news.ebc.net.tw/news/article/192142    0        0    0    0    0    1    0    0    3    0
  https://news.ebc.net.tw/news/article/192157    0        0    0    0    0    0    0    0    1    0
  https://news.ebc.net.tw/news/article/192475    0        0    0    0    0    1    0    0    2    0
  https://news.ebc.net.tw/news/article/192528    0        0    0    0    0    0    0    0    0    0
  https://news.ebc.net.tw/news/article/192934    1        0    0    0    0    0    1    0    4    0
  https://news.ebc.net.tw/news/article/193023    0        0    0    0    0    1    0    0    1    0
  https://news.ebc.net.tw/news/article/193107    0        0    0    0    0    0    0    0    1    0
  https://news.ebc.net.tw/news/article/193183    0        0    0    0    0    0    0    3    3    0

查看DTM矩陣,可以發現是個稀疏矩陣。

建立LDA模型

\(\phi\) Matrix

查看\(\phi\) matrix (topic * term)

從topics中可以得到特定主題生成特定詞彙的概率。

更多主題

  • 嘗試2,3,10,25,36主題數,將結果存起來,再做進一步分析

這邊要跑N個小時,已將主題結果存在lda_result

載入每個主題的LDA結果

結果存在ldas這個變數裡面,同學可以透過ldas[[x]] 來找到想要的主題數

透過perplexity找到最佳主題數

`data_frame()` is deprecated as of tibble 1.1.0.
Please use `tibble()` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.

perplexity 越小越好,但是太小的話,主題數會分太細。通常會找一個主題數適當,且perplexity比較低的主題

LDAvis

LDA後續分析

  • 根據前面的探索之後,我們對於資料有更加了解,並且看完每個主題數的LDAvis之後,選定主題數10的結果來作後續的分析

Document 主題分佈

[1] 22803    10

每篇文章都有topic的分佈,所以22803筆的文章*10個主題

查看特定主題的文章

  • 透過找到特定文章的分佈進行排序之後,可以看到此主題的比重高的文章在討論什麼。

可以看到國際關係這個主題主要討論 美中關係、台灣與WHO,以及其他的國際關係

了解主題在時間的變化

由於我們的資料,12、5月資料太少,所以將這兩個月去除,以及None的主題

補充

一樣可以用LDAvis的套件來看

      [,1]   [,2]     [,3]   [,4]       [,5]   [,6]   [,7]   [,8]   [,9]   [,10] 
 [1,] "警方" "業者"   "醫院" "中國"     "經濟" "防疫" "企業" "專題" "病毒" "自己"
 [2,] "透過" "人潮"   "確診" "美國"     "市場" "口罩" "申請" "數據" "研究" "網友"
 [3,] "活動" "遊客"   "症狀" "大陸"     "成長" "居家" "員工" "圖表" "可能" "口罩"
 [4,] "訊息" "餐廳"   "武漢" "疫情"     "影響" "檢疫" "勞工" "確診" "疫苗" "大家"
 [5,] "捐贈" "飯店"   "患者" "武漢"     "投資" "中央" "取消" "台灣" "認為" "因為"
 [6,] "分局" "連假"   "感染" "防控"     "生產" "市府" "方案" "肺炎" "專家" "沒有"
 [7,] "網路" "民眾"   "病例" "國家"     "營收" "學校" "補助" "疫情" "藥物" "現在"
 [8,] "學習" "觀光"   "肺炎" "北京"     "指數" "人員" "銀行" "新冠" "一個" "他們"
 [9,] "員警" "酒店"   "出現" "川普"     "衝擊" "消毒" "貸款" "案例" "新冠" "我們"
[10,] "平台" "消費者" "通報" "冠狀病毒" "億元" "市長" "計畫" "圖解" "可以" "真的"
To stop the server, run servr::daemon_stop(1) or restart your R session
Serving the directory /tmp/Rtmpu71thE/file7a3f5167e183 at http://127.0.0.1:4321
LS0tCnRpdGxlOiAi5L2/55SoTERB5YiG5p6Q5paw5Z6L5Yag54uA55eF5q+S5Lit5paH5paw6IGe6LOH5paZIgphdXRob3I6ICLmnpfkvK/lgKsiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzCiAgICB0aGVtZTogZmxhdGx5CiAgICBjc3M6IHN0eWxlLmNzcwogCi0tLQojIOezu+e1seioree9rgoKYGBge3J9ClN5cy5zZXRsb2NhbGUoY2F0ZWdvcnkgPSAiTENfQUxMIiwgbG9jYWxlID0gInpoX1RXLlVURi04IikgIyBGb3IgdWJ1bnR1CiMgU3lzLnNldGxvY2FsZSgiTENfQ1RZUEUiLCAiY2h0IikgIyBGb3Igd2luZG93cy4KYGBgCgojIyDlronoo53pnIDopoHnmoRwYWNrYWdlcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwYWNrYWdlcyA9IGMoInJlYWRyIiwidG0iLCAiZGF0YS50YWJsZSIsICJkcGx5ciIsICJzdHJpbmdyIiwgImppZWJhUiIsICJ0aWR5dGV4dCIsICJnZ3Bsb3QyIiwgInRpZHlyIiwgInRvcGljbW9kZWxzIiwgIkxEQXZpcyIsICJ3ZWJzaG90IiwicHVycnIiLCJyYW1pZnkiLCJSQ29sb3JCcmV3ZXIiLCAiaHRtbHdpZGdldHMiLCJzZXJ2ciIpCmV4aXN0aW5nID0gYXMuY2hhcmFjdGVyKGluc3RhbGxlZC5wYWNrYWdlcygpWywxXSkKZm9yKHBrZyBpbiBwYWNrYWdlc1shKHBhY2thZ2VzICVpbiUgZXhpc3RpbmcpXSkgaW5zdGFsbC5wYWNrYWdlcyhwa2cpCmBgYAoKCgoKCmBgYHtyICBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpyZXF1aXJlKHJlYWRyKQpyZXF1aXJlKHRtKQpyZXF1aXJlKGRhdGEudGFibGUpCnJlcXVpcmUoZHBseXIpCnJlcXVpcmUoc3RyaW5ncikKcmVxdWlyZShqaWViYVIpCnJlcXVpcmUodWRwaXBlKQpyZXF1aXJlKHRpZHl0ZXh0KQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUodGlkeXIpCnJlcXVpcmUodG9waWNtb2RlbHMpCnJlcXVpcmUoTERBdmlzKQpyZXF1aXJlKHdvcmRjbG91ZDIpCnJlcXVpcmUod2Vic2hvdCkKcmVxdWlyZShodG1sd2lkZ2V0cykKcmVxdWlyZShzZXJ2cikKcmVxdWlyZShwdXJycikKcmVxdWlyZShyYW1pZnkpCnJlcXVpcmUoUkNvbG9yQnJld2VyKQpteWNvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoOCwgIlNldDMiKSkoMjApCmBgYAoKIyDoroDlj5bos4fmlpkKCiMjIOi8ieWFpeaWsOiBnuizh+aWmQpgYGB7cn0KdWRuPSByZWFkLmNzdigicmF3X2RhdGEvdWRuLmNzdiIsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSAlPiUgbXV0YXRlKHNvdXJjZSA9ICJ1ZG4iKQplYmM9IHJlYWQuY3N2KCJyYXdfZGF0YS9lYmMuY3N2IixzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpJT4lIG11dGF0ZShzb3VyY2UgPSAiZWJjIikKY2hpbmF0aW1lcz0gcmVhZC5jc3YoInJhd19kYXRhL2NoaW5hdGltZXMuY3N2IixzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpJT4lIG11dGF0ZShzb3VyY2UgPSAiY2hpbmF0aW1lcyIpCm5ld3M9cmJpbmQodWRuLHJiaW5kKGViYyxjaGluYXRpbWVzKSkKbmV3cyRhcnREYXRlID0gYXMuRGF0ZShuZXdzJGFydERhdGUpCmBgYAoKIyMjIOizh+aWmeaPj+i/sAoKKyDpgI/pgY7kuK3lsbHnrqHpmaLmloflrZfliIbmnpDlubPlj7DlnKjoga/lkIjmlrDogZ7ntrLjgIHmnbHmo67mlrDogZ7ntrLjgIHkuK3lnIvmmYLloLHmlrDogZ7ntrLvvIzmkJzlsIvpl5zpjbXlrZfvvJpb6IK654KO44CB5paw5Z6L5Yag54uA55eF5q+S44CB5Yag54uA55eF5q+S44CB5q2m5ryi6IK654KO44CB6Ziy55ar44CB55ar5oOFXe+8jOaZgumWk+W+njIwMTktMTItMDF+MjAyMC0wNS0wMe+8jOWFreWAi+aciOeahOizh+aWmeOAgiDnuL3nr4fmlbjngroyMjgwM+evh++8jOWFtuS4reiBr+WQiOaWsOiBnue2sjkxMjjnr4fjgIHmnbHmo67mlrDogZ7ntrIyMDA256+H44CB5Lit5ZyL5pmC5aCx5paw6IGe57ayMTE2Njnnr4cKCmBgYHtyfQpuZXdzICU+JSAKICBncm91cF9ieShhcnREYXRlKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpJT4lCiAgZ2dwbG90KGFlcyhhcnREYXRlLGNvdW50KSkrCiAgICBnZW9tX2xpbmUoY29sb3I9InJlZCIpKwogIGdlb21fcG9pbnQoKQpgYGAKCj4g5Y+v5Lul6KeA5a+f5Yiw6LOH5paZ5Li76KaB5YiG5L2I5ZyoIDHmnIjlupXkuYvlvowKCgojIyBUb2tlbml6YXRpb24gCmBgYHtyfQojIOS9v+eUqOm7mOiqjeWPg+aVuOWIneWni+WMluS4gOWAi+aWt+ipnuW8leaTjgpqaWViYV90b2tlbml6ZXIgPSB3b3JrZXIoKQpuZXdzX3Rva2VuaXplciA8LSBmdW5jdGlvbih0KSB7CiAgbGFwcGx5KHQsIGZ1bmN0aW9uKHgpIHsKICAgIGlmKG5jaGFyKHgpPjEpewogICAgICB0b2tlbnMgPC0gc2VnbWVudCh4LCBqaWViYV90b2tlbml6ZXIpCiAgICAgICMg5Y675o6J5a2X5Liy6ZW35bqm54iyMeeahOipnuW9mQogICAgICB0b2tlbnMgPC0gdG9rZW5zW25jaGFyKHRva2Vucyk+MV0KICAgICAgcmV0dXJuKHRva2VucykKICAgIH0KICB9KQp9CmBgYAoKYGBge3J9CnRva2VucyA8LSBuZXdzICU+JQogIHVubmVzdF90b2tlbnMod29yZCwgc2VudGVuY2UsIHRva2VuPW5ld3NfdG9rZW5pemVyKSAlPiUKICBmaWx0ZXIoIXN0cl9kZXRlY3Qod29yZCwgcmVnZXgoIlswLTlhLXpBLVpdIikpKSAlPiUKICBjb3VudChhcnRVcmwsIHdvcmQpICU+JQogIHJlbmFtZShjb3VudD1uKQp0b2tlbnMgJT4laGVhZCgyMCkKYGBgCgojIyDlsIfos4fmlpnovYnmj5vngrpEb2N1bWVudCBUZXJtIE1hdHJpeCAoRFRNKQpgYGB7cn0KbmV3c19kdG0gPC10b2tlbnMgJT4lIGNhc3RfZHRtKGFydFVybCwgd29yZCwgY291bnQpCm5ld3NfZHRtCmluc3BlY3QobmV3c19kdG1bMToxMCwxOjEwXSkKYGBgCgo+IOafpeeci0RUTeefqemZo++8jOWPr+S7peeZvOePvuaYr+WAi+eogOeWj+efqemZo+OAgiAKCiMg5bu656uLTERB5qih5Z6LCmBgYHtyfQpsZGEgPC0gTERBKG5ld3NfZHRtLCBrID0gMiwgY29udHJvbCA9IGxpc3Qoc2VlZCA9IDIwMjApKQpgYGAKCiMjICRccGhpJCBNYXRyaXgKCiMjIyDmn6XnnIskXHBoaSQgbWF0cml4ICh0b3BpYyAqIHRlcm0pCmBgYHtyfQp0b3BpY3MgPC0gdGlkeShsZGEsIG1hdHJpeCA9ICJiZXRhIikgIyDms6jmhI/vvIzlnKh0aWR5IGZ1bmN0aW9u6KOh6Z2i6KaB5L2/55SoImJldGEi5L6G5Y+W5Ye6UGhp55+p6Zmj44CCCnRvcGljcwpgYGAKCj4g5b6edG9waWNz5Lit5Y+v5Lul5b6X5Yiw54m55a6a5Li76aGM55Sf5oiQ54m55a6a6Kme5b2Z55qE5qaC546H44CCCgojIyMg5bCL5om+VG9waWPnmoTku6PooajlrZcKYGBge3J9CnRvcF90ZXJtcyA8LSB0b3BpY3MgJT4lCiAgZ3JvdXBfYnkodG9waWMpICU+JQogIHRvcF9uKDEwLCBiZXRhKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgYXJyYW5nZSh0b3BpYywgLWJldGEpCgoKdG9wX3Rlcm1zICU+JQogIG11dGF0ZSh0ZXJtID0gcmVvcmRlcih0ZXJtLCBiZXRhKSkgJT4lCiAgZ2dwbG90KGFlcyh0ZXJtLCBiZXRhLCBmaWxsID0gZmFjdG9yKHRvcGljKSkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcCh+IHRvcGljLCBzY2FsZXMgPSAiZnJlZSIpICsKICBjb29yZF9mbGlwKCkKYGBgCj4g6YCP6YGO5LiK5pa555qE5ZyW77yM5oSf6Ka65YWp5YCL5Li76aGM55yL6LW35L6G5beu5LiN5aSa77yM5rKS5pyJ55yL5Ye65YWp6ICF55qE5beu55Ww77yM5ZiX6Kmm55yL55yL5YiG5aSa5LiA6buedG9waWNzCgojIyDmm7TlpJrkuLvpoYwKKyDlmJfoqaYyLDMsMTAsMjUsMzbkuLvpoYzmlbjvvIzlsIfntZDmnpzlrZjotbfkvobvvIzlho3lgZrpgLLkuIDmraXliIbmnpAKCmBgYHtyIGV2YWw9RkFMU0V9CiMgbGRhcyA9IGMoKQojIHRvcGljcyA9IGMoMiwzLDEwLDI1LDM2KQojIGZvcih0b3BpYyBpbiB0b3BpY3MpewojICAgc3RhcnRfdGltZSA8LSBTeXMudGltZSgpCiMgICBsZGEgPC0gTERBKG5ld3NfZHRtLCBrID0gdG9waWMsIGNvbnRyb2wgPSBsaXN0KHNlZWQgPSAyMDIwKSkKIyAgIGxkYXMgPWMobGRhcyxsZGEpCiMgICBwcmludChwYXN0ZSh0b3BpYyAscGFzdGUoInRvcGljKHMpIGFuZCB1c2UgdGltZSBpcyAiLCBTeXMudGltZSgpIC1zdGFydF90aW1lKSkpCiMgICBzYXZlKGxkYXMsZmlsZSA9ICJsZGFzX3Jlc3VsdCIpCiMgfQoKYGBgCgo+6YCZ6YKK6KaB6LeRTuWAi+Wwj+aZgu+8jOW3suWwh+S4u+mhjOe1kOaenOWtmOWcqGxkYV9yZXN1bHQKCiMjIyDovInlhaXmr4/lgIvkuLvpoYznmoRMREHntZDmnpwKYGBge3J9CmxvYWQoImxkYXNfcmVzdWx0IikKYGBgCgo+IOe1kOaenOWtmOWcqGxkYXPpgJnlgIvorormlbjoo6HpnaLvvIzlkIzlrbjlj6/ku6XpgI/pgY5sZGFzW1t4XV0g5L6G5om+5Yiw5oOz6KaB55qE5Li76aGM5pW4IAoKIyMjIOmAj+mBjnBlcnBsZXhpdHnmib7liLDmnIDkvbPkuLvpoYzmlbgKYGBge3J9Cgp0b3BpY3MgPSBjKDIsMywxMCwyNSwzNikKZGF0YV9mcmFtZShrID0gdG9waWNzLAogICAgICAgICAgIHBlcnBsZXggPSBtYXBfZGJsKGxkYXMsIHRvcGljbW9kZWxzOjpwZXJwbGV4aXR5KSkgJT4lCiAgZ2dwbG90KGFlcyhrLCBwZXJwbGV4KSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiRXZhbHVhdGluZyBMREEgdG9waWMgbW9kZWxzIiwKICAgICAgIHN1YnRpdGxlID0gIk9wdGltYWwgbnVtYmVyIG9mIHRvcGljcyAoc21hbGxlciBpcyBiZXR0ZXIpIiwKICAgICAgIHggPSAiTnVtYmVyIG9mIHRvcGljcyIsCiAgICAgICB5ID0gIlBlcnBsZXhpdHkiKQpgYGAKCj4gcGVycGxleGl0eSDotorlsI/otorlpb3vvIzkvYbmmK/lpKrlsI/nmoToqbHvvIzkuLvpoYzmlbjmnIPliIblpKrntLDjgILpgJrluLjmnIPmib7kuIDlgIvkuLvpoYzmlbjpgannlbbvvIzkuJRwZXJwbGV4aXR55q+U6LyD5L2O55qE5Li76aGMCgojIyMg6KOc5YWFIGxkYXR1bmluZwoKKyDlj4PogIMgaHR0cHM6Ly9ycHVicy5jb20vc2lyaS9sZGF0dW5pbmcKCisgTWluaW1pemF0aW9uOiBBcnVuMjAxMOOAgUNhb0p1YW4yMDA5IAorIE1heGltaXphdGlvbjogRGV2ZWF1ZDIwMTTjgIFHcmlmZml0aHMyMDA0IAoKYGBge3IgZXZhbD1GQUxTRX0KaWYoISgnbGRhdHVuaW5nJyAlaW4lIGV4aXN0aW5nKSl7aW5zdGFsbC5wYWNrYWdlcyhsZGF0dW5pbmcpfQpsaWJyYXJ5KCJsZGF0dW5pbmciKQpyZXN1bHQgPC0gRmluZFRvcGljc051bWJlcigKICBuZXdzX2R0bSwKICB0b3BpY3MgPSB0b3BpY3MsCiAgbWV0cmljcyA9IGMoIkdyaWZmaXRoczIwMDQiLCAiQ2FvSnVhbjIwMDkiLCAiQXJ1bjIwMTAiLCAiRGV2ZWF1ZDIwMTQiKSwKICBtZXRob2QgPSAiR2liYnMiLAogIGNvbnRyb2wgPSBsaXN0KHNlZWQgPSAyMDIwKSwKICBtYy5jb3JlcyA9IDJMLAogIHZlcmJvc2UgPSBUUlVFCikKRmluZFRvcGljc051bWJlcl9wbG90KHJlc3VsdCkKYGBgCgo+6YCZ6YKK5Lmf6KaB6LeRTuWAi+Wwj+aZgu+8jOWPr+S7peWPg+iAg+S4iumdoueahOmAo+e1kOS6huino+WmguS9leS9v+eUqAoKCiMgTERBdmlzCgojIyDnlKLnlJ9jcmVhdGUgTERBdmlz5omA6ZyA55qEanNvbiBmdW5jdGlvbgoKKyDmraRmdW5jdGlvbuaYr+Wwh+WJjemdouS9v+eUqCAiTERBIGZ1bmN0aW9uIuaJgOW7uueri+eahG1vZGVs77yM6L2J5o+b54K6IkxEQVZpcyLlpZfku7bnmoRpbnB1dOagvOW8j+OAggoKYGBge3J9CnRvcGljbW9kZWxzX2pzb25fbGRhdmlzIDwtIGZ1bmN0aW9uKGZpdHRlZCwgZG9jX3Rlcm0pewogICAgcmVxdWlyZShMREF2aXMpCiAgICByZXF1aXJlKHNsYW0pCiAgCiAgICMjI+S7peS4i2Z1bmN0aW9uIOeUqOS+huino+axuu+8jOS4u+mhjOaVuOWkmuacg+WHuuePvk5B55qE5ZWP6aGMCiAgIyMg5Y+D6ICDIGh0dHBzOi8vZ2l0aHViLmNvbS9jcHNpZXZlcnQvTERBdmlzL2NvbW1pdC9jNzIzNGQ3MTE2OGIxZTk0NmEzNjFiYzAwNTkzYmM1YzRiZjhlNTdlCmxzX0xEQSA9IGZ1bmN0aW9uIChwaGkpCnsKICBqZW5zZW5TaGFubm9uIDwtIGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgbSA8LSAwLjUgKiAoeCArIHkpCiAgICBsaHMgPC0gaWZlbHNlKHggPT0gMCwgMCwgeCAqIChsb2coeCkgLSBsb2cobSsxZS0xNikpKQogICAgcmhzIDwtIGlmZWxzZSh5ID09IDAsIDAsIHkgKiAobG9nKHkpIC0gbG9nKG0rMWUtMTYpKSkKICAgIDAuNSAqIHN1bShsaHMpICsgMC41ICogc3VtKHJocykKICB9CiAgZGlzdC5tYXQgPC0gcHJveHk6OmRpc3QoeCA9IHBoaSwgbWV0aG9kID0gamVuc2VuU2hhbm5vbikKICBwY2EuZml0IDwtIHN0YXRzOjpjbWRzY2FsZShkaXN0Lm1hdCwgayA9IDIpCiAgZGF0YS5mcmFtZSh4ID0gcGNhLmZpdFssIDFdLCB5ID0gcGNhLmZpdFssIDJdKQp9CgogICAgIyBGaW5kIHJlcXVpcmVkIHF1YW50aXRpZXMKICAgIHBoaSA8LSBhcy5tYXRyaXgocG9zdGVyaW9yKGZpdHRlZCkkdGVybXMpCiAgICB0aGV0YSA8LSBhcy5tYXRyaXgocG9zdGVyaW9yKGZpdHRlZCkkdG9waWNzKQogICAgdm9jYWIgPC0gY29sbmFtZXMocGhpKQogICAgdGVybV9mcmVxIDwtIHNsYW06OmNvbF9zdW1zKGRvY190ZXJtKQoKICAgICMgQ29udmVydCB0byBqc29uCiAgICBqc29uX2xkYSA8LSBMREF2aXM6OmNyZWF0ZUpTT04ocGhpID0gcGhpLCB0aGV0YSA9IHRoZXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9jYWIgPSB2b2NhYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5sZW5ndGggPSBhcy52ZWN0b3IodGFibGUoZG9jX3Rlcm0kaSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybS5mcmVxdWVuY3kgPSB0ZXJtX2ZyZXEsIG1kcy5tZXRob2QgPSBsc19MREEpCgogICAgcmV0dXJuKGpzb25fbGRhKQp9CmBgYAoKCiMjIOeUoueUn0xEQXZpc+e1kOaenAoKKyDlj6/ku6XpgI/pgY4gZ2l0aHVi55qE5pa55byP77yM57ea5LiKZGVtb+S9oOeahExEQXZpc+e1kOaenCDnr4TkvovvvJpodHRwczovLzIzNGd0czg2OC5naXRodWIuaW8vTERBLzNfbGRhdmlzLyN0b3BpYz0wJmxhbWJkYT0wLjUmdGVybT0KCmBgYHtyIGV2YWw9RkFMU0V9CgojIOioree9rmFscGhh5Y+KZGVsdGHlj4PmlbgKI2Rldm90aW9uX2xkYV9yZW1vdmVkIDwtIExEQShkZXZvdGlvbl9kdG1fcmVtb3ZlZCwgayA9IDQsIG1ldGhvZCA9ICJHaWJicyIsIGNvbnRyb2wgPSBsaXN0KHNlZWQgPSAxMjM0LCBhbHBoYSA9IDIsIGRlbHRhPSAwLjEpKQoKIyMjIyMjIyDku6XkuIvnlKjkvobnlKLnlJ9sZGF2aXPnmoTmqpTmoYjvvIzlj6/ku6XkuYvlvoznlKjkvoblnKhsb2NhbOerr+OAgeaUvuWcqOe2sui3r+S4iuaJk+mWiyAjIyMjIyMjIyMjCiMgZm9yKGxkYSBpbiBsZGFzKXsKIyAgIAojICAgayA9IGxkYUBrICMjIGxkYSDkuLvpoYzmlbgKIyAgIGlmKGs9PTIpe25leHR9CiMgICBqc29uX3JlcyA8LSB0b3BpY21vZGVsc19qc29uX2xkYXZpcyhsZGEsbmV3c19kdG0pCiMgICAjIHNlclZpcyhqc29uX3JlcyxvcGVuLmJyb3dzZXIgPSBUKQojICAgbGRhX2RpciA9ICBwYXN0ZTAoaywiX2xkYXZpcyIpCiMgICBpZighZGlyLmV4aXN0cyhsZGFfZGlyKSl7IGRpci5jcmVhdGUoIi4vIixsZGFfZGlyKX0KIyAgIAojICAgc2VyVmlzKGpzb25fcmVzLCBvdXQuZGlyID1sZGFfZGlyLCBvcGVuLmJyb3dzZXIgPSBGKQojICAgCiMgICB3cml0ZUxpbmVzKGljb252KHJlYWRMaW5lcyhwYXN0ZTAobGRhX2RpciwiL2xkYS5qc29uIikpLCB0byA9ICJVVEY4IikpCiMgfQoKdG9waWNfMTAgPSBsZGFzW1szXV0KanNvbl9yZXMgPC0gdG9waWNtb2RlbHNfanNvbl9sZGF2aXModG9waWNfMTAsbmV3c19kdG0pCgpzZXJWaXMoanNvbl9yZXMsb3Blbi5icm93c2VyID0gVCkKCiMg5aaC5p6c54Sh5rOV6ZaL5ZWf6KaW56qXKHdpbmRvd3PnlKjmiLYp5Y+v5Z+36KGM6YCZ5q61CiMgc2VyVmlzKGpzb25fcmVzLCBvdXQuZGlyID0gInZpcyIsIG9wZW4uYnJvd3NlciA9IFQpCiMgd3JpdGVMaW5lcyhpY29udihyZWFkTGluZXMoIi4vdmlzL2xkYS5qc29uIiksIHRvID0gIlVURjgiKSkKCmBgYAoKCiMgTERB5b6M57qM5YiG5p6QCgorIOagueaTmuWJjemdoueahOaOoue0ouS5i+W+jO+8jOaIkeWAkeWwjeaWvOizh+aWmeacieabtOWKoOS6huino++8jOS4puS4lOeci+WujOavj+WAi+S4u+mhjOaVuOeahExEQXZpc+S5i+W+jO+8jOmBuOWumuS4u+mhjOaVuDEw55qE57WQ5p6c5L6G5L2c5b6M57qM55qE5YiG5p6QCgpgYGB7cn0KbmV3c19sZGEgPSBsZGFzW1szXV0gIyMg6YG45a6adG9waWMg54K6MTAg55qE57WQ5p6cCgp0b3BpY3MgPC0gdGlkeShuZXdzX2xkYSwgbWF0cml4ID0gImJldGEiKSAjIOazqOaEj++8jOWcqHRpZHkgZnVuY3Rpb27oo6HpnaLopoHkvb/nlKgiYmV0YSLkvoblj5blh7pQaGnnn6npmaPjgIIKdG9waWNzCmBgYAo+IAoKCiMjIOWwi+aJvlRvcGlj55qE5Luj6KGo5a2XCisg5pW055CG5Ye65q+P5LiA5YCLVG9waWPkuK3nlJ/miJDmpoLnjofmnIDpq5jnmoQxMOWAi+ipnuW9meOAggoKYGBge3J9Cgp0b3BfdGVybXMgPC0gdG9waWNzICU+JQogIGdyb3VwX2J5KHRvcGljKSAlPiUKICB0b3BfbigxMCwgYmV0YSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UodG9waWMsIC1iZXRhKQoKCnRvcF90ZXJtcyAlPiUKICBtdXRhdGUodGVybSA9IHJlb3JkZXIodGVybSwgYmV0YSkpICU+JQogIGdncGxvdChhZXModGVybSwgYmV0YSwgZmlsbCA9IGZhY3Rvcih0b3BpYykpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1teWNvbG9ycykrCiAgZmFjZXRfd3JhcCh+IHRvcGljLCBzY2FsZXMgPSAiZnJlZSIpICsKICBjb29yZF9mbGlwKCkKCmBgYAo+IOWPr+S7peeci+WIsHRvcGlj6YO96KKr5LiA6ZaL5aeL5omA5L2/55So55qE5pCc5bCL6Zec6Y215a2X5b2x6Z+/55yL5LiN5Ye65q+P5LiA576k55qE5beu55Ww44CCCgorIOenu+mZpOW4uOWHuuePvuOAgei3qOS4u+mhjOWFseS6q+eahOipnuW9meOAggpgYGB7cn0KcmVtb3ZlX3dvcmQgPSBjKCLnlqvmg4UiLCLmrabmvKIiLCLpmLLnlqsiLCLnorroqLoiLCLpmLLnlqsiLCLogrrngo4iLCLlhqDni4Dnl4Xmr5IiLCLnl4Xmr5IiLCLmlrDlhqAiKQp0b3BfdGVybXMgPC0gdG9waWNzICU+JQogIGZpbHRlcighdGVybSAgJWluJSByZW1vdmVfd29yZCklPiUKICBncm91cF9ieSh0b3BpYykgJT4lCiAgdG9wX24oMTAsIGJldGEpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKHRvcGljLCAtYmV0YSkKCgp0b3BfdGVybXMgJT4lCiAgbXV0YXRlKHRlcm0gPSByZW9yZGVyKHRlcm0sIGJldGEpKSAlPiUKICBnZ3Bsb3QoYWVzKHRlcm0sIGJldGEsIGZpbGwgPSBmYWN0b3IodG9waWMpKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9bXljb2xvcnMpKwogIGZhY2V0X3dyYXAofiB0b3BpYywgc2NhbGVzID0gImZyZWUiKSArCiAgY29vcmRfZmxpcCgpCmBgYAo+IOWPr+S7peeci+WHuuavj+WAi+S4u+mhjOS4u+imgeWcqOiojuirluS7gOm6vOS6hu+8gQoKIyMjIOS4u+mhjOWRveWQjQpgYGB7cn0KdG9waWNfbmFtZSA9IGMoIuWci+mam+mXnOS/giIsJ+acjeWLmealreOAgeiIiei+pua0u+WLlScsJ+mGq+mZouOAgeeXheS+iycsJ+WtuOagoScsJ+aUv+W6nOOAgeS8gealrScsJ+WgseWwjuOAgeaEn+afk+S6uuaVuCcsJ+e2k+a/n+OAgeW4guWgtCcsJ+eglOeZvOOAgeeWq+iLlycsJ05vbmUnLCfkuK3lpK7mjIfmj67kuK3lv4MnKQpgYGAKCiMjIERvY3VtZW50IOS4u+mhjOWIhuS9iApgYGB7cn0KIyBmb3IgZXZlcnkgZG9jdW1lbnQgd2UgaGF2ZSBhIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBvZiBpdHMgY29udGFpbmVkIHRvcGljcwp0bVJlc3VsdCA8LSBwb3N0ZXJpb3IobmV3c19sZGEpCmRvY19wcm8gPC0gdG1SZXN1bHQkdG9waWNzIApkaW0oZG9jX3BybykgICAgICAgICAgICAgICAjIG5Eb2NzKERUTSkgZGlzdHJpYnV0aW9ucyBvdmVyIEsgdG9waWNzCmBgYAo+IOavj+evh+aWh+eroOmDveaciXRvcGlj55qE5YiG5L2I77yM5omA5LulMjI4MDPnrYbnmoTmlofnq6AqMTDlgIvkuLvpoYwKCgojIyMgY2JpbmQgRG9jdW1lbnQg5Li76aGM5YiG5L2ICmBgYHtyfQojIGdldCBkb2N1bWVudCB0b3BpYyBwcm9wb3J0aW9ucyAKZG9jdW1lbnRfdG9waWNzIDwtIGRvY19wcm9bbmV3cyRhcnRVcmwsXQpkb2N1bWVudF90b3BpY3NfZGYgPWRhdGEuZnJhbWUoZG9jdW1lbnRfdG9waWNzKQpjb2xuYW1lcyhkb2N1bWVudF90b3BpY3NfZGYpID0gdG9waWNfbmFtZQpyb3duYW1lcyhkb2N1bWVudF90b3BpY3NfZGYpID0gTlVMTApuZXdzX3RvcGljID0gY2JpbmQobmV3cyxkb2N1bWVudF90b3BpY3NfZGYpCiMgbmV3c190b3BpYyAlPiUgaGVhZCgxMCkKYGBgCgo+IOePvuWcqOaIkeWAkeeci+avj+S4gOevh+eahOaWh+eroOWIhuS9iOS6hu+8gQoKIyMjIOafpeeci+eJueWumuS4u+mhjOeahOaWh+eroAorIOmAj+mBjuaJvuWIsOeJueWumuaWh+eroOeahOWIhuS9iOmAsuihjOaOkuW6j+S5i+W+jO+8jOWPr+S7peeci+WIsOatpOS4u+mhjOeahOavlOmHjemrmOeahOaWh+eroOWcqOiojuirluS7gOm6vOOAggoKYGBge3IgLGV2YWw9RkFMU0V9CiBuZXdzX3RvcGljICU+JQogICAgYXJyYW5nZShkZXNjKGDlnIvpmpvpl5zkv4JgKSkgJT4laGVhZCgxMCkgCmBgYAoKPiDlj6/ku6XnnIvliLDlnIvpmpvpl5zkv4LpgJnlgIvkuLvpoYzkuLvopoHoqI7oq5Yg576O5Lit6Zec5L+C44CB5Y+w54Gj6IiHV0hP77yM5Lul5Y+K5YW25LuW55qE5ZyL6Zqb6Zec5L+CCgojIyMg5LqG6Kej5Li76aGM5Zyo5pmC6ZaT55qE6K6K5YyWCmBgYHtyIHdhcm5pbmc9RkFMU0V9CgpuZXdzX3RvcGljWyxjKDc6MTYpXSA9c2FwcGx5KG5ld3NfdG9waWNbLGMoNzoxNildICwgYXMubnVtZXJpYykKbmV3c190b3BpYyAlPiUgCiAgZ3JvdXBfYnkoYXJ0RGF0ZSA9IGZvcm1hdChhcnREYXRlLCclWSVtJykpICU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBzdW0sIG5hLnJtID0gVFJVRSkgJT4lCiAgbWVsdChpZC52YXJzID0gImFydERhdGUiKSU+JQogZ2dwbG90KCBhZXMoeD1hcnREYXRlLCB5PXZhbHVlLCBmaWxsPXZhcmlhYmxlKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyB5bGFiKCJ2YWx1ZSIpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPW15Y29sb3JzKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQpgYGAKCj4g55Sx5pa85oiR5YCR55qE6LOH5paZ77yMMTLjgIE15pyI6LOH5paZ5aSq5bCR77yM5omA5Lul5bCH6YCZ5YWp5YCL5pyI5Y676Zmk77yM5Lul5Y+KTm9uZeeahOS4u+mhjAoKCiMjIyMg5Y676Zmk562G5pW45bCR5pyI5Lu944CB5Y+KTm9uZeeahOS4u+mhjApgYGB7ciB3YXJuaW5nPUZBTFNFfQpuZXdzX3RvcGljICU+JQogIGZpbHRlciggIWZvcm1hdChhcnREYXRlLCclWSVtJykgJWluJSBjKDIwMTkxMiwyMDIwMDUpKSU+JQogIGRwbHlyOjpzZWxlY3QoLU5vbmUpJT4lCiAgZ3JvdXBfYnkoYXJ0RGF0ZSA9IGZvcm1hdChhcnREYXRlLCclWSVtJykpICU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBzdW0sIG5hLnJtID0gVFJVRSkgJT4lCiAgbWVsdChpZC52YXJzID0gImFydERhdGUiKSU+JQogZ2dwbG90KCBhZXMoeD1hcnREYXRlLCB5PXZhbHVlLCBmaWxsPXZhcmlhYmxlKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyB5bGFiKCJ2YWx1ZSIpICsgCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9bXljb2xvcnMpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCmBgYAoKPiDlj6/ku6XnnIvlh7rmr4/lgIvmnIjnmoTogbLph4/vvIzkvYbmmK/kuI3og73lvojmuIXmpZrlh7rmr4/lgIvmnIjnmoTmr5TkvosKCiMjIyMg5Lul5q+U5L6L5LqG6Kej5Li76aGM5pmC6ZaT6K6K5YyWCmBgYHtyIHdhcm5pbmc9RkFMU0V9Cm5ld3NfdG9waWMgJT4lCiAgZmlsdGVyKCAhZm9ybWF0KGFydERhdGUsJyVZJW0nKSAlaW4lIGMoMjAxOTEyLDIwMjAwNSkpJT4lCiAgZHBseXI6OnNlbGVjdCgtTm9uZSklPiUKICBncm91cF9ieShhcnREYXRlID0gZm9ybWF0KGFydERhdGUsJyVZJW0nKSkgJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIHN1bSwgbmEucm0gPSBUUlVFKSAlPiUKbWVsdChpZC52YXJzID0gImFydERhdGUiKSU+JQogIGdyb3VwX2J5KGFydERhdGUpJT4lCiAgbXV0YXRlKHRvdGFsX3ZhbHVlID1zdW0odmFsdWUpKSU+JQogZ2dwbG90KCBhZXMoeD1hcnREYXRlLCB5PXZhbHVlL3RvdGFsX3ZhbHVlLCBmaWxsPXZhcmlhYmxlKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyB5bGFiKCJwcm9wb3J0aW9uIikgKyAKICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPW15Y29sb3JzKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQpgYGAKCj4g54++5Zyo5oiR5YCR5Y+v5Lul55yL5Yiw5q+P5YCL5pyI5Li76aGM55qE5L2U5q+U5LqG77yBCgoKIyMg6KOc5YWFCisg5Y+D6ICDIGh0dHA6Ly90ZXh0MnZlYy5vcmcvdG9waWNfbW9kZWxpbmcuaHRtbCNsYXRlbnRfZGlyaWNobGV0X2FsbG9jYXRpb24KYGBge3J9CmxpYnJhcnkodGV4dDJ2ZWMpCmxpYnJhcnkodWRwaXBlKQp0b2tlbnMgPC0gbmV3cyAlPiUKICB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlLCB0b2tlbj1uZXdzX3Rva2VuaXplcikgJT4lCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KHdvcmQsIHJlZ2V4KCJbMC05YS16QS1aXSIpKSkKYGBgCgojIyMg5bu656uLRFRNIG1hdHJpeApgYGB7cn0KZHRmIDwtIGRvY3VtZW50X3Rlcm1fZnJlcXVlbmNpZXModG9rZW5zLCBkb2N1bWVudCA9ICJhcnRVcmwiLCB0ZXJtID0gIndvcmQiKQpkdG0gPC0gZG9jdW1lbnRfdGVybV9tYXRyaXgoeCA9IGR0ZikKZHRtX2NsZWFuIDwtIGR0bV9yZW1vdmVfbG93ZnJlcShkdG0sIG1pbmZyZXEgPSAzMCkKZGltKGR0bV9jbGVhbikKYGBgCgojIyMgTERBIOaooeWeiwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKc2V0LnNlZWQoMjAxOSkKCnRvcGljX24gPSAxMAoKbGRhX21vZGVsID10ZXh0MnZlYzo6TERBJG5ldyhuX3RvcGljcyA9IHRvcGljX24sZG9jX3RvcGljX3ByaW9yID0gMC4xLCB0b3BpY193b3JkX3ByaW9yID0gMC4wMDEpCmRvY190b3BpY19kaXN0ciA9bGRhX21vZGVsJGZpdF90cmFuc2Zvcm0oZHRtX2NsZWFuLCBuX2l0ZXIgPSAxMDAwLCBjb252ZXJnZW5jZV90b2wgPSAxZS01LGNoZWNrX2NvbnZlcmdlbmNlX2V2ZXJ5X24gPSAxMDApCmBgYAoKPiDpgJnlgIvmr5R0b3BpY21vZGVsc+eahHBhY2thZ2Xot5Hlv6votoXlpJrlgI0KCiMjIyDkuIDmqKPlj6/ku6XnlKhMREF2aXPnmoTlpZfku7bkvobnnIsKYGBge3J9CmxkYV9tb2RlbCRnZXRfdG9wX3dvcmRzKG4gPSAxMCwgbGFtYmRhID0gMC41KSAjIyDmn6XnnIsg5YmNMTDkuLvpoYzlrZcKbGRhX21vZGVsJHBsb3QoKQojIGxkYV9tb2RlbCRwbG90KG91dC5kaXIgPSJsZGFfcmVzdWx0Iiwgb3Blbi5icm93c2VyID0gVFJVRSkKYGBgCgo=