TidyTuesday week 42 Global Seafood, data from OurWorldinData.org.

Datasets:
* aquaculture-farmed-fish-production.csv
* capture-fisheries-vs-aquaculture.csv
* capture-fishery-production.csv
* fish-and-seafood-consumption-per-capita.csv
* fish-stocks-within-sustainable-levels.csv
* global-fishery-catch-by-sector.csv
* seafood-and-fish-production-thousand-tonnes.csv

library(tidyverse)
library(ggtext)
library(countrycode)
library(janitor)
library(ggrepel)

Fish Stocks

stock <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-10-12/fish-stocks-within-sustainable-levels.csv') %>% clean_names()
theme1 = theme_minimal(base_size = 9, base_family = "Roboto") +
  theme(legend.position = "top",
        panel.grid.minor=element_blank(),
        plot.title=element_text(face="bold", size=14),
        plot.title.position = "plot",
        axis.text=element_text(size=6.5),
        panel.grid=element_line(size=.2),
        plot.margin = unit(c(.75, 1, .3, .75), "cm"),
        axis.title=element_text(size=7.5),
        plot.subtitle=element_text(lineheight = 1.4),
        plot.caption.position = "plot",
        plot.caption=element_text(size=6.5, hjust=0, margin=margin(t=8), color="grey10")
        ) 
stock %>% filter(code=="OWID_WRL") %>%
  pivot_longer(share_of_fish_stocks_within_biologically_sustainable_levels_fao_2020:share_of_fish_stocks_that_are_overexploited) %>%
  mutate(value2 = ifelse(name=="share_of_fish_stocks_within_biologically_sustainable_levels_fao_2020",-1*value, value)) %>%
  ggplot(aes(x=year, y=value2/100, fill=name)) +
  scale_y_continuous(limits=c(-1,.55), expand=c(0.02,0.02), breaks=seq(-1,.5,0.25), labels=c("100%", "75%", "50%","25%", "0%","25%","50%"),
                     position="right")+
  scale_x_continuous(breaks=c(1974,1980,1990, 2000,2010,2017),expand=c(0.03,0.03)) +
  geom_col(aes(alpha=ifelse(year==1978|year==2017,1,0.55)), show.legend=F) +
  scale_alpha_identity() +
  scale_fill_manual(values=c("#c1121f","#3d5a80")) +
  geom_hline(yintercept = 0) +
  annotate(geom="text",x=1990, y=-.95, label=("Sustainable share"), 
           color="#3d5a80", size=6, alpha=.8, family="Roboto",hjust=0) +
  annotate(geom="text",x=1990, y=.45, label=("Overexploited share"), 
           color="#c1121f", size=6, alpha=.8, family="Roboto",hjust=0) +
  annotate(geom="richtext", label.color=NA, fill=NA,size=2.8, x=2015, y=.53, 
           label="2017: <span style = 'color:#c1121f;'>**34.2%**</span>", family="Roboto") +
  annotate(geom="richtext", label.color=NA, fill=NA,size=2.8, x=1976.5, y=.35, 
           label="1978: <span style = 'color:#c1121f;'>**8.5%**</span>",, family="Roboto") +
  annotate(geom="curve", xend=1978, yend=0.1, x=1976.5, y=.32,color="grey70",arrow=arrow(length = unit(0.1, "cm")),curvature = -0.2) +
  annotate(geom="curve", xend=2017, yend=0.36, x=2015, y=.49,color="grey70",arrow=arrow(length = unit(0.1, "cm")),curvature = -0.2) +
  theme1 +
   labs(y="Share of Fish Stocks", x="Year", 
        title=str_to_upper("Increasing pressures on fish populations"), 
        caption="#TidyTuesday Week 42 | Data from OurWorldinData.org",
        subtitle="More than one-third of global fish stocks are overexploited in 2017.") 

ALT TEXT: Diverging bar plot of global fish stocks displaying sustainable and overexploited share from 1974 to 2017. The plot shows increasing pressures on the global fish population, where 34.2% of the global fish stocks are overexploited in 2017, which is a significant increase from the 8.5% in 1978.

Wild fish catch vs aquaculture production

captured_vs_farmed <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-10-12/capture-fisheries-vs-aquaculture.csv') %>% clean_names()
reg = c("World","East Asia & Pacific","Europe & Central Asia","Latin America & Caribbean","Middle East & North Africa",
  "North America","South Asia","Sub-Saharan Africa")
captured_vs_farmed %>% filter(entity %in% reg) %>% 
  pivot_longer(4:5) %>%
  mutate(value = value/1000000) %>%
  ggplot(aes(x=year, y=value, color=name)) +
  geom_line(size=.55) +
  facet_wrap(~factor(entity, levels=reg), scales="free", ncol=4) +
  scale_x_continuous(breaks=c(1960,1980,2000,2018)) +
  scale_color_manual(values=c("#289f9d","#fae588")) +
  theme_minimal(base_size = 8, base_family = "Roboto Condensed") +
  theme(legend.position = "none",
        axis.line=element_line(size=.2,color="white"),
        axis.text=element_text(color="white"),
        axis.title=element_text(color="white"),
        panel.grid=element_blank(),
        axis.ticks=element_line(size=.2, color="white"),
        strip.text=element_text(size=8,color="white"),
        plot.margin = unit(c(.75, 1.5, .75, .75), "cm"),
        plot.subtitle = element_text(color="white", family="Roboto", size=7),
        panel.spacing = unit(1.5, "lines"),
        plot.background=element_rect(color=NA, fill="#1A2E40"),
        plot.title=element_markdown(size=13, color="white", family="Roboto"),
        plot.caption = element_text(color="white")
        ) +
  labs(title="Seafood production: <span style = 'color:#fae588;'>capture fisheries</span> vs <span style = 'color:#289f9d;'>aquaculture production</span>",
       subtitle="From 1960 to 2018. Aquaculture is the farming of aquatic organisms including fish, molluscs, crustaceans and aquatic plants. Capture fishery\nproduction is the volume of wild fish catches landed for all commercial, industrial, recreational and subsistence purposes.\n",
       caption="Data source: OurWorldinData.org",
       y="Volume (million metric tons)", x="Year")

Global fishery catch by sector

fishery <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-10-12/global-fishery-catch-by-sector.csv',show_col_types = FALSE)
f1 = fishery %>% summarise(across(4:8, sum)) %>%
  pivot_longer(everything()) %>% 
  arrange(value) %>%
  mutate(name=fct_inorder(name))
themef =
  theme_minimal(base_size = 8, base_family = "Roboto") +
  theme(panel.grid.major.x=element_blank(),
        panel.grid.minor=element_blank(),
        panel.grid=element_line(linetype="dotted",color="grey50", size=.2),
        axis.ticks.x=element_line(color="grey50", size=.2),
        axis.title=element_text(size=6.5),
        plot.subtitle = element_text(size=7),
        plot.margin = unit(c(.5, .5, .5, .5), "cm"),
        legend.position="top",
        legend.title=element_text(size=7.5),
        plot.title.position="plot",
        plot.title=element_text(size=12),
        plot.caption.position = "plot",
        plot.caption=element_text(hjust=0),
        axis.text.x=element_text(size=6.2,margin=margin(t=3)),
        axis.text.y=element_text(size=6.2),
        legend.key.width = unit(.3,"cm"),
        legend.key.height = unit(.3,"cm")
        ) 
fc1 = fishery %>% pivot_longer(4:8) %>%
  ggplot(aes(x=Year, y=value/1000000, fill=factor(name, levels=f1$name))) +
  geom_area() +
  scale_y_continuous("Volume (million tonnes)",limits=c(0,140), breaks=seq(0,140,20), expand=c(.01,.01)) +
  scale_x_continuous("Year",expand=c(.01,.01)) +
  scale_fill_manual("Purposes",values=c("#fd151b","#437f97","#dcccbb","#ffb30f","#01295f"),labels = function(x) str_wrap(x, width = 20)) +
  guides(fill = guide_legend(override.aes = list(size = 4))) +
  themef +
  labs(title="Global fishery catch by sector", caption="Data source: OurWorldinData.org",
       subtitle="Breakdown of global wild fishery catch by sector. This relates only to wild fishery catch, and does not include aquaculture (fish farming) production.")
fc2 = fishery %>% pivot_longer(4:8) %>%
  ggplot(aes(x=Year, y=value/1000000, color=factor(name, levels=f1$name))) +
  geom_line(show.legend = F) +
  geom_point(size=.3,show.legend = F) +
  scale_y_continuous("Volume (million tonnes)", expand=c(.01,.01), breaks=seq(0,100,20), limits=c(0,100)) +
  scale_x_continuous("Year", expand=c(.01,.01)) +
  scale_color_manual("Purposes",values=c("#fd151b","#437f97","#dcccbb","#ffb30f","#01295f"),labels = function(x) str_wrap(x, width = 20)) 
(fc1 + fc2) +  plot_layout(guides = "collect") & themef

Seafood and fish production

production <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-10-12/seafood-and-fish-production-thousand-tonnes.csv',show_col_types = FALSE) 
cont = c("World","Africa","Americas","Asia","Europe","Oceania")

prod = production %>% #rename_with(~str_remove(., 'commodity_balances_livestock_and_fish_primary_equivalent_')) %>%
  rename("Pelagic Fish "= 4, "Crustaceans"=5,"Cephalopods"=6, "Demersal Fish"=7, "Freshwater Fish"=8, "Molluscs (other)" =9,
  "Marine Fish (other)"=10) 

p1 = prod %>% 
  filter(Entity=="World") %>%
  summarise(across(4:10, sum)) %>%
  pivot_longer(everything()) %>%
  arrange(value) %>% 
  mutate(name=fct_inorder(name))
prod %>% 
  filter(Entity %in% cont) %>%
  pivot_longer(4:10) %>%
  ggplot(aes(x=Year, y=value/1000000, fill=factor(name, levels=p1$name))) +
  geom_area() +
  facet_wrap(~factor(Entity, levels=cont), scales="free", ncol=3) +
  ggsci::scale_fill_npg() +
  scale_y_continuous("Volume (million tonnes)",expand = expansion(mult = c(0, .1))) +
  scale_x_continuous(breaks=c(1961,1980,2000,2013), expand=c(.01,.01)) +
  theme_minimal(base_size = 8, base_family="Roboto") +
  theme(legend.position = "top",
        legend.justification = "left",
        legend.margin=margin(l=-20),
        legend.text=element_text(size=7.5, color="white"),
        legend.key.width = unit(.3,"cm"),
        legend.key.height = unit(.5,"cm"),
        legend.title=element_blank(),
        axis.ticks=element_line(size=.2, color="#ced4da"),
        axis.text.x=element_text(margin=margin(t=3), color="#f8f9fa"),
        axis.text.y=element_text(color="#f8f9fa"),
        axis.title=element_text(color="white"),
        strip.text=element_text(size=9.5, color="white"),
        panel.grid=element_blank(),
        panel.spacing.x = unit(1.3, "lines"),
        panel.spacing.y = unit(.7, "lines"),
        plot.margin = unit(c(.75, 1.25, .75, .75), "cm"),
        plot.title.position = "plot",
        plot.title=element_text(size=13, margin=margin(b=8),color="white"),
        plot.background = element_rect(fill="#14213d", color=NA),
        plot.caption=element_text(color="white")
        ) +
  guides(fill = guide_legend(nrow = 1,reverse=T)) +
  labs(title="Seafood and fish production", caption="Data source: OurWorldinData.org")

Global fish and seafood production

prod2 = prod %>% 
  filter(Entity=="World") %>%
  pivot_longer(4:10) %>%
  group_by(name) %>%
  mutate(total=round(sum(value)/1000000))
  
prod2 %>% ggplot(aes(x=Year, y=reorder(name, value), fill=value/1000000)) +
  annotate(geom= "segment", x=c(1970,1990,2010), xend=c(1970,1990,2010), y=0.3, yend=7.5, color="grey70", size=.2) +
  geom_tile(height=.5, color="white") +
  geom_text(data=prod2 %>% filter(Year==min(Year)), aes(label=name, x=1953), size=3.1,family="sans", color="grey10") +
  geom_text(data=prod2 %>% filter(Year==min(Year)), aes(label=glue::glue("{total}M"), x=1944.5),color="grey10",family="sans", size=3.1, hjust=1) +
  annotate(geom="text", x=c(1953,1944.5,1960.5), y=7.8, label=c("Category","Total","Production by year"), 
           size=3, color="grey45", family="Roboto", hjust=c(.5, 1,0)) +
  #scale_fill_gradientn(colours = wesanderson::wes_palette("Zissou1", 100, type = "continuous"), labels=scales::unit_format(unit = "M")) +
  rcartocolor::scale_fill_carto_c(palette="Fall", labels=scales::unit_format(unit = "M"))+
  scale_x_continuous(limits=c(1943, 2014), breaks=c(1970,1990,2010)) +
  scale_y_discrete(expand = expansion(mult = c(.1, .2))) +
  theme_void(base_family = "sans") +
  theme(plot.margin = unit(c(1, 1.25, 1, 1), "cm"),
        legend.title=element_blank(),
        legend.text=element_text(color="grey45",size=7.5),
        plot.title=element_text(margin=margin(b=7), size=12),
        axis.text.x=element_text(size=7.5, color="grey45"),
        plot.background = element_rect(fill="#f8f9fa", color=NA),
        plot.subtitle=element_text(size=8, color="grey20", margin=margin(b=10))) +
  guides(fill = guide_colorbar(barwidth = unit(.5, "lines"), barheight = unit(10, "lines"))) +
  labs(title= "Global seafood and fish production, in tonnes, 1961 to 2013",subtitle="Data source: OurWorldinData.org")

Fish stocks that are overexploited

stock %>% 
  select(-share_of_fish_stocks_within_biologically_sustainable_levels_fao_2020) %>%
  filter(entity!="World") %>%
  ggplot(aes(x=factor(year), fill=factor(year), y=share_of_fish_stocks_that_are_overexploited)) +
  geom_col(width=.5) +
  geom_text(aes(label=scales::percent(share_of_fish_stocks_that_are_overexploited/100,accuracy=.1)), 
            family="Roboto Condensed", size=2.8, vjust=1.5) +
  facet_wrap(~entity, ncol=5, strip.position = "bottom") +
  scale_fill_manual(values=c("#eca400","#eaf8bf")) +
  scale_y_continuous(limits=c(0,70)) +
  theme_void(base_size = 9, base_family = "Roboto") +
  theme(strip.text=element_text(family="Roboto Condensed", color="white", size=8, margin=margin(t=5)),
        panel.spacing.y = unit(1, "lines"),
        legend.position = "none",
        strip.placement = "outside",
        plot.margin = unit(c(.75, .75, .75, .75), "cm"),
        plot.title=element_markdown(size=12, color="white"),
        plot.background = element_rect(fill="#212529", color=NA),
        plot.subtitle=element_text(color="#f8f9fa", size=7),
        ) +
  labs(title="Share of fish stocks that are overexploited, in <span style = 'color:#eca400;'>2015</span> and <span style = 'color:#eaf8bf;'>2017</span>", 
       subtitle="A key concern for the sustainability of global patterns of seafood consumption has been the overexploitation of wild fish stocks. If the amount of wild fish\nwe catch exceeds the rate at which fish can reproduce and replenish, populations will decline over time. Such populations we would call ‘overexploited’.\n\nData source: OurWorldinData.org")

Capture fishery production by region

cf1 = captured_vs_farmed %>% filter(entity %in% reg) %>% 
  filter(entity!="World") %>%
  mutate(value = capture_fisheries_production_metric_tons/1000000)

cf1 %>%
  ggplot(aes(x=year, y=value, color=entity)) +
  annotate(geom="segment", y=0, yend=0, x=1960, xend=2018, size=.3, color="#343a40") +
  annotate(geom="segment", y=seq(0,40,5), yend=seq(0,40,5),x=1960, xend=2018,size=.2, linetype="dotted", color="grey50") +
  geom_line(show.legend=F) +
  geom_point(size=.5,show.legend=F) +
  geom_text_repel(data = cf1 %>% filter(year==2018),aes(x=2020, y=value, label=entity, color=entity), 
                  hjust=0, size=2.5, show.legend=F, direction="y", family="Roboto") +
  scale_x_continuous("Year",breaks=c(1960,1970,1980,1990,2000,2010,2018), limits=c(1959,2035.5)) +
  scale_y_continuous("Volume (million tonnes)",limits=c(0,45), breaks=seq(0,40,5)) +
  coord_cartesian(expand=F, clip="off") +
  ggsci::scale_color_lancet() +
  theme_minimal(base_size = 8, base_family = "Roboto") +
   theme(panel.grid=element_blank(),
        axis.ticks.x=element_line(color="grey30", size=.3),
        axis.title.x=element_text(size=7.5, hjust=0.403),
        axis.title.y=element_text(size=7.5, margin=margin(r=3)),
        axis.text.x=element_text(margin=margin(t=3)),
        plot.margin = unit(c(.7, 1, .5, 1), "cm"),
        plot.title=element_text(size=13),
        plot.caption=element_text(hjust=0),
        plot.background = element_rect(fill="#f8f9fa", color=NA),
        plot.title.position="plot",
        plot.caption.position = "plot",
        ) +
  labs(title="Capture fishery production",
       subtitle="Capture (wild) fishery production does not include seafood produced from fish farming (aquaculture).",
       caption="Data source: OurWorldinData.org")

Aquaculture proportion

west = c("Austria","Belgium","France","Germany","Netherlands","Switzerland","Liechtenstein","Luxembourg","Monaco") 

cf2 = captured_vs_farmed %>% 
  filter(entity %in% west) %>%
  #filter(year>=1980) %>%
  mutate(prop=aquaculture_production_metric_tons/(aquaculture_production_metric_tons+capture_fisheries_production_metric_tons)) %>%
  drop_na() 
  
cf2 %>%
  ggplot(aes(x=year, y=prop, color=entity)) +
  annotate(geom="segment", y=0, yend=0, x=1960, xend=2018, size=.3, color="#343a40") +
  annotate(geom="segment", y=seq(.25,1,.25), yend=seq(.25,1,.25),x=1960, xend=2018,size=.2, linetype="dotted", color="grey50") +
  geom_line(show.legend = F) +
  geom_point(size=.5,show.legend=F) +
  geom_text_repel(data=cf2 %>% filter(year==2018), aes(label=entity, x=2019.5),
                  size=3, hjust=0, show.legend = F, direction="y", box.padding = 0, nudge_y = .007,family="Roboto") +
  scale_y_continuous("Aquaculture Proportion",limits=c(0,1), expand=c(0,0)) +
  scale_x_continuous("Year",limits=c(1960,2028), breaks=c(1960,1980,2000,2018), expand=c(0.01,0.01)) +
  scale_color_manual(values=c("#01295f","#29715d","#849324","#f95738","#07a0c3","#eca400")) +
  theme_minimal(base_size = 9, base_family = "Roboto") +
   theme(panel.grid=element_blank(),
        axis.ticks.x=element_line(color="grey30", size=.3),
        axis.ticks.length=unit(.15, "cm"),
        axis.title.x=element_text(size=7.5,hjust=0.403),
        axis.title.y=element_text(size=7.5, margin=margin(r=3)),
        axis.text.x=element_text(margin=margin(t=5)),
        plot.margin = unit(c(.7, 1, .5, 1), "cm"),
        plot.subtitle=element_text(margin=margin(b=15), size=8.5),
        plot.caption=element_text(hjust=0),
        plot.caption.position = "plot",
        plot.title=element_text(size=12),
        plot.title.position = "plot",
        #plot.background = element_rect(fill="#f5f3f4", color=NA)
        ) +
  labs(title="Aquaculture Production in Western Europe from 1960 to 2018",
       subtitle="Expressed as Aquaculture production divided by the sum of acquaculture and captured fisheries production",
       caption="Data source: OurWorldinData.org")

LS0tCnRpdGxlOiAiVGlkeVR1ZXNkYXkgV2VlayA0Mi8yMDIxIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpbVGlkeVR1ZXNkYXldKGh0dHBzOi8vZ2l0aHViLmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkpIHdlZWsgNDIgW0dsb2JhbCBTZWFmb29kXShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L2Jsb2IvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTEwLTEyL3JlYWRtZS5tZCksIGRhdGEgZnJvbSBbT3VyV29ybGRpbkRhdGEub3JnXShodHRwczovL291cndvcmxkaW5kYXRhLm9yZy9zZWFmb29kLXByb2R1Y3Rpb24pLgoKRGF0YXNldHM6ICAgCiogYXF1YWN1bHR1cmUtZmFybWVkLWZpc2gtcHJvZHVjdGlvbi5jc3YgICAKKiBjYXB0dXJlLWZpc2hlcmllcy12cy1hcXVhY3VsdHVyZS5jc3YgICAgCiogY2FwdHVyZS1maXNoZXJ5LXByb2R1Y3Rpb24uY3N2ICAgIAoqIGZpc2gtYW5kLXNlYWZvb2QtY29uc3VtcHRpb24tcGVyLWNhcGl0YS5jc3YgICAKKiBmaXNoLXN0b2Nrcy13aXRoaW4tc3VzdGFpbmFibGUtbGV2ZWxzLmNzdiAgIAoqIGdsb2JhbC1maXNoZXJ5LWNhdGNoLWJ5LXNlY3Rvci5jc3YgICAKKiBzZWFmb29kLWFuZC1maXNoLXByb2R1Y3Rpb24tdGhvdXNhbmQtdG9ubmVzLmNzdiAgIAoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdndGV4dCkKbGlicmFyeShjb3VudHJ5Y29kZSkKbGlicmFyeShqYW5pdG9yKQpsaWJyYXJ5KGdncmVwZWwpCmBgYAoKIyMjIEZpc2ggU3RvY2tzIAoqIHNoYXJlZCBvbiBbVHdpdHRlcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9sZWVvbG5leTMvc3RhdHVzLzE0NDc3Nzc1ODg1MjE0MTQ2NTgpCmBgYHtyfQpzdG9jayA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTEwLTEyL2Zpc2gtc3RvY2tzLXdpdGhpbi1zdXN0YWluYWJsZS1sZXZlbHMuY3N2JykgJT4lIGNsZWFuX25hbWVzKCkKYGBgCgpgYGB7cn0KdGhlbWUxID0gdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSA5LCBiYXNlX2ZhbWlseSA9ICJSb2JvdG8iKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MTQpLAogICAgICAgIHBsb3QudGl0bGUucG9zaXRpb24gPSAicGxvdCIsCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTYuNSksCiAgICAgICAgcGFuZWwuZ3JpZD1lbGVtZW50X2xpbmUoc2l6ZT0uMiksCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoLjc1LCAxLCAuMywgLjc1KSwgImNtIiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT03LjUpLAogICAgICAgIHBsb3Quc3VidGl0bGU9ZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQgPSAxLjQpLAogICAgICAgIHBsb3QuY2FwdGlvbi5wb3NpdGlvbiA9ICJwbG90IiwKICAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KHNpemU9Ni41LCBoanVzdD0wLCBtYXJnaW49bWFyZ2luKHQ9OCksIGNvbG9yPSJncmV5MTAiKQogICAgICAgICkgCmBgYAoKYGBge3J9CnN0b2NrICU+JSBmaWx0ZXIoY29kZT09Ik9XSURfV1JMIikgJT4lCiAgcGl2b3RfbG9uZ2VyKHNoYXJlX29mX2Zpc2hfc3RvY2tzX3dpdGhpbl9iaW9sb2dpY2FsbHlfc3VzdGFpbmFibGVfbGV2ZWxzX2Zhb18yMDIwOnNoYXJlX29mX2Zpc2hfc3RvY2tzX3RoYXRfYXJlX292ZXJleHBsb2l0ZWQpICU+JQogIG11dGF0ZSh2YWx1ZTIgPSBpZmVsc2UobmFtZT09InNoYXJlX29mX2Zpc2hfc3RvY2tzX3dpdGhpbl9iaW9sb2dpY2FsbHlfc3VzdGFpbmFibGVfbGV2ZWxzX2Zhb18yMDIwIiwtMSp2YWx1ZSwgdmFsdWUpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhciwgeT12YWx1ZTIvMTAwLCBmaWxsPW5hbWUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKC0xLC41NSksIGV4cGFuZD1jKDAuMDIsMC4wMiksIGJyZWFrcz1zZXEoLTEsLjUsMC4yNSksIGxhYmVscz1jKCIxMDAlIiwgIjc1JSIsICI1MCUiLCIyNSUiLCAiMCUiLCIyNSUiLCI1MCUiKSwKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IikrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDE5NzQsMTk4MCwxOTkwLCAyMDAwLDIwMTAsMjAxNyksZXhwYW5kPWMoMC4wMywwLjAzKSkgKwogIGdlb21fY29sKGFlcyhhbHBoYT1pZmVsc2UoeWVhcj09MTk3OHx5ZWFyPT0yMDE3LDEsMC41NSkpLCBzaG93LmxlZ2VuZD1GKSArCiAgc2NhbGVfYWxwaGFfaWRlbnRpdHkoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNjMTEyMWYiLCIjM2Q1YTgwIikpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIseD0xOTkwLCB5PS0uOTUsIGxhYmVsPSgiU3VzdGFpbmFibGUgc2hhcmUiKSwgCiAgICAgICAgICAgY29sb3I9IiMzZDVhODAiLCBzaXplPTYsIGFscGhhPS44LCBmYW1pbHk9IlJvYm90byIsaGp1c3Q9MCkgKwogIGFubm90YXRlKGdlb209InRleHQiLHg9MTk5MCwgeT0uNDUsIGxhYmVsPSgiT3ZlcmV4cGxvaXRlZCBzaGFyZSIpLCAKICAgICAgICAgICBjb2xvcj0iI2MxMTIxZiIsIHNpemU9NiwgYWxwaGE9LjgsIGZhbWlseT0iUm9ib3RvIixoanVzdD0wKSArCiAgYW5ub3RhdGUoZ2VvbT0icmljaHRleHQiLCBsYWJlbC5jb2xvcj1OQSwgZmlsbD1OQSxzaXplPTIuOCwgeD0yMDE1LCB5PS41MywgCiAgICAgICAgICAgbGFiZWw9IjIwMTc6IDxzcGFuIHN0eWxlID0gJ2NvbG9yOiNjMTEyMWY7Jz4qKjM0LjIlKio8L3NwYW4+IiwgZmFtaWx5PSJSb2JvdG8iKSArCiAgYW5ub3RhdGUoZ2VvbT0icmljaHRleHQiLCBsYWJlbC5jb2xvcj1OQSwgZmlsbD1OQSxzaXplPTIuOCwgeD0xOTc2LjUsIHk9LjM1LCAKICAgICAgICAgICBsYWJlbD0iMTk3ODogPHNwYW4gc3R5bGUgPSAnY29sb3I6I2MxMTIxZjsnPioqOC41JSoqPC9zcGFuPiIsLCBmYW1pbHk9IlJvYm90byIpICsKICBhbm5vdGF0ZShnZW9tPSJjdXJ2ZSIsIHhlbmQ9MTk3OCwgeWVuZD0wLjEsIHg9MTk3Ni41LCB5PS4zMixjb2xvcj0iZ3JleTcwIixhcnJvdz1hcnJvdyhsZW5ndGggPSB1bml0KDAuMSwgImNtIikpLGN1cnZhdHVyZSA9IC0wLjIpICsKICBhbm5vdGF0ZShnZW9tPSJjdXJ2ZSIsIHhlbmQ9MjAxNywgeWVuZD0wLjM2LCB4PTIwMTUsIHk9LjQ5LGNvbG9yPSJncmV5NzAiLGFycm93PWFycm93KGxlbmd0aCA9IHVuaXQoMC4xLCAiY20iKSksY3VydmF0dXJlID0gLTAuMikgKwogIHRoZW1lMSArCiAgIGxhYnMoeT0iU2hhcmUgb2YgRmlzaCBTdG9ja3MiLCB4PSJZZWFyIiwgCiAgICAgICAgdGl0bGU9c3RyX3RvX3VwcGVyKCJJbmNyZWFzaW5nIHByZXNzdXJlcyBvbiBmaXNoIHBvcHVsYXRpb25zIiksIAogICAgICAgIGNhcHRpb249IiNUaWR5VHVlc2RheSBXZWVrIDQyIHwgRGF0YSBmcm9tIE91cldvcmxkaW5EYXRhLm9yZyIsCiAgICAgICAgc3VidGl0bGU9Ik1vcmUgdGhhbiBvbmUtdGhpcmQgb2YgZ2xvYmFsIGZpc2ggc3RvY2tzIGFyZSBvdmVyZXhwbG9pdGVkIGluIDIwMTcuIikgCmBgYApBTFQgVEVYVDogRGl2ZXJnaW5nIGJhciBwbG90IG9mIGdsb2JhbCBmaXNoIHN0b2NrcyBkaXNwbGF5aW5nIHN1c3RhaW5hYmxlIGFuZCBvdmVyZXhwbG9pdGVkIHNoYXJlIGZyb20gMTk3NCB0byAyMDE3LiBUaGUgcGxvdCBzaG93cyBpbmNyZWFzaW5nIHByZXNzdXJlcyBvbiB0aGUgZ2xvYmFsIGZpc2ggcG9wdWxhdGlvbiwgd2hlcmUgMzQuMiUgb2YgdGhlIGdsb2JhbCBmaXNoIHN0b2NrcyBhcmUgb3ZlcmV4cGxvaXRlZCBpbiAyMDE3LCB3aGljaCBpcyBhIHNpZ25pZmljYW50IGluY3JlYXNlIGZyb20gdGhlIDguNSUgaW4gMTk3OC4KCgojIyMgV2lsZCBmaXNoIGNhdGNoIHZzIGFxdWFjdWx0dXJlIHByb2R1Y3Rpb24KCmBgYHtyfQpjYXB0dXJlZF92c19mYXJtZWQgPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0xMC0xMi9jYXB0dXJlLWZpc2hlcmllcy12cy1hcXVhY3VsdHVyZS5jc3YnKSAlPiUgY2xlYW5fbmFtZXMoKQpgYGAKCmBgYHtyfQpyZWcgPSBjKCJXb3JsZCIsIkVhc3QgQXNpYSAmIFBhY2lmaWMiLCJFdXJvcGUgJiBDZW50cmFsIEFzaWEiLCJMYXRpbiBBbWVyaWNhICYgQ2FyaWJiZWFuIiwiTWlkZGxlIEVhc3QgJiBOb3J0aCBBZnJpY2EiLAogICJOb3J0aCBBbWVyaWNhIiwiU291dGggQXNpYSIsIlN1Yi1TYWhhcmFuIEFmcmljYSIpCmBgYAoKYGBge3J9CmNhcHR1cmVkX3ZzX2Zhcm1lZCAlPiUgZmlsdGVyKGVudGl0eSAlaW4lIHJlZykgJT4lIAogIHBpdm90X2xvbmdlcig0OjUpICU+JQogIG11dGF0ZSh2YWx1ZSA9IHZhbHVlLzEwMDAwMDApICU+JQogIGdncGxvdChhZXMoeD15ZWFyLCB5PXZhbHVlLCBjb2xvcj1uYW1lKSkgKwogIGdlb21fbGluZShzaXplPS41NSkgKwogIGZhY2V0X3dyYXAofmZhY3RvcihlbnRpdHksIGxldmVscz1yZWcpLCBzY2FsZXM9ImZyZWUiLCBuY29sPTQpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMTk2MCwxOTgwLDIwMDAsMjAxOCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMyODlmOWQiLCIjZmFlNTg4IikpICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDgsIGJhc2VfZmFtaWx5ID0gIlJvYm90byBDb25kZW5zZWQiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIGF4aXMubGluZT1lbGVtZW50X2xpbmUoc2l6ZT0uMixjb2xvcj0id2hpdGUiKSwKICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJ3aGl0ZSIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJ3aGl0ZSIpLAogICAgICAgIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9saW5lKHNpemU9LjIsIGNvbG9yPSJ3aGl0ZSIpLAogICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9OCxjb2xvcj0id2hpdGUiKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYyguNzUsIDEuNSwgLjc1LCAuNzUpLCAiY20iKSwKICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yPSJ3aGl0ZSIsIGZhbWlseT0iUm9ib3RvIiwgc2l6ZT03KSwKICAgICAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCgxLjUsICJsaW5lcyIpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoY29sb3I9TkEsIGZpbGw9IiMxQTJFNDAiKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfbWFya2Rvd24oc2l6ZT0xMywgY29sb3I9IndoaXRlIiwgZmFtaWx5PSJSb2JvdG8iKSwKICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3I9IndoaXRlIikKICAgICAgICApICsKICBsYWJzKHRpdGxlPSJTZWFmb29kIHByb2R1Y3Rpb246IDxzcGFuIHN0eWxlID0gJ2NvbG9yOiNmYWU1ODg7Jz5jYXB0dXJlIGZpc2hlcmllczwvc3Bhbj4gdnMgPHNwYW4gc3R5bGUgPSAnY29sb3I6IzI4OWY5ZDsnPmFxdWFjdWx0dXJlIHByb2R1Y3Rpb248L3NwYW4+IiwKICAgICAgIHN1YnRpdGxlPSJGcm9tIDE5NjAgdG8gMjAxOC4gQXF1YWN1bHR1cmUgaXMgdGhlIGZhcm1pbmcgb2YgYXF1YXRpYyBvcmdhbmlzbXMgaW5jbHVkaW5nIGZpc2gsIG1vbGx1c2NzLCBjcnVzdGFjZWFucyBhbmQgYXF1YXRpYyBwbGFudHMuIENhcHR1cmUgZmlzaGVyeVxucHJvZHVjdGlvbiBpcyB0aGUgdm9sdW1lIG9mIHdpbGQgZmlzaCBjYXRjaGVzIGxhbmRlZCBmb3IgYWxsIGNvbW1lcmNpYWwsIGluZHVzdHJpYWwsIHJlY3JlYXRpb25hbCBhbmQgc3Vic2lzdGVuY2UgcHVycG9zZXMuXG4iLAogICAgICAgY2FwdGlvbj0iRGF0YSBzb3VyY2U6IE91cldvcmxkaW5EYXRhLm9yZyIsCiAgICAgICB5PSJWb2x1bWUgKG1pbGxpb24gbWV0cmljIHRvbnMpIiwgeD0iWWVhciIpCmBgYAoKIyMjIEdsb2JhbCBmaXNoZXJ5IGNhdGNoIGJ5IHNlY3RvcgpgYGB7cn0KZmlzaGVyeSA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTEwLTEyL2dsb2JhbC1maXNoZXJ5LWNhdGNoLWJ5LXNlY3Rvci5jc3YnLHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmBgYAoKYGBge3J9CmYxID0gZmlzaGVyeSAlPiUgc3VtbWFyaXNlKGFjcm9zcyg0OjgsIHN1bSkpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCkpICU+JSAKICBhcnJhbmdlKHZhbHVlKSAlPiUKICBtdXRhdGUobmFtZT1mY3RfaW5vcmRlcihuYW1lKSkKYGBgCgpgYGB7cn0KdGhlbWVmID0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDgsIGJhc2VfZmFtaWx5ID0gIlJvYm90byIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQ9ZWxlbWVudF9saW5lKGxpbmV0eXBlPSJkb3R0ZWQiLGNvbG9yPSJncmV5NTAiLCBzaXplPS4yKSwKICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9saW5lKGNvbG9yPSJncmV5NTAiLCBzaXplPS4yKSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTYuNSksCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTcpLAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKC41LCAuNSwgLjUsIC41KSwgImNtIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJ0b3AiLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT03LjUpLAogICAgICAgIHBsb3QudGl0bGUucG9zaXRpb249InBsb3QiLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIHBsb3QuY2FwdGlvbi5wb3NpdGlvbiA9ICJwbG90IiwKICAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0PTApLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTYuMixtYXJnaW49bWFyZ2luKHQ9MykpLAogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTYuMiksCiAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoLjMsImNtIiksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KC4zLCJjbSIpCiAgICAgICAgKSAKYGBgCgpgYGB7cn0KZmMxID0gZmlzaGVyeSAlPiUgcGl2b3RfbG9uZ2VyKDQ6OCkgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9dmFsdWUvMTAwMDAwMCwgZmlsbD1mYWN0b3IobmFtZSwgbGV2ZWxzPWYxJG5hbWUpKSkgKwogIGdlb21fYXJlYSgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIlZvbHVtZSAobWlsbGlvbiB0b25uZXMpIixsaW1pdHM9YygwLDE0MCksIGJyZWFrcz1zZXEoMCwxNDAsMjApLCBleHBhbmQ9YyguMDEsLjAxKSkgKwogIHNjYWxlX3hfY29udGludW91cygiWWVhciIsZXhwYW5kPWMoLjAxLC4wMSkpICsKICBzY2FsZV9maWxsX21hbnVhbCgiUHVycG9zZXMiLHZhbHVlcz1jKCIjZmQxNTFiIiwiIzQzN2Y5NyIsIiNkY2NjYmIiLCIjZmZiMzBmIiwiIzAxMjk1ZiIpLGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMjApKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gNCkpKSArCiAgdGhlbWVmICsKICBsYWJzKHRpdGxlPSJHbG9iYWwgZmlzaGVyeSBjYXRjaCBieSBzZWN0b3IiLCBjYXB0aW9uPSJEYXRhIHNvdXJjZTogT3VyV29ybGRpbkRhdGEub3JnIiwKICAgICAgIHN1YnRpdGxlPSJCcmVha2Rvd24gb2YgZ2xvYmFsIHdpbGQgZmlzaGVyeSBjYXRjaCBieSBzZWN0b3IuIFRoaXMgcmVsYXRlcyBvbmx5IHRvIHdpbGQgZmlzaGVyeSBjYXRjaCwgYW5kIGRvZXMgbm90IGluY2x1ZGUgYXF1YWN1bHR1cmUgKGZpc2ggZmFybWluZykgcHJvZHVjdGlvbi4iKQpgYGAKCmBgYHtyfQpmYzIgPSBmaXNoZXJ5ICU+JSBwaXZvdF9sb25nZXIoNDo4KSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT12YWx1ZS8xMDAwMDAwLCBjb2xvcj1mYWN0b3IobmFtZSwgbGV2ZWxzPWYxJG5hbWUpKSkgKwogIGdlb21fbGluZShzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50KHNpemU9LjMsc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJWb2x1bWUgKG1pbGxpb24gdG9ubmVzKSIsIGV4cGFuZD1jKC4wMSwuMDEpLCBicmVha3M9c2VxKDAsMTAwLDIwKSwgbGltaXRzPWMoMCwxMDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJZZWFyIiwgZXhwYW5kPWMoLjAxLC4wMSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoIlB1cnBvc2VzIix2YWx1ZXM9YygiI2ZkMTUxYiIsIiM0MzdmOTciLCIjZGNjY2JiIiwiI2ZmYjMwZiIsIiMwMTI5NWYiKSxsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDIwKSkgCmBgYAoKYGBge3J9CihmYzEgKyBmYzIpICsgIHBsb3RfbGF5b3V0KGd1aWRlcyA9ICJjb2xsZWN0IikgJiB0aGVtZWYKYGBgCgojIyMgU2VhZm9vZCBhbmQgZmlzaCBwcm9kdWN0aW9uCmBgYHtyfQpwcm9kdWN0aW9uIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMTAtMTIvc2VhZm9vZC1hbmQtZmlzaC1wcm9kdWN0aW9uLXRob3VzYW5kLXRvbm5lcy5jc3YnLHNob3dfY29sX3R5cGVzID0gRkFMU0UpIApgYGAKCmBgYHtyfQpjb250ID0gYygiV29ybGQiLCJBZnJpY2EiLCJBbWVyaWNhcyIsIkFzaWEiLCJFdXJvcGUiLCJPY2VhbmlhIikKCnByb2QgPSBwcm9kdWN0aW9uICU+JSAjcmVuYW1lX3dpdGgofnN0cl9yZW1vdmUoLiwgJ2NvbW1vZGl0eV9iYWxhbmNlc19saXZlc3RvY2tfYW5kX2Zpc2hfcHJpbWFyeV9lcXVpdmFsZW50XycpKSAlPiUKICByZW5hbWUoIlBlbGFnaWMgRmlzaCAiPSA0LCAiQ3J1c3RhY2VhbnMiPTUsIkNlcGhhbG9wb2RzIj02LCAiRGVtZXJzYWwgRmlzaCI9NywgIkZyZXNod2F0ZXIgRmlzaCI9OCwgIk1vbGx1c2NzIChvdGhlcikiID05LAogICJNYXJpbmUgRmlzaCAob3RoZXIpIj0xMCkgCgpwMSA9IHByb2QgJT4lIAogIGZpbHRlcihFbnRpdHk9PSJXb3JsZCIpICU+JQogIHN1bW1hcmlzZShhY3Jvc3MoNDoxMCwgc3VtKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSkgJT4lCiAgYXJyYW5nZSh2YWx1ZSkgJT4lIAogIG11dGF0ZShuYW1lPWZjdF9pbm9yZGVyKG5hbWUpKQpgYGAKCmBgYHtyfQpwcm9kICU+JSAKICBmaWx0ZXIoRW50aXR5ICVpbiUgY29udCkgJT4lCiAgcGl2b3RfbG9uZ2VyKDQ6MTApICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PXZhbHVlLzEwMDAwMDAsIGZpbGw9ZmFjdG9yKG5hbWUsIGxldmVscz1wMSRuYW1lKSkpICsKICBnZW9tX2FyZWEoKSArCiAgZmFjZXRfd3JhcCh+ZmFjdG9yKEVudGl0eSwgbGV2ZWxzPWNvbnQpLCBzY2FsZXM9ImZyZWUiLCBuY29sPTMpICsKICBnZ3NjaTo6c2NhbGVfZmlsbF9ucGcoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJWb2x1bWUgKG1pbGxpb24gdG9ubmVzKSIsZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIC4xKSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMTk2MSwxOTgwLDIwMDAsMjAxMyksIGV4cGFuZD1jKC4wMSwuMDEpKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSA4LCBiYXNlX2ZhbWlseT0iUm9ib3RvIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gImxlZnQiLAogICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKGw9LTIwKSwKICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT03LjUsIGNvbG9yPSJ3aGl0ZSIpLAogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KC4zLCJjbSIpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCguNSwiY20iKSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9saW5lKHNpemU9LjIsIGNvbG9yPSIjY2VkNGRhIiksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KG1hcmdpbj1tYXJnaW4odD0zKSwgY29sb3I9IiNmOGY5ZmEiKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9IiNmOGY5ZmEiKSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0id2hpdGUiKSwKICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTkuNSwgY29sb3I9IndoaXRlIiksCiAgICAgICAgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuc3BhY2luZy54ID0gdW5pdCgxLjMsICJsaW5lcyIpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueSA9IHVuaXQoLjcsICJsaW5lcyIpLAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKC43NSwgMS4yNSwgLjc1LCAuNzUpLCAiY20iKSwKICAgICAgICBwbG90LnRpdGxlLnBvc2l0aW9uID0gInBsb3QiLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTMsIG1hcmdpbj1tYXJnaW4oYj04KSxjb2xvcj0id2hpdGUiKSwKICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iIzE0MjEzZCIsIGNvbG9yPU5BKSwKICAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGNvbG9yPSJ3aGl0ZSIpCiAgICAgICAgKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQobnJvdyA9IDEscmV2ZXJzZT1UKSkgKwogIGxhYnModGl0bGU9IlNlYWZvb2QgYW5kIGZpc2ggcHJvZHVjdGlvbiIsIGNhcHRpb249IkRhdGEgc291cmNlOiBPdXJXb3JsZGluRGF0YS5vcmciKQoKYGBgCgojIyMgR2xvYmFsIGZpc2ggYW5kIHNlYWZvb2QgcHJvZHVjdGlvbgpgYGB7cn0KcHJvZDIgPSBwcm9kICU+JSAKICBmaWx0ZXIoRW50aXR5PT0iV29ybGQiKSAlPiUKICBwaXZvdF9sb25nZXIoNDoxMCkgJT4lCiAgZ3JvdXBfYnkobmFtZSkgJT4lCiAgbXV0YXRlKHRvdGFsPXJvdW5kKHN1bSh2YWx1ZSkvMTAwMDAwMCkpCiAgCnByb2QyICU+JSBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1yZW9yZGVyKG5hbWUsIHZhbHVlKSwgZmlsbD12YWx1ZS8xMDAwMDAwKSkgKwogIGFubm90YXRlKGdlb209ICJzZWdtZW50IiwgeD1jKDE5NzAsMTk5MCwyMDEwKSwgeGVuZD1jKDE5NzAsMTk5MCwyMDEwKSwgeT0wLjMsIHllbmQ9Ny41LCBjb2xvcj0iZ3JleTcwIiwgc2l6ZT0uMikgKwogIGdlb21fdGlsZShoZWlnaHQ9LjUsIGNvbG9yPSJ3aGl0ZSIpICsKICBnZW9tX3RleHQoZGF0YT1wcm9kMiAlPiUgZmlsdGVyKFllYXI9PW1pbihZZWFyKSksIGFlcyhsYWJlbD1uYW1lLCB4PTE5NTMpLCBzaXplPTMuMSxmYW1pbHk9InNhbnMiLCBjb2xvcj0iZ3JleTEwIikgKwogIGdlb21fdGV4dChkYXRhPXByb2QyICU+JSBmaWx0ZXIoWWVhcj09bWluKFllYXIpKSwgYWVzKGxhYmVsPWdsdWU6OmdsdWUoInt0b3RhbH1NIiksIHg9MTk0NC41KSxjb2xvcj0iZ3JleTEwIixmYW1pbHk9InNhbnMiLCBzaXplPTMuMSwgaGp1c3Q9MSkgKwogIGFubm90YXRlKGdlb209InRleHQiLCB4PWMoMTk1MywxOTQ0LjUsMTk2MC41KSwgeT03LjgsIGxhYmVsPWMoIkNhdGVnb3J5IiwiVG90YWwiLCJQcm9kdWN0aW9uIGJ5IHllYXIiKSwgCiAgICAgICAgICAgc2l6ZT0zLCBjb2xvcj0iZ3JleTQ1IiwgZmFtaWx5PSJSb2JvdG8iLCBoanVzdD1jKC41LCAxLDApKSArCiAgI3NjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSB3ZXNhbmRlcnNvbjo6d2VzX3BhbGV0dGUoIlppc3NvdTEiLCAxMDAsIHR5cGUgPSAiY29udGludW91cyIpLCBsYWJlbHM9c2NhbGVzOjp1bml0X2Zvcm1hdCh1bml0ID0gIk0iKSkgKwogIHJjYXJ0b2NvbG9yOjpzY2FsZV9maWxsX2NhcnRvX2MocGFsZXR0ZT0iRmFsbCIsIGxhYmVscz1zY2FsZXM6OnVuaXRfZm9ybWF0KHVuaXQgPSAiTSIpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk0MywgMjAxNCksIGJyZWFrcz1jKDE5NzAsMTk5MCwyMDEwKSkgKwogIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKC4xLCAuMikpKSArCiAgdGhlbWVfdm9pZChiYXNlX2ZhbWlseSA9ICJzYW5zIikgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDEuMjUsIDEsIDEpLCAiY20iKSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iZ3JleTQ1IixzaXplPTcuNSksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQobWFyZ2luPW1hcmdpbihiPTcpLCBzaXplPTEyKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT03LjUsIGNvbG9yPSJncmV5NDUiKSwKICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI2Y4ZjlmYSIsIGNvbG9yPU5BKSwKICAgICAgICBwbG90LnN1YnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTgsIGNvbG9yPSJncmV5MjAiLCBtYXJnaW49bWFyZ2luKGI9MTApKSkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSB1bml0KC41LCAibGluZXMiKSwgYmFyaGVpZ2h0ID0gdW5pdCgxMCwgImxpbmVzIikpKSArCiAgbGFicyh0aXRsZT0gIkdsb2JhbCBzZWFmb29kIGFuZCBmaXNoIHByb2R1Y3Rpb24sIGluIHRvbm5lcywgMTk2MSB0byAyMDEzIixzdWJ0aXRsZT0iRGF0YSBzb3VyY2U6IE91cldvcmxkaW5EYXRhLm9yZyIpCmBgYAoKIyMjIEZpc2ggc3RvY2tzIHRoYXQgYXJlIG92ZXJleHBsb2l0ZWQKYGBge3J9CnN0b2NrICU+JSAKICBzZWxlY3QoLXNoYXJlX29mX2Zpc2hfc3RvY2tzX3dpdGhpbl9iaW9sb2dpY2FsbHlfc3VzdGFpbmFibGVfbGV2ZWxzX2Zhb18yMDIwKSAlPiUKICBmaWx0ZXIoZW50aXR5IT0iV29ybGQiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9ZmFjdG9yKHllYXIpLCBmaWxsPWZhY3Rvcih5ZWFyKSwgeT1zaGFyZV9vZl9maXNoX3N0b2Nrc190aGF0X2FyZV9vdmVyZXhwbG9pdGVkKSkgKwogIGdlb21fY29sKHdpZHRoPS41KSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoc2hhcmVfb2ZfZmlzaF9zdG9ja3NfdGhhdF9hcmVfb3ZlcmV4cGxvaXRlZC8xMDAsYWNjdXJhY3k9LjEpKSwgCiAgICAgICAgICAgIGZhbWlseT0iUm9ib3RvIENvbmRlbnNlZCIsIHNpemU9Mi44LCB2anVzdD0xLjUpICsKICBmYWNldF93cmFwKH5lbnRpdHksIG5jb2w9NSwgc3RyaXAucG9zaXRpb24gPSAiYm90dG9tIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjZWNhNDAwIiwiI2VhZjhiZiIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsNzApKSArCiAgdGhlbWVfdm9pZChiYXNlX3NpemUgPSA5LCBiYXNlX2ZhbWlseSA9ICJSb2JvdG8iKSArCiAgdGhlbWUoc3RyaXAudGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJSb2JvdG8gQ29uZGVuc2VkIiwgY29sb3I9IndoaXRlIiwgc2l6ZT04LCBtYXJnaW49bWFyZ2luKHQ9NSkpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueSA9IHVuaXQoMSwgImxpbmVzIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHN0cmlwLnBsYWNlbWVudCA9ICJvdXRzaWRlIiwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYyguNzUsIC43NSwgLjc1LCAuNzUpLCAiY20iKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfbWFya2Rvd24oc2l6ZT0xMiwgY29sb3I9IndoaXRlIiksCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9IiMyMTI1MjkiLCBjb2xvcj1OQSksCiAgICAgICAgcGxvdC5zdWJ0aXRsZT1lbGVtZW50X3RleHQoY29sb3I9IiNmOGY5ZmEiLCBzaXplPTcpLAogICAgICAgICkgKwogIGxhYnModGl0bGU9IlNoYXJlIG9mIGZpc2ggc3RvY2tzIHRoYXQgYXJlIG92ZXJleHBsb2l0ZWQsIGluIDxzcGFuIHN0eWxlID0gJ2NvbG9yOiNlY2E0MDA7Jz4yMDE1PC9zcGFuPiBhbmQgPHNwYW4gc3R5bGUgPSAnY29sb3I6I2VhZjhiZjsnPjIwMTc8L3NwYW4+IiwgCiAgICAgICBzdWJ0aXRsZT0iQSBrZXkgY29uY2VybiBmb3IgdGhlIHN1c3RhaW5hYmlsaXR5IG9mIGdsb2JhbCBwYXR0ZXJucyBvZiBzZWFmb29kIGNvbnN1bXB0aW9uIGhhcyBiZWVuIHRoZSBvdmVyZXhwbG9pdGF0aW9uIG9mIHdpbGQgZmlzaCBzdG9ja3MuIElmIHRoZSBhbW91bnQgb2Ygd2lsZCBmaXNoXG53ZSBjYXRjaCBleGNlZWRzIHRoZSByYXRlIGF0IHdoaWNoIGZpc2ggY2FuIHJlcHJvZHVjZSBhbmQgcmVwbGVuaXNoLCBwb3B1bGF0aW9ucyB3aWxsIGRlY2xpbmUgb3ZlciB0aW1lLiBTdWNoIHBvcHVsYXRpb25zIHdlIHdvdWxkIGNhbGwg4oCYb3ZlcmV4cGxvaXRlZOKAmS5cblxuRGF0YSBzb3VyY2U6IE91cldvcmxkaW5EYXRhLm9yZyIpCmBgYAoKIyMjIENhcHR1cmUgZmlzaGVyeSBwcm9kdWN0aW9uIGJ5IHJlZ2lvbgpgYGB7cn0KIyByZWZlcmVuY2U6IGh0dHBzOi8vb3Vyd29ybGRpbmRhdGEub3JnL3NlYWZvb2QtcHJvZHVjdGlvbgpjZjEgPSBjYXB0dXJlZF92c19mYXJtZWQgJT4lIGZpbHRlcihlbnRpdHkgJWluJSByZWcpICU+JSAKICBmaWx0ZXIoZW50aXR5IT0iV29ybGQiKSAlPiUKICBtdXRhdGUodmFsdWUgPSBjYXB0dXJlX2Zpc2hlcmllc19wcm9kdWN0aW9uX21ldHJpY190b25zLzEwMDAwMDApCgpjZjEgJT4lCiAgZ2dwbG90KGFlcyh4PXllYXIsIHk9dmFsdWUsIGNvbG9yPWVudGl0eSkpICsKICBhbm5vdGF0ZShnZW9tPSJzZWdtZW50IiwgeT0wLCB5ZW5kPTAsIHg9MTk2MCwgeGVuZD0yMDE4LCBzaXplPS4zLCBjb2xvcj0iIzM0M2E0MCIpICsKICBhbm5vdGF0ZShnZW9tPSJzZWdtZW50IiwgeT1zZXEoMCw0MCw1KSwgeWVuZD1zZXEoMCw0MCw1KSx4PTE5NjAsIHhlbmQ9MjAxOCxzaXplPS4yLCBsaW5ldHlwZT0iZG90dGVkIiwgY29sb3I9ImdyZXk1MCIpICsKICBnZW9tX2xpbmUoc2hvdy5sZWdlbmQ9RikgKwogIGdlb21fcG9pbnQoc2l6ZT0uNSxzaG93LmxlZ2VuZD1GKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBjZjEgJT4lIGZpbHRlcih5ZWFyPT0yMDE4KSxhZXMoeD0yMDIwLCB5PXZhbHVlLCBsYWJlbD1lbnRpdHksIGNvbG9yPWVudGl0eSksIAogICAgICAgICAgICAgICAgICBoanVzdD0wLCBzaXplPTIuNSwgc2hvdy5sZWdlbmQ9RiwgZGlyZWN0aW9uPSJ5IiwgZmFtaWx5PSJSb2JvdG8iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJZZWFyIixicmVha3M9YygxOTYwLDE5NzAsMTk4MCwxOTkwLDIwMDAsMjAxMCwyMDE4KSwgbGltaXRzPWMoMTk1OSwyMDM1LjUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJWb2x1bWUgKG1pbGxpb24gdG9ubmVzKSIsbGltaXRzPWMoMCw0NSksIGJyZWFrcz1zZXEoMCw0MCw1KSkgKwogIGNvb3JkX2NhcnRlc2lhbihleHBhbmQ9RiwgY2xpcD0ib2ZmIikgKwogIGdnc2NpOjpzY2FsZV9jb2xvcl9sYW5jZXQoKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSA4LCBiYXNlX2ZhbWlseSA9ICJSb2JvdG8iKSArCiAgIHRoZW1lKHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2xpbmUoY29sb3I9ImdyZXkzMCIsIHNpemU9LjMpLAogICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT03LjUsIGhqdXN0PTAuNDAzKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9Ny41LCBtYXJnaW49bWFyZ2luKHI9MykpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChtYXJnaW49bWFyZ2luKHQ9MykpLAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKC43LCAxLCAuNSwgMSksICJjbSIpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTMpLAogICAgICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3Q9MCksCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9IiNmOGY5ZmEiLCBjb2xvcj1OQSksCiAgICAgICAgcGxvdC50aXRsZS5wb3NpdGlvbj0icGxvdCIsCiAgICAgICAgcGxvdC5jYXB0aW9uLnBvc2l0aW9uID0gInBsb3QiLAogICAgICAgICkgKwogIGxhYnModGl0bGU9IkNhcHR1cmUgZmlzaGVyeSBwcm9kdWN0aW9uIiwKICAgICAgIHN1YnRpdGxlPSJDYXB0dXJlICh3aWxkKSBmaXNoZXJ5IHByb2R1Y3Rpb24gZG9lcyBub3QgaW5jbHVkZSBzZWFmb29kIHByb2R1Y2VkIGZyb20gZmlzaCBmYXJtaW5nIChhcXVhY3VsdHVyZSkuIiwKICAgICAgIGNhcHRpb249IkRhdGEgc291cmNlOiBPdXJXb3JsZGluRGF0YS5vcmciKQpgYGAKCiMjIyBBcXVhY3VsdHVyZSBwcm9wb3J0aW9uIApgYGB7cn0Kd2VzdCA9IGMoIkF1c3RyaWEiLCJCZWxnaXVtIiwiRnJhbmNlIiwiR2VybWFueSIsIk5ldGhlcmxhbmRzIiwiU3dpdHplcmxhbmQiLCJMaWVjaHRlbnN0ZWluIiwiTHV4ZW1ib3VyZyIsIk1vbmFjbyIpIAoKY2YyID0gY2FwdHVyZWRfdnNfZmFybWVkICU+JSAKICBmaWx0ZXIoZW50aXR5ICVpbiUgd2VzdCkgJT4lCiAgI2ZpbHRlcih5ZWFyPj0xOTgwKSAlPiUKICBtdXRhdGUocHJvcD1hcXVhY3VsdHVyZV9wcm9kdWN0aW9uX21ldHJpY190b25zLyhhcXVhY3VsdHVyZV9wcm9kdWN0aW9uX21ldHJpY190b25zK2NhcHR1cmVfZmlzaGVyaWVzX3Byb2R1Y3Rpb25fbWV0cmljX3RvbnMpKSAlPiUKICBkcm9wX25hKCkgCiAgCmNmMiAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhciwgeT1wcm9wLCBjb2xvcj1lbnRpdHkpKSArCiAgYW5ub3RhdGUoZ2VvbT0ic2VnbWVudCIsIHk9MCwgeWVuZD0wLCB4PTE5NjAsIHhlbmQ9MjAxOCwgc2l6ZT0uMywgY29sb3I9IiMzNDNhNDAiKSArCiAgYW5ub3RhdGUoZ2VvbT0ic2VnbWVudCIsIHk9c2VxKC4yNSwxLC4yNSksIHllbmQ9c2VxKC4yNSwxLC4yNSkseD0xOTYwLCB4ZW5kPTIwMTgsc2l6ZT0uMiwgbGluZXR5cGU9ImRvdHRlZCIsIGNvbG9yPSJncmV5NTAiKSArCiAgZ2VvbV9saW5lKHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnQoc2l6ZT0uNSxzaG93LmxlZ2VuZD1GKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGE9Y2YyICU+JSBmaWx0ZXIoeWVhcj09MjAxOCksIGFlcyhsYWJlbD1lbnRpdHksIHg9MjAxOS41KSwKICAgICAgICAgICAgICAgICAgc2l6ZT0zLCBoanVzdD0wLCBzaG93LmxlZ2VuZCA9IEYsIGRpcmVjdGlvbj0ieSIsIGJveC5wYWRkaW5nID0gMCwgbnVkZ2VfeSA9IC4wMDcsZmFtaWx5PSJSb2JvdG8iKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJBcXVhY3VsdHVyZSBQcm9wb3J0aW9uIixsaW1pdHM9YygwLDEpLCBleHBhbmQ9YygwLDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJZZWFyIixsaW1pdHM9YygxOTYwLDIwMjgpLCBicmVha3M9YygxOTYwLDE5ODAsMjAwMCwyMDE4KSwgZXhwYW5kPWMoMC4wMSwwLjAxKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzAxMjk1ZiIsIiMyOTcxNWQiLCIjODQ5MzI0IiwiI2Y5NTczOCIsIiMwN2EwYzMiLCIjZWNhNDAwIikpICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDksIGJhc2VfZmFtaWx5ID0gIlJvYm90byIpICsKICAgdGhlbWUocGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfbGluZShjb2xvcj0iZ3JleTMwIiwgc2l6ZT0uMyksCiAgICAgICAgYXhpcy50aWNrcy5sZW5ndGg9dW5pdCguMTUsICJjbSIpLAogICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT03LjUsaGp1c3Q9MC40MDMpLAogICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT03LjUsIG1hcmdpbj1tYXJnaW4ocj0zKSksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KG1hcmdpbj1tYXJnaW4odD01KSksCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoLjcsIDEsIC41LCAxKSwgImNtIiksCiAgICAgICAgcGxvdC5zdWJ0aXRsZT1lbGVtZW50X3RleHQobWFyZ2luPW1hcmdpbihiPTE1KSwgc2l6ZT04LjUpLAogICAgICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3Q9MCksCiAgICAgICAgcGxvdC5jYXB0aW9uLnBvc2l0aW9uID0gInBsb3QiLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIHBsb3QudGl0bGUucG9zaXRpb24gPSAicGxvdCIsCiAgICAgICAgI3Bsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSIjZjVmM2Y0IiwgY29sb3I9TkEpCiAgICAgICAgKSArCiAgbGFicyh0aXRsZT0iQXF1YWN1bHR1cmUgUHJvZHVjdGlvbiBpbiBXZXN0ZXJuIEV1cm9wZSBmcm9tIDE5NjAgdG8gMjAxOCIsCiAgICAgICBzdWJ0aXRsZT0iRXhwcmVzc2VkIGFzIEFxdWFjdWx0dXJlIHByb2R1Y3Rpb24gZGl2aWRlZCBieSB0aGUgc3VtIG9mIGFjcXVhY3VsdHVyZSBhbmQgY2FwdHVyZWQgZmlzaGVyaWVzIHByb2R1Y3Rpb24iLAogICAgICAgY2FwdGlvbj0iRGF0YSBzb3VyY2U6IE91cldvcmxkaW5EYXRhLm9yZyIpCmBgYAoKCgoKCgoKCgo=