Data Visualization Exercise
This notebook uses TidyTuesday’s 2021 Week 8 Dubois Challenge, data from Anthony Starks, Allen Hillery and Sekou Tyler.
# load libraries
library(tidyverse)
library(janitor)
library(cowplot)
library(showtext)
library(grid)
# font
font_add_google("Teko","teko")
showtext_auto()
# load data
georgia_pop <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-16/georgia_pop.csv')
census <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-16/census.csv')
furniture <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-16/furniture.csv')
city_rural <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-16/city_rural.csv')
income <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-16/income.csv')
freed_slaves <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-16/freed_slaves.csv')
occupation <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-16/occupation.csv')
conjugal <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-16/conjugal.csv')
challenge01: Comparative Increase of White and Colored Population in Georgia
c1 = georgia_pop %>%
pivot_longer(!Year) %>%
ggplot(aes(y=value, x=as.factor(Year))) +
geom_line(aes(group=name, linetype=name)) +
scale_y_reverse(limits=c(100,0), expand=c(0,0), breaks=seq(0,100,5)) +
coord_flip() +
theme_light() +
theme(legend.position="bottom",
axis.ticks=element_blank(),
panel.grid.minor=element_blank(),
panel.grid = element_line(size=0.2, color="red"),
plot.title = element_text(hjust=0.5, size=13.5, face="bold"),
plot.background=element_rect(fill="#ead4bc"),
panel.background = element_rect(fill="#ead4bc"),
legend.background = element_rect(fill="#ead4bc"),
legend.key =element_rect(fill="#ead4bc"),
legend.key.width=unit(2.2, "cm"),
legend.spacing=unit(1.5, "cm"),
axis.title = element_text(size=8.5),
legend.text =element_text(margin=margin(r=2, unit="cm")),
plot.margin = margin(20, 70, 20, 50)
) +
labs(x="",linetype="", y="PERCENTS",
title="COMPARATIVE INCREASE OF WHITE AND COLORED\nPOPULATION OF GEORGIA")
c1

challenge02: Conjugal Condition
# capitalize col names
names(conjugal) = toupper(names(conjugal))
# filter data for labeling
labeldata = conjugal %>% pivot_longer(cols=3:5, values_to="Count", names_to="Status") %>%
mutate(POPULATION= str_to_upper(POPULATION)) %>% arrange(Count) %>% filter(Count>1)
conjugal%>% pivot_longer(cols=3:5, values_to="Count", names_to="Status") %>%
mutate(POPULATION= str_to_upper(POPULATION)) %>%
ggplot(aes(y=fct_rev(POPULATION),
x=Count,
fill=factor(Status, level=c("DIVORCED AND WIDOWED","MARRIED","SINGLE")),
color=factor(Status, level=c("DIVORCED AND WIDOWED","MARRIED","SINGLE")),
label = paste0((Count),"%"))) +
geom_bar(position = "fill", stat = "identity", color = "#4a4e69", width=0.5, size=0.25) +
geom_text(data=labeldata, position = position_fill(vjust = 0.5), size =2.7, color = "white") +
facet_grid(AGE~., labeller = label_both) +
theme_minimal() +
theme(legend.position="top",
plot.margin = margin(10, 40, 0, 20),
axis.text.x=element_blank(),
strip.background = element_rect(fill="#ead4bc",color="#4a4e69"),
strip.text=element_text(color="black",size=12),
panel.grid=element_blank(),
plot.background=element_rect(fill="#ead4bc", color=NA),
panel.background = element_rect(fill="#ead4bc", color=NA),
legend.background = element_rect(fill="#ead4bc", color=NA),
legend.key =element_rect(fill="#ead4bc", color=NA),
legend.text= element_text(size=10),
axis.text.y=element_text(size=12),
#plot.title.position = "plot",
text= element_text(family="teko"),
plot.title=element_text(hjust=0.5, size=22, face="bold")
) +
scale_fill_manual(values=c("#426351","#f9b42a","#de2d48"),
guide=guide_legend(reverse=TRUE)
) +
labs(color="",x="", fill="", y="",
title="CONJUGAL CONDITION")

NA
NA
challenge02: Conjugal Condition v2
conjugal <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-16/conjugal.csv')
conjugal %>%
pivot_longer(cols = c("Single", "Married", "Divorced and Widowed"),
names_to = "Category", values_to = "Pct") %>%
mutate(Category= str_to_upper(Category)) %>%
ggplot(aes(x = Population, y = Pct, fill = Category)) +
facet_wrap(~ Age, nrow = 3) +
geom_bar(position = "fill", stat = "identity", key_glyph = draw_key_point, color="#4a4e69",size=0.25,width=0.6) +
geom_text(aes(y = Pct, x = Population, label = paste0(Pct, "%")),
size = 4, position = position_fill(vjust = 0.5), family="mono") +
geom_text(aes(x = Population, y = 0, label = toupper(Population)),
hjust = 1, nudge_y = -0.02, family="mono",size=4.2) +
geom_text(aes(x = 1.5, y = 0.2, label = stringr::str_wrap(toupper(Age),5)),
hjust = 0.5, nudge_y = -0.4, stat = "unique", family="mono", size=4.2) +
coord_flip() +
scale_fill_manual(values=c("#426351","#f9b42a","#de2d48"),
breaks = c("SINGLE", "MARRIED", "DIVORCED AND WIDOWED")) +
labs(fill = "") +
theme_void() +
theme(plot.margin = margin(20, 20, 90, 20),
legend.position = "top",
text=element_text(family="mono"),
panel.spacing.y = unit(1.5, "lines"),
plot.background = element_rect(fill = "#ead4bc", color = NA),
strip.text = element_blank(),
legend.text=element_text(size=12, margin=margin(r=0.4, unit="cm")),
legend.margin=margin(10,30,10,0),
plot.title=element_text(size=20,hjust=0.3)
) +
guides(fill = guide_legend(override.aes = list(shape = 21, size = 15))) +
labs(title="CONJUGAL CONDITION")

challenge05: Income and Expenditure of 150 Negro Families in Atlanta, GA, USA
# plot
income_plot =
income %>%
pivot_longer(3:7) %>%
filter(!is.na(value)) %>%
filter(value!=0) %>%
mutate(name=toupper(name)) %>%
mutate(textcol= ifelse(name=="RENT","1","0")) %>%
ggplot(aes(fill=factor(name,levels = c("OTHER", "TAX", "CLOTHES", "FOOD", "RENT")),
x=value,
y=fct_rev(Class),
label = paste0(round(value),"%")), color = "black") +
geom_bar(position = "fill", stat = "identity", color = "#495057", width=0.7, size=0.2) +
geom_text(aes(color=textcol),position = position_fill(vjust = 0.5), size =3, show.legend = FALSE) +
geom_text(aes(x = 1.07, y=Class, label = as.character(`Actual Average`)), vjust=0.5, color="#463f3a", family="mono",size=3) +
theme(legend.position="top",
plot.margin = margin(20, 40, 0, 20),
plot.background=element_rect(fill="#ead4bc", color=NA),
panel.background = element_rect(fill="#ead4bc", color=NA),
legend.background = element_rect(fill="#ead4bc"),
legend.key =element_rect(fill="#ead4bc"),
axis.title=element_text(size=8),
text=element_text(family="mono"),
axis.ticks = element_blank(),
axis.ticks.x = element_blank(),
axis.text.x=element_blank(),
axis.title.y.left=element_blank(),
plot.title.position = "plot",
plot.title=element_text(size=12.2),
panel.grid=element_blank(),
legend.text =element_text(margin=margin(r=0.82, unit="cm")),
legend.margin=margin(0,24,0,0),
legend.box.margin=margin(10,0,-5,0)
)+
scale_fill_manual(values = c("#cbdfbd","#8e9aaf","#d78879","#a08294","#161213"), guide=guide_legend(reverse=TRUE)) +
scale_color_manual(values=c("black","white")) +
labs(fill="", x="", y="example",
title="INCOME AND EXPENDITURE OF 150 NEGRO FAMILIES IN ATLANTA, GA.,U.S.A")
# annotate left and right labels
income_plot +
scale_y_discrete(expand = expansion(add=1)) +
draw_text("ACTUAL\nAVERAGE($)", x = 1.07, y = 7.7, family = "mono", size = 6.8) +
scale_x_continuous(expand=expansion(mult=c(0.02,0.05))) +
labs(tag="CLASS") +
theme(plot.tag.position = c(0.07, 0.8),
plot.tag=element_text(family="mono",size=7))

challenge07: Assessed Value of Household and Kitchen Furniture Owned by Georgia Negroes.
# create labels
data = furniture %>%
rename(Value= "Houshold Value (Dollars)") %>%
mutate(lab=paste(Year,"—","$",Value))
data$Year = as.factor(data$Year)
# add a blank row
blank_rows <-
data.frame(
Year="",
Value = 0,
lab="")
# bind rows
graph_data = bind_rows(data, blank_rows)
graph_data %>%
ggplot(aes(x=lab, y=Value)) +
geom_bar(aes(fill=lab),stat="identity", width=0.5,alpha=0.9) +
geom_text(hjust = 1, size = 3.7,
color = "#343a40", family="mono",
aes( y = 0,
label = paste(lab," "))) +
theme_minimal() +
coord_polar(theta = "y") +
ylim(0, 1700000) +
scale_fill_manual(values=c("green","#ff5c8a","#9ba2bf","#9c6644","#f9b42a","#fff1e6","#de2d48")) +
theme(legend.position="none",
plot.background=element_rect(fill="#ead4bc", color=NA),
panel.background = element_rect(fill="#ead4bc", color=NA),
plot.title=element_text(hjust=0.5, size=18, family="mono"),
plot.title.position="plot",
axis.text=element_blank(),
panel.grid=element_blank(),
plot.margin = margin(10, 40, 10, 40)
) +
labs(title="ASSESSED VALUE OF HOUSEHOLD AND KITCHEN FURNITURE\nOWNED BY GEORGIA NEGROES", x="",y="",subtitle="")

Relative Negro Population Of The States Of The United States
rel_pop <- read_csv('https://raw.githubusercontent.com/ajstarks/dubois-data-portraits/master/plate02/data.csv')
pal = c("black","#797d62","#9b9b7a","#84a98c","#95d5b2","#d8f3dc","#f1dca7","#ffcb69","#ffb4a2")
rel_pop %>%
left_join(data.frame(state.abb, state.name), by = c("State" = "state.abb")) %>%
mutate(region = tolower(state.name),
Population = factor(Population,levels = c("750,000 AND OVER",
"600,000 - 750,000",
"500,000 - 600,000",
"300,000 - 500,000",
"200,000 - 300,000",
"100,000 - 200,000",
"50,000 - 100,000",
"25,000 - 50,000",
"10,000 - 25,000",
"UNDER - 10,000"))) %>%
left_join(map_data("state")) %>%
ggplot(aes(x = long, y = lat, group = group, fill = Population)) +
geom_polygon(color = "grey20", lwd = 0.2, key_glyph = "polygon3") +
coord_fixed(1.3) +
scale_fill_manual(values = pal) +
theme_void() +
theme(text=element_text(family="mono"),
plot.title.position = "plot",
plot.title=element_text(hjust=0.5, size=16,face="bold", margin=margin(0,0,40,0)),
plot.margin=margin(20,20,20,20)) +
labs(fill="",
title="RELATIVE NEGRO POPULATION OF THE STATES OF THE\nUNITED STATES.")

NA
LS0tCnRpdGxlOiAiRHVib2lzIENoYWxsZW5nZSIKZGF0ZTogIjIwMjEtMDItMTciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIERhdGEgVmlzdWFsaXphdGlvbiBFeGVyY2lzZQoKVGhpcyBub3RlYm9vayB1c2VzIFtUaWR5VHVlc2RheSdzXShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5KSAyMDIxIFdlZWsgOCBbX19EdWJvaXMgQ2hhbGxlbmdlX19dKGh0dHBzOi8vZ2l0aHViLmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvYmxvYi9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMTYvcmVhZG1lLm1kKSwgZGF0YSBmcm9tIFtBbnRob255IFN0YXJrc10oaHR0cHM6Ly90d2l0dGVyLmNvbS9hanN0YXJrcyksIFtBbGxlbiBIaWxsZXJ5XShodHRwczovL3R3aXR0ZXIuY29tL0FsRGF0YXZpemd1eS9zdGF0dXMvMTM1ODQ1NDY3NjQ5NzMxMzc5Mj9zPTIwKSBhbmQgW1Nla291IFR5bGVyXShodHRwczovL3R3aXR0ZXIuY29tL3NxbHNla291L3N0YXR1cy8xMzYwMjgxMDQwNjU3NTIyNjg5P3M9MjApLiAKCgoKYGBge3J9CiMgbG9hZCBsaWJyYXJpZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KHNob3d0ZXh0KQpsaWJyYXJ5KGdyaWQpCmBgYAoKYGBge3J9CiMgZm9udApmb250X2FkZF9nb29nbGUoIlRla28iLCJ0ZWtvIikKc2hvd3RleHRfYXV0bygpCmBgYAoKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIGxvYWQgZGF0YQpnZW9yZ2lhX3BvcCA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTE2L2dlb3JnaWFfcG9wLmNzdicpCmNlbnN1cyA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTE2L2NlbnN1cy5jc3YnKQpmdXJuaXR1cmUgPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0xNi9mdXJuaXR1cmUuY3N2JykKY2l0eV9ydXJhbCA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTE2L2NpdHlfcnVyYWwuY3N2JykKaW5jb21lIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMTYvaW5jb21lLmNzdicpCmZyZWVkX3NsYXZlcyA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTE2L2ZyZWVkX3NsYXZlcy5jc3YnKQpvY2N1cGF0aW9uIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMTYvb2NjdXBhdGlvbi5jc3YnKQpjb25qdWdhbCA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTE2L2Nvbmp1Z2FsLmNzdicpCmBgYAoKCiMjIyBjaGFsbGVuZ2UwMTogQ29tcGFyYXRpdmUgSW5jcmVhc2Ugb2YgV2hpdGUgYW5kIENvbG9yZWQgUG9wdWxhdGlvbiBpbiBHZW9yZ2lhIAoqIHNoYXJlZCBvbiB0d2l0dGVyIChodHRwczovL3R3aXR0ZXIuY29tL2xlZW9sbmV5My9zdGF0dXMvMTM2MTU3NTM3Nzc3NzM1MjcwNC9waG90by8xKQoKYGBge3IsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTMuMn0KYzEgPSBnZW9yZ2lhX3BvcCAlPiUgCiAgcGl2b3RfbG9uZ2VyKCFZZWFyKSAlPiUKICBnZ3Bsb3QoYWVzKHk9dmFsdWUsIHg9YXMuZmFjdG9yKFllYXIpKSkgKwogIGdlb21fbGluZShhZXMoZ3JvdXA9bmFtZSwgbGluZXR5cGU9bmFtZSkpICsgCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cz1jKDEwMCwwKSwgZXhwYW5kPWMoMCwwKSwgYnJlYWtzPXNlcSgwLDEwMCw1KSkgKwogIGNvb3JkX2ZsaXAoKSArIAogIHRoZW1lX2xpZ2h0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsCiAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfbGluZShzaXplPTAuMiwgY29sb3I9InJlZCIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41LCBzaXplPTEzLjUsIGZhY2U9ImJvbGQiKSwKICAgICAgICBwbG90LmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGZpbGw9IiNlYWQ0YmMiKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9IiNlYWQ0YmMiKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSIjZWFkNGJjIiksCiAgICAgICAgbGVnZW5kLmtleSA9ZWxlbWVudF9yZWN0KGZpbGw9IiNlYWQ0YmMiKSwKICAgICAgICBsZWdlbmQua2V5LndpZHRoPXVuaXQoMi4yLCAiY20iKSwKICAgICAgICBsZWdlbmQuc3BhY2luZz11bml0KDEuNSwgImNtIiksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTguNSksCiAgICAgICAgbGVnZW5kLnRleHQgPWVsZW1lbnRfdGV4dChtYXJnaW49bWFyZ2luKHI9MiwgdW5pdD0iY20iKSksCiAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMjAsIDcwLCAyMCwgNTApCiAgICAgICAgKSArIAogIGxhYnMoeD0iIixsaW5ldHlwZT0iIiwgeT0iUEVSQ0VOVFMiLAogICAgICAgdGl0bGU9IkNPTVBBUkFUSVZFIElOQ1JFQVNFIE9GIFdISVRFIEFORCBDT0xPUkVEXG5QT1BVTEFUSU9OIE9GIEdFT1JHSUEiKQpjMQpgYGAKCgoKIyMjIGNoYWxsZW5nZTAyOiBDb25qdWdhbCBDb25kaXRpb24KKiBzaGFyZWQgb24gdHdpdHRlciAoaHR0cHM6Ly90d2l0dGVyLmNvbS9sZWVvbG5leTMvc3RhdHVzLzEzNjE2MzU4Mjg1OTkwMjk3NjAvcGhvdG8vMSkKYGBge3J9CiMgY2FwaXRhbGl6ZSBjb2wgbmFtZXMKbmFtZXMoY29uanVnYWwpID0gdG91cHBlcihuYW1lcyhjb25qdWdhbCkpCiMgZmlsdGVyIGRhdGEgZm9yIGxhYmVsaW5nIApsYWJlbGRhdGEgPSBjb25qdWdhbCAlPiUgcGl2b3RfbG9uZ2VyKGNvbHM9Mzo1LCB2YWx1ZXNfdG89IkNvdW50IiwgbmFtZXNfdG89IlN0YXR1cyIpICU+JQogIG11dGF0ZShQT1BVTEFUSU9OPSBzdHJfdG9fdXBwZXIoUE9QVUxBVElPTikpICU+JSBhcnJhbmdlKENvdW50KSAlPiUgZmlsdGVyKENvdW50PjEpCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0PTMuNSwgZmlnLndpZHRoPTR9CmNvbmp1Z2FsJT4lIHBpdm90X2xvbmdlcihjb2xzPTM6NSwgdmFsdWVzX3RvPSJDb3VudCIsIG5hbWVzX3RvPSJTdGF0dXMiKSAlPiUKICBtdXRhdGUoUE9QVUxBVElPTj0gc3RyX3RvX3VwcGVyKFBPUFVMQVRJT04pKSAlPiUKICBnZ3Bsb3QoYWVzKHk9ZmN0X3JldihQT1BVTEFUSU9OKSwgCiAgICAgICAgICAgICB4PUNvdW50LCAKICAgICAgICAgICAgIGZpbGw9ZmFjdG9yKFN0YXR1cywgbGV2ZWw9YygiRElWT1JDRUQgQU5EIFdJRE9XRUQiLCJNQVJSSUVEIiwiU0lOR0xFIikpLAogICAgICAgICAgICAgY29sb3I9ZmFjdG9yKFN0YXR1cywgbGV2ZWw9YygiRElWT1JDRUQgQU5EIFdJRE9XRUQiLCJNQVJSSUVEIiwiU0lOR0xFIikpLAogICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoKENvdW50KSwiJSIpKSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIiwgc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gIiM0YTRlNjkiLCB3aWR0aD0wLjUsIHNpemU9MC4yNSkgKwogIGdlb21fdGV4dChkYXRhPWxhYmVsZGF0YSwgcG9zaXRpb24gPSBwb3NpdGlvbl9maWxsKHZqdXN0ID0gMC41KSwgc2l6ZSA9Mi43LCBjb2xvciA9ICJ3aGl0ZSIpICsKICBmYWNldF9ncmlkKEFHRX4uLCBsYWJlbGxlciA9IGxhYmVsX2JvdGgpICsgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIsCiAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMTAsIDQwLCAwLCAyMCksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI2VhZDRiYyIsY29sb3I9IiM0YTRlNjkiKSwKICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLHNpemU9MTIpLAogICAgICAgIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoZmlsbD0iI2VhZDRiYyIsIGNvbG9yPU5BKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9IiNlYWQ0YmMiLCBjb2xvcj1OQSksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI2VhZDRiYyIsIGNvbG9yPU5BKSwKICAgICAgICBsZWdlbmQua2V5ID1lbGVtZW50X3JlY3QoZmlsbD0iI2VhZDRiYyIsIGNvbG9yPU5BKSwKICAgICAgICBsZWdlbmQudGV4dD0gZWxlbWVudF90ZXh0KHNpemU9MTApLAogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICAjcGxvdC50aXRsZS5wb3NpdGlvbiA9ICJwbG90IiwKICAgICAgICB0ZXh0PSBlbGVtZW50X3RleHQoZmFtaWx5PSJ0ZWtvIiksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoaGp1c3Q9MC41LCBzaXplPTIyLCBmYWNlPSJib2xkIikKICAgICAgICApICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM0MjYzNTEiLCIjZjliNDJhIiwiI2RlMmQ0OCIpLAogICAgICAgICAgICAgICAgICAgIGd1aWRlPWd1aWRlX2xlZ2VuZChyZXZlcnNlPVRSVUUpCiAgICAgICAgICAgICAgICAgICAgKSArCiAgbGFicyhjb2xvcj0iIix4PSIiLCBmaWxsPSIiLCB5PSIiLAogICAgICAgdGl0bGU9IkNPTkpVR0FMIENPTkRJVElPTiIpIAogIAogIApgYGAKCiMjIyBjaGFsbGVuZ2UwMjogQ29uanVnYWwgQ29uZGl0aW9uIHYyCiogcmVmZXJlbmNlOiBKdWRpdGggTmV2ZSAoaHR0cHM6Ly90d2l0dGVyLmNvbS9KdWRpdGhOZXZlL3N0YXR1cy8xMzYxODA0NzA1NDU0ODM3NzYxL3Bob3RvLzEpCiogcmVmZXJlbmNlOiBHZW9yZ2lvcyBLYXJhbWFuaXMgKGh0dHBzOi8vdHdpdHRlci5jb20vZ2Vva2FyYW1hbmlzL3N0YXR1cy8xMzYxNzMzMjg3NTY0MTgxNTA3L3Bob3RvLzEpCgpgYGB7cn0KY29uanVnYWwgPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0xNi9jb25qdWdhbC5jc3YnKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTQuNSwgZmlnLndpZHRoPTUuM30KY29uanVnYWwgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKCJTaW5nbGUiLCAiTWFycmllZCIsICJEaXZvcmNlZCBhbmQgV2lkb3dlZCIpLCAKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ2F0ZWdvcnkiLCB2YWx1ZXNfdG8gPSAiUGN0IikgICU+JQogIG11dGF0ZShDYXRlZ29yeT0gc3RyX3RvX3VwcGVyKENhdGVnb3J5KSkgJT4lCmdncGxvdChhZXMoeCA9IFBvcHVsYXRpb24sIHkgPSBQY3QsIGZpbGwgPSBDYXRlZ29yeSkpICsKICBmYWNldF93cmFwKH4gQWdlLCBucm93ID0gMykgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBzdGF0ID0gImlkZW50aXR5Iiwga2V5X2dseXBoID0gZHJhd19rZXlfcG9pbnQsIGNvbG9yPSIjNGE0ZTY5IixzaXplPTAuMjUsd2lkdGg9MC42KSArCiAgZ2VvbV90ZXh0KGFlcyh5ID0gUGN0LCB4ID0gUG9wdWxhdGlvbiwgbGFiZWwgPSBwYXN0ZTAoUGN0LCAiJSIpKSwgCiAgICAgICAgICAgIHNpemUgPSA0LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ZpbGwodmp1c3QgPSAwLjUpLCBmYW1pbHk9Im1vbm8iKSArCiAgZ2VvbV90ZXh0KGFlcyh4ID0gUG9wdWxhdGlvbiwgeSA9IDAsIGxhYmVsID0gdG91cHBlcihQb3B1bGF0aW9uKSksIAogICAgICAgICAgICBoanVzdCA9IDEsIG51ZGdlX3kgPSAtMC4wMiwgZmFtaWx5PSJtb25vIixzaXplPTQuMikgKwogIGdlb21fdGV4dChhZXMoeCA9IDEuNSwgeSA9IDAuMiwgbGFiZWwgPSBzdHJpbmdyOjpzdHJfd3JhcCh0b3VwcGVyKEFnZSksNSkpLCAKICAgICAgICAgICAgaGp1c3QgPSAwLjUsIG51ZGdlX3kgPSAtMC40LCBzdGF0ID0gInVuaXF1ZSIsIGZhbWlseT0ibW9ubyIsIHNpemU9NC4yKSArCiAgY29vcmRfZmxpcCgpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzQyNjM1MSIsIiNmOWI0MmEiLCIjZGUyZDQ4IiksCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygiU0lOR0xFIiwgIk1BUlJJRUQiLCAiRElWT1JDRUQgQU5EIFdJRE9XRUQiKSkgKwogIGxhYnMoZmlsbCA9ICIiKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigyMCwgMjAsIDkwLCAyMCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJtb25vIiksCiAgICAgICAgcGFuZWwuc3BhY2luZy55ID0gdW5pdCgxLjUsICJsaW5lcyIpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNlYWQ0YmMiLCBjb2xvciA9IE5BKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyLCBtYXJnaW49bWFyZ2luKHI9MC40LCB1bml0PSJjbSIpKSwKICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigxMCwzMCwxMCwwKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTIwLGhqdXN0PTAuMykKICAgICAgICApICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNoYXBlID0gMjEsIHNpemUgPSAxNSkpKSArIAogIGxhYnModGl0bGU9IkNPTkpVR0FMIENPTkRJVElPTiIpCmBgYAoKCiMjIyBjaGFsbGVuZ2UwNTogSW5jb21lIGFuZCBFeHBlbmRpdHVyZSBvZiAxNTAgTmVncm8gRmFtaWxpZXMgaW4gQXRsYW50YSwgR0EsIFVTQQoqIHJlZmVyZW5jZTogQW1pbmEgKGh0dHBzOi8vdHdpdHRlci5jb20vaGFycmF0aGFfL3N0YXR1cy8xMzYxNTQxMzc3ODg1MTY3NjE5L3Bob3RvLzIpCiogcmVmZXJlbmNlOiBGbG9yZW5jZSBHYWxsaWVycyAoaHR0cHM6Ly90d2l0dGVyLmNvbS9mbG9yZW5jZWx5ZGlhMTEvc3RhdHVzLzEzNjE3MTMzODQ3NTI4MzI1MjAvcGhvdG8vMSkKCmBgYHtyfQojIHBsb3QKaW5jb21lX3Bsb3QgPSAKaW5jb21lICU+JSAKICBwaXZvdF9sb25nZXIoMzo3KSAlPiUKICBmaWx0ZXIoIWlzLm5hKHZhbHVlKSkgJT4lCiAgZmlsdGVyKHZhbHVlIT0wKSAlPiUgCiAgbXV0YXRlKG5hbWU9dG91cHBlcihuYW1lKSkgJT4lCiAgbXV0YXRlKHRleHRjb2w9IGlmZWxzZShuYW1lPT0iUkVOVCIsIjEiLCIwIikpICU+JQogIGdncGxvdChhZXMoZmlsbD1mYWN0b3IobmFtZSxsZXZlbHMgPSBjKCJPVEhFUiIsICJUQVgiLCAiQ0xPVEhFUyIsICJGT09EIiwgIlJFTlQiKSksIAogICAgICAgICAgICAgICAgICAgICAgICB4PXZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICB5PWZjdF9yZXYoQ2xhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMChyb3VuZCh2YWx1ZSksIiUiKSksIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBzdGF0ID0gImlkZW50aXR5IiwgY29sb3IgPSAiIzQ5NTA1NyIsIHdpZHRoPTAuNywgc2l6ZT0wLjIpICsKICBnZW9tX3RleHQoYWVzKGNvbG9yPXRleHRjb2wpLHBvc2l0aW9uID0gcG9zaXRpb25fZmlsbCh2anVzdCA9IDAuNSksIHNpemUgPTMsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3RleHQoYWVzKHggPSAxLjA3LCB5PUNsYXNzLCBsYWJlbCA9IGFzLmNoYXJhY3RlcihgQWN0dWFsIEF2ZXJhZ2VgKSksIHZqdXN0PTAuNSwgY29sb3I9IiM0NjNmM2EiLCBmYW1pbHk9Im1vbm8iLHNpemU9MykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIiwKICAgICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigyMCwgNDAsIDAsIDIwKSwKICAgICAgICBwbG90LmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGZpbGw9IiNlYWQ0YmMiLCBjb2xvcj1OQSksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSIjZWFkNGJjIiwgY29sb3I9TkEpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9IiNlYWQ0YmMiKSwKICAgICAgICBsZWdlbmQua2V5ID1lbGVtZW50X3JlY3QoZmlsbD0iI2VhZDRiYyIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJtb25vIiksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueS5sZWZ0PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwbG90LnRpdGxlLnBvc2l0aW9uID0gInBsb3QiLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIuMiksCiAgICAgICAgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnRleHQgPWVsZW1lbnRfdGV4dChtYXJnaW49bWFyZ2luKHI9MC44MiwgdW5pdD0iY20iKSksCiAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oMCwyNCwwLDApLAogICAgICAgIGxlZ2VuZC5ib3gubWFyZ2luPW1hcmdpbigxMCwwLC01LDApCiAgICAgICAgKSsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2NiZGZiZCIsIiM4ZTlhYWYiLCIjZDc4ODc5IiwiI2EwODI5NCIsIiMxNjEyMTMiKSwgZ3VpZGU9Z3VpZGVfbGVnZW5kKHJldmVyc2U9VFJVRSkpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibGFjayIsIndoaXRlIikpICsKICBsYWJzKGZpbGw9IiIsIHg9IiIsIHk9ImV4YW1wbGUiLAogICAgICAgdGl0bGU9IklOQ09NRSBBTkQgRVhQRU5ESVRVUkUgT0YgMTUwIE5FR1JPIEZBTUlMSUVTIElOIEFUTEFOVEEsIEdBLixVLlMuQSIpCmBgYAoKYGBge3J9CiMgYW5ub3RhdGUgbGVmdCBhbmQgcmlnaHQgbGFiZWxzCmluY29tZV9wbG90ICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBleHBhbnNpb24oYWRkPTEpKSArCiAgZHJhd190ZXh0KCJBQ1RVQUxcbkFWRVJBR0UoJCkiLCB4ID0gMS4wNywgeSA9IDcuNywgZmFtaWx5ID0gIm1vbm8iLCBzaXplID0gNi44KSArIAogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQ9ZXhwYW5zaW9uKG11bHQ9YygwLjAyLDAuMDUpKSkgKyAKICBsYWJzKHRhZz0iQ0xBU1MiKSArCiAgdGhlbWUocGxvdC50YWcucG9zaXRpb24gPSBjKDAuMDcsIDAuOCksCiAgICAgICAgcGxvdC50YWc9ZWxlbWVudF90ZXh0KGZhbWlseT0ibW9ubyIsc2l6ZT03KSkKYGBgCgoKIyMjIGNoYWxsZW5nZTA3OiBBc3Nlc3NlZCBWYWx1ZSBvZiBIb3VzZWhvbGQgYW5kIEtpdGNoZW4gRnVybml0dXJlIE93bmVkIGJ5IEdlb3JnaWEgTmVncm9lcy4KKiBzaGFyZWQgb24gdHdpdHRlciAoaHR0cHM6Ly90d2l0dGVyLmNvbS9sZWVvbG5leTMvc3RhdHVzLzEzNjE2ODY4MTY0NjI2NzE4NzQvcGhvdG8vMSkKCmBgYHtyfQojIGNyZWF0ZSBsYWJlbHMKZGF0YSA9IGZ1cm5pdHVyZSAlPiUgCiAgcmVuYW1lKFZhbHVlPSAiSG91c2hvbGQgVmFsdWUgKERvbGxhcnMpIikgJT4lIAogIG11dGF0ZShsYWI9cGFzdGUoWWVhciwi4oCUIiwiJCIsVmFsdWUpKQoKZGF0YSRZZWFyID0gYXMuZmFjdG9yKGRhdGEkWWVhcikKCiMgYWRkIGEgYmxhbmsgcm93CmJsYW5rX3Jvd3MgPC0gCiAgZGF0YS5mcmFtZSgKICAgIFllYXI9IiIsCiAgIFZhbHVlID0gMCwKICAgbGFiPSIiKQoKIyBiaW5kIHJvd3MKZ3JhcGhfZGF0YSA9IGJpbmRfcm93cyhkYXRhLCBibGFua19yb3dzKQogIApgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTQsZmlnLndpZHRoPTR9CmdyYXBoX2RhdGEgJT4lIAogIGdncGxvdChhZXMoeD1sYWIsIHk9VmFsdWUpKSArIAogIGdlb21fYmFyKGFlcyhmaWxsPWxhYiksc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0wLjUsYWxwaGE9MC45KSArIAogIGdlb21fdGV4dChoanVzdCA9IDEsIHNpemUgPSAzLjcsCiAgICAgICAgICAgIGNvbG9yID0gIiMzNDNhNDAiLCBmYW1pbHk9Im1vbm8iLAogICAgICAgICAgICBhZXMoIHkgPSAwLAogICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUobGFiLCIgIikpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKwogIHlsaW0oMCwgMTcwMDAwMCkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JlZW4iLCIjZmY1YzhhIiwiIzliYTJiZiIsIiM5YzY2NDQiLCIjZjliNDJhIiwiI2ZmZjFlNiIsIiNkZTJkNDgiKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChmaWxsPSIjZWFkNGJjIiwgY29sb3I9TkEpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI2VhZDRiYyIsIGNvbG9yPU5BKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChoanVzdD0wLjUsIHNpemU9MTgsIGZhbWlseT0ibW9ubyIpLAogICAgICAgIHBsb3QudGl0bGUucG9zaXRpb249InBsb3QiLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMTAsIDQwLCAxMCwgNDApCiAgICAgICAgKSArIAogIGxhYnModGl0bGU9IkFTU0VTU0VEIFZBTFVFIE9GIEhPVVNFSE9MRCBBTkQgS0lUQ0hFTiBGVVJOSVRVUkVcbk9XTkVEIEJZIEdFT1JHSUEgTkVHUk9FUyIsIHg9IiIseT0iIixzdWJ0aXRsZT0iIikKYGBgCgoKIyMjIFJlbGF0aXZlIE5lZ3JvIFBvcHVsYXRpb24gIE9mIFRoZSBTdGF0ZXMgT2YgVGhlIFVuaXRlZCBTdGF0ZXMKKiByZWZlcmVuY2U6IFJlYmVjY2EgU3RldmljayAoaHR0cHM6Ly90d2l0dGVyLmNvbS9yanN0ZXZpY2svc3RhdHVzLzEzNjE3NzM2ODU1NjA5OTk5NDQvcGhvdG8vMSkKCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnJlbF9wb3AgPC0gcmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hanN0YXJrcy9kdWJvaXMtZGF0YS1wb3J0cmFpdHMvbWFzdGVyL3BsYXRlMDIvZGF0YS5jc3YnKQoKcGFsID0gYygiYmxhY2siLCIjNzk3ZDYyIiwiIzliOWI3YSIsIiM4NGE5OGMiLCIjOTVkNWIyIiwiI2Q4ZjNkYyIsIiNmMWRjYTciLCIjZmZjYjY5IiwiI2ZmYjRhMiIpCgpyZWxfcG9wICU+JQogIGxlZnRfam9pbihkYXRhLmZyYW1lKHN0YXRlLmFiYiwgc3RhdGUubmFtZSksIGJ5ID0gYygiU3RhdGUiID0gInN0YXRlLmFiYiIpKSAlPiUKICBtdXRhdGUocmVnaW9uID0gdG9sb3dlcihzdGF0ZS5uYW1lKSwKICAgICAgICAgUG9wdWxhdGlvbiA9IGZhY3RvcihQb3B1bGF0aW9uLGxldmVscyA9IGMoIjc1MCwwMDAgQU5EIE9WRVIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MDAsMDAwIC0gNzUwLDAwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUwMCwwMDAgLSA2MDAsMDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzAwLDAwMCAtIDUwMCwwMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDAsMDAwIC0gMzAwLDAwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwLDAwMCAtIDIwMCwwMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MCwwMDAgLSAxMDAsMDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjUsMDAwIC0gNTAsMDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAsMDAwIC0gMjUsMDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5ERVIgLSAxMCwwMDAiKSkpICU+JQogIGxlZnRfam9pbihtYXBfZGF0YSgic3RhdGUiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IFBvcHVsYXRpb24pKSArCiAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gImdyZXkyMCIsIGx3ZCA9IDAuMiwga2V5X2dseXBoID0gInBvbHlnb24zIikgKyAKICBjb29yZF9maXhlZCgxLjMpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsKSArCiAgdGhlbWVfdm9pZCgpICsgCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJtb25vIiksCiAgICAgICAgcGxvdC50aXRsZS5wb3NpdGlvbiA9ICJwbG90IiwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChoanVzdD0wLjUsIHNpemU9MTYsZmFjZT0iYm9sZCIsIG1hcmdpbj1tYXJnaW4oMCwwLDQwLDApKSwKICAgICAgICBwbG90Lm1hcmdpbj1tYXJnaW4oMjAsMjAsMjAsMjApKSArCiAgbGFicyhmaWxsPSIiLAogICAgICAgdGl0bGU9IlJFTEFUSVZFIE5FR1JPIFBPUFVMQVRJT04gT0YgVEhFIFNUQVRFUyBPRiBUSEVcblVOSVRFRCBTVEFURVMuIikgCiAgCmBgYAoKCg==