Data visualization exercise

TidyTuesday week 13/2021: UN Votes, data comes from Harvard Dataverse by way of Mine Çetinkaya-Rundel, David Robinson, and Nicholas Goguen-Compagnoni.

Original data citation: Erik Voeten “Data and Analyses of Voting in the UN General Assembly” Routledge Handbook of International Organization, edited by Bob Reinalda (published May 27, 2013). Available at SSRN: http://ssrn.com/abstract=2111149

Data:
* unvotes:roll call id(rcid) and 3 variables
* roll_calls: rcid and 8 variables
* issues: rcid and 2 variables

# load library
library(tidyverse)
library(countrycode)
library(lubridate)
library(scales)
library(ggtext)
library(ggstream)
library(ggsci)
library(wesanderson)
# load data 
unvotes <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-03-23/unvotes.csv')

── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  rcid = col_double(),
  country = col_character(),
  country_code = col_character(),
  vote = col_character()
)
roll_calls <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-03-23/roll_calls.csv')

── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  rcid = col_double(),
  session = col_double(),
  importantvote = col_double(),
  date = col_date(format = ""),
  unres = col_character(),
  amend = col_double(),
  para = col_double(),
  short = col_character(),
  descr = col_character()
)
issues <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-03-23/issues.csv')

── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  rcid = col_double(),
  short_name = col_character(),
  issue = col_character()
)
# get region and sub-region 
unvotes = as.data.frame(unvotes)
unvotes$region <- countrycode(sourcevar = unvotes[, "country"],
                            origin = "country.name",
                            destination = "un.region.name")
unvotes$sub_region <- countrycode(sourcevar = unvotes[, "country"],
                            origin = "country.name",
                            destination = "un.regionsub.name")
  
# join unvotes and roll_calls for year 
data = unvotes %>%
  left_join(roll_calls) %>%
  mutate(date2 = ymd(date)) %>%
  mutate(year = year(date2))
head(data)

Belgium: Percentage of UN Yes Votes

# percentage of yes votes: Belgium compared to the rest of Western Europe
# Belgium/Western Europe
data1 = data %>%
  filter(sub_region=="Western Europe") %>%
  group_by(year, country, vote) %>%
  tally() %>% 
  mutate(pct = round(n/sum(n),3)) %>% 
  filter(vote=="yes") %>%
  drop_na() 

bel = data1 %>% filter(country=="Belgium") %>% ungroup()
belother = data1 %>% filter(country!="Belgium") %>% ungroup()

ggplot() + 
  geom_line(data= belother, aes(x=year, y=pct, group = country), colour = alpha("grey", 0.7)) + 
  geom_line(data=bel, aes(x=year, y=pct), color="#5e60ce") +
  theme_minimal(base_size = 10) + 
  theme(plot.margin=unit(c(1,2,1,1),"cm"),
        panel.grid.minor.x=element_blank(),
        plot.title.position = "plot",
        plot.title=element_markdown(face="bold"),
        axis.title=element_text(face="bold"),
        plot.subtitle=element_text(color="#495057")) + 
  scale_y_continuous(label=scales::percent) + 
  scale_x_continuous(breaks=seq(1950,2020,10)) + 
  labs(x="Year",y="Percent",
       caption="TidyTuesday Week 13 | Data from Harvard Dataverse",
       title="<span style = 'color:#5e60ce'><b>Belgium</b></span>: Percentage of UN Yes Votes",
       subtitle= "Compared to other countries in Western Europe, from 1946 to 2019")

Nuclear Disarmament UN Votes

# map data 
world <- map_data("world") %>%   filter(region != "Antarctica") 
# join unvotes with map data
unvotes1 <- unvotes %>%
  filter(rcid==9110) %>%
  left_join(world, by = c('country'='region')) %>%
  rename("Vote"="vote") %>% 
  mutate(Vote= str_to_title(Vote))
# inspired by Juanma_MN (https://twitter.com/Juanma_MN/status/1374125991732334592/photo/1)

p2 <- ggplot() + 
  geom_map(data = world, map = world,
           aes(long, lat, group = group,  map_id = region),
           fill = "white", color = "#889696") +
  geom_map(data =unvotes1, map = world,
           aes(fill = Vote, map_id = country),
           color = "#889696", size = 0.1, alpha = .9) +
  scale_fill_manual(values = c( "No" = "#119da4",
                                "Yes" = "#ffc857",
                                "Abstain"= "#eb6424")) +
  scale_x_continuous(breaks = NULL) + 
  scale_y_continuous(breaks = NULL) +
  labs(x = "",y = "",
       title = "Nuclear Disarmament UN Votes on 2019-12-12",
       caption = "TidyTuesday Week 13 | Data from data from Harvard Dataverse") + 
  theme(legend.position="top", legend.box = "horizontal",
        legend.background = element_rect(fill="white"),
        panel.background=element_rect(fill="white"),
        plot.background=element_rect(fill="white"),
        legend.title = element_text(size=9, face="bold"),
        plot.title=element_text(face="bold"),
        plot.caption=element_text(color="#343a40", size=8),
        legend.justification = "left",
        plot.margin=unit(c(1,1.7,1,1.7),"cm"))

p2 

Issues

# unique issues
unique(issues$issue)
[1] "Palestinian conflict"                 "Nuclear weapons and nuclear material" "Arms control and disarmament"        
[4] "Human rights"                         "Colonialism"                          "Economic development"                
head(issues)
head(roll_calls)
# get dates of issues
issues1 = issues %>% left_join(roll_calls)
Joining, by = "rcid"
# get year 
issues1 %>%
  mutate(date2 = ymd(date)) %>%
  mutate(year = year(date2)) -> issues1
head(issues1)
NA

Number of UN Issues

# issues by year
pal <- wes_palette("Zissou1", 100, type = "continuous")

issues1 %>% 
  group_by(year) %>%
  tally() %>%
  ggplot(aes(x=year, y=n, fill=n)) + 
  #ggbump::geom_bump(aes(x=year, y=n)) + 
  geom_bar(stat="identity") + 
  scale_fill_gradientn(colours = pal) +
  theme_light(base_size=10) + 
  theme(plot.margin=unit(c(1,2,1,1),"cm"), 
        legend.position="none") + 
  labs(x= "Year", y="Count of Issues", 
       title= "Number of UN issues",
       subtitle="1946 to 2019")

UN Issues Categories Over The Years

issues1 %>% 
  group_by(year, issue) %>% 
  tally() %>% 
  rename("Issue"="issue") %>%
  ggplot(aes(year, n, fill=Issue)) + 
  geom_stream(bw=0.5) + 
  #geom_stream_label(aes(label = issue), size=3) +
  scale_fill_manual(values=c("#0091ad","#586ba4","#324376","#f5dd90","#f68e5f","#f65646")) +
  theme_minimal(base_size=10) +
  theme(legend.position="top",
        axis.text.y=element_blank(),
        axis.title=element_blank(),
        panel.grid.major.y=element_blank(),
        panel.grid.minor.y=element_blank(), 
        plot.title=element_text(hjust=0.5),
        plot.margin=unit(c(1,1,1,1),"cm")
        ) + 
  labs(title= "UN Issues Categories Over The Years")

NA
NA

Percentage of UN Issue Category by Year

# percentage
issues1 %>% 
  group_by(year, issue) %>% 
  tally() %>%
  mutate(pct = n/sum(n)) %>%
  rename("Issue"="issue") %>%
  ggplot(aes(x=year, y=pct, fill=Issue)) + 
  geom_bar(stat="identity", width=1, alpha=0.93) + 
  scale_fill_manual(values=c("#0091ad","#586ba4","#324376","#f5dd90","#f68e5f","#f65646")) +
  scale_y_continuous(labels=scales::percent) +
  theme_minimal(base_size=10) +
  theme(legend.position="top",
        plot.margin=unit(c(1,1,1,1),"cm"),
        #legend.title=element_blank(),
        plot.title=element_text(hjust=0.5),
        plot.title.position = "plot",
        panel.grid=element_blank()
        ) + 
  coord_cartesian(expand=FALSE, clip="off") + 
  labs(y="Percentage", x="Year", title="Percentage of UN Issue Category by Year")

Count of Votes from Belgium by Issue

# merge data 
bdata = unvotes %>%
 semi_join(roll_calls, by = "rcid") %>% 
 left_join(roll_calls, by = "rcid") %>%
  left_join(issues, by="rcid") %>%
  filter(country=="Belgium") %>%
  drop_na()

# plot
bdata %>% 
  mutate(issue = fct_lump_n(f = issue, n = 50)) %>% 
  filter(issue != "Other") %>% 
  count(issue, vote) %>%
  #mutate(vote = factor(vote, levels = c("yes", "abstain", "no"), ordered = TRUE)) %>%
  rename("Vote"="vote") %>% 
  mutate(Vote= str_to_title(Vote)) %>%
  ggplot(aes(y=fct_rev(issue), x=n)) + 
  geom_line(aes(group=issue), color="#393E41", alpha=0.9) +
  geom_point(aes(color=factor(Vote, levels = c("No", "Abstain", "Yes"), ordered = TRUE)), size=3) + 
  scale_color_manual(values = c( "Yes" = "#3F88C5",
                                "Abstain" = "#ff7d00",
                                "No"= "#44BBA4")) + 
  scale_x_continuous(breaks=c(75,100,125,150,175)) +
  scale_y_discrete(labels=function(x) str_wrap(x,19)) +
  theme_minimal(base_size=10) + 
  theme(legend.position="none",
        panel.grid.minor.x=element_blank(), 
        plot.margin=unit(c(1,1,1,1),"cm"),
        plot.title.position="plot",
        plot.title=element_text(hjust=0.5),
        plot.subtitle=element_markdown(hjust=0.5),
        axis.text=element_text(size=8.6)
        ) + 
  labs(color="Vote", y=NULL, x=NULL, title="Count of Votes from Belgium by Issue",
       subtitle="<span style = 'color:#44BBA4'><b>No</b></span> | 
       <span style = 'color:#ff7d00'><b>Abstain</b></span> | 
       <span style = 'color:#3F88C5'><b>Yes</b></span>") 

NA
NA
LS0tCnRpdGxlOiAiVU4gVm90ZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIyMgRGF0YSB2aXN1YWxpemF0aW9uIGV4ZXJjaXNlCgpbVGlkeVR1ZXNkYXldKGh0dHBzOi8vZ2l0aHViLmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkpIHdlZWsgMTMvMjAyMTogW1VOIFZvdGVzXShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L2Jsb2IvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAzLTIzL3JlYWRtZS5tZCksIGRhdGEgY29tZXMgZnJvbSBbSGFydmFyZCBEYXRhdmVyc2VdKEhhcnZhcmQncyBEYXRhdmVyc2UpIGJ5IHdheSBvZiBbTWluZSDDh2V0aW5rYXlhLVJ1bmRlbCwgRGF2aWQgUm9iaW5zb24sIGFuZCBOaWNob2xhcyBHb2d1ZW4tQ29tcGFnbm9uaV0oaHR0cHM6Ly9naXRodWIuY29tL2RncnR3by91bnZvdGVzL2Jsb2IvN2ViNzAzNDMxNGZmNzljNDljOWUwNzg1ZmNkOWQyMTZmYTA0Y2YxNC9ERVNDUklQVElPTiNMNikuCgpPcmlnaW5hbCBkYXRhIGNpdGF0aW9uOiAKRXJpayBWb2V0ZW4gIkRhdGEgYW5kIEFuYWx5c2VzIG9mIFZvdGluZyBpbiB0aGUgVU4gR2VuZXJhbCBBc3NlbWJseSIgUm91dGxlZGdlIEhhbmRib29rIG9mIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uLCBlZGl0ZWQgYnkgQm9iIFJlaW5hbGRhIChwdWJsaXNoZWQgTWF5IDI3LCAyMDEzKS4gQXZhaWxhYmxlIGF0IFNTUk46IGh0dHA6Ly9zc3JuLmNvbS9hYnN0cmFjdD0yMTExMTQ5CgpEYXRhOiAgIAoqIHVudm90ZXM6cm9sbCBjYWxsIGlkKHJjaWQpIGFuZCAzIHZhcmlhYmxlcyAgIAoqIHJvbGxfY2FsbHM6IHJjaWQgYW5kIDggdmFyaWFibGVzICAgCiogaXNzdWVzOiByY2lkIGFuZCAyIHZhcmlhYmxlcyAgIAoKYGBge3J9CiMgbG9hZCBsaWJyYXJ5CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGNvdW50cnljb2RlKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoZ2d0ZXh0KQpsaWJyYXJ5KGdnc3RyZWFtKQpsaWJyYXJ5KGdnc2NpKQpsaWJyYXJ5KHdlc2FuZGVyc29uKQpgYGAKCmBgYHtyfQojIGxvYWQgZGF0YSAKdW52b3RlcyA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAzLTIzL3Vudm90ZXMuY3N2JykKcm9sbF9jYWxscyA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAzLTIzL3JvbGxfY2FsbHMuY3N2JykKaXNzdWVzIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDMtMjMvaXNzdWVzLmNzdicpCmBgYAoKYGBge3J9CiMgZ2V0IHJlZ2lvbiBhbmQgc3ViLXJlZ2lvbiAKdW52b3RlcyA9IGFzLmRhdGEuZnJhbWUodW52b3RlcykKdW52b3RlcyRyZWdpb24gPC0gY291bnRyeWNvZGUoc291cmNldmFyID0gdW52b3Rlc1ssICJjb3VudHJ5Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4gPSAiY291bnRyeS5uYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uID0gInVuLnJlZ2lvbi5uYW1lIikKdW52b3RlcyRzdWJfcmVnaW9uIDwtIGNvdW50cnljb2RlKHNvdXJjZXZhciA9IHVudm90ZXNbLCAiY291bnRyeSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luID0gImNvdW50cnkubmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiA9ICJ1bi5yZWdpb25zdWIubmFtZSIpCiAgCmBgYAoKYGBge3J9CiMgam9pbiB1bnZvdGVzIGFuZCByb2xsX2NhbGxzIGZvciB5ZWFyIApkYXRhID0gdW52b3RlcyAlPiUKICBsZWZ0X2pvaW4ocm9sbF9jYWxscykgJT4lCiAgbXV0YXRlKGRhdGUyID0geW1kKGRhdGUpKSAlPiUKICBtdXRhdGUoeWVhciA9IHllYXIoZGF0ZTIpKQpoZWFkKGRhdGEpCmBgYAoKIyMjIyBCZWxnaXVtOiBQZXJjZW50YWdlIG9mIFVOIFllcyBWb3RlcwoqIHNoYXJlZCBvbiBbVHdpdHRlcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9sZWVvbG5leTMvc3RhdHVzLzEzNzQxNTM0ODY5NDI3OTM3MzEvcGhvdG8vMSkKCmBgYHtyfQojIHBlcmNlbnRhZ2Ugb2YgeWVzIHZvdGVzOiBCZWxnaXVtIGNvbXBhcmVkIHRvIHRoZSByZXN0IG9mIFdlc3Rlcm4gRXVyb3BlCiMgQmVsZ2l1bS9XZXN0ZXJuIEV1cm9wZQpkYXRhMSA9IGRhdGEgJT4lCiAgZmlsdGVyKHN1Yl9yZWdpb249PSJXZXN0ZXJuIEV1cm9wZSIpICU+JQogIGdyb3VwX2J5KHllYXIsIGNvdW50cnksIHZvdGUpICU+JQogIHRhbGx5KCkgJT4lIAogIG11dGF0ZShwY3QgPSByb3VuZChuL3N1bShuKSwzKSkgJT4lIAogIGZpbHRlcih2b3RlPT0ieWVzIikgJT4lCiAgZHJvcF9uYSgpIAoKYmVsID0gZGF0YTEgJT4lIGZpbHRlcihjb3VudHJ5PT0iQmVsZ2l1bSIpICU+JSB1bmdyb3VwKCkKYmVsb3RoZXIgPSBkYXRhMSAlPiUgZmlsdGVyKGNvdW50cnkhPSJCZWxnaXVtIikgJT4lIHVuZ3JvdXAoKQoKZ2dwbG90KCkgKyAKICBnZW9tX2xpbmUoZGF0YT0gYmVsb3RoZXIsIGFlcyh4PXllYXIsIHk9cGN0LCBncm91cCA9IGNvdW50cnkpLCBjb2xvdXIgPSBhbHBoYSgiZ3JleSIsIDAuNykpICsgCiAgZ2VvbV9saW5lKGRhdGE9YmVsLCBhZXMoeD15ZWFyLCB5PXBjdCksIGNvbG9yPSIjNWU2MGNlIikgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTApICsgCiAgdGhlbWUocGxvdC5tYXJnaW49dW5pdChjKDEsMiwxLDEpLCJjbSIpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZS5wb3NpdGlvbiA9ICJwbG90IiwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfbWFya2Rvd24oZmFjZT0iYm9sZCIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICBwbG90LnN1YnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iIzQ5NTA1NyIpKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMTk1MCwyMDIwLDEwKSkgKyAKICBsYWJzKHg9IlllYXIiLHk9IlBlcmNlbnQiLAogICAgICAgY2FwdGlvbj0iVGlkeVR1ZXNkYXkgV2VlayAxMyB8IERhdGEgZnJvbSBIYXJ2YXJkIERhdGF2ZXJzZSIsCiAgICAgICB0aXRsZT0iPHNwYW4gc3R5bGUgPSAnY29sb3I6IzVlNjBjZSc+PGI+QmVsZ2l1bTwvYj48L3NwYW4+OiBQZXJjZW50YWdlIG9mIFVOIFllcyBWb3RlcyIsCiAgICAgICBzdWJ0aXRsZT0gIkNvbXBhcmVkIHRvIG90aGVyIGNvdW50cmllcyBpbiBXZXN0ZXJuIEV1cm9wZSwgZnJvbSAxOTQ2IHRvIDIwMTkiKQpgYGAKCiMjIyMgTnVjbGVhciBEaXNhcm1hbWVudCBVTiBWb3RlcwoqIHNoYXJlZCBvbiBbVHdpdHRlcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9sZWVvbG5leTMvc3RhdHVzLzEzNzQxNTM0ODY5NDI3OTM3MzEvcGhvdG8vMikKCmBgYHtyfQojIG1hcCBkYXRhIAp3b3JsZCA8LSBtYXBfZGF0YSgid29ybGQiKSAlPiUgICBmaWx0ZXIocmVnaW9uICE9ICJBbnRhcmN0aWNhIikgCiMgam9pbiB1bnZvdGVzIHdpdGggbWFwIGRhdGEKdW52b3RlczEgPC0gdW52b3RlcyAlPiUKICBmaWx0ZXIocmNpZD09OTExMCkgJT4lCiAgbGVmdF9qb2luKHdvcmxkLCBieSA9IGMoJ2NvdW50cnknPSdyZWdpb24nKSkgJT4lCiAgcmVuYW1lKCJWb3RlIj0idm90ZSIpICU+JSAKICBtdXRhdGUoVm90ZT0gc3RyX3RvX3RpdGxlKFZvdGUpKQpgYGAKCgpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTQuNSwgZmlnLmhlaWdodD0yLjV9CiMgaW5zcGlyZWQgYnkgSnVhbm1hX01OIChodHRwczovL3R3aXR0ZXIuY29tL0p1YW5tYV9NTi9zdGF0dXMvMTM3NDEyNTk5MTczMjMzNDU5Mi9waG90by8xKQoKcDIgPC0gZ2dwbG90KCkgKyAKICBnZW9tX21hcChkYXRhID0gd29ybGQsIG1hcCA9IHdvcmxkLAogICAgICAgICAgIGFlcyhsb25nLCBsYXQsIGdyb3VwID0gZ3JvdXAsICBtYXBfaWQgPSByZWdpb24pLAogICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICIjODg5Njk2IikgKwogIGdlb21fbWFwKGRhdGEgPXVudm90ZXMxLCBtYXAgPSB3b3JsZCwKICAgICAgICAgICBhZXMoZmlsbCA9IFZvdGUsIG1hcF9pZCA9IGNvdW50cnkpLAogICAgICAgICAgIGNvbG9yID0gIiM4ODk2OTYiLCBzaXplID0gMC4xLCBhbHBoYSA9IC45KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyggIk5vIiA9ICIjMTE5ZGE0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWWVzIiA9ICIjZmZjODU3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJzdGFpbiI9ICIjZWI2NDI0IikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCkgKwogIGxhYnMoeCA9ICIiLHkgPSAiIiwKICAgICAgIHRpdGxlID0gIk51Y2xlYXIgRGlzYXJtYW1lbnQgVU4gVm90ZXMgb24gMjAxOS0xMi0xMiIsCiAgICAgICBjYXB0aW9uID0gIlRpZHlUdWVzZGF5IFdlZWsgMTMgfCBEYXRhIGZyb20gZGF0YSBmcm9tIEhhcnZhcmQgRGF0YXZlcnNlIikgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIsIGxlZ2VuZC5ib3ggPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0id2hpdGUiKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChmaWxsPSJ3aGl0ZSIpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoZmlsbD0id2hpdGUiKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT05LCBmYWNlPSJib2xkIiksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoY29sb3I9IiMzNDNhNDAiLCBzaXplPTgpLAogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gImxlZnQiLAogICAgICAgIHBsb3QubWFyZ2luPXVuaXQoYygxLDEuNywxLDEuNyksImNtIikpCgpwMiAKYGBgCgojIyMjIElzc3VlcyAKYGBge3J9CiMgdW5pcXVlIGlzc3Vlcwp1bmlxdWUoaXNzdWVzJGlzc3VlKQpgYGAKCmBgYHtyfQpoZWFkKGlzc3VlcykKaGVhZChyb2xsX2NhbGxzKQpgYGAKCgpgYGB7cn0KIyBnZXQgZGF0ZXMgb2YgaXNzdWVzCmlzc3VlczEgPSBpc3N1ZXMgJT4lIGxlZnRfam9pbihyb2xsX2NhbGxzKQojIGdldCB5ZWFyIAppc3N1ZXMxICU+JQogIG11dGF0ZShkYXRlMiA9IHltZChkYXRlKSkgJT4lCiAgbXV0YXRlKHllYXIgPSB5ZWFyKGRhdGUyKSkgLT4gaXNzdWVzMQpoZWFkKGlzc3VlczEpCmBgYAoKIyMjIyBOdW1iZXIgb2YgVU4gSXNzdWVzICAKYGBge3J9CiMgaXNzdWVzIGJ5IHllYXIKcGFsIDwtIHdlc19wYWxldHRlKCJaaXNzb3UxIiwgMTAwLCB0eXBlID0gImNvbnRpbnVvdXMiKQoKaXNzdWVzMSAlPiUgCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgdGFsbHkoKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhciwgeT1uLCBmaWxsPW4pKSArIAogICNnZ2J1bXA6Omdlb21fYnVtcChhZXMoeD15ZWFyLCB5PW4pKSArIAogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKyAKICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gcGFsKSArCiAgdGhlbWVfbGlnaHQoYmFzZV9zaXplPTEwKSArIAogIHRoZW1lKHBsb3QubWFyZ2luPXVuaXQoYygxLDIsMSwxKSwiY20iKSwgCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikgKyAKICBsYWJzKHg9ICJZZWFyIiwgeT0iQ291bnQgb2YgSXNzdWVzIiwgCiAgICAgICB0aXRsZT0gIk51bWJlciBvZiBVTiBJc3N1ZXMiLAogICAgICAgc3VidGl0bGU9IjE5NDYgdG8gMjAxOSIpCgpgYGAKCiMjIyMgVU4gSXNzdWVzIENhdGVnb3JpZXMgT3ZlciBUaGUgWWVhcnMKYGBge3J9Cmlzc3VlczEgJT4lIAogIGdyb3VwX2J5KHllYXIsIGlzc3VlKSAlPiUgCiAgdGFsbHkoKSAlPiUgCiAgcmVuYW1lKCJJc3N1ZSI9Imlzc3VlIikgJT4lCiAgZ2dwbG90KGFlcyh5ZWFyLCBuLCBmaWxsPUlzc3VlKSkgKyAKICBnZW9tX3N0cmVhbShidz0wLjUpICsgCiAgI2dlb21fc3RyZWFtX2xhYmVsKGFlcyhsYWJlbCA9IGlzc3VlKSwgc2l6ZT0zKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMwMDkxYWQiLCIjNTg2YmE0IiwiIzMyNDM3NiIsIiNmNWRkOTAiLCIjZjY4ZTVmIiwiI2Y2NTY0NiIpKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemU9MTApICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIsCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55PWVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoaGp1c3Q9MC41KSwKICAgICAgICBwbG90Lm1hcmdpbj11bml0KGMoMSwxLDEsMSksImNtIikKICAgICAgICApICsgCiAgbGFicyh0aXRsZT0gIlVOIElzc3VlcyBDYXRlZ29yaWVzIE92ZXIgVGhlIFllYXJzIikKCiAgCmBgYAoKIyMjIyBQZXJjZW50YWdlIG9mIFVOIElzc3VlIENhdGVnb3J5IGJ5IFllYXIKYGBge3J9CiMgcGVyY2VudGFnZQppc3N1ZXMxICU+JSAKICBncm91cF9ieSh5ZWFyLCBpc3N1ZSkgJT4lIAogIHRhbGx5KCkgJT4lCiAgbXV0YXRlKHBjdCA9IG4vc3VtKG4pKSAlPiUKICByZW5hbWUoIklzc3VlIj0iaXNzdWUiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhciwgeT1wY3QsIGZpbGw9SXNzdWUpKSArIAogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9MSwgYWxwaGE9MC45MykgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzAwOTFhZCIsIiM1ODZiYTQiLCIjMzI0Mzc2IiwiI2Y1ZGQ5MCIsIiNmNjhlNWYiLCIjZjY1NjQ2IikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudCkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplPTEwKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJ0b3AiLAogICAgICAgIHBsb3QubWFyZ2luPXVuaXQoYygxLDEsMSwxKSwiY20iKSwKICAgICAgICAjbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChoanVzdD0wLjUpLAogICAgICAgIHBsb3QudGl0bGUucG9zaXRpb24gPSAicGxvdCIsCiAgICAgICAgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCkKICAgICAgICApICsgCiAgY29vcmRfY2FydGVzaWFuKGV4cGFuZD1GQUxTRSwgY2xpcD0ib2ZmIikgKyAKICBsYWJzKHk9IlBlcmNlbnRhZ2UiLCB4PSJZZWFyIiwgdGl0bGU9IlBlcmNlbnRhZ2Ugb2YgVU4gSXNzdWUgQ2F0ZWdvcnkgYnkgWWVhciIpCmBgYAoKIyBDb3VudCBvZiBWb3RlcyBmcm9tIEJlbGdpdW0gYnkgSXNzdWUKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIG1lcmdlIGRhdGEgCmJkYXRhID0gdW52b3RlcyAlPiUKIHNlbWlfam9pbihyb2xsX2NhbGxzLCBieSA9ICJyY2lkIikgJT4lIAogbGVmdF9qb2luKHJvbGxfY2FsbHMsIGJ5ID0gInJjaWQiKSAlPiUKICBsZWZ0X2pvaW4oaXNzdWVzLCBieT0icmNpZCIpICU+JQogIGZpbHRlcihjb3VudHJ5PT0iQmVsZ2l1bSIpICU+JQogIGRyb3BfbmEoKQoKIyBwbG90CmJkYXRhICU+JSAKICBtdXRhdGUoaXNzdWUgPSBmY3RfbHVtcF9uKGYgPSBpc3N1ZSwgbiA9IDUwKSkgJT4lIAogIGZpbHRlcihpc3N1ZSAhPSAiT3RoZXIiKSAlPiUgCiAgY291bnQoaXNzdWUsIHZvdGUpICU+JQogICNtdXRhdGUodm90ZSA9IGZhY3Rvcih2b3RlLCBsZXZlbHMgPSBjKCJ5ZXMiLCAiYWJzdGFpbiIsICJubyIpLCBvcmRlcmVkID0gVFJVRSkpICU+JQogIHJlbmFtZSgiVm90ZSI9InZvdGUiKSAlPiUgCiAgbXV0YXRlKFZvdGU9IHN0cl90b190aXRsZShWb3RlKSkgJT4lCiAgZ2dwbG90KGFlcyh5PWZjdF9yZXYoaXNzdWUpLCB4PW4pKSArIAogIGdlb21fbGluZShhZXMoZ3JvdXA9aXNzdWUpLCBjb2xvcj0iIzM5M0U0MSIsIGFscGhhPTAuOSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yPWZhY3RvcihWb3RlLCBsZXZlbHMgPSBjKCJObyIsICJBYnN0YWluIiwgIlllcyIpLCBvcmRlcmVkID0gVFJVRSkpLCBzaXplPTMpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoICJZZXMiID0gIiMzRjg4QzUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnN0YWluIiA9ICIjZmY3ZDAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8iPSAiIzQ0QkJBNCIpKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9Yyg3NSwxMDAsMTI1LDE1MCwxNzUpKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9ZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwxOSkpICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZT0xMCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueD1lbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBsb3QubWFyZ2luPXVuaXQoYygxLDEsMSwxKSwiY20iKSwKICAgICAgICBwbG90LnRpdGxlLnBvc2l0aW9uPSJwbG90IiwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChoanVzdD0wLjUpLAogICAgICAgIHBsb3Quc3VidGl0bGU9ZWxlbWVudF9tYXJrZG93bihoanVzdD0wLjUpLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT04LjYpCiAgICAgICAgKSArIAogIGxhYnMoY29sb3I9IlZvdGUiLCB5PU5VTEwsIHg9TlVMTCwgdGl0bGU9IkNvdW50IG9mIFZvdGVzIGZyb20gQmVsZ2l1bSBieSBJc3N1ZSIsCiAgICAgICBzdWJ0aXRsZT0iPHNwYW4gc3R5bGUgPSAnY29sb3I6IzQ0QkJBNCc+PGI+Tm88L2I+PC9zcGFuPiB8IAogICAgICAgPHNwYW4gc3R5bGUgPSAnY29sb3I6I2ZmN2QwMCc+PGI+QWJzdGFpbjwvYj48L3NwYW4+IHwgCiAgICAgICA8c3BhbiBzdHlsZSA9ICdjb2xvcjojM0Y4OEM1Jz48Yj5ZZXM8L2I+PC9zcGFuPiIpIAoKICAKYGBgCg==