#rm(list=ls(all=TRUE))
# set working directory
setwd("/Users/alexandrawuermli/Dropbox/Studium/datenjournalismus/blog")
list.of.packages <- c("dplyr", "quanteda", "foreign","ggplot2","magrittr","lubridate", "plotly", "ggthemes", "stringr", "swissparl", "tidyverse", "stats", "ggalt", "RColorBrewer", "data.table", "ggpubr", "purrr", "ggwordcloud", "zoo", "TTR", "tidyquant", "stringr", "purrr", "openxlsx", "quanteda.textstats", "deeplr", "tidyr", "tidytext", "kableExtra","magick", "webshot")


lapply(list.of.packages, require, character.only = TRUE)
theme_aw <- function(base_size = 18, 
                          base_family = "Helvetica",
                          base_line_size = base_size / 170,
                          base_rect_size = base_size / 170){
  ggplot2::theme_minimal(base_size = base_size, 
                         base_family = base_family,
                         base_line_size = base_line_size) %+replace%
    ggplot2::theme(
      plot.title = element_text(color = rgb(22, 38, 46, 
                                            maxColorValue = 250),  
                                face = "bold", hjust = 0, vjust = 0.5),
      axis.title = element_text(color = rgb(22, 38, 46, 
                                            maxColorValue = 250), 
                                size = rel(0.75)),
      axis.text = element_text(color = rgb(22, 38, 46, 
                                           maxColorValue = 250), 
                               size = rel(0.7)),  
      plot.subtitle = element_text(color = rgb(22, 38, 46, 
                                            maxColorValue = 250), hjust = 0, vjust = 0.5)
    ,
      panel.grid.minor.y  = element_line(rgb(159, 162, 178, 
                                          maxColorValue = 250),
                                      linetype = "dotted", size = rel(4)),
      legend.title = element_blank(), legend.position = "right",
      axis.ticks.y = element_blank(),
      axis.ticks = element_blank(),
      strip.background = element_blank(), 
      complete = TRUE
    )
}

Geschäfte zu Behinderung herunterladen

deutsche Geschäfte

behinderung <- get_data(
  table = "Business",
  Title = "~Behind",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "DE"
)
head(behinderung)
colnames(behinderung)
length(behinderung$ID)
# 223 mit "Behind" im  Titel, manuell überprüfen!!
# write.xlsx(behinderung,"/Users/alexandrawuermli/Dropbox/Studium/datenjournalismus/blog/behind.xlsx")

# nach überprüfung nur noch 186
#behinderung2<- read.xlsx("/Users/alexandrawuermli/Dropbox/Studium/datenjournalismus/blog/behind.xlsx")

# 37 andere Themen, rausfiltern
behinderung1 <- behinderung %>%
  filter(!(BusinessShortNumber %in% c("02.1048", "02.3756", 
"06.3708","07.3679","08.3504","09.1083","09.5408","10.3130","10.5010","10.5443","11.1028","11.3398","11.4004","11.5037","12.3889","13.4089","13.5178","14.462","14.1031","14.3082","14.3316","15.3275","16.3313","16.3411","16.3529","16.3575","16.5084","17.3377","18.1075","18.3229","18.4373","18.5226","19.3333","19.3892","19.3923","19.4116","19.5500")))
behinderung1

französische Geschäfte

behinderung_f <- get_data(
  table = "Business",
  Title = "~handica",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "FR"
)
head(behinderung_f)
# 171 mit "Behind" im  Titel, manuell überprüfen!!


library("openxlsx")
#write.xlsx(behinderung_f,"/Users/alexandrawuermli/Dropbox/Studium/datenjournalismus/blog/behind_f.xlsx")

behinderung1_f <- behinderung_f %>%
  filter(!(BusinessShortNumber %in% c("02.1061", "12.4097")))
behinderung1_f
# Variable unter hinzufügen, um danach zwischen den Geschäften differenzieren können
behinderung1 <- behinderung1 %>%
  mutate(unter="Behinderung")
behinderung1

behinderung1_f <- behinderung1_f %>%
  mutate(unter="Behinderung")
behinderung1_f

Geschäfte zu anderen Themen herunterladen

# deutsch
asyl<- get_data(
  table = "Business",
  Title = "~asyl",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "DE"
)
head(asyl)
asyl<- asyl %>%
  mutate(unter="Asyl")
asyl
length(asyl$ID) # 799 geschäfte

# franz
asyl_f <- get_data(
  table = "Business",
  Title = "~asil",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "FR"
)
head(asyl_f)
length(asyl_f$ID)
# 803 mit "asil" im  Titel

asyl_f<- asyl_f %>%
  mutate(unter="Asyl")
asyl_f
frauen <- get_data(
  table = "Business",
  Title = "~frau",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "DE"
)

length(frauen$ID)
# 380 mit frau im  Titel
frauen<- frauen %>%
  mutate(unter="Frauen")
frauen

# franz
frau_f <- get_data(
  table = "Business",
  Title = "~femme",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "FR"
)
head(frau_f)
length(frau_f$ID)
# 368 mit "femme" im  Titel

frau_f<- frau_f %>%
  mutate(unter="Frauen")
frau_f
klima <- get_data(
  table = "Business",
  Title = "~klima",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "DE"
)


head(klima)
length(klima$ID)
klima<- klima %>%
  mutate(unter="Klima")
klima

klima_f <- get_data(
  table = "Business",
  Title = "~climat",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "FR"
)
head(klima_f)
length(klima_f$ID)
# 350 mit "femme" im  Titel
klima_f<- klima_f %>%
  mutate(unter="Klima")
klima_f
flücht <- get_data(
  table = "Business",
  Title = "~flücht",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "DE"
)


head(flücht)
length(flücht$ID) # 335

flücht<- flücht %>%
  mutate(unter="Geflüchtete")
flücht

flucht_f <- get_data(
  table = "Business",
  Title = "~refug",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "FR"
)
head(flucht_f)
length(flucht_f$ID)
# 322 

flucht_f<- flucht_f %>%
  mutate(unter="Geflüchtete")
flucht_f
ahv <- get_data(
  table = "Business",
  Title = "~ahv",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "DE"
)


head(ahv)
length(ahv$ID) #334
ahv<- ahv %>%
  mutate(unter="AHV")
ahv

ahv_f <- get_data(
  table = "Business",
  Title = "~avs",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "FR"
)
head(ahv_f)
length(ahv_f$ID)
# 331

ahv_f<- ahv_f %>%
  mutate(unter="AHV")
ahv_f
bildung <- get_data(
  table = "Business",
  Title = "~bildung",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "DE"
)


head(bildung)
length(bildung$ID)

bildung<- bildung %>%
  mutate(unter="Bildung")
bildung


bildung_f <- get_data(
  table = "Business",
  Title = "~formation",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "FR"
)
head(bildung_f)
length(bildung_f$ID)
# 1208

bildung_f<- bildung_f %>%
  mutate(unter="Bildung")
bildung_f
covid <- get_data(
  table = "Business",
  Title = "~covid",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "DE"
)


head(covid)
length(covid$ID)

covid<- covid %>%
  mutate(unter="Covid-19")
covid

covid_f <- get_data(
  table = "Business",
  Title = "~covid",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "FR"
)
head(covid_f)
length(covid_f$ID)
# 331

covid_f<- covid_f %>%
  mutate(unter="Covid-19")
covid_f
armee <- get_data(
  table = "Business",
  Title = "~armee",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "DE"
)


head(armee)
length(armee$ID)
armee<- armee %>%
  mutate(unter="Armee")
armee

armee_f <- get_data(
  table = "Business",
  Title = "~armée",
  SubmissionDate = c(">1991-01-01", "<2020-12-31"), 
  Language = "FR"
)
head(armee_f)
length(armee_f$ID)
# 531

armee_f<- armee_f %>%
  mutate(unter="Armee")
armee_f
beh<- rbind(behinderung1,behinderung1_f)
save(beh, file=paste("behinderung_final",".Rda", sep=""))
load("behinderung_final.Rda")
data1<- beh %>%
  mutate(date= year(SubmissionDate)) %>%
  select(date, Title) %>%
    group_by(date) %>%
  summarise(n = n()) %>%
rename(
    n_behin = n )

Abbildung 1

#column-line-timeline
plot3<-ggplot(data1, aes(x=date, y = n_behin)) + 
  geom_col(aes( fill= "#3d5a80" )) +
geom_ma(ma_fun = SMA, n = 7, aes(color = "#abd9e9")) +
   scale_fill_manual(values=c("#3d5a80"), labels = c("absolute Anzahl", "gleitender 5-Jahresdurchschnitt"))+
   scale_color_manual(values=c("#abd9e9"), labels = c( "gleitender 7-Jahresdurchschnitt"))+
  annotate(
    geom = "curve", x = 2016, y = 24, xend = 2014, yend = 10, 
    curvature = -.1, arrow = arrow(length = unit(2, "mm"))
  ) +
  annotate(geom = "text", x = 2012, y = 28, 
           label = "Ratifizierung der \nBehindertenrechtskonvention (BRK),\nApril 2014",
           family = "sans",
           size = 3,
           hjust = "left") +
  annotate(
    geom = "curve", x = 2002, y = 28, xend = 2004, yend = 23, 
    curvature = -.2, arrow = arrow(length = unit(2, "mm"))
  ) +
  annotate(geom = "text", x = 1999, y = 30, 
         label = "Inkrafttreten des Behinderten- \ngleichstellungsgesetz (BehiG), \nJanuar 2004 ",
         family = "sans",
         size = 3,
         hjust = "left") +
  
  
  annotate(
    geom = "curve", x = 2018, y = 38, xend = 2019, yend = 42, 
    curvature = -.2, arrow = arrow(length = unit(2, "mm"))
  ) +
  annotate(geom = "text", x = 2015, y = 37, 
         label = "Beginn der Corona-Krise",
         family = "sans",
         size = 3,
         hjust = "left") +
  
    labs(title = "Abb. 1: Leicht steigende Tendenz beim Thema Behinderung", subtitle= "Anzahl der eingereichten Geschäfte, in denen es um Behinderung geht", caption = "Daten: parlament.ch", x = "Jahr",y = "Anzahl Geschäfte") +
  theme_aw() +theme(legend.position = "bottom")

ggsave(plot3, file = "abb.1.png", width = 12, height = 7)
plot3

alle Datensätze zu einem grossen zusammenfügen

# datensätze zusammensetzen
data2<-rbind(behinderung1,behinderung1_f, armee, armee_f,frauen,frau_f,asyl, asyl_f, klima, klima_f, flücht,flucht_f, ahv, ahv_f, covid,covid_f, bildung, bildung_f)
save(data2, file=paste("datensatz_final",".Rda", sep=""))
load("datensatz_final.Rda")

Abbildung 2

plot2<-data2%>%
  select(Title, unter)%>%
group_by(unter)%>%
  summarise(n = n())%>%
arrange(desc(n)) %>% 
ggplot(aes(x=fct_reorder(unter, n), y = n)) +
  geom_bar(stat = "identity", fill = "#3d5a80", color = "white")+
  geom_text(
      aes(
        y = n,
        label = n
      ), 
      position = position_stack(vjust = 0.5),
      color = "white",
      family = "Helvetica",
      size = 5
    ) +
labs(title = "Abb. 2: Im Vergleich hinkt das Thema Behinderung hinterher", subtitle= "Anzahl der eingereichten Geschäfte im Vergleich", caption = "Daten: parlament.ch", x = "Themen",y = "Anzahl Geschäfte") +
  theme_aw() 
`summarise()` ungrouping output (override with `.groups` argument)
ggsave(plot2, file = "abb.2.png", width = 12, height = 7)
plot2

Umbenennen

data2$BusinessTypeName[data2$BusinessTypeName == "Question ordinaire"] <- "Einfache Anfrage"
data2$BusinessTypeName[data2$BusinessTypeName == "Recommandation"] <- "Empfehlung"
data2$BusinessTypeName[data2$BusinessTypeName == "Heure des questions. Question"] <- "Fragestunde. Frage"
data2$BusinessTypeName[data2$BusinessTypeName == "Initiative déposée par un canton"] <- "Standesinitiative"
data2$BusinessTypeName[data2$BusinessTypeName == "Question ordinaire urgente"] <- "Dringliche Einfache Anfrage"
data2$BusinessTypeName[data2$BusinessTypeName == "Question urgente"] <- "Dringliche Anfrage"
data2$BusinessTypeName[data2$BusinessTypeName == "Objet du Parlement"    ] <- "Geschäft des Parlaments"
data2$BusinessTypeName[data2$BusinessTypeName == "Initiative parlementaire"   ] <- "Parlamentarische Initiative"
data2$BusinessTypeName[data2$BusinessTypeName == "Pétition"   ] <- "Petition"
data2$BusinessTypeName[data2$BusinessTypeName == "Objet du Conseil fédéral"  ] <- "Geschäft des Bundesrates"
data2$BusinessTypeName[data2$BusinessTypeName == "Question"  ] <- "Anfrage"
data2$BusinessTypeName[data2$BusinessTypeName == "Interpellation urgente"] <- "Dringliche Interpellation"
data3<-data2 %>%
  mutate(date = year(SubmissionDate)) %>%
  select(date,unter, BusinessTypeName) %>%
    group_by(unter, BusinessTypeName) %>%
  summarise(Percentage=n()) %>% 
  na.omit() %>%
  group_by(unter) %>% 
  mutate(pcent=Percentage/sum(Percentage)*100)%>% 
filter(pcent>1)

Abbildung 3

# Businness Type Behinderung
plot4<-data3 %>%
  ungroup %>%
    mutate(unter = as.factor(unter),
           BusinessTypeName = reorder_within(BusinessTypeName, pcent, unter)) %>%
ggplot(aes(BusinessTypeName, pcent,fill= unter)) +
  geom_point(size=2, color=ifelse(data3$BusinessTypeName %in% c("Petition", "Parlamentarische Initiative", "Geschäft des Bundesrates" , "Motion" , "Standesinitiative"), "#abd9e9", "#3d5a80"), show.legend = FALSE) + 
   geom_segment(aes(x=BusinessTypeName, xend=BusinessTypeName, y=0, yend=pcent), color="grey")  +
  geom_text(aes(label = sprintf("%.0f%%", pcent)), vjust = 0.5, hjust = -0.5, size = 3, color = "black") +
    labs(title = "Abb. 3: Es wird vor allem geredet..", subtitle= "Vergleich zwischen der Art der Geschäfte (in %)", caption = "Daten: parlament.ch", x = "",y = "") +
  theme_light() +
  theme(
    panel.grid.major.x = element_blank(),
    panel.border = element_blank(),
    axis.ticks.x = element_blank()) +
facet_wrap(~ unter, scales = "free_y")+
  scale_x_reordered() +
    scale_y_continuous(limits=c(0, 60),labels = scales::label_percent(scale=1)) +
    coord_flip() +
    theme_aw() 

ggsave(plot4, file = "abb.3.png", width = 15, height = 12)
plot4 

um die Texte zu den Geschäften herunterzuladen, brauchen wir zuerst die BusinessShortNumber.

df<-behinderung1 %>% 
  select(BusinessShortNumber, Title) 
df
# 186 Geschäfte deutsch

df1<-behinderung1_f %>% 
  select(BusinessShortNumber, Title) 
df1
# 169 Geschäfte franz

Texte zu Geschäfte herunterladen

deutsch

beh_d <- swissparl::get_data(
  table = "SubjectBusiness",
  BusinessShortNumber = df$BusinessShortNumber,
  Language = "DE"
  )
beh_d
transcripts_beh_d<- swissparl::get_data(
  table = "Transcript", 
  IdSubject = as.numeric(beh_d$IdSubject),
  Language = "DE",
  Type = 1,
  LanguageOfText = "DE"
  )
transcripts_beh_d
length(transcripts_beh_d$Text)
# 326 Texte BR, NR, ST


# zur sicherheit speichern
#saveRDS(transcripts_beh_d, file = "transcripts_beh_deutsch.RDS") 
#readRDS("transcripts_beh.RDS") 

Texte zu Geschäfte herunterladen

franz

beh_f <- swissparl::get_data(
  table = "SubjectBusiness",
  BusinessShortNumber = df1$BusinessShortNumber,
  Language = "FR"
  )
beh_f

transcripts_beh_f<- swissparl::get_data(
  table = "Transcript", 
  IdSubject = as.numeric(beh_f$IdSubject),
  Language = "FR",
  Type = 1,
  LanguageOfText = "FR"
  )
transcripts_beh_f
length(transcripts_beh_f$Text)
# 129

# zur sicherheit speichern
#saveRDS(transcripts_beh_f, file = "transcripts_beh_franz.RDS") 
#readRDS("transcripts_beh_franz.RDS") 

Zusammenfügen der Texte

transcripts_beh<- rbind(transcripts_beh_f, transcripts_beh_d)
#saveRDS(transcripts_beh, file = "transcripts_final.RDS") 
transcripts_beh<-readRDS("transcripts_final.RDS") 

Daten vorbereiten

alle_texte <- transcripts_beh %>%
  mutate(Text2 = clean_text(Text, keep_round_brackets = F))
head(alle_texte)

alle_texte %<>%
  filter(!SpeakerLastName == "leer") %>% 
  filter(!SpeakerFunction %in% c("1VP-F", "1VP-M", "2VP-F", "2VP-M", "AP-M", "P-F", "P-M")) %>% 
  filter(!Function %in% c("1VP-M", "2VP-M", "P-F", "p-m", "P-m", "P-M", "P-MM")) %>%
  filter(!SpeakerFullName == "Thurnherr Walter") %>%
  filter(!CouncilName %in% c("Bundesrat", "Conseil fédéral")) 
length(alle_texte$Text2)

Fraktionen umbenennen

alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe de l'Union démocratique du Centre"] <- "Fraktion der Schweizerischen Volkspartei"
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe radical-libéral"] <- "FDP Fraktion"
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe libéral-radical"] <- "FDP Fraktion"
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe PDC/PEV/PVL"] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe PDC/PEV/PVL"] <- "Die Mitte-Fraktion. Die Mitte. EVP."

alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Le Groupe du Centre. Le Centre. PEV."] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Christlichdemokratische Fraktion"    ] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe PDC"   ] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "CVP-Fraktion"   ] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe PDC-PEV"  ] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe PDC/PEV/PVL"  ] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe démocrate-chrétien"] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe socialiste"] <- "Sozialdemokratische Fraktion"
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe des VERT-E-S"] <- "Grüne Fraktion"
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Groupe écologiste"] <- "Grüne Fraktion"
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Fraktion CVP-EVP" ] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "CVP-EVP-BDP Fraktion"  ] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Fraktion CVP/EVP/glp" ] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Evangelische und Unabhängige Fraktion" ] <- "Die Mitte-Fraktion. Die Mitte. EVP."
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Fraktion BD" ] <- "Die Mitte-Fraktion. Die Mitte. EVP."

alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Liberale Fraktion"] <-  "FDP Fraktion"
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "FDP-Liberale Fraktion"] <-  "FDP Fraktion"
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Freisinnig-demokratische Fraktion"] <-  "FDP Fraktion"
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Fraktion der Schweizerischen Volkspartei"] <-  "SVP Fraktion"
alle_texte$ParlGroupName[alle_texte$ParlGroupName == "Sozialdemokratische Fraktion"] <-  "SP Fraktion"
unique(alle_texte$ParlGroupName)
stopwords("de")
stopwords("fr")[1:150]
mystopwords <- c( "Behinderung", "Behinderungen","initiative", "gesetzes", "neuen", "punkt", "gar", "sollten" ,"stellen", "behinderte", "behinderten", "menschen", "frage", "sei", "wichtig", "folgen", "Kommissionsmehrheit", "sieht","monate", "ausgeht","person","gesetz","sollen","beiden","weit","gehen","besteht","möglich", "genau","block", "kollege"," möglichst", "müssen","mehr","bitte","geht","sich","tun" ,"gibt","darf", "möchte","für", "dass", "letzte", "letzt", "letzter", "letztes", "vorletzte", "ausserdem", "bereits", "erster", "zweiter", "dritter", "erste", "zweite", "dritte", "erstens", "zweitens", "drittens", "grundsätzlich", "bereich", "kantone",
                 "soeben", "nebst", "neben", "kurz" , "immer" , "selten" , "nie" , "manchmal" , "oft" , "zwischendurch" , "seitdem", "erst",
                 "ja", "z.B.", "der", "die", "das", "ab", "deshalb", "dafür", "heute", "sofort", "danach", "schon", "bald", "haben", "hat", "habt", "hatten",
                 "wäre", "viele", "vieles", "vielen", "vielem", "einfach", "so", "davon", "vielleicht", "weil", "aufgrund", "gerade", "wurden", "gegen", "wider",
                 "wurde", "wurdest", "deshalb", "dafür", "darum", "dagegen", "selbst", "selber", "weitere", "weiteres", "weiterer", "ganz", "eben", "direkt", 
                 "notre", "avons", "avez", "ont", "la", "le", "de", "I", "dovra", "Conseil", "fédéral", "Bundesrat", "Bundesrates", "Bundesräte", "confédération",
                 "Nationalrat", "Ständerat", "für", "dass", "commission", "Kommission", "letzte", "letzt", "letzter", "letztes", "vorletzte", "Minderheit", "Mehrheit",
                 "Vorlage", "Motion", "Artikel", "Absatz", "soeben", "nebst", "neben", "gleich", "ja", "nein", "z.B.", "seit", "rund", "klar", "Prozent",
                 "ausserdem", "bereits", "Antrag", "wirklich", "auch", "ebenfalls", "der", "die", "das", "ab", "deshalb", "dafür", "heute", "sofort", 
                 "daher", "natürlich", "insbesondere", "zudem", "darauf", "nämlich", "dabei","eigentlich", "schon", "sowie", "gemäss", "gleichzeitig", 
                 "Beispiel", "beim", "letzten","worden","insgesamt", "deshalb", "dafür", "darum", "dagegen", "selbst", "selber", "weitere",    "weiteres",
                 "weiterer", "ganz", "entsprechend", "entsprechendes","entsprechender", "notre", "avons", "avez", "ont", "domain", "certain", "majorité", "minorité", 
                 "la", "le", "de", "I", "dovra", "donc", "c'est","plus", "puisque", "pendant", "ni", "fair", "fait", "être", "tout", "tous", "toutes", "toute",
                 "aussi", "enfaite", "souvent", "aujourd'hui", "en effet", "lorsque", "donc", "l'article", "n'est", "c'est", "elle", "elles", "contre","cent",
                 "ussa", "nostro", "c'è", "che", "per", "a", "e", "di", "perche", "z.B", "ein", "zwei", "drei", "vier", "unserer", "unsere", "unser","déjà",
                 "b", "z", "i", "ii", "d'un", "d'autre", "1a", "1", "2", "3", "4", "h", "a", "cas", "mais", "un", "deux", "trois", "quatre", "cinq", "faut",
                 "d'une", "sagen", "gesagt", "très", "sehr", "herr", "frau", "monsieur", "madame", "également", "comme", "évidemment", "déjà", "l'on",
                 "où", "soutien", "concernant", "oui", "non", "si", "qu'il", "qu'elle", "qu'ils", "qu'elles", "encore", "ainsi", "entre", "lors", "dont", 
                 "2019", "2020", "2021", "demande", "question", "pour", "cent", "personnes", "handicapées", "bien", "loi" , "handicapés", "l'initiative", "peut", "handicap", "suisse", "alinéa", "faire")
#corpus machen
beh_corpus <- corpus(
    alle_texte$Text2,
    docnames = alle_texte$ID,
    docvars = alle_texte %>% select(-Text, -Text2)
    ) 

beh_corpus

#Tokenisieren
beh_toks <- tokens(beh_corpus,
                       remove_punct=T,
                       remove_numbers=T, remove_symbols=T)

beh_corpus_final <- beh_toks %>%
  tokens_remove(stopwords('de')) %>%
  tokens_remove(stopwords('fr')) %>%
  tokens_remove(mystopwords)

# Create dfm
beh_dfm <- dfm(beh_corpus_final,
               tolower = T,) 
beh_dfm 

Welche Parteien/Fraktionen/ParlamentarierInnen beschäftigen sich am meisten mit diesem Thema Behinderung?

#ParlamentarierInnen 
alle_texte$CouncilName[alle_texte$CouncilName == "Conseil des Etats"] <-  "Ständerat"
alle_texte$CouncilName[alle_texte$CouncilName == "Conseil national"] <-  "Nationalrat"
unique(alle_texte$CouncilName)


most_speeches_speaker <- alle_texte %>%
  group_by(SpeakerFullName, ParlGroupName, CouncilName ) %>%
   summarise(n=n()) %>%
  arrange(desc(n))%>%
filter(n>3)

Tabelle erstellen


SpeakerFullName <- as.character(unique(most_speeches_speaker$SpeakerFullName))
ParlGroupName <- as.character(unique(most_speeches_speaker$ParlGroupName))
Council <- as.character(unique(most_speeches_speaker$CouncilName))
Reden <- as.character(most_speeches_speaker$n)


table <- as.data.frame(cbind(SpeakerFullName, ParlGroupName, Council, Reden))
colnames(table) <- c("ParlamentarierIn", "Fraktion","Rat", "Anzahl Reden")
  table %>%
kable(row.names = F) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = T, fixed_thead = T, font_size = 13) %>%
 save_kable(file = "table_2.html",
             zoom = 1.5)
  
brändli<-alle_texte%>%
  filter(SpeakerLastName =="Brändli")
brändli

Abbildung 4

p1 <- ggplot(data = most_speeches_speaker) +
    aes(x = fct_reorder(SpeakerFullName, n), y = n) +
    geom_point(size=2, color="#3d5a80", show.legend = FALSE) + 
   geom_segment(aes(x=SpeakerFullName, xend=SpeakerFullName, y=0, yend=n), color="grey")+
    labs(title = "Abb. 4: Ch. Brändli von der SVP hat am Meisten gesprochen", subtitle = "Anzahl Reden im Vergleich", caption = "Daten: parlament.ch", y = "Anzahl", x = "") +
  coord_flip() +
theme_light() +
theme_aw() 


ggsave(p1, file = "abb.7.png", width = 11, height = 7)
partei <- alle_texte %>%
  group_by(ParlGroupName) %>%
  summarise(n=n()) %>%
  mutate(pcent=n/sum(n)*100)%>% 
  arrange(desc(n))

Abbildung 4

#plot Redeanteil nach parteien
p2 <- ggplot(data = partei) +
    aes(x = fct_reorder(ParlGroupName, pcent), y = pcent) +
    geom_point(size=6, color=c( "#dd0e0e", "#ff9100",  "#3a8bc1",  "#0a7228", 
                                "#66cc00", "#a0a000")) + 
   geom_segment(aes(x=ParlGroupName, xend=ParlGroupName, y=0, yend=pcent), color="grey")+
   geom_text(aes(label = sprintf("%.0f%%", pcent)), vjust = -1.7, hjust = 0.5, size = 3, color = "black")+
    labs(title = "Abb. 4: Ingesamt spricht die SP-Fraktion am häufigsten über Behinderung", subtitle = "Anzahl Wortbeträge im Vergleich (in %)", caption = "Daten: parlament.ch", y = "Prozent", x = "") +
  coord_flip() +
  scale_y_continuous(limits=c(0, 30),labels = scales::label_percent(scale=1))+
theme_light() +
theme_aw() +
  theme(axis.text.x = element_text(size=10))

p2
ggsave(p2, file = "abb.6.png", width = 12, height = 7)

textplot_wordcloud(beh_dfm, max_words = 50, min_count=5,
                                    color = RColorBrewer::brewer.pal(9, "GnBu")[3:8], random_order = FALSE,random_color=FALSE, rotation=0.25)

beh_freq <- textstat_frequency(beh_dfm , n=50)

Abbildung 5

png("Abb.5.png",width=10,height=12,units = "in",res=300)
                 textplot_wordcloud(beh_dfm, max_words = 50, min_count=5,color = RColorBrewer::brewer.pal(9, "GnBu")[3:8], random_order = FALSE,random_color=FALSE, rotation=0.25)
title("Abb. 5: Gleichstellung ist das meistverwendete Wort",cex.main = 1.8,
       font.main= 2,col.main="#05032d",adj=0)
mtext("Daten: parlament.ch", cex=1,side=1, line=3, adj = 1, col="grey30")
mtext("Die am häufigsten genannten Begriffe nach Anzahl Erwähnungen", cex=1.5,side=3, adj = 0, col="#05032d")

Kontext überprüfen

kwic(beh_corpus_final, phrase("integration")) 
kwic(beh_corpus_final, phrase("gleichstellung")) 
kwic(beh_corpus_final, phrase("bauten")) 
kwic(beh_corpus_final, phrase("kinder")) 
kwic(beh_corpus_final, phrase("franken")) 
kwic(beh_corpus_final, phrase("kosten")) 
LS0tCnRpdGxlOiAiUi1Db2RlIHp1bSBCbG9nYmVpdHJhZyIKYXV0aG9yOiAiQWxleGFuZHJhIFfDvHJtbGkiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9CiNybShsaXN0PWxzKGFsbD1UUlVFKSkKIyBzZXQgd29ya2luZyBkaXJlY3RvcnkKc2V0d2QoIi9Vc2Vycy9hbGV4YW5kcmF3dWVybWxpL0Ryb3Bib3gvU3R1ZGl1bS9kYXRlbmpvdXJuYWxpc211cy9ibG9nIikKbGlzdC5vZi5wYWNrYWdlcyA8LSBjKCJkcGx5ciIsICJxdWFudGVkYSIsICJmb3JlaWduIiwiZ2dwbG90MiIsIm1hZ3JpdHRyIiwibHVicmlkYXRlIiwgInBsb3RseSIsICJnZ3RoZW1lcyIsICJzdHJpbmdyIiwgInN3aXNzcGFybCIsICJ0aWR5dmVyc2UiLCAic3RhdHMiLCAiZ2dhbHQiLCAiUkNvbG9yQnJld2VyIiwgImRhdGEudGFibGUiLCAiZ2dwdWJyIiwgInB1cnJyIiwgImdnd29yZGNsb3VkIiwgInpvbyIsICJUVFIiLCAidGlkeXF1YW50IiwgInN0cmluZ3IiLCAicHVycnIiLCAib3Blbnhsc3giLCAicXVhbnRlZGEudGV4dHN0YXRzIiwgImRlZXBsciIsICJ0aWR5ciIsICJ0aWR5dGV4dCIsICJrYWJsZUV4dHJhIiwibWFnaWNrIiwgIndlYnNob3QiKQoKCmxhcHBseShsaXN0Lm9mLnBhY2thZ2VzLCByZXF1aXJlLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpCmBgYAoKCmBgYHtyfQp0aGVtZV9hdyA8LSBmdW5jdGlvbihiYXNlX3NpemUgPSAxOCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9mYW1pbHkgPSAiSGVsdmV0aWNhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2xpbmVfc2l6ZSA9IGJhc2Vfc2l6ZSAvIDE3MCwKICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3JlY3Rfc2l6ZSA9IGJhc2Vfc2l6ZSAvIDE3MCl7CiAgZ2dwbG90Mjo6dGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSBiYXNlX3NpemUsIAogICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9mYW1pbHkgPSBiYXNlX2ZhbWlseSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfbGluZV9zaXplID0gYmFzZV9saW5lX3NpemUpICUrcmVwbGFjZSUKICAgIGdncGxvdDI6OnRoZW1lKAogICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gcmdiKDIyLCAzOCwgNDYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heENvbG9yVmFsdWUgPSAyNTApLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSksCiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSByZ2IoMjIsIDM4LCA0NiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q29sb3JWYWx1ZSA9IDI1MCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSByZWwoMC43NSkpLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSByZ2IoMjIsIDM4LCA0NiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDb2xvclZhbHVlID0gMjUwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gcmVsKDAuNykpLCAgCiAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSByZ2IoMjIsIDM4LCA0NiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q29sb3JWYWx1ZSA9IDI1MCksIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpCiAgICAsCiAgICAgIHBhbmVsLmdyaWQubWlub3IueSAgPSBlbGVtZW50X2xpbmUocmdiKDE1OSwgMTYyLCAxNzgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDb2xvclZhbHVlID0gMjUwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBzaXplID0gcmVsKDQpKSwKICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLAogICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICBjb21wbGV0ZSA9IFRSVUUKICAgICkKfQpgYGAKCiMjIyBHZXNjaMOkZnRlIHp1IEJlaGluZGVydW5nIGhlcnVudGVybGFkZW4KIyMjIGRldXRzY2hlIEdlc2Now6RmdGUKYGBge3IsZWNobz1UUlVFLGV2YWw9RkFMU0V9CmJlaGluZGVydW5nIDwtIGdldF9kYXRhKAogIHRhYmxlID0gIkJ1c2luZXNzIiwKICBUaXRsZSA9ICJ+QmVoaW5kIiwKICBTdWJtaXNzaW9uRGF0ZSA9IGMoIj4xOTkxLTAxLTAxIiwgIjwyMDIwLTEyLTMxIiksIAogIExhbmd1YWdlID0gIkRFIgopCmhlYWQoYmVoaW5kZXJ1bmcpCmNvbG5hbWVzKGJlaGluZGVydW5nKQpsZW5ndGgoYmVoaW5kZXJ1bmckSUQpCiMgMjIzIG1pdCAiQmVoaW5kIiBpbSAgVGl0ZWwsIG1hbnVlbGwgw7xiZXJwcsO8ZmVuISEKIyB3cml0ZS54bHN4KGJlaGluZGVydW5nLCIvVXNlcnMvYWxleGFuZHJhd3Vlcm1saS9Ecm9wYm94L1N0dWRpdW0vZGF0ZW5qb3VybmFsaXNtdXMvYmxvZy9iZWhpbmQueGxzeCIpCgojIG5hY2ggw7xiZXJwcsO8ZnVuZyBudXIgbm9jaCAxODYKI2JlaGluZGVydW5nMjwtIHJlYWQueGxzeCgiL1VzZXJzL2FsZXhhbmRyYXd1ZXJtbGkvRHJvcGJveC9TdHVkaXVtL2RhdGVuam91cm5hbGlzbXVzL2Jsb2cvYmVoaW5kLnhsc3giKQoKIyAzNyBhbmRlcmUgVGhlbWVuLCByYXVzZmlsdGVybgpiZWhpbmRlcnVuZzEgPC0gYmVoaW5kZXJ1bmcgJT4lCiAgZmlsdGVyKCEoQnVzaW5lc3NTaG9ydE51bWJlciAlaW4lIGMoIjAyLjEwNDgiLCAiMDIuMzc1NiIsIAoiMDYuMzcwOCIsIjA3LjM2NzkiLCIwOC4zNTA0IiwiMDkuMTA4MyIsIjA5LjU0MDgiLCIxMC4zMTMwIiwiMTAuNTAxMCIsIjEwLjU0NDMiLCIxMS4xMDI4IiwiMTEuMzM5OCIsIjExLjQwMDQiLCIxMS41MDM3IiwiMTIuMzg4OSIsIjEzLjQwODkiLCIxMy41MTc4IiwiMTQuNDYyIiwiMTQuMTAzMSIsIjE0LjMwODIiLCIxNC4zMzE2IiwiMTUuMzI3NSIsIjE2LjMzMTMiLCIxNi4zNDExIiwiMTYuMzUyOSIsIjE2LjM1NzUiLCIxNi41MDg0IiwiMTcuMzM3NyIsIjE4LjEwNzUiLCIxOC4zMjI5IiwiMTguNDM3MyIsIjE4LjUyMjYiLCIxOS4zMzMzIiwiMTkuMzg5MiIsIjE5LjM5MjMiLCIxOS40MTE2IiwiMTkuNTUwMCIpKSkKYmVoaW5kZXJ1bmcxCmBgYAojIyMgZnJhbnrDtnNpc2NoZSBHZXNjaMOkZnRlCmBgYHtyLGVjaG89VFJVRSxldmFsPUZBTFNFfQpiZWhpbmRlcnVuZ19mIDwtIGdldF9kYXRhKAogIHRhYmxlID0gIkJ1c2luZXNzIiwKICBUaXRsZSA9ICJ+aGFuZGljYSIsCiAgU3VibWlzc2lvbkRhdGUgPSBjKCI+MTk5MS0wMS0wMSIsICI8MjAyMC0xMi0zMSIpLCAKICBMYW5ndWFnZSA9ICJGUiIKKQpoZWFkKGJlaGluZGVydW5nX2YpCiMgMTcxIG1pdCAiQmVoaW5kIiBpbSAgVGl0ZWwsIG1hbnVlbGwgw7xiZXJwcsO8ZmVuISEKCgpsaWJyYXJ5KCJvcGVueGxzeCIpCiN3cml0ZS54bHN4KGJlaGluZGVydW5nX2YsIi9Vc2Vycy9hbGV4YW5kcmF3dWVybWxpL0Ryb3Bib3gvU3R1ZGl1bS9kYXRlbmpvdXJuYWxpc211cy9ibG9nL2JlaGluZF9mLnhsc3giKQoKYmVoaW5kZXJ1bmcxX2YgPC0gYmVoaW5kZXJ1bmdfZiAlPiUKICBmaWx0ZXIoIShCdXNpbmVzc1Nob3J0TnVtYmVyICVpbiUgYygiMDIuMTA2MSIsICIxMi40MDk3IikpKQpiZWhpbmRlcnVuZzFfZgoKYGBgCgpgYGB7cixlY2hvPVRSVUUsZXZhbD1GQUxTRX0KIyBWYXJpYWJsZSB1bnRlciBoaW56dWbDvGdlbiwgdW0gZGFuYWNoIHp3aXNjaGVuIGRlbiBHZXNjaMOkZnRlbiBkaWZmZXJlbnppZXJlbiBrw7ZubmVuCmJlaGluZGVydW5nMSA8LSBiZWhpbmRlcnVuZzEgJT4lCiAgbXV0YXRlKHVudGVyPSJCZWhpbmRlcnVuZyIpCmJlaGluZGVydW5nMQoKYmVoaW5kZXJ1bmcxX2YgPC0gYmVoaW5kZXJ1bmcxX2YgJT4lCiAgbXV0YXRlKHVudGVyPSJCZWhpbmRlcnVuZyIpCmJlaGluZGVydW5nMV9mCmBgYAojIyMgR2VzY2jDpGZ0ZSB6dSBhbmRlcmVuIFRoZW1lbiBoZXJ1bnRlcmxhZGVuCgpgYGB7cixlY2hvPVRSVUUsZXZhbD1GQUxTRX0KIyBkZXV0c2NoCmFzeWw8LSBnZXRfZGF0YSgKICB0YWJsZSA9ICJCdXNpbmVzcyIsCiAgVGl0bGUgPSAifmFzeWwiLAogIFN1Ym1pc3Npb25EYXRlID0gYygiPjE5OTEtMDEtMDEiLCAiPDIwMjAtMTItMzEiKSwgCiAgTGFuZ3VhZ2UgPSAiREUiCikKaGVhZChhc3lsKQphc3lsPC0gYXN5bCAlPiUKICBtdXRhdGUodW50ZXI9IkFzeWwiKQphc3lsCmxlbmd0aChhc3lsJElEKSAjIDc5OSBnZXNjaMOkZnRlCgojIGZyYW56CmFzeWxfZiA8LSBnZXRfZGF0YSgKICB0YWJsZSA9ICJCdXNpbmVzcyIsCiAgVGl0bGUgPSAifmFzaWwiLAogIFN1Ym1pc3Npb25EYXRlID0gYygiPjE5OTEtMDEtMDEiLCAiPDIwMjAtMTItMzEiKSwgCiAgTGFuZ3VhZ2UgPSAiRlIiCikKaGVhZChhc3lsX2YpCmxlbmd0aChhc3lsX2YkSUQpCiMgODAzIG1pdCAiYXNpbCIgaW0gIFRpdGVsCgphc3lsX2Y8LSBhc3lsX2YgJT4lCiAgbXV0YXRlKHVudGVyPSJBc3lsIikKYXN5bF9mCmBgYAoKYGBge3IsZWNobz1UUlVFLGV2YWw9RkFMU0V9CmZyYXVlbiA8LSBnZXRfZGF0YSgKICB0YWJsZSA9ICJCdXNpbmVzcyIsCiAgVGl0bGUgPSAifmZyYXUiLAogIFN1Ym1pc3Npb25EYXRlID0gYygiPjE5OTEtMDEtMDEiLCAiPDIwMjAtMTItMzEiKSwgCiAgTGFuZ3VhZ2UgPSAiREUiCikKCmxlbmd0aChmcmF1ZW4kSUQpCiMgMzgwIG1pdCBmcmF1IGltICBUaXRlbApmcmF1ZW48LSBmcmF1ZW4gJT4lCiAgbXV0YXRlKHVudGVyPSJGcmF1ZW4iKQpmcmF1ZW4KCiMgZnJhbnoKZnJhdV9mIDwtIGdldF9kYXRhKAogIHRhYmxlID0gIkJ1c2luZXNzIiwKICBUaXRsZSA9ICJ+ZmVtbWUiLAogIFN1Ym1pc3Npb25EYXRlID0gYygiPjE5OTEtMDEtMDEiLCAiPDIwMjAtMTItMzEiKSwgCiAgTGFuZ3VhZ2UgPSAiRlIiCikKaGVhZChmcmF1X2YpCmxlbmd0aChmcmF1X2YkSUQpCiMgMzY4IG1pdCAiZmVtbWUiIGltICBUaXRlbAoKZnJhdV9mPC0gZnJhdV9mICU+JQogIG11dGF0ZSh1bnRlcj0iRnJhdWVuIikKZnJhdV9mCgpgYGAKCgpgYGB7cixlY2hvPVRSVUUsZXZhbD1GQUxTRX0Ka2xpbWEgPC0gZ2V0X2RhdGEoCiAgdGFibGUgPSAiQnVzaW5lc3MiLAogIFRpdGxlID0gIn5rbGltYSIsCiAgU3VibWlzc2lvbkRhdGUgPSBjKCI+MTk5MS0wMS0wMSIsICI8MjAyMC0xMi0zMSIpLCAKICBMYW5ndWFnZSA9ICJERSIKKQoKCmhlYWQoa2xpbWEpCmxlbmd0aChrbGltYSRJRCkKa2xpbWE8LSBrbGltYSAlPiUKICBtdXRhdGUodW50ZXI9IktsaW1hIikKa2xpbWEKCmtsaW1hX2YgPC0gZ2V0X2RhdGEoCiAgdGFibGUgPSAiQnVzaW5lc3MiLAogIFRpdGxlID0gIn5jbGltYXQiLAogIFN1Ym1pc3Npb25EYXRlID0gYygiPjE5OTEtMDEtMDEiLCAiPDIwMjAtMTItMzEiKSwgCiAgTGFuZ3VhZ2UgPSAiRlIiCikKaGVhZChrbGltYV9mKQpsZW5ndGgoa2xpbWFfZiRJRCkKIyAzNTAgbWl0ICJmZW1tZSIgaW0gIFRpdGVsCmtsaW1hX2Y8LSBrbGltYV9mICU+JQogIG11dGF0ZSh1bnRlcj0iS2xpbWEiKQprbGltYV9mCgpgYGAKCmBgYHtyLGVjaG89VFJVRSxldmFsPUZBTFNFfQpmbMO8Y2h0IDwtIGdldF9kYXRhKAogIHRhYmxlID0gIkJ1c2luZXNzIiwKICBUaXRsZSA9ICJ+ZmzDvGNodCIsCiAgU3VibWlzc2lvbkRhdGUgPSBjKCI+MTk5MS0wMS0wMSIsICI8MjAyMC0xMi0zMSIpLCAKICBMYW5ndWFnZSA9ICJERSIKKQoKCmhlYWQoZmzDvGNodCkKbGVuZ3RoKGZsw7xjaHQkSUQpICMgMzM1CgpmbMO8Y2h0PC0gZmzDvGNodCAlPiUKICBtdXRhdGUodW50ZXI9IkdlZmzDvGNodGV0ZSIpCmZsw7xjaHQKCmZsdWNodF9mIDwtIGdldF9kYXRhKAogIHRhYmxlID0gIkJ1c2luZXNzIiwKICBUaXRsZSA9ICJ+cmVmdWciLAogIFN1Ym1pc3Npb25EYXRlID0gYygiPjE5OTEtMDEtMDEiLCAiPDIwMjAtMTItMzEiKSwgCiAgTGFuZ3VhZ2UgPSAiRlIiCikKaGVhZChmbHVjaHRfZikKbGVuZ3RoKGZsdWNodF9mJElEKQojIDMyMiAKCmZsdWNodF9mPC0gZmx1Y2h0X2YgJT4lCiAgbXV0YXRlKHVudGVyPSJHZWZsw7xjaHRldGUiKQpmbHVjaHRfZgoKYGBgCgpgYGB7cixlY2hvPVRSVUUsZXZhbD1GQUxTRX0KYWh2IDwtIGdldF9kYXRhKAogIHRhYmxlID0gIkJ1c2luZXNzIiwKICBUaXRsZSA9ICJ+YWh2IiwKICBTdWJtaXNzaW9uRGF0ZSA9IGMoIj4xOTkxLTAxLTAxIiwgIjwyMDIwLTEyLTMxIiksIAogIExhbmd1YWdlID0gIkRFIgopCgoKaGVhZChhaHYpCmxlbmd0aChhaHYkSUQpICMzMzQKYWh2PC0gYWh2ICU+JQogIG11dGF0ZSh1bnRlcj0iQUhWIikKYWh2CgphaHZfZiA8LSBnZXRfZGF0YSgKICB0YWJsZSA9ICJCdXNpbmVzcyIsCiAgVGl0bGUgPSAifmF2cyIsCiAgU3VibWlzc2lvbkRhdGUgPSBjKCI+MTk5MS0wMS0wMSIsICI8MjAyMC0xMi0zMSIpLCAKICBMYW5ndWFnZSA9ICJGUiIKKQpoZWFkKGFodl9mKQpsZW5ndGgoYWh2X2YkSUQpCiMgMzMxCgphaHZfZjwtIGFodl9mICU+JQogIG11dGF0ZSh1bnRlcj0iQUhWIikKYWh2X2YKYGBgCgpgYGB7cixlY2hvPVRSVUUsZXZhbD1GQUxTRX0KYmlsZHVuZyA8LSBnZXRfZGF0YSgKICB0YWJsZSA9ICJCdXNpbmVzcyIsCiAgVGl0bGUgPSAifmJpbGR1bmciLAogIFN1Ym1pc3Npb25EYXRlID0gYygiPjE5OTEtMDEtMDEiLCAiPDIwMjAtMTItMzEiKSwgCiAgTGFuZ3VhZ2UgPSAiREUiCikKCgpoZWFkKGJpbGR1bmcpCmxlbmd0aChiaWxkdW5nJElEKQoKYmlsZHVuZzwtIGJpbGR1bmcgJT4lCiAgbXV0YXRlKHVudGVyPSJCaWxkdW5nIikKYmlsZHVuZwoKCmJpbGR1bmdfZiA8LSBnZXRfZGF0YSgKICB0YWJsZSA9ICJCdXNpbmVzcyIsCiAgVGl0bGUgPSAifmZvcm1hdGlvbiIsCiAgU3VibWlzc2lvbkRhdGUgPSBjKCI+MTk5MS0wMS0wMSIsICI8MjAyMC0xMi0zMSIpLCAKICBMYW5ndWFnZSA9ICJGUiIKKQpoZWFkKGJpbGR1bmdfZikKbGVuZ3RoKGJpbGR1bmdfZiRJRCkKIyAxMjA4CgpiaWxkdW5nX2Y8LSBiaWxkdW5nX2YgJT4lCiAgbXV0YXRlKHVudGVyPSJCaWxkdW5nIikKYmlsZHVuZ19mCgpgYGAKCmBgYHtyLGVjaG89VFJVRSxldmFsPUZBTFNFfQpjb3ZpZCA8LSBnZXRfZGF0YSgKICB0YWJsZSA9ICJCdXNpbmVzcyIsCiAgVGl0bGUgPSAifmNvdmlkIiwKICBTdWJtaXNzaW9uRGF0ZSA9IGMoIj4xOTkxLTAxLTAxIiwgIjwyMDIwLTEyLTMxIiksIAogIExhbmd1YWdlID0gIkRFIgopCgoKaGVhZChjb3ZpZCkKbGVuZ3RoKGNvdmlkJElEKQoKY292aWQ8LSBjb3ZpZCAlPiUKICBtdXRhdGUodW50ZXI9IkNvdmlkLTE5IikKY292aWQKCmNvdmlkX2YgPC0gZ2V0X2RhdGEoCiAgdGFibGUgPSAiQnVzaW5lc3MiLAogIFRpdGxlID0gIn5jb3ZpZCIsCiAgU3VibWlzc2lvbkRhdGUgPSBjKCI+MTk5MS0wMS0wMSIsICI8MjAyMC0xMi0zMSIpLCAKICBMYW5ndWFnZSA9ICJGUiIKKQpoZWFkKGNvdmlkX2YpCmxlbmd0aChjb3ZpZF9mJElEKQojIDMzMQoKY292aWRfZjwtIGNvdmlkX2YgJT4lCiAgbXV0YXRlKHVudGVyPSJDb3ZpZC0xOSIpCmNvdmlkX2YKCmBgYAoKYGBge3IsZWNobz1UUlVFLGV2YWw9RkFMU0V9CmFybWVlIDwtIGdldF9kYXRhKAogIHRhYmxlID0gIkJ1c2luZXNzIiwKICBUaXRsZSA9ICJ+YXJtZWUiLAogIFN1Ym1pc3Npb25EYXRlID0gYygiPjE5OTEtMDEtMDEiLCAiPDIwMjAtMTItMzEiKSwgCiAgTGFuZ3VhZ2UgPSAiREUiCikKCgpoZWFkKGFybWVlKQpsZW5ndGgoYXJtZWUkSUQpCmFybWVlPC0gYXJtZWUgJT4lCiAgbXV0YXRlKHVudGVyPSJBcm1lZSIpCmFybWVlCgphcm1lZV9mIDwtIGdldF9kYXRhKAogIHRhYmxlID0gIkJ1c2luZXNzIiwKICBUaXRsZSA9ICJ+YXJtw6llIiwKICBTdWJtaXNzaW9uRGF0ZSA9IGMoIj4xOTkxLTAxLTAxIiwgIjwyMDIwLTEyLTMxIiksIAogIExhbmd1YWdlID0gIkZSIgopCmhlYWQoYXJtZWVfZikKbGVuZ3RoKGFybWVlX2YkSUQpCiMgNTMxCgphcm1lZV9mPC0gYXJtZWVfZiAlPiUKICBtdXRhdGUodW50ZXI9IkFybWVlIikKYXJtZWVfZgoKYGBgCgpgYGB7cixlY2hvPVRSVUUsZXZhbD1GQUxTRX0KYmVoPC0gcmJpbmQoYmVoaW5kZXJ1bmcxLGJlaGluZGVydW5nMV9mKQpzYXZlKGJlaCwgZmlsZT1wYXN0ZSgiYmVoaW5kZXJ1bmdfZmluYWwiLCIuUmRhIiwgc2VwPSIiKSkKCmBgYAoKYGBge3J9CmxvYWQoImJlaGluZGVydW5nX2ZpbmFsLlJkYSIpCmRhdGExPC0gYmVoICU+JQogIG11dGF0ZShkYXRlPSB5ZWFyKFN1Ym1pc3Npb25EYXRlKSkgJT4lCiAgc2VsZWN0KGRhdGUsIFRpdGxlKSAlPiUKICAJZ3JvdXBfYnkoZGF0ZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQpyZW5hbWUoCiAgICBuX2JlaGluID0gbiApCgpgYGAKCgoKIyMjIEFiYmlsZHVuZyAxCgpgYGB7cn0KI2NvbHVtbi1saW5lLXRpbWVsaW5lCnBsb3QzPC1nZ3Bsb3QoZGF0YTEsIGFlcyh4PWRhdGUsIHkgPSBuX2JlaGluKSkgKyAKICBnZW9tX2NvbChhZXMoIGZpbGw9ICIjM2Q1YTgwIiApKSArCmdlb21fbWEobWFfZnVuID0gU01BLCBuID0gNywgYWVzKGNvbG9yID0gIiNhYmQ5ZTkiKSkgKwogICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzNkNWE4MCIpLCBsYWJlbHMgPSBjKCJhYnNvbHV0ZSBBbnphaGwiLCAiZ2xlaXRlbmRlciA1LUphaHJlc2R1cmNoc2Nobml0dCIpKSsKICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjYWJkOWU5IiksIGxhYmVscyA9IGMoICJnbGVpdGVuZGVyIDctSmFocmVzZHVyY2hzY2huaXR0IikpKwogIGFubm90YXRlKAogICAgZ2VvbSA9ICJjdXJ2ZSIsIHggPSAyMDE2LCB5ID0gMjQsIHhlbmQgPSAyMDE0LCB5ZW5kID0gMTAsIAogICAgY3VydmF0dXJlID0gLS4xLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpCiAgKSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDIwMTIsIHkgPSAyOCwgCiAgICAgICAgICAgbGFiZWwgPSAiUmF0aWZpemllcnVuZyBkZXIgXG5CZWhpbmRlcnRlbnJlY2h0c2tvbnZlbnRpb24gKEJSSyksXG5BcHJpbCAyMDE0IiwKICAgICAgICAgICBmYW1pbHkgPSAic2FucyIsCiAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgaGp1c3QgPSAibGVmdCIpICsKICBhbm5vdGF0ZSgKICAgIGdlb20gPSAiY3VydmUiLCB4ID0gMjAwMiwgeSA9IDI4LCB4ZW5kID0gMjAwNCwgeWVuZCA9IDIzLCAKICAgIGN1cnZhdHVyZSA9IC0uMiwgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDIsICJtbSIpKQogICkgKwogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxOTk5LCB5ID0gMzAsIAogICAgICAgICBsYWJlbCA9ICJJbmtyYWZ0dHJldGVuIGRlcyBCZWhpbmRlcnRlbi0gXG5nbGVpY2hzdGVsbHVuZ3NnZXNldHogKEJlaGlHKSwgXG5KYW51YXIgMjAwNCAiLAogICAgICAgICBmYW1pbHkgPSAic2FucyIsCiAgICAgICAgIHNpemUgPSAzLAogICAgICAgICBoanVzdCA9ICJsZWZ0IikgKwogIAogIAogIGFubm90YXRlKAogICAgZ2VvbSA9ICJjdXJ2ZSIsIHggPSAyMDE4LCB5ID0gMzgsIHhlbmQgPSAyMDE5LCB5ZW5kID0gNDIsIAogICAgY3VydmF0dXJlID0gLS4yLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpCiAgKSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDIwMTUsIHkgPSAzNywgCiAgICAgICAgIGxhYmVsID0gIkJlZ2lubiBkZXIgQ29yb25hLUtyaXNlIiwKICAgICAgICAgZmFtaWx5ID0gInNhbnMiLAogICAgICAgICBzaXplID0gMywKICAgICAgICAgaGp1c3QgPSAibGVmdCIpICsKICAKCWxhYnModGl0bGUgPSAiQWJiLiAxOiBMZWljaHQgc3RlaWdlbmRlIFRlbmRlbnogYmVpbSBUaGVtYSBCZWhpbmRlcnVuZyIsIHN1YnRpdGxlPSAiQW56YWhsIGRlciBlaW5nZXJlaWNodGVuIEdlc2Now6RmdGUsIGluIGRlbmVuIGVzIHVtIEJlaGluZGVydW5nIGdlaHQiLCBjYXB0aW9uID0gIkRhdGVuOiBwYXJsYW1lbnQuY2giLCB4ID0gIkphaHIiLHkgPSAiQW56YWhsIEdlc2Now6RmdGUiKSArCiAgdGhlbWVfYXcoKSArdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCgpnZ3NhdmUocGxvdDMsIGZpbGUgPSAiYWJiLjEucG5nIiwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gNykKYGBgCgpgYGB7cn0KcGxvdDMKYGBgCgoKIyMjIGFsbGUgRGF0ZW5zw6R0emUgenUgZWluZW0gZ3Jvc3NlbiB6dXNhbW1lbmbDvGdlbgpgYGB7cixlY2hvPVRSVUUsZXZhbD1GQUxTRX0KIyBkYXRlbnPDpHR6ZSB6dXNhbW1lbnNldHplbgpkYXRhMjwtcmJpbmQoYmVoaW5kZXJ1bmcxLGJlaGluZGVydW5nMV9mLCBhcm1lZSwgYXJtZWVfZixmcmF1ZW4sZnJhdV9mLGFzeWwsIGFzeWxfZiwga2xpbWEsIGtsaW1hX2YsIGZsw7xjaHQsZmx1Y2h0X2YsIGFodiwgYWh2X2YsIGNvdmlkLGNvdmlkX2YsIGJpbGR1bmcsIGJpbGR1bmdfZikKc2F2ZShkYXRhMiwgZmlsZT1wYXN0ZSgiZGF0ZW5zYXR6X2ZpbmFsIiwiLlJkYSIsIHNlcD0iIikpCmBgYAoKYGBge3J9CmxvYWQoImRhdGVuc2F0el9maW5hbC5SZGEiKQpgYGAKCiMjIyBBYmJpbGR1bmcgMgpgYGB7cn0KcGxvdDI8LWRhdGEyJT4lCiAgc2VsZWN0KFRpdGxlLCB1bnRlciklPiUKZ3JvdXBfYnkodW50ZXIpJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpJT4lCmFycmFuZ2UoZGVzYyhuKSkgJT4lIApnZ3Bsb3QoYWVzKHg9ZmN0X3Jlb3JkZXIodW50ZXIsIG4pLCB5ID0gbikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICIjM2Q1YTgwIiwgY29sb3IgPSAid2hpdGUiKSsKICBnZW9tX3RleHQoCiAgICAgIGFlcygKICAgICAgICB5ID0gbiwKICAgICAgICBsYWJlbCA9IG4KICAgICAgKSwgCiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLAogICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgIGZhbWlseSA9ICJIZWx2ZXRpY2EiLAogICAgICBzaXplID0gNQogICAgKSArCmxhYnModGl0bGUgPSAiQWJiLiAyOiBJbSBWZXJnbGVpY2ggaGlua3QgZGFzIFRoZW1hIEJlaGluZGVydW5nIGhpbnRlcmhlciIsIHN1YnRpdGxlPSAiQW56YWhsIGRlciBlaW5nZXJlaWNodGVuIEdlc2Now6RmdGUgaW0gVmVyZ2xlaWNoIiwgY2FwdGlvbiA9ICJEYXRlbjogcGFybGFtZW50LmNoIiwgeCA9ICJUaGVtZW4iLHkgPSAiQW56YWhsIEdlc2Now6RmdGUiKSArCiAgdGhlbWVfYXcoKSAKCmdnc2F2ZShwbG90MiwgZmlsZSA9ICJhYmIuMi5wbmciLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSA3KQpgYGAKCmBgYHtyfQpwbG90MgpgYGAKCiMjIyBVbWJlbmVubmVuCmBgYHtyfQpkYXRhMiRCdXNpbmVzc1R5cGVOYW1lW2RhdGEyJEJ1c2luZXNzVHlwZU5hbWUgPT0gIlF1ZXN0aW9uIG9yZGluYWlyZSJdIDwtICJFaW5mYWNoZSBBbmZyYWdlIgpkYXRhMiRCdXNpbmVzc1R5cGVOYW1lW2RhdGEyJEJ1c2luZXNzVHlwZU5hbWUgPT0gIlJlY29tbWFuZGF0aW9uIl0gPC0gIkVtcGZlaGx1bmciCmRhdGEyJEJ1c2luZXNzVHlwZU5hbWVbZGF0YTIkQnVzaW5lc3NUeXBlTmFtZSA9PSAiSGV1cmUgZGVzIHF1ZXN0aW9ucy4gUXVlc3Rpb24iXSA8LSAiRnJhZ2VzdHVuZGUuIEZyYWdlIgpkYXRhMiRCdXNpbmVzc1R5cGVOYW1lW2RhdGEyJEJ1c2luZXNzVHlwZU5hbWUgPT0gIkluaXRpYXRpdmUgZMOpcG9zw6llIHBhciB1biBjYW50b24iXSA8LSAiU3RhbmRlc2luaXRpYXRpdmUiCmRhdGEyJEJ1c2luZXNzVHlwZU5hbWVbZGF0YTIkQnVzaW5lc3NUeXBlTmFtZSA9PSAiUXVlc3Rpb24gb3JkaW5haXJlIHVyZ2VudGUiXSA8LSAiRHJpbmdsaWNoZSBFaW5mYWNoZSBBbmZyYWdlIgpkYXRhMiRCdXNpbmVzc1R5cGVOYW1lW2RhdGEyJEJ1c2luZXNzVHlwZU5hbWUgPT0gIlF1ZXN0aW9uIHVyZ2VudGUiXSA8LSAiRHJpbmdsaWNoZSBBbmZyYWdlIgpkYXRhMiRCdXNpbmVzc1R5cGVOYW1lW2RhdGEyJEJ1c2luZXNzVHlwZU5hbWUgPT0gIk9iamV0IGR1IFBhcmxlbWVudCIgICAgXSA8LSAiR2VzY2jDpGZ0IGRlcyBQYXJsYW1lbnRzIgpkYXRhMiRCdXNpbmVzc1R5cGVOYW1lW2RhdGEyJEJ1c2luZXNzVHlwZU5hbWUgPT0gIkluaXRpYXRpdmUgcGFybGVtZW50YWlyZSIgICBdIDwtICJQYXJsYW1lbnRhcmlzY2hlIEluaXRpYXRpdmUiCmRhdGEyJEJ1c2luZXNzVHlwZU5hbWVbZGF0YTIkQnVzaW5lc3NUeXBlTmFtZSA9PSAiUMOpdGl0aW9uIiAgIF0gPC0gIlBldGl0aW9uIgpkYXRhMiRCdXNpbmVzc1R5cGVOYW1lW2RhdGEyJEJ1c2luZXNzVHlwZU5hbWUgPT0gIk9iamV0IGR1IENvbnNlaWwgZsOpZMOpcmFsIiAgXSA8LSAiR2VzY2jDpGZ0IGRlcyBCdW5kZXNyYXRlcyIKZGF0YTIkQnVzaW5lc3NUeXBlTmFtZVtkYXRhMiRCdXNpbmVzc1R5cGVOYW1lID09ICJRdWVzdGlvbiIgIF0gPC0gIkFuZnJhZ2UiCmRhdGEyJEJ1c2luZXNzVHlwZU5hbWVbZGF0YTIkQnVzaW5lc3NUeXBlTmFtZSA9PSAiSW50ZXJwZWxsYXRpb24gdXJnZW50ZSJdIDwtICJEcmluZ2xpY2hlIEludGVycGVsbGF0aW9uIgpgYGAKCmBgYHtyfQpkYXRhMzwtZGF0YTIgJT4lCiAgbXV0YXRlKGRhdGUgPSB5ZWFyKFN1Ym1pc3Npb25EYXRlKSkgJT4lCiAgc2VsZWN0KGRhdGUsdW50ZXIsIEJ1c2luZXNzVHlwZU5hbWUpICU+JQogIAlncm91cF9ieSh1bnRlciwgQnVzaW5lc3NUeXBlTmFtZSkgJT4lCiAgc3VtbWFyaXNlKFBlcmNlbnRhZ2U9bigpKSAlPiUgCiAgbmEub21pdCgpICU+JQogIGdyb3VwX2J5KHVudGVyKSAlPiUgCiAgbXV0YXRlKHBjZW50PVBlcmNlbnRhZ2Uvc3VtKFBlcmNlbnRhZ2UpKjEwMCklPiUgCmZpbHRlcihwY2VudD4xKQpgYGAKIyMjIEFiYmlsZHVuZyAzCmBgYHtyfQojIEJ1c2lubmVzcyBUeXBlIEJlaGluZGVydW5nCnBsb3Q0PC1kYXRhMyAlPiUKICB1bmdyb3VwICU+JQogICAgbXV0YXRlKHVudGVyID0gYXMuZmFjdG9yKHVudGVyKSwKICAgICAgICAgICBCdXNpbmVzc1R5cGVOYW1lID0gcmVvcmRlcl93aXRoaW4oQnVzaW5lc3NUeXBlTmFtZSwgcGNlbnQsIHVudGVyKSkgJT4lCmdncGxvdChhZXMoQnVzaW5lc3NUeXBlTmFtZSwgcGNlbnQsZmlsbD0gdW50ZXIpKSArCiAgZ2VvbV9wb2ludChzaXplPTIsIGNvbG9yPWlmZWxzZShkYXRhMyRCdXNpbmVzc1R5cGVOYW1lICVpbiUgYygiUGV0aXRpb24iLCAiUGFybGFtZW50YXJpc2NoZSBJbml0aWF0aXZlIiwgIkdlc2Now6RmdCBkZXMgQnVuZGVzcmF0ZXMiICwgIk1vdGlvbiIgLCAiU3RhbmRlc2luaXRpYXRpdmUiKSwgIiNhYmQ5ZTkiLCAiIzNkNWE4MCIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICBnZW9tX3NlZ21lbnQoYWVzKHg9QnVzaW5lc3NUeXBlTmFtZSwgeGVuZD1CdXNpbmVzc1R5cGVOYW1lLCB5PTAsIHllbmQ9cGNlbnQpLCBjb2xvcj0iZ3JleSIpICArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwcmludGYoIiUuMGYlJSIsIHBjZW50KSksIHZqdXN0ID0gMC41LCBoanVzdCA9IC0wLjUsIHNpemUgPSAzLCBjb2xvciA9ICJibGFjayIpICsKCWxhYnModGl0bGUgPSAiQWJiLiAzOiBFcyB3aXJkIHZvciBhbGxlbSBnZXJlZGV0Li4iLCBzdWJ0aXRsZT0gIlZlcmdsZWljaCB6d2lzY2hlbiBkZXIgQXJ0IGRlciBHZXNjaMOkZnRlIChpbiAlKSIsIGNhcHRpb24gPSAiRGF0ZW46IHBhcmxhbWVudC5jaCIsIHggPSAiIix5ID0gIiIpICsKICB0aGVtZV9saWdodCgpICsKICB0aGVtZSgKICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwpmYWNldF93cmFwKH4gdW50ZXIsIHNjYWxlcyA9ICJmcmVlX3kiKSsKICBzY2FsZV94X3Jlb3JkZXJlZCgpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCA2MCksbGFiZWxzID0gc2NhbGVzOjpsYWJlbF9wZXJjZW50KHNjYWxlPTEpKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgdGhlbWVfYXcoKSAKCmdnc2F2ZShwbG90NCwgZmlsZSA9ICJhYmIuMy5wbmciLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAxMikKYGBgCgpgYGB7cn0KcGxvdDQgCmBgYAoKdW0gZGllIFRleHRlIHp1IGRlbiBHZXNjaMOkZnRlbiBoZXJ1bnRlcnp1bGFkZW4sIGJyYXVjaGVuIHdpciB6dWVyc3QgZGllIEJ1c2luZXNzU2hvcnROdW1iZXIuCgpgYGB7ciwgZXZhbD1GQUxTRX0KCmRmPC1iZWhpbmRlcnVuZzEgJT4lIAogIHNlbGVjdChCdXNpbmVzc1Nob3J0TnVtYmVyLCBUaXRsZSkgCmRmCiMgMTg2IEdlc2Now6RmdGUgZGV1dHNjaAoKZGYxPC1iZWhpbmRlcnVuZzFfZiAlPiUgCiAgc2VsZWN0KEJ1c2luZXNzU2hvcnROdW1iZXIsIFRpdGxlKSAKZGYxCiMgMTY5IEdlc2Now6RmdGUgZnJhbnoKYGBgCgojIyMgVGV4dGUgenUgR2VzY2jDpGZ0ZSBoZXJ1bnRlcmxhZGVuCiMjIyBkZXV0c2NoCmBgYHtyLCBldmFsPUZBTFNFfQpiZWhfZCA8LSBzd2lzc3Bhcmw6OmdldF9kYXRhKAogIHRhYmxlID0gIlN1YmplY3RCdXNpbmVzcyIsCiAgQnVzaW5lc3NTaG9ydE51bWJlciA9IGRmJEJ1c2luZXNzU2hvcnROdW1iZXIsCiAgTGFuZ3VhZ2UgPSAiREUiCiAgKQpiZWhfZApgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQp0cmFuc2NyaXB0c19iZWhfZDwtIHN3aXNzcGFybDo6Z2V0X2RhdGEoCiAgdGFibGUgPSAiVHJhbnNjcmlwdCIsIAogIElkU3ViamVjdCA9IGFzLm51bWVyaWMoYmVoX2QkSWRTdWJqZWN0KSwKICBMYW5ndWFnZSA9ICJERSIsCiAgVHlwZSA9IDEsCiAgTGFuZ3VhZ2VPZlRleHQgPSAiREUiCiAgKQp0cmFuc2NyaXB0c19iZWhfZApsZW5ndGgodHJhbnNjcmlwdHNfYmVoX2QkVGV4dCkKIyAzMjYgVGV4dGUgQlIsIE5SLCBTVAoKCiMgenVyIHNpY2hlcmhlaXQgc3BlaWNoZXJuCiNzYXZlUkRTKHRyYW5zY3JpcHRzX2JlaF9kLCBmaWxlID0gInRyYW5zY3JpcHRzX2JlaF9kZXV0c2NoLlJEUyIpIAojcmVhZFJEUygidHJhbnNjcmlwdHNfYmVoLlJEUyIpIApgYGAKIyMjIFRleHRlIHp1IEdlc2Now6RmdGUgaGVydW50ZXJsYWRlbgojIyMgZnJhbnoKYGBge3IsIGV2YWw9RkFMU0V9CmJlaF9mIDwtIHN3aXNzcGFybDo6Z2V0X2RhdGEoCiAgdGFibGUgPSAiU3ViamVjdEJ1c2luZXNzIiwKICBCdXNpbmVzc1Nob3J0TnVtYmVyID0gZGYxJEJ1c2luZXNzU2hvcnROdW1iZXIsCiAgTGFuZ3VhZ2UgPSAiRlIiCiAgKQpiZWhfZgoKdHJhbnNjcmlwdHNfYmVoX2Y8LSBzd2lzc3Bhcmw6OmdldF9kYXRhKAogIHRhYmxlID0gIlRyYW5zY3JpcHQiLCAKICBJZFN1YmplY3QgPSBhcy5udW1lcmljKGJlaF9mJElkU3ViamVjdCksCiAgTGFuZ3VhZ2UgPSAiRlIiLAogIFR5cGUgPSAxLAogIExhbmd1YWdlT2ZUZXh0ID0gIkZSIgogICkKdHJhbnNjcmlwdHNfYmVoX2YKbGVuZ3RoKHRyYW5zY3JpcHRzX2JlaF9mJFRleHQpCiMgMTI5CgojIHp1ciBzaWNoZXJoZWl0IHNwZWljaGVybgojc2F2ZVJEUyh0cmFuc2NyaXB0c19iZWhfZiwgZmlsZSA9ICJ0cmFuc2NyaXB0c19iZWhfZnJhbnouUkRTIikgCiNyZWFkUkRTKCJ0cmFuc2NyaXB0c19iZWhfZnJhbnouUkRTIikgCmBgYAojIyMgWnVzYW1tZW5mw7xnZW4gZGVyIFRleHRlCmBgYHtyLCBldmFsPUZBTFNFfQp0cmFuc2NyaXB0c19iZWg8LSByYmluZCh0cmFuc2NyaXB0c19iZWhfZiwgdHJhbnNjcmlwdHNfYmVoX2QpCiNzYXZlUkRTKHRyYW5zY3JpcHRzX2JlaCwgZmlsZSA9ICJ0cmFuc2NyaXB0c19maW5hbC5SRFMiKSAKYGBgCgpgYGB7cn0KdHJhbnNjcmlwdHNfYmVoPC1yZWFkUkRTKCJ0cmFuc2NyaXB0c19maW5hbC5SRFMiKSAKYGBgCiMjIyBEYXRlbiB2b3JiZXJlaXRlbgpgYGB7cn0KYWxsZV90ZXh0ZSA8LSB0cmFuc2NyaXB0c19iZWggJT4lCiAgbXV0YXRlKFRleHQyID0gY2xlYW5fdGV4dChUZXh0LCBrZWVwX3JvdW5kX2JyYWNrZXRzID0gRikpCmhlYWQoYWxsZV90ZXh0ZSkKCmFsbGVfdGV4dGUgJTw+JQogIGZpbHRlcighU3BlYWtlckxhc3ROYW1lID09ICJsZWVyIikgJT4lIAogIGZpbHRlcighU3BlYWtlckZ1bmN0aW9uICVpbiUgYygiMVZQLUYiLCAiMVZQLU0iLCAiMlZQLUYiLCAiMlZQLU0iLCAiQVAtTSIsICJQLUYiLCAiUC1NIikpICU+JSAKICBmaWx0ZXIoIUZ1bmN0aW9uICVpbiUgYygiMVZQLU0iLCAiMlZQLU0iLCAiUC1GIiwgInAtbSIsICJQLW0iLCAiUC1NIiwgIlAtTU0iKSkgJT4lCiAgZmlsdGVyKCFTcGVha2VyRnVsbE5hbWUgPT0gIlRodXJuaGVyciBXYWx0ZXIiKSAlPiUKICBmaWx0ZXIoIUNvdW5jaWxOYW1lICVpbiUgYygiQnVuZGVzcmF0IiwgIkNvbnNlaWwgZsOpZMOpcmFsIikpIApsZW5ndGgoYWxsZV90ZXh0ZSRUZXh0MikKCmBgYAoKIyMjIEZyYWt0aW9uZW4gdW1iZW5lbm5lbgpgYGB7cn0KYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiR3JvdXBlIGRlIGwnVW5pb24gZMOpbW9jcmF0aXF1ZSBkdSBDZW50cmUiXSA8LSAiRnJha3Rpb24gZGVyIFNjaHdlaXplcmlzY2hlbiBWb2xrc3BhcnRlaSIKYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiR3JvdXBlIHJhZGljYWwtbGliw6lyYWwiXSA8LSAiRkRQIEZyYWt0aW9uIgphbGxlX3RleHRlJFBhcmxHcm91cE5hbWVbYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lID09ICJHcm91cGUgbGliw6lyYWwtcmFkaWNhbCJdIDwtICJGRFAgRnJha3Rpb24iCmFsbGVfdGV4dGUkUGFybEdyb3VwTmFtZVthbGxlX3RleHRlJFBhcmxHcm91cE5hbWUgPT0gIkdyb3VwZSBQREMvUEVWL1BWTCJdIDwtICJEaWUgTWl0dGUtRnJha3Rpb24uIERpZSBNaXR0ZS4gRVZQLiIKYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiR3JvdXBlIFBEQy9QRVYvUFZMIl0gPC0gIkRpZSBNaXR0ZS1GcmFrdGlvbi4gRGllIE1pdHRlLiBFVlAuIgoKYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiTGUgR3JvdXBlIGR1IENlbnRyZS4gTGUgQ2VudHJlLiBQRVYuIl0gPC0gIkRpZSBNaXR0ZS1GcmFrdGlvbi4gRGllIE1pdHRlLiBFVlAuIgphbGxlX3RleHRlJFBhcmxHcm91cE5hbWVbYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lID09ICJDaHJpc3RsaWNoZGVtb2tyYXRpc2NoZSBGcmFrdGlvbiIgICAgXSA8LSAiRGllIE1pdHRlLUZyYWt0aW9uLiBEaWUgTWl0dGUuIEVWUC4iCmFsbGVfdGV4dGUkUGFybEdyb3VwTmFtZVthbGxlX3RleHRlJFBhcmxHcm91cE5hbWUgPT0gIkdyb3VwZSBQREMiICAgXSA8LSAiRGllIE1pdHRlLUZyYWt0aW9uLiBEaWUgTWl0dGUuIEVWUC4iCmFsbGVfdGV4dGUkUGFybEdyb3VwTmFtZVthbGxlX3RleHRlJFBhcmxHcm91cE5hbWUgPT0gIkNWUC1GcmFrdGlvbiIgICBdIDwtICJEaWUgTWl0dGUtRnJha3Rpb24uIERpZSBNaXR0ZS4gRVZQLiIKYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiR3JvdXBlIFBEQy1QRVYiICBdIDwtICJEaWUgTWl0dGUtRnJha3Rpb24uIERpZSBNaXR0ZS4gRVZQLiIKYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiR3JvdXBlIFBEQy9QRVYvUFZMIiAgXSA8LSAiRGllIE1pdHRlLUZyYWt0aW9uLiBEaWUgTWl0dGUuIEVWUC4iCmFsbGVfdGV4dGUkUGFybEdyb3VwTmFtZVthbGxlX3RleHRlJFBhcmxHcm91cE5hbWUgPT0gIkdyb3VwZSBkw6ltb2NyYXRlLWNocsOpdGllbiJdIDwtICJEaWUgTWl0dGUtRnJha3Rpb24uIERpZSBNaXR0ZS4gRVZQLiIKYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiR3JvdXBlIHNvY2lhbGlzdGUiXSA8LSAiU296aWFsZGVtb2tyYXRpc2NoZSBGcmFrdGlvbiIKYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiR3JvdXBlIGRlcyBWRVJULUUtUyJdIDwtICJHcsO8bmUgRnJha3Rpb24iCmFsbGVfdGV4dGUkUGFybEdyb3VwTmFtZVthbGxlX3RleHRlJFBhcmxHcm91cE5hbWUgPT0gIkdyb3VwZSDDqWNvbG9naXN0ZSJdIDwtICJHcsO8bmUgRnJha3Rpb24iCmFsbGVfdGV4dGUkUGFybEdyb3VwTmFtZVthbGxlX3RleHRlJFBhcmxHcm91cE5hbWUgPT0gIkZyYWt0aW9uIENWUC1FVlAiIF0gPC0gIkRpZSBNaXR0ZS1GcmFrdGlvbi4gRGllIE1pdHRlLiBFVlAuIgphbGxlX3RleHRlJFBhcmxHcm91cE5hbWVbYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lID09ICJDVlAtRVZQLUJEUCBGcmFrdGlvbiIgIF0gPC0gIkRpZSBNaXR0ZS1GcmFrdGlvbi4gRGllIE1pdHRlLiBFVlAuIgphbGxlX3RleHRlJFBhcmxHcm91cE5hbWVbYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lID09ICJGcmFrdGlvbiBDVlAvRVZQL2dscCIgXSA8LSAiRGllIE1pdHRlLUZyYWt0aW9uLiBEaWUgTWl0dGUuIEVWUC4iCmFsbGVfdGV4dGUkUGFybEdyb3VwTmFtZVthbGxlX3RleHRlJFBhcmxHcm91cE5hbWUgPT0gIkV2YW5nZWxpc2NoZSB1bmQgVW5hYmjDpG5naWdlIEZyYWt0aW9uIiBdIDwtICJEaWUgTWl0dGUtRnJha3Rpb24uIERpZSBNaXR0ZS4gRVZQLiIKYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiRnJha3Rpb24gQkQiIF0gPC0gIkRpZSBNaXR0ZS1GcmFrdGlvbi4gRGllIE1pdHRlLiBFVlAuIgoKYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiTGliZXJhbGUgRnJha3Rpb24iXSA8LSAgIkZEUCBGcmFrdGlvbiIKYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lW2FsbGVfdGV4dGUkUGFybEdyb3VwTmFtZSA9PSAiRkRQLUxpYmVyYWxlIEZyYWt0aW9uIl0gPC0gICJGRFAgRnJha3Rpb24iCmFsbGVfdGV4dGUkUGFybEdyb3VwTmFtZVthbGxlX3RleHRlJFBhcmxHcm91cE5hbWUgPT0gIkZyZWlzaW5uaWctZGVtb2tyYXRpc2NoZSBGcmFrdGlvbiJdIDwtICAiRkRQIEZyYWt0aW9uIgphbGxlX3RleHRlJFBhcmxHcm91cE5hbWVbYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lID09ICJGcmFrdGlvbiBkZXIgU2Nod2VpemVyaXNjaGVuIFZvbGtzcGFydGVpIl0gPC0gICJTVlAgRnJha3Rpb24iCmFsbGVfdGV4dGUkUGFybEdyb3VwTmFtZVthbGxlX3RleHRlJFBhcmxHcm91cE5hbWUgPT0gIlNvemlhbGRlbW9rcmF0aXNjaGUgRnJha3Rpb24iXSA8LSAgIlNQIEZyYWt0aW9uIgp1bmlxdWUoYWxsZV90ZXh0ZSRQYXJsR3JvdXBOYW1lKQoKYGBgCgpgYGB7cn0Kc3RvcHdvcmRzKCJkZSIpCnN0b3B3b3JkcygiZnIiKVsxOjE1MF0KbXlzdG9wd29yZHMgPC0gYyggIkJlaGluZGVydW5nIiwgIkJlaGluZGVydW5nZW4iLCJpbml0aWF0aXZlIiwgImdlc2V0emVzIiwgIm5ldWVuIiwgInB1bmt0IiwgImdhciIsICJzb2xsdGVuIiAsInN0ZWxsZW4iLCAiYmVoaW5kZXJ0ZSIsICJiZWhpbmRlcnRlbiIsICJtZW5zY2hlbiIsICJmcmFnZSIsICJzZWkiLCAid2ljaHRpZyIsICJmb2xnZW4iLCAiS29tbWlzc2lvbnNtZWhyaGVpdCIsICJzaWVodCIsIm1vbmF0ZSIsICJhdXNnZWh0IiwicGVyc29uIiwiZ2VzZXR6Iiwic29sbGVuIiwiYmVpZGVuIiwid2VpdCIsImdlaGVuIiwiYmVzdGVodCIsIm3DtmdsaWNoIiwgImdlbmF1IiwiYmxvY2siLCAia29sbGVnZSIsIgltw7ZnbGljaHN0IiwgIm3DvHNzZW4iLCJtZWhyIiwiYml0dGUiLCJnZWh0Iiwic2ljaCIsInR1biIgLCJnaWJ0IiwiZGFyZiIsICJtw7ZjaHRlIiwiZsO8ciIsICJkYXNzIiwgImxldHp0ZSIsICJsZXR6dCIsICJsZXR6dGVyIiwgImxldHp0ZXMiLCAidm9ybGV0enRlIiwgImF1c3NlcmRlbSIsICJiZXJlaXRzIiwgImVyc3RlciIsICJ6d2VpdGVyIiwgImRyaXR0ZXIiLCAiZXJzdGUiLCAiendlaXRlIiwgImRyaXR0ZSIsICJlcnN0ZW5zIiwgInp3ZWl0ZW5zIiwgImRyaXR0ZW5zIiwgImdydW5kc8OkdHpsaWNoIiwgImJlcmVpY2giLCAia2FudG9uZSIsCiAgICAgICAgICAgICAgICAgInNvZWJlbiIsICJuZWJzdCIsICJuZWJlbiIsICJrdXJ6IiAsICJpbW1lciIgLCAic2VsdGVuIiAsICJuaWUiICwgIm1hbmNobWFsIiAsICJvZnQiICwgInp3aXNjaGVuZHVyY2giICwgInNlaXRkZW0iLCAiZXJzdCIsCiAgICAgICAgICAgICAgICAgImphIiwgInouQi4iLCAiZGVyIiwgImRpZSIsICJkYXMiLCAiYWIiLCAiZGVzaGFsYiIsICJkYWbDvHIiLCAiaGV1dGUiLCAic29mb3J0IiwgImRhbmFjaCIsICJzY2hvbiIsICJiYWxkIiwgImhhYmVuIiwgImhhdCIsICJoYWJ0IiwgImhhdHRlbiIsCiAgICAgICAgICAgICAgICAgInfDpHJlIiwgInZpZWxlIiwgInZpZWxlcyIsICJ2aWVsZW4iLCAidmllbGVtIiwgImVpbmZhY2giLCAic28iLCAiZGF2b24iLCAidmllbGxlaWNodCIsICJ3ZWlsIiwgImF1ZmdydW5kIiwgImdlcmFkZSIsICJ3dXJkZW4iLCAiZ2VnZW4iLCAid2lkZXIiLAogICAgICAgICAgICAgICAgICJ3dXJkZSIsICJ3dXJkZXN0IiwgImRlc2hhbGIiLCAiZGFmw7xyIiwgImRhcnVtIiwgImRhZ2VnZW4iLCAic2VsYnN0IiwgInNlbGJlciIsICJ3ZWl0ZXJlIiwgIndlaXRlcmVzIiwgIndlaXRlcmVyIiwgImdhbnoiLCAiZWJlbiIsICJkaXJla3QiLCAKICAgICAgICAgICAgICAgICAibm90cmUiLCAiYXZvbnMiLCAiYXZleiIsICJvbnQiLCAibGEiLCAibGUiLCAiZGUiLCAiSSIsICJkb3ZyYSIsICJDb25zZWlsIiwgImbDqWTDqXJhbCIsICJCdW5kZXNyYXQiLCAiQnVuZGVzcmF0ZXMiLCAiQnVuZGVzcsOkdGUiLCAiY29uZsOpZMOpcmF0aW9uIiwKICAgICAgICAgICAgICAgICAiTmF0aW9uYWxyYXQiLCAiU3TDpG5kZXJhdCIsICJmw7xyIiwgImRhc3MiLCAiY29tbWlzc2lvbiIsICJLb21taXNzaW9uIiwgImxldHp0ZSIsICJsZXR6dCIsICJsZXR6dGVyIiwgImxldHp0ZXMiLCAidm9ybGV0enRlIiwgIk1pbmRlcmhlaXQiLCAiTWVocmhlaXQiLAogICAgICAgICAgICAgICAgICJWb3JsYWdlIiwgIk1vdGlvbiIsICJBcnRpa2VsIiwgIkFic2F0eiIsICJzb2ViZW4iLCAibmVic3QiLCAibmViZW4iLCAiZ2xlaWNoIiwgImphIiwgIm5laW4iLCAiei5CLiIsICJzZWl0IiwgInJ1bmQiLCAia2xhciIsICJQcm96ZW50IiwKICAgICAgICAgICAgICAgICAiYXVzc2VyZGVtIiwgImJlcmVpdHMiLCAiQW50cmFnIiwgIndpcmtsaWNoIiwgImF1Y2giLCAiZWJlbmZhbGxzIiwgImRlciIsICJkaWUiLCAiZGFzIiwgImFiIiwgImRlc2hhbGIiLCAiZGFmw7xyIiwgImhldXRlIiwgInNvZm9ydCIsIAogICAgICAgICAgICAgICAgICJkYWhlciIsICJuYXTDvHJsaWNoIiwgImluc2Jlc29uZGVyZSIsICJ6dWRlbSIsICJkYXJhdWYiLCAibsOkbWxpY2giLCAiZGFiZWkiLCJlaWdlbnRsaWNoIiwgInNjaG9uIiwgInNvd2llIiwgImdlbcOkc3MiLCAiZ2xlaWNoemVpdGlnIiwgCiAgICAgICAgICAgICAgICAgIkJlaXNwaWVsIiwgImJlaW0iLCAibGV0enRlbiIsIndvcmRlbiIsImluc2dlc2FtdCIsICJkZXNoYWxiIiwgImRhZsO8ciIsICJkYXJ1bSIsICJkYWdlZ2VuIiwgInNlbGJzdCIsICJzZWxiZXIiLCAid2VpdGVyZSIsICAgICJ3ZWl0ZXJlcyIsCiAgICAgICAgICAgICAgICAgIndlaXRlcmVyIiwgImdhbnoiLCAiZW50c3ByZWNoZW5kIiwgImVudHNwcmVjaGVuZGVzIiwiZW50c3ByZWNoZW5kZXIiLCAibm90cmUiLCAiYXZvbnMiLCAiYXZleiIsICJvbnQiLCAiZG9tYWluIiwgImNlcnRhaW4iLCAibWFqb3JpdMOpIiwgIm1pbm9yaXTDqSIsIAogICAgICAgICAgICAgICAgICJsYSIsICJsZSIsICJkZSIsICJJIiwgImRvdnJhIiwgImRvbmMiLCAiYydlc3QiLCJwbHVzIiwgInB1aXNxdWUiLCAicGVuZGFudCIsICJuaSIsICJmYWlyIiwgImZhaXQiLCAiw6p0cmUiLCAidG91dCIsICJ0b3VzIiwgInRvdXRlcyIsICJ0b3V0ZSIsCiAgICAgICAgICAgICAgICAgImF1c3NpIiwgImVuZmFpdGUiLCAic291dmVudCIsICJhdWpvdXJkJ2h1aSIsICJlbiBlZmZldCIsICJsb3JzcXVlIiwgImRvbmMiLCAibCdhcnRpY2xlIiwgIm4nZXN0IiwgImMnZXN0IiwgImVsbGUiLCAiZWxsZXMiLCAiY29udHJlIiwiY2VudCIsCiAgICAgICAgICAgICAgICAgInVzc2EiLCAibm9zdHJvIiwgImMnw6giLCAiY2hlIiwgInBlciIsICJhIiwgImUiLCAiZGkiLCAicGVyY2hlIiwgInouQiIsICJlaW4iLCAiendlaSIsICJkcmVpIiwgInZpZXIiLCAidW5zZXJlciIsICJ1bnNlcmUiLCAidW5zZXIiLCJkw6lqw6AiLAogICAgICAgICAgICAgICAgICJiIiwgInoiLCAiaSIsICJpaSIsICJkJ3VuIiwgImQnYXV0cmUiLCAiMWEiLCAiMSIsICIyIiwgIjMiLCAiNCIsICJoIiwgImEiLCAiY2FzIiwgIm1haXMiLCAidW4iLCAiZGV1eCIsICJ0cm9pcyIsICJxdWF0cmUiLCAiY2lucSIsICJmYXV0IiwKICAgICAgICAgICAgICAgICAiZCd1bmUiLCAic2FnZW4iLCAiZ2VzYWd0IiwgInRyw6hzIiwgInNlaHIiLCAiaGVyciIsICJmcmF1IiwgIm1vbnNpZXVyIiwgIm1hZGFtZSIsICLDqWdhbGVtZW50IiwgImNvbW1lIiwgIsOpdmlkZW1tZW50IiwgImTDqWrDoCIsICJsJ29uIiwKICAgICAgICAgICAgICAgICAib8O5IiwgInNvdXRpZW4iLCAiY29uY2VybmFudCIsICJvdWkiLCAibm9uIiwgInNpIiwgInF1J2lsIiwgInF1J2VsbGUiLCAicXUnaWxzIiwgInF1J2VsbGVzIiwgImVuY29yZSIsICJhaW5zaSIsICJlbnRyZSIsICJsb3JzIiwgImRvbnQiLCAKICAgICAgICAgICAgICAgICAiMjAxOSIsICIyMDIwIiwgIjIwMjEiLCAiZGVtYW5kZSIsICJxdWVzdGlvbiIsICJwb3VyIiwgImNlbnQiLCAicGVyc29ubmVzIiwgImhhbmRpY2Fww6llcyIsICJiaWVuIiwgImxvaSIgLCAiaGFuZGljYXDDqXMiLCAibCdpbml0aWF0aXZlIiwgInBldXQiLCAiaGFuZGljYXAiLCAic3Vpc3NlIiwgImFsaW7DqWEiLCAiZmFpcmUiKQoKYGBgCgpgYGB7cn0gCiNjb3JwdXMgbWFjaGVuCmJlaF9jb3JwdXMgPC0gY29ycHVzKAogICAgYWxsZV90ZXh0ZSRUZXh0MiwKICAgIGRvY25hbWVzID0gYWxsZV90ZXh0ZSRJRCwKICAgIGRvY3ZhcnMgPSBhbGxlX3RleHRlICU+JSBzZWxlY3QoLVRleHQsIC1UZXh0MikKICAgICkgCgpiZWhfY29ycHVzCgojVG9rZW5pc2llcmVuCmJlaF90b2tzIDwtIHRva2VucyhiZWhfY29ycHVzLAogICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9wdW5jdD1ULAogICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9udW1iZXJzPVQsIHJlbW92ZV9zeW1ib2xzPVQpCgpiZWhfY29ycHVzX2ZpbmFsIDwtIGJlaF90b2tzICU+JQogIHRva2Vuc19yZW1vdmUoc3RvcHdvcmRzKCdkZScpKSAlPiUKICB0b2tlbnNfcmVtb3ZlKHN0b3B3b3JkcygnZnInKSkgJT4lCiAgdG9rZW5zX3JlbW92ZShteXN0b3B3b3JkcykKCiMgQ3JlYXRlIGRmbQpiZWhfZGZtIDwtIGRmbShiZWhfY29ycHVzX2ZpbmFsLAogICAgICAgICAgICAgICB0b2xvd2VyID0gVCwpIApiZWhfZGZtIApgYGAKCiMjIyBXZWxjaGUgUGFydGVpZW4vRnJha3Rpb25lbi9QYXJsYW1lbnRhcmllcklubmVuIGJlc2Now6RmdGlnZW4gc2ljaCBhbSBtZWlzdGVuIG1pdCBkaWVzZW0gVGhlbWEgQmVoaW5kZXJ1bmc/CmBgYHtyfQojUGFybGFtZW50YXJpZXJJbm5lbiAKYWxsZV90ZXh0ZSRDb3VuY2lsTmFtZVthbGxlX3RleHRlJENvdW5jaWxOYW1lID09ICJDb25zZWlsIGRlcyBFdGF0cyJdIDwtICAiU3TDpG5kZXJhdCIKYWxsZV90ZXh0ZSRDb3VuY2lsTmFtZVthbGxlX3RleHRlJENvdW5jaWxOYW1lID09ICJDb25zZWlsIG5hdGlvbmFsIl0gPC0gICJOYXRpb25hbHJhdCIKdW5pcXVlKGFsbGVfdGV4dGUkQ291bmNpbE5hbWUpCgoKbW9zdF9zcGVlY2hlc19zcGVha2VyIDwtIGFsbGVfdGV4dGUgJT4lCiAgZ3JvdXBfYnkoU3BlYWtlckZ1bGxOYW1lLCBQYXJsR3JvdXBOYW1lLCBDb3VuY2lsTmFtZSApICU+JQogICBzdW1tYXJpc2Uobj1uKCkpICU+JQogIGFycmFuZ2UoZGVzYyhuKSklPiUKZmlsdGVyKG4+MykKCmBgYAojIyMgVGFiZWxsZSBlcnN0ZWxsZW4KYGBge3J9CgpTcGVha2VyRnVsbE5hbWUgPC0gYXMuY2hhcmFjdGVyKHVuaXF1ZShtb3N0X3NwZWVjaGVzX3NwZWFrZXIkU3BlYWtlckZ1bGxOYW1lKSkKUGFybEdyb3VwTmFtZSA8LSBhcy5jaGFyYWN0ZXIodW5pcXVlKG1vc3Rfc3BlZWNoZXNfc3BlYWtlciRQYXJsR3JvdXBOYW1lKSkKQ291bmNpbCA8LSBhcy5jaGFyYWN0ZXIodW5pcXVlKG1vc3Rfc3BlZWNoZXNfc3BlYWtlciRDb3VuY2lsTmFtZSkpClJlZGVuIDwtIGFzLmNoYXJhY3Rlcihtb3N0X3NwZWVjaGVzX3NwZWFrZXIkbikKCgp0YWJsZSA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKFNwZWFrZXJGdWxsTmFtZSwgUGFybEdyb3VwTmFtZSwgQ291bmNpbCwgUmVkZW4pKQpjb2xuYW1lcyh0YWJsZSkgPC0gYygiUGFybGFtZW50YXJpZXJJbiIsICJGcmFrdGlvbiIsIlJhdCIsICJBbnphaGwgUmVkZW4iKQogIHRhYmxlICU+JQprYWJsZShyb3cubmFtZXMgPSBUKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCBmdWxsX3dpZHRoID0gVCwgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAxMykgJT4lCiBzYXZlX2thYmxlKGZpbGUgPSAidGFibGVfMi5odG1sIiwKICAgICAgICAgICAgIHpvb20gPSAxLjUpCiAgCgoKYGBgCgpgYGB7cn0KYnLDpG5kbGk8LWFsbGVfdGV4dGUlPiUKICBmaWx0ZXIoU3BlYWtlckxhc3ROYW1lID09IkJyw6RuZGxpIikKYnLDpG5kbGkKYGBgCgojIyMgQWJiaWxkdW5nIDQKYGBge3J9CnAxIDwtIGdncGxvdChkYXRhID0gbW9zdF9zcGVlY2hlc19zcGVha2VyKSArCglhZXMoeCA9IGZjdF9yZW9yZGVyKFNwZWFrZXJGdWxsTmFtZSwgbiksIHkgPSBuKSArCglnZW9tX3BvaW50KHNpemU9MiwgY29sb3I9IiMzZDVhODAiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICBnZW9tX3NlZ21lbnQoYWVzKHg9U3BlYWtlckZ1bGxOYW1lLCB4ZW5kPVNwZWFrZXJGdWxsTmFtZSwgeT0wLCB5ZW5kPW4pLCBjb2xvcj0iZ3JleSIpKwoJbGFicyh0aXRsZSA9ICJBYmIuIDQ6IENoLiBCcsOkbmRsaSB2b24gZGVyIFNWUCBoYXQgYW0gTWVpc3RlbiBnZXNwcm9jaGVuIiwgc3VidGl0bGUgPSAiQW56YWhsIFJlZGVuIGltIFZlcmdsZWljaCIsIGNhcHRpb24gPSAiRGF0ZW46IHBhcmxhbWVudC5jaCIsIHkgPSAiQW56YWhsIiwgeCA9ICIiKSArCiAgY29vcmRfZmxpcCgpICsKdGhlbWVfbGlnaHQoKSArCnRoZW1lX2F3KCkgCgoKZ2dzYXZlKHAxLCBmaWxlID0gImFiYi43LnBuZyIsIHdpZHRoID0gMTEsIGhlaWdodCA9IDcpCmBgYAoKCmBgYHtyfQpwYXJ0ZWkgPC0gYWxsZV90ZXh0ZSAlPiUKICBncm91cF9ieShQYXJsR3JvdXBOYW1lKSAlPiUKICBzdW1tYXJpc2Uobj1uKCkpICU+JQogIG11dGF0ZShwY2VudD1uL3N1bShuKSoxMDApJT4lIAogIGFycmFuZ2UoZGVzYyhuKSkKYGBgCiMjIyBBYmJpbGR1bmcgNApgYGB7cn0KI3Bsb3QgUmVkZWFudGVpbCBuYWNoIHBhcnRlaWVuCnAyIDwtIGdncGxvdChkYXRhID0gcGFydGVpKSArCglhZXMoeCA9IGZjdF9yZW9yZGVyKFBhcmxHcm91cE5hbWUsIHBjZW50KSwgeSA9IHBjZW50KSArCglnZW9tX3BvaW50KHNpemU9NiwgY29sb3I9YyggIiNkZDBlMGUiLCAiI2ZmOTEwMCIsICAiIzNhOGJjMSIsICAiIzBhNzIyOCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjNjZjYzAwIiwgIiNhMGEwMDAiKSkgKyAKICAgZ2VvbV9zZWdtZW50KGFlcyh4PVBhcmxHcm91cE5hbWUsIHhlbmQ9UGFybEdyb3VwTmFtZSwgeT0wLCB5ZW5kPXBjZW50KSwgY29sb3I9ImdyZXkiKSsKICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwcmludGYoIiUuMGYlJSIsIHBjZW50KSksIHZqdXN0ID0gLTEuNywgaGp1c3QgPSAwLjUsIHNpemUgPSAzLCBjb2xvciA9ICJibGFjayIpKwoJbGFicyh0aXRsZSA9ICJBYmIuIDQ6IEluZ2VzYW10IHNwcmljaHQgZGllIFNQLUZyYWt0aW9uIGFtIGjDpHVmaWdzdGVuIMO8YmVyIEJlaGluZGVydW5nIiwgc3VidGl0bGUgPSAiQW56YWhsIFdvcnRiZXRyw6RnZSBpbSBWZXJnbGVpY2ggKGluICUpIiwgY2FwdGlvbiA9ICJEYXRlbjogcGFybGFtZW50LmNoIiwgeSA9ICJQcm96ZW50IiwgeCA9ICIiKSArCiAgY29vcmRfZmxpcCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMzApLGxhYmVscyA9IHNjYWxlczo6bGFiZWxfcGVyY2VudChzY2FsZT0xKSkrCnRoZW1lX2xpZ2h0KCkgKwp0aGVtZV9hdygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkKCnAyCmdnc2F2ZShwMiwgZmlsZSA9ICJhYmIuNi5wbmciLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSA3KQpgYGAKCmBgYHtyfQp0ZXh0cGxvdF93b3JkY2xvdWQoYmVoX2RmbSwgbWF4X3dvcmRzID0gNTAsIG1pbl9jb3VudD01LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg5LCAiR25CdSIpWzM6OF0sIHJhbmRvbV9vcmRlciA9IEZBTFNFLHJhbmRvbV9jb2xvcj1GQUxTRSwgcm90YXRpb249MC4yNSkKYGBgCgoKYGBge3J9CmJlaF9mcmVxIDwtIHRleHRzdGF0X2ZyZXF1ZW5jeShiZWhfZGZtICwgbj01MCkKYGBgCgojIyMgQWJiaWxkdW5nIDUKYGBge3J9CnBuZygiQWJiLjUucG5nIix3aWR0aD0xMCxoZWlnaHQ9MTIsdW5pdHMgPSAiaW4iLHJlcz0zMDApCiAgICAgICAgICAgICAgICAgdGV4dHBsb3Rfd29yZGNsb3VkKGJlaF9kZm0sIG1heF93b3JkcyA9IDUwLCBtaW5fY291bnQ9NSxjb2xvciA9IFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg5LCAiR25CdSIpWzM6OF0sIHJhbmRvbV9vcmRlciA9IEZBTFNFLHJhbmRvbV9jb2xvcj1GQUxTRSwgcm90YXRpb249MC4yNSkKdGl0bGUoIkFiYi4gNTogR2xlaWNoc3RlbGx1bmcgaXN0IGRhcyBtZWlzdHZlcndlbmRldGUgV29ydCIsY2V4Lm1haW4gPSAxLjgsCiAgICAgICBmb250Lm1haW49IDIsY29sLm1haW49IiMwNTAzMmQiLGFkaj0wKQptdGV4dCgiRGF0ZW46IHBhcmxhbWVudC5jaCIsIGNleD0xLHNpZGU9MSwgbGluZT0zLCBhZGogPSAxLCBjb2w9ImdyZXkzMCIpCm10ZXh0KCJEaWUgYW0gaMOkdWZpZ3N0ZW4gZ2VuYW5udGVuIEJlZ3JpZmZlIG5hY2ggQW56YWhsIEVyd8OkaG51bmdlbiIsIGNleD0xLjUsc2lkZT0zLCBhZGogPSAwLCBjb2w9IiMwNTAzMmQiKQpgYGAKCiMjIyBLb250ZXh0IMO8YmVycHLDvGZlbgpgYGB7cn0Ka3dpYyhiZWhfY29ycHVzX2ZpbmFsLCBwaHJhc2UoImludGVncmF0aW9uIikpIAprd2ljKGJlaF9jb3JwdXNfZmluYWwsIHBocmFzZSgiZ2xlaWNoc3RlbGx1bmciKSkgCmt3aWMoYmVoX2NvcnB1c19maW5hbCwgcGhyYXNlKCJiYXV0ZW4iKSkgCmt3aWMoYmVoX2NvcnB1c19maW5hbCwgcGhyYXNlKCJraW5kZXIiKSkgCmt3aWMoYmVoX2NvcnB1c19maW5hbCwgcGhyYXNlKCJmcmFua2VuIikpIAprd2ljKGJlaF9jb3JwdXNfZmluYWwsIHBocmFzZSgia29zdGVuIikpIApgYGAKCg==