A glance to the data
Looking the Data Dictionary related to this data set and the amount of missing values per column, it helps us to keep just a few important columns for the visualization stage. Those columns (the ones that I will kept for the TidyTuesday visualization) are: * char: Name of the speaking character. * char_type:Either Person or Computer * line: The complete line of dialog (may contain more speech than the speech interaction). Parenthetical are directions and not spoken. * type: The type of interaction, see detailed definitions below. * pri_type: The primary interaction type as defined by the below ranking. * domain: The domain of interaction, see detailed definitions below. * sub_domain: The sub-domain of interaction, generally a specific setting, see below. * interaction: The actual speech interaction. May be shorter or longer than the line of dialog.
I will discard is_fedand error because their distribution is always the same: TRUE and FALSE respectively.
ggarrange(chart_intro, chart_miss, ncol = 2, heights = c(10, 10))

# Top 10 speakers: included computer voice
talkers <- head(
computer %>%
group_by(char) %>%
count(sort = TRUE),10)$char
# Chart 1: Interactions
interactions <- head(computer %>% filter(char != 'Computer Voice') %>%
group_by(char) %>%
count(sort = TRUE),10)
interactions$char <- factor(interactions$char, levels = interactions$char[order(interactions$n)])
colnames(interactions) <- c('Character', 'Interactions')
# Chart 2: Wordclouds
textcleaned <- computer %>%
unnest_tokens(word, interaction) %>%
anti_join(get_stopwords(source = "snowball"))
Joining, by = "word"
df_wordcloud <- textcleaned %>% group_by(word) %>% count(sort = TRUE)
# Chart 3: Waffles
interactions_pct <- computer %>%
filter(char %in% talkers) %>%
group_by (char, type) %>%
summarise (n=n()) %>%
mutate(rel.freq = paste0(round(100 * n/sum(n), 0), "%"))
`summarise()` has grouped output by 'char'. You can override using the `.groups` argument.
backgroundcolor <- "#264653"
solidchartcolor <- "#e9c46a"
gridlines <- "#006d77"
# Chart 1: Interactions
chartinteractions<-
ggplot(data=interactions, aes(x=Character, y=Interactions)) +
geom_chicklet(stat="identity", color=solidchartcolor, fill=solidchartcolor, width = 0.75, radius = grid::unit(1, 'mm'))+
geom_text(aes(label=Interactions), hjust=1.6,vjust= 0.5, color=backgroundcolor, size=3.5)+
theme(
axis.text.x = element_text(colour = 'white'),
axis.title.x = element_text(colour = 'white'),
axis.text.y = element_text(colour = 'white'),
axis.title.y = element_text(colour = 'white'),
panel.background = element_rect(fill = backgroundcolor, colour = backgroundcolor, linetype = "solid"),
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = gridlines),
panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = gridlines),
plot.background = element_rect(fill = backgroundcolor),
plot.title = element_text(colour="white"),
plot.margin = unit(c(1,1,1,1), "cm")
)+
ggtitle("Users with more interactions")+
coord_flip()
Warning: Ignoring unknown parameters: stat
chartinteractions2<-
ggplot() +
theme(
axis.text.x = element_text(colour = 'white'),
axis.title.x = element_text(colour = 'white'),
axis.text.y = element_text(colour = 'white'),
axis.title.y = element_text(colour = 'white'),
panel.background = element_rect(fill = backgroundcolor, colour = backgroundcolor, linetype = "solid"),
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = gridlines),
panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = gridlines),
plot.background = element_rect(fill = backgroundcolor),
plot.title = element_text(colour="white"),
plot.margin = unit(c(1,1,1,1), "cm")
)+
coord_flip()
wordcloudchart <- wordcloud(words = df_wordcloud$word ,
freq = df_wordcloud$n,
min.freq = 1,max.words=200,
random.order=FALSE,
rot.per=0.35,
colors=brewer.pal(8, "Dark2")
)

library(waffle)
generatewaffle <- function(df,t,rows){
wdata <- df %>% filter(char == t)
wdata
fig <- ggplot(wdata, aes(fill = type, values = n)) +
geom_waffle(n_rows = rows, size = 0.33, colour = "white") +
theme(
axis.text.x = element_text(colour = 'white'),
axis.title.x = element_blank(),
axis.text.y = element_text(colour = 'white'),
axis.title.y = element_blank(),
panel.background = element_rect(fill = backgroundcolor, colour = backgroundcolor, linetype = "solid"),
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = backgroundcolor),
panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = backgroundcolor),
plot.background = element_rect(fill = backgroundcolor),
plot.title = element_text(colour="white"),
legend.background = element_rect(colour = "transparent", fill = backgroundcolor),
legend.title = element_text(color = backgroundcolor),
legend.text = element_text(color = "white"),
legend.key = element_rect(fill = backgroundcolor, color = NA),
)+
ggtitle(paste0(t,": Types of interaction"))
return(fig)
}
fig1 <- generatewaffle(interactions_pct, "Computer Voice", 20)
fig2 <- generatewaffle(interactions_pct, "Geordi", 20)
fig3 <- generatewaffle(interactions_pct, "Picard", 20)
fig4 <- generatewaffle(interactions_pct, "Data",10)
fig5 <- generatewaffle(interactions_pct, "Riker", 10)
fig6 <- generatewaffle(interactions_pct, "Beverly", 10)
library(ggpubr)
ggarrange(
ggarrange(chartinteractions,fig1, ncol=2),
ggarrange(fig2, fig3, ncol=2),
ggarrange(fig4, fig5, fig6, ncol=3),
nrow=3,
solidchartcolor='red'
)
Warning in as_grob.default(plot) :
Cannot convert object of class character into a grob.
$`1`
$`2`
attr(,"class")
[1] "list" "ggarrange"


LS0tCnRpdGxlOiAiQW5hbHlzaXMgU3RhcmsgVHJlayBDb21tYW5kcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoqKlRpZHlUdWVzZGF5IFByb2plY3QgKDIxMDgxNykqKgogCj4gIC0g8J+TsSBMaW5rZWRpbiBbSnVhbiBBbnRvbmlvIENhYmV6YSBTb3VzYQpdKGh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qdWFuLWFudG9uaW8tY2FiZXphLXNvdXNhLTViOTU0OTY4LykKPiAgLSDwn5OsIEVtYWlsOiAganVhYW5jYWJzb3VAZ21haWwuY29tCj4gIC0g8J+Wpe+4jyBUd2l0dGVyOiBAW0FjZWNvbmhpZWxvXShodHRwczovL3R3aXR0ZXIuY29tL0FjZWNvbmhpZWxvKQoKClRoaXMgbm90ZWJvb2sgaXMgYWJvdXQgKkFuYWx5c2luZyBTdGFyIFRyZWsgQ29tbWFuZHMqLlRoZSBkYXRhIHRoaXMgd2VlayBjb21lcyBmcm9tIFtTcGVlY2hJbnRlcmFjdGlvbi5vcmddKGh0dHA6Ly93d3cuc3BlZWNoaW50ZXJhY3Rpb24ub3JnL1RORy8pLgoKYGBge3IgR2V0RGF0YSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KdHVlc2RhdGEgPC0gdGlkeXR1ZXNkYXlSOjp0dF9sb2FkKCcyMDIxLTA4LTE3JykKdHVlc2RhdGEgPC0gdGlkeXR1ZXNkYXlSOjp0dF9sb2FkKDIwMjEsIHdlZWsgPSAzNCkKY29tcHV0ZXIgPC0gdHVlc2RhdGEkY29tcHV0ZXIKYGBgCgpgYGB7ciBMaWJyYXJpZXMsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KERhdGFFeHBsb3JlcikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkoZ2djaGlja2xldCkKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeSh0bSkKbGlicmFyeSh3b3JkY2xvdWQpCmxpYnJhcnkod2FmZmxlKQpsaWJyYXJ5KGdncHVicikKCgpgYGAKCgojIEEgZ2xhbmNlIHRvIHRoZSBkYXRhCgpMb29raW5nIHRoZSAqRGF0YSBEaWN0aW9uYXJ5KiByZWxhdGVkIHRvIHRoaXMgZGF0YSBzZXQgYW5kIHRoZSBhbW91bnQgb2YgbWlzc2luZyB2YWx1ZXMgcGVyIGNvbHVtbiwgaXQgaGVscHMgdXMgdG8ga2VlcCBqdXN0IGEgZmV3IGltcG9ydGFudCBjb2x1bW5zIGZvciB0aGUgdmlzdWFsaXphdGlvbiBzdGFnZS4gVGhvc2UgY29sdW1ucyAodGhlIG9uZXMgdGhhdCBJIHdpbGwga2VwdCBmb3IgdGhlIFRpZHlUdWVzZGF5IHZpc3VhbGl6YXRpb24pIGFyZToKKiBgY2hhcmA6IE5hbWUgb2YgdGhlIHNwZWFraW5nIGNoYXJhY3Rlci4KKiBgY2hhcl90eXBlYDpFaXRoZXIgUGVyc29uIG9yIENvbXB1dGVyCiogYGxpbmVgOiBUaGUgY29tcGxldGUgbGluZSBvZiBkaWFsb2cgKG1heSBjb250YWluIG1vcmUgc3BlZWNoIHRoYW4gdGhlIHNwZWVjaCBpbnRlcmFjdGlvbikuIFBhcmVudGhldGljYWwgYXJlIGRpcmVjdGlvbnMgYW5kIG5vdCBzcG9rZW4uCiogYHR5cGVgOiBUaGUgdHlwZSBvZiBpbnRlcmFjdGlvbiwgc2VlIGRldGFpbGVkIGRlZmluaXRpb25zIGJlbG93LgoqIGBwcmlfdHlwZWA6IFRoZSBwcmltYXJ5IGludGVyYWN0aW9uIHR5cGUgYXMgZGVmaW5lZCBieSB0aGUgYmVsb3cgcmFua2luZy4KKiBgZG9tYWluYDogVGhlIGRvbWFpbiBvZiBpbnRlcmFjdGlvbiwgc2VlIGRldGFpbGVkIGRlZmluaXRpb25zIGJlbG93LgoqIGBzdWJfZG9tYWluYDogVGhlIHN1Yi1kb21haW4gb2YgaW50ZXJhY3Rpb24sIGdlbmVyYWxseSBhIHNwZWNpZmljIHNldHRpbmcsIHNlZSBiZWxvdy4KKiBgaW50ZXJhY3Rpb25gOiBUaGUgYWN0dWFsIHNwZWVjaCBpbnRlcmFjdGlvbi4gTWF5IGJlIHNob3J0ZXIgb3IgbG9uZ2VyIHRoYW4gdGhlIGxpbmUgb2YgZGlhbG9nLgoKSSB3aWxsIGRpc2NhcmQgYGlzX2ZlZGBhbmQgYGVycm9yYCBiZWNhdXNlIHRoZWlyIGRpc3RyaWJ1dGlvbiBpcyBhbHdheXMgdGhlIHNhbWU6IFRSVUUgYW5kIEZBTFNFIHJlc3BlY3RpdmVseS4gCgpgYGB7ciBFREFXUkFOR0xJTkcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmNoYXJ0X2ludHJvIDwtIHBsb3RfaW50cm8oY29tcHV0ZXIpCmNoYXJ0X21pc3MgPC0gcGxvdF9taXNzaW5nKGNvbXB1dGVyKQpgYGAKCmBgYHtyIEVEQUNIQVJUUyxmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMix9CmdnYXJyYW5nZShjaGFydF9pbnRybywgY2hhcnRfbWlzcywgbmNvbCA9IDIsIGhlaWdodHMgPSBjKDEwLCAxMCkpCmBgYApgYGB7ciBJbmZvZ3JhcGhpY3MgRGF0YXNldHMgR2VuZXJhdG9yLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFRvcCAxMCBzcGVha2VyczogaW5jbHVkZWQgY29tcHV0ZXIgdm9pY2UKdGFsa2VycyA8LSBoZWFkKAogIGNvbXB1dGVyICU+JSAKICBncm91cF9ieShjaGFyKSAlPiUKICBjb3VudChzb3J0ID0gVFJVRSksMTApJGNoYXIKCiMgQ2hhcnQgMTogSW50ZXJhY3Rpb25zCmludGVyYWN0aW9ucyA8LSBoZWFkKGNvbXB1dGVyICU+JSBmaWx0ZXIoY2hhciAhPSAnQ29tcHV0ZXIgVm9pY2UnKSAlPiUKICBncm91cF9ieShjaGFyKSAlPiUKICBjb3VudChzb3J0ID0gVFJVRSksMTApCgppbnRlcmFjdGlvbnMkY2hhciA8LSBmYWN0b3IoaW50ZXJhY3Rpb25zJGNoYXIsIGxldmVscyA9IGludGVyYWN0aW9ucyRjaGFyW29yZGVyKGludGVyYWN0aW9ucyRuKV0pCmNvbG5hbWVzKGludGVyYWN0aW9ucykgPC0gYygnQ2hhcmFjdGVyJywgJ0ludGVyYWN0aW9ucycpCgojIENoYXJ0IDI6IFdvcmRjbG91ZHMKdGV4dGNsZWFuZWQgPC0gY29tcHV0ZXIgJT4lCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBpbnRlcmFjdGlvbikgJT4lCiAgYW50aV9qb2luKGdldF9zdG9wd29yZHMoc291cmNlID0gInNub3diYWxsIikpCgpkZl93b3JkY2xvdWQgPC0gdGV4dGNsZWFuZWQgJT4lIGdyb3VwX2J5KHdvcmQpICU+JSBjb3VudChzb3J0ID0gVFJVRSkKCiMgQ2hhcnQgMzogV2FmZmxlcwppbnRlcmFjdGlvbnNfcGN0IDwtIGNvbXB1dGVyICU+JQogIGZpbHRlcihjaGFyICVpbiUgdGFsa2VycykgJT4lCiAgZ3JvdXBfYnkgKGNoYXIsIHR5cGUpICU+JQogIHN1bW1hcmlzZSAobj1uKCkpICU+JQogIG11dGF0ZShyZWwuZnJlcSA9IHBhc3RlMChyb3VuZCgxMDAgKiBuL3N1bShuKSwgMCksICIlIikpCmBgYAoKCgpgYGB7ciBJbmZvZ3JhcGhpY3MgQ2hhcnQgR2VuZXJhdG9yfQpiYWNrZ3JvdW5kY29sb3IgPC0gIiMyNjQ2NTMiCnNvbGlkY2hhcnRjb2xvciA8LSAiI2U5YzQ2YSIKZ3JpZGxpbmVzIDwtICIjMDA2ZDc3IgoKCiMgQ2hhcnQgMTogSW50ZXJhY3Rpb25zCmNoYXJ0aW50ZXJhY3Rpb25zPC0KICBnZ3Bsb3QoZGF0YT1pbnRlcmFjdGlvbnMsIGFlcyh4PUNoYXJhY3RlciwgeT1JbnRlcmFjdGlvbnMpKSArCiAgZ2VvbV9jaGlja2xldChzdGF0PSJpZGVudGl0eSIsIGNvbG9yPXNvbGlkY2hhcnRjb2xvciwgZmlsbD1zb2xpZGNoYXJ0Y29sb3IsIHdpZHRoID0gMC43NSwgcmFkaXVzID0gZ3JpZDo6dW5pdCgxLCAnbW0nKSkrCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1JbnRlcmFjdGlvbnMpLCBoanVzdD0xLjYsdmp1c3Q9IDAuNSwgY29sb3I9YmFja2dyb3VuZGNvbG9yLCBzaXplPTMuNSkrCiAgdGhlbWUoCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAnd2hpdGUnKSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAnd2hpdGUnKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICd3aGl0ZScpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICd3aGl0ZScpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gYmFja2dyb3VuZGNvbG9yLCBjb2xvdXIgPSBiYWNrZ3JvdW5kY29sb3IsIGxpbmV0eXBlID0gInNvbGlkIiksCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUsIGxpbmV0eXBlID0gJ3NvbGlkJywgY29sb3VyID0gZ3JpZGxpbmVzKSwgCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjI1LCBsaW5ldHlwZSA9ICdzb2xpZCcsIGNvbG91ciA9IGdyaWRsaW5lcyksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IGJhY2tncm91bmRjb2xvciksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0id2hpdGUiKSwKICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDEsMSwxLDEpLCAiY20iKQogICkrCiAgZ2d0aXRsZSgiVXNlcnMgd2l0aCBtb3JlIGludGVyYWN0aW9ucyIpKwogIGNvb3JkX2ZsaXAoKQoKCmNoYXJ0aW50ZXJhY3Rpb25zMjwtCiAgZ2dwbG90KCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3VyID0gJ3doaXRlJyksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3VyID0gJ3doaXRlJyksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAnd2hpdGUnKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAnd2hpdGUnKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IGJhY2tncm91bmRjb2xvciwgY29sb3VyID0gYmFja2dyb3VuZGNvbG9yLCBsaW5ldHlwZSA9ICJzb2xpZCIpLAogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShzaXplID0gMC41LCBsaW5ldHlwZSA9ICdzb2xpZCcsIGNvbG91ciA9IGdyaWRsaW5lcyksIAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShzaXplID0gMC4yNSwgbGluZXR5cGUgPSAnc29saWQnLCBjb2xvdXIgPSBncmlkbGluZXMpLAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBiYWNrZ3JvdW5kY29sb3IpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9IndoaXRlIiksCiAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwgImNtIikKICApKwogIGNvb3JkX2ZsaXAoKQpgYGAKYGBge3J9CndvcmRjbG91ZGNoYXJ0IDwtIHdvcmRjbG91ZCh3b3JkcyA9IGRmX3dvcmRjbG91ZCR3b3JkICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXEgPSBkZl93b3JkY2xvdWQkbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi5mcmVxID0gMSxtYXgud29yZHM9MjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90LnBlcj0wLjM1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoOCwgIkRhcmsyIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKYGBgCgoKCgoKCmBgYHtyfQpnZW5lcmF0ZXdhZmZsZSA8LSBmdW5jdGlvbihkZix0LHJvd3MpewogIHdkYXRhIDwtIGRmICU+JSBmaWx0ZXIoY2hhciA9PSB0KQogIHdkYXRhCiAgZmlnIDwtIGdncGxvdCh3ZGF0YSwgYWVzKGZpbGwgPSB0eXBlLCB2YWx1ZXMgPSBuKSkgKwogIGdlb21fd2FmZmxlKG5fcm93cyA9IHJvd3MsIHNpemUgPSAwLjMzLCBjb2xvdXIgPSAid2hpdGUiKSArCiAgdGhlbWUoCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAnd2hpdGUnKSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICd3aGl0ZScpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gYmFja2dyb3VuZGNvbG9yLCBjb2xvdXIgPSBiYWNrZ3JvdW5kY29sb3IsIGxpbmV0eXBlID0gInNvbGlkIiksCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUsIGxpbmV0eXBlID0gJ3NvbGlkJywgY29sb3VyID0gYmFja2dyb3VuZGNvbG9yKSwgCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjI1LCBsaW5ldHlwZSA9ICdzb2xpZCcsIGNvbG91ciA9IGJhY2tncm91bmRjb2xvciksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IGJhY2tncm91bmRjb2xvciksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0id2hpdGUiKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ0cmFuc3BhcmVudCIsIGZpbGwgPSBiYWNrZ3JvdW5kY29sb3IpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gYmFja2dyb3VuZGNvbG9yKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIndoaXRlIiksCiAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGZpbGwgPSBiYWNrZ3JvdW5kY29sb3IsIGNvbG9yID0gTkEpLAogICkrCiAgZ2d0aXRsZShwYXN0ZTAodCwiOiBUeXBlcyBvZiBpbnRlcmFjdGlvbiIpKQogIAogIHJldHVybihmaWcpCn0KCmZpZzEgPC0gZ2VuZXJhdGV3YWZmbGUoaW50ZXJhY3Rpb25zX3BjdCwgIkNvbXB1dGVyIFZvaWNlIiwgMjApCmZpZzIgPC0gZ2VuZXJhdGV3YWZmbGUoaW50ZXJhY3Rpb25zX3BjdCwgIkdlb3JkaSIsIDIwKQpmaWczIDwtIGdlbmVyYXRld2FmZmxlKGludGVyYWN0aW9uc19wY3QsICJQaWNhcmQiLCAyMCkKZmlnNCA8LSBnZW5lcmF0ZXdhZmZsZShpbnRlcmFjdGlvbnNfcGN0LCAiRGF0YSIsMTApCmZpZzUgPC0gZ2VuZXJhdGV3YWZmbGUoaW50ZXJhY3Rpb25zX3BjdCwgIlJpa2VyIiwgMTApCmZpZzYgPC0gZ2VuZXJhdGV3YWZmbGUoaW50ZXJhY3Rpb25zX3BjdCwgIkJldmVybHkiLCAxMCkKCmBgYAoKCmBgYHtyICxmaWcuaGVpZ2h0PTE1LCBmaWcud2lkdGg9MTIsfQoKZ2dhcnJhbmdlKAogIGdnYXJyYW5nZShjaGFydGludGVyYWN0aW9ucyxmaWcxLCBuY29sPTIpLAogIGdnYXJyYW5nZShmaWcyLCBmaWczLCBuY29sPTIpLAogIGdnYXJyYW5nZShmaWc0LCBmaWc1LCBmaWc2LCBuY29sPTMpLAogIG5yb3c9MywKICBzb2xpZGNoYXJ0Y29sb3I9J3JlZCcKKQoKYGBgCgo=