Goal

Evaluate sensitivity to time-varying confounders

Set up

#library
library(tidyverse)
library(lavaan)
library(data.table)
library(doParallel)
library(parallel)
library(viridis)
library(fixest)

#data
load(file = "results/predicted_means/240816_pred-means-cleaned-df.Rdata")

Fixed effects models

Estimate effects of confidants educational attainment on political attitudes Estimate effects on confidants educational attainment.

First step: Create data frame

#create a long file from df_combined
data <- pred_results$df_combined %>% 
  #select variables
  select(nomem_encr,
         matches("^educ_[[:digit:]]"),
         matches("^Feduc_a_[[:digit:]]"),
         matches("female_"),
         matches("^age_[[:digit:]]"),
         matches("burgstat_"),
         matches("married_"),
         matches("work_[[:digit:]]"),
         matches("origin_"),
         matches("eu_[[:digit:]]"),
         matches("cult_[[:digit:]]"),
         matches("inc_diff_[[:digit:]]"),
         matches("inc_ln_")) %>% 
  #create long file
  pivot_longer(cols = 2:ncol(.),
               names_to = c("measure", "wave"),
               values_to = "value",
              names_pattern = "(.+)\\_(.+)") %>% 
  pivot_wider(names_from = "measure",
              values_from = "value") %>% 
  mutate(wave = as.numeric(wave)) %>% 
  arrange(nomem_encr, wave)

#there are two respondents who change origin
#remove from datafile
outlier_origin <- data %>% 
  group_by(nomem_encr) %>% 
  summarise(sd_origin = sd(origin, na.rm = T),
            sd_educ = sd(educ, na.rm = T)) %>% 
  filter(sd_origin != 0) %>% 
  pull(nomem_encr)

#there are some respondents who change education after 25th
#remove them from the data
outlier_education<- data %>% 
  group_by(nomem_encr) %>% 
  summarise(sd_origin = sd(origin, na.rm = T),
            sd_educ = sd(educ, na.rm = T)) %>% 
  filter(sd_educ != 0) %>% 
  pull(nomem_encr)

#clean DF
data_cleaned <- data %>% 
  filter(!nomem_encr %in% outlier_education) %>% 
  filter(!nomem_encr %in% outlier_origin)

#add some backgroudn variables from LISS core file
load(file = "data/data-processed/liss_merged/liss_core_merged_V3_240624.Rdata")

#select variables from LISS core file
liss_selection <- liss_long %>% 
  select(nomem_encr,
         sted, 
         woning,
         survey_wave,
         aantalki) %>% 
  rename(wave = survey_wave)

#add variables with a left join
data_cleaned <- data_cleaned %>% 
  left_join(liss_selection, by = c("nomem_encr", "wave"))

#listwise deletion (less problematic in long file)
data_cleaned <- data_cleaned %>% 
  na.omit()

Second step: Create estimate function for Pooled regression and Fixed effects models

# create function for estimating models
fe_pr_estimate <- function(x) {
  df_selection <- x
  #pooled effects
  pr_model1 <- lm(dependent ~ 1 +
                    Feduc_a,
                  data = df_selection)
  
  pr_model2 <- lm(dependent ~ 1 +
                    Feduc_a +
                    educ,
                  data = df_selection)
  
  pr_model3 <- lm(
    dependent ~ 1 +
      Feduc_a +
      educ +
      age +
      as.factor(married) +
      as.factor(origin) +
      as.factor(work) +
      inc_ln +
      sted +
      aantalki,
    data = df_selection
  )
  
  #store pr models
  pr_models <- list(pr_model1 = pr_model1,
                    pr_model2 = pr_model2,
                    pr_model3 = pr_model3)
  
  #Fixed effects
  fe_model1 <- feols(dependent ~ 1 +
                       Feduc_a | nomem_encr,
                     data = df_selection) %>%
    summary(., vcov = "twoway")
  
  fe_model2 <- feols(dependent ~ 1 +
                       Feduc_a +
                       educ | nomem_encr,
                     data = df_selection) %>%
    summary(., vcov = "twoway")
  
  fe_model3 <- feols(
    dependent ~ 1 +
      Feduc_a +
      educ +
      age +
      as.factor(married) +
      as.factor(origin) +
      as.factor(work) +
      inc_ln +
      sted +
      aantalki | nomem_encr,
    data = df_selection
  ) %>%
    summary(., vcov = "twoway")
  
  #store fe models
  fe_models <- list(fe_model1 = fe_model1,
                    fe_model2 = fe_model2,
                    fe_model3 = fe_model3)
  
  #store models
  models <- list(pr_models = pr_models,
                 fe_models = fe_models)
  return(models)
  }

#apply function to data
#create list based on dep_var
data_list <- data_cleaned %>% 
  pivot_longer(cols = c("eu", "cult", "inc_diff"),
               names_to = "dep_var",
               values_to = "dependent") %>% 
  group_split(dep_var)

#store names of depvar
names_depvar <- c(unique(data_list[[1]]$dep_var),
unique(data_list[[2]]$dep_var),
unique(data_list[[3]]$dep_var))

#estimate models of depvar
re_fe_models_list <- foreach(a = 1:3) %do%{
  fe_pr_estimate(data_list[[a]])
}

#extract model dfs
estimate_df <- foreach(c = 1:3,
        .combine = rbind) %:% #a = 1
  foreach(a = 1:2,
          .combine = rbind) %:% #a = 1
  foreach(b = 1:3,
          .combine = rbind) %do% {
            #b = 1
            re_fe_models_list[[c]][[a]][[b]] %>%
              broom::tidy() %>%
              mutate(dep_var = names_depvar[[c]],
                     model = b,
                     model_type = a)
          }

Third step: estimate PR and FE models with Feduc_a.

  fe_model_educ_df <- feols(
    Feduc_a ~ 1 +
      educ +
      age +
      as.factor(married) +
      as.factor(origin) +
      as.factor(work) +
      inc_ln +
      sted +
      aantalki | nomem_encr,
    data = data_cleaned
  ) %>%
    summary(., vcov = "twoway") %>% 
  broom::tidy() %>% 
  mutate(dep_var ="Feduc_a",
         model = 3,
         model_type = 2)

  pr_model_educ_df <- lm(
    Feduc_a ~ 1 +
      educ +
      age +
      as.factor(married) +
      as.factor(origin) +
      as.factor(work) +
      inc_ln +
      sted +
      aantalki,
    data = data_cleaned
  )   %>% 
  broom::tidy() %>% 
  mutate(dep_var ="Feduc_a",
         model = 3,
         model_type = 1)
  

educ_df <- fe_model_educ_df %>% 
  bind_rows(pr_model_educ_df)

Fourth step: Create coefficient plots

#Feduc effect plot after control
educ_control_plot <- estimate_df %>%
  #select correct terms. 
  filter(term == "Feduc_a") %>%
  filter(!(model_type == 2 & model == 2)) %>% #no model 2 for FE models
  #create labels
  mutate(
    model_type = factor(
      model_type,
      levels = 1:2,
      labels = c("Pooled regression",
                 "Fixed effects")
    ),
    sig = ifelse(p.value < 0.05, 1, 0),
    model = factor(
      model,
      levels = 1:3,
      labels = c("No controls",
                 "Educ. ego \n control",
                 "All controls")
    ),
    dep_var = case_when(dep_var == "cult" ~ 1,
                        dep_var == "eu" ~ 2,
                        dep_var == "inc_diff" ~ 3),
    dep_var_fac = factor(
      dep_var,
      levels = 1:3,
      labels = c("Cultural inclusion",
                 "EU-integration",
                 "Income equality")
    ),
    term = case_when(
      term == "sted" ~ 1,
      term == "inc_ln" ~ 2,
      term == "educ" ~ 3,
      term == "as.factor(work)1" ~ 4,
      term == "as.factor(origin)1" ~ 5,
      term == "as.factor(married)1" ~ 6,
      term == "age" ~ 7,
      term == "aantalki" ~ 8
    ),
    term_fac = factor(term,
                      levels = 1:8,
                      labels = c(
                        "Urbanisation",
                        "Income",
                        "Education (in years)",
                        "Works",
                        "Migration background",
                        "Married",
                        "Age",
                        "# Children"
                      ))
    
  ) %>%
  #create plot
  ggplot(aes(y = estimate,
             x = as.factor(model))) +
  geom_hline(linetype = "dashed",
             yintercept = 0, ) +
  geom_linerange(aes(
    ymin = estimate - std.error * 1.96,
    ymax = estimate + std.error * 1.96
  )) +
  geom_point(aes(colour = as.factor(sig)),
             size = 2) +
  facet_grid(
    rows = vars(dep_var_fac),
    cols = vars(model_type),
    scales =  "free"
  ) +
  scale_colour_viridis(discrete = T,
                       option = "D")  +
  coord_flip() +
  theme(
    panel.background = element_rect(fill = "#FFFFFF",
                                    colour = "black"),
    plot.background = element_rect(fill = "#FFFFFF",
                                   colour = "black"),
    panel.grid = element_line(colour = "grey"),
    panel.grid.major.x = element_blank(),
    text = element_text(family = "sans", size = 12),
    strip.background = element_rect(fill = "#A9A9A9"),
    panel.grid.minor = element_blank(),
    legend.position = "none",
    legend.title = element_blank(),
    legend.background = element_rect(fill = "#FFFFFF"),
    legend.key = element_rect(fill = "#FFFFFF")
  ) +
  labs(x = "",
       y = "Estimate")

#save plot
ggsave(plot = educ_control_plot,
       file = "plots/results/educ_control_plot.jpg",
       dpi = 600, width = 6, height = 4)

full_control_plot <- estimate_df %>%
  #combine estimates with Feduca estimates
  bind_rows(educ_df) %>%
  #filter out intercept and Feduc_a terms
  filter((term != "(Intercept)") & (term != "Feduc_a")) %>%
  filter(model == 3) %>% #only full models
  #change labels
  mutate(
    model_type = factor(
      model_type,
      levels = 1:2,
      labels = c("Pooled regression",
                 "Fixed effects")
    ),
    sig = ifelse(p.value < 0.05, 1, 0),
    model = factor(
      model,
      levels = 1:3,
      labels = c("No controls",
                 "Educ. ego \n control",
                 "All controls")
    ),
    dep_var = case_when(
      dep_var == "cult" ~ 1,
      dep_var == "eu" ~ 2,
      dep_var == "inc_diff" ~ 3,
      dep_var == "Feduc_a" ~ 4,
    ),
    dep_var_fac = factor(
      dep_var,
      levels = 1:4,
      labels = c(
        "Cultural inclusion",
        "EU-integration",
        "Income equality",
        "Confidants' \n education"
      )
    ),
    term = case_when(
      term == "sted" ~ 1,
      term == "inc_ln" ~ 2,
      term == "educ" ~ 3,
      term == "as.factor(work)1" ~ 4,
      term == "as.factor(origin)1" ~ 5,
      term == "as.factor(married)1" ~ 6,
      term == "age" ~ 7,
      term == "aantalki" ~ 8
    ),
    term_fac = factor(
      term,
      levels = 1:8,
      labels = c(
        "Urbanisation",
        "Income",
        "Education (in years)",
        "Works",
        "Migration background",
        "Married",
        "Age",
        "# Children"
      )
    )
  ) %>%
  #create coef plot
  ggplot(aes(
    y = estimate,
    x = term_fac,
    group = as.factor(model)
  )) +
  geom_hline(linetype = "dashed",
             yintercept = 0, ) +
  geom_linerange(aes(
    ymin = estimate - std.error * 1.96,
    ymax = estimate + std.error * 1.96
  )) +
  geom_point(aes(colour = as.factor(sig)),
             size = 2) +
  facet_grid(
    rows = vars(dep_var_fac),
    cols = vars(model_type),
    scales =  "free"
  ) +
  scale_colour_viridis(discrete = T,
                       option = "D")  +
  coord_flip() +
  theme(
    panel.background = element_rect(fill = "#FFFFFF",
                                    colour = "black"),
    plot.background = element_rect(fill = "#FFFFFF",
                                   colour = "black"),
    panel.grid = element_line(colour = "grey"),
    panel.grid.major.x = element_blank(),
    text = element_text(family = "sans", size = 12),
    strip.background = element_rect(fill = "#A9A9A9"),
    panel.grid.minor = element_blank(),
    legend.position = "none",
    legend.title = element_blank(),
    legend.background = element_rect(fill = "#FFFFFF"),
    legend.key = element_rect(fill = "#FFFFFF")
  ) +
  labs(x = "",
       y = "Estimate")
  
#save plot
ggsave(plot = full_control_plot,
       file = "plots/results/full_control_plot.jpg",
       dpi = 600, width = 8, height = 6)
LS0tDQp0aXRsZTogIlNlbnNpdGl2aXR5IHRpbWUgdmFyeWluZyBjb25mb3VuZGVycyINCmF1dGhvcjogIlRoaWptZW4gSmVyb2Vuc2UiDQpkYXRlOiAiTGFzdCBjb21waWxlZCBvbiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGNhY2hlID0gVFJVRSwNCiAgbWVzc2FnZSA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIHJlc3VsdHMgPSAiYXNpcyIsDQogIGZpZy5hbGlnbiA9ICJjZW50ZXIiDQopDQpgYGANCg0KIyBHb2FsDQoNCkV2YWx1YXRlIHNlbnNpdGl2aXR5IHRvIHRpbWUtdmFyeWluZyBjb25mb3VuZGVycw0KDQojIFNldCB1cA0KYGBge3J9DQojbGlicmFyeQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGxhdmFhbikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoZG9QYXJhbGxlbCkNCmxpYnJhcnkocGFyYWxsZWwpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KGZpeGVzdCkNCg0KI2RhdGENCmxvYWQoZmlsZSA9ICJyZXN1bHRzL3ByZWRpY3RlZF9tZWFucy8yNDA4MTZfcHJlZC1tZWFucy1jbGVhbmVkLWRmLlJkYXRhIikNCmBgYA0KDQoNCiMgRml4ZWQgZWZmZWN0cyBtb2RlbHMNCg0KRXN0aW1hdGUgZWZmZWN0cyBvZiBjb25maWRhbnRzIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgb24gcG9saXRpY2FsIGF0dGl0dWRlcw0KRXN0aW1hdGUgZWZmZWN0cyBvbiBjb25maWRhbnRzIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQuDQoNCg0KIyMgRmlyc3Qgc3RlcDogQ3JlYXRlIGRhdGEgZnJhbWUNCg0KYGBge3IgY3JlYXRlIGRhdGF9DQojY3JlYXRlIGEgbG9uZyBmaWxlIGZyb20gZGZfY29tYmluZWQNCmRhdGEgPC0gcHJlZF9yZXN1bHRzJGRmX2NvbWJpbmVkICU+JSANCiAgI3NlbGVjdCB2YXJpYWJsZXMNCiAgc2VsZWN0KG5vbWVtX2VuY3IsDQogICAgICAgICBtYXRjaGVzKCJeZWR1Y19bWzpkaWdpdDpdXSIpLA0KICAgICAgICAgbWF0Y2hlcygiXkZlZHVjX2FfW1s6ZGlnaXQ6XV0iKSwNCiAgICAgICAgIG1hdGNoZXMoImZlbWFsZV8iKSwNCiAgICAgICAgIG1hdGNoZXMoIl5hZ2VfW1s6ZGlnaXQ6XV0iKSwNCiAgICAgICAgIG1hdGNoZXMoImJ1cmdzdGF0XyIpLA0KICAgICAgICAgbWF0Y2hlcygibWFycmllZF8iKSwNCiAgICAgICAgIG1hdGNoZXMoIndvcmtfW1s6ZGlnaXQ6XV0iKSwNCiAgICAgICAgIG1hdGNoZXMoIm9yaWdpbl8iKSwNCiAgICAgICAgIG1hdGNoZXMoImV1X1tbOmRpZ2l0Ol1dIiksDQogICAgICAgICBtYXRjaGVzKCJjdWx0X1tbOmRpZ2l0Ol1dIiksDQogICAgICAgICBtYXRjaGVzKCJpbmNfZGlmZl9bWzpkaWdpdDpdXSIpLA0KICAgICAgICAgbWF0Y2hlcygiaW5jX2xuXyIpKSAlPiUgDQogICNjcmVhdGUgbG9uZyBmaWxlDQogIHBpdm90X2xvbmdlcihjb2xzID0gMjpuY29sKC4pLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSBjKCJtZWFzdXJlIiwgIndhdmUiKSwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ2YWx1ZSIsDQogICAgICAgICAgICAgIG5hbWVzX3BhdHRlcm4gPSAiKC4rKVxcXyguKykiKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAibWVhc3VyZSIsDQogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gInZhbHVlIikgJT4lIA0KICBtdXRhdGUod2F2ZSA9IGFzLm51bWVyaWMod2F2ZSkpICU+JSANCiAgYXJyYW5nZShub21lbV9lbmNyLCB3YXZlKQ0KDQojdGhlcmUgYXJlIHR3byByZXNwb25kZW50cyB3aG8gY2hhbmdlIG9yaWdpbg0KI3JlbW92ZSBmcm9tIGRhdGFmaWxlDQpvdXRsaWVyX29yaWdpbiA8LSBkYXRhICU+JSANCiAgZ3JvdXBfYnkobm9tZW1fZW5jcikgJT4lIA0KICBzdW1tYXJpc2Uoc2Rfb3JpZ2luID0gc2Qob3JpZ2luLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgc2RfZWR1YyA9IHNkKGVkdWMsIG5hLnJtID0gVCkpICU+JSANCiAgZmlsdGVyKHNkX29yaWdpbiAhPSAwKSAlPiUgDQogIHB1bGwobm9tZW1fZW5jcikNCg0KI3RoZXJlIGFyZSBzb21lIHJlc3BvbmRlbnRzIHdobyBjaGFuZ2UgZWR1Y2F0aW9uIGFmdGVyIDI1dGgNCiNyZW1vdmUgdGhlbSBmcm9tIHRoZSBkYXRhDQpvdXRsaWVyX2VkdWNhdGlvbjwtIGRhdGEgJT4lIA0KICBncm91cF9ieShub21lbV9lbmNyKSAlPiUgDQogIHN1bW1hcmlzZShzZF9vcmlnaW4gPSBzZChvcmlnaW4sIG5hLnJtID0gVCksDQogICAgICAgICAgICBzZF9lZHVjID0gc2QoZWR1YywgbmEucm0gPSBUKSkgJT4lIA0KICBmaWx0ZXIoc2RfZWR1YyAhPSAwKSAlPiUgDQogIHB1bGwobm9tZW1fZW5jcikNCg0KI2NsZWFuIERGDQpkYXRhX2NsZWFuZWQgPC0gZGF0YSAlPiUgDQogIGZpbHRlcighbm9tZW1fZW5jciAlaW4lIG91dGxpZXJfZWR1Y2F0aW9uKSAlPiUgDQogIGZpbHRlcighbm9tZW1fZW5jciAlaW4lIG91dGxpZXJfb3JpZ2luKQ0KDQojYWRkIHNvbWUgYmFja2dyb3VkbiB2YXJpYWJsZXMgZnJvbSBMSVNTIGNvcmUgZmlsZQ0KbG9hZChmaWxlID0gImRhdGEvZGF0YS1wcm9jZXNzZWQvbGlzc19tZXJnZWQvbGlzc19jb3JlX21lcmdlZF9WM18yNDA2MjQuUmRhdGEiKQ0KDQojc2VsZWN0IHZhcmlhYmxlcyBmcm9tIExJU1MgY29yZSBmaWxlDQpsaXNzX3NlbGVjdGlvbiA8LSBsaXNzX2xvbmcgJT4lIA0KICBzZWxlY3Qobm9tZW1fZW5jciwNCiAgICAgICAgIHN0ZWQsIA0KICAgICAgICAgd29uaW5nLA0KICAgICAgICAgc3VydmV5X3dhdmUsDQogICAgICAgICBhYW50YWxraSkgJT4lIA0KICByZW5hbWUod2F2ZSA9IHN1cnZleV93YXZlKQ0KDQojYWRkIHZhcmlhYmxlcyB3aXRoIGEgbGVmdCBqb2luDQpkYXRhX2NsZWFuZWQgPC0gZGF0YV9jbGVhbmVkICU+JSANCiAgbGVmdF9qb2luKGxpc3Nfc2VsZWN0aW9uLCBieSA9IGMoIm5vbWVtX2VuY3IiLCAid2F2ZSIpKQ0KDQojbGlzdHdpc2UgZGVsZXRpb24gKGxlc3MgcHJvYmxlbWF0aWMgaW4gbG9uZyBmaWxlKQ0KZGF0YV9jbGVhbmVkIDwtIGRhdGFfY2xlYW5lZCAlPiUgDQogIG5hLm9taXQoKQ0KDQoNCmBgYA0KDQojIyBTZWNvbmQgc3RlcDogQ3JlYXRlIGVzdGltYXRlIGZ1bmN0aW9uIGZvciBQb29sZWQgcmVncmVzc2lvbiBhbmQgRml4ZWQgZWZmZWN0cyBtb2RlbHMNCg0KYGBge3IgZXN0aW1hdGUgZnVuY3Rpb259DQojIGNyZWF0ZSBmdW5jdGlvbiBmb3IgZXN0aW1hdGluZyBtb2RlbHMNCmZlX3ByX2VzdGltYXRlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgZGZfc2VsZWN0aW9uIDwtIHgNCiAgI3Bvb2xlZCBlZmZlY3RzDQogIHByX21vZGVsMSA8LSBsbShkZXBlbmRlbnQgfiAxICsNCiAgICAgICAgICAgICAgICAgICAgRmVkdWNfYSwNCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9zZWxlY3Rpb24pDQogIA0KICBwcl9tb2RlbDIgPC0gbG0oZGVwZW5kZW50IH4gMSArDQogICAgICAgICAgICAgICAgICAgIEZlZHVjX2EgKw0KICAgICAgICAgICAgICAgICAgICBlZHVjLA0KICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3NlbGVjdGlvbikNCiAgDQogIHByX21vZGVsMyA8LSBsbSgNCiAgICBkZXBlbmRlbnQgfiAxICsNCiAgICAgIEZlZHVjX2EgKw0KICAgICAgZWR1YyArDQogICAgICBhZ2UgKw0KICAgICAgYXMuZmFjdG9yKG1hcnJpZWQpICsNCiAgICAgIGFzLmZhY3RvcihvcmlnaW4pICsNCiAgICAgIGFzLmZhY3Rvcih3b3JrKSArDQogICAgICBpbmNfbG4gKw0KICAgICAgc3RlZCArDQogICAgICBhYW50YWxraSwNCiAgICBkYXRhID0gZGZfc2VsZWN0aW9uDQogICkNCiAgDQogICNzdG9yZSBwciBtb2RlbHMNCiAgcHJfbW9kZWxzIDwtIGxpc3QocHJfbW9kZWwxID0gcHJfbW9kZWwxLA0KICAgICAgICAgICAgICAgICAgICBwcl9tb2RlbDIgPSBwcl9tb2RlbDIsDQogICAgICAgICAgICAgICAgICAgIHByX21vZGVsMyA9IHByX21vZGVsMykNCiAgDQogICNGaXhlZCBlZmZlY3RzDQogIGZlX21vZGVsMSA8LSBmZW9scyhkZXBlbmRlbnQgfiAxICsNCiAgICAgICAgICAgICAgICAgICAgICAgRmVkdWNfYSB8IG5vbWVtX2VuY3IsDQogICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfc2VsZWN0aW9uKSAlPiUNCiAgICBzdW1tYXJ5KC4sIHZjb3YgPSAidHdvd2F5IikNCiAgDQogIGZlX21vZGVsMiA8LSBmZW9scyhkZXBlbmRlbnQgfiAxICsNCiAgICAgICAgICAgICAgICAgICAgICAgRmVkdWNfYSArDQogICAgICAgICAgICAgICAgICAgICAgIGVkdWMgfCBub21lbV9lbmNyLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3NlbGVjdGlvbikgJT4lDQogICAgc3VtbWFyeSguLCB2Y292ID0gInR3b3dheSIpDQogIA0KICBmZV9tb2RlbDMgPC0gZmVvbHMoDQogICAgZGVwZW5kZW50IH4gMSArDQogICAgICBGZWR1Y19hICsNCiAgICAgIGVkdWMgKw0KICAgICAgYWdlICsNCiAgICAgIGFzLmZhY3RvcihtYXJyaWVkKSArDQogICAgICBhcy5mYWN0b3Iob3JpZ2luKSArDQogICAgICBhcy5mYWN0b3Iod29yaykgKw0KICAgICAgaW5jX2xuICsNCiAgICAgIHN0ZWQgKw0KICAgICAgYWFudGFsa2kgfCBub21lbV9lbmNyLA0KICAgIGRhdGEgPSBkZl9zZWxlY3Rpb24NCiAgKSAlPiUNCiAgICBzdW1tYXJ5KC4sIHZjb3YgPSAidHdvd2F5IikNCiAgDQogICNzdG9yZSBmZSBtb2RlbHMNCiAgZmVfbW9kZWxzIDwtIGxpc3QoZmVfbW9kZWwxID0gZmVfbW9kZWwxLA0KICAgICAgICAgICAgICAgICAgICBmZV9tb2RlbDIgPSBmZV9tb2RlbDIsDQogICAgICAgICAgICAgICAgICAgIGZlX21vZGVsMyA9IGZlX21vZGVsMykNCiAgDQogICNzdG9yZSBtb2RlbHMNCiAgbW9kZWxzIDwtIGxpc3QocHJfbW9kZWxzID0gcHJfbW9kZWxzLA0KICAgICAgICAgICAgICAgICBmZV9tb2RlbHMgPSBmZV9tb2RlbHMpDQogIHJldHVybihtb2RlbHMpDQogIH0NCg0KI2FwcGx5IGZ1bmN0aW9uIHRvIGRhdGENCiNjcmVhdGUgbGlzdCBiYXNlZCBvbiBkZXBfdmFyDQpkYXRhX2xpc3QgPC0gZGF0YV9jbGVhbmVkICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKCJldSIsICJjdWx0IiwgImluY19kaWZmIiksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJkZXBfdmFyIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJkZXBlbmRlbnQiKSAlPiUgDQogIGdyb3VwX3NwbGl0KGRlcF92YXIpDQoNCiNzdG9yZSBuYW1lcyBvZiBkZXB2YXINCm5hbWVzX2RlcHZhciA8LSBjKHVuaXF1ZShkYXRhX2xpc3RbWzFdXSRkZXBfdmFyKSwNCnVuaXF1ZShkYXRhX2xpc3RbWzJdXSRkZXBfdmFyKSwNCnVuaXF1ZShkYXRhX2xpc3RbWzNdXSRkZXBfdmFyKSkNCg0KI2VzdGltYXRlIG1vZGVscyBvZiBkZXB2YXINCnJlX2ZlX21vZGVsc19saXN0IDwtIGZvcmVhY2goYSA9IDE6MykgJWRvJXsNCiAgZmVfcHJfZXN0aW1hdGUoZGF0YV9saXN0W1thXV0pDQp9DQoNCiNleHRyYWN0IG1vZGVsIGRmcw0KZXN0aW1hdGVfZGYgPC0gZm9yZWFjaChjID0gMTozLA0KICAgICAgICAuY29tYmluZSA9IHJiaW5kKSAlOiUgI2EgPSAxDQogIGZvcmVhY2goYSA9IDE6MiwNCiAgICAgICAgICAuY29tYmluZSA9IHJiaW5kKSAlOiUgI2EgPSAxDQogIGZvcmVhY2goYiA9IDE6MywNCiAgICAgICAgICAuY29tYmluZSA9IHJiaW5kKSAlZG8lIHsNCiAgICAgICAgICAgICNiID0gMQ0KICAgICAgICAgICAgcmVfZmVfbW9kZWxzX2xpc3RbW2NdXVtbYV1dW1tiXV0gJT4lDQogICAgICAgICAgICAgIGJyb29tOjp0aWR5KCkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShkZXBfdmFyID0gbmFtZXNfZGVwdmFyW1tjXV0sDQogICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IGIsDQogICAgICAgICAgICAgICAgICAgICBtb2RlbF90eXBlID0gYSkNCiAgICAgICAgICB9DQoNCmBgYA0KDQoNCiMjIFRoaXJkIHN0ZXA6IGVzdGltYXRlIFBSIGFuZCBGRSBtb2RlbHMgd2l0aCBGZWR1Y19hLg0KDQpgYGB7ciBmX2VkdWNhfQ0KICBmZV9tb2RlbF9lZHVjX2RmIDwtIGZlb2xzKA0KICAgIEZlZHVjX2EgfiAxICsNCiAgICAgIGVkdWMgKw0KICAgICAgYWdlICsNCiAgICAgIGFzLmZhY3RvcihtYXJyaWVkKSArDQogICAgICBhcy5mYWN0b3Iob3JpZ2luKSArDQogICAgICBhcy5mYWN0b3Iod29yaykgKw0KICAgICAgaW5jX2xuICsNCiAgICAgIHN0ZWQgKw0KICAgICAgYWFudGFsa2kgfCBub21lbV9lbmNyLA0KICAgIGRhdGEgPSBkYXRhX2NsZWFuZWQNCiAgKSAlPiUNCiAgICBzdW1tYXJ5KC4sIHZjb3YgPSAidHdvd2F5IikgJT4lIA0KICBicm9vbTo6dGlkeSgpICU+JSANCiAgbXV0YXRlKGRlcF92YXIgPSJGZWR1Y19hIiwNCiAgICAgICAgIG1vZGVsID0gMywNCiAgICAgICAgIG1vZGVsX3R5cGUgPSAyKQ0KDQogIHByX21vZGVsX2VkdWNfZGYgPC0gbG0oDQogICAgRmVkdWNfYSB+IDEgKw0KICAgICAgZWR1YyArDQogICAgICBhZ2UgKw0KICAgICAgYXMuZmFjdG9yKG1hcnJpZWQpICsNCiAgICAgIGFzLmZhY3RvcihvcmlnaW4pICsNCiAgICAgIGFzLmZhY3Rvcih3b3JrKSArDQogICAgICBpbmNfbG4gKw0KICAgICAgc3RlZCArDQogICAgICBhYW50YWxraSwNCiAgICBkYXRhID0gZGF0YV9jbGVhbmVkDQogICkgICAlPiUgDQogIGJyb29tOjp0aWR5KCkgJT4lIA0KICBtdXRhdGUoZGVwX3ZhciA9IkZlZHVjX2EiLA0KICAgICAgICAgbW9kZWwgPSAzLA0KICAgICAgICAgbW9kZWxfdHlwZSA9IDEpDQogIA0KDQplZHVjX2RmIDwtIGZlX21vZGVsX2VkdWNfZGYgJT4lIA0KICBiaW5kX3Jvd3MocHJfbW9kZWxfZWR1Y19kZikNCmBgYA0KDQojIyBGb3VydGggc3RlcDogQ3JlYXRlIGNvZWZmaWNpZW50IHBsb3RzDQoNCmBgYHtyIHBsb3RzIHJyIGZlIHByIG1vZGVsc30NCg0KI0ZlZHVjIGVmZmVjdCBwbG90IGFmdGVyIGNvbnRyb2wNCmVkdWNfY29udHJvbF9wbG90IDwtIGVzdGltYXRlX2RmICU+JQ0KICAjc2VsZWN0IGNvcnJlY3QgdGVybXMuIA0KICBmaWx0ZXIodGVybSA9PSAiRmVkdWNfYSIpICU+JQ0KICBmaWx0ZXIoIShtb2RlbF90eXBlID09IDIgJiBtb2RlbCA9PSAyKSkgJT4lICNubyBtb2RlbCAyIGZvciBGRSBtb2RlbHMNCiAgI2NyZWF0ZSBsYWJlbHMNCiAgbXV0YXRlKA0KICAgIG1vZGVsX3R5cGUgPSBmYWN0b3IoDQogICAgICBtb2RlbF90eXBlLA0KICAgICAgbGV2ZWxzID0gMToyLA0KICAgICAgbGFiZWxzID0gYygiUG9vbGVkIHJlZ3Jlc3Npb24iLA0KICAgICAgICAgICAgICAgICAiRml4ZWQgZWZmZWN0cyIpDQogICAgKSwNCiAgICBzaWcgPSBpZmVsc2UocC52YWx1ZSA8IDAuMDUsIDEsIDApLA0KICAgIG1vZGVsID0gZmFjdG9yKA0KICAgICAgbW9kZWwsDQogICAgICBsZXZlbHMgPSAxOjMsDQogICAgICBsYWJlbHMgPSBjKCJObyBjb250cm9scyIsDQogICAgICAgICAgICAgICAgICJFZHVjLiBlZ28gXG4gY29udHJvbCIsDQogICAgICAgICAgICAgICAgICJBbGwgY29udHJvbHMiKQ0KICAgICksDQogICAgZGVwX3ZhciA9IGNhc2Vfd2hlbihkZXBfdmFyID09ICJjdWx0IiB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICBkZXBfdmFyID09ICJldSIgfiAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGVwX3ZhciA9PSAiaW5jX2RpZmYiIH4gMyksDQogICAgZGVwX3Zhcl9mYWMgPSBmYWN0b3IoDQogICAgICBkZXBfdmFyLA0KICAgICAgbGV2ZWxzID0gMTozLA0KICAgICAgbGFiZWxzID0gYygiQ3VsdHVyYWwgaW5jbHVzaW9uIiwNCiAgICAgICAgICAgICAgICAgIkVVLWludGVncmF0aW9uIiwNCiAgICAgICAgICAgICAgICAgIkluY29tZSBlcXVhbGl0eSIpDQogICAgKSwNCiAgICB0ZXJtID0gY2FzZV93aGVuKA0KICAgICAgdGVybSA9PSAic3RlZCIgfiAxLA0KICAgICAgdGVybSA9PSAiaW5jX2xuIiB+IDIsDQogICAgICB0ZXJtID09ICJlZHVjIiB+IDMsDQogICAgICB0ZXJtID09ICJhcy5mYWN0b3Iod29yaykxIiB+IDQsDQogICAgICB0ZXJtID09ICJhcy5mYWN0b3Iob3JpZ2luKTEiIH4gNSwNCiAgICAgIHRlcm0gPT0gImFzLmZhY3RvcihtYXJyaWVkKTEiIH4gNiwNCiAgICAgIHRlcm0gPT0gImFnZSIgfiA3LA0KICAgICAgdGVybSA9PSAiYWFudGFsa2kiIH4gOA0KICAgICksDQogICAgdGVybV9mYWMgPSBmYWN0b3IodGVybSwNCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSAxOjgsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygNCiAgICAgICAgICAgICAgICAgICAgICAgICJVcmJhbmlzYXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkluY29tZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRWR1Y2F0aW9uIChpbiB5ZWFycykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIldvcmtzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJNaWdyYXRpb24gYmFja2dyb3VuZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAiTWFycmllZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQWdlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICIjIENoaWxkcmVuIg0KICAgICAgICAgICAgICAgICAgICAgICkpDQogICAgDQogICkgJT4lDQogICNjcmVhdGUgcGxvdA0KICBnZ3Bsb3QoYWVzKHkgPSBlc3RpbWF0ZSwNCiAgICAgICAgICAgICB4ID0gYXMuZmFjdG9yKG1vZGVsKSkpICsNCiAgZ2VvbV9obGluZShsaW5ldHlwZSA9ICJkYXNoZWQiLA0KICAgICAgICAgICAgIHlpbnRlcmNlcHQgPSAwLCApICsNCiAgZ2VvbV9saW5lcmFuZ2UoYWVzKA0KICAgIHltaW4gPSBlc3RpbWF0ZSAtIHN0ZC5lcnJvciAqIDEuOTYsDQogICAgeW1heCA9IGVzdGltYXRlICsgc3RkLmVycm9yICogMS45Ng0KICApKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IGFzLmZhY3RvcihzaWcpKSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBmYWNldF9ncmlkKA0KICAgIHJvd3MgPSB2YXJzKGRlcF92YXJfZmFjKSwNCiAgICBjb2xzID0gdmFycyhtb2RlbF90eXBlKSwNCiAgICBzY2FsZXMgPSAgImZyZWUiDQogICkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhkaXNjcmV0ZSA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJEIikgICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWUoDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGRkZGRkYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0ZGRkZGRiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpLA0KICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXkiKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2FucyIsIHNpemUgPSAxMiksDQogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNBOUE5QTkiKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRkZGRkZGIiksDQogICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGRkZGRkYiKQ0KICApICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJFc3RpbWF0ZSIpDQoNCiNzYXZlIHBsb3QNCmdnc2F2ZShwbG90ID0gZWR1Y19jb250cm9sX3Bsb3QsDQogICAgICAgZmlsZSA9ICJwbG90cy9yZXN1bHRzL2VkdWNfY29udHJvbF9wbG90LmpwZyIsDQogICAgICAgZHBpID0gNjAwLCB3aWR0aCA9IDYsIGhlaWdodCA9IDQpDQoNCmZ1bGxfY29udHJvbF9wbG90IDwtIGVzdGltYXRlX2RmICU+JQ0KICAjY29tYmluZSBlc3RpbWF0ZXMgd2l0aCBGZWR1Y2EgZXN0aW1hdGVzDQogIGJpbmRfcm93cyhlZHVjX2RmKSAlPiUNCiAgI2ZpbHRlciBvdXQgaW50ZXJjZXB0IGFuZCBGZWR1Y19hIHRlcm1zDQogIGZpbHRlcigodGVybSAhPSAiKEludGVyY2VwdCkiKSAmICh0ZXJtICE9ICJGZWR1Y19hIikpICU+JQ0KICBmaWx0ZXIobW9kZWwgPT0gMykgJT4lICNvbmx5IGZ1bGwgbW9kZWxzDQogICNjaGFuZ2UgbGFiZWxzDQogIG11dGF0ZSgNCiAgICBtb2RlbF90eXBlID0gZmFjdG9yKA0KICAgICAgbW9kZWxfdHlwZSwNCiAgICAgIGxldmVscyA9IDE6MiwNCiAgICAgIGxhYmVscyA9IGMoIlBvb2xlZCByZWdyZXNzaW9uIiwNCiAgICAgICAgICAgICAgICAgIkZpeGVkIGVmZmVjdHMiKQ0KICAgICksDQogICAgc2lnID0gaWZlbHNlKHAudmFsdWUgPCAwLjA1LCAxLCAwKSwNCiAgICBtb2RlbCA9IGZhY3RvcigNCiAgICAgIG1vZGVsLA0KICAgICAgbGV2ZWxzID0gMTozLA0KICAgICAgbGFiZWxzID0gYygiTm8gY29udHJvbHMiLA0KICAgICAgICAgICAgICAgICAiRWR1Yy4gZWdvIFxuIGNvbnRyb2wiLA0KICAgICAgICAgICAgICAgICAiQWxsIGNvbnRyb2xzIikNCiAgICApLA0KICAgIGRlcF92YXIgPSBjYXNlX3doZW4oDQogICAgICBkZXBfdmFyID09ICJjdWx0IiB+IDEsDQogICAgICBkZXBfdmFyID09ICJldSIgfiAyLA0KICAgICAgZGVwX3ZhciA9PSAiaW5jX2RpZmYiIH4gMywNCiAgICAgIGRlcF92YXIgPT0gIkZlZHVjX2EiIH4gNCwNCiAgICApLA0KICAgIGRlcF92YXJfZmFjID0gZmFjdG9yKA0KICAgICAgZGVwX3ZhciwNCiAgICAgIGxldmVscyA9IDE6NCwNCiAgICAgIGxhYmVscyA9IGMoDQogICAgICAgICJDdWx0dXJhbCBpbmNsdXNpb24iLA0KICAgICAgICAiRVUtaW50ZWdyYXRpb24iLA0KICAgICAgICAiSW5jb21lIGVxdWFsaXR5IiwNCiAgICAgICAgIkNvbmZpZGFudHMnIFxuIGVkdWNhdGlvbiINCiAgICAgICkNCiAgICApLA0KICAgIHRlcm0gPSBjYXNlX3doZW4oDQogICAgICB0ZXJtID09ICJzdGVkIiB+IDEsDQogICAgICB0ZXJtID09ICJpbmNfbG4iIH4gMiwNCiAgICAgIHRlcm0gPT0gImVkdWMiIH4gMywNCiAgICAgIHRlcm0gPT0gImFzLmZhY3Rvcih3b3JrKTEiIH4gNCwNCiAgICAgIHRlcm0gPT0gImFzLmZhY3RvcihvcmlnaW4pMSIgfiA1LA0KICAgICAgdGVybSA9PSAiYXMuZmFjdG9yKG1hcnJpZWQpMSIgfiA2LA0KICAgICAgdGVybSA9PSAiYWdlIiB+IDcsDQogICAgICB0ZXJtID09ICJhYW50YWxraSIgfiA4DQogICAgKSwNCiAgICB0ZXJtX2ZhYyA9IGZhY3RvcigNCiAgICAgIHRlcm0sDQogICAgICBsZXZlbHMgPSAxOjgsDQogICAgICBsYWJlbHMgPSBjKA0KICAgICAgICAiVXJiYW5pc2F0aW9uIiwNCiAgICAgICAgIkluY29tZSIsDQogICAgICAgICJFZHVjYXRpb24gKGluIHllYXJzKSIsDQogICAgICAgICJXb3JrcyIsDQogICAgICAgICJNaWdyYXRpb24gYmFja2dyb3VuZCIsDQogICAgICAgICJNYXJyaWVkIiwNCiAgICAgICAgIkFnZSIsDQogICAgICAgICIjIENoaWxkcmVuIg0KICAgICAgKQ0KICAgICkNCiAgKSAlPiUNCiAgI2NyZWF0ZSBjb2VmIHBsb3QNCiAgZ2dwbG90KGFlcygNCiAgICB5ID0gZXN0aW1hdGUsDQogICAgeCA9IHRlcm1fZmFjLA0KICAgIGdyb3VwID0gYXMuZmFjdG9yKG1vZGVsKQ0KICApKSArDQogIGdlb21faGxpbmUobGluZXR5cGUgPSAiZGFzaGVkIiwNCiAgICAgICAgICAgICB5aW50ZXJjZXB0ID0gMCwgKSArDQogIGdlb21fbGluZXJhbmdlKGFlcygNCiAgICB5bWluID0gZXN0aW1hdGUgLSBzdGQuZXJyb3IgKiAxLjk2LA0KICAgIHltYXggPSBlc3RpbWF0ZSArIHN0ZC5lcnJvciAqIDEuOTYNCiAgKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBhcy5mYWN0b3Ioc2lnKSksDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZmFjZXRfZ3JpZCgNCiAgICByb3dzID0gdmFycyhkZXBfdmFyX2ZhYyksDQogICAgY29scyA9IHZhcnMobW9kZWxfdHlwZSksDQogICAgc2NhbGVzID0gICJmcmVlIg0KICApICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMoZGlzY3JldGUgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAiRCIpICArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRkZGRkZGIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpLA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGRkZGRkYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSwNCiAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IiksDQogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNhbnMiLCBzaXplID0gMTIpLA0KICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjQTlBOUE5IiksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0ZGRkZGRiIpLA0KICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRkZGRkZGIikNCiAgKSArDQogIGxhYnMoeCA9ICIiLA0KICAgICAgIHkgPSAiRXN0aW1hdGUiKQ0KICANCiNzYXZlIHBsb3QNCmdnc2F2ZShwbG90ID0gZnVsbF9jb250cm9sX3Bsb3QsDQogICAgICAgZmlsZSA9ICJwbG90cy9yZXN1bHRzL2Z1bGxfY29udHJvbF9wbG90LmpwZyIsDQogICAgICAgZHBpID0gNjAwLCB3aWR0aCA9IDgsIGhlaWdodCA9IDYpDQpgYGANCg==


Copyright © 2024 Jeroense Thijmen