Universidad Nacional del Oeste

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 clasificado en cuatro niveles: Por debajo del básico, Básico, Satisfactorio y Avanzado.

Variables seleccionadas:

  • Numéricas: pct_debajo (% por debajo del nivel básico) y pct_satisfactorio (% con nivel satisfactorio)
  • Cualitativas: sector (Estatal / Privado) y ambito (Rural / Urbano)

1. Carga y limpieza de datos

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(
    pct_debajo        = mdesemp_Por_debajo_del_nivel_básico,
    pct_satisfactorio = mdesemp_Satisfactorio
  ) %>%
  mutate(
    pct_debajo        = as.numeric(pct_debajo),
    pct_satisfactorio = as.numeric(pct_satisfactorio),
    sector = as.factor(sector),
    ambito = as.factor(ambito)
  ) %>%
  filter(pct_debajo <= 100, pct_satisfactorio <= 100)

cat("Filas originales:         ", nrow(df_raw), "\n")
## Filas originales:          1175
cat("Filas después del filtro: ", nrow(df), "\n")
## Filas después del filtro:  564
cat("Filas eliminadas:         ", nrow(df_raw) - nrow(df), "\n")
## Filas eliminadas:          611

Nota: Se eliminaron los registros con valores superiores a 100%, considerados errores de carga en el dataset original. Esta decisión redujo el dataset en 611 observaciones y constituye una limitación del análisis.


2. Análisis Exploratorio

2.1 Estadísticos descriptivos

summary(df[, c("pct_debajo", "pct_satisfactorio")])
##    pct_debajo     pct_satisfactorio
##  Min.   : 2.081   Min.   : 1.000   
##  1st Qu.:23.887   1st Qu.: 3.236   
##  Median :40.043   Median : 7.085   
##  Mean   :44.906   Mean   :13.684   
##  3rd Qu.:64.555   3rd Qu.:17.983   
##  Max.   :99.975   Max.   :99.315

2.2 Distribución de variables numéricas

h1 <- ggplot(df, aes(x = pct_debajo)) +
  geom_histogram(fill = "#E74C3C", color = "white", bins = 30) +
  theme_bw() +
  labs(title = "Distribución del % por debajo del nivel básico",
       x = "Porcentaje de estudiantes (%)", y = "Frecuencia") +
  theme(plot.title = element_text(hjust = 0.5))

h2 <- ggplot(df, aes(x = pct_satisfactorio)) +
  geom_histogram(fill = "#2ECC71", color = "white", bins = 30) +
  theme_bw() +
  labs(title = "Distribución del % con nivel satisfactorio",
       x = "Porcentaje de estudiantes (%)", y = "Frecuencia") +
  theme(plot.title = element_text(hjust = 0.5))

plot_grid(h1, h2, ncol = 2)

Ambas distribuciones presentan un marcado sesgo positivo, con la mayor concentración de escuelas en valores bajos de % satisfactorio y una distribución más uniforme del % debajo del básico.

2.3 Verificación de normalidad (QQplots)

par(mfrow = c(1, 2))

qqnorm(df$pct_debajo,
       main = "QQplot — % Debajo del básico",
       xlab = "Cuantiles teóricos",
       ylab = "Cuantiles de la muestra",
       ylim = c(0, 100))
qqline(df$pct_debajo, col = "red")

qqnorm(df$pct_satisfactorio,
       main = "QQplot — % Satisfactorio",
       xlab = "Cuantiles teóricos",
       ylab = "Cuantiles de la muestra",
       ylim = c(0, 100))
qqline(df$pct_satisfactorio, col = "red")

par(mfrow = c(1, 1))

Los QQplots confirman la no normalidad de ambas variables. El % debajo del básico presenta colas pesadas, mientras que el % satisfactorio muestra un sesgo positivo marcado. Estos hallazgos justifican el uso del test de Wilcoxon-Mann-Whitney como prueba principal de comparación.

2.4 Variables cualitativas

cat("=== FRECUENCIAS SECTOR ===\n")
## === FRECUENCIAS SECTOR ===
print(table(df$sector))
## 
## Estatal Privado 
##     420     144
print(round(prop.table(table(df$sector)) * 100, 1))
## 
## Estatal Privado 
##    74.5    25.5
cat("\n=== FRECUENCIAS ÁMBITO ===\n")
## 
## === FRECUENCIAS ÁMBITO ===
print(table(df$ambito))
## 
##  Rural Urbano 
##    332    232
print(round(prop.table(table(df$ambito)) * 100, 1))
## 
##  Rural Urbano 
##   58.9   41.1
b1 <- ggplot(df, aes(x = sector, fill = sector)) +
  geom_bar(color = "white", alpha = 0.85, width = 0.4) +
  geom_text(stat = "count", aes(label = after_stat(count)),
            vjust = -0.5, size = 3.5) +
  scale_fill_manual(values = c("#5DADE2", "#E59866")) +
  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 = after_stat(count)),
            vjust = -0.5, size = 3.5) +
  scale_fill_manual(values = c("#58D68D", "#A569BD")) +
  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)

El dataset presenta un desbalance notable: 74% de escuelas estatales y 59% de escuelas rurales, lo que debe considerarse al interpretar los resultados.


3. Relación entre variables numéricas

3.1 Diagrama de dispersión

ggplot(df, aes(x = pct_debajo, y = pct_satisfactorio)) +
  geom_point(alpha = 0.4, size = 1.5) +
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_bw() +
  labs(title = "% Debajo del básico vs. % Satisfactorio",
       x = "% Debajo del básico", y = "% Satisfactorio") +
  theme(plot.title = element_text(hjust = 0.5))

3.2 Correlación de Pearson

cor.test(df$pct_debajo, df$pct_satisfactorio, method = "pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  df$pct_debajo and df$pct_satisfactorio
## t = 5.6587, df = 562, p-value = 2.432e-08
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1525386 0.3088177
## sample estimates:
##      cor 
## 0.232176

Se encontró una correlación de Pearson positiva débil (r = 0.23, p < 0.001). Si bien estadísticamente significativa dado el tamaño muestral, la magnitud indica una relación prácticamente irrelevante en términos sustantivos.


4. Comparación de medias

4.1 H1: ¿El sector influye en el % Satisfactorio?

H₀: La distribución del % satisfactorio es igual en escuelas estatales y privadas
H₁: Existe diferencia en la distribución del % satisfactorio entre sectores

df %>%
  group_by(sector) %>%
  summarise(
    media   = round(mean(pct_satisfactorio, na.rm = TRUE), 2),
    mediana = round(median(pct_satisfactorio, na.rm = TRUE), 2),
    desvio  = round(sd(pct_satisfactorio, na.rm = TRUE), 2),
    n       = n()
  )
cat("--- Test de Levene (homogeneidad de varianzas) ---\n")
## --- Test de Levene (homogeneidad de varianzas) ---
leveneTest(pct_satisfactorio ~ sector, data = df)
cat("--- Test de Wilcoxon - Mann-Whitney (principal) ---\n")
## --- Test de Wilcoxon - Mann-Whitney (principal) ---
wilcox.test(pct_satisfactorio ~ sector, data = df)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  pct_satisfactorio by sector
## W = 9552, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
cat("\n--- Test t de Welch (complementario, válido por TCL con n grande) ---\n")
## 
## --- Test t de Welch (complementario, válido por TCL con n grande) ---
t.test(pct_satisfactorio ~ sector, data = df, var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  pct_satisfactorio by sector
## t = -11.289, df = 160.08, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Estatal and group Privado is not equal to 0
## 95 percent confidence interval:
##  -25.08332 -17.61390
## sample estimates:
## mean in group Estatal mean in group Privado 
##              8.233259             29.581869
cat("\n--- Tamaño del efecto (Cohen's d) ---\n")
## 
## --- Tamaño del efecto (Cohen's d) ---
cohens_d(pct_satisfactorio ~ sector, data = df)
ggplot(df, aes(x = sector, y = pct_satisfactorio, fill = sector)) +
  geom_boxplot(outlier.color = "red", alpha = 0.7) +
  scale_fill_manual(values = c("#5DADE2", "#E59866")) +
  theme_bw() +
  labs(title = "% Satisfactorio según Sector", x = "", y = "% Satisfactorio") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5))

Tanto el test de Wilcoxon-Mann-Whitney como el test de Welch coinciden en rechazar H₀ (p < 0.001). Las escuelas privadas presentan una mediana de % satisfactorio de 23.5% frente al 5.3% de las estatales. El tamaño del efecto es muy grande (d = -1.57), lo que indica que la diferencia es sustantiva y no solo estadística.


4.2 H2: ¿El ámbito influye en el % Debajo del básico?

H₀: La distribución del % debajo del básico es igual en escuelas rurales y urbanas
H₁: Existe diferencia en la distribución del % debajo del básico entre ámbitos

df %>%
  group_by(ambito) %>%
  summarise(
    media   = round(mean(pct_debajo, na.rm = TRUE), 2),
    mediana = round(median(pct_debajo, na.rm = TRUE), 2),
    desvio  = round(sd(pct_debajo, na.rm = TRUE), 2),
    n       = n()
  )
cat("--- Test de Levene (homogeneidad de varianzas) ---\n")
## --- Test de Levene (homogeneidad de varianzas) ---
leveneTest(pct_debajo ~ ambito, data = df)
cat("--- Test de Wilcoxon - Mann-Whitney (principal) ---\n")
## --- Test de Wilcoxon - Mann-Whitney (principal) ---
wilcox.test(pct_debajo ~ ambito, data = df)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  pct_debajo by ambito
## W = 24070, p-value = 3.365e-14
## alternative hypothesis: true location shift is not equal to 0
cat("\n--- Test t de Welch (complementario, válido por TCL con n grande) ---\n")
## 
## --- Test t de Welch (complementario, válido por TCL con n grande) ---
t.test(pct_debajo ~ ambito, data = df, var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  pct_debajo by ambito
## t = -7.6159, df = 507.62, p-value = 1.29e-13
## alternative hypothesis: true difference in means between group Rural and group Urbano is not equal to 0
## 95 percent confidence interval:
##  -19.98313 -11.78737
## sample estimates:
##  mean in group Rural mean in group Urbano 
##             38.37150             54.25675
cat("\n--- Tamaño del efecto (Cohen's d) ---\n")
## 
## --- Tamaño del efecto (Cohen's d) ---
cohens_d(pct_debajo ~ ambito, data = df)
ggplot(df, aes(x = ambito, y = pct_debajo, fill = ambito)) +
  geom_boxplot(outlier.color = "red", alpha = 0.7) +
  scale_fill_manual(values = c("#58D68D", "#A569BD")) +
  theme_bw() +
  labs(title = "% Debajo del básico según Ámbito", x = "", y = "% Debajo del básico") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5))


5. Prueba de independencia (Chi²)

H₀: Sector y Ámbito son independientes
H₁: Existe asociación entre Sector y Ámbito

tabla_cont <- table(df$sector, df$ambito)
print(tabla_cont)
##          
##           Rural Urbano
##   Estatal   305    115
##   Privado    27    117
cat("\n--- Proporciones por fila ---\n")
## 
## --- Proporciones por fila ---
print(round(prop.table(tabla_cont, margin = 1) * 100, 1))
##          
##           Rural Urbano
##   Estatal  72.6   27.4
##   Privado  18.8   81.2
chi_test <- chisq.test(tabla_cont)
print(chi_test)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabla_cont
## X-squared = 126.3, df = 1, p-value < 2.2e-16
cat("\n--- Frecuencias esperadas ---\n")
## 
## --- Frecuencias esperadas ---
print(round(chi_test$expected, 1))
##          
##           Rural Urbano
##   Estatal 247.2  172.8
##   Privado  84.8   59.2
if (any(chi_test$expected < 5)) {
  cat("\nAlguna celda tiene frecuencia esperada < 5. Simulación de p-valor:\n")
  print(chisq.test(tabla_cont, simulate.p.value = TRUE))
}

cat("\n--- Tamaño del efecto (V de Cramér) ---\n")
## 
## --- Tamaño del efecto (V de Cramér) ---
cramer_v(tabla_cont)
## [1] 0.473213
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")) +
  theme_bw() +
  labs(title = "Frecuencia de Ámbito según Sector",
       x = "Sector", 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) +
  scale_y_continuous(labels = percent) +
  scale_fill_manual(values = c("#58D68D", "#A569BD")) +
  theme_bw() +
  labs(title = "Proporción de Ámbito según Sector",
       x = "Sector", y = "Proporción", fill = "Ámbito") +
  theme(plot.title = element_text(hjust = 0.5))

plot_grid(pc1, pc2, ncol = 2)


6. Conclusiones

El análisis de los datos del operativo APRENDER 2024 para Matemática en el nivel secundario permite extraer las siguientes conclusiones:

Sobre la calidad de los datos El dataset original presentó un 52% de registros con valores imposibles (superiores a 100%), lo que representa una limitación importante y sugiere problemas en el proceso de carga o codificación de los datos originales. El análisis se realizó sobre las 564 observaciones válidas restantes.

Sobre la distribución del desempeño Ninguna de las variables analizadas sigue una distribución normal, evidenciado por los QQplots y la forma de los histogramas. El % por debajo del nivel básico presenta una distribución aproximadamente uniforme entre 0 y 100%, lo que refleja una gran heterogeneidad entre escuelas. El % satisfactorio muestra un marcado sesgo positivo, con la mayoría de las escuelas concentradas en valores bajos (mediana: 7%).

Sobre la relación entre variables numéricas Se encontró una correlación de Pearson positiva débil entre el % debajo del básico y el % satisfactorio (r = 0.23, p < 0.001). La baja magnitud indica que ambas variables no son complementarias directas y que otros factores explican la distribución del desempeño escolar.

H1 — Sector y % Satisfactorio Se rechaza H₀ (Wilcoxon: p < 0.001). Las escuelas privadas presentan una mediana de % satisfactorio significativamente mayor (23.5%) que las estatales (5.3%). El tamaño del efecto es muy grande (d = -1.57), indicando que la diferencia entre sectores es sustantiva y no meramente estadística. Las escuelas privadas muestran entre 17.6 y 25.1 puntos porcentuales más de alumnos en nivel satisfactorio (IC 95%, Welch).

H2 — Ámbito y % Debajo del básico Se rechaza H₀ (Wilcoxon: p < 0.001). Las escuelas urbanas presentan una mediana de % debajo del básico mayor (54.2%) que las rurales (31.8%), resultado contraintuitivo que puede explicarse por la mayor concentración de matrícula en contextos de vulnerabilidad social en zonas urbanas. El tamaño del efecto es moderado (d = -0.65).

Chi² — Asociación entre Sector y Ámbito Se rechaza H₀ (χ² = 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 (72.6%) mientras que las privadas son mayoritariamente urbanas (81.2%). Esta asociación es relevante al interpretar los resultados anteriores, ya que sector y ámbito no son variables independientes.


Referencias

  • Ministerio de Educación de la Nación Argentina (2024). Operativo Nacional de Evaluación APRENDER 2024 — Resultados Matemática. Buenos Aires: DiNIECE.
LS0tDQp0aXRsZTogJ0Z1bmRhbWVudG9zIGRlIEVzdGFkw61zdGljYTogQVBSRU5ERVIgMjAyNCAtIE1hdGVtw6F0aWNhJw0KYXV0aG9yOiB8DQogIENhc3RlbGxpIFJvbWluYSB8IENhcnJhemFuYSBKZXNpY2EgfCDDgXJuaWNhIEVkdWFyZG8NCmRhdGU6ICJFc3BlY2lhbGl6YWNpw7NuIGVuIENpZW5jaWEgZGUgRGF0b3MgLSBVTk8gfCBDb2hvcnRlIDIwMjYiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBlY2hvICAgID0gVFJVRSwNCiAgbWVzc2FnZSA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLA0KICBmaWcud2lkdGggPSA5LA0KICBmaWcuaGVpZ2h0ID0gNQ0KKQ0KDQpzZXR3ZCgiQzovVXNlcnMvdXNlci9EZXNrdG9wL0VzcC4gZW4gQ2llbmNpYSBkZSBEYXRvcy80LiBlc3RhZGlzdGljYS8iKQ0KDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkocnN0YXRpeCkNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShlZmZlY3RzaXplKQ0KYGBgDQoNCjxjZW50ZXI+DQogIDxpbWcgc3JjPSJlc2N1ZG8ucG5nIiBhbHQ9IlVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlbCBPZXN0ZSIgd2lkdGg9IjI1MHB4Ij4NCjwvY2VudGVyPg0KDQotLS0NCg0KIyMgSW50cm9kdWNjacOzbg0KDQpFc3RlIHRyYWJham8gcHLDoWN0aWNvIGFuYWxpemEgbG9zIHJlc3VsdGFkb3MgZGVsIG9wZXJhdGl2byAqKkFQUkVOREVSIDIwMjQqKiBlbiBlbCDDoXJlYSBkZSBNYXRlbcOhdGljYSBwYXJhIGVzdHVkaWFudGVzIGRlIDV0by82dG8gYcOxbyBkZSBsYSBlc2N1ZWxhIHNlY3VuZGFyaWEuIEVsIGRhdGFzZXQgY29udGllbmUgaW5mb3JtYWNpw7NuIHNvYnJlIGVsIGRlc2VtcGXDsW8gZGUgbG9zIGVzdHVkaWFudGVzIGNsYXNpZmljYWRvIGVuIGN1YXRybyBuaXZlbGVzOiAqUG9yIGRlYmFqbyBkZWwgYsOhc2ljbyosICpCw6FzaWNvKiwgKlNhdGlzZmFjdG9yaW8qIHkgKkF2YW56YWRvKi4NCg0KKipWYXJpYWJsZXMgc2VsZWNjaW9uYWRhczoqKg0KDQotICoqTnVtw6lyaWNhczoqKiBgcGN0X2RlYmFqb2AgKCUgcG9yIGRlYmFqbyBkZWwgbml2ZWwgYsOhc2ljbykgeSBgcGN0X3NhdGlzZmFjdG9yaW9gICglIGNvbiBuaXZlbCBzYXRpc2ZhY3RvcmlvKQ0KLSAqKkN1YWxpdGF0aXZhczoqKiBgc2VjdG9yYCAoRXN0YXRhbCAvIFByaXZhZG8pIHkgYGFtYml0b2AgKFJ1cmFsIC8gVXJiYW5vKQ0KDQotLS0NCg0KIyMgMS4gQ2FyZ2EgeSBsaW1waWV6YSBkZSBkYXRvcw0KDQpgYGB7ciBjYXJnYX0NCmRmX3JhdyA8LSByZWFkX2V4Y2VsKCJhcHJlbmRlcjIwMjRfbWF0ZW1hdGljYS54bHN4IikNCmNhdCgiRGltZW5zaW9uZXMgb3JpZ2luYWxlczoiLCBkaW0oZGZfcmF3KSwgIlxuIikNCmBgYA0KDQpgYGB7ciBsaW1waWV6YX0NCmRmIDwtIGRmX3JhdyAlPiUNCiAgc2VsZWN0KA0KICAgIHNlY3RvciwgYW1iaXRvLA0KICAgIG1kZXNlbXBfUG9yX2RlYmFqb19kZWxfbml2ZWxfYsOhc2ljbywNCiAgICBtZGVzZW1wX1NhdGlzZmFjdG9yaW8NCiAgKSAlPiUNCiAgcmVuYW1lKA0KICAgIHBjdF9kZWJham8gICAgICAgID0gbWRlc2VtcF9Qb3JfZGViYWpvX2RlbF9uaXZlbF9iw6FzaWNvLA0KICAgIHBjdF9zYXRpc2ZhY3RvcmlvID0gbWRlc2VtcF9TYXRpc2ZhY3RvcmlvDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBwY3RfZGViYWpvICAgICAgICA9IGFzLm51bWVyaWMocGN0X2RlYmFqbyksDQogICAgcGN0X3NhdGlzZmFjdG9yaW8gPSBhcy5udW1lcmljKHBjdF9zYXRpc2ZhY3RvcmlvKSwNCiAgICBzZWN0b3IgPSBhcy5mYWN0b3Ioc2VjdG9yKSwNCiAgICBhbWJpdG8gPSBhcy5mYWN0b3IoYW1iaXRvKQ0KICApICU+JQ0KICBmaWx0ZXIocGN0X2RlYmFqbyA8PSAxMDAsIHBjdF9zYXRpc2ZhY3RvcmlvIDw9IDEwMCkNCg0KY2F0KCJGaWxhcyBvcmlnaW5hbGVzOiAgICAgICAgICIsIG5yb3coZGZfcmF3KSwgIlxuIikNCmNhdCgiRmlsYXMgZGVzcHXDqXMgZGVsIGZpbHRybzogIiwgbnJvdyhkZiksICJcbiIpDQpjYXQoIkZpbGFzIGVsaW1pbmFkYXM6ICAgICAgICAgIiwgbnJvdyhkZl9yYXcpIC0gbnJvdyhkZiksICJcbiIpDQpgYGANCg0KPiAqKk5vdGE6KiogU2UgZWxpbWluYXJvbiBsb3MgcmVnaXN0cm9zIGNvbiB2YWxvcmVzIHN1cGVyaW9yZXMgYSAxMDAlLCBjb25zaWRlcmFkb3MgZXJyb3JlcyBkZSBjYXJnYSBlbiBlbCBkYXRhc2V0IG9yaWdpbmFsLiBFc3RhIGRlY2lzacOzbiByZWR1am8gZWwgZGF0YXNldCBlbiBgciBucm93KGRmX3JhdykgLSBucm93KGRmKWAgb2JzZXJ2YWNpb25lcyB5IGNvbnN0aXR1eWUgdW5hIGxpbWl0YWNpw7NuIGRlbCBhbsOhbGlzaXMuDQoNCi0tLQ0KDQojIyAyLiBBbsOhbGlzaXMgRXhwbG9yYXRvcmlvDQoNCiMjIyAyLjEgRXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MNCg0KYGBge3IgZGVzY3JpcHRpdm9zfQ0Kc3VtbWFyeShkZlssIGMoInBjdF9kZWJham8iLCAicGN0X3NhdGlzZmFjdG9yaW8iKV0pDQpgYGANCg0KIyMjIDIuMiBEaXN0cmlidWNpw7NuIGRlIHZhcmlhYmxlcyBudW3DqXJpY2FzDQoNCmBgYHtyIGhpc3RvZ3JhbWFzfQ0KaDEgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHBjdF9kZWJham8pKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAiI0U3NEMzQyIsIGNvbG9yID0gIndoaXRlIiwgYmlucyA9IDMwKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGVsICUgcG9yIGRlYmFqbyBkZWwgbml2ZWwgYsOhc2ljbyIsDQogICAgICAgeCA9ICJQb3JjZW50YWplIGRlIGVzdHVkaWFudGVzICglKSIsIHkgPSAiRnJlY3VlbmNpYSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCmgyIDwtIGdncGxvdChkZiwgYWVzKHggPSBwY3Rfc2F0aXNmYWN0b3JpbykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICIjMkVDQzcxIiwgY29sb3IgPSAid2hpdGUiLCBiaW5zID0gMzApICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZWwgJSBjb24gbml2ZWwgc2F0aXNmYWN0b3JpbyIsDQogICAgICAgeCA9ICJQb3JjZW50YWplIGRlIGVzdHVkaWFudGVzICglKSIsIHkgPSAiRnJlY3VlbmNpYSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCnBsb3RfZ3JpZChoMSwgaDIsIG5jb2wgPSAyKQ0KYGBgDQoNCkFtYmFzIGRpc3RyaWJ1Y2lvbmVzIHByZXNlbnRhbiB1biBtYXJjYWRvIHNlc2dvIHBvc2l0aXZvLCBjb24gbGEgbWF5b3IgY29uY2VudHJhY2nDs24gZGUgZXNjdWVsYXMgZW4gdmFsb3JlcyBiYWpvcyBkZSAlIHNhdGlzZmFjdG9yaW8geSB1bmEgZGlzdHJpYnVjacOzbiBtw6FzIHVuaWZvcm1lIGRlbCAlIGRlYmFqbyBkZWwgYsOhc2ljby4NCg0KIyMjIDIuMyBWZXJpZmljYWNpw7NuIGRlIG5vcm1hbGlkYWQgKFFRcGxvdHMpDQoNCmBgYHtyIHFxcGxvdHMsIGZpZy5oZWlnaHQ9NX0NCnBhcihtZnJvdyA9IGMoMSwgMikpDQoNCnFxbm9ybShkZiRwY3RfZGViYWpvLA0KICAgICAgIG1haW4gPSAiUVFwbG90IOKAlCAlIERlYmFqbyBkZWwgYsOhc2ljbyIsDQogICAgICAgeGxhYiA9ICJDdWFudGlsZXMgdGXDs3JpY29zIiwNCiAgICAgICB5bGFiID0gIkN1YW50aWxlcyBkZSBsYSBtdWVzdHJhIiwNCiAgICAgICB5bGltID0gYygwLCAxMDApKQ0KcXFsaW5lKGRmJHBjdF9kZWJham8sIGNvbCA9ICJyZWQiKQ0KDQpxcW5vcm0oZGYkcGN0X3NhdGlzZmFjdG9yaW8sDQogICAgICAgbWFpbiA9ICJRUXBsb3Qg4oCUICUgU2F0aXNmYWN0b3JpbyIsDQogICAgICAgeGxhYiA9ICJDdWFudGlsZXMgdGXDs3JpY29zIiwNCiAgICAgICB5bGFiID0gIkN1YW50aWxlcyBkZSBsYSBtdWVzdHJhIiwNCiAgICAgICB5bGltID0gYygwLCAxMDApKQ0KcXFsaW5lKGRmJHBjdF9zYXRpc2ZhY3RvcmlvLCBjb2wgPSAicmVkIikNCg0KcGFyKG1mcm93ID0gYygxLCAxKSkNCmBgYA0KDQpMb3MgUVFwbG90cyBjb25maXJtYW4gbGEgKipubyBub3JtYWxpZGFkKiogZGUgYW1iYXMgdmFyaWFibGVzLiBFbCAlIGRlYmFqbyBkZWwgYsOhc2ljbyBwcmVzZW50YSBjb2xhcyBwZXNhZGFzLCBtaWVudHJhcyBxdWUgZWwgJSBzYXRpc2ZhY3RvcmlvIG11ZXN0cmEgdW4gc2VzZ28gcG9zaXRpdm8gbWFyY2Fkby4gRXN0b3MgaGFsbGF6Z29zIGp1c3RpZmljYW4gZWwgdXNvIGRlbCB0ZXN0IGRlIFdpbGNveG9uLU1hbm4tV2hpdG5leSBjb21vIHBydWViYSBwcmluY2lwYWwgZGUgY29tcGFyYWNpw7NuLg0KDQojIyMgMi40IFZhcmlhYmxlcyBjdWFsaXRhdGl2YXMNCg0KYGBge3IgYmFycmFzfQ0KY2F0KCI9PT0gRlJFQ1VFTkNJQVMgU0VDVE9SID09PVxuIikNCnByaW50KHRhYmxlKGRmJHNlY3RvcikpDQpwcmludChyb3VuZChwcm9wLnRhYmxlKHRhYmxlKGRmJHNlY3RvcikpICogMTAwLCAxKSkNCg0KY2F0KCJcbj09PSBGUkVDVUVOQ0lBUyDDgU1CSVRPID09PVxuIikNCnByaW50KHRhYmxlKGRmJGFtYml0bykpDQpwcmludChyb3VuZChwcm9wLnRhYmxlKHRhYmxlKGRmJGFtYml0bykpICogMTAwLCAxKSkNCmBgYA0KDQpgYGB7ciBiYXJyYXMtZ3JhZmljb3N9DQpiMSA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gc2VjdG9yLCBmaWxsID0gc2VjdG9yKSkgKw0KICBnZW9tX2Jhcihjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSwgd2lkdGggPSAwLjQpICsNCiAgZ2VvbV90ZXh0KHN0YXQgPSAiY291bnQiLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KGNvdW50KSksDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzVEQURFMiIsICIjRTU5ODY2IikpICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTEpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIHBvciBTZWN0b3IiLCB4ID0gIiIsIHkgPSAiQ2FudGlkYWQgZGUgZXNjdWVsYXMiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCmIyIDwtIGdncGxvdChkZiwgYWVzKHggPSBhbWJpdG8sIGZpbGwgPSBhbWJpdG8pKSArDQogIGdlb21fYmFyKGNvbG9yID0gIndoaXRlIiwgYWxwaGEgPSAwLjg1LCB3aWR0aCA9IDAuNCkgKw0KICBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoY291bnQpKSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNThENjhEIiwgIiNBNTY5QkQiKSkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gcG9yIMOBbWJpdG8iLCB4ID0gIiIsIHkgPSAiQ2FudGlkYWQgZGUgZXNjdWVsYXMiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCnBsb3RfZ3JpZChiMSwgYjIsIG5jb2wgPSAyKQ0KYGBgDQoNCkVsIGRhdGFzZXQgcHJlc2VudGEgdW4gZGVzYmFsYW5jZSBub3RhYmxlOiAqKjc0JSBkZSBlc2N1ZWxhcyBlc3RhdGFsZXMqKiB5ICoqNTklIGRlIGVzY3VlbGFzIHJ1cmFsZXMqKiwgbG8gcXVlIGRlYmUgY29uc2lkZXJhcnNlIGFsIGludGVycHJldGFyIGxvcyByZXN1bHRhZG9zLg0KDQotLS0NCg0KIyMgMy4gUmVsYWNpw7NuIGVudHJlIHZhcmlhYmxlcyBudW3DqXJpY2FzDQoNCiMjIyAzLjEgRGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24NCg0KYGBge3IgZGlzcGVyc2lvbn0NCmdncGxvdChkZiwgYWVzKHggPSBwY3RfZGViYWpvLCB5ID0gcGN0X3NhdGlzZmFjdG9yaW8pKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjQsIHNpemUgPSAxLjUpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBjb2xvciA9ICJyZWQiKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHRpdGxlID0gIiUgRGViYWpvIGRlbCBiw6FzaWNvIHZzLiAlIFNhdGlzZmFjdG9yaW8iLA0KICAgICAgIHggPSAiJSBEZWJham8gZGVsIGLDoXNpY28iLCB5ID0gIiUgU2F0aXNmYWN0b3JpbyIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KIyMjIDMuMiBDb3JyZWxhY2nDs24gZGUgUGVhcnNvbg0KDQpgYGB7ciBjb3JyZWxhY2lvbn0NCmNvci50ZXN0KGRmJHBjdF9kZWJham8sIGRmJHBjdF9zYXRpc2ZhY3RvcmlvLCBtZXRob2QgPSAicGVhcnNvbiIpDQpgYGANCg0KU2UgZW5jb250csOzIHVuYSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbiBwb3NpdGl2YSBkw6liaWwgKHIgPSAwLjIzLCBwIDwgMC4wMDEpLiBTaSBiaWVuIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmEgZGFkbyBlbCB0YW1hw7FvIG11ZXN0cmFsLCBsYSBtYWduaXR1ZCBpbmRpY2EgdW5hIHJlbGFjacOzbiBwcsOhY3RpY2FtZW50ZSBpcnJlbGV2YW50ZSBlbiB0w6lybWlub3Mgc3VzdGFudGl2b3MuDQoNCi0tLQ0KDQojIyA0LiBDb21wYXJhY2nDs24gZGUgbWVkaWFzDQoNCiMjIyA0LjEgSDE6IMK/RWwgc2VjdG9yIGluZmx1eWUgZW4gZWwgJSBTYXRpc2ZhY3RvcmlvPw0KDQoqKkjigoA6KiogTGEgZGlzdHJpYnVjacOzbiBkZWwgJSBzYXRpc2ZhY3RvcmlvIGVzIGlndWFsIGVuIGVzY3VlbGFzIGVzdGF0YWxlcyB5IHByaXZhZGFzICANCioqSOKCgToqKiBFeGlzdGUgZGlmZXJlbmNpYSBlbiBsYSBkaXN0cmlidWNpw7NuIGRlbCAlIHNhdGlzZmFjdG9yaW8gZW50cmUgc2VjdG9yZXMNCg0KYGBge3IgaDEtZGVzY3JpcHRpdm9zfQ0KZGYgJT4lDQogIGdyb3VwX2J5KHNlY3RvcikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWRpYSAgID0gcm91bmQobWVhbihwY3Rfc2F0aXNmYWN0b3JpbywgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbWVkaWFuYSA9IHJvdW5kKG1lZGlhbihwY3Rfc2F0aXNmYWN0b3JpbywgbmEucm0gPSBUUlVFKSwgMiksDQogICAgZGVzdmlvICA9IHJvdW5kKHNkKHBjdF9zYXRpc2ZhY3RvcmlvLCBuYS5ybSA9IFRSVUUpLCAyKSwNCiAgICBuICAgICAgID0gbigpDQogICkNCmBgYA0KDQpgYGB7ciBoMS1sZXZlbmV9DQpjYXQoIi0tLSBUZXN0IGRlIExldmVuZSAoaG9tb2dlbmVpZGFkIGRlIHZhcmlhbnphcykgLS0tXG4iKQ0KbGV2ZW5lVGVzdChwY3Rfc2F0aXNmYWN0b3JpbyB+IHNlY3RvciwgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgxLXdpbGNveG9ufQ0KY2F0KCItLS0gVGVzdCBkZSBXaWxjb3hvbiAtIE1hbm4tV2hpdG5leSAocHJpbmNpcGFsKSAtLS1cbiIpDQp3aWxjb3gudGVzdChwY3Rfc2F0aXNmYWN0b3JpbyB+IHNlY3RvciwgZGF0YSA9IGRmKQ0KDQpjYXQoIlxuLS0tIFRlc3QgdCBkZSBXZWxjaCAoY29tcGxlbWVudGFyaW8sIHbDoWxpZG8gcG9yIFRDTCBjb24gbiBncmFuZGUpIC0tLVxuIikNCnQudGVzdChwY3Rfc2F0aXNmYWN0b3JpbyB+IHNlY3RvciwgZGF0YSA9IGRmLCB2YXIuZXF1YWwgPSBGQUxTRSkNCg0KY2F0KCJcbi0tLSBUYW1hw7FvIGRlbCBlZmVjdG8gKENvaGVuJ3MgZCkgLS0tXG4iKQ0KY29oZW5zX2QocGN0X3NhdGlzZmFjdG9yaW8gfiBzZWN0b3IsIGRhdGEgPSBkZikNCmBgYA0KDQpgYGB7ciBoMS1ncmFmaWNvfQ0KZ2dwbG90KGRmLCBhZXMoeCA9IHNlY3RvciwgeSA9IHBjdF9zYXRpc2ZhY3RvcmlvLCBmaWxsID0gc2VjdG9yKSkgKw0KICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuNykgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNURBREUyIiwgIiNFNTk4NjYiKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicyh0aXRsZSA9ICIlIFNhdGlzZmFjdG9yaW8gc2Vnw7puIFNlY3RvciIsIHggPSAiIiwgeSA9ICIlIFNhdGlzZmFjdG9yaW8iKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KVGFudG8gZWwgdGVzdCBkZSBXaWxjb3hvbi1NYW5uLVdoaXRuZXkgY29tbyBlbCB0ZXN0IGRlIFdlbGNoIGNvaW5jaWRlbiBlbiAqKnJlY2hhemFyIEjigoAqKiAocCA8IDAuMDAxKS4gTGFzIGVzY3VlbGFzIHByaXZhZGFzIHByZXNlbnRhbiB1bmEgbWVkaWFuYSBkZSAlIHNhdGlzZmFjdG9yaW8gZGUgMjMuNSUgZnJlbnRlIGFsIDUuMyUgZGUgbGFzIGVzdGF0YWxlcy4gRWwgdGFtYcOxbyBkZWwgZWZlY3RvIGVzIG11eSBncmFuZGUgKGQgPSAtMS41NyksIGxvIHF1ZSBpbmRpY2EgcXVlIGxhIGRpZmVyZW5jaWEgZXMgc3VzdGFudGl2YSB5IG5vIHNvbG8gZXN0YWTDrXN0aWNhLg0KDQotLS0NCg0KIyMjIDQuMiBIMjogwr9FbCDDoW1iaXRvIGluZmx1eWUgZW4gZWwgJSBEZWJham8gZGVsIGLDoXNpY28/DQoNCioqSOKCgDoqKiBMYSBkaXN0cmlidWNpw7NuIGRlbCAlIGRlYmFqbyBkZWwgYsOhc2ljbyBlcyBpZ3VhbCBlbiBlc2N1ZWxhcyBydXJhbGVzIHkgdXJiYW5hcyAgDQoqKkjigoE6KiogRXhpc3RlIGRpZmVyZW5jaWEgZW4gbGEgZGlzdHJpYnVjacOzbiBkZWwgJSBkZWJham8gZGVsIGLDoXNpY28gZW50cmUgw6FtYml0b3MNCg0KYGBge3IgaDItZGVzY3JpcHRpdm9zfQ0KZGYgJT4lDQogIGdyb3VwX2J5KGFtYml0bykgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWRpYSAgID0gcm91bmQobWVhbihwY3RfZGViYWpvLCBuYS5ybSA9IFRSVUUpLCAyKSwNCiAgICBtZWRpYW5hID0gcm91bmQobWVkaWFuKHBjdF9kZWJham8sIG5hLnJtID0gVFJVRSksIDIpLA0KICAgIGRlc3ZpbyAgPSByb3VuZChzZChwY3RfZGViYWpvLCBuYS5ybSA9IFRSVUUpLCAyKSwNCiAgICBuICAgICAgID0gbigpDQogICkNCmBgYA0KDQpgYGB7ciBoMi1sZXZlbmV9DQpjYXQoIi0tLSBUZXN0IGRlIExldmVuZSAoaG9tb2dlbmVpZGFkIGRlIHZhcmlhbnphcykgLS0tXG4iKQ0KbGV2ZW5lVGVzdChwY3RfZGViYWpvIH4gYW1iaXRvLCBkYXRhID0gZGYpDQpgYGANCg0KYGBge3IgaDItd2lsY294b259DQpjYXQoIi0tLSBUZXN0IGRlIFdpbGNveG9uIC0gTWFubi1XaGl0bmV5IChwcmluY2lwYWwpIC0tLVxuIikNCndpbGNveC50ZXN0KHBjdF9kZWJham8gfiBhbWJpdG8sIGRhdGEgPSBkZikNCg0KY2F0KCJcbi0tLSBUZXN0IHQgZGUgV2VsY2ggKGNvbXBsZW1lbnRhcmlvLCB2w6FsaWRvIHBvciBUQ0wgY29uIG4gZ3JhbmRlKSAtLS1cbiIpDQp0LnRlc3QocGN0X2RlYmFqbyB+IGFtYml0bywgZGF0YSA9IGRmLCB2YXIuZXF1YWwgPSBGQUxTRSkNCg0KY2F0KCJcbi0tLSBUYW1hw7FvIGRlbCBlZmVjdG8gKENvaGVuJ3MgZCkgLS0tXG4iKQ0KY29oZW5zX2QocGN0X2RlYmFqbyB+IGFtYml0bywgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgyLWdyYWZpY299DQpnZ3Bsb3QoZGYsIGFlcyh4ID0gYW1iaXRvLCB5ID0gcGN0X2RlYmFqbywgZmlsbCA9IGFtYml0bykpICsNCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjcpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiJSBEZWJham8gZGVsIGLDoXNpY28gc2Vnw7puIMOBbWJpdG8iLCB4ID0gIiIsIHkgPSAiJSBEZWJham8gZGVsIGLDoXNpY28iKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KLS0tDQoNCiMjIDUuIFBydWViYSBkZSBpbmRlcGVuZGVuY2lhIChDaGnCsikNCg0KKipI4oKAOioqIFNlY3RvciB5IMOBbWJpdG8gc29uIGluZGVwZW5kaWVudGVzICANCioqSOKCgToqKiBFeGlzdGUgYXNvY2lhY2nDs24gZW50cmUgU2VjdG9yIHkgw4FtYml0bw0KDQpgYGB7ciBjaGktdGFibGF9DQp0YWJsYV9jb250IDwtIHRhYmxlKGRmJHNlY3RvciwgZGYkYW1iaXRvKQ0KcHJpbnQodGFibGFfY29udCkNCg0KY2F0KCJcbi0tLSBQcm9wb3JjaW9uZXMgcG9yIGZpbGEgLS0tXG4iKQ0KcHJpbnQocm91bmQocHJvcC50YWJsZSh0YWJsYV9jb250LCBtYXJnaW4gPSAxKSAqIDEwMCwgMSkpDQpgYGANCg0KYGBge3IgY2hpLXRlc3R9DQpjaGlfdGVzdCA8LSBjaGlzcS50ZXN0KHRhYmxhX2NvbnQpDQpwcmludChjaGlfdGVzdCkNCg0KY2F0KCJcbi0tLSBGcmVjdWVuY2lhcyBlc3BlcmFkYXMgLS0tXG4iKQ0KcHJpbnQocm91bmQoY2hpX3Rlc3QkZXhwZWN0ZWQsIDEpKQ0KDQppZiAoYW55KGNoaV90ZXN0JGV4cGVjdGVkIDwgNSkpIHsNCiAgY2F0KCJcbkFsZ3VuYSBjZWxkYSB0aWVuZSBmcmVjdWVuY2lhIGVzcGVyYWRhIDwgNS4gU2ltdWxhY2nDs24gZGUgcC12YWxvcjpcbiIpDQogIHByaW50KGNoaXNxLnRlc3QodGFibGFfY29udCwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUpKQ0KfQ0KDQpjYXQoIlxuLS0tIFRhbWHDsW8gZGVsIGVmZWN0byAoViBkZSBDcmFtw6lyKSAtLS1cbiIpDQpjcmFtZXJfdih0YWJsYV9jb250KQ0KYGBgDQoNCmBgYHtyIGNoaS1ncmFmaWNvc30NCmRmX2NvbnQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsYV9jb250KQ0KbmFtZXMoZGZfY29udCkgPC0gYygiU2VjdG9yIiwgIkFtYml0byIsICJGcmVjdWVuY2lhIikNCg0KcGMxIDwtIGdncGxvdChkZl9jb250LCBhZXMoeCA9IFNlY3RvciwgeSA9IEZyZWN1ZW5jaWEsIGZpbGwgPSBBbWJpdG8pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbG9yID0gIndoaXRlIiwgYWxwaGEgPSAwLjg1KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBGcmVjdWVuY2lhKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiRnJlY3VlbmNpYSBkZSDDgW1iaXRvIHNlZ8O6biBTZWN0b3IiLA0KICAgICAgIHggPSAiU2VjdG9yIiwgeSA9ICJGcmVjdWVuY2lhIiwgZmlsbCA9ICLDgW1iaXRvIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KcGMyIDwtIGdncGxvdChkZl9jb250LCBhZXMoeCA9IFNlY3RvciwgeSA9IEZyZWN1ZW5jaWEsIGZpbGwgPSBBbWJpdG8pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuODUpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgw4FtYml0byBzZWfDum4gU2VjdG9yIiwNCiAgICAgICB4ID0gIlNlY3RvciIsIHkgPSAiUHJvcG9yY2nDs24iLCBmaWxsID0gIsOBbWJpdG8iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpwbG90X2dyaWQocGMxLCBwYzIsIG5jb2wgPSAyKQ0KYGBgDQoNCi0tLQ0KDQojIyA2LiBDb25jbHVzaW9uZXMNCg0KRWwgYW7DoWxpc2lzIGRlIGxvcyBkYXRvcyBkZWwgb3BlcmF0aXZvIEFQUkVOREVSIDIwMjQgcGFyYSBNYXRlbcOhdGljYSBlbg0KZWwgbml2ZWwgc2VjdW5kYXJpbyBwZXJtaXRlIGV4dHJhZXIgbGFzIHNpZ3VpZW50ZXMgY29uY2x1c2lvbmVzOg0KDQoqKlNvYnJlIGxhIGNhbGlkYWQgZGUgbG9zIGRhdG9zKioNCkVsIGRhdGFzZXQgb3JpZ2luYWwgcHJlc2VudMOzIHVuIDUyJSBkZSByZWdpc3Ryb3MgY29uIHZhbG9yZXMgaW1wb3NpYmxlcw0KKHN1cGVyaW9yZXMgYSAxMDAlKSwgbG8gcXVlIHJlcHJlc2VudGEgdW5hIGxpbWl0YWNpw7NuIGltcG9ydGFudGUgeSBzdWdpZXJlDQpwcm9ibGVtYXMgZW4gZWwgcHJvY2VzbyBkZSBjYXJnYSBvIGNvZGlmaWNhY2nDs24gZGUgbG9zIGRhdG9zIG9yaWdpbmFsZXMuDQpFbCBhbsOhbGlzaXMgc2UgcmVhbGl6w7Mgc29icmUgbGFzIDU2NCBvYnNlcnZhY2lvbmVzIHbDoWxpZGFzIHJlc3RhbnRlcy4NCg0KKipTb2JyZSBsYSBkaXN0cmlidWNpw7NuIGRlbCBkZXNlbXBlw7FvKioNCk5pbmd1bmEgZGUgbGFzIHZhcmlhYmxlcyBhbmFsaXphZGFzIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCwNCmV2aWRlbmNpYWRvIHBvciBsb3MgUVFwbG90cyB5IGxhIGZvcm1hIGRlIGxvcyBoaXN0b2dyYW1hcy4gRWwgJSBwb3IgZGViYWpvDQpkZWwgbml2ZWwgYsOhc2ljbyBwcmVzZW50YSB1bmEgZGlzdHJpYnVjacOzbiBhcHJveGltYWRhbWVudGUgdW5pZm9ybWUgZW50cmUNCjAgeSAxMDAlLCBsbyBxdWUgcmVmbGVqYSB1bmEgZ3JhbiBoZXRlcm9nZW5laWRhZCBlbnRyZSBlc2N1ZWxhcy4gRWwgJQ0Kc2F0aXNmYWN0b3JpbyBtdWVzdHJhIHVuIG1hcmNhZG8gc2VzZ28gcG9zaXRpdm8sIGNvbiBsYSBtYXlvcsOtYSBkZSBsYXMNCmVzY3VlbGFzIGNvbmNlbnRyYWRhcyBlbiB2YWxvcmVzIGJham9zIChtZWRpYW5hOiA3JSkuDQoNCioqU29icmUgbGEgcmVsYWNpw7NuIGVudHJlIHZhcmlhYmxlcyBudW3DqXJpY2FzKioNClNlIGVuY29udHLDsyB1bmEgY29ycmVsYWNpw7NuIGRlIFBlYXJzb24gcG9zaXRpdmEgZMOpYmlsIGVudHJlIGVsICUgZGViYWpvDQpkZWwgYsOhc2ljbyB5IGVsICUgc2F0aXNmYWN0b3JpbyAociA9IDAuMjMsIHAgPCAwLjAwMSkuIExhIGJhamEgbWFnbml0dWQNCmluZGljYSBxdWUgYW1iYXMgdmFyaWFibGVzIG5vIHNvbiBjb21wbGVtZW50YXJpYXMgZGlyZWN0YXMgeSBxdWUgb3Ryb3MNCmZhY3RvcmVzIGV4cGxpY2FuIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIGRlc2VtcGXDsW8gZXNjb2xhci4NCg0KKipIMSDigJQgU2VjdG9yIHkgJSBTYXRpc2ZhY3RvcmlvKioNClNlIHJlY2hhemEgSOKCgCAoV2lsY294b246IHAgPCAwLjAwMSkuIExhcyBlc2N1ZWxhcyBwcml2YWRhcyBwcmVzZW50YW4gdW5hDQptZWRpYW5hIGRlICUgc2F0aXNmYWN0b3JpbyBzaWduaWZpY2F0aXZhbWVudGUgbWF5b3IgKDIzLjUlKSBxdWUgbGFzDQplc3RhdGFsZXMgKDUuMyUpLiBFbCB0YW1hw7FvIGRlbCBlZmVjdG8gZXMgbXV5IGdyYW5kZSAoZCA9IC0xLjU3KSwNCmluZGljYW5kbyBxdWUgbGEgZGlmZXJlbmNpYSBlbnRyZSBzZWN0b3JlcyBlcyBzdXN0YW50aXZhIHkgbm8gbWVyYW1lbnRlDQplc3RhZMOtc3RpY2EuIExhcyBlc2N1ZWxhcyBwcml2YWRhcyBtdWVzdHJhbiBlbnRyZSAxNy42IHkgMjUuMSBwdW50b3MNCnBvcmNlbnR1YWxlcyBtw6FzIGRlIGFsdW1ub3MgZW4gbml2ZWwgc2F0aXNmYWN0b3JpbyAoSUMgOTUlLCBXZWxjaCkuDQoNCioqSDIg4oCUIMOBbWJpdG8geSAlIERlYmFqbyBkZWwgYsOhc2ljbyoqDQpTZSByZWNoYXphIEjigoAgKFdpbGNveG9uOiBwIDwgMC4wMDEpLiBMYXMgZXNjdWVsYXMgdXJiYW5hcyBwcmVzZW50YW4gdW5hDQptZWRpYW5hIGRlICUgZGViYWpvIGRlbCBiw6FzaWNvIG1heW9yICg1NC4yJSkgcXVlIGxhcyBydXJhbGVzICgzMS44JSksDQpyZXN1bHRhZG8gY29udHJhaW50dWl0aXZvIHF1ZSBwdWVkZSBleHBsaWNhcnNlIHBvciBsYSBtYXlvciBjb25jZW50cmFjacOzbg0KZGUgbWF0csOtY3VsYSBlbiBjb250ZXh0b3MgZGUgdnVsbmVyYWJpbGlkYWQgc29jaWFsIGVuIHpvbmFzIHVyYmFuYXMuIEVsDQp0YW1hw7FvIGRlbCBlZmVjdG8gZXMgbW9kZXJhZG8gKGQgPSAtMC42NSkuDQoNCioqQ2hpwrIg4oCUIEFzb2NpYWNpw7NuIGVudHJlIFNlY3RvciB5IMOBbWJpdG8qKg0KU2UgcmVjaGF6YSBI4oKAICjPh8KyID0gMTI2LjMsIHAgPCAwLjAwMSkuIEV4aXN0ZSB1bmEgYXNvY2lhY2nDs24gZnVlcnRlIGVudHJlDQpzZWN0b3IgeSDDoW1iaXRvIChWIGRlIENyYW3DqXIgPSAwLjQ3KS4gTGFzIGVzY3VlbGFzIGVzdGF0YWxlcyBzb24NCnByZWRvbWluYW50ZW1lbnRlIHJ1cmFsZXMgKDcyLjYlKSBtaWVudHJhcyBxdWUgbGFzIHByaXZhZGFzIHNvbg0KbWF5b3JpdGFyaWFtZW50ZSB1cmJhbmFzICg4MS4yJSkuIEVzdGEgYXNvY2lhY2nDs24gZXMgcmVsZXZhbnRlIGFsDQppbnRlcnByZXRhciBsb3MgcmVzdWx0YWRvcyBhbnRlcmlvcmVzLCB5YSBxdWUgc2VjdG9yIHkgw6FtYml0byBubyBzb24NCnZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4NCg0KLS0tDQoNCiMjIFJlZmVyZW5jaWFzDQoNCi0gTWluaXN0ZXJpbyBkZSBFZHVjYWNpw7NuIGRlIGxhIE5hY2nDs24gQXJnZW50aW5hICgyMDI0KS4gKk9wZXJhdGl2byBOYWNpb25hbCBkZSBFdmFsdWFjacOzbiBBUFJFTkRFUiAyMDI0IOKAlCBSZXN1bHRhZG9zIE1hdGVtw6F0aWNhKi4gQnVlbm9zIEFpcmVzOiBEaU5JRUNFLg0KDQo=