Packages for imputation

library(VIM)
Loading required package: colorspace
Loading required package: grid
Loading required package: data.table
data.table 1.12.2 using 4 threads (see ?getDTthreads).  Latest news: r-datatable.com
VIM is ready to use. 
 Since version 4.0.0 the GUI is in its own package VIMGUI.

          Please use the package to use the new (and old) GUI.

Suggestions and bug-reports can be submitted at: https://github.com/alexkowa/VIM/issues

Attaching package: ‘VIM’

The following object is masked from ‘package:datasets’:

    sleep
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::between()   masks data.table::between()
✖ dplyr::filter()    masks stats::filter()
✖ dplyr::first()     masks data.table::first()
✖ dplyr::lag()       masks stats::lag()
✖ dplyr::last()      masks data.table::last()
✖ purrr::transpose() masks data.table::transpose()

Imputation

Read the data

bkl %>%
  filter(rok !=2012) %>%
  skimr::skim()
Skim summary statistics
 n obs: 62171 
 n variables: 27 

── Variable type:character ─────────────────────────────────────────────────────────────────────────────────────────────────────────
      variable missing complete     n min max empty n_unique
        branza   21373    40798 62171   1   2     0       45
     forma_ogl       0    62171 62171   1   1     0        3
          nace   22211    39960 62171   1   1     0       17
     podregion    5621    56550 62171   1   2     0       66
   sekcja_pkd2   20750    41421 62171   3   3     0      331
           woj     268    61903 62171   2   2     0       16
 wyksztalcenie   24814    37357 62171   6  19     0        5
        zawod1     254    61917 62171   1   1     0        9
        zawod6     254    61917 62171   6   6     0     1357
        zrodlo       0    62171 62171   1   1     0        2

── Variable type:logical ───────────────────────────────────────────────────────────────────────────────────────────────────────────
             variable missing complete     n   mean                          count
      jezyk_angielski       0    62171 62171 0.18    FAL: 50698, TRU: 11473, NA: 0
      jezyk_niemiecki       0    62171 62171 0.05     FAL: 59071, TRU: 3100, NA: 0
         komp_biurowe       0    62171 62171 0.031    FAL: 60241, TRU: 1930, NA: 0
    komp_dyspozycyjne       0    62171 62171 0.15     FAL: 53041, TRU: 9130, NA: 0
        komp_fizyczne       0    62171 62171 0.041    FAL: 59609, TRU: 2562, NA: 0
    komp_indywidualne       0    62171 62171 0.42    FAL: 36298, TRU: 25873, NA: 0
 komp_interpersonalne       0    62171 62171 0.38    FAL: 38447, TRU: 23724, NA: 0
     komp_kierownicze       0    62171 62171 0.18    FAL: 51126, TRU: 11045, NA: 0
      komp_kognitywne       0    62171 62171 0.14     FAL: 53526, TRU: 8645, NA: 0
     komp_komputerowe       0    62171 62171 0.24    FAL: 47237, TRU: 14934, NA: 0
      komp_kulturalne       0    62171 62171 0.11     FAL: 55138, TRU: 7033, NA: 0
    komp_matematyczne       0    62171 62171 0.0026    FAL: 62008, TRU: 163, NA: 0
      komp_techniczne       0    62171 62171 0.045    FAL: 59358, TRU: 2813, NA: 0
        komp_zawodowe      26    62145 62171 0.26   FAL: 45846, TRU: 16299, NA: 26

── Variable type:numeric ───────────────────────────────────────────────────────────────────────────────────────────────────────────
        variable missing complete     n      mean        sd   p0  p25     p50       p75   p100     hist
              id   20081    42090 62171 211028.53 293297.03    1 5478 14308.5 610179.75 847595 ▇▁▁▁▁▃▁▁
             rok       0    62171 62171   2012.68      1.25 2011 2011  2013     2014      2014 ▇▁▁▁▁▇▁▇
 zrodlo_dokladne       2    62169 62171    255.12    170.08    1  135   262      353       723 ▅▃▃▇▁▁▂▁
dput(names(bkl))
c("id", "rok", "zrodlo", "forma_ogl", "zrodlo_dokladne", "zawod1", 
"zawod6", "woj", "podregion", "nace", "sekcja_pkd2", "branza", 
"wyksztalcenie", "jezyk_angielski", "jezyk_niemiecki", "komp_zawodowe", 
"komp_techniczne", "komp_matematyczne", "komp_kulturalne", "komp_komputerowe", 
"komp_kognitywne", "komp_kierownicze", "komp_interpersonalne", 
"komp_indywidualne", "komp_fizyczne", "komp_dyspozycyjne", "komp_biurowe"
)

Imputation of missing data

Detected as categorical variable:

zrodlo,forma_ogl,zawod1,zawod6,woj,podregion,nace,sekcja_pkd2,branza,wyksztalcenie
Detected as ordinal variable:


Detected as numerical variable:

id,rok,zrodlo_dokladne
382items ofvariable:zawod1 imputed

286items ofvariable:woj imputed

29887items ofvariable:nace imputed

Time difference of 1.577767 hours
  1. distribution of missing data
  2. impute based on the full dataset
  3. restrict only to Interent

After imputation

dim(imputed)
[1] 83765    30
imputed %>%
  ungroup() %>%
  select(zrodlo, komp_techniczne:komp_biurowe) %>%
  gather(comp, vals, -zrodlo) %>%
  count(zrodlo, comp, vals) %>%
  add_count(zrodlo, comp, wt = n, name = "total") %>%
  mutate(p = n/total*100) %>%
  filter(vals) %>%
  select(zrodlo, comp, p) %>%
  mutate(comp = case_when(comp == "komp_kulturalne" ~ "Artistic",
                            comp == "komp_dyspozycyjne"~ "Availability",
                            comp == "komp_kognitywne" ~ "Cognitive",
                            comp == "komp_komputerowe" ~ "Computer",
                            comp == "komp_interpersonalne" ~ "Interpersonal",
                            comp == "komp_kierownicze" ~ "Managerial",
                            comp == "komp_matematyczne" ~ "Mathematical",
                            comp == "komp_biurowe"~ "Office",
                            comp == "komp_fizyczne" ~ "Physical",
                            comp == "komp_indywidualne"~ "Self-organization",
                            comp =="komp_techniczne"  ~ "Technical")) %>%
  spread(zrodlo, p) %>%
  left_join(imputed %>%
  ungroup() %>%
  select(zrodlo, komp_techniczne:komp_biurowe) %>%
  gather(comp, vals, -zrodlo) %>%
  count(comp, vals) %>%
  add_count(comp, wt = n, name = "total") %>%
  mutate(p = n/total*100) %>%
  filter(vals) %>%
  select(comp, p) %>%
  mutate(comp = case_when(comp == "komp_kulturalne" ~ "Artistic",
                            comp == "komp_dyspozycyjne"~ "Availability",
                            comp == "komp_kognitywne" ~ "Cognitive",
                            comp == "komp_komputerowe" ~ "Computer",
                            comp == "komp_interpersonalne" ~ "Interpersonal",
                            comp == "komp_kierownicze" ~ "Managerial",
                            comp == "komp_matematyczne" ~ "Mathematical",
                            comp == "komp_biurowe"~ "Office",
                            comp == "komp_fizyczne" ~ "Physical",
                            comp == "komp_indywidualne"~ "Self-organization",
                            comp =="komp_techniczne"  ~ "Technical"))) %>%
  xtable(digits = 1, caption = "Share of skills included in job offers by data source based on pooled data 2011, 2013 and 2014") %>%
  print.xtable(include.rownames = F, caption.placement = "top")
Joining, by = "comp"
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Sat Jul 20 23:33:26 2019
\begin{table}[ht]
\centering
\caption{Share of skills included in job offers by data source based on pooled data 2011, 2013 and 2014} 
\begin{tabular}{lrrr}
  \hline
comp & 1 & 2 & p \\ 
  \hline
Artistic & 15.8 & 2.2 & 11.2 \\ 
  Availability & 21.0 & 2.9 & 14.8 \\ 
  Cognitive & 20.8 & 1.5 & 14.3 \\ 
  Computer & 33.2 & 8.9 & 25.0 \\ 
  Interpersonal & 55.9 & 6.9 & 39.3 \\ 
  Managerial & 29.2 & 2.0 & 20.0 \\ 
  Mathematical & 0.3 & 0.1 & 0.2 \\ 
  Office & 3.8 & 1.5 & 3.0 \\ 
  Physical & 6.0 & 2.0 & 4.7 \\ 
  Self-organization & 59.1 & 7.6 & 41.6 \\ 
  Technical & 4.3 & 5.1 & 4.6 \\ 
   \hline
\end{tabular}
\end{table}
imputed %>%
  ungroup() %>%
  select(zrodlo, komp_techniczne:komp_biurowe) %>%
  gather(comp, vals, -zrodlo) %>%
  count(zrodlo, comp, vals) %>%
  add_count(zrodlo, comp, wt = n, name = "total") %>%
  mutate(p = n/total*100) %>%
  filter(vals) %>%
  select(zrodlo, comp, p) %>%
  mutate(comp = case_when(comp == "komp_kulturalne" ~ "Artistic",
                            comp == "komp_dyspozycyjne"~ "Availability",
                            comp == "komp_kognitywne" ~ "Cognitive",
                            comp == "komp_komputerowe" ~ "Computer",
                            comp == "komp_interpersonalne" ~ "Interpersonal",
                            comp == "komp_kierownicze" ~ "Managerial",
                            comp == "komp_matematyczne" ~ "Mathematical",
                            comp == "komp_biurowe"~ "Office",
                            comp == "komp_fizyczne" ~ "Physical",
                            comp == "komp_indywidualne"~ "Self-organization",
                            comp =="komp_techniczne"  ~ "Technical")) %>%
  spread(zrodlo, p) %>%
  left_join(imputed %>%
  ungroup() %>%
  select(zrodlo, komp_techniczne:komp_biurowe) %>%
  gather(comp, vals, -zrodlo) %>%
  count(comp, vals) %>%
  add_count(comp, wt = n, name = "total") %>%
  mutate(p = n/total*100) %>%
  filter(vals) %>%
  select(comp, p)) %>%
  select(online=`1`, pup = `2`) %>%
  cor(m = "s")
Joining, by = "comp"
          online       pup
online 1.0000000 0.7363636
pup    0.7363636 1.0000000
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBQYWNrYWdlcyBmb3IgaW1wdXRhdGlvbgoKYGBge3J9CmxpYnJhcnkoVklNKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgojIEltcHV0YXRpb24KClJlYWQgdGhlIGRhdGEKCmBgYHtyfQpia2wgPC0gcmVhZFJEUygiLi4vZGF0YS9ia2wtYmVmb3JlLWltcC5yZHMiKSAlPiUKICBtdXRhdGUod29qID0gaWZlbHNlKHdvaiA9PSAiMDAiLCBOQSwgd29qKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoamV6eWtfYW5naWVsc2tpOmtvbXBfYml1cm93ZSksIGFzLmxvZ2ljYWwpICU+JQogIG11dGF0ZV9hdCh2YXJzKHpyb2Rsbyxwb2RyZWdpb24sYnJhbnphLGZvcm1hX29nbCksIGFzLmNoYXJhY3RlcikKCmJrbCAlPiUKICBmaWx0ZXIocm9rICE9MjAxMikgJT4lCiAgc2tpbXI6OnNraW0oKQpgYGAKCmBgYHtyfQpkcHV0KG5hbWVzKGJrbCkpCmBgYAoKCkltcHV0YXRpb24gb2YgbWlzc2luZyBkYXRhCgoKCmBgYHtyfQpzZXQuc2VlZCgxMjMpCmltcHV0ZWQgPC0ga05OKGRhdGEgPSBia2wsCiAgICAgICAgICAgICAgIHZhcmlhYmxlID0gYygiemF3b2QxIiwgIndvaiIsICJuYWNlIiksIAogICAgICAgICAgICAgICBkaXN0X3ZhciA9ICBjKCJ6YXdvZDEiLCAienJvZGxvIiwgImZvcm1hX29nbCIsICJicmFuemEiLCAiamV6eWtfYW5naWVsc2tpIiwgImplenlrX25pZW1pZWNraSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrb21wX3RlY2huaWN6bmUiLCAia29tcF9tYXRlbWF0eWN6bmUiLCAia29tcF9rdWx0dXJhbG5lIiwgImtvbXBfa29tcHV0ZXJvd2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia29tcF9rb2duaXR5d25lIiwgImtvbXBfa2llcm93bmljemUiLCAia29tcF9pbnRlcnBlcnNvbmFsbmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia29tcF9pbmR5d2lkdWFsbmUiLCAia29tcF9maXp5Y3puZSIsICJrb21wX2R5c3BvenljeWpuZSIsICJrb21wX2JpdXJvd2UiKSwKICAgICAgICAgICAgICAgayA9IDEsIAogICAgICAgICAgICAgICBhZGRSRiA9IFRSVUUsCiAgICAgICAgICAgICAgIHdlaWdodHMgPSAiYXV0byIsIAogICAgICAgICAgICAgICB0cmFjZSA9IFRSVUUpCgoKYGBgCgoKYGBgCkRldGVjdGVkIGFzIGNhdGVnb3JpY2FsIHZhcmlhYmxlOgoKenJvZGxvLGZvcm1hX29nbCx6YXdvZDEsemF3b2Q2LHdvaixwb2RyZWdpb24sbmFjZSxzZWtjamFfcGtkMixicmFuemEsd3lrc3p0YWxjZW5pZQpEZXRlY3RlZCBhcyBvcmRpbmFsIHZhcmlhYmxlOgoKCkRldGVjdGVkIGFzIG51bWVyaWNhbCB2YXJpYWJsZToKCmlkLHJvayx6cm9kbG9fZG9rbGFkbmUKMzgyaXRlbXMgb2Z2YXJpYWJsZTp6YXdvZDEgaW1wdXRlZAoKMjg2aXRlbXMgb2Z2YXJpYWJsZTp3b2ogaW1wdXRlZAoKMjk4ODdpdGVtcyBvZnZhcmlhYmxlOm5hY2UgaW1wdXRlZAoKVGltZSBkaWZmZXJlbmNlIG9mIDEuNTc3NzY3IGhvdXJzCmBgYAoKYGBge3J9CnNhdmVSRFMoaW1wdXRlZCwgIi4uL2RhdGEvYmtsLWFmdGVyLWltcC5yZHMiKQpgYGAKCjEuIGRpc3RyaWJ1dGlvbiBvZiBtaXNzaW5nIGRhdGEKMi4gaW1wdXRlIGJhc2VkIG9uIHRoZSBmdWxsIGRhdGFzZXQKMy4gcmVzdHJpY3Qgb25seSB0byBJbnRlcmVudAoKCkFmdGVyIGltcHV0YXRpb24gCgpgYGB7cn0KZGltKGltcHV0ZWQpCmBgYAoKCmBgYHtyfQppbXB1dGVkICU+JQogIGZpbHRlcih6cm9kbG8gPT0gMSkgJT4lCiAgbXV0YXRlKHphd29kMiA9IHN1YnN0cih6YXdvZDYsMSwyKSwKICAgICAgICAgemF3b2QyID0gaWZlbHNlKGlzLm5hKHphd29kNiksIHphd29kMSwgc3Vic3RyKHphd29kNiwxLDIpKSwKICAgICAgICAgemF3b2QyID0gc3RyX3BhZChzdHJpbmcgPSB6YXdvZDIsIHdpZHRoID0gMiwgc2lkZSA9ICJyaWdodCIsIHBhZCA9ICIwIiksCiAgICAgICAgIHphd29kNiA9IGlmZWxzZShpcy5uYSh6YXdvZDYpLCB6YXdvZDEsIHphd29kNiksCiAgICAgICAgIHphd29kNiA9IHN0cl9wYWQoc3RyaW5nID0gemF3b2Q2LCB3aWR0aCA9IDYsIHNpZGUgPSAicmlnaHQiLCBwYWQgPSAiMCIpKSAlPiUKICBzZWxlY3QoaWQsIHJvaywgemF3b2QxLCB6YXdvZDIsIHphd29kNiwgd29qLCBuYWNlLCBrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSAlPiUKICBtdXRhdGVfYXQodmFycyhrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSwgYXMuaW50ZWdlcikgLT4gZmluYWxfZGF0YQpgYGAKCmBgYHtyfQpzYXZlUkRTKGZpbmFsX2RhdGEsICIuLi9kYXRhL2JrbC1maW5hbC5yZHMiKQpgYGAKCmBgYHtyfQpmaW5hbF9kYXRhICAlPiUgCiAgZmlsdGVyKHJvayAhPSAyMDEyKSAlPiUKICBjb3VudCh6YXdvZDIpICU+JQogIGZpbHRlcih6YXdvZDIgJWluJSBzZXEoMTAsOTAsMTApKSAlPiUKICBzdW1tYXJpc2Uoc3VtKG4pKQpgYGAKCgpgYGB7cn0KaW1wdXRlZCAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KHpyb2Rsbywga29tcF90ZWNobmljem5lOmtvbXBfYml1cm93ZSkgJT4lCiAgZ2F0aGVyKGNvbXAsIHZhbHMsIC16cm9kbG8pICU+JQogIGNvdW50KHpyb2RsbywgY29tcCwgdmFscykgJT4lCiAgYWRkX2NvdW50KHpyb2RsbywgY29tcCwgd3QgPSBuLCBuYW1lID0gInRvdGFsIikgJT4lCiAgbXV0YXRlKHAgPSBuL3RvdGFsKjEwMCkgJT4lCiAgZmlsdGVyKHZhbHMpICU+JQogIHNlbGVjdCh6cm9kbG8sIGNvbXAsIHApICU+JQogIG11dGF0ZShjb21wID0gY2FzZV93aGVuKGNvbXAgPT0gImtvbXBfa3VsdHVyYWxuZSIgfiAiQXJ0aXN0aWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9PSAia29tcF9keXNwb3p5Y3lqbmUifiAiQXZhaWxhYmlsaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPT0gImtvbXBfa29nbml0eXduZSIgfiAiQ29nbml0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPT0gImtvbXBfa29tcHV0ZXJvd2UiIH4gIkNvbXB1dGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPT0gImtvbXBfaW50ZXJwZXJzb25hbG5lIiB+ICJJbnRlcnBlcnNvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPT0gImtvbXBfa2llcm93bmljemUiIH4gIk1hbmFnZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9PSAia29tcF9tYXRlbWF0eWN6bmUiIH4gIk1hdGhlbWF0aWNhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wID09ICJrb21wX2JpdXJvd2UifiAiT2ZmaWNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPT0gImtvbXBfZml6eWN6bmUiIH4gIlBoeXNpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPT0gImtvbXBfaW5keXdpZHVhbG5lIn4gIlNlbGYtb3JnYW5pemF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPT0ia29tcF90ZWNobmljem5lIiAgfiAiVGVjaG5pY2FsIikpICU+JQogIHNwcmVhZCh6cm9kbG8sIHApICU+JQogIGxlZnRfam9pbihpbXB1dGVkICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoenJvZGxvLCBrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSAlPiUKICBnYXRoZXIoY29tcCwgdmFscywgLXpyb2RsbykgJT4lCiAgY291bnQoY29tcCwgdmFscykgJT4lCiAgYWRkX2NvdW50KGNvbXAsIHd0ID0gbiwgbmFtZSA9ICJ0b3RhbCIpICU+JQogIG11dGF0ZShwID0gbi90b3RhbCoxMDApICU+JQogIGZpbHRlcih2YWxzKSAlPiUKICBzZWxlY3QoY29tcCwgcCkgJT4lCiAgbXV0YXRlKGNvbXAgPSBjYXNlX3doZW4oY29tcCA9PSAia29tcF9rdWx0dXJhbG5lIiB+ICJBcnRpc3RpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wID09ICJrb21wX2R5c3BvenljeWpuZSJ+ICJBdmFpbGFiaWxpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9PSAia29tcF9rb2duaXR5d25lIiB+ICJDb2duaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9PSAia29tcF9rb21wdXRlcm93ZSIgfiAiQ29tcHV0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9PSAia29tcF9pbnRlcnBlcnNvbmFsbmUiIH4gIkludGVycGVyc29uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9PSAia29tcF9raWVyb3duaWN6ZSIgfiAiTWFuYWdlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wID09ICJrb21wX21hdGVtYXR5Y3puZSIgfiAiTWF0aGVtYXRpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPT0gImtvbXBfYml1cm93ZSJ+ICJPZmZpY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9PSAia29tcF9maXp5Y3puZSIgfiAiUGh5c2ljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9PSAia29tcF9pbmR5d2lkdWFsbmUifiAiU2VsZi1vcmdhbml6YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9PSJrb21wX3RlY2huaWN6bmUiICB+ICJUZWNobmljYWwiKSkpICU+JQogIHh0YWJsZShkaWdpdHMgPSAxLCBjYXB0aW9uID0gIlNoYXJlIG9mIHNraWxscyBpbmNsdWRlZCBpbiBqb2Igb2ZmZXJzIGJ5IGRhdGEgc291cmNlIGJhc2VkIG9uIHBvb2xlZCBkYXRhIDIwMTEsIDIwMTMgYW5kIDIwMTQiKSAlPiUKICBwcmludC54dGFibGUoaW5jbHVkZS5yb3duYW1lcyA9IEYsIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIpCmBgYAoKYGBge3J9CmltcHV0ZWQgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdCh6cm9kbG8sIGtvbXBfdGVjaG5pY3puZTprb21wX2JpdXJvd2UpICU+JQogIGdhdGhlcihjb21wLCB2YWxzLCAtenJvZGxvKSAlPiUKICBjb3VudCh6cm9kbG8sIGNvbXAsIHZhbHMpICU+JQogIGFkZF9jb3VudCh6cm9kbG8sIGNvbXAsIHd0ID0gbiwgbmFtZSA9ICJ0b3RhbCIpICU+JQogIG11dGF0ZShwID0gbi90b3RhbCoxMDApICU+JQogIGZpbHRlcih2YWxzKSAlPiUKICBzZWxlY3QoenJvZGxvLCBjb21wLCBwKSAlPiUKICBtdXRhdGUoY29tcCA9IGNhc2Vfd2hlbihjb21wID09ICJrb21wX2t1bHR1cmFsbmUiIH4gIkFydGlzdGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPT0gImtvbXBfZHlzcG96eWN5am5lIn4gIkF2YWlsYWJpbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wID09ICJrb21wX2tvZ25pdHl3bmUiIH4gIkNvZ25pdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wID09ICJrb21wX2tvbXB1dGVyb3dlIiB+ICJDb21wdXRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wID09ICJrb21wX2ludGVycGVyc29uYWxuZSIgfiAiSW50ZXJwZXJzb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wID09ICJrb21wX2tpZXJvd25pY3plIiB+ICJNYW5hZ2VyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPT0gImtvbXBfbWF0ZW1hdHljem5lIiB+ICJNYXRoZW1hdGljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9PSAia29tcF9iaXVyb3dlIn4gIk9mZmljZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wID09ICJrb21wX2Zpenljem5lIiB+ICJQaHlzaWNhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wID09ICJrb21wX2luZHl3aWR1YWxuZSJ+ICJTZWxmLW9yZ2FuaXphdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wID09ImtvbXBfdGVjaG5pY3puZSIgIH4gIlRlY2huaWNhbCIpKSAlPiUKICBzcHJlYWQoenJvZGxvLCBwKSAlPiUKICBsZWZ0X2pvaW4oaW1wdXRlZCAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KHpyb2Rsbywga29tcF90ZWNobmljem5lOmtvbXBfYml1cm93ZSkgJT4lCiAgZ2F0aGVyKGNvbXAsIHZhbHMsIC16cm9kbG8pICU+JQogIGNvdW50KGNvbXAsIHZhbHMpICU+JQogIGFkZF9jb3VudChjb21wLCB3dCA9IG4sIG5hbWUgPSAidG90YWwiKSAlPiUKICBtdXRhdGUocCA9IG4vdG90YWwqMTAwKSAlPiUKICBmaWx0ZXIodmFscykgJT4lCiAgc2VsZWN0KGNvbXAsIHApKSAlPiUKICBzZWxlY3Qob25saW5lPWAxYCwgcHVwID0gYDJgKSAlPiUKICBjb3IobSA9ICJzIikKYGBgCgo=