Zweiter Teil der Case Study

Im zweiten Teil der Case Study werden Sie die eingelesenen und aufgearbeiten Daten aus Teil 1 deskriptiv untersuchen. Hierbei erhalten Sie einen Eindruck von den Daten und können mögliche Zusammenhänge entdecken, indem Sie unterschiedliche Informationen visualisieren und auch in Tabellenform auswerten. Ziele des zweiten Teils der Case Study:

  • Daten visualisieren und Zusämmenhänge grafisch veranschaulichen
  • Deskriptive Analysen mittels Korrelationstabellen und deskriptiven Tabellen anfertigen
  • Das Verständnis wie Sie ihre Informationen zu bestimmten Fragestellungen möglichst effektiv aufbereiten
  • Interaktive Grafiken erstellen

Sie erhalten durch deskriptive Analysen einen sehr guten Eindruck von den regionalen Unterschieden innerhalb Deutschlands. Das begleitende 3. RTutor Problem Set gibt ihnen einen sehr guten Eindruck davon, wie die Unterschiede zwischen den einzelnen Ländern auf europäischer Ebene aussehen.

Daten und Pakete laden

Nachdem wir uns im ersten Teil der Case Study alle Daten aus verschiedenen Datenquellen zusammengetragen und in R eingelesen haben, wollen wir in diesem zweiten Teil die darin enthaltenen Informationen analysieren, insbesondere visualisieren.

Hierzu laden wir uns die aus Teil 1 erstellten Datensätze:

library(tidyverse)
library(skimr)
library(sf)
library(viridis)
library(plotly)
library(kableExtra)
library(gt)
library(corrr)
# Daten einlesen
einkommen <- readRDS("data/einkommen.rds")
bundesland <- readRDS("data/bundesland.rds")
landkreise <- readRDS("data/landkreise.rds")
bip_zeitreihe <- readRDS("data/bip_zeitreihe.rds")
gemeinden <- readRDS("data/gemeinden.rds")
gesamtdaten <- readRDS("data/gesamtdaten.rds")
schulden_bereinigt <- readRDS("data/schulden_bereinigt.rds")

Deskriptive Analysen

Univariate deskriptive Analysen

Wir wollen uns zu Beginn unserer Analysen einen Überblick über die Daten verschaffen. D.h. wie viele Landkreise haben wir in den Daten? Wie ist die Verteilung der Schulden, Arbeitslosigkeit und des BIP?

Hierfür wollen wir uns im ersten Schritt die Arbeitslosenquote berechnen. Die Schulden pro Kopf und das BIP pro Kopf hatten wir bereits in dem ersten Teil der Case-Study berechnet. Die Arbeitslosenquote wollen wir als \(Arbeitslosenquote = Erwerbslose / (Erwerbstätige + Erwerbslose)\) berechnen. Bei der Berechnung der Arbeitslosenquote beziehen wir also das komplette Potential an erwerbsfähigen Personen ein.

In den nächsten Abschnitten wollen wir uns die Parameter für die einzelnen Variablen dann genauer anschauen.

# Zuerst wollen wir uns noch die Arbeitslosenquote pro Landkreis berechnen
gesamtdaten <- gesamtdaten %>%
  mutate(alo_quote = (total_alo / (erw+total_alo))*100)

Anzahl an Beobachtungen

Wir wollen zuerst einen Blick auf die Anzahl an Erwerbstätigen und Einwohnern in Deutschland werfen. Hier haben wir 41 Mio. Erwerbstätige und 76,5 Mio. Einwohner in Deutschland. Dies sollte stimmen, da wir Hamburg (1.8 Mio.), Berlin (3.75 Mio.) und Bremen (0.7 Mio.), sowie Bremerhaven (0.1 Mio.) nicht in unserem Datensatz haben. Die Daten wollen wir uns als einfachen Tibble Datensatz anzeigen lassen:

# Wie viele Erwerbstätige und Einwohner (ohne Berlin, Hamburg, Bremen und Bremerhaven) hat Deutschland?
gesamtdaten %>% 
  summarise(total_erw = sum(erw, na.rm=TRUE), total_einwohner = sum(Einwohner, na.rm=TRUE))
## # A tibble: 1 × 2
##   total_erw total_einwohner
##       <dbl>           <dbl>
## 1  41029891        76573483

Nun wollen wir uns die Variablen im Datensatz genauer anschauen. Eine Tabelle nur als Tibble darzustellen ist nicht besonders ansprechend. Wir können uns für einen ersten kurzen Überblick des skimr-Pakets bedienen:

# Anschließend wollen wir eine Summary Statistic für alle Variablen ausgeben lassen
# Entfernen der Histogramme, damit alles auch schön in PDF gedruckt werden kann
gesamtdaten %>%
  select(alo_quote, Schulden_pro_kopf_lk, bip_pro_kopf, landkreis_name) %>%
  skim()
Data summary
Name Piped data
Number of rows 401
Number of columns 4
_______________________
Column type frequency:
character 1
numeric 3
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
landkreis_name 0 1 3 33 0 379 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
alo_quote 2 1.00 5.34 2.38 1.64 3.37 5.05 6.90 13.44 ▇▆▅▂▁
Schulden_pro_kopf_lk 4 0.99 2742.91 2147.50 264.28 1295.03 2080.59 3447.76 14580.57 ▇▂▁▁▁
bip_pro_kopf 2 1.00 36827.71 16196.93 15737.94 27544.90 32592.40 39857.83 165520.71 ▇▁▁▁▁

Wir haben 401 individuelle Beobachtungen in unserem Datensatz. Hierbei handelt es sich um alle Landkreise und kreisfreien Städte in Deutschland. Stimmen diese Angaben? Für einen kurzen Konsistenzcheck wollen wir uns Wikipedia bedienen.

In Deutschland gibt es 294 Landkreise. Die Anzahl der Landkreise pro Bundesland finden wir hier. Weiterhin gibt es in Deutschland 107 kreisfreie Städte, die genaue Auflistung finden wir hier. D.h. unsere 401 Landkreise und kreisfreien Städte sollten stimmen.

Jedoch gibt es nur 379 unterschiedliche Landkreis Namen in unserem Datensatz mit 401 unterschiedlichen Beobachtungen (Regionalschlüsseln). Dies kommt daher, dass z.B. die Stadt München eine Beobachtung ist und der Landkreis München eine weitere Beobachtung mit anderem Regionalschlüssel. D.h. der “landkreis_name” ist der Gleiche, jedoch ist der Regionalschlüssel ein anderer.

Für die Schulden und die Einwohnerzahlen fehlen uns leider Daten für vier Landkreise, für das BIP fehlen uns Daten für zwei Landkreise:

gesamtdaten %>%
  filter(is.na(Einwohner)) %>%
  select(landkreis_name)
## # A tibble: 4 × 1
##   landkreis_name
##   <chr>         
## 1 Hamburg       
## 2 Bremen        
## 3 Bremerhaven   
## 4 Berlin

Leider haben wir hier in den Originaldaten keine Informationen zu Schulden und BIP für diese Städte, daher können wir sie nicht mit in unsere Analysen einbeziehen.

Beschreibung der Tabelle

Arbeitslosenquote

Im Durchschnitt liegt die Arbeitslosenquote in 2017 bei 5,34 Prozent. Dies mag uns zuerst etwas hoch erscheinen, jedoch sollten wir bedenken, dass wir alle Arbeitslosen mit in unsere Analyse einbezogen haben, d.h. Bezieher von SGB II und SGB III. Ein kurzer Konsistenzcheck auf Statista zeigt uns die dort gemeldete Arbeitslosenquote von 5.7% für 2017. Unsere niedrigere Quote könnte insbesondere daran liegen, dass die Großstädte Berlin und Hamburg nicht in unserer Analyse enthalten sind. Die Standardabweichung beträgt 2,38 und zeigt damit, dass es in Deutschland deutliche regionale Unterschiede bzgl. der Arbeitslosenquote gibt. Ein Blick auf die Verteilung zeigt, dass der Landkreis mit der geringsten Arbeitslosenquote nur eine Arbeitslosenquote von 1,63% (p0 in der obigen Tabelle) aufweist und der Landkreis mit der höchsten Arbeitslosenquote von 13,44% (p100 in der obigen Tabelle). Zwar sind die Werte noch ein ganzes Stück von dem Durchschnitt der Arbeitslosenquote in Spanien entfernt (17% im Jahr 2017), zeigen jedoch schon, dass es auch in Deutschland durchaus Regionen mit einer sehr hohen Arbeitslosenquote gibt.

Verschuldung pro Kopf

Bei der Verschuldung der Landkreise ergibt sich ein ähnliches Bild. Durchschnittlich beträgt die Verschuldung der Landkreise 2743€, mit einer Standardabweichung von 2148€. D.h. auch hier gibt es eine große Bandbreite bzgl. der Verschuldung einzelner Landkreise.

BIP pro Kopf

Wie schon bei der Arbeitslosenquote und der Verschuldung sehen wir auch bei dem BIP pro Kopf deutliche Unterschiede zwischen den einzelnen Landkreisen in Deutschland. Im Durchschnitt liegt das BIP pro Kopf in den Landkreisen bei 36827€, jedoch haben wir eine Standardabweichung von 16196€, was zuerst nach sehr viel aussieht. Dies könnte jedoch an einzelnen Landkreisen liegen (so hat ein Landkreis bspw. ein BIP pro Kopf von 165520€). Da der Median des BIP pro Kopf bei 32592€ liegt haben wir hier schon einen Hinweis, dass das BIP pro Kopf vermutlich nicht normalverteilt über alle Landkreise ist und es wohl einzelne Ausreißer in den Daten gibt.

Summary Statistics auf Bundeslandebene für die Arbeitslosigkeit

Nachdem wir im vorherigen Abschnitt bereits gesehen haben, dass es wohl deutliche regionale Unterschiede bei allen Variablen geben muss, wollen wir uns nun noch die Arbeitslosenquote auf Bundeslandebene anschauen. Erinnern wir uns daran das wir hier Querschnittsdaten für das Jahr 2017 für alle deutschen Landkreise betrachten. Weiterhin hat uns die vorherige Tabelle bereits gezeigt, dass wir mit “missing Values” rechnen müssen (n_missing bei der skimr-Tabelle). Um nun einen ersten Überblick über die regionale Verteilung der Arbeitsenquote in 2017 zu gewinnen schauen wir uns die Arbeitslosenquote auf Bundeslandebene an, aggregiert über die Landkreise eines Bundeslandes. Hierzu wollen wir uns des Pakets kableExtra bedienen um schönere Tabellen zu erstellen:

bula_data <- gesamtdaten %>% 
  group_by( bundesland_name ) %>%
  summarise(mean_alo = mean(alo_quote), sd_alo = sd(alo_quote), median_alo = median(alo_quote)) %>%
  ungroup()

bula_data %>%
  arrange( mean_alo ) %>%
  filter( !is.na(mean_alo) ) %>%
  kbl(col.names = c("Bundesland",
                    "Mittelwert",
                    "Std.",
                    "Median"), digits = 2) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
  kable_paper(full_width = F) %>%
  row_spec(c(7,9, 11,12,14), bold = T, color = "white", background = "#BBBBBB") %>%
  add_header_above(c(" " = 1, "Arbeitslosenquote" = 3), align = "c") %>%
  footnote(general = "Wir haben keine Informationen zu Berlin und Hamburg, weshalb sie nicht in der Tabelle aufgeführt wurden.", 
           general_title = "Bitte beachten: ",
           number = "Die ostdeutschen Bundesländer sind grau hinterlegt.")
Arbeitslosenquote
Bundesland Mittelwert Std. Median
Bayern 3.04 0.77 3.00
Baden-Württemberg 3.31 0.64 3.33
Hessen 5.01 1.35 5.06
Rheinland-Pfalz 5.31 1.47 5.26
Saarland 5.85 1.73 5.32
Niedersachsen 6.16 1.77 6.01
Thüringen 6.30 1.80 5.70
Schleswig-Holstein 6.36 1.00 6.82
Sachsen 6.65 1.08 6.31
Nordrhein-Westfalen 7.15 2.43 6.88
Brandenburg 7.99 1.95 8.28
Mecklenburg-Vorpommern 8.45 1.58 8.00
Bremen 8.95 2.54 8.95
Sachsen-Anhalt 9.03 1.59 8.91
Bitte beachten:
Wir haben keine Informationen zu Berlin und Hamburg, weshalb sie nicht in der Tabelle aufgeführt wurden.
1 Die ostdeutschen Bundesländer sind grau hinterlegt.

Hier sehen wir insbesondere für Landkreise in Bayern und Baden-Württemberg Arbeitslosenquoten von durchschnittlich unter 4% und für Landkreise in Sachsen-Anhalt, Bremen und Mecklenburg-Vorpommern Arbeitslosenquoten von durchschnittlich über 8%. Es fällt weiterhin auf, dass die Landkreise in ehemaligen ostdeutschen Bundesländern alle sehr hohe Arbeitslosenquoten aufweisen. Weiterhin ist die Standardabweichung, d.h. die Streuung um den Mittelwert, insgesamt für die Landkreise der einzelnen Bundesländer vergleichbar. Mit rund 1-2 Prozentpunkten ist die Standardabweichung auch recht hoch und deutet auf eine nicht unerhebliche Streuung unter den verschiedenen Landkreisen hin. Der Median für die Arbeitslosenquote der Landkreise liegt recht nahe am Mittelwert, was darauf hindeutet das die Landkreise in den einzelnen Bundesländern sich nicht stark voneinander unterscheiden (die Standardabweichungen sind auch recht klein). Da wir hier sehr große Unterschiede zwischen Ost- und Westdeutschland festgestellt haben wollen wir uns eine Dummyvariable “ost” generieren, welche 0 für alle ehemaligen westdeutschen und 1 für alle ehemaligen ostdeutschen Bundesländer ist:

gesamtdaten <- gesamtdaten %>%
  mutate( ost = as.factor(ifelse(bundesland_name %in% c("Brandenburg", "Mecklenburg-Vorpommern", "Sachsen", "Sachsen-Anhalt", "Thüringen"), 1, 0)),
          ost_name = ifelse(ost == 1, "Ostdeutschland", "Westdeutschland"))

Durch diese Aufteilung treten die Unterschiede in der Arbeitslosenquote zwischen den ehemaligen ost- und westdeutschen Landkreisen besonders stark zutage. Insbesondere wenn wir uns die Quantile anschauen: Im 25% Quantil in Ostdeutschland ist die Arbeitslosenquote bei 6,04%, in Westdeutschland ist das 75% Quantil bei einer Arbeitslosenquote von 6,22%!

gesamtdaten %>%
  group_by(ost_name) %>%
  summarise(mean_alo = mean(alo_quote, na.rm = T), sd_alo = sd(alo_quote, na.rm = T), min_alo = min(alo_quote, na.rm = T), q25 = quantile(alo_quote, c(0.25), na.rm = T), median_alo = median(alo_quote, na.rm = T), q75 = quantile(alo_quote, 0.75, na.rm = T), max_alo = max(alo_quote, na.rm = T)) %>%
  ungroup() %>%
  kbl(col.names = c("Bundesland",
                    "Mittelwert",
                    "Std.",
                    "Minimum",
                    "P25",
                    "Median",
                    "P75",
                    "Maximum"), digits = 2) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
  kable_paper(full_width = F) %>%
  add_header_above(c(" " = 1, "Arbeitslosenquote" = 7), align = "c") %>%
  footnote(general = "Wir haben keine Informationen zu Berlin und Hamburg, weshalb sie nicht in der Berechnung enthalten sind.",
           general_title = "Bitte beachten: ")
Arbeitslosenquote
Bundesland Mittelwert Std. Minimum P25 Median P75 Maximum
Ostdeutschland 7.49 1.96 3.76 6.04 7.34 8.87 12.90
Westdeutschland 4.84 2.18 1.64 3.21 4.25 6.22 13.44
Bitte beachten:
Wir haben keine Informationen zu Berlin und Hamburg, weshalb sie nicht in der Berechnung enthalten sind.

Nun haben wir uns ein erstes Bild über die Daten, insbesondere die Arbeitslosigkeit in 2017 machen können. Natürlich sollten die von uns heruntergeladenen Informationen zum BIP und den Schulden der einzelnen Landkreise auch berücksichtigt werden und wir können diese unseren Tabellen hinzufügen:

bula_data_all <- gesamtdaten %>% 
  group_by( bundesland_name ) %>%
  summarise(mean_alo = mean(alo_quote), sd_alo = sd(alo_quote), mean_bip_kopf = mean(bip_pro_kopf), sd_bip_kopf = sd(bip_pro_kopf), mean_schulden_kopf = mean(Schulden_gesamt/Einwohner), sd_schulden = sd(Schulden_gesamt/Einwohner)) %>%
  ungroup()

bula_data_all %>%
  arrange( mean_alo ) %>%
  filter( !is.na(mean_schulden_kopf) ) %>%
  kbl(col.names = c("Bundesland", "Mittelwert","Std.","Mittelwert","Std.", "Mittelwert","Std."), digits = 2, format = "html", 
      caption = "Deskriptive Tabelle komplett") %>%
  #kbl(col.names = c("Mittelwert","Std.", "Mittelwert","Std."), digits = 0) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
  kable_paper(full_width = F) %>%
  row_spec(c(7,9, 11,12,13), bold = T, color = "white", background = "#BBBBBB") %>%
  add_header_above(c(" " = 1, "Arbeitslosenquote" = 2, "BIP pro Kopf" = 2, "Schulden pro Kopf" = 2), align = "c") %>%
  footnote(general = "Wir haben keine Informationen zu Berlin, Hamburg und Bremen bzgl. ihrer Schulden pro Kopf, weshalb sie nicht in der Tabelle aufgeführt wurden.", 
           general_title = "Bitte beachten: ",
           number = "Die ostdeutschen Bundesländer sind grau hinterlegt.") 
Deskriptive Tabelle komplett
Arbeitslosenquote
BIP pro Kopf
Schulden pro Kopf
Bundesland Mittelwert Std. Mittelwert Std. Mittelwert Std.
Bayern 3.04 0.77 42891.12 20008.07 1896.94 1399.73
Baden-Württemberg 3.31 0.64 43673.84 12934.97 2185.49 1612.86
Hessen 5.01 1.35 40082.52 16755.57 3730.85 2870.38
Rheinland-Pfalz 5.31 1.47 33954.05 13965.48 3130.70 3593.36
Saarland 5.85 1.73 32923.33 7383.88 5958.80 1363.06
Niedersachsen 6.16 1.77 35274.47 22951.65 1941.34 1381.10
Thüringen 6.30 1.80 28009.18 5925.85 2832.09 547.15
Schleswig-Holstein 6.36 1.00 32494.36 7691.09 2601.65 1700.98
Sachsen 6.65 1.08 28562.48 5242.58 2305.58 674.06
Nordrhein-Westfalen 7.15 2.43 35807.86 10894.53 4243.47 2483.34
Brandenburg 7.99 1.95 28803.45 5853.89 2831.16 1473.58
Mecklenburg-Vorpommern 8.45 1.58 28193.92 6239.42 3564.62 1667.49
Sachsen-Anhalt 9.03 1.59 26810.40 4096.90 2809.25 1092.19
Bitte beachten:
Wir haben keine Informationen zu Berlin, Hamburg und Bremen bzgl. ihrer Schulden pro Kopf, weshalb sie nicht in der Tabelle aufgeführt wurden.
1 Die ostdeutschen Bundesländer sind grau hinterlegt.

Was wir hier gut sehen können ist folgendes: Für alle Bundesländer in denen wir niedrige Arbeitslosenquoten pro Landkreis haben gibt es auch durchschnittlich ein hohes BIP pro Kopf über die Landkreise des Bundeslandes hinweg. D.h. speziell in unserem Datensatz von 2017 ist in den Bundesländern mit einer durchschnittlich hohen Wirtschaftsleistung in den Landkreisen die Arbeitslosenquote gering. Insbesondere für ostdeutsche Landkreise ist das BIP pro Kopf durchschnittliche nicht über 30 000€, bei den westdeutschen Landkreisen liegt das BIP pro Kopf hingegen durchschnittliche über 30 000€. Bei den Schulden ist dieser Sachverhalt weniger deutlich ausgeprägt. Es gibt westdeutsche Landkreise, wie z.B. in den Bundesländern Bayern und Baden-Württemberg, mit sehr geringen Schulden pro Kopf, doch dies trifft auch für Landkreise in Sachsen oder Thüringen zu. Insbesondere Landkreise im Saarland haben durchschnittlich eine sehr hohe Verschuldung pro Kopf von über 5900€.

Allein durch den Mittelwert und die Standardabweichung konnten wir bereits sehr viel über unsere Daten lernen und haben hier schon einige deutliche Unterschiede zwischen ostdeutschen und westdeutschen Landkreisen feststellen können.

Wir können in deskriptiven Statistiken nun nicht nur Ouerschnittsdaten für ein bestimmtes Jahr betrachten, sondern auch Paneldaten analysieren. Hierbei können wir den Mittelwert und die Standardabweichung über den kompletten Datensatz bilden, wie in den Querschnittsdaten, oder wir können Trends in den Daten beschreiben. Eine solche Trendanalyse wollen wir mit der folgenden Tabelle unternehmen. Dieses mal nehmen wir für unsere Analyse das Paket gt.

bundesland_name <- gesamtdaten %>%
  select(bundesland_name, bundesland, ost_name) %>%
  distinct() %>%
  rename(Regionalschluessel = bundesland)

bip_daten <- bip_zeitreihe %>%
  left_join(., bundesland_name, by="Regionalschluessel") %>%
  filter( nchar(Regionalschluessel) == 2 ) %>%
  filter( Regionalschluessel != 17) %>% #17 = Deutschland
  filter( Jahr == 1992 | Jahr == 2005 | Jahr == 2017) %>%
  group_by(ost_name, bundesland_name, Jahr) %>%
  summarise( mean_bip = mean(bip_pro_kopf)) %>%
  ungroup()


bip_daten %>% 
  pivot_wider(names_from = "Jahr", values_from = "mean_bip") %>%
  gt(groupname_col = "ost_name") %>% 
  fmt_number(columns = vars(`1992`, `2005`, `2017`), decimals = 0) %>%
  fmt_currency(columns = vars(`1992`, `2005`, `2017`), rows = 1, currency = "EUR", decimals = 0) %>%
  cols_align(align = "left",
             columns = vars(`bundesland_name`)) %>% 
  cols_label(bundesland_name = md("")) %>%
  tab_spanner(label = "BIP pro Kopf in den einzelnen Bundesländern", columns = vars(`1992`, `2005`, `2017`)) %>% 
  tab_style(
    style = cell_text(color = "black", weight = "bold"),
    locations = list(
      cells_column_spanners(everything()),
      cells_column_labels(everything())
    )
  ) %>%  
  tab_options(
    row_group.border.top.width = px(3),
    row_group.border.top.color = "black",
    row_group.border.bottom.color = "black",
    table_body.hlines.color = "white",
    table.border.top.color = "white",
    table.border.top.width = px(3),
    table.border.bottom.color = "white",
    table.border.bottom.width = px(3),
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
  ) %>% 
  tab_source_note(md("**Daten**: Statistische Ämter Deutschlands<br>**Inspiration**: @thomas_mock"))
BIP pro Kopf in den einzelnen Bundesländern
1992 2005 2017
Ostdeutschland
Brandenburg 9,667 19,140 28,265
Mecklenburg-Vorpommern 9,397 17,984 27,428
Sachsen 9,785 19,980 29,852
Sachsen-Anhalt 9,124 18,580 27,317
Thüringen 8,896 18,485 28,394
Westdeutschland
Baden-Württemberg 25,458 31,917 45,260
Bayern 24,263 32,124 46,726
Berlin 21,848 26,741 39,320
Bremen 28,401 37,841 47,638
Hamburg 38,063 51,832 64,042
Hessen 27,050 35,068 44,972
Niedersachsen 20,383 25,010 36,195
Nordrhein-Westfalen 22,793 28,090 37,929
Rheinland-Pfalz 20,788 24,567 34,428
Saarland 20,626 27,397 35,510
Schleswig-Holstein 20,256 23,985 32,094
Daten: Statistische Ämter Deutschlands
Inspiration: @thomas_mock

Auch in dieser Tabelle treten die Unterschiede zwischen westdeutschen und ostdeutschen Landkreisen zutage. Während die westdeutschen Landkreise bereits im Jahr 1992 ein BIP pro Kopf von durchschnittlich über 20 000€ aufweisen konnten, hatten viele ostdeutsche Landkreise diese Schwelle noch nicht einmal im Jahr 2005 erreicht. Jedoch gibt es seit dem Jahr 1992 einen Aufholprozess der ostdeutschen Landkreise an die westdeutschen Landkreise. Dieser Prozess fand jedoch hauptsächlich in den Jahren direkt nach der Wende statt. Z.B. war das durchschnittliche BIP pro Kopf in den Landkreisen in Thüringen im Jahr 1992 nur 34,9% des durchschnittlichen BIP pro Kopf der Landkreise in Baden-Württemberg. In 2005 kletterte der Anteil bereits auf 57,9% und in 2017 liegt er bei 62,7%. Durch die Ergebnisse unserer Tabelle bestärkt, könnten wir vermuten das die Erneuerung der Infrastruktur und der Ansiedlung neuer Industriezweige in den ostdeutschen Landkreisen zu einem schnelleren Wachstum dieser Landkreise direkt nach der Wende und in den 1990er Jahren geführt hat. Dieses Wachstum hat sich jedoch in den letzten Jahren deutlich verlangsamt und es kommt nur noch zu einer sehr moderaten Anpassung des BIP pro Kopf.

Visualisierung der Unterschiede

Tabellen sind hilfreich um Informationen kompakt zu präsentieren. Jedoch ist es oft ebenso wichtig (und manchmal für ihre Argumentation umso wichtiger) Erkenntnisse visuell zu veranschaulichen. In diesem Abschnitt wollen wir mehr über die Zusammensetzung jeder Variablen erfahren und dafür Grafiken verwenden.

Arbeitslosenquote

Die Variable, welche uns besonders interessiert ist die Arbeitslosenquote, insbesondere da ihr Cousin gemeint hat, dass Deutschland kein Problem mit der Arbeitslosigkeit hat. Wir wollen hier alle Datenpunkte zeigen, d.h. die Arbeitslosenquote eines jeden Landkreises für das Jahr 2017, getrennt nach Ost- und Westdeutschland. Weiterhin wollen wir unsere Grafik um einen Boxplot erweitern um einen Vergleich des Medians der Arbeitslosenquote in Ost- und Westdeutschland zu ermöglichen.

alo_quote_jitter <- gesamtdaten %>%
  select(alo_quote, landkreis_name, bundesland_name, ost_name) %>%
  ggplot(aes(x = ost_name, y=alo_quote)) +
  geom_jitter(alpha=0.5) +
  geom_boxplot(alpha = 0.1) +
  theme_minimal() +
  labs(title = "Arbeitslosenquote in Deutschland",
       subtitle = "Eine Beobachtung repräsentiert einen Landkreis",
       x = "",
       y = "Arbeitslosenquote",
       caption = "Quelle: Daten der Agentur für Arbeit aus dem Jahr 2017")
  
alo_quote_jitter

Das Schaubild zeigt uns zum Einen, dass es deutlich mehr westdeutsche, wie ostdeutsche Landkreise gibt (nicht verwunderlich), aber auch, dass diese westdeutschen Landkreise zu einem sehr großen Teil weniger als 5% Arbeitslosigkeit aufweisen, wohingegen der größte Teil aller ostdeutschen Landkreise mehr als 5% Arbeitslosigkeit aufweist. Selbst der ostdeutsche Landkreis mit der niedrigsten Arbeitslosenquote ist nur leicht unter dem Median in Westdeutschland. Jedoch können wir konstatieren, dass ihr Cousin recht hatte mit seiner Behauptung, denn es gibt sowohl in Ost als auch in Westdeutschland nur sehr wenige Landkreise welche eine Arbeitslosenquote von mehr als 10% haben. In Spanien gibt es fast keine Region mit einer Arbeitslosenquote unter 10%! Nichtsdestotrotz sind auch in Deutschland regionale Unterschiede erkennbar, welche wir insbesondere im dritten Teil der Case Study zu erklären versuchen. Als mögliche Faktoren, welche die Arbeitslosenquote erklären könnten, wollen wir hier das BIP pro Kopf und die Pro-Kopf-Verschuldung näher untersuchen.

Wir haben nun auch noch die Möglichkeit bestimmte Regionen in unterschiedlichen Farben zu markieren. Wollen wir beispielsweise alle Landkreise aus Baden-Württemberg hervorheben, so können wir diese beispielsweise rot einfärben und bekommen dadurch einen Eindruck wo Baden-Württemberg im deutschlandweiten Vergleich der Arbeitslosenquote pro Landkreis steht.

alo_quote_jitter_farbe <- gesamtdaten %>%
  select(alo_quote, landkreis_name, bundesland_name, ost_name) %>%
  mutate(baden_wuerttemberg = as.factor(ifelse(bundesland_name == "Baden-Württemberg", 1, 0))) %>%
  ggplot(aes(x = ost_name, y=alo_quote)) +
  geom_jitter(alpha=0.5, aes(color = ifelse(baden_wuerttemberg == 1, "darkred", "darkgrey"))) +
  scale_color_identity() +
  geom_boxplot(alpha = 0.1) +
  theme_minimal() +
  labs(title = "Arbeitslosenquote in Deutschland",
       subtitle = "Eine Beobachtung repräsentiert einen Landkreis",
       x = "",
       y = "Arbeitslosenquote",
       caption = "Quelle: Daten der Agentur für Arbeit aus dem Jahr 2017\nDie roten Datenpunkte sind Landkreise aus Baden-Württemberg") +
  theme(legend.position = "none")
  
alo_quote_jitter_farbe

Hinweis zur vorherigen Grafik: Falls wir dem Leser etwas mehr Freiheiten einräumen möchten und unsere Grafik als HTML Datei übergeben, so können wir auch eine interaktive Grafik nutzen. So kann der Leser mit unserer Ausarbeitung interagieren:

# Zusätzlich Info um welchen Landkreis es sich handelt
alo_quote_jitter_plotly <- gesamtdaten %>%
  select(alo_quote, landkreis_name, bundesland_name, ost_name) %>%
  ggplot(aes(x = ost_name, y=alo_quote, label = landkreis_name)) +
  geom_jitter(alpha=0.5) +
  geom_boxplot(alpha = 0.1) +
  theme_minimal() +
  labs(title = "Arbeitslosenquote in Deutschland",
       subtitle = "Eine Beobachtung repräsentiert einen Landkreis",
       x = "",
       y = "Arbeitslosenquote",
       caption = "Quelle: Daten der Bundesagentur Agentur für Arbeit aus dem Jahr 2017.")

ggplotly(alo_quote_jitter_plotly)

Bruttoinlandsprodukt pro Kopf

Wir haben im vorherigen Abschnitt gesehen, dass es durchaus deutliche regionale Unterschiede in der Arbeitslosenquote in 2017 gibt. Doch was könnten die Treiber dafür sein?

In diesem Unterabschnitt wollen wir uns das Bruttoinlandsprodukt pro Kopf auf Landkreisebene näher anschauen. Hierbei haben wir nicht nur die Daten für 2017, sondern können uns einer längeren Zeitreihe bedienen. Somit können wir uns die Entwicklung des BIP pro Kopf in den ehemaligen ost- und westdeutschen Bundesländern näher anschauen. Diese Zeitreihen sind für uns nützliche Hinweise, denn dadurch können wir sehen:

  • ob es auch regionale Unterschiede im BIP pro Kopf gibt und nicht nur in der Arbeitslosenquote
  • ob die regionalen Unterschiede schon längere Zeit bestehen
  • ob die regionalen Unterschiede sich vergrößern oder verkleinern

Das Bruttoinlandsprodukt stellt die wichtigste gesamtwirtschaftliche Kenngröße dar. Es gibt Aufschluss darüber, wie viele Güter und Dienstleistungen in dem jeweiligen Landkreis produziert wurden. Falls das BIP in einem Landkreis hoch ist könnte dies unter anderem daran liegen, dass

  • viele Personen in diesem Landkreis erwerbstätig sind,
  • oder das die Erwerbstätigen in Branchen mit hoher Produktivität arbeiten.

Falls der erste Punkt zutrifft sollte ein hohes BIP pro Kopf (man beachte das hier das BIP pro Einwohner berechnet wird) auch mit einer niedrigeren Arbeitslosenquote einhergehen.

# Zuerst die Information zu landkreis_name und bundesland_name zum Datensatz big_long hinzumergen
namen <- gesamtdaten %>%
  select(Regionalschluessel, bundesland_name, landkreis_name, ost_name)

bip_zeitreihe_namen <- bip_zeitreihe %>%
  filter( nchar(Regionalschluessel) == 5) %>%
  left_join(.,namen, by="Regionalschluessel")

options(scipen = 5)
plot_bip <- bip_zeitreihe_namen %>%
  filter( Jahr >= 2000 ) %>%
  group_by(ost_name, Jahr) %>%
  mutate( durchschnitt = mean(bip_pro_kopf),
          ulm = ifelse(landkreis_name == "Ulm", bip_pro_kopf,NA)) %>%
  ggplot() +
  geom_line(aes(x = Jahr, y = bip_pro_kopf, group = Regionalschluessel), color = "grey") +
  geom_line(aes(x = Jahr, y = durchschnitt, group = Regionalschluessel), color = "darkblue") +
  geom_line(aes(x = Jahr, y = ulm, group = Regionalschluessel), color = "darkgreen") +
  scale_y_continuous(trans = "log10") + 
  theme_minimal() +
  facet_wrap(ost_name ~ .) +
  theme(legend.position = "none") +
  labs(title = "Ein Vergleich des BIP pro Kopf von ost- und westdeutschen Landkreisen",
       subtitle = "Durchschnittswerte in Dunkelblau, Ulm in Dunkelgrün",
       caption = "Quelle: Daten der Statistischen Ämter der Länder und des Bundes.",
       x = "Jahr",
       y = "BIP pro Kopf")

plot_bip

Das Niveau des BIP pro Kopf ist in den ostdeutschen Bundesländern deutlich niedriger als in den westdeutschen. Insbesondere wenn wir uns die logarithmische Skalierung der y-Achse anschauen, so können wir doch deutliche Unterschiede erkennen. Beispielsweise ist das durchschnittliche BIP pro Kopf im ehemaligen Ostdeutschland mit 28091€ in 2017 so hoch wie in Westdeutschland im Jahr 2006 (zu diesem Zeitpunkt lag das durchschnittliche BIP pro Kopf in Westdeutschland bei 28961€)!

In der oben dargestellten Grafik sehen wir keinen großen Anpassungsprozess seit dem Jahr 2000 der ostdeutschen Landkreise an die westdeutschen Landkreise was das BIP pro Kopf anbelangt. Nichtsdestotrotz kann es insbesondere in den 1990er Jahren zu einer schnellen Aufholjagd der ostdeutschen Landkreise gekommen sein auf Grund der hohen Investitionen und Infrastrukturausgaben nach der Wende. Dafür müssen wir mit unserer Analyse noch etwas weiter zurück gehen, was jedoch dazu führt, das wir nicht mehr alle Landkreise in unseren Beobachtungen enthalten haben. Für einige Landkreise haben wir erst Daten ab 2000, was wir bei der Interpretation der folgenden Grafik beachten sollten:

bip_zeitreihe_namen %>%
  group_by(ost_name, Jahr) %>%
  mutate( durchschnitt = mean(bip_pro_kopf, na.rm = T),
          ulm = ifelse(landkreis_name == "Ulm", bip_pro_kopf,NA)) %>%
  ggplot() +
  geom_line(aes(x = Jahr, y = durchschnitt, group = Regionalschluessel, color = ost_name)) +
  scale_color_manual(values = c("#D55E00", "#0072B2")) +
  scale_y_continuous(trans = "log10") + 
  theme_minimal() +
  theme(legend.position = "none") +
  labs(title = "Ein Vergleich des BIP pro Kopf von ost- und westdeutschen Landkreisen",
       subtitle = "Zeitreihe ab 1992 bis 2017",
       caption = "Quelle: Daten der Statistischen Ämter der Länder und des Bundes.",
       x = "Jahr",
       y = "BIP pro Kopf") +
  geom_text(aes(x=2000, y=15000, label = "Durchschnitt für ostdeutsche Landkreise"), color = "#D55E00", hjust=0, size=4, alpha = 0.1) +
  geom_curve(aes(x = 2007, xend = 2005, y = 15500, yend = 18500), curvature = .3, color = "#D55E00", size = 0.1) +
  geom_text(aes(x=1992, y=31000, label = "Durchschnitt für westdeutsche Landkreise"), color = "#0072B2", hjust=0, size=4, alpha = 0.1) +
  geom_curve(aes(x = 1995, xend = 1997, y = 29000, yend = 25000), curvature = .2, color = "#0072B2", size = 0.1)

Wie wir aus der Grafik deutlich sehen können hatten die ostdeutschen Landkreise zu Beginn der 1990er Jahre einen deutlich steileren Wachstumspfad als die westdeutschen Landkreise. Für manche ostdeutschen Landkreise haben wir leider keine Information ab 1992, jedoch deutet das Bild schon sehr stark darauf hin, dass es in den ersten Jahren nach der Wende einen starken Anpassungsprozess gegeben hat mit hohen Wachstumsraten des BIP pro Kopf. Dieser hat jedoch Mitte der 1990 Jahre etwas an Fahrt verloren und ab dem Jahr 2010 liegen ost- und westdeutsche Landkreise praktisch auf dem gleichen Wachstumspfad. D.h. hier sehen wir keine weitere Anpassung der ostdeutschen Landkreise an die westdeutschen Landkreise mehr. Einen ähnlichen Schluss hatten wir bereits bei der Analyse der gt Tabelle im Abschnitt zu den deskriptiven Tabellen gesehen.

Eine weitere Möglichkeit die Wachstumspfade zu visualisieren wäre mit sogenannten “small multiples”. Hierdurch können wir die Aufmerksamkeit auf den Wachstumspfad richten und ignorieren dabei die Höhe des Startwertes. Für diese und alle nun folgenden Analysen wollen wir uns nun wieder die Daten ab dem Jahr 2000 anschauen. Hintergrund ist, dass ab diesem Zeitpunkt Daten für alle Landkreise verfügbar sind.

plot_bip_sparklines <- bip_zeitreihe_namen %>%
  filter( Jahr >= 2000 ) %>%
  group_by(ost_name, Jahr) %>%
  mutate( durchschnitt = mean(bip_pro_kopf),
          ulm = ifelse(landkreis_name == "Ulm", bip_pro_kopf,NA)) %>%
  ggplot() +
  geom_line(aes(x = Jahr, y = durchschnitt, group = Regionalschluessel), color = "darkblue") +
  theme(legend.position = "none") +
  labs(title = "Die Entwicklung des BIP pro Kopf der unterschiedlichen Bundesländer\n",
       caption = "Quelle: Daten der Statistischen Ämter der Länder und des Bundes.",
       x = "Jahr",
       y = "BIP pro Kopf") +
  facet_wrap(~bundesland_name, scales = "free_y") +
  theme_void() +
  theme(strip.text = element_text(face = "bold"))

plot_bip_sparklines

Auch in diesem Beispiel sehen wir, dass alle Bundesländer über die Jahre hinweg ihr BIP pro Kopf steigern konnten und das der Effekt der Finanzkrise tendenziell in den westdeutschen Landkreisen ausgeprägter war als in den ostdeutschen. Noch besser können wir den Effekt der Finanzkrise an der folgenden Grafik sehen, bei welcher die Veränderung des BIP pro Kopf in jedem Landkreis zum Vorjahr abgetragen wird:

bip_wachstum <- bip_zeitreihe_namen %>%
  group_by(Regionalschluessel) %>%
  arrange(Regionalschluessel, Jahr) %>%
  mutate( bip_pro_kopf_wachstum = 100*(bip_pro_kopf - lag(bip_pro_kopf)) / bip_pro_kopf) %>%
  ungroup() %>%
  group_by(ost_name, Jahr) %>%
  mutate( durchschnitt = mean(bip_pro_kopf_wachstum, na.rm=TRUE)) %>%
  ungroup()

bip_wachstum %>%
  filter( Jahr >= 2000 ) %>%
  ggplot() +
  geom_line(aes(x = Jahr, y = bip_pro_kopf_wachstum, group = Regionalschluessel), color = "grey") +
  geom_line(aes(x = Jahr, y = durchschnitt, group = Regionalschluessel, color = ost_name)) +
  scale_color_manual(values = c("#D55E00", "#0072B2")) +
  theme_minimal() +
  labs(color = "Durchschnitt der Landkreise",
       title = "Die Wachstumsrate des BIP pro Kopf von ost- und westdeutschen Landkreisen",
       caption = "Quelle: Daten der Statistischen Ämter der Länder und des Bundes.",
       x = "Jahr",
       y = "Veränderung des BIP pro Kopf") +
  theme(legend.position = "none") +
  geom_text(aes(x=2000, y=40, label = "-- Durchschnitt für ostdeutsche Landkreise"), color = "#D55E00", hjust=0, size=4, alpha = 0.1) +
  geom_text(aes(x=2000, y=35, label = "-- Durchschnitt für westdeutsche Landkreise"), color = "#0072B2", hjust=0, size=4, alpha = 0.1)

Insgesamt haben ost- und westdeutsche Landkreise im Durchschnitt eine sehr ähnliche Wachstumsrate des BIP pro Kopf seit 2000. In den westdeutschen Landkreisen ist sie stellenweise etwas niedriger, insbesondere vor der Finanzkrise.

Durch die vorherigen Schaubilder sehen wir, dass die Unterschiede zwischen den ost- und westdeutschen Landkreisen schon lange bestehen (mind. seit 2000) und das es keine große Annäherung der ostdeutschen Landkreise an das westdeutsche BIP pro Kopf nach dem Jahr 2000 gibt. Die Wachstumspfade sind hierfür zu ähnlich. Direkt nach der Wende war dies anders, zu diesem Zeitpunkt waren die Wachstumspfade der ostdeutschen Landkreise deutlich höher als die der westdeutschen. In der Übungsaufgabe beschäftigen Sie sich mit dem Einkommen auf Landkreisebene und können dort nachvollziehen, ob der Trend bei den Einkommen der Gleiche ist wie bei dem BIP pro Kopf!

Wenn wir uns nur auf das Jahr 2017 beschränken, so sehen wir auch hier im BIP pro Kopf deutliche Unterschiede. Im folgenden Schaubild ist die Verteilung des BIP pro Kopf über alle Landkreise für Ost- und Westdeutschland im Jahr 2017 abgetragen bei denen das BIP pro Kopf unter 100 000€ lag. Zusätzlich sind die jeweiligen Mittelwerte des BIP pro Kopf für ost- und westdeutsche Landkreise in blau eingezeichnet. Zum Einen können wir uns die Verteilung des BIP pro Kopf gut durch ein Histogramm anzeigen lassen, wobei die “binwidth”, d.h. die Dicke eines Balkens, auf 1000€ gesetzt wurde. Dies bedeutet, das alle Beobachtungen innerhalb von 1000€ zusammengefasst in einem Balken dargestellt werden. Z.B. gibt es 10 Landkreise in Westdeutschland, die ein BIP pro Kopf zwischen 26000€ - 27000€ ausweisen (siehe Schaubild).

gesamtdaten %>%
  group_by(ost_name) %>%
  summarise(durchschnitt = mean(bip_pro_kopf, na.rm = T)) %>%
  ggplot(aes(x = bip_pro_kopf)) +
  geom_histogram(data = filter(gesamtdaten, bip_pro_kopf<100000), binwidth = 1000) +
  facet_grid(ost_name~.) +
  geom_vline(aes(xintercept = durchschnitt), color = "blue") +
  theme_bw() +
  labs(title = "Verteilung des BIP pro Kopf für Ost- und Westdeutschland",
       subtitle = "Beobachtungen auf Landkreisebene in 2017",
       x = "BIP pro Kopf",
       y = "Anzahl an Beobachtungen")

means <- gesamtdaten %>%
  group_by(ost_name) %>%
  summarise(durchschnitt = mean(bip_pro_kopf, na.rm = T))

Durch die Analyse der Verteilung des BIP werden unsere bisherigen Erkenntnisse gestützt. Die ostdeutschen Landkreise haben in 2017 ein durchschnittliches BIP pro Kopf von 28091€, die westdeutschen Landkreise von 38884€. Es gibt zwar auch in Westdeutschland Landkreise mit einem geringeren BIP pro Kopf als in manchen ostdeutschen Landkreisen, doch a) es gibt einige Landkreise, die mehr als 50000€ BIP pro Kopf aufweisen in Westdeutschland (keinen in Ostdeutschland) und b) auch der Vergleich der Verteilungen zeigt, dass der Großteil der Beobachtungen in Westdeutschland rechts von dem in Ostdeutschland liegt.

Da wir im oben gezeigten Histogramm die Anzahl an Beobachtungen, d.h. die Anzahl an Landkreisen, auf der y-Achse abgetragen haben könnte es durchaus sein, dass wir die zwei Schaubilder nicht so direkt miteinander Vergleichen können. Schließlich gibt es deutlich weniger ostdeutsche als westdeutsche Landkreise.

Was wir in diesem Fall tun können um die Vergleichbarkeit zu erhöhen ist die Verteilungsdichte zu zeigen, anstatt eines Histogramms. Im Grunde können Sie sich die Dichte als geglättetes Histogramm vorstellen, welche auf der y-Achse nicht mehr die Anzahl an Beobachtungen, sondern die Dichte abträgt.

gesamtdaten %>%
  group_by(ost_name) %>%
  summarise(durchschnitt = mean(bip_pro_kopf, na.rm = T), median = median(bip_pro_kopf, na.rm = T)) %>%
  ggplot(aes(x = bip_pro_kopf)) +
  geom_density(data = filter(gesamtdaten, bip_pro_kopf<100000), kernel = "gaussian", bw = 1000) +
  facet_grid(ost_name~.) +
  geom_vline(aes(xintercept = durchschnitt), color = "blue") +
  geom_vline(aes(xintercept = median), color = "darkgreen") +
  theme_bw() +
  labs(title = "Verteilung des BIP pro Kopf für Ost- und Westdeutschland",
       subtitle = "Beobachtungen auf Landkreisebene in 2017, Durchschnitt = blau, Median = grün",
       x = "BIP pro Kopf",
       y = "Dichte")

Auch hier erhalten wir den selben Eindruck von der Verteilung des BIP pro Kopf, wie beim Histogramm. Die “bindwidth” (bw) haben wir wieder auf 1000€ gesetzt und wieder nur die Landkreise abgetragen mit einem BIP pro Kopf von unter 100000€. Neben dem Durchschnitt (in blau) haben wir hier noch den Median (in grün) der Verteilungen eingezeichnet und sehen, dass dieser in Ostdeutschland deutlich näher am Mittelwert liegt als in Westdeuschland. Dies liegt vor allem daran das es in Westdeutschland einige Landkreise mit sehr hohen BIP pro Kopf gibt.

Verschuldung der einzelnen Landkreise

Ein weiterer Faktor, welcher die Arbeitslosenquote bestimmen könnte ist die Verschuldung des öffentlichen Haushalts. In strukturschwachen Landkreisen mit einer hohen Verschuldung sind tendenziell weniger Jobs vorhanden und die Gemeinden haben niedrigere Gewerbesteuereinnahmen. Für Investitionen müssen sich diese Gemeinden beim nicht-öffentlichen Sektor verschulden.

Um uns die Verschuldung des öffentlichen Haushalts besser vor Augen zu führen wollen wir diese auf einer Deutschlandkarte darstellen:

schulden_landkreise <- left_join(landkreise, gesamtdaten, by="Regionalschluessel") %>%
  mutate(schulden_pro_kopf = as.factor(case_when(
    Schulden_pro_kopf_lk <= 1000 ~ "0 - 1k",
    Schulden_pro_kopf_lk > 1000 & Schulden_pro_kopf_lk <= 2000 ~ "1k - 2k",
    Schulden_pro_kopf_lk > 2000 & Schulden_pro_kopf_lk <= 3000 ~ "2k - 3k",
    Schulden_pro_kopf_lk > 3000 & Schulden_pro_kopf_lk <= 5000 ~ "3k - 5k",
    Schulden_pro_kopf_lk > 5000 & Schulden_pro_kopf_lk <= 8000 ~ "5k - 8k",
    Schulden_pro_kopf_lk > 8000 & Schulden_pro_kopf_lk <= 20000 ~ "8k - 20k"
  )))

plot_schulden_lk <- ggplot(
  # Datensatz
  data = schulden_landkreise
) +
  geom_sf(
    mapping = aes(
      fill = schulden_pro_kopf
    ),
    color = "white",
    size = 0.1
  ) +
  # Viridis Farbschema
  scale_fill_viridis_d(
    option = "inferno",
    name = "Schulden\npro Kopf in €",
    alpha = 0.8, # Deckkraft der Füllung
    begin = 0.1,
    end = 0.9,
    direction = -1,
    guide = guide_legend(reverse = T)) +
  # etwas dickere Linien für Bundeslandgrenzen
  geom_sf(
    data = bundesland,
    fill = "transparent",
    color = "white",
    size = 0.5
  ) +
  # Titel
  labs(x = NULL,
       y = NULL,
       title = "Wie verschuldet sind die deutschen Landkreise?",
       subtitle = "Öffentliche Schulden pro Kopf in 2017") +
  theme_minimal()

plot_schulden_lk

Das Schaubild zeigt die pro-Kopf Verschuldung der einzelnen Landkreise. Je dunkler die Landkreise eingefärbt sind, desto höher ist ihre Verschuldung. Die Legende gibt die Bandbreite der Verschuldung pro Farbschattierung wieder, wobei 1k = 1000€ und 8k = 8000€ bedeuten. Für Berlin, Bremen, Bremerhafen und Hamburg (weiß hinterlegt) haben wir keine Daten. Wir sehen besonders in Bayern und Baden-Württemberg sehr viele Landkreise mit einer geringen Pro-Kopf Verschuldung bis maximal 2000€, gleiches gilt für Reinland-Pfalz und zum Großteil auch Niedersachsen. In Nordrhein-Westfalen und dem Saarland hingegen haben wir eine sehr hohe Verschuldung pro Kopf. Thüringen, Mecklenburg-Vorpommern und Hessen sind im Mittelfeld. Besonders das Ruhrgebiet, die ehemalige Herzkammer der deutschen Industrie, sticht durch eine hohe Verschuldung pro Kopf hervor. Nun haben wir hier die öffentliche Verschuldung ins Verhältnis zu der Einwohnerzahl gesetzt, allerdings wird ihnen eine andere Berechnung bzw. Einschätzung der Verschuldung öfter begegnen: Die Verschuldung eines Landes bzw. ein Landkreis im Verhältnis zur Wirtschaftskraft, d.h. zum BIP, dieses Landkreises. Dies wollen wir hier auch berechnen und die Deutschlandkarte entsprechend einfärben:

schulden_landkreise_anteil <- left_join(landkreise, gesamtdaten, by="Regionalschluessel") %>%
  mutate(anteil_schulden = Schulden_gesamt / bip,
         anteil_schulden = as.factor(case_when(
    anteil_schulden <= 0.02~ "0 - 2%",
    anteil_schulden > 0.02 & anteil_schulden <= 0.04 ~ "2% - 4%",
    anteil_schulden > 0.04 & anteil_schulden <= 0.06 ~ "4% - 6%",
    anteil_schulden > 0.06 & anteil_schulden <= 0.08 ~ "6% - 8%",
    anteil_schulden > 0.08 & anteil_schulden <= 0.10 ~ "8% - 10%",
    anteil_schulden > 0.10  ~ ">10%"
  )))

plot_schulden_lk <- ggplot(
  # Datensatz
  data = schulden_landkreise_anteil
) +
  geom_sf(
    mapping = aes(
      fill = fct_relevel(anteil_schulden, ">10%", after = Inf)
    ),
    color = "white",
    size = 0.1
  ) +
  # Viridis Farbschema
  scale_fill_viridis_d(
    option = "inferno",
    name = "Anteil der Schulden\nam BIP",
    alpha = 0.8, # Deckkraft der Füllung
    begin = 0.1,
    end = 0.9,
    direction = -1,
    guide = guide_legend(reverse = T)) +
  geom_sf(
    data = bundesland,
    fill = "transparent",
    color = "white",
    size = 0.5
  ) +
  # Titel
  labs(x = NULL,
       y = NULL,
       title = "Wie verschuldet sind die deutschen Landkreise?",
       subtitle = "Öffentliche Schulden im Verhältnis zum BIP in 2017") +
  theme_minimal()

plot_schulden_lk

Auch hier erhalten wir ein sehr ähnliches Bild bzgl. der Verschuldung der Landkreise. Es treten allerdings die ostdeutschen Landkreise nochmal etwas stäker bzgl. ihrer Verschuldung hervor, was zum Einen natürlich an den gewählten Cut-offs für die Darstellung (0-2% bis >10%) liegt. Zum Anderen aber auch daran, dass die Anzahl an Personen in den Landkreisen recht hoch ist, während die Wirtschaftskraft der Landkreise geringer ausfällt. In dieser Karte sehen wir nun recht deutlich die wenig verschuldeten Regionen hervortreten, die da wären Baden-Württemberg, Bayern, Rheinland-Pfalz und Niedersachsen. Um jedoch beurteilen zu können, in wie fern diese Pro-Kopf Verschuldung der öffentlichen Haushalte mit der Arbeitslosigkeit in den jeweiligen Landkreisen zusammenfällt wollen wir uns auch noch eine Karte zur Arbeitslosigkeit in den jeweiligen Landkreisen anschauen:

schulden_landkreise <- left_join(landkreise, gesamtdaten, by="Regionalschluessel") %>%
  mutate(alo_quote_lk = as.factor(case_when(
    alo_quote <= 2 ~ "0 - 2%",
    alo_quote > 2 & alo_quote <= 4 ~ "2 - 4%",
    alo_quote > 4 & alo_quote <= 6 ~ "4 - 6%",
    alo_quote > 6 & alo_quote <= 8 ~ "6 - 8%",
    alo_quote > 8 & alo_quote <= 10 ~ "8 - 10%",
    alo_quote > 10 ~ ">10%"
  )))

plot_alo_lk <- ggplot(
  # Datensatz
  data = schulden_landkreise
) +
  geom_sf(
    mapping = aes(
      fill = fct_relevel(alo_quote_lk, ">10%", after = 5)
    ),
    color = "white",
    size = 0.1
  ) +
  # Viridis Farbschema
  scale_fill_viridis_d(
    option = "inferno",
    name = "Arbeitslosenquote",
    alpha = 0.8, # Deckkraft der Füllung
    begin = 0.1,
    end = 0.9,
    direction = -1,
    guide = guide_legend(reverse = T)) +
  # etwas dickere Linien für Bundeslandgrenzen
  geom_sf(
    data = bundesland,
    fill = "transparent",
    color = "white",
    size = 0.5
  ) +
  # Titel
  labs(x = NULL,
       y = NULL,
       title = "Arbeitslosigkeit in Deutschland",
       subtitle = "Dargestellt ist die Arbeitslosenquote für alle Landkreise in 2017") +
  theme_minimal()


plot_alo_lk

In dieser Karte sehen wir einen deutlichen Unterschied für ost- und westdeutsche Landkreise. In Ostdeutschland ist die Arbeitslosigkeit deutlich höher als in Westdeutschland, d.h. das Kartenpendant zu unseren vorherigen Analysen. Jedoch sind die Landkreise in Westdeutschland, welche eine hohe Verschuldung aufweisen, wie beispielsweise im Saarland oder Nordrhein-Westfalen, auch die Landkreise mit der höchsten Arbeitslosenquote in Westdeutschland. Daher könnte die Verschuldung des öffentlichen Haushalts durchaus auch ein Faktor sein, welcher die Arbeitslosenquote erklären könnte und wir sollten diesen Faktor in unserer Analyse weiterhin berücksichtigen.

Bivariate deskriptive Analyse

Die Korrelation

In unseren aktuellen Analysen hatten wir uns mit univariaten deskriptiven Analysen beschäftigt, d.h nur mit einer Variablen an sich. Nun wollen wir uns noch anschauen, wie die Arbeitslosenqutoe mit dem BIP Wachstum und dem Anteil der öffentlichen Schulden am BIP im Jahr 2017 für die einzelnen Landkreise in Deutschland zusammenhängen, d.h. eine bivariate deskriptive Analyse.

Durch die bisherigen deskriptiven Analysen haben wir eine große Streuung des BIP pro Kopf innerhalb Deutschlands festgestellt. Insbesondere gab es einen deutlichen Unterschied zwischen ost- und westdeutschen Landkreisen. Im BIP Wachstum waren sich ost- und westdeutsche Landkreise im Durchschnitt recht ähnlich, doch auch hier gab es beträchtliche Unterschiede zwischen den Landkreisen. Um etwas darüber Aussagen zu können, wie die Arbeitslosenquote mit dem BIP-Wachstum oder der öffentlichen Verschuldung zusammenhängt, wollen wir uns die Korrelation der einzelnen Variablen untereinander näher anschauen.

Arbeitslosenquote und BIP-Wachstum

Zuerst wollen wir das zuvor berechnete BIP-Wachstum auf das Jahr 2017 einschränken und dies zu unseren gesamtdaten hinzumergen.

bip_wachstum_2017 <- bip_wachstum %>%
  filter( Jahr == 2017 ) %>%
  select(Regionalschluessel, bip_pro_kopf_wachstum, Jahr)

gesamtdaten <- left_join(gesamtdaten, bip_wachstum_2017, by = "Regionalschluessel") %>%
  mutate(anteil_schulden = Schulden_gesamt / bip)

Anschließend erstellen wir ein Streudiagramm, welches die Arbeitslosenquote und das BIP Wachstum in den einzelnen Landkreisen einander gegenüberstellt. Hier erhalten wir erste Einblicke in die Korrelation der zwei Variablen.

gesamtdaten %>%
  ggplot(aes(x = bip_pro_kopf_wachstum, y = alo_quote)) + 
  geom_point() + 
  labs( x = "Wachstum des BIP %", 
        y = "Arbeitslosenquote in %",
        title = "Korrelation des BIP-Wachstums und der Arbeitslosenquote") +
  theme_minimal() 

Zuerst fallen die Ausreißer ins Auge. Insbesondere im positiven Bereich gibt es Landkreise, welche ein BIP-pro-Kopf-Wachstum von über 10% von 2016 nach 2017 aufweisen. Aber es gibt auch einen Landkreis, welcher eine Schumpfung des BIP pro Kopf um fast 10% aufweist. Solche Ausreißer können daher stammen, dass es in den jeweiligen Landkreisen im Vorjahr ein sehr niedriges BIP Wachstum (bspw. Landkreis Forchheim) oder ein sehr hohes BIP Wachstum (bspw. Landkreis Aschaffenburg) gab, d.h. wir sehen hier für vereinzelte Landkreise einen Aufholprozess aus dem vorherigen Jahr. Diese hohen oder niedrigen Wachstumsraten könnten natürlich durch vereinzelte Projekte auf Landkreisebene bedingt sein, werden sich jedoch im gesamten Datensatz mit 401 Landkreisen und kreisfreien Städten wieder relativieren. Je mehr Beobachtungen Sie in ihrem Datensatz haben, desto weniger fallen einzelne Ausreißer ins Gewicht. Durch unseren umfangreichen Datensatz können wir solche einzelnen Ausreißer auffangen. Wenn wir jedoch eine kleine Stichprobe aus diesem Datensatz extrahieren (z.B. nur alle ostdeutschen Landkreise), dann könnte schon ein deutlich anderes Bild des Zusammenhangs der beiden Variablen entstehen. Hier haben z.B. alle ostdeutschen Landkreise eine relativ große Streuung in den Arbeitslosenquoten, aber nur eine geringe Bandbreite beim BIP Wachstum.

gesamtdaten %>%
  ggplot(aes(x = bip_pro_kopf_wachstum, y = alo_quote, color = ost_name)) + 
  geom_point() + 
  labs( x = "Wachstum des BIP %", 
        y = "Arbeitslosenquote in %",
        title = "Korrelation des BIP-Wachstums und der Arbeitslosenquote",
        color = "") +
  theme_minimal()

Anhand der Punktewolke könnten wir abschätzen das der Zusammenhang zwischen der Arbeitslosenquote und dem BIP-pro-Kopf-Wachstum nahe Null sein müsste. D.h. wir würden vermuten das es keinen Zusammenhang zwischen der BIP-pro-Kopf Wachstumsrate und der Arbeitslosenquote eines Landkreises in 2017 gibt.

Wenn wir uns die Korrelation zwischen den zwei Variablen ausgeben lassen, so erhalten wir die eine (schwach) negative Korrelation nahe Null:

cor(gesamtdaten$alo_quote, gesamtdaten$bip_pro_kopf_wachstum,use = "pairwise.complete.obs")
## [1] 0.02202843

D.h. der von uns in der Grafik vermutete (nicht vorhandene) Zusammenhang zwischen der Arbeitslosenquote und dem BIP-pro-Kopf-Wachstum wird durch die Analyse der Korrelation bestätigt.

Arbeitslosenquote und Verschuldung als Anteil am BIP

Die Korrelation der Arbeitslosenquote und dem Anteil der öffentlichen Schulden möchten wir nun auch über ein Streudiagramm untersuchen.

cor_alo_verschuldung <- cor(gesamtdaten$alo_quote, gesamtdaten$anteil_schulden,use = "pairwise.complete.obs")

gesamtdaten %>%
  ggplot(aes(x = anteil_schulden, y = alo_quote)) + 
  geom_point() + 
  labs( x = "Anteil der Schulden am BIP in %", 
        y = "Arbeitslosenquote in %",
        title = "Korrelation der öffentlichen Verschuldung und der Arbeitslosenquote") +
  theme_minimal() +
  geom_text(x = 0.02, y =13, label = paste("r = ", as.character(round(cor_alo_verschuldung,2))))

In diesem Schaubild scheint es einen positiven Zusammenhang zwischen der öffentlichen Verschuldung und der Arbeitslosenquote der Landkreise zu geben. D.h. Landkreise mit einer hohen Verschuldung im Verhältnis zu ihrem BIP haben tendenziell auch eine höhere Arbeitslosenquote. Jedoch ist es auch hier schwer zu sagen, wie groß die Korrelation tatsächlich ist. Daher haben wir die Korrelation im Schaubild mit eingefügt.

Wenn wir wieder eine kleine Stichprobe aus diesem Datensatz extrahieren, dann haben auch hier alle ostdeutschen Landkreise eine relativ große Streuung in den Arbeitslosenquoten, aber nur eine geringe Bandbreite in der öffentlichen Verschuldung.

gesamtdaten %>%
  ggplot(aes(x = anteil_schulden, y = alo_quote, color=ost_name)) + geom_point() + 
  labs( x = "Anteil der Schulden am BIP in %", 
        y = "Arbeitslosenquote in %",
        title = "Korrelation der öffentlichen Verschuldung und der Arbeitslosenquote",
        color = "") +
  theme_minimal()

Würden wir hier nur die Korrelation zwischen Arbeitslosenquote und öffentlicher Verschuldung für ostdeutsche Landkreise betrachten, so ergebe sich eine Korrelation von:

cor_data <- gesamtdaten %>%
  filter(ost == 1)

cor_alo_verschuldung <- cor(cor_data$alo_quote, cor_data$anteil_schulden,use = "pairwise.complete.obs")

cor_alo_verschuldung
## [1] 0.0870932

D.h. wir würden hier komplett andere Schlüsse ziehen auf Basis dieser Stichprobe.

Interpretation der Korrelation

Die Korrelation als Zahl an sich hat keine intuitive quantitative Interpretation. Sie ist eine univariate Repräsentation des Zusammenhangs zweier Variablen. Sie kann uns jedoch dabei helfen stark miteinander korrelierte Variablen in unserem Datensatz ausfindig zu machen. Dies ist insbesondere bei einer späteren Regressionsanalyse hilfreich, wenn es sich um mehrere erklärenden Variablen handelt (multiple lineare Regression), welche wir alle in unsere Regression einfließen lassen möchten. Wenn wir beispielsweise eine sehr hohe positive oder negative Korrelation zwischen den erklärenden Variablen bip_wachstum und anteil_schulden finden würden, dann sollten wir uns genau überlegen, ob wir beide Variablen in die Regression aufnehmen wollen, oder lieber auf eine verzichten. Denn durch stark miteinander korrelierte Variablen setzen wir uns dem Problem der Multikolliniarität aus. Dadurch würden unsere Regressionskoeffizienten bei einer multiplen linearen Regression verzerrt. In unserem Fall ist die Korrelation der beiden Variablen jedoch gering:

cor(gesamtdaten$bip_pro_kopf_wachstum, gesamtdaten$anteil_schulden,use = "pairwise.complete.obs")
## [1] -0.09488676

In einer empirischen Ausarbeitung werden Sie i.d.R. keine Schaubilder zur Korrelation der einzelnen Variablen sehen, sondern nur eine Tabelle in der die Korrelationen der Variablen untereinander abgetragen sind. Eine solche Tabelle können Sie auch einfach in R innerhalb des tidyverse und mittels des Pakets corrr erzeugen:

korrelationen <- gesamtdaten %>%
  select(bip_pro_kopf_wachstum, anteil_schulden, alo_quote) %>%
  correlate() %>% # Korrelationen erzeugen
  rearrange() %>%  # Sortieren nach Korrelation
  shave(upper = TRUE) %>% # Oberen Teil der Tabelle abschneiden
  mutate(rowname = c("1. BIP pro Kopf Wachstum", "2. Anteil Schulden", "3. Arbeitslosenquote")) %>% # Umbenennen der Variablennamen
  select(-rowname) %>%
  fashion(decimals = 2, na_print = "") # Abschließende Verschönerungen

korrelationen %>%
  kbl(caption = "Korrelationen der untersuchten Variablen",
        col.names = c("", "1", "2", "3"),
      format = "html") %>%
  kable_styling(bootstrap_options = c("condensed", "responsive")) %>%
  kable_paper(full_width = TRUE)
Korrelationen der untersuchten Variablen
1 2 3
bip_pro_kopf_wachstum
alo_quote .02
anteil_schulden -.09 .59

In empirischen Ausarbeitungen wird die Korrelation meist nur berechnet um den Zusammenhang einzelner Variablen miteinander zu veranschaulichen. Jedoch sind die Hauptanalysen die getätigt werden keine Korrelationsmatrizen sondern Regressionstabellen. Dies liegt daran, dass Regressionskoeffizienten, anders als Korrelationen eine quantitative Interpretation zulassen. Weiterhin sind die Schätzer in der linearen Regression konsistent und unbiased + wir können den Zusammenhang zwischen mehreren Variablen betrachten. Für den Schätzer in der linearen Regression gilt BLUE (best linear unbiased estimator), was für die Korrelation nicht gilt.

Der Analyse von Zusammenhängen mittels linearer Regression werden wir uns im dritten Teil der Case-Study widmen.

Zusammenfassung und Ausblick

Nun haben wir uns einen Überblick über unsere Daten verschafft und schon einiges zu den regionalen Unterschieden in Deutschland gelernt. Sowohl die deskriptive Analyse mittels Tabellen als auch die grafische Analyse durch verschiedene Plots zeigen uns auch 28 Jahre nach dem Mauerfall (wir analysieren Daten aus 2017) einen deutlichen Unterschied auf Landkreisebene zwischen dem ehemaligen Ostdeutschland und Westdeutschland. Jedoch sind die Unterschiede in den Arbeitslosenquoten nicht nur zwischen Ost- und Westdeutschland erkennbar, sondern es gibt auch einige Landkreise in Westdeutschland, wie z.B. im Saarland oder Nordrhein-Westfalen, welche eine recht hohe Arbeitslosenquote aufweisen. Durch die Analyse der Korrelation der unterschiedlichen Variablen konnten wir insbesondere zwischen der Arbeitslosenquote und dem Anteil der Schulden am BIP einen positiven Zusammenhang feststellen.

Im letzten Teil der Case Study wollen wir mittels linearer Regression ein tiefgreifendes Verständnis von den möglichen Einflussfaktoren auf die Arbeitslosenquote erhalten.

Übungsaufgaben

Im ersten Teil der Case Study hatten Sie sich noch die durchschnittlichen Einkommen auf Landkreisebene in R eingelesen. Nun sollten Sie diese Tabelle deskriptiv analysieren:

  • Erstellen Sie eine deskriptive Tabelle, welche das Einkommen für das Jahr 2017 darstellt. Wie ist hier die Verteilung der Einkommen?
    • Beschreiben Sie Mittelwert, Standardabweichung, sowie Median
  • Erstellen Sie ein Liniendiagramm zu der Entwicklung des Einkommensniveaus in den einzelnen Landkreisen seit 2000. Sie können sich hierbei an dem Diagramm zum BIP pro Kopf orientieren.
    • Hinweis: Mergen Sie zu dem Datensatz “Einkommen” zuerst noch die Information zu “Landkreis_name, Bundesland_name und ost_name” hinzu (siehe auch hierzu diesen Abschnitt)
  • Erstellen Sie eine Karte zum Einkommensniveau der einzelnen Landkreise. Sie können sich hierbei an der Karte zur Verschuldung orientieren.
  • Erstellen Sie eine Korrelationstablle zwischen Arbeitslosenquote, Anteil Schulden, BIP pro Kopf und Einkommen. Sie können sich hierbei an der Tabelle der Korrleationen aus diesem Abschnitt orientieren.
LS0tCnRpdGxlOiAiQ2FzZSBTdHVkeSBmw7xyIERldXRzY2hsYW5kIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogY29zbW8KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UpCmBgYAoKIyMgWndlaXRlciBUZWlsIGRlciBDYXNlIFN0dWR5CgpJbSB6d2VpdGVuIFRlaWwgZGVyIENhc2UgU3R1ZHkgd2VyZGVuIFNpZSBkaWUgZWluZ2VsZXNlbmVuIHVuZCBhdWZnZWFyYmVpdGVuIERhdGVuIGF1cyBUZWlsIDEgZGVza3JpcHRpdiB1bnRlcnN1Y2hlbi4gSGllcmJlaSBlcmhhbHRlbiBTaWUgZWluZW4gRWluZHJ1Y2sgdm9uIGRlbiBEYXRlbiB1bmQga8O2bm5lbiBtw7ZnbGljaGUgWnVzYW1tZW5ow6RuZ2UgZW50ZGVja2VuLCBpbmRlbSBTaWUgdW50ZXJzY2hpZWRsaWNoZSBJbmZvcm1hdGlvbmVuIHZpc3VhbGlzaWVyZW4gdW5kIGF1Y2ggaW4gVGFiZWxsZW5mb3JtIGF1c3dlcnRlbi4gWmllbGUgZGVzIHp3ZWl0ZW4gVGVpbHMgZGVyIENhc2UgU3R1ZHk6CgotIERhdGVuIHZpc3VhbGlzaWVyZW4gdW5kIFp1c8OkbW1lbmjDpG5nZSBncmFmaXNjaCB2ZXJhbnNjaGF1bGljaGVuIAotIERlc2tyaXB0aXZlIEFuYWx5c2VuIG1pdHRlbHMgS29ycmVsYXRpb25zdGFiZWxsZW4gdW5kIGRlc2tyaXB0aXZlbiBUYWJlbGxlbiBhbmZlcnRpZ2VuCi0gRGFzIFZlcnN0w6RuZG5pcyB3aWUgU2llIGlocmUgSW5mb3JtYXRpb25lbiB6dSBiZXN0aW1tdGVuIEZyYWdlc3RlbGx1bmdlbiBtw7ZnbGljaHN0IGVmZmVrdGl2IGF1ZmJlcmVpdGVuCi0gSW50ZXJha3RpdmUgR3JhZmlrZW4gZXJzdGVsbGVuCgpTaWUgZXJoYWx0ZW4gZHVyY2ggZGVza3JpcHRpdmUgQW5hbHlzZW4gZWluZW4gc2VociBndXRlbiBFaW5kcnVjayB2b24gZGVuIHJlZ2lvbmFsZW4gVW50ZXJzY2hpZWRlbiBpbm5lcmhhbGIgRGV1dHNjaGxhbmRzLiBEYXMgYmVnbGVpdGVuZGUgMy4gUlR1dG9yIFByb2JsZW0gU2V0IGdpYnQgaWhuZW4gZWluZW4gc2VociBndXRlbiBFaW5kcnVjayBkYXZvbiwgd2llIGRpZSBVbnRlcnNjaGllZGUgendpc2NoZW4gZGVuIGVpbnplbG5lbiBMw6RuZGVybiBhdWYgZXVyb3DDpGlzY2hlciBFYmVuZSBhdXNzZWhlbi4gCgoKIyBEYXRlbiB1bmQgUGFrZXRlIGxhZGVuCgpOYWNoZGVtIHdpciB1bnMgaW0gZXJzdGVuIFRlaWwgZGVyIENhc2UgU3R1ZHkgYWxsZSBEYXRlbiBhdXMgdmVyc2NoaWVkZW5lbiBEYXRlbnF1ZWxsZW4genVzYW1tZW5nZXRyYWdlbiB1bmQgaW4gUiBlaW5nZWxlc2VuIGhhYmVuLCB3b2xsZW4gd2lyIGluIGRpZXNlbSB6d2VpdGVuIFRlaWwgZGllIGRhcmluIGVudGhhbHRlbmVuIEluZm9ybWF0aW9uZW4gYW5hbHlzaWVyZW4sIGluc2Jlc29uZGVyZSB2aXN1YWxpc2llcmVuLgoKSGllcnp1IGxhZGVuIHdpciB1bnMgZGllIGF1cyBUZWlsIDEgZXJzdGVsbHRlbiBEYXRlbnPDpHR6ZToKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShza2ltcikKbGlicmFyeShzZikKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGd0KQpsaWJyYXJ5KGNvcnJyKQpgYGAKCmBgYHtyfQojIERhdGVuIGVpbmxlc2VuCmVpbmtvbW1lbiA8LSByZWFkUkRTKCJkYXRhL2VpbmtvbW1lbi5yZHMiKQpidW5kZXNsYW5kIDwtIHJlYWRSRFMoImRhdGEvYnVuZGVzbGFuZC5yZHMiKQpsYW5ka3JlaXNlIDwtIHJlYWRSRFMoImRhdGEvbGFuZGtyZWlzZS5yZHMiKQpiaXBfemVpdHJlaWhlIDwtIHJlYWRSRFMoImRhdGEvYmlwX3plaXRyZWloZS5yZHMiKQpnZW1laW5kZW4gPC0gcmVhZFJEUygiZGF0YS9nZW1laW5kZW4ucmRzIikKZ2VzYW10ZGF0ZW4gPC0gcmVhZFJEUygiZGF0YS9nZXNhbXRkYXRlbi5yZHMiKQpzY2h1bGRlbl9iZXJlaW5pZ3QgPC0gcmVhZFJEUygiZGF0YS9zY2h1bGRlbl9iZXJlaW5pZ3QucmRzIikKYGBgCgojIERlc2tyaXB0aXZlIEFuYWx5c2VuCgojIyBVbml2YXJpYXRlIGRlc2tyaXB0aXZlIEFuYWx5c2VuCgpXaXIgd29sbGVuIHVucyB6dSBCZWdpbm4gdW5zZXJlciBBbmFseXNlbiBlaW5lbiDDnGJlcmJsaWNrIMO8YmVyIGRpZSBEYXRlbiB2ZXJzY2hhZmZlbi4gRC5oLiB3aWUgdmllbGUgTGFuZGtyZWlzZSBoYWJlbiB3aXIgaW4gZGVuIERhdGVuPyBXaWUgaXN0IGRpZSBWZXJ0ZWlsdW5nIGRlciBTY2h1bGRlbiwgQXJiZWl0c2xvc2lna2VpdCB1bmQgZGVzIEJJUD8gCgpIaWVyZsO8ciB3b2xsZW4gd2lyIHVucyBpbSBlcnN0ZW4gU2Nocml0dCBkaWUgQXJiZWl0c2xvc2VucXVvdGUgYmVyZWNobmVuLiBEaWUgU2NodWxkZW4gcHJvIEtvcGYgdW5kIGRhcyBCSVAgcHJvIEtvcGYgaGF0dGVuIHdpciBiZXJlaXRzIGluIGRlbSBlcnN0ZW4gVGVpbCBkZXIgQ2FzZS1TdHVkeSBiZXJlY2huZXQuIApEaWUgQXJiZWl0c2xvc2VucXVvdGUgd29sbGVuIHdpciBhbHMgJEFyYmVpdHNsb3NlbnF1b3RlID0gRXJ3ZXJic2xvc2UgLyAoRXJ3ZXJic3TDpHRpZ2UgKyBFcndlcmJzbG9zZSkkIGJlcmVjaG5lbi4gQmVpIGRlciBCZXJlY2hudW5nIGRlciBBcmJlaXRzbG9zZW5xdW90ZSBiZXppZWhlbiB3aXIgYWxzbyBkYXMga29tcGxldHRlIFBvdGVudGlhbCBhbiBlcndlcmJzZsOkaGlnZW4gUGVyc29uZW4gZWluLgoKSW4gZGVuIG7DpGNoc3RlbiBBYnNjaG5pdHRlbiB3b2xsZW4gd2lyIHVucyBkaWUgUGFyYW1ldGVyIGbDvHIgZGllIGVpbnplbG5lbiBWYXJpYWJsZW4gZGFubiBnZW5hdWVyIGFuc2NoYXVlbi4KCmBgYHtyfQojIFp1ZXJzdCB3b2xsZW4gd2lyIHVucyBub2NoIGRpZSBBcmJlaXRzbG9zZW5xdW90ZSBwcm8gTGFuZGtyZWlzIGJlcmVjaG5lbgpnZXNhbXRkYXRlbiA8LSBnZXNhbXRkYXRlbiAlPiUKICBtdXRhdGUoYWxvX3F1b3RlID0gKHRvdGFsX2FsbyAvIChlcncrdG90YWxfYWxvKSkqMTAwKQpgYGAKCiMjIyBBbnphaGwgYW4gQmVvYmFjaHR1bmdlbgoKV2lyIHdvbGxlbiB6dWVyc3QgZWluZW4gQmxpY2sgYXVmIGRpZSBBbnphaGwgYW4gRXJ3ZXJic3TDpHRpZ2VuIHVuZCBFaW53b2huZXJuIGluIERldXRzY2hsYW5kIHdlcmZlbi4gSGllciBoYWJlbiB3aXIgNDEgTWlvLiBFcndlcmJzdMOkdGlnZSB1bmQgNzYsNSBNaW8uIEVpbndvaG5lciBpbiBEZXV0c2NobGFuZC4gRGllcyBzb2xsdGUgc3RpbW1lbiwgZGEgd2lyIEhhbWJ1cmcgKDEuOCBNaW8uKSwgQmVybGluICgzLjc1IE1pby4pIHVuZCBCcmVtZW4gKDAuNyBNaW8uKSwgc293aWUgQnJlbWVyaGF2ZW4gKDAuMSBNaW8uKSBuaWNodCBpbiB1bnNlcmVtIERhdGVuc2F0eiBoYWJlbi4gRGllIERhdGVuIHdvbGxlbiB3aXIgdW5zIGFscyBlaW5mYWNoZW4gVGliYmxlIERhdGVuc2F0eiBhbnplaWdlbiBsYXNzZW46CgpgYGB7cn0KIyBXaWUgdmllbGUgRXJ3ZXJic3TDpHRpZ2UgdW5kIEVpbndvaG5lciAob2huZSBCZXJsaW4sIEhhbWJ1cmcsIEJyZW1lbiB1bmQgQnJlbWVyaGF2ZW4pIGhhdCBEZXV0c2NobGFuZD8KZ2VzYW10ZGF0ZW4gJT4lIAogIHN1bW1hcmlzZSh0b3RhbF9lcncgPSBzdW0oZXJ3LCBuYS5ybT1UUlVFKSwgdG90YWxfZWlud29obmVyID0gc3VtKEVpbndvaG5lciwgbmEucm09VFJVRSkpCmBgYAoKTnVuIHdvbGxlbiB3aXIgdW5zIGRpZSBWYXJpYWJsZW4gaW0gRGF0ZW5zYXR6IGdlbmF1ZXIgYW5zY2hhdWVuLiBFaW5lIFRhYmVsbGUgbnVyIGFscyBUaWJibGUgZGFyenVzdGVsbGVuIGlzdCBuaWNodCBiZXNvbmRlcnMgYW5zcHJlY2hlbmQuIFdpciBrw7ZubmVuIHVucyBmw7xyIGVpbmVuIGVyc3RlbiBrdXJ6ZW4gw5xiZXJibGljayBkZXMgYHNraW1yYC1QYWtldHMgYmVkaWVuZW46CgpgYGB7cn0KIyBBbnNjaGxpZcOfZW5kIHdvbGxlbiB3aXIgZWluZSBTdW1tYXJ5IFN0YXRpc3RpYyBmw7xyIGFsbGUgVmFyaWFibGVuIGF1c2dlYmVuIGxhc3NlbgojIEVudGZlcm5lbiBkZXIgSGlzdG9ncmFtbWUsIGRhbWl0IGFsbGVzIGF1Y2ggc2Now7ZuIGluIFBERiBnZWRydWNrdCB3ZXJkZW4ga2FubgpnZXNhbXRkYXRlbiAlPiUKICBzZWxlY3QoYWxvX3F1b3RlLCBTY2h1bGRlbl9wcm9fa29wZl9saywgYmlwX3Byb19rb3BmLCBsYW5ka3JlaXNfbmFtZSkgJT4lCiAgc2tpbSgpCmBgYAoKCldpciBoYWJlbiA0MDEgaW5kaXZpZHVlbGxlIEJlb2JhY2h0dW5nZW4gaW4gdW5zZXJlbSBEYXRlbnNhdHouIEhpZXJiZWkgaGFuZGVsdCBlcyBzaWNoIHVtIGFsbGUgTGFuZGtyZWlzZSB1bmQga3JlaXNmcmVpZW4gU3TDpGR0ZSBpbiBEZXV0c2NobGFuZC4gU3RpbW1lbiBkaWVzZSBBbmdhYmVuPwpGw7xyIGVpbmVuIGt1cnplbiBLb25zaXN0ZW56Y2hlY2sgd29sbGVuIHdpciB1bnMgV2lraXBlZGlhIGJlZGllbmVuLgoKSW4gRGV1dHNjaGxhbmQgZ2lidCBlcyAyOTQgTGFuZGtyZWlzZS4gRGllIEFuemFobCBkZXIgTGFuZGtyZWlzZSBwcm8gQnVuZGVzbGFuZCBmaW5kZW4gd2lyIFtoaWVyXShodHRwczovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0ZV9kZXJfTGFuZGtyZWlzZV9pbl9EZXV0c2NobGFuZCkuIFdlaXRlcmhpbiBnaWJ0IGVzIGluIERldXRzY2hsYW5kIDEwNyBrcmVpc2ZyZWllIFN0w6RkdGUsIGRpZSBnZW5hdWUgQXVmbGlzdHVuZyBmaW5kZW4gd2lyIFtoaWVyXShodHRwczovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0ZV9kZXJfa3JlaXNmcmVpZW5fU3QlQzMlQTRkdGVfaW5fRGV1dHNjaGxhbmQpLiBELmguIHVuc2VyZSA0MDEgTGFuZGtyZWlzZSB1bmQga3JlaXNmcmVpZW4gU3TDpGR0ZSBzb2xsdGVuIHN0aW1tZW4uCgpKZWRvY2ggZ2lidCBlcyBudXIgMzc5IHVudGVyc2NoaWVkbGljaGUgTGFuZGtyZWlzIE5hbWVuIGluIHVuc2VyZW0gRGF0ZW5zYXR6IG1pdCA0MDEgdW50ZXJzY2hpZWRsaWNoZW4gQmVvYmFjaHR1bmdlbiAoUmVnaW9uYWxzY2hsw7xzc2VsbikuIERpZXMga29tbXQgZGFoZXIsIGRhc3Mgei5CLiBkaWUgU3RhZHQgTcO8bmNoZW4gZWluZSBCZW9iYWNodHVuZyBpc3QgdW5kIGRlciBMYW5ka3JlaXMgTcO8bmNoZW4gZWluZSB3ZWl0ZXJlIEJlb2JhY2h0dW5nIG1pdCBhbmRlcmVtIFJlZ2lvbmFsc2NobMO8c3NlbC4gRC5oLiBkZXIgImxhbmRrcmVpc19uYW1lIiBpc3QgZGVyIEdsZWljaGUsIGplZG9jaCBpc3QgZGVyIFJlZ2lvbmFsc2NobMO8c3NlbCBlaW4gYW5kZXJlci4KCkbDvHIgZGllIFNjaHVsZGVuIHVuZCBkaWUgRWlud29obmVyemFobGVuIGZlaGxlbiB1bnMgbGVpZGVyIERhdGVuIGbDvHIgX3ZpZXJfIExhbmRrcmVpc2UsIGbDvHIgZGFzIEJJUCBmZWhsZW4gdW5zIERhdGVuIGbDvHIgX3p3ZWlfIExhbmRrcmVpc2U6CgpgYGB7cn0KZ2VzYW10ZGF0ZW4gJT4lCiAgZmlsdGVyKGlzLm5hKEVpbndvaG5lcikpICU+JQogIHNlbGVjdChsYW5ka3JlaXNfbmFtZSkKYGBgCgpMZWlkZXIgaGFiZW4gd2lyIGhpZXIgaW4gZGVuIE9yaWdpbmFsZGF0ZW4ga2VpbmUgSW5mb3JtYXRpb25lbiB6dSBTY2h1bGRlbiB1bmQgQklQIGbDvHIgZGllc2UgU3TDpGR0ZSwgZGFoZXIga8O2bm5lbiB3aXIgc2llIG5pY2h0IG1pdCBpbiB1bnNlcmUgQW5hbHlzZW4gZWluYmV6aWVoZW4uCgojIyMgQmVzY2hyZWlidW5nIGRlciBUYWJlbGxlCgoqKkFyYmVpdHNsb3NlbnF1b3RlKioKCkltIER1cmNoc2Nobml0dCBsaWVndCBkaWUgQXJiZWl0c2xvc2VucXVvdGUgaW4gMjAxNyBiZWkgNSwzNCBQcm96ZW50LiBEaWVzIG1hZyB1bnMgenVlcnN0IGV0d2FzIGhvY2ggZXJzY2hlaW5lbiwgamVkb2NoIHNvbGx0ZW4gd2lyIGJlZGVua2VuLCBkYXNzIHdpciAqKmFsbGUqKiBBcmJlaXRzbG9zZW4gbWl0IGluIHVuc2VyZSBBbmFseXNlIGVpbmJlem9nZW4gaGFiZW4sIGQuaC4gQmV6aWVoZXIgdm9uIFNHQiBJSSB1bmQgU0dCIElJSS4gRWluIGt1cnplciBLb25zaXN0ZW56Y2hlY2sgYXVmIFtTdGF0aXN0YV0oaHR0cHM6Ly9kZS5zdGF0aXN0YS5jb20vc3RhdGlzdGlrL2RhdGVuL3N0dWRpZS8xMjI0L3VtZnJhZ2UvYXJiZWl0c2xvc2VucXVvdGUtaW4tZGV1dHNjaGxhbmQtc2VpdC0xOTk1LykgemVpZ3QgdW5zIGRpZSBkb3J0IGdlbWVsZGV0ZSBBcmJlaXRzbG9zZW5xdW90ZSB2b24gNS43JSBmw7xyIDIwMTcuIFVuc2VyZSBuaWVkcmlnZXJlIFF1b3RlIGvDtm5udGUgaW5zYmVzb25kZXJlIGRhcmFuIGxpZWdlbiwgZGFzcyBkaWUgR3Jvw59zdMOkZHRlIEJlcmxpbiB1bmQgSGFtYnVyZyBuaWNodCBpbiB1bnNlcmVyIEFuYWx5c2UgZW50aGFsdGVuIHNpbmQuCkRpZSBTdGFuZGFyZGFid2VpY2h1bmcgYmV0csOkZ3QgMiwzOCB1bmQgemVpZ3QgZGFtaXQsIGRhc3MgZXMgaW4gRGV1dHNjaGxhbmQgZGV1dGxpY2hlIHJlZ2lvbmFsZSBVbnRlcnNjaGllZGUgYnpnbC4gZGVyIEFyYmVpdHNsb3NlbnF1b3RlIGdpYnQuIEVpbiBCbGljayBhdWYgZGllIFZlcnRlaWx1bmcgemVpZ3QsIGRhc3MgZGVyIExhbmRrcmVpcyBtaXQgZGVyIGdlcmluZ3N0ZW4gQXJiZWl0c2xvc2VucXVvdGUgbnVyIGVpbmUgQXJiZWl0c2xvc2VucXVvdGUgdm9uIDEsNjMlIChgcDBgIGluIGRlciBvYmlnZW4gVGFiZWxsZSkgYXVmd2Vpc3QgdW5kIGRlciBMYW5ka3JlaXMgbWl0IGRlciBow7ZjaHN0ZW4gQXJiZWl0c2xvc2VucXVvdGUgdm9uIDEzLDQ0JSAoYHAxMDBgIGluIGRlciBvYmlnZW4gVGFiZWxsZSkuIFp3YXIgc2luZCBkaWUgV2VydGUgbm9jaCBlaW4gZ2FuemVzIFN0w7xjayB2b24gZGVtIER1cmNoc2Nobml0dCBkZXIgQXJiZWl0c2xvc2VucXVvdGUgaW4gU3BhbmllbiBlbnRmZXJudCAoWzE3JSBpbSBKYWhyIDIwMTddKGh0dHBzOi8vZGUuc3RhdGlzdGEuY29tL3N0YXRpc3Rpay9kYXRlbi9zdHVkaWUvMTczMjcvdW1mcmFnZS9hcmJlaXRzbG9zZW5xdW90ZS1pbi1zcGFuaWVuLykpLCB6ZWlnZW4gamVkb2NoIHNjaG9uLCBkYXNzIGVzIGF1Y2ggaW4gRGV1dHNjaGxhbmQgZHVyY2hhdXMgUmVnaW9uZW4gbWl0IGVpbmVyIHNlaHIgaG9oZW4gQXJiZWl0c2xvc2VucXVvdGUgZ2lidC4KCioqVmVyc2NodWxkdW5nIHBybyBLb3BmKioKCkJlaSBkZXIgVmVyc2NodWxkdW5nIGRlciBMYW5ka3JlaXNlIGVyZ2lidCBzaWNoIGVpbiDDpGhubGljaGVzIEJpbGQuIER1cmNoc2Nobml0dGxpY2ggYmV0csOkZ3QgZGllIFZlcnNjaHVsZHVuZyBkZXIgTGFuZGtyZWlzZSAyNzQz4oKsLCBtaXQgZWluZXIgU3RhbmRhcmRhYndlaWNodW5nIHZvbiAyMTQ44oKsLiBELmguIGF1Y2ggaGllciBnaWJ0IGVzIGVpbmUgZ3Jvw59lIEJhbmRicmVpdGUgYnpnbC4gZGVyIFZlcnNjaHVsZHVuZyBlaW56ZWxuZXIgTGFuZGtyZWlzZS4KCioqQklQIHBybyBLb3BmKioKCldpZSBzY2hvbiBiZWkgZGVyIEFyYmVpdHNsb3NlbnF1b3RlIHVuZCBkZXIgVmVyc2NodWxkdW5nIHNlaGVuIHdpciBhdWNoIGJlaSBkZW0gQklQIHBybyBLb3BmIGRldXRsaWNoZSBVbnRlcnNjaGllZGUgendpc2NoZW4gZGVuIGVpbnplbG5lbiBMYW5ka3JlaXNlbiBpbiBEZXV0c2NobGFuZC4gSW0gRHVyY2hzY2huaXR0IGxpZWd0IGRhcyBCSVAgcHJvIEtvcGYgaW4gZGVuIExhbmRrcmVpc2VuIGJlaSAzNjgyN+KCrCwgamVkb2NoIGhhYmVuIHdpciBlaW5lIFN0YW5kYXJkYWJ3ZWljaHVuZyB2b24gMTYxOTbigqwsIHdhcyB6dWVyc3QgbmFjaCBzZWhyIHZpZWwgYXVzc2llaHQuIERpZXMga8O2bm50ZSBqZWRvY2ggYW4gZWluemVsbmVuIExhbmRrcmVpc2VuIGxpZWdlbiAoc28gaGF0IGVpbiBMYW5ka3JlaXMgYnNwdy4gZWluIEJJUCBwcm8gS29wZiB2b24gMTY1NTIw4oKsKS4gRGEgZGVyIE1lZGlhbiBkZXMgQklQIHBybyBLb3BmIGJlaSAzMjU5MuKCrCBsaWVndCBoYWJlbiB3aXIgaGllciBzY2hvbiBlaW5lbiBIaW53ZWlzLCBkYXNzIGRhcyBCSVAgcHJvIEtvcGYgdmVybXV0bGljaCBuaWNodCBub3JtYWx2ZXJ0ZWlsdCDDvGJlciBhbGxlIExhbmRrcmVpc2UgaXN0IHVuZCBlcyB3b2hsIGVpbnplbG5lIEF1c3JlacOfZXIgaW4gZGVuIERhdGVuIGdpYnQuCgojIyBTdW1tYXJ5IFN0YXRpc3RpY3MgYXVmIEJ1bmRlc2xhbmRlYmVuZSBmw7xyIGRpZSBBcmJlaXRzbG9zaWdrZWl0CgpOYWNoZGVtIHdpciBpbSB2b3JoZXJpZ2VuIEFic2Nobml0dCBiZXJlaXRzIGdlc2VoZW4gaGFiZW4sIGRhc3MgZXMgd29obCBkZXV0bGljaGUgcmVnaW9uYWxlIFVudGVyc2NoaWVkZSBiZWkgYWxsZW4gVmFyaWFibGVuIGdlYmVuIG11c3MsIHdvbGxlbiB3aXIgdW5zIG51biBub2NoIGRpZSBBcmJlaXRzbG9zZW5xdW90ZSBhdWYgQnVuZGVzbGFuZGViZW5lIGFuc2NoYXVlbi4gRXJpbm5lcm4gd2lyIHVucyBkYXJhbiBkYXMgd2lyIGhpZXIgUXVlcnNjaG5pdHRzZGF0ZW4gZsO8ciBkYXMgSmFociAyMDE3IGbDvHIgYWxsZSBkZXV0c2NoZW4gTGFuZGtyZWlzZSBiZXRyYWNodGVuLiBXZWl0ZXJoaW4gaGF0IHVucyBkaWUgdm9yaGVyaWdlIFRhYmVsbGUgYmVyZWl0cyBnZXplaWd0LCBkYXNzIHdpciBtaXQgIm1pc3NpbmcgVmFsdWVzIiByZWNobmVuIG3DvHNzZW4gKGBuX21pc3NpbmdgIGJlaSBkZXIgc2tpbXItVGFiZWxsZSkuIFVtIG51biBlaW5lbiBlcnN0ZW4gw5xiZXJibGljayDDvGJlciBkaWUgcmVnaW9uYWxlIFZlcnRlaWx1bmcgZGVyIEFyYmVpdHNlbnF1b3RlIGluIDIwMTcgenUgZ2V3aW5uZW4gc2NoYXVlbiB3aXIgdW5zIGRpZSBBcmJlaXRzbG9zZW5xdW90ZSBhdWYgQnVuZGVzbGFuZGViZW5lIGFuLCBhZ2dyZWdpZXJ0IMO8YmVyIGRpZSBMYW5ka3JlaXNlIGVpbmVzIEJ1bmRlc2xhbmRlcy4gSGllcnp1IHdvbGxlbiB3aXIgdW5zIGRlcyBQYWtldHMgYGthYmxlRXh0cmFgIGJlZGllbmVuIHVtIHNjaMO2bmVyZSBUYWJlbGxlbiB6dSBlcnN0ZWxsZW46CgpgYGB7cn0KYnVsYV9kYXRhIDwtIGdlc2FtdGRhdGVuICU+JSAKICBncm91cF9ieSggYnVuZGVzbGFuZF9uYW1lICkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYWxvID0gbWVhbihhbG9fcXVvdGUpLCBzZF9hbG8gPSBzZChhbG9fcXVvdGUpLCBtZWRpYW5fYWxvID0gbWVkaWFuKGFsb19xdW90ZSkpICU+JQogIHVuZ3JvdXAoKQoKYnVsYV9kYXRhICU+JQogIGFycmFuZ2UoIG1lYW5fYWxvICkgJT4lCiAgZmlsdGVyKCAhaXMubmEobWVhbl9hbG8pICkgJT4lCiAga2JsKGNvbC5uYW1lcyA9IGMoIkJ1bmRlc2xhbmQiLAogICAgICAgICAgICAgICAgICAgICJNaXR0ZWx3ZXJ0IiwKICAgICAgICAgICAgICAgICAgICAiU3RkLiIsCiAgICAgICAgICAgICAgICAgICAgIk1lZGlhbiIpLCBkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUKICBrYWJsZV9wYXBlcihmdWxsX3dpZHRoID0gRikgJT4lCiAgcm93X3NwZWMoYyg3LDksIDExLDEyLDE0KSwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjQkJCQkJCIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJBcmJlaXRzbG9zZW5xdW90ZSIgPSAzKSwgYWxpZ24gPSAiYyIpICU+JQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiV2lyIGhhYmVuIGtlaW5lIEluZm9ybWF0aW9uZW4genUgQmVybGluIHVuZCBIYW1idXJnLCB3ZXNoYWxiIHNpZSBuaWNodCBpbiBkZXIgVGFiZWxsZSBhdWZnZWbDvGhydCB3dXJkZW4uIiwgCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICJCaXR0ZSBiZWFjaHRlbjogIiwKICAgICAgICAgICBudW1iZXIgPSAiRGllIG9zdGRldXRzY2hlbiBCdW5kZXNsw6RuZGVyIHNpbmQgZ3JhdSBoaW50ZXJsZWd0LiIpCmBgYAoKSGllciBzZWhlbiB3aXIgaW5zYmVzb25kZXJlIGbDvHIgTGFuZGtyZWlzZSBpbiBCYXllcm4gdW5kIEJhZGVuLVfDvHJ0dGVtYmVyZyBBcmJlaXRzbG9zZW5xdW90ZW4gdm9uIGR1cmNoc2Nobml0dGxpY2ggdW50ZXIgNCUgdW5kIGbDvHIgTGFuZGtyZWlzZSBpbiBTYWNoc2VuLUFuaGFsdCwgQnJlbWVuIHVuZCBNZWNrbGVuYnVyZy1Wb3Jwb21tZXJuIEFyYmVpdHNsb3NlbnF1b3RlbiB2b24gZHVyY2hzY2huaXR0bGljaCDDvGJlciA4JS4gRXMgZsOkbGx0IHdlaXRlcmhpbiBhdWYsIGRhc3MgZGllIExhbmRrcmVpc2UgaW4gZWhlbWFsaWdlbiBvc3RkZXV0c2NoZW4gQnVuZGVzbMOkbmRlcm4gYWxsZSBzZWhyIGhvaGUgQXJiZWl0c2xvc2VucXVvdGVuIGF1ZndlaXNlbi4gV2VpdGVyaGluIGlzdCBkaWUgU3RhbmRhcmRhYndlaWNodW5nLCBkLmguIGRpZSBTdHJldXVuZyB1bSBkZW4gTWl0dGVsd2VydCwgaW5zZ2VzYW10IGbDvHIgZGllIExhbmRrcmVpc2UgZGVyIGVpbnplbG5lbiBCdW5kZXNsw6RuZGVyIHZlcmdsZWljaGJhci4gTWl0IHJ1bmQgMS0yIFByb3plbnRwdW5rdGVuIGlzdCBkaWUgU3RhbmRhcmRhYndlaWNodW5nIGF1Y2ggcmVjaHQgaG9jaCB1bmQgZGV1dGV0IGF1ZiBlaW5lIG5pY2h0IHVuZXJoZWJsaWNoZSBTdHJldXVuZyB1bnRlciBkZW4gdmVyc2NoaWVkZW5lbiBMYW5ka3JlaXNlbiBoaW4uIERlciBNZWRpYW4gZsO8ciBkaWUgQXJiZWl0c2xvc2VucXVvdGUgZGVyIExhbmRrcmVpc2UgbGllZ3QgcmVjaHQgbmFoZSBhbSBNaXR0ZWx3ZXJ0LCB3YXMgZGFyYXVmIGhpbmRldXRldCBkYXMgZGllIExhbmRrcmVpc2UgaW4gZGVuIGVpbnplbG5lbiBCdW5kZXNsw6RuZGVybiBzaWNoIG5pY2h0IHN0YXJrIHZvbmVpbmFuZGVyIHVudGVyc2NoZWlkZW4gKGRpZSBTdGFuZGFyZGFid2VpY2h1bmdlbiBzaW5kIGF1Y2ggcmVjaHQga2xlaW4pLiAKRGEgd2lyIGhpZXIgc2VociBncm/Dn2UgVW50ZXJzY2hpZWRlIHp3aXNjaGVuIE9zdC0gdW5kIFdlc3RkZXV0c2NobGFuZCBmZXN0Z2VzdGVsbHQgaGFiZW4gd29sbGVuIHdpciB1bnMgZWluZSBEdW1teXZhcmlhYmxlICJvc3QiIGdlbmVyaWVyZW4sIHdlbGNoZSAwIGbDvHIgYWxsZSBlaGVtYWxpZ2VuIHdlc3RkZXV0c2NoZW4gdW5kIDEgZsO8ciBhbGxlIGVoZW1hbGlnZW4gb3N0ZGV1dHNjaGVuIEJ1bmRlc2zDpG5kZXIgaXN0OgoKYGBge3J9Cmdlc2FtdGRhdGVuIDwtIGdlc2FtdGRhdGVuICU+JQogIG11dGF0ZSggb3N0ID0gYXMuZmFjdG9yKGlmZWxzZShidW5kZXNsYW5kX25hbWUgJWluJSBjKCJCcmFuZGVuYnVyZyIsICJNZWNrbGVuYnVyZy1Wb3Jwb21tZXJuIiwgIlNhY2hzZW4iLCAiU2FjaHNlbi1BbmhhbHQiLCAiVGjDvHJpbmdlbiIpLCAxLCAwKSksCiAgICAgICAgICBvc3RfbmFtZSA9IGlmZWxzZShvc3QgPT0gMSwgIk9zdGRldXRzY2hsYW5kIiwgIldlc3RkZXV0c2NobGFuZCIpKQpgYGAKCkR1cmNoIGRpZXNlIEF1ZnRlaWx1bmcgdHJldGVuIGRpZSBVbnRlcnNjaGllZGUgaW4gZGVyIEFyYmVpdHNsb3NlbnF1b3RlIHp3aXNjaGVuIGRlbiBlaGVtYWxpZ2VuIG9zdC0gdW5kIHdlc3RkZXV0c2NoZW4gTGFuZGtyZWlzZW4gYmVzb25kZXJzIHN0YXJrIHp1dGFnZS4gSW5zYmVzb25kZXJlIHdlbm4gd2lyIHVucyBkaWUgUXVhbnRpbGUgYW5zY2hhdWVuOiBJbSAqKjI1JSBRdWFudGlsKiogaW4gKipPc3RkZXV0c2NobGFuZCoqIGlzdCBkaWUgQXJiZWl0c2xvc2VucXVvdGUgYmVpICoqNiwwNCUqKiwgaW4gKipXZXN0ZGV1dHNjaGxhbmQqKiBpc3QgZGFzICoqNzUlIFF1YW50aWwqKiBiZWkgZWluZXIgQXJiZWl0c2xvc2VucXVvdGUgdm9uICoqNiwyMiUqKiEKCmBgYHtyfQpnZXNhbXRkYXRlbiAlPiUKICBncm91cF9ieShvc3RfbmFtZSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYWxvID0gbWVhbihhbG9fcXVvdGUsIG5hLnJtID0gVCksIHNkX2FsbyA9IHNkKGFsb19xdW90ZSwgbmEucm0gPSBUKSwgbWluX2FsbyA9IG1pbihhbG9fcXVvdGUsIG5hLnJtID0gVCksIHEyNSA9IHF1YW50aWxlKGFsb19xdW90ZSwgYygwLjI1KSwgbmEucm0gPSBUKSwgbWVkaWFuX2FsbyA9IG1lZGlhbihhbG9fcXVvdGUsIG5hLnJtID0gVCksIHE3NSA9IHF1YW50aWxlKGFsb19xdW90ZSwgMC43NSwgbmEucm0gPSBUKSwgbWF4X2FsbyA9IG1heChhbG9fcXVvdGUsIG5hLnJtID0gVCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBrYmwoY29sLm5hbWVzID0gYygiQnVuZGVzbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgIk1pdHRlbHdlcnQiLAogICAgICAgICAgICAgICAgICAgICJTdGQuIiwKICAgICAgICAgICAgICAgICAgICAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgIlAyNSIsCiAgICAgICAgICAgICAgICAgICAgIk1lZGlhbiIsCiAgICAgICAgICAgICAgICAgICAgIlA3NSIsCiAgICAgICAgICAgICAgICAgICAgIk1heGltdW0iKSwgZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lCiAga2FibGVfcGFwZXIoZnVsbF93aWR0aCA9IEYpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiQXJiZWl0c2xvc2VucXVvdGUiID0gNyksIGFsaWduID0gImMiKSAlPiUKICBmb290bm90ZShnZW5lcmFsID0gIldpciBoYWJlbiBrZWluZSBJbmZvcm1hdGlvbmVuIHp1IEJlcmxpbiB1bmQgSGFtYnVyZywgd2VzaGFsYiBzaWUgbmljaHQgaW4gZGVyIEJlcmVjaG51bmcgZW50aGFsdGVuIHNpbmQuIiwKICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIkJpdHRlIGJlYWNodGVuOiAiKQpgYGAKCk51biBoYWJlbiB3aXIgdW5zIGVpbiBlcnN0ZXMgQmlsZCDDvGJlciBkaWUgRGF0ZW4sIGluc2Jlc29uZGVyZSBkaWUgQXJiZWl0c2xvc2lna2VpdCBpbiAyMDE3IG1hY2hlbiBrw7ZubmVuLgpOYXTDvHJsaWNoIHNvbGx0ZW4gZGllIHZvbiB1bnMgaGVydW50ZXJnZWxhZGVuZW4gSW5mb3JtYXRpb25lbiB6dW0gQklQIHVuZCBkZW4gU2NodWxkZW4gZGVyIGVpbnplbG5lbiBMYW5ka3JlaXNlIGF1Y2ggYmVyw7xja3NpY2h0aWd0IHdlcmRlbiB1bmQgd2lyIGvDtm5uZW4gZGllc2UgdW5zZXJlbiBUYWJlbGxlbiBoaW56dWbDvGdlbjoKCmBgYHtyfQpidWxhX2RhdGFfYWxsIDwtIGdlc2FtdGRhdGVuICU+JSAKICBncm91cF9ieSggYnVuZGVzbGFuZF9uYW1lICkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYWxvID0gbWVhbihhbG9fcXVvdGUpLCBzZF9hbG8gPSBzZChhbG9fcXVvdGUpLCBtZWFuX2JpcF9rb3BmID0gbWVhbihiaXBfcHJvX2tvcGYpLCBzZF9iaXBfa29wZiA9IHNkKGJpcF9wcm9fa29wZiksIG1lYW5fc2NodWxkZW5fa29wZiA9IG1lYW4oU2NodWxkZW5fZ2VzYW10L0VpbndvaG5lciksIHNkX3NjaHVsZGVuID0gc2QoU2NodWxkZW5fZ2VzYW10L0VpbndvaG5lcikpICU+JQogIHVuZ3JvdXAoKQoKYnVsYV9kYXRhX2FsbCAlPiUKICBhcnJhbmdlKCBtZWFuX2FsbyApICU+JQogIGZpbHRlciggIWlzLm5hKG1lYW5fc2NodWxkZW5fa29wZikgKSAlPiUKICBrYmwoY29sLm5hbWVzID0gYygiQnVuZGVzbGFuZCIsICJNaXR0ZWx3ZXJ0IiwiU3RkLiIsIk1pdHRlbHdlcnQiLCJTdGQuIiwgIk1pdHRlbHdlcnQiLCJTdGQuIiksIGRpZ2l0cyA9IDIsIGZvcm1hdCA9ICJodG1sIiwgCiAgICAgIGNhcHRpb24gPSAiRGVza3JpcHRpdmUgVGFiZWxsZSBrb21wbGV0dCIpICU+JQogICNrYmwoY29sLm5hbWVzID0gYygiTWl0dGVsd2VydCIsIlN0ZC4iLCAiTWl0dGVsd2VydCIsIlN0ZC4iKSwgZGlnaXRzID0gMCkgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lCiAga2FibGVfcGFwZXIoZnVsbF93aWR0aCA9IEYpICU+JQogIHJvd19zcGVjKGMoNyw5LCAxMSwxMiwxMyksIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI0JCQkJCQiIpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiQXJiZWl0c2xvc2VucXVvdGUiID0gMiwgIkJJUCBwcm8gS29wZiIgPSAyLCAiU2NodWxkZW4gcHJvIEtvcGYiID0gMiksIGFsaWduID0gImMiKSAlPiUKICBmb290bm90ZShnZW5lcmFsID0gIldpciBoYWJlbiBrZWluZSBJbmZvcm1hdGlvbmVuIHp1IEJlcmxpbiwgSGFtYnVyZyB1bmQgQnJlbWVuIGJ6Z2wuIGlocmVyIFNjaHVsZGVuIHBybyBLb3BmLCB3ZXNoYWxiIHNpZSBuaWNodCBpbiBkZXIgVGFiZWxsZSBhdWZnZWbDvGhydCB3dXJkZW4uIiwgCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICJCaXR0ZSBiZWFjaHRlbjogIiwKICAgICAgICAgICBudW1iZXIgPSAiRGllIG9zdGRldXRzY2hlbiBCdW5kZXNsw6RuZGVyIHNpbmQgZ3JhdSBoaW50ZXJsZWd0LiIpIApgYGAKCldhcyB3aXIgaGllciBndXQgc2VoZW4ga8O2bm5lbiBpc3QgZm9sZ2VuZGVzOgpGw7xyIGFsbGUgQnVuZGVzbMOkbmRlciBpbiBkZW5lbiB3aXIgbmllZHJpZ2UgQXJiZWl0c2xvc2VucXVvdGVuIHBybyBMYW5ka3JlaXMgaGFiZW4gZ2lidCBlcyBhdWNoIGR1cmNoc2Nobml0dGxpY2ggZWluIGhvaGVzIEJJUCBwcm8gS29wZiDDvGJlciBkaWUgTGFuZGtyZWlzZSBkZXMgQnVuZGVzbGFuZGVzIGhpbndlZy4gRC5oLiBzcGV6aWVsbCBpbiB1bnNlcmVtIERhdGVuc2F0eiB2b24gMjAxNyBpc3QgaW4gZGVuIEJ1bmRlc2zDpG5kZXJuIG1pdCBlaW5lciBkdXJjaHNjaG5pdHRsaWNoIGhvaGVuIFdpcnRzY2hhZnRzbGVpc3R1bmcgaW4gZGVuIExhbmRrcmVpc2VuIGRpZSBBcmJlaXRzbG9zZW5xdW90ZSBnZXJpbmcuIEluc2Jlc29uZGVyZSBmw7xyIG9zdGRldXRzY2hlIExhbmRrcmVpc2UgaXN0IGRhcyBCSVAgcHJvIEtvcGYgZHVyY2hzY2huaXR0bGljaGUgX25pY2h0XyDDvGJlciAzMCAwMDDigqwsIGJlaSBkZW4gd2VzdGRldXRzY2hlbiBMYW5ka3JlaXNlbiBsaWVndCBkYXMgQklQIHBybyBLb3BmIGhpbmdlZ2VuIGR1cmNoc2Nobml0dGxpY2hlIMO8YmVyIDMwIDAwMOKCrC4gQmVpIGRlbiBTY2h1bGRlbiBpc3QgZGllc2VyIFNhY2h2ZXJoYWx0IHdlbmlnZXIgZGV1dGxpY2ggYXVzZ2VwcsOkZ3QuIEVzIGdpYnQgd2VzdGRldXRzY2hlIExhbmRrcmVpc2UsIHdpZSB6LkIuIGluIGRlbiBCdW5kZXNsw6RuZGVybiBCYXllcm4gdW5kIEJhZGVuLVfDvHJ0dGVtYmVyZywgbWl0IHNlaHIgZ2VyaW5nZW4gU2NodWxkZW4gcHJvIEtvcGYsIGRvY2ggZGllcyB0cmlmZnQgYXVjaCBmw7xyIExhbmRrcmVpc2UgaW4gU2FjaHNlbiBvZGVyIFRow7xyaW5nZW4genUuIEluc2Jlc29uZGVyZSBMYW5ka3JlaXNlIGltIFNhYXJsYW5kIGhhYmVuIGR1cmNoc2Nobml0dGxpY2ggZWluZSBzZWhyIGhvaGUgVmVyc2NodWxkdW5nIHBybyBLb3BmIHZvbiDDvGJlciA1OTAw4oKsLgoKQWxsZWluIGR1cmNoIGRlbiBNaXR0ZWx3ZXJ0IHVuZCBkaWUgU3RhbmRhcmRhYndlaWNodW5nIGtvbm50ZW4gd2lyIGJlcmVpdHMgc2VociB2aWVsIMO8YmVyIHVuc2VyZSBEYXRlbiBsZXJuZW4gdW5kIGhhYmVuIGhpZXIgc2Nob24gZWluaWdlIGRldXRsaWNoZSBVbnRlcnNjaGllZGUgendpc2NoZW4gb3N0ZGV1dHNjaGVuIHVuZCB3ZXN0ZGV1dHNjaGVuIExhbmRrcmVpc2VuIGZlc3RzdGVsbGVuIGvDtm5uZW4uCgpXaXIga8O2bm5lbiBpbiBkZXNrcmlwdGl2ZW4gU3RhdGlzdGlrZW4gbnVuIG5pY2h0IG51ciBPdWVyc2Nobml0dHNkYXRlbiBmw7xyIGVpbiBiZXN0aW1tdGVzIEphaHIgYmV0cmFjaHRlbiwgc29uZGVybiBhdWNoIFBhbmVsZGF0ZW4gYW5hbHlzaWVyZW4uCkhpZXJiZWkga8O2bm5lbiB3aXIgZGVuIE1pdHRlbHdlcnQgdW5kIGRpZSBTdGFuZGFyZGFid2VpY2h1bmcgw7xiZXIgZGVuIGtvbXBsZXR0ZW4gRGF0ZW5zYXR6IGJpbGRlbiwgd2llIGluIGRlbiBRdWVyc2Nobml0dHNkYXRlbiwgb2RlciB3aXIga8O2bm5lbiBUcmVuZHMgaW4gZGVuIERhdGVuIGJlc2NocmVpYmVuLiBFaW5lIHNvbGNoZSBUcmVuZGFuYWx5c2Ugd29sbGVuIHdpciBtaXQgZGVyIGZvbGdlbmRlbiBUYWJlbGxlIHVudGVybmVobWVuLiBEaWVzZXMgbWFsIG5laG1lbiB3aXIgZsO8ciB1bnNlcmUgQW5hbHlzZSBkYXMgUGFrZXQgYGd0YC4KCmBgYHtyfQoKYnVuZGVzbGFuZF9uYW1lIDwtIGdlc2FtdGRhdGVuICU+JQogIHNlbGVjdChidW5kZXNsYW5kX25hbWUsIGJ1bmRlc2xhbmQsIG9zdF9uYW1lKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIHJlbmFtZShSZWdpb25hbHNjaGx1ZXNzZWwgPSBidW5kZXNsYW5kKQoKYmlwX2RhdGVuIDwtIGJpcF96ZWl0cmVpaGUgJT4lCiAgbGVmdF9qb2luKC4sIGJ1bmRlc2xhbmRfbmFtZSwgYnk9IlJlZ2lvbmFsc2NobHVlc3NlbCIpICU+JQogIGZpbHRlciggbmNoYXIoUmVnaW9uYWxzY2hsdWVzc2VsKSA9PSAyICkgJT4lCiAgZmlsdGVyKCBSZWdpb25hbHNjaGx1ZXNzZWwgIT0gMTcpICU+JSAjMTcgPSBEZXV0c2NobGFuZAogIGZpbHRlciggSmFociA9PSAxOTkyIHwgSmFociA9PSAyMDA1IHwgSmFociA9PSAyMDE3KSAlPiUKICBncm91cF9ieShvc3RfbmFtZSwgYnVuZGVzbGFuZF9uYW1lLCBKYWhyKSAlPiUKICBzdW1tYXJpc2UoIG1lYW5fYmlwID0gbWVhbihiaXBfcHJvX2tvcGYpKSAlPiUKICB1bmdyb3VwKCkKCgpiaXBfZGF0ZW4gJT4lIAogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAiSmFociIsIHZhbHVlc19mcm9tID0gIm1lYW5fYmlwIikgJT4lCiAgZ3QoZ3JvdXBuYW1lX2NvbCA9ICJvc3RfbmFtZSIpICU+JSAKICBmbXRfbnVtYmVyKGNvbHVtbnMgPSB2YXJzKGAxOTkyYCwgYDIwMDVgLCBgMjAxN2ApLCBkZWNpbWFscyA9IDApICU+JQogIGZtdF9jdXJyZW5jeShjb2x1bW5zID0gdmFycyhgMTk5MmAsIGAyMDA1YCwgYDIwMTdgKSwgcm93cyA9IDEsIGN1cnJlbmN5ID0gIkVVUiIsIGRlY2ltYWxzID0gMCkgJT4lCiAgY29sc19hbGlnbihhbGlnbiA9ICJsZWZ0IiwKICAgICAgICAgICAgIGNvbHVtbnMgPSB2YXJzKGBidW5kZXNsYW5kX25hbWVgKSkgJT4lIAogIGNvbHNfbGFiZWwoYnVuZGVzbGFuZF9uYW1lID0gbWQoIiIpKSAlPiUKICB0YWJfc3Bhbm5lcihsYWJlbCA9ICJCSVAgcHJvIEtvcGYgaW4gZGVuIGVpbnplbG5lbiBCdW5kZXNsw6RuZGVybiIsIGNvbHVtbnMgPSB2YXJzKGAxOTkyYCwgYDIwMDVgLCBgMjAxN2ApKSAlPiUgCiAgdGFiX3N0eWxlKAogICAgc3R5bGUgPSBjZWxsX3RleHQoY29sb3IgPSAiYmxhY2siLCB3ZWlnaHQgPSAiYm9sZCIpLAogICAgbG9jYXRpb25zID0gbGlzdCgKICAgICAgY2VsbHNfY29sdW1uX3NwYW5uZXJzKGV2ZXJ5dGhpbmcoKSksCiAgICAgIGNlbGxzX2NvbHVtbl9sYWJlbHMoZXZlcnl0aGluZygpKQogICAgKQogICkgJT4lICAKICB0YWJfb3B0aW9ucygKICAgIHJvd19ncm91cC5ib3JkZXIudG9wLndpZHRoID0gcHgoMyksCiAgICByb3dfZ3JvdXAuYm9yZGVyLnRvcC5jb2xvciA9ICJibGFjayIsCiAgICByb3dfZ3JvdXAuYm9yZGVyLmJvdHRvbS5jb2xvciA9ICJibGFjayIsCiAgICB0YWJsZV9ib2R5LmhsaW5lcy5jb2xvciA9ICJ3aGl0ZSIsCiAgICB0YWJsZS5ib3JkZXIudG9wLmNvbG9yID0gIndoaXRlIiwKICAgIHRhYmxlLmJvcmRlci50b3Aud2lkdGggPSBweCgzKSwKICAgIHRhYmxlLmJvcmRlci5ib3R0b20uY29sb3IgPSAid2hpdGUiLAogICAgdGFibGUuYm9yZGVyLmJvdHRvbS53aWR0aCA9IHB4KDMpLAogICAgY29sdW1uX2xhYmVscy5ib3JkZXIuYm90dG9tLmNvbG9yID0gImJsYWNrIiwKICAgIGNvbHVtbl9sYWJlbHMuYm9yZGVyLmJvdHRvbS53aWR0aCA9IHB4KDIpLAogICkgJT4lIAogIHRhYl9zb3VyY2Vfbm90ZShtZCgiKipEYXRlbioqOiBTdGF0aXN0aXNjaGUgw4RtdGVyIERldXRzY2hsYW5kczxicj4qKkluc3BpcmF0aW9uKio6IEB0aG9tYXNfbW9jayIpKQpgYGAKCgpBdWNoIGluIGRpZXNlciBUYWJlbGxlIHRyZXRlbiBkaWUgVW50ZXJzY2hpZWRlIHp3aXNjaGVuIHdlc3RkZXV0c2NoZW4gdW5kIG9zdGRldXRzY2hlbiBMYW5ka3JlaXNlbiB6dXRhZ2UuIFfDpGhyZW5kIGRpZSB3ZXN0ZGV1dHNjaGVuIExhbmRrcmVpc2UgYmVyZWl0cyBpbSBKYWhyIDE5OTIgZWluIEJJUCBwcm8gS29wZiB2b24gZHVyY2hzY2huaXR0bGljaCDDvGJlciAyMCAwMDDigqwgYXVmd2Vpc2VuIGtvbm50ZW4sIGhhdHRlbiB2aWVsZSBvc3RkZXV0c2NoZSBMYW5ka3JlaXNlIGRpZXNlIFNjaHdlbGxlIG5vY2ggbmljaHQgZWlubWFsIGltIEphaHIgMjAwNSBlcnJlaWNodC4gCkplZG9jaCBnaWJ0IGVzIHNlaXQgZGVtIEphaHIgMTk5MiBlaW5lbiBBdWZob2xwcm96ZXNzIGRlciBvc3RkZXV0c2NoZW4gTGFuZGtyZWlzZSBhbiBkaWUgd2VzdGRldXRzY2hlbiBMYW5ka3JlaXNlLiBEaWVzZXIgUHJvemVzcyBmYW5kIGplZG9jaCBoYXVwdHPDpGNobGljaCBpbiBkZW4gSmFocmVuIGRpcmVrdCBuYWNoIGRlciBXZW5kZSBzdGF0dC4gWi5CLiB3YXIgZGFzIGR1cmNoc2Nobml0dGxpY2hlIEJJUCBwcm8gS29wZiBpbiBkZW4gTGFuZGtyZWlzZW4gaW4gVGjDvHJpbmdlbiBpbSBKYWhyIDE5OTIgbnVyIDM0LDklIGRlcyBkdXJjaHNjaG5pdHRsaWNoZW4gQklQIHBybyBLb3BmIGRlciBMYW5ka3JlaXNlIGluIEJhZGVuLVfDvHJ0dGVtYmVyZy4gSW4gMjAwNSBrbGV0dGVydGUgZGVyIEFudGVpbCBiZXJlaXRzIGF1ZiA1Nyw5JSB1bmQgaW4gMjAxNyBsaWVndCBlciBiZWkgNjIsNyUuIER1cmNoIGRpZSBFcmdlYm5pc3NlIHVuc2VyZXIgVGFiZWxsZSBiZXN0w6Rya3QsIGvDtm5udGVuIHdpciB2ZXJtdXRlbiBkYXMgZGllIEVybmV1ZXJ1bmcgZGVyIEluZnJhc3RydWt0dXIgdW5kIGRlciBBbnNpZWRsdW5nIG5ldWVyIEluZHVzdHJpZXp3ZWlnZSBpbiBkZW4gb3N0ZGV1dHNjaGVuIExhbmRrcmVpc2VuIHp1IGVpbmVtIHNjaG5lbGxlcmVuIFdhY2hzdHVtIGRpZXNlciBMYW5ka3JlaXNlIGRpcmVrdCBuYWNoIGRlciBXZW5kZSB1bmQgaW4gZGVuIDE5OTBlciBKYWhyZW4gZ2Vmw7xocnQgaGF0LiBEaWVzZXMgV2FjaHN0dW0gaGF0IHNpY2ggamVkb2NoIGluIGRlbiBsZXR6dGVuIEphaHJlbiBkZXV0bGljaCB2ZXJsYW5nc2FtdCB1bmQgZXMga29tbXQgbnVyIG5vY2ggenUgZWluZXIgc2VociBtb2RlcmF0ZW4gQW5wYXNzdW5nIGRlcyBCSVAgcHJvIEtvcGYuCgojIyBWaXN1YWxpc2llcnVuZyBkZXIgVW50ZXJzY2hpZWRlCgpUYWJlbGxlbiBzaW5kIGhpbGZyZWljaCB1bSBJbmZvcm1hdGlvbmVuIGtvbXBha3QgenUgcHLDpHNlbnRpZXJlbi4gSmVkb2NoIGlzdCBlcyBvZnQgZWJlbnNvIHdpY2h0aWcgKHVuZCBtYW5jaG1hbCBmw7xyIGlocmUgQXJndW1lbnRhdGlvbiB1bXNvIHdpY2h0aWdlcikgRXJrZW5udG5pc3NlIHZpc3VlbGwgenUgdmVyYW5zY2hhdWxpY2hlbi4gSW4gZGllc2VtIEFic2Nobml0dCB3b2xsZW4gd2lyIG1laHIgw7xiZXIgZGllIFp1c2FtbWVuc2V0enVuZyBqZWRlciBWYXJpYWJsZW4gZXJmYWhyZW4gdW5kIGRhZsO8ciBHcmFmaWtlbiB2ZXJ3ZW5kZW4uCgojIyMgQXJiZWl0c2xvc2VucXVvdGUKCkRpZSBWYXJpYWJsZSwgd2VsY2hlIHVucyBiZXNvbmRlcnMgaW50ZXJlc3NpZXJ0IGlzdCBkaWUgQXJiZWl0c2xvc2VucXVvdGUsIGluc2Jlc29uZGVyZSBkYSBpaHIgQ291c2luIGdlbWVpbnQgaGF0LCBkYXNzIERldXRzY2hsYW5kIGtlaW4gUHJvYmxlbSBtaXQgZGVyIEFyYmVpdHNsb3NpZ2tlaXQgaGF0LiBXaXIgd29sbGVuIGhpZXIgYWxsZSBEYXRlbnB1bmt0ZSB6ZWlnZW4sIGQuaC4gZGllIEFyYmVpdHNsb3NlbnF1b3RlIGVpbmVzIGplZGVuIExhbmRrcmVpc2VzIGbDvHIgZGFzIEphaHIgMjAxNywgZ2V0cmVubnQgbmFjaCBPc3QtIHVuZCBXZXN0ZGV1dHNjaGxhbmQuIFdlaXRlcmhpbiB3b2xsZW4gd2lyIHVuc2VyZSBHcmFmaWsgdW0gZWluZW4gQm94cGxvdCBlcndlaXRlcm4gdW0gZWluZW4gVmVyZ2xlaWNoIGRlcyBNZWRpYW5zIGRlciBBcmJlaXRzbG9zZW5xdW90ZSBpbiBPc3QtIHVuZCBXZXN0ZGV1dHNjaGxhbmQgenUgZXJtw7ZnbGljaGVuLgoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CmFsb19xdW90ZV9qaXR0ZXIgPC0gZ2VzYW10ZGF0ZW4gJT4lCiAgc2VsZWN0KGFsb19xdW90ZSwgbGFuZGtyZWlzX25hbWUsIGJ1bmRlc2xhbmRfbmFtZSwgb3N0X25hbWUpICU+JQogIGdncGxvdChhZXMoeCA9IG9zdF9uYW1lLCB5PWFsb19xdW90ZSkpICsKICBnZW9tX2ppdHRlcihhbHBoYT0wLjUpICsKICBnZW9tX2JveHBsb3QoYWxwaGEgPSAwLjEpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiQXJiZWl0c2xvc2VucXVvdGUgaW4gRGV1dHNjaGxhbmQiLAogICAgICAgc3VidGl0bGUgPSAiRWluZSBCZW9iYWNodHVuZyByZXByw6RzZW50aWVydCBlaW5lbiBMYW5ka3JlaXMiLAogICAgICAgeCA9ICIiLAogICAgICAgeSA9ICJBcmJlaXRzbG9zZW5xdW90ZSIsCiAgICAgICBjYXB0aW9uID0gIlF1ZWxsZTogRGF0ZW4gZGVyIEFnZW50dXIgZsO8ciBBcmJlaXQgYXVzIGRlbSBKYWhyIDIwMTciKQogIAphbG9fcXVvdGVfaml0dGVyCmBgYAoKRGFzIFNjaGF1YmlsZCB6ZWlndCB1bnMgenVtIEVpbmVuLCBkYXNzIGVzIGRldXRsaWNoIG1laHIgd2VzdGRldXRzY2hlLCB3aWUgb3N0ZGV1dHNjaGUgTGFuZGtyZWlzZSBnaWJ0IChuaWNodCB2ZXJ3dW5kZXJsaWNoKSwgYWJlciBhdWNoLCBkYXNzIGRpZXNlIHdlc3RkZXV0c2NoZW4gTGFuZGtyZWlzZSB6dSBlaW5lbSBzZWhyIGdyb8OfZW4gVGVpbCB3ZW5pZ2VyIGFscyA1JSBBcmJlaXRzbG9zaWdrZWl0IGF1ZndlaXNlbiwgd29oaW5nZWdlbiBkZXIgZ3LDtsOfdGUgVGVpbCBhbGxlciBvc3RkZXV0c2NoZW4gTGFuZGtyZWlzZSBtZWhyIGFscyA1JSBBcmJlaXRzbG9zaWdrZWl0IGF1ZndlaXN0LiBTZWxic3QgZGVyIG9zdGRldXRzY2hlIExhbmRrcmVpcyBtaXQgZGVyIG5pZWRyaWdzdGVuIEFyYmVpdHNsb3NlbnF1b3RlIGlzdCBudXIgbGVpY2h0IHVudGVyIGRlbSBNZWRpYW4gaW4gV2VzdGRldXRzY2hsYW5kLiBKZWRvY2gga8O2bm5lbiB3aXIga29uc3RhdGllcmVuLCBkYXNzIGlociBDb3VzaW4gcmVjaHQgaGF0dGUgbWl0IHNlaW5lciBCZWhhdXB0dW5nLCBkZW5uIGVzIGdpYnQgc293b2hsIGluIE9zdCBhbHMgYXVjaCBpbiBXZXN0ZGV1dHNjaGxhbmQgbnVyIHNlaHIgd2VuaWdlIExhbmRrcmVpc2Ugd2VsY2hlIGVpbmUgQXJiZWl0c2xvc2VucXVvdGUgdm9uIG1laHIgYWxzIDEwJSBoYWJlbi4gSW4gU3BhbmllbiBnaWJ0IGVzIFtmYXN0IGtlaW5lIFJlZ2lvbiBtaXQgZWluZXIgQXJiZWl0c2xvc2VucXVvdGUgdW50ZXIgMTAlXShodHRwczovL2VjLmV1cm9wYS5ldS9ldXJvc3RhdC9kYXRhYnJvd3Nlci92aWV3L3RnczAwMDEwL2RlZmF1bHQvbWFwP2xhbmc9ZW4pIQpOaWNodHNkZXN0b3Ryb3R6IHNpbmQgYXVjaCBpbiBEZXV0c2NobGFuZCByZWdpb25hbGUgVW50ZXJzY2hpZWRlIGVya2VubmJhciwgd2VsY2hlIHdpciBpbnNiZXNvbmRlcmUgaW0gZHJpdHRlbiBUZWlsIGRlciBDYXNlIFN0dWR5IHp1IGVya2zDpHJlbiB2ZXJzdWNoZW4uIEFscyBtw7ZnbGljaGUgRmFrdG9yZW4sIHdlbGNoZSBkaWUgQXJiZWl0c2xvc2VucXVvdGUgZXJrbMOkcmVuIGvDtm5udGVuLCB3b2xsZW4gd2lyIGhpZXIgZGFzIEJJUCBwcm8gS29wZiB1bmQgZGllIFByby1Lb3BmLVZlcnNjaHVsZHVuZyBuw6RoZXIgdW50ZXJzdWNoZW4uCgpXaXIgaGFiZW4gbnVuIGF1Y2ggbm9jaCBkaWUgTcO2Z2xpY2hrZWl0IGJlc3RpbW10ZSBSZWdpb25lbiBpbiB1bnRlcnNjaGllZGxpY2hlbiBGYXJiZW4genUgbWFya2llcmVuLiBXb2xsZW4gd2lyIGJlaXNwaWVsc3dlaXNlIGFsbGUgTGFuZGtyZWlzZSBhdXMgQmFkZW4tV8O8cnR0ZW1iZXJnIGhlcnZvcmhlYmVuLCBzbyBrw7ZubmVuIHdpciBkaWVzZSBiZWlzcGllbHN3ZWlzZSByb3QgZWluZsOkcmJlbiB1bmQgYmVrb21tZW4gZGFkdXJjaCBlaW5lbiBFaW5kcnVjayB3byBCYWRlbi1Xw7xydHRlbWJlcmcgaW0gZGV1dHNjaGxhbmR3ZWl0ZW4gVmVyZ2xlaWNoIGRlciBBcmJlaXRzbG9zZW5xdW90ZSBwcm8gTGFuZGtyZWlzIHN0ZWh0LgoKYGBge3J9CmFsb19xdW90ZV9qaXR0ZXJfZmFyYmUgPC0gZ2VzYW10ZGF0ZW4gJT4lCiAgc2VsZWN0KGFsb19xdW90ZSwgbGFuZGtyZWlzX25hbWUsIGJ1bmRlc2xhbmRfbmFtZSwgb3N0X25hbWUpICU+JQogIG11dGF0ZShiYWRlbl93dWVydHRlbWJlcmcgPSBhcy5mYWN0b3IoaWZlbHNlKGJ1bmRlc2xhbmRfbmFtZSA9PSAiQmFkZW4tV8O8cnR0ZW1iZXJnIiwgMSwgMCkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBvc3RfbmFtZSwgeT1hbG9fcXVvdGUpKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGE9MC41LCBhZXMoY29sb3IgPSBpZmVsc2UoYmFkZW5fd3VlcnR0ZW1iZXJnID09IDEsICJkYXJrcmVkIiwgImRhcmtncmV5IikpKSArCiAgc2NhbGVfY29sb3JfaWRlbnRpdHkoKSArCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMC4xKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHRpdGxlID0gIkFyYmVpdHNsb3NlbnF1b3RlIGluIERldXRzY2hsYW5kIiwKICAgICAgIHN1YnRpdGxlID0gIkVpbmUgQmVvYmFjaHR1bmcgcmVwcsOkc2VudGllcnQgZWluZW4gTGFuZGtyZWlzIiwKICAgICAgIHggPSAiIiwKICAgICAgIHkgPSAiQXJiZWl0c2xvc2VucXVvdGUiLAogICAgICAgY2FwdGlvbiA9ICJRdWVsbGU6IERhdGVuIGRlciBBZ2VudHVyIGbDvHIgQXJiZWl0IGF1cyBkZW0gSmFociAyMDE3XG5EaWUgcm90ZW4gRGF0ZW5wdW5rdGUgc2luZCBMYW5ka3JlaXNlIGF1cyBCYWRlbi1Xw7xydHRlbWJlcmciKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogIAphbG9fcXVvdGVfaml0dGVyX2ZhcmJlCmBgYAoKCl9IaW53ZWlzIHp1ciB2b3JoZXJpZ2VuIEdyYWZpazpfIEZhbGxzIHdpciBkZW0gTGVzZXIgZXR3YXMgbWVociBGcmVpaGVpdGVuIGVpbnLDpHVtZW4gbcO2Y2h0ZW4gdW5kIHVuc2VyZSBHcmFmaWsgYWxzIEhUTUwgRGF0ZWkgw7xiZXJnZWJlbiwgc28ga8O2bm5lbiB3aXIgYXVjaCBlaW5lIGludGVyYWt0aXZlIEdyYWZpayBudXR6ZW4uIFNvIGthbm4gZGVyIExlc2VyIG1pdCB1bnNlcmVyIEF1c2FyYmVpdHVuZyBpbnRlcmFnaWVyZW46CgpgYGB7ciwgd2FybmluZz1GQUxTRX0KIyBadXPDpHR6bGljaCBJbmZvIHVtIHdlbGNoZW4gTGFuZGtyZWlzIGVzIHNpY2ggaGFuZGVsdAphbG9fcXVvdGVfaml0dGVyX3Bsb3RseSA8LSBnZXNhbXRkYXRlbiAlPiUKICBzZWxlY3QoYWxvX3F1b3RlLCBsYW5ka3JlaXNfbmFtZSwgYnVuZGVzbGFuZF9uYW1lLCBvc3RfbmFtZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gb3N0X25hbWUsIHk9YWxvX3F1b3RlLCBsYWJlbCA9IGxhbmRrcmVpc19uYW1lKSkgKwogIGdlb21faml0dGVyKGFscGhhPTAuNSkgKwogIGdlb21fYm94cGxvdChhbHBoYSA9IDAuMSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh0aXRsZSA9ICJBcmJlaXRzbG9zZW5xdW90ZSBpbiBEZXV0c2NobGFuZCIsCiAgICAgICBzdWJ0aXRsZSA9ICJFaW5lIEJlb2JhY2h0dW5nIHJlcHLDpHNlbnRpZXJ0IGVpbmVuIExhbmRrcmVpcyIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIkFyYmVpdHNsb3NlbnF1b3RlIiwKICAgICAgIGNhcHRpb24gPSAiUXVlbGxlOiBEYXRlbiBkZXIgQnVuZGVzYWdlbnR1ciBBZ2VudHVyIGbDvHIgQXJiZWl0IGF1cyBkZW0gSmFociAyMDE3LiIpCgpnZ3Bsb3RseShhbG9fcXVvdGVfaml0dGVyX3Bsb3RseSkKYGBgCgojIyMgQnJ1dHRvaW5sYW5kc3Byb2R1a3QgcHJvIEtvcGYKCldpciBoYWJlbiBpbSB2b3JoZXJpZ2VuIEFic2Nobml0dCBnZXNlaGVuLCBkYXNzIGVzIGR1cmNoYXVzIGRldXRsaWNoZSByZWdpb25hbGUgVW50ZXJzY2hpZWRlIGluIGRlciBBcmJlaXRzbG9zZW5xdW90ZSBpbiAyMDE3IGdpYnQuIERvY2ggd2FzIGvDtm5udGVuIGRpZSBUcmVpYmVyIGRhZsO8ciBzZWluPyAKCkluIGRpZXNlbSBVbnRlcmFic2Nobml0dCB3b2xsZW4gd2lyIHVucyBkYXMgQnJ1dHRvaW5sYW5kc3Byb2R1a3QgcHJvIEtvcGYgYXVmIExhbmRrcmVpc2ViZW5lIG7DpGhlciBhbnNjaGF1ZW4uIEhpZXJiZWkgaGFiZW4gd2lyIG5pY2h0IG51ciBkaWUgRGF0ZW4gZsO8ciAyMDE3LCBzb25kZXJuIGvDtm5uZW4gdW5zIGVpbmVyIGzDpG5nZXJlbiBaZWl0cmVpaGUgYmVkaWVuZW4uIFNvbWl0IGvDtm5uZW4gd2lyIHVucyBkaWUgRW50d2lja2x1bmcgZGVzIEJJUCBwcm8gS29wZiBpbiBkZW4gZWhlbWFsaWdlbiBvc3QtIHVuZCB3ZXN0ZGV1dHNjaGVuIEJ1bmRlc2zDpG5kZXJuIG7DpGhlciBhbnNjaGF1ZW4uIERpZXNlIFplaXRyZWloZW4gc2luZCBmw7xyIHVucyBuw7x0emxpY2hlIEhpbndlaXNlLCBkZW5uIGRhZHVyY2gga8O2bm5lbiB3aXIgc2VoZW46CgotIG9iIGVzIGF1Y2ggcmVnaW9uYWxlIFVudGVyc2NoaWVkZSBpbSBCSVAgcHJvIEtvcGYgZ2lidCB1bmQgbmljaHQgbnVyIGluIGRlciBBcmJlaXRzbG9zZW5xdW90ZQotIG9iIGRpZSByZWdpb25hbGVuIFVudGVyc2NoaWVkZSBzY2hvbiBsw6RuZ2VyZSBaZWl0IGJlc3RlaGVuCi0gb2IgZGllIHJlZ2lvbmFsZW4gVW50ZXJzY2hpZWRlIHNpY2ggdmVyZ3LDtsOfZXJuIG9kZXIgdmVya2xlaW5lcm4KCkRhcyBCcnV0dG9pbmxhbmRzcHJvZHVrdCBzdGVsbHQgZGllIHdpY2h0aWdzdGUgZ2VzYW10d2lydHNjaGFmdGxpY2hlIEtlbm5ncsO2w59lIGRhci4gRXMgZ2lidCBBdWZzY2hsdXNzIGRhcsO8YmVyLCB3aWUgdmllbGUgR8O8dGVyIHVuZCBEaWVuc3RsZWlzdHVuZ2VuIGluIGRlbSBqZXdlaWxpZ2VuIExhbmRrcmVpcyBwcm9kdXppZXJ0IHd1cmRlbi4gRmFsbHMgZGFzIEJJUCBpbiBlaW5lbSBMYW5ka3JlaXMgaG9jaCBpc3Qga8O2bm50ZSBkaWVzIHVudGVyIGFuZGVyZW0gZGFyYW4gbGllZ2VuLCBkYXNzIAoKLSB2aWVsZSBQZXJzb25lbiBpbiBkaWVzZW0gTGFuZGtyZWlzIGVyd2VyYnN0w6R0aWcgc2luZCwgCi0gb2RlciBkYXMgZGllIEVyd2VyYnN0w6R0aWdlbiBpbiBCcmFuY2hlbiBtaXQgaG9oZXIgUHJvZHVrdGl2aXTDpHQgYXJiZWl0ZW4uIAoKRmFsbHMgZGVyIGVyc3RlIFB1bmt0IHp1dHJpZmZ0IHNvbGx0ZSBlaW4gaG9oZXMgQklQIHBybyBLb3BmIChtYW4gYmVhY2h0ZSBkYXMgaGllciBkYXMgQklQIHBybyBFaW53b2huZXIgYmVyZWNobmV0IHdpcmQpIGF1Y2ggbWl0IGVpbmVyIG5pZWRyaWdlcmVuIEFyYmVpdHNsb3NlbnF1b3RlIGVpbmhlcmdlaGVuLiAKCmBgYHtyfQojIFp1ZXJzdCBkaWUgSW5mb3JtYXRpb24genUgbGFuZGtyZWlzX25hbWUgdW5kIGJ1bmRlc2xhbmRfbmFtZSB6dW0gRGF0ZW5zYXR6IGJpZ19sb25nIGhpbnp1bWVyZ2VuCm5hbWVuIDwtIGdlc2FtdGRhdGVuICU+JQogIHNlbGVjdChSZWdpb25hbHNjaGx1ZXNzZWwsIGJ1bmRlc2xhbmRfbmFtZSwgbGFuZGtyZWlzX25hbWUsIG9zdF9uYW1lKQoKYmlwX3plaXRyZWloZV9uYW1lbiA8LSBiaXBfemVpdHJlaWhlICU+JQogIGZpbHRlciggbmNoYXIoUmVnaW9uYWxzY2hsdWVzc2VsKSA9PSA1KSAlPiUKICBsZWZ0X2pvaW4oLixuYW1lbiwgYnk9IlJlZ2lvbmFsc2NobHVlc3NlbCIpCgpvcHRpb25zKHNjaXBlbiA9IDUpCnBsb3RfYmlwIDwtIGJpcF96ZWl0cmVpaGVfbmFtZW4gJT4lCiAgZmlsdGVyKCBKYWhyID49IDIwMDAgKSAlPiUKICBncm91cF9ieShvc3RfbmFtZSwgSmFocikgJT4lCiAgbXV0YXRlKCBkdXJjaHNjaG5pdHQgPSBtZWFuKGJpcF9wcm9fa29wZiksCiAgICAgICAgICB1bG0gPSBpZmVsc2UobGFuZGtyZWlzX25hbWUgPT0gIlVsbSIsIGJpcF9wcm9fa29wZixOQSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX2xpbmUoYWVzKHggPSBKYWhyLCB5ID0gYmlwX3Byb19rb3BmLCBncm91cCA9IFJlZ2lvbmFsc2NobHVlc3NlbCksIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0gSmFociwgeSA9IGR1cmNoc2Nobml0dCwgZ3JvdXAgPSBSZWdpb25hbHNjaGx1ZXNzZWwpLCBjb2xvciA9ICJkYXJrYmx1ZSIpICsKICBnZW9tX2xpbmUoYWVzKHggPSBKYWhyLCB5ID0gdWxtLCBncm91cCA9IFJlZ2lvbmFsc2NobHVlc3NlbCksIGNvbG9yID0gImRhcmtncmVlbiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiKSArIAogIHRoZW1lX21pbmltYWwoKSArCiAgZmFjZXRfd3JhcChvc3RfbmFtZSB+IC4pICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gIkVpbiBWZXJnbGVpY2ggZGVzIEJJUCBwcm8gS29wZiB2b24gb3N0LSB1bmQgd2VzdGRldXRzY2hlbiBMYW5ka3JlaXNlbiIsCiAgICAgICBzdWJ0aXRsZSA9ICJEdXJjaHNjaG5pdHRzd2VydGUgaW4gRHVua2VsYmxhdSwgVWxtIGluIER1bmtlbGdyw7xuIiwKICAgICAgIGNhcHRpb24gPSAiUXVlbGxlOiBEYXRlbiBkZXIgU3RhdGlzdGlzY2hlbiDDhG10ZXIgZGVyIEzDpG5kZXIgdW5kIGRlcyBCdW5kZXMuIiwKICAgICAgIHggPSAiSmFociIsCiAgICAgICB5ID0gIkJJUCBwcm8gS29wZiIpCgpwbG90X2JpcApgYGAgCgpEYXMgTml2ZWF1IGRlcyBCSVAgcHJvIEtvcGYgaXN0IGluIGRlbiBvc3RkZXV0c2NoZW4gQnVuZGVzbMOkbmRlcm4gZGV1dGxpY2ggbmllZHJpZ2VyIGFscyBpbiBkZW4gd2VzdGRldXRzY2hlbi4gSW5zYmVzb25kZXJlIHdlbm4gd2lyIHVucyBkaWUgbG9nYXJpdGhtaXNjaGUgU2thbGllcnVuZyBkZXIgeS1BY2hzZSBhbnNjaGF1ZW4sIHNvIGvDtm5uZW4gd2lyIGRvY2ggZGV1dGxpY2hlIFVudGVyc2NoaWVkZSBlcmtlbm5lbi4gQmVpc3BpZWxzd2Vpc2UgaXN0IGRhcyBkdXJjaHNjaG5pdHRsaWNoZSBCSVAgcHJvIEtvcGYgaW0gZWhlbWFsaWdlbiBPc3RkZXV0c2NobGFuZCBtaXQgMjgwOTHigqwgaW4gMjAxNyBzbyBob2NoIHdpZSBpbiBXZXN0ZGV1dHNjaGxhbmQgaW0gSmFociAyMDA2ICh6dSBkaWVzZW0gWmVpdHB1bmt0IGxhZyBkYXMgZHVyY2hzY2huaXR0bGljaGUgQklQIHBybyBLb3BmIGluIFdlc3RkZXV0c2NobGFuZCBiZWkgMjg5NjHigqwpIQoKSW4gZGVyIG9iZW4gZGFyZ2VzdGVsbHRlbiBHcmFmaWsgc2VoZW4gd2lyIGtlaW5lbiBncm/Dn2VuIEFucGFzc3VuZ3Nwcm96ZXNzIHNlaXQgZGVtIEphaHIgMjAwMCBkZXIgb3N0ZGV1dHNjaGVuIExhbmRrcmVpc2UgYW4gZGllIHdlc3RkZXV0c2NoZW4gTGFuZGtyZWlzZSB3YXMgZGFzIEJJUCBwcm8gS29wZiBhbmJlbGFuZ3QuIE5pY2h0c2Rlc3RvdHJvdHoga2FubiBlcyBpbnNiZXNvbmRlcmUgaW4gZGVuIDE5OTBlciBKYWhyZW4genUgZWluZXIgc2NobmVsbGVuIEF1ZmhvbGphZ2QgZGVyIG9zdGRldXRzY2hlbiBMYW5ka3JlaXNlIGdla29tbWVuIHNlaW4gYXVmIEdydW5kIGRlciBob2hlbiBJbnZlc3RpdGlvbmVuIHVuZCBJbmZyYXN0cnVrdHVyYXVzZ2FiZW4gbmFjaCBkZXIgV2VuZGUuIERhZsO8ciBtw7xzc2VuIHdpciBtaXQgdW5zZXJlciBBbmFseXNlIG5vY2ggZXR3YXMgd2VpdGVyIHp1csO8Y2sgZ2VoZW4sIHdhcyBqZWRvY2ggZGF6dSBmw7xocnQsIGRhcyB3aXIgbmljaHQgbWVociBhbGxlIExhbmRrcmVpc2UgaW4gdW5zZXJlbiBCZW9iYWNodHVuZ2VuIGVudGhhbHRlbiBoYWJlbi4gRsO8ciBlaW5pZ2UgTGFuZGtyZWlzZSBoYWJlbiB3aXIgZXJzdCBEYXRlbiBhYiAyMDAwLCB3YXMgd2lyIGJlaSBkZXIgSW50ZXJwcmV0YXRpb24gZGVyIGZvbGdlbmRlbiBHcmFmaWsgYmVhY2h0ZW4gc29sbHRlbjoKCmBgYHtyfQpiaXBfemVpdHJlaWhlX25hbWVuICU+JQogIGdyb3VwX2J5KG9zdF9uYW1lLCBKYWhyKSAlPiUKICBtdXRhdGUoIGR1cmNoc2Nobml0dCA9IG1lYW4oYmlwX3Byb19rb3BmLCBuYS5ybSA9IFQpLAogICAgICAgICAgdWxtID0gaWZlbHNlKGxhbmRrcmVpc19uYW1lID09ICJVbG0iLCBiaXBfcHJvX2tvcGYsTkEpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0gSmFociwgeSA9IGR1cmNoc2Nobml0dCwgZ3JvdXAgPSBSZWdpb25hbHNjaGx1ZXNzZWwsIGNvbG9yID0gb3N0X25hbWUpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNENTVFMDAiLCAiIzAwNzJCMiIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIikgKyAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSAiRWluIFZlcmdsZWljaCBkZXMgQklQIHBybyBLb3BmIHZvbiBvc3QtIHVuZCB3ZXN0ZGV1dHNjaGVuIExhbmRrcmVpc2VuIiwKICAgICAgIHN1YnRpdGxlID0gIlplaXRyZWloZSBhYiAxOTkyIGJpcyAyMDE3IiwKICAgICAgIGNhcHRpb24gPSAiUXVlbGxlOiBEYXRlbiBkZXIgU3RhdGlzdGlzY2hlbiDDhG10ZXIgZGVyIEzDpG5kZXIgdW5kIGRlcyBCdW5kZXMuIiwKICAgICAgIHggPSAiSmFociIsCiAgICAgICB5ID0gIkJJUCBwcm8gS29wZiIpICsKICBnZW9tX3RleHQoYWVzKHg9MjAwMCwgeT0xNTAwMCwgbGFiZWwgPSAiRHVyY2hzY2huaXR0IGbDvHIgb3N0ZGV1dHNjaGUgTGFuZGtyZWlzZSIpLCBjb2xvciA9ICIjRDU1RTAwIiwgaGp1c3Q9MCwgc2l6ZT00LCBhbHBoYSA9IDAuMSkgKwogIGdlb21fY3VydmUoYWVzKHggPSAyMDA3LCB4ZW5kID0gMjAwNSwgeSA9IDE1NTAwLCB5ZW5kID0gMTg1MDApLCBjdXJ2YXR1cmUgPSAuMywgY29sb3IgPSAiI0Q1NUUwMCIsIHNpemUgPSAwLjEpICsKICBnZW9tX3RleHQoYWVzKHg9MTk5MiwgeT0zMTAwMCwgbGFiZWwgPSAiRHVyY2hzY2huaXR0IGbDvHIgd2VzdGRldXRzY2hlIExhbmRrcmVpc2UiKSwgY29sb3IgPSAiIzAwNzJCMiIsIGhqdXN0PTAsIHNpemU9NCwgYWxwaGEgPSAwLjEpICsKICBnZW9tX2N1cnZlKGFlcyh4ID0gMTk5NSwgeGVuZCA9IDE5OTcsIHkgPSAyOTAwMCwgeWVuZCA9IDI1MDAwKSwgY3VydmF0dXJlID0gLjIsIGNvbG9yID0gIiMwMDcyQjIiLCBzaXplID0gMC4xKQoKYGBgCgpXaWUgd2lyIGF1cyBkZXIgR3JhZmlrIGRldXRsaWNoIHNlaGVuIGvDtm5uZW4gaGF0dGVuIGRpZSBvc3RkZXV0c2NoZW4gTGFuZGtyZWlzZSB6dSBCZWdpbm4gZGVyIDE5OTBlciBKYWhyZSBlaW5lbiBkZXV0bGljaCBzdGVpbGVyZW4gV2FjaHN0dW1zcGZhZCBhbHMgZGllIHdlc3RkZXV0c2NoZW4gTGFuZGtyZWlzZS4gRsO8ciBtYW5jaGUgb3N0ZGV1dHNjaGVuIExhbmRrcmVpc2UgaGFiZW4gd2lyIGxlaWRlciBrZWluZSBJbmZvcm1hdGlvbiBhYiAxOTkyLCBqZWRvY2ggZGV1dGV0IGRhcyBCaWxkIHNjaG9uIHNlaHIgc3RhcmsgZGFyYXVmIGhpbiwgZGFzcyBlcyBpbiBkZW4gZXJzdGVuIEphaHJlbiBuYWNoIGRlciBXZW5kZSBlaW5lbiBzdGFya2VuIEFucGFzc3VuZ3Nwcm96ZXNzIGdlZ2ViZW4gaGF0IG1pdCBob2hlbiBXYWNoc3R1bXNyYXRlbiBkZXMgQklQIHBybyBLb3BmLiBEaWVzZXIgaGF0IGplZG9jaCBNaXR0ZSBkZXIgMTk5MCBKYWhyZSBldHdhcyBhbiBGYWhydCB2ZXJsb3JlbiB1bmQgYWIgZGVtIEphaHIgMjAxMCBsaWVnZW4gb3N0LSB1bmQgd2VzdGRldXRzY2hlIExhbmRrcmVpc2UgcHJha3Rpc2NoIGF1ZiBkZW0gZ2xlaWNoZW4gV2FjaHN0dW1zcGZhZC4gRC5oLiBoaWVyIHNlaGVuIHdpciBrZWluZSB3ZWl0ZXJlIEFucGFzc3VuZyBkZXIgb3N0ZGV1dHNjaGVuIExhbmRrcmVpc2UgYW4gZGllIHdlc3RkZXV0c2NoZW4gTGFuZGtyZWlzZSBtZWhyLiBFaW5lbiDDpGhubGljaGVuIFNjaGx1c3MgaGF0dGVuIHdpciBiZXJlaXRzIGJlaSBkZXIgQW5hbHlzZSBkZXIgYGd0YCBUYWJlbGxlIGltIEFic2Nobml0dCB6dSBkZW4gZGVza3JpcHRpdmVuIFRhYmVsbGVuIGdlc2VoZW4uIAoKRWluZSB3ZWl0ZXJlIE3DtmdsaWNoa2VpdCBkaWUgV2FjaHN0dW1zcGZhZGUgenUgdmlzdWFsaXNpZXJlbiB3w6RyZSBtaXQgc29nZW5hbm50ZW4gInNtYWxsIG11bHRpcGxlcyIuIEhpZXJkdXJjaCBrw7ZubmVuIHdpciBkaWUgQXVmbWVya3NhbWtlaXQgYXVmIGRlbiBXYWNoc3R1bXNwZmFkIHJpY2h0ZW4gdW5kIGlnbm9yaWVyZW4gZGFiZWkgZGllIEjDtmhlIGRlcyBTdGFydHdlcnRlcy4gRsO8ciBkaWVzZSB1bmQgYWxsZSBudW4gZm9sZ2VuZGVuIEFuYWx5c2VuIHdvbGxlbiB3aXIgdW5zIG51biB3aWVkZXIgZGllIERhdGVuIGFiIGRlbSBKYWhyIDIwMDAgYW5zY2hhdWVuLiBIaW50ZXJncnVuZCBpc3QsIGRhc3MgYWIgZGllc2VtIFplaXRwdW5rdCBEYXRlbiBmw7xyIGFsbGUgTGFuZGtyZWlzZSB2ZXJmw7xnYmFyIHNpbmQuCgpgYGB7cn0KCnBsb3RfYmlwX3NwYXJrbGluZXMgPC0gYmlwX3plaXRyZWloZV9uYW1lbiAlPiUKICBmaWx0ZXIoIEphaHIgPj0gMjAwMCApICU+JQogIGdyb3VwX2J5KG9zdF9uYW1lLCBKYWhyKSAlPiUKICBtdXRhdGUoIGR1cmNoc2Nobml0dCA9IG1lYW4oYmlwX3Byb19rb3BmKSwKICAgICAgICAgIHVsbSA9IGlmZWxzZShsYW5ka3JlaXNfbmFtZSA9PSAiVWxtIiwgYmlwX3Byb19rb3BmLE5BKSkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fbGluZShhZXMoeCA9IEphaHIsIHkgPSBkdXJjaHNjaG5pdHQsIGdyb3VwID0gUmVnaW9uYWxzY2hsdWVzc2VsKSwgY29sb3IgPSAiZGFya2JsdWUiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9ICJEaWUgRW50d2lja2x1bmcgZGVzIEJJUCBwcm8gS29wZiBkZXIgdW50ZXJzY2hpZWRsaWNoZW4gQnVuZGVzbMOkbmRlclxuIiwKICAgICAgIGNhcHRpb24gPSAiUXVlbGxlOiBEYXRlbiBkZXIgU3RhdGlzdGlzY2hlbiDDhG10ZXIgZGVyIEzDpG5kZXIgdW5kIGRlcyBCdW5kZXMuIiwKICAgICAgIHggPSAiSmFociIsCiAgICAgICB5ID0gIkJJUCBwcm8gS29wZiIpICsKICBmYWNldF93cmFwKH5idW5kZXNsYW5kX25hbWUsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpKQoKcGxvdF9iaXBfc3BhcmtsaW5lcwpgYGAKCkF1Y2ggaW4gZGllc2VtIEJlaXNwaWVsIHNlaGVuIHdpciwgZGFzcyBhbGxlIEJ1bmRlc2zDpG5kZXIgw7xiZXIgZGllIEphaHJlIGhpbndlZyBpaHIgQklQIHBybyBLb3BmIHN0ZWlnZXJuIGtvbm50ZW4gdW5kIGRhcyBkZXIgRWZmZWt0IGRlciBGaW5hbnprcmlzZSB0ZW5kZW56aWVsbCBpbiBkZW4gd2VzdGRldXRzY2hlbiBMYW5ka3JlaXNlbiBhdXNnZXByw6RndGVyIHdhciBhbHMgaW4gZGVuIG9zdGRldXRzY2hlbi4KTm9jaCBiZXNzZXIga8O2bm5lbiB3aXIgZGVuIEVmZmVrdCBkZXIgRmluYW56a3Jpc2UgYW4gZGVyIGZvbGdlbmRlbiBHcmFmaWsgc2VoZW4sIGJlaSB3ZWxjaGVyIGRpZSBWZXLDpG5kZXJ1bmcgZGVzIEJJUCBwcm8gS29wZiBpbiBqZWRlbSBMYW5ka3JlaXMgenVtIFZvcmphaHIgYWJnZXRyYWdlbiB3aXJkOgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJpcF93YWNoc3R1bSA8LSBiaXBfemVpdHJlaWhlX25hbWVuICU+JQogIGdyb3VwX2J5KFJlZ2lvbmFsc2NobHVlc3NlbCkgJT4lCiAgYXJyYW5nZShSZWdpb25hbHNjaGx1ZXNzZWwsIEphaHIpICU+JQogIG11dGF0ZSggYmlwX3Byb19rb3BmX3dhY2hzdHVtID0gMTAwKihiaXBfcHJvX2tvcGYgLSBsYWcoYmlwX3Byb19rb3BmKSkgLyBiaXBfcHJvX2tvcGYpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShvc3RfbmFtZSwgSmFocikgJT4lCiAgbXV0YXRlKCBkdXJjaHNjaG5pdHQgPSBtZWFuKGJpcF9wcm9fa29wZl93YWNoc3R1bSwgbmEucm09VFJVRSkpICU+JQogIHVuZ3JvdXAoKQoKYmlwX3dhY2hzdHVtICU+JQogIGZpbHRlciggSmFociA+PSAyMDAwICkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fbGluZShhZXMoeCA9IEphaHIsIHkgPSBiaXBfcHJvX2tvcGZfd2FjaHN0dW0sIGdyb3VwID0gUmVnaW9uYWxzY2hsdWVzc2VsKSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX2xpbmUoYWVzKHggPSBKYWhyLCB5ID0gZHVyY2hzY2huaXR0LCBncm91cCA9IFJlZ2lvbmFsc2NobHVlc3NlbCwgY29sb3IgPSBvc3RfbmFtZSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0Q1NUUwMCIsICIjMDA3MkIyIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoY29sb3IgPSAiRHVyY2hzY2huaXR0IGRlciBMYW5ka3JlaXNlIiwKICAgICAgIHRpdGxlID0gIkRpZSBXYWNoc3R1bXNyYXRlIGRlcyBCSVAgcHJvIEtvcGYgdm9uIG9zdC0gdW5kIHdlc3RkZXV0c2NoZW4gTGFuZGtyZWlzZW4iLAogICAgICAgY2FwdGlvbiA9ICJRdWVsbGU6IERhdGVuIGRlciBTdGF0aXN0aXNjaGVuIMOEbXRlciBkZXIgTMOkbmRlciB1bmQgZGVzIEJ1bmRlcy4iLAogICAgICAgeCA9ICJKYWhyIiwKICAgICAgIHkgPSAiVmVyw6RuZGVydW5nIGRlcyBCSVAgcHJvIEtvcGYiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PTIwMDAsIHk9NDAsIGxhYmVsID0gIi0tIER1cmNoc2Nobml0dCBmw7xyIG9zdGRldXRzY2hlIExhbmRrcmVpc2UiKSwgY29sb3IgPSAiI0Q1NUUwMCIsIGhqdXN0PTAsIHNpemU9NCwgYWxwaGEgPSAwLjEpICsKICBnZW9tX3RleHQoYWVzKHg9MjAwMCwgeT0zNSwgbGFiZWwgPSAiLS0gRHVyY2hzY2huaXR0IGbDvHIgd2VzdGRldXRzY2hlIExhbmRrcmVpc2UiKSwgY29sb3IgPSAiIzAwNzJCMiIsIGhqdXN0PTAsIHNpemU9NCwgYWxwaGEgPSAwLjEpCgpgYGAKCkluc2dlc2FtdCBoYWJlbiBvc3QtIHVuZCB3ZXN0ZGV1dHNjaGUgTGFuZGtyZWlzZSBpbSBEdXJjaHNjaG5pdHQgZWluZSBzZWhyIMOkaG5saWNoZSBXYWNoc3R1bXNyYXRlIGRlcyBCSVAgcHJvIEtvcGYgc2VpdCAyMDAwLiBJbiBkZW4gd2VzdGRldXRzY2hlbiBMYW5ka3JlaXNlbiBpc3Qgc2llIHN0ZWxsZW53ZWlzZSBldHdhcyBuaWVkcmlnZXIsIGluc2Jlc29uZGVyZSB2b3IgZGVyIEZpbmFuemtyaXNlLgoKRHVyY2ggZGllIHZvcmhlcmlnZW4gU2NoYXViaWxkZXIgc2VoZW4gd2lyLCBkYXNzIGRpZSBVbnRlcnNjaGllZGUgendpc2NoZW4gZGVuIG9zdC0gdW5kIHdlc3RkZXV0c2NoZW4gTGFuZGtyZWlzZW4gc2Nob24gbGFuZ2UgYmVzdGVoZW4gKG1pbmQuIHNlaXQgMjAwMCkgdW5kIGRhcyBlcyBrZWluZSBncm/Dn2UgQW5uw6RoZXJ1bmcgZGVyIG9zdGRldXRzY2hlbiBMYW5ka3JlaXNlIGFuIGRhcyB3ZXN0ZGV1dHNjaGUgQklQIHBybyBLb3BmIG5hY2ggZGVtIEphaHIgMjAwMCBnaWJ0LiBEaWUgV2FjaHN0dW1zcGZhZGUgc2luZCBoaWVyZsO8ciB6dSDDpGhubGljaC4gRGlyZWt0IG5hY2ggZGVyIFdlbmRlIHdhciBkaWVzIGFuZGVycywgenUgZGllc2VtIFplaXRwdW5rdCB3YXJlbiBkaWUgV2FjaHN0dW1zcGZhZGUgZGVyIG9zdGRldXRzY2hlbiBMYW5ka3JlaXNlIGRldXRsaWNoIGjDtmhlciBhbHMgZGllIGRlciB3ZXN0ZGV1dHNjaGVuLiBJbiBkZXIgw5xidW5nc2F1ZmdhYmUgYmVzY2jDpGZ0aWdlbiBTaWUgc2ljaCBtaXQgZGVtIEVpbmtvbW1lbiBhdWYgTGFuZGtyZWlzZWJlbmUgdW5kIGvDtm5uZW4gZG9ydCBuYWNodm9sbHppZWhlbiwgb2IgZGVyIFRyZW5kIGJlaSBkZW4gRWlua29tbWVuIGRlciBHbGVpY2hlIGlzdCB3aWUgYmVpIGRlbSBCSVAgcHJvIEtvcGYhCgpXZW5uIHdpciB1bnMgbnVyIGF1ZiBkYXMgSmFociAyMDE3IGJlc2NocsOkbmtlbiwgc28gc2VoZW4gd2lyIGF1Y2ggaGllciBpbSBCSVAgcHJvIEtvcGYgZGV1dGxpY2hlIFVudGVyc2NoaWVkZS4gSW0gZm9sZ2VuZGVuIFNjaGF1YmlsZCBpc3QgZGllIFZlcnRlaWx1bmcgZGVzIEJJUCBwcm8gS29wZiDDvGJlciBhbGxlIExhbmRrcmVpc2UgZsO8ciBPc3QtIHVuZCBXZXN0ZGV1dHNjaGxhbmQgaW0gSmFociAyMDE3IGFiZ2V0cmFnZW4gYmVpIGRlbmVuIGRhcyBCSVAgcHJvIEtvcGYgdW50ZXIgMTAwIDAwMOKCrCBsYWcuIFp1c8OkdHpsaWNoIHNpbmQgZGllIGpld2VpbGlnZW4gTWl0dGVsd2VydGUgZGVzIEJJUCBwcm8gS29wZiBmw7xyIG9zdC0gdW5kIHdlc3RkZXV0c2NoZSBMYW5ka3JlaXNlIGluIGJsYXUgZWluZ2V6ZWljaG5ldC4gWnVtIEVpbmVuIGvDtm5uZW4gd2lyIHVucyBkaWUgVmVydGVpbHVuZyBkZXMgQklQIHBybyBLb3BmIGd1dCBkdXJjaCBlaW4gSGlzdG9ncmFtbSBhbnplaWdlbiBsYXNzZW4sIHdvYmVpIGRpZSAiYmlud2lkdGgiLCBkLmguIGRpZSBEaWNrZSBlaW5lcyBCYWxrZW5zLCBhdWYgMTAwMOKCrCBnZXNldHp0IHd1cmRlLiBEaWVzIGJlZGV1dGV0LCBkYXMgYWxsZSBCZW9iYWNodHVuZ2VuIGlubmVyaGFsYiB2b24gMTAwMOKCrCB6dXNhbW1lbmdlZmFzc3QgaW4gZWluZW0gQmFsa2VuIGRhcmdlc3RlbGx0IHdlcmRlbi4gWi5CLiBnaWJ0IGVzIDEwIExhbmRrcmVpc2UgaW4gV2VzdGRldXRzY2hsYW5kLCBkaWUgZWluIEJJUCBwcm8gS29wZiB6d2lzY2hlbiAyNjAwMOKCrCAtIDI3MDAw4oKsIGF1c3dlaXNlbiAoc2llaGUgU2NoYXViaWxkKS4KCmBgYHtyfQpnZXNhbXRkYXRlbiAlPiUKICBncm91cF9ieShvc3RfbmFtZSkgJT4lCiAgc3VtbWFyaXNlKGR1cmNoc2Nobml0dCA9IG1lYW4oYmlwX3Byb19rb3BmLCBuYS5ybSA9IFQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBiaXBfcHJvX2tvcGYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oZGF0YSA9IGZpbHRlcihnZXNhbXRkYXRlbiwgYmlwX3Byb19rb3BmPDEwMDAwMCksIGJpbndpZHRoID0gMTAwMCkgKwogIGZhY2V0X2dyaWQob3N0X25hbWV+LikgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBkdXJjaHNjaG5pdHQpLCBjb2xvciA9ICJibHVlIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiVmVydGVpbHVuZyBkZXMgQklQIHBybyBLb3BmIGbDvHIgT3N0LSB1bmQgV2VzdGRldXRzY2hsYW5kIiwKICAgICAgIHN1YnRpdGxlID0gIkJlb2JhY2h0dW5nZW4gYXVmIExhbmRrcmVpc2ViZW5lIGluIDIwMTciLAogICAgICAgeCA9ICJCSVAgcHJvIEtvcGYiLAogICAgICAgeSA9ICJBbnphaGwgYW4gQmVvYmFjaHR1bmdlbiIpCgptZWFucyA8LSBnZXNhbXRkYXRlbiAlPiUKICBncm91cF9ieShvc3RfbmFtZSkgJT4lCiAgc3VtbWFyaXNlKGR1cmNoc2Nobml0dCA9IG1lYW4oYmlwX3Byb19rb3BmLCBuYS5ybSA9IFQpKQpgYGAKCkR1cmNoIGRpZSBBbmFseXNlIGRlciBWZXJ0ZWlsdW5nIGRlcyBCSVAgd2VyZGVuIHVuc2VyZSBiaXNoZXJpZ2VuIEVya2VubnRuaXNzZSBnZXN0w7x0enQuIERpZSBvc3RkZXV0c2NoZW4gTGFuZGtyZWlzZSBoYWJlbiBpbiAyMDE3IGVpbiBkdXJjaHNjaG5pdHRsaWNoZXMgQklQIHBybyBLb3BmIHZvbiAyODA5MeKCrCwgZGllIHdlc3RkZXV0c2NoZW4gTGFuZGtyZWlzZSB2b24gMzg4ODTigqwuIEVzIGdpYnQgendhciBhdWNoIGluIFdlc3RkZXV0c2NobGFuZCBMYW5ka3JlaXNlIG1pdCBlaW5lbSBnZXJpbmdlcmVuIEJJUCBwcm8gS29wZiBhbHMgaW4gbWFuY2hlbiBvc3RkZXV0c2NoZW4gTGFuZGtyZWlzZW4sIGRvY2ggYSkgZXMgZ2lidCBlaW5pZ2UgTGFuZGtyZWlzZSwgZGllIG1laHIgYWxzIDUwMDAw4oKsIEJJUCBwcm8gS29wZiBhdWZ3ZWlzZW4gaW4gV2VzdGRldXRzY2hsYW5kIChrZWluZW4gaW4gT3N0ZGV1dHNjaGxhbmQpIHVuZCBiKSBhdWNoIGRlciBWZXJnbGVpY2ggZGVyIFZlcnRlaWx1bmdlbiB6ZWlndCwgZGFzcyBkZXIgR3Jvw590ZWlsIGRlciBCZW9iYWNodHVuZ2VuIGluIFdlc3RkZXV0c2NobGFuZCByZWNodHMgdm9uIGRlbSBpbiBPc3RkZXV0c2NobGFuZCBsaWVndC4KCkRhIHdpciBpbSBvYmVuIGdlemVpZ3RlbiBIaXN0b2dyYW1tIGRpZSBBbnphaGwgYW4gQmVvYmFjaHR1bmdlbiwgZC5oLiBkaWUgQW56YWhsIGFuIExhbmRrcmVpc2VuLCBhdWYgZGVyIHktQWNoc2UgYWJnZXRyYWdlbiBoYWJlbiBrw7ZubnRlIGVzIGR1cmNoYXVzIHNlaW4sIGRhc3Mgd2lyIGRpZSB6d2VpIFNjaGF1YmlsZGVyIG5pY2h0IHNvIGRpcmVrdCBtaXRlaW5hbmRlciBWZXJnbGVpY2hlbiBrw7ZubmVuLiBTY2hsaWXDn2xpY2ggZ2lidCBlcyBkZXV0bGljaCB3ZW5pZ2VyIG9zdGRldXRzY2hlIGFscyB3ZXN0ZGV1dHNjaGUgTGFuZGtyZWlzZS4KCldhcyB3aXIgaW4gZGllc2VtIEZhbGwgdHVuIGvDtm5uZW4gdW0gZGllIFZlcmdsZWljaGJhcmtlaXQgenUgZXJow7ZoZW4gaXN0IGRpZSBWZXJ0ZWlsdW5nc2RpY2h0ZSB6dSB6ZWlnZW4sIGFuc3RhdHQgZWluZXMgSGlzdG9ncmFtbXMuIEltIEdydW5kZSBrw7ZubmVuIFNpZSBzaWNoIGRpZSBEaWNodGUgYWxzIGdlZ2zDpHR0ZXRlcyBIaXN0b2dyYW1tIHZvcnN0ZWxsZW4sIHdlbGNoZSBhdWYgZGVyIHktQWNoc2UgbmljaHQgbWVociBkaWUgQW56YWhsIGFuIEJlb2JhY2h0dW5nZW4sIHNvbmRlcm4gZGllIERpY2h0ZSBhYnRyw6RndC4KCmBgYHtyfQpnZXNhbXRkYXRlbiAlPiUKICBncm91cF9ieShvc3RfbmFtZSkgJT4lCiAgc3VtbWFyaXNlKGR1cmNoc2Nobml0dCA9IG1lYW4oYmlwX3Byb19rb3BmLCBuYS5ybSA9IFQpLCBtZWRpYW4gPSBtZWRpYW4oYmlwX3Byb19rb3BmLCBuYS5ybSA9IFQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBiaXBfcHJvX2tvcGYpKSArCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBmaWx0ZXIoZ2VzYW10ZGF0ZW4sIGJpcF9wcm9fa29wZjwxMDAwMDApLCBrZXJuZWwgPSAiZ2F1c3NpYW4iLCBidyA9IDEwMDApICsKICBmYWNldF9ncmlkKG9zdF9uYW1lfi4pICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gZHVyY2hzY2huaXR0KSwgY29sb3IgPSAiYmx1ZSIpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVkaWFuKSwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiVmVydGVpbHVuZyBkZXMgQklQIHBybyBLb3BmIGbDvHIgT3N0LSB1bmQgV2VzdGRldXRzY2hsYW5kIiwKICAgICAgIHN1YnRpdGxlID0gIkJlb2JhY2h0dW5nZW4gYXVmIExhbmRrcmVpc2ViZW5lIGluIDIwMTcsIER1cmNoc2Nobml0dCA9IGJsYXUsIE1lZGlhbiA9IGdyw7xuIiwKICAgICAgIHggPSAiQklQIHBybyBLb3BmIiwKICAgICAgIHkgPSAiRGljaHRlIikKCmBgYAoKQXVjaCBoaWVyIGVyaGFsdGVuIHdpciBkZW4gc2VsYmVuIEVpbmRydWNrIHZvbiBkZXIgVmVydGVpbHVuZyBkZXMgQklQIHBybyBLb3BmLCB3aWUgYmVpbSBIaXN0b2dyYW1tLiBEaWUgImJpbmR3aWR0aCIgKGJ3KSBoYWJlbiB3aXIgd2llZGVyIGF1ZiAxMDAw4oKsIGdlc2V0enQgdW5kIHdpZWRlciBudXIgZGllIExhbmRrcmVpc2UgYWJnZXRyYWdlbiBtaXQgZWluZW0gQklQIHBybyBLb3BmIHZvbiB1bnRlciAxMDAwMDDigqwuIE5lYmVuIGRlbSBEdXJjaHNjaG5pdHQgKGluIGJsYXUpIGhhYmVuIHdpciBoaWVyIG5vY2ggZGVuIE1lZGlhbiAoaW4gZ3LDvG4pIGRlciBWZXJ0ZWlsdW5nZW4gZWluZ2V6ZWljaG5ldCB1bmQgc2VoZW4sIGRhc3MgZGllc2VyIGluIE9zdGRldXRzY2hsYW5kIGRldXRsaWNoIG7DpGhlciBhbSBNaXR0ZWx3ZXJ0IGxpZWd0IGFscyBpbiBXZXN0ZGV1c2NobGFuZC4gRGllcyBsaWVndCB2b3IgYWxsZW0gZGFyYW4gZGFzIGVzIGluIFdlc3RkZXV0c2NobGFuZCBlaW5pZ2UgTGFuZGtyZWlzZSBtaXQgc2VociBob2hlbiBCSVAgcHJvIEtvcGYgZ2lidC4KCiMjIyBWZXJzY2h1bGR1bmcgZGVyIGVpbnplbG5lbiBMYW5ka3JlaXNlCgpFaW4gd2VpdGVyZXIgRmFrdG9yLCB3ZWxjaGVyIGRpZSBBcmJlaXRzbG9zZW5xdW90ZSBiZXN0aW1tZW4ga8O2bm50ZSBpc3QgZGllIFZlcnNjaHVsZHVuZyBkZXMgw7ZmZmVudGxpY2hlbiBIYXVzaGFsdHMuIEluIHN0cnVrdHVyc2Nod2FjaGVuIExhbmRrcmVpc2VuIG1pdCBlaW5lciBob2hlbiBWZXJzY2h1bGR1bmcgc2luZCB0ZW5kZW56aWVsbCB3ZW5pZ2VyIEpvYnMgdm9yaGFuZGVuIHVuZCBkaWUgR2VtZWluZGVuIGhhYmVuIG5pZWRyaWdlcmUgR2V3ZXJiZXN0ZXVlcmVpbm5haG1lbi4gRsO8ciBJbnZlc3RpdGlvbmVuIG3DvHNzZW4gc2ljaCBkaWVzZSBHZW1laW5kZW4gYmVpbSBuaWNodC3DtmZmZW50bGljaGVuIFNla3RvciB2ZXJzY2h1bGRlbi4KClVtIHVucyBkaWUgVmVyc2NodWxkdW5nIGRlcyDDtmZmZW50bGljaGVuIEhhdXNoYWx0cyBiZXNzZXIgdm9yIEF1Z2VuIHp1IGbDvGhyZW4gd29sbGVuIHdpciBkaWVzZSBhdWYgZWluZXIgRGV1dHNjaGxhbmRrYXJ0ZSBkYXJzdGVsbGVuOgoKYGBge3IsICB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0Kc2NodWxkZW5fbGFuZGtyZWlzZSA8LSBsZWZ0X2pvaW4obGFuZGtyZWlzZSwgZ2VzYW10ZGF0ZW4sIGJ5PSJSZWdpb25hbHNjaGx1ZXNzZWwiKSAlPiUKICBtdXRhdGUoc2NodWxkZW5fcHJvX2tvcGYgPSBhcy5mYWN0b3IoY2FzZV93aGVuKAogICAgU2NodWxkZW5fcHJvX2tvcGZfbGsgPD0gMTAwMCB+ICIwIC0gMWsiLAogICAgU2NodWxkZW5fcHJvX2tvcGZfbGsgPiAxMDAwICYgU2NodWxkZW5fcHJvX2tvcGZfbGsgPD0gMjAwMCB+ICIxayAtIDJrIiwKICAgIFNjaHVsZGVuX3Byb19rb3BmX2xrID4gMjAwMCAmIFNjaHVsZGVuX3Byb19rb3BmX2xrIDw9IDMwMDAgfiAiMmsgLSAzayIsCiAgICBTY2h1bGRlbl9wcm9fa29wZl9sayA+IDMwMDAgJiBTY2h1bGRlbl9wcm9fa29wZl9sayA8PSA1MDAwIH4gIjNrIC0gNWsiLAogICAgU2NodWxkZW5fcHJvX2tvcGZfbGsgPiA1MDAwICYgU2NodWxkZW5fcHJvX2tvcGZfbGsgPD0gODAwMCB+ICI1ayAtIDhrIiwKICAgIFNjaHVsZGVuX3Byb19rb3BmX2xrID4gODAwMCAmIFNjaHVsZGVuX3Byb19rb3BmX2xrIDw9IDIwMDAwIH4gIjhrIC0gMjBrIgogICkpKQoKcGxvdF9zY2h1bGRlbl9sayA8LSBnZ3Bsb3QoCiAgIyBEYXRlbnNhdHoKICBkYXRhID0gc2NodWxkZW5fbGFuZGtyZWlzZQopICsKICBnZW9tX3NmKAogICAgbWFwcGluZyA9IGFlcygKICAgICAgZmlsbCA9IHNjaHVsZGVuX3Byb19rb3BmCiAgICApLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgc2l6ZSA9IDAuMQogICkgKwogICMgVmlyaWRpcyBGYXJic2NoZW1hCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoCiAgICBvcHRpb24gPSAiaW5mZXJubyIsCiAgICBuYW1lID0gIlNjaHVsZGVuXG5wcm8gS29wZiBpbiDigqwiLAogICAgYWxwaGEgPSAwLjgsICMgRGVja2tyYWZ0IGRlciBGw7xsbHVuZwogICAgYmVnaW4gPSAwLjEsCiAgICBlbmQgPSAwLjksCiAgICBkaXJlY3Rpb24gPSAtMSwKICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUKSkgKwogICMgZXR3YXMgZGlja2VyZSBMaW5pZW4gZsO8ciBCdW5kZXNsYW5kZ3JlbnplbgogIGdlb21fc2YoCiAgICBkYXRhID0gYnVuZGVzbGFuZCwKICAgIGZpbGwgPSAidHJhbnNwYXJlbnQiLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgc2l6ZSA9IDAuNQogICkgKwogICMgVGl0ZWwKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9IE5VTEwsCiAgICAgICB0aXRsZSA9ICJXaWUgdmVyc2NodWxkZXQgc2luZCBkaWUgZGV1dHNjaGVuIExhbmRrcmVpc2U/IiwKICAgICAgIHN1YnRpdGxlID0gIsOWZmZlbnRsaWNoZSBTY2h1bGRlbiBwcm8gS29wZiBpbiAyMDE3IikgKwogIHRoZW1lX21pbmltYWwoKQoKcGxvdF9zY2h1bGRlbl9sawpgYGAKCkRhcyBTY2hhdWJpbGQgemVpZ3QgZGllIHByby1Lb3BmIFZlcnNjaHVsZHVuZyBkZXIgZWluemVsbmVuIExhbmRrcmVpc2UuIEplIGR1bmtsZXIgZGllIExhbmRrcmVpc2UgZWluZ2Vmw6RyYnQgc2luZCwgZGVzdG8gaMO2aGVyIGlzdCBpaHJlIFZlcnNjaHVsZHVuZy4gRGllIExlZ2VuZGUgZ2lidCBkaWUgQmFuZGJyZWl0ZSBkZXIgVmVyc2NodWxkdW5nIHBybyBGYXJic2NoYXR0aWVydW5nIHdpZWRlciwgd29iZWkgMWsgPSAxMDAw4oKsIHVuZCA4ayA9IDgwMDDigqwgYmVkZXV0ZW4uIEbDvHIgQmVybGluLCBCcmVtZW4sIEJyZW1lcmhhZmVuIHVuZCBIYW1idXJnICh3ZWnDnyBoaW50ZXJsZWd0KSBoYWJlbiB3aXIga2VpbmUgRGF0ZW4uIApXaXIgc2VoZW4gYmVzb25kZXJzIGluIEJheWVybiB1bmQgQmFkZW4tV8O8cnR0ZW1iZXJnIHNlaHIgdmllbGUgTGFuZGtyZWlzZSBtaXQgZWluZXIgZ2VyaW5nZW4gUHJvLUtvcGYgVmVyc2NodWxkdW5nIGJpcyBtYXhpbWFsIDIwMDDigqwsIGdsZWljaGVzIGdpbHQgZsO8ciBSZWlubGFuZC1QZmFseiB1bmQgenVtIEdyb8OfdGVpbCBhdWNoIE5pZWRlcnNhY2hzZW4uIEluIE5vcmRyaGVpbi1XZXN0ZmFsZW4gdW5kIGRlbSBTYWFybGFuZCBoaW5nZWdlbiBoYWJlbiB3aXIgZWluZSBzZWhyIGhvaGUgVmVyc2NodWxkdW5nIHBybyBLb3BmLiAgVGjDvHJpbmdlbiwgTWVja2xlbmJ1cmctVm9ycG9tbWVybiB1bmQgSGVzc2VuIHNpbmQgaW0gTWl0dGVsZmVsZC4gQmVzb25kZXJzIGRhcyBSdWhyZ2ViaWV0LCBkaWUgZWhlbWFsaWdlIEhlcnprYW1tZXIgZGVyIGRldXRzY2hlbiBJbmR1c3RyaWUsIHN0aWNodCBkdXJjaCBlaW5lIGhvaGUgVmVyc2NodWxkdW5nIHBybyBLb3BmIGhlcnZvci4gTnVuIGhhYmVuIHdpciBoaWVyIGRpZSDDtmZmZW50bGljaGUgVmVyc2NodWxkdW5nIGlucyBWZXJow6RsdG5pcyB6dSBkZXIgRWlud29obmVyemFobCBnZXNldHp0LCBhbGxlcmRpbmdzIHdpcmQgaWhuZW4gZWluZSBhbmRlcmUgQmVyZWNobnVuZyBiencuIEVpbnNjaMOkdHp1bmcgZGVyIFZlcnNjaHVsZHVuZyDDtmZ0ZXIgYmVnZWduZW46IERpZSBWZXJzY2h1bGR1bmcgZWluZXMgTGFuZGVzIGJ6dy4gZWluIExhbmRrcmVpcyBpbSBWZXJow6RsdG5pcyB6dXIgV2lydHNjaGFmdHNrcmFmdCwgZC5oLiB6dW0gQklQLCBkaWVzZXMgTGFuZGtyZWlzZXMuCkRpZXMgd29sbGVuIHdpciBoaWVyIGF1Y2ggYmVyZWNobmVuIHVuZCBkaWUgRGV1dHNjaGxhbmRrYXJ0ZSBlbnRzcHJlY2hlbmQgZWluZsOkcmJlbjoKCmBgYHtyLCAgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9CnNjaHVsZGVuX2xhbmRrcmVpc2VfYW50ZWlsIDwtIGxlZnRfam9pbihsYW5ka3JlaXNlLCBnZXNhbXRkYXRlbiwgYnk9IlJlZ2lvbmFsc2NobHVlc3NlbCIpICU+JQogIG11dGF0ZShhbnRlaWxfc2NodWxkZW4gPSBTY2h1bGRlbl9nZXNhbXQgLyBiaXAsCiAgICAgICAgIGFudGVpbF9zY2h1bGRlbiA9IGFzLmZhY3RvcihjYXNlX3doZW4oCiAgICBhbnRlaWxfc2NodWxkZW4gPD0gMC4wMn4gIjAgLSAyJSIsCiAgICBhbnRlaWxfc2NodWxkZW4gPiAwLjAyICYgYW50ZWlsX3NjaHVsZGVuIDw9IDAuMDQgfiAiMiUgLSA0JSIsCiAgICBhbnRlaWxfc2NodWxkZW4gPiAwLjA0ICYgYW50ZWlsX3NjaHVsZGVuIDw9IDAuMDYgfiAiNCUgLSA2JSIsCiAgICBhbnRlaWxfc2NodWxkZW4gPiAwLjA2ICYgYW50ZWlsX3NjaHVsZGVuIDw9IDAuMDggfiAiNiUgLSA4JSIsCiAgICBhbnRlaWxfc2NodWxkZW4gPiAwLjA4ICYgYW50ZWlsX3NjaHVsZGVuIDw9IDAuMTAgfiAiOCUgLSAxMCUiLAogICAgYW50ZWlsX3NjaHVsZGVuID4gMC4xMCAgfiAiPjEwJSIKICApKSkKCnBsb3Rfc2NodWxkZW5fbGsgPC0gZ2dwbG90KAogICMgRGF0ZW5zYXR6CiAgZGF0YSA9IHNjaHVsZGVuX2xhbmRrcmVpc2VfYW50ZWlsCikgKwogIGdlb21fc2YoCiAgICBtYXBwaW5nID0gYWVzKAogICAgICBmaWxsID0gZmN0X3JlbGV2ZWwoYW50ZWlsX3NjaHVsZGVuLCAiPjEwJSIsIGFmdGVyID0gSW5mKQogICAgKSwKICAgIGNvbG9yID0gIndoaXRlIiwKICAgIHNpemUgPSAwLjEKICApICsKICAjIFZpcmlkaXMgRmFyYnNjaGVtYQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKAogICAgb3B0aW9uID0gImluZmVybm8iLAogICAgbmFtZSA9ICJBbnRlaWwgZGVyIFNjaHVsZGVuXG5hbSBCSVAiLAogICAgYWxwaGEgPSAwLjgsICMgRGVja2tyYWZ0IGRlciBGw7xsbHVuZwogICAgYmVnaW4gPSAwLjEsCiAgICBlbmQgPSAwLjksCiAgICBkaXJlY3Rpb24gPSAtMSwKICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUKSkgKwogIGdlb21fc2YoCiAgICBkYXRhID0gYnVuZGVzbGFuZCwKICAgIGZpbGwgPSAidHJhbnNwYXJlbnQiLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgc2l6ZSA9IDAuNQogICkgKwogICMgVGl0ZWwKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9IE5VTEwsCiAgICAgICB0aXRsZSA9ICJXaWUgdmVyc2NodWxkZXQgc2luZCBkaWUgZGV1dHNjaGVuIExhbmRrcmVpc2U/IiwKICAgICAgIHN1YnRpdGxlID0gIsOWZmZlbnRsaWNoZSBTY2h1bGRlbiBpbSBWZXJow6RsdG5pcyB6dW0gQklQIGluIDIwMTciKSArCiAgdGhlbWVfbWluaW1hbCgpCgpwbG90X3NjaHVsZGVuX2xrCmBgYAoKQXVjaCBoaWVyIGVyaGFsdGVuIHdpciBlaW4gc2VociDDpGhubGljaGVzIEJpbGQgYnpnbC4gZGVyIFZlcnNjaHVsZHVuZyBkZXIgTGFuZGtyZWlzZS4gRXMgdHJldGVuIGFsbGVyZGluZ3MgZGllIG9zdGRldXRzY2hlbiBMYW5ka3JlaXNlIG5vY2htYWwgZXR3YXMgc3TDpGtlciBiemdsLiBpaHJlciBWZXJzY2h1bGR1bmcgaGVydm9yLCB3YXMgenVtIEVpbmVuIG5hdMO8cmxpY2ggYW4gZGVuIGdld8OkaGx0ZW4gQ3V0LW9mZnMgZsO8ciBkaWUgRGFyc3RlbGx1bmcgKDAtMiUgYmlzID4xMCUpIGxpZWd0LiBadW0gQW5kZXJlbiBhYmVyIGF1Y2ggZGFyYW4sIGRhc3MgZGllIEFuemFobCBhbiBQZXJzb25lbiBpbiBkZW4gTGFuZGtyZWlzZW4gcmVjaHQgaG9jaCBpc3QsIHfDpGhyZW5kIGRpZSBXaXJ0c2NoYWZ0c2tyYWZ0IGRlciBMYW5ka3JlaXNlIGdlcmluZ2VyIGF1c2bDpGxsdC4KSW4gZGllc2VyIEthcnRlIHNlaGVuIHdpciBudW4gcmVjaHQgZGV1dGxpY2ggZGllIHdlbmlnIHZlcnNjaHVsZGV0ZW4gUmVnaW9uZW4gaGVydm9ydHJldGVuLCBkaWUgZGEgd8OkcmVuIEJhZGVuLVfDvHJ0dGVtYmVyZywgQmF5ZXJuLCBSaGVpbmxhbmQtUGZhbHogdW5kIE5pZWRlcnNhY2hzZW4uClVtIGplZG9jaCBiZXVydGVpbGVuIHp1IGvDtm5uZW4sIGluIHdpZSBmZXJuIGRpZXNlIFByby1Lb3BmIFZlcnNjaHVsZHVuZyBkZXIgw7ZmZmVudGxpY2hlbiBIYXVzaGFsdGUgbWl0IGRlciBBcmJlaXRzbG9zaWdrZWl0IGluIGRlbiBqZXdlaWxpZ2VuIExhbmRrcmVpc2VuIHp1c2FtbWVuZsOkbGx0IHdvbGxlbiB3aXIgdW5zIGF1Y2ggbm9jaCBlaW5lIEthcnRlIHp1ciBBcmJlaXRzbG9zaWdrZWl0IGluIGRlbiBqZXdlaWxpZ2VuIExhbmRrcmVpc2VuIGFuc2NoYXVlbjoKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0Kc2NodWxkZW5fbGFuZGtyZWlzZSA8LSBsZWZ0X2pvaW4obGFuZGtyZWlzZSwgZ2VzYW10ZGF0ZW4sIGJ5PSJSZWdpb25hbHNjaGx1ZXNzZWwiKSAlPiUKICBtdXRhdGUoYWxvX3F1b3RlX2xrID0gYXMuZmFjdG9yKGNhc2Vfd2hlbigKICAgIGFsb19xdW90ZSA8PSAyIH4gIjAgLSAyJSIsCiAgICBhbG9fcXVvdGUgPiAyICYgYWxvX3F1b3RlIDw9IDQgfiAiMiAtIDQlIiwKICAgIGFsb19xdW90ZSA+IDQgJiBhbG9fcXVvdGUgPD0gNiB+ICI0IC0gNiUiLAogICAgYWxvX3F1b3RlID4gNiAmIGFsb19xdW90ZSA8PSA4IH4gIjYgLSA4JSIsCiAgICBhbG9fcXVvdGUgPiA4ICYgYWxvX3F1b3RlIDw9IDEwIH4gIjggLSAxMCUiLAogICAgYWxvX3F1b3RlID4gMTAgfiAiPjEwJSIKICApKSkKCnBsb3RfYWxvX2xrIDwtIGdncGxvdCgKICAjIERhdGVuc2F0egogIGRhdGEgPSBzY2h1bGRlbl9sYW5ka3JlaXNlCikgKwogIGdlb21fc2YoCiAgICBtYXBwaW5nID0gYWVzKAogICAgICBmaWxsID0gZmN0X3JlbGV2ZWwoYWxvX3F1b3RlX2xrLCAiPjEwJSIsIGFmdGVyID0gNSkKICAgICksCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBzaXplID0gMC4xCiAgKSArCiAgIyBWaXJpZGlzIEZhcmJzY2hlbWEKICBzY2FsZV9maWxsX3ZpcmlkaXNfZCgKICAgIG9wdGlvbiA9ICJpbmZlcm5vIiwKICAgIG5hbWUgPSAiQXJiZWl0c2xvc2VucXVvdGUiLAogICAgYWxwaGEgPSAwLjgsICMgRGVja2tyYWZ0IGRlciBGw7xsbHVuZwogICAgYmVnaW4gPSAwLjEsCiAgICBlbmQgPSAwLjksCiAgICBkaXJlY3Rpb24gPSAtMSwKICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUKSkgKwogICMgZXR3YXMgZGlja2VyZSBMaW5pZW4gZsO8ciBCdW5kZXNsYW5kZ3JlbnplbgogIGdlb21fc2YoCiAgICBkYXRhID0gYnVuZGVzbGFuZCwKICAgIGZpbGwgPSAidHJhbnNwYXJlbnQiLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgc2l6ZSA9IDAuNQogICkgKwogICMgVGl0ZWwKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9IE5VTEwsCiAgICAgICB0aXRsZSA9ICJBcmJlaXRzbG9zaWdrZWl0IGluIERldXRzY2hsYW5kIiwKICAgICAgIHN1YnRpdGxlID0gIkRhcmdlc3RlbGx0IGlzdCBkaWUgQXJiZWl0c2xvc2VucXVvdGUgZsO8ciBhbGxlIExhbmRrcmVpc2UgaW4gMjAxNyIpICsKICB0aGVtZV9taW5pbWFsKCkKCgpwbG90X2Fsb19sawpgYGAKCkluIGRpZXNlciBLYXJ0ZSBzZWhlbiB3aXIgZWluZW4gZGV1dGxpY2hlbiBVbnRlcnNjaGllZCBmw7xyIG9zdC0gdW5kIHdlc3RkZXV0c2NoZSBMYW5ka3JlaXNlLiBJbiBPc3RkZXV0c2NobGFuZCBpc3QgZGllIEFyYmVpdHNsb3NpZ2tlaXQgZGV1dGxpY2ggaMO2aGVyIGFscyBpbiBXZXN0ZGV1dHNjaGxhbmQsIGQuaC4gZGFzIEthcnRlbnBlbmRhbnQgenUgdW5zZXJlbiB2b3JoZXJpZ2VuIEFuYWx5c2VuLiBKZWRvY2ggc2luZCBkaWUgTGFuZGtyZWlzZSBpbiBXZXN0ZGV1dHNjaGxhbmQsIHdlbGNoZSBlaW5lIGhvaGUgVmVyc2NodWxkdW5nIGF1ZndlaXNlbiwgd2llIGJlaXNwaWVsc3dlaXNlIGltIFNhYXJsYW5kIG9kZXIgTm9yZHJoZWluLVdlc3RmYWxlbiwgYXVjaCBkaWUgTGFuZGtyZWlzZSBtaXQgZGVyIGjDtmNoc3RlbiBBcmJlaXRzbG9zZW5xdW90ZSBpbiBXZXN0ZGV1dHNjaGxhbmQuCkRhaGVyIGvDtm5udGUgZGllIFZlcnNjaHVsZHVuZyBkZXMgw7ZmZmVudGxpY2hlbiBIYXVzaGFsdHMgZHVyY2hhdXMgYXVjaCBlaW4gRmFrdG9yIHNlaW4sIHdlbGNoZXIgZGllIEFyYmVpdHNsb3NlbnF1b3RlIGVya2zDpHJlbiBrw7ZubnRlIHVuZCB3aXIgc29sbHRlbiBkaWVzZW4gRmFrdG9yIGluIHVuc2VyZXIgQW5hbHlzZSB3ZWl0ZXJoaW4gYmVyw7xja3NpY2h0aWdlbi4KCiMgQml2YXJpYXRlIGRlc2tyaXB0aXZlIEFuYWx5c2UKCiMjIERpZSBLb3JyZWxhdGlvbgoKSW4gdW5zZXJlbiBha3R1ZWxsZW4gQW5hbHlzZW4gaGF0dGVuIHdpciB1bnMgbWl0IHVuaXZhcmlhdGVuIGRlc2tyaXB0aXZlbiBBbmFseXNlbiBiZXNjaMOkZnRpZ3QsIGQuaCBudXIgbWl0IGVpbmVyIFZhcmlhYmxlbiBhbiBzaWNoLiBOdW4gd29sbGVuIHdpciB1bnMgbm9jaCBhbnNjaGF1ZW4sIHdpZSBkaWUgQXJiZWl0c2xvc2VucXV0b2UgbWl0IGRlbSBCSVAgV2FjaHN0dW0gdW5kIGRlbSBBbnRlaWwgZGVyIMO2ZmZlbnRsaWNoZW4gU2NodWxkZW4gYW0gQklQIGltIEphaHIgMjAxNyBmw7xyIGRpZSBlaW56ZWxuZW4gTGFuZGtyZWlzZSBpbiBEZXV0c2NobGFuZCB6dXNhbW1lbmjDpG5nZW4sIGQuaC4gZWluZSBiaXZhcmlhdGUgZGVza3JpcHRpdmUgQW5hbHlzZS4KCkR1cmNoIGRpZSBiaXNoZXJpZ2VuIGRlc2tyaXB0aXZlbiBBbmFseXNlbiBoYWJlbiB3aXIgZWluZSBncm/Dn2UgU3RyZXV1bmcgZGVzIEJJUCBwcm8gS29wZiBpbm5lcmhhbGIgRGV1dHNjaGxhbmRzIGZlc3RnZXN0ZWxsdC4gSW5zYmVzb25kZXJlIGdhYiBlcyBlaW5lbiBkZXV0bGljaGVuIFVudGVyc2NoaWVkIHp3aXNjaGVuIG9zdC0gdW5kIHdlc3RkZXV0c2NoZW4gTGFuZGtyZWlzZW4uIEltIEJJUCBXYWNoc3R1bSB3YXJlbiBzaWNoIG9zdC0gdW5kIHdlc3RkZXV0c2NoZSBMYW5ka3JlaXNlIGltIER1cmNoc2Nobml0dCByZWNodCDDpGhubGljaCwgZG9jaCBhdWNoIGhpZXIgZ2FiIGVzIGJldHLDpGNodGxpY2hlIFVudGVyc2NoaWVkZSB6d2lzY2hlbiBkZW4gTGFuZGtyZWlzZW4uIFVtIGV0d2FzIGRhcsO8YmVyIEF1c3NhZ2VuIHp1IGvDtm5uZW4sIHdpZSBkaWUgQXJiZWl0c2xvc2VucXVvdGUgbWl0IGRlbSBCSVAtV2FjaHN0dW0gb2RlciBkZXIgw7ZmZmVudGxpY2hlbiBWZXJzY2h1bGR1bmcgenVzYW1tZW5ow6RuZ3QsIHdvbGxlbiB3aXIgdW5zIGRpZSBLb3JyZWxhdGlvbiBkZXIgZWluemVsbmVuIFZhcmlhYmxlbiB1bnRlcmVpbmFuZGVyIG7DpGhlciBhbnNjaGF1ZW4uCgojIyMgQXJiZWl0c2xvc2VucXVvdGUgdW5kIEJJUC1XYWNoc3R1bQoKWnVlcnN0IHdvbGxlbiB3aXIgZGFzIHp1dm9yIGJlcmVjaG5ldGUgQklQLVdhY2hzdHVtIGF1ZiBkYXMgSmFociAyMDE3IGVpbnNjaHLDpG5rZW4gdW5kIGRpZXMgenUgdW5zZXJlbiBnZXNhbXRkYXRlbiBoaW56dW1lcmdlbi4KCmBgYHtyfQpiaXBfd2FjaHN0dW1fMjAxNyA8LSBiaXBfd2FjaHN0dW0gJT4lCiAgZmlsdGVyKCBKYWhyID09IDIwMTcgKSAlPiUKICBzZWxlY3QoUmVnaW9uYWxzY2hsdWVzc2VsLCBiaXBfcHJvX2tvcGZfd2FjaHN0dW0sIEphaHIpCgpnZXNhbXRkYXRlbiA8LSBsZWZ0X2pvaW4oZ2VzYW10ZGF0ZW4sIGJpcF93YWNoc3R1bV8yMDE3LCBieSA9ICJSZWdpb25hbHNjaGx1ZXNzZWwiKSAlPiUKICBtdXRhdGUoYW50ZWlsX3NjaHVsZGVuID0gU2NodWxkZW5fZ2VzYW10IC8gYmlwKQpgYGAKCkFuc2NobGllw59lbmQgZXJzdGVsbGVuIHdpciBlaW4gU3RyZXVkaWFncmFtbSwgd2VsY2hlcyBkaWUgQXJiZWl0c2xvc2VucXVvdGUgdW5kIGRhcyBCSVAgV2FjaHN0dW0gaW4gZGVuIGVpbnplbG5lbiBMYW5ka3JlaXNlbiBlaW5hbmRlciBnZWdlbsO8YmVyc3RlbGx0LiBIaWVyIGVyaGFsdGVuIHdpciBlcnN0ZSBFaW5ibGlja2UgaW4gZGllIEtvcnJlbGF0aW9uIGRlciB6d2VpIFZhcmlhYmxlbi4KCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpnZXNhbXRkYXRlbiAlPiUKICBnZ3Bsb3QoYWVzKHggPSBiaXBfcHJvX2tvcGZfd2FjaHN0dW0sIHkgPSBhbG9fcXVvdGUpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGxhYnMoIHggPSAiV2FjaHN0dW0gZGVzIEJJUCAlIiwgCiAgICAgICAgeSA9ICJBcmJlaXRzbG9zZW5xdW90ZSBpbiAlIiwKICAgICAgICB0aXRsZSA9ICJLb3JyZWxhdGlvbiBkZXMgQklQLVdhY2hzdHVtcyB1bmQgZGVyIEFyYmVpdHNsb3NlbnF1b3RlIikgKwogIHRoZW1lX21pbmltYWwoKSAKYGBgCgpadWVyc3QgZmFsbGVuIGRpZSBBdXNyZWnDn2VyIGlucyBBdWdlLiBJbnNiZXNvbmRlcmUgaW0gcG9zaXRpdmVuIEJlcmVpY2ggZ2lidCBlcyBMYW5ka3JlaXNlLCB3ZWxjaGUgZWluIEJJUC1wcm8tS29wZi1XYWNoc3R1bSB2b24gw7xiZXIgMTAlIHZvbiAyMDE2IG5hY2ggMjAxNyBhdWZ3ZWlzZW4uIEFiZXIgZXMgZ2lidCBhdWNoIGVpbmVuIExhbmRrcmVpcywgd2VsY2hlciBlaW5lIFNjaHVtcGZ1bmcgZGVzIEJJUCBwcm8gS29wZiB1bSBmYXN0IDEwJSBhdWZ3ZWlzdC4gU29sY2hlIEF1c3JlacOfZXIga8O2bm5lbiBkYWhlciBzdGFtbWVuLCBkYXNzIGVzIGluIGRlbiBqZXdlaWxpZ2VuIExhbmRrcmVpc2VuIGltIFZvcmphaHIgZWluIHNlaHIgbmllZHJpZ2VzIEJJUCBXYWNoc3R1bSAoYnNwdy4gTGFuZGtyZWlzIEZvcmNoaGVpbSkgb2RlciBlaW4gc2VociBob2hlcyBCSVAgV2FjaHN0dW0gKGJzcHcuIExhbmRrcmVpcyBBc2NoYWZmZW5idXJnKSBnYWIsIGQuaC4gd2lyIHNlaGVuIGhpZXIgZsO8ciB2ZXJlaW56ZWx0ZSBMYW5ka3JlaXNlIGVpbmVuIEF1ZmhvbHByb3plc3MgYXVzIGRlbSB2b3JoZXJpZ2VuIEphaHIuIERpZXNlIGhvaGVuIG9kZXIgbmllZHJpZ2VuIFdhY2hzdHVtc3JhdGVuIGvDtm5udGVuIG5hdMO8cmxpY2ggZHVyY2ggdmVyZWluemVsdGUgUHJvamVrdGUgYXVmIExhbmRrcmVpc2ViZW5lIGJlZGluZ3Qgc2Vpbiwgd2VyZGVuIHNpY2ggamVkb2NoIGltIGdlc2FtdGVuIERhdGVuc2F0eiBtaXQgNDAxIExhbmRrcmVpc2VuIHVuZCBrcmVpc2ZyZWllbiBTdMOkZHRlbiB3aWVkZXIgcmVsYXRpdmllcmVuLiBKZSBtZWhyIEJlb2JhY2h0dW5nZW4gU2llIGluIGlocmVtIERhdGVuc2F0eiBoYWJlbiwgZGVzdG8gd2VuaWdlciBmYWxsZW4gZWluemVsbmUgQXVzcmVpw59lciBpbnMgR2V3aWNodC4gRHVyY2ggdW5zZXJlbiB1bWZhbmdyZWljaGVuIERhdGVuc2F0eiBrw7ZubmVuIHdpciBzb2xjaGUgZWluemVsbmVuIEF1c3JlacOfZXIgYXVmZmFuZ2VuLiBXZW5uIHdpciBqZWRvY2ggZWluZSBrbGVpbmUgU3RpY2hwcm9iZSBhdXMgZGllc2VtIERhdGVuc2F0eiBleHRyYWhpZXJlbiAoei5CLiBudXIgYWxsZSBvc3RkZXV0c2NoZW4gTGFuZGtyZWlzZSksIGRhbm4ga8O2bm50ZSBzY2hvbiBlaW4gZGV1dGxpY2ggYW5kZXJlcyBCaWxkIGRlcyBadXNhbW1lbmhhbmdzIGRlciBiZWlkZW4gVmFyaWFibGVuIGVudHN0ZWhlbi4gSGllciBoYWJlbiB6LkIuIGFsbGUgb3N0ZGV1dHNjaGVuIExhbmRrcmVpc2UgZWluZSByZWxhdGl2IGdyb8OfZSBTdHJldXVuZyBpbiBkZW4gQXJiZWl0c2xvc2VucXVvdGVuLCBhYmVyIG51ciBlaW5lIGdlcmluZ2UgQmFuZGJyZWl0ZSBiZWltIEJJUCBXYWNoc3R1bS4KCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpnZXNhbXRkYXRlbiAlPiUKICBnZ3Bsb3QoYWVzKHggPSBiaXBfcHJvX2tvcGZfd2FjaHN0dW0sIHkgPSBhbG9fcXVvdGUsIGNvbG9yID0gb3N0X25hbWUpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGxhYnMoIHggPSAiV2FjaHN0dW0gZGVzIEJJUCAlIiwgCiAgICAgICAgeSA9ICJBcmJlaXRzbG9zZW5xdW90ZSBpbiAlIiwKICAgICAgICB0aXRsZSA9ICJLb3JyZWxhdGlvbiBkZXMgQklQLVdhY2hzdHVtcyB1bmQgZGVyIEFyYmVpdHNsb3NlbnF1b3RlIiwKICAgICAgICBjb2xvciA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKQW5oYW5kIGRlciBQdW5rdGV3b2xrZSBrw7ZubnRlbiB3aXIgYWJzY2jDpHR6ZW4gZGFzIGRlciBadXNhbW1lbmhhbmcgendpc2NoZW4gZGVyIEFyYmVpdHNsb3NlbnF1b3RlIHVuZCBkZW0gQklQLXByby1Lb3BmLVdhY2hzdHVtIG5haGUgTnVsbCBzZWluIG3DvHNzdGUuIEQuaC4gd2lyIHfDvHJkZW4gdmVybXV0ZW4gZGFzIGVzIGtlaW5lbiBadXNhbW1lbmhhbmcgendpc2NoZW4gZGVyIEJJUC1wcm8tS29wZiBXYWNoc3R1bXNyYXRlIHVuZCBkZXIgQXJiZWl0c2xvc2VucXVvdGUgZWluZXMgTGFuZGtyZWlzZXMgaW4gMjAxNyBnaWJ0LiAKCldlbm4gd2lyIHVucyBkaWUgS29ycmVsYXRpb24gendpc2NoZW4gZGVuIHp3ZWkgVmFyaWFibGVuIGF1c2dlYmVuIGxhc3Nlbiwgc28gZXJoYWx0ZW4gd2lyIGRpZSBlaW5lIChzY2h3YWNoKSBuZWdhdGl2ZSBLb3JyZWxhdGlvbiBuYWhlIE51bGw6CgpgYGB7cn0KY29yKGdlc2FtdGRhdGVuJGFsb19xdW90ZSwgZ2VzYW10ZGF0ZW4kYmlwX3Byb19rb3BmX3dhY2hzdHVtLHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKQpgYGAKCkQuaC4gZGVyIHZvbiB1bnMgaW4gZGVyIEdyYWZpayB2ZXJtdXRldGUgKG5pY2h0IHZvcmhhbmRlbmUpIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBkZXIgQXJiZWl0c2xvc2VucXVvdGUgdW5kIGRlbSBCSVAtcHJvLUtvcGYtV2FjaHN0dW0gd2lyZCBkdXJjaCBkaWUgQW5hbHlzZSBkZXIgS29ycmVsYXRpb24gYmVzdMOkdGlndC4KCiMjIEFyYmVpdHNsb3NlbnF1b3RlIHVuZCBWZXJzY2h1bGR1bmcgYWxzIEFudGVpbCBhbSBCSVAKCkRpZSBLb3JyZWxhdGlvbiBkZXIgQXJiZWl0c2xvc2VucXVvdGUgdW5kIGRlbSBBbnRlaWwgZGVyIMO2ZmZlbnRsaWNoZW4gU2NodWxkZW4gbcO2Y2h0ZW4gd2lyIG51biBhdWNoIMO8YmVyIGVpbiBTdHJldWRpYWdyYW1tIHVudGVyc3VjaGVuLgoKYGBge3J9CmNvcl9hbG9fdmVyc2NodWxkdW5nIDwtIGNvcihnZXNhbXRkYXRlbiRhbG9fcXVvdGUsIGdlc2FtdGRhdGVuJGFudGVpbF9zY2h1bGRlbix1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIikKCmdlc2FtdGRhdGVuICU+JQogIGdncGxvdChhZXMoeCA9IGFudGVpbF9zY2h1bGRlbiwgeSA9IGFsb19xdW90ZSkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyggeCA9ICJBbnRlaWwgZGVyIFNjaHVsZGVuIGFtIEJJUCBpbiAlIiwgCiAgICAgICAgeSA9ICJBcmJlaXRzbG9zZW5xdW90ZSBpbiAlIiwKICAgICAgICB0aXRsZSA9ICJLb3JyZWxhdGlvbiBkZXIgw7ZmZmVudGxpY2hlbiBWZXJzY2h1bGR1bmcgdW5kIGRlciBBcmJlaXRzbG9zZW5xdW90ZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGdlb21fdGV4dCh4ID0gMC4wMiwgeSA9MTMsIGxhYmVsID0gcGFzdGUoInIgPSAiLCBhcy5jaGFyYWN0ZXIocm91bmQoY29yX2Fsb192ZXJzY2h1bGR1bmcsMikpKSkKYGBgCgpJbiBkaWVzZW0gU2NoYXViaWxkIHNjaGVpbnQgZXMgZWluZW4gcG9zaXRpdmVuIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBkZXIgw7ZmZmVudGxpY2hlbiBWZXJzY2h1bGR1bmcgdW5kIGRlciBBcmJlaXRzbG9zZW5xdW90ZSBkZXIgTGFuZGtyZWlzZSB6dSBnZWJlbi4gRC5oLiBMYW5ka3JlaXNlIG1pdCBlaW5lciBob2hlbiBWZXJzY2h1bGR1bmcgaW0gVmVyaMOkbHRuaXMgenUgaWhyZW0gQklQIGhhYmVuIHRlbmRlbnppZWxsIGF1Y2ggZWluZSBow7ZoZXJlIEFyYmVpdHNsb3NlbnF1b3RlLiBKZWRvY2ggaXN0IGVzIGF1Y2ggaGllciBzY2h3ZXIgenUgc2FnZW4sIHdpZSBncm/DnyBkaWUgS29ycmVsYXRpb24gdGF0c8OkY2hsaWNoIGlzdC4gRGFoZXIgaGFiZW4gd2lyIGRpZSBLb3JyZWxhdGlvbiBpbSBTY2hhdWJpbGQgbWl0IGVpbmdlZsO8Z3QuCgpXZW5uIHdpciB3aWVkZXIgZWluZSBrbGVpbmUgU3RpY2hwcm9iZSBhdXMgZGllc2VtIERhdGVuc2F0eiBleHRyYWhpZXJlbiwgZGFubiBoYWJlbiBhdWNoIGhpZXIgYWxsZSBvc3RkZXV0c2NoZW4gTGFuZGtyZWlzZSBlaW5lIHJlbGF0aXYgZ3Jvw59lIFN0cmV1dW5nIGluIGRlbiBBcmJlaXRzbG9zZW5xdW90ZW4sIGFiZXIgbnVyIGVpbmUgZ2VyaW5nZSBCYW5kYnJlaXRlIGluIGRlciDDtmZmZW50bGljaGVuIFZlcnNjaHVsZHVuZy4KIApgYGB7cn0KZ2VzYW10ZGF0ZW4gJT4lCiAgZ2dwbG90KGFlcyh4ID0gYW50ZWlsX3NjaHVsZGVuLCB5ID0gYWxvX3F1b3RlLCBjb2xvcj1vc3RfbmFtZSkpICsgZ2VvbV9wb2ludCgpICsgCiAgbGFicyggeCA9ICJBbnRlaWwgZGVyIFNjaHVsZGVuIGFtIEJJUCBpbiAlIiwgCiAgICAgICAgeSA9ICJBcmJlaXRzbG9zZW5xdW90ZSBpbiAlIiwKICAgICAgICB0aXRsZSA9ICJLb3JyZWxhdGlvbiBkZXIgw7ZmZmVudGxpY2hlbiBWZXJzY2h1bGR1bmcgdW5kIGRlciBBcmJlaXRzbG9zZW5xdW90ZSIsCiAgICAgICAgY29sb3IgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKV8O8cmRlbiB3aXIgaGllciBudXIgZGllIEtvcnJlbGF0aW9uIHp3aXNjaGVuIEFyYmVpdHNsb3NlbnF1b3RlIHVuZCDDtmZmZW50bGljaGVyIFZlcnNjaHVsZHVuZyBmw7xyIG9zdGRldXRzY2hlIExhbmRrcmVpc2UgYmV0cmFjaHRlbiwgc28gZXJnZWJlIHNpY2ggZWluZSBLb3JyZWxhdGlvbiB2b246CgpgYGB7cn0KY29yX2RhdGEgPC0gZ2VzYW10ZGF0ZW4gJT4lCiAgZmlsdGVyKG9zdCA9PSAxKQoKY29yX2Fsb192ZXJzY2h1bGR1bmcgPC0gY29yKGNvcl9kYXRhJGFsb19xdW90ZSwgY29yX2RhdGEkYW50ZWlsX3NjaHVsZGVuLHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKQoKY29yX2Fsb192ZXJzY2h1bGR1bmcKYGBgCgpELmguIHdpciB3w7xyZGVuIGhpZXIga29tcGxldHQgYW5kZXJlIFNjaGzDvHNzZSB6aWVoZW4gYXVmIEJhc2lzIGRpZXNlciBTdGljaHByb2JlLgoKIyMjIEludGVycHJldGF0aW9uIGRlciBLb3JyZWxhdGlvbgoKRGllIEtvcnJlbGF0aW9uIGFscyBaYWhsIGFuIHNpY2ggaGF0IGtlaW5lIGludHVpdGl2ZSBxdWFudGl0YXRpdmUgSW50ZXJwcmV0YXRpb24uIFNpZSBpc3QgZWluZSB1bml2YXJpYXRlIFJlcHLDpHNlbnRhdGlvbiBkZXMgWnVzYW1tZW5oYW5ncyB6d2VpZXIgVmFyaWFibGVuLgpTaWUga2FubiB1bnMgamVkb2NoIGRhYmVpIGhlbGZlbiBzdGFyayBtaXRlaW5hbmRlciBrb3JyZWxpZXJ0ZSBWYXJpYWJsZW4gaW4gdW5zZXJlbSBEYXRlbnNhdHogYXVzZmluZGlnIHp1IG1hY2hlbi4gRGllcyBpc3QgaW5zYmVzb25kZXJlIGJlaSBlaW5lciBzcMOkdGVyZW4gUmVncmVzc2lvbnNhbmFseXNlIGhpbGZyZWljaCwgd2VubiBlcyBzaWNoIHVtIG1laHJlcmUgZXJrbMOkcmVuZGVuIFZhcmlhYmxlbiBoYW5kZWx0IChtdWx0aXBsZSBsaW5lYXJlIFJlZ3Jlc3Npb24pLCB3ZWxjaGUgd2lyIGFsbGUgaW4gdW5zZXJlIFJlZ3Jlc3Npb24gZWluZmxpZcOfZW4gbGFzc2VuIG3DtmNodGVuLiBXZW5uIHdpciBiZWlzcGllbHN3ZWlzZSBlaW5lIHNlaHIgaG9oZSBwb3NpdGl2ZSBvZGVyIG5lZ2F0aXZlIEtvcnJlbGF0aW9uIHp3aXNjaGVuIGRlbiBlcmtsw6RyZW5kZW4gVmFyaWFibGVuIGBiaXBfd2FjaHN0dW1gIHVuZCBgYW50ZWlsX3NjaHVsZGVuYCBmaW5kZW4gd8O8cmRlbiwgZGFubiBzb2xsdGVuIHdpciB1bnMgZ2VuYXUgw7xiZXJsZWdlbiwgb2Igd2lyIGJlaWRlIFZhcmlhYmxlbiBpbiBkaWUgUmVncmVzc2lvbiBhdWZuZWhtZW4gd29sbGVuLCBvZGVyIGxpZWJlciBhdWYgZWluZSB2ZXJ6aWNodGVuLiBEZW5uIGR1cmNoIHN0YXJrIG1pdGVpbmFuZGVyIGtvcnJlbGllcnRlIFZhcmlhYmxlbiBzZXR6ZW4gd2lyIHVucyBkZW0gUHJvYmxlbSBkZXIgW011bHRpa29sbGluaWFyaXTDpHRdKGh0dHBzOi8vZGUud2lraXBlZGlhLm9yZy93aWtpL011bHRpa29sbGluZWFyaXQlQzMlQTR0KSBhdXMuIERhZHVyY2ggd8O8cmRlbiB1bnNlcmUgUmVncmVzc2lvbnNrb2VmZml6aWVudGVuIGJlaSBlaW5lciBtdWx0aXBsZW4gbGluZWFyZW4gUmVncmVzc2lvbiB2ZXJ6ZXJydC4gSW4gdW5zZXJlbSBGYWxsIGlzdCBkaWUgS29ycmVsYXRpb24gZGVyIGJlaWRlbiBWYXJpYWJsZW4gamVkb2NoIGdlcmluZzoKCmBgYHtyfQpjb3IoZ2VzYW10ZGF0ZW4kYmlwX3Byb19rb3BmX3dhY2hzdHVtLCBnZXNhbXRkYXRlbiRhbnRlaWxfc2NodWxkZW4sdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpCmBgYAoKSW4gZWluZXIgZW1waXJpc2NoZW4gQXVzYXJiZWl0dW5nIHdlcmRlbiBTaWUgaS5kLlIuIGtlaW5lIFNjaGF1YmlsZGVyIHp1ciBLb3JyZWxhdGlvbiBkZXIgZWluemVsbmVuIFZhcmlhYmxlbiBzZWhlbiwgc29uZGVybiBudXIgZWluZSBUYWJlbGxlIGluIGRlciBkaWUgS29ycmVsYXRpb25lbiBkZXIgVmFyaWFibGVuIHVudGVyZWluYW5kZXIgYWJnZXRyYWdlbiBzaW5kLiBFaW5lIHNvbGNoZSBUYWJlbGxlIGvDtm5uZW4gU2llIGF1Y2ggZWluZmFjaCBpbiBSIGlubmVyaGFsYiBkZXMgYHRpZHl2ZXJzZWAgdW5kIG1pdHRlbHMgZGVzIFBha2V0cyBgY29ycnJgIGVyemV1Z2VuOgoKYGBge3J9CmtvcnJlbGF0aW9uZW4gPC0gZ2VzYW10ZGF0ZW4gJT4lCiAgc2VsZWN0KGJpcF9wcm9fa29wZl93YWNoc3R1bSwgYW50ZWlsX3NjaHVsZGVuLCBhbG9fcXVvdGUpICU+JQogIGNvcnJlbGF0ZSgpICU+JSAjIEtvcnJlbGF0aW9uZW4gZXJ6ZXVnZW4KICByZWFycmFuZ2UoKSAlPiUgICMgU29ydGllcmVuIG5hY2ggS29ycmVsYXRpb24KICBzaGF2ZSh1cHBlciA9IFRSVUUpICU+JSAjIE9iZXJlbiBUZWlsIGRlciBUYWJlbGxlIGFic2NobmVpZGVuCiAgbXV0YXRlKHJvd25hbWUgPSBjKCIxLiBCSVAgcHJvIEtvcGYgV2FjaHN0dW0iLCAiMi4gQW50ZWlsIFNjaHVsZGVuIiwgIjMuIEFyYmVpdHNsb3NlbnF1b3RlIikpICU+JSAjIFVtYmVuZW5uZW4gZGVyIFZhcmlhYmxlbm5hbWVuCiAgc2VsZWN0KC1yb3duYW1lKSAlPiUKICBmYXNoaW9uKGRlY2ltYWxzID0gMiwgbmFfcHJpbnQgPSAiIikgIyBBYnNjaGxpZcOfZW5kZSBWZXJzY2jDtm5lcnVuZ2VuCgprb3JyZWxhdGlvbmVuICU+JQogIGtibChjYXB0aW9uID0gIktvcnJlbGF0aW9uZW4gZGVyIHVudGVyc3VjaHRlbiBWYXJpYWJsZW4iLAogICAgICAgIGNvbC5uYW1lcyA9IGMoIiIsICIxIiwgIjIiLCAiMyIpLAogICAgICBmb3JtYXQgPSAiaHRtbCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUKICBrYWJsZV9wYXBlcihmdWxsX3dpZHRoID0gVFJVRSkKYGBgCgoKSW4gZW1waXJpc2NoZW4gQXVzYXJiZWl0dW5nZW4gd2lyZCBkaWUgS29ycmVsYXRpb24gbWVpc3QgbnVyIGJlcmVjaG5ldCB1bSBkZW4gWnVzYW1tZW5oYW5nIGVpbnplbG5lciBWYXJpYWJsZW4gbWl0ZWluYW5kZXIgenUgdmVyYW5zY2hhdWxpY2hlbi4KSmVkb2NoIHNpbmQgZGllIEhhdXB0YW5hbHlzZW4gZGllIGdldMOkdGlndCB3ZXJkZW4ga2VpbmUgS29ycmVsYXRpb25zbWF0cml6ZW4gc29uZGVybiBSZWdyZXNzaW9uc3RhYmVsbGVuLiBEaWVzIGxpZWd0IGRhcmFuLCBkYXNzIFJlZ3Jlc3Npb25za29lZmZpemllbnRlbiwgYW5kZXJzIGFscyBLb3JyZWxhdGlvbmVuIGVpbmUgcXVhbnRpdGF0aXZlIEludGVycHJldGF0aW9uIHp1bGFzc2VuLiBXZWl0ZXJoaW4gc2luZCBkaWUgU2Now6R0emVyIGluIGRlciBsaW5lYXJlbiBSZWdyZXNzaW9uIGtvbnNpc3RlbnQgdW5kIHVuYmlhc2VkICsgd2lyIGvDtm5uZW4gZGVuIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBtZWhyZXJlbiBWYXJpYWJsZW4gYmV0cmFjaHRlbi4gRsO8ciBkZW4gU2Now6R0emVyIGluIGRlciBsaW5lYXJlbiBSZWdyZXNzaW9uIGdpbHQgQkxVRSAoYmVzdCBsaW5lYXIgdW5iaWFzZWQgZXN0aW1hdG9yKSwgd2FzIGbDvHIgZGllIEtvcnJlbGF0aW9uIG5pY2h0IGdpbHQuIAoKRGVyIEFuYWx5c2Ugdm9uIFp1c2FtbWVuaMOkbmdlbiBtaXR0ZWxzIGxpbmVhcmVyIFJlZ3Jlc3Npb24gd2VyZGVuIHdpciB1bnMgaW0gZHJpdHRlbiBUZWlsIGRlciBDYXNlLVN0dWR5IHdpZG1lbi4KCiMgWnVzYW1tZW5mYXNzdW5nIHVuZCBBdXNibGljawoKTnVuIGhhYmVuIHdpciB1bnMgZWluZW4gw5xiZXJibGljayDDvGJlciB1bnNlcmUgRGF0ZW4gdmVyc2NoYWZmdCB1bmQgc2Nob24gZWluaWdlcyB6dSBkZW4gcmVnaW9uYWxlbiBVbnRlcnNjaGllZGVuIGluIERldXRzY2hsYW5kIGdlbGVybnQuIFNvd29obCBkaWUgZGVza3JpcHRpdmUgQW5hbHlzZSBtaXR0ZWxzIFRhYmVsbGVuIGFscyBhdWNoIGRpZSBncmFmaXNjaGUgQW5hbHlzZSBkdXJjaCB2ZXJzY2hpZWRlbmUgUGxvdHMgemVpZ2VuIHVucyBhdWNoIDI4IEphaHJlIG5hY2ggZGVtIE1hdWVyZmFsbCAod2lyIGFuYWx5c2llcmVuIERhdGVuIGF1cyAyMDE3KSBlaW5lbiBkZXV0bGljaGVuIFVudGVyc2NoaWVkIGF1ZiBMYW5ka3JlaXNlYmVuZSB6d2lzY2hlbiBkZW0gZWhlbWFsaWdlbiBPc3RkZXV0c2NobGFuZCB1bmQgV2VzdGRldXRzY2hsYW5kLiBKZWRvY2ggc2luZCBkaWUgVW50ZXJzY2hpZWRlIGluIGRlbiBBcmJlaXRzbG9zZW5xdW90ZW4gbmljaHQgbnVyIHp3aXNjaGVuIE9zdC0gdW5kIFdlc3RkZXV0c2NobGFuZCBlcmtlbm5iYXIsIHNvbmRlcm4gZXMgZ2lidCBhdWNoIGVpbmlnZSBMYW5ka3JlaXNlIGluIFdlc3RkZXV0c2NobGFuZCwgd2llIHouQi4gaW0gU2FhcmxhbmQgb2RlciBOb3JkcmhlaW4tV2VzdGZhbGVuLCB3ZWxjaGUgZWluZSByZWNodCBob2hlIEFyYmVpdHNsb3NlbnF1b3RlIGF1ZndlaXNlbi4gRHVyY2ggZGllIEFuYWx5c2UgZGVyIEtvcnJlbGF0aW9uIGRlciB1bnRlcnNjaGllZGxpY2hlbiBWYXJpYWJsZW4ga29ubnRlbiB3aXIgaW5zYmVzb25kZXJlIHp3aXNjaGVuIGRlciBBcmJlaXRzbG9zZW5xdW90ZSB1bmQgZGVtIEFudGVpbCBkZXIgU2NodWxkZW4gYW0gQklQIGVpbmVuIHBvc2l0aXZlbiBadXNhbW1lbmhhbmcgZmVzdHN0ZWxsZW4uCgpJbSBsZXR6dGVuIFRlaWwgZGVyIENhc2UgU3R1ZHkgd29sbGVuIHdpciBtaXR0ZWxzIGxpbmVhcmVyIFJlZ3Jlc3Npb24gZWluIHRpZWZncmVpZmVuZGVzIFZlcnN0w6RuZG5pcyB2b24gZGVuIG3DtmdsaWNoZW4gRWluZmx1c3NmYWt0b3JlbiBhdWYgZGllIEFyYmVpdHNsb3NlbnF1b3RlIGVyaGFsdGVuLgoKIyDDnGJ1bmdzYXVmZ2FiZW4KCkltIGVyc3RlbiBUZWlsIGRlciBDYXNlIFN0dWR5IGhhdHRlbiBTaWUgc2ljaCBub2NoIGRpZSBkdXJjaHNjaG5pdHRsaWNoZW4gRWlua29tbWVuIGF1ZiBMYW5ka3JlaXNlYmVuZSBpbiBSIGVpbmdlbGVzZW4uIE51biBzb2xsdGVuIFNpZSBkaWVzZSBUYWJlbGxlIGRlc2tyaXB0aXYgYW5hbHlzaWVyZW46CgotIEVyc3RlbGxlbiBTaWUgZWluZSBkZXNrcmlwdGl2ZSBUYWJlbGxlLCB3ZWxjaGUgZGFzIEVpbmtvbW1lbiBmw7xyIGRhcyBKYWhyIDIwMTcgZGFyc3RlbGx0LiBXaWUgaXN0IGhpZXIgZGllIFZlcnRlaWx1bmcgZGVyIEVpbmtvbW1lbj8KICAtIEJlc2NocmVpYmVuIFNpZSBNaXR0ZWx3ZXJ0LCBTdGFuZGFyZGFid2VpY2h1bmcsIHNvd2llIE1lZGlhbgotIEVyc3RlbGxlbiBTaWUgZWluIExpbmllbmRpYWdyYW1tIHp1IGRlciBFbnR3aWNrbHVuZyBkZXMgRWlua29tbWVuc25pdmVhdXMgaW4gZGVuIGVpbnplbG5lbiBMYW5ka3JlaXNlbiBzZWl0IDIwMDAuIFNpZSBrw7ZubmVuIHNpY2ggaGllcmJlaSBhbiBkZW0gRGlhZ3JhbW0genVtIEJJUCBwcm8gS29wZiBvcmllbnRpZXJlbi4KICAtIEhpbndlaXM6IE1lcmdlbiBTaWUgenUgZGVtIERhdGVuc2F0eiAiRWlua29tbWVuIiB6dWVyc3Qgbm9jaCBkaWUgSW5mb3JtYXRpb24genUgIkxhbmRrcmVpc19uYW1lLCBCdW5kZXNsYW5kX25hbWUgdW5kIG9zdF9uYW1lIiBoaW56dSAoc2llaGUgYXVjaCBoaWVyenUgW2RpZXNlbiBBYnNjaG5pdHRdKCNicnV0dG9pbmxhbmRzcHJvZHVrdC1wcm8ta29wZikpCi0gRXJzdGVsbGVuIFNpZSBlaW5lIEthcnRlIHp1bSBFaW5rb21tZW5zbml2ZWF1IGRlciBlaW56ZWxuZW4gTGFuZGtyZWlzZS4gU2llIGvDtm5uZW4gc2ljaCBoaWVyYmVpIGFuIGRlciBLYXJ0ZSB6dXIgVmVyc2NodWxkdW5nIG9yaWVudGllcmVuLgotIEVyc3RlbGxlbiBTaWUgZWluZSBLb3JyZWxhdGlvbnN0YWJsbGUgendpc2NoZW4gQXJiZWl0c2xvc2VucXVvdGUsIEFudGVpbCBTY2h1bGRlbiwgQklQIHBybyBLb3BmIHVuZCBFaW5rb21tZW4uIFNpZSBrw7ZubmVuIHNpY2ggaGllcmJlaSBhbiBkZXIgW1RhYmVsbGUgZGVyIEtvcnJsZWF0aW9uZW4gYXVzIGRpZXNlbSBBYnNjaG5pdHRdKCNpbnRlcnByZXRhdGlvbi1kZXIta29ycmVsYXRpb24pIG9yaWVudGllcmVuLgoKIyBXZWl0ZXJlIFF1ZWxsZW46CgotIFtEYXRhIHRvIFZpel0oaHR0cHM6Ly93d3cuZGF0YS10by12aXouY29tLykKLSBbQSBnZ3Bsb3QyIFR1dG9yaWFsIGZvciBCZWF1dGlmdWwgUGxvdHRpbmcgaW4gUl0oaHR0cHM6Ly9jZWRyaWNzY2hlcmVyLm5ldGxpZnkuY29tLzIwMTkvMDgvMDUvYS1nZ3Bsb3QyLXR1dG9yaWFsLWZvci1iZWF1dGlmdWwtcGxvdHRpbmctaW4tci8pCi0gW1RoZSBFdm9sdXRpb24gb2YgYSBnZ3Bsb3RdKGh0dHBzOi8vY2Vkcmljc2NoZXJlci5uZXRsaWZ5LmNvbS8yMDE5LzA1LzE3L3RoZS1ldm9sdXRpb24tb2YtYS1nZ3Bsb3QtZXAuLTEvKQotIFtTd2l0emVybGFuZCdzIHJlZ2lvbmFsIGluY29tZSAoaW4tKWVxdWFsaXR5XShodHRwczovL3RpbW9ncm9zc2VuYmFjaGVyLmNoLzIwMTkvMDQvYml2YXJpYXRlLW1hcHMtd2l0aC1nZ3Bsb3QyLWFuZC1zZi8pCg==