Packages

library(tidyverse)
── Attaching packages ────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.2.0     ✔ purrr   0.3.2
✔ tibble  2.1.3     ✔ dplyr   0.8.1
✔ tidyr   0.8.3     ✔ stringr 1.4.0
✔ readr   1.3.1     ✔ forcats 0.4.0
── Conflicts ───────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(xtable)
library(readxl)

variances

d2011 <- read.table("../data-raw/popyt-2011", header = F, sep  = ";", dec = ",", stringsAsFactors = F) %>%
  select(sekcja = V1, prec = V3) %>%
  mutate(rok = 2011)

d2013 <- read_excel("../data-raw/PW_popyt_na_prace_w_2013.xls", col_names = F, skip = 31) %>%
  na.omit() %>%
  mutate(sekcja = d2011$sekcja) %>%
  select(sekcja, prec = 3)%>%
  mutate(rok = 2013)
  
d2014 <- read_excel("../data-raw/popyt_na_prace_2014.xls", col_names = F, skip = 31) %>%
  na.omit() %>%
  mutate(sekcja = d2011$sekcja) %>%
  select(sekcja, prec = 3) %>%
  mutate(rok = 2014)

precs <- bind_rows(d2011,d2013, d2014)

precs %>% 
  spread(rok, prec) %>%
  add_row(sekcja = "overall", `2011` = 3.40, `2013` = 4.01, `2014` = 3.98, .before = 1) %>%
  xtable(caption = "Estimates on relative standard erros of estimators for vacancies of the demand for labour in IV quarter 2011, 2013 and 2014",
         label = "tab-rel-var") %>%
  print.xtable(include.rownames = F,
               caption.placement = "top")

Read the data

res_cmcgreg1 <- readRDS(file = "../results/res_glm_kod2.rds")
Error: vector memory exhausted (limit reached?)
totals %>%
  count(b, rok, wt= hat_wolne) %>%
  group_by(rok) %>%
  summarise(m = round(mean(n))) %>%
  spread(rok, m) %>%
  xtable(digits = 0, caption = "Estimated total number of vacancies at the end of 1Q based on the DL survey") %>%
  print.xtable(include.rownames = F, caption.placement = "top")
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Sat Jul 27 09:19:44 2019
\begin{table}[ht]
\centering
\caption{Estimated total number of vacancies at the end of 1Q based on the DL survey} 
\begin{tabular}{rrr}
  \hline
2011 & 2013 & 2014 \\ 
  \hline
71775 & 42889 & 52725 \\ 
   \hline
\end{tabular}
\end{table}
totals %>%
  count(b, rok, kod2, wt = hat_wolne) %>%
  add_count(b, rok, wt = n, name = "total") %>%
  mutate(p = n / total*100) %>%
  group_by(kod2) %>%
  summarise(pop = mean(p)) %>%
  left_join(
    final_data %>%
      count(rok, kod2) %>%
      add_count(rok, wt = n, name = "total") %>%
      mutate(p = n / total*100) %>%
      group_by(kod2) %>%
      summarise(bkl = mean(p))
  )  %>%
  xtable(digits = 2,
         caption = "Distribution of occupancy (2 digit codes) in Population and BKL data (average over 2011, 2013 and 2014)") %>%
  print.xtable(caption.placement = "top", include.rownames = F)
Joining, by = "kod2"
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Fri Jul 26 23:42:04 2019
\begin{table}[ht]
\centering
\caption{Distribution of occupancy (2 digit codes) in Population and BKL data (average over 2011, 2013 and 2014)} 
\begin{tabular}{lrr}
  \hline
kod2 & pop & bkl \\ 
  \hline
11 & 0.49 & 1.68 \\ 
  12 & 1.70 & 2.22 \\ 
  13 & 1.27 & 2.02 \\ 
  14 & 0.29 & 2.78 \\ 
  21 & 4.45 & 4.09 \\ 
  22 & 3.33 & 1.47 \\ 
  23 & 0.91 & 2.00 \\ 
  24 & 6.73 & 14.65 \\ 
  25 & 3.94 & 8.17 \\ 
  26 & 0.71 & 0.91 \\ 
  31 & 1.51 & 1.50 \\ 
  32 & 0.79 & 0.58 \\ 
  33 & 4.37 & 19.33 \\ 
  34 & 0.97 & 0.53 \\ 
  35 & 1.73 & 0.78 \\ 
  41 & 1.41 & 1.82 \\ 
  42 & 5.20 & 2.53 \\ 
  43 & 1.28 & 1.46 \\ 
  44 & 2.52 & 0.51 \\ 
  51 & 2.41 & 3.10 \\ 
  52 & 8.79 & 16.49 \\ 
  54 & 1.28 & 1.16 \\ 
  71 & 9.53 & 1.71 \\ 
  72 & 7.09 & 2.36 \\ 
  73 & 0.72 & 0.25 \\ 
  74 & 2.09 & 1.23 \\ 
  75 & 5.64 & 1.18 \\ 
  81 & 2.71 & 0.35 \\ 
  82 & 2.72 & 0.21 \\ 
  83 & 7.99 & 1.67 \\ 
  91 & 1.35 & 0.19 \\ 
  93 & 2.20 & 0.49 \\ 
  94 & 1.26 & 0.26 \\ 
  96 & 0.60 & 0.31 \\ 
   \hline
\end{tabular}
\end{table}
totals %>%
  group_by(rok, b, kod2) %>%
  summarise(N = sum(p*hat_wolne)) %>%
  group_by(rok, kod2) %>%
  summarise(cv = sd(N)/mean(N)*100,
            m = mean(N)) %>%
  group_by(kod2) %>%
  summarise(cv = mean(cv)) %>%
  xtable()
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Fri Jul 26 22:52:13 2019
\begin{table}[ht]
\centering
\begin{tabular}{rlr}
  \hline
 & kod2 & cv \\ 
  \hline
1 & 11 & 4.50 \\ 
  2 & 12 & 4.53 \\ 
  3 & 13 & 9.56 \\ 
  4 & 14 & 11.84 \\ 
  5 & 21 & 4.64 \\ 
  6 & 22 & 6.45 \\ 
  7 & 23 & 10.75 \\ 
  8 & 24 & 3.74 \\ 
  9 & 25 & 8.10 \\ 
  10 & 26 & 5.54 \\ 
  11 & 31 & 6.03 \\ 
  12 & 32 & 6.31 \\ 
  13 & 33 & 3.67 \\ 
  14 & 34 & 5.66 \\ 
  15 & 35 & 6.73 \\ 
  16 & 41 & 2.90 \\ 
  17 & 42 & 6.70 \\ 
  18 & 43 & 6.63 \\ 
  19 & 44 & 4.09 \\ 
  20 & 51 & 16.14 \\ 
  21 & 52 & 15.35 \\ 
  22 & 54 & 13.77 \\ 
  23 & 71 & 17.09 \\ 
  24 & 72 & 5.27 \\ 
  25 & 73 & 5.76 \\ 
  26 & 74 & 13.99 \\ 
  27 & 75 & 5.35 \\ 
  28 & 81 & 5.19 \\ 
  29 & 82 & 6.27 \\ 
  30 & 83 & 9.23 \\ 
  31 & 91 & 10.09 \\ 
  32 & 93 & 8.52 \\ 
  33 & 94 & 19.34 \\ 
  34 & 96 & 5.41 \\ 
   \hline
\end{tabular}
\end{table}

Change format of the data

res_calib_t <- transpose(res_calib)
res_lasso1_t <- transpose(res_lasso1)
res_lasso2_t <- transpose(res_lasso2)
res_alasso1_t <- transpose(res_alasso1)
res_cmcgreg1_t <- transpose(res_cmcgreg1)

res_cmcgreg1_t <- readRDS("../results/res_cmcgreg1_wynik_est.rds")
results <- bind_rows(wyn_naive,
                     wyn_calib_kod2, 
                     wyn_lasso1_kod2, 
                     wyn_lasso2_kod2,
                     wyn_alasso1_kod2,
                     wyn_ecmc_kod2) %>%
  mutate(komp = case_when(komp == "komp_kulturalne" ~ "Artistic",
                          komp == "komp_dyspozycyjne"~ "Availability",
                          komp == "komp_kognitywne" ~ "Cognitive",
                          komp == "komp_komputerowe" ~ "Computer",
                          komp == "komp_interpersonalne" ~ "Interpersonal",
                          komp == "komp_kierownicze" ~ "Managerial",
                          komp == "komp_matematyczne" ~ "Mathematical",
                          komp == "komp_biurowe" ~ "Office",
                          komp == "komp_fizyczne" ~ "Physical",
                          komp == "komp_indywidualne" ~ "Self-organization",
                          komp == "komp_techniczne"  ~ "Technical")) 
results %>%
  group_by(komp, estim) %>%
  summarise(m = mean(m)*100) %>%
  spread(estim, m) %>%
  select(comp = komp, naive, greg, ecmc, lasso1, lasso2, alasso1) %>%
  xtable(digits = 1, 
         caption = "Point estimates of fraction of skills for the pooled sample for 2011, 2013 and 2014",
         label = "tab-results-pool")  %>%
  print.xtable(include.rownames = F,
               caption.placement = "top")
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Fri Jul 26 22:11:46 2019
\begin{table}[ht]
\centering
\caption{Point estimates of fraction of skills for the pooled sample for 2011, 2013 and 2014} 
\label{tab-results-pool}
\begin{tabular}{lrrrrrr}
  \hline
comp & naive & greg & ecmc & lasso1 & lasso2 & alasso1 \\ 
  \hline
Artistic & 15.8 & 12.3 & 12.4 & 12.5 & 13.0 & 12.5 \\ 
  Availability & 20.9 & 19.8 & 19.7 & 19.6 & 21.5 & 19.5 \\ 
  Cognitive & 20.9 & 14.3 & 14.3 & 14.6 & 14.0 & 14.6 \\ 
  Computer & 33.0 & 22.2 & 22.0 & 22.3 & 23.0 & 22.6 \\ 
  Interpersonal & 53.8 & 34.5 & 34.5 & 35.1 & 35.0 & 34.9 \\ 
  Managerial & 26.2 & 16.7 & 16.5 & 16.8 & 17.7 & 16.8 \\ 
  Mathematical & 0.4 & 0.4 & 0.4 & 0.4 & 0.4 & 0.4 \\ 
  Office & 3.9 & 3.1 & 3.1 & 3.2 & 3.4 & 3.2 \\ 
  Physical & 5.4 & 7.4 & 7.6 & 7.5 & 8.2 & 7.6 \\ 
  Self-organization & 58.6 & 43.8 & 43.5 & 43.9 & 46.2 & 43.8 \\ 
  Technical & 4.3 & 7.5 & 7.7 & 7.7 & 8.3 & 7.7 \\ 
   \hline
\end{tabular}
\end{table}
results %>%
  group_by(komp, estim) %>%
  summarise(m = sd(m)/mean(m)*100) %>%
  spread(estim, m) %>%
  select(comp = komp, greg, ecmc, lasso1, lasso2, alasso1) %>%
  xtable(digits = 1, 
         caption = "Average estimates of relative standard errors for skills for over 2011, 2013 and 2014",
         label = "tab-results-pool")  %>%
  print.xtable(include.rownames = F,
               caption.placement = "top")
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Fri Jul 26 22:12:57 2019
\begin{table}[ht]
\centering
\caption{Average estimates of relative standard errors for skills for over 2011, 2013 and 2014} 
\label{tab-results-pool}
\begin{tabular}{lrrrrr}
  \hline
comp & greg & ecmc & lasso1 & lasso2 & alasso1 \\ 
  \hline
Artistic & 11.1 & 3.5 & 3.4 & 3.4 & 3.4 \\ 
  Availability & 22.0 & 1.0 & 0.9 & 1.5 & 1.0 \\ 
  Cognitive & 25.4 & 8.5 & 8.1 & 9.3 & 8.2 \\ 
  Computer & 24.9 & 12.9 & 12.4 & 12.7 & 12.4 \\ 
  Interpersonal & 17.6 & 6.6 & 6.3 & 6.6 & 6.4 \\ 
  Managerial & 15.3 & 5.6 & 5.3 & 5.5 & 5.4 \\ 
  Mathematical & 15.6 & 4.1 & 4.0 & 3.2 & 4.1 \\ 
  Office & 33.5 & 4.7 & 4.4 & 4.4 & 4.6 \\ 
  Physical & 32.6 & 4.1 & 4.2 & 4.7 & 4.3 \\ 
  Self-organization & 16.7 & 3.8 & 3.6 & 3.5 & 3.6 \\ 
  Technical & 25.1 & 5.3 & 5.2 & 7.8 & 5.2 \\ 
   \hline
\end{tabular}
\end{table}
ggsave(plot = p, file = "../results/fig-estims.png", width = 13)
Saving 13 x 7 in image
results %>%
  group_by(komp, estim) %>%
  summarise(m = mean(m)) %>%
  group_by(estim) %>%
  mutate(r = 12- rank(m, ties.method = "average")) %>%
  select(-m) %>%
  spread(estim, r) %>%
  arrange(naive) %>%
  select(komp, naive, greg:lasso2)

AUC

data.frame(lasso1 = do.call('cbind',auc_lasso1) %>% apply(., 2, mean),
           lasso2 = do.call('cbind',auc_lasso2) %>% apply(., 2, mean),
           alasso1 = do.call('cbind',auc_alasso1) %>% apply(., 2, mean),
           komp = komps)%>%
  mutate(komp = case_when(komp == "komp_kulturalne" ~ "Artistic",
                          komp == "komp_dyspozycyjne"~ "Availability",
                          komp == "komp_kognitywne" ~ "Cognitive",
                          komp == "komp_komputerowe" ~ "Computer",
                          komp == "komp_interpersonalne" ~ "Interpersonal",
                          komp == "komp_kierownicze" ~ "Managerial",
                          komp == "komp_matematyczne" ~ "Mathematical",
                          komp == "komp_biurowe" ~ "Office",
                          komp == "komp_fizyczne" ~ "Physical",
                          komp == "komp_indywidualne" ~ "Self-organization",
                          komp == "komp_techniczne"  ~ "Technical"))  %>%
  select(komp, lasso1, lasso2,alasso1) %>%
  xtable(digits = 3, 
         caption = "Quality of the model measured by Area Under Curve (AUC; average over 500 boostrap replicated)",
         label = "tab-estim-auc") %>%
  print.xtable(include.rownames = F,
               caption.placement = "top")
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Fri Jul 26 22:27:48 2019
\begin{table}[ht]
\centering
\caption{Quality of the model measured by Area Under Curve (AUC; average over 500 boostrap replicated)} 
\label{tab-estim-auc}
\begin{tabular}{lrrr}
  \hline
komp & lasso1 & lasso2 & alasso1 \\ 
  \hline
Technical & 0.829 & 0.846 & 0.829 \\ 
  Mathematical & 0.784 & 0.818 & 0.784 \\ 
  Artistic & 0.665 & 0.672 & 0.665 \\ 
  Computer & 0.748 & 0.755 & 0.748 \\ 
  Cognitive & 0.644 & 0.654 & 0.644 \\ 
  Managerial & 0.722 & 0.731 & 0.722 \\ 
  Interpersonal & 0.731 & 0.750 & 0.731 \\ 
  Self-organization & 0.695 & 0.708 & 0.695 \\ 
  Physical & 0.687 & 0.713 & 0.687 \\ 
  Availability & 0.605 & 0.635 & 0.604 \\ 
  Office & 0.671 & 0.681 & 0.670 \\ 
   \hline
\end{tabular}
\end{table}
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKUGFja2FnZXMKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh4dGFibGUpCmxpYnJhcnkocmVhZHhsKQpgYGAKCgojIHZhcmlhbmNlcwoKYGBge3J9CmQyMDExIDwtIHJlYWQudGFibGUoIi4uL2RhdGEtcmF3L3BvcHl0LTIwMTEiLCBoZWFkZXIgPSBGLCBzZXAgID0gIjsiLCBkZWMgPSAiLCIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGKSAlPiUKICBzZWxlY3Qoc2VrY2phID0gVjEsIHByZWMgPSBWMykgJT4lCiAgbXV0YXRlKHJvayA9IDIwMTEpCgpkMjAxMyA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhLXJhdy9QV19wb3B5dF9uYV9wcmFjZV93XzIwMTMueGxzIiwgY29sX25hbWVzID0gRiwgc2tpcCA9IDMxKSAlPiUKICBuYS5vbWl0KCkgJT4lCiAgbXV0YXRlKHNla2NqYSA9IGQyMDExJHNla2NqYSkgJT4lCiAgc2VsZWN0KHNla2NqYSwgcHJlYyA9IDMpJT4lCiAgbXV0YXRlKHJvayA9IDIwMTMpCiAgCmQyMDE0IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEtcmF3L3BvcHl0X25hX3ByYWNlXzIwMTQueGxzIiwgY29sX25hbWVzID0gRiwgc2tpcCA9IDMxKSAlPiUKICBuYS5vbWl0KCkgJT4lCiAgbXV0YXRlKHNla2NqYSA9IGQyMDExJHNla2NqYSkgJT4lCiAgc2VsZWN0KHNla2NqYSwgcHJlYyA9IDMpICU+JQogIG11dGF0ZShyb2sgPSAyMDE0KQoKcHJlY3MgPC0gYmluZF9yb3dzKGQyMDExLGQyMDEzLCBkMjAxNCkKCnByZWNzICU+JSAKICBzcHJlYWQocm9rLCBwcmVjKSAlPiUKICBhZGRfcm93KHNla2NqYSA9ICJvdmVyYWxsIiwgYDIwMTFgID0gMy40MCwgYDIwMTNgID0gNC4wMSwgYDIwMTRgID0gMy45OCwgLmJlZm9yZSA9IDEpICU+JQogIHh0YWJsZShjYXB0aW9uID0gIkVzdGltYXRlcyBvbiByZWxhdGl2ZSBzdGFuZGFyZCBlcnJvcyBvZiBlc3RpbWF0b3JzIGZvciB2YWNhbmNpZXMgb2YgdGhlIGRlbWFuZCBmb3IgbGFib3VyIGluIElWIHF1YXJ0ZXIgMjAxMSwgMjAxMyBhbmQgMjAxNCIsCiAgICAgICAgIGxhYmVsID0gInRhYi1yZWwtdmFyIikgJT4lCiAgcHJpbnQueHRhYmxlKGluY2x1ZGUucm93bmFtZXMgPSBGLAogICAgICAgICAgICAgICBjYXB0aW9uLnBsYWNlbWVudCA9ICJ0b3AiKQpgYGAKClJlYWQgdGhlIGRhdGEKCmBgYHtyfQpyZXNfY2FsaWIgPC0gcmVhZFJEUyhmaWxlID0gIi4uL3Jlc3VsdHMvcmVzX2NhbGliLnJkcyIpCnJlc19sYXNzbzEgPC0gcmVhZFJEUyhmaWxlID0gIi4uL3Jlc3VsdHMvcmVzX2xhc3NvX2tvZDIucmRzIikKcmVzX2xhc3NvMiA8LSByZWFkUkRTKGZpbGUgPSAiLi4vcmVzdWx0cy9yZXNfbGFzc29fa29kMl9uYWNlLnJkcyIpCnJlc19hbGFzc28xIDwtIHJlYWRSRFMoZmlsZSA9ICIuLi9yZXN1bHRzL3Jlc19hbGFzc29fa29kMi5yZHMiKQojcmVzX2NtY2dyZWcxIDwtIHJlYWRSRFMoZmlsZSA9ICIuLi9yZXN1bHRzL3Jlc19nbG1fa29kMi5yZHMiKQpgYGAKCmBgYHtyfQoKCnRvdGFscyA8LSByZWFkUkRTKCIuLi9kYXRhL2d1cy13b2otc2VrLWJvb3QtdG90YWxzLnJkcyIpICU+JQogIGZpbHRlcihzdWJzdHIoa29kMiwxLDEpICE9IDYpICU+JQogIG11dGF0ZShrb2QyID0gaWZlbHNlKGtvZDIgPT0gOTUsIDk2LCBrb2QyKSwKICAgICAgICAga29kMiA9IGlmZWxzZShrb2QyID09IDkyLCA5MSwga29kMiksCiAgICAgICAgIGtvZDIgPSBpZmVsc2Uoa29kMiA9PSA1MywgNTQsIGtvZDIpLAogICAgICAgICAja29kMSA9IGFzLmNoYXJhY3Rlcihrb2QxKSwKICAgICAgICAga29kMiA9IGFzLmNoYXJhY3Rlcihrb2QyKSwKICAgICAgICAgcm9rID0gYXMuY2hhcmFjdGVyKHJvaykpIAoKZmluYWxfZGF0YSA8LSByZWFkUkRTKCIuLi9kYXRhL2JrbC1maW5hbC5yZHMiKSAlPiUKICBmaWx0ZXIoemF3b2QxICE9IDYsIHJvayE9MjAxMiwgbmFjZSAlaW4lIHVuaXF1ZSh0b3RhbHMkc2VrY2phKSkgJT4lCiAgbXV0YXRlKHphd29kMiA9IGlmZWxzZSh6YXdvZDIgPT0gOTUsIDk2LCB6YXdvZDIpLAogICAgICAgICB6YXdvZDIgPSBpZmVsc2UoemF3b2QyID09IDkyLCA5MSwgemF3b2QyKSwKICAgICAgICAgemF3b2QyID0gaWZlbHNlKHphd29kMiA9PSA5OSwgOTYsIHphd29kMiksCiAgICAgICAgIHphd29kMiA9IGlmZWxzZSh6YXdvZDIgPT0gNTMsIDU0LCB6YXdvZDIpLAogICAgICAgICB6ZXJvcyA9IHN0cl9leHRyYWN0KHphd29kNiwgIjArJCIpLAogICAgICAgICB6ZXJvcyA9IHN0cl9jb3VudCh6ZXJvcywgIjAiKSwKICAgICAgICAgemVyb3MgPSBpZmVsc2UoaXMubmEoemVyb3MpLCA2LCA2LXplcm9zKSwKICAgICAgICAgcm9rID0gYXMuY2hhcmFjdGVyKHJvaykpICU+JQogIHJlbmFtZShrb2QxID0gemF3b2QxLAogICAgICAgICBrb2QyID0gemF3b2QyLAogICAgICAgICBrb2Q2ID0gemF3b2Q2LAogICAgICAgICBzZWtjamEgPSBuYWNlKSAgJT4lCiAgZmlsdGVyKHplcm9zID4gMSkgICMjIDEzOCByZWNvcmRzCgpgYGAKCmBgYHtyfQpmaW5hbF9kYXRhICU+JQogIGNvdW50KHplcm9zKQpgYGAKCmBgYHtyfQp0b3RhbHMgJT4lCiAgY291bnQoYiwgcm9rLCB3dD0gaGF0X3dvbG5lKSAlPiUKICBncm91cF9ieShyb2spICU+JQogIHN1bW1hcmlzZShtID0gcm91bmQobWVhbihuKSkpICU+JQogIHNwcmVhZChyb2ssIG0pICU+JQogIHh0YWJsZShkaWdpdHMgPSAwLCBjYXB0aW9uID0gIkVzdGltYXRlZCB0b3RhbCBudW1iZXIgb2YgdmFjYW5jaWVzIGF0IHRoZSBlbmQgb2YgMVEgYmFzZWQgb24gdGhlIERMIHN1cnZleSIpICU+JQogIHByaW50Lnh0YWJsZShpbmNsdWRlLnJvd25hbWVzID0gRiwgY2FwdGlvbi5wbGFjZW1lbnQgPSAidG9wIikKYGBgCgpgYGB7cn0KdG90YWxzICU+JQogIGNvdW50KGIsIHJvaywga29kMiwgd3QgPSBoYXRfd29sbmUpICU+JQogIGFkZF9jb3VudChiLCByb2ssIHd0ID0gbiwgbmFtZSA9ICJ0b3RhbCIpICU+JQogIG11dGF0ZShwID0gbiAvIHRvdGFsKjEwMCkgJT4lCiAgZ3JvdXBfYnkoa29kMikgJT4lCiAgc3VtbWFyaXNlKHBvcCA9IG1lYW4ocCkpICU+JQogIGxlZnRfam9pbigKICAgIGZpbmFsX2RhdGEgJT4lCiAgICAgIGNvdW50KHJvaywga29kMikgJT4lCiAgICAgIGFkZF9jb3VudChyb2ssIHd0ID0gbiwgbmFtZSA9ICJ0b3RhbCIpICU+JQogICAgICBtdXRhdGUocCA9IG4gLyB0b3RhbCoxMDApICU+JQogICAgICBncm91cF9ieShrb2QyKSAlPiUKICAgICAgc3VtbWFyaXNlKGJrbCA9IG1lYW4ocCkpCiAgKSAgJT4lCiAgeHRhYmxlKGRpZ2l0cyA9IDIsCiAgICAgICAgIGNhcHRpb24gPSAiRGlzdHJpYnV0aW9uIG9mIG9jY3VwYW5jeSAoMiBkaWdpdCBjb2RlcykgaW4gUG9wdWxhdGlvbiBhbmQgQktMIGRhdGEgKGF2ZXJhZ2Ugb3ZlciAyMDExLCAyMDEzIGFuZCAyMDE0KSIpICU+JQogIHByaW50Lnh0YWJsZShjYXB0aW9uLnBsYWNlbWVudCA9ICJ0b3AiLCBpbmNsdWRlLnJvd25hbWVzID0gRikKYGBgCgoKYGBge3J9CnRvdGFscyAlPiUKICBncm91cF9ieShyb2ssIGIsIGtvZDIpICU+JQogIHN1bW1hcmlzZShOID0gc3VtKHAqaGF0X3dvbG5lKSkgJT4lCiAgZ3JvdXBfYnkocm9rLCBrb2QyKSAlPiUKICBzdW1tYXJpc2UoY3YgPSBzZChOKS9tZWFuKE4pKjEwMCwKICAgICAgICAgICAgbSA9IG1lYW4oTikpICU+JQogIGdyb3VwX2J5KHJvaykgJT4lCiAgZG8obSA9IGJyb29tOjp0aWR5KHN1bW1hcnkoLiRjdikpKSAlPiUKICB1bm5lc3QoKSAlPiUKICB4dGFibGUoY2FwdGlvbiA9ICJFc3RpbWF0ZXMgb24gcmVsYXRpdmUgc3RhbmRhcmQgZXJyb3Mgb2YgZXN0aW1hdG9ycyBmb3IgdmFjYW5jaWVzIGJ5IAogICAgICAgICBvY2N1cGF0aW9uICgyIGRpZ2l0IGNvZGUpIGluIElWIHF1YXJ0ZXIgMjAxMSwgMjAxMyBhbmQgMjAxNCIsIAogICAgICAgICBsYWJlbCA9ICJ0YWItb2NjdXAtdmFyIikgJT4lCiAgcHJpbnQueHRhYmxlKGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIsCiAgICAgICAgICAgICAgIGluY2x1ZGUucm93bmFtZXMgPSBGKQoKdG90YWxzICU+JQogIGdyb3VwX2J5KHJvaywgYiwga29kMikgJT4lCiAgc3VtbWFyaXNlKE4gPSBzdW0ocCpoYXRfd29sbmUpKSAlPiUKICBncm91cF9ieShyb2ssIGtvZDIpICU+JQogIHN1bW1hcmlzZShjdiA9IHNkKE4pL21lYW4oTikqMTAwLAogICAgICAgICAgICBtID0gbWVhbihOKSkgJT4lCiAgZ3JvdXBfYnkoa29kMikgJT4lCiAgc3VtbWFyaXNlKGN2ID0gbWVhbihjdikpICU+JQogIHh0YWJsZSgpCmBgYAoKQ2hhbmdlIGZvcm1hdCBvZiB0aGUgZGF0YQoKYGBge3J9CnJlc19jYWxpYl90IDwtIHRyYW5zcG9zZShyZXNfY2FsaWIpCnJlc19sYXNzbzFfdCA8LSB0cmFuc3Bvc2UocmVzX2xhc3NvMSkKcmVzX2xhc3NvMl90IDwtIHRyYW5zcG9zZShyZXNfbGFzc28yKQpyZXNfYWxhc3NvMV90IDwtIHRyYW5zcG9zZShyZXNfYWxhc3NvMSkKcmVzX2NtY2dyZWcxX3QgPC0gdHJhbnNwb3NlKHJlc19jbWNncmVnMSkKCnJlc19jbWNncmVnMV90IDwtIHJlYWRSRFMoIi4uL3Jlc3VsdHMvcmVzX2NtY2dyZWcxX3d5bmlrX2VzdC5yZHMiKQpgYGAKCmBgYHtyfQpyZXNfY2FsaWJfdCRjYWxpYl9rb2QyICU+JQogIGJpbmRfcm93cyguaWQgPSAiYm9vdCIpICU+JQogIGdhdGhlcihrb21wLCB2YWxzLCBrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSAlPiUKICBhcnJhbmdlKGtvbXAsIGJvb3QpICU+JQogIGdyb3VwX2J5KGtvbXAsIHJvaykgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHZhbHMpLAogICAgICAgICAgICBiaWFzID0gbWVhbih2YWxzIC0gbWVhbih2YWxzKSksCiAgICAgICAgICAgIHNkID0gc2QodmFscyksCiAgICAgICAgICAgIHJtc2UgPSBzZF4yICsgYmlhc14yLAogICAgICAgICAgICBjdiA9IHNxcnQocm1zZSkvbSoxMDAsCiAgICAgICAgICAgIHEwMjUgPSBxdWFudGlsZSh2YWxzLDAuMDI1KSwKICAgICAgICAgICAgcTk3NSA9IHF1YW50aWxlKHZhbHMsMC45NzUpLAogICAgICAgICAgICBlc3RpbSA9ICJncmVnIikgLT4gd3luX2NhbGliX2tvZDIKCgpyZXNfbGFzc28xX3Qkd3luaWtfZXN0ICU+JQogIGJpbmRfcm93cyguaWQgPSAiYm9vdCIpICU+JQogIGdhdGhlcihrb21wLCB2YWxzLCBrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSAlPiUgCiAgbXV0YXRlKHZhbHMgPSBhcy5udW1lcmljKHZhbHMpKSAlPiUKICBhcnJhbmdlKGtvbXAsIGJvb3QpICU+JQogIGdyb3VwX2J5KGtvbXAsIHJvaykgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHZhbHMpLAogICAgICAgICAgICBiaWFzID0gbWVhbih2YWxzIC0gbWVhbih2YWxzKSksCiAgICAgICAgICAgIHNkID0gc2QodmFscyksCiAgICAgICAgICAgIHJtc2UgPSBzZF4yICsgYmlhc14yLAogICAgICAgICAgICBjdiA9IHNxcnQocm1zZSkvbSoxMDAsCiAgICAgICAgICAgIHEwMjUgPSBxdWFudGlsZSh2YWxzLDAuMDI1KSwKICAgICAgICAgICAgcTk3NSA9IHF1YW50aWxlKHZhbHMsMC45NzUpLAogICAgICAgICAgICBlc3RpbSA9ICJsYXNzbzEiKSAtPiB3eW5fbGFzc28xX2tvZDIKCgpyZXNfbGFzc28yX3Qkd3luaWtfZXN0ICU+JQogIGJpbmRfcm93cyguaWQgPSAiYm9vdCIpICU+JQogIGdhdGhlcihrb21wLCB2YWxzLCBrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSAlPiUKICBhcnJhbmdlKGtvbXAsIGJvb3QpICU+JQogIGdyb3VwX2J5KGtvbXAsIHJvaykgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHZhbHMpLAogICAgICAgICAgICBiaWFzID0gbWVhbih2YWxzIC0gbWVhbih2YWxzKSksCiAgICAgICAgICAgIHNkID0gc2QodmFscyksCiAgICAgICAgICAgIHJtc2UgPSBzZF4yICsgYmlhc14yLAogICAgICAgICAgICBjdiA9IHNxcnQocm1zZSkvbSoxMDAsCiAgICAgICAgICAgIHEwMjUgPSBxdWFudGlsZSh2YWxzLDAuMDI1KSwKICAgICAgICAgICAgcTk3NSA9IHF1YW50aWxlKHZhbHMsMC45NzUpLAogICAgICAgICAgICBlc3RpbSA9ICJsYXNzbzIiKSAtPiB3eW5fbGFzc28yX2tvZDIKCnJlc19hbGFzc28xX3Qkd3luaWtfZXN0ICU+JQogIGJpbmRfcm93cyguaWQgPSAiYm9vdCIpICU+JQogIHNlbGVjdChib290LCByb2ssIHN0YXJ0c193aXRoKCJrb21wIikpICU+JQogIGdhdGhlcihrb21wLCB2YWxzLCBrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSAlPiUKICBhcnJhbmdlKGtvbXAsIGJvb3QpICU+JQogIGdyb3VwX2J5KGtvbXAsIHJvaykgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHZhbHMpLAogICAgICAgICAgICBiaWFzID0gbWVhbih2YWxzIC0gbWVhbih2YWxzKSksCiAgICAgICAgICAgIHNkID0gc2QodmFscyksCiAgICAgICAgICAgIHJtc2UgPSBzZF4yICsgYmlhc14yLAogICAgICAgICAgICBjdiA9IHNxcnQocm1zZSkvbSoxMDAsCiAgICAgICAgICAgIHEwMjUgPSBxdWFudGlsZSh2YWxzLDAuMDI1KSwKICAgICAgICAgICAgcTk3NSA9IHF1YW50aWxlKHZhbHMsMC45NzUpLAogICAgICAgICAgICBlc3RpbSA9ICJhbGFzc28xIikgLT4gd3luX2FsYXNzbzFfa29kMgoKcmVzX2NtY2dyZWcxX3QgJT4lCiAgYmluZF9yb3dzKC5pZCA9ICJib290IikgJT4lCiAgc2VsZWN0KGJvb3QsIHJvaywgc3RhcnRzX3dpdGgoImtvbXAiKSkgJT4lCiAgZ2F0aGVyKGtvbXAsIHZhbHMsIGtvbXBfdGVjaG5pY3puZTprb21wX2JpdXJvd2UpICU+JQogIGFycmFuZ2Uoa29tcCwgYm9vdCkgJT4lCiAgZ3JvdXBfYnkoa29tcCwgcm9rKSAlPiUKICBzdW1tYXJpc2UobSA9IG1lYW4odmFscyksCiAgICAgICAgICAgIGJpYXMgPSBtZWFuKHZhbHMgLSBtZWFuKHZhbHMpKSwKICAgICAgICAgICAgc2QgPSBzZCh2YWxzKSwKICAgICAgICAgICAgcm1zZSA9IHNkXjIgKyBiaWFzXjIsCiAgICAgICAgICAgIGN2ID0gc3FydChybXNlKS9tKjEwMCwKICAgICAgICAgICAgcTAyNSA9IHF1YW50aWxlKHZhbHMsMC4wMjUpLAogICAgICAgICAgICBxOTc1ID0gcXVhbnRpbGUodmFscywwLjk3NSksCiAgICAgICAgICAgIGVzdGltID0gImVjbWMiKSAtPiB3eW5fZWNtY19rb2QyCgpmaW5hbF9kYXRhICU+JQogIHNlbGVjdChyb2ssIGtvbXBfdGVjaG5pY3puZTprb21wX2JpdXJvd2UpICU+JQogIGdhdGhlcihrb21wLCB2YWwsIC1yb2spICU+JQogIGdyb3VwX2J5KHJvayxrb21wKSAlPiUKICBzdW1tYXJpc2UobSA9IG1lYW4odmFsKSwKICAgICAgICAgICAgZXN0aW0gPSAibmFpdmUiKSAtPiB3eW5fbmFpdmUKYGBgCgoKYGBge3J9CnJlc3VsdHMgPC0gYmluZF9yb3dzKHd5bl9uYWl2ZSwKICAgICAgICAgICAgICAgICAgICAgd3luX2NhbGliX2tvZDIsIAogICAgICAgICAgICAgICAgICAgICB3eW5fbGFzc28xX2tvZDIsIAogICAgICAgICAgICAgICAgICAgICB3eW5fbGFzc28yX2tvZDIsCiAgICAgICAgICAgICAgICAgICAgIHd5bl9hbGFzc28xX2tvZDIsCiAgICAgICAgICAgICAgICAgICAgIHd5bl9lY21jX2tvZDIpICU+JQogIG11dGF0ZShrb21wID0gY2FzZV93aGVuKGtvbXAgPT0gImtvbXBfa3VsdHVyYWxuZSIgfiAiQXJ0aXN0aWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfZHlzcG96eWN5am5lIn4gIkF2YWlsYWJpbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9rb2duaXR5d25lIiB+ICJDb2duaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfa29tcHV0ZXJvd2UiIH4gIkNvbXB1dGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX2ludGVycGVyc29uYWxuZSIgfiAiSW50ZXJwZXJzb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9raWVyb3duaWN6ZSIgfiAiTWFuYWdlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9tYXRlbWF0eWN6bmUiIH4gIk1hdGhlbWF0aWNhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9iaXVyb3dlIiB+ICJPZmZpY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfZml6eWN6bmUiIH4gIlBoeXNpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX2luZHl3aWR1YWxuZSIgfiAiU2VsZi1vcmdhbml6YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfdGVjaG5pY3puZSIgIH4gIlRlY2huaWNhbCIpKSAKYGBgCgpgYGB7cn0KcmVzdWx0cyAlPiUKICBncm91cF9ieShrb21wLCBlc3RpbSkgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKG0pKjEwMCkgJT4lCiAgc3ByZWFkKGVzdGltLCBtKSAlPiUKICBzZWxlY3QoY29tcCA9IGtvbXAsIG5haXZlLCBncmVnLCBlY21jLCBsYXNzbzEsIGxhc3NvMiwgYWxhc3NvMSkgJT4lCiAgeHRhYmxlKGRpZ2l0cyA9IDEsIAogICAgICAgICBjYXB0aW9uID0gIlBvaW50IGVzdGltYXRlcyBvZiBmcmFjdGlvbiBvZiBza2lsbHMgZm9yIHRoZSBwb29sZWQgc2FtcGxlIGZvciAyMDExLCAyMDEzIGFuZCAyMDE0IiwKICAgICAgICAgbGFiZWwgPSAidGFiLXJlc3VsdHMtcG9vbCIpICAlPiUKICBwcmludC54dGFibGUoaW5jbHVkZS5yb3duYW1lcyA9IEYsCiAgICAgICAgICAgICAgIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIpCmBgYCAKCmBgYHtyfQpyZXN1bHRzICU+JQogIGdyb3VwX2J5KGtvbXAsIGVzdGltKSAlPiUKICBzdW1tYXJpc2UobSA9IHNkKG0pL21lYW4obSkqMTAwKSAlPiUKICBzcHJlYWQoZXN0aW0sIG0pICU+JQogIHNlbGVjdChjb21wID0ga29tcCwgZ3JlZywgZWNtYywgbGFzc28xLCBsYXNzbzIsIGFsYXNzbzEpICU+JQogIHh0YWJsZShkaWdpdHMgPSAxLCAKICAgICAgICAgY2FwdGlvbiA9ICJBdmVyYWdlIGVzdGltYXRlcyBvZiByZWxhdGl2ZSBzdGFuZGFyZCBlcnJvcnMgZm9yIHNraWxscyBmb3Igb3ZlciAyMDExLCAyMDEzIGFuZCAyMDE0IiwKICAgICAgICAgbGFiZWwgPSAidGFiLXJlc3VsdHMtcG9vbCIpICAlPiUKICBwcmludC54dGFibGUoaW5jbHVkZS5yb3duYW1lcyA9IEYsCiAgICAgICAgICAgICAgIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIpCmBgYAoKYGBge3J9CnJlc3VsdHMgJT4lCiAgbXV0YXRlKGVzdGltID0gdG91cHBlcihlc3RpbSksCiAgICAgICAgIGVzdGltID0gZmFjdG9yKGVzdGltLCBjKCJOQUlWRSIsICJHUkVHIiwiRUNNQyIsICJMQVNTTzEiLCJMQVNTTzIiLCJBTEFTU08xIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGMoIkhUU1JTIiwiTUNHUkVHIiwiRUNNQyIsICJFQ0xBU1NPMSIsIkVDTEFTU08yIiwiRUNBTEFTU08xIikpKSAlPiUKICBnZ3Bsb3QoZGF0YSA9IC4sIGFlcyh4ID0gZXN0aW0sIHkgPSBtLCB5bWluID0gcTAyNSwgeW1heCA9IHE5NzUsIGNvbG9yID0gZXN0aW0sIGdyb3VwID0gZXN0aW0pKSArCiAgZ2VvbV9lcnJvcmJhcihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIodHlwZSA9ICJxdWFsIiwgcGFsZXR0ZSA9ICJTZXQxIiwgbmFtZSA9ICJFc3RpbWF0b3JzIikgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpKSArCiAgZmFjZXRfZ3JpZChyb2t+a29tcCkgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQpICsKICBsYWJzKHggPSAiRXN0aW1hdG9ycyIsIHkgPSAiUG9pbnQgZXN0aW1hdGVzIikgICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9MSwgaGp1c3Q9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSAtPiBwCgoKZ2dzYXZlKHBsb3QgPSBwLCBmaWxlID0gIi4uL3Jlc3VsdHMvZmlnLWVzdGltcy5wbmciLCB3aWR0aCA9IDEzKQoKYGBgCgpgYGB7cn0KcmVzdWx0cyAlPiUKICBtdXRhdGUoZXN0aW0gPSB0b3VwcGVyKGVzdGltKSwKICAgICAgICAgZXN0aW0gPSBmYWN0b3IoZXN0aW0sIGMoIk5BSVZFIiwgIkdSRUciLCJFQ01DIiwgIkxBU1NPMSIsIkxBU1NPMiIsIkFMQVNTTzEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgYygiSFRTUlMiLCJNQ0dSRUciLCJFQ01DIiwgIkVDTEFTU08xIiwiRUNMQVNTTzIiLCJFQ0FMQVNTTzEiKSkpICU+JQogIGdncGxvdChkYXRhID0gLiwgYWVzKHggPSByb2ssIHkgPSBtLCB5bWluID0gcTAyNSwgeW1heCA9IHE5NzUsIGNvbG9yID0gZXN0aW0sIGdyb3VwID0gZXN0aW0pKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArIAogIGZhY2V0X3dyYXAofmtvbXApICsKICBzY2FsZV9jb2xvcl9icmV3ZXIodHlwZSA9ICJxdWFsIiwgcGFsZXR0ZSA9ICJTZXQxIiwgbmFtZSA9ICJFc3RpbWF0b3JzIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUG9pbnQgZXN0aW1hdGUiKSAtPiBwCgpnZ3NhdmUocGxvdCA9IHAsIGZpbGUgPSAiLi4vcmVzdWx0cy9maWctZGlzdHMucG5nIiwgaGVpZ2h0ID0gNSkKYGBgCgpgYGB7cn0KcmVzdWx0cyAlPiUKICBncm91cF9ieShrb21wLCBlc3RpbSkgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKG0pKSAlPiUKICBncm91cF9ieShlc3RpbSkgJT4lCiAgbXV0YXRlKHIgPSAxMi0gcmFuayhtLCB0aWVzLm1ldGhvZCA9ICJhdmVyYWdlIikpICU+JQogIHNlbGVjdCgtbSkgJT4lCiAgc3ByZWFkKGVzdGltLCByKSAlPiUKICBhcnJhbmdlKG5haXZlKSAlPiUKICBzZWxlY3Qoa29tcCwgbmFpdmUsIGdyZWc6bGFzc28yKQpgYGAKCkFVQwpgYGB7cn0KCmtvbXBzIDwtIGMoImtvbXBfdGVjaG5pY3puZSIsICJrb21wX21hdGVtYXR5Y3puZSIsICJrb21wX2t1bHR1cmFsbmUiLCAia29tcF9rb21wdXRlcm93ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrb21wX2tvZ25pdHl3bmUiLCAia29tcF9raWVyb3duaWN6ZSIsICJrb21wX2ludGVycGVyc29uYWxuZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrb21wX2luZHl3aWR1YWxuZSIsICJrb21wX2Zpenljem5lIiwgImtvbXBfZHlzcG96eWN5am5lIiwgImtvbXBfYml1cm93ZSIpCgphdWNfbGFzc28xIDwtIGxpc3QoKQphdWNfbGFzc28yIDwtIGxpc3QoKQphdWNfYWxhc3NvMSA8LSBsaXN0KCkKZm9yIChpIGluIDE6MTEpIHsKICBhdWNfbGFzc28xW1tpXV0gPC0gcmVzX2xhc3NvMV90JHd5bmlrX21vZGVsICU+JQogICAgbWFwX2RibCh+LltbaV1dJG1ldHJpY3NbLltbaV1dJGJlc3QubWV0cmljLmluZGV4LF0gJT4lIG1heCgpKQogIGF1Y19sYXNzbzJbW2ldXSA8LSByZXNfbGFzc28yX3Qkd3luaWtfbW9kZWwgJT4lCiAgICBtYXBfZGJsKH4uW1tpXV0kbWV0cmljc1suW1tpXV0kYmVzdC5tZXRyaWMuaW5kZXgsXSAlPiUgbWF4KCkpCiAgYXVjX2FsYXNzbzFbW2ldXSA8LSByZXNfYWxhc3NvMV90JHd5bmlrX21vZGVsICU+JQogICAgbWFwX2RibCh+LltbaV1dJG1ldHJpY3NbLltbaV1dJGJlc3QubWV0cmljLmluZGV4LF0gJT4lIG1heCgpKQp9IAoKCmRhdGEuZnJhbWUobGFzc28xID0gZG8uY2FsbCgnY2JpbmQnLGF1Y19sYXNzbzEpICU+JSBhcHBseSguLCAyLCBtZWFuKSwKICAgICAgICAgICBsYXNzbzIgPSBkby5jYWxsKCdjYmluZCcsYXVjX2xhc3NvMikgJT4lIGFwcGx5KC4sIDIsIG1lYW4pLAogICAgICAgICAgIGFsYXNzbzEgPSBkby5jYWxsKCdjYmluZCcsYXVjX2FsYXNzbzEpICU+JSBhcHBseSguLCAyLCBtZWFuKSwKICAgICAgICAgICBrb21wID0ga29tcHMpJT4lCiAgbXV0YXRlKGtvbXAgPSBjYXNlX3doZW4oa29tcCA9PSAia29tcF9rdWx0dXJhbG5lIiB+ICJBcnRpc3RpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9keXNwb3p5Y3lqbmUifiAiQXZhaWxhYmlsaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX2tvZ25pdHl3bmUiIH4gIkNvZ25pdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9rb21wdXRlcm93ZSIgfiAiQ29tcHV0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfaW50ZXJwZXJzb25hbG5lIiB+ICJJbnRlcnBlcnNvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX2tpZXJvd25pY3plIiB+ICJNYW5hZ2VyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX21hdGVtYXR5Y3puZSIgfiAiTWF0aGVtYXRpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX2JpdXJvd2UiIH4gIk9mZmljZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9maXp5Y3puZSIgfiAiUGh5c2ljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfaW5keXdpZHVhbG5lIiB+ICJTZWxmLW9yZ2FuaXphdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF90ZWNobmljem5lIiAgfiAiVGVjaG5pY2FsIikpICAlPiUKICBzZWxlY3Qoa29tcCwgbGFzc28xLCBsYXNzbzIsYWxhc3NvMSkgJT4lCiAgeHRhYmxlKGRpZ2l0cyA9IDMsIAogICAgICAgICBjYXB0aW9uID0gIlF1YWxpdHkgb2YgdGhlIG1vZGVsIG1lYXN1cmVkIGJ5IEFyZWEgVW5kZXIgQ3VydmUgKEFVQzsgYXZlcmFnZSBvdmVyIDUwMCBib29zdHJhcCByZXBsaWNhdGVkKSIsCiAgICAgICAgIGxhYmVsID0gInRhYi1lc3RpbS1hdWMiKSAlPiUKICBwcmludC54dGFibGUoaW5jbHVkZS5yb3duYW1lcyA9IEYsCiAgICAgICAgICAgICAgIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIpCiAgCgoKCmBgYAoKYGBge3J9CmZpbmFsX2RhdGEgJT4lCiAgZ3JvdXBfYnkocm9rKSAlPiUKICBzdW1tYXJpc2VfYXQodmFycyhjb250YWlucygia29tcCIpKSxzdW0pCmBgYAoK