Universidad de El Salvador · Facultad Multidisciplinaria Oriental
Departamento de Ciencias Económicas · Sección de Economía
Métodos para el Análisis Económico — MAE 118 · Examen parcial 3

1 Introducción

El cambio de la estructura productiva puede observarse en la participación de las actividades en el valor agregado, en la concentración de la producción y en la desigualdad de los crecimientos sectoriales. Un aumento del PIB no permite establecer, por sí solo, si la economía se está diversificando o si cambian los sectores que sostienen su expansión. Identificar estas diferencias es relevante para discutir la diversificación y la vulnerabilidad de la economía salvadoreña.

Pregunta de investigación. ¿Cómo cambiaron la estructura productiva, la concentración y la inversión de El Salvador entre 2005 I y 2026 II, y qué evidencia existe de cambios de régimen alrededor de la crisis de 2008–2009 y de la pandemia de 2020?

Hipótesis de trabajo. La participación del sector agropecuario en el valor agregado disminuyó entre el inicio y el final de la muestra, mientras los servicios conservaron el mayor peso. Se contrasta descriptivamente comparando los promedios de las primeras y de las últimas cuatro observaciones desestacionalizadas. Las pruebas de quiebres evalúan la estabilidad del índice NAV y no se interpretan como pruebas causales de esta hipótesis.

Objetivo general. Analizar la transformación de la estructura productiva salvadoreña mediante cuatro indicadores simples, los índices NAV y Lilien, el filtro HP y pruebas de series de tiempo.

Alcance acordado. El trabajo utiliza producción e inversión. Se excluyen la productividad laboral y la descomposición shift-share porque no se incorpora empleo sectorial. Esta exclusión se aparta de esos dos componentes del Tema 2 de la consigna original. La dolarización de 2001 se incluye como antecedente; su quiebre no es estimable con una muestra que empieza en 2005. Estas restricciones se mantienen visibles en la evaluación de cobertura del anexo.

2 Metodología

2.1 Paso 1 Cargar los cinco archivos

El archivo nominal trimestral (nom) y el de volumen trimestral (vol) son las fuentes principales. Los anuales (ann y anv) sirven de comprobación. El IPC (ipc) se conserva como referencia: su cobertura 2025–2026 no permite deflactar toda la historia. Se utiliza el deflactor implícito del PIB.

La primera ruta es la proporcionada por el estudiante. Si no existe, el código utiliza la subcarpeta datos incluida con el proyecto. No es necesario cambiar los nombres originales de los Excel. View(nom) o View(vol) pueden ejecutarse en la consola de RStudio, fuera del tejido del HTML.

carpeta <- "C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio"
if (!dir.exists(carpeta)) carpeta <- "datos"

nom <- read_excel(file.path(carpeta,
  "Producto_Interno_Bruto_Trimestral_(PIB_T)._Producción_y_gasto_a_precios_corrientes.xlsx"), col_names = FALSE)
vol <- read_excel(file.path(carpeta,
  "PIB_T._Producción_y_gasto._Índices_de_volumen_encadenados._Serie_original_(referencia_2014).xlsx"), col_names = FALSE)
ann <- read_excel(file.path(carpeta,
  "Producto_Interno_Bruto__Producción,_Gasto_e_Ingreso._A_precios_corrientes.xlsx"), col_names = FALSE)
anv <- read_excel(file.path(carpeta,
  "PIB__Producción_y_gasto._Índices_de_volumen_encadenados_(año_de_referencia_2014).xlsx"), col_names = FALSE)
ipc <- read_excel(file.path(carpeta,
  "Índice_de_Precios_al_Consumidor_(IPC).xlsx"), col_names = FALSE)

# Convierte una fila del Excel en un vector numérico.
fila <- function(x, i) as.numeric(unlist(x[i, -1], use.names = FALSE))

# Las filas 7 a 25 corresponden a las 19 actividades trimestrales.
n <- sapply(7:25, function(i) fila(nom, i))
v <- sapply(7:25, function(i) fila(vol, i))
pib_n <- fila(nom, 28)
fbk_n <- fila(nom, 34)
pib_v <- fila(vol, 28)
fbk_v <- fila(vol, 33)
vab_n <- fila(nom, 26)

ini <- as.integer(nom[[2]][4])
fecha <- seq(as.Date(paste0(ini, "-01-01")), by = "3 months", length.out = nrow(n))
anio <- as.integer(format(fecha, "%Y"))
tri <- (as.integer(format(fecha, "%m")) - 1) %/% 3 + 1
per <- paste0(anio, "-T", tri)
stopifnot(nrow(n) >= 80, nrow(n) == nrow(v), !anyNA(n), !anyNA(v),
          all(n > 0), all(v > 0), all(pib_n > 0), all(fbk_n > 0))
86observaciones trimestrales
2005-T1 a 2026-T2período observado
3 sectores19 actividades económicas
Cuadro 1. Fuentes y cobertura de los archivos recibidos
Archivo Cobertura Uso
PIB nominal trimestral 2005 I a 2026 II Estructura e inversión
PIB en volumen trimestral 2005 I a 2026 II Crecimientos y HP
PIB anual nominal y en volumen 2005 a 2025 Validación y referencia 2014
IPC 2025 I a 2026 X Referencia; no se usa como deflactor histórico

Se respeta el primer dato disponible de los archivos recibidos. La muestra de 86 trimestres supera el mínimo de 80 antes de transformar las series. Las notas de los archivos identifican 2024 como preliminar y 2025–2026 como estimado. No se proyectan trimestres faltantes de 2026 ni se presenta el primer semestre como un año completo.

2.2 Paso 2 Definir los tres sectores

La clasificación es una agrupación operativa del estudio: agropecuario (A), industria y construcción (B–F) y servicios (G–S). La minería se ubica explícitamente en el segundo grupo. La letra S trimestral ya incorpora T, actividades de los hogares como empleadores, en toda la serie; no se agrega de nuevo.

cod <- LETTERS[1:19]
act <- c("Agricultura, ganadería, silvicultura y pesca", "Explotación de minas y canteras",
 "Industrias manufactureras", "Electricidad, gas, vapor y aire acondicionado",
 "Agua, alcantarillados y gestión de desechos", "Construcción",
 "Comercio y reparación de vehículos", "Transporte y almacenamiento",
 "Alojamiento y servicio de comidas", "Información y comunicaciones",
 "Actividades financieras y de seguros", "Actividades inmobiliarias",
 "Actividades profesionales, científicas y técnicas", "Servicios administrativos y de apoyo",
 "Administración pública, defensa y seguridad social", "Enseñanza",
 "Salud humana y asistencia social", "Arte, entretenimiento y recreación",
 "Otros servicios, incluidos hogares como empleadores")
grupo <- c(1, rep(2, 5), rep(3, 13))
nom_sec <- c("Sector 1", "Sector 2", "Sector 3")
tabla(data.frame(Sector=paste("Sector",grupo), Código=cod, Actividad=act),
      "Cuadro 2. Correspondencia de actividades y sectores")
Cuadro 2. Correspondencia de actividades y sectores
Sector Código Actividad
Sector 1 A Agricultura, ganadería, silvicultura y pesca
Sector 2 B Explotación de minas y canteras
Sector 2 C Industrias manufactureras
Sector 2 D Electricidad, gas, vapor y aire acondicionado
Sector 2 E Agua, alcantarillados y gestión de desechos
Sector 2 F Construcción
Sector 3 G Comercio y reparación de vehículos
Sector 3 H Transporte y almacenamiento
Sector 3 I Alojamiento y servicio de comidas
Sector 3 J Información y comunicaciones
Sector 3 K Actividades financieras y de seguros
Sector 3 L Actividades inmobiliarias
Sector 3 M Actividades profesionales, científicas y técnicas
Sector 3 N Servicios administrativos y de apoyo
Sector 3 O Administración pública, defensa y seguridad social
Sector 3 P Enseñanza
Sector 3 Q Salud humana y asistencia social
Sector 3 R Arte, entretenimiento y recreación
Sector 3 S Otros servicios, incluidos hogares como empleadores

El PIB, los impuestos netos y la FBKF son agregados, no actividades adicionales. Las participaciones se calculan sobre valor agregado, excluyendo impuestos netos sobre productos. Antes del ajuste se verifica que la suma de las actividades coincida con el valor agregado publicado, admitiendo el redondeo de centésimas de millón.

2.3 Paso 3 Deflactar y desestacionalizar

El índice de volumen del PIB se convierte en una medida monetaria referenciada a 2014 usando la cuarta parte del PIB nominal anual de 2014, porque los índices trimestrales promedian 100 en ese año:

Ytr=Y2014n4IVEt100,Dt=100YtnYtr,VAitr,D=VAitnDt/100. Y_t^r=\frac{Y_{2014}^n}{4}\frac{IVE_t}{100},\qquad D_t=100\frac{Y_t^n}{Y_t^r},\qquad VA_{it}^{r,D}=\frac{VA_{it}^n}{D_t/100}.

El último cociente es una aproximación con deflactor común, usada para mostrar la transformación de los niveles nominales. El crecimiento sectorial de Lilien se obtiene de los índices oficiales de volumen de cada actividad y no de esa aproximación. Las participaciones y la inversión usan valores nominales en numerador y denominador, por definición.

Se aplica STL al logaritmo de cada serie positiva, con estacionalidad periódica y ajuste robusto. La serie ajustada es la exponencial del logaritmo menos su componente estacional. Se conservan las 86 observaciones. El ajuste es propio y puede diferir del publicado por el BCR.

# Referencia monetaria y deflactor implícito del PIB.
ref <- as.numeric(ann[30, which(fila(ann, 4) == 2014) + 1]) / 4
pib_r <- ref * pib_v / 100
def <- 100 * pib_n / pib_r
va_r <- n / (def / 100)

# Ajuste STL de una serie positiva.
aj <- function(x) {
  z <- ts(log(x), start = c(ini, 1), frequency = 4)
  est <- stl(z, s.window = "periodic", robust = TRUE)
  as.numeric(exp(z - est$time.series[, "seasonal"]))
}
ns <- apply(n, 2, aj)
vs <- apply(v, 2, aj)
pib <- aj(pib_v)
pn <- aj(pib_n)
fbk <- aj(fbk_n)

# El ajuste indirecto preserva la suma de los tres sectores.
va <- cbind(ns[,1], rowSums(ns[,2:6]), rowSums(ns[,7:19]))
colnames(va) <- nom_sec
part <- 100 * va / rowSums(va)
s1 <- part[,1]; s2 <- part[,2]; s3 <- part[,3]
stopifnot(max(abs(rowSums(part) - 100)) < 1e-8)
err_va <- max(abs(rowSums(n) - vab_n))

La diferencia máxima entre la suma de las ramas nominales originales y el valor agregado publicado es 0.030 millones de dólares. Las pequeñas diferencias son compatibles con el redondeo. La suma de participaciones de los tres sectores ajustados es 100 % por construcción.

2.4 Paso 4 Construir los indicadores

Cuadro 3. Definición de los seis indicadores; frecuencia trimestral
Indicador Fórmula Unidad Fuente
Crecimiento del PIB real 100 × Δ ln PIB real ajustado % trimestral logarítmico BCR volumen
Participación sectorial 100 × VA sectorial / VA total ajustado % del valor agregado BCR nominal
Tasa de inversión 100 × FBKF nominal ajustada / PIB nominal ajustado % del PIB BCR nominal
Concentración HHI Suma de (participación/100)² Índice entre 1/3 y 1 Participaciones
NAV 0.5 × suma de |s(t) − s(t−k)| Puntos porcentuales Participaciones
Lilien Raíz de suma de (s/100) × (g sectorial − g PIB)² Puntos porcentuales de dispersión BCR volumen y nominal

El crecimiento principal compara un trimestre con el inmediato anterior, después del ajuste estacional. No es una tasa interanual ni anualizada. NAV se calcula con k = 4 trimestres, un horizonte de un año que deja 82 observaciones. Se conserva k = 20 (cinco años) como sensibilidad, con 66 observaciones; no se afirma que esa variante alcance por sí sola el mínimo de 80.

Con j=1,2,3j=1,2,3, las expresiones de los indicadores son:

gt=100Δln⁡Ytr,SA,sjt=100VAjtn,SA∑h=13VAhtn,SA,It=100FBKFtn,SAYtn,SA. g_t=100\Delta\ln Y_t^{r,SA},\qquad s_{jt}=100\frac{VA_{jt}^{n,SA}}{\sum_{h=1}^{3}VA_{ht}^{n,SA}},\qquad I_t=100\frac{FBKF_t^{n,SA}}{Y_t^{n,SA}}.

HHIt=∑j=13(sjt100)2,NAVt=12∑j=13|sjt−sj,t−4|. HHI_t=\sum_{j=1}^{3}\left(\frac{s_{jt}}{100}\right)^2,\qquad NAV_t=\frac{1}{2}\sum_{j=1}^{3}|s_{jt}-s_{j,t-4}|.

Lilient=∑j=13sjt100(gjt−gt)2. Lilien_t=\sqrt{\sum_{j=1}^{3}\frac{s_{jt}}{100}(g_{jt}-g_t)^2}.

El superíndice SA identifica las series ajustadas por estacionalidad; n indica precios corrientes y r volumen real.

Los índices de volumen encadenados no se suman directamente. Para el crecimiento de los tres sectores se utiliza una agregación propia de tipo Törnqvist: promedio de las participaciones nominales internas de dos trimestres consecutivos, multiplicado por los crecimientos logarítmicos de las actividades. Es una aproximación superlativa para estos grupos y no una serie agregada oficial del BCR.

gjt=100∑i∈jωit+ωi,t−12Δln⁡IVEitSA,ωit=VAitn,SA∑i∈jVAitn,SA. g_{jt}=100\sum_{i\in j}\frac{\omega_{it}+\omega_{i,t-1}}2 \Delta\ln IVE_{it}^{SA},\qquad \omega_{it}=\frac{VA_{it}^{n,SA}}{\sum_{i\in j}VA_{it}^{n,SA}}.

g <- c(NA, 100 * diff(log(pib)))
inv <- 100 * fbk / pn
hhi <- rowSums((part / 100)^2)

# Cambios de las participaciones a k trimestres.
cambio <- function(s, k) {
  rbind(matrix(NA, k, ncol(s)), abs(s[(k+1):nrow(s), ] - s[1:(nrow(s)-k), ]))
}
u <- cambio(part, 4)
nav <- rowSums(u) / 2
nav5 <- rowSums(cambio(part, 20)) / 2

# Crecimiento real de las actividades y de los tres sectores.
gi <- apply(log(vs), 2, function(x) c(NA, 100 * diff(x)))
gs <- matrix(NA, nrow(n), 3)
for (j in 1:3) {
  w <- ns[, grupo == j, drop = FALSE]
  w <- w / rowSums(w)
  wm <- (w[-1, , drop=FALSE] + w[-nrow(w), , drop=FALSE]) / 2
  gs[-1,j] <- rowSums(wm * gi[-1, grupo == j, drop=FALSE])
}
colnames(gs) <- nom_sec
lil <- sqrt(rowSums((part / 100) * (gs - g)^2))
w19 <- ns / rowSums(ns)
lil19 <- sqrt(rowSums(w19 * (gi - g)^2))

d <- data.frame(fecha, per, anio, tri, pib, g, s1, s2, s3, inv, hhi, nav, nav5, lil)
d$g1 <- gs[,1]; d$g2 <- gs[,2]; d$g3 <- gs[,3]

NAV mide la magnitud de la reasignación productiva, no su conveniencia. Lilien mide dispersión entre los crecimientos productivos: no demuestra movilidad efectiva del empleo. HHI depende del número de grupos; con tres sectores su mínimo es 1/3, por lo que no debe compararse directamente con un HHI de 19 actividades.

2.5 Paso 5 Comparar ponderaciones

NAV y Lilien conservan sus fórmulas específicas. Para cubrir el procedimiento general de estandarización y pesos de la consigna, se añade un índice auxiliar de intensidad del cambio, construido con los tres cambios absolutos que forman NAV. No sustituye ni se presenta como el NAV original.

Se estandarizan los componentes en la misma muestra de 82 trimestres. Todos llevan signo positivo porque aumentos indican más intensidad, no mayor bienestar. El caso base usa pesos 1/3. La variante PCA utiliza el cuadrado de las cargas del primer componente, normalizado para que los pesos sumen uno. Los pesos reflejan covariación estadística y no importancia causal.

zjt=ujt−u¯jσj,ICt=∑j=13wjzjt,wjPCA=aj12∑h=13ah12, z_{jt}=\frac{u_{jt}-\overline{u}_j}{\sigma_j},\qquad IC_t=\sum_{j=1}^{3}w_jz_{jt},\qquad w_j^{PCA}=\frac{a_{j1}^{2}}{\sum_{h=1}^{3}a_{h1}^{2}},

donde ujt=|sjt−sj,t−4|u_{jt}=|s_{jt}-s_{j,t-4}|, σj\sigma_j es la desviación estándar muestral y aj1a_{j1} es la carga del primer componente principal. El reescalamiento 0–100 se aplica por separado a cada versión para facilitar la comparación gráfica.

ok <- complete.cases(u)
z <- scale(u[ok, ])
pc <- prcomp(z, center = FALSE, scale. = FALSE)
pesos <- pc$rotation[,1]^2 / sum(pc$rotation[,1]^2)
ic1 <- rowMeans(z)
ic2 <- as.numeric(z %*% pesos)
reesc <- function(x) 100 * (x - min(x)) / (max(x) - min(x))
rob <- data.frame(fecha = fecha[ok], Igual = reesc(ic1), PCA = reesc(ic2))
rho <- cor(ic1, ic2)
exp_pc <- 100 * pc$sdev[1]^2 / sum(pc$sdev^2)

# Función pequeña para graficar varias columnas con una leyenda común.
larga <- function(x, fechas, nombres = colnames(x)) {
  data.frame(fecha = rep(fechas, ncol(x)),
             serie = rep(nombres, each = nrow(x)), valor = as.vector(as.matrix(x)))
}

2.6 Paso 6 Especificar las pruebas y los quiebres

Las pruebas ADF, KPSS y Zivot-Andrews se aplican a tres series centrales: logaritmo del PIB ajustado, NAV y Lilien. Se examinan niveles y primeras diferencias. ADF utiliza un máximo de cuatro rezagos y selección BIC; KPSS usa corrección corta de autocorrelación. Zivot-Andrews usa el número de rezagos elegido para ADF y permite un quiebre endógeno. El logaritmo del PIB incluye tendencia; los índices se modelan con constante. Para sus primeras diferencias se usa constante.

La nula de ADF y Zivot-Andrews es raíz unitaria; la nula de KPSS es estacionariedad respecto de la parte determinística especificada. Se informa la decisión al 5 % con estadísticos y valores críticos. Resultados contradictorios se reconocen, sin asignar automáticamente un orden de integración.

raiz <- function(x, fechas, nombre, tendencia = FALSE, dif = FALSE) {
  buen <- is.finite(x)
  x <- x[buen]; fechas <- fechas[buen]
  if (dif) { x <- diff(x); fechas <- fechas[-1]; tendencia <- FALSE }
  a <- ur.df(x, type = if (tendencia) "trend" else "drift", lags = 4, selectlags = "BIC")
  k <- ur.kpss(x, type = if (tendencia) "tau" else "mu", lags = "short")
  rez <- sum(grepl("z.diff.lag", rownames(a@testreg$coefficients), fixed = TRUE))
  za <- ur.za(x, model = if (tendencia) "both" else "intercept", lag = rez)
  est <- c(a@teststat[1,1], k@teststat, za@teststat)
  crit <- c(a@cval[1,"5pct"], k@cval[1,"5pct"], za@cval[2])
  rechazo <- c(est[1] < crit[1], est[2] > crit[2], est[3] < crit[3])
  q <- paste0(format(fechas[za@bpoint], "%Y"), "-T", (as.integer(format(fechas[za@bpoint], "%m"))-1)%/%3+1)
  data.frame(Serie = nombre, Forma = if (dif) "Diferencia" else "Nivel",
             Prueba = c("ADF", "KPSS", "Zivot-Andrews"), N = length(x),
             Modelo = c(if (tendencia) "Constante y tendencia" else "Constante",
                        if (tendencia) "Tendencia" else "Nivel", if(tendencia) "Ambos" else "Intercepto"),
             Rezagos = c(rez, k@lag, rez), Estadístico = est, Crítico_5 = crit,
             Rechaza_nula = ifelse(rechazo, "Sí", "No"),
             Quiebre = c("", "", q))
}
series <- list("ln PIB" = log(pib), "NAV" = nav, "Lilien" = lil)
test <- do.call(rbind, lapply(names(series), function(nombre) {
  rbind(raiz(series[[nombre]], fecha, nombre, nombre == "ln PIB"),
        raiz(series[[nombre]], fecha, nombre, nombre == "ln PIB", dif = TRUE))
}))

El índice principal para fechar quiebres es NAV a cuatro trimestres. Se estima un modelo de cambios de media, NAV = media de cada régimen + error, mediante el algoritmo Bai–Perron de breakpoints. Se busca entre cero y tres quiebres, con segmentos mínimos del 15 % de la muestra y selección BIC. El máximo de tres es un límite de parsimonia, no una imposición de los tres hitos.

Se añade una prueba de estabilidad supF con covarianza Newey–West (cuatro rezagos). Su p-valor corresponde a estabilidad, no es un p-valor individual de cada fecha elegida por BIC. NAV tiene ventanas solapadas, por lo que se reporta autocorrelación residual y una sensibilidad que permite dinámica AR(1). Los intervalos de las fechas son aproximaciones asintóticas y no recogen toda la incertidumbre de selección.

b <- d[is.finite(d$nav), c("fecha", "per", "nav")]
bp <- breakpoints(nav ~ 1, data = b, h = 0.15, breaks = 3)
bic <- as.numeric(BIC(bp))
m <- which.min(bic) - 1
cortes <- if (m > 0) breakpoints(bp, breaks = m)$breakpoints else integer(0)
b$reg <- factor(findInterval(seq_len(nrow(b)), cortes) + 1)
fit <- if (m > 0) lm(nav ~ reg, data = b) else lm(nav ~ 1, data = b)
b$media <- fitted(fit)
nw <- function(modelo) NeweyWest(modelo, lag = 4, prewhite = FALSE, adjust = TRUE)
fs <- Fstats(nav ~ 1, data = b, from = 0.15, vcov. = nw)
sup <- sctest(fs, type = "supF")
lb <- Box.test(residuals(fit), lag = 8, type = "Ljung-Box")
ci <- if (m > 0) confint(bp, breaks = m, vcov. = nw)$confint else matrix(numeric(0), 0, 3)

# Sensibilidad con dinámica AR(1).
b$ar <- c(NA, head(b$nav, -1))
ba <- b[-1, ]
bpa <- breakpoints(nav ~ ar, data = ba, h = 0.15, breaks = 3)
ma <- which.min(as.numeric(BIC(bpa))) - 1
ca <- if (ma > 0) breakpoints(bpa, breaks = ma)$breakpoints else integer(0)

# Contrastes adicionales de cambio de media en fechas fijadas previamente.
hitos <- as.Date(c("2008-10-01", "2009-01-01", "2020-04-01"))
hist <- do.call(rbind, lapply(hitos, function(f) {
  b$pos <- as.integer(b$fecha >= f)
  fm <- lm(nav ~ pos, data = b)
  ct <- coeftest(fm, vcov. = nw)
  data.frame(Fecha = format(f, "%Y-%m-%d"), Antes = sum(b$pos == 0), Después = sum(b$pos == 1),
             Cambio = ct["pos",1], p_HAC = ct["pos",4])
}))
hist$p_Holm <- p.adjust(hist$p_HAC, method = "holm")

2.7 Paso 7 Estimar el producto potencial

El filtro HP se aplica al logaritmo del PIB real ajustado con λ = 1,600. Se define Yt*=exp⁡(τt)Y_t^*=\exp(\tau_t) y la brecha como 100(Yt/Yt*−1)100(Y_t/Y_t^*-1). El potencial es una aproximación estadística, no una medición de capacidad basada en capital y trabajo. En los gráficos se expresa como índice con referencia 2014 y se reconoce la sensibilidad al extremo final.

hp <- hpfilter(ts(log(pib), start = c(ini,1), frequency = 4), freq = 1600, type = "lambda")
pot <- as.numeric(exp(hp$trend))
gap <- 100 * (pib / pot - 1)
d$pot <- pot; d$gap <- gap

3 Resultados

3.1 Estructura de largo plazo

Cuadro 4. Participación media: 2005-T1–2005-T4 frente a 2025-T3–2026-T2
Sector Inicio Final Cambio_pp
Sector 1 6.70 4.83 -1.87
Sector 2 26.88 28.16 1.28
Sector 3 66.42 67.01 0.59

La participación agropecuaria pasa de 6.70 % a 4.83 %, una variación de -1.87 puntos porcentuales. Los servicios representan 67.01 % en las últimas cuatro observaciones. Esta comparación utiliza ventanas de cuatro trimestres ajustados y no atribuye las diferencias a un único acontecimiento.

ggplot(larga(part, fecha), aes(fecha, valor, color = serie)) +
  geom_line(linewidth = 0.85) + scale_color_manual(values = col) +
  labs(title = "El peso de los tres sectores", x = NULL, y = "% del valor agregado", caption = fuente)
Figura 1. Participaciones de los tres sectores en el valor agregado ajustado.

Figura 1. Participaciones de los tres sectores en el valor agregado ajustado.

3.2 Crecimiento real e inversión

ggplot(d, aes(fecha, g)) + geom_hline(yintercept=0, color="#b6a8a0") +
  geom_col(fill="#762440", width=65) +
  labs(title="Crecimiento real y persistencia de los choques", x=NULL,
       y="% respecto del trimestre anterior", caption=fuente)
Figura 2. Crecimiento trimestral logarítmico del PIB real desestacionalizado.

Figura 2. Crecimiento trimestral logarítmico del PIB real desestacionalizado.

ggplot(d, aes(fecha, inv)) + geom_line(color="#246779", linewidth=0.9) +
  labs(title="Acumulación de capital fijo", x=NULL, y="FBKF / PIB (%)", caption=fuente)
Figura 3. Formación bruta de capital fijo como porcentaje del PIB nominal ajustado.

Figura 3. Formación bruta de capital fijo como porcentaje del PIB nominal ajustado.

La tasa de inversión media es 16.28 % al inicio y 27.87 % al final. La tasa mide la proporción destinada a capital fijo, pero no su eficiencia, utilización, composición tecnológica ni aporte causal al crecimiento.

3.3 Concentración, NAV y Lilien

ggplot(d, aes(fecha, hhi)) + geom_line(color="#b77b26", linewidth=0.9) +
  labs(title="Concentración de la estructura productiva", x=NULL, y="HHI (tres sectores)", caption=fuente)
Figura 4. Concentración del valor agregado en tres sectores.

Figura 4. Concentración del valor agregado en tres sectores.

El HHI promedio cambia de 0.518 a 0.531. El aumento describe mayor concentración entre los tres grandes grupos. Este indicador puede ocultar diversificación dentro de cada grupo y no mide concentración empresarial.

ind <- data.frame(fecha=rep(fecha,2), serie=rep(c("NAV a un año", "Lilien de producción"),each=nrow(d)), valor=c(nav,lil))
ggplot(ind, aes(fecha,valor)) + geom_line(color="#762440", linewidth=0.85) +
  facet_wrap(~serie, ncol=1, scales="free_y") +
  labs(title="Dos dimensiones del cambio estructural", x=NULL, y="Puntos porcentuales", caption=fuente)
Figura 5. Intensidad de la transformación y dispersión de crecimientos; escalas distintas.

Figura 5. Intensidad de la transformación y dispersión de crecimientos; escalas distintas.

El máximo de NAV es 4.95 puntos, en 2020-T2. El máximo de Lilien es 10.30, en 2020-T2. Son indicadores de magnitud y dispersión, no de bienestar ni de reasignación observada de trabajadores.

3.4 Robustez de las ponderaciones y de la agregación

Cuadro 5. Pesos del índice auxiliar de intensidad
Sector Iguales PCA
Sector 1 0.3333 0.1746
Sector 2 0.3333 0.3735
Sector 3 0.3333 0.4518

La correlación de las dos versiones auxiliares es 0.9821, con la misma muestra de 82 trimestres. El primer componente explica 68.82 % de la varianza estandarizada. Una correlación alta indica semejanza temporal; no valida causalidad ni sustituye los índices específicos.

ggplot(larga(as.matrix(rob[,2:3]), rob$fecha, c("Pesos iguales","Pesos PCA")),
       aes(fecha,valor,color=serie)) + geom_line(linewidth=0.9) +
  scale_color_manual(values=c("Pesos iguales"="#762440","Pesos PCA"="#b77b26")) +
  labs(title="Sensibilidad a las ponderaciones", x=NULL, y="Escala 0–100", caption=fuente)
Figura 6. Índice auxiliar de intensidad, reescalado de 0 a 100 en cada versión.

Figura 6. Índice auxiliar de intensidad, reescalado de 0 a 100 en cada versión.

Cuadro 6. Robustez sobre muestras comunes
Comparación N Correlación
NAV a 4 y 20 trimestres 66 0.4182
Lilien con 3 grupos y 19 actividades 85 0.8340
Auxiliar con pesos iguales y PCA 82 0.9821

La sensibilidad de NAV cambia el horizonte económico y la de Lilien cambia la desagregación, por lo que no deben interpretarse como versiones idénticas con distintos pesos. Con tres sectores pueden compensarse movimientos internos que sí aparecen con 19 actividades.

La correlación de 0.4182 entre los dos horizontes de NAV muestra que el diagnóstico de corto y mediano plazo depende del período de comparación. Por su parte, la correlación de 0.8340 entre Lilien de tres y 19 actividades indica semejanza parcial, con información interna que se pierde al agrupar. La coincidencia de los pesos auxiliares, por tanto, no elimina la sensibilidad al horizonte o a la clasificación.

3.5 Raíz unitaria y persistencia

Cuadro 7. Pruebas en niveles; decisiones al 5 %
Serie Prueba N Modelo Rezagos Estadístico Crítico_5 Rechaza_nula Quiebre
ln PIB ADF 86 Constante y tendencia 1 -4.097 -3.450 Sí
ln PIB KPSS 86 Tendencia 3 0.147 0.146 Sí
ln PIB Zivot-Andrews 86 Ambos 1 -7.049 -5.080 Sí 2020-T1
NAV ADF 82 Constante 3 -2.967 -2.890 Sí
NAV KPSS 82 Nivel 3 0.285 0.463 No
NAV Zivot-Andrews 82 Intercepto 3 -4.615 -4.800 No 2019-T4
Lilien ADF 85 Constante 1 -5.434 -2.890 Sí
Lilien KPSS 85 Nivel 3 0.163 0.463 No
Lilien Zivot-Andrews 85 Intercepto 1 -5.957 -4.800 Sí 2020-T1

Lectura del cuadro. En ADF y Zivot-Andrews, rechazar la nula favorece estacionariedad bajo el modelo especificado. En KPSS, rechazar cuestiona la estacionariedad. La fecha de Zivot-Andrews es un candidato endógeno del contraste de raíz unitaria y no equivale al fechado de Bai–Perron. Las primeras diferencias y los resultados completos se conservan en el anexo.

En esta ejecución, el logaritmo del PIB presenta evidencia mixta: ADF rechaza raíz unitaria, mientras KPSS rechaza estacionariedad alrededor de una tendencia lineal por un margen pequeño (0.147 frente a 0.146). Zivot-Andrews rechaza raíz unitaria permitiendo un quiebre en 2020 I. No se asigna automáticamente un orden de integración al PIB a partir de un solo contraste.

Para NAV, ADF y KPSS son compatibles con estacionariedad en nivel al 5 %, pero Zivot-Andrews no rechaza raíz unitaria. La cercanía del ADF a su valor crítico y la discrepancia entre pruebas aconsejan cautela. En Lilien, las tres pruebas son compatibles con estacionariedad bajo sus especificaciones. Un índice estacionario puede presentar episodios de elevada dispersión sin que estos constituyan una nueva tendencia permanente.

3.6 Quiebres del índice principal

Cuadro 8. Selección del número de quiebres del NAV
Quiebres BIC
0 215.52
Cuadro 9. Resultado del fechado
Resultado
BIC selecciona cero quiebres en el modelo de medias
Cuadro 10. Estabilidad y diagnóstico
Prueba Estadístico p_valor
supF con covarianza HAC 7.0031 0.1047
Ljung-Box de residuos, 8 rezagos 17.5709 0.0247

BIC selecciona 0 quiebre(s). La prueba supF arroja p = 0.1047: no se rechaza la estabilidad al 5 % bajo este contraste. La fecha que marca breakpoints es la última observación del régimen anterior; el cuadro también muestra la primera del siguiente.

En la muestra recibida, la selección de cero quiebres significa que no se identifican cambios persistentes de la media de NAV con este modelo y criterio. No significa que las participaciones sectoriales permanezcan constantes ni que las crisis carezcan de efectos. La curva del índice puede registrar movimientos fuertes y temporales dentro de un mismo régimen de media.

ggplot(b,aes(fecha,nav)) + geom_line(color="#762440",linewidth=0.75) +
  geom_step(aes(y=media),color="#b77b26",linewidth=1) +
  geom_vline(xintercept=as.numeric(b$fecha[cortes]),linetype="dashed",color="#526274") +
  labs(title="Estabilidad de la intensidad del cambio",x=NULL,y="NAV a cuatro trimestres",caption=fuente)
Figura 7. NAV y medias de los regímenes seleccionados por BIC.

Figura 7. NAV y medias de los regímenes seleccionados por BIC.

La variante AR(1) selecciona 0 quiebre(s), con fines de régimen en ninguno. El diagnóstico detecta autocorrelación residual: las ventanas superpuestas y la dinámica del índice limitan la precisión del modelo de medias. Se interpreta el fechado junto con la sensibilidad AR(1), sin tratar cada fecha como una certeza.

Cuadro 11. Cambio de media del NAV en fechas históricas prefijadas; errores HAC y ajuste Holm
Fecha Antes Después Cambio p_HAC p_Holm
2008-10-01 11 71 -0.2100 0.4058 1
2009-01-01 12 70 -0.1025 0.6168 1
2020-04-01 57 25 0.0514 0.8474 1

Estos contrastes comparan medias anteriores y posteriores a cada fecha; no son estimaciones causales ni pruebas de un efecto transitorio de un solo trimestre. Para 2001 se informa no estimable: fuera de la muestra. Los contrastes de 2008 IV y 2009 I representan dos puntos prefijados de la misma crisis; Holm corrige los tres contrastes de este cuadro.

Los tres contrastes prefijados no rechazan igualdad de medias al 5 %, incluso antes de la corrección múltiple. Esto es compatible con un choque intenso pero transitorio en 2020 II, trimestre en que se observan los máximos de NAV y Lilien y la menor brecha HP. La falta de rechazo no demuestra igualdad exacta de los regímenes.

3.7 Producto potencial y brecha

ggplot(larga(cbind(Observado=pib, Potencial=pot),fecha),aes(fecha,valor,color=serie)) +
  geom_line(linewidth=0.9) + scale_color_manual(values=c("Observado"="#762440","Potencial"="#b77b26")) +
  labs(title="Producción observada y tendencia de largo plazo",x=NULL,y="Índice de volumen",caption=fuente)
Figura 8. PIB real ajustado y tendencia HP; índice referido a 2014.

Figura 8. PIB real ajustado y tendencia HP; índice referido a 2014.

ggplot(d,aes(fecha,gap)) + geom_hline(yintercept=0,color="#918077") +
  geom_col(aes(fill=gap>=0),width=65,show.legend=FALSE) +
  scale_fill_manual(values=c("FALSE"="#762440","TRUE"="#246779")) +
  labs(title="Desviaciones respecto de la tendencia",x=NULL,y="Brecha del producto (%)",caption=fuente)
Figura 9. Brecha porcentual respecto del potencial HP, λ = 1600.

Figura 9. Brecha porcentual respecto del potencial HP, λ = 1600.

La menor brecha se ubica en 2020-T2, con -20.08 %. La última es 1.15 %. Una brecha positiva significa producción por encima de la tendencia estimada; una negativa, por debajo. El dato final es especialmente sensible a nuevas observaciones y revisiones, y no constituye una medida exacta de holgura ni un pronóstico.

4 Discusión y conclusiones

4.1 Qué cambió en la estructura

El contraste descriptivo de la hipótesis es compatible con una menor participación agropecuaria y con el predominio de los servicios en la ventana final. La comparación de extremos no implica que el cambio haya sido uniforme. La trayectoria completa y NAV permiten identificar episodios de avance y reversión.

La participación se mide a precios corrientes. Por eso combina cambios de cantidades y precios relativos, y no identifica por sí sola una transferencia física de recursos. Los crecimientos de volumen y Lilien aportan otra perspectiva. La desagregación de tres sectores facilita comunicar el patrón general, pero agrupa actividades con productividades y tecnologías distintas.

4.2 Cómo interpretar los choques y la persistencia

La crisis de 2008–2009 y la pandemia se contrastan con fechas prefijadas y con un fechado endógeno. La coincidencia de un episodio elevado de NAV o Lilien con una crisis es evidencia descriptiva de heterogeneidad o reasignación, no una identificación causal. Un choque transitorio puede elevar la dispersión sin constituir un nuevo régimen permanente. Por esta razón se consideran BIC, supF, autocorrelación y sensibilidad AR(1) conjuntamente.

En concreto, el episodio de 2020 II destaca en dispersión y brecha, pero BIC selecciona cero quiebres de media tanto en el modelo básico como en la sensibilidad AR(1); supF tampoco rechaza al 5 %. Hay evidencia descriptiva de un choque excepcional, junto con evidencia insuficiente de un cambio permanente en la media de NAV. La autocorrelación residual detectada limita la precisión del modelo básico y forma parte de esta interpretación.

La dolarización de 2001 no puede evaluarse estadísticamente: no hay observaciones previas ni del propio año en estos archivos. No detectar ese hito en una muestra posterior no demuestra ausencia de efectos. Tampoco se atribuyen los quiebres posteriores a la dolarización sin una estrategia adicional de identificación.

4.3 Qué aporta la inversión

La inversión media es mayor en las últimas cuatro observaciones que en las primeras. Esto describe una modificación de la composición del gasto. La simultaneidad entre inversión y expansión productiva no permite establecer dirección causal ni afirmar que aumentó la productividad del capital. La FBKF es distinta de la formación bruta de capital total; los inventarios recientes están en revisión y no se utilizan en el numerador.

4.4 Límites de las conclusiones

El análisis utiliza archivos con cifras recientes preliminares o estimadas, un ajuste estacional propio y aproximaciones de agregación. Las pruebas tienen incertidumbre de muestra, elección de rezagos, segmentos y especificación. La alta correlación entre pesos no asegura robustez a cualquier indicador o clasificación. La brecha HP es sensible al extremo de la muestra. Finalmente, el estudio no mide productividad laboral ni ejecuta shift-share: esos componentes quedan fuera por la exclusión acordada del empleo.

Conclusión principal. Entre las ventanas inicial y final, la participación agropecuaria disminuye de 6.70 % a 4.83 %, los servicios conservan el mayor peso y la inversión pasa de 16.28 % a 27.87 % del PIB. El HHI de tres grupos aumenta de 0.518 a 0.531; por tanto, el cambio observado no equivale a una distribución más equilibrada entre estos tres grupos. La crisis de 2020 produce el episodio más intenso de dispersión, mientras las pruebas aplicadas no identifican cambios persistentes de la media de NAV al 5 %. Sin empleo sectorial, estos resultados no permiten concluir que la reasignación elevó o redujo la productividad laboral.

5 Referencias

  • Banco Central de Reserva de El Salvador. Producto Interno Bruto Trimestral: Producción y gasto a precios corrientes. Archivo Excel facilitado por el estudiante, corte de archivos 12 de noviembre de 2026, última observación 2026 II. Consulta BCR.
  • Banco Central de Reserva de El Salvador. PIB T. Producción y gasto. Índices de volumen encadenados. Serie original (referencia 2014). Archivo Excel facilitado por el estudiante, mismo corte. Sector real.
  • Banco Central de Reserva de El Salvador. PIB anual a precios corrientes e índices de volumen encadenados; IPC. Archivos complementarios facilitados por el estudiante. Base estadística.
  • Universidad de El Salvador, Sección de Economía. (2026). Examen parcial 3: Desarrollo de indicadores para el análisis estructural de la economía salvadoreña. Consigna y rúbrica facilitadas por el estudiante.
  • R Core Team. STL y componentes principales. Documentación de stl y prcomp.
  • Pfaff, B. urca: Unit Root and Cointegration Tests for Time Series Data. Manual.
  • Zeileis, A. y colaboradores. strucchange: Testing, Monitoring, and Dating Structural Changes. Incluye el algoritmo de Bai y Perron (2003). Manual.
  • Balcilar, M. mFilter: Miscellaneous Time Series Filters. Implementación del filtro de Hodrick y Prescott. Manual.
  • Fondo Monetario Internacional y otros organismos. (2004). Producer Price Index Manual: Theory and Practice, capítulo 16, sección 16.124 y ecuación 16.72: índice de cantidad Törnqvist con participaciones de valor. Manual.
  • Posit. R Markdown: html_document. Documentación.

6 Anexos para reproducir y defender

6.1 Cobertura de la consigna

Cuadro A1. Cumplimiento efectivo y exclusiones
Requisito Cobertura
HTML autocontenido con R Markdown Generado desde este Rmd; fórmulas MathML e imágenes integradas
Muestra trimestral mínima 86 datos originales; NAV anual: 82
Corte de 2026 Hasta 2026 II en los archivos recibidos
Crecimiento, participaciones, inversión y HHI Calculados
NAV y Lilien Calculados con fórmulas específicas
STL, logaritmos y deflactor Aplicados y documentados
Pesos iguales y PCA Comparación auxiliar explícita; no reemplaza NAV
ADF, KPSS y Zivot-Andrews Resultados en niveles y diferencias
Bai-Perron sobre NAV Fechado BIC, estabilidad HAC y sensibilidad AR(1)
Potencial y brecha HP Calculados con lambda 1600
Dolarización de 2001 No estimable; se conserva como antecedente
Productividad laboral y shift-share Excluidos por alcance acordado

6.2 Primeras diferencias y sensibilidad gráfica

Cuadro A2. Pruebas sobre primeras diferencias
Serie Prueba N Modelo Rezagos Estadístico Crítico_5 Rechaza_nula Quiebre
ln PIB ADF 85 Constante 2 -8.293 -2.890 Sí
ln PIB KPSS 85 Nivel 3 0.048 0.463 No
ln PIB Zivot-Andrews 85 Intercepto 2 -9.158 -4.800 Sí 2020-T3
NAV ADF 81 Constante 2 -12.124 -2.890 Sí
NAV KPSS 81 Nivel 3 0.052 0.463 No
NAV Zivot-Andrews 81 Intercepto 2 -12.324 -4.800 Sí 2009-T3
Lilien ADF 84 Constante 1 -9.641 -2.890 Sí
Lilien KPSS 84 Nivel 3 0.025 0.463 No
Lilien Zivot-Andrews 84 Intercepto 1 -10.304 -4.800 Sí 2020-T3
ggplot(larga(cbind("Un año"=nav,"Cinco años"=nav5),fecha),aes(fecha,valor,color=serie)) +
  geom_line(linewidth=0.85) + scale_color_manual(values=c("Un año"="#762440","Cinco años"="#246779")) +
  labs(title="Sensibilidad del horizonte de comparación",x=NULL,y="NAV (puntos)",caption=fuente)
Figura A1. NAV con horizontes de uno y cinco años; unidades iguales, horizonte distinto.

Figura A1. NAV con horizontes de uno y cinco años; unidades iguales, horizonte distinto.

ggplot(larga(cbind("Tres sectores"=lil,"19 actividades"=lil19),fecha),aes(fecha,valor,color=serie)) +
  geom_line(linewidth=0.85) + scale_color_manual(values=c("Tres sectores"="#762440","19 actividades"="#246779")) +
  labs(title="Efecto de la desagregación",x=NULL,y="Lilien (puntos)",caption=fuente)
Figura A2. Dispersión con tres sectores y con 19 actividades.

Figura A2. Dispersión con tres sectores y con 19 actividades.

6.3 Comprobaciones de datos y deflactación

Cuadro A3. Validación de los archivos anual y trimestral, millones de dólares
Año PIB_anual PIB_suma_trimestres FBKF_anual FBKF_suma_trimestres
2005 14698 14698 2394.7 2394.7
2014 22593 22593 3489.5 3489.5
2025 36708 36708 9977.1 9977.1
Cuadro A4. Validación del PIB en volumen, referencia 2014
Año Volumen_anual Promedio_trimestral
2005 83.02 83.025
2014 100.00 100.000
2025 131.68 131.678
Cuadro A5. Trazabilidad del deflactor implícito, referencia 2014
Período PIB_nominal PIB_real_ref2014 Deflactor
2005-T1 3348.3 4352.1 76.935
2014-T1 5434.1 5520.7 98.431
2014-T2 5701.6 5741.6 99.304
2026-T2 10060.6 7865.9 127.901

Las diferencias de centésimas en la comprobación anual proceden del redondeo. El cuadro del deflactor usa niveles originales, no ajustados. Para obtener niveles sectoriales aproximados en millones de dólares de referencia se divide cada valor nominal por ese deflactor/100; para los crecimientos sectoriales principales se conservan los índices oficiales y la agregación Törnqvist especificada.

LS0tDQp0aXRsZTogIkNhbWJpbyBlc3RydWN0dXJhbCB5IGNyZWNpbWllbnRvIGRlIEVsIFNhbHZhZG9yIg0Kc3VidGl0bGU6ICJUcmVzIHNlY3RvcmVzIHByb2R1Y3Rpdm9zIGVudHJlIDIwMDUgSSB5IDIwMjYgSUkiDQphdXRob3I6ICJTYW50b3MgSXNhYWMgUm9kcsOtZ3VleiBDbGFyb3MiDQpkYXRlOiAiMjYgZGUgbm92aWVtYnJlIGRlIDIwMjYiDQpsYW5nOiBlcw0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICB0b2NfZGVwdGg6IDINCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBtYXRoX21ldGhvZDogbWF0aG1sDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KLS0tDQoNCmBgYHtyIGluaWNpbywgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh1cmNhKQ0KbGlicmFyeShzdHJ1Y2NoYW5nZSkNCmxpYnJhcnkobUZpbHRlcikNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShzYW5kd2ljaCkNCmxpYnJhcnkoa25pdHIpDQpvcHRpb25zKHNjaXBlbiA9IDgsIGRpZ2l0cyA9IDUsIHdpZHRoID0gMTAwKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGggPSA5LCBmaWcuaGVpZ2h0ID0gNC42LCBkcGkgPSAxNDUsDQogICAgICAgICAgICAgICAgICAgICAgZGV2ID0gInBuZyIsIG91dC53aWR0aCA9ICIxMDAlIikNCmNvbCA8LSBjKCJTZWN0b3IgMSIgPSAiIzhhMjQ0OSIsICJTZWN0b3IgMiIgPSAiI2I3N2IyNiIsICJTZWN0b3IgMyIgPSAiIzI0Njc3OSIpDQp0ZW1hIDwtIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjMjEzNTQ3IiksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzUyNjI3NCIsIHNpemUgPSAxMCksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSA4LCBjb2xvciA9ICIjNTI2Mjc0IiksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQp0aGVtZV9zZXQodGVtYSkNCmZ1ZW50ZSA8LSAiRnVlbnRlOiBlbGFib3JhY2nDs24gcHJvcGlhIGNvbiBsb3MgYXJjaGl2b3MgQkNSIGZhY2lsaXRhZG9zIHBvciBlbCBlc3R1ZGlhbnRlLiBBanVzdGUgU1RMIHByb3Bpby4iDQpmbXQgPC0gZnVuY3Rpb24oeCwgZCA9IDIpIGZvcm1hdEMoeCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSBkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iKQ0KdGFibGEgPC0gZnVuY3Rpb24oeCwgdGl0dWxvLCBkID0gMykgew0KICBjYXQoJzxkaXYgY2xhc3M9InRhYmxlLXJlc3BvbnNpdmUiPicsDQogICAgICBrbml0cjo6a2FibGUoeCwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gdGl0dWxvLCBkaWdpdHMgPSBkLA0KICAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLCB0YWJsZS5hdHRyID0gJ2NsYXNzPSJ0YWJsZSInKSwNCiAgICAgICc8L2Rpdj5cbicpDQp9DQpgYGANCg0KPHN0eWxlPg0KOnJvb3R7LS12aW5vOiM3NjI0NDA7LS10aW50YTojMjEzNTQ3Oy0tc3VhdmU6I2Y3ZjNlZTstLWxpbmVhOiNkZWQ1Y2V9DQpib2R5e2ZvbnQtZmFtaWx5OiJTZWdvZSBVSSIsQXJpYWwsc2Fucy1zZXJpZjtjb2xvcjp2YXIoLS10aW50YSk7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MS43O2JhY2tncm91bmQ6I2ZmZmRmYn0NCi5tYWluLWNvbnRhaW5lcnttYXgtd2lkdGg6MTMyMHB4O21hcmdpbjphdXRvO3BhZGRpbmctdG9wOjI1cHg7cGFkZGluZy1ib3R0b206NzBweH0NCmgxLnRpdGxle2ZvbnQtZmFtaWx5Okdlb3JnaWEsc2VyaWY7Zm9udC1zaXplOjQzcHg7bGluZS1oZWlnaHQ6MS4xNTtjb2xvcjp2YXIoLS12aW5vKTtmb250LXdlaWdodDpib2xkO21hcmdpbi10b3A6MThweH0NCi5zdWJ0aXRsZXtmb250LXNpemU6MjJweDtjb2xvcjojNTU2NTc1O21hcmdpbi10b3A6MTRweCFpbXBvcnRhbnQ7Zm9udC13ZWlnaHQ6NDAwfQ0KaDE6bm90KC50aXRsZSl7Zm9udC1mYW1pbHk6R2VvcmdpYSxzZXJpZjtjb2xvcjp2YXIoLS12aW5vKTtmb250LXNpemU6MzFweDttYXJnaW4tdG9wOjUwcHg7cGFkZGluZy10b3A6MTVweDtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1saW5lYSl9DQpoMntjb2xvcjojMjEzNTQ3O2ZvbnQtc2l6ZToyNHB4O21hcmdpbi10b3A6MzJweDtsaW5lLWhlaWdodDoxLjN9aDN7Zm9udC1zaXplOjE5cHg7Y29sb3I6dmFyKC0tdmlubyl9DQpwe21hcmdpbi1ib3R0b206MTZweH1he2NvbG9yOnZhcigtLXZpbm8pfXN0cm9uZ3tjb2xvcjojMjkzODQ5fQ0KLmF1dGhvciwuZGF0ZXtmb250LXNpemU6MTVweDtjb2xvcjojNTk2NTczfS5pbnN0aXR1Y2lvbntmb250LXNpemU6MTRweDtjb2xvcjojNTI2Mjc0O21hcmdpbjoyMHB4IDAgMjRweH0NCi5yZXN1bWVue2ZvbnQtc2l6ZToxN3B4O2JhY2tncm91bmQ6dmFyKC0tc3VhdmUpO3BhZGRpbmc6MjRweCAyOHB4O2JvcmRlci1yYWRpdXM6OHB4O21hcmdpbjoyNHB4IDB9DQouZGF0b3MtY2xhdmV7ZGlzcGxheTpmbGV4O2dhcDoyMHB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbjoyNHB4IDAgMzBweH0uZGF0b3tmbGV4OjE7bWluLXdpZHRoOjE3MHB4O2JvcmRlci10b3A6M3B4IHNvbGlkIHZhcigtLXZpbm8pO3BhZGRpbmc6MTBweCAwfS5kYXRvIGJ7Zm9udC1mYW1pbHk6R2VvcmdpYSxzZXJpZjtmb250LXNpemU6MjlweDtkaXNwbGF5OmJsb2NrO2NvbG9yOnZhcigtLXZpbm8pfS5kYXRvIHNwYW57Zm9udC1zaXplOjEzcHg7Y29sb3I6IzUyNjI3NH0NCi50YWJsZXtmb250LXNpemU6MTRweDttYXJnaW46MjBweCAwIDI1cHh9LnRhYmxlIGNhcHRpb257Y29sb3I6IzIxMzU0Nztmb250LXdlaWdodDo2MDA7dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmctYm90dG9tOjEwcHh9DQoudGFibGU+dGhlYWQ+dHI+dGh7YmFja2dyb3VuZDojMjEzNTQ3O2NvbG9yOndoaXRlO2JvcmRlci1ib3R0b206bm9uZTtwYWRkaW5nOjExcHggMTJweH0udGFibGU+dGJvZHk+dHI6bnRoLWNoaWxkKGV2ZW4pe2JhY2tncm91bmQ6I2Y3ZjNlZX0udGFibGU+dGJvZHk+dHI+dGR7cGFkZGluZzoxMHB4IDEycHg7dmVydGljYWwtYWxpZ246dG9wO2JvcmRlci10b3A6MXB4IHNvbGlkICNlNGRlZDh9DQoudGFibGUtcmVzcG9uc2l2ZXtvdmVyZmxvdy14OmF1dG99cHJle2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTU7Ym9yZGVyOjFweCBzb2xpZCAjZGZkNmNmO2JhY2tncm91bmQ6I2ZhZjhmNTtib3JkZXItcmFkaXVzOjVweH1jb2Rle2NvbG9yOiM3NjI0NDA7YmFja2dyb3VuZDojZjhmMmYzfQ0KLmJ0bi1kZWZhdWx0e2JhY2tncm91bmQ6I2Y3ZjNlZTtib3JkZXItY29sb3I6I2RlZDVjZTtjb2xvcjojNzYyNDQwfS50b2NpZnl7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS40O2JvcmRlci1jb2xvcjojZTNkOWQwO2JvcmRlci1yYWRpdXM6NXB4O2JhY2tncm91bmQ6I2ZmZmRmYn0udG9jaWZ5LWl0ZW0uYWN0aXZle2JhY2tncm91bmQ6Izc2MjQ0MCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnRvY2lmeSBsaXtwYWRkaW5nLXRvcDozcHg7cGFkZGluZy1ib3R0b206M3B4fS50b2NpZnktc3ViaGVhZGVye2ZvbnQtc2l6ZToxMnB4fQ0KLmNhcHRpb257Zm9udC1zaXplOjEzcHg7Y29sb3I6IzUyNjI3NDttYXJnaW4tdG9wOjhweH1ibG9ja3F1b3Rle2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjYjc3YjI2O2ZvbnQtc2l6ZToxNnB4O2JhY2tncm91bmQ6I2ZjZmFmNn0NCmRldGFpbHN7bWFyZ2luOjE4cHggMDtwYWRkaW5nOjE0cHggMThweDtib3JkZXI6MXB4IHNvbGlkICNlNWRkZDU7Ym9yZGVyLXJhZGl1czo2cHh9c3VtbWFyeXtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7Y29sb3I6Izc2MjQ0MH0NCm1hdGh7Zm9udC1zaXplOjEuMDdlbX1pbWd7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OmF1dG99aHJ7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tbGluZWEpfQ0KQG1lZGlhKG1heC13aWR0aDo3NjdweCl7aDEudGl0bGV7Zm9udC1zaXplOjMycHh9Lm1haW4tY29udGFpbmVye3BhZGRpbmc6MTVweH0ucmVzdW1lbntwYWRkaW5nOjE4cHh9LnRhYmxle2ZvbnQtc2l6ZToxMnB4fS5kYXRvcy1jbGF2ZXtnYXA6MTJweH19DQpAbWVkaWEgcHJpbnR7I1RPQywuY29kZS1mb2xkaW5nLWJ0biwuZHJvcGRvd257ZGlzcGxheTpub25lIWltcG9ydGFudH0uY29sLW1kLTl7d2lkdGg6MTAwJSFpbXBvcnRhbnR9Ym9keXtmb250LXNpemU6MTJweH0ubWFpbi1jb250YWluZXJ7bWF4LXdpZHRoOm5vbmV9aDE6bm90KC50aXRsZSl7YnJlYWstYmVmb3JlOmF1dG99LmZpZ3VyZSx0YWJsZXticmVhay1pbnNpZGU6YXZvaWR9fQ0KPC9zdHlsZT4NCg0KPGRpdiBjbGFzcz0iaW5zdGl0dWNpb24iPg0KVW5pdmVyc2lkYWQgZGUgRWwgU2FsdmFkb3IgwrcgRmFjdWx0YWQgTXVsdGlkaXNjaXBsaW5hcmlhIE9yaWVudGFsPGJyPg0KRGVwYXJ0YW1lbnRvIGRlIENpZW5jaWFzIEVjb27Ds21pY2FzIMK3IFNlY2Npw7NuIGRlIEVjb25vbcOtYTxicj4NCk3DqXRvZG9zIHBhcmEgZWwgQW7DoWxpc2lzIEVjb27Ds21pY28g4oCUIE1BRSAxMTggwrcgRXhhbWVuIHBhcmNpYWwgMw0KPC9kaXY+DQoNCiMgSW50cm9kdWNjacOzbg0KDQpFbCBjYW1iaW8gZGUgbGEgZXN0cnVjdHVyYSBwcm9kdWN0aXZhIHB1ZWRlIG9ic2VydmFyc2UgZW4gbGEgcGFydGljaXBhY2nDs24gZGUgbGFzIGFjdGl2aWRhZGVzIGVuIGVsIHZhbG9yIGFncmVnYWRvLCBlbiBsYSBjb25jZW50cmFjacOzbiBkZSBsYSBwcm9kdWNjacOzbiB5IGVuIGxhIGRlc2lndWFsZGFkIGRlIGxvcyBjcmVjaW1pZW50b3Mgc2VjdG9yaWFsZXMuIFVuIGF1bWVudG8gZGVsIFBJQiBubyBwZXJtaXRlIGVzdGFibGVjZXIsIHBvciBzw60gc29sbywgc2kgbGEgZWNvbm9tw61hIHNlIGVzdMOhIGRpdmVyc2lmaWNhbmRvIG8gc2kgY2FtYmlhbiBsb3Mgc2VjdG9yZXMgcXVlIHNvc3RpZW5lbiBzdSBleHBhbnNpw7NuLiBJZGVudGlmaWNhciBlc3RhcyBkaWZlcmVuY2lhcyBlcyByZWxldmFudGUgcGFyYSBkaXNjdXRpciBsYSBkaXZlcnNpZmljYWNpw7NuIHkgbGEgdnVsbmVyYWJpbGlkYWQgZGUgbGEgZWNvbm9tw61hIHNhbHZhZG9yZcOxYS4NCg0KKipQcmVndW50YSBkZSBpbnZlc3RpZ2FjacOzbi4qKiDCv0PDs21vIGNhbWJpYXJvbiBsYSBlc3RydWN0dXJhIHByb2R1Y3RpdmEsIGxhIGNvbmNlbnRyYWNpw7NuIHkgbGEgaW52ZXJzacOzbiBkZSBFbCBTYWx2YWRvciBlbnRyZSAyMDA1IEkgeSAyMDI2IElJLCB5IHF1w6kgZXZpZGVuY2lhIGV4aXN0ZSBkZSBjYW1iaW9zIGRlIHLDqWdpbWVuIGFscmVkZWRvciBkZSBsYSBjcmlzaXMgZGUgMjAwOOKAkzIwMDkgeSBkZSBsYSBwYW5kZW1pYSBkZSAyMDIwPw0KDQoqKkhpcMOzdGVzaXMgZGUgdHJhYmFqby4qKiBMYSBwYXJ0aWNpcGFjacOzbiBkZWwgc2VjdG9yIGFncm9wZWN1YXJpbyBlbiBlbCB2YWxvciBhZ3JlZ2FkbyBkaXNtaW51ecOzIGVudHJlIGVsIGluaWNpbyB5IGVsIGZpbmFsIGRlIGxhIG11ZXN0cmEsIG1pZW50cmFzIGxvcyBzZXJ2aWNpb3MgY29uc2VydmFyb24gZWwgbWF5b3IgcGVzby4gU2UgY29udHJhc3RhIGRlc2NyaXB0aXZhbWVudGUgY29tcGFyYW5kbyBsb3MgcHJvbWVkaW9zIGRlIGxhcyBwcmltZXJhcyB5IGRlIGxhcyDDumx0aW1hcyBjdWF0cm8gb2JzZXJ2YWNpb25lcyBkZXNlc3RhY2lvbmFsaXphZGFzLiBMYXMgcHJ1ZWJhcyBkZSBxdWllYnJlcyBldmFsw7phbiBsYSBlc3RhYmlsaWRhZCBkZWwgw61uZGljZSBOQVYgeSBubyBzZSBpbnRlcnByZXRhbiBjb21vIHBydWViYXMgY2F1c2FsZXMgZGUgZXN0YSBoaXDDs3Rlc2lzLg0KDQoqKk9iamV0aXZvIGdlbmVyYWwuKiogQW5hbGl6YXIgbGEgdHJhbnNmb3JtYWNpw7NuIGRlIGxhIGVzdHJ1Y3R1cmEgcHJvZHVjdGl2YSBzYWx2YWRvcmXDsWEgbWVkaWFudGUgY3VhdHJvIGluZGljYWRvcmVzIHNpbXBsZXMsIGxvcyDDrW5kaWNlcyBOQVYgeSBMaWxpZW4sIGVsIGZpbHRybyBIUCB5IHBydWViYXMgZGUgc2VyaWVzIGRlIHRpZW1wby4NCg0KKipBbGNhbmNlIGFjb3JkYWRvLioqIEVsIHRyYWJham8gdXRpbGl6YSBwcm9kdWNjacOzbiBlIGludmVyc2nDs24uIFNlIGV4Y2x1eWVuIGxhIHByb2R1Y3RpdmlkYWQgbGFib3JhbCB5IGxhIGRlc2NvbXBvc2ljacOzbiBzaGlmdC1zaGFyZSBwb3JxdWUgbm8gc2UgaW5jb3Jwb3JhIGVtcGxlbyBzZWN0b3JpYWwuIEVzdGEgZXhjbHVzacOzbiBzZSBhcGFydGEgZGUgZXNvcyBkb3MgY29tcG9uZW50ZXMgZGVsIFRlbWEgMiBkZSBsYSBjb25zaWduYSBvcmlnaW5hbC4gTGEgZG9sYXJpemFjacOzbiBkZSAyMDAxIHNlIGluY2x1eWUgY29tbyBhbnRlY2VkZW50ZTsgc3UgcXVpZWJyZSBubyBlcyBlc3RpbWFibGUgY29uIHVuYSBtdWVzdHJhIHF1ZSBlbXBpZXphIGVuIDIwMDUuIEVzdGFzIHJlc3RyaWNjaW9uZXMgc2UgbWFudGllbmVuIHZpc2libGVzIGVuIGxhIGV2YWx1YWNpw7NuIGRlIGNvYmVydHVyYSBkZWwgYW5leG8uDQoNCiMgTWV0b2RvbG9nw61hDQoNCiMjIFBhc28gMSBDYXJnYXIgbG9zIGNpbmNvIGFyY2hpdm9zDQoNCkVsIGFyY2hpdm8gbm9taW5hbCB0cmltZXN0cmFsIChgbm9tYCkgeSBlbCBkZSB2b2x1bWVuIHRyaW1lc3RyYWwgKGB2b2xgKSBzb24gbGFzIGZ1ZW50ZXMgcHJpbmNpcGFsZXMuIExvcyBhbnVhbGVzIChgYW5uYCB5IGBhbnZgKSBzaXJ2ZW4gZGUgY29tcHJvYmFjacOzbi4gRWwgSVBDIChgaXBjYCkgc2UgY29uc2VydmEgY29tbyByZWZlcmVuY2lhOiBzdSBjb2JlcnR1cmEgMjAyNeKAkzIwMjYgbm8gcGVybWl0ZSBkZWZsYWN0YXIgdG9kYSBsYSBoaXN0b3JpYS4gU2UgdXRpbGl6YSBlbCBkZWZsYWN0b3IgaW1wbMOtY2l0byBkZWwgUElCLg0KDQpMYSBwcmltZXJhIHJ1dGEgZXMgbGEgcHJvcG9yY2lvbmFkYSBwb3IgZWwgZXN0dWRpYW50ZS4gU2kgbm8gZXhpc3RlLCBlbCBjw7NkaWdvIHV0aWxpemEgbGEgc3ViY2FycGV0YSBgZGF0b3NgIGluY2x1aWRhIGNvbiBlbCBwcm95ZWN0by4gTm8gZXMgbmVjZXNhcmlvIGNhbWJpYXIgbG9zIG5vbWJyZXMgb3JpZ2luYWxlcyBkZSBsb3MgRXhjZWwuIGBWaWV3KG5vbSlgIG8gYFZpZXcodm9sKWAgcHVlZGVuIGVqZWN1dGFyc2UgZW4gbGEgY29uc29sYSBkZSBSU3R1ZGlvLCBmdWVyYSBkZWwgdGVqaWRvIGRlbCBIVE1MLg0KDQpgYGB7ciBhcmNoaXZvc30NCmNhcnBldGEgPC0gIkM6L1VzZXJzL2lzYWFjL09uZURyaXZlIC0gVW5pdmVyc2lkYWQgR2VyYXJkbyBCYXJyaW9zL0VzY3JpdG9yaW8iDQppZiAoIWRpci5leGlzdHMoY2FycGV0YSkpIGNhcnBldGEgPC0gImRhdG9zIg0KDQpub20gPC0gcmVhZF9leGNlbChmaWxlLnBhdGgoY2FycGV0YSwNCiAgIlByb2R1Y3RvX0ludGVybm9fQnJ1dG9fVHJpbWVzdHJhbF8oUElCX1QpLl9Qcm9kdWNjacOzbl95X2dhc3RvX2FfcHJlY2lvc19jb3JyaWVudGVzLnhsc3giKSwgY29sX25hbWVzID0gRkFMU0UpDQp2b2wgPC0gcmVhZF9leGNlbChmaWxlLnBhdGgoY2FycGV0YSwNCiAgIlBJQl9ULl9Qcm9kdWNjacOzbl95X2dhc3RvLl/DjW5kaWNlc19kZV92b2x1bWVuX2VuY2FkZW5hZG9zLl9TZXJpZV9vcmlnaW5hbF8ocmVmZXJlbmNpYV8yMDE0KS54bHN4IiksIGNvbF9uYW1lcyA9IEZBTFNFKQ0KYW5uIDwtIHJlYWRfZXhjZWwoZmlsZS5wYXRoKGNhcnBldGEsDQogICJQcm9kdWN0b19JbnRlcm5vX0JydXRvX19Qcm9kdWNjacOzbixfR2FzdG9fZV9JbmdyZXNvLl9BX3ByZWNpb3NfY29ycmllbnRlcy54bHN4IiksIGNvbF9uYW1lcyA9IEZBTFNFKQ0KYW52IDwtIHJlYWRfZXhjZWwoZmlsZS5wYXRoKGNhcnBldGEsDQogICJQSUJfX1Byb2R1Y2Npw7NuX3lfZ2FzdG8uX8ONbmRpY2VzX2RlX3ZvbHVtZW5fZW5jYWRlbmFkb3NfKGHDsW9fZGVfcmVmZXJlbmNpYV8yMDE0KS54bHN4IiksIGNvbF9uYW1lcyA9IEZBTFNFKQ0KaXBjIDwtIHJlYWRfZXhjZWwoZmlsZS5wYXRoKGNhcnBldGEsDQogICLDjW5kaWNlX2RlX1ByZWNpb3NfYWxfQ29uc3VtaWRvcl8oSVBDKS54bHN4IiksIGNvbF9uYW1lcyA9IEZBTFNFKQ0KDQojIENvbnZpZXJ0ZSB1bmEgZmlsYSBkZWwgRXhjZWwgZW4gdW4gdmVjdG9yIG51bcOpcmljby4NCmZpbGEgPC0gZnVuY3Rpb24oeCwgaSkgYXMubnVtZXJpYyh1bmxpc3QoeFtpLCAtMV0sIHVzZS5uYW1lcyA9IEZBTFNFKSkNCg0KIyBMYXMgZmlsYXMgNyBhIDI1IGNvcnJlc3BvbmRlbiBhIGxhcyAxOSBhY3RpdmlkYWRlcyB0cmltZXN0cmFsZXMuDQpuIDwtIHNhcHBseSg3OjI1LCBmdW5jdGlvbihpKSBmaWxhKG5vbSwgaSkpDQp2IDwtIHNhcHBseSg3OjI1LCBmdW5jdGlvbihpKSBmaWxhKHZvbCwgaSkpDQpwaWJfbiA8LSBmaWxhKG5vbSwgMjgpDQpmYmtfbiA8LSBmaWxhKG5vbSwgMzQpDQpwaWJfdiA8LSBmaWxhKHZvbCwgMjgpDQpmYmtfdiA8LSBmaWxhKHZvbCwgMzMpDQp2YWJfbiA8LSBmaWxhKG5vbSwgMjYpDQoNCmluaSA8LSBhcy5pbnRlZ2VyKG5vbVtbMl1dWzRdKQ0KZmVjaGEgPC0gc2VxKGFzLkRhdGUocGFzdGUwKGluaSwgIi0wMS0wMSIpKSwgYnkgPSAiMyBtb250aHMiLCBsZW5ndGgub3V0ID0gbnJvdyhuKSkNCmFuaW8gPC0gYXMuaW50ZWdlcihmb3JtYXQoZmVjaGEsICIlWSIpKQ0KdHJpIDwtIChhcy5pbnRlZ2VyKGZvcm1hdChmZWNoYSwgIiVtIikpIC0gMSkgJS8lIDMgKyAxDQpwZXIgPC0gcGFzdGUwKGFuaW8sICItVCIsIHRyaSkNCnN0b3BpZm5vdChucm93KG4pID49IDgwLCBucm93KG4pID09IG5yb3codiksICFhbnlOQShuKSwgIWFueU5BKHYpLA0KICAgICAgICAgIGFsbChuID4gMCksIGFsbCh2ID4gMCksIGFsbChwaWJfbiA+IDApLCBhbGwoZmJrX24gPiAwKSkNCmBgYA0KDQoNCmBgYHtyIGNvYmVydHVyYSwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQpjYXQoJzxkaXYgY2xhc3M9ImRhdG9zLWNsYXZlIj48ZGl2IGNsYXNzPSJkYXRvIj48Yj4nLG5yb3cobiksDQogICAgJzwvYj48c3Bhbj5vYnNlcnZhY2lvbmVzIHRyaW1lc3RyYWxlczwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJkYXRvIj48Yj4nLA0KICAgIHBlclsxXSwnIGEgJyx0YWlsKHBlciwxKSwnPC9iPjxzcGFuPnBlcsOtb2RvIG9ic2VydmFkbzwvc3Bhbj48L2Rpdj4nLA0KICAgICc8ZGl2IGNsYXNzPSJkYXRvIj48Yj4zIHNlY3RvcmVzPC9iPjxzcGFuPjE5IGFjdGl2aWRhZGVzIGVjb27Ds21pY2FzPC9zcGFuPjwvZGl2PjwvZGl2Picsc2VwPScnKQ0KdGFibGEoZGF0YS5mcmFtZShBcmNoaXZvPWMoIlBJQiBub21pbmFsIHRyaW1lc3RyYWwiLCAiUElCIGVuIHZvbHVtZW4gdHJpbWVzdHJhbCIsICJQSUIgYW51YWwgbm9taW5hbCB5IGVuIHZvbHVtZW4iLCAiSVBDIiksDQogICAgICAgICAgICAgICAgIENvYmVydHVyYT1jKCIyMDA1IEkgYSAyMDI2IElJIiwgIjIwMDUgSSBhIDIwMjYgSUkiLCAiMjAwNSBhIDIwMjUiLCAiMjAyNSBJIGEgMjAyNiBYIiksDQogICAgICAgICAgICAgICAgIFVzbz1jKCJFc3RydWN0dXJhIGUgaW52ZXJzacOzbiIsICJDcmVjaW1pZW50b3MgeSBIUCIsICJWYWxpZGFjacOzbiB5IHJlZmVyZW5jaWEgMjAxNCIsICJSZWZlcmVuY2lhOyBubyBzZSB1c2EgY29tbyBkZWZsYWN0b3IgaGlzdMOzcmljbyIpKSwNCiAgICAgICJDdWFkcm8gMS4gRnVlbnRlcyB5IGNvYmVydHVyYSBkZSBsb3MgYXJjaGl2b3MgcmVjaWJpZG9zIikNCmBgYA0KDQpTZSByZXNwZXRhIGVsIHByaW1lciBkYXRvIGRpc3BvbmlibGUgZGUgbG9zIGFyY2hpdm9zIHJlY2liaWRvcy4gTGEgbXVlc3RyYSBkZSA4NiB0cmltZXN0cmVzIHN1cGVyYSBlbCBtw61uaW1vIGRlIDgwIGFudGVzIGRlIHRyYW5zZm9ybWFyIGxhcyBzZXJpZXMuIExhcyBub3RhcyBkZSBsb3MgYXJjaGl2b3MgaWRlbnRpZmljYW4gMjAyNCBjb21vIHByZWxpbWluYXIgeSAyMDI14oCTMjAyNiBjb21vIGVzdGltYWRvLiBObyBzZSBwcm95ZWN0YW4gdHJpbWVzdHJlcyBmYWx0YW50ZXMgZGUgMjAyNiBuaSBzZSBwcmVzZW50YSBlbCBwcmltZXIgc2VtZXN0cmUgY29tbyB1biBhw7FvIGNvbXBsZXRvLg0KDQojIyBQYXNvIDIgRGVmaW5pciBsb3MgdHJlcyBzZWN0b3Jlcw0KDQpMYSBjbGFzaWZpY2FjacOzbiBlcyB1bmEgYWdydXBhY2nDs24gb3BlcmF0aXZhIGRlbCBlc3R1ZGlvOiBhZ3JvcGVjdWFyaW8gKEEpLCBpbmR1c3RyaWEgeSBjb25zdHJ1Y2Npw7NuIChC4oCTRikgeSBzZXJ2aWNpb3MgKEfigJNTKS4gTGEgbWluZXLDrWEgc2UgdWJpY2EgZXhwbMOtY2l0YW1lbnRlIGVuIGVsIHNlZ3VuZG8gZ3J1cG8uIExhIGxldHJhIFMgdHJpbWVzdHJhbCB5YSBpbmNvcnBvcmEgVCwgYWN0aXZpZGFkZXMgZGUgbG9zIGhvZ2FyZXMgY29tbyBlbXBsZWFkb3JlcywgZW4gdG9kYSBsYSBzZXJpZTsgbm8gc2UgYWdyZWdhIGRlIG51ZXZvLg0KDQpgYGB7ciBzZWN0b3JlcywgcmVzdWx0cz0nYXNpcyd9DQpjb2QgPC0gTEVUVEVSU1sxOjE5XQ0KYWN0IDwtIGMoIkFncmljdWx0dXJhLCBnYW5hZGVyw61hLCBzaWx2aWN1bHR1cmEgeSBwZXNjYSIsICJFeHBsb3RhY2nDs24gZGUgbWluYXMgeSBjYW50ZXJhcyIsDQogIkluZHVzdHJpYXMgbWFudWZhY3R1cmVyYXMiLCAiRWxlY3RyaWNpZGFkLCBnYXMsIHZhcG9yIHkgYWlyZSBhY29uZGljaW9uYWRvIiwNCiAiQWd1YSwgYWxjYW50YXJpbGxhZG9zIHkgZ2VzdGnDs24gZGUgZGVzZWNob3MiLCAiQ29uc3RydWNjacOzbiIsDQogIkNvbWVyY2lvIHkgcmVwYXJhY2nDs24gZGUgdmVow61jdWxvcyIsICJUcmFuc3BvcnRlIHkgYWxtYWNlbmFtaWVudG8iLA0KICJBbG9qYW1pZW50byB5IHNlcnZpY2lvIGRlIGNvbWlkYXMiLCAiSW5mb3JtYWNpw7NuIHkgY29tdW5pY2FjaW9uZXMiLA0KICJBY3RpdmlkYWRlcyBmaW5hbmNpZXJhcyB5IGRlIHNlZ3Vyb3MiLCAiQWN0aXZpZGFkZXMgaW5tb2JpbGlhcmlhcyIsDQogIkFjdGl2aWRhZGVzIHByb2Zlc2lvbmFsZXMsIGNpZW50w61maWNhcyB5IHTDqWNuaWNhcyIsICJTZXJ2aWNpb3MgYWRtaW5pc3RyYXRpdm9zIHkgZGUgYXBveW8iLA0KICJBZG1pbmlzdHJhY2nDs24gcMO6YmxpY2EsIGRlZmVuc2EgeSBzZWd1cmlkYWQgc29jaWFsIiwgIkVuc2XDsWFuemEiLA0KICJTYWx1ZCBodW1hbmEgeSBhc2lzdGVuY2lhIHNvY2lhbCIsICJBcnRlLCBlbnRyZXRlbmltaWVudG8geSByZWNyZWFjacOzbiIsDQogIk90cm9zIHNlcnZpY2lvcywgaW5jbHVpZG9zIGhvZ2FyZXMgY29tbyBlbXBsZWFkb3JlcyIpDQpncnVwbyA8LSBjKDEsIHJlcCgyLCA1KSwgcmVwKDMsIDEzKSkNCm5vbV9zZWMgPC0gYygiU2VjdG9yIDEiLCAiU2VjdG9yIDIiLCAiU2VjdG9yIDMiKQ0KdGFibGEoZGF0YS5mcmFtZShTZWN0b3I9cGFzdGUoIlNlY3RvciIsZ3J1cG8pLCBDw7NkaWdvPWNvZCwgQWN0aXZpZGFkPWFjdCksDQogICAgICAiQ3VhZHJvIDIuIENvcnJlc3BvbmRlbmNpYSBkZSBhY3RpdmlkYWRlcyB5IHNlY3RvcmVzIikNCmBgYA0KDQpFbCBQSUIsIGxvcyBpbXB1ZXN0b3MgbmV0b3MgeSBsYSBGQktGIHNvbiBhZ3JlZ2Fkb3MsIG5vIGFjdGl2aWRhZGVzIGFkaWNpb25hbGVzLiBMYXMgcGFydGljaXBhY2lvbmVzIHNlIGNhbGN1bGFuIHNvYnJlIHZhbG9yIGFncmVnYWRvLCBleGNsdXllbmRvIGltcHVlc3RvcyBuZXRvcyBzb2JyZSBwcm9kdWN0b3MuIEFudGVzIGRlbCBhanVzdGUgc2UgdmVyaWZpY2EgcXVlIGxhIHN1bWEgZGUgbGFzIGFjdGl2aWRhZGVzIGNvaW5jaWRhIGNvbiBlbCB2YWxvciBhZ3JlZ2FkbyBwdWJsaWNhZG8sIGFkbWl0aWVuZG8gZWwgcmVkb25kZW8gZGUgY2VudMOpc2ltYXMgZGUgbWlsbMOzbi4NCg0KIyMgUGFzbyAzIERlZmxhY3RhciB5IGRlc2VzdGFjaW9uYWxpemFyDQoNCkVsIMOtbmRpY2UgZGUgdm9sdW1lbiBkZWwgUElCIHNlIGNvbnZpZXJ0ZSBlbiB1bmEgbWVkaWRhIG1vbmV0YXJpYSByZWZlcmVuY2lhZGEgYSAyMDE0IHVzYW5kbyBsYSBjdWFydGEgcGFydGUgZGVsIFBJQiBub21pbmFsIGFudWFsIGRlIDIwMTQsIHBvcnF1ZSBsb3Mgw61uZGljZXMgdHJpbWVzdHJhbGVzIHByb21lZGlhbiAxMDAgZW4gZXNlIGHDsW86DQoNClxbDQpZX3Recj1cZnJhY3tZX3syMDE0fV5ufXs0fVxmcmFje0lWRV90fXsxMDB9LFxxcXVhZA0KRF90PTEwMFxmcmFje1lfdF5ufXtZX3Recn0sXHFxdWFkDQpWQV97aXR9XntyLER9PVxmcmFje1ZBX3tpdH1ebn17RF90LzEwMH0uDQpcXQ0KDQpFbCDDumx0aW1vIGNvY2llbnRlIGVzIHVuYSAqKmFwcm94aW1hY2nDs24gY29uIGRlZmxhY3RvciBjb23Dum4qKiwgdXNhZGEgcGFyYSBtb3N0cmFyIGxhIHRyYW5zZm9ybWFjacOzbiBkZSBsb3Mgbml2ZWxlcyBub21pbmFsZXMuIEVsIGNyZWNpbWllbnRvIHNlY3RvcmlhbCBkZSBMaWxpZW4gc2Ugb2J0aWVuZSBkZSBsb3Mgw61uZGljZXMgb2ZpY2lhbGVzIGRlIHZvbHVtZW4gZGUgY2FkYSBhY3RpdmlkYWQgeSBubyBkZSBlc2EgYXByb3hpbWFjacOzbi4gTGFzIHBhcnRpY2lwYWNpb25lcyB5IGxhIGludmVyc2nDs24gdXNhbiB2YWxvcmVzIG5vbWluYWxlcyBlbiBudW1lcmFkb3IgeSBkZW5vbWluYWRvciwgcG9yIGRlZmluaWNpw7NuLg0KDQpTZSBhcGxpY2EgU1RMIGFsIGxvZ2FyaXRtbyBkZSBjYWRhIHNlcmllIHBvc2l0aXZhLCBjb24gZXN0YWNpb25hbGlkYWQgcGVyacOzZGljYSB5IGFqdXN0ZSByb2J1c3RvLiBMYSBzZXJpZSBhanVzdGFkYSBlcyBsYSBleHBvbmVuY2lhbCBkZWwgbG9nYXJpdG1vIG1lbm9zIHN1IGNvbXBvbmVudGUgZXN0YWNpb25hbC4gU2UgY29uc2VydmFuIGxhcyA4NiBvYnNlcnZhY2lvbmVzLiBFbCBhanVzdGUgZXMgcHJvcGlvIHkgcHVlZGUgZGlmZXJpciBkZWwgcHVibGljYWRvIHBvciBlbCBCQ1IuDQoNCmBgYHtyIHRyYW5zZm9ybWFyfQ0KIyBSZWZlcmVuY2lhIG1vbmV0YXJpYSB5IGRlZmxhY3RvciBpbXBsw61jaXRvIGRlbCBQSUIuDQpyZWYgPC0gYXMubnVtZXJpYyhhbm5bMzAsIHdoaWNoKGZpbGEoYW5uLCA0KSA9PSAyMDE0KSArIDFdKSAvIDQNCnBpYl9yIDwtIHJlZiAqIHBpYl92IC8gMTAwDQpkZWYgPC0gMTAwICogcGliX24gLyBwaWJfcg0KdmFfciA8LSBuIC8gKGRlZiAvIDEwMCkNCg0KIyBBanVzdGUgU1RMIGRlIHVuYSBzZXJpZSBwb3NpdGl2YS4NCmFqIDwtIGZ1bmN0aW9uKHgpIHsNCiAgeiA8LSB0cyhsb2coeCksIHN0YXJ0ID0gYyhpbmksIDEpLCBmcmVxdWVuY3kgPSA0KQ0KICBlc3QgPC0gc3RsKHosIHMud2luZG93ID0gInBlcmlvZGljIiwgcm9idXN0ID0gVFJVRSkNCiAgYXMubnVtZXJpYyhleHAoeiAtIGVzdCR0aW1lLnNlcmllc1ssICJzZWFzb25hbCJdKSkNCn0NCm5zIDwtIGFwcGx5KG4sIDIsIGFqKQ0KdnMgPC0gYXBwbHkodiwgMiwgYWopDQpwaWIgPC0gYWoocGliX3YpDQpwbiA8LSBhaihwaWJfbikNCmZiayA8LSBhaihmYmtfbikNCg0KIyBFbCBhanVzdGUgaW5kaXJlY3RvIHByZXNlcnZhIGxhIHN1bWEgZGUgbG9zIHRyZXMgc2VjdG9yZXMuDQp2YSA8LSBjYmluZChuc1ssMV0sIHJvd1N1bXMobnNbLDI6Nl0pLCByb3dTdW1zKG5zWyw3OjE5XSkpDQpjb2xuYW1lcyh2YSkgPC0gbm9tX3NlYw0KcGFydCA8LSAxMDAgKiB2YSAvIHJvd1N1bXModmEpDQpzMSA8LSBwYXJ0WywxXTsgczIgPC0gcGFydFssMl07IHMzIDwtIHBhcnRbLDNdDQpzdG9waWZub3QobWF4KGFicyhyb3dTdW1zKHBhcnQpIC0gMTAwKSkgPCAxZS04KQ0KZXJyX3ZhIDwtIG1heChhYnMocm93U3VtcyhuKSAtIHZhYl9uKSkNCmBgYA0KDQpMYSBkaWZlcmVuY2lhIG3DoXhpbWEgZW50cmUgbGEgc3VtYSBkZSBsYXMgcmFtYXMgbm9taW5hbGVzIG9yaWdpbmFsZXMgeSBlbCB2YWxvciBhZ3JlZ2FkbyBwdWJsaWNhZG8gZXMgKipgciBmbXQoZXJyX3ZhLDMpYCBtaWxsb25lcyBkZSBkw7NsYXJlcyoqLiBMYXMgcGVxdWXDsWFzIGRpZmVyZW5jaWFzIHNvbiBjb21wYXRpYmxlcyBjb24gZWwgcmVkb25kZW8uIExhIHN1bWEgZGUgcGFydGljaXBhY2lvbmVzIGRlIGxvcyB0cmVzIHNlY3RvcmVzIGFqdXN0YWRvcyBlcyAxMDAgJSBwb3IgY29uc3RydWNjacOzbi4NCg0KIyMgUGFzbyA0IENvbnN0cnVpciBsb3MgaW5kaWNhZG9yZXMNCg0KYGBge3IgZGljY2lvbmFyaW8sIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KdGFibGEoZGF0YS5mcmFtZSgNCiBJbmRpY2Fkb3I9YygiQ3JlY2ltaWVudG8gZGVsIFBJQiByZWFsIiwgIlBhcnRpY2lwYWNpw7NuIHNlY3RvcmlhbCIsICJUYXNhIGRlIGludmVyc2nDs24iLCAiQ29uY2VudHJhY2nDs24gSEhJIiwgIk5BViIsICJMaWxpZW4iKSwNCiBGw7NybXVsYT1jKCIxMDAgw5cgzpQgbG4gUElCIHJlYWwgYWp1c3RhZG8iLCAiMTAwIMOXIFZBIHNlY3RvcmlhbCAvIFZBIHRvdGFsIGFqdXN0YWRvIiwgIjEwMCDDlyBGQktGIG5vbWluYWwgYWp1c3RhZGEgLyBQSUIgbm9taW5hbCBhanVzdGFkbyIsICJTdW1hIGRlIChwYXJ0aWNpcGFjacOzbi8xMDApwrIiLCAiMC41IMOXIHN1bWEgZGUgfHModCkg4oiSIHModOKIkmspfCIsICJSYcOteiBkZSBzdW1hIGRlIChzLzEwMCkgw5cgKGcgc2VjdG9yaWFsIOKIkiBnIFBJQinCsiIpLA0KIFVuaWRhZD1jKCIlIHRyaW1lc3RyYWwgbG9nYXLDrXRtaWNvIiwgIiUgZGVsIHZhbG9yIGFncmVnYWRvIiwgIiUgZGVsIFBJQiIsICLDjW5kaWNlIGVudHJlIDEvMyB5IDEiLCAiUHVudG9zIHBvcmNlbnR1YWxlcyIsICJQdW50b3MgcG9yY2VudHVhbGVzIGRlIGRpc3BlcnNpw7NuIiksDQogRnVlbnRlPWMoIkJDUiB2b2x1bWVuIiwgIkJDUiBub21pbmFsIiwgIkJDUiBub21pbmFsIiwgIlBhcnRpY2lwYWNpb25lcyIsICJQYXJ0aWNpcGFjaW9uZXMiLCAiQkNSIHZvbHVtZW4geSBub21pbmFsIikpLA0KICJDdWFkcm8gMy4gRGVmaW5pY2nDs24gZGUgbG9zIHNlaXMgaW5kaWNhZG9yZXM7IGZyZWN1ZW5jaWEgdHJpbWVzdHJhbCIpDQpgYGANCg0KRWwgY3JlY2ltaWVudG8gcHJpbmNpcGFsIGNvbXBhcmEgdW4gdHJpbWVzdHJlIGNvbiBlbCBpbm1lZGlhdG8gYW50ZXJpb3IsIGRlc3B1w6lzIGRlbCBhanVzdGUgZXN0YWNpb25hbC4gTm8gZXMgdW5hIHRhc2EgaW50ZXJhbnVhbCBuaSBhbnVhbGl6YWRhLiBOQVYgc2UgY2FsY3VsYSBjb24gKiprID0gNCB0cmltZXN0cmVzKiosIHVuIGhvcml6b250ZSBkZSB1biBhw7FvIHF1ZSBkZWphIDgyIG9ic2VydmFjaW9uZXMuIFNlIGNvbnNlcnZhIGsgPSAyMCAoY2luY28gYcOxb3MpIGNvbW8gc2Vuc2liaWxpZGFkLCBjb24gNjYgb2JzZXJ2YWNpb25lczsgbm8gc2UgYWZpcm1hIHF1ZSBlc2EgdmFyaWFudGUgYWxjYW5jZSBwb3Igc8OtIHNvbGEgZWwgbcOtbmltbyBkZSA4MC4NCg0KQ29uIFwoaj0xLDIsM1wpLCBsYXMgZXhwcmVzaW9uZXMgZGUgbG9zIGluZGljYWRvcmVzIHNvbjoNCg0KXFsNCmdfdD0xMDBcRGVsdGFcbG4gWV90XntyLFNBfSxccXF1YWQNCnNfe2p0fT0xMDBcZnJhY3tWQV97anR9XntuLFNBfX17XHN1bV97aD0xfV57M31WQV97aHR9XntuLFNBfX0sXHFxdWFkDQpJX3Q9MTAwXGZyYWN7RkJLRl90XntuLFNBfX17WV90XntuLFNBfX0uDQpcXQ0KDQpcWw0KSEhJX3Q9XHN1bV97aj0xfV57M31cbGVmdChcZnJhY3tzX3tqdH19ezEwMH1ccmlnaHQpXjIsXHFxdWFkDQpOQVZfdD1cZnJhY3sxfXsyfVxzdW1fe2o9MX1eezN9fHNfe2p0fS1zX3tqLHQtNH18Lg0KXF0NCg0KXFsNCkxpbGllbl90PVxzcXJ0e1xzdW1fe2o9MX1eezN9XGZyYWN7c197anR9fXsxMDB9KGdfe2p0fS1nX3QpXjJ9Lg0KXF0NCg0KRWwgc3VwZXLDrW5kaWNlIFNBIGlkZW50aWZpY2EgbGFzIHNlcmllcyBhanVzdGFkYXMgcG9yIGVzdGFjaW9uYWxpZGFkOyBuIGluZGljYSBwcmVjaW9zIGNvcnJpZW50ZXMgeSByIHZvbHVtZW4gcmVhbC4NCg0KTG9zIMOtbmRpY2VzIGRlIHZvbHVtZW4gZW5jYWRlbmFkb3Mgbm8gc2Ugc3VtYW4gZGlyZWN0YW1lbnRlLiBQYXJhIGVsIGNyZWNpbWllbnRvIGRlIGxvcyB0cmVzIHNlY3RvcmVzIHNlIHV0aWxpemEgdW5hICoqYWdyZWdhY2nDs24gcHJvcGlhIGRlIHRpcG8gVMO2cm5xdmlzdCoqOiBwcm9tZWRpbyBkZSBsYXMgcGFydGljaXBhY2lvbmVzIG5vbWluYWxlcyBpbnRlcm5hcyBkZSBkb3MgdHJpbWVzdHJlcyBjb25zZWN1dGl2b3MsIG11bHRpcGxpY2FkbyBwb3IgbG9zIGNyZWNpbWllbnRvcyBsb2dhcsOtdG1pY29zIGRlIGxhcyBhY3RpdmlkYWRlcy4gRXMgdW5hIGFwcm94aW1hY2nDs24gc3VwZXJsYXRpdmEgcGFyYSBlc3RvcyBncnVwb3MgeSBubyB1bmEgc2VyaWUgYWdyZWdhZGEgb2ZpY2lhbCBkZWwgQkNSLg0KDQpcWw0KZ197anR9PTEwMFxzdW1fe2lcaW4gan1cZnJhY3tcb21lZ2Ffe2l0fStcb21lZ2Ffe2ksdC0xfX0yDQogIFxEZWx0YVxsbiBJVkVfe2l0fV57U0F9LFxxcXVhZA0KXG9tZWdhX3tpdH09XGZyYWN7VkFfe2l0fV57bixTQX19e1xzdW1fe2lcaW4gan1WQV97aXR9XntuLFNBfX0uDQpcXQ0KDQpgYGB7ciBpbmRpY2Fkb3Jlc30NCmcgPC0gYyhOQSwgMTAwICogZGlmZihsb2cocGliKSkpDQppbnYgPC0gMTAwICogZmJrIC8gcG4NCmhoaSA8LSByb3dTdW1zKChwYXJ0IC8gMTAwKV4yKQ0KDQojIENhbWJpb3MgZGUgbGFzIHBhcnRpY2lwYWNpb25lcyBhIGsgdHJpbWVzdHJlcy4NCmNhbWJpbyA8LSBmdW5jdGlvbihzLCBrKSB7DQogIHJiaW5kKG1hdHJpeChOQSwgaywgbmNvbChzKSksIGFicyhzWyhrKzEpOm5yb3cocyksIF0gLSBzWzE6KG5yb3cocyktayksIF0pKQ0KfQ0KdSA8LSBjYW1iaW8ocGFydCwgNCkNCm5hdiA8LSByb3dTdW1zKHUpIC8gMg0KbmF2NSA8LSByb3dTdW1zKGNhbWJpbyhwYXJ0LCAyMCkpIC8gMg0KDQojIENyZWNpbWllbnRvIHJlYWwgZGUgbGFzIGFjdGl2aWRhZGVzIHkgZGUgbG9zIHRyZXMgc2VjdG9yZXMuDQpnaSA8LSBhcHBseShsb2codnMpLCAyLCBmdW5jdGlvbih4KSBjKE5BLCAxMDAgKiBkaWZmKHgpKSkNCmdzIDwtIG1hdHJpeChOQSwgbnJvdyhuKSwgMykNCmZvciAoaiBpbiAxOjMpIHsNCiAgdyA8LSBuc1ssIGdydXBvID09IGosIGRyb3AgPSBGQUxTRV0NCiAgdyA8LSB3IC8gcm93U3Vtcyh3KQ0KICB3bSA8LSAod1stMSwgLCBkcm9wPUZBTFNFXSArIHdbLW5yb3codyksICwgZHJvcD1GQUxTRV0pIC8gMg0KICBnc1stMSxqXSA8LSByb3dTdW1zKHdtICogZ2lbLTEsIGdydXBvID09IGosIGRyb3A9RkFMU0VdKQ0KfQ0KY29sbmFtZXMoZ3MpIDwtIG5vbV9zZWMNCmxpbCA8LSBzcXJ0KHJvd1N1bXMoKHBhcnQgLyAxMDApICogKGdzIC0gZyleMikpDQp3MTkgPC0gbnMgLyByb3dTdW1zKG5zKQ0KbGlsMTkgPC0gc3FydChyb3dTdW1zKHcxOSAqIChnaSAtIGcpXjIpKQ0KDQpkIDwtIGRhdGEuZnJhbWUoZmVjaGEsIHBlciwgYW5pbywgdHJpLCBwaWIsIGcsIHMxLCBzMiwgczMsIGludiwgaGhpLCBuYXYsIG5hdjUsIGxpbCkNCmQkZzEgPC0gZ3NbLDFdOyBkJGcyIDwtIGdzWywyXTsgZCRnMyA8LSBnc1ssM10NCmBgYA0KDQpOQVYgbWlkZSBsYSBtYWduaXR1ZCBkZSBsYSByZWFzaWduYWNpw7NuIHByb2R1Y3RpdmEsIG5vIHN1IGNvbnZlbmllbmNpYS4gTGlsaWVuIG1pZGUgZGlzcGVyc2nDs24gZW50cmUgbG9zIGNyZWNpbWllbnRvcyBwcm9kdWN0aXZvczogbm8gZGVtdWVzdHJhIG1vdmlsaWRhZCBlZmVjdGl2YSBkZWwgZW1wbGVvLiBISEkgZGVwZW5kZSBkZWwgbsO6bWVybyBkZSBncnVwb3M7IGNvbiB0cmVzIHNlY3RvcmVzIHN1IG3DrW5pbW8gZXMgMS8zLCBwb3IgbG8gcXVlIG5vIGRlYmUgY29tcGFyYXJzZSBkaXJlY3RhbWVudGUgY29uIHVuIEhISSBkZSAxOSBhY3RpdmlkYWRlcy4NCg0KIyMgUGFzbyA1IENvbXBhcmFyIHBvbmRlcmFjaW9uZXMNCg0KTkFWIHkgTGlsaWVuIGNvbnNlcnZhbiBzdXMgZsOzcm11bGFzIGVzcGVjw61maWNhcy4gUGFyYSBjdWJyaXIgZWwgcHJvY2VkaW1pZW50byBnZW5lcmFsIGRlIGVzdGFuZGFyaXphY2nDs24geSBwZXNvcyBkZSBsYSBjb25zaWduYSwgc2UgYcOxYWRlICoqdW4gw61uZGljZSBhdXhpbGlhciBkZSBpbnRlbnNpZGFkIGRlbCBjYW1iaW8qKiwgY29uc3RydWlkbyBjb24gbG9zIHRyZXMgY2FtYmlvcyBhYnNvbHV0b3MgcXVlIGZvcm1hbiBOQVYuIE5vIHN1c3RpdHV5ZSBuaSBzZSBwcmVzZW50YSBjb21vIGVsIE5BViBvcmlnaW5hbC4NCg0KU2UgZXN0YW5kYXJpemFuIGxvcyBjb21wb25lbnRlcyBlbiBsYSBtaXNtYSBtdWVzdHJhIGRlIDgyIHRyaW1lc3RyZXMuIFRvZG9zIGxsZXZhbiBzaWdubyBwb3NpdGl2byBwb3JxdWUgYXVtZW50b3MgaW5kaWNhbiBtw6FzIGludGVuc2lkYWQsIG5vIG1heW9yIGJpZW5lc3Rhci4gRWwgY2FzbyBiYXNlIHVzYSBwZXNvcyAxLzMuIExhIHZhcmlhbnRlIFBDQSB1dGlsaXphIGVsIGN1YWRyYWRvIGRlIGxhcyBjYXJnYXMgZGVsIHByaW1lciBjb21wb25lbnRlLCBub3JtYWxpemFkbyBwYXJhIHF1ZSBsb3MgcGVzb3Mgc3VtZW4gdW5vLiBMb3MgcGVzb3MgcmVmbGVqYW4gY292YXJpYWNpw7NuIGVzdGFkw61zdGljYSB5IG5vIGltcG9ydGFuY2lhIGNhdXNhbC4NCg0KXFsNCnpfe2p0fT1cZnJhY3t1X3tqdH0tXG92ZXJsaW5le3V9X2p9e1xzaWdtYV9qfSxccXF1YWQNCklDX3Q9XHN1bV97aj0xfV57M313X2p6X3tqdH0sXHFxdWFkDQp3X2pee1BDQX09XGZyYWN7YV97ajF9XnsyfX17XHN1bV97aD0xfV57M31hX3toMX1eezJ9fSwNClxdDQoNCmRvbmRlIFwodV97anR9PXxzX3tqdH0tc197aix0LTR9fFwpLCBcKFxzaWdtYV9qXCkgZXMgbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIG11ZXN0cmFsIHkgXChhX3tqMX1cKSBlcyBsYSBjYXJnYSBkZWwgcHJpbWVyIGNvbXBvbmVudGUgcHJpbmNpcGFsLiBFbCByZWVzY2FsYW1pZW50byAw4oCTMTAwIHNlIGFwbGljYSBwb3Igc2VwYXJhZG8gYSBjYWRhIHZlcnNpw7NuIHBhcmEgZmFjaWxpdGFyIGxhIGNvbXBhcmFjacOzbiBncsOhZmljYS4NCg0KYGBge3Igcm9idXN0ZXp9DQpvayA8LSBjb21wbGV0ZS5jYXNlcyh1KQ0KeiA8LSBzY2FsZSh1W29rLCBdKQ0KcGMgPC0gcHJjb21wKHosIGNlbnRlciA9IEZBTFNFLCBzY2FsZS4gPSBGQUxTRSkNCnBlc29zIDwtIHBjJHJvdGF0aW9uWywxXV4yIC8gc3VtKHBjJHJvdGF0aW9uWywxXV4yKQ0KaWMxIDwtIHJvd01lYW5zKHopDQppYzIgPC0gYXMubnVtZXJpYyh6ICUqJSBwZXNvcykNCnJlZXNjIDwtIGZ1bmN0aW9uKHgpIDEwMCAqICh4IC0gbWluKHgpKSAvIChtYXgoeCkgLSBtaW4oeCkpDQpyb2IgPC0gZGF0YS5mcmFtZShmZWNoYSA9IGZlY2hhW29rXSwgSWd1YWwgPSByZWVzYyhpYzEpLCBQQ0EgPSByZWVzYyhpYzIpKQ0KcmhvIDwtIGNvcihpYzEsIGljMikNCmV4cF9wYyA8LSAxMDAgKiBwYyRzZGV2WzFdXjIgLyBzdW0ocGMkc2Rldl4yKQ0KDQojIEZ1bmNpw7NuIHBlcXVlw7FhIHBhcmEgZ3JhZmljYXIgdmFyaWFzIGNvbHVtbmFzIGNvbiB1bmEgbGV5ZW5kYSBjb23Dum4uDQpsYXJnYSA8LSBmdW5jdGlvbih4LCBmZWNoYXMsIG5vbWJyZXMgPSBjb2xuYW1lcyh4KSkgew0KICBkYXRhLmZyYW1lKGZlY2hhID0gcmVwKGZlY2hhcywgbmNvbCh4KSksDQogICAgICAgICAgICAgc2VyaWUgPSByZXAobm9tYnJlcywgZWFjaCA9IG5yb3coeCkpLCB2YWxvciA9IGFzLnZlY3Rvcihhcy5tYXRyaXgoeCkpKQ0KfQ0KYGBgDQoNCiMjIFBhc28gNiBFc3BlY2lmaWNhciBsYXMgcHJ1ZWJhcyB5IGxvcyBxdWllYnJlcw0KDQpMYXMgcHJ1ZWJhcyBBREYsIEtQU1MgeSBaaXZvdC1BbmRyZXdzIHNlIGFwbGljYW4gYSB0cmVzIHNlcmllcyBjZW50cmFsZXM6IGxvZ2FyaXRtbyBkZWwgUElCIGFqdXN0YWRvLCBOQVYgeSBMaWxpZW4uIFNlIGV4YW1pbmFuIG5pdmVsZXMgeSBwcmltZXJhcyBkaWZlcmVuY2lhcy4gQURGIHV0aWxpemEgdW4gbcOheGltbyBkZSBjdWF0cm8gcmV6YWdvcyB5IHNlbGVjY2nDs24gQklDOyBLUFNTIHVzYSBjb3JyZWNjacOzbiBjb3J0YSBkZSBhdXRvY29ycmVsYWNpw7NuLiBaaXZvdC1BbmRyZXdzIHVzYSBlbCBuw7ptZXJvIGRlIHJlemFnb3MgZWxlZ2lkbyBwYXJhIEFERiB5IHBlcm1pdGUgdW4gcXVpZWJyZSBlbmTDs2dlbm8uIEVsIGxvZ2FyaXRtbyBkZWwgUElCIGluY2x1eWUgdGVuZGVuY2lhOyBsb3Mgw61uZGljZXMgc2UgbW9kZWxhbiBjb24gY29uc3RhbnRlLiBQYXJhIHN1cyBwcmltZXJhcyBkaWZlcmVuY2lhcyBzZSB1c2EgY29uc3RhbnRlLg0KDQpMYSBudWxhIGRlIEFERiB5IFppdm90LUFuZHJld3MgZXMgcmHDrXogdW5pdGFyaWE7IGxhIG51bGEgZGUgS1BTUyBlcyBlc3RhY2lvbmFyaWVkYWQgcmVzcGVjdG8gZGUgbGEgcGFydGUgZGV0ZXJtaW7DrXN0aWNhIGVzcGVjaWZpY2FkYS4gU2UgaW5mb3JtYSBsYSBkZWNpc2nDs24gYWwgNSAlIGNvbiBlc3RhZMOtc3RpY29zIHkgdmFsb3JlcyBjcsOtdGljb3MuIFJlc3VsdGFkb3MgY29udHJhZGljdG9yaW9zIHNlIHJlY29ub2Nlbiwgc2luIGFzaWduYXIgYXV0b23DoXRpY2FtZW50ZSB1biBvcmRlbiBkZSBpbnRlZ3JhY2nDs24uDQoNCmBgYHtyIHJhaWNlc30NCnJhaXogPC0gZnVuY3Rpb24oeCwgZmVjaGFzLCBub21icmUsIHRlbmRlbmNpYSA9IEZBTFNFLCBkaWYgPSBGQUxTRSkgew0KICBidWVuIDwtIGlzLmZpbml0ZSh4KQ0KICB4IDwtIHhbYnVlbl07IGZlY2hhcyA8LSBmZWNoYXNbYnVlbl0NCiAgaWYgKGRpZikgeyB4IDwtIGRpZmYoeCk7IGZlY2hhcyA8LSBmZWNoYXNbLTFdOyB0ZW5kZW5jaWEgPC0gRkFMU0UgfQ0KICBhIDwtIHVyLmRmKHgsIHR5cGUgPSBpZiAodGVuZGVuY2lhKSAidHJlbmQiIGVsc2UgImRyaWZ0IiwgbGFncyA9IDQsIHNlbGVjdGxhZ3MgPSAiQklDIikNCiAgayA8LSB1ci5rcHNzKHgsIHR5cGUgPSBpZiAodGVuZGVuY2lhKSAidGF1IiBlbHNlICJtdSIsIGxhZ3MgPSAic2hvcnQiKQ0KICByZXogPC0gc3VtKGdyZXBsKCJ6LmRpZmYubGFnIiwgcm93bmFtZXMoYUB0ZXN0cmVnJGNvZWZmaWNpZW50cyksIGZpeGVkID0gVFJVRSkpDQogIHphIDwtIHVyLnphKHgsIG1vZGVsID0gaWYgKHRlbmRlbmNpYSkgImJvdGgiIGVsc2UgImludGVyY2VwdCIsIGxhZyA9IHJleikNCiAgZXN0IDwtIGMoYUB0ZXN0c3RhdFsxLDFdLCBrQHRlc3RzdGF0LCB6YUB0ZXN0c3RhdCkNCiAgY3JpdCA8LSBjKGFAY3ZhbFsxLCI1cGN0Il0sIGtAY3ZhbFsxLCI1cGN0Il0sIHphQGN2YWxbMl0pDQogIHJlY2hhem8gPC0gYyhlc3RbMV0gPCBjcml0WzFdLCBlc3RbMl0gPiBjcml0WzJdLCBlc3RbM10gPCBjcml0WzNdKQ0KICBxIDwtIHBhc3RlMChmb3JtYXQoZmVjaGFzW3phQGJwb2ludF0sICIlWSIpLCAiLVQiLCAoYXMuaW50ZWdlcihmb3JtYXQoZmVjaGFzW3phQGJwb2ludF0sICIlbSIpKS0xKSUvJTMrMSkNCiAgZGF0YS5mcmFtZShTZXJpZSA9IG5vbWJyZSwgRm9ybWEgPSBpZiAoZGlmKSAiRGlmZXJlbmNpYSIgZWxzZSAiTml2ZWwiLA0KICAgICAgICAgICAgIFBydWViYSA9IGMoIkFERiIsICJLUFNTIiwgIlppdm90LUFuZHJld3MiKSwgTiA9IGxlbmd0aCh4KSwNCiAgICAgICAgICAgICBNb2RlbG8gPSBjKGlmICh0ZW5kZW5jaWEpICJDb25zdGFudGUgeSB0ZW5kZW5jaWEiIGVsc2UgIkNvbnN0YW50ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVuZGVuY2lhKSAiVGVuZGVuY2lhIiBlbHNlICJOaXZlbCIsIGlmKHRlbmRlbmNpYSkgIkFtYm9zIiBlbHNlICJJbnRlcmNlcHRvIiksDQogICAgICAgICAgICAgUmV6YWdvcyA9IGMocmV6LCBrQGxhZywgcmV6KSwgRXN0YWTDrXN0aWNvID0gZXN0LCBDcsOtdGljb181ID0gY3JpdCwNCiAgICAgICAgICAgICBSZWNoYXphX251bGEgPSBpZmVsc2UocmVjaGF6bywgIlPDrSIsICJObyIpLA0KICAgICAgICAgICAgIFF1aWVicmUgPSBjKCIiLCAiIiwgcSkpDQp9DQpzZXJpZXMgPC0gbGlzdCgibG4gUElCIiA9IGxvZyhwaWIpLCAiTkFWIiA9IG5hdiwgIkxpbGllbiIgPSBsaWwpDQp0ZXN0IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShuYW1lcyhzZXJpZXMpLCBmdW5jdGlvbihub21icmUpIHsNCiAgcmJpbmQocmFpeihzZXJpZXNbW25vbWJyZV1dLCBmZWNoYSwgbm9tYnJlLCBub21icmUgPT0gImxuIFBJQiIpLA0KICAgICAgICByYWl6KHNlcmllc1tbbm9tYnJlXV0sIGZlY2hhLCBub21icmUsIG5vbWJyZSA9PSAibG4gUElCIiwgZGlmID0gVFJVRSkpDQp9KSkNCmBgYA0KDQpFbCDDrW5kaWNlIHByaW5jaXBhbCBwYXJhIGZlY2hhciBxdWllYnJlcyBlcyBOQVYgYSBjdWF0cm8gdHJpbWVzdHJlcy4gU2UgZXN0aW1hIHVuIG1vZGVsbyBkZSBjYW1iaW9zIGRlIG1lZGlhLCBOQVYgPSBtZWRpYSBkZSBjYWRhIHLDqWdpbWVuICsgZXJyb3IsIG1lZGlhbnRlIGVsIGFsZ29yaXRtbyBCYWnigJNQZXJyb24gZGUgYGJyZWFrcG9pbnRzYC4gU2UgYnVzY2EgZW50cmUgY2VybyB5IHRyZXMgcXVpZWJyZXMsIGNvbiBzZWdtZW50b3MgbcOtbmltb3MgZGVsIDE1ICUgZGUgbGEgbXVlc3RyYSB5IHNlbGVjY2nDs24gQklDLiBFbCBtw6F4aW1vIGRlIHRyZXMgZXMgdW4gbMOtbWl0ZSBkZSBwYXJzaW1vbmlhLCBubyB1bmEgaW1wb3NpY2nDs24gZGUgbG9zIHRyZXMgaGl0b3MuDQoNClNlIGHDsWFkZSB1bmEgcHJ1ZWJhIGRlIGVzdGFiaWxpZGFkIHN1cEYgY29uIGNvdmFyaWFuemEgTmV3ZXnigJNXZXN0IChjdWF0cm8gcmV6YWdvcykuIFN1IHAtdmFsb3IgY29ycmVzcG9uZGUgYSBlc3RhYmlsaWRhZCwgKipubyBlcyB1biBwLXZhbG9yIGluZGl2aWR1YWwgZGUgY2FkYSBmZWNoYSBlbGVnaWRhIHBvciBCSUMqKi4gTkFWIHRpZW5lIHZlbnRhbmFzIHNvbGFwYWRhcywgcG9yIGxvIHF1ZSBzZSByZXBvcnRhIGF1dG9jb3JyZWxhY2nDs24gcmVzaWR1YWwgeSB1bmEgc2Vuc2liaWxpZGFkIHF1ZSBwZXJtaXRlIGRpbsOhbWljYSBBUigxKS4gTG9zIGludGVydmFsb3MgZGUgbGFzIGZlY2hhcyBzb24gYXByb3hpbWFjaW9uZXMgYXNpbnTDs3RpY2FzIHkgbm8gcmVjb2dlbiB0b2RhIGxhIGluY2VydGlkdW1icmUgZGUgc2VsZWNjacOzbi4NCg0KYGBge3IgcXVpZWJyZXN9DQpiIDwtIGRbaXMuZmluaXRlKGQkbmF2KSwgYygiZmVjaGEiLCAicGVyIiwgIm5hdiIpXQ0KYnAgPC0gYnJlYWtwb2ludHMobmF2IH4gMSwgZGF0YSA9IGIsIGggPSAwLjE1LCBicmVha3MgPSAzKQ0KYmljIDwtIGFzLm51bWVyaWMoQklDKGJwKSkNCm0gPC0gd2hpY2gubWluKGJpYykgLSAxDQpjb3J0ZXMgPC0gaWYgKG0gPiAwKSBicmVha3BvaW50cyhicCwgYnJlYWtzID0gbSkkYnJlYWtwb2ludHMgZWxzZSBpbnRlZ2VyKDApDQpiJHJlZyA8LSBmYWN0b3IoZmluZEludGVydmFsKHNlcV9sZW4obnJvdyhiKSksIGNvcnRlcykgKyAxKQ0KZml0IDwtIGlmIChtID4gMCkgbG0obmF2IH4gcmVnLCBkYXRhID0gYikgZWxzZSBsbShuYXYgfiAxLCBkYXRhID0gYikNCmIkbWVkaWEgPC0gZml0dGVkKGZpdCkNCm53IDwtIGZ1bmN0aW9uKG1vZGVsbykgTmV3ZXlXZXN0KG1vZGVsbywgbGFnID0gNCwgcHJld2hpdGUgPSBGQUxTRSwgYWRqdXN0ID0gVFJVRSkNCmZzIDwtIEZzdGF0cyhuYXYgfiAxLCBkYXRhID0gYiwgZnJvbSA9IDAuMTUsIHZjb3YuID0gbncpDQpzdXAgPC0gc2N0ZXN0KGZzLCB0eXBlID0gInN1cEYiKQ0KbGIgPC0gQm94LnRlc3QocmVzaWR1YWxzKGZpdCksIGxhZyA9IDgsIHR5cGUgPSAiTGp1bmctQm94IikNCmNpIDwtIGlmIChtID4gMCkgY29uZmludChicCwgYnJlYWtzID0gbSwgdmNvdi4gPSBudykkY29uZmludCBlbHNlIG1hdHJpeChudW1lcmljKDApLCAwLCAzKQ0KDQojIFNlbnNpYmlsaWRhZCBjb24gZGluw6FtaWNhIEFSKDEpLg0KYiRhciA8LSBjKE5BLCBoZWFkKGIkbmF2LCAtMSkpDQpiYSA8LSBiWy0xLCBdDQpicGEgPC0gYnJlYWtwb2ludHMobmF2IH4gYXIsIGRhdGEgPSBiYSwgaCA9IDAuMTUsIGJyZWFrcyA9IDMpDQptYSA8LSB3aGljaC5taW4oYXMubnVtZXJpYyhCSUMoYnBhKSkpIC0gMQ0KY2EgPC0gaWYgKG1hID4gMCkgYnJlYWtwb2ludHMoYnBhLCBicmVha3MgPSBtYSkkYnJlYWtwb2ludHMgZWxzZSBpbnRlZ2VyKDApDQoNCiMgQ29udHJhc3RlcyBhZGljaW9uYWxlcyBkZSBjYW1iaW8gZGUgbWVkaWEgZW4gZmVjaGFzIGZpamFkYXMgcHJldmlhbWVudGUuDQpoaXRvcyA8LSBhcy5EYXRlKGMoIjIwMDgtMTAtMDEiLCAiMjAwOS0wMS0wMSIsICIyMDIwLTA0LTAxIikpDQpoaXN0IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShoaXRvcywgZnVuY3Rpb24oZikgew0KICBiJHBvcyA8LSBhcy5pbnRlZ2VyKGIkZmVjaGEgPj0gZikNCiAgZm0gPC0gbG0obmF2IH4gcG9zLCBkYXRhID0gYikNCiAgY3QgPC0gY29lZnRlc3QoZm0sIHZjb3YuID0gbncpDQogIGRhdGEuZnJhbWUoRmVjaGEgPSBmb3JtYXQoZiwgIiVZLSVtLSVkIiksIEFudGVzID0gc3VtKGIkcG9zID09IDApLCBEZXNwdcOpcyA9IHN1bShiJHBvcyA9PSAxKSwNCiAgICAgICAgICAgICBDYW1iaW8gPSBjdFsicG9zIiwxXSwgcF9IQUMgPSBjdFsicG9zIiw0XSkNCn0pKQ0KaGlzdCRwX0hvbG0gPC0gcC5hZGp1c3QoaGlzdCRwX0hBQywgbWV0aG9kID0gImhvbG0iKQ0KYGBgDQoNCiMjIFBhc28gNyBFc3RpbWFyIGVsIHByb2R1Y3RvIHBvdGVuY2lhbA0KDQpFbCBmaWx0cm8gSFAgc2UgYXBsaWNhIGFsIGxvZ2FyaXRtbyBkZWwgUElCIHJlYWwgYWp1c3RhZG8gY29uICoqzrsgPSAxLDYwMCoqLiBTZSBkZWZpbmUgXChZX3ReKj1cZXhwKFx0YXVfdClcKSB5IGxhIGJyZWNoYSBjb21vIFwoMTAwKFlfdC9ZX3ReKi0xKVwpLiBFbCBwb3RlbmNpYWwgZXMgdW5hIGFwcm94aW1hY2nDs24gZXN0YWTDrXN0aWNhLCBubyB1bmEgbWVkaWNpw7NuIGRlIGNhcGFjaWRhZCBiYXNhZGEgZW4gY2FwaXRhbCB5IHRyYWJham8uIEVuIGxvcyBncsOhZmljb3Mgc2UgZXhwcmVzYSBjb21vIMOtbmRpY2UgY29uIHJlZmVyZW5jaWEgMjAxNCB5IHNlIHJlY29ub2NlIGxhIHNlbnNpYmlsaWRhZCBhbCBleHRyZW1vIGZpbmFsLg0KDQpgYGB7ciBwb3RlbmNpYWx9DQpocCA8LSBocGZpbHRlcih0cyhsb2cocGliKSwgc3RhcnQgPSBjKGluaSwxKSwgZnJlcXVlbmN5ID0gNCksIGZyZXEgPSAxNjAwLCB0eXBlID0gImxhbWJkYSIpDQpwb3QgPC0gYXMubnVtZXJpYyhleHAoaHAkdHJlbmQpKQ0KZ2FwIDwtIDEwMCAqIChwaWIgLyBwb3QgLSAxKQ0KZCRwb3QgPC0gcG90OyBkJGdhcCA8LSBnYXANCmBgYA0KDQojIFJlc3VsdGFkb3MNCg0KIyMgRXN0cnVjdHVyYSBkZSBsYXJnbyBwbGF6bw0KDQpgYGB7ciByZXN1bWVuX3Jlc3VsdGFkb3MsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KaTAgPC0gMTo0OyBpMSA8LSAobnJvdyhkKS0zKTpucm93KGQpDQpjb21wIDwtIGRhdGEuZnJhbWUoU2VjdG9yID0gbm9tX3NlYywNCiAgICAgICAgICAgICAgICAgICBJbmljaW8gPSBjb2xNZWFucyhwYXJ0W2kwLF0pLCBGaW5hbCA9IGNvbE1lYW5zKHBhcnRbaTEsXSkpDQpjb21wJENhbWJpb19wcCA8LSBjb21wJEZpbmFsIC0gY29tcCRJbmljaW8NCnRhYmxhKGNvbXAsIHBhc3RlMCgiQ3VhZHJvIDQuIFBhcnRpY2lwYWNpw7NuIG1lZGlhOiAiLHBlclsxXSwi4oCTIixwZXJbNF0sIiBmcmVudGUgYSAiLHBlcltucm93KGQpLTNdLCLigJMiLHRhaWwocGVyLDEpKSwgMikNCmBgYA0KDQpMYSBwYXJ0aWNpcGFjacOzbiBhZ3JvcGVjdWFyaWEgcGFzYSBkZSAqKmByIGZtdChjb21wJEluaWNpb1sxXSlgICUqKiBhICoqYHIgZm10KGNvbXAkRmluYWxbMV0pYCAlKiosIHVuYSB2YXJpYWNpw7NuIGRlICoqYHIgZm10KGNvbXAkQ2FtYmlvX3BwWzFdKWAgcHVudG9zIHBvcmNlbnR1YWxlcyoqLiBMb3Mgc2VydmljaW9zIHJlcHJlc2VudGFuICoqYHIgZm10KGNvbXAkRmluYWxbM10pYCAlKiogZW4gbGFzIMO6bHRpbWFzIGN1YXRybyBvYnNlcnZhY2lvbmVzLiBFc3RhIGNvbXBhcmFjacOzbiB1dGlsaXphIHZlbnRhbmFzIGRlIGN1YXRybyB0cmltZXN0cmVzIGFqdXN0YWRvcyB5IG5vIGF0cmlidXllIGxhcyBkaWZlcmVuY2lhcyBhIHVuIMO6bmljbyBhY29udGVjaW1pZW50by4NCg0KYGBge3IgZ3JhZmljb19lc3RydWN0dXJhLCBmaWcuY2FwPSJGaWd1cmEgMS4gUGFydGljaXBhY2lvbmVzIGRlIGxvcyB0cmVzIHNlY3RvcmVzIGVuIGVsIHZhbG9yIGFncmVnYWRvIGFqdXN0YWRvLiJ9DQpnZ3Bsb3QobGFyZ2EocGFydCwgZmVjaGEpLCBhZXMoZmVjaGEsIHZhbG9yLCBjb2xvciA9IHNlcmllKSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoID0gMC44NSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sKSArDQogIGxhYnModGl0bGUgPSAiRWwgcGVzbyBkZSBsb3MgdHJlcyBzZWN0b3JlcyIsIHggPSBOVUxMLCB5ID0gIiUgZGVsIHZhbG9yIGFncmVnYWRvIiwgY2FwdGlvbiA9IGZ1ZW50ZSkNCmBgYA0KDQojIyBDcmVjaW1pZW50byByZWFsIGUgaW52ZXJzacOzbg0KDQpgYGB7ciBncmFmaWNvX2NyZWNpbWllbnRvLCBmaWcuY2FwPSJGaWd1cmEgMi4gQ3JlY2ltaWVudG8gdHJpbWVzdHJhbCBsb2dhcsOtdG1pY28gZGVsIFBJQiByZWFsIGRlc2VzdGFjaW9uYWxpemFkby4ifQ0KZ2dwbG90KGQsIGFlcyhmZWNoYSwgZykpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGNvbG9yPSIjYjZhOGEwIikgKw0KICBnZW9tX2NvbChmaWxsPSIjNzYyNDQwIiwgd2lkdGg9NjUpICsNCiAgbGFicyh0aXRsZT0iQ3JlY2ltaWVudG8gcmVhbCB5IHBlcnNpc3RlbmNpYSBkZSBsb3MgY2hvcXVlcyIsIHg9TlVMTCwNCiAgICAgICB5PSIlIHJlc3BlY3RvIGRlbCB0cmltZXN0cmUgYW50ZXJpb3IiLCBjYXB0aW9uPWZ1ZW50ZSkNCmBgYA0KDQpgYGB7ciBncmFmaWNvX2ludmVyc2lvbiwgZmlnLmNhcD0iRmlndXJhIDMuIEZvcm1hY2nDs24gYnJ1dGEgZGUgY2FwaXRhbCBmaWpvIGNvbW8gcG9yY2VudGFqZSBkZWwgUElCIG5vbWluYWwgYWp1c3RhZG8uIn0NCmdncGxvdChkLCBhZXMoZmVjaGEsIGludikpICsgZ2VvbV9saW5lKGNvbG9yPSIjMjQ2Nzc5IiwgbGluZXdpZHRoPTAuOSkgKw0KICBsYWJzKHRpdGxlPSJBY3VtdWxhY2nDs24gZGUgY2FwaXRhbCBmaWpvIiwgeD1OVUxMLCB5PSJGQktGIC8gUElCICglKSIsIGNhcHRpb249ZnVlbnRlKQ0KYGBgDQoNCkxhIHRhc2EgZGUgaW52ZXJzacOzbiBtZWRpYSBlcyAqKmByIGZtdChtZWFuKGludltpMF0pKWAgJSoqIGFsIGluaWNpbyB5ICoqYHIgZm10KG1lYW4oaW52W2kxXSkpYCAlKiogYWwgZmluYWwuIExhIHRhc2EgbWlkZSBsYSBwcm9wb3JjacOzbiBkZXN0aW5hZGEgYSBjYXBpdGFsIGZpam8sIHBlcm8gbm8gc3UgZWZpY2llbmNpYSwgdXRpbGl6YWNpw7NuLCBjb21wb3NpY2nDs24gdGVjbm9sw7NnaWNhIG5pIGFwb3J0ZSBjYXVzYWwgYWwgY3JlY2ltaWVudG8uDQoNCiMjIENvbmNlbnRyYWNpw7NuLCBOQVYgeSBMaWxpZW4NCg0KYGBge3IgZ3JhZmljb19oaGksIGZpZy5jYXA9IkZpZ3VyYSA0LiBDb25jZW50cmFjacOzbiBkZWwgdmFsb3IgYWdyZWdhZG8gZW4gdHJlcyBzZWN0b3Jlcy4ifQ0KZ2dwbG90KGQsIGFlcyhmZWNoYSwgaGhpKSkgKyBnZW9tX2xpbmUoY29sb3I9IiNiNzdiMjYiLCBsaW5ld2lkdGg9MC45KSArDQogIGxhYnModGl0bGU9IkNvbmNlbnRyYWNpw7NuIGRlIGxhIGVzdHJ1Y3R1cmEgcHJvZHVjdGl2YSIsIHg9TlVMTCwgeT0iSEhJICh0cmVzIHNlY3RvcmVzKSIsIGNhcHRpb249ZnVlbnRlKQ0KYGBgDQoNCkVsIEhISSBwcm9tZWRpbyBjYW1iaWEgZGUgKipgciBmbXQobWVhbihoaGlbaTBdKSwzKWAqKiBhICoqYHIgZm10KG1lYW4oaGhpW2kxXSksMylgKiouIGByIGlmKG1lYW4oaGhpW2kxXSkgPiBtZWFuKGhoaVtpMF0pKSAiRWwgYXVtZW50byBkZXNjcmliZSBtYXlvciBjb25jZW50cmFjacOzbiBlbnRyZSBsb3MgdHJlcyBncmFuZGVzIGdydXBvcy4iIGVsc2UgIkxhIGRpc21pbnVjacOzbiBkZXNjcmliZSB1bmEgZGlzdHJpYnVjacOzbiBtw6FzIGVxdWlsaWJyYWRhIGVudHJlIGxvcyB0cmVzIGdyYW5kZXMgZ3J1cG9zLiJgIEVzdGUgaW5kaWNhZG9yIHB1ZWRlIG9jdWx0YXIgZGl2ZXJzaWZpY2FjacOzbiBkZW50cm8gZGUgY2FkYSBncnVwbyB5IG5vIG1pZGUgY29uY2VudHJhY2nDs24gZW1wcmVzYXJpYWwuDQoNCmBgYHtyIGdyYWZpY29faW5kaWNlcywgZmlnLmNhcD0iRmlndXJhIDUuIEludGVuc2lkYWQgZGUgbGEgdHJhbnNmb3JtYWNpw7NuIHkgZGlzcGVyc2nDs24gZGUgY3JlY2ltaWVudG9zOyBlc2NhbGFzIGRpc3RpbnRhcy4ifQ0KaW5kIDwtIGRhdGEuZnJhbWUoZmVjaGE9cmVwKGZlY2hhLDIpLCBzZXJpZT1yZXAoYygiTkFWIGEgdW4gYcOxbyIsICJMaWxpZW4gZGUgcHJvZHVjY2nDs24iKSxlYWNoPW5yb3coZCkpLCB2YWxvcj1jKG5hdixsaWwpKQ0KZ2dwbG90KGluZCwgYWVzKGZlY2hhLHZhbG9yKSkgKyBnZW9tX2xpbmUoY29sb3I9IiM3NjI0NDAiLCBsaW5ld2lkdGg9MC44NSkgKw0KICBmYWNldF93cmFwKH5zZXJpZSwgbmNvbD0xLCBzY2FsZXM9ImZyZWVfeSIpICsNCiAgbGFicyh0aXRsZT0iRG9zIGRpbWVuc2lvbmVzIGRlbCBjYW1iaW8gZXN0cnVjdHVyYWwiLCB4PU5VTEwsIHk9IlB1bnRvcyBwb3JjZW50dWFsZXMiLCBjYXB0aW9uPWZ1ZW50ZSkNCmBgYA0KDQpFbCBtw6F4aW1vIGRlIE5BViBlcyAqKmByIGZtdChtYXgobmF2LG5hLnJtPVRSVUUpKWAgcHVudG9zKiosIGVuICoqYHIgcGVyW3doaWNoLm1heChyZXBsYWNlKG5hdixpcy5uYShuYXYpLC1JbmYpKV1gKiouIEVsIG3DoXhpbW8gZGUgTGlsaWVuIGVzICoqYHIgZm10KG1heChsaWwsbmEucm09VFJVRSkpYCoqLCBlbiAqKmByIHBlclt3aGljaC5tYXgocmVwbGFjZShsaWwsaXMubmEobGlsKSwtSW5mKSldYCoqLiBTb24gaW5kaWNhZG9yZXMgZGUgbWFnbml0dWQgeSBkaXNwZXJzacOzbiwgbm8gZGUgYmllbmVzdGFyIG5pIGRlIHJlYXNpZ25hY2nDs24gb2JzZXJ2YWRhIGRlIHRyYWJhamFkb3Jlcy4NCg0KIyMgUm9idXN0ZXogZGUgbGFzIHBvbmRlcmFjaW9uZXMgeSBkZSBsYSBhZ3JlZ2FjacOzbg0KDQpgYGB7ciB0YWJsYV9wZXNvcywgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQp0YWJsYShkYXRhLmZyYW1lKFNlY3Rvcj1ub21fc2VjLCBJZ3VhbGVzPXJlcCgxLzMsMyksIFBDQT1hcy5udW1lcmljKHBlc29zKSksDQogICAgICAiQ3VhZHJvIDUuIFBlc29zIGRlbCDDrW5kaWNlIGF1eGlsaWFyIGRlIGludGVuc2lkYWQiLCA0KQ0KYGBgDQoNCkxhIGNvcnJlbGFjacOzbiBkZSBsYXMgZG9zIHZlcnNpb25lcyBhdXhpbGlhcmVzIGVzICoqYHIgZm10KHJobyw0KWAqKiwgY29uIGxhIG1pc21hIG11ZXN0cmEgZGUgKipgciBucm93KHopYCB0cmltZXN0cmVzKiouIEVsIHByaW1lciBjb21wb25lbnRlIGV4cGxpY2EgKipgciBmbXQoZXhwX3BjKWAgJSoqIGRlIGxhIHZhcmlhbnphIGVzdGFuZGFyaXphZGEuIFVuYSBjb3JyZWxhY2nDs24gYWx0YSBpbmRpY2Egc2VtZWphbnphIHRlbXBvcmFsOyBubyB2YWxpZGEgY2F1c2FsaWRhZCBuaSBzdXN0aXR1eWUgbG9zIMOtbmRpY2VzIGVzcGVjw61maWNvcy4NCg0KYGBge3IgZ3JhZmljb19wY2EsIGZpZy5jYXA9IkZpZ3VyYSA2LiDDjW5kaWNlIGF1eGlsaWFyIGRlIGludGVuc2lkYWQsIHJlZXNjYWxhZG8gZGUgMCBhIDEwMCBlbiBjYWRhIHZlcnNpw7NuLiJ9DQpnZ3Bsb3QobGFyZ2EoYXMubWF0cml4KHJvYlssMjozXSksIHJvYiRmZWNoYSwgYygiUGVzb3MgaWd1YWxlcyIsIlBlc29zIFBDQSIpKSwNCiAgICAgICBhZXMoZmVjaGEsdmFsb3IsY29sb3I9c2VyaWUpKSArIGdlb21fbGluZShsaW5ld2lkdGg9MC45KSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiUGVzb3MgaWd1YWxlcyI9IiM3NjI0NDAiLCJQZXNvcyBQQ0EiPSIjYjc3YjI2IikpICsNCiAgbGFicyh0aXRsZT0iU2Vuc2liaWxpZGFkIGEgbGFzIHBvbmRlcmFjaW9uZXMiLCB4PU5VTEwsIHk9IkVzY2FsYSAw4oCTMTAwIiwgY2FwdGlvbj1mdWVudGUpDQpgYGANCg0KYGBge3IgdGFibGFfcm9idXN0ZXosIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KcmhvX25hdiA8LSBjb3IobmF2LCBuYXY1LCB1c2U9ImNvbXBsZXRlLm9icyIpDQpyaG9fbGlsIDwtIGNvcihsaWwsIGxpbDE5LCB1c2U9ImNvbXBsZXRlLm9icyIpDQp0YWJsYShkYXRhLmZyYW1lKENvbXBhcmFjacOzbj1jKCJOQVYgYSA0IHkgMjAgdHJpbWVzdHJlcyIsICJMaWxpZW4gY29uIDMgZ3J1cG9zIHkgMTkgYWN0aXZpZGFkZXMiLCAiQXV4aWxpYXIgY29uIHBlc29zIGlndWFsZXMgeSBQQ0EiKSwNCiAgICAgICAgICAgICAgICAgTj1jKHN1bShjb21wbGV0ZS5jYXNlcyhuYXYsbmF2NSkpLHN1bShjb21wbGV0ZS5jYXNlcyhsaWwsbGlsMTkpKSxucm93KHopKSwNCiAgICAgICAgICAgICAgICAgQ29ycmVsYWNpw7NuPWMocmhvX25hdixyaG9fbGlsLHJobykpLCAiQ3VhZHJvIDYuIFJvYnVzdGV6IHNvYnJlIG11ZXN0cmFzIGNvbXVuZXMiLCA0KQ0KYGBgDQoNCkxhIHNlbnNpYmlsaWRhZCBkZSBOQVYgY2FtYmlhIGVsIGhvcml6b250ZSBlY29uw7NtaWNvIHkgbGEgZGUgTGlsaWVuIGNhbWJpYSBsYSBkZXNhZ3JlZ2FjacOzbiwgcG9yIGxvIHF1ZSBubyBkZWJlbiBpbnRlcnByZXRhcnNlIGNvbW8gdmVyc2lvbmVzIGlkw6ludGljYXMgY29uIGRpc3RpbnRvcyBwZXNvcy4gQ29uIHRyZXMgc2VjdG9yZXMgcHVlZGVuIGNvbXBlbnNhcnNlIG1vdmltaWVudG9zIGludGVybm9zIHF1ZSBzw60gYXBhcmVjZW4gY29uIDE5IGFjdGl2aWRhZGVzLg0KDQpMYSBjb3JyZWxhY2nDs24gZGUgKipgciBmbXQocmhvX25hdiw0KWAqKiBlbnRyZSBsb3MgZG9zIGhvcml6b250ZXMgZGUgTkFWIG11ZXN0cmEgcXVlIGVsIGRpYWduw7NzdGljbyBkZSBjb3J0byB5IG1lZGlhbm8gcGxhem8gZGVwZW5kZSBkZWwgcGVyw61vZG8gZGUgY29tcGFyYWNpw7NuLiBQb3Igc3UgcGFydGUsIGxhIGNvcnJlbGFjacOzbiBkZSAqKmByIGZtdChyaG9fbGlsLDQpYCoqIGVudHJlIExpbGllbiBkZSB0cmVzIHkgMTkgYWN0aXZpZGFkZXMgaW5kaWNhIHNlbWVqYW56YSBwYXJjaWFsLCBjb24gaW5mb3JtYWNpw7NuIGludGVybmEgcXVlIHNlIHBpZXJkZSBhbCBhZ3J1cGFyLiBMYSBjb2luY2lkZW5jaWEgZGUgbG9zIHBlc29zIGF1eGlsaWFyZXMsIHBvciB0YW50bywgbm8gZWxpbWluYSBsYSBzZW5zaWJpbGlkYWQgYWwgaG9yaXpvbnRlIG8gYSBsYSBjbGFzaWZpY2FjacOzbi4NCg0KIyMgUmHDrXogdW5pdGFyaWEgeSBwZXJzaXN0ZW5jaWENCg0KYGBge3IgdGFibGFfcmFpY2VzLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCnRhYmxhKHRlc3RbdGVzdCRGb3JtYT09Ik5pdmVsIiwgYygiU2VyaWUiLCJQcnVlYmEiLCJOIiwiTW9kZWxvIiwiUmV6YWdvcyIsIkVzdGFkw61zdGljbyIsIkNyw610aWNvXzUiLCJSZWNoYXphX251bGEiLCJRdWllYnJlIildLA0KICAgICAgIkN1YWRybyA3LiBQcnVlYmFzIGVuIG5pdmVsZXM7IGRlY2lzaW9uZXMgYWwgNSAlIiwgMykNCmBgYA0KDQoqKkxlY3R1cmEgZGVsIGN1YWRyby4qKiBFbiBBREYgeSBaaXZvdC1BbmRyZXdzLCByZWNoYXphciBsYSBudWxhIGZhdm9yZWNlIGVzdGFjaW9uYXJpZWRhZCBiYWpvIGVsIG1vZGVsbyBlc3BlY2lmaWNhZG8uIEVuIEtQU1MsIHJlY2hhemFyIGN1ZXN0aW9uYSBsYSBlc3RhY2lvbmFyaWVkYWQuIExhIGZlY2hhIGRlIFppdm90LUFuZHJld3MgZXMgdW4gY2FuZGlkYXRvIGVuZMOzZ2VubyBkZWwgY29udHJhc3RlIGRlIHJhw616IHVuaXRhcmlhIHkgbm8gZXF1aXZhbGUgYWwgZmVjaGFkbyBkZSBCYWnigJNQZXJyb24uIExhcyBwcmltZXJhcyBkaWZlcmVuY2lhcyB5IGxvcyByZXN1bHRhZG9zIGNvbXBsZXRvcyBzZSBjb25zZXJ2YW4gZW4gZWwgYW5leG8uDQoNCkVuIGVzdGEgZWplY3VjacOzbiwgKiplbCBsb2dhcml0bW8gZGVsIFBJQiBwcmVzZW50YSBldmlkZW5jaWEgbWl4dGEqKjogQURGIHJlY2hhemEgcmHDrXogdW5pdGFyaWEsIG1pZW50cmFzIEtQU1MgcmVjaGF6YSBlc3RhY2lvbmFyaWVkYWQgYWxyZWRlZG9yIGRlIHVuYSB0ZW5kZW5jaWEgbGluZWFsIHBvciB1biBtYXJnZW4gcGVxdWXDsW8gKDAuMTQ3IGZyZW50ZSBhIDAuMTQ2KS4gWml2b3QtQW5kcmV3cyByZWNoYXphIHJhw616IHVuaXRhcmlhIHBlcm1pdGllbmRvIHVuIHF1aWVicmUgZW4gMjAyMCBJLiBObyBzZSBhc2lnbmEgYXV0b23DoXRpY2FtZW50ZSB1biBvcmRlbiBkZSBpbnRlZ3JhY2nDs24gYWwgUElCIGEgcGFydGlyIGRlIHVuIHNvbG8gY29udHJhc3RlLg0KDQpQYXJhICoqTkFWKiosIEFERiB5IEtQU1Mgc29uIGNvbXBhdGlibGVzIGNvbiBlc3RhY2lvbmFyaWVkYWQgZW4gbml2ZWwgYWwgNSAlLCBwZXJvIFppdm90LUFuZHJld3Mgbm8gcmVjaGF6YSByYcOteiB1bml0YXJpYS4gTGEgY2VyY2Fuw61hIGRlbCBBREYgYSBzdSB2YWxvciBjcsOtdGljbyB5IGxhIGRpc2NyZXBhbmNpYSBlbnRyZSBwcnVlYmFzIGFjb25zZWphbiBjYXV0ZWxhLiBFbiAqKkxpbGllbioqLCBsYXMgdHJlcyBwcnVlYmFzIHNvbiBjb21wYXRpYmxlcyBjb24gZXN0YWNpb25hcmllZGFkIGJham8gc3VzIGVzcGVjaWZpY2FjaW9uZXMuIFVuIMOtbmRpY2UgZXN0YWNpb25hcmlvIHB1ZWRlIHByZXNlbnRhciBlcGlzb2Rpb3MgZGUgZWxldmFkYSBkaXNwZXJzacOzbiBzaW4gcXVlIGVzdG9zIGNvbnN0aXR1eWFuIHVuYSBudWV2YSB0ZW5kZW5jaWEgcGVybWFuZW50ZS4NCg0KIyMgUXVpZWJyZXMgZGVsIMOtbmRpY2UgcHJpbmNpcGFsDQoNCmBgYHtyIHRhYmxhc19xdWllYnJlcywgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQp0YWJsYShkYXRhLmZyYW1lKFF1aWVicmVzPTA6KGxlbmd0aChiaWMpLTEpLCBCSUM9YmljKSwNCiAgICAgICJDdWFkcm8gOC4gU2VsZWNjacOzbiBkZWwgbsO6bWVybyBkZSBxdWllYnJlcyBkZWwgTkFWIiwgMikNCmlmIChtID4gMCkgew0KICBpZHggPC0gZnVuY3Rpb24oeCkgYiRwZXJbcG1heCgxLHBtaW4obnJvdyhiKSxyb3VuZCh4KSkpXQ0KICBmZWNoYXNfYnAgPC0gZGF0YS5mcmFtZShGaW5fZGVsX3LDqWdpbWVuPWIkcGVyW2NvcnRlc10sIEluaWNpb19zaWd1aWVudGU9YiRwZXJbY29ydGVzKzFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBMw61taXRlX2luZmVyaW9yPWlkeChjaVssMV0pLCBMw61taXRlX3N1cGVyaW9yPWlkeChjaVssM10pKQ0KICB0YWJsYShmZWNoYXNfYnAsIkN1YWRybyA5LiBGZWNoYXMgZXN0aW1hZGFzIGUgaW50ZXJ2YWxvcyBhcHJveGltYWRvcyBkZWwgOTUgJSIpDQp9IGVsc2Ugew0KICBmZWNoYXNfYnAgPC0gZGF0YS5mcmFtZShSZXN1bHRhZG89IkJJQyBzZWxlY2Npb25hIGNlcm8gcXVpZWJyZXMgZW4gZWwgbW9kZWxvIGRlIG1lZGlhcyIpDQogIHRhYmxhKGZlY2hhc19icCwiQ3VhZHJvIDkuIFJlc3VsdGFkbyBkZWwgZmVjaGFkbyIpDQp9DQp0YWJsYShkYXRhLmZyYW1lKFBydWViYT1jKCJzdXBGIGNvbiBjb3ZhcmlhbnphIEhBQyIsICJManVuZy1Cb3ggZGUgcmVzaWR1b3MsIDggcmV6YWdvcyIpLA0KICAgICAgICAgICAgICAgICBFc3RhZMOtc3RpY289Yyhhcy5udW1lcmljKHN1cCRzdGF0aXN0aWMpLGFzLm51bWVyaWMobGIkc3RhdGlzdGljKSksDQogICAgICAgICAgICAgICAgIHBfdmFsb3I9YyhzdXAkcC52YWx1ZSxsYiRwLnZhbHVlKSksICJDdWFkcm8gMTAuIEVzdGFiaWxpZGFkIHkgZGlhZ27Ds3N0aWNvIiwgNCkNCmBgYA0KDQpCSUMgc2VsZWNjaW9uYSAqKmByIG1gIHF1aWVicmUocykqKi4gTGEgcHJ1ZWJhIHN1cEYgYXJyb2phICoqcCA9IGByIGZtdChzdXAkcC52YWx1ZSw0KWAqKjogYHIgaWYoc3VwJHAudmFsdWU8MC4wNSkgInNlIHJlY2hhemEgbGEgZXN0YWJpbGlkYWQgYWwgNSAlIGJham8gZXN0ZSBjb250cmFzdGUuIiBlbHNlICJubyBzZSByZWNoYXphIGxhIGVzdGFiaWxpZGFkIGFsIDUgJSBiYWpvIGVzdGUgY29udHJhc3RlLiJgIExhIGZlY2hhIHF1ZSBtYXJjYSBgYnJlYWtwb2ludHNgIGVzIGxhIMO6bHRpbWEgb2JzZXJ2YWNpw7NuIGRlbCByw6lnaW1lbiBhbnRlcmlvcjsgZWwgY3VhZHJvIHRhbWJpw6luIG11ZXN0cmEgbGEgcHJpbWVyYSBkZWwgc2lndWllbnRlLg0KDQpFbiBsYSBtdWVzdHJhIHJlY2liaWRhLCBsYSBzZWxlY2Npw7NuIGRlIGNlcm8gcXVpZWJyZXMgc2lnbmlmaWNhIHF1ZSAqKm5vIHNlIGlkZW50aWZpY2FuIGNhbWJpb3MgcGVyc2lzdGVudGVzIGRlIGxhIG1lZGlhIGRlIE5BViBjb24gZXN0ZSBtb2RlbG8geSBjcml0ZXJpbyoqLiBObyBzaWduaWZpY2EgcXVlIGxhcyBwYXJ0aWNpcGFjaW9uZXMgc2VjdG9yaWFsZXMgcGVybWFuZXpjYW4gY29uc3RhbnRlcyBuaSBxdWUgbGFzIGNyaXNpcyBjYXJlemNhbiBkZSBlZmVjdG9zLiBMYSBjdXJ2YSBkZWwgw61uZGljZSBwdWVkZSByZWdpc3RyYXIgbW92aW1pZW50b3MgZnVlcnRlcyB5IHRlbXBvcmFsZXMgZGVudHJvIGRlIHVuIG1pc21vIHLDqWdpbWVuIGRlIG1lZGlhLg0KDQpgYGB7ciBncmFmaWNvX3F1aWVicmVzLCBmaWcuY2FwPSJGaWd1cmEgNy4gTkFWIHkgbWVkaWFzIGRlIGxvcyByZWfDrW1lbmVzIHNlbGVjY2lvbmFkb3MgcG9yIEJJQy4ifQ0KZ2dwbG90KGIsYWVzKGZlY2hhLG5hdikpICsgZ2VvbV9saW5lKGNvbG9yPSIjNzYyNDQwIixsaW5ld2lkdGg9MC43NSkgKw0KICBnZW9tX3N0ZXAoYWVzKHk9bWVkaWEpLGNvbG9yPSIjYjc3YjI2IixsaW5ld2lkdGg9MSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9YXMubnVtZXJpYyhiJGZlY2hhW2NvcnRlc10pLGxpbmV0eXBlPSJkYXNoZWQiLGNvbG9yPSIjNTI2Mjc0IikgKw0KICBsYWJzKHRpdGxlPSJFc3RhYmlsaWRhZCBkZSBsYSBpbnRlbnNpZGFkIGRlbCBjYW1iaW8iLHg9TlVMTCx5PSJOQVYgYSBjdWF0cm8gdHJpbWVzdHJlcyIsY2FwdGlvbj1mdWVudGUpDQpgYGANCg0KTGEgdmFyaWFudGUgQVIoMSkgc2VsZWNjaW9uYSAqKmByIG1hYCBxdWllYnJlKHMpKiosIGNvbiBmaW5lcyBkZSByw6lnaW1lbiBlbiAqKmByIGlmKGxlbmd0aChjYSkpIHBhc3RlKGJhJHBlcltjYV0sY29sbGFwc2U9IiwgIikgZWxzZSAibmluZ3VubyJgKiouIGByIGlmKGxiJHAudmFsdWU8MC4wNSkgIkVsIGRpYWduw7NzdGljbyBkZXRlY3RhIGF1dG9jb3JyZWxhY2nDs24gcmVzaWR1YWw6IGxhcyB2ZW50YW5hcyBzdXBlcnB1ZXN0YXMgeSBsYSBkaW7DoW1pY2EgZGVsIMOtbmRpY2UgbGltaXRhbiBsYSBwcmVjaXNpw7NuIGRlbCBtb2RlbG8gZGUgbWVkaWFzLiBTZSBpbnRlcnByZXRhIGVsIGZlY2hhZG8ganVudG8gY29uIGxhIHNlbnNpYmlsaWRhZCBBUigxKSwgc2luIHRyYXRhciBjYWRhIGZlY2hhIGNvbW8gdW5hIGNlcnRlemEuIiBlbHNlICJFbCBkaWFnbsOzc3RpY28gbm8gcmVjaGF6YSBhdXNlbmNpYSBkZSBhdXRvY29ycmVsYWNpw7NuIGhhc3RhIG9jaG8gcmV6YWdvczsgZXN0byBubyBlbGltaW5hIG90cmFzIGZvcm1hcyBkZSBlc3BlY2lmaWNhY2nDs24gaW1wZXJmZWN0YS4iYA0KDQpgYGB7ciB0YWJsYV9oaXN0b3JpYSwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQp0YWJsYShoaXN0LCAiQ3VhZHJvIDExLiBDYW1iaW8gZGUgbWVkaWEgZGVsIE5BViBlbiBmZWNoYXMgaGlzdMOzcmljYXMgcHJlZmlqYWRhczsgZXJyb3JlcyBIQUMgeSBhanVzdGUgSG9sbSIsIDQpDQpgYGANCg0KRXN0b3MgY29udHJhc3RlcyBjb21wYXJhbiBtZWRpYXMgYW50ZXJpb3JlcyB5IHBvc3RlcmlvcmVzIGEgY2FkYSBmZWNoYTsgbm8gc29uIGVzdGltYWNpb25lcyBjYXVzYWxlcyBuaSBwcnVlYmFzIGRlIHVuIGVmZWN0byB0cmFuc2l0b3JpbyBkZSB1biBzb2xvIHRyaW1lc3RyZS4gUGFyYSAyMDAxIHNlIGluZm9ybWEgKipubyBlc3RpbWFibGU6IGZ1ZXJhIGRlIGxhIG11ZXN0cmEqKi4gTG9zIGNvbnRyYXN0ZXMgZGUgMjAwOCBJViB5IDIwMDkgSSByZXByZXNlbnRhbiBkb3MgcHVudG9zIHByZWZpamFkb3MgZGUgbGEgbWlzbWEgY3Jpc2lzOyBIb2xtIGNvcnJpZ2UgbG9zIHRyZXMgY29udHJhc3RlcyBkZSBlc3RlIGN1YWRyby4NCg0KTG9zIHRyZXMgY29udHJhc3RlcyBwcmVmaWphZG9zICoqbm8gcmVjaGF6YW4gaWd1YWxkYWQgZGUgbWVkaWFzIGFsIDUgJSoqLCBpbmNsdXNvIGFudGVzIGRlIGxhIGNvcnJlY2Npw7NuIG3Dumx0aXBsZS4gRXN0byBlcyBjb21wYXRpYmxlIGNvbiB1biBjaG9xdWUgaW50ZW5zbyBwZXJvIHRyYW5zaXRvcmlvIGVuIDIwMjAgSUksIHRyaW1lc3RyZSBlbiBxdWUgc2Ugb2JzZXJ2YW4gbG9zIG3DoXhpbW9zIGRlIE5BViB5IExpbGllbiB5IGxhIG1lbm9yIGJyZWNoYSBIUC4gTGEgZmFsdGEgZGUgcmVjaGF6byBubyBkZW11ZXN0cmEgaWd1YWxkYWQgZXhhY3RhIGRlIGxvcyByZWfDrW1lbmVzLg0KDQojIyBQcm9kdWN0byBwb3RlbmNpYWwgeSBicmVjaGENCg0KYGBge3IgZ3JhZmljb19wb3RlbmNpYWwsIGZpZy5jYXA9IkZpZ3VyYSA4LiBQSUIgcmVhbCBhanVzdGFkbyB5IHRlbmRlbmNpYSBIUDsgw61uZGljZSByZWZlcmlkbyBhIDIwMTQuIn0NCmdncGxvdChsYXJnYShjYmluZChPYnNlcnZhZG89cGliLCBQb3RlbmNpYWw9cG90KSxmZWNoYSksYWVzKGZlY2hhLHZhbG9yLGNvbG9yPXNlcmllKSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoPTAuOSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIk9ic2VydmFkbyI9IiM3NjI0NDAiLCJQb3RlbmNpYWwiPSIjYjc3YjI2IikpICsNCiAgbGFicyh0aXRsZT0iUHJvZHVjY2nDs24gb2JzZXJ2YWRhIHkgdGVuZGVuY2lhIGRlIGxhcmdvIHBsYXpvIix4PU5VTEwseT0iw41uZGljZSBkZSB2b2x1bWVuIixjYXB0aW9uPWZ1ZW50ZSkNCmBgYA0KDQpgYGB7ciBncmFmaWNvX2JyZWNoYSwgZmlnLmNhcD0iRmlndXJhIDkuIEJyZWNoYSBwb3JjZW50dWFsIHJlc3BlY3RvIGRlbCBwb3RlbmNpYWwgSFAsIM67ID0gMTYwMC4ifQ0KZ2dwbG90KGQsYWVzKGZlY2hhLGdhcCkpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsY29sb3I9IiM5MTgwNzciKSArDQogIGdlb21fY29sKGFlcyhmaWxsPWdhcD49MCksd2lkdGg9NjUsc2hvdy5sZWdlbmQ9RkFMU0UpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIkZBTFNFIj0iIzc2MjQ0MCIsIlRSVUUiPSIjMjQ2Nzc5IikpICsNCiAgbGFicyh0aXRsZT0iRGVzdmlhY2lvbmVzIHJlc3BlY3RvIGRlIGxhIHRlbmRlbmNpYSIseD1OVUxMLHk9IkJyZWNoYSBkZWwgcHJvZHVjdG8gKCUpIixjYXB0aW9uPWZ1ZW50ZSkNCmBgYA0KDQpMYSBtZW5vciBicmVjaGEgc2UgdWJpY2EgZW4gKipgciBwZXJbd2hpY2gubWluKGdhcCldYCoqLCBjb24gKipgciBmbXQobWluKGdhcCkpYCAlKiouIExhIMO6bHRpbWEgZXMgKipgciBmbXQodGFpbChnYXAsMSkpYCAlKiouIFVuYSBicmVjaGEgcG9zaXRpdmEgc2lnbmlmaWNhIHByb2R1Y2Npw7NuIHBvciBlbmNpbWEgZGUgbGEgdGVuZGVuY2lhIGVzdGltYWRhOyB1bmEgbmVnYXRpdmEsIHBvciBkZWJham8uIEVsIGRhdG8gZmluYWwgZXMgZXNwZWNpYWxtZW50ZSBzZW5zaWJsZSBhIG51ZXZhcyBvYnNlcnZhY2lvbmVzIHkgcmV2aXNpb25lcywgeSBubyBjb25zdGl0dXllIHVuYSBtZWRpZGEgZXhhY3RhIGRlIGhvbGd1cmEgbmkgdW4gcHJvbsOzc3RpY28uDQoNCiMgRGlzY3VzacOzbiB5IGNvbmNsdXNpb25lcw0KDQojIyBRdcOpIGNhbWJpw7MgZW4gbGEgZXN0cnVjdHVyYQ0KDQpFbCBjb250cmFzdGUgZGVzY3JpcHRpdm8gZGUgbGEgaGlww7N0ZXNpcyBgciBpZihjb21wJENhbWJpb19wcFsxXSA8IDAgJiYgd2hpY2gubWF4KGNvbXAkRmluYWwpPT0zKSAiZXMgY29tcGF0aWJsZSBjb24gdW5hIG1lbm9yIHBhcnRpY2lwYWNpw7NuIGFncm9wZWN1YXJpYSB5IGNvbiBlbCBwcmVkb21pbmlvIGRlIGxvcyBzZXJ2aWNpb3MgZW4gbGEgdmVudGFuYSBmaW5hbC4iIGVsc2UgIm5vIHJlc3BhbGRhIGNvbmp1bnRhbWVudGUgc3VzIGRvcyBwYXJ0ZXM6IGVzIG5lY2VzYXJpbyBjb25zZXJ2YXIgbGEgZGlmZXJlbmNpYSBlbnRyZSBsYSB0cmF5ZWN0b3JpYSBhZ3JvcGVjdWFyaWEgeSBlbCBwZXNvIGRlIGxvcyBzZXJ2aWNpb3MuImAgTGEgY29tcGFyYWNpw7NuIGRlIGV4dHJlbW9zIG5vIGltcGxpY2EgcXVlIGVsIGNhbWJpbyBoYXlhIHNpZG8gdW5pZm9ybWUuIExhIHRyYXllY3RvcmlhIGNvbXBsZXRhIHkgTkFWIHBlcm1pdGVuIGlkZW50aWZpY2FyIGVwaXNvZGlvcyBkZSBhdmFuY2UgeSByZXZlcnNpw7NuLg0KDQpMYSBwYXJ0aWNpcGFjacOzbiBzZSBtaWRlIGEgcHJlY2lvcyBjb3JyaWVudGVzLiBQb3IgZXNvIGNvbWJpbmEgY2FtYmlvcyBkZSBjYW50aWRhZGVzIHkgcHJlY2lvcyByZWxhdGl2b3MsIHkgbm8gaWRlbnRpZmljYSBwb3Igc8OtIHNvbGEgdW5hIHRyYW5zZmVyZW5jaWEgZsOtc2ljYSBkZSByZWN1cnNvcy4gTG9zIGNyZWNpbWllbnRvcyBkZSB2b2x1bWVuIHkgTGlsaWVuIGFwb3J0YW4gb3RyYSBwZXJzcGVjdGl2YS4gTGEgZGVzYWdyZWdhY2nDs24gZGUgdHJlcyBzZWN0b3JlcyBmYWNpbGl0YSBjb211bmljYXIgZWwgcGF0csOzbiBnZW5lcmFsLCBwZXJvIGFncnVwYSBhY3RpdmlkYWRlcyBjb24gcHJvZHVjdGl2aWRhZGVzIHkgdGVjbm9sb2fDrWFzIGRpc3RpbnRhcy4NCg0KIyMgQ8OzbW8gaW50ZXJwcmV0YXIgbG9zIGNob3F1ZXMgeSBsYSBwZXJzaXN0ZW5jaWENCg0KTGEgY3Jpc2lzIGRlIDIwMDjigJMyMDA5IHkgbGEgcGFuZGVtaWEgc2UgY29udHJhc3RhbiBjb24gZmVjaGFzIHByZWZpamFkYXMgeSBjb24gdW4gZmVjaGFkbyBlbmTDs2dlbm8uIExhIGNvaW5jaWRlbmNpYSBkZSB1biBlcGlzb2RpbyBlbGV2YWRvIGRlIE5BViBvIExpbGllbiBjb24gdW5hIGNyaXNpcyBlcyBldmlkZW5jaWEgZGVzY3JpcHRpdmEgZGUgaGV0ZXJvZ2VuZWlkYWQgbyByZWFzaWduYWNpw7NuLCBubyB1bmEgaWRlbnRpZmljYWNpw7NuIGNhdXNhbC4gVW4gY2hvcXVlIHRyYW5zaXRvcmlvIHB1ZWRlIGVsZXZhciBsYSBkaXNwZXJzacOzbiBzaW4gY29uc3RpdHVpciB1biBudWV2byByw6lnaW1lbiBwZXJtYW5lbnRlLiBQb3IgZXN0YSByYXrDs24gc2UgY29uc2lkZXJhbiBCSUMsIHN1cEYsIGF1dG9jb3JyZWxhY2nDs24geSBzZW5zaWJpbGlkYWQgQVIoMSkgY29uanVudGFtZW50ZS4NCg0KRW4gY29uY3JldG8sIGVsIGVwaXNvZGlvIGRlIDIwMjAgSUkgZGVzdGFjYSBlbiBkaXNwZXJzacOzbiB5IGJyZWNoYSwgcGVybyBCSUMgc2VsZWNjaW9uYSBjZXJvIHF1aWVicmVzIGRlIG1lZGlhIHRhbnRvIGVuIGVsIG1vZGVsbyBiw6FzaWNvIGNvbW8gZW4gbGEgc2Vuc2liaWxpZGFkIEFSKDEpOyBzdXBGIHRhbXBvY28gcmVjaGF6YSBhbCA1ICUuIEhheSBldmlkZW5jaWEgZGVzY3JpcHRpdmEgZGUgdW4gY2hvcXVlIGV4Y2VwY2lvbmFsLCBqdW50byBjb24gZXZpZGVuY2lhIGluc3VmaWNpZW50ZSBkZSB1biBjYW1iaW8gcGVybWFuZW50ZSBlbiBsYSBtZWRpYSBkZSBOQVYuIExhIGF1dG9jb3JyZWxhY2nDs24gcmVzaWR1YWwgZGV0ZWN0YWRhIGxpbWl0YSBsYSBwcmVjaXNpw7NuIGRlbCBtb2RlbG8gYsOhc2ljbyB5IGZvcm1hIHBhcnRlIGRlIGVzdGEgaW50ZXJwcmV0YWNpw7NuLg0KDQpMYSBkb2xhcml6YWNpw7NuIGRlIDIwMDEgbm8gcHVlZGUgZXZhbHVhcnNlIGVzdGFkw61zdGljYW1lbnRlOiBubyBoYXkgb2JzZXJ2YWNpb25lcyBwcmV2aWFzIG5pIGRlbCBwcm9waW8gYcOxbyBlbiBlc3RvcyBhcmNoaXZvcy4gTm8gZGV0ZWN0YXIgZXNlIGhpdG8gZW4gdW5hIG11ZXN0cmEgcG9zdGVyaW9yIG5vIGRlbXVlc3RyYSBhdXNlbmNpYSBkZSBlZmVjdG9zLiBUYW1wb2NvIHNlIGF0cmlidXllbiBsb3MgcXVpZWJyZXMgcG9zdGVyaW9yZXMgYSBsYSBkb2xhcml6YWNpw7NuIHNpbiB1bmEgZXN0cmF0ZWdpYSBhZGljaW9uYWwgZGUgaWRlbnRpZmljYWNpw7NuLg0KDQojIyBRdcOpIGFwb3J0YSBsYSBpbnZlcnNpw7NuDQoNCkxhIGludmVyc2nDs24gbWVkaWEgYHIgaWYobWVhbihpbnZbaTFdKT5tZWFuKGludltpMF0pKSAiZXMgbWF5b3IiIGVsc2UgImVzIG1lbm9yImAgZW4gbGFzIMO6bHRpbWFzIGN1YXRybyBvYnNlcnZhY2lvbmVzIHF1ZSBlbiBsYXMgcHJpbWVyYXMuIEVzdG8gZGVzY3JpYmUgdW5hIG1vZGlmaWNhY2nDs24gZGUgbGEgY29tcG9zaWNpw7NuIGRlbCBnYXN0by4gTGEgc2ltdWx0YW5laWRhZCBlbnRyZSBpbnZlcnNpw7NuIHkgZXhwYW5zacOzbiBwcm9kdWN0aXZhIG5vIHBlcm1pdGUgZXN0YWJsZWNlciBkaXJlY2Npw7NuIGNhdXNhbCBuaSBhZmlybWFyIHF1ZSBhdW1lbnTDsyBsYSBwcm9kdWN0aXZpZGFkIGRlbCBjYXBpdGFsLiBMYSBGQktGIGVzIGRpc3RpbnRhIGRlIGxhIGZvcm1hY2nDs24gYnJ1dGEgZGUgY2FwaXRhbCB0b3RhbDsgbG9zIGludmVudGFyaW9zIHJlY2llbnRlcyBlc3TDoW4gZW4gcmV2aXNpw7NuIHkgbm8gc2UgdXRpbGl6YW4gZW4gZWwgbnVtZXJhZG9yLg0KDQojIyBMw61taXRlcyBkZSBsYXMgY29uY2x1c2lvbmVzDQoNCkVsIGFuw6FsaXNpcyB1dGlsaXphIGFyY2hpdm9zIGNvbiBjaWZyYXMgcmVjaWVudGVzIHByZWxpbWluYXJlcyBvIGVzdGltYWRhcywgdW4gYWp1c3RlIGVzdGFjaW9uYWwgcHJvcGlvIHkgYXByb3hpbWFjaW9uZXMgZGUgYWdyZWdhY2nDs24uIExhcyBwcnVlYmFzIHRpZW5lbiBpbmNlcnRpZHVtYnJlIGRlIG11ZXN0cmEsIGVsZWNjacOzbiBkZSByZXphZ29zLCBzZWdtZW50b3MgeSBlc3BlY2lmaWNhY2nDs24uIExhIGFsdGEgY29ycmVsYWNpw7NuIGVudHJlIHBlc29zIG5vIGFzZWd1cmEgcm9idXN0ZXogYSBjdWFscXVpZXIgaW5kaWNhZG9yIG8gY2xhc2lmaWNhY2nDs24uIExhIGJyZWNoYSBIUCBlcyBzZW5zaWJsZSBhbCBleHRyZW1vIGRlIGxhIG11ZXN0cmEuIEZpbmFsbWVudGUsIGVsIGVzdHVkaW8gbm8gbWlkZSBwcm9kdWN0aXZpZGFkIGxhYm9yYWwgbmkgZWplY3V0YSBzaGlmdC1zaGFyZTogZXNvcyBjb21wb25lbnRlcyBxdWVkYW4gZnVlcmEgcG9yIGxhIGV4Y2x1c2nDs24gYWNvcmRhZGEgZGVsIGVtcGxlby4NCg0KKipDb25jbHVzacOzbiBwcmluY2lwYWwuKiogRW50cmUgbGFzIHZlbnRhbmFzIGluaWNpYWwgeSBmaW5hbCwgbGEgcGFydGljaXBhY2nDs24gYWdyb3BlY3VhcmlhIGRpc21pbnV5ZSBkZSAqKmByIGZtdChjb21wJEluaWNpb1sxXSlgICUgYSBgciBmbXQoY29tcCRGaW5hbFsxXSlgICUqKiwgbG9zIHNlcnZpY2lvcyBjb25zZXJ2YW4gZWwgbWF5b3IgcGVzbyB5IGxhIGludmVyc2nDs24gcGFzYSBkZSAqKmByIGZtdChtZWFuKGludltpMF0pKWAgJSBhIGByIGZtdChtZWFuKGludltpMV0pKWAgJSoqIGRlbCBQSUIuIEVsIEhISSBkZSB0cmVzIGdydXBvcyBhdW1lbnRhIGRlICoqYHIgZm10KG1lYW4oaGhpW2kwXSksMylgIGEgYHIgZm10KG1lYW4oaGhpW2kxXSksMylgKio7IHBvciB0YW50bywgZWwgY2FtYmlvIG9ic2VydmFkbyBubyBlcXVpdmFsZSBhIHVuYSBkaXN0cmlidWNpw7NuIG3DoXMgZXF1aWxpYnJhZGEgZW50cmUgZXN0b3MgdHJlcyBncnVwb3MuIExhIGNyaXNpcyBkZSAyMDIwIHByb2R1Y2UgZWwgZXBpc29kaW8gbcOhcyBpbnRlbnNvIGRlIGRpc3BlcnNpw7NuLCBtaWVudHJhcyBsYXMgcHJ1ZWJhcyBhcGxpY2FkYXMgbm8gaWRlbnRpZmljYW4gY2FtYmlvcyBwZXJzaXN0ZW50ZXMgZGUgbGEgbWVkaWEgZGUgTkFWIGFsIDUgJS4gU2luIGVtcGxlbyBzZWN0b3JpYWwsIGVzdG9zIHJlc3VsdGFkb3Mgbm8gcGVybWl0ZW4gY29uY2x1aXIgcXVlIGxhIHJlYXNpZ25hY2nDs24gZWxldsOzIG8gcmVkdWpvIGxhIHByb2R1Y3RpdmlkYWQgbGFib3JhbC4NCg0KIyBSZWZlcmVuY2lhcw0KDQotIEJhbmNvIENlbnRyYWwgZGUgUmVzZXJ2YSBkZSBFbCBTYWx2YWRvci4gKlByb2R1Y3RvIEludGVybm8gQnJ1dG8gVHJpbWVzdHJhbDogUHJvZHVjY2nDs24geSBnYXN0byBhIHByZWNpb3MgY29ycmllbnRlcyouIEFyY2hpdm8gRXhjZWwgZmFjaWxpdGFkbyBwb3IgZWwgZXN0dWRpYW50ZSwgY29ydGUgZGUgYXJjaGl2b3MgMTIgZGUgbm92aWVtYnJlIGRlIDIwMjYsIMO6bHRpbWEgb2JzZXJ2YWNpw7NuIDIwMjYgSUkuIFtDb25zdWx0YSBCQ1JdKGh0dHBzOi8vZXN0YWRpc3RpY2FzLmJjci5nb2Iuc3Yvc2VyaWUvcHJvZHVjdG8taW50ZXJuby1icnV0by10cmltZXN0cmFsLXBpYi10LXByb2R1Y2Npb24teS1nYXN0by1hLXByZWNpb3MtY29ycmllbnRlcy1lbi1taWxsb25lcy1kZS11cykuDQotIEJhbmNvIENlbnRyYWwgZGUgUmVzZXJ2YSBkZSBFbCBTYWx2YWRvci4gKlBJQiBULiBQcm9kdWNjacOzbiB5IGdhc3RvLiDDjW5kaWNlcyBkZSB2b2x1bWVuIGVuY2FkZW5hZG9zLiBTZXJpZSBvcmlnaW5hbCAocmVmZXJlbmNpYSAyMDE0KSouIEFyY2hpdm8gRXhjZWwgZmFjaWxpdGFkbyBwb3IgZWwgZXN0dWRpYW50ZSwgbWlzbW8gY29ydGUuIFtTZWN0b3IgcmVhbF0oaHR0cHM6Ly9lc3RhZGlzdGljYXMuYmNyLmdvYi5zdi9jbGFzaWZpY2FjaW9uL3NlY3Rvci1yZWFsKS4NCi0gQmFuY28gQ2VudHJhbCBkZSBSZXNlcnZhIGRlIEVsIFNhbHZhZG9yLiAqUElCIGFudWFsIGEgcHJlY2lvcyBjb3JyaWVudGVzIGUgw61uZGljZXMgZGUgdm9sdW1lbiBlbmNhZGVuYWRvczsgSVBDKi4gQXJjaGl2b3MgY29tcGxlbWVudGFyaW9zIGZhY2lsaXRhZG9zIHBvciBlbCBlc3R1ZGlhbnRlLiBbQmFzZSBlc3RhZMOtc3RpY2FdKGh0dHBzOi8vZXN0YWRpc3RpY2FzLmJjci5nb2Iuc3YvKS4NCi0gVW5pdmVyc2lkYWQgZGUgRWwgU2FsdmFkb3IsIFNlY2Npw7NuIGRlIEVjb25vbcOtYS4gKDIwMjYpLiAqRXhhbWVuIHBhcmNpYWwgMzogRGVzYXJyb2xsbyBkZSBpbmRpY2Fkb3JlcyBwYXJhIGVsIGFuw6FsaXNpcyBlc3RydWN0dXJhbCBkZSBsYSBlY29ub23DrWEgc2FsdmFkb3Jlw7FhKi4gQ29uc2lnbmEgeSByw7picmljYSBmYWNpbGl0YWRhcyBwb3IgZWwgZXN0dWRpYW50ZS4NCi0gUiBDb3JlIFRlYW0uICpTVEwgeSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyouIERvY3VtZW50YWNpw7NuIGRlIFtzdGxdKGh0dHBzOi8vc3RhdC5ldGh6LmNoL1ItbWFudWFsL1ItZGV2ZWwvbGlicmFyeS9zdGF0cy9odG1sL3N0bC5odG1sKSB5IFtwcmNvbXBdKGh0dHBzOi8vc3RhdC5ldGh6LmNoL1ItbWFudWFsL1ItZGV2ZWwvbGlicmFyeS9zdGF0cy9odG1sL3ByY29tcC5odG1sKS4NCi0gUGZhZmYsIEIuICp1cmNhOiBVbml0IFJvb3QgYW5kIENvaW50ZWdyYXRpb24gVGVzdHMgZm9yIFRpbWUgU2VyaWVzIERhdGEqLiBbTWFudWFsXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvdXJjYS91cmNhLnBkZikuDQotIFplaWxlaXMsIEEuIHkgY29sYWJvcmFkb3Jlcy4gKnN0cnVjY2hhbmdlOiBUZXN0aW5nLCBNb25pdG9yaW5nLCBhbmQgRGF0aW5nIFN0cnVjdHVyYWwgQ2hhbmdlcyouIEluY2x1eWUgZWwgYWxnb3JpdG1vIGRlIEJhaSB5IFBlcnJvbiAoMjAwMykuIFtNYW51YWxdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9zdHJ1Y2NoYW5nZS9zdHJ1Y2NoYW5nZS5wZGYpLg0KLSBCYWxjaWxhciwgTS4gKm1GaWx0ZXI6IE1pc2NlbGxhbmVvdXMgVGltZSBTZXJpZXMgRmlsdGVycyouIEltcGxlbWVudGFjacOzbiBkZWwgZmlsdHJvIGRlIEhvZHJpY2sgeSBQcmVzY290dC4gW01hbnVhbF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL21GaWx0ZXIvbUZpbHRlci5wZGYpLg0KLSBGb25kbyBNb25ldGFyaW8gSW50ZXJuYWNpb25hbCB5IG90cm9zIG9yZ2FuaXNtb3MuICgyMDA0KS4gKlByb2R1Y2VyIFByaWNlIEluZGV4IE1hbnVhbDogVGhlb3J5IGFuZCBQcmFjdGljZSosIGNhcMOtdHVsbyAxNiwgc2VjY2nDs24gMTYuMTI0IHkgZWN1YWNpw7NuIDE2LjcyOiDDrW5kaWNlIGRlIGNhbnRpZGFkIFTDtnJucXZpc3QgY29uIHBhcnRpY2lwYWNpb25lcyBkZSB2YWxvci4gW01hbnVhbF0oaHR0cHM6Ly93d3cuaW1mLm9yZy9leHRlcm5hbC9wdWJzL2Z0L3BwaS8yMDEwL21hbnVhbC9wcGkucGRmKS4NCi0gUG9zaXQuICpSIE1hcmtkb3duOiBodG1sX2RvY3VtZW50Ki4gW0RvY3VtZW50YWNpw7NuXShodHRwczovL3BrZ3MucnN0dWRpby5jb20vcm1hcmtkb3duL3JlZmVyZW5jZS9odG1sX2RvY3VtZW50Lmh0bWwpLg0KDQojIEFuZXhvcyBwYXJhIHJlcHJvZHVjaXIgeSBkZWZlbmRlcg0KDQojIyBDb2JlcnR1cmEgZGUgbGEgY29uc2lnbmENCg0KYGBge3IgY29iZXJ0dXJhX2NvbnNpZ25hLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCnRhYmxhKGRhdGEuZnJhbWUoUmVxdWlzaXRvPWMoIkhUTUwgYXV0b2NvbnRlbmlkbyBjb24gUiBNYXJrZG93biIsICJNdWVzdHJhIHRyaW1lc3RyYWwgbcOtbmltYSIsICJDb3J0ZSBkZSAyMDI2IiwgIkNyZWNpbWllbnRvLCBwYXJ0aWNpcGFjaW9uZXMsIGludmVyc2nDs24geSBISEkiLCAiTkFWIHkgTGlsaWVuIiwgIlNUTCwgbG9nYXJpdG1vcyB5IGRlZmxhY3RvciIsICJQZXNvcyBpZ3VhbGVzIHkgUENBIiwgIkFERiwgS1BTUyB5IFppdm90LUFuZHJld3MiLCAiQmFpLVBlcnJvbiBzb2JyZSBOQVYiLCAiUG90ZW5jaWFsIHkgYnJlY2hhIEhQIiwgIkRvbGFyaXphY2nDs24gZGUgMjAwMSIsICJQcm9kdWN0aXZpZGFkIGxhYm9yYWwgeSBzaGlmdC1zaGFyZSIpLA0KICAgICAgICAgICAgICAgICBDb2JlcnR1cmE9YygiR2VuZXJhZG8gZGVzZGUgZXN0ZSBSbWQ7IGbDs3JtdWxhcyBNYXRoTUwgZSBpbcOhZ2VuZXMgaW50ZWdyYWRhcyIsICI4NiBkYXRvcyBvcmlnaW5hbGVzOyBOQVYgYW51YWw6IDgyIiwgIkhhc3RhIDIwMjYgSUkgZW4gbG9zIGFyY2hpdm9zIHJlY2liaWRvcyIsICJDYWxjdWxhZG9zIiwgIkNhbGN1bGFkb3MgY29uIGbDs3JtdWxhcyBlc3BlY8OtZmljYXMiLCAiQXBsaWNhZG9zIHkgZG9jdW1lbnRhZG9zIiwgIkNvbXBhcmFjacOzbiBhdXhpbGlhciBleHBsw61jaXRhOyBubyByZWVtcGxhemEgTkFWIiwgIlJlc3VsdGFkb3MgZW4gbml2ZWxlcyB5IGRpZmVyZW5jaWFzIiwgIkZlY2hhZG8gQklDLCBlc3RhYmlsaWRhZCBIQUMgeSBzZW5zaWJpbGlkYWQgQVIoMSkiLCAiQ2FsY3VsYWRvcyBjb24gbGFtYmRhIDE2MDAiLCAiTm8gZXN0aW1hYmxlOyBzZSBjb25zZXJ2YSBjb21vIGFudGVjZWRlbnRlIiwgIkV4Y2x1aWRvcyBwb3IgYWxjYW5jZSBhY29yZGFkbyIpKSwNCiAgICAgICJDdWFkcm8gQTEuIEN1bXBsaW1pZW50byBlZmVjdGl2byB5IGV4Y2x1c2lvbmVzIikNCmBgYA0KDQojIyBQcmltZXJhcyBkaWZlcmVuY2lhcyB5IHNlbnNpYmlsaWRhZCBncsOhZmljYQ0KDQpgYGB7ciBkaWZlcmVuY2lhcywgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQp0YWJsYSh0ZXN0W3Rlc3QkRm9ybWE9PSJEaWZlcmVuY2lhIiwgYygiU2VyaWUiLCJQcnVlYmEiLCJOIiwiTW9kZWxvIiwiUmV6YWdvcyIsIkVzdGFkw61zdGljbyIsIkNyw610aWNvXzUiLCJSZWNoYXphX251bGEiLCJRdWllYnJlIildLA0KICAgICAgIkN1YWRybyBBMi4gUHJ1ZWJhcyBzb2JyZSBwcmltZXJhcyBkaWZlcmVuY2lhcyIsIDMpDQpgYGANCg0KYGBge3IgaG9yaXpvbnRlcywgZmlnLmNhcD0iRmlndXJhIEExLiBOQVYgY29uIGhvcml6b250ZXMgZGUgdW5vIHkgY2luY28gYcOxb3M7IHVuaWRhZGVzIGlndWFsZXMsIGhvcml6b250ZSBkaXN0aW50by4ifQ0KZ2dwbG90KGxhcmdhKGNiaW5kKCJVbiBhw7FvIj1uYXYsIkNpbmNvIGHDsW9zIj1uYXY1KSxmZWNoYSksYWVzKGZlY2hhLHZhbG9yLGNvbG9yPXNlcmllKSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoPTAuODUpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJVbiBhw7FvIj0iIzc2MjQ0MCIsIkNpbmNvIGHDsW9zIj0iIzI0Njc3OSIpKSArDQogIGxhYnModGl0bGU9IlNlbnNpYmlsaWRhZCBkZWwgaG9yaXpvbnRlIGRlIGNvbXBhcmFjacOzbiIseD1OVUxMLHk9Ik5BViAocHVudG9zKSIsY2FwdGlvbj1mdWVudGUpDQpgYGANCg0KYGBge3IgZGVzYWdyZWdhY2lvbiwgZmlnLmNhcD0iRmlndXJhIEEyLiBEaXNwZXJzacOzbiBjb24gdHJlcyBzZWN0b3JlcyB5IGNvbiAxOSBhY3RpdmlkYWRlcy4ifQ0KZ2dwbG90KGxhcmdhKGNiaW5kKCJUcmVzIHNlY3RvcmVzIj1saWwsIjE5IGFjdGl2aWRhZGVzIj1saWwxOSksZmVjaGEpLGFlcyhmZWNoYSx2YWxvcixjb2xvcj1zZXJpZSkpICsNCiAgZ2VvbV9saW5lKGxpbmV3aWR0aD0wLjg1KSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiVHJlcyBzZWN0b3JlcyI9IiM3NjI0NDAiLCIxOSBhY3RpdmlkYWRlcyI9IiMyNDY3NzkiKSkgKw0KICBsYWJzKHRpdGxlPSJFZmVjdG8gZGUgbGEgZGVzYWdyZWdhY2nDs24iLHg9TlVMTCx5PSJMaWxpZW4gKHB1bnRvcykiLGNhcHRpb249ZnVlbnRlKQ0KYGBgDQoNCiMjIENvbXByb2JhY2lvbmVzIGRlIGRhdG9zIHkgZGVmbGFjdGFjacOzbg0KDQpgYGB7ciB2YWxpZGFyX2FudWFsLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCmHDsW9zIDwtIGZpbGEoYW5uLDQpDQp2YWwgPC0gZG8uY2FsbChyYmluZCxsYXBwbHkoYygyMDA1LDIwMTQsMjAyNSksZnVuY3Rpb24oYcOxbyl7DQogIGogPC0gd2hpY2goYcOxb3M9PWHDsW8pKzE7IGsgPC0gd2hpY2goYW5pbz09YcOxbykNCiAgZGF0YS5mcmFtZShBw7FvPWHDsW8sIFBJQl9hbnVhbD1hcy5udW1lcmljKGFublszMCxqXSksIFBJQl9zdW1hX3RyaW1lc3RyZXM9c3VtKHBpYl9uW2tdKSwNCiAgICAgICAgICAgICBGQktGX2FudWFsPWFzLm51bWVyaWMoYW5uWzM3LGpdKSwgRkJLRl9zdW1hX3RyaW1lc3RyZXM9c3VtKGZia19uW2tdKSkNCn0pKQ0KdGFibGEodmFsLCJDdWFkcm8gQTMuIFZhbGlkYWNpw7NuIGRlIGxvcyBhcmNoaXZvcyBhbnVhbCB5IHRyaW1lc3RyYWwsIG1pbGxvbmVzIGRlIGTDs2xhcmVzIiwyKQ0KdmFsX3YgPC0gZGF0YS5mcmFtZShBw7FvPXZhbCRBw7FvLA0KICBWb2x1bWVuX2FudWFsPXNhcHBseSh2YWwkQcOxbyxmdW5jdGlvbihhw7FvKSBhcy5udW1lcmljKGFudlszMCx3aGljaChmaWxhKGFudiw0KT09YcOxbykrMV0pKSwNCiAgUHJvbWVkaW9fdHJpbWVzdHJhbD1zYXBwbHkodmFsJEHDsW8sZnVuY3Rpb24oYcOxbykgbWVhbihwaWJfdlthbmlvPT1hw7FvXSkpKQ0KdGFibGEodmFsX3YsIkN1YWRybyBBNC4gVmFsaWRhY2nDs24gZGVsIFBJQiBlbiB2b2x1bWVuLCByZWZlcmVuY2lhIDIwMTQiLDMpDQp0YWJsYShkYXRhLmZyYW1lKFBlcsOtb2RvPXBlcltjKDEsMzcsMzgsbGVuZ3RoKHBlcikpXSwgUElCX25vbWluYWw9cGliX25bYygxLDM3LDM4LGxlbmd0aChwZXIpKV0sDQogICAgICAgICAgICAgICAgIFBJQl9yZWFsX3JlZjIwMTQ9cGliX3JbYygxLDM3LDM4LGxlbmd0aChwZXIpKV0sIERlZmxhY3Rvcj1kZWZbYygxLDM3LDM4LGxlbmd0aChwZXIpKV0pLA0KICAgICAgIkN1YWRybyBBNS4gVHJhemFiaWxpZGFkIGRlbCBkZWZsYWN0b3IgaW1wbMOtY2l0bywgcmVmZXJlbmNpYSAyMDE0IiwzKQ0KYGBgDQoNCkxhcyBkaWZlcmVuY2lhcyBkZSBjZW50w6lzaW1hcyBlbiBsYSBjb21wcm9iYWNpw7NuIGFudWFsIHByb2NlZGVuIGRlbCByZWRvbmRlby4gRWwgY3VhZHJvIGRlbCBkZWZsYWN0b3IgdXNhIG5pdmVsZXMgb3JpZ2luYWxlcywgbm8gYWp1c3RhZG9zLiBQYXJhIG9idGVuZXIgbml2ZWxlcyBzZWN0b3JpYWxlcyBhcHJveGltYWRvcyBlbiBtaWxsb25lcyBkZSBkw7NsYXJlcyBkZSByZWZlcmVuY2lhIHNlIGRpdmlkZSBjYWRhIHZhbG9yIG5vbWluYWwgcG9yIGVzZSBkZWZsYWN0b3IvMTAwOyBwYXJhIGxvcyBjcmVjaW1pZW50b3Mgc2VjdG9yaWFsZXMgcHJpbmNpcGFsZXMgc2UgY29uc2VydmFuIGxvcyDDrW5kaWNlcyBvZmljaWFsZXMgeSBsYSBhZ3JlZ2FjacOzbiBUw7ZybnF2aXN0IGVzcGVjaWZpY2FkYS4NCg0K