Ch.0 : 動機分析目的與資料取得

1. 動機與分析目的

去年台灣創下56年來首度沒有颱風登陸的紀錄,這也讓水庫無水進帳,全台面臨缺水的危機,在水利署於2月25日發出的水情燈號中,已有許多縣市進入減量供水的燈色號燈。由於越來越嚴峻的水情,高雄市自4月17日起停止洗車場、公私立游泳池供水等,市府並配合水利署加速開鑿水井。在宿舍的浴室中也出現了應對停水的大水桶。

我們想探討:

  • 在PTT以及Dcard人們對於水情所討論的焦點都有哪些,情緒變化是怎樣的?
  • 各家媒體對於水情的報導有何不同?
  • 各個縣市對於缺水狀況關注的重點是否一樣?
  • 全球對於台灣水情關心的重點又在哪裏?

2. 資料取得及套件載入

資料基本介紹

  • 資料來源: 文字平台收集PTT Gossip版 + Dcard時事版
  • 資料集: PPTnowater_articleMetaData.csv
  • 關鍵字:缺水、水情、水庫、下雨
  • 2021/02/01 ~ 2021/04/25 共得到 886 篇文章。

簡單的資料比較

Dcard的資料量遠少於PTT。可以看出年輕人對於水情的關注度不高。

系統參數設定

[1] "zh_TW.UTF-8/zh_TW.UTF-8/zh_TW.UTF-8/C/zh_TW.UTF-8/en_US.UTF-8"

安裝需要的packages

讀進library

Ch.1 : 資料的基本分析

1. 資料前處理

  • 文章斷詞
  • 資料基本清理

(1). 文章斷詞

設定斷詞引擎

(2). 資料基本清理

  • 日期格式化
  • 去除特殊字元、詞頻太低的字
`summarise()` has grouped output by 'artDate'. You can override using the `.groups` argument.

Ch.2 : 情緒分析以及文字雲

1. 將文章和與LIWC情緒字典做join

四月正負情緒分數折線圖

[1] "2021-02-05" "2021-04-28"

  • 可以看出:3月負面情緒佔據了主導地位,4月又幾天的正面情緒超過了負面情緒

  • 主要原因是4月開始逐漸降雨量增多,尤其是4.25前後高雄有持續幾天的陰天降雨

2. 畫出文字雲

2021-04-25 文字雲

Adding missing grouping variables: `artDate`

因為高雄市長陳其邁昨在臉書PO文分享穿西裝淋雨罩,引發熱議。

2021-04-12 文字雲

水情嚴峻 黃偉哲:台南水庫用水可撐到7月底

  • 清淤:水庫存量下降、水情吃緊,卻也意外迎來清淤的好時機,因此水利署加大清淤力道,去年的清淤量達1440萬立方公尺,創下歷史新高紀錄。

  • 超前部署:超前部署,這3年多來對於區域供水,比如把翡翠水庫的水引到新北、石門水庫引到新竹,不然會更加嚴重。

3.找出情緒字典代表字

算出所有字詞的詞頻(sentiment_sum),找出情緒代表字

4.歸類正負面文章

之前的情緒分析大部分是全部的詞彙加總,接下來將正負面情緒的文章分開,看看能不能發現一些新的東西。接下來歸類文章,將每一篇文章正負面情緒的分數算出來,然後大概分類文章屬於正面還是負面。

Joining, by = "word"
`summarise()` has grouped output by 'artUrl'. You can override using the `.groups` argument.

Ch.3: 各家新聞媒體的情緒分析

  • ETTV:東森
  • UDN:聯合
  • Apple:蘋果

1. 資料前處理

`summarise()` has grouped output by 'artDate'. You can override using the `.groups` argument.
`summarise()` has grouped output by 'artDate'. You can override using the `.groups` argument.
`summarise()` has grouped output by 'artDate'. You can override using the `.groups` argument.

3.將三個新聞網的資料合併做比較

Joining, by = "word"
`summarise()` has grouped output by 'artDate', 'sentiment'. You can override using the `.groups` argument.

可以看出:

  • 只有聯合新聞是有連續每天的在跟進水情的新聞
  • 聯合新聞的情緒詞出現的較多
  • 後期的報導都以正面情緒居多
Joining, by = "word"
`summarise()` has grouped output by 'word'. You can override using the `.groups` argument.
Joining, by = "word"
`summarise()` has grouped output by 'word'. You can override using the `.groups` argument.
Joining, by = "word"
`summarise()` has grouped output by 'word'. You can override using the `.groups` argument.

5.歸類正負面文章

Joining, by = "word"
`summarise()` has grouped output by 'artUrl'. You can override using the `.groups` argument.
Joining, by = "word"
`summarise()` has grouped output by 'artUrl'. You can override using the `.groups` argument.
Joining, by = "word"
`summarise()` has grouped output by 'artUrl'. You can override using the `.groups` argument.

Ch.4: 各個縣市對於水情關注的重點

1.ngram

前後五個字彙

3.出現在各個縣市周圍的詞彙

台南、台中、台北、宜蘭、中南部

  • 台南、高雄:高雄支援台南用水2/25之後轉黃燈 所以暫停支援

  • 台中:台中、苗栗、新竹水情嚴種 4/6起停5供2

  • 宜蘭:台積電為解決缺水,傳出設廠宜蘭的消息

4.其他一些較常出現的詞彙

台積電、民生、農業

  • 台積電: 台灣易缺水缺電擬移設備至南京廠

  • 農業: 農業和半導體為兩大主要用水,缺水問題影響兩大產業

Ch.5: 主題模型的分析

建立LDA模型

統計每篇文章詞頻

The `...` argument of `group_keys()` is deprecated as of dplyr 1.0.0.
Please `group_by()` first
<<DocumentTermMatrix (documents: 741, terms: 3173)>>
Non-/sparse entries: 63859/2287334
Sparsity           : 97%
Maximal term length: 5
Weighting          : term frequency (tf)

兩主題之間相差最大的詞彙

正越大表示越傾向主題二,負越大越傾向主題一,

LDAvis

只分為兩個主題出來的結果並不是很明確,這裡改成分為三個主題。

To stop the server, run servr::daemon_stop(1) or restart your R session
Serving the directory /private/var/folders/ww/lpf7_83x4hb2q8pwlyrcj0vm0000gn/T/RtmpAKESbp/file4cbb29a857bb at http://127.0.0.1:4321

Ch.6:其他

我們分析了Twitter上有關 #Taiwan 和 #drought 作為關鍵字的貼文

發現大家關注的焦點主要是在,晶片和半導體

Ch.7:結論

  • 大家的討論主要還是負面情緒居多,負面情緒的來源主要是希望政府可以對於缺水的情況有更多的作為,以及對於未來水情的擔憂。
  • 各個縣市對於缺水狀況關注的重點,各有不同。
  • 全球對於台灣缺水狀況的反映,主要是對於全球晶片產能的擔憂。
LS0tCnRpdGxlOiAi56S+576k5aqS6auU5pyf5Lit5aCx5ZGKIC0g5pyA6L+R5YWp5YCL5pyI5rC05oOF55qE6KiO6KuW5YiG5p6QIgphdXRob3I6ICLlvLXmg6DojLnjgIHnjovlvJjpipjjgIHpmbPlrqXku7vjgIHokYnmgJ3ljb8iCmRhdGU6ICIyMDIxLzQvMzAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzCiAgICB0aGVtZTogZmxhdGx5CiAgICBjc3M6IHN0eWxlLmNzcwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKIyBDaC4wIDog5YuV5qmf5YiG5p6Q55uu55qE6IiH6LOH5paZ5Y+W5b6XCgojIyAxLiDli5XmqZ/oiIfliIbmnpDnm67nmoQKCuWOu+W5tOWPsOeBo+WJteS4izU25bm05L6G6aaW5bqm5rKS5pyJ6aKx6aKo55m76Zm455qE57SA6YyE77yM6YCZ5Lmf6K6T5rC05bqr54Sh5rC06YCy5biz77yM5YWo5Y+w6Z2i6Ieo57y65rC055qE5Y2x5qmf77yM5Zyo5rC05Yip572y5pa8MuaciDI15pel55m85Ye655qE5rC05oOF54eI6Jmf5Lit77yM5bey5pyJ6Kix5aSa57ij5biC6YCy5YWl5rib6YeP5L6b5rC055qE54eI6Imy6Jmf54eI44CC55Sx5pa86LaK5L6G6LaK5Zq05bO755qE5rC05oOF77yM6auY6ZuE5biC6IeqNOaciDE35pel6LW35YGc5q2i5rSX6LuK5aC044CB5YWs56eB56uL5ri45rOz5rGg5L6b5rC0562J77yM5biC5bqc5Lim6YWN5ZCI5rC05Yip572y5Yqg6YCf6ZaL6ZG/5rC05LqV44CC5Zyo5a6/6IiN55qE5rW05a6k5Lit5Lmf5Ye654++5LqG5oeJ5bCN5YGc5rC055qE5aSn5rC05qG244CCCgrmiJHlgJHmg7PmjqLoqI7vvJoKCisg5ZyoUFRU5Lul5Y+KRGNhcmTkurrlgJHlsI3mlrzmsLTmg4XmiYDoqI7oq5bnmoTnhKbpu57pg73mnInlk6rkupvvvIzmg4Xnt5LororljJbmmK/mgI7mqKPnmoTvvJ8KKyDlkITlrrblqpLpq5TlsI3mlrzmsLTmg4XnmoTloLHlsI7mnInkvZXkuI3lkIzvvJ8KKyDlkITlgIvnuKPluILlsI3mlrznvLrmsLTni4Dms4Hpl5zms6jnmoTph43pu57mmK/lkKbkuIDmqKPvvJ8KKyDlhajnkIPlsI3mlrzlj7DngaPmsLTmg4Xpl5zlv4PnmoTph43pu57lj4jlnKjlk6roo4/vvJ8KCiMjIDIuIOizh+aWmeWPluW+l+WPiuWll+S7tui8ieWFpQoKIyMjIOizh+aWmeWfuuacrOS7i+e0uQoKKyDos4fmlpnkvobmupA6IOaWh+Wtl+W5s+WPsOaUtumbhlBUVCBHb3NzaXDniYggKyBEY2FyZOaZguS6i+eJiAorIOizh+aWmembhu+8miBQUFRub3dhdGVyX2FydGljbGVNZXRhRGF0YS5jc3YKKyDpl5zpjbXlrZfvvJrnvLrmsLTjgIHmsLTmg4XjgIHmsLTluqvjgIHkuIvpm6gKKyAyMDIxLzAyLzAxIH4gMjAyMS8wNC8yNSDlhbHlvpfliLAgODg2IOevh+aWh+eroOOAggoK57Ch5Zau55qE6LOH5paZ5q+U6LyDCgohW10oY29tcGFyZS5wbmcpCgpEY2FyZOeahOizh+aWmemHj+mBoOWwkeaWvFBUVOOAguWPr+S7peeci+WHuuW5tOi8leS6uuWwjeaWvOawtOaDheeahOmXnOazqOW6puS4jemrmOOAggoK57O757Wx5Y+D5pW46Kit5a6aCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KU3lzLnNldGxvY2FsZShjYXRlZ29yeSA9ICJMQ19BTEwiLCBsb2NhbGUgPSAiemhfVFcuVVRGLTgiKSAjIOmBv+WFjeS4reaWh+S6gueivApgYGAKCuWuieijnemcgOimgeeahHBhY2thZ2VzCmBgYHtyIHdhcm5pbmc9RkFMU0V9CiMgZWNobyA9IFQscmVzdWx0cyA9ICdoaWRlJwpwYWNrYWdlcyA9IGMoImRwbHlyIiwgInRpZHl0ZXh0IiwgInN0cmluZ3IiLCAid29yZGNsb3VkMiIsICJnZ3Bsb3QyIiwncmVhZHInLCdkYXRhLnRhYmxlJywncmVzaGFwZTInLCd3b3JkY2xvdWQnLCd0aWR5cicsJ3NjYWxlcycsJ25ncmFtJykKZXhpc3RpbmcgPSBhcy5jaGFyYWN0ZXIoaW5zdGFsbGVkLnBhY2thZ2VzKClbLDFdKQpmb3IocGtnIGluIHBhY2thZ2VzWyEocGFja2FnZXMgJWluJSBleGlzdGluZyldKSBpbnN0YWxsLnBhY2thZ2VzKHBrZykKYGBgCgroroDpgLJsaWJyYXJ5CmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KHdvcmRjbG91ZDIpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KHdvcmRjbG91ZCkKbGlicmFyeSh0aWR5cikKbGlicmFyeShyZWFkcikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoamllYmFSKQpsaWJyYXJ5KG5ncmFtKQoKbGlicmFyeShndXRlbmJlcmdyKQpsaWJyYXJ5KHdpZHlyKQpsaWJyYXJ5KE5MUCkKbGlicmFyeShnZ3JhcGgpCmxpYnJhcnkoaWdyYXBoKQpsaWJyYXJ5KHRtKQpsaWJyYXJ5KHNsYW0pCmxpYnJhcnkoUnRzbmUpCmxpYnJhcnkocmFuZG9tY29sb1IpCmxpYnJhcnkodG9waWNtb2RlbHMpCmxpYnJhcnkoTERBdmlzKQpsaWJyYXJ5KHdlYnNob3QpCmxpYnJhcnkoaHRtbHdpZGdldHMpCmxpYnJhcnkoc2VydnIpCmBgYApgYGB7cn0Kc2V0d2QoIi9Vc2Vycy9hMTIzNC9Eb3dubG9hZHMvcHJvamVjdCIpCmBgYAoKYGBge3J9CiMg5oqK5paH56ug5ZKM55WZ6KiA6K6A6YCy5L6GCk1ldGFEYXRhID0gcmVhZC5jc3YoJ1BQVG5vd2F0ZXJfYXJ0aWNsZU1ldGFEYXRhLmNzdicsZW5jb2RpbmcgPSAnVVRGLTgnKQpSZXZpZXdzICA9IHJlYWQuY3N2KCdQVFRub3dhdGVyX2FydGljbGVSZXZpZXdzLmNzdicsZW5jb2RpbmcgPSAnVVRGLTgnKQoKTWV0YURhdGEkc2VudGVuY2UgPC0gYXMuY2hhcmFjdGVyKE1ldGFEYXRhJHNlbnRlbmNlKQpSZXZpZXdzJGNtdENvbnRlbnQgPC0gYXMuY2hhcmFjdGVyKFJldmlld3MkY210Q29udGVudCkKCiMjIyDnp7vpmaRQVFTosrzmlrDogZ7mmYLmnIPlh7rnj77nmoTmoLzlvI/nlKjlrZcKTWV0YURhdGEgPC0gTWV0YURhdGEgJT4lIAogIG11dGF0ZShzZW50ZW5jZT1nc3ViKCLlqpLpq5TkvobmupB86KiY6ICF572y5ZCNfOWujOaVtOaWsOiBnuaomemhjHzlrozmlbTmlrDogZ7lhafmlod85a6M5pW05paw6IGe6YCj57WQfCjmiJbnn63ntrLlnYApfOWCmeiou3zlgpnoqLvoq4vmlL7mnIDlvozpnaJ86YGV6ICF5paw6IGe5paH56ug5Yiq6ZmkIiwgIiIsIHNlbnRlbmNlKSkKCiMg5oyR6YG45paH56ug5bCN5oeJ55qE55WZ6KiAClJldmlld3MgPSBsZWZ0X2pvaW4oTWV0YURhdGEsIFJldmlld3NbLGMoImFydFVybCIsICJjbXRDb250ZW50IildLCBieSA9ICJhcnRVcmwiKQpgYGAKCiMgQ2guMSA6IOizh+aWmeeahOWfuuacrOWIhuaekAoKIyMgMS4g6LOH5paZ5YmN6JmV55CGCgorIOaWh+eroOaWt+ipngorIOizh+aWmeWfuuacrOa4heeQhgoKKDEpLiDmlofnq6DmlrfoqZ4KCuioreWumuaWt+ipnuW8leaTjgpgYGB7cn0KIyDliqDlhaXoh6rlrprnvqnnmoTlrZflhbgKamllYmFfdG9rZW5pemVyIDwtIHdvcmtlcih1c2VyPSJkaWN0L3VzZXJfZGljdC50eHQiLCBzdG9wX3dvcmQgPSAiZGljdC9zdG9wX3dvcmRzLnR4dCIpCgojIOioreWumuaWt+ipnmZ1bmN0aW9uCmN1c3RvbWl6ZWRfdG9rZW5pemVyIDwtIGZ1bmN0aW9uKHQpIHsKICBsYXBwbHkodCwgZnVuY3Rpb24oeCkgewogICAgdG9rZW5zIDwtIHNlZ21lbnQoeCwgamllYmFfdG9rZW5pemVyKQogICAgdG9rZW5zIDwtIHRva2Vuc1tuY2hhcih0b2tlbnMpPjFdCiAgICByZXR1cm4odG9rZW5zKQogIH0pCn0KYGBgCgpgYGB7cn0KIyDmiormlofnq6DlkoznlZnoqIDnmoTmlrfoqZ7ntZDmnpzkvbXlnKjkuIDotbcKTVRva2VuIDwtIE1ldGFEYXRhICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlLCB0b2tlbj1jdXN0b21pemVkX3Rva2VuaXplcikKUlRva2VuIDwtIFJldmlld3MgJT4lIHVubmVzdF90b2tlbnMod29yZCwgY210Q29udGVudCwgdG9rZW49Y3VzdG9taXplZF90b2tlbml6ZXIpCgojIOaKiuizh+aWmeS9teWcqOS4gOi1twpkYXRhIDwtIHJiaW5kKE1Ub2tlblssYygiYXJ0RGF0ZSIsImFydFVybCIsICJ3b3JkIildLFJUb2tlblssYygiYXJ0RGF0ZSIsImFydFVybCIsIndvcmQiKV0pIApgYGAKCigyKS4g6LOH5paZ5Z+65pys5riF55CGCgorIOaXpeacn+agvOW8j+WMlgorIOWOu+mZpOeJueauiuWtl+WFg+OAgeipnumgu+WkquS9jueahOWtlwoKYGBge3J9CiMg5qC85byP5YyW5pel5pyf5qyE5L2NCmRhdGEkYXJ0RGF0ZT0gZGF0YSRhcnREYXRlICU+JSBhcy5EYXRlKCIlWS8lbS8lZCIpCgojIOmBjua/vueJueauiuWtl+WFgwpkYXRhX3NlbGVjdCA9IGRhdGEgJT4lIAogIGZpbHRlcighZ3JlcGwoJ1tbOnB1bmN0Ol1dJyx3b3JkKSkgJT4lICMg5Y675qiZ6bue56ym6JmfCiAgZmlsdGVyKCFncmVwbCgiWydeMC05YS16J10iLHdvcmQpKSAlPiUgIyDljrvoi7HmlofjgIHmlbjlrZcKICBmaWx0ZXIobmNoYXIoLiR3b3JkKT4xKSAKICAKIyDnrpfmr4/lpKnkuI3lkIzlrZfnmoToqZ7poLsKIyB3b3JkX2NvdW50OmFydERhdGUsd29yZCxjb3VudAp3b3JkX2NvdW50IDwtIGRhdGFfc2VsZWN0ICU+JQogIHNlbGVjdChhcnREYXRlLHdvcmQpICU+JQogIGdyb3VwX2J5KGFydERhdGUsd29yZCkgJT4lCiAgc3VtbWFyaXNlKGNvdW50PW4oKSkgJT4lICAjIOeul+Wtl+ipnuWWruevh+e4veaVuOeUqHN1bW1hcmlzZQogIGZpbHRlcihjb3VudD4zKSAlPiUgICMg6YGO5r++5Ye654++5aSq5bCR5qyh55qE5a2XCiAgYXJyYW5nZShkZXNjKGNvdW50KSkKaGVhZCh3b3JkX2NvdW50KQpgYGAKCgojIyAyLiDmupblgplMSVdD5a2X5YW4Cgo+IOWFqOWQjUxpbmd1aXN0aWMgSW5xdWlyeSBhbmQgV29yZCBDb3VudHPvvIznlLHlv4PnkIblrbjlrrZQZW5uZWJha2Vy5pa8MjAwMeWHuueJiAo+IOWIhueCuuato+WQkeaDhee3kuiIh+iyoOWQkeaDhee3kgoKCmBgYHtyfQoj6K6A5qqU77yM5a2X6Kme6ZaT5LulIiwi5bCH5a2X5YiG6ZqUClAgPC0gcmVhZF9maWxlKCJkaWN0L2xpd2MvcG9zaXRpdmUudHh0IikgIyDmraPlkJHlrZflhbh0eHTmqpQKTiA8LSByZWFkX2ZpbGUoImRpY3QvbGl3Yy9uZWdhdGl2ZS50eHQiKSAjIOiyoOWQkeWtl+WFuHR4dOaqlAoKIyDlsIflrZfkuLLkvp0s5YiG5YmyCiMgc3Ryc3BsaXTlm57lgrNsaXN0ICwg5oiR5YCR5Y+W5Ye6bGlzdOS4reeahOesrOS4gOWAi+WFg+e0oApQID0gc3Ryc3BsaXQoUCwgIiwiKVtbMV1dCk4gPSBzdHJzcGxpdChOLCAiLCIpW1sxXV0KCiMg5bu656uLZGF0YWZyYW1lIOacieWFqeWAi+ashOS9jXdvcmQsc2VudGltZW50c++8jHdvcmTmrITkvY3lhaflrrnmmK/lrZflhbjlkJHph48KUCA9IGRhdGEuZnJhbWUod29yZCA9IFAsIHNlbnRpbWVudCA9ICJwb3NpdGl2ZSIpICM2NjQKTiA9IGRhdGEuZnJhbWUod29yZCA9IE4sIHNlbnRpbWVudCA9ICJuZWdhdGl2ZSIpICMxMDQ3CgojIOaKiuWFqeWAi+Wtl+WFuOaLvOWcqOS4gOi1twpMSVdDID0gcmJpbmQoUCwgTikKYGBgCgojIENoLjIgOiDmg4Xnt5LliIbmnpDku6Xlj4rmloflrZfpm7IKCiMjIDEuIOWwh+aWh+eroOWSjOiIh0xJV0Pmg4Xnt5LlrZflhbjlgZpqb2luCgojIyMg55m85paH5oqY57ea5ZyWCmBgYHtyfQpNZXRhRGF0YSRhcnREYXRlPSBNZXRhRGF0YSRhcnREYXRlICU+JSBhcy5EYXRlKCIlWS8lbS8lZCIpCk1ldGFEYXRhICU+JQogIGdyb3VwX2J5KGFydERhdGUpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lCiAgZ2dwbG90KCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9YXJ0RGF0ZSx5PWNvdW50KSkrCiAgICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVtLyVkIikpKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFydERhdGVbd2hpY2goYXJ0RGF0ZSA9PSBhcy5EYXRlKCcyMDIxLTA0LTEyJykpClsxXV0pKSxjb2xvdXIgPSAicmVkIikgCmBgYAoKPiDmib7lh7rmlofpm4bkuK3vvIzlsI3mlrxMSVdD5a2X5YW45pivcG9zaXRpdmXlkoxuZWdhdGl2ZeeahOWtlwoK566X5Ye65q+P5aSp5oOF57eS57i95ZKMKHNlbnRpbWVudF9jb3VudCkKYGBge3J9CiMgc2VudGltZW50X2NvdW50OmFydERhdGUsc2VudGltZW50LGNvdW50CnNlbnRpbWVudF9jb3VudCA9IGRhdGFfc2VsZWN0ICU+JQogIHNlbGVjdChhcnREYXRlLHdvcmQpICU+JQogIGlubmVyX2pvaW4oTElXQykgJT4lIAogIGdyb3VwX2J5KGFydERhdGUsc2VudGltZW50KSAlPiUKICBzdW1tYXJpc2UoY291bnQ9bigpKSAgCmBgYAoKCiMjIyDkuInmnIjmraPosqDmg4Xnt5LliIbmlbjmipjnt5rlnJYKYGBge3J9CiMg5qqi6KaW6LOH5paZ55qE5pel5pyf5Y2A6ZaTCnJhbmdlKHNlbnRpbWVudF9jb3VudCRhcnREYXRlKQpzZW50aW1lbnRfY291bnQgJT4lCiAgZ2dwbG90KCkrCiAgZ2VvbV9saW5lKGFlcyh4PWFydERhdGUseT1jb3VudCxjb2xvdXI9c2VudGltZW50KSkrCiAgc2NhbGVfeF9kYXRlKGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlbS8lZCIpLAogICAgICAgICAgICAgICBsaW1pdHMgPSBhcy5EYXRlKGMoJzIwMjEtMDMtMDEnLCcyMDIxLTAzLTMxJykpCiAgICAgICAgICAgICAgICkKYGBgCgojIyMg5Zub5pyI5q2j6LKg5oOF57eS5YiG5pW45oqY57ea5ZyWCmBgYHtyfQojIOaqouimluizh+aWmeeahOaXpeacn+WNgOmWkwpyYW5nZShzZW50aW1lbnRfY291bnQkYXJ0RGF0ZSkKc2VudGltZW50X2NvdW50ICU+JQogIGdncGxvdCgpKwogIGdlb21fbGluZShhZXMoeD1hcnREYXRlLHk9Y291bnQsY29sb3VyPXNlbnRpbWVudCkpKwogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSwKICAgICAgICAgICAgICAgbGltaXRzID0gYXMuRGF0ZShjKCcyMDIxLTA0LTAxJywnMjAyMS0wNC0zMCcpKQogICAgICAgICAgICAgICApKwogICMg5Yqg5LiK5qiZ56S65pel5pyf55qE57eaCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXJ0RGF0ZVt3aGljaChzZW50aW1lbnRfY291bnQkYXJ0RGF0ZSA9PSBhcy5EYXRlKCcyMDIxLTA0LTI1JykpClsxXV0pKSxjb2xvdXIgPSAiYmxhY2siKSsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcnREYXRlW3doaWNoKHNlbnRpbWVudF9jb3VudCRhcnREYXRlID09IGFzLkRhdGUoJzIwMjEtMDQtMDMnKSkKWzFdXSkpLGNvbG91ciA9ICJibGFjayIpIApgYGAKCisg5Y+v5Lul55yL5Ye677yaM+aciOiyoOmdouaDhee3kuS9lOaTmuS6huS4u+WwjuWcsOS9je+8jDTmnIjlj4jlub7lpKnnmoTmraPpnaLmg4Xnt5LotoXpgY7kuobosqDpnaLmg4Xnt5IKCisg5Li76KaB5Y6f5Zug5pivNOaciOmWi+Wni+mAkOa8uOmZjembqOmHj+WinuWkmu+8jOWwpOWFtuaYrzQuMjXliY3lvozpq5jpm4TmnInmjIHnuozlub7lpKnnmoTpmbDlpKnpmY3pm6gKCmBgYHtyfQojIOafpeeci+avj+WkqeeahOaDhee3kuWIhuaVuOaOkuWQjQpzaG93X3RvcDMgPC0gc2VudGltZW50X2NvdW50ICU+JQogIHNlbGVjdChjb3VudCxhcnREYXRlKSAlPiUKICBncm91cF9ieShhcnREYXRlKSAlPiUKICBzdW1tYXJpc2Uoc3VtID0gc3VtKGNvdW50KSkgJT4lCiAgYXJyYW5nZShkZXNjKHN1bSkpCgpoZWFkKHNob3dfdG9wMywzKQpgYGAKCiMjIDIuIOeVq+WHuuaWh+Wtl+mbsgoKIyMjIDIwMjEtMDQtMjUg5paH5a2X6ZuyCmBgYHtyfQojIOeVq+WHuuaWh+Wtl+mbsgp3b3JkX2NvdW50ICU+JQogIGZpbHRlcighKHdvcmQgJWluJSBjKCLnvLrmsLQiLCLmsLTluqsiLCLkuIvpm6giLCLlj7DngaMiKSkpICU+JQogIGZpbHRlcihhcnREYXRlID09IGFzLkRhdGUoJzIwMjEtMDQtMjUnKSkgJT4lIAogIHNlbGVjdCh3b3JkLGNvdW50KSAlPiUgCiAgZ3JvdXBfYnkod29yZCkgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICU+JQogIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JQogIGZpbHRlcihjb3VudD4zMCkgJT4lICAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcKICB3b3JkY2xvdWQyKCkKYGBgCgrlm6Dngrrpq5jpm4TluILplbfpmbPlhbbpgoHmmKjlnKjoh4nmm7hQT+aWh+WIhuS6q+epv+ilv+ijnea3i+mbqOe9qe+8jOW8leeZvOeGseitsOOAggoKIyMjIDIwMjEtMDMtMDUg5paH5a2X6ZuyCmBgYHtyfQojIOeVq+WHuuaWh+Wtl+mbsgojIHBsb3RfMDMwNT13b3JkX2NvdW50ICU+JQojICAgZmlsdGVyKCEod29yZCAlaW4lIGMoIue8uuawtCIsIuawtOW6qyIsIuS4i+mbqCIsIuWPsOeBoyIpKSkgJT4lCiMgICBmaWx0ZXIoYXJ0RGF0ZSA9PSBhcy5EYXRlKCcyMDIxLTAzLTA1JykpICU+JSAKIyAgIHNlbGVjdCh3b3JkLGNvdW50KSAlPiUgCiMgICBncm91cF9ieSh3b3JkKSAlPiUgCiMgICBzdW1tYXJpc2UoY291bnQgPSBzdW0oY291bnQpKSAlPiUKIyAgIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JQojICAgZmlsdGVyKGNvdW50PjIwKSAlPiUgICAjIOmBjua/vuWHuuePvuWkquWwkeasoeeahOWtlwojICAgd29yZGNsb3VkMigpCiMgcGxvdF8wMzA1CmBgYAohW10oMzA1LnBuZykKCiMjIyAyMDIxLTA0LTEyIOaWh+Wtl+mbsgpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CiMg55Wr5Ye65paH5a2X6ZuyCiMgcGxvdF8wNDEyID0gd29yZF9jb3VudCAlPiUgCiMgICBmaWx0ZXIoISh3b3JkICVpbiUgYygi57y65rC0Iiwi5rC05bqrIiwi5LiL6ZuoIiwi5Y+w54GjIikpKSAlPiUKIyAgIGZpbHRlcihhcnREYXRlID09IGFzLkRhdGUoJzIwMjEtMDQtMTInKSkgJT4lIAojICAgc2VsZWN0KHdvcmQsY291bnQpICU+JSAKIyAgIGdyb3VwX2J5KHdvcmQpICU+JSAKIyAgIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICU+JQojICAgYXJyYW5nZShkZXNjKGNvdW50KSkgJT4lCiMgICBmaWx0ZXIoY291bnQ+MjApICU+JSAgICMg6YGO5r++5Ye654++5aSq5bCR5qyh55qE5a2XCiMgICB3b3JkY2xvdWQyKCkKIyBwbG90XzA0MTIKYGBgCiFbXSg0MTIucG5nKQoK5rC05oOF5Zq05bO7IOm7g+WBieWTsu+8muWPsOWNl+awtOW6q+eUqOawtOWPr+aSkOWIsDfmnIjlupUKCQkKYGBge3J9CmRhdGFfdG9rZW5zX2RhdGUgPC0gZGF0YV9zZWxlY3QgJT4lIAogIGZpbHRlcighKHdvcmQgJWluJSBjKCLnvLrmsLQiLCLmsLTluqsiLCLkuIvpm6giLCLlj7DngaMiKSkpICU+JSAKICBjb3VudChhcnREYXRlLCB3b3JkLCBzb3J0ID0gVFJVRSkKZGF0YV90b2tlbnNfZGF0ZQpkYXRhX3Rva2Vuc19kYXRlJGFydERhdGUgPC0gZGF0YV90b2tlbnNfZGF0ZSRhcnREYXRlICU+JSBhcy5EYXRlKCIlWS8lbS8lZCIpCgpwbG90X21lcmdlIDwtIGRhdGFfdG9rZW5zX2RhdGUgJT4lIAogIGZpbHRlcihhcnREYXRlID09IjIwMjEtMDQtMTIifCAKICAgICAgIGFydERhdGUgPT0gIjIwMjEtMDMtMDUifCAKICAgICAgIGFydERhdGUgPT0gIjIwMjEtMDQtMjUiIHwKICAgICAgICBhcnREYXRlID09ICIyMDIxLTAzLTI3IiklPiUKICBncm91cF9ieShhcnREYXRlKSAlPiUKICB0b3BfbigxMCxuKSU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSklPiUKICBnZ3Bsb3QoYWVzKHg9IHdvcmQsIHk9bikpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICsKICBmYWNldF93cmFwKH5hcnREYXRlLCBzY2FsZXM9ImZyZWUiLCBuY29sID0gMikgKwogIGNvb3JkX2ZsaXAoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKQpwbG90X21lcmdlCmBgYAoKKyDmuIXmt6TvvJrmsLTluqvlrZjph4/kuIvpmY3jgIHmsLTmg4XlkIPnt4rvvIzljbvkuZ/mhI/lpJbov47kvobmuIXmt6TnmoTlpb3mmYLmqZ/vvIzlm6DmraTmsLTliKnnvbLliqDlpKfmuIXmt6TlipvpgZPvvIzljrvlubTnmoTmuIXmt6Tph4/pgZQxNDQw6JCs56uL5pa55YWs5bC677yM5Ym15LiL5q235Y+y5paw6auY57SA6YyE44CCCgorIOi2heWJjemDqOe9su+8mui2heWJjemDqOe9su+8jOmAmTPlubTlpJrkvoblsI3mlrzljYDln5/kvpvmsLTvvIzmr5TlpoLmiornv6Hnv6DmsLTluqvnmoTmsLTlvJXliLDmlrDljJfjgIHnn7PploDmsLTluqvlvJXliLDmlrDnq7nvvIzkuI3nhLbmnIPmm7TliqDlmrTph43jgIIKCgojIyAzLuaJvuWHuuaDhee3kuWtl+WFuOS7o+ihqOWtlwoK566X5Ye65omA5pyJ5a2X6Kme55qE6Kme6aC7KHNlbnRpbWVudF9zdW0p77yM5om+5Ye65oOF57eS5Luj6KGo5a2XCgojIyMg5q2j6LKg5oOF57eS5Luj6KGo5a2XCmBgYHtyfQojIHNlbnRpbWVudF9zdW06d29yZCxzZW50aW1lbnQsc3VtCnNlbnRpbWVudF9zdW0gPC0gCiAgd29yZF9jb3VudCAlPiUKICAgIGlubmVyX2pvaW4oTElXQykgJT4lCiAgICBncm91cF9ieSh3b3JkLHNlbnRpbWVudCkgJT4lCiAgc3VtbWFyaXNlKAogICAgc3VtID0gc3VtKGNvdW50KQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyhzdW0pKSAlPiUKICBkYXRhLmZyYW1lKCkgCiAgCnNlbnRpbWVudF9zdW0gJT4lCiAgdG9wX24oMzAsd3QgPSBzdW0pICU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBzdW0pKSAlPiUKICBnZ3Bsb3QoYWVzKHdvcmQsIHN1bSwgZmlsbCA9IHNlbnRpbWVudCkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcCh+c2VudGltZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKwogIGxhYnMoeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwKICAgICAgIHggPSBOVUxMKSArCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNCxmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSkrCiAgY29vcmRfZmxpcCgpCmBgYAoK5Y+m5aSW5LiA56iu5ZGI54++5pa55byPCgojIyMg5q2j6LKg5oOF57eS5paH5a2X6ZuyCmBgYHtyfQojIHNlbnRpbWVudF9zdW0gJT4lCiMgICBhY2FzdCh3b3JkIH4gc2VudGltZW50LCB2YWx1ZS52YXIgPSAic3VtIiwgZmlsbCA9IDApICU+JQojICAgY29tcGFyaXNvbi5jbG91ZCgKIyAgICAgY29sb3JzID0gYygic2FsbW9uIiwgIiM3MmJjZDQiKSwgIyBwb3NpdGl2ZSBuZWdhdGl2ZQojICAgICAgICAgICAgICAgICAgICBtYXgud29yZHMgPSA1MCxmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKQpgYGAKIVtdKOato+iyoOaDhee3kuaWh+Wtl+mbsi5wbmcpCgrlj6blpJbvvIzkuZ/lj6/ku6Xkvp3mk5rkuI3lkIzml6XmnJ/op4Dlr5/mg4Xnt5Lku6PooajlrZfnmoTororljJYKCiMjIyAyMDIxLTA0LTEyIOato+iyoOaDhee3kuS7o+ihqOWtlwpgYGB7cn0Kc2VudGltZW50X3N1bV9zZWxlY3QgPC0gCndvcmRfY291bnQgJT4lCiAgZmlsdGVyKGFydERhdGUgPT0gYXMuRGF0ZSgnMjAyMS0wNC0xMicpKSAlPiUgCiAgICBpbm5lcl9qb2luKExJV0MpICU+JQogICAgZ3JvdXBfYnkod29yZCxzZW50aW1lbnQpICU+JQogIHN1bW1hcmlzZSgKICAgIHN1bSA9IHN1bShjb3VudCkKICApICU+JSAKICBhcnJhbmdlKGRlc2Moc3VtKSkgJT4lCiAgZGF0YS5mcmFtZSgpIAoKc2VudGltZW50X3N1bV9zZWxlY3QgICAlPiUKICB0b3BfbigzMCx3dCA9IHN1bSkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgc3VtKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBzdW0sIGZpbGwgPSBzZW50aW1lbnQpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAofnNlbnRpbWVudCwgc2NhbGVzID0gImZyZWVfeSIpICsKICBsYWJzKHkgPSAiQ29udHJpYnV0aW9uIHRvIHNlbnRpbWVudCAwNDEyIiwKICAgICAgIHggPSBOVUxMKSArCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNCxmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSkrCiAgY29vcmRfZmxpcCgpCmBgYAoKCiMjIyAyMDIxLTA0LTEyIOato+iyoOaDhee3kuaWh+Wtl+mbsgpgYGB7cn0KIyBzZW50aW1lbnRfc3VtX3NlbGVjdCAlPiUKIyAgIGFjYXN0KHdvcmQgfiBzZW50aW1lbnQsIHZhbHVlLnZhciA9ICJzdW0iLCBmaWxsID0gMCkgJT4lCiMgICBjb21wYXJpc29uLmNsb3VkKAojICAgICBjb2xvcnMgPSBjKCJzYWxtb24iLCAiIzcyYmNkNCIpLCAjIHBvc2l0aXZlIG5lZ2F0aXZlCiMgICAgICAgICAgICAgICAgICAgIG1heC53b3JkcyA9IDUwLGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpCmBgYAoKIVtdKDIwMjEtMDQtMTLmraPosqDmg4Xnt5LmloflrZfpm7IucG5nKQoKCiMjIDQu5q246aGe5q2j6LKg6Z2i5paH56ugCgrkuYvliY3nmoTmg4Xnt5LliIbmnpDlpKfpg6jliIbmmK/lhajpg6jnmoToqZ7lvZnliqDnuL3vvIzmjqXkuIvkvoblsIfmraPosqDpnaLmg4Xnt5LnmoTmlofnq6DliIbplovvvIznnIvnnIvog73kuI3og73nmbznj77kuIDkupvmlrDnmoTmnbHopb/jgILmjqXkuIvkvobmrbjpoZ7mlofnq6DvvIzlsIfmr4/kuIDnr4fmlofnq6DmraPosqDpnaLmg4Xnt5LnmoTliIbmlbjnrpflh7rkvobvvIznhLblvozlpKfmpoLliIbpoZ7mlofnq6DlsazmlrzmraPpnaLpgoTmmK/osqDpnaLjgIIKCmBgYHtyfQojIOS+neaTmuaDhee3kuWAvOeahOato+iyoOavlOS+i+atuOmhnuaWh+eroAphcnRpY2xlX3R5cGUgPSAKICBkYXRhX3NlbGVjdCAlPiUKICBpbm5lcl9qb2luKExJV0MpICU+JSAKICBncm91cF9ieShhcnRVcmwsc2VudGltZW50KSAlPiUKICBzdW1tYXJpc2UoY291bnQ9bigpKSAlPiUKICBzcHJlYWQoc2VudGltZW50LGNvdW50LGZpbGwgPSAwKSAlPiUgI+aKiuato+iyoOmdouaDhee3kuWxlemWi++8jOe8uuWAvOijnDAKICBtdXRhdGUodHlwZSA9IGNhc2Vfd2hlbihwb3NpdGl2ZSA+IG5lZ2F0aXZlIH4gInBvc2l0aXZlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJuZWdhdGl2ZSIpKSAlPiUKICBkYXRhLmZyYW1lKCkgCiAgCiMg55yL5LiA5LiL5q2j6LKg5q+U5L6L55qE5paH56ug5ZCE5pyJ5bm+56+HCmFydGljbGVfdHlwZSAlPiUKICBncm91cF9ieSh0eXBlKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpCmBgYAoKCiMjIyDmraPosqDmg4Xnt5Lmlofnq6Dmlbjph4/ntbHoqIjlnJYKCuW3sue8uuawtOS6i+S7tuS+huiqqizosqDpnaLmg4Xnt5LnmoTmlofnq6Dmr5TovIPlpJoKCmBgYHtyfQojIAphcnRpY2xlX3R5cGVfZGF0ZSA9IGxlZnRfam9pbihhcnRpY2xlX3R5cGVbLGMoImFydFVybCIsICJ0eXBlIildLCBNZXRhRGF0YVssYygiYXJ0VXJsIiwgImFydERhdGUiKV0sIGJ5ID0gImFydFVybCIpCgoKYXJ0aWNsZV90eXBlX2RhdGUgJT4lCiAgZ3JvdXBfYnkoYXJ0RGF0ZSx0eXBlKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IGFydERhdGUsIHkgPSBjb3VudCwgZmlsbCA9IHR5cGUpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpKwogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSwKICAgICAgICAgICAgICAgbGltaXRzID0gYXMuRGF0ZShjKCcyMDIxLTAzLTAxJywnMjAyMS0wNC0zMCcpKQogICAgICAgICAgICAgICApCmBgYAoK5oqK5q2j6Z2i5ZKM6LKg6Z2i55qE5paH56ug5oyR5Ye65L6G77yM5Lim5ZKM5pa36Kme57WQ5p6c5ZCI5L2144CCCgpgYGB7cn0KIyBuZWdhdGl2ZV9hcnRpY2xlOmFydFVybCx3b3JkCm5lZ2F0aXZlX2FydGljbGUgPC0KYXJ0aWNsZV90eXBlICU+JQogIGZpbHRlcih0eXBlPT0ibmVnYXRpdmUiKSU+JQogIHNlbGVjdChhcnRVcmwpICU+JQogIGxlZnRfam9pbihkYXRhX3NlbGVjdFssYygiYXJ0VXJsIiwgIndvcmQiKV0sIGJ5ID0gImFydFVybCIpCgojIHBvc2l0aXZlX2FydGljbGU6YXJ0VXJsLHdvcmQKcG9zaXRpdmVfYXJ0aWNsZSA8LQphcnRpY2xlX3R5cGUgJT4lCiAgZmlsdGVyKHR5cGU9PSJwb3NpdGl2ZSIpJT4lCiAgc2VsZWN0KGFydFVybCkgJT4lCiAgbGVmdF9qb2luKGRhdGFfc2VsZWN0WyxjKCJhcnRVcmwiLCAid29yZCIpXSwgYnkgPSAiYXJ0VXJsIikKYGBgCgoK55Wr5Ye65q2j6LKg6Z2i5paH56ug5oOF57eS6LKi54275bqm6LyD6auY55qE6Zec6Y215a2XCgojIyMg5oOF57eS6Zec6Y215a2XOuiyoOmdouaDhee3kuaWh+eroApgYGB7cn0KIyDosqDpnaLmg4Xnt5Lpl5zpjbXlrZfosqLnjbvlnJYKbmVnYXRpdmVfYXJ0aWNsZSAlPiUKaW5uZXJfam9pbihMSVdDKSAlPiUKICAgIGdyb3VwX2J5KHdvcmQsc2VudGltZW50KSAlPiUKICBzdW1tYXJpc2UoCiAgICBzdW0gPSBuKCkKICAgICklPiUgCiAgYXJyYW5nZShkZXNjKHN1bSkpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICB0b3BfbigzMCx3dCA9IHN1bSkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgc3VtKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBzdW0sIGZpbGwgPSBzZW50aW1lbnQpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAofnNlbnRpbWVudCwgc2NhbGVzID0gImZyZWVfeSIpICsKICBsYWJzKHkgPSAiQ29udHJpYnV0aW9uIHRvIG5lZ2F0aXZlIHNlbnRpbWVudCIsCiAgICAgICB4ID0gTlVMTCkgKwogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTQsZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IikpKwogIGNvb3JkX2ZsaXAoKQpgYGAKCiMjIyDmg4Xnt5Lpl5zpjbXlrZc65q2j6Z2i5oOF57eS5paH56ugCmBgYHtyfQojIOato+mdouaDhee3kumXnOmNteWtl+iyoueNu+Wclgpwb3NpdGl2ZV9hcnRpY2xlICU+JQppbm5lcl9qb2luKExJV0MpICU+JQogICAgZ3JvdXBfYnkod29yZCxzZW50aW1lbnQpICU+JQogIHN1bW1hcmlzZSgKICAgIHN1bSA9IG4oKQogICAgKSU+JSAKICBhcnJhbmdlKGRlc2Moc3VtKSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHRvcF9uKDMwLHd0ID0gc3VtKSAlPiUKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBzdW0pKSAlPiUKICBnZ3Bsb3QoYWVzKHdvcmQsIHN1bSwgZmlsbCA9IHNlbnRpbWVudCkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcCh+c2VudGltZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKwogIGxhYnMoeSA9ICJDb250cmlidXRpb24gdG8gcG9zaXRpdmUgc2VudGltZW50IiwKICAgICAgIHggPSBOVUxMKSArCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNCxmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSkrCiAgY29vcmRfZmxpcCgpCmBgYAoKIyBDaC4zOiDlkITlrrbmlrDogZ7lqpLpq5TnmoTmg4Xnt5LliIbmnpAKCisgRVRUVu+8muadseajrgorIFVETu+8muiBr+WQiAorIEFwcGxl77ya6JiL5p6cCgojIyAxLiDos4fmlpnliY3omZXnkIYKYGBge3J9CiMg5oqK5paH56ug6K6A6YCy5L6GCkVUVFZfTWV0YURhdGEgPSBmcmVhZCgnRVRUVl9hcnRpY2xlTWV0YURhdGEuY3N2JyxlbmNvZGluZyA9ICdVVEYtOCcpClVETl9NZXRhRGF0YSA9IGZyZWFkKCdVRE5fYXJ0aWNsZU1ldGFEYXRhLmNzdicsZW5jb2RpbmcgPSAnVVRGLTgnKQpBcHBsZV9NZXRhRGF0YSA9IGZyZWFkKCdBcHBsZV9hcnRpY2xlTWV0YURhdGEuY3N2JyxlbmNvZGluZyA9ICdVVEYtOCcpCmBgYAoKYGBge3J9CiMg5pa36Kme57WQ5p6cCkVUVFZfZGF0YSA8LSBFVFRWX01ldGFEYXRhICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlLCB0b2tlbj1jdXN0b21pemVkX3Rva2VuaXplcikKVUROX2RhdGEgPC0gVUROX01ldGFEYXRhICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlLCB0b2tlbj1jdXN0b21pemVkX3Rva2VuaXplcikKQXBwbGVfZGF0YSA8LSBBcHBsZV9NZXRhRGF0YSAlPiUgdW5uZXN0X3Rva2Vucyh3b3JkLCBzZW50ZW5jZSwgdG9rZW49Y3VzdG9taXplZF90b2tlbml6ZXIpCmBgYAoKYGBge3J9CiMg5qC85byP5YyW5pel5pyf5qyE5L2NCkVUVFZfZGF0YSRhcnREYXRlPSBFVFRWX2RhdGEkYXJ0RGF0ZSAlPiUgYXMuRGF0ZSgiJVkvJW0vJWQiKQpVRE5fZGF0YSRhcnREYXRlPSBVRE5fZGF0YSRhcnREYXRlICU+JSBhcy5EYXRlKCIlWS8lbS8lZCIpCkFwcGxlX2RhdGEkYXJ0RGF0ZT0gQXBwbGVfZGF0YSRhcnREYXRlICU+JSBhcy5EYXRlKCIlWS8lbS8lZCIpCiMg6YGO5r++54m55q6K5a2X5YWDCkVUVFZfZGF0YV9zZWxlY3QgPSBFVFRWX2RhdGEgJT4lIAogIGZpbHRlcighZ3JlcGwoJ1tbOnB1bmN0Ol1dJyx3b3JkKSkgJT4lICMg5Y675qiZ6bue56ym6JmfCiAgZmlsdGVyKCFncmVwbCgiWydeMC05YS16J10iLHdvcmQpKSAlPiUgIyDljrvoi7HmlofjgIHmlbjlrZcKICBmaWx0ZXIobmNoYXIoLiR3b3JkKT4xKSAKVUROX2RhdGFfc2VsZWN0ID0gVUROX2RhdGEgJT4lIAogIGZpbHRlcighZ3JlcGwoJ1tbOnB1bmN0Ol1dJyx3b3JkKSkgJT4lICMg5Y675qiZ6bue56ym6JmfCiAgZmlsdGVyKCFncmVwbCgiWydeMC05YS16J10iLHdvcmQpKSAlPiUgIyDljrvoi7HmlofjgIHmlbjlrZcKICBmaWx0ZXIobmNoYXIoLiR3b3JkKT4xKQpBcHBsZV9kYXRhX3NlbGVjdCA9IEFwcGxlX2RhdGEgJT4lIAogIGZpbHRlcighZ3JlcGwoJ1tbOnB1bmN0Ol1dJyx3b3JkKSkgJT4lICMg5Y675qiZ6bue56ym6JmfCiAgZmlsdGVyKCFncmVwbCgiWydeMC05YS16J10iLHdvcmQpKSAlPiUgIyDljrvoi7HmlofjgIHmlbjlrZcKICBmaWx0ZXIobmNoYXIoLiR3b3JkKT4xKQoKRVRUVl93b3JkX2NvdW50IDwtIEVUVFZfZGF0YV9zZWxlY3QgJT4lCiAgc2VsZWN0KGFydERhdGUsd29yZCkgJT4lCiAgZ3JvdXBfYnkoYXJ0RGF0ZSx3b3JkKSAlPiUKICBzdW1tYXJpc2UoY291bnQ9bigpKSAlPiUgICMg566X5a2X6Kme5Zau56+H57i95pW455Soc3VtbWFyaXNlCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcKICBhcnJhbmdlKGRlc2MoY291bnQpKQoKVUROX3dvcmRfY291bnQgPC0gVUROX2RhdGFfc2VsZWN0ICU+JQogIHNlbGVjdChhcnREYXRlLHdvcmQpICU+JQogIGdyb3VwX2J5KGFydERhdGUsd29yZCkgJT4lCiAgc3VtbWFyaXNlKGNvdW50PW4oKSkgJT4lICAjIOeul+Wtl+ipnuWWruevh+e4veaVuOeUqHN1bW1hcmlzZQogIGZpbHRlcihjb3VudD4zKSAlPiUgICMg6YGO5r++5Ye654++5aSq5bCR5qyh55qE5a2XCiAgYXJyYW5nZShkZXNjKGNvdW50KSkKCkFwcGxlX3dvcmRfY291bnQgPC0gQXBwbGVfZGF0YV9zZWxlY3QgJT4lCiAgc2VsZWN0KGFydERhdGUsd29yZCkgJT4lCiAgZ3JvdXBfYnkoYXJ0RGF0ZSx3b3JkKSAlPiUKICBzdW1tYXJpc2UoY291bnQ9bigpKSAlPiUgICMg566X5a2X6Kme5Zau56+H57i95pW455Soc3VtbWFyaXNlCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcKICBhcnJhbmdlKGRlc2MoY291bnQpKQpgYGAKCiMjIDIu5bCH5paH56ug5ZKM6IiHTElXQ+aDhee3kuWtl+WFuOWBmmpvaW4KCuWcqOeVq+WHuuaDhee3kuS5i+WJje+8jOWFiOeci+eci+avj+WkqeeahOeZvOaWh+aDheW9ouOAggoKIyMjIOWQhOWutuaWsOiBnueZvOaWh+aKmOe3muWclgpgYGB7cn0KRVRUVl9NZXRhRGF0YSRhcnREYXRlPSBFVFRWX01ldGFEYXRhJGFydERhdGUgJT4lIGFzLkRhdGUoIiVZLyVtLyVkIikKVUROX01ldGFEYXRhJGFydERhdGU9IFVETl9NZXRhRGF0YSRhcnREYXRlICU+JSBhcy5EYXRlKCIlWS8lbS8lZCIpCkFwcGxlX01ldGFEYXRhJGFydERhdGU9IEFwcGxlX01ldGFEYXRhJGFydERhdGUgJT4lIGFzLkRhdGUoIiVZLyVtLyVkIikKCkVUVFZfUG9zdCA8LSBFVFRWX01ldGFEYXRhICU+JSBncm91cF9ieShhcnREYXRlKSAlPiUgc3VtbWFyaXNlKGNvdW50ID0gbigpKQpVRE5fUG9zdCA8LSBVRE5fTWV0YURhdGEgJT4lIGdyb3VwX2J5KGFydERhdGUpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuKCkpCkFwcGxlX1Bvc3QgPC0gQXBwbGVfTWV0YURhdGEgJT4lIGdyb3VwX2J5KGFydERhdGUpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuKCkpCgoKZ2dwbG90KCkrCiAgZ2VvbV9saW5lKGRhdGEgPSBFVFRWX1Bvc3QsIGFlcyh4PWFydERhdGUseT1jb3VudCxjb2xvdXIgPSAi6IGv5ZCI5paw6IGe57ayIikpKwogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSkrCiAgZ2VvbV9saW5lKGRhdGEgPSBVRE5fUG9zdCwgYWVzKHg9YXJ0RGF0ZSx5PWNvdW50LGNvbG91ciA9IuadseajruaWsOiBnue2siIpKSsKICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVtLyVkIikpKwogIGdlb21fbGluZShkYXRhID0gQXBwbGVfUG9zdCwgYWVzKHg9YXJ0RGF0ZSx5PWNvdW50LGNvbG91ciA9IuiYi+aenOaWsOiBnue2siIpKSsKICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVtLyVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoIiIsdmFsdWVzID0gYygi6IGv5ZCI5paw6IGe57ayIiA9ICJyZWQiLCLmnbHmo67mlrDogZ7ntrIiID0gImJsdWUiLCAi6JiL5p6c5paw6IGe57ayIiA9ICJibGFjayIpKSsKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE0LGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKQpgYGAKCiMjIDMu5bCH5LiJ5YCL5paw6IGe57ay55qE6LOH5paZ5ZCI5L215YGa5q+U6LyDCgpgYGB7cn0KRVRUVl9kYXRhIDwtIEVUVFZfZGF0YSAlPiUgbXV0YXRlKHNvdXJjZSA9ICdFVFRWJykKVUROX2RhdGEgPC0gVUROX2RhdGEgJT4lIG11dGF0ZShzb3VyY2UgPSAnVUROJykKQXBwbGVfZGF0YSA8LSBBcHBsZV9kYXRhICU+JSBtdXRhdGUoc291cmNlID0gJ0FwcGxlJykKCmRhdGFfY29tYmluZSA9IHJiaW5kKEVUVFZfZGF0YSxVRE5fZGF0YSwgQXBwbGVfZGF0YSkKZGF0YV9jb21iaW5lJGFydERhdGU9IGRhdGFfY29tYmluZSRhcnREYXRlICU+JSBhcy5EYXRlKCIlWS8lbS8lZCIpCmBgYAoKYGBge3J9CmRhdGFfY29tYmluZSAlPiUKICBpbm5lcl9qb2luKExJV0MpICU+JQogIGdyb3VwX2J5KGFydERhdGUsc2VudGltZW50LHNvdXJjZSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUKICBmaWx0ZXIoYXJ0RGF0ZT49JzIwMjEtMDMtMDEnKSAlPiUKICAKICAjIOeVq+WclueahOmDqOWIhgogIGdncGxvdChhZXMoeD0gYXJ0RGF0ZSx5PWNvdW50LGZpbGw9c2VudGltZW50KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgpICsKICBnZW9tX2NvbChwb3NpdGlvbj0iZG9kZ2UiKSArIAogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSkgKwogIGxhYnModGl0bGUgPSAic2VudGltZW50IG9mIHB0dCAmIGRjYXJkIixjb2xvciA9ICLmg4Xnt5LpoZ7liKUiKSArCiAgZmFjZXRfd3JhcCh+c291cmNlLCBuY29sID0gMSwgc2NhbGVzPSJmcmVlX3kiKSAgIyBzY2FsZeWPr+S7peiqv+aVtOavlOS+i+WwugpgYGAKCgrlj6/ku6XnnIvlh7rvvJoKCisg5Y+q5pyJ6IGv5ZCI5paw6IGe5piv5pyJ6YCj57qM5q+P5aSp55qE5Zyo6Lef6YCy5rC05oOF55qE5paw6IGeCisg6IGv5ZCI5paw6IGe55qE5oOF57eS6Kme5Ye654++55qE6LyD5aSaCisg5b6M5pyf55qE5aCx5bCO6YO95Lul5q2j6Z2i5oOF57eS5bGF5aSaCgpgYGB7cn0KRVRUVl9zZW50aW1lbnRfc3VtIDwtIAogIEVUVFZfd29yZF9jb3VudCAlPiUKICAgIGlubmVyX2pvaW4oTElXQykgJT4lCiAgICBncm91cF9ieSh3b3JkLHNlbnRpbWVudCkgJT4lCiAgc3VtbWFyaXNlKAogICAgc3VtID0gc3VtKGNvdW50KQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyhzdW0pKSAlPiUKICBkYXRhLmZyYW1lKCkgCgpVRE5fc2VudGltZW50X3N1bSA8LSAKICBVRE5fd29yZF9jb3VudCAlPiUKICAgIGlubmVyX2pvaW4oTElXQykgJT4lCiAgICBncm91cF9ieSh3b3JkLHNlbnRpbWVudCkgJT4lCiAgc3VtbWFyaXNlKAogICAgc3VtID0gc3VtKGNvdW50KQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyhzdW0pKSAlPiUKICBkYXRhLmZyYW1lKCkKCkFwcGxlX3NlbnRpbWVudF9zdW0gPC0gCiAgQXBwbGVfd29yZF9jb3VudCAlPiUKICAgIGlubmVyX2pvaW4oTElXQykgJT4lCiAgICBncm91cF9ieSh3b3JkLHNlbnRpbWVudCkgJT4lCiAgc3VtbWFyaXNlKAogICAgc3VtID0gc3VtKGNvdW50KQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyhzdW0pKSAlPiUKICBkYXRhLmZyYW1lKCkgCmBgYAojIyA0Lueul+WHuuaJgOacieWtl+ipnuipnumgu+W+jO+8jOWQhOaWsOiBnue2suacgOW4uOWHuuePvueahOaDhee3kuS7o+ihqOWtlwoKYGBge3J9CkVUVFZfc2VudGltZW50X3N1bSAlPiUKICB0b3BfbigzMCx3dCA9IHN1bSkgJT4lCiAgbXV0YXRlKHdvcmQgPSByZW9yZGVyKHdvcmQsIHN1bSkpICU+JQogIGdncGxvdChhZXMod29yZCwgc3VtLCBmaWxsID0gc2VudGltZW50KSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgbGFicyh5ID0gIkVUVFYgQ29udHJpYnV0aW9uIHRvIHNlbnRpbWVudCIsCiAgICAgICB4ID0gTlVMTCkgKwogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTQsZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IikpKwogIGNvb3JkX2ZsaXAoKQpgYGAKCmBgYHtyfQpVRE5fc2VudGltZW50X3N1bSAlPiUKICB0b3BfbigzMCx3dCA9IHN1bSkgJT4lCiAgbXV0YXRlKHdvcmQgPSByZW9yZGVyKHdvcmQsIHN1bSkpICU+JQogIGdncGxvdChhZXMod29yZCwgc3VtLCBmaWxsID0gc2VudGltZW50KSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgbGFicyh5ID0gIlVETiBDb250cmlidXRpb24gdG8gc2VudGltZW50IiwKICAgICAgIHggPSBOVUxMKSArCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNCxmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSkrCiAgY29vcmRfZmxpcCgpCmBgYAoKYGBge3J9CkFwcGxlX3NlbnRpbWVudF9zdW0gJT4lCiAgdG9wX24oMzAsd3QgPSBzdW0pICU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBzdW0pKSAlPiUKICBmaWx0ZXIoISh3b3JkICVpbiUgYygi5L2c5ZOBIikpKSAlPiUKICBnZ3Bsb3QoYWVzKHdvcmQsIHN1bSwgZmlsbCA9IHNlbnRpbWVudCkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcCh+c2VudGltZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKwogIGxhYnMoeSA9ICJBcHBsZSBDb250cmlidXRpb24gdG8gc2VudGltZW50IiwKICAgICAgIHggPSBOVUxMKSArCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNCxmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSkrCiAgY29vcmRfZmxpcCgpCmBgYAoK5Y+v5Lul55yL5Ye65p2x5qOu5paw6IGe55qE5aCx5bCO5oOF57eS6Kme6LyD5bCR77yM6LyD54K65Lit56uL5a6i6KeA44CCCgrogIzoga/lkIjmlrDogZ7kuK3nmoTmg4Xnt5LoqZ7liYfpnZ7luLjosZDlr4zvvIzlkIzmmYLlh7rnj77kuoblvojlpJrkuI3luLjlnKjmlrDogZ7loLHlsI7kuK3nnIvliLDnmoToqZ7lvZnlg4/mmK/igJzpgJfotqPigJ3jgIIKCiMjIDUu5q246aGe5q2j6LKg6Z2i5paH56ugCgpgYGB7cn0KRVRUVl9hcnRpY2xlX3R5cGUgPSAKICBFVFRWX2RhdGFfc2VsZWN0ICU+JQogIGlubmVyX2pvaW4oTElXQykgJT4lIAogIGdyb3VwX2J5KGFydFVybCxzZW50aW1lbnQpICU+JQogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JQogIHNwcmVhZChzZW50aW1lbnQsY291bnQsZmlsbCA9IDApICU+JSAj5oqK5q2j6LKg6Z2i5oOF57eS5bGV6ZaL77yM57y65YC86KOcMAogIG11dGF0ZSh0eXBlID0gY2FzZV93aGVuKHBvc2l0aXZlID4gbmVnYXRpdmUgfiAicG9zaXRpdmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIm5lZ2F0aXZlIikpICU+JQogIGRhdGEuZnJhbWUoKQoKVUROX2FydGljbGVfdHlwZSA9IAogIFVETl9kYXRhX3NlbGVjdCAlPiUKICBpbm5lcl9qb2luKExJV0MpICU+JSAKICBncm91cF9ieShhcnRVcmwsc2VudGltZW50KSAlPiUKICBzdW1tYXJpc2UoY291bnQ9bigpKSAlPiUKICBzcHJlYWQoc2VudGltZW50LGNvdW50LGZpbGwgPSAwKSAlPiUgI+aKiuato+iyoOmdouaDhee3kuWxlemWi++8jOe8uuWAvOijnDAKICBtdXRhdGUodHlwZSA9IGNhc2Vfd2hlbihwb3NpdGl2ZSA+IG5lZ2F0aXZlIH4gInBvc2l0aXZlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJuZWdhdGl2ZSIpKSAlPiUKICBkYXRhLmZyYW1lKCkgCgpBcHBsZV9hcnRpY2xlX3R5cGUgPSAKICBBcHBsZV9kYXRhX3NlbGVjdCAlPiUKICBpbm5lcl9qb2luKExJV0MpICU+JSAKICBncm91cF9ieShhcnRVcmwsc2VudGltZW50KSAlPiUKICBzdW1tYXJpc2UoY291bnQ9bigpKSAlPiUKICBzcHJlYWQoc2VudGltZW50LGNvdW50LGZpbGwgPSAwKSAlPiUgI+aKiuato+iyoOmdouaDhee3kuWxlemWi++8jOe8uuWAvOijnDAKICBtdXRhdGUodHlwZSA9IGNhc2Vfd2hlbihwb3NpdGl2ZSA+IG5lZ2F0aXZlIH4gInBvc2l0aXZlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJuZWdhdGl2ZSIpKSAlPiUKICBkYXRhLmZyYW1lKCkgCmBgYAoKYGBge3J9CiMgbmVnYXRpdmVfYXJ0aWNsZTphcnRVcmwsd29yZApFVFRWX25lZ2F0aXZlX2FydGljbGUgPC0KRVRUVl9hcnRpY2xlX3R5cGUgJT4lCiAgZmlsdGVyKHR5cGU9PSJuZWdhdGl2ZSIpJT4lCiAgc2VsZWN0KGFydFVybCkgJT4lCiAgbGVmdF9qb2luKEVUVFZfZGF0YV9zZWxlY3RbLGMoImFydFVybCIsICJ3b3JkIildLCBieSA9ICJhcnRVcmwiKQoKIyBwb3NpdGl2ZV9hcnRpY2xlOmFydFVybCx3b3JkCkVUVFZfcG9zaXRpdmVfYXJ0aWNsZSA8LQpFVFRWX2FydGljbGVfdHlwZSAlPiUKICBmaWx0ZXIodHlwZT09InBvc2l0aXZlIiklPiUKICBzZWxlY3QoYXJ0VXJsKSAlPiUKICBsZWZ0X2pvaW4oRVRUVl9kYXRhX3NlbGVjdFssYygiYXJ0VXJsIiwgIndvcmQiKV0sIGJ5ID0gImFydFVybCIpCgojIG5lZ2F0aXZlX2FydGljbGU6YXJ0VXJsLHdvcmQKVUROX25lZ2F0aXZlX2FydGljbGUgPC0KVUROX2FydGljbGVfdHlwZSAlPiUKICBmaWx0ZXIodHlwZT09Im5lZ2F0aXZlIiklPiUKICBzZWxlY3QoYXJ0VXJsKSAlPiUKICBsZWZ0X2pvaW4oVUROX2RhdGFfc2VsZWN0WyxjKCJhcnRVcmwiLCAid29yZCIpXSwgYnkgPSAiYXJ0VXJsIikKCiMgcG9zaXRpdmVfYXJ0aWNsZTphcnRVcmwsd29yZApVRE5fcG9zaXRpdmVfYXJ0aWNsZSA8LQpVRE5fYXJ0aWNsZV90eXBlICU+JQogIGZpbHRlcih0eXBlPT0icG9zaXRpdmUiKSU+JQogIHNlbGVjdChhcnRVcmwpICU+JQogIGxlZnRfam9pbihVRE5fZGF0YV9zZWxlY3RbLGMoImFydFVybCIsICJ3b3JkIildLCBieSA9ICJhcnRVcmwiKQoKIyBuZWdhdGl2ZV9hcnRpY2xlOmFydFVybCx3b3JkCkFwcGxlX25lZ2F0aXZlX2FydGljbGUgPC0KQXBwbGVfYXJ0aWNsZV90eXBlICU+JQogIGZpbHRlcih0eXBlPT0ibmVnYXRpdmUiKSU+JQogIHNlbGVjdChhcnRVcmwpICU+JQogIGxlZnRfam9pbihBcHBsZV9kYXRhX3NlbGVjdFssYygiYXJ0VXJsIiwgIndvcmQiKV0sIGJ5ID0gImFydFVybCIpCgojIHBvc2l0aXZlX2FydGljbGU6YXJ0VXJsLHdvcmQKQXBwbGVfcG9zaXRpdmVfYXJ0aWNsZSA8LQpBcHBsZV9hcnRpY2xlX3R5cGUgJT4lCiAgZmlsdGVyKHR5cGU9PSJwb3NpdGl2ZSIpJT4lCiAgc2VsZWN0KGFydFVybCkgJT4lCiAgbGVmdF9qb2luKEFwcGxlX2RhdGFfc2VsZWN0WyxjKCJhcnRVcmwiLCAid29yZCIpXSwgYnkgPSAiYXJ0VXJsIikKYGBgCgojIyMg6IGv5ZCI5paw6IGe55qE5q2j6LKg6Z2i5paH56ugCgrlm6Dngrroga/lkIjmlrDogZ7nmoTmraPosqDoqZ7lvZnmnIDngrrosZDlr4zvvIzmiYDku6XmiJHlgJHnibnliKXkvobnnIvkuIDkuIvoga/lkIjmlrDogZ7nmoTmraPosqDpnaLmlofnq6DkuK3kuLvopoHlh7rnj77nmoTmg4Xnt5LoqZ4KCmBgYHtyfQojIOiyoOmdouaDhee3kumXnOmNteWtl+iyoueNu+WclgpVRE5fbmVnYXRpdmVfYXJ0aWNsZSAlPiUKaW5uZXJfam9pbihMSVdDKSAlPiUKICAgIGdyb3VwX2J5KHdvcmQsc2VudGltZW50KSAlPiUKICBzdW1tYXJpc2UoCiAgICBzdW0gPSBuKCkKICAgICklPiUgCiAgYXJyYW5nZShkZXNjKHN1bSkpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICB0b3BfbigzMCx3dCA9IHN1bSkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgc3VtKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBzdW0sIGZpbGwgPSBzZW50aW1lbnQpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAofnNlbnRpbWVudCwgc2NhbGVzID0gImZyZWVfeSIpICsKICBsYWJzKHkgPSAiVUROIENvbnRyaWJ1dGlvbiB0byBuZWdhdGl2ZSBzZW50aW1lbnQiLAogICAgICAgeCA9IE5VTEwpICsKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE0LGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKSsKICBjb29yZF9mbGlwKCkKYGBgCmBgYHtyfQojIOato+mdouaDhee3kumXnOmNteWtl+iyoueNu+WclgpVRE5fcG9zaXRpdmVfYXJ0aWNsZSAlPiUKaW5uZXJfam9pbihMSVdDKSAlPiUKICAgIGdyb3VwX2J5KHdvcmQsc2VudGltZW50KSAlPiUKICBzdW1tYXJpc2UoCiAgICBzdW0gPSBuKCkKICAgICklPiUgCiAgYXJyYW5nZShkZXNjKHN1bSkpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICB0b3BfbigyMCx3dCA9IHN1bSkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgc3VtKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBzdW0sIGZpbGwgPSBzZW50aW1lbnQpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAofnNlbnRpbWVudCwgc2NhbGVzID0gImZyZWVfeSIpICsKICBsYWJzKHkgPSAiVUROIENvbnRyaWJ1dGlvbiB0byBwb3NpdGl2ZSBzZW50aW1lbnQiLAogICAgICAgeCA9IE5VTEwpICsKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE0LGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKSsKICBjb29yZF9mbGlwKCkKYGBgCgojIENoLjQ6IOWQhOWAi+e4o+W4guWwjeaWvOawtOaDhemXnOazqOeahOmHjem7ngoKIyMgMS5uZ3JhbSAK5YmN5b6M5LqU5YCL5a2X5b2ZCmBgYHtyfQpuZ3JhbV8xMSA8LSBmdW5jdGlvbih0KSB7CiAgbGFwcGx5KHQsIGZ1bmN0aW9uKHgpIHsKICAgIHRva2VucyA8LSBzZWdtZW50KHgsIGppZWJhX3Rva2VuaXplcikKICAgIG5ncmFtIDwtIG5ncmFtcyh0b2tlbnMsIDExKQogICAgbmdyYW0gPC0gbGFwcGx5KG5ncmFtLCBwYXN0ZSwgY29sbGFwc2UgPSAiICIpCiAgICB1bmxpc3QobmdyYW0pCiAgfSkKfQpgYGAKCmBgYHtyfQp3YXRlcl9uZ3JhbV8xMSA8LSBNZXRhRGF0YSAlPiUKICBzZWxlY3QoYXJ0VXJsLCBzZW50ZW5jZSkgJT4lCiAgdW5uZXN0X3Rva2VucyhuZ3JhbSwgc2VudGVuY2UsIHRva2VuID0gbmdyYW1fMTEpICU+JQogIGZpbHRlcighc3RyX2RldGVjdChuZ3JhbSwgcmVnZXgoIlswLTlhLXpBLVpdIikpKQp3YXRlcl9uZ3JhbXNfMTFfc2VwYXJhdGVkIDwtIHdhdGVyX25ncmFtXzExICU+JQogIHNlcGFyYXRlKG5ncmFtLCBwYXN0ZTAoIndvcmQiLCBjKDE6MTEpLHNlcD0iIiksIHNlcCA9ICIgIikKaGVhZCh3YXRlcl9uZ3JhbXNfMTFfc2VwYXJhdGVkKQpgYGAKCiMjIDIu5p+l55yL5Ye65bi45Ye654++5Zyo44CM57y65rC044CN6ZmE6L+R55qE5a2X44CCCmBgYHtyfQojIOafpeeci+e8uuawtOmZhOi/keeahOipnuW9mQp3YXRlcl9jaGVja193b3JkcyA8LSB3YXRlcl9uZ3JhbXNfMTFfc2VwYXJhdGVkICU+JQogIGZpbHRlcih3b3JkNiA9PSAi57y65rC0IikKI3dhdGVyX2NoZWNrX3dvcmRzCmBgYApgYGB7cn0Kd2F0ZXJfY2hlY2tfd29yZHNfY291bnQgPC0gd2F0ZXJfY2hlY2tfd29yZHMgJT4lCiAgbWVsdChpZC52YXJzID0gImFydFVybCIsIG1lYXN1cmUudmFycyA9IHBhc3RlMCgid29yZCIsIGMoMToxMSksc2VwPSIiKSkgJT4lCiAgcmVuYW1lKHdvcmQ9dmFsdWUpICU+JQogIGZpbHRlcih2YXJpYWJsZSE9IndvcmQ2IikgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIGMoIuWPsOeBoyIsIue8uuawtCIsIuS4i+mbqCIsIuawtOW6qyIsIuWVj+mhjCIsIuWatOmHjSIsIuino+axuiIpKSkgJT4lIAogIGZpbHRlcighKHdvcmQgJWluJSBzdG9wX3dvcmRzKSwgbmNoYXIod29yZCk+MSkgJT4lCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpCgp3YXRlcl9jaGVja193b3Jkc19jb3VudCAlPiUKICB0b3BfbigxMCxuKSAlPiUgCiAgbXV0YXRlKHdvcmQgPSByZW9yZGVyKHdvcmQsIG4pKSAlPiUKICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBuID4gMCkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgeGxhYigi5Ye654++5Zyo44CM57y65rC044CN6ZmE6L+R55qE5a2XIikgKwogIHlsYWIoIuWHuuePvuasoeaVuCIpICsKICBjb29yZF9mbGlwKCkrIAogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IikpCgojIHBsb3RfbWVyZ2UgPC0gZGF0YV90b2tlbnNfZGF0ZSAlPiUgCiMgICBmaWx0ZXIoYXJ0RGF0ZSA9PSAiMjAyMS0wMy0yNiJ8IAojICAgICAgICBhcnREYXRlID09ICIyMDIxLTAzLTIyIiB8IAojICAgICAgICBhcnREYXRlID09ICIyMDIxLTA0LTE1IiB8CiMgICAgICAgIGFydERhdGUgPT0gIjIwMjEtMDMtMDUiKSAlPiUgCiMgICBncm91cF9ieShhcnREYXRlKSAlPiUgCiMgICB0b3BfbigxMCxuKSAlPiUgCiMgICB1bmdyb3VwKCkgJT4lCiMgICBnZ3Bsb3QoYWVzKHg9IHJlb3JkZXIod29yZCwgK24pLCB5PW4sIGZpbGwgPSBhcnREYXRlKSkgKwojICAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwojICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICsKIyAgIGZhY2V0X3dyYXAofmFydERhdGUsIHNjYWxlcz0iZnJlZSIsIG5jb2wgPSAyKSArCiMgICBjb29yZF9mbGlwKCkrCiMgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKQoKYGBgCgrnvLrmsLTlkajlnI3lh7rnj77mnIDlpJrnmoTmmK/vvJrnvLrpm7vjgIHlkITlgIvlnLDljYDjgIHkub7ml7HjgIHljbHmqZ8KCiMjIDMu5Ye654++5Zyo5ZCE5YCL57ij5biC5ZGo5ZyN55qE6Kme5b2ZCgrlj7DljZfjgIHlj7DkuK3jgIHlj7DljJfjgIHlrpzomK3jgIHkuK3ljZfpg6gKYGBge3J9CiMg5p+l55yL57y65rC06ZmE6L+R55qE6Kme5b2ZClROX2NoZWNrX3dvcmRzIDwtIHdhdGVyX25ncmFtc18xMV9zZXBhcmF0ZWQgJT4lCiAgZmlsdGVyKHdvcmQ2ID09ICLlj7DljZciKQpoZWFkKFROX2NoZWNrX3dvcmRzKQoKVE5fY2hlY2tfd29yZHNfcGxvdCA8LSBUTl9jaGVja193b3JkcyAlPiUKICBtZWx0KGlkLnZhcnMgPSAiYXJ0VXJsIiwgbWVhc3VyZS52YXJzID0gcGFzdGUwKCJ3b3JkIiwgYygxOjExKSxzZXA9IiIpKSAlPiUKICByZW5hbWUod29yZCA9IHZhbHVlKSAlPiUKICBmaWx0ZXIodmFyaWFibGUhPSJ3b3JkNiIpICU+JQogIGZpbHRlcighKHdvcmQgJWluJSBjKCLlj7DngaMiLCLnvLrmsLQiLCLkuIvpm6giLCLmsLTluqsiLCLllY/poYwiLCLlj7DljZciKSkpICU+JSAKICBmaWx0ZXIoISh3b3JkICVpbiUgc3RvcF93b3JkcyksIG5jaGFyKHdvcmQpPjEpICU+JSAjIyMKICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgJT4lCiAgbXV0YXRlKHdvcmQgPSByZW9yZGVyKHdvcmQsIG4pKSAlPiUKICB0b3Bfbig4LG4pICU+JSAKICBnZ3Bsb3QoYWVzKHdvcmQsIG4pKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSwgZmlsbD0iIzk5OTk5OSIpICsKICB4bGFiKCLjgIzlj7DljZfjgI3pmYTov5HnmoTlrZciKSArCiAgeWxhYigi5Ye654++5qyh5pW4IikgKwogIGNvb3JkX2ZsaXAoKSsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiLHNpemU9MTApKQojVE5fY2hlY2tfd29yZHNfcGxvdApgYGAKYGBge3J9ClRDX2NoZWNrX3dvcmRzX3Bsb3QgPC0gd2F0ZXJfbmdyYW1zXzExX3NlcGFyYXRlZCAlPiUgCiAgZmlsdGVyKHdvcmQ2ID09ICLlj7DkuK0iKSAlPiUgCiAgbWVsdChpZC52YXJzID0gImFydFVybCIsIG1lYXN1cmUudmFycyA9IHBhc3RlMCgid29yZCIsIGMoMToxMSksc2VwPSIiKSkgJT4lCiAgcmVuYW1lKHdvcmQgPSB2YWx1ZSkgJT4lCiAgZmlsdGVyKHZhcmlhYmxlIT0id29yZDYiKSAlPiUKICBmaWx0ZXIoISh3b3JkICVpbiUgYygi5Y+w54GjIiwi57y65rC0Iiwi5LiL6ZuoIiwi5rC05bqrIiwi5ZWP6aGMIiwi5Y+w5LitIikpKSAlPiUKICBmaWx0ZXIoISh3b3JkICVpbiUgc3RvcF93b3JkcyksIG5jaGFyKHdvcmQpPjEpICU+JSAjIyMKICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgICU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lCiAgdG9wX24oOCxuKSAlPiUKICBnZ3Bsb3QoYWVzKHdvcmQsIG4pKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSxmaWxsPSIjRTY5RjAwIikgKwogIHhsYWIoIuOAjOWPsOS4reOAjemZhOi/keeahOWtlyIpICsKICB5bGFiKCLlh7rnj77mrKHmlbgiKSArCiAgY29vcmRfZmxpcCgpKyAKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIsc2l6ZT0xMCkpCgojVENfY2hlY2tfd29yZHNfcGxvdApgYGAKYGBge3J9ClRQX2NoZWNrX3dvcmRzX3Bsb3QgPC0gd2F0ZXJfbmdyYW1zXzExX3NlcGFyYXRlZCAlPiUgCiAgZmlsdGVyKHdvcmQ2ID09ICLlj7DljJciKSAlPiUgCiAgbWVsdChpZC52YXJzID0gImFydFVybCIsIG1lYXN1cmUudmFycyA9IHBhc3RlMCgid29yZCIsIGMoMToxMSksc2VwPSIiKSkgJT4lCiAgcmVuYW1lKHdvcmQgPSB2YWx1ZSkgJT4lCiAgZmlsdGVyKHZhcmlhYmxlIT0id29yZDYiKSAlPiUKICBmaWx0ZXIoISh3b3JkICVpbiUgYygi5Y+w54GjIiwi57y65rC0Iiwi5LiL6ZuoIiwi5rC05bqrIiwi5ZWP6aGMIiwi5Y+w5YyXIikpKSAlPiUKICBmaWx0ZXIoISh3b3JkICVpbiUgc3RvcF93b3JkcyksIG5jaGFyKHdvcmQpPjEpICU+JSAjIyMKICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgICU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lCiAgdG9wX24oOCxuKSAlPiUKICBnZ3Bsb3QoYWVzKHdvcmQsIG4pKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSwgZmlsbD0iIzAwNzJCMiIpICsKICB4bGFiKCLjgIzlj7DljJfjgI3pmYTov5HnmoTlrZciKSArCiAgeWxhYigi5Ye654++5qyh5pW4IikgKwogIGNvb3JkX2ZsaXAoKSsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiLHNpemU9MTApKQoKI1RQX2NoZWNrX3dvcmRzX3Bsb3QKYGBgCmBgYHtyfQpZTF9jaGVja193b3Jkc19wbG90IDwtIHdhdGVyX25ncmFtc18xMV9zZXBhcmF0ZWQgJT4lIAogIGZpbHRlcih3b3JkNiA9PSAi5a6c6JitIikgJT4lIAogIG1lbHQoaWQudmFycyA9ICJhcnRVcmwiLCBtZWFzdXJlLnZhcnMgPSBwYXN0ZTAoIndvcmQiLCBjKDE6MTEpLHNlcD0iIikpICU+JQogIHJlbmFtZSh3b3JkID0gdmFsdWUpICU+JQogIGZpbHRlcih2YXJpYWJsZSE9IndvcmQ2IikgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIGMoIuWPsOeBoyIsIue8uuawtCIsIuS4i+mbqCIsIuawtOW6qyIsIuWVj+mhjCIsIuWunOiYrSIpKSkgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIHN0b3Bfd29yZHMpLCBuY2hhcih3b3JkKT4xKSAlPiUgIyMjCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICAlPiUKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQogIHRvcF9uKDUsbikgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBuKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UsZmlsbD0iI0Q1NUUwMCIpICsKICB4bGFiKCLjgIzlrpzomK3jgI3pmYTov5HnmoTlrZciKSArCiAgeWxhYigi5Ye654++5qyh5pW4IikgKwogIGNvb3JkX2ZsaXAoKSsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiLHNpemU9MTApKQoKI1lMX2NoZWNrX3dvcmRzX3Bsb3QKYGBgCmBgYHtyfQojIOS4reWNl+mDqApDTl9jaGVja193b3Jkc19wbG90IDwtIHdhdGVyX25ncmFtc18xMV9zZXBhcmF0ZWQgJT4lIAogIGZpbHRlcih3b3JkNiA9PSAi5Lit5Y2X6YOoIikgJT4lIAogIG1lbHQoaWQudmFycyA9ICJhcnRVcmwiLCBtZWFzdXJlLnZhcnMgPSBwYXN0ZTAoIndvcmQiLCBjKDE6MTEpLHNlcD0iIikpICU+JQogIHJlbmFtZSh3b3JkID0gdmFsdWUpICU+JQogIGZpbHRlcih2YXJpYWJsZSE9IndvcmQ2IikgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIGMoIuWPsOeBoyIsIue8uuawtCIsIuS4i+mbqCIsIuawtOW6qyIsIuWVj+mhjCIsIuS4reWNl+mDqCIpKSkgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIHN0b3Bfd29yZHMpLCBuY2hhcih3b3JkKT4xKSAlPiUgIyMjCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICAlPiUKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQogIHRvcF9uKDcsbikgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBuKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UsZmlsbD0iIzAwOUU3MyIpICsKICB4bGFiKCLjgIzkuK3ljZfpg6jjgI3pmYTov5HnmoTlrZciKSArCiAgeWxhYigi5Ye654++5qyh5pW4IikgKwogIGNvb3JkX2ZsaXAoKSsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiLHNpemU9MTApKQoKYGBgCmBgYHtyfQojIOmrmOmbhApLSF9jaGVja193b3Jkc19wbG90IDwtIHdhdGVyX25ncmFtc18xMV9zZXBhcmF0ZWQgJT4lIAogIGZpbHRlcih3b3JkNiA9PSAi6auY6ZuEIikgJT4lIAogIG1lbHQoaWQudmFycyA9ICJhcnRVcmwiLCBtZWFzdXJlLnZhcnMgPSBwYXN0ZTAoIndvcmQiLCBjKDE6MTEpLHNlcD0iIikpICU+JQogIHJlbmFtZSh3b3JkID0gdmFsdWUpICU+JQogIGZpbHRlcih2YXJpYWJsZSE9IndvcmQ2IikgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIGMoIuWPsOeBoyIsIue8uuawtCIsIuS4i+mbqCIsIuawtOW6qyIsIuWVj+mhjCIsIumrmOmbhCIpKSkgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIHN0b3Bfd29yZHMpLCBuY2hhcih3b3JkKT4xKSAlPiUgIyMjCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICAlPiUKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQogIHRvcF9uKDgsbikgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBuKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UsZmlsbD0iI0NDNzlBNyIpICsKICB4bGFiKCLjgIzpq5jpm4TjgI3pmYTov5HnmoTlrZciKSArCiAgeWxhYigi5Ye654++5qyh5pW4IikgKwogIGNvb3JkX2ZsaXAoKSsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiLHNpemU9MTApKQoKCmBgYAoKYGBge3J9CiMg5ZCI5L215aSa5ZyW55qEZnVuY3Rpb24KIyBNdWx0aXBsZSBwbG90IGZ1bmN0aW9uCiMKIyBnZ3Bsb3Qgb2JqZWN0cyBjYW4gYmUgcGFzc2VkIGluIC4uLiwgb3IgdG8gcGxvdGxpc3QgKGFzIGEgbGlzdCBvZiBnZ3Bsb3Qgb2JqZWN0cykKIyAtIGNvbHM6ICAgTnVtYmVyIG9mIGNvbHVtbnMgaW4gbGF5b3V0CiMgLSBsYXlvdXQ6IEEgbWF0cml4IHNwZWNpZnlpbmcgdGhlIGxheW91dC4gSWYgcHJlc2VudCwgJ2NvbHMnIGlzIGlnbm9yZWQuCiMKIyBJZiB0aGUgbGF5b3V0IGlzIHNvbWV0aGluZyBsaWtlIG1hdHJpeChjKDEsMiwzLDMpLCBucm93PTIsIGJ5cm93PVRSVUUpLAojIHRoZW4gcGxvdCAxIHdpbGwgZ28gaW4gdGhlIHVwcGVyIGxlZnQsIDIgd2lsbCBnbyBpbiB0aGUgdXBwZXIgcmlnaHQsIGFuZAojIDMgd2lsbCBnbyBhbGwgdGhlIHdheSBhY3Jvc3MgdGhlIGJvdHRvbS4KIwptdWx0aXBsb3QgPC0gZnVuY3Rpb24oLi4uLCBwbG90bGlzdD1OVUxMLCBmaWxlLCBjb2xzPTEsIGxheW91dD1OVUxMKSB7CiAgbGlicmFyeShncmlkKQogCiAgIyBNYWtlIGEgbGlzdCBmcm9tIHRoZSAuLi4gYXJndW1lbnRzIGFuZCBwbG90bGlzdAogIHBsb3RzIDwtIGMobGlzdCguLi4pLCBwbG90bGlzdCkKIAogIG51bVBsb3RzID0gbGVuZ3RoKHBsb3RzKQogCiAgIyBJZiBsYXlvdXQgaXMgTlVMTCwgdGhlbiB1c2UgJ2NvbHMnIHRvIGRldGVybWluZSBsYXlvdXQKICBpZiAoaXMubnVsbChsYXlvdXQpKSB7CiAgICAjIE1ha2UgdGhlIHBhbmVsCiAgICAjIG5jb2w6IE51bWJlciBvZiBjb2x1bW5zIG9mIHBsb3RzCiAgICAjIG5yb3c6IE51bWJlciBvZiByb3dzIG5lZWRlZCwgY2FsY3VsYXRlZCBmcm9tICMgb2YgY29scwogICAgbGF5b3V0IDwtIG1hdHJpeChzZXEoMSwgY29scyAqIGNlaWxpbmcobnVtUGxvdHMvY29scykpLAogICAgICAgICAgICAgICAgICAgIG5jb2wgPSBjb2xzLCBucm93ID0gY2VpbGluZyhudW1QbG90cy9jb2xzKSkKICB9CiAKIGlmIChudW1QbG90cz09MSkgewogICAgcHJpbnQocGxvdHNbWzFdXSkKIAogIH0gZWxzZSB7CiAgICAjIFNldCB1cCB0aGUgcGFnZQogICAgZ3JpZC5uZXdwYWdlKCkKICAgIHB1c2hWaWV3cG9ydCh2aWV3cG9ydChsYXlvdXQgPSBncmlkLmxheW91dChucm93KGxheW91dCksIG5jb2wobGF5b3V0KSkpKQogCiAgICAjIE1ha2UgZWFjaCBwbG90LCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbgogICAgZm9yIChpIGluIDE6bnVtUGxvdHMpIHsKICAgICAgIyBHZXQgdGhlIGksaiBtYXRyaXggcG9zaXRpb25zIG9mIHRoZSByZWdpb25zIHRoYXQgY29udGFpbiB0aGlzIHN1YnBsb3QKICAgICAgbWF0Y2hpZHggPC0gYXMuZGF0YS5mcmFtZSh3aGljaChsYXlvdXQgPT0gaSwgYXJyLmluZCA9IFRSVUUpKQogCiAgICAgIHByaW50KHBsb3RzW1tpXV0sIHZwID0gdmlld3BvcnQobGF5b3V0LnBvcy5yb3cgPSBtYXRjaGlkeCRyb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LnBvcy5jb2wgPSBtYXRjaGlkeCRjb2wpKQogICAgfQogIH0KfQpgYGAKCmBgYHtyfQojIFRoZSBwYWxldHRlIHdpdGggZ3JleToKIyBjYlBhbGV0dGUgPC0gYygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiLCAiIzAwOUU3MyIsICIjRjBFNDQyIiwgIiMwMDcyQjIiLCAiI0Q1NUUwMCIsICIjQ0M3OUE3IikKCiMg5ZCI5L215omA5pyJbG9jYXRpb27nmoTlnJYKbXVsdGlwbG90KFROX2NoZWNrX3dvcmRzX3Bsb3QsIFRDX2NoZWNrX3dvcmRzX3Bsb3QsIFRQX2NoZWNrX3dvcmRzX3Bsb3QsCiAgICAgICAgICBZTF9jaGVja193b3Jkc19wbG90LCBLSF9jaGVja193b3Jkc19wbG90LCBDTl9jaGVja193b3Jkc19wbG90LCBjb2xzPTIpCmBgYAoKKyDlj7DljZfjgIHpq5jpm4Q66auY6ZuE5pSv5o+05Y+w5Y2X55So5rC0Mi8yNeS5i+W+jOi9iem7g+eHiCDmiYDku6XmmqvlgZzmlK/mj7QKCisg5Y+w5LitOuWPsOS4reOAgeiLl+agl+OAgeaWsOerueawtOaDheWatOeoriA0LzbotbflgZw15L6bMgoKKyDlrpzomK065Y+w56mN6Zu754K66Kej5rG657y65rC077yM5YKz5Ye66Kit5bug5a6c6Jit55qE5raI5oGvCgojIyA0LuWFtuS7luS4gOS6m+i8g+W4uOWHuuePvueahOipnuW9mQoK5Y+w56mN6Zu744CB5rCR55Sf44CB6L6y5qWtCmBgYHtyfQojIOafpeeci+OAjOWPsOepjembu+OAjemZhOi/keeahOipnuW9mQpUU01DX2NoZWNrX3dvcmRzIDwtIHdhdGVyX25ncmFtc18xMV9zZXBhcmF0ZWQgJT4lCiAgZmlsdGVyKHdvcmQ2ID09ICLlj7DnqY3pm7siKQpoZWFkKFRTTUNfY2hlY2tfd29yZHMpCgpUU01DX2NoZWNrX3dvcmRzX3Bsb3QgPC0gVFNNQ19jaGVja193b3JkcyAlPiUKICBtZWx0KGlkLnZhcnMgPSAiYXJ0VXJsIiwgbWVhc3VyZS52YXJzID0gcGFzdGUwKCJ3b3JkIiwgYygxOjExKSxzZXA9IiIpKSAlPiUKICByZW5hbWUod29yZCA9IHZhbHVlKSAlPiUKICBmaWx0ZXIodmFyaWFibGUhPSJ3b3JkNiIpICU+JQogICMgZmlsdGVyKCEod29yZCAlaW4lIGMoIuWPsOeBoyIsIue8uuawtCIsIuS4i+mbqCIsIuawtOW6qyIsIuWVj+mhjCIsIue8uumbuyIpKSkgJT4lIAogIGZpbHRlcighKHdvcmQgJWluJSBjKCLlj7DngaMiLCAi5Y+w56mN6Zu7IikpKSAlPiUgCiAgZmlsdGVyKCEod29yZCAlaW4lIHN0b3Bfd29yZHMpLCBuY2hhcih3b3JkKT4xKSAlPiUgIyMjCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lCiAgdG9wX24oOCxuKSAlPiUgCiAgZ2dwbG90KGFlcyh3b3JkLCBuKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UsIGZpbGw9IiM5OTk5OTkiKSArCiAgeGxhYigi44CM5Y+w56mN6Zu744CN6ZmE6L+R55qE5a2XIikgKwogIHlsYWIoIuWHuuePvuasoeaVuCIpICsKICBjb29yZF9mbGlwKCkrIAogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IixzaXplPTEwKSkKVFNNQ19jaGVja193b3Jkc19wbG90CmBgYApgYGB7cn0KIyDmn6XnnIvjgIzmsJHnlJ/jgI3pmYTov5HnmoToqZ7lvZkKTVNfY2hlY2tfd29yZHMgPC0gd2F0ZXJfbmdyYW1zXzExX3NlcGFyYXRlZCAlPiUKICBmaWx0ZXIod29yZDYgPT0gIuawkeeUnyIpCmhlYWQoTVNfY2hlY2tfd29yZHMpCgpNU19jaGVja193b3Jkc19wbG90IDwtIE1TX2NoZWNrX3dvcmRzICU+JQogIG1lbHQoaWQudmFycyA9ICJhcnRVcmwiLCBtZWFzdXJlLnZhcnMgPSBwYXN0ZTAoIndvcmQiLCBjKDE6MTEpLHNlcD0iIikpICU+JQogIHJlbmFtZSh3b3JkID0gdmFsdWUpICU+JQogIGZpbHRlcih2YXJpYWJsZSE9IndvcmQ2IikgJT4lCiAgIyBmaWx0ZXIoISh3b3JkICVpbiUgYygi5Y+w54GjIiwi57y65rC0Iiwi5LiL6ZuoIiwi5rC05bqrIiwi5ZWP6aGMIiwi57y66Zu7IikpKSAlPiUgCiAgZmlsdGVyKCEod29yZCAlaW4lIGMoIuWPsOeBoyIpKSkgJT4lIAogIGZpbHRlcighKHdvcmQgJWluJSBzdG9wX3dvcmRzKSwgbmNoYXIod29yZCk+MSkgJT4lICMjIwogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQogIHRvcF9uKDgsbikgJT4lIAogIGdncGxvdChhZXMod29yZCwgbikpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFLCBmaWxsPSIjOTk5OTk5IikgKwogIHhsYWIoIuOAjOawkeeUn+OAjemZhOi/keeahOWtlyIpICsKICB5bGFiKCLlh7rnj77mrKHmlbgiKSArCiAgY29vcmRfZmxpcCgpKyAKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIsc2l6ZT0xMCkpCk1TX2NoZWNrX3dvcmRzX3Bsb3QKYGBgCmBgYHtyfQojIOafpeeci+OAjOi+sualreOAjemZhOi/keeahOipnuW9mQpBR19jaGVja193b3JkcyA8LSB3YXRlcl9uZ3JhbXNfMTFfc2VwYXJhdGVkICU+JQogIGZpbHRlcih3b3JkNiA9PSAi6L6y5qWtIikKaGVhZChBR19jaGVja193b3JkcykKCkFHX2NoZWNrX3dvcmRzX3Bsb3QgPC0gQUdfY2hlY2tfd29yZHMgJT4lCiAgbWVsdChpZC52YXJzID0gImFydFVybCIsIG1lYXN1cmUudmFycyA9IHBhc3RlMCgid29yZCIsIGMoMToxMSksc2VwPSIiKSkgJT4lCiAgcmVuYW1lKHdvcmQgPSB2YWx1ZSkgJT4lCiAgZmlsdGVyKHZhcmlhYmxlIT0id29yZDYiKSAlPiUKICAjIGZpbHRlcighKHdvcmQgJWluJSBjKCLlj7DngaMiLCLnvLrmsLQiLCLkuIvpm6giLCLmsLTluqsiLCLllY/poYwiLCLnvLrpm7siKSkpICU+JSAKICBmaWx0ZXIoISh3b3JkICVpbiUgYygi5Y+w54GjIikpKSAlPiUgCiAgZmlsdGVyKCEod29yZCAlaW4lIHN0b3Bfd29yZHMpLCBuY2hhcih3b3JkKT4xKSAlPiUgIyMjCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lCiAgdG9wX24oOCxuKSAlPiUgCiAgZ2dwbG90KGFlcyh3b3JkLCBuKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UsIGZpbGw9IiM5OTk5OTkiKSArCiAgeGxhYigi44CM6L6y5qWt44CN6ZmE6L+R55qE5a2XIikgKwogIHlsYWIoIuWHuuePvuasoeaVuCIpICsKICBjb29yZF9mbGlwKCkrIAogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IixzaXplPTEwKSkKQUdfY2hlY2tfd29yZHNfcGxvdApgYGAKCisg5Y+w56mN6Zu7OiDlj7DngaPmmJPnvLrmsLTnvLrpm7vmk6znp7voqK3lgpnoh7PljZfkuqzlu6AKCisg6L6y5qWtOiDovrLmpa3lkozljYrlsI7pq5TngrrlhanlpKfkuLvopoHnlKjmsLTvvIznvLrmsLTllY/poYzlvbHpn7/lhanlpKfnlKLmpa0KCiMgQ2guNTog5Li76aGM5qih5Z6L55qE5YiG5p6QCgojIyDlu7rnq4tMREHmqKHlnosK57Wx6KiI5q+P56+H5paH56ug6Kme6aC7CmBgYHtyfQp3YXRlcl90b2tlbnMgPC0gcmJpbmQoTVRva2VuWyxjKCJhcnREYXRlIiwgIndvcmQiLCJhcnRUaXRsZSIpXSxSVG9rZW5bLGMoImFydERhdGUiLCJ3b3JkIiwiYXJ0VGl0bGUiKV0pIAoKIyDpgJnpgoropoHljrvmjonlgZznlKjlrZfvvIzku6Xlj4roh6rlu7rnmoTovq3lhbgKd2F0ZXJfYXJ0aWQgPC0gd2F0ZXJfdG9rZW5zICU+JQogIGZpbHRlcighc3RyX2RldGVjdCh3b3JkLCByZWdleCgiWzAtOWEtekEtWl0iKSkpICU+JSAKICBjb3VudChhcnRUaXRsZSwgd29yZCkgJT4lIAogIHJlbmFtZShjb3VudD1uKSAlPiUgCiAgbXV0YXRlKGFydElkID0gZ3JvdXBfaW5kaWNlcyguLCBhcnRUaXRsZSkpCmhlYWQod2F0ZXJfYXJ0aWQpCmBgYAoKCmBgYHtyfQpyZXNlcnZlZF93b3JkIDwtIHdhdGVyX2FydGlkICU+JSAKICBncm91cF9ieSh3b3JkKSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZmlsdGVyKG4gPiA1KSAlPiUgCiAgdW5saXN0KCkKCndhdGVyX2FydGlkIDwtIHdhdGVyX2FydGlkICU+JSAKICBmaWx0ZXIod29yZCAlaW4lIHJlc2VydmVkX3dvcmQpCmBgYAoKYGBge3J9CiMg6L2J5o+b54K6RFRNCndhdGVyX2NvbV9kdG0gPC0gd2F0ZXJfYXJ0aWQgJT4lIAogIGNhc3RfZHRtKGFydElkLCB3b3JkLCBjb3VudCkKd2F0ZXJfY29tX2R0bQpgYGAKYGBge3J9CmxpYnJhcnkoTERBdmlzKQpsaWJyYXJ5KHRvcGljbW9kZWxzKQojIOi9ieeCuuWIhuaIkOWFqee+pOeahExEQQp3YXRlcl9sZGEgPC0gTERBKHdhdGVyX2NvbV9kdG0sIGsgPSAyLCBjb250cm9sID0gbGlzdChzZWVkID0gMTIzNCkpCgp0d29fdG9waWNzIDwtIHRpZHkod2F0ZXJfbGRhLCBtYXRyaXggPSAiYmV0YSIpCmhlYWQodHdvX3RvcGljcykKYGBgCmBgYHtyfQojIOeci+WIhuWHuuS+hueahOWFqeWAi3RvcGlj5Lit77yM5pyA5bi45Ye654++55qE6KmeCnRvcF90ZXJtcyA8LSB0d29fdG9waWNzICU+JQogIGZpbHRlcighKHRlcm0gJWluJSBjKCLlj7DngaMiKSkpICU+JSAKICBmaWx0ZXIoISh0ZXJtICVpbiUgc3RvcF93b3JkcyksIG5jaGFyKHRlcm0pPjEpICU+JQogIGdyb3VwX2J5KHRvcGljKSAlPiUKICB0b3BfbigxMCwgYmV0YSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UodG9waWMsIC1iZXRhKSAlPiUKICBtdXRhdGUodGVybSA9IHJlb3JkZXIodGVybSwgYmV0YSkpICU+JQogIGdncGxvdChhZXModGVybSwgYmV0YSwgZmlsbCA9IGZhY3Rvcih0b3BpYykpKSArICAjIOeVq+WclueahOmDqOWIhgogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBmYWNldF93cmFwKH4gdG9waWMsIHNjYWxlcyA9ICJmcmVlIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSkKCnRvcF90ZXJtcwoKYGBgCgrlhankuLvpoYzkuYvplpPnm7jlt67mnIDlpKfnmoToqZ7lvZkKCuato+i2iuWkp+ihqOekuui2iuWCvuWQkeS4u+mhjOS6jO+8jOiyoOi2iuWkp+i2iuWCvuWQkeS4u+mhjOS4gO+8jAoKYGBge3J9CmJldGFfc3ByZWFkIDwtIHR3b190b3BpY3MgJT4lCiAgbXV0YXRlKHRvcGljID0gcGFzdGUwKCJ0b3BpYyIsIHRvcGljKSkgJT4lCiAgc3ByZWFkKHRvcGljLCBiZXRhKSAlPiUKICBmaWx0ZXIodG9waWMxID4gLjAwMDQgfCB0b3BpYzIgPiAuMDAwNCApICU+JQogIG11dGF0ZShsb2dfcmF0aW8gPSBsb2cyKHRvcGljMiAvIHRvcGljMSkpCgp0b3BpY19yYXRpbyA8LSByYmluZChiZXRhX3NwcmVhZCAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICB0b3BfbigxMCx3dCA9IGxvZ19yYXRpbyksIAogICAgICAgICAgICAgICAgICAgICAgIGJldGFfc3ByZWFkICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9uKC0xMCwgbG9nX3JhdGlvKSkgJT4lCiAgYXJyYW5nZShsb2dfcmF0aW8pCgp0b3BpY19yYXRpbyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcih0ZXJtLCBsb2dfcmF0aW8pLCB5ID0gbG9nX3JhdGlvKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKyAKICB4bGFiKCJXb3JkIikrCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKQpgYGAKCkxEQXZpcwoK5Y+q5YiG54K65YWp5YCL5Li76aGM5Ye65L6G55qE57WQ5p6c5Lim5LiN5piv5b6I5piO56K677yM6YCZ6KOh5pS55oiQ5YiG54K65LiJ5YCL5Li76aGM44CCCmBgYHtyfQp0b3BpY21vZGVsc19qc29uX2xkYXZpcyA8LSBmdW5jdGlvbihmaXR0ZWQsIGRvY190ZXJtKXsKICAgIHJlcXVpcmUoTERBdmlzKQogICAgcmVxdWlyZShzbGFtKQogICAgcGhpIDwtIGFzLm1hdHJpeChwb3N0ZXJpb3IoZml0dGVkKSR0ZXJtcykKICAgIHRoZXRhIDwtIGFzLm1hdHJpeChwb3N0ZXJpb3IoZml0dGVkKSR0b3BpY3MpCiAgICB2b2NhYiA8LSBjb2xuYW1lcyhwaGkpCiAgICB0ZXJtX2ZyZXEgPC0gc2xhbTo6Y29sX3N1bXMoZG9jX3Rlcm0pCiAgICBqc29uX2xkYSA8LSBMREF2aXM6OmNyZWF0ZUpTT04ocGhpID0gcGhpLCB0aGV0YSA9IHRoZXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9jYWIgPSB2b2NhYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5sZW5ndGggPSBhcy52ZWN0b3IodGFibGUoZG9jX3Rlcm0kaSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybS5mcmVxdWVuY3kgPSB0ZXJtX2ZyZXEpCiAgICByZXR1cm4oanNvbl9sZGEpCn0KYGBgCgpgYGB7cn0KIyB3YXRlcl9sZGF2aXMgPC0gTERBKHdhdGVyX2NvbV9kdG0sIGsgPSAzLCBjb250cm9sID0gbGlzdChzZWVkID0gMTIzNCkpCiMganNvbl9yZXMgPC0gdG9waWNtb2RlbHNfanNvbl9sZGF2aXMod2F0ZXJfbGRhdmlzLHdhdGVyX2NvbV9kdG0pCiMgc2VyVmlzKGpzb25fcmVzLCBvcGVuLmJyb3dzZXIgPSBUKQpgYGAKIVtdKHRvcGljMS5wbmcpCiFbXSh0b3BpYzIucG5nKQohW10odG9waWMzLnBuZykKCgojIENoLjbvvJrlhbbku5YKCuaIkeWAkeWIhuaekOS6hlR3aXR0ZXLkuIrmnInpl5wgI1RhaXdhbiDlkowgI2Ryb3VnaHQg5L2c54K66Zec6Y215a2X55qE6LK85paHCgohW10odHdpdHRlci5wbmcpCgoK55m854++5aSn5a626Zec5rOo55qE54Sm6bue5Li76KaB5piv5Zyo77yM5pm254mH5ZKM5Y2K5bCO6auUCgojIENoLjfvvJrntZDoq5YKCisg5aSn5a6255qE6KiO6KuW5Li76KaB6YKE5piv6LKg6Z2i5oOF57eS5bGF5aSa77yM6LKg6Z2i5oOF57eS55qE5L6G5rqQ5Li76KaB5piv5biM5pyb5pS/5bqc5Y+v5Lul5bCN5pa857y65rC055qE5oOF5rOB5pyJ5pu05aSa55qE5L2c54K677yM5Lul5Y+K5bCN5pa85pyq5L6G5rC05oOF55qE5pOU5oaC44CCCisg5ZCE5YCL57ij5biC5bCN5pa857y65rC054uA5rOB6Zec5rOo55qE6YeN6bue77yM5ZCE5pyJ5LiN5ZCM44CCCisg5YWo55CD5bCN5pa85Y+w54Gj57y65rC054uA5rOB55qE5Y+N5pig77yM5Li76KaB5piv5bCN5pa85YWo55CD5pm254mH55Si6IO955qE5pOU5oaC44CCCg==