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
# echo = T,results = 'hide'
packages = c("dplyr", "tidytext", "stringr", "wordcloud2", "ggplot2",'readr','data.table','reshape2','wordcloud','tidyr','scales','ngram')
existing = as.character(installed.packages()[,1])
for(pkg in packages[!(packages %in% existing)]) install.packages(pkg)
讀進library
Ch.1 : 資料的基本分析
1. 資料前處理
(1). 文章斷詞
設定斷詞引擎
# 把文章和留言的斷詞結果併在一起
MToken <- MetaData %>% unnest_tokens(word, sentence, token=customized_tokenizer)
RToken <- Reviews %>% unnest_tokens(word, cmtContent, token=customized_tokenizer)
# 把資料併在一起
data <- rbind(MToken[,c("artDate","artUrl", "word")],RToken[,c("artDate","artUrl","word")])
head(data,20)
(2). 資料基本清理
`summarise()` has grouped output by 'artDate'. You can override using the `.groups` argument.
2. 準備LIWC字典
全名Linguistic Inquiry and Word Counts,由心理學家Pennebaker於2001出版 分為正向情緒與負向情緒
#讀檔,字詞間以","將字分隔
P <- read_file("dict/liwc/positive.txt") # 正向字典txt檔
N <- read_file("dict/liwc/negative.txt") # 負向字典txt檔
# 將字串依,分割
# strsplit回傳list , 我們取出list中的第一個元素
P = strsplit(P, ",")[[1]]
N = strsplit(N, ",")[[1]]
# 建立dataframe 有兩個欄位word,sentiments,word欄位內容是字典向量
P = data.frame(word = P, sentiment = "positive") #664
N = data.frame(word = N, sentiment = "negative") #1047
# 把兩個字典拼在一起
LIWC = rbind(P, N)
Ch.2 : 情緒分析以及文字雲
1. 將文章和與LIWC情緒字典做join
發文折線圖

找出文集中,對於LIWC字典是positive和negative的字
算出每天情緒總和(sentiment_count)
Joining, by = "word"
`summarise()` has grouped output by 'artDate'. You can override using the `.groups` argument.
三月正負情緒分數折線圖
[1] "2021-02-05" "2021-04-28"

四月正負情緒分數折線圖
[1] "2021-02-05" "2021-04-28"

2. 畫出文字雲
2021-04-25 文字雲
Adding missing grouping variables: `artDate`
因為高雄市長陳其邁昨在臉書PO文分享穿西裝淋雨罩,引發熱議。
2021-03-05 文字雲

2021-04-12 文字雲

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

3.找出情緒字典代表字
算出所有字詞的詞頻(sentiment_sum),找出情緒代表字
正負情緒代表字
Joining, by = "word"
`summarise()` has grouped output by 'word'. You can override using the `.groups` argument.

另外一種呈現方式
正負情緒文字雲

另外,也可以依據不同日期觀察情緒代表字的變化
2021-04-12 正負情緒代表字
Joining, by = "word"
`summarise()` has grouped output by 'word'. You can override using the `.groups` argument.

2021-04-12 正負情緒文字雲

4.歸類正負面文章
之前的情緒分析大部分是全部的詞彙加總,接下來將正負面情緒的文章分開,看看能不能發現一些新的東西。接下來歸類文章,將每一篇文章正負面情緒的分數算出來,然後大概分類文章屬於正面還是負面。
Joining, by = "word"
`summarise()` has grouped output by 'artUrl'. You can override using the `.groups` argument.
正負情緒文章數量統計圖
已缺水事件來說,負面情緒的文章比較多
#
article_type_date = left_join(article_type[,c("artUrl", "type")], MetaData[,c("artUrl", "artDate")], by = "artUrl")
article_type_date %>%
group_by(artDate,type) %>%
summarise(count = n()) %>%
ggplot(aes(x = artDate, y = count, fill = type)) +
geom_bar(stat = "identity", position = "dodge")+
scale_x_date(labels = date_format("%m/%d"),
limits = as.Date(c('2021-03-01','2021-04-30'))
)
`summarise()` has grouped output by 'artDate'. 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.

Ch.3: 各家新聞媒體的情緒分析
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.
2.將文章和與LIWC情緒字典做join
在畫出情緒之前,先看看每天的發文情形。
各家新聞發文折線圖
ETTV_MetaData$artDate= ETTV_MetaData$artDate %>% as.Date("%Y/%m/%d")
UDN_MetaData$artDate= UDN_MetaData$artDate %>% as.Date("%Y/%m/%d")
Apple_MetaData$artDate= Apple_MetaData$artDate %>% as.Date("%Y/%m/%d")
ETTV_Post <- ETTV_MetaData %>% group_by(artDate) %>% summarise(count = n())
UDN_Post <- UDN_MetaData %>% group_by(artDate) %>% summarise(count = n())
Apple_Post <- Apple_MetaData %>% group_by(artDate) %>% summarise(count = n())
ggplot()+
geom_line(data = ETTV_Post, aes(x=artDate,y=count,colour = "聯合新聞網"))+
scale_x_date(labels = date_format("%m/%d"))+
geom_line(data = UDN_Post, aes(x=artDate,y=count,colour ="東森新聞網"))+
scale_x_date(labels = date_format("%m/%d"))+
geom_line(data = Apple_Post, aes(x=artDate,y=count,colour ="蘋果新聞網"))+
scale_x_date(labels = date_format("%m/%d"))+
scale_colour_manual("",values = c("聯合新聞網" = "red","東森新聞網" = "blue", "蘋果新聞網" = "black"))+
theme(text=element_text(size=14,family = "Heiti TC Light"))
Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.
Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.

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.
4.算出所有字詞詞頻後,各新聞網最常出現的情緒代表字



可以看出東森新聞的報導情緒詞較少,較為中立客觀。
而聯合新聞中的情緒詞則非常豐富,同時出現了很多不常在新聞報導中看到的詞彙像是“逗趣”。
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.
# negative_article:artUrl,word
ETTV_negative_article <-
ETTV_article_type %>%
filter(type=="negative")%>%
select(artUrl) %>%
left_join(ETTV_data_select[,c("artUrl", "word")], by = "artUrl")
# positive_article:artUrl,word
ETTV_positive_article <-
ETTV_article_type %>%
filter(type=="positive")%>%
select(artUrl) %>%
left_join(ETTV_data_select[,c("artUrl", "word")], by = "artUrl")
# negative_article:artUrl,word
UDN_negative_article <-
UDN_article_type %>%
filter(type=="negative")%>%
select(artUrl) %>%
left_join(UDN_data_select[,c("artUrl", "word")], by = "artUrl")
# positive_article:artUrl,word
UDN_positive_article <-
UDN_article_type %>%
filter(type=="positive")%>%
select(artUrl) %>%
left_join(UDN_data_select[,c("artUrl", "word")], by = "artUrl")
# negative_article:artUrl,word
Apple_negative_article <-
Apple_article_type %>%
filter(type=="negative")%>%
select(artUrl) %>%
left_join(Apple_data_select[,c("artUrl", "word")], by = "artUrl")
# positive_article:artUrl,word
Apple_positive_article <-
Apple_article_type %>%
filter(type=="positive")%>%
select(artUrl) %>%
left_join(Apple_data_select[,c("artUrl", "word")], by = "artUrl")
聯合新聞的正負面文章
因為聯合新聞的正負詞彙最為豐富,所以我們特別來看一下聯合新聞的正負面文章中主要出現的情緒詞
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.

Ch.4: 各個縣市對於水情關注的重點
2.查看出常出現在「缺水」附近的字。
water_check_words_count <- water_check_words %>%
melt(id.vars = "artUrl", measure.vars = paste0("word", c(1:11),sep="")) %>%
rename(word=value) %>%
filter(variable!="word6") %>%
filter(!(word %in% c("台灣","缺水","下雨","水庫","問題","嚴重","解決"))) %>%
filter(!(word %in% stop_words), nchar(word)>1) %>%
count(word, sort = TRUE)
water_check_words_count %>%
top_n(10,n) %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n, fill = n > 0)) +
geom_col(show.legend = FALSE) +
xlab("出現在「缺水」附近的字") +
ylab("出現次數") +
coord_flip()+
theme(text = element_text(family = "Heiti TC Light"))

缺水周圍出現最多的是:缺電、各個地區、乾旱、危機
3.出現在各個縣市周圍的詞彙
台南、台中、台北、宜蘭、中南部
TN_check_words_plot <- TN_check_words %>%
melt(id.vars = "artUrl", measure.vars = paste0("word", c(1:11),sep="")) %>%
rename(word = value) %>%
filter(variable!="word6") %>%
filter(!(word %in% c("台灣","缺水","下雨","水庫","問題","台南"))) %>%
filter(!(word %in% stop_words), nchar(word)>1) %>% ###
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n)) %>%
top_n(8,n) %>%
ggplot(aes(word, n)) +
geom_col(show.legend = FALSE, fill="#999999") +
xlab("「台南」附近的字") +
ylab("出現次數") +
coord_flip()+
theme(text = element_text(family = "Heiti TC Light",size=10))
#TN_check_words_plot
TC_check_words_plot <- water_ngrams_11_separated %>%
filter(word6 == "台中") %>%
melt(id.vars = "artUrl", measure.vars = paste0("word", c(1:11),sep="")) %>%
rename(word = value) %>%
filter(variable!="word6") %>%
filter(!(word %in% c("台灣","缺水","下雨","水庫","問題","台中"))) %>%
filter(!(word %in% stop_words), nchar(word)>1) %>% ###
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n)) %>%
top_n(8,n) %>%
ggplot(aes(word, n)) +
geom_col(show.legend = FALSE,fill="#E69F00") +
xlab("「台中」附近的字") +
ylab("出現次數") +
coord_flip()+
theme(text = element_text(family = "Heiti TC Light",size=10))
#TC_check_words_plot
TP_check_words_plot <- water_ngrams_11_separated %>%
filter(word6 == "台北") %>%
melt(id.vars = "artUrl", measure.vars = paste0("word", c(1:11),sep="")) %>%
rename(word = value) %>%
filter(variable!="word6") %>%
filter(!(word %in% c("台灣","缺水","下雨","水庫","問題","台北"))) %>%
filter(!(word %in% stop_words), nchar(word)>1) %>% ###
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n)) %>%
top_n(8,n) %>%
ggplot(aes(word, n)) +
geom_col(show.legend = FALSE, fill="#0072B2") +
xlab("「台北」附近的字") +
ylab("出現次數") +
coord_flip()+
theme(text = element_text(family = "Heiti TC Light",size=10))
#TP_check_words_plot
YL_check_words_plot <- water_ngrams_11_separated %>%
filter(word6 == "宜蘭") %>%
melt(id.vars = "artUrl", measure.vars = paste0("word", c(1:11),sep="")) %>%
rename(word = value) %>%
filter(variable!="word6") %>%
filter(!(word %in% c("台灣","缺水","下雨","水庫","問題","宜蘭"))) %>%
filter(!(word %in% stop_words), nchar(word)>1) %>% ###
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n)) %>%
top_n(5,n) %>%
ggplot(aes(word, n)) +
geom_col(show.legend = FALSE,fill="#D55E00") +
xlab("「宜蘭」附近的字") +
ylab("出現次數") +
coord_flip()+
theme(text = element_text(family = "Heiti TC Light",size=10))
#YL_check_words_plot
# 中南部
CN_check_words_plot <- water_ngrams_11_separated %>%
filter(word6 == "中南部") %>%
melt(id.vars = "artUrl", measure.vars = paste0("word", c(1:11),sep="")) %>%
rename(word = value) %>%
filter(variable!="word6") %>%
filter(!(word %in% c("台灣","缺水","下雨","水庫","問題","中南部"))) %>%
filter(!(word %in% stop_words), nchar(word)>1) %>% ###
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n)) %>%
top_n(7,n) %>%
ggplot(aes(word, n)) +
geom_col(show.legend = FALSE,fill="#009E73") +
xlab("「中南部」附近的字") +
ylab("出現次數") +
coord_flip()+
theme(text = element_text(family = "Heiti TC Light",size=10))
# 高雄
KH_check_words_plot <- water_ngrams_11_separated %>%
filter(word6 == "高雄") %>%
melt(id.vars = "artUrl", measure.vars = paste0("word", c(1:11),sep="")) %>%
rename(word = value) %>%
filter(variable!="word6") %>%
filter(!(word %in% c("台灣","缺水","下雨","水庫","問題","高雄"))) %>%
filter(!(word %in% stop_words), nchar(word)>1) %>% ###
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n)) %>%
top_n(8,n) %>%
ggplot(aes(word, n)) +
geom_col(show.legend = FALSE,fill="#CC79A7") +
xlab("「高雄」附近的字") +
ylab("出現次數") +
coord_flip()+
theme(text = element_text(family = "Heiti TC Light",size=10))
# 合併多圖的function
# Multiple plot function
#
# ggplot objects can be passed in ..., or to plotlist (as a list of ggplot objects)
# - cols: Number of columns in layout
# - layout: A matrix specifying the layout. If present, 'cols' is ignored.
#
# If the layout is something like matrix(c(1,2,3,3), nrow=2, byrow=TRUE),
# then plot 1 will go in the upper left, 2 will go in the upper right, and
# 3 will go all the way across the bottom.
#
multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
library(grid)
# Make a list from the ... arguments and plotlist
plots <- c(list(...), plotlist)
numPlots = length(plots)
# If layout is NULL, then use 'cols' to determine layout
if (is.null(layout)) {
# Make the panel
# ncol: Number of columns of plots
# nrow: Number of rows needed, calculated from # of cols
layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
ncol = cols, nrow = ceiling(numPlots/cols))
}
if (numPlots==1) {
print(plots[[1]])
} else {
# Set up the page
grid.newpage()
pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))
# Make each plot, in the correct location
for (i in 1:numPlots) {
# Get the i,j matrix positions of the regions that contain this subplot
matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))
print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
layout.pos.col = matchidx$col))
}
}
}
# The palette with grey:
# cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
# 合併所有location的圖
multiplot(TN_check_words_plot, TC_check_words_plot, TP_check_words_plot,
YL_check_words_plot, KH_check_words_plot, CN_check_words_plot, cols=2)

4.其他一些較常出現的詞彙
台積電、民生、農業
TSMC_check_words_plot <- TSMC_check_words %>%
melt(id.vars = "artUrl", measure.vars = paste0("word", c(1:11),sep="")) %>%
rename(word = value) %>%
filter(variable!="word6") %>%
# filter(!(word %in% c("台灣","缺水","下雨","水庫","問題","缺電"))) %>%
filter(!(word %in% c("台灣", "台積電"))) %>%
filter(!(word %in% stop_words), nchar(word)>1) %>% ###
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n)) %>%
top_n(8,n) %>%
ggplot(aes(word, n)) +
geom_col(show.legend = FALSE, fill="#999999") +
xlab("「台積電」附近的字") +
ylab("出現次數") +
coord_flip()+
theme(text = element_text(family = "Heiti TC Light",size=10))
TSMC_check_words_plot

MS_check_words_plot <- MS_check_words %>%
melt(id.vars = "artUrl", measure.vars = paste0("word", c(1:11),sep="")) %>%
rename(word = value) %>%
filter(variable!="word6") %>%
# filter(!(word %in% c("台灣","缺水","下雨","水庫","問題","缺電"))) %>%
filter(!(word %in% c("台灣"))) %>%
filter(!(word %in% stop_words), nchar(word)>1) %>% ###
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n)) %>%
top_n(8,n) %>%
ggplot(aes(word, n)) +
geom_col(show.legend = FALSE, fill="#999999") +
xlab("「民生」附近的字") +
ylab("出現次數") +
coord_flip()+
theme(text = element_text(family = "Heiti TC Light",size=10))
MS_check_words_plot

AG_check_words_plot <- AG_check_words %>%
melt(id.vars = "artUrl", measure.vars = paste0("word", c(1:11),sep="")) %>%
rename(word = value) %>%
filter(variable!="word6") %>%
# filter(!(word %in% c("台灣","缺水","下雨","水庫","問題","缺電"))) %>%
filter(!(word %in% c("台灣"))) %>%
filter(!(word %in% stop_words), nchar(word)>1) %>% ###
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n)) %>%
top_n(8,n) %>%
ggplot(aes(word, n)) +
geom_col(show.legend = FALSE, fill="#999999") +
xlab("「農業」附近的字") +
ylab("出現次數") +
coord_flip()+
theme(text = element_text(family = "Heiti TC Light",size=10))
AG_check_words_plot

Ch.5: 主題模型的分析
建立LDA模型
統計每篇文章詞頻
water_tokens <- rbind(MToken[,c("artDate", "word","artTitle")],RToken[,c("artDate","word","artTitle")])
# 這邊要去掉停用字,以及自建的辭典
water_artid <- water_tokens %>%
filter(!str_detect(word, regex("[0-9a-zA-Z]"))) %>%
count(artTitle, word) %>%
rename(count=n) %>%
mutate(artId = group_indices(., artTitle))
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==