Introducción

En este documento veremos cómo construir intervalos de confianza de la media usando los datos del Barómetro de las Américas. Para eso, vamos a usar los reportes “El pulso de la democracia” de 2018/19, disponible aquí, y de 2021, disponible aquí. En la ronda 2018/19, una de las secciones de este informe, reporta los datos sobre redes sociales y actitudes políticas. En particular, se reporta, en el gráfico 3.9, el grado de satisfacción con la democracia por tipo de usuario de redes sociales. En la ronda 2021, una de las secciones reporta los datos sobre golpes ejecutivos. En el gráfico 1.7 se presenta el porcentaje de ciudadanos que toleran los golpes ejecutivos por país. En ambos casos, los resultados incluyen las estimaciones puntuales y los intervalos de confianza.

Sobre las bases de datos

Los datos que vamos a usar deben citarse de la siguiente manera: Fuente: Barómetro de las Américas por el Proyecto de Opinión Pública de América Latina (LAPOP), wwww.LapopSurveys.org. En este documento se carga una base de datos recortada. Esta base de datos se encuentra alojada en el repositorio “materials_edu” de la cuenta de LAPOP en GitHub. Se recomiendo limpiar el Environment antes de proceder con esta sección.

Mediante la librería rio y el comando import se puede importar esta base de datos desde este repositorio. Además, se seleccionan los datos de países con códigos menores o iguales a 35, es decir, se elimina las observaciones de Estados Unidos y Canadá.

library(rio)
lapop18 = import("https://raw.github.com/lapop-central/materials_edu/main/LAPOP_AB_Merge_2018_v1.0.sav")
lapop18 = subset(lapop18, pais<=35)

También cargamos la base de datos de la ronda 2021.

lapop21 = import("https://raw.github.com/lapop-central/materials_edu/main/lapop21.RData")
lapop21 = subset(lapop21, pais<=35)

Tolerancia a los golpes ejecutivos

El gráfico 1.7 del reporte El pulso de la Democracia para la ronda del Barómetro de las Américas 2021 presenta los resultados del porcentaje de ciudadanos que tolera un golpe ejecutivo. En el gráfico estos datos están representados por la altura de la barra. Este gráfico, además, presente el intervalo de confianza al 95% de este porcentaje en cada país, graficado como una líneas punteadas alrededor de la punto máximo de la barra, que indica el límite inferior y superior del intervalo de confianza.

La variable para construir este gráfico es “jc15a” que está fraseada: ¿Cree usted que cuando el país enfrenta momentos muy difíciles, se justifica que el presidente del país cierre el Congreso/Asamblea y gobierno sin Congreso/Asamblea? Las opciones de respuesta son:

  1. Sí se justifica
  2. No se justifica

Describiendo la tolerancia a los golpes ejecutivos

Para calculas los porcentajes de ciudadanos que justifican o toleran los golpes ejecutivos se tiene que recodificar esta variable, de tal manera que aquellos que justifican tengan el valor 100 y los que no justifican, el valor 0. En este caso se usa el comando recode y se tabula, mediante table, para verificar la recodificación.

lapop21$jc15ar = car::recode(lapop21$jc15a, "1=100; 2=0")
table(lapop21$jc15ar)
## 
##     0   100 
## 14711  5908

Para calcular el porcentaje de ciudadanos que toleran los golpes ejecutivos se puede usar los comandos table y prop.table. La nueva variable “jc15ar” es una variable dummy. En este tipo de variables, la media corresponde a la proporción de respuestas 100. Es decir, si calculamos la media de esta variable, se está calculando el porcentaje para todos los entrevistados. En esta sección vamos a tratar a esta variable como si fuera una variable numérica. En sentido estricto es una variable categórica nominal. Los cálculos de desviaciones estándar y luego de intervalos de confianza, por lo tanto, son referenciales.

El resultado indica que en toda la muestra, el porcentaje de ciudadanos que toleran los golpes ejecutivos es de 28.7%.

summary(lapop21$jc15ar)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.00    0.00    0.00   28.65  100.00  100.00   40042

Intervalos de confianza de tolerancia a los golpes ejecutivos

Para calcular el intervalo de confianza al 95% de este porcentaje, se puede usar el comando t.test o la librería lsr, que tiene el comando ciMean. En ambos casos, el resultado nos indica que el porcentaje de ciudadanos que tolera los golpes ejecutivos en la región está entre 28% y 29.3%.

t.test(lapop21$jc15ar)
## 
##  One Sample t-test
## 
## data:  lapop21$jc15ar
## t = 90.996, df = 20618, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  28.03599 29.27038
## sample estimates:
## mean of x 
##  28.65318
library(lsr)
ciMean(as.numeric(lapop21$jc15ar), na.rm=T)
##          2.5%    97.5%
## [1,] 28.03599 29.27038

Tolerancia a los golpes ejecutivos por país

El gráfico 1.7 muestra el porcentaje de ciudadanos que toleran los golpes ejecutivos por país. Para replicar este gráfico, primero tenemos que definir que la variable “pais” es de tipo factor. Se guarda este cambio en una nueva variable “paises”, la que se etiqueta con las siglas de cada país.

lapop21$paises = as.factor(lapop21$pais)
levels(lapop21$paises) = c("MX", "GT", "SV", "HN", "NI", "CR",
                            "PN", "CO", "EC", "BO", "PE",
                            "PY", "CL", "UY", "BR", "AR", "DO",
                            "HT", "JA", "GU")
table(lapop21$paises)
## 
##   MX   GT   SV   HN   NI   CR   PN   CO   EC   BO   PE   PY   CL   UY   BR   AR 
## 2998 3000 3245 2999 2997 2977 3183 3003 3005 3002 3038 3004 2954 3009 3016 3011 
##   DO   HT   JA   GU 
## 3000 3088 3121 3011

Para calcular estos porcentajes por país, se puede usar varias alternativas. Una de las maneras más directas es con la librería Rmisc. Esta librería tiene el comando group.CI, que calcula la media, el límite inferior y superior de una variable por grupos de otra variable. Esta tabla se guarda en un objeto llamado “golpe”. Este comando no incluye las filas de los países donde no hay datos, por lo que no hay filas de Costa Rica ni de Guyana.

library(Rmisc)
golpe = group.CI(jc15ar~paises, lapop21)
golpe

Con esta tabla podemos replicar el gráfico 1.7 con la librería ggplot2. Para incluir los intervalos de confianza se tiene que agregar la especificación geom_errorbar(). La tabla “golpe” tiene el dato de “ymin” en la columna “jc15ar.lower” y el dato de “ymax” en la columna “jc15ar.upper”. Estos datos se deben ingresar en la especificación aes dentro de geom_errorbar. Además, se tiene como opciones width para especificar el ancho de las bigotes de las barras de error, color para especificar el color, cex para especificar el ancho de las líneas y linetype para especificar el tipo de líneas, en este caso puntuadas.

Para poder ordenar las barras de acuerdo al valor de la variable, se puede usar la especificación reorder(grupo, variable) dentro de la especificación aes de ggplot.

library(ggplot2)
graf1 = ggplot(golpe, aes(x=reorder(paises, -jc15ar.mean), y=jc15ar.mean))+
  geom_bar(width=0.5, fill="darkslategray3", colour="#69b3a2", stat="identity")+
  geom_errorbar(aes(ymin=jc15ar.lower, ymax=jc15ar.upper), width=0.4, 
                color="darkcyan", cex=0.4, linetype=3)+
  geom_text(aes(label=paste(round(jc15ar.mean, 1), "%")), vjust=-4.4, size=2.5)+
  xlab("País") + ylab("Tolerancia a golpes ejecutivos (%)")+
  ylim(0, 60)
graf1

Estos datos, sin embargo, no son exactamente iguales a los presentados en el gráfico 1.7 debido a que estos cálculos no incluyen el efecto de diseño. Más adelante, se verá cómo incluir el efecto de diseño para replicar el gráfico exactamente.

Satisfacción con la democracia

El gráfico 3.9 del reporte El Pulso de la Democracia de la ronda 2018/19 presenta el porcentaje de entrevistados que está satisfecho con la democracia por tipo de usuarios de redes sociales. El porcentaje está marcado como un punto y el intervalo de confianza como un área gris alrededor de estos puntos.

La variable satisfacción con la democracia se llama “pn4” y está codificada de la siguiente manera:

  1. Muy satisfecho
  2. Satisfecho
  3. Insatisfecho
  4. Muy insatisfecho

La nota 21 de este reporte indica que “Se codifica a los entrevistados que seleccionan (1) o (2) como satisfechos con la democracia”. Por lo tanto, se tiene que recodificar esta variable. En este caso se usa el comando recode y se tabula, mediante table, para verificar la recodificación.

library(car)
table(lapop18$pn4)
## 
##     1     2     3     4 
##  1727  8916 12455  3855
lapop18$pn4rr = car::recode(lapop18$pn4, "1:2=100; 3:4=0")
table(lapop18$pn4rr)
## 
##     0   100 
## 16310 10643

La nueva variable “pn4rr” es una variable dummy. En este tipo de variables, la media corresponde a la proporción de respuestas 100. Es decir, si calculamos la media de esta variable, se está calculando el porcentaje para todos los entrevistados. En esta sección vamos a tratar a esta variable como si fuera una variable numérica. En sentido estricto es una variable categórica nominal. Los cálculos de desviaciones estándar y luego de intervalos de confianza, por lo tanto, son referenciales.

summary(lapop18$pn4rr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.00    0.00    0.00   39.49  100.00  100.00    1089

Estos resultados muestran una media de 39.5, es decir el 39.5% de los entrevistados están satisfechos con la democracia. Se puede calcular también el intervalo de confianza de esta variable de varias formas. Una primera es mediante la prueba t de una muestra, usando el comando t.test. Otra forma es usando el comando ciMean de la librería lsr.

t.test(lapop18$pn4rr)
## 
##  One Sample t-test
## 
## data:  lapop18$pn4rr
## t = 132.62, df = 26952, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  38.90364 40.07087
## sample estimates:
## mean of x 
##  39.48726
library(lsr)
ciMean(lapop18$pn4rr, na.rm=T)
##          2.5%    97.5%
## [1,] 38.90364 40.07087

Estos resultados indican que el intervalo de confianza de la media de satisfacción con la democracia varía entre 38.9% y 40.1% con 95% de confianza. Se podría cambiar este valor por defecto a 99% de confianza agregando la especificación conf = 0.99 al comando ciMean.

Satisfacción con la democracia por grupos de consumo de información en redes sociales

El informe usa una variable que mide la “exposición frecuente a información política”. Esta variable se construye de una manera compleja, sobre la base de las 3 redes sociales por las que se pregunta. En este caso vamos a empezar con una recodificación más simple para recrear los intervalos de confianza de la variable “satisfacción de la democracia” por grupo de frecuencia de consumo de información de cada red social. Luego se procederá a replicar la variable que se usa en el reporte. La frecuencia de consumo de información (variables “smedia2” para Facebook, “smedia5” para Twitter y “smedia8” para Whatsapp) de cada red social se mide en la siguiente escala:

  1. Diariamente
  2. Algunas veces a la semana
  3. Algunas veces al mes
  4. Algunas veces al año
  5. Nunca

Vamos a recodificar estas variables de tal manera que aquellos que responden diariamente o algunas veces a la semana serán clasificados como de “alto uso”, aquellos que responden del 3 al 4 serán clasificados como de “bajo uso” y aquellos que responden “nunca” serán clasificados como “no usuarios”. Un esquema similar de clasificación se usa para definir a los usuarios de las 3 redes sociales. Las nuevas variables recodificadas, se convierten a factor y se etiquetan.

table(lapop18$smedia2)
## 
##    1    2    3    4    5 
## 8633 4927 1286  282  231
table(lapop18$smedia5)
## 
##   1   2   3   4   5 
## 795 728 422 193 220
table(lapop18$smedia8)
## 
##     1     2     3     4     5 
## 14151  2646   495    50    87
lapop18$smedia2r = car::recode(lapop18$smedia2, "1:2=1; 3:4=2; 5=3")
lapop18$smedia5r = car::recode(lapop18$smedia5, "1:2=1; 3:4=2; 5=3")
lapop18$smedia8r = car::recode(lapop18$smedia8, "1:2=1; 3:4=2; 5=3")
lapop18$smedia2r = as.factor(lapop18$smedia2r)
lapop18$smedia5r = as.factor(lapop18$smedia5r)
lapop18$smedia8r = as.factor(lapop18$smedia8r)
levels(lapop18$smedia2r) = c("Alto uso", "Bajo uso", "No usuario")
levels(lapop18$smedia5r) = c("Alto uso", "Bajo uso", "No usuario")
levels(lapop18$smedia8r) = c("Alto uso", "Bajo uso", "No usuario")
table(lapop18$smedia2r)
## 
##   Alto uso   Bajo uso No usuario 
##      13560       1568        231
table(lapop18$smedia5r)
## 
##   Alto uso   Bajo uso No usuario 
##       1523        615        220
table(lapop18$smedia8r)
## 
##   Alto uso   Bajo uso No usuario 
##      16797        545         87

Con estas variables recodificadas, se puede calcular las medias (que son los porcentajes) de satisfacción con la democracia por cada grupo de consumo de información en redes sociales.

Una opción que permite mostrar muchos estadísticos por cada grupo es describeBy de la librería psych. El código para Twitter es:

library(psych)
describeBy(lapop18$pn4rr, group=lapop18$smedia5r)
## 
##  Descriptive statistics by group 
## group: Alto uso
##    vars    n  mean    sd median trimmed mad min max range skew kurtosis   se
## X1    1 1505 39.67 48.94      0    37.1   0   0 100   100 0.42    -1.82 1.26
## ------------------------------------------------------------ 
## group: Bajo uso
##    vars   n  mean    sd median trimmed mad min max range skew kurtosis   se
## X1    1 602 37.38 48.42      0   34.23   0   0 100   100 0.52    -1.73 1.97
## ------------------------------------------------------------ 
## group: No usuario
##    vars   n  mean    sd median trimmed mad min max range skew kurtosis   se
## X1    1 213 41.78 49.44      0   39.77   0   0 100   100 0.33     -1.9 3.39

Sin embargo, lo que nos interesa es calcular los intervalos de confianza para cada grupo. En el gráfico 3.9 del reporte se presenta la media de satisfacción con la democracia, mostrado como un punto, y los intervalos de confianza de cada grupo, mostrados como un área gris con límites inferior y superior. Se puede usar la librería Rmisc y el comando group.CI para calcular los intervalos de confianza de la variable satisfacción con la democracia por grupos de consumo de información en Facebook.

library(Rmisc)
group.CI(pn4rr~smedia2r, lapop18)

Con estos datos, por ejemplo, la media de satisfacción con la democracia entre el grupo de alto uso de información en Facebook es 37.6%. El límite inferior del intervalo de confianza es 36.7% y el límite superior es 38.4%. Con estos datos se podría replicar un gráfico de barras similar al 3.9.

Intervalos de confianza de satisfacción con la democracia

La forma más fácil de graficar los intervalos de confianza por grupos es usando el comando plotmeans.

library(gplots)
plotmeans(lapop18$pn4rr~lapop18$smedia5r,
          xlab="Tipo de usuario de Twitter",
          ylab="Satisfacción con la democracia",
          ylim=c(0, 50),
          mean.labels=T, digits=1,
          connect=F
         )

Esta opción muestra los intervalos de confianza pero se dificulta si se quiere graficar las barras. La librería ggplot nos brinda más opciones y nos permite graficar de manera similar al gráfico 3.9 del reporte, en barras, presentar los intervalos de confianza y agregar color. Para esto, primero se guarda un dataframe “tw.uso” con los datos de la media y los límites superior e inferior de cada grupo, usando el comando group.CI. Son los datos de este dataframe los que se usan con ggplot y se crea un gráfico que se guarda en un objeto “graf1”. Con esta librería se agrega la capa geom_bar() para definir que se quiere un gráfico de barras de las variables especificadas en aes. Luego, se agrega la capa geom_errorbar() para agregar las barras de error y luego los valores de la media con geom_text(). Finalmente, se etiqueta el eje X y Y con xlab y ylab y se define los límites del eje Y con ylim.

tw.uso = group.CI(pn4rr~smedia5r, lapop18)
library(ggplot2)
graf2 = ggplot(tw.uso, aes(x=smedia5r, y=pn4rr.mean))+
  geom_bar(width=0.5, fill="darkcyan", colour="black", stat="identity")+
  geom_errorbar(aes(ymin=pn4rr.lower, ymax=pn4rr.upper), width=0.2)+
  geom_text(aes(label=paste(round(pn4rr.mean, 1), "%")), vjust=-4.2, size=4)+
  xlab("Tipo de usuario de Twitter") + ylab("Satisfacción con la democracia (%)")+
  ylim(0, 50)
graf2

Según estos resultados, la satisfacción con la democracia es más alta en aquellos que no son usuarios de Twitter, en comparación con los usuarios, aunque las diferencias no son estadísticamente significativas de una comparación visual entre los intervalos de confianza.

Satisfacción con la democracia por tipo de usuario de redes sociales

Hasta el momento se ha creado intervalos de confianza de satisfacción con la democracia por tipo de usuarios de Twitter. El reporte agrega a los usuarios de las tres redes sociales para ubicar tres tipos de usuarios: usuarios de alto uso, de bajo uso y no usuarios de cualquier red social. La forma de codificación de este tipo de usuarios de tres redes sociales se basa en varias condiciones. Como dice el reporte: “Usamos la misma codificación que en la anterior sección, para distinguir entre quienes acceden con frecuencia en redes sociales (aquellos con cuentas a las que acceden algunas veces a la semana o a diario) y aquellos que no acceden a las redes sociales muy frecuentemente (aquellos con cuentas a las que acceden algunas veces al mes o algunas veces al año). También incluimos a quienes no son usuarios: quienes no tienen ninguna cuenta en redes sociales (quienes indican que no tienen una cuenta en Facebook, Twitter o Whatsapp) y quienes tienen una cuenta, pero nunca la usan” (p.81). En primer lugar identificamos a quienes usan cada red social algunas veces a la semana o a diario como 1 y si usan cada red social algunas veces al mes o algunas veces al año, como 0. Para esto usamos el comando ifelse. Luego, sumamos los valores de cada red social en una sola variable, con valores entre 0 y 3. Se usa el comando rowSums que permite la suma horizontal de variables definidas, en este caso las que están en la posición [, 89:91]. En este comando, usamos la especificación na.rm=T para que la suma no tome en cuenta a los valores perdidos.

lapop18$sm2 = ifelse(lapop18$smedia2==1 | lapop18$smedia2==2, 1, 0)
lapop18$sm5 = ifelse(lapop18$smedia5==1 | lapop18$smedia5==2, 1, 0)
lapop18$sm8 = ifelse(lapop18$smedia8==1 | lapop18$smedia8==2, 1, 0)
lapop18$anyhi = rowSums(lapop18[,89:91], na.rm=T)
table(lapop18$anyhi)
## 
##     0     1     2     3 
##  9831  5811 11131  1269

Partiendo de esta variable, se crea una variable que agrega las tres redes sociales, llamada “hi_lo_non”. Primero, se crea esta variable como un vector de NAs. Luego se le imputa valores de 1, 2, 3 o NA, dependiendo de los valores de “anyhi o de los valores de las variables de redes sociales. Luego se crea una nueva variable de tipo factor, con idénticos valores que”hi_lo_non” y se etiqueta. La definición de la condicionalidad se trabaja mediante los corchetes [...]. De esta manera, se define las condiciones de la siguiente manera:

  • La variable “hi_lo_non es igual a 1 si la variable anyhi es mayor o igual a 1 (uso diario o algunas veces a la semana) = lapop18$hi_lo_non[lapop18$anyhi>=1] <- 1

  • La variable “hi_lo_non es igual a 2 si la variable anyhi es igual a 0 (uso algunas veces al año o nunca) = lapop18$hi_lo_non[lapop18$anyhi==0] <- 2

  • La variable “hi_lo_non es igual a 3 si las variables de tenencia de cuentas son igual a 2 (No) = lapop18$hi_lo_non[lapop18$smedia1==2 & lapop18$smedia4==2 & lapop18$smedia7==2] <- 3

Las siguiente reglas de codificación siguen la misma lógica de combinación de otras variables para imputar el valor 3 o NA.

lapop18$hi_lo_non = NA #se crea un vector con NAs#
lapop18$hi_lo_non[lapop18$anyhi>=1] = 1 #Se codifica 1 a los que usan diariamente o algunas veces a la semana alguna red social#
lapop18$hi_lo_non[lapop18$anyhi==0] = 2 #Se codifica como 2 a los que usan algunas veces al mes y al año alguna red social#
lapop18$hi_lo_non[lapop18$smedia1==2 & lapop18$smedia4==2 & lapop18$smedia7==2] = 3 #Se codifica como 3 a los que no tiene redes sociales#
lapop18$hi_lo_non[lapop18$smedia2==5 & lapop18$smedia5==5 & lapop18$smedia8==5] = 3 #Se codifica como 3 a los que nunca usan ninguna red social#
lapop18$hi_lo_non[lapop18$pais==3 & (lapop18$smedia2==5 | lapop18$smedia5==5 | lapop18$smedia8==5)] = 3 #Se aplica un código particular a pais 3#
lapop18$hi_lo_non[lapop18$pais==3 & (lapop18$smedia1==2 | lapop18$smedia4==2 | lapop18$smedia7==2)] = 3 #Se aplica un código particular a pais 3#
lapop18$hilon = as.factor(lapop18$hi_lo_non)
levels(lapop18$hilon) = c("Alto uso", "Bajo uso", "No usuario")
prop.table(table(lapop18$hilon))*100
## 
##   Alto uso   Bajo uso No usuario 
##  64.941873   3.480494  31.577634

Según estos datos, el 64.9% de entrevistados reportan un alto uso de redes sociales, mientras que, en el otro extremo, se tiene 31.6% que serían no usuarios de ninguna red social. Estos datos difieren un poco de los reportados en el Apéndice al reporte, disponible aquí, donde se reporte 65.34% de alto uso y 31.60% de no usuarios. Estas diferencias pueden ser debidas a diferencias en la interpretación de las reglas de codificación desde Stata a R.

De la misma forma que se produjo el gráfico de media de satisfacción con la democracia por tipos de usuarios de Twitter usando ggplot, ahora se hará lo mismo pero para los usuarios de las tres redes sociales, variable “hilon”.

library(Rmisc)
satis.uso = group.CI(pn4rr~hilon, lapop18)
library(ggplot2)
graf3.9 = ggplot(satis.uso, aes(x=hilon, y=pn4rr.mean))+
  geom_bar(width=0.5, fill="darkcyan", colour="black", stat="identity")+
  geom_errorbar(aes(ymin=pn4rr.lower, ymax=pn4rr.upper), width=0.2)+
  geom_text(aes(label=paste(round(pn4rr.mean, 1), "%")), vjust=-2.5, size=4)+
  xlab("Tipo de usuario de redes sociales") + ylab("Satisfacción con la democracia (%)")+
  ylim(0, 50)
graf3.9

Este gráfico sería una reproducción del que se presenta en el informe (Gráfico 3.9 en la página 62), con una mínimas diferencias por codificación de los datos resultantes.

Resumen

En este documento se ha trabajado con una variable recodificada dummy (satisfacción con la democracia), la que puede ser trabajada como variable numérica para el cálculo de intervalos de confianza de proporciones. Con esta variable se ha calculado el intervalo de confianza de la media, que sería el de la proporción de entrevistados que están satisfechos con la democracia. Luego, se ha descrito esta variables por grupos de una variable de factor (consumo de información política). Se ha presentado cómo calcular los intervalos de confianza de la variable numérica por grupos de la variable de factor. Finalmente, se ha presentado cómo graficar los intervalos de confianza por grupos.

Cálculos incluyendo el efecto de diseño

Resultados de tolerancia a los golpes ejecutivos ponderados

Como se mencionó, los resultados obtenidos acerca de la tolerancia de los golpes ejecutivos, gráfico 1.7 del reporte El Pulso de la Democracia 2021, no son iguales a los obtenidos aquí. Esto es debido a que los cálculos de más arriba no incluye el efecto de diseño.

Para poder realizar los cálculos tomando en cuenta el efecto de diseño, se puede usar la librería survey para definir el diseño muestral. Primero, se tiene que adecuar la base de datos, eliminando los valores perdidos de las variables que definen el diseño muestral (como “weight1500”). Un paso adicional es transformar las variables del dataframe. Esto es debido a que cuando se importan, el sistema lee las variables como tipo “haven_labelled”, es decir, mantiene las etiquetas de las variables, con lo que se podría producir un libro de códigos. Esto es útil en otras ocasiones, pero genera problemas con la librería survey. Para esto transformamos las variables a otro tipo con el comando sapply.

Con la base de datos adecuada, se puede definir el diseño muestra y se guarda en un objeto “diseno21”.

library(survey)
diseno21 = svydesign(ids = ~upm, strata = ~strata, weights = ~weight1500, nest=TRUE, data=lapop21)

La librería survey tiene comandos nativos para calcular la media de la variable recodificada de tolerancia a los golpes ejecutivos. Este cálculo de la media nos brinda el porcentaje de ciudadanos en la región que son tolerantes a los golpes ejecutivos.

svymean(~jc15ar, diseno21, na.rm=T)
##          mean     SE
## jc15ar 30.391 0.3926

Para calcular el intervalo de confianza de esta medida se puede anidar el comando svymean dentro de otro comando confint que nos brinda el límite inferior y superior del intervalo de confianza.

confint(svymean(~jc15ar, diseno21, na.rm=T))
##           2.5 %  97.5 %
## jc15ar 29.62125 31.1601

Para poder replicar el gráfico 1.7 requerimos el valor del porcentaje de ciudadanos que toleran los golpes ejecutivos por páis, así como el intervalo de confianza de cada uno. Para este cálculo, podemos usar el comando svyby. Este comando requiere definir la variable a ser calculada (~jc15ar), la variable que define los grupos (~paises), el objeto que guarda el diseño muestral (diseno21), el estadístico que se quiere calcular (svymean, na.rm=T) y definir el intervalo de confianza (vartype = "ci"). Estos cálculos se guardan en un objeto “golpepond”.

golpepond = svyby(~jc15ar, ~paises, diseno21, svymean, na.rm=T, vartype = "ci")
golpepond = golpepond[-c(6,20),]

De la misma manera que con el gráfico con los resultados no poderados, usamos la librería ggplot para replicar el gráfico 1.7. Se debe tomar en cuenta que el comando svybar genera columnas con nombre diferentes a los que se generan con el comando group.CI usado más arriba.

graf3 = ggplot(golpepond, aes(x=reorder(paises, -jc15ar), y=jc15ar))+
  geom_bar(width=0.5, fill="darkslategray3", colour="#69b3a2", stat="identity")+
  geom_errorbar(aes(ymin=ci_l, ymax=ci_u), width=0.2, color="darkcyan",
                cex=0.4, linetype=3)+
  geom_text(aes(label=paste(round(jc15ar, 0), "%")), vjust=-4.4, size=2.5)+
  xlab("País") + ylab("Tolerancia a golpes ejecutivos (%)")+
  ylim(0, 60)
graf3

De esta manera se ha replicado exactamente los resultados reportados en El Pulso de la Democracia 2021.

Resultados de satisfacción con la democracia ponderados

De la misma manera que con la tolerancia a los golpes ejecutivos, se usa la librería survey y el comando confintjunto al comando nativo svymean.

library(survey)
diseno18 = svydesign(ids = ~upm, strata = ~estratopri, weights = ~weight1500, nest=TRUE, data=lapop18)

Se puede describir la variable de satisfacción con la democracia incorporando el factor de diseño usando el comando svymean.

svymean(~pn4rr, diseno18, na.rm=T)
##         mean     SE
## pn4rr 39.459 0.3317

Para calcular el intervalo de confianza, se tiene que anidar el código anterior dentro del comando confint. Este comando calcula el intervalo de confianza al 95% por defecto. Se podría cambiar este valor por defecto a 99% de confianza agregando la especificación conf = 0.99 al comando.

confint(svymean(~pn4rr, diseno18, na.rm=T))
##          2.5 %   97.5 %
## pn4rr 38.80884 40.10901

También se puede calcular la media y el intervalo de confianza de satisfacción con la democracia incorporando el efecto de diseño usando el comando svyby. Dentro de este comando se especifica la variable numérica a ser descrita (~pn4rr), la variable que forma los grupos (~smedia5r), el diseño muestral (diseno18), la función que se quiere calcular (svymean), que no tome en cuenta los valores perdidos (na.rm=T) y que incluya el intervalo de confianza de cada grupo (vartype="ci").

tw.uso.weighted = svyby(~pn4rr, ~smedia5r, diseno18, svymean, na.rm=T, vartype = "ci")
tw.uso.weighted

Para poder graficar, estos cálculos se guardan en un dataframe “tw.uso.weighted”, que incluye los datos de la media por cada grupo y el límite inferior y superior del intervalo de confianza. De la misma manera que con los datos que no incluyen el efecto de diseño, se usa la librería ggplot y se crea un gráfico que se guarda en un objeto “graf2”. Se usan especificaciones muy similares a los ejemplos anteriores.

graf4 = ggplot(tw.uso.weighted, aes(x=smedia5r, y=pn4rr))+
  geom_bar(width=0.5, fill="darkcyan", colour="black", stat="identity")+
  geom_errorbar(aes(ymin=ci_l, ymax=ci_u), width=0.2)+
  geom_text(aes(label=paste(round(pn4rr, 1), "%")), vjust=-4.2, size=4)+
  xlab("Tipo de usuario de Twitter") + ylab("Satisfacción con la democracia (%)")+
  ylim(0, 50)
graf4

Estos resultados incluyen el efecto de diseño, pero no son exactamente iguales a los reportados en el gráfico 3.9 del reporte El Pulso de la Democracia de la ronda 2018/19 debido a que el cálculo de la variable que define al tipo de usuario de Twitter es más complejo de lo que se hace en esta sección.

LS0tCnRpdGxlOiAiSW50ZXJ2YWxvcyBkZSBjb25maWFuemEgdXNhbmRvIGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29sbGFwc2VkOiBmYWxzZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgdG9jX2RlcHRoOiAxCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogZmxhdGx5CiAgICBkZl9wcmludDogcGFnZWQKICAgIHNlbGZfY29udGFpbmVkOiBubwogICAga2VlcF9tZDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiBzZW50ZW5jZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFKQpgYGAKCmBgYHtjc3MgY29sb3IsIGVjaG89RkFMU0V9Ci5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30KaDEge2NvbG9yOiAjMzM2NkNDO30KYGBgCgojIEludHJvZHVjY2nDs24KCkVuIGVzdGUgZG9jdW1lbnRvIHZlcmVtb3MgY8OzbW8gY29uc3RydWlyIGludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIGxhIG1lZGlhIHVzYW5kbyBsb3MgZGF0b3MgZGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcy4KUGFyYSBlc28sIHZhbW9zIGEgdXNhciBsb3MgcmVwb3J0ZXMgIkVsIHB1bHNvIGRlIGxhIGRlbW9jcmFjaWEiIGRlIDIwMTgvMTksIGRpc3BvbmlibGUgW2FxdcOtXShodHRwczovL3d3dy52YW5kZXJiaWx0LmVkdS9sYXBvcC9hYjIwMTgvMjAxOC0xOV9BbWVyaWNhc0Jhcm9tZXRlcl9SZWdpb25hbF9SZXBvcnRfU3BhbmlzaF9XXzAzLjI3LjIwLnBkZiksIHkgZGUgMjAyMSwgZGlzcG9uaWJsZSBbYXF1w61dKGh0dHBzOi8vd3d3LnZhbmRlcmJpbHQuZWR1L2xhcG9wL2FiMjAyMS8yMDIxX0xBUE9QX0FtZXJpY2FzQmFyb21ldGVyX1B1bHNlX29mX0RlbW9jcmFjeS5wZGYpLgpFbiBsYSByb25kYSAyMDE4LzE5LCB1bmEgZGUgbGFzIHNlY2Npb25lcyBkZSBlc3RlIGluZm9ybWUsIHJlcG9ydGEgbG9zIGRhdG9zIHNvYnJlIHJlZGVzIHNvY2lhbGVzIHkgYWN0aXR1ZGVzIHBvbMOtdGljYXMuCkVuIHBhcnRpY3VsYXIsIHNlIHJlcG9ydGEsIGVuIGVsIGdyw6FmaWNvIDMuOSwgZWwgZ3JhZG8gZGUgc2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYSBwb3IgdGlwbyBkZSB1c3VhcmlvIGRlIHJlZGVzIHNvY2lhbGVzLgpFbiBsYSByb25kYSAyMDIxLCB1bmEgZGUgbGFzIHNlY2Npb25lcyByZXBvcnRhIGxvcyBkYXRvcyBzb2JyZSBnb2xwZXMgZWplY3V0aXZvcy4KRW4gZWwgZ3LDoWZpY28gMS43IHNlIHByZXNlbnRhIGVsIHBvcmNlbnRhamUgZGUgY2l1ZGFkYW5vcyBxdWUgdG9sZXJhbiBsb3MgZ29scGVzIGVqZWN1dGl2b3MgcG9yIHBhw61zLgpFbiBhbWJvcyBjYXNvcywgbG9zIHJlc3VsdGFkb3MgaW5jbHV5ZW4gbGFzIGVzdGltYWNpb25lcyBwdW50dWFsZXMgeSBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEuCgojIFNvYnJlIGxhcyBiYXNlcyBkZSBkYXRvcwoKTG9zIGRhdG9zIHF1ZSB2YW1vcyBhIHVzYXIgZGViZW4gY2l0YXJzZSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOiBGdWVudGU6IEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyBwb3IgZWwgUHJveWVjdG8gZGUgT3BpbmnDs24gUMO6YmxpY2EgZGUgQW3DqXJpY2EgTGF0aW5hIChMQVBPUCksIHd3d3cuTGFwb3BTdXJ2ZXlzLm9yZy4KRW4gZXN0ZSBkb2N1bWVudG8gc2UgY2FyZ2EgdW5hIGJhc2UgZGUgZGF0b3MgcmVjb3J0YWRhLgpFc3RhIGJhc2UgZGUgZGF0b3Mgc2UgZW5jdWVudHJhIGFsb2phZGEgZW4gZWwgcmVwb3NpdG9yaW8gIm1hdGVyaWFsc19lZHUiIGRlIGxhIGN1ZW50YSBkZSBMQVBPUCBlbiBHaXRIdWIuClNlIHJlY29taWVuZG8gbGltcGlhciBlbCBFbnZpcm9ubWVudCBhbnRlcyBkZSBwcm9jZWRlciBjb24gZXN0YSBzZWNjacOzbi4KCk1lZGlhbnRlIGxhIGxpYnJlcsOtYSBgcmlvYCB5IGVsIGNvbWFuZG8gYGltcG9ydGAgc2UgcHVlZGUgaW1wb3J0YXIgZXN0YSBiYXNlIGRlIGRhdG9zIGRlc2RlIGVzdGUgcmVwb3NpdG9yaW8uCkFkZW3DoXMsIHNlIHNlbGVjY2lvbmFuIGxvcyBkYXRvcyBkZSBwYcOtc2VzIGNvbiBjw7NkaWdvcyBtZW5vcmVzIG8gaWd1YWxlcyBhIDM1LCBlcyBkZWNpciwgc2UgZWxpbWluYSBsYXMgb2JzZXJ2YWNpb25lcyBkZSBFc3RhZG9zIFVuaWRvcyB5IENhbmFkw6EuCgpgYGB7ciBiYXNlfQpsaWJyYXJ5KHJpbykKbGFwb3AxOCA9IGltcG9ydCgiaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9sYXBvcC1jZW50cmFsL21hdGVyaWFsc19lZHUvbWFpbi9MQVBPUF9BQl9NZXJnZV8yMDE4X3YxLjAuc2F2IikKbGFwb3AxOCA9IHN1YnNldChsYXBvcDE4LCBwYWlzPD0zNSkKYGBgCgpUYW1iacOpbiBjYXJnYW1vcyBsYSBiYXNlIGRlIGRhdG9zIGRlIGxhIHJvbmRhIDIwMjEuCgpgYGB7ciBiYXNlMjF9CmxhcG9wMjEgPSBpbXBvcnQoImh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vbGFwb3AtY2VudHJhbC9tYXRlcmlhbHNfZWR1L21haW4vbGFwb3AyMS5SRGF0YSIpCmxhcG9wMjEgPSBzdWJzZXQobGFwb3AyMSwgcGFpczw9MzUpCmBgYAoKIyBUb2xlcmFuY2lhIGEgbG9zIGdvbHBlcyBlamVjdXRpdm9zCgpFbCBncsOhZmljbyAxLjcgZGVsIHJlcG9ydGUgRWwgcHVsc28gZGUgbGEgRGVtb2NyYWNpYSBwYXJhIGxhIHJvbmRhIGRlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMgMjAyMSBwcmVzZW50YSBsb3MgcmVzdWx0YWRvcyBkZWwgcG9yY2VudGFqZSBkZSBjaXVkYWRhbm9zIHF1ZSB0b2xlcmEgdW4gZ29scGUgZWplY3V0aXZvLgpFbiBlbCBncsOhZmljbyBlc3RvcyBkYXRvcyBlc3TDoW4gcmVwcmVzZW50YWRvcyBwb3IgbGEgYWx0dXJhIGRlIGxhIGJhcnJhLgpFc3RlIGdyw6FmaWNvLCBhZGVtw6FzLCBwcmVzZW50ZSBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGFsIDk1JSBkZSBlc3RlIHBvcmNlbnRhamUgZW4gY2FkYSBwYcOtcywgZ3JhZmljYWRvIGNvbW8gdW5hIGzDrW5lYXMgcHVudGVhZGFzIGFscmVkZWRvciBkZSBsYSBwdW50byBtw6F4aW1vIGRlIGxhIGJhcnJhLCBxdWUgaW5kaWNhIGVsIGzDrW1pdGUgaW5mZXJpb3IgeSBzdXBlcmlvciBkZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YS4KCiFbXShGaWd1cmUxLjcucG5nKXt3aWR0aD0iNTY0In0KCkxhIHZhcmlhYmxlIHBhcmEgY29uc3RydWlyIGVzdGUgZ3LDoWZpY28gZXMgImpjMTVhIiBxdWUgZXN0w6EgZnJhc2VhZGE6IMK/Q3JlZSB1c3RlZCBxdWUgY3VhbmRvIGVsIHBhw61zIGVuZnJlbnRhIG1vbWVudG9zIG11eSBkaWbDrWNpbGVzLCBzZSBqdXN0aWZpY2EgcXVlIGVsIHByZXNpZGVudGUgZGVsIHBhw61zIGNpZXJyZSBlbCBDb25ncmVzby9Bc2FtYmxlYSB5IGdvYmllcm5vIHNpbiBDb25ncmVzby9Bc2FtYmxlYT8KTGFzIG9wY2lvbmVzIGRlIHJlc3B1ZXN0YSBzb246CgoxLiAgU8OtIHNlIGp1c3RpZmljYQoyLiAgTm8gc2UganVzdGlmaWNhCgojIyBEZXNjcmliaWVuZG8gbGEgdG9sZXJhbmNpYSBhIGxvcyBnb2xwZXMgZWplY3V0aXZvcwoKUGFyYSBjYWxjdWxhcyBsb3MgcG9yY2VudGFqZXMgZGUgY2l1ZGFkYW5vcyBxdWUganVzdGlmaWNhbiBvIHRvbGVyYW4gbG9zIGdvbHBlcyBlamVjdXRpdm9zIHNlIHRpZW5lIHF1ZSByZWNvZGlmaWNhciBlc3RhIHZhcmlhYmxlLCBkZSB0YWwgbWFuZXJhIHF1ZSBhcXVlbGxvcyBxdWUganVzdGlmaWNhbiB0ZW5nYW4gZWwgdmFsb3IgMTAwIHkgbG9zIHF1ZSBubyBqdXN0aWZpY2FuLCBlbCB2YWxvciAwLgpFbiBlc3RlIGNhc28gc2UgdXNhIGVsIGNvbWFuZG8gYHJlY29kZWAgeSBzZSB0YWJ1bGEsIG1lZGlhbnRlIGB0YWJsZWAsIHBhcmEgdmVyaWZpY2FyIGxhIHJlY29kaWZpY2FjacOzbi4KCmBgYHtyIHRvbGVyYW5jaWF9CmxhcG9wMjEkamMxNWFyID0gY2FyOjpyZWNvZGUobGFwb3AyMSRqYzE1YSwgIjE9MTAwOyAyPTAiKQp0YWJsZShsYXBvcDIxJGpjMTVhcikKYGBgCgpQYXJhIGNhbGN1bGFyIGVsIHBvcmNlbnRhamUgZGUgY2l1ZGFkYW5vcyBxdWUgdG9sZXJhbiBsb3MgZ29scGVzIGVqZWN1dGl2b3Mgc2UgcHVlZGUgdXNhciBsb3MgY29tYW5kb3MgYHRhYmxlYCB5IGBwcm9wLnRhYmxlYC4KTGEgbnVldmEgdmFyaWFibGUgImpjMTVhciIgZXMgdW5hIHZhcmlhYmxlIGR1bW15LgpFbiBlc3RlIHRpcG8gZGUgdmFyaWFibGVzLCBsYSBtZWRpYSBjb3JyZXNwb25kZSBhIGxhIHByb3BvcmNpw7NuIGRlIHJlc3B1ZXN0YXMgMTAwLgpFcyBkZWNpciwgc2kgY2FsY3VsYW1vcyBsYSBtZWRpYSBkZSBlc3RhIHZhcmlhYmxlLCBzZSBlc3TDoSBjYWxjdWxhbmRvIGVsIHBvcmNlbnRhamUgcGFyYSB0b2RvcyBsb3MgZW50cmV2aXN0YWRvcy4KRW4gZXN0YSBzZWNjacOzbiB2YW1vcyBhIHRyYXRhciBhIGVzdGEgdmFyaWFibGUgY29tbyBzaSBmdWVyYSB1bmEgdmFyaWFibGUgbnVtw6lyaWNhLgpFbiBzZW50aWRvIGVzdHJpY3RvIGVzIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSBub21pbmFsLgpMb3MgY8OhbGN1bG9zIGRlIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgeSBsdWVnbyBkZSBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSwgcG9yIGxvIHRhbnRvLCBzb24gcmVmZXJlbmNpYWxlcy4KCkVsIHJlc3VsdGFkbyBpbmRpY2EgcXVlIGVuIHRvZGEgbGEgbXVlc3RyYSwgZWwgcG9yY2VudGFqZSBkZSBjaXVkYWRhbm9zIHF1ZSB0b2xlcmFuIGxvcyBnb2xwZXMgZWplY3V0aXZvcyBlcyBkZSAyOC43JS4KCmBgYHtyIHJlc3VtZW4gdG9sZXJhbmNpYX0Kc3VtbWFyeShsYXBvcDIxJGpjMTVhcikKYGBgCgojIyBJbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSB0b2xlcmFuY2lhIGEgbG9zIGdvbHBlcyBlamVjdXRpdm9zCgpQYXJhIGNhbGN1bGFyIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgYWwgOTUlIGRlIGVzdGUgcG9yY2VudGFqZSwgc2UgcHVlZGUgdXNhciBlbCBjb21hbmRvIGB0LnRlc3RgIG8gbGEgbGlicmVyw61hIGBsc3JgLCBxdWUgdGllbmUgZWwgY29tYW5kbyBgY2lNZWFuYC4KRW4gYW1ib3MgY2Fzb3MsIGVsIHJlc3VsdGFkbyBub3MgaW5kaWNhIHF1ZSBlbCBwb3JjZW50YWplIGRlIGNpdWRhZGFub3MgcXVlIHRvbGVyYSBsb3MgZ29scGVzIGVqZWN1dGl2b3MgZW4gbGEgcmVnacOzbiBlc3TDoSBlbnRyZSAyOCUgeSAyOS4zJS4KCmBgYHtyIGljIHRvbGVyYW5jaWF9CnQudGVzdChsYXBvcDIxJGpjMTVhcikKbGlicmFyeShsc3IpCmNpTWVhbihhcy5udW1lcmljKGxhcG9wMjEkamMxNWFyKSwgbmEucm09VCkKYGBgCgojIyBUb2xlcmFuY2lhIGEgbG9zIGdvbHBlcyBlamVjdXRpdm9zIHBvciBwYcOtcwoKRWwgZ3LDoWZpY28gMS43IG11ZXN0cmEgZWwgcG9yY2VudGFqZSBkZSBjaXVkYWRhbm9zIHF1ZSB0b2xlcmFuIGxvcyBnb2xwZXMgZWplY3V0aXZvcyBwb3IgcGHDrXMuClBhcmEgcmVwbGljYXIgZXN0ZSBncsOhZmljbywgcHJpbWVybyB0ZW5lbW9zIHF1ZSBkZWZpbmlyIHF1ZSBsYSB2YXJpYWJsZSAicGFpcyIgZXMgZGUgdGlwbyBmYWN0b3IuClNlIGd1YXJkYSBlc3RlIGNhbWJpbyBlbiB1bmEgbnVldmEgdmFyaWFibGUgInBhaXNlcyIsIGxhIHF1ZSBzZSBldGlxdWV0YSBjb24gbGFzIHNpZ2xhcyBkZSBjYWRhIHBhw61zLgoKYGBge3IgcGFpc30KbGFwb3AyMSRwYWlzZXMgPSBhcy5mYWN0b3IobGFwb3AyMSRwYWlzKQpsZXZlbHMobGFwb3AyMSRwYWlzZXMpID0gYygiTVgiLCAiR1QiLCAiU1YiLCAiSE4iLCAiTkkiLCAiQ1IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBOIiwgIkNPIiwgIkVDIiwgIkJPIiwgIlBFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQWSIsICJDTCIsICJVWSIsICJCUiIsICJBUiIsICJETyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSFQiLCAiSkEiLCAiR1UiKQp0YWJsZShsYXBvcDIxJHBhaXNlcykKYGBgCgpQYXJhIGNhbGN1bGFyIGVzdG9zIHBvcmNlbnRhamVzIHBvciBwYcOtcywgc2UgcHVlZGUgdXNhciB2YXJpYXMgYWx0ZXJuYXRpdmFzLgpVbmEgZGUgbGFzIG1hbmVyYXMgbcOhcyBkaXJlY3RhcyBlcyBjb24gbGEgbGlicmVyw61hIGBSbWlzY2AuCkVzdGEgbGlicmVyw61hIHRpZW5lIGVsIGNvbWFuZG8gYGdyb3VwLkNJYCwgcXVlIGNhbGN1bGEgbGEgbWVkaWEsIGVsIGzDrW1pdGUgaW5mZXJpb3IgeSBzdXBlcmlvciBkZSB1bmEgdmFyaWFibGUgcG9yIGdydXBvcyBkZSBvdHJhIHZhcmlhYmxlLgpFc3RhIHRhYmxhIHNlIGd1YXJkYSBlbiB1biBvYmpldG8gbGxhbWFkbyAiZ29scGUiLgpFc3RlIGNvbWFuZG8gbm8gaW5jbHV5ZSBsYXMgZmlsYXMgZGUgbG9zIHBhw61zZXMgZG9uZGUgbm8gaGF5IGRhdG9zLCBwb3IgbG8gcXVlIG5vIGhheSBmaWxhcyBkZSBDb3N0YSBSaWNhIG5pIGRlIEd1eWFuYS4KCmBgYHtyIGljIHRvbGVyYW5jaWEgcG9yIHBhaXN9CmxpYnJhcnkoUm1pc2MpCmdvbHBlID0gZ3JvdXAuQ0koamMxNWFyfnBhaXNlcywgbGFwb3AyMSkKZ29scGUKYGBgCgpDb24gZXN0YSB0YWJsYSBwb2RlbW9zIHJlcGxpY2FyIGVsIGdyw6FmaWNvIDEuNyBjb24gbGEgbGlicmVyw61hIGBnZ3Bsb3QyYC4KUGFyYSBpbmNsdWlyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBzZSB0aWVuZSBxdWUgYWdyZWdhciBsYSBlc3BlY2lmaWNhY2nDs24gYGdlb21fZXJyb3JiYXIoKWAuCkxhIHRhYmxhICJnb2xwZSIgdGllbmUgZWwgZGF0byBkZSAieW1pbiIgZW4gbGEgY29sdW1uYSAiamMxNWFyLmxvd2VyIiB5IGVsIGRhdG8gZGUgInltYXgiIGVuIGxhIGNvbHVtbmEgImpjMTVhci51cHBlciIuCkVzdG9zIGRhdG9zIHNlIGRlYmVuIGluZ3Jlc2FyIGVuIGxhIGVzcGVjaWZpY2FjacOzbiBgYWVzYCBkZW50cm8gZGUgYGdlb21fZXJyb3JiYXJgLgpBZGVtw6FzLCBzZSB0aWVuZSBjb21vIG9wY2lvbmVzIGB3aWR0aGAgcGFyYSBlc3BlY2lmaWNhciBlbCBhbmNobyBkZSBsYXMgYmlnb3RlcyBkZSBsYXMgYmFycmFzIGRlIGVycm9yLCBgY29sb3JgIHBhcmEgZXNwZWNpZmljYXIgZWwgY29sb3IsIGBjZXhgIHBhcmEgZXNwZWNpZmljYXIgZWwgYW5jaG8gZGUgbGFzIGzDrW5lYXMgeSBgbGluZXR5cGVgIHBhcmEgZXNwZWNpZmljYXIgZWwgdGlwbyBkZSBsw61uZWFzLCBlbiBlc3RlIGNhc28gcHVudHVhZGFzLgoKUGFyYSBwb2RlciBvcmRlbmFyIGxhcyBiYXJyYXMgZGUgYWN1ZXJkbyBhbCB2YWxvciBkZSBsYSB2YXJpYWJsZSwgc2UgcHVlZGUgdXNhciBsYSBlc3BlY2lmaWNhY2nDs24gYHJlb3JkZXIoZ3J1cG8sIHZhcmlhYmxlKWAgZGVudHJvIGRlIGxhIGVzcGVjaWZpY2FjacOzbiBgYWVzYCBkZSBgZ2dwbG90YC4KCmBgYHtyIGdyYWZpY28gdG9sZXJhbmNpYSBwb3IgcGFpc30KbGlicmFyeShnZ3Bsb3QyKQpncmFmMSA9IGdncGxvdChnb2xwZSwgYWVzKHg9cmVvcmRlcihwYWlzZXMsIC1qYzE1YXIubWVhbiksIHk9amMxNWFyLm1lYW4pKSsKICBnZW9tX2Jhcih3aWR0aD0wLjUsIGZpbGw9ImRhcmtzbGF0ZWdyYXkzIiwgY29sb3VyPSIjNjliM2EyIiwgc3RhdD0iaWRlbnRpdHkiKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWpjMTVhci5sb3dlciwgeW1heD1qYzE1YXIudXBwZXIpLCB3aWR0aD0wLjQsIAogICAgICAgICAgICAgICAgY29sb3I9ImRhcmtjeWFuIiwgY2V4PTAuNCwgbGluZXR5cGU9MykrCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZShyb3VuZChqYzE1YXIubWVhbiwgMSksICIlIikpLCB2anVzdD0tNC40LCBzaXplPTIuNSkrCiAgeGxhYigiUGHDrXMiKSArIHlsYWIoIlRvbGVyYW5jaWEgYSBnb2xwZXMgZWplY3V0aXZvcyAoJSkiKSsKICB5bGltKDAsIDYwKQpncmFmMQpgYGAKCkVzdG9zIGRhdG9zLCBzaW4gZW1iYXJnbywgbm8gc29uIGV4YWN0YW1lbnRlIGlndWFsZXMgYSBsb3MgcHJlc2VudGFkb3MgZW4gZWwgZ3LDoWZpY28gMS43IGRlYmlkbyBhIHF1ZSBlc3RvcyBjw6FsY3Vsb3Mgbm8gaW5jbHV5ZW4gZWwgZWZlY3RvIGRlIGRpc2XDsW8uCk3DoXMgYWRlbGFudGUsIHNlIHZlcsOhIGPDs21vIGluY2x1aXIgZWwgZWZlY3RvIGRlIGRpc2XDsW8gcGFyYSByZXBsaWNhciBlbCBncsOhZmljbyBleGFjdGFtZW50ZS4KCiMgU2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYQoKRWwgZ3LDoWZpY28gMy45IGRlbCByZXBvcnRlIEVsIFB1bHNvIGRlIGxhIERlbW9jcmFjaWEgZGUgbGEgcm9uZGEgMjAxOC8xOSBwcmVzZW50YSBlbCBwb3JjZW50YWplIGRlIGVudHJldmlzdGFkb3MgcXVlIGVzdMOhIHNhdGlzZmVjaG8gY29uIGxhIGRlbW9jcmFjaWEgcG9yIHRpcG8gZGUgdXN1YXJpb3MgZGUgcmVkZXMgc29jaWFsZXMuCkVsIHBvcmNlbnRhamUgZXN0w6EgbWFyY2FkbyBjb21vIHVuIHB1bnRvIHkgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBjb21vIHVuIMOhcmVhIGdyaXMgYWxyZWRlZG9yIGRlIGVzdG9zIHB1bnRvcy4KCiFbXShHcmFmMy45LnBuZyl7d2lkdGg9IjQxMyJ9CgpMYSB2YXJpYWJsZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHNlIGxsYW1hICJwbjQiIHkgZXN0w6EgY29kaWZpY2FkYSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgoKMS4gIE11eSBzYXRpc2ZlY2hvCjIuICBTYXRpc2ZlY2hvCjMuICBJbnNhdGlzZmVjaG8KNC4gIE11eSBpbnNhdGlzZmVjaG8KCkxhIG5vdGEgMjEgZGUgZXN0ZSByZXBvcnRlIGluZGljYSBxdWUgIlNlIGNvZGlmaWNhIGEgbG9zIGVudHJldmlzdGFkb3MgcXVlIHNlbGVjY2lvbmFuICgxKSBvICgyKSBjb21vIHNhdGlzZmVjaG9zIGNvbiBsYSBkZW1vY3JhY2lhIi4KUG9yIGxvIHRhbnRvLCBzZSB0aWVuZSBxdWUgcmVjb2RpZmljYXIgZXN0YSB2YXJpYWJsZS4KRW4gZXN0ZSBjYXNvIHNlIHVzYSBlbCBjb21hbmRvIGByZWNvZGVgIHkgc2UgdGFidWxhLCBtZWRpYW50ZSBgdGFibGVgLCBwYXJhIHZlcmlmaWNhciBsYSByZWNvZGlmaWNhY2nDs24uCgpgYGB7ciByZWNvZGlmaWNhciBzYXRpc2ZhY2Npb24sIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoY2FyKQp0YWJsZShsYXBvcDE4JHBuNCkKbGFwb3AxOCRwbjRyciA9IGNhcjo6cmVjb2RlKGxhcG9wMTgkcG40LCAiMToyPTEwMDsgMzo0PTAiKQp0YWJsZShsYXBvcDE4JHBuNHJyKQpgYGAKCkxhIG51ZXZhIHZhcmlhYmxlICJwbjRyciIgZXMgdW5hIHZhcmlhYmxlIGR1bW15LgpFbiBlc3RlIHRpcG8gZGUgdmFyaWFibGVzLCBsYSBtZWRpYSBjb3JyZXNwb25kZSBhIGxhIHByb3BvcmNpw7NuIGRlIHJlc3B1ZXN0YXMgMTAwLgpFcyBkZWNpciwgc2kgY2FsY3VsYW1vcyBsYSBtZWRpYSBkZSBlc3RhIHZhcmlhYmxlLCBzZSBlc3TDoSBjYWxjdWxhbmRvIGVsIHBvcmNlbnRhamUgcGFyYSB0b2RvcyBsb3MgZW50cmV2aXN0YWRvcy4KRW4gZXN0YSBzZWNjacOzbiB2YW1vcyBhIHRyYXRhciBhIGVzdGEgdmFyaWFibGUgY29tbyBzaSBmdWVyYSB1bmEgdmFyaWFibGUgbnVtw6lyaWNhLgpFbiBzZW50aWRvIGVzdHJpY3RvIGVzIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSBub21pbmFsLgpMb3MgY8OhbGN1bG9zIGRlIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgeSBsdWVnbyBkZSBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSwgcG9yIGxvIHRhbnRvLCBzb24gcmVmZXJlbmNpYWxlcy4KCmBgYHtyIGRlc2NyaWJpciBzYXRpc2ZhY2Npb259CnN1bW1hcnkobGFwb3AxOCRwbjRycikKYGBgCgpFc3RvcyByZXN1bHRhZG9zIG11ZXN0cmFuIHVuYSBtZWRpYSBkZSAzOS41LCBlcyBkZWNpciBlbCAzOS41JSBkZSBsb3MgZW50cmV2aXN0YWRvcyBlc3TDoW4gc2F0aXNmZWNob3MgY29uIGxhIGRlbW9jcmFjaWEuClNlIHB1ZWRlIGNhbGN1bGFyIHRhbWJpw6luIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgZXN0YSB2YXJpYWJsZSBkZSB2YXJpYXMgZm9ybWFzLgpVbmEgcHJpbWVyYSBlcyBtZWRpYW50ZSBsYSBwcnVlYmEgdCBkZSB1bmEgbXVlc3RyYSwgdXNhbmRvIGVsIGNvbWFuZG8gYHQudGVzdGAuCk90cmEgZm9ybWEgZXMgdXNhbmRvIGVsIGNvbWFuZG8gYGNpTWVhbmAgZGUgbGEgbGlicmVyw61hIGBsc3JgLgoKYGBge3IgaWMgc2F0aXNmYWNjaW9ufQp0LnRlc3QobGFwb3AxOCRwbjRycikKbGlicmFyeShsc3IpCmNpTWVhbihsYXBvcDE4JHBuNHJyLCBuYS5ybT1UKQpgYGAKCkVzdG9zIHJlc3VsdGFkb3MgaW5kaWNhbiBxdWUgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBsYSBtZWRpYSBkZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHZhcsOtYSBlbnRyZSAzOC45JSB5IDQwLjElIGNvbiA5NSUgZGUgY29uZmlhbnphLgpTZSBwb2Ryw61hIGNhbWJpYXIgZXN0ZSB2YWxvciBwb3IgZGVmZWN0byBhIDk5JSBkZSBjb25maWFuemEgYWdyZWdhbmRvIGxhIGVzcGVjaWZpY2FjacOzbiBgY29uZiA9IDAuOTlgIGFsIGNvbWFuZG8gYGNpTWVhbmAuCgojIyBTYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvciBncnVwb3MgZGUgY29uc3VtbyBkZSBpbmZvcm1hY2nDs24gZW4gcmVkZXMgc29jaWFsZXMKCkVsIGluZm9ybWUgdXNhIHVuYSB2YXJpYWJsZSBxdWUgbWlkZSBsYSAiZXhwb3NpY2nDs24gZnJlY3VlbnRlIGEgaW5mb3JtYWNpw7NuIHBvbMOtdGljYSIuCkVzdGEgdmFyaWFibGUgc2UgY29uc3RydXllIGRlIHVuYSBtYW5lcmEgY29tcGxlamEsIHNvYnJlIGxhIGJhc2UgZGUgbGFzIDMgcmVkZXMgc29jaWFsZXMgcG9yIGxhcyBxdWUgc2UgcHJlZ3VudGEuCkVuIGVzdGUgY2FzbyB2YW1vcyBhIGVtcGV6YXIgY29uIHVuYSByZWNvZGlmaWNhY2nDs24gbcOhcyBzaW1wbGUgcGFyYSByZWNyZWFyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSBsYSB2YXJpYWJsZSAic2F0aXNmYWNjacOzbiBkZSBsYSBkZW1vY3JhY2lhIiBwb3IgZ3J1cG8gZGUgZnJlY3VlbmNpYSBkZSBjb25zdW1vIGRlIGluZm9ybWFjacOzbiBkZSBjYWRhIHJlZCBzb2NpYWwuCkx1ZWdvIHNlIHByb2NlZGVyw6EgYSByZXBsaWNhciBsYSB2YXJpYWJsZSBxdWUgc2UgdXNhIGVuIGVsIHJlcG9ydGUuCkxhIGZyZWN1ZW5jaWEgZGUgY29uc3VtbyBkZSBpbmZvcm1hY2nDs24gKHZhcmlhYmxlcyAic21lZGlhMiIgcGFyYSBGYWNlYm9vaywgInNtZWRpYTUiIHBhcmEgVHdpdHRlciB5ICJzbWVkaWE4IiBwYXJhIFdoYXRzYXBwKSBkZSBjYWRhIHJlZCBzb2NpYWwgc2UgbWlkZSBlbiBsYSBzaWd1aWVudGUgZXNjYWxhOgoKMS4gIERpYXJpYW1lbnRlCjIuICBBbGd1bmFzIHZlY2VzIGEgbGEgc2VtYW5hCjMuICBBbGd1bmFzIHZlY2VzIGFsIG1lcwo0LiAgQWxndW5hcyB2ZWNlcyBhbCBhw7FvCjUuICBOdW5jYQoKVmFtb3MgYSByZWNvZGlmaWNhciBlc3RhcyB2YXJpYWJsZXMgZGUgdGFsIG1hbmVyYSBxdWUgYXF1ZWxsb3MgcXVlIHJlc3BvbmRlbiBkaWFyaWFtZW50ZSBvIGFsZ3VuYXMgdmVjZXMgYSBsYSBzZW1hbmEgc2Vyw6FuIGNsYXNpZmljYWRvcyBjb21vIGRlICJhbHRvIHVzbyIsIGFxdWVsbG9zIHF1ZSByZXNwb25kZW4gZGVsIDMgYWwgNCBzZXLDoW4gY2xhc2lmaWNhZG9zIGNvbW8gZGUgImJham8gdXNvIiB5IGFxdWVsbG9zIHF1ZSByZXNwb25kZW4gIm51bmNhIiBzZXLDoW4gY2xhc2lmaWNhZG9zIGNvbW8gIm5vIHVzdWFyaW9zIi4KVW4gZXNxdWVtYSBzaW1pbGFyIGRlIGNsYXNpZmljYWNpw7NuIHNlIHVzYSBwYXJhIGRlZmluaXIgYSBsb3MgdXN1YXJpb3MgZGUgbGFzIDMgcmVkZXMgc29jaWFsZXMuCkxhcyBudWV2YXMgdmFyaWFibGVzIHJlY29kaWZpY2FkYXMsIHNlIGNvbnZpZXJ0ZW4gYSBmYWN0b3IgeSBzZSBldGlxdWV0YW4uCgpgYGB7ciByZWNvZGlmaWNhY2lvbiByZWRlc30KdGFibGUobGFwb3AxOCRzbWVkaWEyKQp0YWJsZShsYXBvcDE4JHNtZWRpYTUpCnRhYmxlKGxhcG9wMTgkc21lZGlhOCkKbGFwb3AxOCRzbWVkaWEyciA9IGNhcjo6cmVjb2RlKGxhcG9wMTgkc21lZGlhMiwgIjE6Mj0xOyAzOjQ9MjsgNT0zIikKbGFwb3AxOCRzbWVkaWE1ciA9IGNhcjo6cmVjb2RlKGxhcG9wMTgkc21lZGlhNSwgIjE6Mj0xOyAzOjQ9MjsgNT0zIikKbGFwb3AxOCRzbWVkaWE4ciA9IGNhcjo6cmVjb2RlKGxhcG9wMTgkc21lZGlhOCwgIjE6Mj0xOyAzOjQ9MjsgNT0zIikKbGFwb3AxOCRzbWVkaWEyciA9IGFzLmZhY3RvcihsYXBvcDE4JHNtZWRpYTJyKQpsYXBvcDE4JHNtZWRpYTVyID0gYXMuZmFjdG9yKGxhcG9wMTgkc21lZGlhNXIpCmxhcG9wMTgkc21lZGlhOHIgPSBhcy5mYWN0b3IobGFwb3AxOCRzbWVkaWE4cikKbGV2ZWxzKGxhcG9wMTgkc21lZGlhMnIpID0gYygiQWx0byB1c28iLCAiQmFqbyB1c28iLCAiTm8gdXN1YXJpbyIpCmxldmVscyhsYXBvcDE4JHNtZWRpYTVyKSA9IGMoIkFsdG8gdXNvIiwgIkJham8gdXNvIiwgIk5vIHVzdWFyaW8iKQpsZXZlbHMobGFwb3AxOCRzbWVkaWE4cikgPSBjKCJBbHRvIHVzbyIsICJCYWpvIHVzbyIsICJObyB1c3VhcmlvIikKdGFibGUobGFwb3AxOCRzbWVkaWEycikKdGFibGUobGFwb3AxOCRzbWVkaWE1cikKdGFibGUobGFwb3AxOCRzbWVkaWE4cikKYGBgCgpDb24gZXN0YXMgdmFyaWFibGVzIHJlY29kaWZpY2FkYXMsIHNlIHB1ZWRlIGNhbGN1bGFyIGxhcyBtZWRpYXMgKHF1ZSBzb24gbG9zIHBvcmNlbnRhamVzKSBkZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvciBjYWRhIGdydXBvIGRlIGNvbnN1bW8gZGUgaW5mb3JtYWNpw7NuIGVuIHJlZGVzIHNvY2lhbGVzLgoKVW5hIG9wY2nDs24gcXVlIHBlcm1pdGUgbW9zdHJhciBtdWNob3MgZXN0YWTDrXN0aWNvcyBwb3IgY2FkYSBncnVwbyBlcyBgZGVzY3JpYmVCeWAgZGUgbGEgbGlicmVyw61hIGBwc3ljaGAuCkVsIGPDs2RpZ28gcGFyYSBUd2l0dGVyIGVzOgoKYGBge3IgbWVkaWFwb3JyZWRlczMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkocHN5Y2gpCmRlc2NyaWJlQnkobGFwb3AxOCRwbjRyciwgZ3JvdXA9bGFwb3AxOCRzbWVkaWE1cikKYGBgCgpTaW4gZW1iYXJnbywgbG8gcXVlIG5vcyBpbnRlcmVzYSBlcyBjYWxjdWxhciBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcGFyYSBjYWRhIGdydXBvLgpFbiBlbCBncsOhZmljbyAzLjkgZGVsIHJlcG9ydGUgc2UgcHJlc2VudGEgbGEgbWVkaWEgZGUgc2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYSwgbW9zdHJhZG8gY29tbyB1biBwdW50bywgeSBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgZGUgY2FkYSBncnVwbywgbW9zdHJhZG9zIGNvbW8gdW4gw6FyZWEgZ3JpcyBjb24gbMOtbWl0ZXMgaW5mZXJpb3IgeSBzdXBlcmlvci4KU2UgcHVlZGUgdXNhciBsYSBsaWJyZXLDrWEgYFJtaXNjYCB5IGVsIGNvbWFuZG8gYGdyb3VwLkNJYCBwYXJhIGNhbGN1bGFyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSBsYSB2YXJpYWJsZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvciBncnVwb3MgZGUgY29uc3VtbyBkZSBpbmZvcm1hY2nDs24gZW4gRmFjZWJvb2suCgpgYGB7ciBjaXBvcmdydXBvLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KFJtaXNjKQpncm91cC5DSShwbjRycn5zbWVkaWEyciwgbGFwb3AxOCkKYGBgCgpDb24gZXN0b3MgZGF0b3MsIHBvciBlamVtcGxvLCBsYSBtZWRpYSBkZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIGVudHJlIGVsIGdydXBvIGRlIGFsdG8gdXNvIGRlIGluZm9ybWFjacOzbiBlbiBGYWNlYm9vayBlcyAzNy42JS4KRWwgbMOtbWl0ZSBpbmZlcmlvciBkZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBlcyAzNi43JSB5IGVsIGzDrW1pdGUgc3VwZXJpb3IgZXMgMzguNCUuCkNvbiBlc3RvcyBkYXRvcyBzZSBwb2Ryw61hIHJlcGxpY2FyIHVuIGdyw6FmaWNvIGRlIGJhcnJhcyBzaW1pbGFyIGFsIDMuOS4KCiMjIEludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIHNhdGlzZmFjY2nDs24gY29uIGxhIGRlbW9jcmFjaWEKCkxhIGZvcm1hIG3DoXMgZsOhY2lsIGRlIGdyYWZpY2FyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwb3IgZ3J1cG9zIGVzIHVzYW5kbyBlbCBjb21hbmRvIGBwbG90bWVhbnNgLgoKYGBge3IgZ3JhZnhncnVwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGdwbG90cykKcGxvdG1lYW5zKGxhcG9wMTgkcG40cnJ+bGFwb3AxOCRzbWVkaWE1ciwKICAgICAgICAgIHhsYWI9IlRpcG8gZGUgdXN1YXJpbyBkZSBUd2l0dGVyIiwKICAgICAgICAgIHlsYWI9IlNhdGlzZmFjY2nDs24gY29uIGxhIGRlbW9jcmFjaWEiLAogICAgICAgICAgeWxpbT1jKDAsIDUwKSwKICAgICAgICAgIG1lYW4ubGFiZWxzPVQsIGRpZ2l0cz0xLAogICAgICAgICAgY29ubmVjdD1GCiAgICAgICAgICkKYGBgCgpFc3RhIG9wY2nDs24gbXVlc3RyYSBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcGVybyBzZSBkaWZpY3VsdGEgc2kgc2UgcXVpZXJlIGdyYWZpY2FyIGxhcyBiYXJyYXMuCkxhIGxpYnJlcsOtYSBgZ2dwbG90YCBub3MgYnJpbmRhIG3DoXMgb3BjaW9uZXMgeSBub3MgcGVybWl0ZSBncmFmaWNhciBkZSBtYW5lcmEgc2ltaWxhciBhbCBncsOhZmljbyAzLjkgZGVsIHJlcG9ydGUsIGVuIGJhcnJhcywgcHJlc2VudGFyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSB5IGFncmVnYXIgY29sb3IuClBhcmEgZXN0bywgcHJpbWVybyBzZSBndWFyZGEgdW4gZGF0YWZyYW1lICJ0dy51c28iIGNvbiBsb3MgZGF0b3MgZGUgbGEgbWVkaWEgeSBsb3MgbMOtbWl0ZXMgc3VwZXJpb3IgZSBpbmZlcmlvciBkZSBjYWRhIGdydXBvLCB1c2FuZG8gZWwgY29tYW5kbyBgZ3JvdXAuQ0lgLgpTb24gbG9zIGRhdG9zIGRlIGVzdGUgZGF0YWZyYW1lIGxvcyBxdWUgc2UgdXNhbiBjb24gYGdncGxvdGAgeSBzZSBjcmVhIHVuIGdyw6FmaWNvIHF1ZSBzZSBndWFyZGEgZW4gdW4gb2JqZXRvICJncmFmMSIuCkNvbiBlc3RhIGxpYnJlcsOtYSBzZSBhZ3JlZ2EgbGEgY2FwYSBgZ2VvbV9iYXIoKWAgcGFyYSBkZWZpbmlyIHF1ZSBzZSBxdWllcmUgdW4gZ3LDoWZpY28gZGUgYmFycmFzIGRlIGxhcyB2YXJpYWJsZXMgZXNwZWNpZmljYWRhcyBlbiBgYWVzYC4KTHVlZ28sIHNlIGFncmVnYSBsYSBjYXBhIGBnZW9tX2Vycm9yYmFyKClgIHBhcmEgYWdyZWdhciBsYXMgYmFycmFzIGRlIGVycm9yIHkgbHVlZ28gbG9zIHZhbG9yZXMgZGUgbGEgbWVkaWEgY29uIGBnZW9tX3RleHQoKWAuCkZpbmFsbWVudGUsIHNlIGV0aXF1ZXRhIGVsIGVqZSBYIHkgWSBjb24gYHhsYWJgIHkgYHlsYWJgIHkgc2UgZGVmaW5lIGxvcyBsw61taXRlcyBkZWwgZWplIFkgY29uIGB5bGltYC4KCmBgYHtyIGdyYWZ4Z3J1cDIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnR3LnVzbyA9IGdyb3VwLkNJKHBuNHJyfnNtZWRpYTVyLCBsYXBvcDE4KQpsaWJyYXJ5KGdncGxvdDIpCmdyYWYyID0gZ2dwbG90KHR3LnVzbywgYWVzKHg9c21lZGlhNXIsIHk9cG40cnIubWVhbikpKwogIGdlb21fYmFyKHdpZHRoPTAuNSwgZmlsbD0iZGFya2N5YW4iLCBjb2xvdXI9ImJsYWNrIiwgc3RhdD0iaWRlbnRpdHkiKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXBuNHJyLmxvd2VyLCB5bWF4PXBuNHJyLnVwcGVyKSwgd2lkdGg9MC4yKSsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlKHJvdW5kKHBuNHJyLm1lYW4sIDEpLCAiJSIpKSwgdmp1c3Q9LTQuMiwgc2l6ZT00KSsKICB4bGFiKCJUaXBvIGRlIHVzdWFyaW8gZGUgVHdpdHRlciIpICsgeWxhYigiU2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYSAoJSkiKSsKICB5bGltKDAsIDUwKQpncmFmMgpgYGAKClNlZ8O6biBlc3RvcyByZXN1bHRhZG9zLCBsYSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIGVzIG3DoXMgYWx0YSBlbiBhcXVlbGxvcyBxdWUgbm8gc29uIHVzdWFyaW9zIGRlIFR3aXR0ZXIsIGVuIGNvbXBhcmFjacOzbiBjb24gbG9zIHVzdWFyaW9zLCBhdW5xdWUgbGFzIGRpZmVyZW5jaWFzIG5vIHNvbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcyBkZSB1bmEgY29tcGFyYWNpw7NuIHZpc3VhbCBlbnRyZSBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEuCgojIyBTYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvciB0aXBvIGRlIHVzdWFyaW8gZGUgcmVkZXMgc29jaWFsZXMKCkhhc3RhIGVsIG1vbWVudG8gc2UgaGEgY3JlYWRvIGludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIHNhdGlzZmFjY2nDs24gY29uIGxhIGRlbW9jcmFjaWEgcG9yIHRpcG8gZGUgdXN1YXJpb3MgZGUgVHdpdHRlci4KRWwgcmVwb3J0ZSBhZ3JlZ2EgYSBsb3MgdXN1YXJpb3MgZGUgbGFzIHRyZXMgcmVkZXMgc29jaWFsZXMgcGFyYSB1YmljYXIgdHJlcyB0aXBvcyBkZSB1c3VhcmlvczogdXN1YXJpb3MgZGUgYWx0byB1c28sIGRlIGJham8gdXNvIHkgbm8gdXN1YXJpb3MgZGUgY3VhbHF1aWVyIHJlZCBzb2NpYWwuCkxhIGZvcm1hIGRlIGNvZGlmaWNhY2nDs24gZGUgZXN0ZSB0aXBvIGRlIHVzdWFyaW9zIGRlIHRyZXMgcmVkZXMgc29jaWFsZXMgc2UgYmFzYSBlbiB2YXJpYXMgY29uZGljaW9uZXMuCkNvbW8gZGljZSBlbCByZXBvcnRlOiAiVXNhbW9zIGxhIG1pc21hIGNvZGlmaWNhY2nDs24gcXVlIGVuIGxhIGFudGVyaW9yIHNlY2Npw7NuLCBwYXJhIGRpc3Rpbmd1aXIgZW50cmUgcXVpZW5lcyBhY2NlZGVuIGNvbiBmcmVjdWVuY2lhIGVuIHJlZGVzIHNvY2lhbGVzIChhcXVlbGxvcyBjb24gY3VlbnRhcyBhIGxhcyBxdWUgYWNjZWRlbiBhbGd1bmFzIHZlY2VzIGEgbGEgc2VtYW5hIG8gYSBkaWFyaW8pIHkgYXF1ZWxsb3MgcXVlIG5vIGFjY2VkZW4gYSBsYXMgcmVkZXMgc29jaWFsZXMgbXV5IGZyZWN1ZW50ZW1lbnRlIChhcXVlbGxvcyBjb24gY3VlbnRhcyBhIGxhcyBxdWUgYWNjZWRlbiBhbGd1bmFzIHZlY2VzIGFsIG1lcyBvIGFsZ3VuYXMgdmVjZXMgYWwgYcOxbykuIFRhbWJpw6luIGluY2x1aW1vcyBhIHF1aWVuZXMgbm8gc29uIHVzdWFyaW9zOiBxdWllbmVzIG5vIHRpZW5lbiBuaW5ndW5hIGN1ZW50YSBlbiByZWRlcyBzb2NpYWxlcyAocXVpZW5lcyBpbmRpY2FuIHF1ZSBubyB0aWVuZW4gdW5hIGN1ZW50YSBlbiBGYWNlYm9vaywgVHdpdHRlciBvIFdoYXRzYXBwKSB5IHF1aWVuZXMgdGllbmVuIHVuYSBjdWVudGEsIHBlcm8gbnVuY2EgbGEgdXNhbiIgKHAuODEpLgpFbiBwcmltZXIgbHVnYXIgaWRlbnRpZmljYW1vcyBhIHF1aWVuZXMgdXNhbiBjYWRhIHJlZCBzb2NpYWwgYWxndW5hcyB2ZWNlcyBhIGxhIHNlbWFuYSBvIGEgZGlhcmlvIGNvbW8gMSB5IHNpIHVzYW4gY2FkYSByZWQgc29jaWFsIGFsZ3VuYXMgdmVjZXMgYWwgbWVzIG8gYWxndW5hcyB2ZWNlcyBhbCBhw7FvLCBjb21vIDAuClBhcmEgZXN0byB1c2Ftb3MgZWwgY29tYW5kbyBgaWZlbHNlYC4KTHVlZ28sIHN1bWFtb3MgbG9zIHZhbG9yZXMgZGUgY2FkYSByZWQgc29jaWFsIGVuIHVuYSBzb2xhIHZhcmlhYmxlLCBjb24gdmFsb3JlcyBlbnRyZSAwIHkgMy4KU2UgdXNhIGVsIGNvbWFuZG8gYHJvd1N1bXNgIHF1ZSBwZXJtaXRlIGxhIHN1bWEgaG9yaXpvbnRhbCBkZSB2YXJpYWJsZXMgZGVmaW5pZGFzLCBlbiBlc3RlIGNhc28gbGFzIHF1ZSBlc3TDoW4gZW4gbGEgcG9zaWNpw7NuIGBbLCA4OTo5MV1gLgpFbiBlc3RlIGNvbWFuZG8sIHVzYW1vcyBsYSBlc3BlY2lmaWNhY2nDs24gYG5hLnJtPVRgIHBhcmEgcXVlIGxhIHN1bWEgbm8gdG9tZSBlbiBjdWVudGEgYSBsb3MgdmFsb3JlcyBwZXJkaWRvcy4KCmBgYHtyIHVzdWFyaW9yZWRlc30KbGFwb3AxOCRzbTIgPSBpZmVsc2UobGFwb3AxOCRzbWVkaWEyPT0xIHwgbGFwb3AxOCRzbWVkaWEyPT0yLCAxLCAwKQpsYXBvcDE4JHNtNSA9IGlmZWxzZShsYXBvcDE4JHNtZWRpYTU9PTEgfCBsYXBvcDE4JHNtZWRpYTU9PTIsIDEsIDApCmxhcG9wMTgkc204ID0gaWZlbHNlKGxhcG9wMTgkc21lZGlhOD09MSB8IGxhcG9wMTgkc21lZGlhOD09MiwgMSwgMCkKbGFwb3AxOCRhbnloaSA9IHJvd1N1bXMobGFwb3AxOFssODk6OTFdLCBuYS5ybT1UKQp0YWJsZShsYXBvcDE4JGFueWhpKQpgYGAKClBhcnRpZW5kbyBkZSBlc3RhIHZhcmlhYmxlLCBzZSBjcmVhIHVuYSB2YXJpYWJsZSBxdWUgYWdyZWdhIGxhcyB0cmVzIHJlZGVzIHNvY2lhbGVzLCBsbGFtYWRhICJoaV9sb19ub24iLgpQcmltZXJvLCBzZSBjcmVhIGVzdGEgdmFyaWFibGUgY29tbyB1biB2ZWN0b3IgZGUgTkFzLgpMdWVnbyBzZSBsZSBpbXB1dGEgdmFsb3JlcyBkZSAxLCAyLCAzIG8gTkEsIGRlcGVuZGllbmRvIGRlIGxvcyB2YWxvcmVzIGRlICJhbnloaSBvIGRlIGxvcyB2YWxvcmVzIGRlIGxhcyB2YXJpYWJsZXMgZGUgcmVkZXMgc29jaWFsZXMuIEx1ZWdvIHNlIGNyZWEgdW5hIG51ZXZhIHZhcmlhYmxlIGRlIHRpcG8gZmFjdG9yLCBjb24gaWTDqW50aWNvcyB2YWxvcmVzIHF1ZSJoaV9sb19ub24iIHkgc2UgZXRpcXVldGEuIExhIGRlZmluaWNpw7NuIGRlIGxhIGNvbmRpY2lvbmFsaWRhZCBzZSB0cmFiYWphIG1lZGlhbnRlIGxvcyBjb3JjaGV0ZXMgYFsuLi5dYC4gRGUgZXN0YSBtYW5lcmEsIHNlIGRlZmluZSBsYXMgY29uZGljaW9uZXMgZGUgbGEgc2lndWllbnRlIG1hbmVyYToKCi0gICBMYSB2YXJpYWJsZSAiaGlfbG9fbm9uIGVzIGlndWFsIGEgMSBzaSBsYSB2YXJpYWJsZSBhbnloaSBlcyBtYXlvciBvIGlndWFsIGEgMSAodXNvIGRpYXJpbyBvIGFsZ3VuYXMgdmVjZXMgYSBsYSBzZW1hbmEpID0gYGxhcG9wMTgkaGlfbG9fbm9uW2xhcG9wMTgkYW55aGk+PTFdIDwtIDFgCgotICAgTGEgdmFyaWFibGUgImhpX2xvX25vbiBlcyBpZ3VhbCBhIDIgc2kgbGEgdmFyaWFibGUgYW55aGkgZXMgaWd1YWwgYSAwICh1c28gYWxndW5hcyB2ZWNlcyBhbCBhw7FvIG8gbnVuY2EpID0gYGxhcG9wMTgkaGlfbG9fbm9uW2xhcG9wMTgkYW55aGk9PTBdIDwtIDJgCgotICAgTGEgdmFyaWFibGUgImhpX2xvX25vbiBlcyBpZ3VhbCBhIDMgc2kgbGFzIHZhcmlhYmxlcyBkZSB0ZW5lbmNpYSBkZSBjdWVudGFzIHNvbiBpZ3VhbCBhIDIgKE5vKSA9IGBsYXBvcDE4JGhpX2xvX25vbltsYXBvcDE4JHNtZWRpYTE9PTIgJiBsYXBvcDE4JHNtZWRpYTQ9PTIgJiBsYXBvcDE4JHNtZWRpYTc9PTJdIDwtIDNgCgpMYXMgc2lndWllbnRlIHJlZ2xhcyBkZSBjb2RpZmljYWNpw7NuIHNpZ3VlbiBsYSBtaXNtYSBsw7NnaWNhIGRlIGNvbWJpbmFjacOzbiBkZSBvdHJhcyB2YXJpYWJsZXMgcGFyYSBpbXB1dGFyIGVsIHZhbG9yIDMgbyBOQS4KCmBgYHtyIGhpbG9ub259CmxhcG9wMTgkaGlfbG9fbm9uID0gTkEgI3NlIGNyZWEgdW4gdmVjdG9yIGNvbiBOQXMjCmxhcG9wMTgkaGlfbG9fbm9uW2xhcG9wMTgkYW55aGk+PTFdID0gMSAjU2UgY29kaWZpY2EgMSBhIGxvcyBxdWUgdXNhbiBkaWFyaWFtZW50ZSBvIGFsZ3VuYXMgdmVjZXMgYSBsYSBzZW1hbmEgYWxndW5hIHJlZCBzb2NpYWwjCmxhcG9wMTgkaGlfbG9fbm9uW2xhcG9wMTgkYW55aGk9PTBdID0gMiAjU2UgY29kaWZpY2EgY29tbyAyIGEgbG9zIHF1ZSB1c2FuIGFsZ3VuYXMgdmVjZXMgYWwgbWVzIHkgYWwgYcOxbyBhbGd1bmEgcmVkIHNvY2lhbCMKbGFwb3AxOCRoaV9sb19ub25bbGFwb3AxOCRzbWVkaWExPT0yICYgbGFwb3AxOCRzbWVkaWE0PT0yICYgbGFwb3AxOCRzbWVkaWE3PT0yXSA9IDMgI1NlIGNvZGlmaWNhIGNvbW8gMyBhIGxvcyBxdWUgbm8gdGllbmUgcmVkZXMgc29jaWFsZXMjCmxhcG9wMTgkaGlfbG9fbm9uW2xhcG9wMTgkc21lZGlhMj09NSAmIGxhcG9wMTgkc21lZGlhNT09NSAmIGxhcG9wMTgkc21lZGlhOD09NV0gPSAzICNTZSBjb2RpZmljYSBjb21vIDMgYSBsb3MgcXVlIG51bmNhIHVzYW4gbmluZ3VuYSByZWQgc29jaWFsIwpsYXBvcDE4JGhpX2xvX25vbltsYXBvcDE4JHBhaXM9PTMgJiAobGFwb3AxOCRzbWVkaWEyPT01IHwgbGFwb3AxOCRzbWVkaWE1PT01IHwgbGFwb3AxOCRzbWVkaWE4PT01KV0gPSAzICNTZSBhcGxpY2EgdW4gY8OzZGlnbyBwYXJ0aWN1bGFyIGEgcGFpcyAzIwpsYXBvcDE4JGhpX2xvX25vbltsYXBvcDE4JHBhaXM9PTMgJiAobGFwb3AxOCRzbWVkaWExPT0yIHwgbGFwb3AxOCRzbWVkaWE0PT0yIHwgbGFwb3AxOCRzbWVkaWE3PT0yKV0gPSAzICNTZSBhcGxpY2EgdW4gY8OzZGlnbyBwYXJ0aWN1bGFyIGEgcGFpcyAzIwpsYXBvcDE4JGhpbG9uID0gYXMuZmFjdG9yKGxhcG9wMTgkaGlfbG9fbm9uKQpsZXZlbHMobGFwb3AxOCRoaWxvbikgPSBjKCJBbHRvIHVzbyIsICJCYWpvIHVzbyIsICJObyB1c3VhcmlvIikKcHJvcC50YWJsZSh0YWJsZShsYXBvcDE4JGhpbG9uKSkqMTAwCmBgYAoKU2Vnw7puIGVzdG9zIGRhdG9zLCBlbCA2NC45JSBkZSBlbnRyZXZpc3RhZG9zIHJlcG9ydGFuIHVuIGFsdG8gdXNvIGRlIHJlZGVzIHNvY2lhbGVzLCBtaWVudHJhcyBxdWUsIGVuIGVsIG90cm8gZXh0cmVtbywgc2UgdGllbmUgMzEuNiUgcXVlIHNlcsOtYW4gbm8gdXN1YXJpb3MgZGUgbmluZ3VuYSByZWQgc29jaWFsLgpFc3RvcyBkYXRvcyBkaWZpZXJlbiB1biBwb2NvIGRlIGxvcyByZXBvcnRhZG9zIGVuIGVsIEFww6luZGljZSBhbCByZXBvcnRlLCBkaXNwb25pYmxlIFthcXXDrV0oaHR0cHM6Ly93d3cudmFuZGVyYmlsdC5lZHUvbGFwb3AvYWIyMDE4L0FwcGVuZGl4X01hdGVyaWFsX2Zvcl8yMDE4LTE5X0FtZXJpY2FzQmFyb21ldGVyX1JlcG9ydC1Db21wYXJhdGl2ZV9DaGFwdGVyc18xMC4xMy4xOS5wZGYpLCBkb25kZSBzZSByZXBvcnRlIDY1LjM0JSBkZSBhbHRvIHVzbyB5IDMxLjYwJSBkZSBubyB1c3Vhcmlvcy4KRXN0YXMgZGlmZXJlbmNpYXMgcHVlZGVuIHNlciBkZWJpZGFzIGEgZGlmZXJlbmNpYXMgZW4gbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxhcyByZWdsYXMgZGUgY29kaWZpY2FjacOzbiBkZXNkZSBTdGF0YSBhIFIuCgpEZSBsYSBtaXNtYSBmb3JtYSBxdWUgc2UgcHJvZHVqbyBlbCBncsOhZmljbyBkZSBtZWRpYSBkZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvciB0aXBvcyBkZSB1c3VhcmlvcyBkZSBUd2l0dGVyIHVzYW5kbyBgZ2dwbG90YCwgYWhvcmEgc2UgaGFyw6EgbG8gbWlzbW8gcGVybyBwYXJhIGxvcyB1c3VhcmlvcyBkZSBsYXMgdHJlcyByZWRlcyBzb2NpYWxlcywgdmFyaWFibGUgImhpbG9uIi4KCmBgYHtyIGdyYWYzLjl9CmxpYnJhcnkoUm1pc2MpCnNhdGlzLnVzbyA9IGdyb3VwLkNJKHBuNHJyfmhpbG9uLCBsYXBvcDE4KQpsaWJyYXJ5KGdncGxvdDIpCmdyYWYzLjkgPSBnZ3Bsb3Qoc2F0aXMudXNvLCBhZXMoeD1oaWxvbiwgeT1wbjRyci5tZWFuKSkrCiAgZ2VvbV9iYXIod2lkdGg9MC41LCBmaWxsPSJkYXJrY3lhbiIsIGNvbG91cj0iYmxhY2siLCBzdGF0PSJpZGVudGl0eSIpKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49cG40cnIubG93ZXIsIHltYXg9cG40cnIudXBwZXIpLCB3aWR0aD0wLjIpKwogIGdlb21fdGV4dChhZXMobGFiZWw9cGFzdGUocm91bmQocG40cnIubWVhbiwgMSksICIlIikpLCB2anVzdD0tMi41LCBzaXplPTQpKwogIHhsYWIoIlRpcG8gZGUgdXN1YXJpbyBkZSByZWRlcyBzb2NpYWxlcyIpICsgeWxhYigiU2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYSAoJSkiKSsKICB5bGltKDAsIDUwKQpncmFmMy45CmBgYAoKRXN0ZSBncsOhZmljbyBzZXLDrWEgdW5hIHJlcHJvZHVjY2nDs24gZGVsIHF1ZSBzZSBwcmVzZW50YSBlbiBlbCBpbmZvcm1lIChHcsOhZmljbyAzLjkgZW4gbGEgcMOhZ2luYSA2MiksIGNvbiB1bmEgbcOtbmltYXMgZGlmZXJlbmNpYXMgcG9yIGNvZGlmaWNhY2nDs24gZGUgbG9zIGRhdG9zIHJlc3VsdGFudGVzLgoKIyBSZXN1bWVuCgpFbiBlc3RlIGRvY3VtZW50byBzZSBoYSB0cmFiYWphZG8gY29uIHVuYSB2YXJpYWJsZSByZWNvZGlmaWNhZGEgZHVtbXkgKHNhdGlzZmFjY2nDs24gY29uIGxhIGRlbW9jcmFjaWEpLCBsYSBxdWUgcHVlZGUgc2VyIHRyYWJhamFkYSBjb21vIHZhcmlhYmxlIG51bcOpcmljYSBwYXJhIGVsIGPDoWxjdWxvIGRlIGludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIHByb3BvcmNpb25lcy4KQ29uIGVzdGEgdmFyaWFibGUgc2UgaGEgY2FsY3VsYWRvIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgbGEgbWVkaWEsIHF1ZSBzZXLDrWEgZWwgZGUgbGEgcHJvcG9yY2nDs24gZGUgZW50cmV2aXN0YWRvcyBxdWUgZXN0w6FuIHNhdGlzZmVjaG9zIGNvbiBsYSBkZW1vY3JhY2lhLgpMdWVnbywgc2UgaGEgZGVzY3JpdG8gZXN0YSB2YXJpYWJsZXMgcG9yIGdydXBvcyBkZSB1bmEgdmFyaWFibGUgZGUgZmFjdG9yIChjb25zdW1vIGRlIGluZm9ybWFjacOzbiBwb2zDrXRpY2EpLgpTZSBoYSBwcmVzZW50YWRvIGPDs21vIGNhbGN1bGFyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSBsYSB2YXJpYWJsZSBudW3DqXJpY2EgcG9yIGdydXBvcyBkZSBsYSB2YXJpYWJsZSBkZSBmYWN0b3IuCkZpbmFsbWVudGUsIHNlIGhhIHByZXNlbnRhZG8gY8OzbW8gZ3JhZmljYXIgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIHBvciBncnVwb3MuCgojIEPDoWxjdWxvcyBpbmNsdXllbmRvIGVsIGVmZWN0byBkZSBkaXNlw7FvCgojIyBSZXN1bHRhZG9zIGRlIHRvbGVyYW5jaWEgYSBsb3MgZ29scGVzIGVqZWN1dGl2b3MgcG9uZGVyYWRvcwoKQ29tbyBzZSBtZW5jaW9uw7MsIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBhY2VyY2EgZGUgbGEgdG9sZXJhbmNpYSBkZSBsb3MgZ29scGVzIGVqZWN1dGl2b3MsIGdyw6FmaWNvIDEuNyBkZWwgcmVwb3J0ZSBFbCBQdWxzbyBkZSBsYSBEZW1vY3JhY2lhIDIwMjEsIG5vIHNvbiBpZ3VhbGVzIGEgbG9zIG9idGVuaWRvcyBhcXXDrS4KRXN0byBlcyBkZWJpZG8gYSBxdWUgbG9zIGPDoWxjdWxvcyBkZSBtw6FzIGFycmliYSBubyBpbmNsdXllIGVsIGVmZWN0byBkZSBkaXNlw7FvLgoKUGFyYSBwb2RlciByZWFsaXphciBsb3MgY8OhbGN1bG9zIHRvbWFuZG8gZW4gY3VlbnRhIGVsIGVmZWN0byBkZSBkaXNlw7FvLCBzZSBwdWVkZSB1c2FyIGxhIGxpYnJlcsOtYSBgc3VydmV5YCBwYXJhIGRlZmluaXIgZWwgZGlzZcOxbyBtdWVzdHJhbC4KUHJpbWVybywgc2UgdGllbmUgcXVlIGFkZWN1YXIgbGEgYmFzZSBkZSBkYXRvcywgZWxpbWluYW5kbyBsb3MgdmFsb3JlcyBwZXJkaWRvcyBkZSBsYXMgdmFyaWFibGVzIHF1ZSBkZWZpbmVuIGVsIGRpc2XDsW8gbXVlc3RyYWwgKGNvbW8gIndlaWdodDE1MDAiKS4KVW4gcGFzbyBhZGljaW9uYWwgZXMgdHJhbnNmb3JtYXIgbGFzIHZhcmlhYmxlcyBkZWwgZGF0YWZyYW1lLgpFc3RvIGVzIGRlYmlkbyBhIHF1ZSBjdWFuZG8gc2UgaW1wb3J0YW4sIGVsIHNpc3RlbWEgbGVlIGxhcyB2YXJpYWJsZXMgY29tbyB0aXBvICJoYXZlbl9sYWJlbGxlZCIsIGVzIGRlY2lyLCBtYW50aWVuZSBsYXMgZXRpcXVldGFzIGRlIGxhcyB2YXJpYWJsZXMsIGNvbiBsbyBxdWUgc2UgcG9kcsOtYSBwcm9kdWNpciB1biBsaWJybyBkZSBjw7NkaWdvcy4KRXN0byBlcyDDunRpbCBlbiBvdHJhcyBvY2FzaW9uZXMsIHBlcm8gZ2VuZXJhIHByb2JsZW1hcyBjb24gbGEgbGlicmVyw61hIGBzdXJ2ZXlgLgpQYXJhIGVzdG8gdHJhbnNmb3JtYW1vcyBsYXMgdmFyaWFibGVzIGEgb3RybyB0aXBvIGNvbiBlbCBjb21hbmRvIGBzYXBwbHlgLgoKYGBge3IgcHJlcGFyYWNpb24gZGUgYmFzZSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CmxhcG9wMjEgPSBzdWJzZXQobGFwb3AyMSwgIWlzLm5hKHdlaWdodDE1MDApKQpzYXBwbHkobGFwb3AyMSwgaGF2ZW46OnphcF9sYWJlbHMpCmBgYAoKQ29uIGxhIGJhc2UgZGUgZGF0b3MgYWRlY3VhZGEsIHNlIHB1ZWRlIGRlZmluaXIgZWwgZGlzZcOxbyBtdWVzdHJhIHkgc2UgZ3VhcmRhIGVuIHVuIG9iamV0byAiZGlzZW5vMjEiLgoKYGBge3IgZGlzZW5vMjF9CmxpYnJhcnkoc3VydmV5KQpkaXNlbm8yMSA9IHN2eWRlc2lnbihpZHMgPSB+dXBtLCBzdHJhdGEgPSB+c3RyYXRhLCB3ZWlnaHRzID0gfndlaWdodDE1MDAsIG5lc3Q9VFJVRSwgZGF0YT1sYXBvcDIxKQpgYGAKCkxhIGxpYnJlcsOtYSBgc3VydmV5YCB0aWVuZSBjb21hbmRvcyBuYXRpdm9zIHBhcmEgY2FsY3VsYXIgbGEgbWVkaWEgZGUgbGEgdmFyaWFibGUgcmVjb2RpZmljYWRhIGRlIHRvbGVyYW5jaWEgYSBsb3MgZ29scGVzIGVqZWN1dGl2b3MuCkVzdGUgY8OhbGN1bG8gZGUgbGEgbWVkaWEgbm9zIGJyaW5kYSBlbCBwb3JjZW50YWplIGRlIGNpdWRhZGFub3MgZW4gbGEgcmVnacOzbiBxdWUgc29uIHRvbGVyYW50ZXMgYSBsb3MgZ29scGVzIGVqZWN1dGl2b3MuCgpgYGB7ciB0b2xlcmFuY2lhIHBvbmRlcmFkYX0Kc3Z5bWVhbih+amMxNWFyLCBkaXNlbm8yMSwgbmEucm09VCkKYGBgCgpQYXJhIGNhbGN1bGFyIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgZXN0YSBtZWRpZGEgc2UgcHVlZGUgYW5pZGFyIGVsIGNvbWFuZG8gYHN2eW1lYW5gIGRlbnRybyBkZSBvdHJvIGNvbWFuZG8gYGNvbmZpbnRgIHF1ZSBub3MgYnJpbmRhIGVsIGzDrW1pdGUgaW5mZXJpb3IgeSBzdXBlcmlvciBkZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YS4KCmBgYHtyIGljIHRvbGVyYW5jaWEgcG9uZGVyYWRhfQpjb25maW50KHN2eW1lYW4ofmpjMTVhciwgZGlzZW5vMjEsIG5hLnJtPVQpKQpgYGAKClBhcmEgcG9kZXIgcmVwbGljYXIgZWwgZ3LDoWZpY28gMS43IHJlcXVlcmltb3MgZWwgdmFsb3IgZGVsIHBvcmNlbnRhamUgZGUgY2l1ZGFkYW5vcyBxdWUgdG9sZXJhbiBsb3MgZ29scGVzIGVqZWN1dGl2b3MgcG9yIHDDoWlzLCBhc8OtIGNvbW8gZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBjYWRhIHVuby4KUGFyYSBlc3RlIGPDoWxjdWxvLCBwb2RlbW9zIHVzYXIgZWwgY29tYW5kbyBgc3Z5YnlgLgpFc3RlIGNvbWFuZG8gcmVxdWllcmUgZGVmaW5pciBsYSB2YXJpYWJsZSBhIHNlciBjYWxjdWxhZGEgKGB+amMxNWFyYCksIGxhIHZhcmlhYmxlIHF1ZSBkZWZpbmUgbG9zIGdydXBvcyAoYH5wYWlzZXNgKSwgZWwgb2JqZXRvIHF1ZSBndWFyZGEgZWwgZGlzZcOxbyBtdWVzdHJhbCAoYGRpc2VubzIxYCksIGVsIGVzdGFkw61zdGljbyBxdWUgc2UgcXVpZXJlIGNhbGN1bGFyIChgc3Z5bWVhbiwgbmEucm09VGApIHkgZGVmaW5pciBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIChgdmFydHlwZSA9ICJjaSJgKS4KRXN0b3MgY8OhbGN1bG9zIHNlIGd1YXJkYW4gZW4gdW4gb2JqZXRvICJnb2xwZXBvbmQiLgoKYGBge3IgdG9sZXJhbmNpYSBwb3IgcGFpcyBwb25kZXJhZGF9CmdvbHBlcG9uZCA9IHN2eWJ5KH5qYzE1YXIsIH5wYWlzZXMsIGRpc2VubzIxLCBzdnltZWFuLCBuYS5ybT1ULCB2YXJ0eXBlID0gImNpIikKZ29scGVwb25kID0gZ29scGVwb25kWy1jKDYsMjApLF0KYGBgCgpEZSBsYSBtaXNtYSBtYW5lcmEgcXVlIGNvbiBlbCBncsOhZmljbyBjb24gbG9zIHJlc3VsdGFkb3Mgbm8gcG9kZXJhZG9zLCB1c2Ftb3MgbGEgbGlicmVyw61hIGBnZ3Bsb3RgIHBhcmEgcmVwbGljYXIgZWwgZ3LDoWZpY28gMS43LgpTZSBkZWJlIHRvbWFyIGVuIGN1ZW50YSBxdWUgZWwgY29tYW5kbyBgc3Z5YmFyYCBnZW5lcmEgY29sdW1uYXMgY29uIG5vbWJyZSBkaWZlcmVudGVzIGEgbG9zIHF1ZSBzZSBnZW5lcmFuIGNvbiBlbCBjb21hbmRvIGBncm91cC5DSWAgdXNhZG8gbcOhcyBhcnJpYmEuCgpgYGB7ciBncmFmaWNvIHRvbGVyYW5jaWEgcG9uZGVyYWRhfQpncmFmMyA9IGdncGxvdChnb2xwZXBvbmQsIGFlcyh4PXJlb3JkZXIocGFpc2VzLCAtamMxNWFyKSwgeT1qYzE1YXIpKSsKICBnZW9tX2Jhcih3aWR0aD0wLjUsIGZpbGw9ImRhcmtzbGF0ZWdyYXkzIiwgY29sb3VyPSIjNjliM2EyIiwgc3RhdD0iaWRlbnRpdHkiKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWNpX2wsIHltYXg9Y2lfdSksIHdpZHRoPTAuMiwgY29sb3I9ImRhcmtjeWFuIiwKICAgICAgICAgICAgICAgIGNleD0wLjQsIGxpbmV0eXBlPTMpKwogIGdlb21fdGV4dChhZXMobGFiZWw9cGFzdGUocm91bmQoamMxNWFyLCAwKSwgIiUiKSksIHZqdXN0PS00LjQsIHNpemU9Mi41KSsKICB4bGFiKCJQYcOtcyIpICsgeWxhYigiVG9sZXJhbmNpYSBhIGdvbHBlcyBlamVjdXRpdm9zICglKSIpKwogIHlsaW0oMCwgNjApCmdyYWYzCmBgYAoKRGUgZXN0YSBtYW5lcmEgc2UgaGEgcmVwbGljYWRvIGV4YWN0YW1lbnRlIGxvcyByZXN1bHRhZG9zIHJlcG9ydGFkb3MgZW4gRWwgUHVsc28gZGUgbGEgRGVtb2NyYWNpYSAyMDIxLgoKIyMgUmVzdWx0YWRvcyBkZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvbmRlcmFkb3MKCkRlIGxhIG1pc21hIG1hbmVyYSBxdWUgY29uIGxhIHRvbGVyYW5jaWEgYSBsb3MgZ29scGVzIGVqZWN1dGl2b3MsIHNlIHVzYSBsYSBsaWJyZXLDrWEgYHN1cnZleWAgeSBlbCBjb21hbmRvIGBjb25maW50YGp1bnRvIGFsIGNvbWFuZG8gbmF0aXZvIGBzdnltZWFuYC4KCmBgYHtyIGRpc2VubzE4fQpsaWJyYXJ5KHN1cnZleSkKZGlzZW5vMTggPSBzdnlkZXNpZ24oaWRzID0gfnVwbSwgc3RyYXRhID0gfmVzdHJhdG9wcmksIHdlaWdodHMgPSB+d2VpZ2h0MTUwMCwgbmVzdD1UUlVFLCBkYXRhPWxhcG9wMTgpCmBgYAoKU2UgcHVlZGUgZGVzY3JpYmlyIGxhIHZhcmlhYmxlIGRlIHNhdGlzZmFjY2nDs24gY29uIGxhIGRlbW9jcmFjaWEgaW5jb3Jwb3JhbmRvIGVsIGZhY3RvciBkZSBkaXNlw7FvIHVzYW5kbyBlbCBjb21hbmRvIGBzdnltZWFuYC4KCmBgYHtyIHdlaWdodGVkcG40fQpzdnltZWFuKH5wbjRyciwgZGlzZW5vMTgsIG5hLnJtPVQpCmBgYAoKUGFyYSBjYWxjdWxhciBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphLCBzZSB0aWVuZSBxdWUgYW5pZGFyIGVsIGPDs2RpZ28gYW50ZXJpb3IgZGVudHJvIGRlbCBjb21hbmRvIGBjb25maW50YC4KRXN0ZSBjb21hbmRvIGNhbGN1bGEgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBhbCA5NSUgcG9yIGRlZmVjdG8uClNlIHBvZHLDrWEgY2FtYmlhciBlc3RlIHZhbG9yIHBvciBkZWZlY3RvIGEgOTklIGRlIGNvbmZpYW56YSBhZ3JlZ2FuZG8gbGEgZXNwZWNpZmljYWNpw7NuIGBjb25mID0gMC45OWAgYWwgY29tYW5kby4KCmBgYHtyIHdlaWdodGVkY2l9CmNvbmZpbnQoc3Z5bWVhbih+cG40cnIsIGRpc2VubzE4LCBuYS5ybT1UKSkKYGBgCgpUYW1iacOpbiBzZSBwdWVkZSBjYWxjdWxhciBsYSBtZWRpYSB5IGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgc2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYSBpbmNvcnBvcmFuZG8gZWwgZWZlY3RvIGRlIGRpc2XDsW8gdXNhbmRvIGVsIGNvbWFuZG8gYHN2eWJ5YC4KRGVudHJvIGRlIGVzdGUgY29tYW5kbyBzZSBlc3BlY2lmaWNhIGxhIHZhcmlhYmxlIG51bcOpcmljYSBhIHNlciBkZXNjcml0YSAoYH5wbjRycmApLCBsYSB2YXJpYWJsZSBxdWUgZm9ybWEgbG9zIGdydXBvcyAoYH5zbWVkaWE1cmApLCBlbCBkaXNlw7FvIG11ZXN0cmFsIChgZGlzZW5vMThgKSwgbGEgZnVuY2nDs24gcXVlIHNlIHF1aWVyZSBjYWxjdWxhciAoYHN2eW1lYW5gKSwgcXVlIG5vIHRvbWUgZW4gY3VlbnRhIGxvcyB2YWxvcmVzIHBlcmRpZG9zIChgbmEucm09VGApIHkgcXVlIGluY2x1eWEgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBjYWRhIGdydXBvIChgdmFydHlwZT0iY2kiYCkuCgpgYGB7ciB3ZWlnaHRlZGNpeGdydXBvc30KdHcudXNvLndlaWdodGVkID0gc3Z5YnkofnBuNHJyLCB+c21lZGlhNXIsIGRpc2VubzE4LCBzdnltZWFuLCBuYS5ybT1ULCB2YXJ0eXBlID0gImNpIikKdHcudXNvLndlaWdodGVkCmBgYAoKUGFyYSBwb2RlciBncmFmaWNhciwgZXN0b3MgY8OhbGN1bG9zIHNlIGd1YXJkYW4gZW4gdW4gZGF0YWZyYW1lICJ0dy51c28ud2VpZ2h0ZWQiLCBxdWUgaW5jbHV5ZSBsb3MgZGF0b3MgZGUgbGEgbWVkaWEgcG9yIGNhZGEgZ3J1cG8geSBlbCBsw61taXRlIGluZmVyaW9yIHkgc3VwZXJpb3IgZGVsIGludGVydmFsbyBkZSBjb25maWFuemEuCkRlIGxhIG1pc21hIG1hbmVyYSBxdWUgY29uIGxvcyBkYXRvcyBxdWUgbm8gaW5jbHV5ZW4gZWwgZWZlY3RvIGRlIGRpc2XDsW8sIHNlIHVzYSBsYSBsaWJyZXLDrWEgYGdncGxvdGAgeSBzZSBjcmVhIHVuIGdyw6FmaWNvIHF1ZSBzZSBndWFyZGEgZW4gdW4gb2JqZXRvICJncmFmMiIuClNlIHVzYW4gZXNwZWNpZmljYWNpb25lcyBtdXkgc2ltaWxhcmVzIGEgbG9zIGVqZW1wbG9zIGFudGVyaW9yZXMuCgpgYGB7ciB3ZWlnaHRlZGJhcnJhc30KZ3JhZjQgPSBnZ3Bsb3QodHcudXNvLndlaWdodGVkLCBhZXMoeD1zbWVkaWE1ciwgeT1wbjRycikpKwogIGdlb21fYmFyKHdpZHRoPTAuNSwgZmlsbD0iZGFya2N5YW4iLCBjb2xvdXI9ImJsYWNrIiwgc3RhdD0iaWRlbnRpdHkiKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWNpX2wsIHltYXg9Y2lfdSksIHdpZHRoPTAuMikrCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZShyb3VuZChwbjRyciwgMSksICIlIikpLCB2anVzdD0tNC4yLCBzaXplPTQpKwogIHhsYWIoIlRpcG8gZGUgdXN1YXJpbyBkZSBUd2l0dGVyIikgKyB5bGFiKCJTYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhICglKSIpKwogIHlsaW0oMCwgNTApCmdyYWY0CmBgYAoKRXN0b3MgcmVzdWx0YWRvcyBpbmNsdXllbiBlbCBlZmVjdG8gZGUgZGlzZcOxbywgcGVybyBubyBzb24gZXhhY3RhbWVudGUgaWd1YWxlcyBhIGxvcyByZXBvcnRhZG9zIGVuIGVsIGdyw6FmaWNvIDMuOSBkZWwgcmVwb3J0ZSBFbCBQdWxzbyBkZSBsYSBEZW1vY3JhY2lhIGRlIGxhIHJvbmRhIDIwMTgvMTkgZGViaWRvIGEgcXVlIGVsIGPDoWxjdWxvIGRlIGxhIHZhcmlhYmxlIHF1ZSBkZWZpbmUgYWwgdGlwbyBkZSB1c3VhcmlvIGRlIFR3aXR0ZXIgZXMgbcOhcyBjb21wbGVqbyBkZSBsbyBxdWUgc2UgaGFjZSBlbiBlc3RhIHNlY2Npw7NuLgo=