Introducción
Las secciones anteriores correspondientes a la prueba
t y a la prueba de ANOVA
tratan sobre la relación de una variable numérica con una variable
categórica, de tal manera que el objetivo es comparar y extrapolar las
medias de la variable numérica por grupos de la variable categórica. En
la sección sobre tablas
cruzadas se analizó las relaciones bivariadas entre dos variables
categóricas (o de factor en la terminología de R). Esta evaluación se
hace mediante tablas cruzadas (o de contingencia) y se evalúa mediante
la prueba de chi-cuadrado.
En esta sección veremos la relación bivariada entre dos variables
numéricas, usando el gráfico de dispersión para la inspección visual y
el coeficiente de correlación de Pearson para la evaluación. En primer
lugar, se cargarán los datos del Barómetro de las Américas 2018/19.
Sobre la base 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. Pueden descargar los
datos de manera libre aquí.
En este documento se carga nuevamente una base de datos recortada,
originalmente en formato SPSS (.sav). Se recomienda limpiar el
Environment antes de iniciar esta sección.
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("lapop21.RData")
lapop21 <- subset(lapop21, pais<=35)
Apoyo a la democracia y nivel de democracia
En esta sección seguiremos usando el reporte “El pulso de la
democracia”, disponible aquí.
donde se presentan los principales hallazgos de la ronda 2018/19 del
Barómetro de las Américas. En este informe, se presenta el Gráfico 1.3.
Este es un gráfico de dispersión que relaciona la variable apoyo a la
democracia (del Barómetro de las Américas) con el índice de democracia
electoral del proyecto V-Dem.
Este gráfico muestra “la relación entre el nivel de apoyo a la
democracia y la calificación de la democracia en cada país” (p. 12).
Para reproducir este gráfico se tiene que agregar los resultados por
país de la variable ING4. “Cambiando de tema, la democracia puede tener
problemas, pero es mejor que cualquier otra forma de gobierno. ¿En qué
medida está de acuerdo o en desacuerdo con esta afirmación?”. Las
personas podían responder en una escala del 1 al 7, donde 1 significa
“muy en desacuerdo” y 7 “muy de acuerdo”. El reporte indica que se ha
recodificado la pregunta original en una variable dummy, donde las
respuestas entre 5 al 7 se les considera como que apoyan a la
democracia. En el eje X del gráfico 1.3 se presenta el porcentaje de
personas que apoyan a la democracia por país (es decir, aquellos que
responden entre 5 y 7 en cada país).
Luego, en la página web del proyecto V-Dem, se puede calcular los
puntajes del índice de democracia electoral para cada país (ver aquí). Por
lo tanto, se puede recoger los datos para los 18 países que son parte
del reporte “El pulso de la democracia”. Estos datos, luego, se pueden
descargar en formato .csv. El eje Y del gráfico 1.3 muestra los puntajes
del índice de democracia electoral de V-Dem en una escala del 0 al 1.
Para este documento se ha recogido los datos del índice de democracia
electoral 2018 y 2019 para los 18 países analizados en el reporte,
incluyendo el código de país, para poder fusionar los datos luego. Esta
base de datos también se encuentra alojada en el repositorio
“materials_edu” de la cuenta de LAPOP en GitHub.
vdem <- import("https://raw.github.com/lapop-central/materials_edu/main/vdem.xlsx")
vdem
Para reproducir el Gráfico 1.3 tenemos que recodificar la variable la
variable ING4 de acuerdo a la regla indicada en el reporte:
library(car)
lapop18$apoyo <- car::recode(lapop18$ing4, "1:4=0; 5:7=100")
table(lapop18$apoyo)
##
## 0 100
## 11463 15623
Con esta nueva variable “apoyo”, ahora tenemos que agregar los datos
de esta variable por país y guardar esta información en un nuevo
dataframe “df”. Para esto usaremos el comando summarySE
que
reporta los estadísticos descriptivos de la variable “apoyo” por país.
Se incluye el N de cada país, el promedio (que sería el porcentaje), la
desviación estándar, el error estándar y el tamaño del intervalo de
confianza. En este caso solo requerimos el dato del promedio. Mirando la
tabla, vemos que Uruguay es el país que reporta una mayor proporción de
ciudadanos que apoyan a la democracia y además cuenta con la menor
desviación estándar, indicando que existe una mayor homogeneidad de las
opiniones en comparación con los otros 17 países.
library(Rmisc) #para poder utilizar el comando summarySE
df <- summarySE(data=lapop18, measurevar="apoyo", groupvar="pais", na.rm=T)
df
Luego, usamos los datos de la columna “vdem2019” del dataframe “vdem”
para agregarlos en “df”. Esto lo hacemos con el comando
cbind
, donde se indica el dataframe de destino y los datos
a agregar vdem$vdem2019
. Se renombra la columna añadida
pues por defecto se nombra como la variable.
df <- cbind(df, vdem$vdem2019)
colnames(df)[7] <- "vdem2019"
df
Diagrama de dispersión
En el dataframe “df” ahora tenemos las dos variables que se grafican
en el diagrama de dispersión presentado en el Gráfico 1.3. Este gráfico
lo podemos replicar con el comando plot
, donde se indica la
variable que irá en el eje X y luego la que irá en el eje Y. Se
etiquetan los ejes con xlab
y ylab
. Se fijan
los límites de los ejes con xlim
y ylim
. Se
agrega las etiquetas de cada punto con el comando text
,
donde se indica que se agregue la etiqueta de la variable
df$pais
.
plot(df$apoyo, df$vdem2019,
xlab="Apoyo a la democracia (%)",
ylab="Índice de Democracia Electoral V_Dem",
pch=19, xlim=c(40, 80), ylim=c(0.2, 1))
text(df$apoyo, df$vdem2019, labels=df$pais, cex=0.5, pos=3)
Sin embargo, estas etiquetas muestran los códigos de los países, Para
que muestre los nombres de los países, se tiene que transformar la
variable “pais” en una variable de factor “paises” y etiquetar con los
nombres.
df$paises <- as.factor(df$pais)
levels(df$paises) <- c("México", "Guatemala", "El Salvador", "Honduras",
"Nicaragua","Costa Rica", "Panamá", "Colombia",
"Ecuador", "Bolivia", "Perú", "Paraguay",
"Chile", "Uruguay", "Brasil",
"Argentina", "Rep. Dom.", "Jamaica")
table(df$paises)
##
## México Guatemala El Salvador Honduras Nicaragua Costa Rica
## 1 1 1 1 1 1
## Panamá Colombia Ecuador Bolivia Perú Paraguay
## 1 1 1 1 1 1
## Chile Uruguay Brasil Argentina Rep. Dom. Jamaica
## 1 1 1 1 1 1
Con esta nueva variable se puede rehacer el gráfico de dispersión con
las etiquetas de los países.
plot(df$apoyo, df$vdem2019,
xlab="Apoyo a la democracia (%)",
ylab="Índice de Democracia Electoral V_Dem",
pch=19, xlim=c(40, 80), ylim=c(0.2, 1))
text(df$apoyo, df$vdem2019, labels=df$paises, cex=0.5, pos=3)
Este mismo gráfico se puede reproducir también usando la librería
ggplot
. En primer lugar se define la estética del gráfico,
es decir el dataframe, que será “df”, y con la especificación
aes
, las variables en cada eje del gráfico. Con el comando
geom_point
se indica que se quiere producir un gráfico de
puntos. Un elemento que podemos agregar es la línea de predicción o de
ajuste, con el comando geom_smooth
. Dentro de este comando
se especifica que se use el método lineal con method=lm
y
que no se muestre el intervalo de confianza alrededor de la línea de
tendencia, con se=F
. Luego, con el comando
geom_text
se incluye las etiquetas a cada punto, desde la
variable “paises”. Se usa la especificación nudge_y
para
ajustar verticalmente las etiquetas y check_overlap=T
para
prevenir que las etiquetas se superpongan. Finalmente, se etiquetan los
ejes con labs(…)
, se define un tema general del gráfico,
con theme_light()
y se definen los límites de los ejes.
library(ggplot2)
ggplot(df, aes(x=apoyo, y=vdem2019))+
geom_point()+
geom_smooth(method=lm, se=F)+ #agregar línea de tendencia
geom_text(data=df, aes(label=paises), cex=2.5, nudge_y = 0.02, check_overlap = T)+ #Pata etiquetar los puntos, darles un tamalo, ubicación y prevenir que se sobrepongan
labs(x="Apoyo a la democracia", y="ïndice de Democracia Electoral V-Dem ")+ #para etiquetar los ejes
theme_light()+
xlim(40, 80)+
ylim(0.2, 1)
Como se presenta en el gráfico, la distribución de los países se
puede resumir con una aproximación lineal mediante una recta. Esta recta
tiene una pendiente positiva, que indica que hay una relación directa
entre ambas variables: a medida que un país exhibe un mayor porcentaje
de ciudadanos que apoyan a la democracia, se observa un mayor puntaje en
el índice de democracia electoral.
Coeficiente de Correlación de Pearson
Para evaluar la magnitud de la dependencia entre ambas variables, se
puede agregar una medida estadística, el coeficiente de correlación R de
Pearsons. Este coeficiente varía entre -1 a +1. El signo indica la
dirección de la relación, mientras el valor indica el grado de la
relación. Si el coeficiente es 0, esto indica una ausencia de relación
lineal y mientras más cercano a 1 que existe una mayor relación lineal
entre las variables.
El reporte indica que “en general, existe una relación positiva entre
las dos medidas (correlación de Pearson =.64). Si bien este análisis es
descriptivo y no pone a prueba una relación causal, el patrón es
consistente con investigaciones previas donde se identifica que el apoyo
de los ciudadanos a la democracia es un ingrediente central para la
vitalidad de la democracia”.
Se puede usar el comando cor.test
para calcular el valor
del coeficiente de Pearson. Dentro de este comando se indica qué
variable se ubica en cada eje. Por defecto se calcula es coeficiente de
Pearson, pero con la especificación method="..."
se puede
calcular también el coeficiente de Kendall o el de Spearman.
cor.test(x = df$apoyo, y = df$vdem2019)
##
## Pearson's product-moment correlation
##
## data: df$apoyo and df$vdem2019
## t = 3.2105, df = 16, p-value = 0.005456
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.2247472 0.8456754
## sample estimates:
## cor
## 0.6259389
Se obtiene un coeficiente de 0.62, que indica una relación positiva,
aunque el valor exacto no es igual al que se reporta en el documento,
pues los cálculos realizados en este documento no toman en cuenta el
efecto del factor de expansión.
Resumen
En este documento se ha trabajado la relación bivariada entre dos
variables numéricas. La visualización de esa relación se ha hecho
mediante el diagrama de dispersión y la evaluación de la relación se ha
hecho mediante el coeficiente de correlación de Pearson.
Este es un primer paso en el modelamiento. En las siguientes
secciones se introducirá el modelamiento mediante la técnica de la
regresión lineal simple, que es una expresión matemática de lo visto en
esta sección.
LS0tCnRpdGxlOiAiQ29ycmVsYWNpw7NuIGNvbiBsb3MgZGF0b3MgZGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29sbGFwc2VkOiBmYWxzZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgdG9jX2RlcHRoOiAxCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogZmxhdGx5CiAgICBkZl9wcmludDogcGFnZWQKICAgIHNlbGZfY29udGFpbmVkOiBubwogICAga2VlcF9tZDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiBzZW50ZW5jZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFKQpgYGAKCmBgYHtjc3MgY29sb3IsIGVjaG89RkFMU0V9Ci5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30KaDEge2NvbG9yOiAjMzM2NkNDO30KYGBgCgojIEludHJvZHVjY2nDs24KCkxhcyBzZWNjaW9uZXMgYW50ZXJpb3JlcyBjb3JyZXNwb25kaWVudGVzIGEgbGEgW3BydWViYSB0XShodHRwczovL2FydHVyb21hbGRvbmFkby5naXRodWIuaW8vQmFyb21ldHJvRWR1X1dlYi9wcnVlYmF0Lmh0bWwpIHkgYSBsYSBwcnVlYmEgZGUgW0FOT1ZBXShodHRwczovL2FydHVyb21hbGRvbmFkby5naXRodWIuaW8vQmFyb21ldHJvRWR1X1dlYi9hbm92YS5odG1sKSB0cmF0YW4gc29icmUgbGEgcmVsYWNpw7NuIGRlIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EgY29uIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSwgZGUgdGFsIG1hbmVyYSBxdWUgZWwgb2JqZXRpdm8gZXMgY29tcGFyYXIgeSBleHRyYXBvbGFyIGxhcyBtZWRpYXMgZGUgbGEgdmFyaWFibGUgbnVtw6lyaWNhIHBvciBncnVwb3MgZGUgbGEgdmFyaWFibGUgY2F0ZWfDs3JpY2EuCkVuIGxhIHNlY2Npw7NuIHNvYnJlIFt0YWJsYXMgY3J1emFkYXNdKGh0dHBzOi8vYXJ0dXJvbWFsZG9uYWRvLmdpdGh1Yi5pby9CYXJvbWV0cm9FZHVfV2ViL2NoaS5odG1sKSBzZSBhbmFsaXrDsyBsYXMgcmVsYWNpb25lcyBiaXZhcmlhZGFzIGVudHJlIGRvcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIChvIGRlIGZhY3RvciBlbiBsYSB0ZXJtaW5vbG9nw61hIGRlIFIpLgpFc3RhIGV2YWx1YWNpw7NuIHNlIGhhY2UgbWVkaWFudGUgdGFibGFzIGNydXphZGFzIChvIGRlIGNvbnRpbmdlbmNpYSkgeSBzZSBldmFsw7phIG1lZGlhbnRlIGxhIHBydWViYSBkZSBjaGktY3VhZHJhZG8uCgpFbiBlc3RhIHNlY2Npw7NuIHZlcmVtb3MgbGEgcmVsYWNpw7NuIGJpdmFyaWFkYSBlbnRyZSBkb3MgdmFyaWFibGVzIG51bcOpcmljYXMsIHVzYW5kbyBlbCBncsOhZmljbyBkZSBkaXNwZXJzacOzbiBwYXJhIGxhIGluc3BlY2Npw7NuIHZpc3VhbCB5IGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBkZSBQZWFyc29uIHBhcmEgbGEgZXZhbHVhY2nDs24uCkVuIHByaW1lciBsdWdhciwgc2UgY2FyZ2Fyw6FuIGxvcyBkYXRvcyBkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzIDIwMTgvMTkuCgojIFNvYnJlIGxhIGJhc2UgZGUgZGF0b3MKCkxvcyBkYXRvcyBxdWUgdmFtb3MgYSB1c2FyIGRlYmVuIGNpdGFyc2UgZGUgbGEgc2lndWllbnRlIG1hbmVyYTogRnVlbnRlOiBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMgcG9yIGVsIFByb3llY3RvIGRlIE9waW5pw7NuIFDDumJsaWNhIGRlIEFtw6lyaWNhIExhdGluYSAoTEFQT1ApLCB3d3d3LkxhcG9wU3VydmV5cy5vcmcuClB1ZWRlbiBkZXNjYXJnYXIgbG9zIGRhdG9zIGRlIG1hbmVyYSBsaWJyZSBbYXF1w61dKGh0dHA6Ly9kYXRhc2V0cy5hbWVyaWNhc2Jhcm9tZXRlci5vcmcvZGF0YWJhc2UvbG9naW4ucGhwKS4KCkVuIGVzdGUgZG9jdW1lbnRvIHNlIGNhcmdhIG51ZXZhbWVudGUgdW5hIGJhc2UgZGUgZGF0b3MgcmVjb3J0YWRhLCBvcmlnaW5hbG1lbnRlIGVuIGZvcm1hdG8gU1BTUyAoLnNhdikuClNlIHJlY29taWVuZGEgbGltcGlhciBlbCBFbnZpcm9ubWVudCBhbnRlcyBkZSBpbmljaWFyIGVzdGEgc2VjY2nDs24uCgpgYGB7ciBiYXNlfQpsaWJyYXJ5KHJpbykgCmxhcG9wMTggPC0gaW1wb3J0KCJodHRwczovL3Jhdy5naXRodWIuY29tL2xhcG9wLWNlbnRyYWwvbWF0ZXJpYWxzX2VkdS9tYWluL0xBUE9QX0FCX01lcmdlXzIwMThfdjEuMC5zYXYiKQpsYXBvcDE4IDwtIHN1YnNldChsYXBvcDE4LCBwYWlzPD0zNSkKYGBgCgpUYW1iacOpbiBjYXJnYW1vcyBsYSBiYXNlIGRlIGRhdG9zIGRlIGxhIHJvbmRhIDIwMjEuCgpgYGB7ciBiYXNlMjF9CmxhcG9wMjEgPSBpbXBvcnQoImxhcG9wMjEuUkRhdGEiKSAKbGFwb3AyMSA8LSBzdWJzZXQobGFwb3AyMSwgcGFpczw9MzUpCmBgYAoKIyBBcG95byBhIGxhIGRlbW9jcmFjaWEgeSBuaXZlbCBkZSBkZW1vY3JhY2lhCgpFbiBlc3RhIHNlY2Npw7NuIHNlZ3VpcmVtb3MgdXNhbmRvIGVsIHJlcG9ydGUgIkVsIHB1bHNvIGRlIGxhIGRlbW9jcmFjaWEiLCBkaXNwb25pYmxlIFthcXXDrV0oaHR0cHM6Ly93d3cudmFuZGVyYmlsdC5lZHUvbGFwb3AvYWIyMDE4LzIwMTgtMTlfQW1lcmljYXNCYXJvbWV0ZXJfUmVnaW9uYWxfUmVwb3J0X1NwYW5pc2hfV18wMy4yNy4yMC5wZGYpLgpkb25kZSBzZSBwcmVzZW50YW4gbG9zIHByaW5jaXBhbGVzIGhhbGxhemdvcyBkZSBsYSByb25kYSAyMDE4LzE5IGRlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMuCkVuIGVzdGUgaW5mb3JtZSwgc2UgcHJlc2VudGEgZWwgR3LDoWZpY28gMS4zLgpFc3RlIGVzIHVuIGdyw6FmaWNvIGRlIGRpc3BlcnNpw7NuIHF1ZSByZWxhY2lvbmEgbGEgdmFyaWFibGUgYXBveW8gYSBsYSBkZW1vY3JhY2lhIChkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzKSBjb24gZWwgw61uZGljZSBkZSBkZW1vY3JhY2lhIGVsZWN0b3JhbCBkZWwgcHJveWVjdG8gW1YtRGVtXShodHRwczovL3d3dy52LWRlbS5uZXQvZW4vKS4KRXN0ZSBncsOhZmljbyBtdWVzdHJhICJsYSByZWxhY2nDs24gZW50cmUgZWwgbml2ZWwgZGUgYXBveW8gYSBsYSBkZW1vY3JhY2lhIHkgbGEgY2FsaWZpY2FjacOzbiBkZSBsYSBkZW1vY3JhY2lhIGVuIGNhZGEgcGHDrXMiIChwLiAxMikuCgohW10oR3JhZjEuMy5wbmcpe3dpZHRoPSI1MjMifQoKUGFyYSByZXByb2R1Y2lyIGVzdGUgZ3LDoWZpY28gc2UgdGllbmUgcXVlIGFncmVnYXIgbG9zIHJlc3VsdGFkb3MgcG9yIHBhw61zIGRlIGxhIHZhcmlhYmxlIElORzQuCiJDYW1iaWFuZG8gZGUgdGVtYSwgbGEgZGVtb2NyYWNpYSBwdWVkZSB0ZW5lciBwcm9ibGVtYXMsIHBlcm8gZXMgbWVqb3IgcXVlIGN1YWxxdWllciBvdHJhIGZvcm1hIGRlIGdvYmllcm5vLiDCv0VuIHF1w6kgbWVkaWRhIGVzdMOhIGRlIGFjdWVyZG8gbyBlbiBkZXNhY3VlcmRvIGNvbiBlc3RhIGFmaXJtYWNpw7NuPyIuCkxhcyBwZXJzb25hcyBwb2TDrWFuIHJlc3BvbmRlciBlbiB1bmEgZXNjYWxhIGRlbCAxIGFsIDcsIGRvbmRlIDEgc2lnbmlmaWNhICJtdXkgZW4gZGVzYWN1ZXJkbyIgeSA3ICJtdXkgZGUgYWN1ZXJkbyIuCkVsIHJlcG9ydGUgaW5kaWNhIHF1ZSBzZSBoYSByZWNvZGlmaWNhZG8gbGEgcHJlZ3VudGEgb3JpZ2luYWwgZW4gdW5hIHZhcmlhYmxlIGR1bW15LCBkb25kZSBsYXMgcmVzcHVlc3RhcyBlbnRyZSA1IGFsIDcgc2UgbGVzIGNvbnNpZGVyYSBjb21vIHF1ZSBhcG95YW4gYSBsYSBkZW1vY3JhY2lhLgpFbiBlbCBlamUgWCBkZWwgZ3LDoWZpY28gMS4zIHNlIHByZXNlbnRhIGVsIHBvcmNlbnRhamUgZGUgcGVyc29uYXMgcXVlIGFwb3lhbiBhIGxhIGRlbW9jcmFjaWEgcG9yIHBhw61zIChlcyBkZWNpciwgYXF1ZWxsb3MgcXVlIHJlc3BvbmRlbiBlbnRyZSA1IHkgNyBlbiBjYWRhIHBhw61zKS4KCkx1ZWdvLCBlbiBsYSBww6FnaW5hIHdlYiBkZWwgcHJveWVjdG8gVi1EZW0sIHNlIHB1ZWRlIGNhbGN1bGFyIGxvcyBwdW50YWplcyBkZWwgw61uZGljZSBkZSBkZW1vY3JhY2lhIGVsZWN0b3JhbCBwYXJhIGNhZGEgcGHDrXMgKHZlciBbYXF1w61dKGh0dHBzOi8vd3d3LnYtZGVtLm5ldC9lbi9hbmFseXNpcy9WYXJpYWJsZUdyYXBoLykpLgpQb3IgbG8gdGFudG8sIHNlIHB1ZWRlIHJlY29nZXIgbG9zIGRhdG9zIHBhcmEgbG9zIDE4IHBhw61zZXMgcXVlIHNvbiBwYXJ0ZSBkZWwgcmVwb3J0ZSAiRWwgcHVsc28gZGUgbGEgZGVtb2NyYWNpYSIuCkVzdG9zIGRhdG9zLCBsdWVnbywgc2UgcHVlZGVuIGRlc2NhcmdhciBlbiBmb3JtYXRvIC5jc3YuCkVsIGVqZSBZIGRlbCBncsOhZmljbyAxLjMgbXVlc3RyYSBsb3MgcHVudGFqZXMgZGVsIMOtbmRpY2UgZGUgZGVtb2NyYWNpYSBlbGVjdG9yYWwgZGUgVi1EZW0gZW4gdW5hIGVzY2FsYSBkZWwgMCBhbCAxLgpQYXJhIGVzdGUgZG9jdW1lbnRvIHNlIGhhIHJlY29naWRvIGxvcyBkYXRvcyBkZWwgw61uZGljZSBkZSBkZW1vY3JhY2lhIGVsZWN0b3JhbCAyMDE4IHkgMjAxOSBwYXJhIGxvcyAxOCBwYcOtc2VzIGFuYWxpemFkb3MgZW4gZWwgcmVwb3J0ZSwgaW5jbHV5ZW5kbyBlbCBjw7NkaWdvIGRlIHBhw61zLCBwYXJhIHBvZGVyIGZ1c2lvbmFyIGxvcyBkYXRvcyBsdWVnby4KRXN0YSBiYXNlIGRlIGRhdG9zIHRhbWJpw6luIHNlIGVuY3VlbnRyYSBhbG9qYWRhIGVuIGVsIHJlcG9zaXRvcmlvICJtYXRlcmlhbHNfZWR1IiBkZSBsYSBjdWVudGEgZGUgTEFQT1AgZW4gR2l0SHViLgoKYGBge3IgdmRlbX0KdmRlbSA8LSBpbXBvcnQoImh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vbGFwb3AtY2VudHJhbC9tYXRlcmlhbHNfZWR1L21haW4vdmRlbS54bHN4IikKdmRlbQpgYGAKClBhcmEgcmVwcm9kdWNpciBlbCBHcsOhZmljbyAxLjMgdGVuZW1vcyBxdWUgcmVjb2RpZmljYXIgbGEgdmFyaWFibGUgbGEgdmFyaWFibGUgSU5HNCBkZSBhY3VlcmRvIGEgbGEgcmVnbGEgaW5kaWNhZGEgZW4gZWwgcmVwb3J0ZToKCi0gICBWYWxvcmVzIGRlIElORzQgZGVsIDEtNCAtXD4gMCBlbiBsYSBudWV2YSB2YXJpYWJsZSAiYXBveW8iCgotICAgVmFsb3JlcyBkZSBJTkc0IGRlbCA1LTcgLVw+IDEwMCBlbiBsYSBudWV2YSB2YXJpYWJsZSAiYXBveW8iCgpgYGB7ciByZWNvfQpsaWJyYXJ5KGNhcikKbGFwb3AxOCRhcG95byA8LSBjYXI6OnJlY29kZShsYXBvcDE4JGluZzQsICIxOjQ9MDsgNTo3PTEwMCIpCnRhYmxlKGxhcG9wMTgkYXBveW8pCmBgYAoKQ29uIGVzdGEgbnVldmEgdmFyaWFibGUgImFwb3lvIiwgYWhvcmEgdGVuZW1vcyBxdWUgYWdyZWdhciBsb3MgZGF0b3MgZGUgZXN0YSB2YXJpYWJsZSBwb3IgcGHDrXMgeSBndWFyZGFyIGVzdGEgaW5mb3JtYWNpw7NuIGVuIHVuIG51ZXZvIGRhdGFmcmFtZSAiZGYiLgpQYXJhIGVzdG8gdXNhcmVtb3MgZWwgY29tYW5kbyBgc3VtbWFyeVNFYCBxdWUgcmVwb3J0YSBsb3MgZXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MgZGUgbGEgdmFyaWFibGUgImFwb3lvIiBwb3IgcGHDrXMuClNlIGluY2x1eWUgZWwgTiBkZSBjYWRhIHBhw61zLCBlbCBwcm9tZWRpbyAocXVlIHNlcsOtYSBlbCBwb3JjZW50YWplKSwgbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyLCBlbCBlcnJvciBlc3TDoW5kYXIgeSBlbCB0YW1hw7FvIGRlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphLgpFbiBlc3RlIGNhc28gc29sbyByZXF1ZXJpbW9zIGVsIGRhdG8gZGVsIHByb21lZGlvLgpNaXJhbmRvIGxhIHRhYmxhLCB2ZW1vcyBxdWUgVXJ1Z3VheSBlcyBlbCBwYcOtcyBxdWUgcmVwb3J0YSB1bmEgbWF5b3IgcHJvcG9yY2nDs24gZGUgY2l1ZGFkYW5vcyBxdWUgYXBveWFuIGEgbGEgZGVtb2NyYWNpYSB5IGFkZW3DoXMgY3VlbnRhIGNvbiBsYSBtZW5vciBkZXN2aWFjacOzbiBlc3TDoW5kYXIsIGluZGljYW5kbyBxdWUgZXhpc3RlIHVuYSBtYXlvciBob21vZ2VuZWlkYWQgZGUgbGFzIG9waW5pb25lcyBlbiBjb21wYXJhY2nDs24gY29uIGxvcyBvdHJvcyAxNyBwYcOtc2VzLgoKYGBge3IgZGZ9CmxpYnJhcnkoUm1pc2MpICNwYXJhIHBvZGVyIHV0aWxpemFyIGVsIGNvbWFuZG8gc3VtbWFyeVNFCmRmIDwtIHN1bW1hcnlTRShkYXRhPWxhcG9wMTgsIG1lYXN1cmV2YXI9ImFwb3lvIiwgZ3JvdXB2YXI9InBhaXMiLCBuYS5ybT1UKQpkZgpgYGAKCkx1ZWdvLCB1c2Ftb3MgbG9zIGRhdG9zIGRlIGxhIGNvbHVtbmEgInZkZW0yMDE5IiBkZWwgZGF0YWZyYW1lICJ2ZGVtIiBwYXJhIGFncmVnYXJsb3MgZW4gImRmIi4KRXN0byBsbyBoYWNlbW9zIGNvbiBlbCBjb21hbmRvIGBjYmluZGAsIGRvbmRlIHNlIGluZGljYSBlbCBkYXRhZnJhbWUgZGUgZGVzdGlubyB5IGxvcyBkYXRvcyBhIGFncmVnYXIgYHZkZW0kdmRlbTIwMTlgLgpTZSByZW5vbWJyYSBsYSBjb2x1bW5hIGHDsWFkaWRhIHB1ZXMgcG9yIGRlZmVjdG8gc2Ugbm9tYnJhIGNvbW8gbGEgdmFyaWFibGUuCgpgYGB7ciBtZXJnZX0KZGYgPC0gY2JpbmQoZGYsIHZkZW0kdmRlbTIwMTkpCmNvbG5hbWVzKGRmKVs3XSA8LSAidmRlbTIwMTkiCmRmCmBgYAoKIyBEaWFncmFtYSBkZSBkaXNwZXJzacOzbgoKRW4gZWwgZGF0YWZyYW1lICJkZiIgYWhvcmEgdGVuZW1vcyBsYXMgZG9zIHZhcmlhYmxlcyBxdWUgc2UgZ3JhZmljYW4gZW4gZWwgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24gcHJlc2VudGFkbyBlbiBlbCBHcsOhZmljbyAxLjMuCkVzdGUgZ3LDoWZpY28gbG8gcG9kZW1vcyByZXBsaWNhciBjb24gZWwgY29tYW5kbyBgcGxvdGAsIGRvbmRlIHNlIGluZGljYSBsYSB2YXJpYWJsZSBxdWUgaXLDoSBlbiBlbCBlamUgWCB5IGx1ZWdvIGxhIHF1ZSBpcsOhIGVuIGVsIGVqZSBZLgpTZSBldGlxdWV0YW4gbG9zIGVqZXMgY29uIGB4bGFiYCB5IGB5bGFiYC4KU2UgZmlqYW4gbG9zIGzDrW1pdGVzIGRlIGxvcyBlamVzIGNvbiBgeGxpbWAgeSBgeWxpbWAuClNlIGFncmVnYSBsYXMgZXRpcXVldGFzIGRlIGNhZGEgcHVudG8gY29uIGVsIGNvbWFuZG8gYHRleHRgLCBkb25kZSBzZSBpbmRpY2EgcXVlIHNlIGFncmVndWUgbGEgZXRpcXVldGEgZGUgbGEgdmFyaWFibGUgYGRmJHBhaXNgLgoKYGBge3IgcGxvdH0KcGxvdChkZiRhcG95bywgZGYkdmRlbTIwMTksIAogICAgIHhsYWI9IkFwb3lvIGEgbGEgZGVtb2NyYWNpYSAoJSkiLCAKICAgICB5bGFiPSLDjW5kaWNlIGRlIERlbW9jcmFjaWEgRWxlY3RvcmFsIFZfRGVtIiwgCiAgICAgcGNoPTE5LCB4bGltPWMoNDAsIDgwKSwgeWxpbT1jKDAuMiwgMSkpCnRleHQoZGYkYXBveW8sIGRmJHZkZW0yMDE5LCBsYWJlbHM9ZGYkcGFpcywgY2V4PTAuNSwgcG9zPTMpCmBgYAoKU2luIGVtYmFyZ28sIGVzdGFzIGV0aXF1ZXRhcyBtdWVzdHJhbiBsb3MgY8OzZGlnb3MgZGUgbG9zIHBhw61zZXMsIFBhcmEgcXVlIG11ZXN0cmUgbG9zIG5vbWJyZXMgZGUgbG9zIHBhw61zZXMsIHNlIHRpZW5lIHF1ZSB0cmFuc2Zvcm1hciBsYSB2YXJpYWJsZSAicGFpcyIgZW4gdW5hIHZhcmlhYmxlIGRlIGZhY3RvciAicGFpc2VzIiB5IGV0aXF1ZXRhciBjb24gbG9zIG5vbWJyZXMuCgpgYGB7ciBwYWlzfQpkZiRwYWlzZXMgPC0gYXMuZmFjdG9yKGRmJHBhaXMpCmxldmVscyhkZiRwYWlzZXMpIDwtIGMoIk3DqXhpY28iLCAiR3VhdGVtYWxhIiwgIkVsIFNhbHZhZG9yIiwgIkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOaWNhcmFndWEiLCJDb3N0YSBSaWNhIiwgIlBhbmFtw6EiLCAiQ29sb21iaWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY3VhZG9yIiwgIkJvbGl2aWEiLCAiUGVyw7oiLCAiUGFyYWd1YXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGlsZSIsICJVcnVndWF5IiwgIkJyYXNpbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJnZW50aW5hIiwgIlJlcC4gRG9tLiIsICJKYW1haWNhIikKdGFibGUoZGYkcGFpc2VzKQpgYGAKCkNvbiBlc3RhIG51ZXZhIHZhcmlhYmxlIHNlIHB1ZWRlIHJlaGFjZXIgZWwgZ3LDoWZpY28gZGUgZGlzcGVyc2nDs24gY29uIGxhcyBldGlxdWV0YXMgZGUgbG9zIHBhw61zZXMuCgpgYGB7ciBwbG90Mn0KcGxvdChkZiRhcG95bywgZGYkdmRlbTIwMTksIAogICAgIHhsYWI9IkFwb3lvIGEgbGEgZGVtb2NyYWNpYSAoJSkiLCAKICAgICB5bGFiPSLDjW5kaWNlIGRlIERlbW9jcmFjaWEgRWxlY3RvcmFsIFZfRGVtIiwgCiAgICAgcGNoPTE5LCB4bGltPWMoNDAsIDgwKSwgeWxpbT1jKDAuMiwgMSkpCnRleHQoZGYkYXBveW8sIGRmJHZkZW0yMDE5LCBsYWJlbHM9ZGYkcGFpc2VzLCBjZXg9MC41LCBwb3M9MykKYGBgCgpFc3RlIG1pc21vIGdyw6FmaWNvIHNlIHB1ZWRlIHJlcHJvZHVjaXIgdGFtYmnDqW4gdXNhbmRvIGxhIGxpYnJlcsOtYSBgZ2dwbG90YC4KRW4gcHJpbWVyIGx1Z2FyIHNlIGRlZmluZSBsYSBlc3TDqXRpY2EgZGVsIGdyw6FmaWNvLCBlcyBkZWNpciBlbCBkYXRhZnJhbWUsIHF1ZSBzZXLDoSAiZGYiLCB5IGNvbiBsYSBlc3BlY2lmaWNhY2nDs24gYGFlc2AsIGxhcyB2YXJpYWJsZXMgZW4gY2FkYSBlamUgZGVsIGdyw6FmaWNvLgpDb24gZWwgY29tYW5kbyBgZ2VvbV9wb2ludGAgc2UgaW5kaWNhIHF1ZSBzZSBxdWllcmUgcHJvZHVjaXIgdW4gZ3LDoWZpY28gZGUgcHVudG9zLgpVbiBlbGVtZW50byBxdWUgcG9kZW1vcyBhZ3JlZ2FyIGVzIGxhIGzDrW5lYSBkZSBwcmVkaWNjacOzbiBvIGRlIGFqdXN0ZSwgY29uIGVsIGNvbWFuZG8gYGdlb21fc21vb3RoYC4KRGVudHJvIGRlIGVzdGUgY29tYW5kbyBzZSBlc3BlY2lmaWNhIHF1ZSBzZSB1c2UgZWwgbcOpdG9kbyBsaW5lYWwgY29uIGBtZXRob2Q9bG1gIHkgcXVlIG5vIHNlIG11ZXN0cmUgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBhbHJlZGVkb3IgZGUgbGEgbMOtbmVhIGRlIHRlbmRlbmNpYSwgY29uIGBzZT1GYC4KTHVlZ28sIGNvbiBlbCBjb21hbmRvIGBnZW9tX3RleHRgIHNlIGluY2x1eWUgbGFzIGV0aXF1ZXRhcyBhIGNhZGEgcHVudG8sIGRlc2RlIGxhIHZhcmlhYmxlICJwYWlzZXMiLgpTZSB1c2EgbGEgZXNwZWNpZmljYWNpw7NuIGBudWRnZV95YCBwYXJhIGFqdXN0YXIgdmVydGljYWxtZW50ZSBsYXMgZXRpcXVldGFzIHkgYGNoZWNrX292ZXJsYXA9VGAgcGFyYSBwcmV2ZW5pciBxdWUgbGFzIGV0aXF1ZXRhcyBzZSBzdXBlcnBvbmdhbi4KRmluYWxtZW50ZSwgc2UgZXRpcXVldGFuIGxvcyBlamVzIGNvbiBgbGFicyjigKYpYCwgc2UgZGVmaW5lIHVuIHRlbWEgZ2VuZXJhbCBkZWwgZ3LDoWZpY28sIGNvbiBgdGhlbWVfbGlnaHQoKWAgeSBzZSBkZWZpbmVuIGxvcyBsw61taXRlcyBkZSBsb3MgZWplcy4KCmBgYHtyIGdncGxvdH0KbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QoZGYsIGFlcyh4PWFwb3lvLCB5PXZkZW0yMDE5KSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZD1sbSwgc2U9RikrICNhZ3JlZ2FyIGzDrW5lYSBkZSB0ZW5kZW5jaWEKICBnZW9tX3RleHQoZGF0YT1kZiwgYWVzKGxhYmVsPXBhaXNlcyksIGNleD0yLjUsIG51ZGdlX3kgPSAwLjAyLCBjaGVja19vdmVybGFwID0gVCkrICNQYXRhIGV0aXF1ZXRhciBsb3MgcHVudG9zLCBkYXJsZXMgdW4gdGFtYWxvLCB1YmljYWNpw7NuIHkgcHJldmVuaXIgcXVlIHNlIHNvYnJlcG9uZ2FuCiAgbGFicyh4PSJBcG95byBhIGxhIGRlbW9jcmFjaWEiLCB5PSLDr25kaWNlIGRlIERlbW9jcmFjaWEgRWxlY3RvcmFsIFYtRGVtICIpKyAjcGFyYSBldGlxdWV0YXIgbG9zIGVqZXMKICB0aGVtZV9saWdodCgpKwogIHhsaW0oNDAsIDgwKSsKICB5bGltKDAuMiwgMSkKYGBgCgpDb21vIHNlIHByZXNlbnRhIGVuIGVsIGdyw6FmaWNvLCBsYSBkaXN0cmlidWNpw7NuIGRlIGxvcyBwYcOtc2VzIHNlIHB1ZWRlIHJlc3VtaXIgY29uIHVuYSBhcHJveGltYWNpw7NuIGxpbmVhbCBtZWRpYW50ZSB1bmEgcmVjdGEuCkVzdGEgcmVjdGEgdGllbmUgdW5hIHBlbmRpZW50ZSBwb3NpdGl2YSwgcXVlIGluZGljYSBxdWUgaGF5IHVuYSByZWxhY2nDs24gZGlyZWN0YSBlbnRyZSBhbWJhcyB2YXJpYWJsZXM6IGEgbWVkaWRhIHF1ZSB1biBwYcOtcyBleGhpYmUgdW4gbWF5b3IgcG9yY2VudGFqZSBkZSBjaXVkYWRhbm9zIHF1ZSBhcG95YW4gYSBsYSBkZW1vY3JhY2lhLCBzZSBvYnNlcnZhIHVuIG1heW9yIHB1bnRhamUgZW4gZWwgw61uZGljZSBkZSBkZW1vY3JhY2lhIGVsZWN0b3JhbC4KCiMgQ29lZmljaWVudGUgZGUgQ29ycmVsYWNpw7NuIGRlIFBlYXJzb24KClBhcmEgZXZhbHVhciBsYSBtYWduaXR1ZCBkZSBsYSBkZXBlbmRlbmNpYSBlbnRyZSBhbWJhcyB2YXJpYWJsZXMsIHNlIHB1ZWRlIGFncmVnYXIgdW5hIG1lZGlkYSBlc3RhZMOtc3RpY2EsIGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBSIGRlIFBlYXJzb25zLgpFc3RlIGNvZWZpY2llbnRlIHZhcsOtYSBlbnRyZSAtMSBhICsxLgpFbCBzaWdubyBpbmRpY2EgbGEgZGlyZWNjacOzbiBkZSBsYSByZWxhY2nDs24sIG1pZW50cmFzIGVsIHZhbG9yIGluZGljYSBlbCBncmFkbyBkZSBsYSByZWxhY2nDs24uClNpIGVsIGNvZWZpY2llbnRlIGVzIDAsIGVzdG8gaW5kaWNhIHVuYSBhdXNlbmNpYSBkZSByZWxhY2nDs24gbGluZWFsIHkgbWllbnRyYXMgbcOhcyBjZXJjYW5vIGEgMSBxdWUgZXhpc3RlIHVuYSBtYXlvciByZWxhY2nDs24gbGluZWFsIGVudHJlIGxhcyB2YXJpYWJsZXMuCgpFbCByZXBvcnRlIGluZGljYSBxdWUgImVuIGdlbmVyYWwsIGV4aXN0ZSB1bmEgcmVsYWNpw7NuIHBvc2l0aXZhIGVudHJlIGxhcyBkb3MgbWVkaWRhcyAoY29ycmVsYWNpw7NuIGRlIFBlYXJzb24gPS42NCkuIFNpIGJpZW4gZXN0ZSBhbsOhbGlzaXMgZXMgZGVzY3JpcHRpdm8geSBubyBwb25lIGEgcHJ1ZWJhIHVuYSByZWxhY2nDs24gY2F1c2FsLCBlbCBwYXRyw7NuIGVzIGNvbnNpc3RlbnRlIGNvbiBpbnZlc3RpZ2FjaW9uZXMgcHJldmlhcyBkb25kZSBzZSBpZGVudGlmaWNhIHF1ZSBlbCBhcG95byBkZSBsb3MgY2l1ZGFkYW5vcyBhIGxhIGRlbW9jcmFjaWEgZXMgdW4gaW5ncmVkaWVudGUgY2VudHJhbCBwYXJhIGxhIHZpdGFsaWRhZCBkZSBsYSBkZW1vY3JhY2lhIi4KClNlIHB1ZWRlIHVzYXIgZWwgY29tYW5kbyBgY29yLnRlc3RgIHBhcmEgY2FsY3VsYXIgZWwgdmFsb3IgZGVsIGNvZWZpY2llbnRlIGRlIFBlYXJzb24uCkRlbnRybyBkZSBlc3RlIGNvbWFuZG8gc2UgaW5kaWNhIHF1w6kgdmFyaWFibGUgc2UgdWJpY2EgZW4gY2FkYSBlamUuClBvciBkZWZlY3RvIHNlIGNhbGN1bGEgZXMgY29lZmljaWVudGUgZGUgUGVhcnNvbiwgcGVybyBjb24gbGEgZXNwZWNpZmljYWNpw7NuIGBtZXRob2Q9Ii4uLiJgIHNlIHB1ZWRlIGNhbGN1bGFyIHRhbWJpw6luIGVsIGNvZWZpY2llbnRlIGRlIEtlbmRhbGwgbyBlbCBkZSBTcGVhcm1hbi4KCmBgYHtyfQpjb3IudGVzdCh4ID0gZGYkYXBveW8sIHkgPSBkZiR2ZGVtMjAxOSkKYGBgCgpTZSBvYnRpZW5lIHVuIGNvZWZpY2llbnRlIGRlIDAuNjIsIHF1ZSBpbmRpY2EgdW5hIHJlbGFjacOzbiBwb3NpdGl2YSwgYXVucXVlIGVsIHZhbG9yIGV4YWN0byBubyBlcyBpZ3VhbCBhbCBxdWUgc2UgcmVwb3J0YSBlbiBlbCBkb2N1bWVudG8sIHB1ZXMgbG9zIGPDoWxjdWxvcyByZWFsaXphZG9zIGVuIGVzdGUgZG9jdW1lbnRvIG5vIHRvbWFuIGVuIGN1ZW50YSBlbCBlZmVjdG8gZGVsIGZhY3RvciBkZSBleHBhbnNpw7NuLgoKIyBSZXN1bWVuCgpFbiBlc3RlIGRvY3VtZW50byBzZSBoYSB0cmFiYWphZG8gbGEgcmVsYWNpw7NuIGJpdmFyaWFkYSBlbnRyZSBkb3MgdmFyaWFibGVzIG51bcOpcmljYXMuCkxhIHZpc3VhbGl6YWNpw7NuIGRlIGVzYSByZWxhY2nDs24gc2UgaGEgaGVjaG8gbWVkaWFudGUgZWwgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24geSBsYSBldmFsdWFjacOzbiBkZSBsYSByZWxhY2nDs24gc2UgaGEgaGVjaG8gbWVkaWFudGUgZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGRlIFBlYXJzb24uCgpFc3RlIGVzIHVuIHByaW1lciBwYXNvIGVuIGVsIG1vZGVsYW1pZW50by4KRW4gbGFzIHNpZ3VpZW50ZXMgc2VjY2lvbmVzIHNlIGludHJvZHVjaXLDoSBlbCBtb2RlbGFtaWVudG8gbWVkaWFudGUgbGEgdMOpY25pY2EgZGUgbGEgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlLCBxdWUgZXMgdW5hIGV4cHJlc2nDs24gbWF0ZW3DoXRpY2EgZGUgbG8gdmlzdG8gZW4gZXN0YSBzZWNjacOzbi4K