Investigating Boardgame Complexity
Playing Time
Figure 1 shows the relationship between average complexicty of a game and its playing time. From the visualization of the scatter plot, there is a strong association between playing time and average complextity at first (between 15-to around 100 minutes) and then the association starts to lower as the playing time increases. Games that have a playing time between the range of 15-200 minutes have a complexity in the range of 1-5. Most of the games that are in that interval have a complexity concentrated between 1-3. Most games with a playing time of more than 200 minutes have a complexity level concentrated in the level of 2-4.5. Overall, one could stay that although there seems to be a certain relationship bewteen playing time and complexity level of a game,it seems the strength of the relationship is weak. Both games with a lower playing time and high playing time have more or less similar complexity thus, playing time does not seem to be associated with the complexity level of a game.
Number of Categories
This box plot shows the relationship between the number of categories and average complexity score of board games from 1950 to 2016. From the observed data, we can see that the highest complexity rating concentrates in games that have 9-12 categories. The average complexity score from the collected sample steadily increases as board games have more categories. However, once they have surpassed the 9-12 categories/per game, the average complexity rating drops significantly, with a median of around 2.2 average complexity score of boardgames with 13-14 categories and below 2 average complexity score of those with 21-24 categories. Board games with 25-28 categories have a median of 2.5 average complexity rating.
Base Games vs. Expansion Packs
Considering that expansion packs were quite literally adding new material (i.e. rules, lore, strategies, etc.), we wondered whether expansion packs were viewed as more complicated than base games, we decided to create multi-density plots as they would show the frequency of players that rated the game in a specific way for both base games and expansion packs. We filtered out all ratings of 0, as the lowest possible rating was 1. If we had kept that occurrence (0) in the data frame, the graph would imply that many players did not find these games to be complex at all when they really just did not provide a rating. We also noticed that expansion packs became prevalent in the 1970’s; we decided to keep previous data to allow for a temporal analysis of before and after.
We saw that, in general, expansion packs were viewed as more complicated by players. In the 1950s and 1960’s, board games were very skewed to the right (though much more extreme in the former), implying that they were viewed as simple and easy to play. In the 1970’s and forward, ratings began to vary more, but still were viewed as less complicated than that of expansion packs regardless of the decade. The largest subset of players seem to rate base games at a complexity between 1 and 2, implying these games are not very challenging. On the contrary, the largest subset of expansion pack players provided a rating that peaked at roughly 2 and 3. However, while all the density plots for original board games were largely right skewed, expansion packs were still skewed to the right, but only slightly (i.e. 1970’s and 1990’s); there is a much more even distribution. It is interesting to see though how prior to the rise of expansion packs, board games were considered much simpler. It would be interesting to see what factors caused this, and what factors maybe influence expansion packs being more complex.
Number of Categories ~ Game Type

When examining original board games (excluding their expansion versions), we can observe that in the most 2 recent decades, these original board games started to have more categories within a game. Furthermore, the median average complexity score for an original board game with more categories (around 2-3 for games with 9-12 and 13-16 categories), starting from the 1990s, is higher than those with less categories (around 1.8-1.9 for those with less than 9 categories). There is not much data on original games with more than 21 categories, however.
The group sought to look at how the complexity of expanded games compares to the amount of categories through a temporal lens. Figure 4.2 shows a reinforcement that expanded games only really came to prevalence in the 1970’s. These expansion packs were mostly between 1-8 categories, with the occurrence of 9-12 categories growing in the 2000’s. In general, it seems as if the graph shows a decline in perceptions of complexity for these games over time in expansion packs with either 1-4 or 5-8 categories, with greater median complexity alternating throughout the different decades. However, those expansion packs with 9-12 categories clearly had a greater median and average perceived complexity, although this was more clear in the 2000’s than the 2010’s (median 3.5 complexity in the 2000’s, but median 3 in the 2010’s).
Card & Science Fiction Games
As part of our research interest, we wanted to explore the Card Game and Science Fiction Category and see the trends across time and average complexity. To simplify our analysis, we focused on the decades from 1980 to 2010. Thus, we created a new variable called Decade and another variable of intervals for the average complexity score, whose scale was from 1 to 5, in which the parentheses () correspond to the value not being included in the interval and the square bracket [] that corresponds to the inclusion of the value in the interval.
From the figure above, we can observe that across the categories of low average complexity or [1,2] and (2,3], there is a similar trend in the production of Card Games and Science Fiction, being the Card Games the most common across all decades. For instance, between the 1990’s and 2010’s, approximately 90 percent of the games were Card Games. Conversely, on the medium category or (3,4], this trend in production seems to be the opposite. For example, the production of Science Fiction games in the 1980’s and 2000’s was approximately 90 percent and 80 percent respectively. Lastly, for those games whose average complexity scores fall into the last interval (4,5) or the most difficult according to the users’ ratings, there seems to be a predominantly higher proportion of Science Fiction Games as compared to Card Games. For example, in 1890’s and 2000’s, Science Fiction games were a hundred percent the most common among the average complexity score of 4 (not included) and 5. Yet, in the 2010’s, these variability in trend seemed to be reduced with Card Games taking up around 45 percent of the proportion of games released.
To further explore the previous trends from Figure 5.1, we proceed to dismiss our time exploration. Instead, we focused on examining the conditional proportions of the same two categories Card Game and Science Fiction across all the average complexity scores. Hence, we can observe that overall, Card Games have a higher proportion of the average complexity scores ranging from 1 to 3, as compared to the proportion of Science Fiction Games. Particularly, approximately 87 percent of the Card Games have an average complexity score between 1 and 2 while the other 13 percent corresponds to the Science Fiction Games. Likewise, across the second bar that corresponds to the average complexity score between 2 (not included), approximately 62 percent of the games are Card Games and 38 percent are science fiction games. Nonetheless, on the last two bars that represent the high average scores of 3 (not included), 4, and 5, there seems to be a higher proportion of Science Fiction games in comparison to the card games. For instance, in the last interval of average complexity scores 4 (not included) and 5, approximately more than 80 percent of the games are Science Fiction. Overall, Card Games seem to be more common among the with low scores and science fiction is rated as more complex.
Maximum Players
Throughout our data-wrangling process, we only considered games with 25 maximum players or fewer since the higher concentration was in the low numbers of players. From figure 6 we can observe the distribution of the average complexity scores of the games faceted by subgroups of the maximum number of players. From the scores, 1 is the lowest level of average complexity score and 5 is the highest. Within the group of 1-5 maximum number of players, there is a relatively uniform distribution of the average complexity between 1 and 4, having its highest peak at approximately 2. Correspondingly, within the group of 6-10 maximum players, the distribution is right-skewed, having the highest concentration around the lower average complexity scores and with two peaks close to 1 and 2. Additionally, the category of 11-15 maximum players has the highest concentration of around 1-3 average complexity and its peak is between 1-2. However, we can see that there is also some concentration around 3 to 5 average complexity. Lastly, the last two groups of 16-20 and 21-25 maximum players have a similar distribution, having the highest concentration and a peak between 1 to 2. Also, these groups have another concentration around 2.5 to 4 and both peaking at 3. Overall, there seems to be a tendency across all the groups for the maximum number of players and low level of complexity scores.
Code Appendix
#Loading packages
library(tidyverse)
library(splitstackshape)
library(dbplyr)
library(ggplot2)
library(ggthemes)
#Loading data
boardgames <-read_csv("https://raw.githubusercontent.com/bryandmartin/STAT155/master/docs/Projects/project1_bgdataviz/board_game_raw.csv")
#Saving raw data
write_csv(boardgames,file="./Data/boardgames.csv")
save(boardgames,file="./Data/boardgames.RData")
Figure 1
bg <- boardgames %>%
filter(yearpublished >= 1950 & users_rated >= 25 & average_complexity > 0 & playingtime>15 & playingtime< 400)
# Relationship between average rating and average complexity
bg %>%
ggplot(aes(x = playingtime, y = average_complexity)) +
geom_point(color="orange",alpha=.7,size=2) +
theme_bw()+
geom_smooth( se = FALSE)+
labs(title = "Relationship Between Average Complexity Time and Playing Time",
subtitle="Boardgames from 1950-2016",
x = " Playing Time (Minutes) ",
y = " Average Complexity ",
caption = "Graph by Sylvain Zong-Naba" )+
theme(plot.title=element_text(face="bold",size=16),
plot.subtitle=element_text(size=14),
plot.caption=element_text(face="italic",
hjust=0,
vjust=-1.5,
size=10))
Figure 2
```r
#Filtering data
boardgamesFiltered1 <- boardgames %>%
mutate(num_categories = str_count(`category`,"," ) + 1) %>%
filter(yearpublished>=1950) %>%
filter(num_categories != "N/A") %>%
filter(average_complexity!=0) %>%
mutate(numCat = cut(num_categories, breaks = seq(0, 28, by = 4)))
#Data visualization
boardgamesFiltered1 %>% ggplot(aes(x=numCat,y=average_complexity, fill=numCat))+
geom_boxplot(color="black")+
theme_bw()+
scale_fill_manual(values = c("red", "salmon", "pink", "steelblue1", "steelblue4","blue4"),labels=c("1-4","5-8","9-12","13-16","21-24","25-28"),name="Number of Categories")+
scale_x_discrete(labels=c("1-4","5-8","9-12","13-16","21-24","25-28"))+
labs(title="Relationship between Number of Categories and Average Complexity Score",subtitle="Boardgames from 1950-2016",y="Average Complexity",caption="Graph by Na Nguyen")+
theme(axis.title.x=element_blank(),plot.title=element_text(face="bold",size=16),axis.title.y=element_text(size=14),plot.subtitle=element_text(size=14),plot.caption=element_text(face="italic",hjust=0,vjust=-1.5,size=10))
Figure 3
# Filtering Data
complex_games <- clean_games %>%
select(game_type,
average_rating,
average_complexity,
yearpublished,
users_rated) %>%
filter(average_complexity != "0") %>%
mutate(decade = dplyr::case_when(
yearpublished >= 1950 & yearpublished <= 1959 ~ "1950's",
yearpublished >= 1960 & yearpublished <= 1969 ~ "1960's",
yearpublished >= 1970 & yearpublished <= 1979 ~ "1970's",
yearpublished >= 1980 & yearpublished <= 1989 ~ "1980's",
yearpublished >= 1990 & yearpublished <= 1999 ~ "1990's",
yearpublished >= 2000 & yearpublished <= 2009 ~ "2000's",
yearpublished >= 2010 & yearpublished <= 2019 ~ "2010's"))
legend_ttl <- "Game Type"
# Data Visualization
ggplot(complex_games,
aes(x = average_complexity,
fill = game_type)) +
geom_density(alpha = 0.7) +
scale_fill_manual(values = c( "mediumaquamarine", "lightcoral"),
labels=c("original board games", "expansion packs"),
name = "Game Type") +
labs(title = "Complexity of All Base Games Compared to All Expansion Packs",
x = "Average Rated Complexity",
y = "Frequency of Rating",
subtitle="Boardgames from 1950-2016",
caption= "Graph by James Hernandez") +
theme_bw() +
theme(plot.title = element_text(
face = "bold",
size = 16),
plot.subtitle=element_text(size=14),
plot.caption=element_text(face="italic",hjust=0,vjust=-1.5,size=10)) +
facet_wrap(~ decade)
Figure 4
#Filtering data 4.1
boardgamesFiltered2 <- boardgamesFiltered1 %>%
filter(game_type!="boardgameexpansion") %>%
mutate(decades=paste(as.character(floor(yearpublished/10)*10),"s",sep="'"))
#Data visualization 4.1
boardgamesFiltered2 %>% ggplot(aes(x=numCat,y=average_complexity, fill=numCat))+
geom_boxplot(width=.8)+
theme_bw()+
scale_fill_brewer(palette = "Set1",
labels=c("1-4","5-8","9-12","13-16","21-24","25-28")
)+
labs(
title="Relationship between Number of Categories and Average Complexity Score",subtitle="Original Boardgames from 1950-2016",
y="Average Complexity",
caption="Graph 4.1 by Na Nguyen",
fill="Number of Categories"
)+
theme(
axis.title.x=element_blank(),
axis.text.x=element_blank(),
plot.title=element_text(face="bold",size=16),
plot.subtitle=element_text(size=14),
axis.title.y=element_text(size=14),
plot.caption=element_text(face="italic",hjust=0,vjust=-1.5,size=10)
) +
facet_grid(~decades)
# Filtering data 4.2
boardgamesFiltered3 <- boardgamesFiltered1 %>%
filter(game_type =="boardgameexpansion") %>%
mutate(decades=paste(as.character(floor(yearpublished/10)*10),"s",sep="'"))
# Data visualization 4.2
boardgamesFiltered3 %>% ggplot(aes(x=numCat,
y=average_complexity,
fill=numCat))+
geom_boxplot(width=.8)+
theme_bw()+
scale_fill_brewer(palette = "Set1",
labels=c("1-4","5-8","9-12","13-16","21-24","25-28"))+
labs(
title="Relationship between Number of Categories and Average Complexity Score",
subtitle="Expansion Packs from 1950-2016",
y="Average Complexity",
caption="Graph 4.2 by James Hernandez",
fill="Number of Categories")+
theme(
axis.title.x=element_blank(),
axis.text.x=element_blank(),
plot.title=element_text(face="bold",
size=16),
plot.subtitle=element_text(size=14),
axis.title.y=element_text(size=14),
plot.caption=element_text(face="italic",
hjust=0,
vjust=-1.5,
size=10)) +
facet_grid(~decades)
Figure 5
# Filtering the raw data/Data Wrangling 5.1
boardgamestop <- boardgames %>%
filter(yearpublished >= 1950 & users_rated>= 25 & average_rating > 0 & average_complexity > 0 & maxplayers > 0) %>%
cSplit("category", sep = ",", direction = "long") %>%
mutate(Decade = factor(floor(yearpublished/10)*10)) %>%
mutate(avgComplexityCat = cut(average_complexity, breaks = seq(from = 1, to = 5, by =1), include.lowest = TRUE)) %>%
group_by(Decade, category, avgComplexityCat) %>%
filter(category %in% c("Card Game", "Science Fiction"))
boardgamestop$game_type <- boardgamestop$game_type %>%
str_replace("boardgameexpansion", "Board Game Expansion") %>%
str_replace("boardgame", "Board Game")
#Data Visualization 5.1
boardgamestop %>%
filter(Decade %in% c(1980, 1990, 2000, 2010)) %>%
ggplot(aes(x=Decade, fill = category)) +
geom_bar(position = 'fill') +
facet_wrap(~avgComplexityCat) +
scale_fill_viridis_d(name = "Category", option = "mako") +
theme(axis.text.x = element_text(angle = 0, hjust = 1)) +
labs(x = "Decade of Publishing", y= "Proportion", title = "Card and Science Fiction Games and Average Complexity Over Time", subtitle = "Complexity is on Intervals of 1-5", caption = "Graph 5.1 by Jordy Marin") +
scale_x_discrete(labels= c("1980's", "1990's", "2000's", "2010's")) +
guides(fill=guide_legend(title="Category")) + theme_bw() +
theme(panel.grid.major = element_blank(),
panel.grid.minor.x = element_line(color = "gray89",
size = 0.6,
linetype = 1),
panel.grid.minor = element_blank(),
plot.caption=element_text(face="italic",
hjust=0,
vjust=-1.5,
size=10),
legend.background = element_rect(fill = "white", color = "gray89", size = 0.5, linetype = "solid"),
plot.title = element_text(face = "bold",size=16),
plot.subtitle=element_text(size=14),
legend.title=element_text(size=10)
)
# Filtering Data 5.2
boardgamestop1 <- boardgames %>%
filter(yearpublished >= 1950 & users_rated>= 25 & average_rating > 0 & average_complexity > 0 & maxplayers > 0) %>%
cSplit("category", sep = ",", direction = "long") %>%
mutate(avgComplexityCat = cut(average_complexity, breaks = seq(from = 1, to = 5, by =1), include.lowest = TRUE)) %>%
group_by(category, avgComplexityCat) %>%
filter(category %in% c("Card Game", "Science Fiction"))
#Data visualization 5.2
ggplot(boardgamestop1, aes(x=avgComplexityCat, fill = category)) + geom_bar(position = 'fill') + theme_bw() +scale_fill_viridis_d(name = "Category", option = "mako") + theme(axis.text.x = element_text(angle = 0, hjust = 1)) + labs(x = "Average Complexity", y= "Proportion", title = "Card and Science Fiction Games Across Average Complexity", subtitle = " Complexity is on Intervals of 1-5", caption = "Graph 5.2 by Jordy Marin") + guides(fill=guide_legend(title="Category")) + theme(panel.grid.major = element_blank(),
panel.grid.minor.x = element_line(color = "gray89",
size = 0.8,
linetype = 1),
panel.grid.minor.y = element_line(color = "gray89",
size = 0.8,
linetype = 1),
panel.grid.minor = element_blank(),
legend.background = element_rect(fill = "white", color = "gray89", size = 0.5, linetype = "solid"),
plot.caption=element_text(face="italic",
hjust=0,
vjust=-1.5,
size=10),
plot.subtitle = element_text(size=14),
plot.title = element_text(face = "bold"),
legend.title=element_text(size=10)
)
Figure 6
#Filtering Data
boardgamespop <- boardgames %>%
filter(yearpublished >= 1950 & users_rated>= 25 & average_rating > 0 & average_complexity > 0, minage <= 20 & maxplayers >0, maxplayers <= 25) %>%
mutate(maxplayers_Cat = cut(maxplayers, breaks = seq(0, 25, by = 5))) %>%
mutate(maxplayers_Cat = fct_recode(maxplayers_Cat, "1-5" = "(0,5]", "6-10" = "(5,10]", "11-15" = "(10,15]", "16-20" = "(15,20]", "21-25" = "(20,25]"))
#Data visualization
ggplot(boardgamespop, aes(x=average_complexity, fill = maxplayers_Cat)) + facet_wrap(~maxplayers_Cat) +
geom_density(alpha = 0.8) + xlim(1, 5) + scale_fill_viridis_d(name = "Maximum # of Players", option = "mako", labels=c("1-5","6-10","11-15","16-20","21-25")) + labs(title = "Games' Average Complexity Across Maximum Number of Players", subtitle = " Complexity is on Scale of 1-5", x = "Average Complexity", y = "Density", caption = "Graph by Jordy Marin") + theme_classic() + theme(panel.grid.major = element_blank(),
panel.grid.minor.x = element_line(color = "gray89",
size = 0.6,
linetype = 1),
panel.grid.minor = element_blank(),
plot.caption = element_text(hjust=1.4),
legend.background = element_rect(fill = "white", color = "gray89", size = 0.5, linetype = "solid"),
plot.title = element_text(face = "bold"),
legend.title=element_text(size=10)
)
LS0tCnRpdGxlOiAiV2hhdCBNYWtlcyBBIEJvYXJkIEdhbWUgRGlmZmljdWx0PyIKYXV0aG9yOiAiSmFtZXMgSGVybmFuZGV6LCBKb3JkeSBNYXJpbiBVcmJpbmEsIFN5bHZhaW4gWm9uZy1OYWJhLCBhbmQgTmEgTmd1eWVuIgpkYXRlOiAiMjAyMy0xMS0xMSIKb3V0cHV0OgogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoKICAgIHNwbGl0X2J5OiBOT05FCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6CiAgICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgo8IS0tLSBCZWdpbiBzdHlsaW5nIGNvZGUuIC0tLT4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLyogV2hvbGUgZG9jdW1lbnQ6ICovCmJvZHl7CiAgZm9udC1mYW1pbHk6ICJQYWxhdGlubyBMaW5vdHlwZSIsICJCb29rIEFudGlxdWEiLCBQYWxhdGlubywgc2VyaWY7CiAgZm9udC1zaXplOiAxMnB0Owp9CmgxLnRpdGxlIHsKICBmb250LXNpemU6IDM4cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9Cmg0LmF1dGhvciB7CiAgZm9udC1zaXplOiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoNC5kYXRlIHsKICBmb250LXNpemU6IDE4cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9Cjwvc3R5bGU+CjwhLS0tIEVuZCBzdHlsaW5nIGNvZGUuIC0tLT4KCiMgSW50cm9kdWN0aW9uCgpPdXIgZ3JvdXAgc2Vla3MgdG8gaW52ZXN0aWdhdGUgZGF0YSBvbiBCb2FyZCBnYW1lcyBjcmVhdGVkIGZyb20gMTk1MC0yMDE2IHdpdGggYW4gZW1waGFzaXMgb24gdGhlaXIgY29tcGxleGl0eSB3aXRoIHdoaWNoIGRpZmZlcmVudCB2YXJpYWJsZXMgKGZyb20gZ2FtZSB0eXBlcyBhbmQgbWluaW11bSBhZ2UgdG8gbnVtYmVyIG9mIGNhdGVnb3JpZXMgYW5kIG1heGltdW0gcGxheWVycykgIG1heSBjb3JyZWxhdGUuIAoKV2hlbiBhcHBsaWNhYmxlLCB3ZSBhbHNvIHRyeSB0byB0cmFjayB0aGUgY2hhbmdlcyB0aHJvdWdoIGVhY2ggZGVjYWRlIGJ5IGZhY2V0aW5nIG91ciBncmFwaHMgdG8gZ2l2ZSBhIGJldHRlciB2aXN1YWxpemF0aW9uLgoKYGBge3IsIGVjaG89RkFMU0UsbWVzc2FnZSA9IEZBTFNFfQojTG9hZGluZyBwYWNrYWdlcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzcGxpdHN0YWNrc2hhcGUpCmxpYnJhcnkoZGJwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2d0aGVtZXMpCgojTG9hZGluZyBkYXRhCmJvYXJkZ2FtZXMgPC1yZWFkX2NzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2JyeWFuZG1hcnRpbi9TVEFUMTU1L21hc3Rlci9kb2NzL1Byb2plY3RzL3Byb2plY3QxX2JnZGF0YXZpei9ib2FyZF9nYW1lX3Jhdy5jc3YiKQoKI1NhdmluZyByYXcgZGF0YQp3cml0ZV9jc3YoYm9hcmRnYW1lcyxmaWxlPSIuL0RhdGEvYm9hcmRnYW1lcy5jc3YiKQpzYXZlKGJvYXJkZ2FtZXMsZmlsZT0iLi9EYXRhL2JvYXJkZ2FtZXMuUkRhdGEiKQoKYGBgCgojIEludmVzdGlnYXRpbmcgQm9hcmRnYW1lIENvbXBsZXhpdHkKCiMjIFBsYXlpbmcgVGltZQoKYGBge3IsIGVjaG89RkFMU0V9CmJnIDwtIGJvYXJkZ2FtZXMgJT4lCiAgZmlsdGVyKHllYXJwdWJsaXNoZWQgPj0gMTk1MCAmIHVzZXJzX3JhdGVkID49IDI1ICYgYXZlcmFnZV9jb21wbGV4aXR5ID4gMCAmIHBsYXlpbmd0aW1lPjE1ICYgcGxheWluZ3RpbWU8IDQwMCkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTgsZmlnLmhlaWdodD02fQojIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIGF2ZXJhZ2UgcmF0aW5nIGFuZCBhdmVyYWdlIGNvbXBsZXhpdHkKYmcgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcGxheWluZ3RpbWUsIHkgPSBhdmVyYWdlX2NvbXBsZXhpdHkpKSArIAogIGdlb21fcG9pbnQoY29sb3I9Im9yYW5nZSIsYWxwaGE9Ljcsc2l6ZT0yKSArIAogIHRoZW1lX2J3KCkrCiAgZ2VvbV9zbW9vdGgoIHNlID0gRkFMU0UpKwogIGxhYnModGl0bGUgPSAiUmVsYXRpb25zaGlwIEJldHdlZW4gQXZlcmFnZSBDb21wbGV4aXR5IFRpbWUgYW5kIFBsYXlpbmcgVGltZSIsCiAgICAgICBzdWJ0aXRsZT0iQm9hcmRnYW1lcyBmcm9tIDE5NTAtMjAxNiIsCiAgICAgICB4ID0gIiBQbGF5aW5nIFRpbWUgKE1pbnV0ZXMpICIsCiAgICAgICB5ID0gIiBBdmVyYWdlIENvbXBsZXhpdHkgIiwKICAgICAgIGNhcHRpb24gPSAiR3JhcGggYnkgU3lsdmFpbiBab25nLU5hYmEiICkrCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsc2l6ZT0xNiksCiAgICAgICAgcGxvdC5zdWJ0aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgcGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChmYWNlPSJpdGFsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdD0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdD0tMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTEwKSkKYGBgCjxicj4KPGJyPgoKRmlndXJlIDEgc2hvd3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGF2ZXJhZ2UgY29tcGxleGljdHkgb2YgYSBnYW1lIGFuZCBpdHMgcGxheWluZyB0aW1lLiBGcm9tIHRoZSB2aXN1YWxpemF0aW9uIG9mIHRoZSBzY2F0dGVyIHBsb3QsIHRoZXJlIGlzIGEgc3Ryb25nIGFzc29jaWF0aW9uIGJldHdlZW4gcGxheWluZyB0aW1lIGFuZCBhdmVyYWdlIGNvbXBsZXh0aXR5IGF0IGZpcnN0IChiZXR3ZWVuIDE1LXRvIGFyb3VuZCAxMDAgbWludXRlcykgYW5kIHRoZW4gdGhlIGFzc29jaWF0aW9uIHN0YXJ0cyB0byBsb3dlciBhcyB0aGUgcGxheWluZyB0aW1lIGluY3JlYXNlcy4gR2FtZXMgdGhhdCBoYXZlIGEgcGxheWluZyB0aW1lIGJldHdlZW4gdGhlIHJhbmdlIG9mIDE1LTIwMCBtaW51dGVzIGhhdmUgYSBjb21wbGV4aXR5IGluIHRoZSByYW5nZSBvZiAxLTUuIE1vc3Qgb2YgdGhlIGdhbWVzIHRoYXQgYXJlIGluIHRoYXQgaW50ZXJ2YWwgaGF2ZSBhIGNvbXBsZXhpdHkgY29uY2VudHJhdGVkIGJldHdlZW4gMS0zLiBNb3N0IGdhbWVzIHdpdGggYSBwbGF5aW5nIHRpbWUgb2YgbW9yZSB0aGFuIDIwMCBtaW51dGVzIGhhdmUgYSBjb21wbGV4aXR5IGxldmVsIGNvbmNlbnRyYXRlZCBpbiB0aGUgbGV2ZWwgb2YgMi00LjUuIE92ZXJhbGwsIG9uZSBjb3VsZCBzdGF5IHRoYXQgYWx0aG91Z2ggdGhlcmUgc2VlbXMgdG8gYmUgYSBjZXJ0YWluIHJlbGF0aW9uc2hpcCBiZXd0ZWVuIHBsYXlpbmcgdGltZSBhbmQgY29tcGxleGl0eSBsZXZlbCBvZiBhIGdhbWUsaXQgc2VlbXMgdGhlIHN0cmVuZ3RoIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMgd2Vhay4gQm90aCBnYW1lcyB3aXRoIGEgbG93ZXIgcGxheWluZyB0aW1lIGFuZCBoaWdoIHBsYXlpbmcgdGltZSBoYXZlIG1vcmUgb3IgbGVzcyBzaW1pbGFyIGNvbXBsZXhpdHkgdGh1cywgcGxheWluZyB0aW1lIGRvZXMgbm90IHNlZW0gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21wbGV4aXR5IGxldmVsIG9mIGEgZ2FtZS4KCiMjIE51bWJlciBvZiBDYXRlZ29yaWVzCgoKYGBge3IsIGVjaG89RkFMU0V9CiNGaWx0ZXJpbmcgZGF0YQpib2FyZGdhbWVzRmlsdGVyZWQxIDwtIGJvYXJkZ2FtZXMgJT4lCiAgbXV0YXRlKG51bV9jYXRlZ29yaWVzID0gc3RyX2NvdW50KGBjYXRlZ29yeWAsIiwiICkgKyAxKSAlPiUKICBmaWx0ZXIoeWVhcnB1Ymxpc2hlZD49MTk1MCkgJT4lCiAgZmlsdGVyKG51bV9jYXRlZ29yaWVzICE9ICJOL0EiKSAlPiUKICBmaWx0ZXIoYXZlcmFnZV9jb21wbGV4aXR5IT0wKSAlPiUKICBtdXRhdGUobnVtQ2F0ID0gY3V0KG51bV9jYXRlZ29yaWVzLCBicmVha3MgPSBzZXEoMCwgMjgsIGJ5ID0gNCkpKQpgYGAKCmBgYHtyLGVjaG89RkFMU0UsZmlnLndpZHRoPTgsZmlnLmhlaWdodD02fQojRGF0YSB2aXN1YWxpemF0aW9uCmJvYXJkZ2FtZXNGaWx0ZXJlZDEgJT4lIGdncGxvdChhZXMoeD1udW1DYXQseT1hdmVyYWdlX2NvbXBsZXhpdHksIGZpbGw9bnVtQ2F0KSkrCiAgZ2VvbV9ib3hwbG90KGNvbG9yPSJibGFjayIpKwogIHRoZW1lX2J3KCkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygicmVkIiwgInNhbG1vbiIsICJwaW5rIiwgInN0ZWVsYmx1ZTEiLCAic3RlZWxibHVlNCIsImJsdWU0IiksbGFiZWxzPWMoIjEtNCIsIjUtOCIsIjktMTIiLCIxMy0xNiIsIjIxLTI0IiwiMjUtMjgiKSxuYW1lPSJOdW1iZXIgb2YgQ2F0ZWdvcmllcyIpKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIjEtNCIsIjUtOCIsIjktMTIiLCIxMy0xNiIsIjIxLTI0IiwiMjUtMjgiKSkrCiAgbGFicyh0aXRsZT0iUmVsYXRpb25zaGlwIGJldHdlZW4gTnVtYmVyIG9mIENhdGVnb3JpZXMgYW5kIEF2ZXJhZ2UgQ29tcGxleGl0eSBTY29yZSIsc3VidGl0bGU9IkJvYXJkZ2FtZXMgZnJvbSAxOTUwLTIwMTYiLHk9IkF2ZXJhZ2UgQ29tcGxleGl0eSIsY2FwdGlvbj0iR3JhcGggYnkgTmEgTmd1eWVuIikrCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSxwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixzaXplPTE2KSxheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MTQpLHBsb3Quc3VidGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQpLHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoZmFjZT0iaXRhbGljIixoanVzdD0wLHZqdXN0PS0xLjUsc2l6ZT0xMCkpCmBgYAo8YnI+Cjxicj4KVGhpcyBib3ggcGxvdCBzaG93cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiBjYXRlZ29yaWVzIGFuZCBhdmVyYWdlIGNvbXBsZXhpdHkgc2NvcmUgb2YgYm9hcmQgZ2FtZXMgZnJvbSAxOTUwIHRvIDIwMTYuIEZyb20gdGhlIG9ic2VydmVkIGRhdGEsIHdlIGNhbiBzZWUgdGhhdCB0aGUgaGlnaGVzdCBjb21wbGV4aXR5IHJhdGluZyBjb25jZW50cmF0ZXMgaW4gZ2FtZXMgdGhhdCBoYXZlIDktMTIgY2F0ZWdvcmllcy4gVGhlIGF2ZXJhZ2UgY29tcGxleGl0eSBzY29yZSBmcm9tIHRoZSBjb2xsZWN0ZWQgc2FtcGxlIHN0ZWFkaWx5IGluY3JlYXNlcyBhcyBib2FyZCBnYW1lcyBoYXZlIG1vcmUgY2F0ZWdvcmllcy4gSG93ZXZlciwgb25jZSB0aGV5IGhhdmUgc3VycGFzc2VkIHRoZSA5LTEyIGNhdGVnb3JpZXMvcGVyIGdhbWUsIHRoZSBhdmVyYWdlIGNvbXBsZXhpdHkgcmF0aW5nIGRyb3BzIHNpZ25pZmljYW50bHksIHdpdGggYSBtZWRpYW4gb2YgYXJvdW5kIDIuMiBhdmVyYWdlIGNvbXBsZXhpdHkgc2NvcmUgb2YgYm9hcmRnYW1lcyB3aXRoIDEzLTE0IGNhdGVnb3JpZXMgYW5kIGJlbG93IDIgYXZlcmFnZSBjb21wbGV4aXR5IHNjb3JlIG9mIHRob3NlIHdpdGggMjEtMjQgY2F0ZWdvcmllcy4gQm9hcmQgZ2FtZXMgd2l0aCAyNS0yOCBjYXRlZ29yaWVzIGhhdmUgYSBtZWRpYW4gb2YgMi41IGF2ZXJhZ2UgY29tcGxleGl0eSByYXRpbmcuCjxicj4KPGJyPgoKIyMgQmFzZSBHYW1lcyB2cy4gRXhwYW5zaW9uIFBhY2tzCmBgYHtyLGVjaG89RkFMU0UsZmlnLndpZHRoPTgsZmlnLmhlaWdodD02LCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiNDbGVhbmluZyBEYXRhCmNsZWFuX2dhbWVzIDwtIGJvYXJkZ2FtZXMgJT4lCiAgZmlsdGVyKHllYXJwdWJsaXNoZWQgPj0gMTk1MCkgJT4lCiAgZmlsdGVyKHVzZXJzX3JhdGVkID49IDI1KSAKYmdfd2lkZWNhdCA8LSBjbGVhbl9nYW1lcyAlPiUKICBjU3BsaXQoImNhdGVnb3J5Iiwgc2VwID0gIiwiLCBkaXJlY3Rpb24gPSAid2lkZSIsIGZpeGVkID0gVFJVRQopCgpiZ19sb25nbWVjaGFuaWMgPC0gY2xlYW5fZ2FtZXMgJT4lCiAgY1NwbGl0KCJtZWNoYW5pYyIsIHNlcCA9ICIsIiwgZGlyZWN0aW9uID0gImxvbmciLCBmaXhlZCA9IFRSVUUKKQpgYGAKIAoKYGBgIHtyLCBlY2hvPUZBTFNFLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9Niwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIEZpbHRlcmluZyBEYXRhCmNvbXBsZXhfZ2FtZXMgPC0gY2xlYW5fZ2FtZXMgJT4lCiAgc2VsZWN0KGdhbWVfdHlwZSwgCiAgICAgICAgIGF2ZXJhZ2VfcmF0aW5nLCAKICAgICAgICAgYXZlcmFnZV9jb21wbGV4aXR5LCAKICAgICAgICAgeWVhcnB1Ymxpc2hlZCwgCiAgICAgICAgIHVzZXJzX3JhdGVkKSAlPiUKICBmaWx0ZXIoYXZlcmFnZV9jb21wbGV4aXR5ICE9ICIwIikgJT4lCiAgbXV0YXRlKGRlY2FkZSA9IGRwbHlyOjpjYXNlX3doZW4oCiAgICB5ZWFycHVibGlzaGVkID49IDE5NTAgJiB5ZWFycHVibGlzaGVkIDw9IDE5NTkgfiAiMTk1MCdzIiwKICAgIHllYXJwdWJsaXNoZWQgPj0gMTk2MCAmIHllYXJwdWJsaXNoZWQgPD0gMTk2OSB+ICIxOTYwJ3MiLAogICAgeWVhcnB1Ymxpc2hlZCA+PSAxOTcwICYgeWVhcnB1Ymxpc2hlZCA8PSAxOTc5IH4gIjE5NzAncyIsCiAgICB5ZWFycHVibGlzaGVkID49IDE5ODAgJiB5ZWFycHVibGlzaGVkIDw9IDE5ODkgfiAiMTk4MCdzIiwKICAgIHllYXJwdWJsaXNoZWQgPj0gMTk5MCAmIHllYXJwdWJsaXNoZWQgPD0gMTk5OSB+ICIxOTkwJ3MiLAogICAgeWVhcnB1Ymxpc2hlZCA+PSAyMDAwICYgeWVhcnB1Ymxpc2hlZCA8PSAyMDA5IH4gIjIwMDAncyIsCiAgICB5ZWFycHVibGlzaGVkID49IDIwMTAgJiB5ZWFycHVibGlzaGVkIDw9IDIwMTkgfiAiMjAxMCdzIikpIAoKbGVnZW5kX3R0bCA8LSAiR2FtZSBUeXBlIgpgYGAKCmBgYCB7ciwgZWNobz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD04LCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgRGF0YSBWaXN1YWxpemF0aW9uCgpnZ3Bsb3QoY29tcGxleF9nYW1lcywgCiAgICAgICBhZXMoeCA9IGF2ZXJhZ2VfY29tcGxleGl0eSwgCiAgICAgICAgICAgZmlsbCA9IGdhbWVfdHlwZSkpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjcpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCAibWVkaXVtYXF1YW1hcmluZSIsICJsaWdodGNvcmFsIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9Yygib3JpZ2luYWwgYm9hcmQgZ2FtZXMiLCAiZXhwYW5zaW9uIHBhY2tzIiksIAogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiR2FtZSBUeXBlIikgKwogIGxhYnModGl0bGUgPSAiQ29tcGxleGl0eSBvZiBBbGwgQmFzZSBHYW1lcyBDb21wYXJlZCB0byBBbGwgRXhwYW5zaW9uIFBhY2tzIiwgCiAgICAgICB4ID0gIkF2ZXJhZ2UgUmF0ZWQgQ29tcGxleGl0eSIsIAogICAgICAgeSA9ICJGcmVxdWVuY3kgb2YgUmF0aW5nIiwKICAgICAgIHN1YnRpdGxlPSJCb2FyZGdhbWVzIGZyb20gMTk1MC0yMDE2IiwKICAgICAgIGNhcHRpb249ICJHcmFwaCBieSBKYW1lcyBIZXJuYW5kZXoiKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxNiksCiAgICAgICAgcGxvdC5zdWJ0aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgcGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChmYWNlPSJpdGFsaWMiLGhqdXN0PTAsdmp1c3Q9LTEuNSxzaXplPTEwKSkgKwogIGZhY2V0X3dyYXAofiBkZWNhZGUpIApgYGAKPGJyPgo8YnI+CkNvbnNpZGVyaW5nIHRoYXQgZXhwYW5zaW9uIHBhY2tzIHdlcmUgcXVpdGUgbGl0ZXJhbGx5IGFkZGluZyBuZXcgbWF0ZXJpYWwgKGkuZS4gcnVsZXMsIGxvcmUsIHN0cmF0ZWdpZXMsIGV0Yy4pLCB3ZSB3b25kZXJlZCB3aGV0aGVyIGV4cGFuc2lvbiBwYWNrcyB3ZXJlIHZpZXdlZCBhcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gYmFzZSBnYW1lcywgd2UgZGVjaWRlZCB0byBjcmVhdGUgbXVsdGktZGVuc2l0eSBwbG90cyBhcyB0aGV5IHdvdWxkIHNob3cgdGhlIGZyZXF1ZW5jeSBvZiBwbGF5ZXJzIHRoYXQgcmF0ZWQgdGhlIGdhbWUgaW4gYSBzcGVjaWZpYyB3YXkgZm9yIGJvdGggYmFzZSBnYW1lcyBhbmQgZXhwYW5zaW9uIHBhY2tzLiBXZSBmaWx0ZXJlZCBvdXQgYWxsIHJhdGluZ3Mgb2YgMCwgYXMgdGhlIGxvd2VzdCBwb3NzaWJsZSByYXRpbmcgd2FzIDEuIElmIHdlIGhhZCBrZXB0IHRoYXQgb2NjdXJyZW5jZSAoMCkgaW4gdGhlIGRhdGEgZnJhbWUsIHRoZSBncmFwaCB3b3VsZCBpbXBseSB0aGF0IG1hbnkgcGxheWVycyBkaWQgbm90IGZpbmQgdGhlc2UgZ2FtZXMgdG8gYmUgY29tcGxleCBhdCBhbGwgd2hlbiB0aGV5IHJlYWxseSBqdXN0IGRpZCBub3QgcHJvdmlkZSBhIHJhdGluZy4gV2UgYWxzbyBub3RpY2VkIHRoYXQgZXhwYW5zaW9uIHBhY2tzIGJlY2FtZSBwcmV2YWxlbnQgaW4gdGhlIDE5NzAnczsgd2UgZGVjaWRlZCB0byBrZWVwIHByZXZpb3VzIGRhdGEgdG8gYWxsb3cgZm9yIGEgdGVtcG9yYWwgYW5hbHlzaXMgb2YgYmVmb3JlIGFuZCBhZnRlci4gCgpXZSBzYXcgdGhhdCwgaW4gZ2VuZXJhbCwgZXhwYW5zaW9uIHBhY2tzIHdlcmUgdmlld2VkIGFzIG1vcmUgY29tcGxpY2F0ZWQgYnkgcGxheWVycy4gSW4gdGhlIDE5NTBzIGFuZCAxOTYwJ3MsIGJvYXJkIGdhbWVzIHdlcmUgdmVyeSBza2V3ZWQgdG8gdGhlIHJpZ2h0ICh0aG91Z2ggbXVjaCBtb3JlIGV4dHJlbWUgaW4gdGhlIGZvcm1lciksIGltcGx5aW5nIHRoYXQgdGhleSB3ZXJlIHZpZXdlZCBhcyBzaW1wbGUgYW5kIGVhc3kgdG8gcGxheS4gSW4gdGhlIDE5NzAncyBhbmQgZm9yd2FyZCwgcmF0aW5ncyBiZWdhbiB0byB2YXJ5IG1vcmUsIGJ1dCBzdGlsbCB3ZXJlIHZpZXdlZCBhcyBsZXNzIGNvbXBsaWNhdGVkIHRoYW4gdGhhdCBvZiBleHBhbnNpb24gcGFja3MgcmVnYXJkbGVzcyBvZiB0aGUgZGVjYWRlLiBUaGUgbGFyZ2VzdCBzdWJzZXQgb2YgcGxheWVycyBzZWVtIHRvIHJhdGUgYmFzZSBnYW1lcyBhdCBhIGNvbXBsZXhpdHkgYmV0d2VlbiAxIGFuZCAyLCBpbXBseWluZyB0aGVzZSBnYW1lcyBhcmUgbm90IHZlcnkgY2hhbGxlbmdpbmcuIE9uIHRoZSBjb250cmFyeSwgdGhlIGxhcmdlc3Qgc3Vic2V0IG9mIGV4cGFuc2lvbiBwYWNrIHBsYXllcnMgcHJvdmlkZWQgYSByYXRpbmcgdGhhdCBwZWFrZWQgYXQgcm91Z2hseSAyIGFuZCAzLiBIb3dldmVyLCB3aGlsZSBhbGwgdGhlIGRlbnNpdHkgcGxvdHMgZm9yIG9yaWdpbmFsIGJvYXJkIGdhbWVzIHdlcmUgbGFyZ2VseSByaWdodCBza2V3ZWQsIGV4cGFuc2lvbiBwYWNrcyB3ZXJlIHN0aWxsIHNrZXdlZCB0byB0aGUgcmlnaHQsIGJ1dCBvbmx5IHNsaWdodGx5IChpLmUuIDE5NzAncyBhbmQgMTk5MCdzKTsgdGhlcmUgaXMgYSBtdWNoIG1vcmUgZXZlbiBkaXN0cmlidXRpb24uIEl0IGlzIGludGVyZXN0aW5nIHRvIHNlZSB0aG91Z2ggaG93IHByaW9yIHRvIHRoZSByaXNlIG9mICBleHBhbnNpb24gcGFja3MsIGJvYXJkIGdhbWVzIHdlcmUgY29uc2lkZXJlZCBtdWNoIHNpbXBsZXIuIEl0IHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIHNlZSB3aGF0IGZhY3RvcnMgY2F1c2VkIHRoaXMsIGFuZCB3aGF0IGZhY3RvcnMgbWF5YmUgaW5mbHVlbmNlIGV4cGFuc2lvbiBwYWNrcyBiZWluZyBtb3JlIGNvbXBsZXguIAo8YnI+Cjxicj4KCiMjIE51bWJlciBvZiBDYXRlZ29yaWVzIH4gR2FtZSBUeXBlCgpgYGB7cixlY2hvPUZBTFNFfQojRmlsdGVyaW5nIGRhdGEKYm9hcmRnYW1lc0ZpbHRlcmVkMiA8LSBib2FyZGdhbWVzRmlsdGVyZWQxICU+JSAKICBmaWx0ZXIoZ2FtZV90eXBlIT0iYm9hcmRnYW1lZXhwYW5zaW9uIikgJT4lIAogIG11dGF0ZShkZWNhZGVzPXBhc3RlKGFzLmNoYXJhY3RlcihmbG9vcih5ZWFycHVibGlzaGVkLzEwKSoxMCksInMiLHNlcD0iJyIpKQpgYGAKCmBgYHtyLGVjaG89RkFMU0UsZmlnLndpZHRoPTgsZmlnLmhlaWdodD02fQojRGF0YSB2aXN1YWxpemF0aW9uCm9yaWdpbmFscGFjayA8LSBib2FyZGdhbWVzRmlsdGVyZWQyICU+JSBnZ3Bsb3QoYWVzKHg9bnVtQ2F0LHk9YXZlcmFnZV9jb21wbGV4aXR5LCBmaWxsPW51bUNhdCkpKwogIGdlb21fYm94cGxvdCh3aWR0aD0uOCkrCiAgdGhlbWVfYncoKSsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiLAogICAgbGFiZWxzPWMoIjEtNCIsIjUtOCIsIjktMTIiLCIxMy0xNiIsIjIxLTI0IiwiMjUtMjgiKQogICAgKSsKICBsYWJzKAogICAgdGl0bGU9IlJlbGF0aW9uc2hpcCBiZXR3ZWVuIE51bWJlciBvZiBDYXRlZ29yaWVzIGFuZCBBdmVyYWdlIENvbXBsZXhpdHkgU2NvcmUiLHN1YnRpdGxlPSJPcmlnaW5hbCBCb2FyZGdhbWVzIiwKICAgIHk9IkF2ZXJhZ2UgQ29tcGxleGl0eSIsCiAgICBmaWxsPSJOdW1iZXIgb2YgQ2F0ZWdvcmllcyIKICAgICAgICkrCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsc2l6ZT0xNiksCiAgICBwbG90LnN1YnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGZhY2U9Iml0YWxpYyIsaGp1c3Q9MCx2anVzdD0tMS41LHNpemU9MTApCiAgICApICsKICBmYWNldF9ncmlkKH5kZWNhZGVzKQpgYGAKCmBgYHtyLGVjaG89RkFMU0V9CiNGaWx0ZXJpbmcgZGF0YQpib2FyZGdhbWVzRmlsdGVyZWQzIDwtIGJvYXJkZ2FtZXNGaWx0ZXJlZDEgJT4lIAogIGZpbHRlcihnYW1lX3R5cGUgPT0iYm9hcmRnYW1lZXhwYW5zaW9uIikgJT4lIAogIG11dGF0ZShkZWNhZGVzPXBhc3RlKGFzLmNoYXJhY3RlcihmbG9vcih5ZWFycHVibGlzaGVkLzEwKSoxMCksInMiLHNlcD0iJyIpKQpgYGAKCmBgYHtyLGVjaG89RkFMU0UsIGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9Nn0KCiNEYXRhIHZpc3VhbGl6YXRpb24KZXh0ZW5zaW9uX3BhY2sgPC0gYm9hcmRnYW1lc0ZpbHRlcmVkMyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gbnVtQ2F0LCB5ID0gYXZlcmFnZV9jb21wbGV4aXR5LCBmaWxsID0gbnVtQ2F0KSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuOCkgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMS00IiwgIjUtOCIsICI5LTEyIiwgIjEzLTE2IiwgIjIxLTI0IiwgIjI1LTI4IikpICsKICBsYWJzKAogICAgc3VidGl0bGUgPSAiRXhwYW5zaW9uIFBhY2tzIiwKICAgIHkgPSAiQXZlcmFnZSBDb21wbGV4aXR5IiwKICAgIGNhcHRpb24gPSAiR3JhcGggYnkgTmEgTmd1eWVuIiwKICAgIGZpbGwgPSAiTnVtYmVyIG9mIENhdGVnb3JpZXMiCiAgKSArCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiLCBoanVzdCA9IDAsIHZqdXN0ID0gLTEuNSwgc2l6ZSA9IDEwKQogICkgKwogIGZhY2V0X2dyaWQofmRlY2FkZXMpCgpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTEwfQpsaWJyYXJ5KHBhdGNod29yaykKY29tYmluZWRfcGxvdHMgPC0gb3JpZ2luYWxwYWNrIC8gZXh0ZW5zaW9uX3BhY2sKY29tYmluZWRfcGxvdHMKYGBgCgo8YnI+Cjxicj4KCldoZW4gZXhhbWluaW5nIG9yaWdpbmFsIGJvYXJkIGdhbWVzIChleGNsdWRpbmcgdGhlaXIgZXhwYW5zaW9uIHZlcnNpb25zKSwgd2UgY2FuIG9ic2VydmUgdGhhdCBpbiB0aGUgbW9zdCAyIHJlY2VudCBkZWNhZGVzLCB0aGVzZSBvcmlnaW5hbCBib2FyZCBnYW1lcyBzdGFydGVkIHRvIGhhdmUgbW9yZSBjYXRlZ29yaWVzIHdpdGhpbiBhIGdhbWUuIEZ1cnRoZXJtb3JlLCB0aGUgbWVkaWFuIGF2ZXJhZ2UgY29tcGxleGl0eSBzY29yZSBmb3IgYW4gb3JpZ2luYWwgYm9hcmQgZ2FtZSB3aXRoIG1vcmUgY2F0ZWdvcmllcyAoYXJvdW5kIDItMyBmb3IgZ2FtZXMgd2l0aCA5LTEyIGFuZCAxMy0xNiBjYXRlZ29yaWVzKSwgc3RhcnRpbmcgZnJvbSB0aGUgMTk5MHMsIGlzIGhpZ2hlciB0aGFuIHRob3NlIHdpdGggbGVzcyBjYXRlZ29yaWVzIChhcm91bmQgMS44LTEuOSBmb3IgdGhvc2Ugd2l0aCBsZXNzIHRoYW4gOSBjYXRlZ29yaWVzKS4gVGhlcmUgaXMgbm90IG11Y2ggZGF0YSBvbiBvcmlnaW5hbCBnYW1lcyB3aXRoIG1vcmUgdGhhbiAyMSBjYXRlZ29yaWVzLCBob3dldmVyLgoKPGJyPgo8YnI+CiBUaGUgZ3JvdXAgc291Z2h0IHRvIGxvb2sgYXQgaG93IHRoZSBjb21wbGV4aXR5IG9mIGV4cGFuZGVkIGdhbWVzIGNvbXBhcmVzIHRvIHRoZSBhbW91bnQgb2YgY2F0ZWdvcmllcyB0aHJvdWdoIGEgdGVtcG9yYWwgbGVucy4gRmlndXJlIDQuMiBzaG93cyBhIHJlaW5mb3JjZW1lbnQgdGhhdCBleHBhbmRlZCBnYW1lcyBvbmx5IHJlYWxseSBjYW1lIHRvIHByZXZhbGVuY2UgaW4gdGhlIDE5NzAncy4gVGhlc2UgZXhwYW5zaW9uIHBhY2tzIHdlcmUgbW9zdGx5IGJldHdlZW4gMS04IGNhdGVnb3JpZXMsIHdpdGggdGhlIG9jY3VycmVuY2Ugb2YgOS0xMiBjYXRlZ29yaWVzIGdyb3dpbmcgaW4gdGhlIDIwMDAncy4gSW4gZ2VuZXJhbCwgaXQgc2VlbXMgYXMgaWYgdGhlIGdyYXBoIHNob3dzIGEgZGVjbGluZSBpbiBwZXJjZXB0aW9ucyBvZiBjb21wbGV4aXR5IGZvciB0aGVzZSBnYW1lcyBvdmVyIHRpbWUgaW4gZXhwYW5zaW9uIHBhY2tzIHdpdGggZWl0aGVyIDEtNCBvciA1LTggY2F0ZWdvcmllcywgd2l0aCBncmVhdGVyIG1lZGlhbiBjb21wbGV4aXR5IGFsdGVybmF0aW5nIHRocm91Z2hvdXQgdGhlIGRpZmZlcmVudCBkZWNhZGVzLiBIb3dldmVyLCB0aG9zZSBleHBhbnNpb24gcGFja3Mgd2l0aCA5LTEyIGNhdGVnb3JpZXMgY2xlYXJseSBoYWQgYSBncmVhdGVyIG1lZGlhbiBhbmQgYXZlcmFnZSBwZXJjZWl2ZWQgY29tcGxleGl0eSwgYWx0aG91Z2ggdGhpcyB3YXMgbW9yZSBjbGVhciBpbiB0aGUgMjAwMCdzIHRoYW4gdGhlIDIwMTAncyAobWVkaWFuIDMuNSBjb21wbGV4aXR5IGluIHRoZSAyMDAw4oCZcywgYnV0IG1lZGlhbiAzIGluIHRoZSAyMDEw4oCZcykuIAo8YnI+Cjxicj4KCiMjIENhcmQgJiBTY2llbmNlIEZpY3Rpb24gR2FtZXMKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyBGaWx0ZXJpbmcgdGhlIHJhdyBkYXRhL0RhdGEgV3JhbmdsaW5nOgoKYm9hcmRnYW1lc3RvcCA8LSBib2FyZGdhbWVzICU+JSAKICBmaWx0ZXIoeWVhcnB1Ymxpc2hlZCA+PSAxOTUwICYgdXNlcnNfcmF0ZWQ+PSAyNSAmIGF2ZXJhZ2VfcmF0aW5nID4gMCAmIGF2ZXJhZ2VfY29tcGxleGl0eSA+IDAgJiBtYXhwbGF5ZXJzID4gMCkgJT4lIAogIGNTcGxpdCgiY2F0ZWdvcnkiLCBzZXAgPSAiLCIsIGRpcmVjdGlvbiA9ICJsb25nIikgJT4lIAogIG11dGF0ZShEZWNhZGUgPSBmYWN0b3IoZmxvb3IoeWVhcnB1Ymxpc2hlZC8xMCkqMTApKSAlPiUKICBtdXRhdGUoYXZnQ29tcGxleGl0eUNhdCA9IGN1dChhdmVyYWdlX2NvbXBsZXhpdHksIGJyZWFrcyA9IHNlcShmcm9tID0gMSwgdG8gPSA1LCBieSA9MSksIGluY2x1ZGUubG93ZXN0ID0gVFJVRSkpICU+JSAKICAgZ3JvdXBfYnkoRGVjYWRlLCBjYXRlZ29yeSwgYXZnQ29tcGxleGl0eUNhdCkgJT4lIAogIGZpbHRlcihjYXRlZ29yeSAlaW4lIGMoIkNhcmQgR2FtZSIsICJTY2llbmNlIEZpY3Rpb24iKSkKYm9hcmRnYW1lc3RvcCRnYW1lX3R5cGUgPC0gYm9hcmRnYW1lc3RvcCRnYW1lX3R5cGUgJT4lCiAgc3RyX3JlcGxhY2UoImJvYXJkZ2FtZWV4cGFuc2lvbiIsICJCb2FyZCBHYW1lIEV4cGFuc2lvbiIpICU+JQogIHN0cl9yZXBsYWNlKCJib2FyZGdhbWUiLCAiQm9hcmQgR2FtZSIpCgoKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9Nn0KCmJvYXJkZ2FtZXN0b3AgJT4lCiAgZmlsdGVyKERlY2FkZSAlaW4lIGMoMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCkpICU+JQpnZ3Bsb3QoYWVzKHg9RGVjYWRlLCBmaWxsID0gY2F0ZWdvcnkpKSArIAogIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIAogIGZhY2V0X3dyYXAofmF2Z0NvbXBsZXhpdHlDYXQpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QobmFtZSA9ICJDYXRlZ29yeSIsIG9wdGlvbiA9ICJtYWtvIikgICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpKSArIAogIGxhYnMoeCA9ICJEZWNhZGUgb2YgUHVibGlzaGluZyIsIHk9ICJQcm9wb3J0aW9uIiwgdGl0bGUgPSAiQ2FyZCBhbmQgU2NpZW5jZSBGaWN0aW9uIEdhbWVzIGFuZCBBdmVyYWdlIENvbXBsZXhpdHkgT3ZlciBUaW1lIiwgc3VidGl0bGUgPSAiQ29tcGxleGl0eSBpcyBvbiBJbnRlcnZhbHMgb2YgMS01IiwgY2FwdGlvbiA9ICJHcmFwaCA1LjEgYnkgSm9yZHkgTWFyaW4iKSArIAogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPSBjKCIxOTgwJ3MiLCAiMTk5MCdzIiwgIjIwMDAncyIsICIyMDEwJ3MiKSkgKyAgCiAgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKHRpdGxlPSJDYXRlZ29yeSIpKSArICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTg5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9IDEpLAogICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGZhY2U9Iml0YWxpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0PS0xLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9MTApLAogICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiZ3JheTg5Iiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsc2l6ZT0xNiksCiAgICAgICAgcGxvdC5zdWJ0aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwKQogICAgICAgICkKYGBgCjxicj4KPGJyPgogQXMgcGFydCBvZiBvdXIgcmVzZWFyY2ggaW50ZXJlc3QsIHdlIHdhbnRlZCB0byBleHBsb3JlIHRoZSBDYXJkIEdhbWUgYW5kIFNjaWVuY2UgRmljdGlvbiBDYXRlZ29yeSBhbmQgc2VlIHRoZSB0cmVuZHMgYWNyb3NzIHRpbWUgYW5kIGF2ZXJhZ2UgY29tcGxleGl0eS4gVG8gc2ltcGxpZnkgb3VyIGFuYWx5c2lzLCB3ZSBmb2N1c2VkIG9uIHRoZSBkZWNhZGVzIGZyb20gMTk4MCB0byAyMDEwLiBUaHVzLCB3ZSBjcmVhdGVkIGEgbmV3IHZhcmlhYmxlIGNhbGxlZCBgRGVjYWRlYCBhbmQgYW5vdGhlciB2YXJpYWJsZSBvZiBpbnRlcnZhbHMgZm9yIHRoZSBhdmVyYWdlIGNvbXBsZXhpdHkgc2NvcmUsIHdob3NlIHNjYWxlIHdhcyBmcm9tIDEgdG8gNSwgaW4gd2hpY2ggdGhlIHBhcmVudGhlc2VzIGAoKWAgY29ycmVzcG9uZCB0byB0aGUgdmFsdWUgbm90IGJlaW5nIGluY2x1ZGVkIGluIHRoZSBpbnRlcnZhbCBhbmQgdGhlIHNxdWFyZSBicmFja2V0IGBbXWAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgaW5jbHVzaW9uIG9mIHRoZSB2YWx1ZSBpbiB0aGUgaW50ZXJ2YWwuIApGcm9tIHRoZSBmaWd1cmUgYWJvdmUsIHdlIGNhbiBvYnNlcnZlIHRoYXQgYWNyb3NzIHRoZSBjYXRlZ29yaWVzIG9mIGxvdyBhdmVyYWdlIGNvbXBsZXhpdHkgb3IgWzEsMl0gYW5kICgyLDNdLCB0aGVyZSBpcyBhIHNpbWlsYXIgdHJlbmQgaW4gdGhlIHByb2R1Y3Rpb24gb2YgQ2FyZCBHYW1lcyBhbmQgU2NpZW5jZSBGaWN0aW9uLCBiZWluZyB0aGUgQ2FyZCBHYW1lcyB0aGUgbW9zdCBjb21tb24gYWNyb3NzIGFsbCBkZWNhZGVzLiBGb3IgaW5zdGFuY2UsIGJldHdlZW4gdGhlIDE5OTAncyBhbmQgMjAxMCdzLCBhcHByb3hpbWF0ZWx5IDkwIHBlcmNlbnQgb2YgdGhlIGdhbWVzIHdlcmUgQ2FyZCBHYW1lcy4gQ29udmVyc2VseSwgb24gdGhlIG1lZGl1bSBjYXRlZ29yeSBvciAoMyw0XSwgdGhpcyB0cmVuZCBpbiBwcm9kdWN0aW9uIHNlZW1zIHRvIGJlIHRoZSBvcHBvc2l0ZS4gRm9yIGV4YW1wbGUsIHRoZSBwcm9kdWN0aW9uIG9mIFNjaWVuY2UgRmljdGlvbiBnYW1lcyBpbiB0aGUgMTk4MCdzIGFuZCAyMDAwJ3Mgd2FzIGFwcHJveGltYXRlbHkgOTAgcGVyY2VudCBhbmQgODAgcGVyY2VudCByZXNwZWN0aXZlbHkuIExhc3RseSwgZm9yIHRob3NlIGdhbWVzIHdob3NlIGF2ZXJhZ2UgY29tcGxleGl0eSBzY29yZXMgZmFsbCBpbnRvIHRoZSBsYXN0IGludGVydmFsICg0LDUpIG9yIHRoZSBtb3N0IGRpZmZpY3VsdCBhY2NvcmRpbmcgdG8gdGhlIHVzZXJzJyByYXRpbmdzLCB0aGVyZSBzZWVtcyB0byBiZSBhIHByZWRvbWluYW50bHkgaGlnaGVyIHByb3BvcnRpb24gb2YgU2NpZW5jZSBGaWN0aW9uIEdhbWVzIGFzIGNvbXBhcmVkIHRvIENhcmQgR2FtZXMuIEZvciBleGFtcGxlLCBpbiAxODkwJ3MgYW5kIDIwMDAncywgU2NpZW5jZSBGaWN0aW9uIGdhbWVzIHdlcmUgYSBodW5kcmVkIHBlcmNlbnQgdGhlIG1vc3QgY29tbW9uIGFtb25nIHRoZSBhdmVyYWdlIGNvbXBsZXhpdHkgc2NvcmUgb2YgNCAobm90IGluY2x1ZGVkKSBhbmQgNS4gWWV0LCBpbiB0aGUgMjAxMCdzLCB0aGVzZSB2YXJpYWJpbGl0eSBpbiB0cmVuZCBzZWVtZWQgdG8gYmUgcmVkdWNlZCB3aXRoIENhcmQgR2FtZXMgdGFraW5nIHVwIGFyb3VuZCA0NSBwZXJjZW50IG9mIHRoZSBwcm9wb3J0aW9uIG9mIGdhbWVzIHJlbGVhc2VkLiAKPGJyPgo8YnI+CmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9Nn0KIyBHcmFwaCAyIChTdXBwbGVtZW50YXJ5IE9uZSk6Cgpib2FyZGdhbWVzdG9wMSA8LSBib2FyZGdhbWVzICU+JSAKICBmaWx0ZXIoeWVhcnB1Ymxpc2hlZCA+PSAxOTUwICYgdXNlcnNfcmF0ZWQ+PSAyNSAmIGF2ZXJhZ2VfcmF0aW5nID4gMCAmIGF2ZXJhZ2VfY29tcGxleGl0eSA+IDAgJiBtYXhwbGF5ZXJzID4gMCkgJT4lIAogIGNTcGxpdCgiY2F0ZWdvcnkiLCBzZXAgPSAiLCIsIGRpcmVjdGlvbiA9ICJsb25nIikgJT4lCiAgbXV0YXRlKGF2Z0NvbXBsZXhpdHlDYXQgPSBjdXQoYXZlcmFnZV9jb21wbGV4aXR5LCBicmVha3MgPSBzZXEoZnJvbSA9IDEsIHRvID0gNSwgYnkgPTEpLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUpKSAlPiUgCiAgIGdyb3VwX2J5KGNhdGVnb3J5LCBhdmdDb21wbGV4aXR5Q2F0KSAlPiUgCiAgZmlsdGVyKGNhdGVnb3J5ICVpbiUgYygiQ2FyZCBHYW1lIiwgIlNjaWVuY2UgRmljdGlvbiIpKQoKZ2dwbG90KGJvYXJkZ2FtZXN0b3AxLCBhZXMoeD1hdmdDb21wbGV4aXR5Q2F0LCBmaWxsID0gY2F0ZWdvcnkpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIHRoZW1lX2J3KCkgK3NjYWxlX2ZpbGxfdmlyaWRpc19kKG5hbWUgPSAiQ2F0ZWdvcnkiLCBvcHRpb24gPSAibWFrbyIpICArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxKSkgKyBsYWJzKHggPSAiQXZlcmFnZSBDb21wbGV4aXR5IiwgeT0gIlByb3BvcnRpb24iLCB0aXRsZSA9ICJDYXJkIGFuZCBTY2llbmNlIEZpY3Rpb24gR2FtZXMgQWNyb3NzIEF2ZXJhZ2UgQ29tcGxleGl0eSIsIHN1YnRpdGxlID0gIiBDb21wbGV4aXR5IGlzIG9uIEludGVydmFscyBvZiAxLTUiLCBjYXB0aW9uID0gIkdyYXBoIDUuMiBieSBKb3JkeSBNYXJpbiIpICsgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKHRpdGxlPSJDYXRlZ29yeSIpKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTg5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9IDEpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5ODkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gMSksCiAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJncmF5ODkiLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLAogICAgICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoZmFjZT0iaXRhbGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3Q9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3Q9LTEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0xMCksCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApCiAgICAgICAgKSAKYGBgCjxicj4KPGJyPgpUbyBmdXJ0aGVyIGV4cGxvcmUgdGhlIHByZXZpb3VzIHRyZW5kcyBmcm9tIEZpZ3VyZSA1LjEsIHdlIHByb2NlZWQgdG8gZGlzbWlzcyBvdXIgdGltZSBleHBsb3JhdGlvbi4gSW5zdGVhZCwgd2UgZm9jdXNlZCBvbiBleGFtaW5pbmcgdGhlIGNvbmRpdGlvbmFsIHByb3BvcnRpb25zIG9mIHRoZSBzYW1lIHR3byBjYXRlZ29yaWVzIENhcmQgR2FtZSBhbmQgU2NpZW5jZSBGaWN0aW9uIGFjcm9zcyBhbGwgdGhlIGF2ZXJhZ2UgY29tcGxleGl0eSBzY29yZXMuIEhlbmNlLCB3ZSBjYW4gb2JzZXJ2ZSB0aGF0IG92ZXJhbGwsIENhcmQgR2FtZXMgaGF2ZSBhIGhpZ2hlciBwcm9wb3J0aW9uIG9mIHRoZSBhdmVyYWdlIGNvbXBsZXhpdHkgc2NvcmVzIHJhbmdpbmcgZnJvbSAxIHRvIDMsIGFzIGNvbXBhcmVkIHRvIHRoZSBwcm9wb3J0aW9uIG9mIFNjaWVuY2UgRmljdGlvbiBHYW1lcy4gUGFydGljdWxhcmx5LCBhcHByb3hpbWF0ZWx5IDg3IHBlcmNlbnQgb2YgdGhlIENhcmQgR2FtZXMgaGF2ZSBhbiBhdmVyYWdlIGNvbXBsZXhpdHkgc2NvcmUgYmV0d2VlbiAxIGFuZCAyIHdoaWxlIHRoZSBvdGhlciAxMyBwZXJjZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBTY2llbmNlIEZpY3Rpb24gR2FtZXMuIExpa2V3aXNlLCBhY3Jvc3MgdGhlIHNlY29uZCBiYXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgYXZlcmFnZSBjb21wbGV4aXR5IHNjb3JlIGJldHdlZW4gMiAobm90IGluY2x1ZGVkKSwgYXBwcm94aW1hdGVseSA2MiBwZXJjZW50IG9mIHRoZSBnYW1lcyBhcmUgQ2FyZCBHYW1lcyBhbmQgMzggcGVyY2VudCBhcmUgc2NpZW5jZSBmaWN0aW9uIGdhbWVzLiBOb25ldGhlbGVzcywgb24gdGhlIGxhc3QgdHdvIGJhcnMgdGhhdCByZXByZXNlbnQgdGhlIGhpZ2ggYXZlcmFnZSBzY29yZXMgb2YgMyAobm90IGluY2x1ZGVkKSwgNCwgYW5kIDUsIHRoZXJlIHNlZW1zIHRvIGJlIGEgaGlnaGVyIHByb3BvcnRpb24gb2YgU2NpZW5jZSBGaWN0aW9uIGdhbWVzIGluIGNvbXBhcmlzb24gdG8gdGhlIGNhcmQgZ2FtZXMuIEZvciBpbnN0YW5jZSwgaW4gdGhlIGxhc3QgaW50ZXJ2YWwgb2YgYXZlcmFnZSBjb21wbGV4aXR5IHNjb3JlcyA0IChub3QgaW5jbHVkZWQpIGFuZCA1LCBhcHByb3hpbWF0ZWx5IG1vcmUgdGhhbiA4MCBwZXJjZW50IG9mIHRoZSBnYW1lcyBhcmUgU2NpZW5jZSBGaWN0aW9uLiBPdmVyYWxsLCBDYXJkIEdhbWVzIHNlZW0gdG8gYmUgbW9yZSBjb21tb24gYW1vbmcgdGhlIHdpdGggbG93IHNjb3JlcyBhbmQgc2NpZW5jZSBmaWN0aW9uIGlzIHJhdGVkIGFzIG1vcmUgY29tcGxleC4gCjxicj4KPGJyPgoKIyMgTWF4aW11bSBQbGF5ZXJzCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9Nn0KCiBib2FyZGdhbWVzcG9wIDwtIGJvYXJkZ2FtZXMgJT4lCiAgICAgIGZpbHRlcih5ZWFycHVibGlzaGVkID49IDE5NTAgJiB1c2Vyc19yYXRlZD49IDI1ICYgYXZlcmFnZV9yYXRpbmcgPiAwICYgYXZlcmFnZV9jb21wbGV4aXR5ID4gMCwgbWluYWdlIDw9IDIwICYgbWF4cGxheWVycyA+MCwgbWF4cGxheWVycyA8PSAyNSkgJT4lCiAgICAgICBtdXRhdGUobWF4cGxheWVyc19DYXQgPSBjdXQobWF4cGxheWVycywgYnJlYWtzID0gc2VxKDAsIDI1LCBieSA9IDUpKSkgJT4lIAogIG11dGF0ZShtYXhwbGF5ZXJzX0NhdCA9IGZjdF9yZWNvZGUobWF4cGxheWVyc19DYXQsICIxLTUiID0gIigwLDVdIiwgIjYtMTAiID0gIig1LDEwXSIsICIxMS0xNSIgPSAiKDEwLDE1XSIsICIxNi0yMCIgPSAiKDE1LDIwXSIsICIyMS0yNSIgPSAiKDIwLDI1XSIpKQoKZ2dwbG90KGJvYXJkZ2FtZXNwb3AsIGFlcyh4PWF2ZXJhZ2VfY29tcGxleGl0eSwgZmlsbCA9IG1heHBsYXllcnNfQ2F0KSkgKyBmYWNldF93cmFwKH5tYXhwbGF5ZXJzX0NhdCkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuOCkgKyB4bGltKDEsIDUpICsgc2NhbGVfZmlsbF92aXJpZGlzX2QobmFtZSA9ICJNYXhpbXVtICMgb2YgUGxheWVycyIsIG9wdGlvbiA9ICJtYWtvIiwgbGFiZWxzPWMoIjEtNSIsIjYtMTAiLCIxMS0xNSIsIjE2LTIwIiwiMjEtMjUiKSkgKyAgIGxhYnModGl0bGUgPSAiR2FtZXMnIEF2ZXJhZ2UgQ29tcGxleGl0eSBBY3Jvc3MgTWF4aW11bSBOdW1iZXIgb2YgUGxheWVycyIsIHN1YnRpdGxlID0gIiBDb21wbGV4aXR5IGlzIG9uIFNjYWxlIG9mIDEtNSIsIHggPSAiQXZlcmFnZSBDb21wbGV4aXR5IiwgeSA9ICJEZW5zaXR5IiwgY2FwdGlvbiA9ICJHcmFwaCBieSBKb3JkeSBNYXJpbiIpICsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXk4OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSAxKSwKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGZhY2U9Iml0YWxpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0PS0xLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9MTApLAogICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiZ3JheTg5Iiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApCiAgICAgICAgKSAKYGBgCjxicj4KPGJyPgpUaHJvdWdob3V0IG91ciBkYXRhLXdyYW5nbGluZyBwcm9jZXNzLCB3ZSBvbmx5IGNvbnNpZGVyZWQgZ2FtZXMgd2l0aCAyNSBtYXhpbXVtIHBsYXllcnMgb3IgZmV3ZXIgc2luY2UgdGhlIGhpZ2hlciBjb25jZW50cmF0aW9uIHdhcyBpbiB0aGUgbG93IG51bWJlcnMgb2YgcGxheWVycy4gRnJvbSBmaWd1cmUgNiB3ZSBjYW4gb2JzZXJ2ZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBhdmVyYWdlIGNvbXBsZXhpdHkgc2NvcmVzIG9mIHRoZSBnYW1lcyBmYWNldGVkIGJ5IHN1Ymdyb3VwcyBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGxheWVycy4gRnJvbSB0aGUgc2NvcmVzLCAxIGlzIHRoZSBsb3dlc3QgbGV2ZWwgb2YgYXZlcmFnZSBjb21wbGV4aXR5IHNjb3JlIGFuZCA1IGlzIHRoZSBoaWdoZXN0LiBXaXRoaW4gdGhlIGdyb3VwIG9mIDEtNSBtYXhpbXVtIG51bWJlciBvZiBwbGF5ZXJzLCB0aGVyZSBpcyBhIHJlbGF0aXZlbHkgdW5pZm9ybSBkaXN0cmlidXRpb24gb2YgdGhlIGF2ZXJhZ2UgY29tcGxleGl0eSBiZXR3ZWVuIDEgYW5kIDQsIGhhdmluZyBpdHMgaGlnaGVzdCBwZWFrIGF0IGFwcHJveGltYXRlbHkgMi4gQ29ycmVzcG9uZGluZ2x5LCB3aXRoaW4gdGhlIGdyb3VwIG9mIDYtMTAgbWF4aW11bSBwbGF5ZXJzLCB0aGUgZGlzdHJpYnV0aW9uIGlzIHJpZ2h0LXNrZXdlZCwgaGF2aW5nIHRoZSBoaWdoZXN0IGNvbmNlbnRyYXRpb24gYXJvdW5kIHRoZSBsb3dlciBhdmVyYWdlIGNvbXBsZXhpdHkgc2NvcmVzIGFuZCB3aXRoIHR3byBwZWFrcyBjbG9zZSB0byAxIGFuZCAyLiBBZGRpdGlvbmFsbHksIHRoZSBjYXRlZ29yeSBvZiAxMS0xNSBtYXhpbXVtIHBsYXllcnMgaGFzIHRoZSBoaWdoZXN0IGNvbmNlbnRyYXRpb24gb2YgYXJvdW5kIDEtMyBhdmVyYWdlIGNvbXBsZXhpdHkgYW5kIGl0cyBwZWFrIGlzIGJldHdlZW4gMS0yLiBIb3dldmVyLCB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgaXMgYWxzbyBzb21lIGNvbmNlbnRyYXRpb24gYXJvdW5kIDMgdG8gNSBhdmVyYWdlIGNvbXBsZXhpdHkuIExhc3RseSwgdGhlIGxhc3QgdHdvIGdyb3VwcyBvZiAxNi0yMCBhbmQgMjEtMjUgbWF4aW11bSBwbGF5ZXJzIGhhdmUgYSBzaW1pbGFyIGRpc3RyaWJ1dGlvbiwgaGF2aW5nIHRoZSBoaWdoZXN0IGNvbmNlbnRyYXRpb24gYW5kIGEgcGVhayBiZXR3ZWVuIDEgdG8gMi4gQWxzbywgdGhlc2UgZ3JvdXBzIGhhdmUgYW5vdGhlciBjb25jZW50cmF0aW9uIGFyb3VuZCAyLjUgdG8gNCBhbmQgYm90aCBwZWFraW5nIGF0IDMuIE92ZXJhbGwsIHRoZXJlIHNlZW1zIHRvIGJlIGEgdGVuZGVuY3kgYWNyb3NzIGFsbCB0aGUgZ3JvdXBzIGZvciB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGxheWVycyBhbmQgbG93IGxldmVsIG9mIGNvbXBsZXhpdHkgc2NvcmVzLgoKIyBDb25jbHVzaW9uCgpGb3IgRmlndXJlIDEsIFRoZSBnYW1lIHBsYXlpbmcgdGltZXMgZG9lcyBub3Qgc2VlbSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlaXIgY29tcGxleGl0eSBsZXZlbC4gU29tZSBmdXJ0aGVyIHJlc2VhcmNoIHRoYXQgY291bGQgYmUgZG9uZSB3b3VsZCBiZSB0byBsb29rIGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgY29tcGxleGl0eSBsZXZlbCBvZiBnYW1lcyBhbmQgVXNlciByYXRpbmcgYXMgaXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIGlmIHRoZXJlIGlzIGEgdHJlbmQgYmV0d2VlbiBob3cgYSBnYW1lIGNvbXBsZXhpdHkgaXMgYW5kIGhvdyBtYW55IHVzZXJzIHJhdGVzIGl0LiAKCkZvciBGaWd1cmUgMiwgaXQgaXMgb2JzZXJ2YWJsZSB0aGF0IHRoZSBudW1iZXIgb2YgY2F0ZWdvcmllcywgdG8gYW4gZXh0ZW50LCBkb2VzIGNvcnJlbGF0ZSB3aXRoIGEgaGlnaGVyIG1lZGlhbiBhdmVyYWdlIGNvbXBsZXhpdHkgc2NvcmUuIEhvd2V2ZXIsIHRoZSBtZWRpYW4gZm9yIGF2ZXJhZ2UgY29tcGxleGl0eSBzY29yZSBzZWVtcyB0byBkZWNyZWFzZSBvbmNlIGEgYm9hcmQgZ2FtZSBoYXMgbW9yZSB0aGFuIDEyIGNhdGVnb3JpZXMuCgpGb3IgRmlndXJlIDMsIHJlZ2FyZGxlc3Mgb2YgdGhlIGRlY2FkZSwgb3JpZ2luYWwgYm9hcmQgZ2FtZXMgd2VyZSBub3QgcGVyY2VpdmVkIHRvIGJlIHZlcnkgY29tcGxpY2F0ZWQgYXQgYWxsLCB0aGV5IHdlcmUgdmVyeSByaWdodCBza2V3ZWQuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGVyZSB3ZXJlIG5vIGV4cGFuc2lvbiBwYWNrcyB1bnRpbCB0aGUgMTk3MOKAmXMuIEZvciB0aGUgZm9sbG93aW5nIGRlY2FkZXMgYWZ0ZXIsIHRoZXJlIHdhcyBhIG1vcmUgY29tcGxleCBwZXJjZXB0aW9uIG9mIHRoZSBnYW1lcy4gU3RpbGwsIHdoaWxlIHRoZXkgd2VyZSBtb3JlIGNvbXBsZXgsIHRoZXJlIHdhcyBzbGlnaHRseSBtb3JlIGV2ZW4gZGlzdHJpYnV0aW9ucy4gICAgICAKCkZvciBGaWd1cmUgNCwgZHJhd2luZyBmcm9tIGJvdGggdmlzdWFsaXphdGlvbnMgNC4xIGFuZCA0LjIsIHdlIGNhbiBzZWUgdGhhdCBhbHRob3VnaCB0aGUgbnVtYmVyIG9mIGNhdGVnb3JpZXMgZG9lcyBjb3JyZWxhdGUgd2l0aCBhIGhpZ2hlciBtZWRpYW4gYXZlcmFnZSBjb21wbGV4aXR5IHNjb3JlIGFmdGVyIHRoZSAxOTkwcywgdGhlIG1lZGlhbiBhdmVyYWdlIGNvbXBsZXhpdHkgc2NvcmUgb2YgZXhwYW5zaW9uIHBhY2tzIGFyZSByZWxhdGl2ZWx5IGhpZ2hlciB0aGFuIHRoYXQgb2Ygb3JpZ2luYWwgYmFzZSBnYW1lcy4KCkZyb20gZmlndXJlIDUuMSwgd2UgY2FuIHNlZSB0aGF0IFNjaWVuY2UgRmljdGlvbiBnYW1lcyB3ZXJlIHJhdGVkIGFzIHRoZSBtb3N0IGNvbXBsZXggYWNyb3NzIGRlY2FkZXMgZnJvbSAxOTgwIHRvIDIwMTAgaW4gcHJvcG9ydGlvbiB0byBDYXJkIEdhbWVzLiBCeSBsb29raW5nIGNsb3NlbHkgYXQgRmlndXJlIDUuMiB3ZSBmb3VuZCB0aGF0IFNjaWVuY2UgRmljdGlvbiBnYW1lcyBzZWVtIHRvIGJlIHJhdGVkIGFzIG1vcmUgY29tcGxleCAoYmV0d2VlbiB0aGUgNCBhbmQgNSBzY29yZXMpLgoKRm9yIEZpZ3VyZSA2LCB3ZSBvYnNlcnZlZCB0aGF0IGFjcm9zcyBhbGwgZml2ZSBpbnRlcnZhbHMgZm9yIG1heGltdW0gcGxheWVycywgdGhlcmUgc2VlbXMgdG8gYmUgYSBoaWdoIGNvbmNlbnRyYXRpb24gb2YgdGhlIGdhbWVzIGJlaW5nIHJhdGVkIGFzIDEgYW5kIDMgb24gdGhlIHNjb3JlIGxldmVsLgoKQWxsIGluIGFsbCwgdGhlcmUgYXJlIGEgbG90IG9mIHZhcmlhYmxlcyB0aGF0IGNhbiBmbHVjdHVhdGUgYSBib2FyZCBnYW1lJ3MgYXZlcmFnZSBjb21wbGV4aXR5IHNjb3JlLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSB0aGF0IGRvIG5vdCBzaWduaWZpY2FudGx5IGNvcnJlbGF0ZSB3aXRoIGhvdyBkaWZmaWN1bHQgYSBnYW1lIGNhbiBiZS4gT3VyIHByb2plY3QgYWltZWQgdG8gbG9vayBhdCB3aGF0IG1heSBvciBtYXkgbm90IGluZmx1ZW5jZSB0aGVzZSByZXN1bHRzLiBZZXQsIHRoZXJlIGFyZSBteXJpYWQgd2F5cyB0byBpbnZlc3RpZ2F0ZSB0aGlzIHRvcGljIGZ1cnRoZXIgdGhhdCBhcmUgYmV5b25kIHRoZSBzY29wZSBvZiB0aGUgZ2l2ZW4gZGF0YS4gCgojIENvZGUgQXBwZW5kaXgKCmBgYHtyLCBldmFsPUZBTFNFfQojTG9hZGluZyBwYWNrYWdlcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzcGxpdHN0YWNrc2hhcGUpCmxpYnJhcnkoZGJwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2d0aGVtZXMpCgoKI0xvYWRpbmcgZGF0YQpib2FyZGdhbWVzIDwtcmVhZF9jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9icnlhbmRtYXJ0aW4vU1RBVDE1NS9tYXN0ZXIvZG9jcy9Qcm9qZWN0cy9wcm9qZWN0MV9iZ2RhdGF2aXovYm9hcmRfZ2FtZV9yYXcuY3N2IikKCiNTYXZpbmcgcmF3IGRhdGEKd3JpdGVfY3N2KGJvYXJkZ2FtZXMsZmlsZT0iLi9EYXRhL2JvYXJkZ2FtZXMuY3N2IikKc2F2ZShib2FyZGdhbWVzLGZpbGU9Ii4vRGF0YS9ib2FyZGdhbWVzLlJEYXRhIikKCgpgYGAKCkZpZ3VyZSAxCgpgYGB7ciwgZXZhbD1GQUxTRX0KYmcgPC0gYm9hcmRnYW1lcyAlPiUKICBmaWx0ZXIoeWVhcnB1Ymxpc2hlZCA+PSAxOTUwICYgdXNlcnNfcmF0ZWQgPj0gMjUgJiBhdmVyYWdlX2NvbXBsZXhpdHkgPiAwICYgcGxheWluZ3RpbWU+MTUgJiBwbGF5aW5ndGltZTwgNDAwKQpgYGAKCmBgYHtyLCBldmFsPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0xMH0KIyBSZWxhdGlvbnNoaXAgYmV0d2VlbiBhdmVyYWdlIHJhdGluZyBhbmQgYXZlcmFnZSBjb21wbGV4aXR5CmJnICU+JQogIGdncGxvdChhZXMoeCA9IHBsYXlpbmd0aW1lLCB5ID0gYXZlcmFnZV9jb21wbGV4aXR5KSkgKyAKICBnZW9tX3BvaW50KGNvbG9yPSJvcmFuZ2UiLGFscGhhPS43LHNpemU9MikgKyAKICB0aGVtZV9idygpKwogIGdlb21fc21vb3RoKCBzZSA9IEZBTFNFKSsKICBsYWJzKHRpdGxlID0gIlJlbGF0aW9uc2hpcCBCZXR3ZWVuIEF2ZXJhZ2UgQ29tcGxleGl0eSBUaW1lIGFuZCBQbGF5aW5nIFRpbWUiLAogICAgICAgc3VidGl0bGU9IkJvYXJkZ2FtZXMgZnJvbSAxOTUwLTIwMTYiLAogICAgICAgeCA9ICIgUGxheWluZyBUaW1lIChNaW51dGVzKSAiLAogICAgICAgeSA9ICIgQXZlcmFnZSBDb21wbGV4aXR5ICIsCiAgICAgICBjYXB0aW9uID0gIkdyYXBoIGJ5IFN5bHZhaW4gWm9uZy1OYWJhIiApKwogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLHNpemU9MTYpLAogICAgICAgIHBsb3Quc3VidGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQpLAogICAgICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoZmFjZT0iaXRhbGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3Q9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3Q9LTEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0xMCkpCmBgYApgYGAKCkZpZ3VyZSAyCgpgYGB7ciwgZXZhbD1GQUxTRX0KI0ZpbHRlcmluZyBkYXRhCmJvYXJkZ2FtZXNGaWx0ZXJlZDEgPC0gYm9hcmRnYW1lcyAlPiUKICBtdXRhdGUobnVtX2NhdGVnb3JpZXMgPSBzdHJfY291bnQoYGNhdGVnb3J5YCwiLCIgKSArIDEpICU+JQogIGZpbHRlcih5ZWFycHVibGlzaGVkPj0xOTUwKSAlPiUKICBmaWx0ZXIobnVtX2NhdGVnb3JpZXMgIT0gIk4vQSIpICU+JQogIGZpbHRlcihhdmVyYWdlX2NvbXBsZXhpdHkhPTApICU+JQogIG11dGF0ZShudW1DYXQgPSBjdXQobnVtX2NhdGVnb3JpZXMsIGJyZWFrcyA9IHNlcSgwLCAyOCwgYnkgPSA0KSkpCmBgYAoKYGBge3IsZXZhbD1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0xMH0KI0RhdGEgdmlzdWFsaXphdGlvbgpib2FyZGdhbWVzRmlsdGVyZWQxICU+JSBnZ3Bsb3QoYWVzKHg9bnVtQ2F0LHk9YXZlcmFnZV9jb21wbGV4aXR5LCBmaWxsPW51bUNhdCkpKwogIGdlb21fYm94cGxvdChjb2xvcj0iYmxhY2siKSsKICB0aGVtZV9idygpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInJlZCIsICJzYWxtb24iLCAicGluayIsICJzdGVlbGJsdWUxIiwgInN0ZWVsYmx1ZTQiLCJibHVlNCIpLGxhYmVscz1jKCIxLTQiLCI1LTgiLCI5LTEyIiwiMTMtMTYiLCIyMS0yNCIsIjI1LTI4IiksbmFtZT0iTnVtYmVyIG9mIENhdGVnb3JpZXMiKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCIxLTQiLCI1LTgiLCI5LTEyIiwiMTMtMTYiLCIyMS0yNCIsIjI1LTI4IikpKwogIGxhYnModGl0bGU9IlJlbGF0aW9uc2hpcCBiZXR3ZWVuIE51bWJlciBvZiBDYXRlZ29yaWVzIGFuZCBBdmVyYWdlIENvbXBsZXhpdHkgU2NvcmUiLHN1YnRpdGxlPSJCb2FyZGdhbWVzIGZyb20gMTk1MC0yMDE2Iix5PSJBdmVyYWdlIENvbXBsZXhpdHkiLGNhcHRpb249IkdyYXBoIGJ5IE5hIE5ndXllbiIpKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkscGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsc2l6ZT0xNiksYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTE0KSxwbG90LnN1YnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSxwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGZhY2U9Iml0YWxpYyIsaGp1c3Q9MCx2anVzdD0tMS41LHNpemU9MTApKQpgYGAKCkZpZ3VyZSAzCgpgYGAge3IsIGV2YWw9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9MTAsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBGaWx0ZXJpbmcgRGF0YQpjb21wbGV4X2dhbWVzIDwtIGNsZWFuX2dhbWVzICU+JQogIHNlbGVjdChnYW1lX3R5cGUsIAogICAgICAgICBhdmVyYWdlX3JhdGluZywgCiAgICAgICAgIGF2ZXJhZ2VfY29tcGxleGl0eSwgCiAgICAgICAgIHllYXJwdWJsaXNoZWQsIAogICAgICAgICB1c2Vyc19yYXRlZCkgJT4lCiAgZmlsdGVyKGF2ZXJhZ2VfY29tcGxleGl0eSAhPSAiMCIpICU+JQogIG11dGF0ZShkZWNhZGUgPSBkcGx5cjo6Y2FzZV93aGVuKAogICAgeWVhcnB1Ymxpc2hlZCA+PSAxOTUwICYgeWVhcnB1Ymxpc2hlZCA8PSAxOTU5IH4gIjE5NTAncyIsCiAgICB5ZWFycHVibGlzaGVkID49IDE5NjAgJiB5ZWFycHVibGlzaGVkIDw9IDE5NjkgfiAiMTk2MCdzIiwKICAgIHllYXJwdWJsaXNoZWQgPj0gMTk3MCAmIHllYXJwdWJsaXNoZWQgPD0gMTk3OSB+ICIxOTcwJ3MiLAogICAgeWVhcnB1Ymxpc2hlZCA+PSAxOTgwICYgeWVhcnB1Ymxpc2hlZCA8PSAxOTg5IH4gIjE5ODAncyIsCiAgICB5ZWFycHVibGlzaGVkID49IDE5OTAgJiB5ZWFycHVibGlzaGVkIDw9IDE5OTkgfiAiMTk5MCdzIiwKICAgIHllYXJwdWJsaXNoZWQgPj0gMjAwMCAmIHllYXJwdWJsaXNoZWQgPD0gMjAwOSB+ICIyMDAwJ3MiLAogICAgeWVhcnB1Ymxpc2hlZCA+PSAyMDEwICYgeWVhcnB1Ymxpc2hlZCA8PSAyMDE5IH4gIjIwMTAncyIpKSAKCmxlZ2VuZF90dGwgPC0gIkdhbWUgVHlwZSIKYGBgCgpgYGAge3IsIGV2YWw9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9MTAsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBEYXRhIFZpc3VhbGl6YXRpb24KCmdncGxvdChjb21wbGV4X2dhbWVzLCAKICAgICAgIGFlcyh4ID0gYXZlcmFnZV9jb21wbGV4aXR5LCAKICAgICAgICAgICBmaWxsID0gZ2FtZV90eXBlKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoICJtZWRpdW1hcXVhbWFyaW5lIiwgImxpZ2h0Y29yYWwiKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJvcmlnaW5hbCBib2FyZCBnYW1lcyIsICJleHBhbnNpb24gcGFja3MiKSwgCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJHYW1lIFR5cGUiKSArCiAgbGFicyh0aXRsZSA9ICJDb21wbGV4aXR5IG9mIEFsbCBCYXNlIEdhbWVzIENvbXBhcmVkIHRvIEFsbCBFeHBhbnNpb24gUGFja3MiLCAKICAgICAgIHggPSAiQXZlcmFnZSBSYXRlZCBDb21wbGV4aXR5IiwgCiAgICAgICB5ID0gIkZyZXF1ZW5jeSBvZiBSYXRpbmciLAogICAgICAgc3VidGl0bGU9IkJvYXJkZ2FtZXMgZnJvbSAxOTUwLTIwMTYiLAogICAgICAgY2FwdGlvbj0gIkdyYXBoIGJ5IEphbWVzIEhlcm5hbmRleiIpICsgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE2KSwKICAgICAgICBwbG90LnN1YnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSwKICAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGZhY2U9Iml0YWxpYyIsaGp1c3Q9MCx2anVzdD0tMS41LHNpemU9MTApKSArCiAgZmFjZXRfd3JhcCh+IGRlY2FkZSkgCmBgYAoKRmlndXJlIDQKYGBge3IsZXZhbD1GQUxTRX0KI0ZpbHRlcmluZyBkYXRhIDQuMQpib2FyZGdhbWVzRmlsdGVyZWQyIDwtIGJvYXJkZ2FtZXNGaWx0ZXJlZDEgJT4lIAogIGZpbHRlcihnYW1lX3R5cGUhPSJib2FyZGdhbWVleHBhbnNpb24iKSAlPiUgCiAgbXV0YXRlKGRlY2FkZXM9cGFzdGUoYXMuY2hhcmFjdGVyKGZsb29yKHllYXJwdWJsaXNoZWQvMTApKjEwKSwicyIsc2VwPSInIikpCmBgYAoKYGBge3IsZXZhbD1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0xMH0KI0RhdGEgdmlzdWFsaXphdGlvbiA0LjEKYm9hcmRnYW1lc0ZpbHRlcmVkMiAlPiUgZ2dwbG90KGFlcyh4PW51bUNhdCx5PWF2ZXJhZ2VfY29tcGxleGl0eSwgZmlsbD1udW1DYXQpKSsKICBnZW9tX2JveHBsb3Qod2lkdGg9LjgpKwogIHRoZW1lX2J3KCkrCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIiwKICAgIGxhYmVscz1jKCIxLTQiLCI1LTgiLCI5LTEyIiwiMTMtMTYiLCIyMS0yNCIsIjI1LTI4IikKICAgICkrCiAgbGFicygKICAgIHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBOdW1iZXIgb2YgQ2F0ZWdvcmllcyBhbmQgQXZlcmFnZSBDb21wbGV4aXR5IFNjb3JlIixzdWJ0aXRsZT0iT3JpZ2luYWwgQm9hcmRnYW1lcyBmcm9tIDE5NTAtMjAxNiIsCiAgICB5PSJBdmVyYWdlIENvbXBsZXhpdHkiLAogICAgY2FwdGlvbj0iR3JhcGggNC4xIGJ5IE5hIE5ndXllbiIsCiAgICBmaWxsPSJOdW1iZXIgb2YgQ2F0ZWdvcmllcyIKICAgICAgICkrCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsc2l6ZT0xNiksCiAgICBwbG90LnN1YnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSwKICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGZhY2U9Iml0YWxpYyIsaGp1c3Q9MCx2anVzdD0tMS41LHNpemU9MTApCiAgICApICsKICBmYWNldF9ncmlkKH5kZWNhZGVzKQpgYGAKCmBgYHtyLGV2YWw9RkFMU0V9CiMgRmlsdGVyaW5nIGRhdGEgNC4yCmJvYXJkZ2FtZXNGaWx0ZXJlZDMgPC0gYm9hcmRnYW1lc0ZpbHRlcmVkMSAlPiUgCiAgZmlsdGVyKGdhbWVfdHlwZSA9PSJib2FyZGdhbWVleHBhbnNpb24iKSAlPiUgCiAgbXV0YXRlKGRlY2FkZXM9cGFzdGUoYXMuY2hhcmFjdGVyKGZsb29yKHllYXJwdWJsaXNoZWQvMTApKjEwKSwicyIsc2VwPSInIikpCmBgYAoKYGBge3IsZXZhbD1GQUxTRSwgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9MTB9CiMgRGF0YSB2aXN1YWxpemF0aW9uIDQuMgpib2FyZGdhbWVzRmlsdGVyZWQzICU+JSBnZ3Bsb3QoYWVzKHg9bnVtQ2F0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9YXZlcmFnZV9jb21wbGV4aXR5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPW51bUNhdCkpKwogIGdlb21fYm94cGxvdCh3aWR0aD0uOCkrCiAgdGhlbWVfYncoKSsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiLAogICAgbGFiZWxzPWMoIjEtNCIsIjUtOCIsIjktMTIiLCIxMy0xNiIsIjIxLTI0IiwiMjUtMjgiKSkrCiAgbGFicygKICAgIHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBOdW1iZXIgb2YgQ2F0ZWdvcmllcyBhbmQgQXZlcmFnZSBDb21wbGV4aXR5IFNjb3JlIiwKICAgIHN1YnRpdGxlPSJFeHBhbnNpb24gUGFja3MgZnJvbSAxOTUwLTIwMTYiLAogICAgeT0iQXZlcmFnZSBDb21wbGV4aXR5IiwKICAgIGNhcHRpb249IkdyYXBoIDQuMiBieSBKYW1lcyBIZXJuYW5kZXoiLAogICAgZmlsbD0iTnVtYmVyIG9mIENhdGVnb3JpZXMiKSsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9MTYpLAogICAgcGxvdC5zdWJ0aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MTQpLAogICAgcGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChmYWNlPSJpdGFsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdD0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdD0tMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTEwKSkgKwogIGZhY2V0X2dyaWQofmRlY2FkZXMpCmBgYAoKRmlndXJlIDUKCmBgYHtyLCBldmFsID0gRkFMU0UsIG1lc3NhZ2U9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiMgRmlsdGVyaW5nIHRoZSByYXcgZGF0YS9EYXRhIFdyYW5nbGluZyA1LjEKCmJvYXJkZ2FtZXN0b3AgPC0gYm9hcmRnYW1lcyAlPiUgCiAgZmlsdGVyKHllYXJwdWJsaXNoZWQgPj0gMTk1MCAmIHVzZXJzX3JhdGVkPj0gMjUgJiBhdmVyYWdlX3JhdGluZyA+IDAgJiBhdmVyYWdlX2NvbXBsZXhpdHkgPiAwICYgbWF4cGxheWVycyA+IDApICU+JSAKICBjU3BsaXQoImNhdGVnb3J5Iiwgc2VwID0gIiwiLCBkaXJlY3Rpb24gPSAibG9uZyIpICU+JSAKICBtdXRhdGUoRGVjYWRlID0gZmFjdG9yKGZsb29yKHllYXJwdWJsaXNoZWQvMTApKjEwKSkgJT4lCiAgbXV0YXRlKGF2Z0NvbXBsZXhpdHlDYXQgPSBjdXQoYXZlcmFnZV9jb21wbGV4aXR5LCBicmVha3MgPSBzZXEoZnJvbSA9IDEsIHRvID0gNSwgYnkgPTEpLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUpKSAlPiUgCiAgIGdyb3VwX2J5KERlY2FkZSwgY2F0ZWdvcnksIGF2Z0NvbXBsZXhpdHlDYXQpICU+JSAKICBmaWx0ZXIoY2F0ZWdvcnkgJWluJSBjKCJDYXJkIEdhbWUiLCAiU2NpZW5jZSBGaWN0aW9uIikpCmJvYXJkZ2FtZXN0b3AkZ2FtZV90eXBlIDwtIGJvYXJkZ2FtZXN0b3AkZ2FtZV90eXBlICU+JQogIHN0cl9yZXBsYWNlKCJib2FyZGdhbWVleHBhbnNpb24iLCAiQm9hcmQgR2FtZSBFeHBhbnNpb24iKSAlPiUKICBzdHJfcmVwbGFjZSgiYm9hcmRnYW1lIiwgIkJvYXJkIEdhbWUiKQoKCmBgYAoKYGBge3IsIGV2YWwgPSBGQUxTRSwgbWVzc2FnZT0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0xMH0KI0RhdGEgVmlzdWFsaXphdGlvbiA1LjEKYm9hcmRnYW1lc3RvcCAlPiUKICBmaWx0ZXIoRGVjYWRlICVpbiUgYygxOTgwLCAxOTkwLCAyMDAwLCAyMDEwKSkgJT4lCmdncGxvdChhZXMoeD1EZWNhZGUsIGZpbGwgPSBjYXRlZ29yeSkpICsgCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgCiAgZmFjZXRfd3JhcCh+YXZnQ29tcGxleGl0eUNhdCkgKyAKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChuYW1lID0gIkNhdGVnb3J5Iiwgb3B0aW9uID0gIm1ha28iKSAgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSkpICsgCiAgbGFicyh4ID0gIkRlY2FkZSBvZiBQdWJsaXNoaW5nIiwgeT0gIlByb3BvcnRpb24iLCB0aXRsZSA9ICJDYXJkIGFuZCBTY2llbmNlIEZpY3Rpb24gR2FtZXMgYW5kIEF2ZXJhZ2UgQ29tcGxleGl0eSBPdmVyIFRpbWUiLCBzdWJ0aXRsZSA9ICJDb21wbGV4aXR5IGlzIG9uIEludGVydmFscyBvZiAxLTUiLCBjYXB0aW9uID0gIkdyYXBoIDUuMSBieSBKb3JkeSBNYXJpbiIpICsgCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9IGMoIjE5ODAncyIsICIxOTkwJ3MiLCAiMjAwMCdzIiwgIjIwMTAncyIpKSArICAKICBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQodGl0bGU9IkNhdGVnb3J5IikpICsgIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5ODkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gMSksCiAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoZmFjZT0iaXRhbGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3Q9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3Q9LTEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0xMCksCiAgICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJncmF5ODkiLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIixzaXplPTE2KSwKICAgICAgICBwbG90LnN1YnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApCiAgICAgICAgKQpgYGAKCmBgYHtyLCBldmFsID0gRkFMU0UsIG1lc3NhZ2U9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTEwfQojIEZpbHRlcmluZyBEYXRhIDUuMgoKYm9hcmRnYW1lc3RvcDEgPC0gYm9hcmRnYW1lcyAlPiUgCiAgZmlsdGVyKHllYXJwdWJsaXNoZWQgPj0gMTk1MCAmIHVzZXJzX3JhdGVkPj0gMjUgJiBhdmVyYWdlX3JhdGluZyA+IDAgJiBhdmVyYWdlX2NvbXBsZXhpdHkgPiAwICYgbWF4cGxheWVycyA+IDApICU+JSAKICBjU3BsaXQoImNhdGVnb3J5Iiwgc2VwID0gIiwiLCBkaXJlY3Rpb24gPSAibG9uZyIpICU+JQogIG11dGF0ZShhdmdDb21wbGV4aXR5Q2F0ID0gY3V0KGF2ZXJhZ2VfY29tcGxleGl0eSwgYnJlYWtzID0gc2VxKGZyb20gPSAxLCB0byA9IDUsIGJ5ID0xKSwgaW5jbHVkZS5sb3dlc3QgPSBUUlVFKSkgJT4lIAogICBncm91cF9ieShjYXRlZ29yeSwgYXZnQ29tcGxleGl0eUNhdCkgJT4lIAogIGZpbHRlcihjYXRlZ29yeSAlaW4lIGMoIkNhcmQgR2FtZSIsICJTY2llbmNlIEZpY3Rpb24iKSkKYGBgCgpgYGB7cixldmFsPUZBTFNFfQojRGF0YSB2aXN1YWxpemF0aW9uIDUuMgpnZ3Bsb3QoYm9hcmRnYW1lc3RvcDEsIGFlcyh4PWF2Z0NvbXBsZXhpdHlDYXQsIGZpbGwgPSBjYXRlZ29yeSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgdGhlbWVfYncoKSArc2NhbGVfZmlsbF92aXJpZGlzX2QobmFtZSA9ICJDYXRlZ29yeSIsIG9wdGlvbiA9ICJtYWtvIikgICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpKSArIGxhYnMoeCA9ICJBdmVyYWdlIENvbXBsZXhpdHkiLCB5PSAiUHJvcG9ydGlvbiIsIHRpdGxlID0gIkNhcmQgYW5kIFNjaWVuY2UgRmljdGlvbiBHYW1lcyBBY3Jvc3MgQXZlcmFnZSBDb21wbGV4aXR5Iiwgc3VidGl0bGUgPSAiIENvbXBsZXhpdHkgaXMgb24gSW50ZXJ2YWxzIG9mIDEtNSIsIGNhcHRpb24gPSAiR3JhcGggNS4yIGJ5IEpvcmR5IE1hcmluIikgKyBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQodGl0bGU9IkNhdGVnb3J5IikpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5ODkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gMSksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXk4OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSAxKSwKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gImdyYXk4OSIsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiksCiAgICAgICAgcGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChmYWNlPSJpdGFsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdD0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdD0tMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTEwKSwKICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksIAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCkKICAgICAgICApIApgYGAKCkZpZ3VyZSA2CmBgYHtyLCBldmFsID0gRkFMU0UsIG1lc3NhZ2U9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9OX0KI0ZpbHRlcmluZyBEYXRhCiBib2FyZGdhbWVzcG9wIDwtIGJvYXJkZ2FtZXMgJT4lCiAgICAgIGZpbHRlcih5ZWFycHVibGlzaGVkID49IDE5NTAgJiB1c2Vyc19yYXRlZD49IDI1ICYgYXZlcmFnZV9yYXRpbmcgPiAwICYgYXZlcmFnZV9jb21wbGV4aXR5ID4gMCwgbWluYWdlIDw9IDIwICYgbWF4cGxheWVycyA+MCwgbWF4cGxheWVycyA8PSAyNSkgJT4lCiAgICAgICBtdXRhdGUobWF4cGxheWVyc19DYXQgPSBjdXQobWF4cGxheWVycywgYnJlYWtzID0gc2VxKDAsIDI1LCBieSA9IDUpKSkgJT4lIAogIG11dGF0ZShtYXhwbGF5ZXJzX0NhdCA9IGZjdF9yZWNvZGUobWF4cGxheWVyc19DYXQsICIxLTUiID0gIigwLDVdIiwgIjYtMTAiID0gIig1LDEwXSIsICIxMS0xNSIgPSAiKDEwLDE1XSIsICIxNi0yMCIgPSAiKDE1LDIwXSIsICIyMS0yNSIgPSAiKDIwLDI1XSIpKQpgYGAKCmBgYHtyLGV2YWw9RkFMU0V9CiNEYXRhIHZpc3VhbGl6YXRpb24gCmdncGxvdChib2FyZGdhbWVzcG9wLCBhZXMoeD1hdmVyYWdlX2NvbXBsZXhpdHksIGZpbGwgPSBtYXhwbGF5ZXJzX0NhdCkpICsgZmFjZXRfd3JhcCh+bWF4cGxheWVyc19DYXQpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjgpICsgeGxpbSgxLCA1KSArIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG5hbWUgPSAiTWF4aW11bSAjIG9mIFBsYXllcnMiLCBvcHRpb24gPSAibWFrbyIsIGxhYmVscz1jKCIxLTUiLCI2LTEwIiwiMTEtMTUiLCIxNi0yMCIsIjIxLTI1IikpICsgICBsYWJzKHRpdGxlID0gIkdhbWVzJyBBdmVyYWdlIENvbXBsZXhpdHkgQWNyb3NzIE1heGltdW0gTnVtYmVyIG9mIFBsYXllcnMiLCBzdWJ0aXRsZSA9ICIgQ29tcGxleGl0eSBpcyBvbiBTY2FsZSBvZiAxLTUiLCB4ID0gIkF2ZXJhZ2UgQ29tcGxleGl0eSIsIHkgPSAiRGVuc2l0eSIsIGNhcHRpb24gPSAiR3JhcGggYnkgSm9yZHkgTWFyaW4iKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5ODkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gMSksCiAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdD0xLjQpLAogICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiZ3JheTg5Iiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApCiAgICAgICAgKSAKYGBgCgo=