list.of.packages <- c("dplyr", "tidyr", "foreign","ggplot2","scales","jtools", "plotly", "ggthemes", "sf", "ggrepel", "forcats", "stats", "ggalt", "RColorBrewer", "viridis", "data.table", "ggpubr")

lapply(list.of.packages, require, character.only = TRUE)
# Daten einlesen
# Dateipfad definieren
setwd("/Users/alexandrawuermli/Documents/master polito/daten/Daten_DDJ_HS20_Olat 2/Corona-Monitor/2-Daten")
file_path <- "CoronaMonitorAll.csv"

corona <- read.csv(file_path,
                  sep = ",",
                  encoding = "UTF-8",
                  stringsAsFactors = FALSE)
# neue Variablen erstellen Unterstützung Massnahmen von 1 - 15, werden zusammengerechnet.
# 1 tiefer Skeptizimus - 15 hoher Skeptizimus

karten <- corona  %>%
  select(massnBewegung, massnLockdown, massnLohn, Welle, kanton, schutzmasken) %>% 
  mutate(massnBewegung_num = case_when(
                massnBewegung %in% c("Gehen viel zu weit") ~ 1,
        massnBewegung %in% c("Gehen eher zu weit") ~ 2,
        massnBewegung %in% c("Sind angemessen") ~ 3,
        massnBewegung %in% c("Gehen eher zu wenig weit ") ~ 4,
        massnBewegung %in% c("Gehen viel zu wenig weit") ~ 5)) %>% 
mutate(massnLockdown_num = case_when(
  massnLockdown %in% c("Gehen viel zu weit") ~ 1,
massnLockdown %in% c("Gehen eher zu weit") ~ 2,
        massnLockdown %in% c("Sind angemessen") ~ 3,
    massnLockdown %in% c("Gehen eher zu wenig weit ") ~ 4,
    massnLockdown %in% c("Gehen viel zu wenig weit") ~ 5)) %>% 
mutate(massnLohn_num = case_when(
massnLohn %in% c("Gehen viel zu weit") ~ 1,
    massnLohn %in% c("Gehen eher zu weit") ~ 2,
    massnLohn %in% c("Sind angemessen") ~ 3,
    massnLohn %in% c("Gehen eher zu wenig weit ") ~ 4,
    massnLohn %in% c("Gehen viel zu wenig weit") ~ 5)) %>% 
 mutate(maske_num = case_when( 
  schutzmasken %in% c("Nein") ~ 1,
  schutzmasken %in% c("Eher nein") ~ 2,
  schutzmasken %in% c("Eher Ja") ~ 4,
 schutzmasken %in% c("Ja ") ~ 5))

karten  <- karten   %>% 
   replace(is.na(.), 0) %>%
 mutate(massn = massnLockdown_num + massnLohn_num + massnBewegung_num +maske_num, na.rm = TRUE)

ktnr <-read.csv("kantonnr.csv",
                       sep=";",
                       encoding="UTF-8",
                       stringsAsFactors = F)


# shapefile laden
cantons_geo <- read_sf("ag-b-00/ggg_2020-LV95/shp/g2k20.shp")

#neuer Datensatz mit Berechnungen mit Grafik
karten<- karten %>% 
            group_by(kanton, Welle) %>%
            mutate(massn.gew = weighted.mean(massn, na.rm=T, weight = weight))  %>%
            subset(!(kanton %in% c("- Auslandschweizer/in -", "Auslandschweizer/in"))) %>%
  select(massn.gew, Welle, kanton) %>%
            distinct() %>% 
      left_join(
            ktnr, by = c("kanton" = "Kanton")) %>%
            mutate(Date = case_when(Welle == 1 ~ "21.03. - 23.03",
                                    Welle == 2 ~ "03.04. - 06.04",
                                    Welle == 3 ~ "02.05. - 05.05",
                                    Welle == 4 ~ "05.06. - 08.06",
                                    Welle == 5 ~ "23.10. - 02.11"))
karten$Date <- factor(karten$Date, levels = unique(karten$Date[order(karten$Welle)]))

karten <- left_join(cantons_geo, karten,
                       by = c("KTNR" = "ktnr"))
# Abb. 1, Karten mit Unterstützung
plot<-ggplot() + 
  geom_sf(
    data = cantons_geo,
    aes(),
    fill = "#FCFCFC",
    color = "#666666",
    size = 0.2
    ) +
  geom_sf(
    data = karten,
    aes(fill = massn.gew),
    color = "white",
    size = 0.2 
  ) +  
     scale_fill_gradientn(colours = c(muted("#0e250e"), ("#c0e7c0")),
                       na.value = "grey50",
                       limits = c(2, 8), 
                       oob = squish,
                       breaks = c(2.5, 3.5, 4.5, 5.5, 6.5, 7.5),
                       labels = c("2.5: tiefe Unterstützung ","3.5", "4.5", 
                                  "5.5", "6.5", "7.5: hohe Unterstützung")) +

                       
  theme_void() +
  theme(
    panel.grid.major = element_line("transparent"),
    strip.text.x = element_text(size = 18),
    title = element_text(size = 20),
    plot.subtitle = element_text(size = 18),
    legend.text = element_text(size=16),
    plot.caption = element_text(size=14, hjust=1.2),

  ) +
  labs(title = ~ bold("Die Unterstützung der Massnahmen des Bundesrates sinkt"),
       subtitle = ("Aggregierte Unterstützung pro Kanton und Befragungswelle von Sotomo"),
       fill = "Stärke der Unterstützung",
       caption = "Daten: Forschungsstelle Sotomo, 1.-5. Welle") +
 
  facet_wrap(~Date, strip.position = c( "bottom"))
plot
ggsave(plot, file="karte_unterstützung.png", width = 12, height = 5)

# neuer Datensatz für Beschäftigungsituation
massnahmen_alle <- corona  %>%
  select(massnBewegung, massnLockdown, massnLohn,arbtyp,sex,erwerbNow, schutzmasken) %>%
  mutate(massnBewegung_num = case_when(
                massnBewegung %in% c("Gehen viel zu weit") ~ 5,
        massnBewegung %in% c("Gehen eher zu weit") ~ 4,
        massnBewegung %in% c("Sind angemessen") ~ 3,
        massnBewegung %in% c("Gehen eher zu wenig weit ") ~ 2,
        massnBewegung %in% c("Gehen viel zu wenig weit") ~ 1)) %>% 
mutate(massnLockdown_num = case_when(
  massnLockdown %in% c("Gehen viel zu weit") ~ 5,
massnLockdown %in% c("Gehen eher zu weit") ~ 4,
        massnLockdown %in% c("Sind angemessen") ~ 3,
    massnLockdown %in% c("Gehen eher zu wenig weit ") ~ 2,
    massnLockdown %in% c("Gehen viel zu wenig weit") ~ 1)) %>% 
mutate(massnLohn_num = case_when(
massnLohn %in% c("Gehen viel zu weit") ~ 5,
    massnLohn %in% c("Gehen eher zu weit") ~ 4,
    massnLohn %in% c("Sind angemessen") ~ 3,
    massnLohn %in% c("Gehen eher zu wenig weit ") ~ 2,
    massnLohn %in% c("Gehen viel zu wenig weit") ~ 1))%>%
 mutate(maske_num = case_when( 
  schutzmasken %in% c("Nein") ~ 5,
  schutzmasken %in% c("Eher nein") ~ 4,
  schutzmasken %in% c("Ja ","Eher Ja") ~ 3))


massnahmen_alle  <- massnahmen_alle   %>% 
   replace(is.na(.), 0) %>%
 mutate(massn1 = massnLockdown_num + massnLohn_num + massnBewegung_num+maske_num, na.rm = TRUE)  %>%
mutate(massn.gew1 = weighted.mean(massn1, na.rm=T, weight = weight))

summary(massnahmen_alle$massn.gew1) # mean: 5.312
massnahmen_alle<-massnahmen_alle %>%
  mutate(skeptizimus = case_when(
                massn1> 5.312 ~ 1,
                massn1< 5.312 ~ 0))

# Beschäftigungsituation filtern und Anteile ausrechnen
massnahmen_alle<-massnahmen_alle   %>% 
  select(skeptizimus,erwerbNow, sex)  %>%
 mutate(arbeit = case_when(
    erwerbNow %in% c("Arbeitslos" ,"Arbeitslos / Stellensuchend", "Kurzarbeit") ~ "Arbeitslos",
    erwerbNow %in% c("Hausfrau / Hausmann") ~"Hausfrau / Hausmann",
    erwerbNow %in% c("Kurzarbeit / kurzfristig stellenlos",  "Kurzarbeit") ~ "Kurzarbeit",
    erwerbNow %in% c("In Ausbildung / Studium") ~ "In Ausbildung / Studium",
    erwerbNow %in% c("Pensioniert / IV") ~ "Pensioniert / IV",
    erwerbNow %in% c("Selbständig erwerbend") ~ "Selbständig erwerbend",
erwerbNow %in% c("Vollzeit angestellt", "Teilzeit angestellt","Vollzeit angestellt (80-100%)", "Teilzeit angestellt (weniger als 80%)") ~ "Angestellt")) %>%
na.exclude %>%
    group_by(arbeit) %>%
    summarize(pcent = 100*mean(skeptizimus), n = n())%>%
 mutate(arbeit = fct_reorder(arbeit, pcent)) 
# Beschäfigungssituation lollipop plot

alle<-ggplot(massnahmen_alle, aes(x=fct_reorder(arbeit, pcent), y=pcent)) +
  geom_point(size=2, color="#ffa700") + 
  geom_segment(aes(x=arbeit, xend=arbeit, y=0, yend=pcent), color="grey") +
  geom_text(aes(label = sprintf("%.0f%%", pcent)), vjust = 0.5, hjust = -0.5, size = 6, color = "black") +
    labs(title = "Kurzarbeit fördert die Skepsis gegenüber den Massnahnen", subtitle= "Anteil SkeptikerInnen pro Beschäfigungssituation (in %)", caption = "Daten: Forschungsstelle Sotomo, 1.-5. Welle", x = "",y = "") +
  theme_light() +
  theme(plot.title = element_text(hjust = -5, face="bold", size= 20),
        plot.subtitle= element_text(hjust = -1.14, size= 18),
        plot.caption = element_text(size= 14),
        axis.text.y = element_text(size=16),
        axis.text.x = element_text(size=16),
    panel.grid.major.x = element_blank(),
    panel.border = element_blank(),
    axis.ticks.x = element_blank()) +
  scale_y_continuous(limits=c(0, 80),labels = scales::label_percent(scale=1)) +
    coord_flip() 
alle
ggsave(alle, file = "lollipop_skep.png", width = 11, height = 5)

# neuer Datensatz mit Berechnungen mit Grafik mit Berufsgruppen
# 1 hohe Unterstützung 15 tiefe Unterstützung
massnahmen <- corona  %>%
  select(massnBewegung, massnLockdown, massnLohn,arbtyp,sex, schutzmasken) %>%
  mutate(massnBewegung_num = case_when(
                massnBewegung %in% c("Gehen viel zu weit") ~ 5,
        massnBewegung %in% c("Gehen eher zu weit") ~ 4,
        massnBewegung %in% c("Sind angemessen") ~ 3,
        massnBewegung %in% c("Gehen eher zu wenig weit ") ~ 2,
        massnBewegung %in% c("Gehen viel zu wenig weit") ~ 1)) %>% 
mutate(massnLockdown_num = case_when(
  massnLockdown %in% c("Gehen viel zu weit") ~ 5,
massnLockdown %in% c("Gehen eher zu weit") ~ 4,
        massnLockdown %in% c("Sind angemessen") ~ 3,
    massnLockdown %in% c("Gehen eher zu wenig weit ") ~ 2,
    massnLockdown %in% c("Gehen viel zu wenig weit") ~ 1)) %>% 
mutate(massnLohn_num = case_when(
massnLohn %in% c("Gehen viel zu weit") ~ 5,
    massnLohn %in% c("Gehen eher zu weit") ~ 4,
    massnLohn %in% c("Sind angemessen") ~ 3,
    massnLohn %in% c("Gehen eher zu wenig weit ") ~ 2,
    massnLohn %in% c("Gehen viel zu wenig weit") ~ 1)) %>% 
 mutate(maske_num = case_when( 
  schutzmasken %in% c("Nein") ~ 5,
  schutzmasken %in% c("Eher nein") ~ 4,
  schutzmasken %in% c("Ja ","Eher Ja") ~ 3))
  
massnahmen  <- massnahmen   %>% 
   replace(is.na(.), 0) %>%
 mutate(massn1 = massnLockdown_num + massnLohn_num + massnBewegung_num+ maske_num, na.rm = TRUE) 
# Skeptiker pro Beruf
skep1 <- massnahmen %>% # gewichtetet Mittelwert ausrechnen, um danach nach Skeptiker und Unterstützer unterteilen zu können
mutate(massn.gew1 = weighted.mean(massn1, na.rm=T, weight = weight))

summary(skep1$massn.gew1) # mean: 5.312
skep1<-skep1 %>%
  mutate(skeptizimus = case_when(
                massn1> 5.312 ~ 1,
                massn1< 5.312 ~ 0))
# Grafik Berufsgruppen, Geschlecht
SKEP <- ggplot(data = skep_gap) +
    aes(y = fct_reorder(arbtyp, Mann), x = Frau, xend = Mann) +
    geom_dumbbell(size = 1.5, size_x = 2, size_xend = 2, colour = "gray", colour_x = "#ffa700", colour_xend = "#006a4e") +
    geom_text(x = 38, y = "Produktion, Reparatur, Reinigung", label = "♀", color = "#ffa700", hjust = 2, size=8) +
    geom_text(x = 44, y = "Produktion, Reparatur, Reinigung", label = "♂", color = "#006a4e", hjust = -10, size=8) +
    labs(title = "In der Führung/Strategie und in der Landwirtschaft/Forstwirtschaft ist die Skepsis am grössten", subtitle= "Anteil der SkeptikerInnen pro Berufsgruppe in Prozent und pro Geschlecht ", caption = "Daten: Forschungsstelle Sotomo, 1.-5. Welle", y= "", x="") +
    theme_light() +
  theme(axis.text.y = element_text(size=16),
        axis.text.x = element_text(size=16),
        plot.title = element_text(hjust = 1.02, face="bold", size = 20,vjust=2),
        plot.subtitle = element_text(hjust = -4.7, size = 18,vjust=2),
        plot.caption=  element_text( size = 14),
        plot.title.position =  )


SKEP
ggsave(SKEP, file = "dumbbell_berufe.png", width = 13, height = 7)

# Vergleich landwirtschaft, stratetie /  medien, kunst
# neuer Datensatz erstellen mit neuen zusaätzen Variablen

vergl<-skep1 %>% 
  select(skeptizimus,sex,arbtyp)
vergl$homeoffice<-corona$homeoffice 
vergl$edu<-corona$edu 
vergl$age<-corona$age
vergl$HHeinkommen<-corona$HHeinkommen
vergl$party<-corona$party
vergl$erwerbNow<-corona$erwerbNow
vergl$zurechtkomm<-corona$zurechtkomm
vergl$medien<-corona$medien_SQ003
vergl$medien1<-corona$medien_SQ005
vergl$vertrauen<-corona$vertrauen

vergl1 <-  vergl %>%
  select(arbtyp,erwerbNow,skeptizimus) %>%
  filter(!arbtyp %in% c("-oth-", "", "0", "Politik, Verwaltung", "Kontrolle, Sicherheit", "Analyse, Forschung, Entwicklung" )) %>%
  mutate(kurzarbeit_ja=case_when(
  erwerbNow %in% c("Kurzarbeit / kurzfristig stellenlos",  "Kurzarbeit") ~ 1,
  erwerbNow %in% c("Arbeitslos" ,"Arbeitslos / Stellensuchend", "Hausfrau / Hausmann", "In Ausbildung / Studium", "Pensioniert / IV","Selbständig erwerbend","Vollzeit angestellt", "Teilzeit angestellt","Vollzeit angestellt (80-100%)", "Teilzeit angestellt (weniger als 80%)")~ 0))%>% 
group_by(arbtyp, kurzarbeit_ja, skeptizimus) %>%
  summarise(Percentage=n()) %>% 
  na.omit() %>%
  group_by(arbtyp) %>% 
  mutate(pcent=Percentage/sum(Percentage)*100) %>%
  filter(skeptizimus == 1, kurzarbeit_ja  == 1) 
#Erklärung Kurzarbeit
kurzarbeit<-ggplot(vergl1, aes(x=reorder(arbtyp,pcent), y=pcent)) +
  geom_point(color=ifelse(vergl1$arbtyp %in% c("Landwirtschaft, Forstwirtschaft", "Kunst, Kultur" , "Gestaltung, Kommunikation" , "Strategie, Führung"), "#006a4e", "#ffa700"), size=ifelse(vergl1$arbtyp %in% c("Landwirtschaft, Forstwirtschaft", "Kunst, Kultur" , "Gestaltung, Kommunikation" , "Strategie, Führung"), 3, 2)) + 
  geom_segment(aes(x=arbtyp, xend=arbtyp, y=0, yend=pcent), color="grey") +
  geom_text(aes(label = sprintf("%.0f%%", pcent)), vjust = 0.5, hjust = -0.5, size = 4, color = "black") +
    labs(title = "Abb. 4: Kurzarbeit", subtitle= "in %", caption = "", x = "",y = "") +
  theme_light() +
  theme(
    axis.text.y = element_text(size=14),
        axis.text.x = element_text(size=14),
    panel.grid.major.x = element_blank(),
    panel.border = element_blank(),
    axis.ticks.x = element_blank()) +
  scale_y_continuous(limits=c(0, 20),labels = scales::label_percent(scale=1,accuracy = 1)) +
    coord_flip() 
#Erklärung Stress
vergl3 <-  vergl %>%
  select(arbtyp,skeptizimus,zurechtkomm)  %>%
  filter(!arbtyp %in% c("-oth-", "", "0", "Politik, Verwaltung", "Kontrolle, Sicherheit", "Analyse, Forschung, Entwicklung" )) %>%
  mutate(zurecht = case_when(
    zurechtkomm %in% c("1 – sehr schlecht", "2") ~ 1,
    zurechtkomm %in% c("5 – sehr gut", "4", "3") ~ 0)) %>%
  na.exclude %>%
    group_by(arbtyp, zurecht,skeptizimus) %>%
  summarise(Percentage=n()) %>% 
  group_by(arbtyp) %>% 
  mutate(pcent=Percentage/sum(Percentage)*100) %>%
  filter(zurecht == 1, skeptizimus==1) 
`summarise()` regrouping output by 'arbtyp', 'zurecht' (override with `.groups` argument)
#Plot Stress
stress<-ggplot(vergl3, aes(x=reorder(arbtyp,pcent), y=pcent)) +
  geom_point(color=ifelse(vergl3$arbtyp %in% c("Landwirtschaft, Forstwirtschaft", "Kunst, Kultur" , "Gestaltung, Kommunikation" , "Strategie, Führung"), "#006a4e", "#ffa700"), size=ifelse(vergl3$arbtyp %in% c("Landwirtschaft, Forstwirtschaft", "Kunst, Kultur" , "Gestaltung, Kommunikation" , "Strategie, Führung"), 3, 2)) + 
  geom_segment(aes(x=arbtyp, xend=arbtyp, y=0, yend=pcent), color="grey") +
  geom_text(aes(label = sprintf("%.0f%%", pcent)), vjust = 0.5, hjust = -0.5, size = 4, color = "black") +
    labs(title = "Abb. 5: Stress", subtitle= "in %", caption = "", x = "",y = "") +
  theme_light() +
  theme(
    axis.text.y = element_text(size=14),
        axis.text.x = element_text(size=14),
    panel.grid.major.x = element_blank(),
    panel.border = element_blank(),
    axis.ticks.x = element_blank()) +
  scale_y_continuous(limits=c(0, 20),labels = scales::label_percent(scale=1, accuracy = 1)) +
    coord_flip() 
stress

#Erklärung Medien
unique(vergl$medien)
vergl5 <-  vergl %>%
  select(arbtyp,skeptizimus, medien,medien1)  %>%
  filter(!arbtyp %in% c("-oth-", "", "0", "Politik, Verwaltung", "Kontrolle, Sicherheit", "Analyse, Forschung, Entwicklung" )) %>%
  mutate(medien.kri = case_when(medien == "Sie tragen zu Panik bei: Not selected" ~ 0,
                            medien == "Sie tragen zu Panik bei: Selected" ~ 1)) %>%
  group_by(arbtyp, medien.kri, skeptizimus) %>%
  summarise(Percentage=n()) %>% 
  na.omit() %>%
  group_by(arbtyp) %>% 
  mutate(pcent=Percentage/sum(Percentage)*100) %>%
  filter(medien.kri == 1, skeptizimus==1)
#Plot medien
medien.kr<-ggplot(vergl5, aes(x=reorder(arbtyp,pcent), y=pcent)) +
  geom_point(color=ifelse(vergl3$arbtyp %in% c("Landwirtschaft, Forstwirtschaft", "Kunst, Kultur" , "Gestaltung, Kommunikation" , "Strategie, Führung"), "#006a4e", "#ffa700"), size=ifelse(vergl3$arbtyp %in% c("Landwirtschaft, Forstwirtschaft", "Kunst, Kultur" , "Gestaltung, Kommunikation" , "Strategie, Führung"), 3, 2)) + 
  geom_segment(aes(x=arbtyp, xend=arbtyp, y=0, yend=pcent), color="grey") +
  geom_text(aes(label = sprintf("%.0f%%", pcent)), vjust = 0.5, hjust = -0.5, size = 4, color = "black") +
    labs(title = "Abb. 6: Medienkritik", subtitle= "in %", caption = "", x = "",y = "") +
  theme_light() +
  theme(
    axis.text.y = element_text(size=14),
        axis.text.x = element_text(size=14),
    panel.grid.major.x = element_blank(),
    panel.border = element_blank(),
    axis.ticks.x = element_blank()) +
  scale_y_continuous(limits=c(0, 20),labels = scales::label_percent(scale=1, accuracy = 1)) +
    coord_flip() 
medien.kr

#Erklärung vertrauen
unique(vergl$vertrauen)
vergl6 <-  vergl %>%
  select(arbtyp,skeptizimus, vertrauen)  %>%
  filter(!arbtyp %in% c("-oth-", "", "0", "Politik, Verwaltung", "Kontrolle, Sicherheit", "Analyse, Forschung, Entwicklung" )) %>%
  mutate(vertrauen.br = case_when(vertrauen %in% c( "1: Sehr klein", "2") ~ 1,
                            vertrauen %in% c("3", "4", "5: Sehr gross") ~ 0)) %>%
  group_by(arbtyp, vertrauen.br, skeptizimus) %>%
  summarise(Percentage=n()) %>% 
  na.omit() %>%
  group_by(arbtyp) %>% 
  mutate(pcent=Percentage/sum(Percentage)*100) %>%
  filter(skeptizimus == 1, vertrauen.br  == 1)
#plot vertrauen
br.kr<-ggplot(vergl6, aes(x=reorder(arbtyp,pcent), y=pcent)) +
  geom_point(color=ifelse(vergl6$arbtyp %in% c("Landwirtschaft, Forstwirtschaft", "Kunst, Kultur" , "Gestaltung, Kommunikation" , "Strategie, Führung"), "#006a4e", "#ffa700"), size=ifelse(vergl6$arbtyp %in% c("Landwirtschaft, Forstwirtschaft", "Kunst, Kultur" , "Gestaltung, Kommunikation" , "Strategie, Führung"), 3, 2)) + 
  geom_segment(aes(x=arbtyp, xend=arbtyp, y=0, yend=pcent), color="grey") +
  geom_text(aes(label = sprintf("%.0f%%", pcent)), vjust = 0.5, hjust = -0.5, size = 4, color = "black") +
    labs(title = "Abb. 7: Fehlendes Vertrauen in BR", subtitle= "in %", caption = "", x = "",y = "") +
  theme_light() +
  theme(
    axis.text.y = element_text(size=14),
        axis.text.x = element_text(size=14),
    panel.grid.major.x = element_blank(),
    panel.border = element_blank(),
    axis.ticks.x = element_blank()) +
  scale_y_continuous(limits=c(0, 20),labels = scales::label_percent(scale=1, accuracy = 1)) +
    coord_flip() 
br.kr

#alle erklärungsfakturen zusammen
figure <- ggarrange(kurzarbeit, stress,medien.kr, br.kr,
                    labels = c(""),
                    ncol = 2, nrow=2) 
#title <- expression(atop(bold("Eine kritische Haltung gegenüber den Medien und dem Bundesrat führt zur Ablehnung der #Massnahmen"), scriptstyle("Verschiedene Erklärungsfaktoren für die Skepsis gegenüber den Massnahmen im Vergleich (in % pro #Berufsgruppe)")))

figure<-annotate_figure(figure,
               top = text_grob(title, size = 20),
               bottom = text_grob("Daten: Forschungsstelle Sotomo, 1.-5. Welle", hjust = -1, size = 14))
figure


ggsave(figure, file = "alle.png", width = 15, height = 20)

figure <- ggarrange(kurzarbeit, stress,medien.kr, br.kr,
                    labels = c(""),
                    ncol = 2, nrow=2) 
#title <- expression(atop(bold("Eine kritische Haltung gegenüber den Medien und dem Bundesrat führt zur Ablehnung der #Massnahmen"), scriptstyle("Verschiedene Erklärungsfaktoren für die Skepsis gegenüber den Massnahmen im Vergleich (in % pro #Berufsgruppe)")))

figure<-annotate_figure(figure,
               top = text_grob(title, size = 20),
               bottom = text_grob("Daten: Forschungsstelle Sotomo, 1.-5. Welle.", hjust = -1, size = 14))
figure


ggsave(figure, file = "alle.png", width = 16, height = 20)
#Erklärung Perteien
unique(corona$party)
vergl4 <-  vergl %>%
  select(arbtyp,skeptizimus, party,)  %>%
  filter(arbtyp %in% c("Landwirtschaft, Forstwirtschaft", "Kunst, Kultur" , "Gestaltung, Kommunikation" , "Strategie, Führung")) %>%
  filter(party %in% c("FDP", "CVP", "Grüne", "SP", "SVP")) %>%
  na.exclude %>%
    group_by(arbtyp, party, skeptizimus) %>%
  summarise(Percentage=n()) %>%
  group_by(arbtyp) %>% 
  mutate(Percentage=Percentage/sum(Percentage)*100) %>%
mutate(arbtyp = fct_reorder(arbtyp, Percentage))%>%
filter(skeptizimus == 1)
vergl4
#plot parteien
partei <- ggplot(data = vergl4) +
    aes(x = party, y = Percentage, color= party) +
  scale_color_manual(values=c("#ffa500", "#0080ff", "#00cd00", "#e60000", "#008000")) +
    facet_wrap(~arbtyp ) +
    geom_point(size=3) +
    coord_flip() +
    labs(title = ~ bold ("Skepsis wird bestärkt durch SVP- und FDP-Parteipräferenzen "), subtitle = "Vergleich der skeptischten Berufsgruppen mit der am wenigsten skeptischten Berufsgruppe bezüglich Parteipräferenz", caption = "Daten: Forschungsstelle Sotomo, 1.-5. Welle", y = "", x = "") +

    theme_light() +
  theme(legend.position = "none", 
        axis.text.y = element_text(size=16),
        axis.text.x = element_text(size=16),
        strip.text.x = element_text(size = 16),
        title=element_text(size = 20),
        plot.caption = element_text(size = 14),
        plot.subtitle = element_text(size = 16)) +
  scale_y_continuous(limits=c(0, 30), labels = scales::label_percent(scale=1))+
    theme(strip.background = element_blank(), strip.text = element_text(color = "black", face = "italic"))
partei

ggsave(partei, file = "partei.png",  width = 11, height = 7)

# 5 Regression für die 5 Wellen 
# nur zur Kontrolle, was einen noch Einfluss haben könnte
reg.w1<- glm(skeptizimus ~ party +age + arbtyp+ sex  + edu + HHeinkommen + medien+ vertrauen ,
          family = binomial(link = logit), data = vergl)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyLCByZXN1bHRzPUZBTFNFfQpsaXN0Lm9mLnBhY2thZ2VzIDwtIGMoImRwbHlyIiwgInRpZHlyIiwgImZvcmVpZ24iLCJnZ3Bsb3QyIiwic2NhbGVzIiwianRvb2xzIiwgInBsb3RseSIsICJnZ3RoZW1lcyIsICJzZiIsICJnZ3JlcGVsIiwgImZvcmNhdHMiLCAic3RhdHMiLCAiZ2dhbHQiLCAiUkNvbG9yQnJld2VyIiwgInZpcmlkaXMiLCAiZGF0YS50YWJsZSIsICJnZ3B1YnIiKQoKbGFwcGx5KGxpc3Qub2YucGFja2FnZXMsIHJlcXVpcmUsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkKYGBgCgpgYGB7ciwgcmVzdWx0cz1GQUxTRX0KIyBEYXRlbiBlaW5sZXNlbgojIERhdGVpcGZhZCBkZWZpbmllcmVuCnNldHdkKCIvVXNlcnMvYWxleGFuZHJhd3Vlcm1saS9Eb2N1bWVudHMvbWFzdGVyIHBvbGl0by9kYXRlbi9EYXRlbl9EREpfSFMyMF9PbGF0IDIvQ29yb25hLU1vbml0b3IvMi1EYXRlbiIpCmZpbGVfcGF0aCA8LSAiQ29yb25hTW9uaXRvckFsbC5jc3YiCgpjb3JvbmEgPC0gcmVhZC5jc3YoZmlsZV9wYXRoLAogICAgICAgICAgICAgICAgICBzZXAgPSAiLCIsCiAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gIlVURi04IiwKICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpgYGAKCmBgYHtyLCByZXN1bHRzPUZBTFNFfQojIG5ldWUgVmFyaWFibGVuIGVyc3RlbGxlbiBVbnRlcnN0w7x0enVuZyBNYXNzbmFobWVuIHZvbiAxIC0gMTUsIHdlcmRlbiB6dXNhbW1lbmdlcmVjaG5ldC4KIyAxIHRpZWZlciBTa2VwdGl6aW11cyAtIDE1IGhvaGVyIFNrZXB0aXppbXVzCgprYXJ0ZW4gPC0gY29yb25hICAlPiUKICBzZWxlY3QobWFzc25CZXdlZ3VuZywgbWFzc25Mb2NrZG93biwgbWFzc25Mb2huLCBXZWxsZSwga2FudG9uLCBzY2h1dHptYXNrZW4pICU+JSAKICBtdXRhdGUobWFzc25CZXdlZ3VuZ19udW0gPSBjYXNlX3doZW4oCgkJICAgICAgICBtYXNzbkJld2VndW5nICVpbiUgYygiR2VoZW4gdmllbCB6dSB3ZWl0IikgfiAxLAoJCW1hc3NuQmV3ZWd1bmcgJWluJSBjKCJHZWhlbiBlaGVyIHp1IHdlaXQiKSB+IDIsCgkJbWFzc25CZXdlZ3VuZyAlaW4lIGMoIlNpbmQgYW5nZW1lc3NlbiIpIH4gMywKCQltYXNzbkJld2VndW5nICVpbiUgYygiR2VoZW4gZWhlciB6dSB3ZW5pZyB3ZWl0ICIpIH4gNCwKCQltYXNzbkJld2VndW5nICVpbiUgYygiR2VoZW4gdmllbCB6dSB3ZW5pZyB3ZWl0IikgfiA1KSkgJT4lIAptdXRhdGUobWFzc25Mb2NrZG93bl9udW0gPSBjYXNlX3doZW4oCiAgbWFzc25Mb2NrZG93biAlaW4lIGMoIkdlaGVuIHZpZWwgenUgd2VpdCIpIH4gMSwKbWFzc25Mb2NrZG93biAlaW4lIGMoIkdlaGVuIGVoZXIgenUgd2VpdCIpIH4gMiwKCQltYXNzbkxvY2tkb3duICVpbiUgYygiU2luZCBhbmdlbWVzc2VuIikgfiAzLAogICAgbWFzc25Mb2NrZG93biAlaW4lIGMoIkdlaGVuIGVoZXIgenUgd2VuaWcgd2VpdCAiKSB+IDQsCiAgICBtYXNzbkxvY2tkb3duICVpbiUgYygiR2VoZW4gdmllbCB6dSB3ZW5pZyB3ZWl0IikgfiA1KSkgJT4lIAptdXRhdGUobWFzc25Mb2huX251bSA9IGNhc2Vfd2hlbigKbWFzc25Mb2huICVpbiUgYygiR2VoZW4gdmllbCB6dSB3ZWl0IikgfiAxLAogICAgbWFzc25Mb2huICVpbiUgYygiR2VoZW4gZWhlciB6dSB3ZWl0IikgfiAyLAogICAgbWFzc25Mb2huICVpbiUgYygiU2luZCBhbmdlbWVzc2VuIikgfiAzLAogICAgbWFzc25Mb2huICVpbiUgYygiR2VoZW4gZWhlciB6dSB3ZW5pZyB3ZWl0ICIpIH4gNCwKICAgIG1hc3NuTG9obiAlaW4lIGMoIkdlaGVuIHZpZWwgenUgd2VuaWcgd2VpdCIpIH4gNSkpICU+JSAKIG11dGF0ZShtYXNrZV9udW0gPSBjYXNlX3doZW4oIAogIHNjaHV0em1hc2tlbiAlaW4lIGMoIk5laW4iKSB+IDEsCiAgc2NodXR6bWFza2VuICVpbiUgYygiRWhlciBuZWluIikgfiAyLAogIHNjaHV0em1hc2tlbiAlaW4lIGMoIkVoZXIgSmEiKSB+IDQsCiBzY2h1dHptYXNrZW4gJWluJSBjKCJKYSAiKSB+IDUpKQoKa2FydGVuICA8LSBrYXJ0ZW4gICAlPiUgCiAgIHJlcGxhY2UoaXMubmEoLiksIDApICU+JQogbXV0YXRlKG1hc3NuID0gbWFzc25Mb2NrZG93bl9udW0gKyBtYXNzbkxvaG5fbnVtICsgbWFzc25CZXdlZ3VuZ19udW0gK21hc2tlX251bSwgbmEucm0gPSBUUlVFKQoKYGBgCgpgYGB7ciwgcmVzdWx0cz1GQUxTRX0KCmt0bnIgPC1yZWFkLmNzdigia2FudG9ubnIuY3N2IiwKICAgICAgICAgICAgICAgICAgICAgICBzZXA9IjsiLAogICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPSJVVEYtOCIsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEYpCgoKIyBzaGFwZWZpbGUgbGFkZW4KY2FudG9uc19nZW8gPC0gcmVhZF9zZigiYWctYi0wMC9nZ2dfMjAyMC1MVjk1L3NocC9nMmsyMC5zaHAiKQoKI25ldWVyIERhdGVuc2F0eiBtaXQgQmVyZWNobnVuZ2VuIG1pdCBHcmFmaWsKa2FydGVuPC0ga2FydGVuICU+JSAKICAgICAgICAgICAgZ3JvdXBfYnkoa2FudG9uLCBXZWxsZSkgJT4lCiAgICAgICAgICAgIG11dGF0ZShtYXNzbi5nZXcgPSB3ZWlnaHRlZC5tZWFuKG1hc3NuLCBuYS5ybT1ULCB3ZWlnaHQgPSB3ZWlnaHQpKSAgJT4lCiAgICAgICAgICAgIHN1YnNldCghKGthbnRvbiAlaW4lIGMoIi0gQXVzbGFuZHNjaHdlaXplci9pbiAtIiwgIkF1c2xhbmRzY2h3ZWl6ZXIvaW4iKSkpICU+JQogIHNlbGVjdChtYXNzbi5nZXcsIFdlbGxlLCBrYW50b24pICU+JQogICAgICAgICAgICBkaXN0aW5jdCgpICU+JSAKICAgICAgbGVmdF9qb2luKAogICAgICAgICAgICBrdG5yLCBieSA9IGMoImthbnRvbiIgPSAiS2FudG9uIikpICU+JQogICAgICAgICAgICBtdXRhdGUoRGF0ZSA9IGNhc2Vfd2hlbihXZWxsZSA9PSAxIH4gIjIxLjAzLiAtIDIzLjAzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2VsbGUgPT0gMiB+ICIwMy4wNC4gLSAwNi4wNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlbGxlID09IDMgfiAiMDIuMDUuIC0gMDUuMDUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWxsZSA9PSA0IH4gIjA1LjA2LiAtIDA4LjA2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2VsbGUgPT0gNSB+ICIyMy4xMC4gLSAwMi4xMSIpKQprYXJ0ZW4kRGF0ZSA8LSBmYWN0b3Ioa2FydGVuJERhdGUsIGxldmVscyA9IHVuaXF1ZShrYXJ0ZW4kRGF0ZVtvcmRlcihrYXJ0ZW4kV2VsbGUpXSkpCgprYXJ0ZW4gPC0gbGVmdF9qb2luKGNhbnRvbnNfZ2VvLCBrYXJ0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJLVE5SIiA9ICJrdG5yIikpCmBgYAoKYGBge3J9CiMgQWJiLiAxLCBLYXJ0ZW4gbWl0IFVudGVyc3TDvHR6dW5nCnBsb3Q8LWdncGxvdCgpICsgCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBjYW50b25zX2dlbywKICAgIGFlcygpLAogICAgZmlsbCA9ICIjRkNGQ0ZDIiwKICAgIGNvbG9yID0gIiM2NjY2NjYiLAogICAgc2l6ZSA9IDAuMgogICAgKSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBrYXJ0ZW4sCiAgICBhZXMoZmlsbCA9IG1hc3NuLmdldyksCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBzaXplID0gMC4yIAogICkgKyAgCiAgICAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGMobXV0ZWQoIiMwZTI1MGUiKSwgKCIjYzBlN2MwIikpLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk1MCIsCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygyLCA4KSwgCiAgICAgICAgICAgICAgICAgICAgICAgb29iID0gc3F1aXNoLAogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMi41LCAzLjUsIDQuNSwgNS41LCA2LjUsIDcuNSksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMi41OiB0aWVmZSBVbnRlcnN0w7x0enVuZyAiLCIzLjUiLCAiNC41IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNS41IiwgIjYuNSIsICI3LjU6IGhvaGUgVW50ZXJzdMO8dHp1bmciKSkgKwoKICAgICAgICAgICAgICAgICAgICAgICAKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKAogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZSgidHJhbnNwYXJlbnQiKSwKICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLAogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGhqdXN0PTEuMiksCgogICkgKwogIGxhYnModGl0bGUgPSB+IGJvbGQoIkFiYi4gMTogRGllIFVudGVyc3TDvHR6dW5nIGRlciBNYXNzbmFobWVuIGRlcyBCdW5kZXNyYXRlcyBzaW5rdCIpLAogICAgICAgc3VidGl0bGUgPSAoIkFnZ3JlZ2llcnRlIFVudGVyc3TDvHR6dW5nIHBybyBLYW50b24gdW5kIEJlZnJhZ3VuZ3N3ZWxsZSIpLAogICAgICAgZmlsbCA9ICJTdMOkcmtlIGRlciBVbnRlcnN0w7x0enVuZyIsCiAgICAgICBjYXB0aW9uID0gIkRhdGVuOiBGb3JzY2h1bmdzc3RlbGxlIFNvdG9tbywgMS4tNS4gV2VsbGUuIikgKwogCiAgZmFjZXRfd3JhcCh+RGF0ZSwgc3RyaXAucG9zaXRpb24gPSBjKCAiYm90dG9tIikpCnBsb3QKZ2dzYXZlKHBsb3QsIGZpbGU9ImthcnRlX3VudGVyc3TDvHR6dW5nLnBuZyIsIHdpZHRoID0gMTIsIGhlaWdodCA9IDUpCgpgYGAKCmBgYHtyLCByZXN1bHRzPUZBTFNFfQojIG5ldWVyIERhdGVuc2F0eiBmw7xyIEJlc2Now6RmdGlndW5nc2l0dWF0aW9uCm1hc3NuYWhtZW5fYWxsZSA8LSBjb3JvbmEgICU+JQogIHNlbGVjdChtYXNzbkJld2VndW5nLCBtYXNzbkxvY2tkb3duLCBtYXNzbkxvaG4sYXJidHlwLHNleCxlcndlcmJOb3csIHNjaHV0em1hc2tlbikgJT4lCiAgbXV0YXRlKG1hc3NuQmV3ZWd1bmdfbnVtID0gY2FzZV93aGVuKAoJCSAgICAgICAgbWFzc25CZXdlZ3VuZyAlaW4lIGMoIkdlaGVuIHZpZWwgenUgd2VpdCIpIH4gNSwKCQltYXNzbkJld2VndW5nICVpbiUgYygiR2VoZW4gZWhlciB6dSB3ZWl0IikgfiA0LAoJCW1hc3NuQmV3ZWd1bmcgJWluJSBjKCJTaW5kIGFuZ2VtZXNzZW4iKSB+IDMsCgkJbWFzc25CZXdlZ3VuZyAlaW4lIGMoIkdlaGVuIGVoZXIgenUgd2VuaWcgd2VpdCAiKSB+IDIsCgkJbWFzc25CZXdlZ3VuZyAlaW4lIGMoIkdlaGVuIHZpZWwgenUgd2VuaWcgd2VpdCIpIH4gMSkpICU+JSAKbXV0YXRlKG1hc3NuTG9ja2Rvd25fbnVtID0gY2FzZV93aGVuKAogIG1hc3NuTG9ja2Rvd24gJWluJSBjKCJHZWhlbiB2aWVsIHp1IHdlaXQiKSB+IDUsCm1hc3NuTG9ja2Rvd24gJWluJSBjKCJHZWhlbiBlaGVyIHp1IHdlaXQiKSB+IDQsCgkJbWFzc25Mb2NrZG93biAlaW4lIGMoIlNpbmQgYW5nZW1lc3NlbiIpIH4gMywKICAgIG1hc3NuTG9ja2Rvd24gJWluJSBjKCJHZWhlbiBlaGVyIHp1IHdlbmlnIHdlaXQgIikgfiAyLAogICAgbWFzc25Mb2NrZG93biAlaW4lIGMoIkdlaGVuIHZpZWwgenUgd2VuaWcgd2VpdCIpIH4gMSkpICU+JSAKbXV0YXRlKG1hc3NuTG9obl9udW0gPSBjYXNlX3doZW4oCm1hc3NuTG9obiAlaW4lIGMoIkdlaGVuIHZpZWwgenUgd2VpdCIpIH4gNSwKICAgIG1hc3NuTG9obiAlaW4lIGMoIkdlaGVuIGVoZXIgenUgd2VpdCIpIH4gNCwKICAgIG1hc3NuTG9obiAlaW4lIGMoIlNpbmQgYW5nZW1lc3NlbiIpIH4gMywKICAgIG1hc3NuTG9obiAlaW4lIGMoIkdlaGVuIGVoZXIgenUgd2VuaWcgd2VpdCAiKSB+IDIsCiAgICBtYXNzbkxvaG4gJWluJSBjKCJHZWhlbiB2aWVsIHp1IHdlbmlnIHdlaXQiKSB+IDEpKSU+JQogbXV0YXRlKG1hc2tlX251bSA9IGNhc2Vfd2hlbiggCiAgc2NodXR6bWFza2VuICVpbiUgYygiTmVpbiIpIH4gNSwKICBzY2h1dHptYXNrZW4gJWluJSBjKCJFaGVyIG5laW4iKSB+IDQsCiAgc2NodXR6bWFza2VuICVpbiUgYygiSmEgIiwiRWhlciBKYSIpIH4gMykpCgoKbWFzc25haG1lbl9hbGxlICA8LSBtYXNzbmFobWVuX2FsbGUgICAlPiUgCiAgIHJlcGxhY2UoaXMubmEoLiksIDApICU+JQogbXV0YXRlKG1hc3NuMSA9IG1hc3NuTG9ja2Rvd25fbnVtICsgbWFzc25Mb2huX251bSArIG1hc3NuQmV3ZWd1bmdfbnVtK21hc2tlX251bSwgbmEucm0gPSBUUlVFKSAgJT4lCm11dGF0ZShtYXNzbi5nZXcxID0gd2VpZ2h0ZWQubWVhbihtYXNzbjEsIG5hLnJtPVQsIHdlaWdodCA9IHdlaWdodCkpCgpzdW1tYXJ5KG1hc3NuYWhtZW5fYWxsZSRtYXNzbi5nZXcxKSAjIG1lYW46IDUuMzEyCgptYXNzbmFobWVuX2FsbGU8LW1hc3NuYWhtZW5fYWxsZSAlPiUKICBtdXRhdGUoc2tlcHRpemltdXMgPSBjYXNlX3doZW4oCgkJICAgICAgICBtYXNzbjE+IDUuMzEyIH4gMSwKCQkgICAgICAgIG1hc3NuMTwgNS4zMTIgfiAwKSkKCiMgQmVzY2jDpGZ0aWd1bmdzaXR1YXRpb24gZmlsdGVybiB1bmQgQW50ZWlsZSBhdXNyZWNobmVuCm1hc3NuYWhtZW5fYWxsZTwtbWFzc25haG1lbl9hbGxlICAgJT4lIAogIHNlbGVjdChza2VwdGl6aW11cyxlcndlcmJOb3csIHNleCkgICU+JQogbXV0YXRlKGFyYmVpdCA9IGNhc2Vfd2hlbigKICAgIGVyd2VyYk5vdyAlaW4lIGMoIkFyYmVpdHNsb3MiICwiQXJiZWl0c2xvcyAvIFN0ZWxsZW5zdWNoZW5kIiwgIkt1cnphcmJlaXQiKSB+ICJBcmJlaXRzbG9zIiwKICAgIGVyd2VyYk5vdyAlaW4lIGMoIkhhdXNmcmF1IC8gSGF1c21hbm4iKSB+IkhhdXNmcmF1IC8gSGF1c21hbm4iLAogICAgZXJ3ZXJiTm93ICVpbiUgYygiS3VyemFyYmVpdCAvIGt1cnpmcmlzdGlnIHN0ZWxsZW5sb3MiLCAgIkt1cnphcmJlaXQiKSB+ICJLdXJ6YXJiZWl0IiwKICAgIGVyd2VyYk5vdyAlaW4lIGMoIkluIEF1c2JpbGR1bmcgLyBTdHVkaXVtIikgfiAiSW4gQXVzYmlsZHVuZyAvIFN0dWRpdW0iLAogICAgZXJ3ZXJiTm93ICVpbiUgYygiUGVuc2lvbmllcnQgLyBJViIpIH4gIlBlbnNpb25pZXJ0IC8gSVYiLAogICAgZXJ3ZXJiTm93ICVpbiUgYygiU2VsYnN0w6RuZGlnIGVyd2VyYmVuZCIpIH4gIlNlbGJzdMOkbmRpZyBlcndlcmJlbmQiLAplcndlcmJOb3cgJWluJSBjKCJWb2xsemVpdCBhbmdlc3RlbGx0IiwgIlRlaWx6ZWl0IGFuZ2VzdGVsbHQiLCJWb2xsemVpdCBhbmdlc3RlbGx0ICg4MC0xMDAlKSIsICJUZWlsemVpdCBhbmdlc3RlbGx0ICh3ZW5pZ2VyIGFscyA4MCUpIikgfiAiQW5nZXN0ZWxsdCIpKSAlPiUKbmEuZXhjbHVkZSAlPiUKCWdyb3VwX2J5KGFyYmVpdCkgJT4lCglzdW1tYXJpemUocGNlbnQgPSAxMDAqbWVhbihza2VwdGl6aW11cyksIG4gPSBuKCkpJT4lCiBtdXRhdGUoYXJiZWl0ID0gZmN0X3Jlb3JkZXIoYXJiZWl0LCBwY2VudCkpIAoKYGBgCgpgYGB7cn0KIyBCZXNjaMOkZmlndW5nc3NpdHVhdGlvbiBsb2xsaXBvcCBwbG90CgphbGxlPC1nZ3Bsb3QobWFzc25haG1lbl9hbGxlLCBhZXMoeD1mY3RfcmVvcmRlcihhcmJlaXQsIHBjZW50KSwgeT1wY2VudCkpICsKICBnZW9tX3BvaW50KHNpemU9MiwgY29sb3I9IiNmZmE3MDAiKSArIAogIGdlb21fc2VnbWVudChhZXMoeD1hcmJlaXQsIHhlbmQ9YXJiZWl0LCB5PTAsIHllbmQ9cGNlbnQpLCBjb2xvcj0iZ3JleSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3ByaW50ZigiJS4wZiUlIiwgcGNlbnQpKSwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gLTAuNSwgc2l6ZSA9IDYsIGNvbG9yID0gImJsYWNrIikgKwoJbGFicyh0aXRsZSA9ICJBYmIuIDI6IEt1cnphcmJlaXQgZsO2cmRlcnQgZGllIFNrZXBzaXMgZ2VnZW7DvGJlciBkZW4gTWFzc25haG5lbiIsIHN1YnRpdGxlPSAiQW50ZWlsIFNrZXB0aWtlcklubmVuIHBybyBCZXNjaMOkZmlndW5nc3NpdHVhdGlvbiAoaW4gJSkiLCBjYXB0aW9uID0gIkRhdGVuOiBGb3JzY2h1bmdzc3RlbGxlIFNvdG9tbywgMS4tNS4gV2VsbGUuIiwgeCA9ICIiLHkgPSAiIikgKwogIHRoZW1lX2xpZ2h0KCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAtNy4yLCBmYWNlPSJib2xkIiwgc2l6ZT0gMTgpLAogICAgICAgIHBsb3Quc3VidGl0bGU9IGVsZW1lbnRfdGV4dChoanVzdCA9IC0xLjE0LCBzaXplPSAxOCksCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemU9IDE0KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCA4MCksbGFiZWxzID0gc2NhbGVzOjpsYWJlbF9wZXJjZW50KHNjYWxlPTEpKSArCiAgICBjb29yZF9mbGlwKCkgCmFsbGUKZ2dzYXZlKGFsbGUsIGZpbGUgPSAibG9sbGlwb3Bfc2tlcC5wbmciLCB3aWR0aCA9IDExLCBoZWlnaHQgPSA1KQpgYGAKCgpgYGB7ciwgcmVzdWx0cz1GQUxTRX0KIyBuZXVlciBEYXRlbnNhdHogbWl0IEJlcmVjaG51bmdlbiBtaXQgR3JhZmlrIG1pdCBCZXJ1ZnNncnVwcGVuCiMgMSBob2hlIFVudGVyc3TDvHR6dW5nIDE1IHRpZWZlIFVudGVyc3TDvHR6dW5nCm1hc3NuYWhtZW4gPC0gY29yb25hICAlPiUKICBzZWxlY3QobWFzc25CZXdlZ3VuZywgbWFzc25Mb2NrZG93biwgbWFzc25Mb2huLGFyYnR5cCxzZXgsIHNjaHV0em1hc2tlbikgJT4lCiAgbXV0YXRlKG1hc3NuQmV3ZWd1bmdfbnVtID0gY2FzZV93aGVuKAoJCSAgICAgICAgbWFzc25CZXdlZ3VuZyAlaW4lIGMoIkdlaGVuIHZpZWwgenUgd2VpdCIpIH4gNSwKCQltYXNzbkJld2VndW5nICVpbiUgYygiR2VoZW4gZWhlciB6dSB3ZWl0IikgfiA0LAoJCW1hc3NuQmV3ZWd1bmcgJWluJSBjKCJTaW5kIGFuZ2VtZXNzZW4iKSB+IDMsCgkJbWFzc25CZXdlZ3VuZyAlaW4lIGMoIkdlaGVuIGVoZXIgenUgd2VuaWcgd2VpdCAiKSB+IDIsCgkJbWFzc25CZXdlZ3VuZyAlaW4lIGMoIkdlaGVuIHZpZWwgenUgd2VuaWcgd2VpdCIpIH4gMSkpICU+JSAKbXV0YXRlKG1hc3NuTG9ja2Rvd25fbnVtID0gY2FzZV93aGVuKAogIG1hc3NuTG9ja2Rvd24gJWluJSBjKCJHZWhlbiB2aWVsIHp1IHdlaXQiKSB+IDUsCm1hc3NuTG9ja2Rvd24gJWluJSBjKCJHZWhlbiBlaGVyIHp1IHdlaXQiKSB+IDQsCgkJbWFzc25Mb2NrZG93biAlaW4lIGMoIlNpbmQgYW5nZW1lc3NlbiIpIH4gMywKICAgIG1hc3NuTG9ja2Rvd24gJWluJSBjKCJHZWhlbiBlaGVyIHp1IHdlbmlnIHdlaXQgIikgfiAyLAogICAgbWFzc25Mb2NrZG93biAlaW4lIGMoIkdlaGVuIHZpZWwgenUgd2VuaWcgd2VpdCIpIH4gMSkpICU+JSAKbXV0YXRlKG1hc3NuTG9obl9udW0gPSBjYXNlX3doZW4oCm1hc3NuTG9obiAlaW4lIGMoIkdlaGVuIHZpZWwgenUgd2VpdCIpIH4gNSwKICAgIG1hc3NuTG9obiAlaW4lIGMoIkdlaGVuIGVoZXIgenUgd2VpdCIpIH4gNCwKICAgIG1hc3NuTG9obiAlaW4lIGMoIlNpbmQgYW5nZW1lc3NlbiIpIH4gMywKICAgIG1hc3NuTG9obiAlaW4lIGMoIkdlaGVuIGVoZXIgenUgd2VuaWcgd2VpdCAiKSB+IDIsCiAgICBtYXNzbkxvaG4gJWluJSBjKCJHZWhlbiB2aWVsIHp1IHdlbmlnIHdlaXQiKSB+IDEpKSAlPiUgCiBtdXRhdGUobWFza2VfbnVtID0gY2FzZV93aGVuKCAKICBzY2h1dHptYXNrZW4gJWluJSBjKCJOZWluIikgfiA1LAogIHNjaHV0em1hc2tlbiAlaW4lIGMoIkVoZXIgbmVpbiIpIH4gNCwKICBzY2h1dHptYXNrZW4gJWluJSBjKCJKYSAiLCJFaGVyIEphIikgfiAzKSkKICAKbWFzc25haG1lbiAgPC0gbWFzc25haG1lbiAgICU+JSAKICAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lCiBtdXRhdGUobWFzc24xID0gbWFzc25Mb2NrZG93bl9udW0gKyBtYXNzbkxvaG5fbnVtICsgbWFzc25CZXdlZ3VuZ19udW0rIG1hc2tlX251bSwgbmEucm0gPSBUUlVFKSAKCmBgYAoKYGBge3IsIHJlc3VsdHM9RkFMU0V9CiMgU2tlcHRpa2VyIHBybyBCZXJ1Zgpza2VwMSA8LSBtYXNzbmFobWVuICU+JSAjIGdld2ljaHRldGV0IE1pdHRlbHdlcnQgYXVzcmVjaG5lbiwgdW0gZGFuYWNoIG5hY2ggU2tlcHRpa2VyIHVuZCBVbnRlcnN0w7x0emVyIHVudGVydGVpbGVuIHp1IGvDtm5uZW4KbXV0YXRlKG1hc3NuLmdldzEgPSB3ZWlnaHRlZC5tZWFuKG1hc3NuMSwgbmEucm09VCwgd2VpZ2h0ID0gd2VpZ2h0KSkKCnN1bW1hcnkoc2tlcDEkbWFzc24uZ2V3MSkgIyBtZWFuOiA1LjMxMgoKc2tlcDE8LXNrZXAxICU+JQogIG11dGF0ZShza2VwdGl6aW11cyA9IGNhc2Vfd2hlbigKCQkgICAgICAgIG1hc3NuMT4gNS4zMTIgfiAxLAoJCSAgICAgICAgbWFzc24xPCA1LjMxMiB+IDApKQpgYGAKCmBgYHtyLCByZXN1bHRzPUZBTFNFfQojIyBQcm96ZW50IFVudGVyc3TDvHR6dW5nIHBybyBBcmJlaXRzdHlwLCBhbGxlIEdlc2NobGVjaHRlcgpza2VwX2dlbmRlcl8xIDwtIHNrZXAxICU+JQoJZmlsdGVyKHNleCAlaW4lIGMoIk1hbm4iLCAiRnJhdSIpKSAlPiUKCXNlbGVjdChhcmJ0eXAsIHNrZXB0aXppbXVzLCBzZXgpICU+JQoJbmEuZXhjbHVkZSAlPiUKCWdyb3VwX2J5KGFyYnR5cCkgJT4lCglzdW1tYXJpemUoc2V4ID0gIkFsbGUiLCBwY2VudF9za2VwID0gMTAwKm1lYW4oc2tlcHRpemltdXMpLCBuID0gbigpKQoKCnNrZXBfZ2VuZGVyXzIgPC0gc2tlcDEgJT4lCiAgZmlsdGVyKHNleCAlaW4lIGMoIk1hbm4iLCAiRnJhdSIpKSAlPiUKCXNlbGVjdChhcmJ0eXAsIHNrZXB0aXppbXVzLCBzZXgpICU+JQoJbmEuZXhjbHVkZSAlPiUKCWdyb3VwX2J5KGFyYnR5cCwgc2V4KSAlPiUKCXN1bW1hcml6ZShwY2VudF9za2VwID0gMTAwKm1lYW4oc2tlcHRpemltdXMpLCBuID0gbigpLCAuZ3JvdXBzID0gImtlZXAiKQoKCnNrZXBfZ2VuZGVyIDwtIGJpbmRfcm93cyhza2VwX2dlbmRlcl8xLCBza2VwX2dlbmRlcl8yKSAlPiUKCXNlbGVjdChwY2VudF9za2VwLCBhcmJ0eXAsIHNleCkgJT4lCglzcHJlYWQoa2V5ID0gc2V4LCB2YWx1ZSA9IHBjZW50X3NrZXApICU+JQoJbXV0YXRlKHBjZW50X3NrZXBfbSA9IE1hbm4sIHBjZW50X3NrZXBfZiA9IEZyYXUpICU+JQoJZ2F0aGVyKGtleSA9IHNleCwgdmFsdWUgPSBwY2VudF9za2VwLCAtYXJidHlwLCAtcGNlbnRfc2tlcF9tLCAtcGNlbnRfc2tlcF9mKSAlPiUKCW11dGF0ZShzZXggPSBmYWN0b3Ioc2V4LCBsZXZlbHMgPSBjKCJGcmF1IiwgIkFsbGUiLCAiTWFubiIpKSkgJT4lCglhcnJhbmdlKGFyYnR5cCwgc2V4KQoKCnNrZXBfZ2FwIDwtIHNrZXBfZ2VuZGVyICU+JQoJZmlsdGVyKHNleCAlaW4lIGMoIk1hbm4iLCAiRnJhdSIpKSAlPiUKCXNlbGVjdChwY2VudF9za2VwLCBhcmJ0eXAsIHNleCkgJT4lCglzcHJlYWQoa2V5ID0gc2V4LCB2YWx1ZSA9IHBjZW50X3NrZXApICU+JQoJbXV0YXRlKGdhcF9tX2YgPSBNYW5uIC0gRnJhdSkgJT4lCiAgZmlsdGVyKCFhcmJ0eXAgJWluJSBjKCIiLCAiLW90aC0iLCAiMCIpKQpza2VwX2dhcApgYGAKCmBgYHtyfQojIEdyYWZpayBCZXJ1ZnNncnVwcGVuLCBHZXNjaGxlY2h0ClNLRVAgPC0gZ2dwbG90KGRhdGEgPSBza2VwX2dhcCkgKwoJYWVzKHkgPSBmY3RfcmVvcmRlcihhcmJ0eXAsIE1hbm4pLCB4ID0gRnJhdSwgeGVuZCA9IE1hbm4pICsKCWdlb21fZHVtYmJlbGwoc2l6ZSA9IDEuNSwgc2l6ZV94ID0gMiwgc2l6ZV94ZW5kID0gMiwgY29sb3VyID0gImdyYXkiLCBjb2xvdXJfeCA9ICIjZmZhNzAwIiwgY29sb3VyX3hlbmQgPSAiIzAwNmE0ZSIpICsKCWdlb21fdGV4dCh4ID0gMzgsIHkgPSAiUHJvZHVrdGlvbiwgUmVwYXJhdHVyLCBSZWluaWd1bmciLCBsYWJlbCA9ICLimYAiLCBjb2xvciA9ICIjZmZhNzAwIiwgaGp1c3QgPSAyLCBzaXplPTgpICsKCWdlb21fdGV4dCh4ID0gNDQsIHkgPSAiUHJvZHVrdGlvbiwgUmVwYXJhdHVyLCBSZWluaWd1bmciLCBsYWJlbCA9ICLimYIiLCBjb2xvciA9ICIjMDA2YTRlIiwgaGp1c3QgPSAtNiwgc2l6ZT04KSArCglsYWJzKHRpdGxlID0gIkFiYi4gMzogSW4gZGVyIEbDvGhydW5nIHVuZCBkZXIgTGFuZHdpcnRzY2hhZnQgaXN0IGRpZSBTa2Vwc2lzIGFtIGdyw7Zzc3RlbiIsIHN1YnRpdGxlPSAiQW50ZWlsIGRlciBTa2VwdGlrZXJJbm5lbiBwcm8gQmVydWZzZ3J1cHBlIHVuZCBwcm8gR2VzY2hsZWNodCAoaW4gJSkiLCBjYXB0aW9uID0gIkRhdGVuOiBGb3JzY2h1bmdzc3RlbGxlIFNvdG9tbywgMS4tNS4gV2VsbGUuIiwgeT0gIiIsIHg9IiIpICsKCXRoZW1lX2xpZ2h0KCkgKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAxLjk3LCBmYWNlPSJib2xkIiwgc2l6ZSA9IDE4LHZqdXN0PTIpLAogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAzLjA1LCBzaXplID0gMTgsdmp1c3Q9MiksCiAgICAgICAgcGxvdC5jYXB0aW9uPSAgZWxlbWVudF90ZXh0KCBzaXplID0gMTQpLAogICAgICAgIHBsb3QudGl0bGUucG9zaXRpb24gPSAgKQoKClNLRVAKZ2dzYXZlKFNLRVAsIGZpbGUgPSAiZHVtYmJlbGxfYmVydWZlLnBuZyIsIHdpZHRoID0gMTEsIGhlaWdodCA9IDYpCmBgYAoKCgpgYGB7ciwgcmVzdWx0cz1GQUxTRX0KIyBWZXJnbGVpY2ggbGFuZHdpcnRzY2hhZnQsIHN0cmF0ZXRpZSAvICBtZWRpZW4sIGt1bnN0CiMgbmV1ZXIgRGF0ZW5zYXR6IGVyc3RlbGxlbiBtaXQgbmV1ZW4genVzYcOkdHplbiBWYXJpYWJsZW4KCnZlcmdsPC1za2VwMSAlPiUgCiAgc2VsZWN0KHNrZXB0aXppbXVzLHNleCxhcmJ0eXApCnZlcmdsJGhvbWVvZmZpY2U8LWNvcm9uYSRob21lb2ZmaWNlIAp2ZXJnbCRlZHU8LWNvcm9uYSRlZHUgCnZlcmdsJGFnZTwtY29yb25hJGFnZQp2ZXJnbCRISGVpbmtvbW1lbjwtY29yb25hJEhIZWlua29tbWVuCnZlcmdsJHBhcnR5PC1jb3JvbmEkcGFydHkKdmVyZ2wkZXJ3ZXJiTm93PC1jb3JvbmEkZXJ3ZXJiTm93CnZlcmdsJHp1cmVjaHRrb21tPC1jb3JvbmEkenVyZWNodGtvbW0KdmVyZ2wkbWVkaWVuPC1jb3JvbmEkbWVkaWVuX1NRMDAzCnZlcmdsJG1lZGllbjE8LWNvcm9uYSRtZWRpZW5fU1EwMDUKdmVyZ2wkdmVydHJhdWVuPC1jb3JvbmEkdmVydHJhdWVuCgp2ZXJnbDEgPC0gIHZlcmdsICU+JQogIHNlbGVjdChhcmJ0eXAsZXJ3ZXJiTm93LHNrZXB0aXppbXVzKSAlPiUKICBmaWx0ZXIoIWFyYnR5cCAlaW4lIGMoIi1vdGgtIiwgIiIsICIwIiwgIlBvbGl0aWssIFZlcndhbHR1bmciLCAiS29udHJvbGxlLCBTaWNoZXJoZWl0IiwgIkFuYWx5c2UsIEZvcnNjaHVuZywgRW50d2lja2x1bmciCSkpICU+JQogIG11dGF0ZShrdXJ6YXJiZWl0X2phPWNhc2Vfd2hlbigKICBlcndlcmJOb3cgJWluJSBjKCJLdXJ6YXJiZWl0IC8ga3VyemZyaXN0aWcgc3RlbGxlbmxvcyIsICAiS3VyemFyYmVpdCIpIH4gMSwKICBlcndlcmJOb3cgJWluJSBjKCJBcmJlaXRzbG9zIiAsIkFyYmVpdHNsb3MgLyBTdGVsbGVuc3VjaGVuZCIsICJIYXVzZnJhdSAvIEhhdXNtYW5uIiwgIkluIEF1c2JpbGR1bmcgLyBTdHVkaXVtIiwgIlBlbnNpb25pZXJ0IC8gSVYiLCJTZWxic3TDpG5kaWcgZXJ3ZXJiZW5kIiwiVm9sbHplaXQgYW5nZXN0ZWxsdCIsICJUZWlsemVpdCBhbmdlc3RlbGx0IiwiVm9sbHplaXQgYW5nZXN0ZWxsdCAoODAtMTAwJSkiLCAiVGVpbHplaXQgYW5nZXN0ZWxsdCAod2VuaWdlciBhbHMgODAlKSIpfiAwKSklPiUgCmdyb3VwX2J5KGFyYnR5cCwga3VyemFyYmVpdF9qYSwgc2tlcHRpemltdXMpICU+JQogIHN1bW1hcmlzZShQZXJjZW50YWdlPW4oKSkgJT4lIAogIG5hLm9taXQoKSAlPiUKICBncm91cF9ieShhcmJ0eXApICU+JSAKICBtdXRhdGUocGNlbnQ9UGVyY2VudGFnZS9zdW0oUGVyY2VudGFnZSkqMTAwKSAlPiUKICBmaWx0ZXIoc2tlcHRpemltdXMgPT0gMSwga3VyemFyYmVpdF9qYSAgPT0gMSkgCgpgYGAKCgpgYGB7cn0KI0Vya2zDpHJ1bmcgS3VyemFyYmVpdAprdXJ6YXJiZWl0PC1nZ3Bsb3QodmVyZ2wxLCBhZXMoeD1yZW9yZGVyKGFyYnR5cCxwY2VudCksIHk9cGNlbnQpKSArCiAgZ2VvbV9wb2ludChjb2xvcj1pZmVsc2UodmVyZ2wxJGFyYnR5cCAlaW4lIGMoIkxhbmR3aXJ0c2NoYWZ0LCBGb3JzdHdpcnRzY2hhZnQiLCAiS3Vuc3QsIEt1bHR1ciIgLCAiR2VzdGFsdHVuZywgS29tbXVuaWthdGlvbiIgLCAiU3RyYXRlZ2llLCBGw7xocnVuZyIpLCAiIzAwNmE0ZSIsICIjZmZhNzAwIiksIHNpemU9aWZlbHNlKHZlcmdsMSRhcmJ0eXAgJWluJSBjKCJMYW5kd2lydHNjaGFmdCwgRm9yc3R3aXJ0c2NoYWZ0IiwgIkt1bnN0LCBLdWx0dXIiICwgIkdlc3RhbHR1bmcsIEtvbW11bmlrYXRpb24iICwgIlN0cmF0ZWdpZSwgRsO8aHJ1bmciKSwgMywgMikpICsgCiAgZ2VvbV9zZWdtZW50KGFlcyh4PWFyYnR5cCwgeGVuZD1hcmJ0eXAsIHk9MCwgeWVuZD1wY2VudCksIGNvbG9yPSJncmV5IikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjBmJSUiLCBwY2VudCkpLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAtMC41LCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKSArCglsYWJzKHRpdGxlID0gIkFiYi4gNDogS3VyemFyYmVpdCIsIHN1YnRpdGxlPSAiaW4gJSIsIGNhcHRpb24gPSAiIiwgeCA9ICIiLHkgPSAiIikgKwogIHRoZW1lX2xpZ2h0KCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xOCksCiAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjAsIGZhY2U9ImJvbGQiKSwKICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMjApLGxhYmVscyA9IHNjYWxlczo6bGFiZWxfcGVyY2VudChzY2FsZT0xLGFjY3VyYWN5ID0gMSkpICsKICAgIGNvb3JkX2ZsaXAoKSAKCmBgYAoKCmBgYHtyfQojRXJrbMOkcnVuZyBTdHJlc3MKdmVyZ2wzIDwtICB2ZXJnbCAlPiUKICBzZWxlY3QoYXJidHlwLHNrZXB0aXppbXVzLHp1cmVjaHRrb21tKSAgJT4lCiAgZmlsdGVyKCFhcmJ0eXAgJWluJSBjKCItb3RoLSIsICIiLCAiMCIsICJQb2xpdGlrLCBWZXJ3YWx0dW5nIiwgIktvbnRyb2xsZSwgU2ljaGVyaGVpdCIsICJBbmFseXNlLCBGb3JzY2h1bmcsIEVudHdpY2tsdW5nIgkpKSAlPiUKICBtdXRhdGUoenVyZWNodCA9IGNhc2Vfd2hlbigKICAgIHp1cmVjaHRrb21tICVpbiUgYygiMSDigJMgc2VociBzY2hsZWNodCIsICIyIikgfiAxLAogICAgenVyZWNodGtvbW0gJWluJSBjKCI1IOKAkyBzZWhyIGd1dCIsICI0IiwgIjMiKSB+IDApKSAlPiUKICBuYS5leGNsdWRlICU+JQoJZ3JvdXBfYnkoYXJidHlwLCB6dXJlY2h0LHNrZXB0aXppbXVzKSAlPiUKICBzdW1tYXJpc2UoUGVyY2VudGFnZT1uKCkpICU+JSAKICBncm91cF9ieShhcmJ0eXApICU+JSAKICBtdXRhdGUocGNlbnQ9UGVyY2VudGFnZS9zdW0oUGVyY2VudGFnZSkqMTAwKSAlPiUKICBmaWx0ZXIoenVyZWNodCA9PSAxLCBza2VwdGl6aW11cz09MSkgCgpgYGAKCmBgYHtyfQojUGxvdCBTdHJlc3MKc3RyZXNzPC1nZ3Bsb3QodmVyZ2wzLCBhZXMoeD1yZW9yZGVyKGFyYnR5cCxwY2VudCksIHk9cGNlbnQpKSArCiAgZ2VvbV9wb2ludChjb2xvcj1pZmVsc2UodmVyZ2wzJGFyYnR5cCAlaW4lIGMoIkxhbmR3aXJ0c2NoYWZ0LCBGb3JzdHdpcnRzY2hhZnQiLCAiS3Vuc3QsIEt1bHR1ciIgLCAiR2VzdGFsdHVuZywgS29tbXVuaWthdGlvbiIgLCAiU3RyYXRlZ2llLCBGw7xocnVuZyIpLCAiIzAwNmE0ZSIsICIjZmZhNzAwIiksIHNpemU9aWZlbHNlKHZlcmdsMyRhcmJ0eXAgJWluJSBjKCJMYW5kd2lydHNjaGFmdCwgRm9yc3R3aXJ0c2NoYWZ0IiwgIkt1bnN0LCBLdWx0dXIiICwgIkdlc3RhbHR1bmcsIEtvbW11bmlrYXRpb24iICwgIlN0cmF0ZWdpZSwgRsO8aHJ1bmciKSwgMywgMikpICsgCiAgZ2VvbV9zZWdtZW50KGFlcyh4PWFyYnR5cCwgeGVuZD1hcmJ0eXAsIHk9MCwgeWVuZD1wY2VudCksIGNvbG9yPSJncmV5IikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjBmJSUiLCBwY2VudCkpLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAtMC41LCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKSArCglsYWJzKHRpdGxlID0gIkFiYi4gNTogU3RyZXNzIiwgc3VidGl0bGU9ICJpbiAlIiwgY2FwdGlvbiA9ICIiLCB4ID0gIiIseSA9ICIiKSArCiAgdGhlbWVfbGlnaHQoKSArCiAgdGhlbWUoCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFjZT0iYm9sZCIpLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAyMCksbGFiZWxzID0gc2NhbGVzOjpsYWJlbF9wZXJjZW50KHNjYWxlPTEsIGFjY3VyYWN5ID0gMSkpICsKICAgIGNvb3JkX2ZsaXAoKSAKc3RyZXNzCmBgYAoKCmBgYHtyLCByZXN1bHRzPUZBTFNFfQojRXJrbMOkcnVuZyBNZWRpZW4KdW5pcXVlKHZlcmdsJG1lZGllbikKdmVyZ2w1IDwtICB2ZXJnbCAlPiUKICBzZWxlY3QoYXJidHlwLHNrZXB0aXppbXVzLCBtZWRpZW4sbWVkaWVuMSkgICU+JQogIGZpbHRlcighYXJidHlwICVpbiUgYygiLW90aC0iLCAiIiwgIjAiLCAiUG9saXRpaywgVmVyd2FsdHVuZyIsICJLb250cm9sbGUsIFNpY2hlcmhlaXQiLCAiQW5hbHlzZSwgRm9yc2NodW5nLCBFbnR3aWNrbHVuZyIJKSkgJT4lCiAgbXV0YXRlKG1lZGllbi5rcmkgPSBjYXNlX3doZW4obWVkaWVuID09ICJTaWUgdHJhZ2VuIHp1IFBhbmlrIGJlaTogTm90IHNlbGVjdGVkIiB+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpZW4gPT0gIlNpZSB0cmFnZW4genUgUGFuaWsgYmVpOiBTZWxlY3RlZCIgfiAxKSkgJT4lCiAgZ3JvdXBfYnkoYXJidHlwLCBtZWRpZW4ua3JpLCBza2VwdGl6aW11cykgJT4lCiAgc3VtbWFyaXNlKFBlcmNlbnRhZ2U9bigpKSAlPiUgCiAgbmEub21pdCgpICU+JQogIGdyb3VwX2J5KGFyYnR5cCkgJT4lIAogIG11dGF0ZShwY2VudD1QZXJjZW50YWdlL3N1bShQZXJjZW50YWdlKSoxMDApICU+JQogIGZpbHRlcihtZWRpZW4ua3JpID09IDEsIHNrZXB0aXppbXVzPT0xKQoKYGBgCgoKYGBge3J9CiNQbG90IG1lZGllbgptZWRpZW4ua3I8LWdncGxvdCh2ZXJnbDUsIGFlcyh4PXJlb3JkZXIoYXJidHlwLHBjZW50KSwgeT1wY2VudCkpICsKICBnZW9tX3BvaW50KGNvbG9yPWlmZWxzZSh2ZXJnbDMkYXJidHlwICVpbiUgYygiTGFuZHdpcnRzY2hhZnQsIEZvcnN0d2lydHNjaGFmdCIsICJLdW5zdCwgS3VsdHVyIiAsICJHZXN0YWx0dW5nLCBLb21tdW5pa2F0aW9uIiAsICJTdHJhdGVnaWUsIEbDvGhydW5nIiksICIjMDA2YTRlIiwgIiNmZmE3MDAiKSwgc2l6ZT1pZmVsc2UodmVyZ2wzJGFyYnR5cCAlaW4lIGMoIkxhbmR3aXJ0c2NoYWZ0LCBGb3JzdHdpcnRzY2hhZnQiLCAiS3Vuc3QsIEt1bHR1ciIgLCAiR2VzdGFsdHVuZywgS29tbXVuaWthdGlvbiIgLCAiU3RyYXRlZ2llLCBGw7xocnVuZyIpLCAzLCAyKSkgKyAKICBnZW9tX3NlZ21lbnQoYWVzKHg9YXJidHlwLCB4ZW5kPWFyYnR5cCwgeT0wLCB5ZW5kPXBjZW50KSwgY29sb3I9ImdyZXkiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwcmludGYoIiUuMGYlJSIsIHBjZW50KSksIHZqdXN0ID0gMC41LCBoanVzdCA9IC0wLjUsIHNpemUgPSA1LCBjb2xvciA9ICJibGFjayIpICsKCWxhYnModGl0bGUgPSAiQWJiLiA2OiBGZWhsZW5kZXMgXG5WZXJ0cmF1ZW4gaW4gTWVkaWVuIiwgc3VidGl0bGU9ICJpbiAlIiwgY2FwdGlvbiA9ICIiLCB4ID0gIiIseSA9ICIiKSArCiAgdGhlbWVfbGlnaHQoKSArCiAgdGhlbWUoCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFjZSA9ICJib2xkIiksCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMjApLGxhYmVscyA9IHNjYWxlczo6bGFiZWxfcGVyY2VudChzY2FsZT0xLCBhY2N1cmFjeSA9IDEpKSArCiAgICBjb29yZF9mbGlwKCkgCm1lZGllbi5rcgpgYGAKCgoKCmBgYHtyLCByZXN1bHRzPUZBTFNFfQojRXJrbMOkcnVuZyB2ZXJ0cmF1ZW4KdW5pcXVlKHZlcmdsJHZlcnRyYXVlbikKdmVyZ2w2IDwtICB2ZXJnbCAlPiUKICBzZWxlY3QoYXJidHlwLHNrZXB0aXppbXVzLCB2ZXJ0cmF1ZW4pICAlPiUKICBmaWx0ZXIoIWFyYnR5cCAlaW4lIGMoIi1vdGgtIiwgIiIsICIwIiwgIlBvbGl0aWssIFZlcndhbHR1bmciLCAiS29udHJvbGxlLCBTaWNoZXJoZWl0IiwgIkFuYWx5c2UsIEZvcnNjaHVuZywgRW50d2lja2x1bmciCSkpICU+JQogIG11dGF0ZSh2ZXJ0cmF1ZW4uYnIgPSBjYXNlX3doZW4odmVydHJhdWVuICVpbiUgYyggIjE6IFNlaHIga2xlaW4iLCAiMiIpIH4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRyYXVlbiAlaW4lIGMoIjMiLCAiNCIsICI1OiBTZWhyIGdyb3NzIikgfiAwKSkgJT4lCiAgZ3JvdXBfYnkoYXJidHlwLCB2ZXJ0cmF1ZW4uYnIsIHNrZXB0aXppbXVzKSAlPiUKICBzdW1tYXJpc2UoUGVyY2VudGFnZT1uKCkpICU+JSAKICBuYS5vbWl0KCkgJT4lCiAgZ3JvdXBfYnkoYXJidHlwKSAlPiUgCiAgbXV0YXRlKHBjZW50PVBlcmNlbnRhZ2Uvc3VtKFBlcmNlbnRhZ2UpKjEwMCkgJT4lCiAgZmlsdGVyKHNrZXB0aXppbXVzID09IDEsIHZlcnRyYXVlbi5iciAgPT0gMSkKCmBgYAoKYGBge3J9CiNwbG90IHZlcnRyYXVlbgpici5rcjwtZ2dwbG90KHZlcmdsNiwgYWVzKHg9cmVvcmRlcihhcmJ0eXAscGNlbnQpLCB5PXBjZW50KSkgKwogIGdlb21fcG9pbnQoY29sb3I9aWZlbHNlKHZlcmdsNiRhcmJ0eXAgJWluJSBjKCJMYW5kd2lydHNjaGFmdCwgRm9yc3R3aXJ0c2NoYWZ0IiwgIkt1bnN0LCBLdWx0dXIiICwgIkdlc3RhbHR1bmcsIEtvbW11bmlrYXRpb24iICwgIlN0cmF0ZWdpZSwgRsO8aHJ1bmciKSwgIiMwMDZhNGUiLCAiI2ZmYTcwMCIpLCBzaXplPWlmZWxzZSh2ZXJnbDYkYXJidHlwICVpbiUgYygiTGFuZHdpcnRzY2hhZnQsIEZvcnN0d2lydHNjaGFmdCIsICJLdW5zdCwgS3VsdHVyIiAsICJHZXN0YWx0dW5nLCBLb21tdW5pa2F0aW9uIiAsICJTdHJhdGVnaWUsIEbDvGhydW5nIiksIDMsIDIpKSArIAogIGdlb21fc2VnbWVudChhZXMoeD1hcmJ0eXAsIHhlbmQ9YXJidHlwLCB5PTAsIHllbmQ9cGNlbnQpLCBjb2xvcj0iZ3JleSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3ByaW50ZigiJS4wZiUlIiwgcGNlbnQpKSwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gLTAuNSwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikgKwoJbGFicyh0aXRsZSA9ICJBYmIuIDc6IEZlaGxlbmRlcyBcblZlcnRyYXVlbiBpbiBCdW5kZXJyYXQiLCBzdWJ0aXRsZT0gImluICUiLCBjYXB0aW9uID0gIiIsIHggPSAiIix5ID0gIiIpICsKICB0aGVtZV9saWdodCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIwLCBmYWNlPSJib2xkIiksCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDIwKSxsYWJlbHMgPSBzY2FsZXM6OmxhYmVsX3BlcmNlbnQoc2NhbGU9MSwgYWNjdXJhY3kgPSAxKSkgKwogICAgY29vcmRfZmxpcCgpIApici5rcgpgYGAKCgoKYGBge3J9CiNhbGxlIGVya2zDpHJ1bmdzZmFrdHVyZW4genVzYW1tZW4KZmlndXJlIDwtIGdnYXJyYW5nZShrdXJ6YXJiZWl0LCBzdHJlc3MsbWVkaWVuLmtyLCBici5rciwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIiKSwKICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwgbnJvdz0yKSAKCgpmaWd1cmU8LWFubm90YXRlX2ZpZ3VyZShmaWd1cmUsCiAgICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiRGF0ZW46IEZvcnNjaHVuZ3NzdGVsbGUgU290b21vLCAxLi01LiBXZWxsZS4iLCBoanVzdCA9IC0xLCBzaXplID0gMTQpKQpmaWd1cmUKCgpnZ3NhdmUoZmlndXJlLCBmaWxlID0gImFsbGUucG5nIiwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gMjApCgpgYGAKCmBgYHtyfQpmaWd1cmUgPC0gZ2dhcnJhbmdlKGt1cnphcmJlaXQsIHN0cmVzcyxtZWRpZW4ua3IsIGJyLmtyLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIiIpLAogICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLCBucm93PTIpIAojdGl0bGUgPC0gZXhwcmVzc2lvbihhdG9wKGJvbGQoIkVpbmUga3JpdGlzY2hlIEhhbHR1bmcgZ2VnZW7DvGJlciBkZW4gTWVkaWVuIHVuZCBkZW0gQnVuZGVzcmF0IGbDvGhydCB6dXIgQWJsZWhudW5nIGRlciAjTWFzc25haG1lbiIpLCBzY3JpcHRzdHlsZSgiVmVyc2NoaWVkZW5lIEVya2zDpHJ1bmdzZmFrdG9yZW4gZsO8ciBkaWUgU2tlcHNpcyBnZWdlbsO8YmVyIGRlbiBNYXNzbmFobWVuIGltIFZlcmdsZWljaCAoaW4gJSBwcm8gI0JlcnVmc2dydXBwZSkiKSkpCgpmaWd1cmU8LWFubm90YXRlX2ZpZ3VyZShmaWd1cmUsCiAgICAgICAgICAgICAgIHRvcCA9IHRleHRfZ3JvYih0aXRsZSwgc2l6ZSA9IDIwKSwKICAgICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKCJEYXRlbjogRm9yc2NodW5nc3N0ZWxsZSBTb3RvbW8sIDEuLTUuIFdlbGxlLiIsIGhqdXN0ID0gLTEsIHNpemUgPSAxNCkpCmZpZ3VyZQoKCmdnc2F2ZShmaWd1cmUsIGZpbGUgPSAiYWxsZS5wbmciLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAyMCkKCgpgYGAKCmBgYHtyLCByZXN1bHRzPUZBTFNFfQojRXJrbMOkcnVuZyBQZXJ0ZWllbgp1bmlxdWUoY29yb25hJHBhcnR5KQp2ZXJnbDQgPC0gIHZlcmdsICU+JQogIHNlbGVjdChhcmJ0eXAsc2tlcHRpemltdXMsIHBhcnR5LCkgICU+JQogIGZpbHRlcihhcmJ0eXAgJWluJSBjKCJMYW5kd2lydHNjaGFmdCwgRm9yc3R3aXJ0c2NoYWZ0IiwgIkt1bnN0LCBLdWx0dXIiICwgIkdlc3RhbHR1bmcsIEtvbW11bmlrYXRpb24iICwgIlN0cmF0ZWdpZSwgRsO8aHJ1bmciKSkgJT4lCiAgZmlsdGVyKHBhcnR5ICVpbiUgYygiRkRQIiwgIkNWUCIsICJHcsO8bmUiLCAiU1AiLCAiU1ZQIikpICU+JQogIG5hLmV4Y2x1ZGUgJT4lCglncm91cF9ieShhcmJ0eXAsIHBhcnR5LCBza2VwdGl6aW11cykgJT4lCiAgc3VtbWFyaXNlKFBlcmNlbnRhZ2U9bigpKSAlPiUKICBncm91cF9ieShhcmJ0eXApICU+JSAKICBtdXRhdGUoUGVyY2VudGFnZT1QZXJjZW50YWdlL3N1bShQZXJjZW50YWdlKSoxMDApICU+JQptdXRhdGUoYXJidHlwID0gZmN0X3Jlb3JkZXIoYXJidHlwLCBQZXJjZW50YWdlKSklPiUKZmlsdGVyKHNrZXB0aXppbXVzID09IDEpCgp2ZXJnbDQKYGBgCgpgYGB7cn0KI3Bsb3QgcGFydGVpZW4KcGFydGVpIDwtIGdncGxvdChkYXRhID0gdmVyZ2w0KSArCglhZXMoeCA9IHBhcnR5LCB5ID0gUGVyY2VudGFnZSwgY29sb3I9IHBhcnR5KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjZmZhNTAwIiwgIiMwMDgwZmYiLCAiIzAwY2QwMCIsICIjZTYwMDAwIiwgIiMwMDgwMDAiKSkgKwoJZmFjZXRfd3JhcCh+YXJidHlwICkgKwoJZ2VvbV9wb2ludChzaXplPTMpICsKCWNvb3JkX2ZsaXAoKSArCglsYWJzKHRpdGxlID0gfiBib2xkICgiQWJiLiA4OiBTa2Vwc2lzIHdpcmQgYmVzdMOkcmt0IGR1cmNoIFNWUC0gdW5kIEZEUC1QYXJ0ZWlwcsOkZmVyZW56ZW4gIiksIHN1YnRpdGxlID0gIlZlcmdsZWljaCBkZXIgc2tlcHRpc2Noc3RlbiBtaXQgZGVyIGFtIHdlbmlnc3RlbiBza2VwdGlzY2hzdGVuIEJlcnVmc2dydXBwZW4gYmV6w7xnbGljaCBQYXJ0ZWlwcsOkZmVyZW56IiwgY2FwdGlvbiA9ICJEYXRlbjogRm9yc2NodW5nc3N0ZWxsZSBTb3RvbW8sIDEuLTUuIFdlbGxlLiIsIHkgPSAiIiwgeCA9ICIiKSArCgoJdGhlbWVfbGlnaHQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCAKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICB0aXRsZT1lbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMzApLCBsYWJlbHMgPSBzY2FsZXM6OmxhYmVsX3BlcmNlbnQoc2NhbGU9MSkpKwoJdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIGZhY2UgPSAiaXRhbGljIikpCnBhcnRlaQoKZ2dzYXZlKHBhcnRlaSwgZmlsZSA9ICJwYXJ0ZWkucG5nIiwgIHdpZHRoID0gMTEsIGhlaWdodCA9IDcpCmBgYAoKCgoKYGBge3IsIHJlc3VsdHM9RkFMU0V9CiMgNSBSZWdyZXNzaW9uIGbDvHIgZGllIDUgV2VsbGVuIAojIG51ciB6dXIgS29udHJvbGxlLCB3YXMgZWluZW4gbm9jaCBFaW5mbHVzcyBoYWJlbiBrw7ZubnRlCnJlZy53MTwtIGdsbShza2VwdGl6aW11cyB+IHBhcnR5ICthZ2UgKyBhcmJ0eXArIHNleCAgKyBlZHUgKyBISGVpbmtvbW1lbiArIG1lZGllbisgdmVydHJhdWVuICwKICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSBsb2dpdCksIGRhdGEgPSB2ZXJnbCkKCmBgYAo=