讀取資料
資料描述
- 透過中山管院文字分析平台,取得PTT武漢肺炎討論專版2020-01-26 ~ 2020-04-12的資料,以關鍵字為“口罩”,共取得721篇文章,66792筆回覆。
建立社群網路圖
建立網路關係
IGRAPH 3db0755 DN-- 8452 66792 --
+ attr: name (v/c), artUrl (e/c)
+ edges from 3db0755 (vertex names):
[1] Zarooor ->Simon951434 Zarooor ->Simon951434 cwh0105 ->Simon951434 ECZEMA ->Simon951434 Zarooor ->Simon951434 Zarooor ->Simon951434
[7] ttcml ->Simon951434 coga4712 ->Simon951434 coga4712 ->Simon951434 LEEWY ->Simon951434 harry901 ->nashsaka harry901 ->nashsaka
[13] cloudyst ->nashsaka nashsaka ->nashsaka crownblue ->nashsaka ttcml ->nashsaka Zarooor ->nashsaka love462077 ->nashsaka
[19] nashsaka ->nashsaka carmot ->nashsaka carmot ->nashsaka jimmylily ->nashsaka pigdog0305 ->nashsaka sungel ->nashsaka
[25] mcyangtw ->nashsaka heavenlyken->nashsaka ANCEE ->nashsaka ardella ->nashsaka ardella ->nashsaka ardella ->nashsaka
[31] gosy1102 ->nashsaka Lenore ->nashsaka Lenore ->nashsaka Lenore ->nashsaka Lenore ->nashsaka Lenore ->nashsaka
[37] Lenore ->nashsaka oceanfishwu->zxcdewsaq oceanfishwu->zxcdewsaq gemini6479 ->zxcdewsaq gemini6479 ->zxcdewsaq ilanese ->zxcdewsaq
[43] kashi77331 ->ilanese kashi77331 ->ilanese BITMajo ->ilanese BITMajo ->ilanese noyesray ->ilanese justin81828->ilanese
+ ... omitted several edges
網路圖

可以發現密密麻麻的東西,完全看不出個所以然。我們試着放少一點的東西來試試。
調整參數

還是沒什麼好解釋的,我們試着縮小文章的數量看看。
資料篩選
過濾使用者後

可以稍微看出圖中的點(人)之間有一定的關聯,不過目前只有單純圖形我們無法分析其中的內容。
因此以下我們將資料集中的資訊加到我們的圖片中。
加強圖像的顯示資訊(1)

加強圖像的顯示資訊(2)

我們可以看到基本的使用者關係,但是我們希望能夠將更進階的資訊視覺化。
例如:使用者經常參與的文章種類,或是使用者在該社群網路中是否受到歡迎。
主題分類
詳細內容請參考第十週的課程
前處理
Read 30 items
Read 1225 items
[1] TRUE
<<DocumentTermMatrix (documents: 721, terms: 2992)>>
Non-/sparse entries: 44471/2112761
Sparsity : 98%
Maximal term length: 10
Weighting : term frequency (tf)
LDA 主題分析
# LDA分成4個主題
mask_lda <- LDA(mask_dtm, k = 4, control = list(seed = 1234))
# 看各群的常用詞彙
tidy(mask_lda, matrix = "beta") %>%
filter(! term %in% c("口罩")) %>%
group_by(topic) %>%
top_n(10, beta) %>%
ungroup() %>%
mutate(topic = as.factor(topic),
term = reorder_within(term, beta, topic)) %>%
ggplot(aes(term, beta, fill = topic)) +
geom_col(show.legend = FALSE) +
facet_wrap(~ topic, scales = "free") +
coord_flip() +
scale_x_reordered()

可以歸納出
topic 1 = “口罩預購”
topic 2 還需要再細分
topic 3 = “各國疫情”
topic 4 = “口罩產能”
以下我們挑出第一個主題與第三個主題來做比較。
使用者經常參與的文章種類
# 建立網路關係
reviewNetwork <- graph_from_data_frame(d=link, v=filtered_user, directed=F)
# 依據使用者身份對點進行上色
labels <- degree(reviewNetwork)
V(reviewNetwork)$label <- names(labels)
V(reviewNetwork)$color <- ifelse(V(reviewNetwork)$type=="poster", "gold", "lightblue")
# 依據回覆發生的文章所對應的主題,對他們的關聯線進行上色
E(reviewNetwork)$color <- ifelse(E(reviewNetwork)$topic == "1", "lightgreen", "palevioletred")
# 畫出社群網路圖
set.seed(5432)
plot(reviewNetwork, vertex.size=3, edge.width=3, vertex.label.dist=1,
vertex.label=ifelse(degree(reviewNetwork) > 7, V(reviewNetwork)$label, NA),vertex.label.font=2)
# 加入標示
legend("bottomright", c("發文者","回文者"), pch=21,
col="#777777", pt.bg=c("gold","lightblue"), pt.cex=1, cex=1)

可以看出帳號“OverInfinity”和“ptt8592”所發的文多在討論口罩預購的主題,
帳號“nightwing”和“kuma660224”等所發的玟多在討論各國疫情的主題。
使用者是否受到歡迎
# PTT的回覆有三種,推文、噓文、箭頭
# 我們只要看推噓就好,因此把箭頭清掉
link <- posts_Reviews %>%
filter(cmtStatus!="→") %>%
group_by(cmtPoster, artUrl) %>%
filter(n()>5) %>%
ungroup() %>%
select(cmtPoster, artPoster, artUrl, cmtStatus) %>%
unique()
# 接下來把網路圖畫出來,跟前面做的事都一樣,因此不再細述
# 篩選link中有出現的使用者
filtered_user <- userList %>%
filter(user%in%link$cmtPoster | user%in%link$artPoster) %>%
arrange(desc(type))
# 建立網路關係
reviewNetwork <- graph_from_data_frame(d=link, v=filtered_user, directed=F)
# 依據使用者身份對點進行上色
labels <- degree(reviewNetwork)
V(reviewNetwork)$label <- names(labels)
V(reviewNetwork)$color <- ifelse(V(reviewNetwork)$type=="poster", "gold", "lightblue")
# 依據回覆發生的文章所對應的主題,對他們的關聯線進行上色
E(reviewNetwork)$color <- ifelse(E(reviewNetwork)$cmtStatus == "推", "lightgreen", "palevioletred")
# 畫出社群網路圖
set.seed(5432)
plot(reviewNetwork, vertex.size=2, edge.width=3, vertex.label.dist=1,
vertex.label=ifelse(degree(reviewNetwork) > 5, V(reviewNetwork)$label, NA),vertex.label.font=2)
# 加入標示
legend("bottomright", c("發文者","回文者"), pch=21,
col="#777777", pt.bg=c("gold","lightblue"), pt.cex=1, cex=1)

因nCoV2019看板中幾乎沒有噓文,因此所有的連線幾乎都為綠色。
結語:
使用network的視覺化可以讓我們對於網路中的使用者及他們在這個網路中可能扮演的角色有更多地瞭解。
LS0tCnRpdGxlOiAi5YiG5p6QbkNvVjIwMTnos4fmlpnpm4bkuK3oqI7oq5bogIXkuYvntrLot6/pl5zkv4IiCmF1dGhvcjogIkt1bi1Ic2lhbmcgQ2hlbiIKZGF0ZTogIjIwMjAvMDUvMTMiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzCiAgICB0aGVtZTogZmxhdGx5CiAgICBjc3M6IHN0eWxlLmNzcwotLS0KCiMg57O757Wx6Kit572uCiMjIyDlronoo53pnIDopoHnmoRwYWNrYWdlcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwYWNrYWdlcyA9IGMoInJlYWRyIiwgImRwbHlyIiwgImppZWJhUiIsICJ0aWR5ciIsICJ0aWR5dGV4dCIsICJpZ3JhcGgiLCAidG9waWNtb2RlbHMiLCAiZ2dwbG90MiIsICJzdHJpbmdyIikKZXhpc3RpbmcgPSBhcy5jaGFyYWN0ZXIoaW5zdGFsbGVkLnBhY2thZ2VzKClbLDFdKQpmb3IocGtnIGluIHBhY2thZ2VzWyEocGFja2FnZXMgJWluJSBleGlzdGluZyldKSBpbnN0YWxsLnBhY2thZ2VzKHBrZykKYGBgCgojIyMg6LyJ5YWlcGFja2FnZXMKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeShqaWViYVIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkodGlkeXRleHQpCmxpYnJhcnkoaWdyYXBoKQpsaWJyYXJ5KHRvcGljbW9kZWxzKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkoZ2dwbG90MikKYGBgCgojIOiugOWPluizh+aWmQoKIyMjIOizh+aWmeaPj+i/sAorIOmAj+mBjuS4reWxseeuoemZouaWh+Wtl+WIhuaekOW5s+WPsO+8jOWPluW+l1BUVOatpua8ouiCuueCjuiojuirluWwiOeJiDIwMjAtMDEtMjYgfiAyMDIwLTA0LTEy55qE6LOH5paZ77yM5Lul6Zec6Y215a2X54K6IuWPo+e9qSLvvIzlhbHlj5blvpc3MjHnr4fmlofnq6DvvIw2Njc5MuethuWbnuimhuOAggoKIyMjIOi8ieWFpVBUVOatpua8ouiCuueCjueJiOizh+aWmQpgYGB7ciBtZXNzYWdlPUZBTFNFfQojIOaWh+eroOizh+aWmQpwb3N0cyA8LSByZWFkX2NzdigiLi9uQ29WXzIwMTlfbWFza19hcnRpY2xlTWV0YURhdGEuY3N2IikKcG9zdHMKYGBgCgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KIyDlm57opobos4fmlpkKcmV2aWV3cyA8LSByZWFkX2NzdigiLi9uQ29WXzIwMTlfbWFza19hcnRpY2xlUmV2aWV3cy5jc3YiKQpyZXZpZXdzCmBgYAoKYGBge3J9CiMg6YG45Y+W6ZyA6KaB55qE5qyE5L2NCnJldmlld3MgPC0gcmV2aWV3cyAlPiUKICAgICAgc2VsZWN0KGFydFVybCwgY210UG9zdGVyLCBjbXRTdGF0dXMsIGNtdENvbnRlbnQpCnJldmlld3MKYGBgCgojIOizh+aWmemgkOimvQoKIyMjCmBgYHtyfQpwb3N0cyAlPiUgCiAgZ3JvdXBfYnkoYXJ0RGF0ZSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSU+JQogIGdncGxvdChhZXMoYXJ0RGF0ZSxjb3VudCkpKwogICAgZ2VvbV9saW5lKGNvbG9yPSJibHVlIiwgc2l6ZT0xKSsKICAgIHRoZW1lX2NsYXNzaWMoKQpgYGAKCiMjIyDnmbzmlofogIXmlbjph48KYGBge3J9Cmxlbmd0aCh1bmlxdWUocG9zdHMkYXJ0UG9zdGVyKSkKYGBgCgojIyMg5Zue6KaG6ICF5pW46YePCmBgYHtyfQpsZW5ndGgodW5pcXVlKHJldmlld3MkY210UG9zdGVyKSkKYGBgCgojIyMg57i95YWx5pyJ5Y+D6IiH55qE5Lq65pW4CmBgYHtyfQphbGxQb3N0ZXIgPC0gYyhwb3N0cyRhcnRQb3N0ZXIsIHJldmlld3MkY210UG9zdGVyKQpsZW5ndGgodW5pcXVlKGFsbFBvc3RlcikpCmBgYAoKIyMjIOaVtOeQhuaJgOacieWPg+iIh+S6ugpgYGB7cn0KIyDmlbTnkIbmiYDmnInlh7rnj77pgY7lvpfkvb/nlKjogIUKIyDlpoLmnpzlroPmm77nmbzpgY7mlofnmoToqbHlsLHmqJnoqLvku5bniLJwb3N0ZXIKIyDlpoLmnpzmspLmnInnmbzpgY7mlofnmoToqbHliYfmqJnoqLvku5bniLJyZXBseWVyCnVzZXJMaXN0IDwtIGRhdGEuZnJhbWUodXNlcj11bmlxdWUoYWxsUG9zdGVyKSkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKHR5cGU9aWZlbHNlKHVzZXIlaW4lcG9zdHMkYXJ0UG9zdGVyLCAicG9zdGVyIiwgInJlcGx5ZXIiKSkKdXNlckxpc3QKYGBgCgoKIyDlu7rnq4vnpL7nvqTntrLot6/lnJYKIyMjIOWwh+WOn+aWh+iIh+WbnuimhkpvaW7otbfkvoYKYGBge3J9CiMg5oqK5Y6f5paH6IiH5Zue6KaG5L6d5pOaYXJ0VXJsIGlubmVySm9pbui1t+S+hgpwb3N0c19SZXZpZXdzIDwtIG1lcmdlKHggPSBwb3N0cywgeSA9IHJldmlld3MsIGJ5ID0gImFydFVybCIpCnBvc3RzX1Jldmlld3MKYGBgCgojIyMg56+p6YG45qyE5L2NCmBgYHtyfQojIOWPluWHuiBjbXRQb3N0ZXIo5Zue6KaG6ICFKeOAgWFydFBvc3RlcijnmbzmlofogIUp44CBYXJ0VXJsKOaWh+eroOmAo+e1kCkg5LiJ5YCL5qyE5L2NCmxpbmsgPC0gcG9zdHNfUmV2aWV3cyAlPiUKICAgICAgc2VsZWN0KGNtdFBvc3RlciwgYXJ0UG9zdGVyLCBhcnRVcmwpCmxpbmsKYGBgCgojIyMg5bu656uL57ay6Lev6Zec5L+CCmBgYHtyfQpyZXZpZXdOZXR3b3JrIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShkPWxpbmssIGRpcmVjdGVkPVQpCnJldmlld05ldHdvcmsKYGBgCgojIyMg57ay6Lev5ZyWCmBgYHtyfQojIOeVq+WHuue2sui3r+WclgpwbG90KHJldmlld05ldHdvcmspCmBgYAo+IOWPr+S7peeZvOePvuWvhuWvhum6u+m6u+eahOadseilv++8jOWujOWFqOeci+S4jeWHuuWAi+aJgOS7peeEtuOAguaIkeWAkeippuedgOaUvuWwkeS4gOm7nueahOadseilv+S+huippuippuOAggoKIyMjIOiqv+aVtOWPg+aVuApgYGB7cn0KIyDmiorpu57pu57nmoTlpKflsI/lkoznt5rnmoTnspfntLDoqr/lsI/vvIzkuKbkuI3poa/npLrkvb/nlKjogIXos6zomZ/jgIIKcGxvdChyZXZpZXdOZXR3b3JrLCB2ZXJ0ZXguc2l6ZT0yLCBlZGdlLmFycm93LnNpemU9LjIsdmVydGV4LmxhYmVsPU5BKQpgYGAKPiDpgoTmmK/mspLku4Dpurzlpb3op6Pph4vnmoTvvIzmiJHlgJHoqabnnYDnuK7lsI/mlofnq6DnmoTmlbjph4/nnIvnnIvjgIIKCiMg6LOH5paZ56+p6YG4CiMjIyDmjJHlh7oyMDIwLTAzLTAx55W25aSp55qE5paH56ug5ZKM5a6D55qE5Zue6KaGCmBgYHtyfQpsaW5rIDwtIHBvc3RzX1Jldmlld3MgJT4lCiAgICAgIGZpbHRlcihhcnREYXRlID09IGFzLkRhdGUoJzIwMjAtMDMtMDEnKSkgJT4lCiAgICAgIHNlbGVjdChjbXRQb3N0ZXIsIGFydFBvc3RlciwgYXJ0VXJsKSAlPiUgCiAgICAgIHVuaXF1ZSgpCmxpbmsKYGBgCgojIyMg6YGO5r++5ZyW5Lit55qE6bueKHYpCmBgYHtyfQojIOmAmemCiuimgeevqemBuGxpbmvkuK3mnInlh7rnj77nmoTkvb/nlKjogIUKIyDlm6DniLLlpoLmnpx1c2VyTGlzdO+8iGlncmFwaOS4rWdyYXBoX2Zyb21fZGF0YV9mcmFtZeeahHblj4PmlbjlkIPnmoTpgqPlgIvmnbHopb/vvInkuK3lh7rnj77kuobmspLmnInlnKhsaW5r5Lit5Ye654++55qE5L2/55So6ICFCiMg5Lmf5pyD6KKraWdyYXBo55Wr5LiK5Y6777yM5ZyW54mH5bCx5pyD6K6K5b6X5rKS5pyJ5oSP576pCiMg5oOz6KaB55yL5pyD6K6K5oCO6bq85qij55qE5Lq65Y+v5Lul6LeR5LiA5LiL5LiL6Z2i55qEY29kZQpmaWx0ZXJlZF91c2VyIDwtIHVzZXJMaXN0ICU+JQogICAgICAgICAgZmlsdGVyKHVzZXIlaW4lbGluayRjbXRQb3N0ZXIgfCB1c2VyJWluJWxpbmskYXJ0UG9zdGVyKSAlPiUKICAgICAgICAgIGFycmFuZ2UoZGVzYyh0eXBlKSkKZmlsdGVyZWRfdXNlcgpgYGAKCiMjIyDmnKrpgY7mv77kvb/nlKjogIUKYGBge3J9CiMjIOitpuWRiu+8geacieWvhumbhuaBkOaHvOeXh+eahOS6uuiri+Wwj+W/g+S9v+eUqAojcmV2aWV3TmV0d29yayA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZD1saW5rLCB2PXVzZXJMaXN0LCBkaXJlY3RlZD1UKQojcGxvdChyZXZpZXdOZXR3b3JrLCB2ZXJ0ZXguc2l6ZT0zLCBlZGdlLmFycm93LnNpemU9MC4zLHZlcnRleC5sYWJlbD1OQSkKYGBgCgojIyMg6YGO5r++5L2/55So6ICF5b6MCmBgYHtyfQpzZXQuc2VlZCg0ODcpCiMg5bu656uL57ay6Lev6Zec5L+C5ZyW77yM5Zug54iy5Ymb5Ymb55yL55qE5pmC5YCZ5oSf6Ka6566t6aCt5pyJ6bue56SZ55y877yMCiMg5omA5Lul6YCZ6KOP5oiR5YCR5YWI5oqK6Zec5L+C55qE5pa55ZCR5oCn5ou/5o6J77yM5rib5bCR5ZyW54mH5Lit55qE5LiN5b+F6KaB55qE6LOH6KiKCnJldmlld05ldHdvcmsgPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGQ9bGluaywgdj1maWx0ZXJlZF91c2VyLCBkaXJlY3RlZD1GKQpwbG90KHJldmlld05ldHdvcmssIHZlcnRleC5zaXplPTMsIGVkZ2UuYXJyb3cuc2l6ZT0wLjMsdmVydGV4LmxhYmVsPU5BKQpgYGAKPiDlj6/ku6XnqI3lvq7nnIvlh7rlnJbkuK3nmoTpu54o5Lq6KeS5i+mWk+acieS4gOWumueahOmXnOiBr++8jOS4jemBjuebruWJjeWPquacieWWrue0lOWcluW9ouaIkeWAkeeEoeazleWIhuaekOWFtuS4reeahOWFp+WuueOAgjxicj4K5Zug5q2k5Lul5LiL5oiR5YCR5bCH6LOH5paZ6ZuG5Lit55qE6LOH6KiK5Yqg5Yiw5oiR5YCR55qE5ZyW54mH5Lit44CCCgojIyMg5Yqg5by35ZyW5YOP55qE6aGv56S66LOH6KiKKDEpCmBgYHtyfQpzZXQuc2VlZCg0ODcpCiMg55So5L2/55So6ICF55qE6Lqr5Lu95L6G5Y2A5YiG6bue55qE6aGP6Imy77yM5aaC5p6c5pyJ55m85paH55qE6Kmx5piv6YeR6Imy55qE77yM5Y+q5pyJ5Zue6KaG5paH56ug55qE5YmH55So5re66JeN6Imy6KGo56S6ClYocmV2aWV3TmV0d29yaykkY29sb3IgPC0gaWZlbHNlKFYocmV2aWV3TmV0d29yaykkdHlwZT09InBvc3RlciIsICJnb2xkIiwgImxpZ2h0Ymx1ZSIpCnBsb3QocmV2aWV3TmV0d29yaywgdmVydGV4LnNpemU9MywgZWRnZS5hcnJvdy5zaXplPTAuMyx2ZXJ0ZXgubGFiZWw9TkEpCmBgYAoKIyMjIOWKoOW8t+WcluWDj+eahOmhr+ekuuizh+ioiigyKQpgYGB7cn0Kc2V0LnNlZWQoNDg3KQojIOevqemBuOimgemhr+ekuuWHuueahOS9v+eUqOiAhe+8jOS7peWFjeWcluW9ouiiq+WvhuWvhum6u+m6u+eahOaWh+Wtl+imhuiTiwojIOmhr+ekuuaciei2hemBjjXlgIvpl5zoga/nmoTkvb/nlKjogIXos6zomZ8KbGFiZWxzIDwtIGRlZ3JlZShyZXZpZXdOZXR3b3JrKQpWKHJldmlld05ldHdvcmspJGxhYmVsIDwtIG5hbWVzKGxhYmVscykKClYocmV2aWV3TmV0d29yaykkY29sb3IgPC0gaWZlbHNlKFYocmV2aWV3TmV0d29yaykkdHlwZT09InBvc3RlciIsICJnb2xkIiwgImxpZ2h0Ymx1ZSIpCnBsb3QocmV2aWV3TmV0d29yaywgdmVydGV4LnNpemU9MywgZWRnZS5hcnJvdy5zaXplPTAuMiwKICAgICB2ZXJ0ZXgubGFiZWw9aWZlbHNlKGRlZ3JlZShyZXZpZXdOZXR3b3JrKSA+IDUsIFYocmV2aWV3TmV0d29yaykkbGFiZWwsIE5BKSwgIHZlcnRleC5sYWJlbC5mb250PTIpCmBgYAo+IOaIkeWAkeWPr+S7peeci+WIsOWfuuacrOeahOS9v+eUqOiAhemXnOS/gu+8jOS9huaYr+aIkeWAkeW4jOacm+iDveWkoOWwh+abtOmAsumajueahOizh+ioiuimluimuuWMluOAgjxicj4K5L6L5aaC77ya5L2/55So6ICF57aT5bi45Y+D6IiH55qE5paH56ug56iu6aGe77yM5oiW5piv5L2/55So6ICF5Zyo6Kmy56S+576k57ay6Lev5Lit5piv5ZCm5Y+X5Yiw5q2h6L+O44CCCgojIOS4u+mhjOWIhumhngo+IOips+e0sOWFp+Wuueiri+WPg+iAg+esrOWNgemAseeahOiqsueoiwoKIyMjIOWJjeiZleeQhgpgYGB7cn0KIyDmlofnq6Dmlrflj6UKbWFza19tZXRhIDwtIHBvc3RzICU+JQogICAgICAgICAgICAgIG11dGF0ZShzZW50ZW5jZT1nc3ViKCJbXG5dezIsfSIsICLjgIIiLCBzZW50ZW5jZSkpCiMg5Lul5YWo5b2i5oiW5Y2K5b2iIOmpmuatjuiZn+OAgeWVj+iZn+OAgeWIhuiZnyDku6Xlj4og5YWo5b2i5Y+l6JmfIOeIsuS+neaTmumAsuihjOaWt+WPpQptYXNrX3NlbnRlbmNlcyA8LSBzdHJzcGxpdChtYXNrX21ldGEkc2VudGVuY2UsIlvjgILvvIHvvJvvvJ8hPztdIikKIyDlsIfmr4/lj6Xlj6XlrZDvvIzoiIfku5bmiYDlsaznmoTmlofnq6DpgKPntZDphY3lsI3otbfkvobvvIzmlbTnkIbmiJDkuIDlgItkYXRhZnJhbWUKbWFza19zZW50ZW5jZXMgPC0gZGF0YS5mcmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgYXJ0VXJsID0gcmVwKG1hc2tfbWV0YSRhcnRVcmwsIHNhcHBseShtYXNrX3NlbnRlbmNlcywgbGVuZ3RoKSksIAogICAgICAgICAgICAgICAgICAgICAgICBzZW50ZW5jZSA9IHVubGlzdChtYXNrX3NlbnRlbmNlcykKICAgICAgICAgICAgICAgICAgICAgICkgJT4lCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIXN0cl9kZXRlY3Qoc2VudGVuY2UsIHJlZ2V4KCJeKFx0fFxufCApKiQiKSkpCm1hc2tfc2VudGVuY2VzJHNlbnRlbmNlIDwtIGFzLmNoYXJhY3RlcihtYXNrX3NlbnRlbmNlcyRzZW50ZW5jZSkKbWFza19zZW50ZW5jZXMKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQojIyDmlofnq6DmlrfoqZ4KIyBsb2FkIG1hc2tfbGV4aWNvbgptYXNrX2xleGljb24gPC0gc2NhbihmaWxlID0gIi4vZGljdC9tYXNrX2xleGljb24udHh0Iiwgd2hhdD1jaGFyYWN0ZXIoKSxzZXA9J1xuJywgCiAgICAgICAgICAgICAgICAgICBlbmNvZGluZz0ndXRmLTgnLGZpbGVFbmNvZGluZz0ndXRmLTgnKQojIGxvYWQgc3RvcCB3b3JkcwpzdG9wX3dvcmRzIDwtIHNjYW4oZmlsZSA9ICIuL2RpY3Qvc3RvcF93b3Jkcy50eHQiLCB3aGF0PWNoYXJhY3RlcigpLHNlcD0nXG4nLCAKICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPSd1dGYtOCcsZmlsZUVuY29kaW5nPSd1dGYtOCcpCiMg5L2/55So6buY6KqN5Y+D5pW45Yid5aeL5YyW5LiA5YCL5pa36Kme5byV5pOOCmppZWJhX3Rva2VuaXplciA9IHdvcmtlcigpCiMg5L2/55So5Y+j572p5a2X5YW46YeN5paw5pa36KmeCm5ld191c2VyX3dvcmQoamllYmFfdG9rZW5pemVyLCBjKG1hc2tfbGV4aWNvbikpCiMgdG9rZW5pemUgZnVuY3Rpb24KY2hpX3Rva2VuaXplciA8LSBmdW5jdGlvbih0KSB7CiAgbGFwcGx5KHQsIGZ1bmN0aW9uKHgpIHsKICAgIGlmKG5jaGFyKHgpPjEpewogICAgICB0b2tlbnMgPC0gc2VnbWVudCh4LCBqaWViYV90b2tlbml6ZXIpCiAgICAgIHRva2VucyA8LSB0b2tlbnNbIXRva2VucyAlaW4lIHN0b3Bfd29yZHNdCiAgICAgICMg5Y675o6J5a2X5Liy6ZW35bqm54iyMeeahOipnuW9mQogICAgICB0b2tlbnMgPC0gdG9rZW5zW25jaGFyKHRva2Vucyk+MV0KICAgICAgcmV0dXJuKHRva2VucykKICAgIH0KICB9KQp9CnRva2VucyA8LSBtYXNrX3NlbnRlbmNlcyAlPiUKICB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlLCB0b2tlbj1jaGlfdG9rZW5pemVyKSAlPiUKICBmaWx0ZXIoIXN0cl9kZXRlY3Qod29yZCwgcmVnZXgoIlswLTlhLXpBLVpdIikpKSAlPiUKICBjb3VudChhcnRVcmwsIHdvcmQpICU+JQogIHJlbmFtZShjb3VudD1uKQp0b2tlbnMKYGBgCgpgYGB7cn0KIyMg5riF55CG5pa36Kme57WQ5p6cCiMg5oyR5Ye657i95Ye654++5qyh5pW45aSn5pa8M+eahOWtlwpyZXNlcnZlZF93b3JkIDwtIHRva2VucyAlPiUgCiAgZ3JvdXBfYnkod29yZCkgJT4lIAogIGNvdW50KCkgJT4lIAogIGZpbHRlcihuID4gMykgJT4lIAogIHVubGlzdCgpCgptYXNrX3JlbW92ZWQgPC0gdG9rZW5zICU+JSAKICBmaWx0ZXIod29yZCAlaW4lIHJlc2VydmVkX3dvcmQpCgptYXNrX2R0bSA8LSBtYXNrX3JlbW92ZWQgJT4lIGNhc3RfZHRtKGFydFVybCwgd29yZCwgY291bnQpCm1hc2tfZHRtCmBgYAoKIyMjIExEQSDkuLvpoYzliIbmnpAKYGBge3J9CiMgTERB5YiG5oiQNOWAi+S4u+mhjAptYXNrX2xkYSA8LSBMREEobWFza19kdG0sIGsgPSA0LCBjb250cm9sID0gbGlzdChzZWVkID0gMTIzNCkpCiMg55yL5ZCE576k55qE5bi455So6Kme5b2ZCnRpZHkobWFza19sZGEsIG1hdHJpeCA9ICJiZXRhIikgJT4lCiAgZmlsdGVyKCEgdGVybSAlaW4lIGMoIuWPo+e9qSIpKSAlPiUgCiAgZ3JvdXBfYnkodG9waWMpICU+JQogIHRvcF9uKDEwLCBiZXRhKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHRvcGljID0gYXMuZmFjdG9yKHRvcGljKSwKICAgICAgICAgdGVybSA9IHJlb3JkZXJfd2l0aGluKHRlcm0sIGJldGEsIHRvcGljKSkgJT4lCiAgZ2dwbG90KGFlcyh0ZXJtLCBiZXRhLCBmaWxsID0gdG9waWMpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAofiB0b3BpYywgc2NhbGVzID0gImZyZWUiKSArCiAgY29vcmRfZmxpcCgpICsKICBzY2FsZV94X3Jlb3JkZXJlZCgpCmBgYAo+IOWPr+S7peatuOe0jeWHujxicj4KdG9waWMgMSA9ICLlj6PnvanpoJDos7wiPGJyPgp0b3BpYyAyIOmChOmcgOimgeWGjee0sOWIhjxicj4KdG9waWMgMyA9ICLlkITlnIvnlqvmg4UiPGJyPgp0b3BpYyA0ID0gIuWPo+e9qeeUouiDvSI8YnI+CuS7peS4i+aIkeWAkeaMkeWHuuesrOS4gOWAi+S4u+mhjOiIh+esrOS4ieWAi+S4u+mhjOS+huWBmuavlOi8g+OAggoKYGBge3J9CiMg5L2/55SoTERB5YiG6aGe5q+P56+H5paH56ug55qE5Li76aGMCm1hc2tfdG9waWNzIDwtIHRpZHkobWFza19sZGEsIG1hdHJpeD0iZ2FtbWEiKSAlPiUgIyDlnKh0aWR5IGZ1bmN0aW9u5Lit5L2/55So5Y+D5pW4ImdhbW1hIuS+huWPluW+lyB0aGV0YeefqemZo+OAggogICAgICAgICAgICAgICAgICBncm91cF9ieShkb2N1bWVudCkgJT4lCiAgICAgICAgICAgICAgICAgIHRvcF9uKDEsIHd0PWdhbW1hKQptYXNrX3RvcGljcwpgYGAKCgojIyMgTERB5Li76aGM6YCy6KGM6KaW6Ka65YyWCmBgYHtyfQojIOaKiuaWh+eroOizh+ioiuWSjOS4u+mhjGpvaW7otbfkvoYKcG9zdHNfUmV2aWV3cyA8LSBtZXJnZSh4ID0gcG9zdHNfUmV2aWV3cywgeSA9IG1hc2tfdG9waWNzLCBieS54ID0gImFydFVybCIsIGJ5Lnk9ImRvY3VtZW50IikKcG9zdHNfUmV2aWV3cwpgYGAKCmBgYHtyfQojIOaMkemBuOWHujIwMjAvMDMvMDHlvoznmoTmlofnq6DvvIwKIyDnr6npgbjmnInlnKgxNeevh+S7peS4iuaWh+eroOWbnuimhuiAhe+8jAojIOaWh+eroOS4u+mhjOatuOmhnueCujEo5Y+j572p6aCQ6LO8KeiIhzMo5ZCE5ZyL55ar5oOFKeiAhe+8jAojIOashOS9jeWPquWPlu+8mmNtdFBvc3RlcijoqZXoq5bogIUpLCBhcnRQb3N0ZXIo55m85paH6ICFKSwgYXJ0VXJsKOaWh+eroOmAo+e1kCksIHRvcGljKOS4u+mhjCkKbGluayA8LSBwb3N0c19SZXZpZXdzICU+JQogICAgICBmaWx0ZXIoYXJ0RGF0ZSA+IGFzLkRhdGUoJzIwMjAtMDMtMDEnKSkgJT4lCiAgICAgIGdyb3VwX2J5KGNtdFBvc3RlciwgYXJ0VXJsKSAlPiUgCiAgICAgIGZpbHRlcihuKCk+MTUpICU+JSAKICAgICAgdW5ncm91cCgpICU+JSAKICAgICAgZmlsdGVyKHRvcGljID09IDEgfCB0b3BpYyA9PSAzKSAlPiUgCiAgICAgIHNlbGVjdChjbXRQb3N0ZXIsIGFydFBvc3RlciwgYXJ0VXJsLCB0b3BpYykgJT4lIAogICAgICB1bmlxdWUoKQpsaW5rCmBgYAoKYGBge3J9CiMg56+p6YG4bGlua+S4reacieWHuuePvueahOS9v+eUqOiAhQpmaWx0ZXJlZF91c2VyIDwtIHVzZXJMaXN0ICU+JQogICAgICAgICAgZmlsdGVyKHVzZXIlaW4lbGluayRjbXRQb3N0ZXIgfCB1c2VyJWluJWxpbmskYXJ0UG9zdGVyKSAlPiUKICAgICAgICAgIGFycmFuZ2UoZGVzYyh0eXBlKSkKZmlsdGVyZWRfdXNlcgpgYGAKCiMjIyDkvb/nlKjogIXntpPluLjlj4PoiIfnmoTmlofnq6DnqK7poZ4KYGBge3J9CiMg5bu656uL57ay6Lev6Zec5L+CCnJldmlld05ldHdvcmsgPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGQ9bGluaywgdj1maWx0ZXJlZF91c2VyLCBkaXJlY3RlZD1GKQoKIyDkvp3mk5rkvb/nlKjogIXouqvku73lsI3pu57pgLLooYzkuIroibIKbGFiZWxzIDwtIGRlZ3JlZShyZXZpZXdOZXR3b3JrKQpWKHJldmlld05ldHdvcmspJGxhYmVsIDwtIG5hbWVzKGxhYmVscykKVihyZXZpZXdOZXR3b3JrKSRjb2xvciA8LSBpZmVsc2UoVihyZXZpZXdOZXR3b3JrKSR0eXBlPT0icG9zdGVyIiwgImdvbGQiLCAibGlnaHRibHVlIikKCiMg5L6d5pOa5Zue6KaG55m855Sf55qE5paH56ug5omA5bCN5oeJ55qE5Li76aGM77yM5bCN5LuW5YCR55qE6Zec6IGv57ea6YCy6KGM5LiK6ImyCkUocmV2aWV3TmV0d29yaykkY29sb3IgPC0gaWZlbHNlKEUocmV2aWV3TmV0d29yaykkdG9waWMgPT0gIjEiLCAibGlnaHRncmVlbiIsICJwYWxldmlvbGV0cmVkIikKCiMg55Wr5Ye656S+576k57ay6Lev5ZyWCnNldC5zZWVkKDU0MzIpCnBsb3QocmV2aWV3TmV0d29yaywgdmVydGV4LnNpemU9MywgZWRnZS53aWR0aD0zLCB2ZXJ0ZXgubGFiZWwuZGlzdD0xLAogICAgIHZlcnRleC5sYWJlbD1pZmVsc2UoZGVncmVlKHJldmlld05ldHdvcmspID4gNywgVihyZXZpZXdOZXR3b3JrKSRsYWJlbCwgTkEpLHZlcnRleC5sYWJlbC5mb250PTIpCgojIOWKoOWFpeaomeekugpsZWdlbmQoImJvdHRvbXJpZ2h0IiwgYygi55m85paH6ICFIiwi5Zue5paH6ICFIiksIHBjaD0yMSwgCiAgY29sPSIjNzc3Nzc3IiwgcHQuYmc9YygiZ29sZCIsImxpZ2h0Ymx1ZSIpLCBwdC5jZXg9MSwgY2V4PTEpCmxlZ2VuZCgidG9wbGVmdCIsIGMoIuWPo+e9qemgkOizvCIsIuWQhOWci+eWq+aDhSIpLCAKICAgICAgIGNvbD1jKCJsaWdodGdyZWVuIiwicGFsZXZpb2xldHJlZCIpLCBsdHk9MSwgY2V4PTEpCmBgYAo+IOWPr+S7peeci+WHuuW4s+iZnyJPdmVySW5maW5pdHki5ZKMInB0dDg1OTIi5omA55m855qE5paH5aSa5Zyo6KiO6KuW5Y+j572p6aCQ6LO855qE5Li76aGM77yMPGJyPgrluLPomZ8ibmlnaHR3aW5nIuWSjCJrdW1hNjYwMjI0IuetieaJgOeZvOeahOeOn+WkmuWcqOiojuirluWQhOWci+eWq+aDheeahOS4u+mhjOOAggoKIyMjIOS9v+eUqOiAheaYr+WQpuWPl+WIsOatoei/jgpgYGB7cn0KIyBQVFTnmoTlm57opobmnInkuInnqK7vvIzmjqjmlofjgIHlmZPmlofjgIHnrq3poK0KIyDmiJHlgJHlj6ropoHnnIvmjqjlmZPlsLHlpb3vvIzlm6DmraTmiornrq3poK3muIXmjokKbGluayA8LSBwb3N0c19SZXZpZXdzICU+JQogICAgICBmaWx0ZXIoY210U3RhdHVzIT0i4oaSIikgJT4lCiAgICAgIGdyb3VwX2J5KGNtdFBvc3RlciwgYXJ0VXJsKSAlPiUgCiAgICAgIGZpbHRlcihuKCk+NSkgJT4lIAogICAgICB1bmdyb3VwKCkgJT4lIAogICAgICBzZWxlY3QoY210UG9zdGVyLCBhcnRQb3N0ZXIsIGFydFVybCwgY210U3RhdHVzKSAlPiUgCiAgICAgIHVuaXF1ZSgpCgojIOaOpeS4i+S+huaKiue2sui3r+WclueVq+WHuuS+hu+8jOi3n+WJjemdouWBmueahOS6i+mDveS4gOaoo++8jOWboOatpOS4jeWGjee0sOi/sAoKIyDnr6npgbhsaW5r5Lit5pyJ5Ye654++55qE5L2/55So6ICFCmZpbHRlcmVkX3VzZXIgPC0gdXNlckxpc3QgJT4lCiAgICAgICAgICBmaWx0ZXIodXNlciVpbiVsaW5rJGNtdFBvc3RlciB8IHVzZXIlaW4lbGluayRhcnRQb3N0ZXIpICU+JQogICAgICAgICAgYXJyYW5nZShkZXNjKHR5cGUpKQoKIyDlu7rnq4vntrLot6/pl5zkv4IKcmV2aWV3TmV0d29yayA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZD1saW5rLCB2PWZpbHRlcmVkX3VzZXIsIGRpcmVjdGVkPUYpCgojIOS+neaTmuS9v+eUqOiAhei6q+S7veWwjem7numAsuihjOS4iuiJsgpsYWJlbHMgPC0gZGVncmVlKHJldmlld05ldHdvcmspClYocmV2aWV3TmV0d29yaykkbGFiZWwgPC0gbmFtZXMobGFiZWxzKQpWKHJldmlld05ldHdvcmspJGNvbG9yIDwtIGlmZWxzZShWKHJldmlld05ldHdvcmspJHR5cGU9PSJwb3N0ZXIiLCAiZ29sZCIsICJsaWdodGJsdWUiKQoKCiMg5L6d5pOa5Zue6KaG55m855Sf55qE5paH56ug5omA5bCN5oeJ55qE5Li76aGM77yM5bCN5LuW5YCR55qE6Zec6IGv57ea6YCy6KGM5LiK6ImyCkUocmV2aWV3TmV0d29yaykkY29sb3IgPC0gaWZlbHNlKEUocmV2aWV3TmV0d29yaykkY210U3RhdHVzID09ICLmjqgiLCAibGlnaHRncmVlbiIsICJwYWxldmlvbGV0cmVkIikKCiMg55Wr5Ye656S+576k57ay6Lev5ZyWCnNldC5zZWVkKDU0MzIpCnBsb3QocmV2aWV3TmV0d29yaywgdmVydGV4LnNpemU9MiwgZWRnZS53aWR0aD0zLCB2ZXJ0ZXgubGFiZWwuZGlzdD0xLAogICAgIHZlcnRleC5sYWJlbD1pZmVsc2UoZGVncmVlKHJldmlld05ldHdvcmspID4gNSwgVihyZXZpZXdOZXR3b3JrKSRsYWJlbCwgTkEpLHZlcnRleC5sYWJlbC5mb250PTIpCgojIOWKoOWFpeaomeekugpsZWdlbmQoImJvdHRvbXJpZ2h0IiwgYygi55m85paH6ICFIiwi5Zue5paH6ICFIiksIHBjaD0yMSwKICBjb2w9IiM3Nzc3NzciLCBwdC5iZz1jKCJnb2xkIiwibGlnaHRibHVlIiksIHB0LmNleD0xLCBjZXg9MSkKbGVnZW5kKCJ0b3BsZWZ0IiwgYygi5o6oIiwi5ZmTIiksIAogICAgICAgY29sPWMoImxpZ2h0Z3JlZW4iLCJwYWxldmlvbGV0cmVkIiksIGx0eT0xLCBjZXg9MSkKYGBgCj4g5ZugbkNvVjIwMTnnnIvmnb/kuK3lub7kuY7mspLmnInlmZPmlofvvIzlm6DmraTmiYDmnInnmoTpgKPnt5rlub7kuY7pg73ngrrntqDoibLjgIIKCj4g57WQ6Kqe77yaPGJyPgrkvb/nlKhuZXR3b3Jr55qE6KaW6Ka65YyW5Y+v5Lul6K6T5oiR5YCR5bCN5pa857ay6Lev5Lit55qE5L2/55So6ICF5Y+K5LuW5YCR5Zyo6YCZ5YCL57ay6Lev5Lit5Y+v6IO95omu5ryU55qE6KeS6Imy5pyJ5pu05aSa5Zyw556t6Kej44CCPGJyPgo=