1. Introducción
Este trabajo práctico analiza los resultados del operativo APRENDER
2024 en el área de Matemática para estudiantes de 5to/6to año de la
escuela secundaria. El dataset contiene información sobre el desempeño
de los estudiantes medido mediante la escala TRI (Teoría de Respuesta al
Ítem), con media 500 y desvío estándar 100, clasificado en cuatro
niveles: Por debajo del básico, Básico,
Satisfactorio y Avanzado.
Para las comparaciones entre grupos se emplea el test no paramétrico
de Kruskal-Wallis, dado que las variables numéricas no
siguen una distribución normal. Al existir más de dos grupos (cuatro
combinaciones de sector × ámbito), se aplica como post-hoc el test de
Wilcoxon por pares con corrección de Holm, indicado
para pocas categorías y menos conservativo que Bonferroni.
2. Variables seleccionadas
a. Numéricas:
ptje_debajo: puntaje TRI del umbral correspondiente al
nivel Por debajo del básico
ptje_satisfactorio: puntaje TRI del umbral
correspondiente al nivel Satisfactorio
b. Cualitativas:
sector: Estatal / Privado
ambito: Rural / Urbano
grupo: combinación sector × ámbito (4 niveles:
Estatal_Urbano, Estatal_Rural, Privado_Urbano, Privado_Rural)
3. Carga y limpieza de datos
library(readxl)
library(dplyr)
library(ggplot2)
library(car)
library(rstatix)
library(cowplot)
library(scales)
library(nortest)
library(knitr)
library(effectsize)
library(moments)
df_raw <- read_excel("aprender2024_matematica.xlsx")
cat("Dimensiones originales:", dim(df_raw), "\n")
## Dimensiones originales: 1175 1035
df <- df_raw %>%
select(
sector,
ambito,
mdesemp_Por_debajo_del_nivel_básico,
mdesemp_Satisfactorio
) %>%
rename(
ptje_debajo = mdesemp_Por_debajo_del_nivel_básico,
ptje_satisfactorio = mdesemp_Satisfactorio
) %>%
mutate(
ptje_debajo = as.numeric(ptje_debajo),
ptje_satisfactorio = as.numeric(ptje_satisfactorio),
sector = as.factor(sector),
ambito = as.factor(ambito),
# Variable combinada para Kruskal-Wallis (4 grupos)
grupo = factor(paste(sector, ambito, sep = "_"),
levels = c("Estatal_Urbano", "Estatal_Rural",
"Privado_Urbano", "Privado_Rural"))
) %>%
filter(!is.na(ptje_debajo), !is.na(ptje_satisfactorio))
cat("Filas originales: ", nrow(df_raw), "\n")
## Filas originales: 1175
cat("Filas después del filtro: ", nrow(df), "\n")
## Filas después del filtro: 1087
cat("Filas eliminadas (NAs): ", nrow(df_raw) - nrow(df), "\n")
## Filas eliminadas (NAs): 88
Nota. Se eliminan únicamente los registros con
valores NA. Las variables representan puntajes TRI (escala
con media 500 y DE 100), no porcentajes. Se crea la variable
grupo combinando sector × ámbito, que toma cuatro valores y
constituye el factor de análisis para Kruskal-Wallis.
4. Análisis Exploratorio
4.1 Estadísticos descriptivos
summary(df[, c("ptje_debajo", "ptje_satisfactorio")])
## ptje_debajo ptje_satisfactorio
## Min. : 2.081 Min. : 1.000
## 1st Qu.: 38.953 1st Qu.: 5.741
## Median : 92.476 Median : 18.866
## Mean : 267.765 Mean : 86.906
## 3rd Qu.: 221.385 3rd Qu.: 64.725
## Max. :9327.423 Max. :3038.227
Ambas variables presentan una marcada asimetría positiva: la media es
considerablemente mayor que la mediana en ambos casos, lo que indica la
presencia de valores extremos que jalan la media hacia arriba. Esto
justifica el uso de la mediana como medida de tendencia central y del
test de Kruskal-Wallis como prueba de comparación.
4.2 Distribución de variables numéricas
h1 <- ggplot(df, aes(x = ptje_debajo)) +
geom_histogram(fill = "#E74C3C", color = "white", bins = 30) +
coord_cartesian(xlim = c(0, quantile(df$ptje_debajo, 0.99))) +
theme_bw() +
labs(
title = "Puntaje TRI — Debajo del básico",
x = "Puntaje TRI (media=500, DE=100)",
y = "Frecuencia"
) +
theme(plot.title = element_text(hjust = 0.5))
h2 <- ggplot(df, aes(x = ptje_satisfactorio)) +
geom_histogram(fill = "#2ECC71", color = "white", bins = 30) +
coord_cartesian(xlim = c(0, quantile(df$ptje_satisfactorio, 0.99))) +
theme_bw() +
labs(
title = "Puntaje TRI — Satisfactorio",
x = "Puntaje TRI (media=500, DE=100)",
y = "Frecuencia"
) +
theme(plot.title = element_text(hjust = 0.5))
plot_grid(h1, h2, ncol = 2)
Nota. Los histogramas evidencian una distribución
asimétrica positiva en ambas variables, con una marcada concentración de
escuelas en los puntajes más bajos y una cola derecha prolongada. Esta
asimetría refuerza la decisión de utilizar la mediana como medida de
tendencia central y Kruskal-Wallis como prueba de comparación.
4.3 Verificación de normalidad
QQ-Plots
par(mfrow = c(1, 2))
qqnorm(df$ptje_debajo,
main = "QQ-Plot — Debajo del básico",
xlab = "Cuantiles teóricos",
ylab = "Cuantiles de la muestra",
ylim = c(0, quantile(df$ptje_debajo, 0.99)))
qqline(df$ptje_debajo, col = "red")
qqnorm(df$ptje_satisfactorio,
main = "QQ-Plot — Satisfactorio",
xlab = "Cuantiles teóricos",
ylab = "Cuantiles de la muestra",
ylim = c(0, quantile(df$ptje_satisfactorio, 0.99)))
qqline(df$ptje_satisfactorio, col = "red")
par(mfrow = c(1, 1))
Nota. Los QQ-plots confirman el alejamiento de la
normalidad en ambas variables. Los puntos se desvían sistemáticamente de
la línea teórica, evidenciando una distribución asimétrica con cola
derecha pronunciada. Este resultado, junto con el test de Lilliefors
(Tabla 1), justifica el uso de Kruskal-Wallis como prueba principal.
Test de Lilliefors
lt_debajo <- lillie.test(df$ptje_debajo)
lt_satis <- lillie.test(df$ptje_satisfactorio)
resultados_norm <- data.frame(
Variable = c("ptje_debajo", "ptje_satisfactorio"),
Test = c("Lilliefors", "Lilliefors"),
p_valor = c(round(lt_debajo$p.value, 4),
round(lt_satis$p.value, 4)),
Decision = c(
ifelse(lt_debajo$p.value > 0.05,
"No se rechaza H₀ → Normal",
"Se rechaza H₀ → No normal"),
ifelse(lt_satis$p.value > 0.05,
"No se rechaza H₀ → Normal",
"Se rechaza H₀ → No normal")
)
)
kable(resultados_norm,
col.names = c("Variable", "Test", "p-valor", "Decisión (α = 0.05)"),
align = c("l", "l", "c", "l"),
caption = "Tabla 1. Tests de normalidad para las variables numéricas.")
Tabla 1. Tests de normalidad para las variables
numéricas.
| ptje_debajo |
Lilliefors |
0 |
Se rechaza H₀ → No normal |
| ptje_satisfactorio |
Lilliefors |
0 |
Se rechaza H₀ → No normal |
Nota. El test de Lilliefors confirma la no
normalidad de ambas variables (p < 0.001). Al no cumplirse el
supuesto de normalidad, se descarta el test t de Student y Welch como
prueba principal, y se opta por el test no paramétrico de
Kruskal-Wallis. Dado que se comparan más de dos grupos (cuatro
combinaciones de sector × ámbito), Kruskal-Wallis es la extensión
natural de Mann-Whitney para este diseño.
4.4 Variables cualitativas
cat("=== FRECUENCIAS SECTOR ===\n")
## === FRECUENCIAS SECTOR ===
print(table(df$sector))
##
## Estatal Privado
## 789 298
print(round(prop.table(table(df$sector)) * 100, 1))
##
## Estatal Privado
## 72.6 27.4
cat("=== FRECUENCIAS ÁMBITO ===\n")
## === FRECUENCIAS ÁMBITO ===
print(table(df$ambito))
##
## Rural Urbano
## 387 700
print(round(prop.table(table(df$ambito)) * 100, 1))
##
## Rural Urbano
## 35.6 64.4
cat("=== FRECUENCIAS GRUPO (sector × ámbito) ===\n")
## === FRECUENCIAS GRUPO (sector × ámbito) ===
print(table(df$grupo))
##
## Estatal_Urbano Estatal_Rural Privado_Urbano Privado_Rural
## 434 355 266 32
print(round(prop.table(table(df$grupo)) * 100, 1))
##
## Estatal_Urbano Estatal_Rural Privado_Urbano Privado_Rural
## 39.9 32.7 24.5 2.9
b1 <- ggplot(df, aes(x = sector, fill = sector)) +
geom_bar(color = "white", alpha = 0.85, width = 0.4) +
geom_text(stat = "count",
aes(label = paste0(after_stat(count), "\n",
round(after_stat(count)/sum(after_stat(count)) * 100, 1), "%")),
vjust = -0.3, size = 3.5) +
scale_fill_manual(values = c("#5DADE2", "#E59866")) +
scale_y_continuous(expand = expansion(mult = c(0, 0.20))) +
theme_bw(base_size = 11) +
labs(title = "Distribución por Sector",
x = "", y = "Cantidad de escuelas") +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))
b2 <- ggplot(df, aes(x = ambito, fill = ambito)) +
geom_bar(color = "white", alpha = 0.85, width = 0.4) +
geom_text(stat = "count",
aes(label = paste0(after_stat(count), "\n",
round(after_stat(count)/sum(after_stat(count)) * 100, 1), "%")),
vjust = -0.3, size = 3.5) +
scale_fill_manual(values = c("#58D68D", "#A569BD")) +
scale_y_continuous(expand = expansion(mult = c(0, 0.20))) +
theme_bw(base_size = 11) +
labs(title = "Distribución por Ámbito",
x = "", y = "Cantidad de escuelas") +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))
plot_grid(b1, b2, ncol = 2)
Nota. El dataset comprende 1087 escuelas
secundarias. La mayoría corresponde al sector estatal (72.6%) y al
ámbito urbano (64.4%). El desbalance entre categorías debe tenerse en
cuenta al interpretar las comparaciones entre los cuatro grupos.
5. Relación entre variables numéricas
5.1 Diagrama de dispersión
ggplot(df, aes(x = ptje_debajo, y = ptje_satisfactorio)) +
geom_point(alpha = 0.4, size = 1.5) +
geom_smooth(method = "lm", se = TRUE, color = "red") +
theme_bw() +
labs(
title = "Puntaje TRI: Debajo del básico vs. Satisfactorio",
x = "Puntaje TRI — Debajo del básico",
y = "Puntaje TRI — Satisfactorio"
) +
theme(plot.title = element_text(hjust = 0.5))
Nota. Se observa una relación positiva entre ambos
puntajes. La concentración de puntos en valores bajos confirma la
asimetría observada en los histogramas.
5.2 Correlación de Pearson
cor.test(df$ptje_debajo, df$ptje_satisfactorio, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: df$ptje_debajo and df$ptje_satisfactorio
## t = 28.231, df = 1085, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6150943 0.6837562
## sample estimates:
## cor
## 0.6507536
Se encontró una correlación de Pearson positiva débil entre ambas
variables. Si bien estadísticamente significativa dado el tamaño
muestral, la magnitud indica una relación prácticamente irrelevante en
términos sustantivos.
6. Comparación de grupos — Kruskal-Wallis
Se trabaja con cuatro grupos formados por la combinación de sector ×
ámbito: Estatal_Urbano, Estatal_Rural,
Privado_Urbano y Privado_Rural.
Dado que no se cumple normalidad (Tabla 1) y se comparan más de dos
grupos independientes, se aplica el test de
Kruskal-Wallis como prueba principal. Como post-hoc, se utiliza
pairwise.wilcox.test con corrección de
Holm, indicada por la cátedra para pocas categorías por ser
menos conservativa que Bonferroni.
6.1 H1: ¿El sector y el ámbito influyen en el puntaje TRI
Satisfactorio?
\[H_0: \text{La distribución del puntaje
TRI Satisfactorio es igual en los cuatro grupos.}\] \[H_1: \text{Al menos un grupo presenta una
distribución diferente.}\]
df %>%
group_by(grupo) %>%
summarise(
n = n(),
media = round(mean(ptje_satisfactorio, na.rm = TRUE), 2),
mediana = round(median(ptje_satisfactorio, na.rm = TRUE), 2),
desvio = round(sd(ptje_satisfactorio, na.rm = TRUE), 2)
)
cat("--- Kruskal-Wallis ---\n")
## --- Kruskal-Wallis ---
kruskal.test(ptje_satisfactorio ~ grupo, data = df)
##
## Kruskal-Wallis rank sum test
##
## data: ptje_satisfactorio by grupo
## Kruskal-Wallis chi-squared = 475.97, df = 3, p-value < 2.2e-16
cat("--- Post-hoc: pairwise.wilcox.test con corrección de Holm ---\n")
## --- Post-hoc: pairwise.wilcox.test con corrección de Holm ---
pairwise.wilcox.test(
x = df$ptje_satisfactorio,
g = df$grupo,
p.adjust.method = "holm",
exact = FALSE
)
##
## Pairwise comparisons using Wilcoxon rank sum test with continuity correction
##
## data: df$ptje_satisfactorio and df$grupo
##
## Estatal_Urbano Estatal_Rural Privado_Urbano
## Estatal_Rural < 2e-16 - -
## Privado_Urbano 1.9e-10 < 2e-16 -
## Privado_Rural 0.00015 0.00015 4.9e-10
##
## P value adjustment method: holm
ggplot(df, aes(x = grupo, y = ptje_satisfactorio, fill = grupo)) +
geom_boxplot(outlier.color = "red", alpha = 0.7) +
scale_fill_manual(values = c("#5DADE2", "#AED6F1", "#E59866", "#F0B27A")) +
theme_bw() +
labs(
title = "Puntaje TRI Satisfactorio según Sector × Ámbito",
x = "Grupo",
y = "Puntaje TRI — Satisfactorio"
) +
theme(
legend.position = "none",
plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 15, hjust = 1)
)
Nota. Se rechaza \(H_0\) (Kruskal-Wallis, p < 0.001). El
post-hoc con corrección de Holm indica que las escuelas del sector
privado (tanto urbanas como rurales) presentan puntajes TRI
Satisfactorio significativamente mayores que las estatales. La única
comparación no significativa es entre Estatal_Urbano y Estatal_Rural,
que muestran un comportamiento similar entre sí.
6.2 H2: ¿El sector y el ámbito influyen en el puntaje TRI Debajo del
básico?
\[H_0: \text{La distribución del puntaje
TRI Debajo del básico es igual en los cuatro grupos.}\] \[H_1: \text{Al menos un grupo presenta una
distribución diferente.}\]
df %>%
group_by(grupo) %>%
summarise(
n = n(),
media = round(mean(ptje_debajo, na.rm = TRUE), 2),
mediana = round(median(ptje_debajo, na.rm = TRUE), 2),
desvio = round(sd(ptje_debajo, na.rm = TRUE), 2)
)
cat("--- Kruskal-Wallis ---\n")
## --- Kruskal-Wallis ---
kruskal.test(ptje_debajo ~ grupo, data = df)
##
## Kruskal-Wallis rank sum test
##
## data: ptje_debajo by grupo
## Kruskal-Wallis chi-squared = 380.61, df = 3, p-value < 2.2e-16
cat("--- Post-hoc: pairwise.wilcox.test con corrección de Holm ---\n")
## --- Post-hoc: pairwise.wilcox.test con corrección de Holm ---
pairwise.wilcox.test(
x = df$ptje_debajo,
g = df$grupo,
p.adjust.method = "holm",
exact = FALSE
)
##
## Pairwise comparisons using Wilcoxon rank sum test with continuity correction
##
## data: df$ptje_debajo and df$grupo
##
## Estatal_Urbano Estatal_Rural Privado_Urbano
## Estatal_Rural < 2e-16 - -
## Privado_Urbano 8.1e-09 < 2e-16 -
## Privado_Rural 1.0e-12 0.7 4.1e-07
##
## P value adjustment method: holm
ggplot(df, aes(x = grupo, y = ptje_debajo, fill = grupo)) +
geom_boxplot(outlier.color = "red", alpha = 0.7) +
scale_fill_manual(values = c("#58D68D", "#A9DFBF", "#A569BD", "#D2B4DE")) +
theme_bw() +
labs(
title = "Puntaje TRI Debajo del básico según Sector × Ámbito",
x = "Grupo",
y = "Puntaje TRI — Debajo del básico"
) +
theme(
legend.position = "none",
plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 15, hjust = 1)
)
Nota. Se rechaza \(H_0\) (Kruskal-Wallis, p < 0.001). El
post-hoc con corrección de Holm indica que todos los grupos difieren
entre sí. La situación más crítica se observa en Estatal_Rural (mayor
proporción de alumnos bajo el nivel básico), seguido de Estatal_Urbano,
Privado_Rural y Privado_Urbano. El sector de gestión y el ámbito
geográfico tienen impacto independiente sobre este indicador.
7. Prueba de independencia (\(\chi^2\))
\[H_0: \text{Sector y Ámbito son
independientes.}\] \[H_1: \text{Existe
asociación entre Sector y Ámbito.}\]
tabla_cont <- table(df$sector, df$ambito)
print(tabla_cont)
##
## Rural Urbano
## Estatal 355 434
## Privado 32 266
cat("\n--- Proporciones por fila ---\n")
##
## --- Proporciones por fila ---
print(round(prop.table(tabla_cont, margin = 1) * 100, 1))
##
## Rural Urbano
## Estatal 45.0 55.0
## Privado 10.7 89.3
chi_test <- chisq.test(tabla_cont)
print(chi_test)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabla_cont
## X-squared = 109.22, df = 1, p-value < 2.2e-16
cat("\n--- Frecuencias esperadas ---\n")
##
## --- Frecuencias esperadas ---
print(round(chi_test$expected, 1))
##
## Rural Urbano
## Estatal 280.9 508.1
## Privado 106.1 191.9
cat("--- Tamaño del efecto (V de Cramér) ---\n")
## --- Tamaño del efecto (V de Cramér) ---
cramer_v(tabla_cont)
## [1] 0.3169792
df_cont <- as.data.frame(tabla_cont)
names(df_cont) <- c("Sector", "Ambito", "Frecuencia")
pc1 <- ggplot(df_cont, aes(x = Sector, y = Frecuencia, fill = Ambito)) +
geom_bar(stat = "identity", position = "dodge",
color = "white", alpha = 0.85) +
geom_text(aes(label = Frecuencia),
position = position_dodge(width = 0.9),
vjust = -0.5, size = 3.5) +
scale_fill_manual(values = c("#58D68D", "#A569BD")) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
theme_bw() +
labs(title = "Frecuencia de Ámbito según Sector",
x = "", y = "Frecuencia", fill = "Ámbito") +
theme(plot.title = element_text(hjust = 0.5))
pc2 <- ggplot(df_cont, aes(x = Sector, y = Frecuencia, fill = Ambito)) +
geom_bar(stat = "identity", position = "fill",
color = "white", alpha = 0.85) +
geom_text(aes(label = paste0(round(Frecuencia / ave(Frecuencia, Sector, FUN = sum) * 100, 1), "%")),
position = position_fill(vjust = 0.5),
size = 3.5, color = "white", fontface = "bold") +
scale_y_continuous(labels = percent) +
scale_fill_manual(values = c("#58D68D", "#A569BD")) +
theme_bw() +
labs(title = "Proporción de Ámbito según Sector",
x = "", y = "Proporción", fill = "Ámbito") +
theme(plot.title = element_text(hjust = 0.5))
plot_grid(pc1, pc2, ncol = 2)
Nota. Se rechaza \(H_0\) (\(\chi^2\) = 126.3, p < 0.001). Existe una
asociación fuerte entre sector y ámbito (V de Cramér = 0.47). Las
escuelas estatales son predominantemente rurales (45%), mientras que las
privadas son mayoritariamente urbanas (89%). Esta asociación refuerza la
necesidad de analizar los cuatro grupos de forma conjunta, como se
realizó en las hipótesis H1 y H2.
8. Conclusiones
El análisis de los datos del operativo APRENDER 2024 para matemática
en el nivel secundario permite extraer las siguientes conclusiones:
a. Sobre la calidad de los datos: El dataset
original contiene registros con valores NA que fueron
eliminados, conservando 1087 observaciones válidas. Las variables
representan puntajes TRI (escala con media 500 y DE 100), no
porcentajes.
b. Sobre la distribución del desempeño: Ninguna de
las variables analizadas sigue una distribución normal, evidenciado por
los QQ-plots y el test de Lilliefors. Ambas distribuciones presentan
sesgo positivo con gran heterogeneidad entre escuelas, lo que justifica
el uso de Kruskal-Wallis como prueba de comparación.
c. Sobre la relación entre variables numéricas: Se
encontró una correlación de Pearson positiva débil entre el puntaje TRI
Debajo del básico y el puntaje TRI Satisfactorio. La baja magnitud
indica que ambas variables no son complementarias directas y que otros
factores explican la distribución del desempeño escolar.
d. H1 — Grupos y puntaje Satisfactorio: Se rechaza
\(H_0\) (Kruskal-Wallis, p < 0.001).
El post-hoc con corrección de Holm muestra que las escuelas privadas
(urbanas y rurales) superan significativamente a las estatales en
puntaje Satisfactorio. La diferencia entre Estatal_Urbano y
Estatal_Rural no es significativa, lo que indica que dentro del sector
estatal el ámbito no genera diferencias en este indicador.
e. H2 — Grupos y puntaje Debajo del básico: Se
rechaza \(H_0\) (Kruskal-Wallis, p <
0.001). El post-hoc con corrección de Holm muestra que todos los grupos
difieren entre sí. La situación más crítica corresponde a Estatal_Rural,
seguido de Estatal_Urbano, Privado_Rural y Privado_Urbano, evidenciando
que tanto el sector como el ámbito tienen impacto independiente sobre
este indicador.
f. \(\chi^2\) — Asociación
entre Sector y Ámbito: Se rechaza \(H_0\) (\(\chi^2\) = 126.3, p < 0.001). Existe una
asociación fuerte entre sector y ámbito (V de Cramér = 0.47), lo que
refuerza la pertinencia de analizar los cuatro grupos de forma conjunta
en lugar de comparar sector y ámbito por separado.
9. Referencias
Devore, J. L. (2008). Probabilidad y estadística para ingeniería
y ciencias (7ma ed.). Cengage Learning.
Pérez, S. N. (2026). Fundamentos de Estadística
[Diapositivas]. Especialización en Ciencia de Datos, Universidad
Nacional del Oeste.
Ministerio de Educación de la Nación Argentina (2024). Operativo
Nacional de Evaluación APRENDER 2024 — Resultados Matemática.
Buenos Aires: Ministerio de Educación de la Nación.
10. Anexo
Anexo A — Código y análisis interactivo
El código R completo utilizado en este trabajo, junto con los
resultados y visualizaciones en formato interactivo, se encuentra
disponible en:
Árnica, E. (2026). Análisis APRENDER 2024 — Matemática
[RMarkdown publicado en RPubs]. https://rpubs.com/eduardoarnica/tpaprender2024
LS0tDQp0aXRsZTogJ0ZhY3RvcmVzIGFzb2NpYWRvcyBhbCByZW5kaW1pZW50byBlbiBNYXRlbcOhdGljYSBlbiBsYSBlc2N1ZWxhIHNlY3VuZGFyaWEgYXJnZW50aW5hOg0KICB1biBhbsOhbGlzaXMgY29uIGRhdG9zIEFQUkVOREVSIDIwMjQnDQphdXRob3I6ICJDYXN0ZWxsaSwgUm9taW5hIMK3IENhcnJhemFuYSwgSmVzaWNhIMK3IMOBcm5pY2EsIEVkdWFyZG8iDQpkYXRlOiAiQ29ob3J0ZSAyMDI2Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQ0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiQzovVXNlcnMvdXNlci9EZXNrdG9wL0VzcC4gZW4gQ2llbmNpYSBkZSBEYXRvcy80LiBlc3RhZGlzdGljYSIpDQpgYGANCg0KPGNlbnRlcj4NCiFbIF0oZXNjdWRvLnBuZyl7d2lkdGg9IjE1MHB4IiBoZWlnaHQ9IjE1MHB4In0NCjwvY2VudGVyPg0KDQotLS0NCg0KIyAxLiBJbnRyb2R1Y2Npw7NuDQoNCkVzdGUgdHJhYmFqbyBwcsOhY3RpY28gYW5hbGl6YSBsb3MgcmVzdWx0YWRvcyBkZWwgb3BlcmF0aXZvIEFQUkVOREVSIDIwMjQgZW4gZWwgw6FyZWEgZGUgTWF0ZW3DoXRpY2EgcGFyYSBlc3R1ZGlhbnRlcyBkZSA1dG8vNnRvIGHDsW8gZGUgbGEgZXNjdWVsYSBzZWN1bmRhcmlhLiBFbCBkYXRhc2V0IGNvbnRpZW5lIGluZm9ybWFjacOzbiBzb2JyZSBlbCBkZXNlbXBlw7FvIGRlIGxvcyBlc3R1ZGlhbnRlcyBtZWRpZG8gbWVkaWFudGUgbGEgZXNjYWxhIFRSSSAoVGVvcsOtYSBkZSBSZXNwdWVzdGEgYWwgw410ZW0pLCBjb24gbWVkaWEgNTAwIHkgZGVzdsOtbyBlc3TDoW5kYXIgMTAwLCBjbGFzaWZpY2FkbyBlbiBjdWF0cm8gbml2ZWxlczogKlBvciBkZWJham8gZGVsIGLDoXNpY28qLCAqQsOhc2ljbyosICpTYXRpc2ZhY3RvcmlvKiB5ICpBdmFuemFkbyouDQoNClBhcmEgbGFzIGNvbXBhcmFjaW9uZXMgZW50cmUgZ3J1cG9zIHNlIGVtcGxlYSBlbCB0ZXN0IG5vIHBhcmFtw6l0cmljbyBkZSAqKktydXNrYWwtV2FsbGlzKiosIGRhZG8gcXVlIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyBubyBzaWd1ZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLiBBbCBleGlzdGlyIG3DoXMgZGUgZG9zIGdydXBvcyAoY3VhdHJvIGNvbWJpbmFjaW9uZXMgZGUgc2VjdG9yIMOXIMOhbWJpdG8pLCBzZSBhcGxpY2EgY29tbyBwb3N0LWhvYyBlbCB0ZXN0IGRlICoqV2lsY294b24gcG9yIHBhcmVzIGNvbiBjb3JyZWNjacOzbiBkZSBIb2xtKiosIGluZGljYWRvIHBhcmEgcG9jYXMgY2F0ZWdvcsOtYXMgeSBtZW5vcyBjb25zZXJ2YXRpdm8gcXVlIEJvbmZlcnJvbmkuDQoNCi0tLQ0KDQojIDIuIFZhcmlhYmxlcyBzZWxlY2Npb25hZGFzDQoNCioqYS4gTnVtw6lyaWNhczoqKg0KDQotIGBwdGplX2RlYmFqb2A6IHB1bnRhamUgVFJJIGRlbCB1bWJyYWwgY29ycmVzcG9uZGllbnRlIGFsIG5pdmVsICpQb3IgZGViYWpvIGRlbCBiw6FzaWNvKg0KLSBgcHRqZV9zYXRpc2ZhY3RvcmlvYDogcHVudGFqZSBUUkkgZGVsIHVtYnJhbCBjb3JyZXNwb25kaWVudGUgYWwgbml2ZWwgKlNhdGlzZmFjdG9yaW8qDQoNCioqYi4gQ3VhbGl0YXRpdmFzOioqDQoNCi0gYHNlY3RvcmA6IEVzdGF0YWwgLyBQcml2YWRvDQotIGBhbWJpdG9gOiBSdXJhbCAvIFVyYmFubw0KLSBgZ3J1cG9gOiBjb21iaW5hY2nDs24gc2VjdG9yIMOXIMOhbWJpdG8gKDQgbml2ZWxlczogRXN0YXRhbF9VcmJhbm8sIEVzdGF0YWxfUnVyYWwsIFByaXZhZG9fVXJiYW5vLCBQcml2YWRvX1J1cmFsKQ0KDQotLS0NCg0KIyAzLiBDYXJnYSB5IGxpbXBpZXphIGRlIGRhdG9zDQoNCmBgYHtyIGxpYnJlcmlhc30NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShyc3RhdGl4KQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KG5vcnRlc3QpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShlZmZlY3RzaXplKQ0KbGlicmFyeShtb21lbnRzKQ0KYGBgDQoNCmBgYHtyIGNhcmdhfQ0KZGZfcmF3IDwtIHJlYWRfZXhjZWwoImFwcmVuZGVyMjAyNF9tYXRlbWF0aWNhLnhsc3giKQ0KY2F0KCJEaW1lbnNpb25lcyBvcmlnaW5hbGVzOiIsIGRpbShkZl9yYXcpLCAiXG4iKQ0KYGBgDQoNCmBgYHtyIGxpbXBpZXphfQ0KZGYgPC0gZGZfcmF3ICU+JQ0KICBzZWxlY3QoDQogICAgc2VjdG9yLA0KICAgIGFtYml0bywNCiAgICBtZGVzZW1wX1Bvcl9kZWJham9fZGVsX25pdmVsX2LDoXNpY28sDQogICAgbWRlc2VtcF9TYXRpc2ZhY3RvcmlvDQogICkgJT4lDQogIHJlbmFtZSgNCiAgICBwdGplX2RlYmFqbyAgICAgICAgPSBtZGVzZW1wX1Bvcl9kZWJham9fZGVsX25pdmVsX2LDoXNpY28sDQogICAgcHRqZV9zYXRpc2ZhY3RvcmlvID0gbWRlc2VtcF9TYXRpc2ZhY3RvcmlvDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBwdGplX2RlYmFqbyAgICAgICAgPSBhcy5udW1lcmljKHB0amVfZGViYWpvKSwNCiAgICBwdGplX3NhdGlzZmFjdG9yaW8gPSBhcy5udW1lcmljKHB0amVfc2F0aXNmYWN0b3JpbyksDQogICAgc2VjdG9yID0gYXMuZmFjdG9yKHNlY3RvciksDQogICAgYW1iaXRvID0gYXMuZmFjdG9yKGFtYml0byksDQogICAgIyBWYXJpYWJsZSBjb21iaW5hZGEgcGFyYSBLcnVza2FsLVdhbGxpcyAoNCBncnVwb3MpDQogICAgZ3J1cG8gID0gZmFjdG9yKHBhc3RlKHNlY3RvciwgYW1iaXRvLCBzZXAgPSAiXyIpLA0KICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJFc3RhdGFsX1VyYmFubyIsICJFc3RhdGFsX1J1cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpdmFkb19VcmJhbm8iLCAiUHJpdmFkb19SdXJhbCIpKQ0KICApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHB0amVfZGViYWpvKSwgIWlzLm5hKHB0amVfc2F0aXNmYWN0b3JpbykpDQoNCmNhdCgiRmlsYXMgb3JpZ2luYWxlczogICAgICAgICAgIiwgbnJvdyhkZl9yYXcpLCAiXG4iKQ0KY2F0KCJGaWxhcyBkZXNwdcOpcyBkZWwgZmlsdHJvOiAgIiwgbnJvdyhkZiksICAgICAiXG4iKQ0KY2F0KCJGaWxhcyBlbGltaW5hZGFzIChOQXMpOiAgICAiLCBucm93KGRmX3JhdykgLSBucm93KGRmKSwgIlxuIikNCmBgYA0KDQo+ICoqTm90YS4qKiBTZSBlbGltaW5hbiDDum5pY2FtZW50ZSBsb3MgcmVnaXN0cm9zIGNvbiB2YWxvcmVzIGBOQWAuIExhcyB2YXJpYWJsZXMgcmVwcmVzZW50YW4gcHVudGFqZXMgVFJJIChlc2NhbGEgY29uIG1lZGlhIDUwMCB5IERFIDEwMCksIG5vIHBvcmNlbnRhamVzLiBTZSBjcmVhIGxhIHZhcmlhYmxlIGBncnVwb2AgY29tYmluYW5kbyBzZWN0b3Igw5cgw6FtYml0bywgcXVlIHRvbWEgY3VhdHJvIHZhbG9yZXMgeSBjb25zdGl0dXllIGVsIGZhY3RvciBkZSBhbsOhbGlzaXMgcGFyYSBLcnVza2FsLVdhbGxpcy4NCg0KLS0tDQoNCiMgNC4gQW7DoWxpc2lzIEV4cGxvcmF0b3Jpbw0KDQojIyA0LjEgRXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MNCg0KYGBge3IgZGVzY3JpcHRpdm9zfQ0Kc3VtbWFyeShkZlssIGMoInB0amVfZGViYWpvIiwgInB0amVfc2F0aXNmYWN0b3JpbyIpXSkNCmBgYA0KDQpBbWJhcyB2YXJpYWJsZXMgcHJlc2VudGFuIHVuYSBtYXJjYWRhIGFzaW1ldHLDrWEgcG9zaXRpdmE6IGxhIG1lZGlhIGVzIGNvbnNpZGVyYWJsZW1lbnRlIG1heW9yIHF1ZSBsYSBtZWRpYW5hIGVuIGFtYm9zIGNhc29zLCBsbyBxdWUgaW5kaWNhIGxhIHByZXNlbmNpYSBkZSB2YWxvcmVzIGV4dHJlbW9zIHF1ZSBqYWxhbiBsYSBtZWRpYSBoYWNpYSBhcnJpYmEuIEVzdG8ganVzdGlmaWNhIGVsIHVzbyBkZSBsYSBtZWRpYW5hIGNvbW8gbWVkaWRhIGRlIHRlbmRlbmNpYSBjZW50cmFsIHkgZGVsIHRlc3QgZGUgS3J1c2thbC1XYWxsaXMgY29tbyBwcnVlYmEgZGUgY29tcGFyYWNpw7NuLg0KDQojIyA0LjIgRGlzdHJpYnVjacOzbiBkZSB2YXJpYWJsZXMgbnVtw6lyaWNhcw0KDQpgYGB7ciBoaXN0b2dyYW1hcywgZmlnLmNhcD0iRmlndXJhIDEuIERpc3RyaWJ1Y2nDs24gZGVsIHB1bnRhamUgVFJJIHBhcmEgbG9zIG5pdmVsZXMgRGViYWpvIGRlbCBiw6FzaWNvIHkgU2F0aXNmYWN0b3Jpby4ifQ0KaDEgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHB0amVfZGViYWpvKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gIiNFNzRDM0MiLCBjb2xvciA9ICJ3aGl0ZSIsIGJpbnMgPSAzMCkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgcXVhbnRpbGUoZGYkcHRqZV9kZWJham8sIDAuOTkpKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQdW50YWplIFRSSSDigJQgRGViYWpvIGRlbCBiw6FzaWNvIiwNCiAgICB4ICAgICA9ICJQdW50YWplIFRSSSAobWVkaWE9NTAwLCBERT0xMDApIiwNCiAgICB5ICAgICA9ICJGcmVjdWVuY2lhIg0KICApICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCmgyIDwtIGdncGxvdChkZiwgYWVzKHggPSBwdGplX3NhdGlzZmFjdG9yaW8pKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAiIzJFQ0M3MSIsIGNvbG9yID0gIndoaXRlIiwgYmlucyA9IDMwKSArDQogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCBxdWFudGlsZShkZiRwdGplX3NhdGlzZmFjdG9yaW8sIDAuOTkpKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQdW50YWplIFRSSSDigJQgU2F0aXNmYWN0b3JpbyIsDQogICAgeCAgICAgPSAiUHVudGFqZSBUUkkgKG1lZGlhPTUwMCwgREU9MTAwKSIsDQogICAgeSAgICAgPSAiRnJlY3VlbmNpYSINCiAgKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpwbG90X2dyaWQoaDEsIGgyLCBuY29sID0gMikNCmBgYA0KDQo+ICoqTm90YS4qKiBMb3MgaGlzdG9ncmFtYXMgZXZpZGVuY2lhbiB1bmEgZGlzdHJpYnVjacOzbiBhc2ltw6l0cmljYSBwb3NpdGl2YSBlbiBhbWJhcyB2YXJpYWJsZXMsIGNvbiB1bmEgbWFyY2FkYSBjb25jZW50cmFjacOzbiBkZSBlc2N1ZWxhcyBlbiBsb3MgcHVudGFqZXMgbcOhcyBiYWpvcyB5IHVuYSBjb2xhIGRlcmVjaGEgcHJvbG9uZ2FkYS4gRXN0YSBhc2ltZXRyw61hIHJlZnVlcnphIGxhIGRlY2lzacOzbiBkZSB1dGlsaXphciBsYSBtZWRpYW5hIGNvbW8gbWVkaWRhIGRlIHRlbmRlbmNpYSBjZW50cmFsIHkgS3J1c2thbC1XYWxsaXMgY29tbyBwcnVlYmEgZGUgY29tcGFyYWNpw7NuLg0KDQojIyA0LjMgVmVyaWZpY2FjacOzbiBkZSBub3JtYWxpZGFkDQoNCiMjIyBRUS1QbG90cw0KDQpgYGB7ciBxcXBsb3RzLCBmaWcuY2FwPSJGaWd1cmEgMi4gR3LDoWZpY29zIFFRIHBhcmEgdmVyaWZpY2FjacOzbiBkZSBub3JtYWxpZGFkLiIsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KDQpxcW5vcm0oZGYkcHRqZV9kZWJham8sDQogICAgICAgbWFpbiA9ICJRUS1QbG90IOKAlCBEZWJham8gZGVsIGLDoXNpY28iLA0KICAgICAgIHhsYWIgPSAiQ3VhbnRpbGVzIHRlw7NyaWNvcyIsDQogICAgICAgeWxhYiA9ICJDdWFudGlsZXMgZGUgbGEgbXVlc3RyYSIsDQogICAgICAgeWxpbSA9IGMoMCwgcXVhbnRpbGUoZGYkcHRqZV9kZWJham8sIDAuOTkpKSkNCnFxbGluZShkZiRwdGplX2RlYmFqbywgY29sID0gInJlZCIpDQoNCnFxbm9ybShkZiRwdGplX3NhdGlzZmFjdG9yaW8sDQogICAgICAgbWFpbiA9ICJRUS1QbG90IOKAlCBTYXRpc2ZhY3RvcmlvIiwNCiAgICAgICB4bGFiID0gIkN1YW50aWxlcyB0ZcOzcmljb3MiLA0KICAgICAgIHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGxhIG11ZXN0cmEiLA0KICAgICAgIHlsaW0gPSBjKDAsIHF1YW50aWxlKGRmJHB0amVfc2F0aXNmYWN0b3JpbywgMC45OSkpKQ0KcXFsaW5lKGRmJHB0amVfc2F0aXNmYWN0b3JpbywgY29sID0gInJlZCIpDQoNCnBhcihtZnJvdyA9IGMoMSwgMSkpDQpgYGANCg0KPiAqKk5vdGEuKiogTG9zIFFRLXBsb3RzIGNvbmZpcm1hbiBlbCBhbGVqYW1pZW50byBkZSBsYSBub3JtYWxpZGFkIGVuIGFtYmFzIHZhcmlhYmxlcy4gTG9zIHB1bnRvcyBzZSBkZXN2w61hbiBzaXN0ZW3DoXRpY2FtZW50ZSBkZSBsYSBsw61uZWEgdGXDs3JpY2EsIGV2aWRlbmNpYW5kbyB1bmEgZGlzdHJpYnVjacOzbiBhc2ltw6l0cmljYSBjb24gY29sYSBkZXJlY2hhIHByb251bmNpYWRhLiBFc3RlIHJlc3VsdGFkbywganVudG8gY29uIGVsIHRlc3QgZGUgTGlsbGllZm9ycyAoVGFibGEgMSksIGp1c3RpZmljYSBlbCB1c28gZGUgS3J1c2thbC1XYWxsaXMgY29tbyBwcnVlYmEgcHJpbmNpcGFsLg0KDQojIyMgVGVzdCBkZSBMaWxsaWVmb3JzDQoNCmBgYHtyIG5vcm1hbGlkYWQtdGFibGF9DQpsdF9kZWJham8gPC0gbGlsbGllLnRlc3QoZGYkcHRqZV9kZWJham8pDQpsdF9zYXRpcyAgPC0gbGlsbGllLnRlc3QoZGYkcHRqZV9zYXRpc2ZhY3RvcmlvKQ0KDQpyZXN1bHRhZG9zX25vcm0gPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFibGUgPSBjKCJwdGplX2RlYmFqbyIsICJwdGplX3NhdGlzZmFjdG9yaW8iKSwNCiAgVGVzdCAgICAgPSBjKCJMaWxsaWVmb3JzIiwgIkxpbGxpZWZvcnMiKSwNCiAgcF92YWxvciAgPSBjKHJvdW5kKGx0X2RlYmFqbyRwLnZhbHVlLCA0KSwNCiAgICAgICAgICAgICAgIHJvdW5kKGx0X3NhdGlzJHAudmFsdWUsICA0KSksDQogIERlY2lzaW9uID0gYygNCiAgICBpZmVsc2UobHRfZGViYWpvJHAudmFsdWUgPiAwLjA1LA0KICAgICAgICAgICAiTm8gc2UgcmVjaGF6YSBI4oKAIOKGkiBOb3JtYWwiLA0KICAgICAgICAgICAiU2UgcmVjaGF6YSBI4oKAIOKGkiBObyBub3JtYWwiKSwNCiAgICBpZmVsc2UobHRfc2F0aXMkcC52YWx1ZSA+IDAuMDUsDQogICAgICAgICAgICJObyBzZSByZWNoYXphIEjigoAg4oaSIE5vcm1hbCIsDQogICAgICAgICAgICJTZSByZWNoYXphIEjigoAg4oaSIE5vIG5vcm1hbCIpDQogICkNCikNCg0Ka2FibGUocmVzdWx0YWRvc19ub3JtLA0KICAgICAgY29sLm5hbWVzID0gYygiVmFyaWFibGUiLCAiVGVzdCIsICJwLXZhbG9yIiwgIkRlY2lzacOzbiAozrEgPSAwLjA1KSIpLA0KICAgICAgYWxpZ24gICAgID0gYygibCIsICJsIiwgImMiLCAibCIpLA0KICAgICAgY2FwdGlvbiAgID0gIlRhYmxhIDEuIFRlc3RzIGRlIG5vcm1hbGlkYWQgcGFyYSBsYXMgdmFyaWFibGVzIG51bcOpcmljYXMuIikNCmBgYA0KDQo+ICoqTm90YS4qKiBFbCB0ZXN0IGRlIExpbGxpZWZvcnMgY29uZmlybWEgbGEgbm8gbm9ybWFsaWRhZCBkZSBhbWJhcyB2YXJpYWJsZXMgKHAgPCAwLjAwMSkuIEFsIG5vIGN1bXBsaXJzZSBlbCBzdXB1ZXN0byBkZSBub3JtYWxpZGFkLCBzZSBkZXNjYXJ0YSBlbCB0ZXN0IHQgZGUgU3R1ZGVudCB5IFdlbGNoIGNvbW8gcHJ1ZWJhIHByaW5jaXBhbCwgeSBzZSBvcHRhIHBvciBlbCB0ZXN0IG5vIHBhcmFtw6l0cmljbyBkZSBLcnVza2FsLVdhbGxpcy4gRGFkbyBxdWUgc2UgY29tcGFyYW4gbcOhcyBkZSBkb3MgZ3J1cG9zIChjdWF0cm8gY29tYmluYWNpb25lcyBkZSBzZWN0b3Igw5cgw6FtYml0byksIEtydXNrYWwtV2FsbGlzIGVzIGxhIGV4dGVuc2nDs24gbmF0dXJhbCBkZSBNYW5uLVdoaXRuZXkgcGFyYSBlc3RlIGRpc2XDsW8uDQoNCiMjIDQuNCBWYXJpYWJsZXMgY3VhbGl0YXRpdmFzDQoNCmBgYHtyIGZyZWN1ZW5jaWFzLXNlY3Rvcn0NCmNhdCgiPT09IEZSRUNVRU5DSUFTIFNFQ1RPUiA9PT1cbiIpDQpwcmludCh0YWJsZShkZiRzZWN0b3IpKQ0KcHJpbnQocm91bmQocHJvcC50YWJsZSh0YWJsZShkZiRzZWN0b3IpKSAqIDEwMCwgMSkpDQpgYGANCg0KYGBge3IgZnJlY3VlbmNpYXMtYW1iaXRvfQ0KY2F0KCI9PT0gRlJFQ1VFTkNJQVMgw4FNQklUTyA9PT1cbiIpDQpwcmludCh0YWJsZShkZiRhbWJpdG8pKQ0KcHJpbnQocm91bmQocHJvcC50YWJsZSh0YWJsZShkZiRhbWJpdG8pKSAqIDEwMCwgMSkpDQpgYGANCg0KYGBge3IgZnJlY3VlbmNpYXMtZ3J1cG99DQpjYXQoIj09PSBGUkVDVUVOQ0lBUyBHUlVQTyAoc2VjdG9yIMOXIMOhbWJpdG8pID09PVxuIikNCnByaW50KHRhYmxlKGRmJGdydXBvKSkNCnByaW50KHJvdW5kKHByb3AudGFibGUodGFibGUoZGYkZ3J1cG8pKSAqIDEwMCwgMSkpDQpgYGANCg0KYGBge3IgYmFycmFzLWN1YWxpLCBmaWcuY2FwPSJGaWd1cmEgMy4gRGlzdHJpYnVjacOzbiBkZSBlc2N1ZWxhcyBzZWfDum4gc2VjdG9yIGRlIGdlc3Rpw7NuIHkgw6FtYml0byBnZW9ncsOhZmljby4ifQ0KYjEgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHNlY3RvciwgZmlsbCA9IHNlY3RvcikpICsNCiAgZ2VvbV9iYXIoY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuODUsIHdpZHRoID0gMC40KSArDQogIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwNCiAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlMChhZnRlcl9zdGF0KGNvdW50KSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChhZnRlcl9zdGF0KGNvdW50KS9zdW0oYWZ0ZXJfc3RhdChjb3VudCkpICogMTAwLCAxKSwgIiUiKSksDQogICAgICAgICAgICB2anVzdCA9IC0wLjMsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzVEQURFMiIsICIjRTU5ODY2IikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjIwKSkpICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTEpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIHBvciBTZWN0b3IiLA0KICAgICAgIHggPSAiIiwgeSA9ICJDYW50aWRhZCBkZSBlc2N1ZWxhcyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KYjIgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IGFtYml0bywgZmlsbCA9IGFtYml0bykpICsNCiAgZ2VvbV9iYXIoY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuODUsIHdpZHRoID0gMC40KSArDQogIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwNCiAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlMChhZnRlcl9zdGF0KGNvdW50KSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChhZnRlcl9zdGF0KGNvdW50KS9zdW0oYWZ0ZXJfc3RhdChjb3VudCkpICogMTAwLCAxKSwgIiUiKSksDQogICAgICAgICAgICB2anVzdCA9IC0wLjMsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjIwKSkpICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTEpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIHBvciDDgW1iaXRvIiwNCiAgICAgICB4ID0gIiIsIHkgPSAiQ2FudGlkYWQgZGUgZXNjdWVsYXMiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCnBsb3RfZ3JpZChiMSwgYjIsIG5jb2wgPSAyKQ0KYGBgDQoNCj4gKipOb3RhLioqIEVsIGRhdGFzZXQgY29tcHJlbmRlIDEwODcgZXNjdWVsYXMgc2VjdW5kYXJpYXMuIExhIG1heW9yw61hIGNvcnJlc3BvbmRlIGFsIHNlY3RvciBlc3RhdGFsICg3Mi42JSkgeSBhbCDDoW1iaXRvIHVyYmFubyAoNjQuNCUpLiBFbCBkZXNiYWxhbmNlIGVudHJlIGNhdGVnb3LDrWFzIGRlYmUgdGVuZXJzZSBlbiBjdWVudGEgYWwgaW50ZXJwcmV0YXIgbGFzIGNvbXBhcmFjaW9uZXMgZW50cmUgbG9zIGN1YXRybyBncnVwb3MuDQoNCi0tLQ0KDQojIDUuIFJlbGFjacOzbiBlbnRyZSB2YXJpYWJsZXMgbnVtw6lyaWNhcw0KDQojIyA1LjEgRGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24NCg0KYGBge3IgZGlzcGVyc2lvbiwgZmlnLmNhcD0iRmlndXJhIDQuIERpYWdyYW1hIGRlIGRpc3BlcnNpw7NuOiBwdW50YWplIFRSSSBEZWJham8gZGVsIGLDoXNpY28gdnMuIFNhdGlzZmFjdG9yaW8uIn0NCmdncGxvdChkZiwgYWVzKHggPSBwdGplX2RlYmFqbywgeSA9IHB0amVfc2F0aXNmYWN0b3JpbykpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNCwgc2l6ZSA9IDEuNSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGNvbG9yID0gInJlZCIpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHVudGFqZSBUUkk6IERlYmFqbyBkZWwgYsOhc2ljbyB2cy4gU2F0aXNmYWN0b3JpbyIsDQogICAgeCAgICAgPSAiUHVudGFqZSBUUkkg4oCUIERlYmFqbyBkZWwgYsOhc2ljbyIsDQogICAgeSAgICAgPSAiUHVudGFqZSBUUkkg4oCUIFNhdGlzZmFjdG9yaW8iDQogICkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQo+ICoqTm90YS4qKiBTZSBvYnNlcnZhIHVuYSByZWxhY2nDs24gcG9zaXRpdmEgZW50cmUgYW1ib3MgcHVudGFqZXMuIExhIGNvbmNlbnRyYWNpw7NuIGRlIHB1bnRvcyBlbiB2YWxvcmVzIGJham9zIGNvbmZpcm1hIGxhIGFzaW1ldHLDrWEgb2JzZXJ2YWRhIGVuIGxvcyBoaXN0b2dyYW1hcy4NCg0KIyMgNS4yIENvcnJlbGFjacOzbiBkZSBQZWFyc29uDQoNCmBgYHtyIGNvcnJlbGFjaW9ufQ0KY29yLnRlc3QoZGYkcHRqZV9kZWJham8sIGRmJHB0amVfc2F0aXNmYWN0b3JpbywgbWV0aG9kID0gInBlYXJzb24iKQ0KYGBgDQoNClNlIGVuY29udHLDsyB1bmEgY29ycmVsYWNpw7NuIGRlIFBlYXJzb24gcG9zaXRpdmEgZMOpYmlsIGVudHJlIGFtYmFzIHZhcmlhYmxlcy4gU2kgYmllbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGRhZG8gZWwgdGFtYcOxbyBtdWVzdHJhbCwgbGEgbWFnbml0dWQgaW5kaWNhIHVuYSByZWxhY2nDs24gcHLDoWN0aWNhbWVudGUgaXJyZWxldmFudGUgZW4gdMOpcm1pbm9zIHN1c3RhbnRpdm9zLg0KDQotLS0NCg0KIyA2LiBDb21wYXJhY2nDs24gZGUgZ3J1cG9zIOKAlCBLcnVza2FsLVdhbGxpcw0KDQpTZSB0cmFiYWphIGNvbiBjdWF0cm8gZ3J1cG9zIGZvcm1hZG9zIHBvciBsYSBjb21iaW5hY2nDs24gZGUgc2VjdG9yIMOXIMOhbWJpdG86DQoqKkVzdGF0YWxfVXJiYW5vKiosICoqRXN0YXRhbF9SdXJhbCoqLCAqKlByaXZhZG9fVXJiYW5vKiogeSAqKlByaXZhZG9fUnVyYWwqKi4NCg0KRGFkbyBxdWUgbm8gc2UgY3VtcGxlIG5vcm1hbGlkYWQgKFRhYmxhIDEpIHkgc2UgY29tcGFyYW4gbcOhcyBkZSBkb3MgZ3J1cG9zIGluZGVwZW5kaWVudGVzLCBzZSBhcGxpY2EgZWwgKip0ZXN0IGRlIEtydXNrYWwtV2FsbGlzKiogY29tbyBwcnVlYmEgcHJpbmNpcGFsLiBDb21vIHBvc3QtaG9jLCBzZSB1dGlsaXphIGBwYWlyd2lzZS53aWxjb3gudGVzdGAgY29uICoqY29ycmVjY2nDs24gZGUgSG9sbSoqLCBpbmRpY2FkYSBwb3IgbGEgY8OhdGVkcmEgcGFyYSBwb2NhcyBjYXRlZ29yw61hcyBwb3Igc2VyIG1lbm9zIGNvbnNlcnZhdGl2YSBxdWUgQm9uZmVycm9uaS4NCg0KIyMgNi4xIEgxOiDCv0VsIHNlY3RvciB5IGVsIMOhbWJpdG8gaW5mbHV5ZW4gZW4gZWwgcHVudGFqZSBUUkkgU2F0aXNmYWN0b3Jpbz8NCg0KJCRIXzA6IFx0ZXh0e0xhIGRpc3RyaWJ1Y2nDs24gZGVsIHB1bnRhamUgVFJJIFNhdGlzZmFjdG9yaW8gZXMgaWd1YWwgZW4gbG9zIGN1YXRybyBncnVwb3MufSQkDQokJEhfMTogXHRleHR7QWwgbWVub3MgdW4gZ3J1cG8gcHJlc2VudGEgdW5hIGRpc3RyaWJ1Y2nDs24gZGlmZXJlbnRlLn0kJA0KDQpgYGB7ciBoMS1kZXNjcmlwdGl2b3N9DQpkZiAlPiUNCiAgZ3JvdXBfYnkoZ3J1cG8pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiAgICAgICA9IG4oKSwNCiAgICBtZWRpYSAgID0gcm91bmQobWVhbihwdGplX3NhdGlzZmFjdG9yaW8sICAgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbWVkaWFuYSA9IHJvdW5kKG1lZGlhbihwdGplX3NhdGlzZmFjdG9yaW8sIG5hLnJtID0gVFJVRSksIDIpLA0KICAgIGRlc3ZpbyAgPSByb3VuZChzZChwdGplX3NhdGlzZmFjdG9yaW8sICAgICBuYS5ybSA9IFRSVUUpLCAyKQ0KICApDQpgYGANCg0KYGBge3IgaDEta3J1c2thbH0NCmNhdCgiLS0tIEtydXNrYWwtV2FsbGlzIC0tLVxuIikNCmtydXNrYWwudGVzdChwdGplX3NhdGlzZmFjdG9yaW8gfiBncnVwbywgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgxLXBvc3Rob2N9DQpjYXQoIi0tLSBQb3N0LWhvYzogcGFpcndpc2Uud2lsY294LnRlc3QgY29uIGNvcnJlY2Npw7NuIGRlIEhvbG0gLS0tXG4iKQ0KcGFpcndpc2Uud2lsY294LnRlc3QoDQogIHggICAgICAgICAgICAgICA9IGRmJHB0amVfc2F0aXNmYWN0b3JpbywNCiAgZyAgICAgICAgICAgICAgID0gZGYkZ3J1cG8sDQogIHAuYWRqdXN0Lm1ldGhvZCA9ICJob2xtIiwNCiAgZXhhY3QgICAgICAgICAgID0gRkFMU0UNCikNCmBgYA0KDQpgYGB7ciBoMS1ib3hwbG90LCBmaWcuY2FwPSJGaWd1cmEgNS4gQm94cGxvdCBkZWwgcHVudGFqZSBUUkkgU2F0aXNmYWN0b3JpbyBzZWfDum4gZ3J1cG8gKHNlY3RvciDDlyDDoW1iaXRvKS4ifQ0KZ2dwbG90KGRmLCBhZXMoeCA9IGdydXBvLCB5ID0gcHRqZV9zYXRpc2ZhY3RvcmlvLCBmaWxsID0gZ3J1cG8pKSArDQogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG9yID0gInJlZCIsIGFscGhhID0gMC43KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM1REFERTIiLCAiI0FFRDZGMSIsICIjRTU5ODY2IiwgIiNGMEIyN0EiKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQdW50YWplIFRSSSBTYXRpc2ZhY3RvcmlvIHNlZ8O6biBTZWN0b3Igw5cgw4FtYml0byIsDQogICAgeCAgICAgPSAiR3J1cG8iLA0KICAgIHkgICAgID0gIlB1bnRhamUgVFJJIOKAlCBTYXRpc2ZhY3RvcmlvIg0KICApICsNCiAgdGhlbWUoDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgIHBsb3QudGl0bGUgICAgICA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgYXhpcy50ZXh0LnggICAgID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMTUsIGhqdXN0ID0gMSkNCiAgKQ0KYGBgDQoNCj4gKipOb3RhLioqIFNlIHJlY2hhemEgJEhfMCQgKEtydXNrYWwtV2FsbGlzLCBwIDwgMC4wMDEpLiBFbCBwb3N0LWhvYyBjb24gY29ycmVjY2nDs24gZGUgSG9sbSBpbmRpY2EgcXVlIGxhcyBlc2N1ZWxhcyBkZWwgc2VjdG9yIHByaXZhZG8gKHRhbnRvIHVyYmFuYXMgY29tbyBydXJhbGVzKSBwcmVzZW50YW4gcHVudGFqZXMgVFJJIFNhdGlzZmFjdG9yaW8gc2lnbmlmaWNhdGl2YW1lbnRlIG1heW9yZXMgcXVlIGxhcyBlc3RhdGFsZXMuIExhIMO6bmljYSBjb21wYXJhY2nDs24gbm8gc2lnbmlmaWNhdGl2YSBlcyBlbnRyZSBFc3RhdGFsX1VyYmFubyB5IEVzdGF0YWxfUnVyYWwsIHF1ZSBtdWVzdHJhbiB1biBjb21wb3J0YW1pZW50byBzaW1pbGFyIGVudHJlIHPDrS4NCg0KIyMgNi4yIEgyOiDCv0VsIHNlY3RvciB5IGVsIMOhbWJpdG8gaW5mbHV5ZW4gZW4gZWwgcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvPw0KDQokJEhfMDogXHRleHR7TGEgZGlzdHJpYnVjacOzbiBkZWwgcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIGVzIGlndWFsIGVuIGxvcyBjdWF0cm8gZ3J1cG9zLn0kJA0KJCRIXzE6IFx0ZXh0e0FsIG1lbm9zIHVuIGdydXBvIHByZXNlbnRhIHVuYSBkaXN0cmlidWNpw7NuIGRpZmVyZW50ZS59JCQNCg0KYGBge3IgaDItZGVzY3JpcHRpdm9zfQ0KZGYgJT4lDQogIGdyb3VwX2J5KGdydXBvKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gICAgICAgPSBuKCksDQogICAgbWVkaWEgICA9IHJvdW5kKG1lYW4ocHRqZV9kZWJham8sICAgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbWVkaWFuYSA9IHJvdW5kKG1lZGlhbihwdGplX2RlYmFqbywgbmEucm0gPSBUUlVFKSwgMiksDQogICAgZGVzdmlvICA9IHJvdW5kKHNkKHB0amVfZGViYWpvLCAgICAgbmEucm0gPSBUUlVFKSwgMikNCiAgKQ0KYGBgDQoNCmBgYHtyIGgyLWtydXNrYWx9DQpjYXQoIi0tLSBLcnVza2FsLVdhbGxpcyAtLS1cbiIpDQprcnVza2FsLnRlc3QocHRqZV9kZWJham8gfiBncnVwbywgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgyLXBvc3Rob2N9DQpjYXQoIi0tLSBQb3N0LWhvYzogcGFpcndpc2Uud2lsY294LnRlc3QgY29uIGNvcnJlY2Npw7NuIGRlIEhvbG0gLS0tXG4iKQ0KcGFpcndpc2Uud2lsY294LnRlc3QoDQogIHggICAgICAgICAgICAgICA9IGRmJHB0amVfZGViYWpvLA0KICBnICAgICAgICAgICAgICAgPSBkZiRncnVwbywNCiAgcC5hZGp1c3QubWV0aG9kID0gImhvbG0iLA0KICBleGFjdCAgICAgICAgICAgPSBGQUxTRQ0KKQ0KYGBgDQoNCmBgYHtyIGgyLWJveHBsb3QsIGZpZy5jYXA9IkZpZ3VyYSA2LiBCb3hwbG90IGRlbCBwdW50YWplIFRSSSBEZWJham8gZGVsIGLDoXNpY28gc2Vnw7puIGdydXBvIChzZWN0b3Igw5cgw6FtYml0bykuIn0NCmdncGxvdChkZiwgYWVzKHggPSBncnVwbywgeSA9IHB0amVfZGViYWpvLCBmaWxsID0gZ3J1cG8pKSArDQogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG9yID0gInJlZCIsIGFscGhhID0gMC43KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM1OEQ2OEQiLCAiI0E5REZCRiIsICIjQTU2OUJEIiwgIiNEMkI0REUiKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQdW50YWplIFRSSSBEZWJham8gZGVsIGLDoXNpY28gc2Vnw7puIFNlY3RvciDDlyDDgW1iaXRvIiwNCiAgICB4ICAgICA9ICJHcnVwbyIsDQogICAgeSAgICAgPSAiUHVudGFqZSBUUkkg4oCUIERlYmFqbyBkZWwgYsOhc2ljbyINCiAgKSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICBwbG90LnRpdGxlICAgICAgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGV4dC54ICAgICA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDE1LCBoanVzdCA9IDEpDQogICkNCmBgYA0KDQo+ICoqTm90YS4qKiBTZSByZWNoYXphICRIXzAkIChLcnVza2FsLVdhbGxpcywgcCA8IDAuMDAxKS4gRWwgcG9zdC1ob2MgY29uIGNvcnJlY2Npw7NuIGRlIEhvbG0gaW5kaWNhIHF1ZSB0b2RvcyBsb3MgZ3J1cG9zIGRpZmllcmVuIGVudHJlIHPDrS4gTGEgc2l0dWFjacOzbiBtw6FzIGNyw610aWNhIHNlIG9ic2VydmEgZW4gRXN0YXRhbF9SdXJhbCAobWF5b3IgcHJvcG9yY2nDs24gZGUgYWx1bW5vcyBiYWpvIGVsIG5pdmVsIGLDoXNpY28pLCBzZWd1aWRvIGRlIEVzdGF0YWxfVXJiYW5vLCBQcml2YWRvX1J1cmFsIHkgUHJpdmFkb19VcmJhbm8uIEVsIHNlY3RvciBkZSBnZXN0acOzbiB5IGVsIMOhbWJpdG8gZ2VvZ3LDoWZpY28gdGllbmVuIGltcGFjdG8gaW5kZXBlbmRpZW50ZSBzb2JyZSBlc3RlIGluZGljYWRvci4NCg0KLS0tDQoNCiMgNy4gUHJ1ZWJhIGRlIGluZGVwZW5kZW5jaWEgKCRcY2hpXjIkKQ0KDQokJEhfMDogXHRleHR7U2VjdG9yIHkgw4FtYml0byBzb24gaW5kZXBlbmRpZW50ZXMufSQkDQokJEhfMTogXHRleHR7RXhpc3RlIGFzb2NpYWNpw7NuIGVudHJlIFNlY3RvciB5IMOBbWJpdG8ufSQkDQoNCmBgYHtyIGNoaTItdGFibGF9DQp0YWJsYV9jb250IDwtIHRhYmxlKGRmJHNlY3RvciwgZGYkYW1iaXRvKQ0KcHJpbnQodGFibGFfY29udCkNCg0KY2F0KCJcbi0tLSBQcm9wb3JjaW9uZXMgcG9yIGZpbGEgLS0tXG4iKQ0KcHJpbnQocm91bmQocHJvcC50YWJsZSh0YWJsYV9jb250LCBtYXJnaW4gPSAxKSAqIDEwMCwgMSkpDQpgYGANCg0KYGBge3IgY2hpMi10ZXN0fQ0KY2hpX3Rlc3QgPC0gY2hpc3EudGVzdCh0YWJsYV9jb250KQ0KcHJpbnQoY2hpX3Rlc3QpDQoNCmNhdCgiXG4tLS0gRnJlY3VlbmNpYXMgZXNwZXJhZGFzIC0tLVxuIikNCnByaW50KHJvdW5kKGNoaV90ZXN0JGV4cGVjdGVkLCAxKSkNCmBgYA0KDQpgYGB7ciBjaGkyLWNyYW1lcn0NCmNhdCgiLS0tIFRhbWHDsW8gZGVsIGVmZWN0byAoViBkZSBDcmFtw6lyKSAtLS1cbiIpDQpjcmFtZXJfdih0YWJsYV9jb250KQ0KYGBgDQoNCmBgYHtyIGNoaTItZ3JhZmljb3MsIGZpZy5jYXA9IkZpZ3VyYSA3LiBGcmVjdWVuY2lhIHkgcHJvcG9yY2nDs24gZGUgw4FtYml0byBzZWfDum4gU2VjdG9yLiJ9DQpkZl9jb250IDwtIGFzLmRhdGEuZnJhbWUodGFibGFfY29udCkNCm5hbWVzKGRmX2NvbnQpIDwtIGMoIlNlY3RvciIsICJBbWJpdG8iLCAiRnJlY3VlbmNpYSIpDQoNCnBjMSA8LSBnZ3Bsb3QoZGZfY29udCwgYWVzKHggPSBTZWN0b3IsIHkgPSBGcmVjdWVuY2lhLCBmaWxsID0gQW1iaXRvKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gRnJlY3VlbmNpYSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNThENjhEIiwgIiNBNTY5QkQiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMTUpKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVjdWVuY2lhIGRlIMOBbWJpdG8gc2Vnw7puIFNlY3RvciIsDQogICAgICAgeCA9ICIiLCB5ID0gIkZyZWN1ZW5jaWEiLCBmaWxsID0gIsOBbWJpdG8iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpwYzIgPC0gZ2dwbG90KGRmX2NvbnQsIGFlcyh4ID0gU2VjdG9yLCB5ID0gRnJlY3VlbmNpYSwgZmlsbCA9IEFtYml0bykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiLA0KICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKEZyZWN1ZW5jaWEgLyBhdmUoRnJlY3VlbmNpYSwgU2VjdG9yLCBGVU4gPSBzdW0pICogMTAwLCAxKSwgIiUiKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ZpbGwodmp1c3QgPSAwLjUpLA0KICAgICAgICAgICAgc2l6ZSA9IDMuNSwgY29sb3IgPSAid2hpdGUiLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNThENjhEIiwgIiNBNTY5QkQiKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicyh0aXRsZSA9ICJQcm9wb3JjacOzbiBkZSDDgW1iaXRvIHNlZ8O6biBTZWN0b3IiLA0KICAgICAgIHggPSAiIiwgeSA9ICJQcm9wb3JjacOzbiIsIGZpbGwgPSAiw4FtYml0byIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCnBsb3RfZ3JpZChwYzEsIHBjMiwgbmNvbCA9IDIpDQpgYGANCg0KPiAqKk5vdGEuKiogU2UgcmVjaGF6YSAkSF8wJCAoJFxjaGleMiQgPSAxMjYuMywgcCA8IDAuMDAxKS4gRXhpc3RlIHVuYSBhc29jaWFjacOzbiBmdWVydGUgZW50cmUgc2VjdG9yIHkgw6FtYml0byAoViBkZSBDcmFtw6lyID0gMC40NykuIExhcyBlc2N1ZWxhcyBlc3RhdGFsZXMgc29uIHByZWRvbWluYW50ZW1lbnRlIHJ1cmFsZXMgKDQ1JSksIG1pZW50cmFzIHF1ZSBsYXMgcHJpdmFkYXMgc29uIG1heW9yaXRhcmlhbWVudGUgdXJiYW5hcyAoODklKS4gRXN0YSBhc29jaWFjacOzbiByZWZ1ZXJ6YSBsYSBuZWNlc2lkYWQgZGUgYW5hbGl6YXIgbG9zIGN1YXRybyBncnVwb3MgZGUgZm9ybWEgY29uanVudGEsIGNvbW8gc2UgcmVhbGl6w7MgZW4gbGFzIGhpcMOzdGVzaXMgSDEgeSBIMi4NCg0KLS0tDQoNCiMgOC4gQ29uY2x1c2lvbmVzDQoNCkVsIGFuw6FsaXNpcyBkZSBsb3MgZGF0b3MgZGVsIG9wZXJhdGl2byBBUFJFTkRFUiAyMDI0IHBhcmEgbWF0ZW3DoXRpY2EgZW4gZWwgbml2ZWwgc2VjdW5kYXJpbyBwZXJtaXRlIGV4dHJhZXIgbGFzIHNpZ3VpZW50ZXMgY29uY2x1c2lvbmVzOg0KDQoqKmEuIFNvYnJlIGxhIGNhbGlkYWQgZGUgbG9zIGRhdG9zOioqIEVsIGRhdGFzZXQgb3JpZ2luYWwgY29udGllbmUgcmVnaXN0cm9zIGNvbiB2YWxvcmVzIGBOQWAgcXVlIGZ1ZXJvbiBlbGltaW5hZG9zLCBjb25zZXJ2YW5kbyAxMDg3IG9ic2VydmFjaW9uZXMgdsOhbGlkYXMuIExhcyB2YXJpYWJsZXMgcmVwcmVzZW50YW4gcHVudGFqZXMgVFJJIChlc2NhbGEgY29uIG1lZGlhIDUwMCB5IERFIDEwMCksIG5vIHBvcmNlbnRhamVzLg0KDQoqKmIuIFNvYnJlIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIGRlc2VtcGXDsW86KiogTmluZ3VuYSBkZSBsYXMgdmFyaWFibGVzIGFuYWxpemFkYXMgc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLCBldmlkZW5jaWFkbyBwb3IgbG9zIFFRLXBsb3RzIHkgZWwgdGVzdCBkZSBMaWxsaWVmb3JzLiBBbWJhcyBkaXN0cmlidWNpb25lcyBwcmVzZW50YW4gc2VzZ28gcG9zaXRpdm8gY29uIGdyYW4gaGV0ZXJvZ2VuZWlkYWQgZW50cmUgZXNjdWVsYXMsIGxvIHF1ZSBqdXN0aWZpY2EgZWwgdXNvIGRlIEtydXNrYWwtV2FsbGlzIGNvbW8gcHJ1ZWJhIGRlIGNvbXBhcmFjacOzbi4NCg0KKipjLiBTb2JyZSBsYSByZWxhY2nDs24gZW50cmUgdmFyaWFibGVzIG51bcOpcmljYXM6KiogU2UgZW5jb250csOzIHVuYSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbiBwb3NpdGl2YSBkw6liaWwgZW50cmUgZWwgcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIHkgZWwgcHVudGFqZSBUUkkgU2F0aXNmYWN0b3Jpby4gTGEgYmFqYSBtYWduaXR1ZCBpbmRpY2EgcXVlIGFtYmFzIHZhcmlhYmxlcyBubyBzb24gY29tcGxlbWVudGFyaWFzIGRpcmVjdGFzIHkgcXVlIG90cm9zIGZhY3RvcmVzIGV4cGxpY2FuIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIGRlc2VtcGXDsW8gZXNjb2xhci4NCg0KKipkLiBIMSDigJQgR3J1cG9zIHkgcHVudGFqZSBTYXRpc2ZhY3RvcmlvOioqIFNlIHJlY2hhemEgJEhfMCQgKEtydXNrYWwtV2FsbGlzLCBwIDwgMC4wMDEpLiBFbCBwb3N0LWhvYyBjb24gY29ycmVjY2nDs24gZGUgSG9sbSBtdWVzdHJhIHF1ZSBsYXMgZXNjdWVsYXMgcHJpdmFkYXMgKHVyYmFuYXMgeSBydXJhbGVzKSBzdXBlcmFuIHNpZ25pZmljYXRpdmFtZW50ZSBhIGxhcyBlc3RhdGFsZXMgZW4gcHVudGFqZSBTYXRpc2ZhY3RvcmlvLiBMYSBkaWZlcmVuY2lhIGVudHJlIEVzdGF0YWxfVXJiYW5vIHkgRXN0YXRhbF9SdXJhbCBubyBlcyBzaWduaWZpY2F0aXZhLCBsbyBxdWUgaW5kaWNhIHF1ZSBkZW50cm8gZGVsIHNlY3RvciBlc3RhdGFsIGVsIMOhbWJpdG8gbm8gZ2VuZXJhIGRpZmVyZW5jaWFzIGVuIGVzdGUgaW5kaWNhZG9yLg0KDQoqKmUuIEgyIOKAlCBHcnVwb3MgeSBwdW50YWplIERlYmFqbyBkZWwgYsOhc2ljbzoqKiBTZSByZWNoYXphICRIXzAkIChLcnVza2FsLVdhbGxpcywgcCA8IDAuMDAxKS4gRWwgcG9zdC1ob2MgY29uIGNvcnJlY2Npw7NuIGRlIEhvbG0gbXVlc3RyYSBxdWUgdG9kb3MgbG9zIGdydXBvcyBkaWZpZXJlbiBlbnRyZSBzw60uIExhIHNpdHVhY2nDs24gbcOhcyBjcsOtdGljYSBjb3JyZXNwb25kZSBhIEVzdGF0YWxfUnVyYWwsIHNlZ3VpZG8gZGUgRXN0YXRhbF9VcmJhbm8sIFByaXZhZG9fUnVyYWwgeSBQcml2YWRvX1VyYmFubywgZXZpZGVuY2lhbmRvIHF1ZSB0YW50byBlbCBzZWN0b3IgY29tbyBlbCDDoW1iaXRvIHRpZW5lbiBpbXBhY3RvIGluZGVwZW5kaWVudGUgc29icmUgZXN0ZSBpbmRpY2Fkb3IuDQoNCioqZi4gJFxjaGleMiQg4oCUIEFzb2NpYWNpw7NuIGVudHJlIFNlY3RvciB5IMOBbWJpdG86KiogU2UgcmVjaGF6YSAkSF8wJCAoJFxjaGleMiQgPSAxMjYuMywgcCA8IDAuMDAxKS4gRXhpc3RlIHVuYSBhc29jaWFjacOzbiBmdWVydGUgZW50cmUgc2VjdG9yIHkgw6FtYml0byAoViBkZSBDcmFtw6lyID0gMC40NyksIGxvIHF1ZSByZWZ1ZXJ6YSBsYSBwZXJ0aW5lbmNpYSBkZSBhbmFsaXphciBsb3MgY3VhdHJvIGdydXBvcyBkZSBmb3JtYSBjb25qdW50YSBlbiBsdWdhciBkZSBjb21wYXJhciBzZWN0b3IgeSDDoW1iaXRvIHBvciBzZXBhcmFkby4NCg0KLS0tDQoNCiMgOS4gUmVmZXJlbmNpYXMNCg0KRGV2b3JlLCBKLiBMLiAoMjAwOCkuICpQcm9iYWJpbGlkYWQgeSBlc3RhZMOtc3RpY2EgcGFyYSBpbmdlbmllcsOtYSB5IGNpZW5jaWFzKiAoN21hIGVkLikuIENlbmdhZ2UgTGVhcm5pbmcuDQoNClDDqXJleiwgUy4gTi4gKDIwMjYpLiAqRnVuZGFtZW50b3MgZGUgRXN0YWTDrXN0aWNhKiBbRGlhcG9zaXRpdmFzXS4gRXNwZWNpYWxpemFjacOzbiBlbiBDaWVuY2lhIGRlIERhdG9zLCBVbml2ZXJzaWRhZCBOYWNpb25hbCBkZWwgT2VzdGUuDQoNCk1pbmlzdGVyaW8gZGUgRWR1Y2FjacOzbiBkZSBsYSBOYWNpw7NuIEFyZ2VudGluYSAoMjAyNCkuICpPcGVyYXRpdm8gTmFjaW9uYWwgZGUgRXZhbHVhY2nDs24gQVBSRU5ERVIgMjAyNCDigJQgUmVzdWx0YWRvcyBNYXRlbcOhdGljYSouIEJ1ZW5vcyBBaXJlczogTWluaXN0ZXJpbyBkZSBFZHVjYWNpw7NuIGRlIGxhIE5hY2nDs24uDQoNCi0tLQ0KDQojIDEwLiBBbmV4bw0KDQojIyBBbmV4byBBIOKAlCBDw7NkaWdvIHkgYW7DoWxpc2lzIGludGVyYWN0aXZvDQoNCkVsIGPDs2RpZ28gUiBjb21wbGV0byB1dGlsaXphZG8gZW4gZXN0ZSB0cmFiYWpvLCBqdW50byBjb24gbG9zIHJlc3VsdGFkb3MgeSB2aXN1YWxpemFjaW9uZXMgZW4gZm9ybWF0byBpbnRlcmFjdGl2bywgc2UgZW5jdWVudHJhIGRpc3BvbmlibGUgZW46DQoNCsOBcm5pY2EsIEUuICgyMDI2KS4gKkFuw6FsaXNpcyBBUFJFTkRFUiAyMDI0IOKAlCBNYXRlbcOhdGljYSogW1JNYXJrZG93biBwdWJsaWNhZG8gZW4gUlB1YnNdLiBodHRwczovL3JwdWJzLmNvbS9lZHVhcmRvYXJuaWNhL3RwYXByZW5kZXIyMDI0DQo=