Figure 7.2: Foreign Aid and Post-Conflict Judicial Independence in Country-Years With and Without Power-Sharing Cabinets
# Libraries
library(tidyverse)
# load data
load("./data/diss_df.rda")
# plot raw data
psaid_judind_plot <- ggplot(diss_df,
aes(x = log(aiddata_AidGDP),
y = LJI_t2)) +
geom_point(size = 1.7, alpha = 0.5) +
geom_smooth(method = "lm") +
facet_wrap( ~ cabinetINC, nrow = 1,
labeller = labeller(cabinetINC = c("0" = "No Power-Sharing",
"1" = "Power-Sharing"))) +
theme_bw() +
theme(strip.text = element_text(size=11)) +
labs(x = "Aid / GDP (log)", y = "Linzer and Staton Judicial Independence")
# Output Manuscript
library(gridExtra)
library(tikzDevice)
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aidps_judind_scatterplot.tex", height = 3.5)
# print(psaid_judind_plot)
# dev.off()
print(psaid_judind_plot)

Figure 7.3: Temporal Dynamics of the Interactive Effect between Power-Sharing and Foreign Aid on Judicial Independence
# Libraries
library(tidyverse)
library(cowplot)
library(lfe)
library(tikzDevice)
# Data
load("./data/diss_df.rda")
diss_df <- diss_df %>%
dplyr::select(-matches("logit"))
# Prepare data frame for multiple plots
judind_vars <- list(
LJI_t1 = diss_df,
LJI_t2 = diss_df,
LJI_t3 = diss_df,
LJI_t4 = diss_df,
LJI_t5 = diss_df,
v2x_jucon_t1 = diss_df,
v2x_jucon_t2 = diss_df,
v2x_jucon_t3 = diss_df,
v2x_jucon_t4 = diss_df,
v2x_jucon_t5 = diss_df
)
# create data frame with list column
judind_vars <- enframe(judind_vars)
# define function that will be applied to every data frame in the list column
main_model <- function(lead_type, data) {
data <- as.data.frame(data)
data$lead_var <- data[, grep(lead_type, names(data), value =T)]
model <- lfe::felm(lead_var ~
cabinetCOUNT *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh | 0 | 0 | GWNo,
data=data)
return(model)
}
# fit models & post-process data for plotting
model_all <- judind_vars %>%
dplyr::mutate(model = map2(name, value, ~ main_model(.x, .y)))
model_out <- model_all %>%
mutate(coef = map(model, broom::tidy)) %>%
unnest(coef) %>%
# keep only interaction term coefs
filter(term == "cabinetCOUNT:aiddata_AidGDP_ln") %>%
mutate(dem_score = ifelse(grepl("LJI", name), "LJI", "V-Dem")) %>%
dplyr::select(dem_score, name, estimate, std.error) %>%
group_by(dem_score) %>%
mutate(name = 1:5)
temp_dyn_rol <- model_out
save(temp_dyn_rol, file = "./data/temp_dyn_rol.rda")
temp_dynamics_plot <- ggplot(model_out,
aes(x = name,
y = estimate,
group = dem_score, color = dem_score)) +
geom_point( aes(group = dem_score), size = 1.7,
position = position_dodge(width = .5)) +
geom_errorbar(aes(ymin = estimate - 1.67 * std.error,
ymax = estimate + 1.67 * std.error,
linetype = dem_score),
width = 0,
position = position_dodge(width = .5)) +
geom_hline(yintercept = 0, linetype = 2) +
scale_color_manual("", values = c("#4575b4", "#e41a1c")) +
scale_linetype_manual("", values = c(1, 5)) +
theme_bw()+
labs(x = "Year after t0", y = "Estimate of Interaction Coefficient \n between Power-Sharing (cabinet)\n and Aid/GDP (log)") +
theme(legend.position = "bottom") +
theme(legend.key.size=unit(3,"lines")) # +
# annotate("rect", xmin=1.5, xmax=2.5, ymin=-Inf, ymax=Inf, alpha=.1, fill="blue")
# Output for manuscript
# options(tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/temp_dynamics_plot_judind.tex", height = 3.5)
# print(temp_dynamics_plot)
# dev.off()
# Output for replication archive
print(temp_dynamics_plot)

Figure 7.4: Marginal Effects of Aid and Power-Sharing on Post-Conflict Judicial Independence
# Libraries
library(tidyverse)
library(rms)
library(tikzDevice)
# Load data
load("./data/diss_df.rda")
# Estimate Models for plotting later
# LJI
model_aidps_judind_LJI_cabinc<- ols(LJI_t2 ~
cabinetINC *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_aidps_judind_LJI_cabinc <- robcov(model_aidps_judind_LJI_cabinc, diss_df$GWNo)
model_aidps_judind_LJI_cabcount <- ols(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_aidps_judind_LJI_cabcount <- robcov(model_aidps_judind_LJI_cabcount, diss_df$GWNo)
# plot marginal effects
source("functions/interaction_plots.R")
# # Output for manuscript
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aidps_interaction_judind_plot.tex", height = 3.5)
#
# par(mfrow=c(1,3),
# mar = c(5, 7, 4, 0.5),
# cex.lab = 1.3,
# cex.axis = 1.3,
# mgp = c(3.5, 1, 0))
#
# interaction_plot_continuous(model_aidps_judind_LJI_cabcount,
# "cabinetCOUNT",
# "aiddata_AidGDP_ln",
# "cabinetCOUNT * aiddata_AidGDP_ln",
# title = "",
# ylab = "Marginal effect of Power-Sharing (cabinet) \n on Judicial Independence",
# add_median_effect = T,
# xlab = "a) Aid / GDP (Log)\n",
# conf = .90)
# interaction_plot_continuous(model_aidps_judind_LJI_cabcount,
# "aiddata_AidGDP_ln",
# "cabinetCOUNT",
# "cabinetCOUNT * aiddata_AidGDP_ln",
# title = "",
# add_median_effect = T,
# ylab = "Marginal effect of Aid\n on Judicial Independence",
# xlab = "b) Power-Sharing \n(Number of rebel seats)",
# conf = .90)
# interaction_plot_binary(model_aidps_judind_LJI_cabinc,
# "aiddata_AidGDP_ln",
# "cabinetINC",
# "cabinetINC * aiddata_AidGDP_ln",
# title = "",
# ylab = "Marginal effect of Aid\n on Judicial Independence",
# xlab = "c) Power-Sharing \n(1 = Yes, 0 = No)",
# conf = .90)
# dev.off()
# Output for Replication Archive
par(mfrow=c(1,3),
mar = c(5, 7, 4, 0.5),
cex.lab = 1.3,
cex.axis = 1.3,
mgp = c(3.5, 1, 0))
interaction_plot_continuous(model_aidps_judind_LJI_cabcount,
"cabinetCOUNT",
"aiddata_AidGDP_ln",
"cabinetCOUNT * aiddata_AidGDP_ln",
title = "",
ylab = "Marginal effect of Power-Sharing (cabinet) \n on Judicial Independence",
add_median_effect = T,
xlab = "a) Aid / GDP (Log)\n",
conf = .90)
interaction_plot_continuous(model_aidps_judind_LJI_cabcount,
"aiddata_AidGDP_ln",
"cabinetCOUNT",
"cabinetCOUNT * aiddata_AidGDP_ln",
title = "",
add_median_effect = T,
ylab = "Marginal effect of Aid\n on Judicial Independence",
xlab = "b) Power-Sharing \n(Number of rebel seats)",
conf = .90)
interaction_plot_binary(model_aidps_judind_LJI_cabinc,
"aiddata_AidGDP_ln",
"cabinetINC",
"cabinetINC * aiddata_AidGDP_ln",
title = "",
ylab = "Marginal effect of Aid\n on Judicial Independence",
xlab = "c) Power-Sharing \n(1 = Yes, 0 = No)",
conf = .90)

Figure 7.5: Model Predictions for the Effect of Foreign Aid and Power-Sharing on Post-Conflict Judicial Independence
# Libraries
library(tidyverse)
library(rms)
library(tikzDevice)
library(gridExtra)
# Load data
load("./data/diss_df.rda")
# Estimate Model
diss_df$conflictID <- NULL # conflictID throws an error b/c of missing data
d <- datadist(diss_df); options(datadist='d')
model_aidps_judind_LJI_cabcount <- ols(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_aidps_judind_LJI_cabcount <- robcov(model_aidps_judind_LJI_cabcount, diss_df$GWNo)
# generate predictions at different power-sharing levels
predictions <- Predict(model_aidps_judind_LJI_cabcount,
aiddata_AidGDP_ln = c(0, 3.4), # 0 = 1% Aid / GDP , 3.4 = 30%
cabinetCOUNT = seq(0, 10, 1),
conf.int = 0.9) # 90 % confidence intervals
# generate plot
meplot_aidps_judind_interaction <- ggplot(data.frame(predictions),
aes(x = cabinetCOUNT,
y = yhat,
group = as.factor(exp(aiddata_AidGDP_ln)))) +
geom_line( color = "black", size = 1) +
geom_ribbon(aes(ymax = upper,
ymin = lower,
fill = as.factor(round(exp(aiddata_AidGDP_ln), 0))),
alpha = 0.7) +
scale_fill_manual(values = c("#b3cde3", "#e41a1c"),
name = "Aid in per cent of GDP:") +
scale_x_continuous(breaks = seq(0, 10, 2)) +
theme_bw() +
theme(text = element_text(size=8)) +
labs(x = "Power-Sharing (No. of rebel seats in government)",
y = "LS Judicial Independence") +
theme(legend.position = "bottom")
# At different aid levels
predictions_aid <- Predict(model_aidps_judind_LJI_cabcount,
aiddata_AidGDP_ln, # 0 = 1% Aid / GDP , 3.4 = 30%
cabinetCOUNT = seq(0, 10, length.out = 2),
conf.int = 0.9) # 90 % confidence intervals
# generate plot
meplot_aidps_judind_interaction_aid <- ggplot(data.frame(predictions_aid),
aes(x = exp(aiddata_AidGDP_ln),
y = yhat,
group = as.factor(cabinetCOUNT))) +
geom_line( color = "black", size = 1) +
geom_ribbon(aes(ymax = upper,
ymin = lower,
fill = as.factor(cabinetCOUNT)),
alpha = 0.7) +
scale_fill_manual(values = c("#b3cde3", "#e41a1c"),
name = "Number of rebels \nin the power-sharing coalition:") +
theme_bw() +
theme(text = element_text(size=8)) +
labs(x = "Aid / GDP",
y = "LS Judicial Independence") +
theme(legend.position = "bottom")
# Output manuscript
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aidps_judind_ME.tex", height = 4.5, width = 6.5)
#
# grid.arrange(meplot_aidps_judind_interaction,
# meplot_aidps_judind_interaction_aid,
# nrow = 1)
# dev.off()
# Output Replication Archive
grid.arrange(meplot_aidps_judind_interaction,
meplot_aidps_judind_interaction_aid,
nrow = 1)

Figure 7.6: Probing Mechanisms I: Variation in Types of Power-Sharing and Aid
# Libraries
library(tidyverse)
library(cowplot)
library(lfe)
library(tikzDevice)
# Data
load("./data/diss_df.rda")
diss_df <- diss_df %>%
dplyr::select(-matches("logit")) %>%
mutate(dga_gdp_ln = log(dga_gdp_zero +1 ),
pga_gdp_ln = log(program_aid_gdp_zero + 1),
bga_gdp_ln = log(commodity_aid_gdp_zero + 1))
# Prepare data frame for multiple plots
judind_vars <- list(
cabinetCOUNT = diss_df,
seniorCOUNT = diss_df,
nonseniorCOUNT = diss_df,
dga_gdp_ln = diss_df,
pga_gdp_ln = diss_df,
bga_gdp_ln = diss_df
)
# create data frame with list column
judind_vars <- enframe(judind_vars)
# define function that will be applied to every data frame in the list column
main_model <- function(ind_var, data) {
data <- as.data.frame(data)
data$ind_var <- data[, ind_var]
if(grepl("COUNT", ind_var)) {
model <- lfe::felm(LJI_t2 ~
ind_var *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh | 0 | 0 | GWNo,
data=data)
return(model)
} else {
model <- lfe::felm(LJI_t2 ~
cabinetCOUNT *
ind_var +
log(GDP_per_capita) +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh | 0 | 0 | GWNo,
data=data)
return(model)
}
}
# fit models & post-process data for plotting
model_all <- judind_vars %>%
dplyr::mutate(model = map2(name, value, ~ main_model(.x, .y)))
model_out <- model_all %>%
mutate(coef = map(model, broom::tidy)) %>%
unnest(coef) %>%
# keep only interaction term coefs
filter(grepl(":", term)) %>%
dplyr::select(name, estimate, std.error) %>%
mutate(name = forcats::fct_relevel(name,
c("cabinetCOUNT",
"seniorCOUNT",
"nonseniorCOUNT",
"dga_gdp_ln",
"pga_gdp_ln",
"bga_gdp_ln")))
model_out_rol <- model_out
save(model_out_rol, file= "./data/mechanism_models_rol.rda")
mechanisms_judind_plot <- ggplot(model_out,
aes(x = name,
y = estimate)) +
geom_point( size = 1.7,
position = position_dodge(width = .5)) +
geom_errorbar(aes(ymin = estimate - 1.67 * std.error,
ymax = estimate + 1.67 * std.error),
width = 0,
position = position_dodge(width = .5)) +
geom_hline(yintercept = 0, linetype = 2) +
theme_bw()+
scale_x_discrete(labels = c("Cabinet PS (Baseline)",
"Senior PS",
"Nonsenior PS",
"DGA",
"Program Aid",
"Budget Aid")) +
labs(x = "", y = "Estimate of Interaction Coefficient \n between Different Types of \n Power-Sharing (cabinet) and Aid")
# Output for manuscript
# options(tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/mechanisms_judind_plot.tex", height = 2.75)
# print(mechanisms_judind_plot)
# dev.off()
# Output for replication archive
print(mechanisms_judind_plot)

Table 7.1: Individual Effects of Power-Sharing and Foreign Aid on Post-Conflict Rule of Law
# Libraries
library(texreg)
# source("functions/extract_ols_custom.R")
library(rms)
# load Data
load("./data/diss_df.rda")
#
# diss_df$conflictID <- NULL
# datadist_diss_df <- datadist(diss_df); options(datadist='datadist_diss_df')
# Models
model_ps_lji_cabcount <- ols(LJI_t2 ~
cabinetCOUNT +
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_ps_lji_cabcount <- robcov(model_ps_lji_cabcount, diss_df$GWNo)
model_ps_lji_seniorcount <- ols(LJI_t2 ~
seniorCOUNT +
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_ps_lji_seniorcount <- robcov(model_ps_lji_seniorcount, diss_df$GWNo)
model_ps_lji_nonseniorcount <- ols(LJI_t2 ~
nonseniorCOUNT +
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_ps_lji_nonseniorcount <- robcov(model_ps_lji_nonseniorcount, diss_df$GWNo)
# Aid
model_dga_lji_cabcount <- ols(LJI_t2 ~
cabinetCOUNT +
log(dga_gdp_zero + 1) +
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_dga_lji_cabcount <- robcov(model_dga_lji_cabcount, diss_df$GWNo)
model_pga_lji_cabcount <- ols(LJI_t2 ~
cabinetCOUNT +
log(program_aid_gdp_zero + 1) +
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_pga_lji_cabcount <- robcov(model_pga_lji_cabcount, diss_df$GWNo)
model_bga_lji_cabcount <- ols(LJI_t2 ~
cabinetCOUNT +
log(commodity_aid_gdp_zero + 1) +
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_bga_lji_cabcount <- robcov(model_bga_lji_cabcount, diss_df$GWNo)
# Output
model_list <- list(model_ps_lji_cabcount,
model_ps_lji_seniorcount,
model_ps_lji_nonseniorcount,
model_dga_lji_cabcount,
model_pga_lji_cabcount,
model_bga_lji_cabcount)
coef_name_map <- list(cabinetCOUNT = "Power-Sharing (cabinet)",
seniorCOUNT = "Power-Sharing (senior)",
nonseniorCOUNT = "Power-Sharing (nonsenior)",
"cabinetCOUNT * aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
"cabinetCOUNT:aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
ps_share = "PS (cabinet share)",
"ps_share * aiddata_AidGDP_ln" = "PS (cabinet share) * Aid",
dga_gdp_zero = "DGA/GDP (log)",
program_aid_gdp_zero = "Program Aid/GDP (log)",
commodity_aid_gdp_zero = "Budget Aid/GDP (log)",
aiddata_AidGDP_ln = "Aid / GDP (log)",
ln_gdp_pc = "GDP p/c",
ln_pop = "Population",
conf_intens = "Conflict Intensity",
nonstate = "Non-State Violence",
WBnatres = "Nat. Res. Rents",
fh = "Regime Type (FH)",
polity2 = "Polity",
Ethnic = "Ethnic Frac.",
DS_ordinal = "UN PKO")
# custom functions to write tex output
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
#
# custom_texreg(model_list,
# file = "../output/aid_ps_indeff_judind.tex",
# stars = c(0.001, 0.01, 0.05, 0.1),
# custom.coef.map = coef_name_map,
# symbol = "+",
# table = F,
# booktabs = T,
# use.packages = F,
# dcolumn = T,
# include.rsquared = F,
# include.cluster = T,
# star.symbol = "\\*",
# caption = "",
# include.lr = F)
# custom.multicol = T,
# custom.model.names = c(" \\multicolumn{3}{c}{ \\textbf{Power-Sharing}} & \\multicolumn{3}{c}{ \\textbf{Foreign Aid}} \\\\ \\cmidrule(r){2-4} \\cmidrule(l){5-7} & \\multicolumn{1}{c}{(1) }",
# "\\multicolumn{1}{c}{(2) }",
# "\\multicolumn{1}{c}{(3) }",
# "\\multicolumn{1}{c}{(4) }",
# "\\multicolumn{1}{c}{(5) }",
# "\\multicolumn{1}{c}{(6) }"))
htmlreg(model_list,
stars = c(0.001, 0.01, 0.05, 0.1),
custom.coef.map = coef_name_map,
symbol = "+",
table = F,
booktabs = T,
use.packages = F,
include.cluster = T,
dcolumn = T,
star.symbol = "\\*",
caption = "",
include.lr = F)
|
Model 1
|
Model 2
|
Model 3
|
Model 4
|
Model 5
|
Model 6
|
Power-Sharing (cabinet)
|
0.00
|
|
|
0.00
|
0.01
|
0.00
|
|
(0.00)
|
|
|
(0.00)
|
(0.00)
|
(0.00)
|
Power-Sharing (senior)
|
|
0.02
|
|
|
|
|
|
|
(0.01)
|
|
|
|
|
Power-Sharing (nonsenior)
|
|
|
0.01
|
|
|
|
|
|
|
(0.01)
|
|
|
|
DGA/GDP (log)
|
|
|
|
0.00
|
|
|
|
|
|
|
(0.03)
|
|
|
Program Aid/GDP (log)
|
|
|
|
|
-0.02
|
|
|
|
|
|
|
(0.03)
|
|
Budget Aid/GDP (log)
|
|
|
|
|
|
-0.01
|
|
|
|
|
|
|
(0.01)
|
Aid / GDP (log)
|
-0.02*
|
-0.02*
|
-0.02*
|
-0.02*
|
-0.01
|
-0.02+
|
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
GDP p/c
|
-0.01
|
-0.01
|
-0.01
|
-0.01
|
-0.02
|
-0.01
|
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.02)
|
Population
|
-0.02+
|
-0.02+
|
-0.02+
|
-0.02+
|
-0.02*
|
-0.02+
|
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
Conflict Intensity
|
0.01
|
0.01
|
0.01
|
0.01
|
0.01
|
0.01
|
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.04)
|
Non-State Violence
|
0.01
|
0.01
|
0.01
|
0.01
|
0.01
|
0.01
|
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.04)
|
Nat. Res. Rents
|
-0.00**
|
-0.00**
|
-0.00*
|
-0.00**
|
-0.00**
|
-0.00*
|
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
Regime Type (FH)
|
0.10***
|
0.10***
|
0.10***
|
0.10***
|
0.10***
|
0.10***
|
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
Num. obs.
|
272
|
272
|
272
|
272
|
272
|
272
|
R2
|
0.59
|
0.59
|
0.59
|
0.59
|
0.59
|
0.59
|
Adj. R2
|
0.58
|
0.58
|
0.58
|
0.58
|
0.58
|
0.58
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Table 7.2: The Interactive Effect of Power-Sharing and Foreign Aid on Post-Conflict Rule of Law
# Libraries
library(texreg)
# source("functions/extract_ols_custom.R")
library(rms)
# load Data
load("./data/diss_df.rda")
# LJI
model_aidps_judind_LJI_cabinc<- ols(LJI_t2 ~
cabinetINC *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_aidps_judind_LJI_cabinc <- robcov(model_aidps_judind_LJI_cabinc, diss_df$GWNo)
model_aidps_judind_LJI_cabcount <- ols(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_aidps_judind_LJI_cabcount <- robcov(model_aidps_judind_LJI_cabcount, diss_df$GWNo)
# V-Dem
model_aidps_judind_vdem_cabinc <- ols(v2x_jucon_t2 ~
cabinetINC *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_aidps_judind_vdem_cabinc <- robcov(model_aidps_judind_vdem_cabinc, diss_df$GWNo)
model_aidps_judind_vdem_cabcount <- ols(v2x_jucon_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data = diss_df,
x = T, y = T)
model_aidps_judind_vdem_cabcount <- robcov(model_aidps_judind_vdem_cabcount, diss_df$GWNo)
# model list:
model_list <- list(model_aidps_judind_LJI_cabinc,
model_aidps_judind_LJI_cabcount,
model_aidps_judind_vdem_cabinc,
model_aidps_judind_vdem_cabcount)
coef_name_map <- list(
cabinetINC = "Power-Sharing (binary)",
"cabinetINC * aiddata_AidGDP_ln" = "Power-Sharing (binary) * Aid",
cabinetCOUNT = "Power-Sharing (cabinet)",
"cabinetCOUNT * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid",
"cabinetCOUNT:aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
ps_share = "PS (cabinet share)",
"ps_share * aiddata_AidGDP_ln" = "PS (cabinet share) * Aid",
dga_gdp_zero = "DGA/GDP (log)",
program_aid_gdp_zero = "Program Aid/GDP (log)",
commodity_aid_gdp_zero = "Budget Aid/GDP (log)",
aiddata_AidGDP_ln = "Aid / GDP (log)",
ln_gdp_pc = "GDP p/c (log)",
ln_pop = "Population (log)",
conf_intens = "Conflict Intensity",
nonstate = "Non-State Violence",
WBnatres = "Nat. Res. Rents",
polity2 = "Polity",
fh = "Regime Type (FH)",
Ethnic = "Ethnic Frac.",
DS_ordinal = "UN PKO")
# custom functions to write tex output
# source("functions/extract_ols_custom.R")
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
#
# custom_texreg(model_list,
# stars = c(0.001, 0.01, 0.05, 0.1),
# custom.coef.map = coef_name_map,
# symbol = "+",
# file = "../output/aidps_judind_main.tex",
# table = F,
# booktabs = T,
# use.packages = F,
# dcolumn = T,
# custom.multicol = T,
# custom.model.names = c(" \\multicolumn{2}{c}{ \\textbf{LJI}} & \\multicolumn{2}{c}{ \\textbf{V-Dem}} \\\\ \\cmidrule(r){2-3} \\cmidrule(l){4-5} & \\multicolumn{1}{c}{(1) }",
# "\\multicolumn{1}{c}{(2) }",
# "\\multicolumn{1}{c}{(3) }",
# "\\multicolumn{1}{c}{(4) }"),
# include.cluster = T,
# include.rsquared = F,
# star.symbol = "\\*",
# include.lr = F)
#
# texreg::htmlreg(model_list,
# stars = c(0.001, 0.01, 0.05, 0.1),
# custom.coef.map = coef_name_map,
# symbol = "+",
# table = F,
# booktabs = T,
# use.packages = F,
# dcolumn = T,
# include.cluster = T,
# include.rsquared = F,
# star.symbol = "\\*",
# include.lr = F,
# caption = "")
Table 7.3: Power-Sharing, Foreign Aid and Post-Conflict Rule of Law: Robustness Checks
# Libraries
library(texreg)
source("functions/extract_ols_custom.R")
source("./functions/extract_plm_custom.R")
library(tidyverse)
library(rms)
library(plm)
library(countrycode)
# load Data
load("./data/diss_df.rda")
# Ethnic
model_interaction_judind_LJI_Ethnic<- ols(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh +
Ethnic
,
data = diss_df,
x = T, y = T)
model_interaction_judind_LJI_Ethnic <- robcov(model_interaction_judind_LJI_Ethnic, diss_df$GWNo)
# PKO
model_interaction_judind_LJI_PKO <- ols(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh +
DS_ordinal
,
data = diss_df,
x = T, y = T)
model_interaction_judind_LJI_PKO <- robcov(model_interaction_judind_LJI_PKO, diss_df$GWNo)
# Cabinet Share
library(readxl)
cnts <- read_excel("./data/CNTSDATA.xls")
cnts <- cnts %>% filter(year >= 1989)
cnts$iso3c <- countrycode(cnts$country, "country.name", "iso3c")
cnts <- cnts %>% filter(country != "SOMALILAND")
testcabsize <- left_join(diss_df, cnts[, c("iso3c", "year", "polit10")])
testcabsize$ps_share <- testcabsize$cabinetCOUNT / testcabsize$polit10 * 100
model_cabsize_judind <- ols(LJI_t2 ~
ps_share *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh,
data = testcabsize, x = T, y = T)
model_cabsize_judind <- robcov(model_cabsize_judind, testcabsize$GWNo)
# Regional Mean
model_interaction_judind_LJI_regmean <- ols(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh +
LJI_regional_mean
,
data = diss_df,
x = T, y = T)
model_interaction_judind_LJI_regmean <- robcov(model_interaction_judind_LJI_regmean , diss_df$GWNo)
# Commonlaw
model_interaction_judind_LJI_commonlaw <- ols(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh +
commonlaw
,
data = diss_df,
x = T, y = T)
model_interaction_judind_LJI_commonlaw <- robcov(model_interaction_judind_LJI_commonlaw, diss_df$GWNo)
# Constitutional Duration
model_interaction_judind_LJI_constdur<- ols(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh +
duration_constitution
,
data = diss_df,
x = T, y = T)
model_interaction_judind_LJI_constdur <- robcov(model_interaction_judind_LJI_constdur, diss_df$GWNo)
#
#
# # All controls
# model_interaction_judind_LJI_allcontrols <- ols(LJI_t2 ~
# cabinetCOUNT *
# aiddata_AidGDP_ln +
# ln_gdp_pc +
# ln_pop +
# conf_intens +
# nonstate +
# WBnatres +
# fh +
# Ethnic +
# DS_ordinal +
# LJI_regional_mean +
# commonlaw +
# duration_constitution
# ,
# data = diss_df,
# x = T, y = T)
# model_interaction_judind_LJI_allcontrols <- robcov(model_interaction_judind_LJI_allcontrols, diss_df$GWNo)
# Random Effects
model_interaction_judind_LJI_RE <- plm(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
model = "random",
index = c("country", "year"),
data = diss_df,
x = T, y = T)
series conflictID is NA and has been removed series conflictdummy, xnewconflictinyearv412, xonset1v412, xonset2v412, xonset5v412, xonset8v412, xonset20v412, xmaxintyearv412, xgovonlyv412, xterronlyv412, xbothgovterrv412, xsumconfv412, xpcyears, xis.pc, xcodingend are constants and have been removed
model_interaction_judind_LJI_RE$vcov <- plm::vcovHC(model_interaction_judind_LJI_RE)
# Region Fixed Effects
model_interaction_judind_LJI_FE <- ols(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh +
region,
# model = "within",
# index = c("region", "country_year"),
data = diss_df,
x = T, y = T)
model_interaction_judind_LJI_FE <- robcov(model_interaction_judind_LJI_FE,diss_df$country)
# Country FEs
model_interaction_judind_LJI_FE_cntry <- plm(LJI_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
model = "within",
index = c("country", "year"),
data = diss_df,
x = T, y = T)
series conflictID is NA and has been removed series conflictdummy, xnewconflictinyearv412, xonset1v412, xonset2v412, xonset5v412, xonset8v412, xonset20v412, xmaxintyearv412, xgovonlyv412, xterronlyv412, xbothgovterrv412, xsumconfv412, xpcyears, xis.pc, xcodingend are constants and have been removed
model_interaction_judind_LJI_FE_cntry$vcov <- plm::vcovHC(model_interaction_judind_LJI_FE_cntry, cluster = "group")
# Output
# Model list
model_list <- list(model_interaction_judind_LJI_Ethnic,
model_interaction_judind_LJI_PKO,
model_cabsize_judind,
model_interaction_judind_LJI_regmean,
model_interaction_judind_LJI_commonlaw,
model_interaction_judind_LJI_constdur,
model_interaction_judind_LJI_RE,
model_interaction_judind_LJI_FE,
model_interaction_judind_LJI_FE_cntry)
## Order of coefficients in output table
name_map_robustness <- list(cabinetCOUNT = "PS (cabinet)",
"cabinetCOUNT * aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
"cabinetCOUNT:aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
ps_share = "PS (cabinet share)",
"ps_share * aiddata_AidGDP_ln" = "PS (cabinet share) * Aid",
aiddata_AidGDP_ln = "Aid / GDP (log)",
ln_gdp_pc = "GDP p/c",
ln_pop = "Population",
conf_intens = "Conflict Intensity",
nonstate = "Non-State Violence",
WBnatres = "Nat. Res. Rents",
polity2 = "Polity",
fh = "Regime Type (FH)",
Ethnic = "Ethnic Frac.",
DS_ordinal = "UN PKO",
LJI_regional_mean = "LJI Regional Mean",
commonlaw = "Common Law",
duration_constitution = "Const. Duration")
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
# # Output Manuscript
# custom_texreg(l = model_list,
# stars = c(0.001, 0.01, 0.05, 0.1),
# symbol = "+",
# table = F,
# booktabs = T,
# use.packages = F,
# dcolumn = T,
# custom.coef.map = name_map_robustness,
# file = "../output/aidps_judind_robustness.tex",
# custom.model.names = c("(1) ELF",
# "(2) PKO",
# "(3) Cab. Size",
# "(4) Regional Mean",
# "(5) Common Law",
# "(6) Const. Duration",
# "(7) RE",
# "(8) Region FE",
# "(9) Country FE"),
#
# star.symbol = "\\*",
# include.lr = F,
# include.cluster = T,
# include.rsquared = F,
# include.variance = F)
# Output Replication Archive
htmlreg(model_list,
stars = c(0.001, 0.01, 0.05, 0.1),
symbol = "+",
table = F,
booktabs = T,
use.packages = F,
dcolumn = T,
custom.coef.map = name_map_robustness,
custom.model.names = c("(1) ELF",
"(2) PKO",
"(3) Cab. Size",
"(4) Regional Mean",
"(5) Common Law",
"(6) Const. Duration",
"(7) RE",
"(8) Region FE",
"(9) Country FE"),
star.symbol = "\\*",
include.lr = F,
include.cluster = T,
include.rsquared = F,
include.variance = F)
Statistical models
|
(1) ELF
|
(2) PKO
|
(3) Cab. Size
|
(4) Regional Mean
|
(5) Common Law
|
(6) Const. Duration
|
(7) RE
|
(8) Region FE
|
(9) Country FE
|
PS (cabinet)
|
0.03***
|
0.02**
|
|
0.02*
|
0.02*
|
0.02**
|
-0.00
|
0.02+
|
-0.00
|
|
(0.01)
|
(0.01)
|
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.00)
|
(0.01)
|
(0.00)
|
PS (cabinet) * Aid
|
-0.01***
|
-0.01**
|
|
-0.01*
|
-0.01+
|
-0.01**
|
0.00
|
-0.01
|
-0.00
|
|
(0.00)
|
(0.00)
|
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
PS (cabinet share)
|
|
|
0.00
|
|
|
|
|
|
|
|
|
|
(0.00)
|
|
|
|
|
|
|
PS (cabinet share) * Aid
|
|
|
-0.00
|
|
|
|
|
|
|
|
|
|
(0.00)
|
|
|
|
|
|
|
Aid / GDP (log)
|
-0.02*
|
-0.02*
|
-0.02*
|
-0.01
|
-0.01*
|
-0.02*
|
-0.00
|
-0.01
|
-0.00
|
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.00)
|
(0.01)
|
(0.00)
|
GDP p/c
|
-0.02
|
-0.02
|
0.00
|
-0.00
|
0.01
|
-0.03
|
0.03***
|
0.03+
|
0.02**
|
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.01)
|
(0.02)
|
(0.01)
|
Population
|
-0.02+
|
-0.02+
|
-0.03*
|
-0.02+
|
-0.02+
|
-0.03*
|
0.00
|
-0.03**
|
0.17*
|
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.02)
|
(0.01)
|
(0.07)
|
Conflict Intensity
|
0.02
|
0.02
|
0.02
|
0.03
|
0.01
|
0.02
|
0.01
|
0.06+
|
-0.00
|
|
(0.04)
|
(0.04)
|
(0.03)
|
(0.03)
|
(0.04)
|
(0.03)
|
(0.02)
|
(0.03)
|
(0.03)
|
Non-State Violence
|
0.03
|
0.01
|
0.01
|
0.01
|
-0.05
|
0.00
|
-0.04*
|
0.02
|
-0.04*
|
|
(0.03)
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.05)
|
(0.03)
|
(0.02)
|
(0.03)
|
(0.02)
|
Nat. Res. Rents
|
-0.00+
|
-0.00*
|
-0.00**
|
-0.00
|
-0.00**
|
-0.00**
|
-0.00***
|
-0.00*
|
-0.00**
|
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
Regime Type (FH)
|
0.10***
|
0.10***
|
0.09***
|
0.07***
|
0.09***
|
0.10***
|
0.04***
|
0.07***
|
0.03***
|
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
Ethnic Frac.
|
-0.12+
|
|
|
|
|
|
|
|
|
|
(0.07)
|
|
|
|
|
|
|
|
|
UN PKO
|
|
-0.00
|
|
|
|
|
|
|
|
|
|
(0.01)
|
|
|
|
|
|
|
|
LJI Regional Mean
|
|
|
|
0.64***
|
|
|
|
|
|
|
|
|
|
(0.13)
|
|
|
|
|
|
Common Law
|
|
|
|
|
0.15**
|
|
|
|
|
|
|
|
|
|
(0.06)
|
|
|
|
|
Const. Duration
|
|
|
|
|
|
0.00+
|
|
|
|
|
|
|
|
|
|
(0.00)
|
|
|
|
Num. obs.
|
272
|
272
|
214
|
272
|
272
|
271
|
272
|
272
|
272
|
Countries
|
46
|
46
|
42
|
46
|
46
|
46
|
46
|
46
|
46
|
Adj. R2
|
0.60
|
0.58
|
0.63
|
0.71
|
0.64
|
0.60
|
0.52
|
0.75
|
0.46
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Table 7.4: Power-Sharing, Foreign Aid and Post-Conflict Rule of Law: Matching and 2SLS Results
# Libraries
library(texreg)
source("functions/extract_ols_custom.R")
source("./functions/extract_plm_custom.R")
library(tidyverse)
library(rms)
library(plm)
library(countrycode)
load("./data/diss_df.rda")
##### Matching #####
library(MatchIt)
library(tidyr)
set.seed(159753)
# prepare data without missings
match_ji_data <- diss_df %>%
ungroup() %>%
dplyr::select(cabinetINC, cabinetCOUNT, seniorINC,
seniorCOUNT, nonseniorINC, nonseniorCOUNT,
aiddata_AidGDP, population, nonstate,
WBnatres, fh, GDP_per_capita, conf_intens,
aiddata_AidGDP_ln, LJI_t2, v2x_jucon_t2, GWNo, year,
pc_period, Location, ln_pop, ln_gdp_pc,
LJI_regional_mean, commonlaw, duration_constitution, Ethnic, polity_chng)
match_ji_data <- match_ji_data[complete.cases(match_ji_data), ]
# generate pretreatment controls
match_ji_data <- match_ji_data %>%
arrange(GWNo, pc_period, year) %>%
group_by(GWNo, pc_period) %>%
mutate(match_aiddata_AidGDP_ln = first(aiddata_AidGDP_ln),
match_pop = first(population),
match_gdp = first(GDP_per_capita),
match_nonstate = first(nonstate),
match_WBnatres = first(WBnatres),
match_fh = first(fh),
match_duration_constitution = first(duration_constitution),
match_LJI_regional_mean = first(LJI_regional_mean))
match_ji_data <- as.data.frame(match_ji_data)
match_ji_res <- matchit(cabinetINC ~
match_aiddata_AidGDP_ln +
log(match_gdp) +
log(match_pop) +
conf_intens + # conf_intens is already pre-treatment
match_nonstate +
log(match_WBnatres + 1) +
match_fh ,
method = "nearest",
ratio = 2,
distance = "mahalanobis",
data = match_ji_data)
# extract data
match_ji_res_df <- match.data(match_ji_res)
# Models
#### Matching: PS * Aid => Judicial Independence
# LJI
model_psaid_matched_LJI <- ols(LJI_t2 ~
cabinetINC *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data=match_ji_res_df , x=T, y=T)
model_psaid_matched_LJI <- rms::robcov(model_psaid_matched_LJI, match.data(match_ji_res)$GWNo)
# V-Dem
model_psaid_matched_vdem <- ols(v2x_jucon_t2 ~
cabinetINC *
aiddata_AidGDP_ln +
ln_gdp_pc +
ln_pop +
conf_intens +
nonstate +
WBnatres +
fh
,
data=match_ji_res_df , x=T, y=T)
model_psaid_matched_vdem <- rms::robcov(model_psaid_matched_vdem, match.data(match_ji_res)$GWNo)
#### Instrumental Variable Regressions ###
# ivreg with Jud Ind
library(AER)
library(ivpack)
library(lmtest)
# load instrument
load(file = "./data/instrumentedAid2.RData")
load("./data/diss_df.rda")
diss_df <- merge(diss_df, instrument_df, by = c("year", "iso2c"), all.x = TRUE)
diss_df$total_sum_except <- as.numeric(diss_df$total_sum_except)
# subset only complete.cases / necessary for cluster.robust.se()
iv_na <- na.omit(diss_df[, c(
"cabinetCOUNT",
"cabinetINC",
"aiddata_Aid",
"aiddata_AidGDP_ln",
"aiddata_AidPC_ln",
"fh",
"GDP_per_capita",
"population",
"conf_intens",
"WBnatres",
"total_sum_except",
"year",
"GWNo",
"GDP",
"nonstate", "LJI_t2", "v2x_jucon_t2")])
##### IV #####
iv_na$aid_instrumented_gdp_ln <- log(iv_na$total_sum_except / iv_na$GDP)
diss_df$aid_instrumented_gdp_ln <- log(diss_df$total_sum_except / diss_df$GDP)
# to proceed with IV estimation I first hard-code the instrument
iv_na$instr_aid_gdp_ln <- log(iv_na$total_sum_except / iv_na$GDP)
# data transformation for Stata
iv_na$ln_gdp_pc <- log(iv_na$GDP_per_capita)
iv_na$ln_pop <- log(iv_na$population)
# stuff for stata
# diss_df$region_num <- as.numeric(as.factor(diss_df$region))
# diss_df$country_year_num <- as.numeric(as.factor(diss_df$country_year))
foreign::write.dta(iv_na, "./data/diss_df_IV.dta")
# hard code interaction variable
iv_na$cabincXaid <- iv_na$aiddata_AidGDP_ln * iv_na$cabinetINC
iv_na$cabincXaid_instr <- iv_na$aid_instrumented_gdp_ln * iv_na$cabinetINC
library(lfe)
model_iv_judind_lji <- felm(LJI_t2 ~
cabinetINC +
ln_gdp_pc +
ln_pop +
nonstate +
conf_intens +
WBnatres +
fh
| 0 | (aiddata_AidGDP_ln|cabincXaid ~ aid_instrumented_gdp_ln + cabincXaid_instr) | GWNo,
data = iv_na)
model_iv_judind_vdem <- felm(v2x_jucon_t2 ~
cabinetINC +
ln_gdp_pc +
ln_pop +
nonstate +
conf_intens +
WBnatres +
fh
| 0 | (aiddata_AidGDP_ln|cabincXaid ~ aid_instrumented_gdp_ln + cabincXaid_instr) | GWNo,
data = iv_na)
# Output Models
## Order of coefficients in output table
name_map <- list(cabinetINC = "Power-Sharing (binary)",
"cabinetINC * aiddata_AidGDP_ln" = "Power-Sharing (binary) * Aid",
"`cabincXaid(fit)`" = "Power-Sharing (binary) * Aid",
"`aiddata_AidGDP_ln(fit)`" = "Aid / GDP (log)",
"aiddata_AidGDP_ln" = "Aid / GDP (log)",
"ln_gdp_pc" = "GDP p/c",
"ln_pop" = "Population",
conf_intens = "Conflict Intensity",
nonstate = "Non-State Violence",
WBnatres = "Nat. Res. Rents",
polity2 = "Regime Type",
fh = "Regime Type")
model_list <- list(model_psaid_matched_LJI, model_psaid_matched_vdem,
model_iv_judind_lji, model_iv_judind_vdem)
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
source("functions/extract_felm_custom.R")
#
# custom_texreg(model_list,
# stars = c(0.001, 0.01, 0.05, 0.1),
# custom.coef.map = name_map,
# symbol = "+",
# file = "../output/aidps_judind_matching2sls.tex",
# table = F,
# booktabs = T,
# use.packages = F,
# add.lines = list(c("Countries",
# length(unique(match_ji_res_df$GWNo)),
# length(unique(match_ji_res_df$GWNo)),
# length(unique(diss_df$GWNo)),
# length(unique(diss_df$GWNo))),
# c("Kleibergen-Paap rk Wald F statistic",
# "",
# "",
# "40.32",
# "40.32")),
# dcolumn = T,
# custom.multicol = T,
# custom.model.names = c(" \\multicolumn{2}{c}{ \\textbf{Matching}} & \\multicolumn{2}{c}{ \\textbf{2SLS}} \\\\ \\cmidrule(r){2-3} \\cmidrule(l){4-5} & \\multicolumn{1}{c}{(1) LJI }",
# "\\multicolumn{1}{c}{(2) V-Dem }",
# "\\multicolumn{1}{c}{(3) LJI }",
# "\\multicolumn{1}{c}{(4) V-Dem }"),
# include.cluster = F,
# include.rsquared = F,
# star.symbol = "\\*",
# include.adjrs = T,
# include.lr = F)
texreg::htmlreg(model_list,
stars = c(0.001, 0.01, 0.05, 0.1),
custom.coef.map = name_map,
symbol = "+",
table = F,
booktabs = T,
use.packages = F,
dcolumn = T,
include.cluster = T,
include.rsquared = F,
star.symbol = "\\*",
include.lr = F,
caption = "")
|
Model 1
|
Model 2
|
Model 3
|
Model 4
|
Power-Sharing (binary)
|
0.11*
|
0.23*
|
0.11*
|
0.22*
|
|
(0.05)
|
(0.10)
|
(0.05)
|
(0.10)
|
Power-Sharing (binary) * Aid
|
-0.05**
|
-0.07*
|
-0.05**
|
-0.06+
|
|
(0.02)
|
(0.03)
|
(0.02)
|
(0.04)
|
Aid / GDP (log)
|
-0.01
|
-0.01
|
-0.00
|
0.02
|
|
(0.01)
|
(0.02)
|
(0.01)
|
(0.03)
|
GDP p/c
|
0.01
|
-0.05
|
-0.00
|
-0.01
|
|
(0.02)
|
(0.04)
|
(0.02)
|
(0.04)
|
Population
|
-0.01
|
0.01
|
-0.02
|
0.01
|
|
(0.01)
|
(0.02)
|
(0.01)
|
(0.02)
|
Conflict Intensity
|
0.08*
|
0.01
|
0.01
|
-0.04
|
|
(0.03)
|
(0.07)
|
(0.04)
|
(0.06)
|
Non-State Violence
|
-0.05
|
-0.02
|
0.01
|
0.01
|
|
(0.03)
|
(0.07)
|
(0.04)
|
(0.05)
|
Nat. Res. Rents
|
-0.00*
|
0.00
|
-0.00*
|
-0.00
|
|
(0.00)
|
(0.00)
|
(0.00)
|
(0.00)
|
Regime Type
|
0.08***
|
0.12***
|
0.10***
|
0.13***
|
|
(0.01)
|
(0.02)
|
(0.01)
|
(0.02)
|
Num. obs.
|
108
|
108
|
270
|
270
|
Countries
|
25
|
25
|
|
|
Adj. R2
|
0.70
|
0.40
|
0.58
|
0.51
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Supplement: Stata code to generate F-Statistics for IV/2SLS models
use ".\data\diss_df_iv.dta", replace
* Generate interactions & interactions with instrument
gen cabXaid = cabinetINC * aiddata_AidGDP_ln
gen cabXaid_instr = cabinetINC * aid_instrumented_gdp_ln
* estimate 2SLS for judicial independence
ivreg2 LJI_t2 cabinetINC ln_gdp_pc ln_pop nonstate conf_intens WBnatres fh ///
(aiddata_AidGDP_ln cabXaid = aid_instrumented_gdp_ln cabXaid_instr), cluster(GWNo) first
LS0tDQp0aXRsZTogIkNoYXB0ZXIgNzogUnVsZSBvZiBMYXciDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQoNCi0tLQ0KDQojIEZpZ3VyZSA3LjE6IEp1ZGljaWFsIEluZGVwZW5kZW5jZSwgUG93ZXItU2hhcmluZywgYW5kIEFpZDogSW5kaXZpZHVhbCBQYXR0ZXJucw0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgZmlnLmhlaWdodCA9IDMuNSwgY2FjaGUgPSBULCBjb21tZW50cyA9IEYsIGRldiA9ICJDYWlyb1BORyJ9DQoNCmxpYnJhcnkodGV4cmVnKQ0Kc291cmNlKCJmdW5jdGlvbnMvZXh0cmFjdF9vbHNfY3VzdG9tLlIiKQ0KDQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkodGlrekRldmljZSkNCg0KIyBMb2FkIERhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCiMgTGFiZWxzIGZvciBlYXNpZXIgcGxvdHRpbmcNCmRpc3NfZGYkY2FiaW5ldElOQ2xhYmVsIDwtIGlmZWxzZShkaXNzX2RmJGNhYmluZXRJTkMgPT0gMSwgIlBvd2VyLVNoYXJpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBcblBvd2VyLVNoYXJpbmciKQ0KDQojIFBTID0+IEp1ZEluZA0KcGxvdF9wc19qdWRpbmNfTEpJIDwtIGdncGxvdChkaXNzX2RmLCBhZXMoeCA9IGNhYmluZXRJTkNsYWJlbCwgeSA9IExKSV90MikpICsgDQogIGdlb21faml0dGVyKHNpemUgPSAxLjcsIGFscGhhID0gMC41LCBoZWlnaHQgPSAwKSArDQogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IGNhYmluZXRJTkNsYWJlbCksIGFscGhhID0gMC42KSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiQmx1ZXMiKSArIA0KICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gMSksIGZ1bi55ID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjMsDQogICAgICAgICAgICAgICBzaXplID0gNCwgZmlsbCA9ICIjZDcxOTFjIiwgY29sb3IgPSAiI2Q3MTkxYyIpICsgDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIkxKSSIpDQoNCnBsb3RfYWxsYWlkX0xKSSA8LSBnZ3Bsb3QoZGlzc19kZiwgYWVzKHggPSBsb2coYWlkZGF0YV9BaWRHRFApLCB5ID0gTEpJX3QyKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMS43LCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHggPSAiQWxsIEFpZCAvIEdEUCAobG9nKSIsIHkgPSAiTEpJIikgDQoNCiMgRm9yIE1hbnVzY3JpcHQNCiMgb3B0aW9ucyggdGlrekRvY3VtZW50RGVjbGFyYXRpb24gPSAiXFxkb2N1bWVudGNsYXNzWzExcHRde2FydGljbGV9IiApDQojIHRpa3ooIi4uL2ZpZ3VyZXMvYWlkX3BzX2luZGVmZl9qdWRpbmQudGV4IiwgaGVpZ2h0ID0gMy41KQ0KIyBjb3dwbG90OjpwbG90X2dyaWQocGxvdF9wc19qdWRpbmNfTEpJLCBwbG90X2FsbGFpZF9MSkksIG5yb3cgPSAxKQ0KIyBkZXYub2ZmKCkNCg0KIyBGb3IgUmVwbGljYXRpb24gQXJjaGl2ZQ0KY293cGxvdDo6cGxvdF9ncmlkKHBsb3RfcHNfanVkaW5jX0xKSSwgcGxvdF9hbGxhaWRfTEpJLCBucm93ID0gMSkNCg0KYGBgDQoNCg0KIyBGaWd1cmUgNy4yOiBGb3JlaWduIEFpZCBhbmQgUG9zdC1Db25mbGljdCBKdWRpY2lhbCBJbmRlcGVuZGVuY2UgaW4gQ291bnRyeS1ZZWFycyBXaXRoIGFuZCBXaXRob3V0IFBvd2VyLVNoYXJpbmcgQ2FiaW5ldHMNCmBgYHtyLCBmaWcuYWxpZ24gPSAiY2VudGVyIixmaWcuaGVpZ2h0ID0gMy41LCAgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCB3aWR0aCA9IDksIGhlaWdodCA9IDcsIGRldiA9ICJDYWlyb1BORyJ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KIyBsb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCiMgcGxvdCByYXcgZGF0YQ0KcHNhaWRfanVkaW5kX3Bsb3QgPC0gZ2dwbG90KGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbG9nKGFpZGRhdGFfQWlkR0RQKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBMSklfdDIpKSArIA0KICBnZW9tX3BvaW50KHNpemUgPSAxLjcsIGFscGhhID0gMC41KSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIGZhY2V0X3dyYXAoIH4gY2FiaW5ldElOQywgbnJvdyA9IDEsDQogICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoY2FiaW5ldElOQyA9IGMoIjAiID0gIk5vIFBvd2VyLVNoYXJpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSIgPSAiUG93ZXItU2hhcmluZyIpKSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTExKSkgKw0KICBsYWJzKHggPSAiQWlkIC8gR0RQIChsb2cpIiwgeSA9ICJMaW56ZXIgYW5kIFN0YXRvbiBKdWRpY2lhbCBJbmRlcGVuZGVuY2UiKQ0KDQojIE91dHB1dCBNYW51c2NyaXB0DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkodGlrekRldmljZSkNCiMgb3B0aW9ucyggdGlrekRvY3VtZW50RGVjbGFyYXRpb24gPSAiXFxkb2N1bWVudGNsYXNzWzExcHRde2FydGljbGV9IiApDQojIHRpa3ooIi4uL2ZpZ3VyZXMvYWlkcHNfanVkaW5kX3NjYXR0ZXJwbG90LnRleCIsIGhlaWdodCA9IDMuNSkNCiMgcHJpbnQocHNhaWRfanVkaW5kX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQoNCnByaW50KHBzYWlkX2p1ZGluZF9wbG90KQ0KDQpgYGANCg0KDQojIEZpZ3VyZSA3LjM6IFRlbXBvcmFsIER5bmFtaWNzIG9mIHRoZSBJbnRlcmFjdGl2ZSBFZmZlY3QgYmV0d2VlbiBQb3dlci1TaGFyaW5nIGFuZCBGb3JlaWduIEFpZCBvbiBKdWRpY2lhbCBJbmRlcGVuZGVuY2UNCmBgYHtyLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCBmaWcuaGVpZ2h0ID0gMy41LCBkZXYgPSAiQ2Fpcm9QTkciIH0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShsZmUpDQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQoNCg0KIyBEYXRhDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQpkaXNzX2RmIDwtIGRpc3NfZGYgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1tYXRjaGVzKCJsb2dpdCIpKSANCg0KIyBQcmVwYXJlIGRhdGEgZnJhbWUgZm9yIG11bHRpcGxlIHBsb3RzDQpqdWRpbmRfdmFycyA8LSBsaXN0KA0KICBMSklfdDEgPSBkaXNzX2RmLA0KICBMSklfdDIgPSBkaXNzX2RmLCANCiAgTEpJX3QzID0gZGlzc19kZiwgDQogIExKSV90NCA9IGRpc3NfZGYsIA0KICBMSklfdDUgPSBkaXNzX2RmLCANCiAgdjJ4X2p1Y29uX3QxID0gZGlzc19kZiwNCiAgdjJ4X2p1Y29uX3QyID0gZGlzc19kZiwgDQogIHYyeF9qdWNvbl90MyA9IGRpc3NfZGYsIA0KICB2MnhfanVjb25fdDQgPSBkaXNzX2RmLCANCiAgdjJ4X2p1Y29uX3Q1ID0gZGlzc19kZg0KKQ0KDQojIGNyZWF0ZSBkYXRhIGZyYW1lIHdpdGggbGlzdCBjb2x1bW4NCmp1ZGluZF92YXJzIDwtIGVuZnJhbWUoanVkaW5kX3ZhcnMpDQoNCiMgZGVmaW5lIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGV2ZXJ5IGRhdGEgZnJhbWUgaW4gdGhlIGxpc3QgY29sdW1uDQptYWluX21vZGVsIDwtIGZ1bmN0aW9uKGxlYWRfdHlwZSwgZGF0YSkgew0KICBkYXRhIDwtIGFzLmRhdGEuZnJhbWUoZGF0YSkNCiAgZGF0YSRsZWFkX3ZhciA8LSBkYXRhWywgZ3JlcChsZWFkX3R5cGUsIG5hbWVzKGRhdGEpLCB2YWx1ZSA9VCldDQogIG1vZGVsIDwtIGxmZTo6ZmVsbShsZWFkX3ZhciB+DQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIGZoIHwgMCB8IDAgfCBHV05vLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YT1kYXRhKQ0KICByZXR1cm4obW9kZWwpDQoNCn0NCg0KDQojIGZpdCBtb2RlbHMgJiBwb3N0LXByb2Nlc3MgZGF0YSBmb3IgcGxvdHRpbmcNCm1vZGVsX2FsbCA8LSBqdWRpbmRfdmFycyAlPiUgDQogIGRwbHlyOjptdXRhdGUobW9kZWwgPSBtYXAyKG5hbWUsIHZhbHVlLCB+IG1haW5fbW9kZWwoLngsIC55KSkpIA0KDQptb2RlbF9vdXQgPC0gbW9kZWxfYWxsICU+JSANCiAgbXV0YXRlKGNvZWYgPSBtYXAobW9kZWwsIGJyb29tOjp0aWR5KSkgJT4lIA0KICB1bm5lc3QoY29lZikgJT4lIA0KICAjIGtlZXAgb25seSBpbnRlcmFjdGlvbiB0ZXJtIGNvZWZzDQogIGZpbHRlcih0ZXJtID09ICJjYWJpbmV0Q09VTlQ6YWlkZGF0YV9BaWRHRFBfbG4iKSAlPiUgDQogIG11dGF0ZShkZW1fc2NvcmUgPSBpZmVsc2UoZ3JlcGwoIkxKSSIsIG5hbWUpLCAiTEpJIiwgIlYtRGVtIikpICU+JSANCiAgZHBseXI6OnNlbGVjdChkZW1fc2NvcmUsIG5hbWUsIGVzdGltYXRlLCBzdGQuZXJyb3IpICU+JSANCiAgZ3JvdXBfYnkoZGVtX3Njb3JlKSAlPiUgDQogIG11dGF0ZShuYW1lID0gMTo1KQ0KDQoNCnRlbXBfZHluX3JvbCA8LSBtb2RlbF9vdXQNCnNhdmUodGVtcF9keW5fcm9sLCBmaWxlID0gIi4vZGF0YS90ZW1wX2R5bl9yb2wucmRhIikNCg0KDQp0ZW1wX2R5bmFtaWNzX3Bsb3QgPC0gZ2dwbG90KG1vZGVsX291dCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbmFtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gZXN0aW1hdGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGRlbV9zY29yZSwgY29sb3IgPSBkZW1fc2NvcmUpKSArDQogIGdlb21fcG9pbnQoIGFlcyhncm91cCA9IGRlbV9zY29yZSksIHNpemUgPSAxLjcsIA0KICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArIA0KICANCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGVzdGltYXRlIC0gMS42NyAqIHN0ZC5lcnJvciwgDQogICAgICAgICAgICAgICAgICAgIHltYXggPSBlc3RpbWF0ZSArIDEuNjcgKiBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9IGRlbV9zY29yZSksIA0KICAgICAgICAgICAgICAgIHdpZHRoID0gMCwNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9IDIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKCIiLCB2YWx1ZXMgPSBjKCIjNDU3NWI0IiwgIiNlNDFhMWMiKSkgKw0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoIiIsIHZhbHVlcyA9IGMoMSwgNSkpICsNCiAgdGhlbWVfYncoKSsgDQogIGxhYnMoeCA9ICJZZWFyIGFmdGVyIHQwIiwgeSA9ICJFc3RpbWF0ZSBvZiBJbnRlcmFjdGlvbiBDb2VmZmljaWVudCBcbiBiZXR3ZWVuIFBvd2VyLVNoYXJpbmcgKGNhYmluZXQpXG4gYW5kIEFpZC9HRFAgKGxvZykiKSArDQogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICB0aGVtZShsZWdlbmQua2V5LnNpemU9dW5pdCgzLCJsaW5lcyIpKSAjICsNCiAgIyBhbm5vdGF0ZSgicmVjdCIsIHhtaW49MS41LCB4bWF4PTIuNSwgeW1pbj0tSW5mLCB5bWF4PUluZiwgYWxwaGE9LjEsIGZpbGw9ImJsdWUiKQ0KDQojIE91dHB1dCBmb3IgbWFudXNjcmlwdA0KIyBvcHRpb25zKHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL3RlbXBfZHluYW1pY3NfcGxvdF9qdWRpbmQudGV4IiwgaGVpZ2h0ID0gMy41KQ0KIyBwcmludCh0ZW1wX2R5bmFtaWNzX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBmb3IgcmVwbGljYXRpb24gYXJjaGl2ZQ0KcHJpbnQodGVtcF9keW5hbWljc19wbG90KQ0KDQpgYGANCg0KIyBGaWd1cmUgNy40OiBNYXJnaW5hbCBFZmZlY3RzIG9mIEFpZCBhbmQgUG93ZXItU2hhcmluZyBvbiBQb3N0LUNvbmZsaWN0IEp1ZGljaWFsIEluZGVwZW5kZW5jZQ0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEYsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQ9My41LCBkZXYgPSAiQ2Fpcm9QTkcifQ0KDQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkodGlrekRldmljZSkNCg0KDQojIExvYWQgZGF0YQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KDQoNCiMgRXN0aW1hdGUgTW9kZWxzIGZvciBwbG90dGluZyBsYXRlcg0KIyBMSkkNCm1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiaW5jPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQyAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmluYyA8LSByb2Jjb3YobW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJpbmMsIGRpc3NfZGYkR1dObykNCg0KDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50IDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50LCBkaXNzX2RmJEdXTm8pDQoNCiMgcGxvdCBtYXJnaW5hbCBlZmZlY3RzDQpzb3VyY2UoImZ1bmN0aW9ucy9pbnRlcmFjdGlvbl9wbG90cy5SIikNCg0KDQojICMgT3V0cHV0IGZvciBtYW51c2NyaXB0DQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL2FpZHBzX2ludGVyYWN0aW9uX2p1ZGluZF9wbG90LnRleCIsIGhlaWdodCA9IDMuNSkNCiMgDQojIHBhcihtZnJvdz1jKDEsMyksDQojICAgICBtYXIgPSBjKDUsIDcsIDQsIDAuNSksDQojICAgICBjZXgubGFiID0gMS4zLA0KIyAgICAgY2V4LmF4aXMgPSAxLjMsDQojICAgICBtZ3AgPSBjKDMuNSwgMSwgMCkpDQojIA0KIyBpbnRlcmFjdGlvbl9wbG90X2NvbnRpbnVvdXMobW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJjb3VudCwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkZGF0YV9BaWRHRFBfbG4iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQgKiBhaWRkYXRhX0FpZEdEUF9sbiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGFiID0gIk1hcmdpbmFsIGVmZmVjdCBvZiBQb3dlci1TaGFyaW5nIChjYWJpbmV0KSBcbiBvbiBKdWRpY2lhbCBJbmRlcGVuZGVuY2UiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tZWRpYW5fZWZmZWN0ID0gVCwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiYSkgQWlkIC8gR0RQIChMb2cpXG4iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAuOTApDQojIGludGVyYWN0aW9uX3Bsb3RfY29udGludW91cyhtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50LCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVCIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVCAqIGFpZGRhdGFfQWlkR0RQX2xuIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tZWRpYW5fZWZmZWN0ID0gVCwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTWFyZ2luYWwgZWZmZWN0IG9mIEFpZFxuIG9uIEp1ZGljaWFsIEluZGVwZW5kZW5jZSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gImIpIFBvd2VyLVNoYXJpbmcgXG4oTnVtYmVyIG9mIHJlYmVsIHNlYXRzKSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gLjkwKQ0KIyBpbnRlcmFjdGlvbl9wbG90X2JpbmFyeShtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmluYywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgImFpZGRhdGFfQWlkR0RQX2xuIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMgKiBhaWRkYXRhX0FpZEdEUF9sbiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNYXJnaW5hbCBlZmZlY3Qgb2YgQWlkXG4gb24gSnVkaWNpYWwgSW5kZXBlbmRlbmNlIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjKSBQb3dlci1TaGFyaW5nIFxuKDEgPSBZZXMsIDAgPSBObykiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gLjkwKQ0KIyBkZXYub2ZmKCkNCg0KIyBPdXRwdXQgZm9yIFJlcGxpY2F0aW9uIEFyY2hpdmUNCnBhcihtZnJvdz1jKDEsMyksDQogICAgbWFyID0gYyg1LCA3LCA0LCAwLjUpLA0KICAgIGNleC5sYWIgPSAxLjMsDQogICAgY2V4LmF4aXMgPSAxLjMsDQogICAgbWdwID0gYygzLjUsIDEsIDApKQ0KDQppbnRlcmFjdGlvbl9wbG90X2NvbnRpbnVvdXMobW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQgKiBhaWRkYXRhX0FpZEdEUF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTWFyZ2luYWwgZWZmZWN0IG9mIFBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIFxuIG9uIEp1ZGljaWFsIEluZGVwZW5kZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tZWRpYW5fZWZmZWN0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gImEpIEFpZCAvIEdEUCAoTG9nKVxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IC45MCkNCmludGVyYWN0aW9uX3Bsb3RfY29udGludW91cyhtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkZGF0YV9BaWRHRFBfbG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVCAqIGFpZGRhdGFfQWlkR0RQX2xuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX21lZGlhbl9lZmZlY3QgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTWFyZ2luYWwgZWZmZWN0IG9mIEFpZFxuIG9uIEp1ZGljaWFsIEluZGVwZW5kZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJiKSBQb3dlci1TaGFyaW5nIFxuKE51bWJlciBvZiByZWJlbCBzZWF0cykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAuOTApDQppbnRlcmFjdGlvbl9wbG90X2JpbmFyeShtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmluYywNCiAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldElOQyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMgKiBhaWRkYXRhX0FpZEdEUF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiID0gIk1hcmdpbmFsIGVmZmVjdCBvZiBBaWRcbiBvbiBKdWRpY2lhbCBJbmRlcGVuZGVuY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjKSBQb3dlci1TaGFyaW5nIFxuKDEgPSBZZXMsIDAgPSBObykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IC45MCkNCg0KDQpgYGANCg0KDQojIEZpZ3VyZSA3LjU6IE1vZGVsIFByZWRpY3Rpb25zIGZvciB0aGUgRWZmZWN0IG9mIEZvcmVpZ24gQWlkIGFuZCBQb3dlci1TaGFyaW5nIG9uIFBvc3QtQ29uZmxpY3QgSnVkaWNpYWwgSW5kZXBlbmRlbmNlDQoNCmBgYHtyLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCBmaWcud2lkdGggPSA2LjUsIGZpZy5oZWlnaHQgPSA0LjUsZGV2ID0gIkNhaXJvUE5HIn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCg0KDQoNCiMgTG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQojIEVzdGltYXRlIE1vZGVsDQpkaXNzX2RmJGNvbmZsaWN0SUQgPC0gTlVMTCAjIGNvbmZsaWN0SUQgdGhyb3dzIGFuIGVycm9yIGIvYyBvZiBtaXNzaW5nIGRhdGENCmQgPC0gZGF0YWRpc3QoZGlzc19kZik7IG9wdGlvbnMoZGF0YWRpc3Q9J2QnKQ0KDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50IDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50LCBkaXNzX2RmJEdXTm8pDQoNCiMgZ2VuZXJhdGUgcHJlZGljdGlvbnMgYXQgZGlmZmVyZW50IHBvd2VyLXNoYXJpbmcgbGV2ZWxzDQpwcmVkaWN0aW9ucyA8LSBQcmVkaWN0KG1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiA9IGMoMCwgMy40KSwgIyAwID0gMSUgQWlkIC8gR0RQICwgMy40ID0gMzAlDQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCA9IHNlcSgwLCAxMCwgMSksIA0KICAgICAgICAgICAgICAgICAgICAgICBjb25mLmludCA9IDAuOSkgIyA5MCAlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQoNCiMgZ2VuZXJhdGUgcGxvdCANCm1lcGxvdF9haWRwc19qdWRpbmRfaW50ZXJhY3Rpb24gPC0gZ2dwbG90KGRhdGEuZnJhbWUocHJlZGljdGlvbnMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gY2FiaW5ldENPVU5ULCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geWhhdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBhcy5mYWN0b3IoZXhwKGFpZGRhdGFfQWlkR0RQX2xuKSkpKSArIA0KICBnZW9tX2xpbmUoIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEpICsgDQogIGdlb21fcmliYm9uKGFlcyh5bWF4ID0gdXBwZXIsIA0KICAgICAgICAgICAgICAgICAgeW1pbiA9IGxvd2VyLCANCiAgICAgICAgICAgICAgICAgIGZpbGwgPSBhcy5mYWN0b3Iocm91bmQoZXhwKGFpZGRhdGFfQWlkR0RQX2xuKSwgMCkpKSwgDQogICAgICAgICAgICAgIGFscGhhID0gMC43KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNiM2NkZTMiLCAiI2U0MWExYyIpLCANCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJBaWQgaW4gcGVyIGNlbnQgb2YgR0RQOiIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgMikpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT04KSkgKw0KICBsYWJzKHggPSAiUG93ZXItU2hhcmluZyAoTm8uIG9mIHJlYmVsIHNlYXRzIGluIGdvdmVybm1lbnQpIiwgDQogICAgICAgeSA9ICJMUyBKdWRpY2lhbCBJbmRlcGVuZGVuY2UiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSANCiAgDQoNCiMgQXQgZGlmZmVyZW50IGFpZCBsZXZlbHMNCnByZWRpY3Rpb25zX2FpZCA8LSBQcmVkaWN0KG1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiwgIyAwID0gMSUgQWlkIC8gR0RQICwgMy40ID0gMzAlDQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCA9IHNlcSgwLCAxMCwgbGVuZ3RoLm91dCA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgY29uZi5pbnQgPSAwLjkpICMgOTAgJSBjb25maWRlbmNlIGludGVydmFscw0KDQojIGdlbmVyYXRlIHBsb3QNCm1lcGxvdF9haWRwc19qdWRpbmRfaW50ZXJhY3Rpb25fYWlkIDwtIGdncGxvdChkYXRhLmZyYW1lKHByZWRpY3Rpb25zX2FpZCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZXhwKGFpZGRhdGFfQWlkR0RQX2xuKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5aGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBhcy5mYWN0b3IoY2FiaW5ldENPVU5UKSkpICsgDQogIGdlb21fbGluZSggY29sb3IgPSAiYmxhY2siLCBzaXplID0gMSkgKyANCiAgZ2VvbV9yaWJib24oYWVzKHltYXggPSB1cHBlciwgDQogICAgICAgICAgICAgICAgICB5bWluID0gbG93ZXIsIA0KICAgICAgICAgICAgICAgICAgZmlsbCA9IGFzLmZhY3RvcihjYWJpbmV0Q09VTlQpKSwgDQogICAgICAgICAgICAgIGFscGhhID0gMC43KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNiM2NkZTMiLCAiI2U0MWExYyIpLCANCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJOdW1iZXIgb2YgcmViZWxzIFxuaW4gdGhlIHBvd2VyLXNoYXJpbmcgY29hbGl0aW9uOiIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT04KSkgKw0KICBsYWJzKHggPSAiQWlkIC8gR0RQIiwgDQogICAgICAgeSA9ICJMUyBKdWRpY2lhbCBJbmRlcGVuZGVuY2UiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSANCg0KIyBPdXRwdXQgbWFudXNjcmlwdA0KIyBvcHRpb25zKCB0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9haWRwc19qdWRpbmRfTUUudGV4IiwgaGVpZ2h0ID0gNC41LCB3aWR0aCA9IDYuNSkNCiMgDQojIGdyaWQuYXJyYW5nZShtZXBsb3RfYWlkcHNfanVkaW5kX2ludGVyYWN0aW9uLCANCiMgICAgICAgICAgICAgIG1lcGxvdF9haWRwc19qdWRpbmRfaW50ZXJhY3Rpb25fYWlkLA0KIyAgICAgICAgICAgICAgbnJvdyA9IDEpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQpncmlkLmFycmFuZ2UobWVwbG90X2FpZHBzX2p1ZGluZF9pbnRlcmFjdGlvbiwgDQogICAgICAgICAgICAgbWVwbG90X2FpZHBzX2p1ZGluZF9pbnRlcmFjdGlvbl9haWQsDQogICAgICAgICAgICAgbnJvdyA9IDEpDQoNCmBgYA0KDQoNCg0KDQojIEZpZ3VyZSA3LjY6IFByb2JpbmcgTWVjaGFuaXNtcyBJOiBWYXJpYXRpb24gaW4gVHlwZXMgb2YgUG93ZXItU2hhcmluZyBhbmQgQWlkDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRixmaWcuaGVpZ2h0ID0gMy41fQ0KDQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGNvd3Bsb3QpDQpsaWJyYXJ5KGxmZSkNCmxpYnJhcnkodGlrekRldmljZSkNCg0KDQojIERhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCmRpc3NfZGYgPC0gZGlzc19kZiAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW1hdGNoZXMoImxvZ2l0IikpICU+JSANCiAgbXV0YXRlKGRnYV9nZHBfbG4gPSBsb2coZGdhX2dkcF96ZXJvICsxICksIA0KICAgICAgICAgcGdhX2dkcF9sbiA9IGxvZyhwcm9ncmFtX2FpZF9nZHBfemVybyArIDEpLCANCiAgICAgICAgIGJnYV9nZHBfbG4gPSBsb2coY29tbW9kaXR5X2FpZF9nZHBfemVybyArIDEpKQ0KDQojIFByZXBhcmUgZGF0YSBmcmFtZSBmb3IgbXVsdGlwbGUgcGxvdHMNCmp1ZGluZF92YXJzIDwtIGxpc3QoDQogIGNhYmluZXRDT1VOVCA9IGRpc3NfZGYsDQogIHNlbmlvckNPVU5UID0gZGlzc19kZiwgDQogIG5vbnNlbmlvckNPVU5UID0gZGlzc19kZiwgDQogIGRnYV9nZHBfbG4gPSBkaXNzX2RmLCANCiAgcGdhX2dkcF9sbiA9IGRpc3NfZGYsIA0KICBiZ2FfZ2RwX2xuID0gZGlzc19kZg0KKQ0KDQojIGNyZWF0ZSBkYXRhIGZyYW1lIHdpdGggbGlzdCBjb2x1bW4NCmp1ZGluZF92YXJzIDwtIGVuZnJhbWUoanVkaW5kX3ZhcnMpDQoNCg0KIyBkZWZpbmUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZXZlcnkgZGF0YSBmcmFtZSBpbiB0aGUgbGlzdCBjb2x1bW4NCm1haW5fbW9kZWwgPC0gZnVuY3Rpb24oaW5kX3ZhciwgZGF0YSkgew0KICBkYXRhIDwtIGFzLmRhdGEuZnJhbWUoZGF0YSkNCiAgZGF0YSRpbmRfdmFyIDwtIGRhdGFbLCBpbmRfdmFyXQ0KDQogIGlmKGdyZXBsKCJDT1VOVCIsIGluZF92YXIpKSB7DQogICAgbW9kZWwgPC0gbGZlOjpmZWxtKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgIGluZF92YXIgKg0KICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICBmaCB8IDAgfCAwIHwgR1dObywNCiAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YSkNCiAgICByZXR1cm4obW9kZWwpDQoNCiAgfSBlbHNlIHsNCiAgICBtb2RlbCA8LSBsZmU6OmZlbG0oTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICoNCiAgICAgICAgICAgICAgICAgICAgICAgaW5kX3ZhciArDQogICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICBmaCB8IDAgfCAwIHwgR1dObywNCiAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YSkNCiAgcmV0dXJuKG1vZGVsKQ0KICB9DQogIA0KDQp9DQoNCg0KIyBmaXQgbW9kZWxzICYgcG9zdC1wcm9jZXNzIGRhdGEgZm9yIHBsb3R0aW5nDQptb2RlbF9hbGwgPC0ganVkaW5kX3ZhcnMgJT4lIA0KICBkcGx5cjo6bXV0YXRlKG1vZGVsID0gbWFwMihuYW1lLCB2YWx1ZSwgfiBtYWluX21vZGVsKC54LCAueSkpKSANCg0KbW9kZWxfb3V0IDwtIG1vZGVsX2FsbCAlPiUgDQogIG11dGF0ZShjb2VmID0gbWFwKG1vZGVsLCBicm9vbTo6dGlkeSkpICU+JSANCiAgdW5uZXN0KGNvZWYpICU+JSANCiAgIyBrZWVwIG9ubHkgaW50ZXJhY3Rpb24gdGVybSBjb2Vmcw0KICBmaWx0ZXIoZ3JlcGwoIjoiLCB0ZXJtKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KG5hbWUsIGVzdGltYXRlLCBzdGQuZXJyb3IpICU+JSANCiAgbXV0YXRlKG5hbWUgPSBmb3JjYXRzOjpmY3RfcmVsZXZlbChuYW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJjYWJpbmV0Q09VTlQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5pb3JDT1VOVCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbnNlbmlvckNPVU5UIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGdhX2dkcF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBnYV9nZHBfbG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZ2FfZ2RwX2xuIikpKQ0KbW9kZWxfb3V0X3JvbCA8LSBtb2RlbF9vdXQNCnNhdmUobW9kZWxfb3V0X3JvbCwgZmlsZT0gIi4vZGF0YS9tZWNoYW5pc21fbW9kZWxzX3JvbC5yZGEiKQ0KDQoNCm1lY2hhbmlzbXNfanVkaW5kX3Bsb3QgPC0gZ2dwbG90KG1vZGVsX291dCwgDQogICAgICAgYWVzKHggPSBuYW1lLCANCiAgICAgICAgICAgeSA9IGVzdGltYXRlKSkgKw0KICBnZW9tX3BvaW50KCBzaXplID0gMS43LCANCiAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArIA0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZXN0aW1hdGUgLSAxLjY3ICogc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IGVzdGltYXRlICsgMS42NyAqIHN0ZC5lcnJvciksIA0KICAgICAgICAgICAgICAgIHdpZHRoID0gMCwNCiAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArDQogDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gMikgKw0KICB0aGVtZV9idygpKyANCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJDYWJpbmV0IFBTIChCYXNlbGluZSkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbmlvciBQUyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uc2VuaW9yIFBTIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJER0EiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2dyYW0gQWlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWRnZXQgQWlkIikpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiRXN0aW1hdGUgb2YgSW50ZXJhY3Rpb24gQ29lZmZpY2llbnQgXG4gYmV0d2VlbiBEaWZmZXJlbnQgVHlwZXMgb2YgXG4gUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgYW5kIEFpZCIpIA0KDQoNCg0KIyBPdXRwdXQgZm9yIG1hbnVzY3JpcHQNCiMgb3B0aW9ucyh0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9tZWNoYW5pc21zX2p1ZGluZF9wbG90LnRleCIsIGhlaWdodCA9IDIuNzUpDQojIHByaW50KG1lY2hhbmlzbXNfanVkaW5kX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBmb3IgcmVwbGljYXRpb24gYXJjaGl2ZQ0KcHJpbnQobWVjaGFuaXNtc19qdWRpbmRfcGxvdCkNCg0KYGBgDQoNCiMgRmlndXJlIDcuNzogUHJvYmluZyBNZWNoYW5pc21zIElJOiBTdHJhdGVnaWVzIEFnYWluc3QgdGhlIEp1ZGljaWFyeQ0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZmlnLmhlaWdodCA9IDMuNX0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShsZmUpDQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQoNCiMgRGF0YQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KZGlzc19kZiA8LSBkaXNzX2RmICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbWF0Y2hlcygibG9naXQiKSkgDQoNCiMgUHJlcGFyZSBkYXRhIGZyYW1lIGZvciBtdWx0aXBsZSBwbG90cw0KanVkaW5kX3ZhcnMgPC0gbGlzdCgNCiAgdjJ4X2p1Y29uX3QyID0gZGlzc19kZiwgIyBqdWRpY2lhbCBjb25zdHJhaW50cyBvbiB0aGUgZXhlY3V0aXZlDQogIHYyanVyZWZvcm1fdDIgPSBkaXNzX2RmLCAjIHJlZm9ybXMgDQogIHYyanVhY2NudF90MiA9IGRpc3NfZGYsDQogIHYyanVwdXJnZV90MiA9IGRpc3NfZGYsDQogIHYyanVwYWNrX3QyID0gZGlzc19kZiANCiAgDQogIA0KKQ0KDQojIGNyZWF0ZSBkYXRhIGZyYW1lIHdpdGggbGlzdCBjb2x1bW4NCmp1ZGluZF92YXJzIDwtIGVuZnJhbWUoanVkaW5kX3ZhcnMpDQoNCiMgZGVmaW5lIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGV2ZXJ5IGRhdGEgZnJhbWUgaW4gdGhlIGxpc3QgY29sdW1uDQptYWluX21vZGVsIDwtIGZ1bmN0aW9uKGxlYWRfdHlwZSwgZGF0YSkgew0KICBkYXRhIDwtIGFzLmRhdGEuZnJhbWUoZGF0YSkNCiAgZGF0YSRsZWFkX3ZhciA8LSBkYXRhWywgZ3JlcChsZWFkX3R5cGUsIG5hbWVzKGRhdGEpLCB2YWx1ZSA9VCldDQogIG1vZGVsIDwtIGxmZTo6ZmVsbShsZWFkX3ZhciB+DQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIGZoIHwgMCB8IDAgfCBHV05vLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YT1kYXRhKQ0KICByZXR1cm4obW9kZWwpDQogIA0KfQ0KDQoNCiMgZml0IG1vZGVscyAmIHBvc3QtcHJvY2VzcyBkYXRhIGZvciBwbG90dGluZw0KbW9kZWxfYWxsIDwtIGp1ZGluZF92YXJzICU+JSANCiAgZHBseXI6Om11dGF0ZShtb2RlbCA9IG1hcDIobmFtZSwgdmFsdWUsIH4gbWFpbl9tb2RlbCgueCwgLnkpKSkgDQoNCm1vZGVsX291dCA8LSBtb2RlbF9hbGwgJT4lIA0KICBtdXRhdGUoY29lZiA9IG1hcChtb2RlbCwgYnJvb206OnRpZHkpKSAlPiUgDQogIHVubmVzdChjb2VmKSAlPiUgDQogICMga2VlcCBvbmx5IGludGVyYWN0aW9uIHRlcm0gY29lZnMNCiAgZmlsdGVyKGdyZXBsKCI6IiwgdGVybSkpICU+JSANCiAgbXV0YXRlKG5hbWUgPSBmb3JjYXRzOjpmY3RfcmVvcmRlcihuYW1lLCBlc3RpbWF0ZSwgc29ydCkpDQoNCm1lY2hhbmlzbXNfcGxvdDIgPC0gZ2dwbG90KG1vZGVsX291dCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbmFtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gZXN0aW1hdGUpKSArDQogIGdlb21fcG9pbnQoIHNpemUgPSAxLjcsIA0KICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArIA0KIA0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZXN0aW1hdGUgLSAxLjY3ICogc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IGVzdGltYXRlICsgMS42NyAqIHN0ZC5lcnJvciksIA0KICAgICAgICAgICAgICAgIHdpZHRoID0gMCwNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gMikgKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIoIiIscGFsZXR0ZSA9ICJTZXQyIikgKw0KICB0aGVtZV9idygpKyANCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJSZWZvcm1zIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHVyZ2VzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNjb3VudGFiaWxpdHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWRpY2lhbCBJbmRlcGVuZGVuY2UgXG4oUmVmZXJlbmNlKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdXJ0IFBhY2tpbmciKSkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICJFc3RpbWF0ZSBvZiBJbnRlcmFjdGlvbiBDb2VmZmljaWVudCBcbiBiZXR3ZWVuIFBvd2VyLVNoYXJpbmcgKGNhYmluZXQpXG4gYW5kIEFpZC9HRFAgKGxvZykiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQoNCiMgb3B0aW9ucyh0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9tZWNoYW5pc21zMl9qdWRpbmRfcGxvdC50ZXgiLCBoZWlnaHQgPSAyLjc1KQ0KIyBwcmludChtZWNoYW5pc21zX3Bsb3QyKQ0KIyBkZXYub2ZmKCkNCg0KcHJpbnQobWVjaGFuaXNtc19wbG90MikNCg0KDQpgYGANCg0KDQoNCiMgVGFibGUgNy4xOiBJbmRpdmlkdWFsIEVmZmVjdHMgb2YgUG93ZXItU2hhcmluZyBhbmQgRm9yZWlnbiBBaWQgb24gUG9zdC1Db25mbGljdCBSdWxlIG9mIExhdw0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGV4cmVnKQ0KIyBzb3VyY2UoImZ1bmN0aW9ucy9leHRyYWN0X29sc19jdXN0b20uUiIpDQpsaWJyYXJ5KHJtcykNCg0KIyBsb2FkIERhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQojIA0KIyBkaXNzX2RmJGNvbmZsaWN0SUQgPC0gTlVMTA0KIyBkYXRhZGlzdF9kaXNzX2RmIDwtIGRhdGFkaXN0KGRpc3NfZGYpOyBvcHRpb25zKGRhdGFkaXN0PSdkYXRhZGlzdF9kaXNzX2RmJykNCg0KIyBNb2RlbHMgDQptb2RlbF9wc19samlfY2FiY291bnQgPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfbGppX2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9wc19samlfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfcHNfbGppX3NlbmlvcmNvdW50IDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5pb3JDT1VOVCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfbGppX3NlbmlvcmNvdW50IDwtIHJvYmNvdihtb2RlbF9wc19samlfc2VuaW9yY291bnQsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfcHNfbGppX25vbnNlbmlvcmNvdW50IDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zZW5pb3JDT1VOVCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfbGppX25vbnNlbmlvcmNvdW50IDwtIHJvYmNvdihtb2RlbF9wc19samlfbm9uc2VuaW9yY291bnQsIGRpc3NfZGYkR1dObykNCg0KIyBBaWQNCm1vZGVsX2RnYV9samlfY2FiY291bnQgPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhkZ2FfZ2RwX3plcm8gICsgMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2RnYV9samlfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2RnYV9samlfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KDQptb2RlbF9wZ2FfbGppX2NhYmNvdW50IDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocHJvZ3JhbV9haWRfZ2RwX3plcm8gICsgMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX3BnYV9samlfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX3BnYV9samlfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfYmdhX2xqaV9jYWJjb3VudCA8LSBvbHMoTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGNvbW1vZGl0eV9haWRfZ2RwX3plcm8gICsgMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2JnYV9samlfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2JnYV9samlfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KIyBPdXRwdXQNCg0KbW9kZWxfbGlzdCA8LSBsaXN0KG1vZGVsX3BzX2xqaV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfcHNfbGppX3NlbmlvcmNvdW50LCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9wc19samlfbm9uc2VuaW9yY291bnQsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2RnYV9samlfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX3BnYV9samlfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2JnYV9samlfY2FiY291bnQpDQoNCmNvZWZfbmFtZV9tYXAgPC0gbGlzdChjYWJpbmV0Q09VTlQgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLA0KICAgICAgICAgICAgICAgICAgICAgIHNlbmlvckNPVU5UID0gIlBvd2VyLVNoYXJpbmcgKHNlbmlvcikiLA0KICAgICAgICAgICAgICAgICAgICAgIG5vbnNlbmlvckNPVU5UID0gIlBvd2VyLVNoYXJpbmcgKG5vbnNlbmlvcikiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQgKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUFMgKGNhYmluZXQpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVDphaWRkYXRhX0FpZEdEUF9sbiIgPSAiUFMgKGNhYmluZXQpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19zaGFyZSA9ICJQUyAoY2FiaW5ldCBzaGFyZSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwc19zaGFyZSAqIGFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQUyAoY2FiaW5ldCBzaGFyZSkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICBkZ2FfZ2RwX3plcm8gPSAiREdBL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW1fYWlkX2dkcF96ZXJvID0gIlByb2dyYW0gQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1vZGl0eV9haWRfZ2RwX3plcm8gPSAiQnVkZ2V0IEFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiA9ICJBaWQgLyBHRFAgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjID0gIkdEUCBwL2MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCA9ICJQb3B1bGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICJDb25mbGljdCBJbnRlbnNpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbi1TdGF0ZSBWaW9sZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSAiTmF0LiBSZXMuIFJlbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyID0gIlBvbGl0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRXRobmljID0gIkV0aG5pYyBGcmFjLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNfb3JkaW5hbCA9ICJVTiBQS08iKQ0KDQojIGN1c3RvbSBmdW5jdGlvbnMgdG8gd3JpdGUgdGV4IG91dHB1dA0Kc291cmNlKCIuL2Z1bmN0aW9ucy9jdXN0b21fdGV4cmVnLlIiKQ0KZW52aXJvbm1lbnQoY3VzdG9tX3RleHJlZykgPC0gYXNOYW1lc3BhY2UoJ3RleHJlZycpDQojIA0KIyBjdXN0b21fdGV4cmVnKG1vZGVsX2xpc3QsDQojICAgICAgICAgICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvYWlkX3BzX2luZGVmZl9qdWRpbmQudGV4IiwNCiMgICAgICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwICA9IGNvZWZfbmFtZV9tYXAsDQojICAgICAgICAgICAgICAgc3ltYm9sID0gIisiLA0KIyAgICAgICAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiMgICAgICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsDQojICAgICAgICAgICAgICAgY2FwdGlvbiA9ICIiLA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUubHIgPSBGKQ0KICAgICAgICAgICAgICAjIGN1c3RvbS5tdWx0aWNvbCA9IFQsDQogICAgICAgICAgICAgICMgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiIFxcbXVsdGljb2x1bW57M317Y317IFxcdGV4dGJme1Bvd2VyLVNoYXJpbmd9fSAmIFxcbXVsdGljb2x1bW57M317Y317IFxcdGV4dGJme0ZvcmVpZ24gQWlkfX0gXFxcXCBcXGNtaWRydWxlKHIpezItNH0gXFxjbWlkcnVsZShsKXs1LTd9ICYgXFxtdWx0aWNvbHVtbnsxfXtjfXsoMSkgIH0iLA0KICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDIpICB9IiwNCiAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eygzKSAgfSIsDQogICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoNCkgIH0iLA0KICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDUpICAgfSIsDQogICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoNikgICB9IikpDQoNCg0KaHRtbHJlZyhtb2RlbF9saXN0LCANCiAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLCANCiAgICAgICAgY3VzdG9tLmNvZWYubWFwICA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICAgdGFibGUgPSBGLA0KICAgICAgICBib29rdGFicyA9IFQsDQogICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQogICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsIA0KICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQogICAgICAgIGNhcHRpb24gPSAiIiwNCiAgICAgICAgaW5jbHVkZS5sciA9IEYpDQoNCg0KYGBgDQoNCg0KIyBUYWJsZSA3LjI6IFRoZSBJbnRlcmFjdGl2ZSBFZmZlY3Qgb2YgUG93ZXItU2hhcmluZyBhbmQgRm9yZWlnbiBBaWQgb24gUG9zdC1Db25mbGljdCBSdWxlIG9mIExhdw0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGV4cmVnKQ0KIyBzb3VyY2UoImZ1bmN0aW9ucy9leHRyYWN0X29sc19jdXN0b20uUiIpDQpsaWJyYXJ5KHJtcykNCg0KDQojIGxvYWQgRGF0YQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KIyBMSkkNCm1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiaW5jPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQyAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmluYyA8LSByb2Jjb3YobW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJpbmMsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJjb3VudCA8LSBvbHMoTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KIyBWLURlbQ0KbW9kZWxfYWlkcHNfanVkaW5kX3ZkZW1fY2FiaW5jIDwtIG9scyh2MnhfanVjb25fdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0SU5DICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19qdWRpbmRfdmRlbV9jYWJpbmMgPC0gcm9iY292KG1vZGVsX2FpZHBzX2p1ZGluZF92ZGVtX2NhYmluYywgZGlzc19kZiRHV05vKQ0KDQoNCg0KbW9kZWxfYWlkcHNfanVkaW5kX3ZkZW1fY2FiY291bnQgPC0gb2xzKHYyeF9qdWNvbl90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfanVkaW5kX3ZkZW1fY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2FpZHBzX2p1ZGluZF92ZGVtX2NhYmNvdW50LCBkaXNzX2RmJEdXTm8pDQoNCiMgbW9kZWwgbGlzdDoNCm1vZGVsX2xpc3QgPC0gbGlzdChtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmluYywgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfYWlkcHNfanVkaW5kX3ZkZW1fY2FiaW5jLA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2FpZHBzX2p1ZGluZF92ZGVtX2NhYmNvdW50KQ0KDQpjb2VmX25hbWVfbWFwIDwtIGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQyA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpIiwNCiAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldElOQyAqIGFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLA0KICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQgKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UOmFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQUyAoY2FiaW5ldCkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgIHBzX3NoYXJlID0gIlBTIChjYWJpbmV0IHNoYXJlKSIsDQogICAgICAgICAgICAgICAgICAgICAgInBzX3NoYXJlICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBTIChjYWJpbmV0IHNoYXJlKSAqIEFpZCIsDQogICAgICAgICAgICAgICAgICAgICAgZGdhX2dkcF96ZXJvID0gIkRHQS9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtX2FpZF9nZHBfemVybyA9ICJQcm9ncmFtIEFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICBjb21tb2RpdHlfYWlkX2dkcF96ZXJvID0gIkJ1ZGdldCBBaWQvR0RQIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gPSAiQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgPSAiR0RQIHAvYyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgbG5fcG9wID0gIlBvcHVsYXRpb24gKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLA0KICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTIgPSAiUG9saXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwNCiAgICAgICAgICAgICAgICAgICAgICBFdGhuaWMgPSAiRXRobmljIEZyYWMuIiwNCiAgICAgICAgICAgICAgICAgICAgICBEU19vcmRpbmFsID0gIlVOIFBLTyIpDQoNCiMgY3VzdG9tIGZ1bmN0aW9ucyB0byB3cml0ZSB0ZXggb3V0cHV0DQojIHNvdXJjZSgiZnVuY3Rpb25zL2V4dHJhY3Rfb2xzX2N1c3RvbS5SIikNCnNvdXJjZSgiLi9mdW5jdGlvbnMvY3VzdG9tX3RleHJlZy5SIikNCmVudmlyb25tZW50KGN1c3RvbV90ZXhyZWcpIDwtIGFzTmFtZXNwYWNlKCd0ZXhyZWcnKQ0KIyANCiMgY3VzdG9tX3RleHJlZyhtb2RlbF9saXN0LCANCiMgICAgICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwNCiMgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvYWlkcHNfanVkaW5kX21haW4udGV4IiwgDQojICAgICAgICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsDQojICAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiIFxcbXVsdGljb2x1bW57Mn17Y317IFxcdGV4dGJme0xKSX19ICYgXFxtdWx0aWNvbHVtbnsyfXtjfXsgXFx0ZXh0YmZ7Vi1EZW19fSBcXFxcIFxcY21pZHJ1bGUocil7Mi0zfSBcXGNtaWRydWxlKGwpezQtNX0gJiBcXG11bHRpY29sdW1uezF9e2N9eygxKSAgfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoMikgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDMpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eyg0KSAgfSIpLA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsIA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLCANCiMgICAgICAgICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiLCANCiMgICAgICAgICAgICAgICBpbmNsdWRlLmxyID0gRikNCiMgDQojIHRleHJlZzo6aHRtbHJlZyhtb2RlbF9saXN0LCANCiMgICAgICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQojICAgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsIA0KIyAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLCANCiMgICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiLCANCiMgICAgICAgICBpbmNsdWRlLmxyID0gRiwgDQojICAgICAgICAgY2FwdGlvbiA9ICIiKQ0KDQpgYGANCg0KDQoNCg0KIyBUYWJsZSA3LjM6IFBvd2VyLVNoYXJpbmcsIEZvcmVpZ24gQWlkIGFuZCBQb3N0LUNvbmZsaWN0IFJ1bGUgb2YgTGF3OiBSb2J1c3RuZXNzIENoZWNrcw0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGV4cmVnKQ0Kc291cmNlKCJmdW5jdGlvbnMvZXh0cmFjdF9vbHNfY3VzdG9tLlIiKQ0Kc291cmNlKCIuL2Z1bmN0aW9ucy9leHRyYWN0X3BsbV9jdXN0b20uUiIpDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHBsbSkNCmxpYnJhcnkoY291bnRyeWNvZGUpDQoNCg0KIyBsb2FkIERhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCg0KIyBFdGhuaWMNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRXRobmljPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdGhuaWMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRXRobmljIDwtIHJvYmNvdihtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX0V0aG5pYywgZGlzc19kZiRHV05vKQ0KDQojIFBLTw0KbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9QS08gPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTX29yZGluYWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfUEtPIDwtIHJvYmNvdihtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX1BLTywgZGlzc19kZiRHV05vKQ0KDQojIENhYmluZXQgU2hhcmUNCg0KbGlicmFyeShyZWFkeGwpDQpjbnRzIDwtIHJlYWRfZXhjZWwoIi4vZGF0YS9DTlRTREFUQS54bHMiKQ0KDQpjbnRzIDwtIGNudHMgJT4lIGZpbHRlcih5ZWFyID49IDE5ODkpDQoNCmNudHMkaXNvM2MgPC0gY291bnRyeWNvZGUoY250cyRjb3VudHJ5LCAiY291bnRyeS5uYW1lIiwgImlzbzNjIikNCmNudHMgPC0gY250cyAlPiUgZmlsdGVyKGNvdW50cnkgIT0gIlNPTUFMSUxBTkQiKQ0KDQp0ZXN0Y2Fic2l6ZSA8LSBsZWZ0X2pvaW4oZGlzc19kZiwgY250c1ssIGMoImlzbzNjIiwgInllYXIiLCAicG9saXQxMCIpXSkNCg0KdGVzdGNhYnNpemUkcHNfc2hhcmUgPC0gdGVzdGNhYnNpemUkY2FiaW5ldENPVU5UIC8gdGVzdGNhYnNpemUkcG9saXQxMCAqIDEwMA0KDQptb2RlbF9jYWJzaXplX2p1ZGluZCA8LSBvbHMoTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgcHNfc2hhcmUgKg0KICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIGZoLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRlc3RjYWJzaXplLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9jYWJzaXplX2p1ZGluZCA8LSByb2Jjb3YobW9kZWxfY2Fic2l6ZV9qdWRpbmQsIHRlc3RjYWJzaXplJEdXTm8pDQoNCiMgUmVnaW9uYWwgTWVhbg0KbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9yZWdtZWFuIDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSklfcmVnaW9uYWxfbWVhbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9yZWdtZWFuICA8LSByb2Jjb3YobW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9yZWdtZWFuICwgZGlzc19kZiRHV05vKQ0KDQoNCiMgQ29tbW9ubGF3DQptb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2NvbW1vbmxhdyA8LSBvbHMoTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9ubGF3DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2NvbW1vbmxhdyA8LSByb2Jjb3YobW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9jb21tb25sYXcsIGRpc3NfZGYkR1dObykNCg0KDQoNCiMgQ29uc3RpdHV0aW9uYWwgRHVyYXRpb24NCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfY29uc3RkdXI8LSBvbHMoTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25fY29uc3RpdHV0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2NvbnN0ZHVyIDwtIHJvYmNvdihtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2NvbnN0ZHVyLCBkaXNzX2RmJEdXTm8pDQoNCiMgDQojIA0KIyAjIEFsbCBjb250cm9scw0KIyBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2FsbGNvbnRyb2xzIDwtIG9scyhMSklfdDIgfg0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICoNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdGhuaWMgKyANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTX29yZGluYWwgKyANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKSV9yZWdpb25hbF9tZWFuICsgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25sYXcgKyANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX2NvbnN0aXR1dGlvbg0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KIyBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2FsbGNvbnRyb2xzIDwtIHJvYmNvdihtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2FsbGNvbnRyb2xzLCBkaXNzX2RmJEdXTm8pDQoNCg0KIyBSYW5kb20gRWZmZWN0cw0KbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9SRSA8LSBwbG0oTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSAicmFuZG9tIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYygiY291bnRyeSIsICJ5ZWFyIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQoNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfUkUkdmNvdiA8LSBwbG06OnZjb3ZIQyhtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX1JFKQ0KDQoNCiMgUmVnaW9uIEZpeGVkIEVmZmVjdHMNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRkUgPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiwgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9kZWwgPSAid2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZXggPSBjKCJyZWdpb24iLCAiY291bnRyeV95ZWFyIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQoNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRkUgPC0gcm9iY292KG1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRkUsZGlzc19kZiRjb3VudHJ5KQ0KDQojIENvdW50cnkgRkVzDQptb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX0ZFX2NudHJ5IDwtIHBsbShMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBjKCJjb3VudHJ5IiwgInllYXIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRkVfY250cnkkdmNvdiA8LSBwbG06OnZjb3ZIQyhtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX0ZFX2NudHJ5LCBjbHVzdGVyID0gImdyb3VwIikNCg0KIyBPdXRwdXQNCg0KIyBNb2RlbCBsaXN0DQptb2RlbF9saXN0IDwtIGxpc3QobW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9FdGhuaWMsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfUEtPLCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9jYWJzaXplX2p1ZGluZCwgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9yZWdtZWFuLCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2NvbW1vbmxhdywgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9jb25zdGR1ciwNCiAgICAgICAgICAgICAgICAgICBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX1JFLCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX0ZFLCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX0ZFX2NudHJ5KQ0KDQoNCiMjIE9yZGVyIG9mIGNvZWZmaWNpZW50cyBpbiBvdXRwdXQgdGFibGUNCm5hbWVfbWFwX3JvYnVzdG5lc3MgPC0gbGlzdChjYWJpbmV0Q09VTlQgPSAiUFMgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBTIChjYWJpbmV0KSAqIEFpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQ6YWlkZGF0YV9BaWRHRFBfbG4iID0gIlBTIChjYWJpbmV0KSAqIEFpZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfc2hhcmUgPSAiUFMgKGNhYmluZXQgc2hhcmUpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHNfc2hhcmUgKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUFMgKGNhYmluZXQgc2hhcmUpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiA9ICJBaWQgLyBHRFAgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyA9ICJHRFAgcC9jIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgPSAiUG9wdWxhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgPSAiQ29uZmxpY3QgSW50ZW5zaXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSA9ICJOb24tU3RhdGUgVmlvbGVuY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gIk5hdC4gUmVzLiBSZW50cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saXR5MiA9ICJQb2xpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoID0gIlJlZ2ltZSBUeXBlIChGSCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV0aG5pYyA9ICJFdGhuaWMgRnJhYy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTX29yZGluYWwgPSAiVU4gUEtPIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSklfcmVnaW9uYWxfbWVhbiA9ICJMSkkgUmVnaW9uYWwgTWVhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbmxhdyA9ICJDb21tb24gTGF3IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25fY29uc3RpdHV0aW9uID0gIkNvbnN0LiBEdXJhdGlvbiIpDQoNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9jdXN0b21fdGV4cmVnLlIiKQ0KZW52aXJvbm1lbnQoY3VzdG9tX3RleHJlZykgPC0gYXNOYW1lc3BhY2UoJ3RleHJlZycpDQoNCg0KDQojICMgT3V0cHV0IE1hbnVzY3JpcHQNCiMgY3VzdG9tX3RleHJlZyhsID0gbW9kZWxfbGlzdCwNCiMgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgc3ltYm9sID0gIisiLA0KIyAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiMgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBuYW1lX21hcF9yb2J1c3RuZXNzLA0KIyAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2FpZHBzX2p1ZGluZF9yb2J1c3RuZXNzLnRleCIsDQojICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIEVMRiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIFBLTyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDMpIENhYi4gU2l6ZSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQpIFJlZ2lvbmFsIE1lYW4iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNSkgQ29tbW9uIExhdyIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig2KSBDb25zdC4gRHVyYXRpb24iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNykgUkUiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig4KSBSZWdpb24gRkUiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig5KSBDb3VudHJ5IEZFIiksDQojICAgICAgICANCiMgICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiLA0KIyAgICAgICAgIGluY2x1ZGUubHIgPSBGLCANCiMgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULCANCiMgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwgDQojICAgICAgICAgaW5jbHVkZS52YXJpYW5jZSA9IEYpDQoNCiMgT3V0cHV0IFJlcGxpY2F0aW9uIEFyY2hpdmUNCmh0bWxyZWcobW9kZWxfbGlzdCwgDQogICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gbmFtZV9tYXBfcm9idXN0bmVzcywNCiAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIEVMRiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSBQS08iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMykgQ2FiLiBTaXplIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQpIFJlZ2lvbmFsIE1lYW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDUpIENvbW1vbiBMYXciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDYpIENvbnN0LiBEdXJhdGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNykgUkUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoOCkgUmVnaW9uIEZFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDkpIENvdW50cnkgRkUiKSwNCiAgICAgICANCiAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwNCiAgICAgICAgaW5jbHVkZS5sciA9IEYsIA0KICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULCANCiAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsIA0KICAgICAgICBpbmNsdWRlLnZhcmlhbmNlID0gRikNCg0KYGBgDQoNCg0KIyBUYWJsZSA3LjQ6IFBvd2VyLVNoYXJpbmcsIEZvcmVpZ24gQWlkIGFuZCBQb3N0LUNvbmZsaWN0IFJ1bGUgb2YgTGF3OiBNYXRjaGluZyBhbmQgMlNMUyBSZXN1bHRzDQoNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGfQ0KDQojIExpYnJhcmllcw0KbGlicmFyeSh0ZXhyZWcpDQpzb3VyY2UoImZ1bmN0aW9ucy9leHRyYWN0X29sc19jdXN0b20uUiIpDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2V4dHJhY3RfcGxtX2N1c3RvbS5SIikNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkocGxtKQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCg0KDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQojIyMjIyBNYXRjaGluZyAjIyMjIw0KbGlicmFyeShNYXRjaEl0KQ0KbGlicmFyeSh0aWR5cikNCg0Kc2V0LnNlZWQoMTU5NzUzKQ0KIyBwcmVwYXJlIGRhdGEgd2l0aG91dCBtaXNzaW5ncw0KbWF0Y2hfamlfZGF0YSA8LSBkaXNzX2RmICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdChjYWJpbmV0SU5DLCBjYWJpbmV0Q09VTlQsIHNlbmlvcklOQywNCiAgICAgICAgICAgICAgICBzZW5pb3JDT1VOVCwgbm9uc2VuaW9ySU5DLCBub25zZW5pb3JDT1VOVCwNCiAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUCwgcG9wdWxhdGlvbiwgbm9uc3RhdGUsDQogICAgICAgICAgICAgICAgV0JuYXRyZXMsIGZoLCBHRFBfcGVyX2NhcGl0YSwgY29uZl9pbnRlbnMsDQogICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4sIExKSV90MiwgdjJ4X2p1Y29uX3QyLCBHV05vLCB5ZWFyLCANCiAgICAgICAgICAgICAgICBwY19wZXJpb2QsIExvY2F0aW9uLCBsbl9wb3AsIGxuX2dkcF9wYywNCiAgICAgICAgICAgICAgICBMSklfcmVnaW9uYWxfbWVhbiwgY29tbW9ubGF3LCBkdXJhdGlvbl9jb25zdGl0dXRpb24sIEV0aG5pYywgcG9saXR5X2NobmcpDQptYXRjaF9qaV9kYXRhIDwtIG1hdGNoX2ppX2RhdGFbY29tcGxldGUuY2FzZXMobWF0Y2hfamlfZGF0YSksIF0NCg0KIyBnZW5lcmF0ZSBwcmV0cmVhdG1lbnQgY29udHJvbHMNCg0KbWF0Y2hfamlfZGF0YSA8LSBtYXRjaF9qaV9kYXRhICU+JSANCiAgYXJyYW5nZShHV05vLCBwY19wZXJpb2QsIHllYXIpICU+JSANCiAgZ3JvdXBfYnkoR1dObywgcGNfcGVyaW9kKSAlPiUgDQogIG11dGF0ZShtYXRjaF9haWRkYXRhX0FpZEdEUF9sbiA9IGZpcnN0KGFpZGRhdGFfQWlkR0RQX2xuKSwNCiAgICAgICAgIG1hdGNoX3BvcCA9IGZpcnN0KHBvcHVsYXRpb24pLA0KICAgICAgICAgbWF0Y2hfZ2RwID0gZmlyc3QoR0RQX3Blcl9jYXBpdGEpLA0KICAgICAgICAgbWF0Y2hfbm9uc3RhdGUgPSBmaXJzdChub25zdGF0ZSksDQogICAgICAgICBtYXRjaF9XQm5hdHJlcyA9IGZpcnN0KFdCbmF0cmVzKSwNCiAgICAgICAgIG1hdGNoX2ZoID0gZmlyc3QoZmgpLCANCiAgICAgICAgIG1hdGNoX2R1cmF0aW9uX2NvbnN0aXR1dGlvbiA9IGZpcnN0KGR1cmF0aW9uX2NvbnN0aXR1dGlvbiksDQogICAgICAgICBtYXRjaF9MSklfcmVnaW9uYWxfbWVhbiA9IGZpcnN0KExKSV9yZWdpb25hbF9tZWFuKSkNCiAgICANCg0KDQptYXRjaF9qaV9kYXRhIDwtIGFzLmRhdGEuZnJhbWUobWF0Y2hfamlfZGF0YSkNCg0KbWF0Y2hfamlfcmVzIDwtIG1hdGNoaXQoY2FiaW5ldElOQyB+DQogICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2FpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX2dkcCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfcG9wKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgIyBjb25mX2ludGVucyBpcyBhbHJlYWR5IHByZS10cmVhdG1lbnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfV0JuYXRyZXMgKyAxKSAgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9maCAsDQogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAibmVhcmVzdCIsDQogICAgICAgICAgICAgICAgICAgICAgICByYXRpbyA9IDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAibWFoYWxhbm9iaXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG1hdGNoX2ppX2RhdGEpDQoNCiMgZXh0cmFjdCBkYXRhDQptYXRjaF9qaV9yZXNfZGYgPC0gbWF0Y2guZGF0YShtYXRjaF9qaV9yZXMpDQoNCg0KIyBNb2RlbHMNCg0KIyMjIyBNYXRjaGluZzogUFMgKiBBaWQgPT4gSnVkaWNpYWwgSW5kZXBlbmRlbmNlDQoNCiMgTEpJDQptb2RlbF9wc2FpZF9tYXRjaGVkX0xKSSA8LSBvbHMoTEpJX3QyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9bWF0Y2hfamlfcmVzX2RmICwgeD1ULCB5PVQpDQptb2RlbF9wc2FpZF9tYXRjaGVkX0xKSSA8LSBybXM6OnJvYmNvdihtb2RlbF9wc2FpZF9tYXRjaGVkX0xKSSwgbWF0Y2guZGF0YShtYXRjaF9qaV9yZXMpJEdXTm8pDQoNCiMgVi1EZW0NCm1vZGVsX3BzYWlkX21hdGNoZWRfdmRlbSA8LSBvbHModjJ4X2p1Y29uX3QyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0SU5DICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPW1hdGNoX2ppX3Jlc19kZiAsIHg9VCwgeT1UKQ0KbW9kZWxfcHNhaWRfbWF0Y2hlZF92ZGVtIDwtIHJtczo6cm9iY292KG1vZGVsX3BzYWlkX21hdGNoZWRfdmRlbSwgbWF0Y2guZGF0YShtYXRjaF9qaV9yZXMpJEdXTm8pDQoNCiMjIyMgSW5zdHJ1bWVudGFsIFZhcmlhYmxlIFJlZ3Jlc3Npb25zICMjIw0KDQoNCiMgaXZyZWcgd2l0aCBKdWQgSW5kDQoNCmxpYnJhcnkoQUVSKQ0KbGlicmFyeShpdnBhY2spDQpsaWJyYXJ5KGxtdGVzdCkNCg0KIyBsb2FkIGluc3RydW1lbnQNCmxvYWQoZmlsZSA9ICIuL2RhdGEvaW5zdHJ1bWVudGVkQWlkMi5SRGF0YSIpDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQpkaXNzX2RmIDwtIG1lcmdlKGRpc3NfZGYsIGluc3RydW1lbnRfZGYsIGJ5ID0gYygieWVhciIsICJpc28yYyIpLCBhbGwueCA9IFRSVUUpDQpkaXNzX2RmJHRvdGFsX3N1bV9leGNlcHQgPC0gYXMubnVtZXJpYyhkaXNzX2RmJHRvdGFsX3N1bV9leGNlcHQpDQoNCg0KIyBzdWJzZXQgb25seSBjb21wbGV0ZS5jYXNlcyAvIG5lY2Vzc2FyeSBmb3IgY2x1c3Rlci5yb2J1c3Quc2UoKQ0KaXZfbmEgPC0gbmEub21pdChkaXNzX2RmWywgYygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkZGF0YV9BaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZGRhdGFfQWlkUENfbG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUF9wZXJfY2FwaXRhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcHVsYXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZl9pbnRlbnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0JuYXRyZXMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWxfc3VtX2V4Y2VwdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZWFyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdXTm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0RQIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uc3RhdGUiLCAiTEpJX3QyIiwgInYyeF9qdWNvbl90MiIpXSkNCg0KDQoNCiMjIyMjIElWICMjIyMjDQoNCml2X25hJGFpZF9pbnN0cnVtZW50ZWRfZ2RwX2xuIDwtIGxvZyhpdl9uYSR0b3RhbF9zdW1fZXhjZXB0IC8gaXZfbmEkR0RQKQ0KZGlzc19kZiRhaWRfaW5zdHJ1bWVudGVkX2dkcF9sbiA8LSBsb2coZGlzc19kZiR0b3RhbF9zdW1fZXhjZXB0IC8gZGlzc19kZiRHRFApDQoNCiMgdG8gcHJvY2VlZCB3aXRoIElWIGVzdGltYXRpb24gSSBmaXJzdCBoYXJkLWNvZGUgdGhlIGluc3RydW1lbnQNCml2X25hJGluc3RyX2FpZF9nZHBfbG4gPC0gbG9nKGl2X25hJHRvdGFsX3N1bV9leGNlcHQgLyBpdl9uYSRHRFApDQoNCiMgZGF0YSB0cmFuc2Zvcm1hdGlvbiBmb3IgU3RhdGENCml2X25hJGxuX2dkcF9wYyA8LSBsb2coaXZfbmEkR0RQX3Blcl9jYXBpdGEpDQppdl9uYSRsbl9wb3AgPC0gbG9nKGl2X25hJHBvcHVsYXRpb24pDQoNCiMgc3R1ZmYgZm9yIHN0YXRhDQojIGRpc3NfZGYkcmVnaW9uX251bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkaXNzX2RmJHJlZ2lvbikpDQojIGRpc3NfZGYkY291bnRyeV95ZWFyX251bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkaXNzX2RmJGNvdW50cnlfeWVhcikpDQpmb3JlaWduOjp3cml0ZS5kdGEoaXZfbmEsICIuL2RhdGEvZGlzc19kZl9JVi5kdGEiKQ0KDQojIGhhcmQgY29kZSBpbnRlcmFjdGlvbiB2YXJpYWJsZQ0KaXZfbmEkY2FiaW5jWGFpZCA8LSBpdl9uYSRhaWRkYXRhX0FpZEdEUF9sbiAqIGl2X25hJGNhYmluZXRJTkMNCml2X25hJGNhYmluY1hhaWRfaW5zdHIgPC0gaXZfbmEkYWlkX2luc3RydW1lbnRlZF9nZHBfbG4gKiBpdl9uYSRjYWJpbmV0SU5DDQoNCmxpYnJhcnkobGZlKQ0KDQoNCm1vZGVsX2l2X2p1ZGluZF9samkgPC0gZmVsbShMSklfdDIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQyArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIGZoIA0KICAgICAgICAgICAgICAgICAgICAgICB8IDAgfCAoYWlkZGF0YV9BaWRHRFBfbG58Y2FiaW5jWGFpZCB+IGFpZF9pbnN0cnVtZW50ZWRfZ2RwX2xuICsgY2FiaW5jWGFpZF9pbnN0cikgfCBHV05vLCANCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGl2X25hKQ0KDQoNCm1vZGVsX2l2X2p1ZGluZF92ZGVtIDwtIGZlbG0odjJ4X2p1Y29uX3QyIH4gDQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMgKw0KICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICBmaCANCiAgICAgICAgICAgICAgICAgICAgICAgfCAwIHwgKGFpZGRhdGFfQWlkR0RQX2xufGNhYmluY1hhaWQgfiBhaWRfaW5zdHJ1bWVudGVkX2dkcF9sbiArIGNhYmluY1hhaWRfaW5zdHIpIHwgR1dObywgDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpdl9uYSkNCg0KIyBPdXRwdXQgTW9kZWxzDQojIyBPcmRlciBvZiBjb2VmZmljaWVudHMgaW4gb3V0cHV0IHRhYmxlDQpuYW1lX21hcCA8LSBsaXN0KGNhYmluZXRJTkMgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSIsDQogICAgICAgICAgICAgICAgICJjYWJpbmV0SU5DICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBvd2VyLVNoYXJpbmcgKGJpbmFyeSkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgImBjYWJpbmNYYWlkKGZpdClgIiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICJgYWlkZGF0YV9BaWRHRFBfbG4oZml0KWAiID0gIkFpZCAvIEdEUCAobG9nKSIsDQogICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIgPSAiQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICJsbl9nZHBfcGMiID0gIkdEUCBwL2MiLA0KICAgICAgICAgICAgICAgICAibG5fcG9wIiA9ICJQb3B1bGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgPSAiQ29uZmxpY3QgSW50ZW5zaXR5IiwNCiAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSAiTmF0LiBSZXMuIFJlbnRzIiwNCiAgICAgICAgICAgICAgICAgcG9saXR5MiA9ICJSZWdpbWUgVHlwZSIsDQogICAgICAgICAgICAgICAgIGZoID0gIlJlZ2ltZSBUeXBlIikNCg0KbW9kZWxfbGlzdCA8LSBsaXN0KG1vZGVsX3BzYWlkX21hdGNoZWRfTEpJLCBtb2RlbF9wc2FpZF9tYXRjaGVkX3ZkZW0sIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2l2X2p1ZGluZF9samksIG1vZGVsX2l2X2p1ZGluZF92ZGVtKQ0KDQoNCnNvdXJjZSgiLi9mdW5jdGlvbnMvY3VzdG9tX3RleHJlZy5SIikNCmVudmlyb25tZW50KGN1c3RvbV90ZXhyZWcpIDwtIGFzTmFtZXNwYWNlKCd0ZXhyZWcnKQ0Kc291cmNlKCJmdW5jdGlvbnMvZXh0cmFjdF9mZWxtX2N1c3RvbS5SIikNCiMgDQojIGN1c3RvbV90ZXhyZWcobW9kZWxfbGlzdCwgDQojICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IG5hbWVfbWFwLA0KIyAgICAgICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgICAgICAgICBmaWxlID0gIi4uL291dHB1dC9haWRwc19qdWRpbmRfbWF0Y2hpbmcyc2xzLnRleCIsIA0KIyAgICAgICAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiMgICAgICAgICAgICAgICBhZGQubGluZXMgPSBsaXN0KGMoIkNvdW50cmllcyIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKG1hdGNoX2ppX3Jlc19kZiRHV05vKSksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKG1hdGNoX2ppX3Jlc19kZiRHV05vKSksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKGRpc3NfZGYkR1dObykpLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShkaXNzX2RmJEdXTm8pKSksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiS2xlaWJlcmdlbi1QYWFwIHJrIFdhbGQgRiBzdGF0aXN0aWMiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwLjMyIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0MC4zMiIpKSwNCiMgICAgICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgICAgICBjdXN0b20ubXVsdGljb2wgPSBULA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIiBcXG11bHRpY29sdW1uezJ9e2N9eyBcXHRleHRiZntNYXRjaGluZ319ICYgXFxtdWx0aWNvbHVtbnsyfXtjfXsgXFx0ZXh0YmZ7MlNMU319IFxcXFwgXFxjbWlkcnVsZShyKXsyLTN9IFxcY21pZHJ1bGUobCl7NC01fSAmIFxcbXVsdGljb2x1bW57MX17Y317KDEpIExKSSAgfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoMikgVi1EZW0gIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDMpIExKSSB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eyg0KSBWLURlbSB9IiksDQojICAgICAgICAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gRiwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwgDQojICAgICAgICAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQojICAgICAgICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQojICAgICAgICAgICAgICAgaW5jbHVkZS5sciA9IEYpDQoNCnRleHJlZzo6aHRtbHJlZyhtb2RlbF9saXN0LCANCiAgICAgICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQogICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gbmFtZV9tYXAsDQogICAgICAgICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsIA0KICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwgDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KICAgICAgICBpbmNsdWRlLmxyID0gRiwgDQogICAgICAgIGNhcHRpb24gPSAiIikNCmBgYA0KDQojIFN1cHBsZW1lbnQ6IFN0YXRhIGNvZGUgdG8gZ2VuZXJhdGUgRi1TdGF0aXN0aWNzIGZvciBJVi8yU0xTIG1vZGVscw0KYGBge3IsIGVuZ2luZSA9ICJzdGF0YSIsIGV2YWwgPSBGfQ0KDQp1c2UgIi5cZGF0YVxkaXNzX2RmX2l2LmR0YSIsIHJlcGxhY2UNCg0KKiBHZW5lcmF0ZSBpbnRlcmFjdGlvbnMgJiBpbnRlcmFjdGlvbnMgd2l0aCBpbnN0cnVtZW50DQpnZW4gY2FiWGFpZCA9IGNhYmluZXRJTkMgKiBhaWRkYXRhX0FpZEdEUF9sbg0KZ2VuIGNhYlhhaWRfaW5zdHIgPSBjYWJpbmV0SU5DICogYWlkX2luc3RydW1lbnRlZF9nZHBfbG4NCg0KKiBlc3RpbWF0ZSAyU0xTIGZvciBqdWRpY2lhbCBpbmRlcGVuZGVuY2UNCml2cmVnMiBMSklfdDIgY2FiaW5ldElOQyBsbl9nZHBfcGMgbG5fcG9wIG5vbnN0YXRlIGNvbmZfaW50ZW5zIFdCbmF0cmVzIGZoICAvLy8NCihhaWRkYXRhX0FpZEdEUF9sbiBjYWJYYWlkID0gYWlkX2luc3RydW1lbnRlZF9nZHBfbG4gY2FiWGFpZF9pbnN0ciksIGNsdXN0ZXIoR1dObykgZmlyc3QgDQoNCg0KYGBg