Política Pública Pueblos Mágicos
Desde la década de los noventa, el modelo de desarrollo conocido como “Nueva ruralidad“ fomentó en América Latina el implemento de políticas públicas a fin de diversificar las actividades económicas bajo la premisa de combatir la pobreza en contextos rurales (Rosado y González, 2016).
En dicho tenor, el Programa de Pueblos Mágicos de México, es una política pública que desde inicios de la década del 2000 buscaba impulsar el turismo como una herramienta que podría apoyar en el alcance de un desarrollo sostenible para las comunidades rurales del país. Dicho programa, consistía[1] en otorgar apoyo financiero a las cabeceras municipales que contaran con algún tipo de patrimonio biocultural que permitiera justificar su “magia” y así, poder mejorar la oferta e infraestructura (Madrid, 2016).
Tras dieciocho años de ejecución, y un total de 121 localidades declaradas “Pueblo Mágico”, los gobiernos locales e industria turística lo consideran como una iniciativa exitosa que ha permitido el desarrollo económico y bienestar social a partir del número de visitantes, ingresos y empleos generados en estos sitios (Secretaría de Turismo, 2020).
Con miras a un desarrollo sostenible, el éxito del programa es cuestionable si solo se prioriza el beneficio económico y se es permisivo con el replicamiento de impactos socio-ambientales típicos del turismo de masas en los Pueblos Mágicos, tales como la saturación del espacio público, injusta distribución de la riqueza, afectaciones directas al patrimonio, daño al recurso natural, homogenización de los destinos, incremento de los residuos sólidos y segregación social (Davidson, 1998; Mason, 2008)
A partir de ello, la intención del presente proyecto, es analizar cuantitativamente las condiciones socioeconómicas, medioambientales y de infraestructura en seis municipios con nombramiento de Pueblo Mágico a fin de delimitar los cambios generados a partir de la entrada en vigor del programa.
setwd("C:/RSC/S12")
install.packages(c("readxl", "dplyr"))
install.packages('tables')
install.packages('reshape2')
install.packages('readr')
install.packages('ggplot2')
install.packages('data.table')
library(readxl)
library(dplyr)
library(tables)
library(reshape2)
library(data.table)
library(readr)
library(ggplot2)
excel_agricola <- read_excel("agricola_siap_2003_2018_PM.xlsx",sheet="Act Agricola")
resumen_agricola <- read_excel("agricola_siap_2003_2018_PM.xlsx",sheet="AgrPM")
VPAgr <- read_excel("agricola_siap_2003_2018_PM.xlsx",sheet="VPAgr")
basecom <- read.csv("BF.csv", header=T)
En primer lugar, se despliega en gráficas de barras la evolución del crecimiento poblacional de los 6 Pueblos Mágicos seleccionados. Cabe recordar que el programa “Pueblos Mágicos” entró en vigor en el año 2001, por lo que se revisó el crecimiento poblacional del año previo (2000), para observar los cambios en dicha variable, a raíz del inicio del programa. En resumen, se eligieron los años 2000, 2005 y 2010 para observar el crecimiento poblacional en Tepoztlán, Huautla de Jimenez, Cuetzalan del Progreso, Zacatlán, Ezequiel Montes y Tequisquiapan.
Pob2000<-c(34055, 33130, 46682, 71985, 30502, 55265)
names(Pob2000)<-tabla1$PUEBLO
barplot(Pob2000, main="Población en el año 2000", xlab="Pueblos Mágicos",ylab="Cantidad de Población",col=c("lightblue","blue","yellow","red","green","purple"))

NA
Pob2005<-c(39463,33810,50352,75078,32941,59627)
names(Pob2005)<-tabla1$PUEBLO
barplot(Pob2005, main="Población en el año 2005", xlab="Pueblos Mágicos",ylab="Cantidad de Población",col=c("lightblue","blue","yellow","red","green","purple"))

Pob2010<-c(45906,34747,54202,78362,35716,64613)
names(Pob2010)<-tabla1$PUEBLO
barplot(Pob2010, main="Población en el año 2010", xlab="Pueblos Mágicos",ylab="Cantidad de Población",col=c("lightblue","blue","yellow","red","green","purple"))

En el caso de Tepoztlán, se observa un crecimiento poblacional sostenido, a partir de la entrada en vigor del programa “Pueblos Mágicos”. De acuerdo con Guzmán y León (2005), esto puede deberse al desarrollo turístico que ha atraído a un gran número de extranjeros, los cuales eligieron establecer en Tepoztlán su lugar de residencia. Por otra parte, si se les compara con el resto de los pueblos elegidos, tanto Huautla de Jiménez como Ezequiel Montes son los dos territorios con menor cantidad de población; sin embargo, éste último registró un mayor incremento poblacional en 2010. Por su parte, Zacatlán es el pueblo mágico con mayor cantidad de población, cuestión que puede estar relacionada con el tamaño de su superficie, la cual equivale a 489.3 km². En este tenor, Tequisquiapan cuenta con una superficie territorial de 343.6 km², lo cual también puede explicar que sea el segundo pueblo con mayor cantidad de población de nuestra muestra. Finalmente, Cuetzalan del Progreso presentó un incremento poblacional del 7.8%, en 2005, con respecto al año 2000 y, para el año 2010, el incremento fue del 14.46% Producto Interno Bruto y Vulnerabilidad La siguiente gráfica muestra la evolución del Producto Interno Bruto de los destinos seleccionados entre 2000 y 2015.
basecom$CVE_MUN<-as.factor(basecom$CVE_MUN2)
tabla3<-basecom[,23:26]
tabla3<-as.data.frame(tabla3)
tabla3
Producto<-rbind(tabla3$PIB00,tabla3$PIB05,tabla3$PIB10,tabla3$PIB15)
Producto
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1327 419 1021 1753 1104 2923
[2,] 972 271 567 1541 1699 2751
[3,] 1393 393 321 1990 2746 2935
[4,] 1649 296 278 1208 3244 1761
dimnames(Producto)=list(c("2000","2005","2010","2015"),c("Tepoztlán","Huatla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"))
barplot(Producto,beside=T,xlab='Pueblos Magicos', ylab='PIB',main= 'PIB',col=c("lightblue","blue","pink","aquamarine"),ylim=c(0,4000))
legend(x = "topright", legend = c("2000", "2005","2010","2015"), fill = c("lightblue", "blue","pink","aquamarine"),
title = "Años")

De la misma forma, la siguiente gráfica de barras hace referencia a los cambios que experimento el Indice de Marginación, durante el mismo periodo.
tabla4<-basecom[,195:198]
tabla4<-as.data.frame(tabla4)
tabla4
IndMar<-rbind(tabla4$IM_00,tabla4$IM_05,tabla4$IM_10,tabla4$IM_15)
IndMar
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] -1.06 1.25 1.04 -0.20 -0.56 -0.89
[2,] -1.05 1.36 0.96 -0.24 -0.58 -0.82
[3,] -0.78 1.35 1.06 -0.24 -0.70 -0.96
[4,] -0.60 1.71 1.03 -0.16 -0.65 -0.98
dimnames(Producto)=list(c("2000","2005","2010","2015"),c("Tepoztlán","Huatla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"))
barplot(IndMar,beside=T,xlab='Pueblos Magicos', ylab='PIB',main = 'Indice de marginacion',col=c("lightblue","blue","pink","aquamarine"),ylim=c(0,2))
legend(x = "topright", legend = c("2000", "2005","2010","2015"), fill = c("lightblue", "blue","pink","aquamarine"),
title = "Años")

Además, el siguiente gráfico de puntos muestra la relación entre el PIB y el Indice de Marginación en el 2015.
qplot(tabla3$PIB15,tabla4$IM_15,geom = c("point","smooth"))

Accesibilidad
read_xlsx("Accesibilidad.xlsx")
Accesibilidad <- read_xlsx("Accesibilidad.xlsx")
table(Accesibilidad$municipio)
Cuetzalan del Progreso Ezequiel Montes Huautla de Jiménez
161 139 41
Tepoztlán Tequisquiapan Zacatlán
72 102 97
barplot(table(Accesibilidad$municipio), main='Accesibilidad carretera en 2010', col = 'green', xlab = 'Pueblos mágicos', ylab = 'Grado de accesibilidad')

Aquí otro ejemplo de la grafica usando ggplot
library(ggplot2)
ggplot(Accesibilidad, aes(x= municipio)) + ggtitle('Accesibilidad carretera 2010 Pueblos Mágicos') + geom_bar(width=0.5, colour="red", fill="red") + labs(y="Grado de Accesibilidad")

Producción de la actividad turística
Los Censos económicos en México, generan indicadores, con información sobre producción y comercialización de bienes y mercancías, así como de la prestación de servicios.En este apartado se analizará la producción bruta total que se refiere al valor de todos los bienes y servicios producidos o comercializados por la unidad económica como resultado del ejercicio de sus actividades. La siguiente tabla muestra la Producción bruta total del Sector Económico de servicios de Alojamiento temporal y preparación de alimentos y bebidas.
basecom$CVE_MUN<-as.factor(basecom$CVE_MUN2)
basecom$CVE_MUN=factor(basecom$CVE_MUN2,levels=levels(basecom$CVE_MUN),labels = c("Tepoztlán","Huautla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"),ordered=F)
tabla1<-basecom[,217:223]
tabla1<-as.data.frame(tabla1)
tabla1
La siguiente gráfica señala el cambio de está Producción Bruta Total durante 2004,2009 y 2014 en los destinos seleccionados.
tabla1$CVE_MUN2<-as.factor(tabla1$CVE_MUN2)
tabla1$CVE_MUN2=factor(tabla1$CVE_MUN2,levels=levels(tabla1$CVE_MUN2),labels = c("Tepoztlán","Huautla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"),ordered=F)
Produccion<-rbind(tabla1$PBAL_2004,tabla1$PBAL_2009,tabla1$PBAL_2014)
Produccion
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 38834 44022 15083 29923 25384 88714
[2,] 90521 20750 20485 59683 44670 120314
[3,] 125924 23618 28845 87709 96581 159054
dimnames(Produccion)=list(c("2004","2009","2014"),c("Tepoztlan","Huatla de Jimenez","Cuetzalan del Progreso","Zacatlan","Ezequiel Montes","Tequisquiapan"))
barplot(Produccion,beside=T, ylab='Produccion bruta total',main = 'PBT en Alojamiento temporal',las=2,col=c("lightblue","blue","yellow"),ylim=c(0,150000))
legend(x = "topright", legend = c("2004", "2009","2014"), fill = c("lightblue", "blue","yellow"),
title = "Años")

mean(tabla1$PBAL_2004)
[1] 40326.67
mean(tabla1$PBAL_2009)
[1] 59403.83
mean(tabla1$PBAL_2014)
[1] 86955.17
Como pudimos observar, a excepción del Municipio de Huautla de Jiménez, todos los municipios experimentaron un incremento con respecto al año anterior.La siguiente tabla muestra la tasa de variación positiva de cada uno de ellos. El promedio de estas tasas de variación es 137%, es que el desempeño del sector turístico mejoró ampliamente durante esa década. Aunque, es importante mencionar que su inclusión en el programa de “Pueblos Mágicos,” difiere en años, incluso antes de este periodo.
| Tepoztlán |
224.2622 |
| Huautla de Jiménez |
-46.34955 |
| Cuetzalán del Progreso |
91.2418 |
| Zacatlán |
193.1157 |
| Ezequiel Montes |
280.4798 |
| Tequisquiapán |
79.2885 |
(tabla1[1,4]/tabla1[1,2]-1)*100
[1] 224.2622
(tabla1[2,4]/tabla1[2,2]-1)*100
[1] -46.34955
(tabla1[3,4]/tabla1[3,2]-1)*100
[1] 91.2418
(tabla1[4,4]/tabla1[4,2]-1)*100
[1] 193.1157
(tabla1[5,4]/tabla1[5,2]-1)*100
[1] 280.4798
(tabla1[6,4]/tabla1[6,2]-1)*100
[1] 79.2885
Inversión
La inversion se refiere al incremento en activos, insumos y productos que experimentaron las unidades económicas durante el año de referencia. Lo siguiente gráficos muestran la inversión en el sector de alojamiento y preparación de alimentos y bebidas , en azul y la producción del mismo sector en azul claro en 2004 y 2009. El año 2014 se omitió, dado que no es posible consultar el dato debido a problemas del Sistema Actualizado de información Censal del INEGI.
P_I2004<-rbind(tabla1$INV_2004,tabla1$PBAL_2004)
dimnames(P_I2004)=list(c("Inversión","Producción bruta total"),c("Tepoztlán","Huatla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"))
P_I2009<-rbind(tabla1$INV_2009,tabla1$PBAL_2009)
dimnames(P_I2009)=list(c("Inversión","Producción bruta total"),c("Tepoztlán","Huatla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"))
library(ggplot2)
ggplot() +
ggtitle('Inversión en Alojamiento temporal y Preparación de alimento')+
geom_bar(data=tabla1,aes(x=CVE_MUN2, y=INV_2004), stat='identity', position='dodge') +
coord_flip()

barplot(P_I2004,col=c("blue","light blue"),main = "PBT vs Inversión 2004")

ggplot() +
ggtitle('Inversión en Alojamiento temporal y Preparación de alimento')+
geom_bar(data=tabla1,aes(x=CVE_MUN2, y=INV_2009), stat='identity', position='dodge') +
coord_flip()

barplot(P_I2009,col=c("blue","light blue"),main = "PBT vs Inversión 2009")

Personal ocupado
Por otro lado, se analizarán la cifras de Personal ocupado, que se refieren a las personas que trabajaron durante el periodo de referencia dependiendo contractualmente o no de la unidad económica, sujetas a su dirección y control.Al respecto, se tratará de identificar si existe una relación lineal simple entre la producción brutal total y el personal ocupado de 2004 en el sector. Como primer paso, se presentán los histogramas de ambas variables.
hist(tabla1$PBAL_2004)

hist(tabla1$PER_2004)

Para estudiar la normalidad, además se realiza la prueba de shapiro por ser una muestra menor. Dado que ambas cifras dadas del p-valor, son mayores a 0.05, podemos decir que no tenemos evidencia de que no se trate de distribuciones normales. Aunque, podemos observar en el histograma de la Producción bruta total existe un sesgo a la derecha, mientras que la de Personal es bastante simetrica.
shapiro.test(tabla1$PBAL_2004)
Shapiro-Wilk normality test
data: tabla1$PBAL_2004
W = 0.85611, p-value = 0.1762
shapiro.test(tabla1$PER_2004)
Shapiro-Wilk normality test
data: tabla1$PER_2004
W = 0.95213, p-value = 0.7575
Con el objetivo de seguir explorando los comandos de R, impartidos como parte del curso, se asumirá que ambas variables son normales. En ese sentido, se ejecutará el coeficiente de Pearson para identificar si existe una correlación. El coeficiente de 0.74 aparece como indicio de que existe una correlación directa media.
cor(tabla1$PER_2004,tabla1$PBAL_2004, method="pearson")
[1] 0.742123
Por último, se llevará a cabo un ejercicio para tratar de establecer un modelo lineal. Las características del modelo lineal nos indican que el p valor es sólo ligeramente mayor a 0.05 y el ajuste nos dice que el modelo solo explicaría el 40% de la variabilidad del personal ocupado respecto a la Producción Bruta Total.
ejercicio <- lm(tabla1$PBAL_2004 ~ tabla1$PER_2004)
summary(ejercicio)
Call:
lm(formula = tabla1$PBAL_2004 ~ tabla1$PER_2004)
Residuals:
1 2 3 4 5 6
-5470 25260 -8010 -18800 -10347 17366
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4268.00 18094.56 0.236 0.8251
tabla1$PER_2004 88.38 39.91 2.214 0.0912 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 19330 on 4 degrees of freedom
Multiple R-squared: 0.5507, Adjusted R-squared: 0.4384
F-statistic: 4.904 on 1 and 4 DF, p-value: 0.09118
Así,el siguiente gráfico asocia el modelo planteado anteriormente y se puede identificar que la correlación no es muy precisa, como los parámetros, mencionados arriba, nos indican. A estós, podemos añadir los posibles errores que una muestra tan pequeña puedan suponer para este tipo de modelos.
plot(tabla1$PBAL_2004 ~ tabla1$PER_2004)
abline(lm(tabla1$PBAL_2004~ tabla1$PER_2004))

qplot(tabla1$PER_2004,tabla1$PBAL_2004,geom=c("point","smooth"))

Actividad turística en los Pueblos Mágicos (2017)
En la presente seección, se muestran alunos gráficos que comparan la actividad turística en los 6 Pueblos mágicos seleccionados durante el año 2017. Los gráficos muestran el total de número de cuartos, hoteles, turistas recibidos, e ingresos por actividad turística en dicho año.
datos2<-read.csv("DatosPM.csv", header = T)
datos2
Cuartos<-datos2$NUM_CUAR
Cuartos
[1] 972 130 824 1400 811 1126
PuebloMagico<-datos2$PM
PuebloMagico
[1] "Tepoztlán" "Huautla de Jiménez"
[3] "Cuetzalan del Progreso" "Zacatlán"
[5] "Ezequiel Montes" "Tequisquiapan"
TEH<-datos2$TEH
TEH
[1] 89 8 64 152 76 48
Cuartos
[1] 972 130 824 1400 811 1126
names(Cuartos)<-datos2$PM
Cuartos
Tepoztlán Huautla de Jiménez Cuetzalan del Progreso
972 130 824
Zacatlán Ezequiel Montes Tequisquiapan
1400 811 1126
barplot(Cuartos,
main="Número de cuartos disponibles",
xlab="PM",
ylab="Cuartos")

names(TEH)<-datos2$PM
TEH
Tepoztlán Huautla de Jiménez Cuetzalan del Progreso
89 8 64
Zacatlán Ezequiel Montes Tequisquiapan
152 76 48
barplot(TEH,
main="Número de hoteles en los PM",
xlab="PM",
ylab="Hoteles disponibles")

turistas<-datos2$NUM_TUR
turistas
[1] 248591 13000 116388 140848 189800 111307
names(turistas)<-datos2$PM
turistas
Tepoztlán Huautla de Jiménez Cuetzalan del Progreso
248591 13000 116388
Zacatlán Ezequiel Montes Tequisquiapan
140848 189800 111307
barplot(turistas,
main="Número de turistas en los PM",
xlab="PM",
ylab="Número de turistas")

ingresos<-datos2$I_AT
ingresos
[1] 472.300 0.004 232.700 277.500 341.600 222.600
names(ingresos)<-datos2$PM
ingresos
Tepoztlán Huautla de Jiménez Cuetzalan del Progreso
472.300 0.004 232.700
Zacatlán Ezequiel Montes Tequisquiapan
277.500 341.600 222.600
barplot(ingresos,
main="Ingresos por turismo en los PM (Millones de pesos)",
xlab="PM",
ylab="Ingreso")

Agrario<-datos2$P_A
Agrario
[1] 99.7 14.3 69.1 149.0 85.9 202.5
names(Agrario)<-datos2$PM
Agrario
Tepoztlán Huautla de Jiménez Cuetzalan del Progreso
99.7 14.3 69.1
Zacatlán Ezequiel Montes Tequisquiapan
149.0 85.9 202.5
A partir de los datos mostrados, podemos definir la media generada por cada localidad en los rubros mencionados
mean(datos2$I_AT)
[1] 257.784
mean(datos2$TEH)
[1] 72.83333
mean(datos2$NUM_TUR)
[1] 136655.7
mean(datos2$NUM_CUAR)
[1] 877.1667
Finalmente, el siguiente gráfico muestra que al comparar los ingresos de la producción agraria con los de turismo el mismo año, en 5 de los 6 Pueblos Mágicos, se obtienen mayores inresos por actividad turística. Incluso la media muestra que en general se obtiene más de el doble de ingresos por turismo. Resultado del abandono del campo y la dependencia al turismo de estos sitios.
Agrario<-datos2$P_A
Agrario
[1] 99.7 14.3 69.1 149.0 85.9 202.5
names(Agrario)<-datos2$PM
Agrario
Tepoztlán Huautla de Jiménez Cuetzalan del Progreso
99.7 14.3 69.1
Zacatlán Ezequiel Montes Tequisquiapan
149.0 85.9 202.5
ingresos<-datos2$I_AT
ingresos
[1] 472.300 0.004 232.700 277.500 341.600 222.600
names(ingresos)<-datos2$PM
ingresos
Tepoztlán Huautla de Jiménez Cuetzalan del Progreso
472.300 0.004 232.700
Zacatlán Ezequiel Montes Tequisquiapan
277.500 341.600 222.600
AyT<-rbind(Agrario,
ingresos)
AyT
Tepoztlán Huautla de Jiménez Cuetzalan del Progreso Zacatlán
Agrario 99.7 14.300 69.1 149.0
ingresos 472.3 0.004 232.7 277.5
Ezequiel Montes Tequisquiapan
Agrario 85.9 202.5
ingresos 341.6 222.6
barplot(AyT,beside=T,
main="Ingresos por producción Agraria y Turismo en PM (Millones de pesos)",
xlab="PM",
ylab="MDP",
col=c("blue","grey"))
legend(x = "topright", legend =c("Ingreso Producción agraria", "Ingreso por Turismo"),
fill = c("blue","grey"),
title="Ingreso por Producción agraria y Turismo (2017)")

mean(datos2$P_A)
[1] 103.4167
mean(datos2$I_AT)
[1] 257.784
Producción agrícola
A continuación se analiza la información de la producción agrícola en los seis Pueblos Mágicos seleccionados.
Se consideró relevante revisar dicha información, dado que la actividad económica principal en el medio rural mexicano es fundamentalmente agrícola, principalmente en aquellas localidades con alta concentración de población indígena.
Para identificar la importancia de la actividad agrícola en los municipios seleccionados adscritos al Programa de Pueblos Mágicos se observan los datos del periodo 2003-2018 de las siguientes variables:
- Superficie sembrada
- Valor de la producción agrícola
pivot <- excel_agricola %>% group_by(nommunicipio) %>% summarise(
sup_total = n(),
sup_sembrada = mean(sembrada),
sup_cosechada = mean(cosechada),
valor_produccion_milespesos= mean(valorproduccionKP))
`summarise()` ungrouping output (override with `.groups` argument)
Histograma superficie sembrada por municipio, 2003-2018
ggplot(data=pivot, aes(x=nommunicipio, y=sup_sembrada)) +
geom_bar(stat="identity", position="dodge") +
xlab("Municipio") + ylab("Hectáreas") +
ggtitle("Superficie sembrada promedio por municipio 2003-2018") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

Histograma Valor de la producción por municipio, 2003-2018
ggplot(data=pivot, aes(x=nommunicipio, y=valor_produccion_milespesos)) +
geom_bar(stat="identity", position="dodge") +
xlab("Municipio") + ylab("Miles de pesos") +
ggtitle("Valor de la producción por municipio 2003-2018") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

Destaca que de los municipios seleccionados, aquellos con población preponderantemente indígena como son Cuetzalán del Progreso, Puebla y Huautla de Jimenez, Oaxaca destinan las mayores superficies sembradas, no obstante, el mayor valor de la producción agrícola lo ocupa el municipio de Tequisquiapan, Querétaro. Huautla de Jiménez por su parte reporta el menor valor de la producción agrícola de los seis municipios.
En la siguiente gráfica se muestra la evoluación del valor de la producción agrícola para cada uno de los seis municipios. Conviene destacar que Cuetzalan del Progreso y Ezequiel Montes se adhirieron al Programa de Pueblos Mágicos en 2002 y 2005, respectivamente. El resto obtuvo la adscripción posterior al 2010, siendo Huautla de Jiménez el último (2015).
ggplot(VPAgr, aes(x=Anio, y= ValProdAgr, group = Municipio, colour =Municipio )) +
geom_line() + xlab("Año") + ylab("Miles de pesos") +
geom_point( size=0.5, shape=21, fill="white") +
theme_minimal()

A continuación se presenta el análisis por municipio para identificar los principales cultivos y la evolución de su producción en el periodo 2003-2018.
Huautla de Jiménez
grupo_hj1<- excel_agricola %>% filter(nommunicipio== 'Huautla de Jiménez' & anio==2018) %>%
group_by (nomcultivo) %>%
summarise ( SupPromSemb = mean (sembrada),
SupPromCos = mean (cosechada),
ValorProd = mean (valorproduccionKP))
`summarise()` ungrouping output (override with `.groups` argument)
grupo_hj2 <- excel_agricola %>% filter(nommunicipio== 'Huautla de Jiménez') %>%
group_by (nomcultivo,anio,sembrada) %>%
summarise(valorproduccionKP)
`summarise()` regrouping output by 'nomcultivo', 'anio', 'sembrada' (override with `.groups` argument)
En el municipio de Huautla de Jimenez se observa la alta concentración de la producción agrícola en dos cultivos proncipalmente: café cereza y maíz grano.
Como se observa en la segunda gráfica, el valor de la producción del café tuvo una caída drástica en el año 2012.
ggplot(data=grupo_hj1, aes(x=nomcultivo, y=ValorProd)) +
geom_bar(stat="identity", position="stack") +
xlab("Cultivo") + ylab("Miles de pesos") +
ggtitle("Huautla de Jimenez. Valor de la producción agrícola 2003-2018") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(grupo_hj2, aes(x=anio, y=valorproduccionKP, group = nomcultivo, colour =nomcultivo )) +
geom_line() + xlab("Año") + ylab("Miles de pesos") +
geom_point( size=0.5, shape=21, fill="white") +
theme_minimal()

Cuetzalan del Progreso
grupo_cuet1<- excel_agricola %>% filter(nommunicipio== 'Cuetzalan del Progreso' & anio==2018) %>%
group_by (nomcultivo) %>%
summarise ( SupPromSemb = mean (sembrada),
SupPromCos = mean (cosechada),
ValorProd = mean (valorproduccionKP))
`summarise()` ungrouping output (override with `.groups` argument)
grupo_cuet2 <- excel_agricola %>% filter(nommunicipio== 'Cuetzalan del Progreso') %>%
group_by (nomcultivo,anio,sembrada) %>%
summarise(valorproduccionKP)
`summarise()` regrouping output by 'nomcultivo', 'anio' (override with `.groups` argument)
Cuetzalan del Progreso también concentra una alta dependencia de la producción agrícola en pocos cultivos, principalmente el café cereza. También se muestra la inestabilidad en el valor de su producción del café, aunque con una tendencia creciente a partir de 2016.
ggplot(data=grupo_cuet1, aes(x=nomcultivo, y=ValorProd)) +
geom_bar(stat="identity", position="stack") +
xlab("Cultivo") + ylab("Miles de pesos") +
ggtitle("Cuetzalan del Progreso. Valor de la producción agrícola 2003-2018") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(grupo_cuet2, aes(x=anio, y=valorproduccionKP, group = nomcultivo, colour =nomcultivo )) +
geom_line() + xlab("Año") + ylab("Miles de pesos") +
geom_point( size=0.5, shape=21, fill="white") +
theme_minimal()

Tequisquiapan
grupo_tequis1<- excel_agricola %>% filter(nommunicipio== 'Tequisquiapan' & anio==2018) %>%
group_by (nomcultivo) %>%
summarise ( SupPromSemb = mean (sembrada),
SupPromCos = mean (cosechada),
ValorProd = mean (valorproduccionKP))
`summarise()` ungrouping output (override with `.groups` argument)
grupo_tequis2 <- excel_agricola %>% filter(nommunicipio== 'Tequisquiapan') %>%
group_by (nomcultivo,anio,sembrada) %>%
summarise(valorproduccionKP)
`summarise()` regrouping output by 'nomcultivo', 'anio', 'sembrada' (override with `.groups` argument)
En contraste con los municipios de Huautla de Jiménez y Cuetzalan del Progreso, tanto en Tequisquiapan como Zacatlán se observa una mayor diversidad de cultivos e incluso en la evolución entre 2003 y 2018 se observa el crecimiento de la participación de cultivos no tradicionales.
ggplot(data=grupo_tequis1, aes(x=nomcultivo, y=ValorProd)) +
geom_bar(stat="identity", position="stack") +
xlab("Cultivo") + ylab("Miles de pesos") +
ggtitle("Tequisquiapan. Valor de la producción agrícola 2003-2018") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(grupo_tequis2, aes(x=anio, y=valorproduccionKP, group = nomcultivo, colour =nomcultivo )) +
geom_line() + xlab("Año") + ylab("Miles de pesos") +
geom_point( size=0.5, shape=21, fill="white") +
theme_minimal()

Zacatlán
grupo_zac1<- excel_agricola %>% filter(nommunicipio== 'Zacatlán' & anio==2018) %>%
group_by (nomcultivo) %>%
summarise ( SupPromSemb = mean (sembrada),
SupPromCos = mean (cosechada),
ValorProd = mean (valorproduccionKP))
`summarise()` ungrouping output (override with `.groups` argument)
grupo_zac2 <- excel_agricola %>% filter(nommunicipio== 'Zacatlán') %>%
group_by (nomcultivo,anio,sembrada) %>%
summarise(valorproduccionKP)
`summarise()` regrouping output by 'nomcultivo', 'anio', 'sembrada' (override with `.groups` argument)
ggplot(data=grupo_zac1, aes(x=nomcultivo, y=ValorProd)) +
geom_bar(stat="identity", position="stack") +
xlab("Cultivo") + ylab("Miles de pesos") +
ggtitle("Zacatlán. Valor de la producción agrícola 2003-2018") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(grupo_zac2, aes(x=anio, y=valorproduccionKP, group = nomcultivo, colour =nomcultivo )) +
geom_line() + xlab("Año") + ylab("Miles de pesos") +
geom_point( size=0.5, shape=21, fill="white") +
theme_minimal()

DQotLS0NCnRpdGxlOiAiUHVlYmxvcyBNw6FnaWNvcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCl9Qb2zDrXRpY2EgUMO6YmxpY2EgUHVlYmxvcyBNw6FnaWNvc18NCg0KRGVzZGUgbGEgZMOpY2FkYSBkZSBsb3Mgbm92ZW50YSwgZWwgbW9kZWxvIGRlIGRlc2Fycm9sbG8gY29ub2NpZG8gY29tbyDigJxOdWV2YSBydXJhbGlkYWTigJwgZm9tZW50w7MgZW4gQW3DqXJpY2EgTGF0aW5hIGVsIGltcGxlbWVudG8gZGUgcG9sw610aWNhcyBww7pibGljYXMgYSBmaW4gZGUgZGl2ZXJzaWZpY2FyIGxhcyBhY3RpdmlkYWRlcyBlY29uw7NtaWNhcyBiYWpvIGxhIHByZW1pc2EgZGUgY29tYmF0aXIgbGEgcG9icmV6YSBlbiBjb250ZXh0b3MgcnVyYWxlcyAoUm9zYWRvIHkgR29uesOhbGV6LCAyMDE2KS4NCg0KRW4gZGljaG8gdGVub3IsIGVsIFByb2dyYW1hIGRlIFB1ZWJsb3MgTcOhZ2ljb3MgZGUgTcOpeGljbywgZXMgdW5hIHBvbMOtdGljYSBww7pibGljYSBxdWUgZGVzZGUgaW5pY2lvcyBkZSBsYSBkw6ljYWRhIGRlbCAyMDAwIGJ1c2NhYmEgaW1wdWxzYXIgZWwgdHVyaXNtbyBjb21vIHVuYSBoZXJyYW1pZW50YSBxdWUgcG9kcsOtYSBhcG95YXIgZW4gZWwgYWxjYW5jZSBkZSB1biBkZXNhcnJvbGxvIHNvc3RlbmlibGUgcGFyYSBsYXMgY29tdW5pZGFkZXMgcnVyYWxlcyBkZWwgcGHDrXMuIERpY2hvIHByb2dyYW1hLCBjb25zaXN0w61hWzFdIGVuIG90b3JnYXIgYXBveW8gZmluYW5jaWVybyBhIGxhcyBjYWJlY2VyYXMgbXVuaWNpcGFsZXMgcXVlIGNvbnRhcmFuIGNvbiBhbGfDum4gdGlwbyBkZSBwYXRyaW1vbmlvIGJpb2N1bHR1cmFsIHF1ZSBwZXJtaXRpZXJhIGp1c3RpZmljYXIgc3Ug4oCcbWFnaWHigJ0geSBhc8OtLCBwb2RlciBtZWpvcmFyIGxhIG9mZXJ0YSBlIGluZnJhZXN0cnVjdHVyYSAoTWFkcmlkLCAyMDE2KS4NCg0KVHJhcyBkaWVjaW9jaG8gYcOxb3MgZGUgZWplY3VjacOzbiwgeSB1biB0b3RhbCBkZSAxMjEgbG9jYWxpZGFkZXMgZGVjbGFyYWRhcyDigJxQdWVibG8gTcOhZ2ljb+KAnSwgbG9zIGdvYmllcm5vcyBsb2NhbGVzIGUgaW5kdXN0cmlhIHR1csOtc3RpY2EgbG8gY29uc2lkZXJhbiBjb21vIHVuYSBpbmljaWF0aXZhIGV4aXRvc2EgcXVlIGhhIHBlcm1pdGlkbyBlbCBkZXNhcnJvbGxvIGVjb27Ds21pY28geSBiaWVuZXN0YXIgc29jaWFsIGEgcGFydGlyIGRlbCBuw7ptZXJvIGRlIHZpc2l0YW50ZXMsIGluZ3Jlc29zIHkgZW1wbGVvcyBnZW5lcmFkb3MgZW4gZXN0b3Mgc2l0aW9zIChTZWNyZXRhcsOtYSBkZSBUdXJpc21vLCAyMDIwKS4gDQoNCkNvbiBtaXJhcyBhIHVuIGRlc2Fycm9sbG8gc29zdGVuaWJsZSwgZWwgw6l4aXRvIGRlbCBwcm9ncmFtYSBlcyBjdWVzdGlvbmFibGUgc2kgc29sbyBzZSBwcmlvcml6YSBlbCBiZW5lZmljaW8gZWNvbsOzbWljbyB5IHNlIGVzIHBlcm1pc2l2byBjb24gZWwgcmVwbGljYW1pZW50byBkZSBpbXBhY3RvcyBzb2Npby1hbWJpZW50YWxlcyB0w61waWNvcyBkZWwgdHVyaXNtbyBkZSBtYXNhcyBlbiBsb3MgUHVlYmxvcyBNw6FnaWNvcywgdGFsZXMgY29tbyBsYSBzYXR1cmFjacOzbiBkZWwgZXNwYWNpbyBww7pibGljbywgaW5qdXN0YSBkaXN0cmlidWNpw7NuIGRlIGxhIHJpcXVlemEsIGFmZWN0YWNpb25lcyBkaXJlY3RhcyBhbCBwYXRyaW1vbmlvLCBkYcOxbyBhbCByZWN1cnNvIG5hdHVyYWwsIGhvbW9nZW5pemFjacOzbiBkZSBsb3MgZGVzdGlub3MsIGluY3JlbWVudG8gZGUgbG9zIHJlc2lkdW9zIHPDs2xpZG9zIHkgc2VncmVnYWNpw7NuIHNvY2lhbCAoRGF2aWRzb24sIDE5OTg7IE1hc29uLCAyMDA4KQ0KDQpBIHBhcnRpciBkZSBlbGxvLCBsYSBpbnRlbmNpw7NuIGRlbCBwcmVzZW50ZSBwcm95ZWN0bywgZXMgYW5hbGl6YXIgY3VhbnRpdGF0aXZhbWVudGUgbGFzIGNvbmRpY2lvbmVzIHNvY2lvZWNvbsOzbWljYXMsIG1lZGlvYW1iaWVudGFsZXMgeSBkZSBpbmZyYWVzdHJ1Y3R1cmEgZW4gc2VpcyBtdW5pY2lwaW9zIGNvbiBub21icmFtaWVudG8gZGUgUHVlYmxvIE3DoWdpY28gYSBmaW4gZGUgZGVsaW1pdGFyIGxvcyBjYW1iaW9zIGdlbmVyYWRvcyBhIHBhcnRpciBkZSBsYSBlbnRyYWRhIGVuIHZpZ29yIGRlbCBwcm9ncmFtYS4NCg0KDQpgYGB7cn0NCnNldHdkKCJDOi9SU0MvUzEyIikNCmluc3RhbGwucGFja2FnZXMoYygicmVhZHhsIiwgImRwbHlyIikpDQppbnN0YWxsLnBhY2thZ2VzKCd0YWJsZXMnKQ0KaW5zdGFsbC5wYWNrYWdlcygncmVzaGFwZTInKQ0KaW5zdGFsbC5wYWNrYWdlcygncmVhZHInKQ0KaW5zdGFsbC5wYWNrYWdlcygnZ2dwbG90MicpDQppbnN0YWxsLnBhY2thZ2VzKCdkYXRhLnRhYmxlJykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGFibGVzKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpleGNlbF9hZ3JpY29sYSA8LSByZWFkX2V4Y2VsKCJhZ3JpY29sYV9zaWFwXzIwMDNfMjAxOF9QTS54bHN4IixzaGVldD0iQWN0IEFncmljb2xhIikNCnJlc3VtZW5fYWdyaWNvbGEgPC0gcmVhZF9leGNlbCgiYWdyaWNvbGFfc2lhcF8yMDAzXzIwMThfUE0ueGxzeCIsc2hlZXQ9IkFnclBNIikNClZQQWdyIDwtIHJlYWRfZXhjZWwoImFncmljb2xhX3NpYXBfMjAwM18yMDE4X1BNLnhsc3giLHNoZWV0PSJWUEFnciIpDQpgYGANCg0KYGBge3J9DQpiYXNlY29tIDwtIHJlYWQuY3N2KCJCRi5jc3YiLCBoZWFkZXI9VCkNCg0KYGBgDQoNCkVuIHByaW1lciBsdWdhciwgc2UgZGVzcGxpZWdhIGVuIGdyw6FmaWNhcyBkZSBiYXJyYXMgbGEgZXZvbHVjacOzbiBkZWwgY3JlY2ltaWVudG8gcG9ibGFjaW9uYWwgZGUgbG9zIDYgKlB1ZWJsb3MgTcOhZ2ljb3MqIHNlbGVjY2lvbmFkb3MuIENhYmUgcmVjb3JkYXIgcXVlIGVsIHByb2dyYW1hICJQdWVibG9zIE3DoWdpY29zIiBlbnRyw7MgZW4gdmlnb3IgZW4gZWwgYcOxbyAyMDAxLCBwb3IgbG8gcXVlIHNlIHJldmlzw7MgZWwgY3JlY2ltaWVudG8gcG9ibGFjaW9uYWwgZGVsIGHDsW8gcHJldmlvICgyMDAwKSwgcGFyYSBvYnNlcnZhciBsb3MgY2FtYmlvcyBlbiBkaWNoYSB2YXJpYWJsZSwgYSByYcOteiBkZWwgaW5pY2lvIGRlbCBwcm9ncmFtYS4gRW4gcmVzdW1lbiwgc2UgZWxpZ2llcm9uIGxvcyBhw7FvcyAyMDAwLCAyMDA1IHkgMjAxMCBwYXJhIG9ic2VydmFyIGVsIGNyZWNpbWllbnRvIHBvYmxhY2lvbmFsIGVuIFRlcG96dGzDoW4sIEh1YXV0bGEgZGUgSmltZW5leiwgQ3VldHphbGFuIGRlbCBQcm9ncmVzbywgWmFjYXRsw6FuLCBFemVxdWllbCBNb250ZXMgeSBUZXF1aXNxdWlhcGFuLg0KYGBge3J9DQpQb2IyMDAwPC1jKDM0MDU1LCAzMzEzMCwgNDY2ODIsIDcxOTg1LCAzMDUwMiwgNTUyNjUpDQpuYW1lcyhQb2IyMDAwKTwtdGFibGExJFBVRUJMTw0KYmFycGxvdChQb2IyMDAwLCBtYWluPSJQb2JsYWNpw7NuIGVuIGVsIGHDsW8gMjAwMCIsIHhsYWI9IlB1ZWJsb3MgTcOhZ2ljb3MiLHlsYWI9IkNhbnRpZGFkIGRlIFBvYmxhY2nDs24iLGNvbD1jKCJsaWdodGJsdWUiLCJibHVlIiwieWVsbG93IiwicmVkIiwiZ3JlZW4iLCJwdXJwbGUiKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQpgYGB7cn0NClBvYjIwMDU8LWMoMzk0NjMsMzM4MTAsNTAzNTIsNzUwNzgsMzI5NDEsNTk2MjcpDQpuYW1lcyhQb2IyMDA1KTwtdGFibGExJFBVRUJMTw0KYmFycGxvdChQb2IyMDA1LCBtYWluPSJQb2JsYWNpw7NuIGVuIGVsIGHDsW8gMjAwNSIsIHhsYWI9IlB1ZWJsb3MgTcOhZ2ljb3MiLHlsYWI9IkNhbnRpZGFkIGRlIFBvYmxhY2nDs24iLGNvbD1jKCJsaWdodGJsdWUiLCJibHVlIiwieWVsbG93IiwicmVkIiwiZ3JlZW4iLCJwdXJwbGUiKSkNCmBgYA0KYGBge3J9DQpQb2IyMDEwPC1jKDQ1OTA2LDM0NzQ3LDU0MjAyLDc4MzYyLDM1NzE2LDY0NjEzKQ0KbmFtZXMoUG9iMjAxMCk8LXRhYmxhMSRQVUVCTE8NCmJhcnBsb3QoUG9iMjAxMCwgbWFpbj0iUG9ibGFjacOzbiBlbiBlbCBhw7FvIDIwMTAiLCB4bGFiPSJQdWVibG9zIE3DoWdpY29zIix5bGFiPSJDYW50aWRhZCBkZSBQb2JsYWNpw7NuIixjb2w9YygibGlnaHRibHVlIiwiYmx1ZSIsInllbGxvdyIsInJlZCIsImdyZWVuIiwicHVycGxlIikpDQpgYGANCg0KRW4gZWwgY2FzbyBkZSBUZXBvenRsw6FuLCBzZSBvYnNlcnZhIHVuIGNyZWNpbWllbnRvIHBvYmxhY2lvbmFsIHNvc3RlbmlkbywgYSBwYXJ0aXIgZGUgbGEgZW50cmFkYSBlbiB2aWdvciBkZWwgcHJvZ3JhbWEgIlB1ZWJsb3MgTcOhZ2ljb3MiLiBEZSBhY3VlcmRvIGNvbiBHdXptw6FuIHkgTGXDs24gKDIwMDUpLCBlc3RvIHB1ZWRlIGRlYmVyc2UgYWwgZGVzYXJyb2xsbyB0dXLDrXN0aWNvIHF1ZSBoYSBhdHJhw61kbyBhIHVuIGdyYW4gbsO6bWVybyBkZSBleHRyYW5qZXJvcywgbG9zIGN1YWxlcyBlbGlnaWVyb24gZXN0YWJsZWNlciBlbiBUZXBvenRsw6FuIHN1IGx1Z2FyIGRlIHJlc2lkZW5jaWEuIFBvciBvdHJhIHBhcnRlLCBzaSBzZSBsZXMgY29tcGFyYSBjb24gZWwgcmVzdG8gZGUgbG9zIHB1ZWJsb3MgZWxlZ2lkb3MsIHRhbnRvIEh1YXV0bGEgZGUgSmltw6luZXogY29tbyBFemVxdWllbCBNb250ZXMgc29uIGxvcyBkb3MgdGVycml0b3Jpb3MgY29uIG1lbm9yIGNhbnRpZGFkIGRlIHBvYmxhY2nDs247IHNpbiBlbWJhcmdvLCDDqXN0ZSDDumx0aW1vIHJlZ2lzdHLDsyB1biBtYXlvciBpbmNyZW1lbnRvIHBvYmxhY2lvbmFsIGVuIDIwMTAuIA0KUG9yIHN1IHBhcnRlLCBaYWNhdGzDoW4gZXMgZWwgcHVlYmxvIG3DoWdpY28gY29uIG1heW9yIGNhbnRpZGFkIGRlIHBvYmxhY2nDs24sIGN1ZXN0acOzbiBxdWUgcHVlZGUgZXN0YXIgcmVsYWNpb25hZGEgY29uIGVsIHRhbWHDsW8gZGUgc3Ugc3VwZXJmaWNpZSwgbGEgY3VhbCBlcXVpdmFsZSBhIDQ4OS4zIGttwrIuIEVuIGVzdGUgdGVub3IsIFRlcXVpc3F1aWFwYW4gY3VlbnRhIGNvbiAgdW5hIHN1cGVyZmljaWUgdGVycml0b3JpYWwgZGUgMzQzLjYga23CsiwgbG8gY3VhbCB0YW1iacOpbiBwdWVkZSBleHBsaWNhciBxdWUgc2VhIGVsIHNlZ3VuZG8gcHVlYmxvIGNvbiBtYXlvciBjYW50aWRhZCBkZSBwb2JsYWNpw7NuIGRlIG51ZXN0cmEgbXVlc3RyYS4gDQpGaW5hbG1lbnRlLCBDdWV0emFsYW4gZGVsIFByb2dyZXNvIHByZXNlbnTDsyB1biBpbmNyZW1lbnRvIHBvYmxhY2lvbmFsIGRlbCA3LjglLCBlbiAyMDA1LCBjb24gcmVzcGVjdG8gYWwgYcOxbyAyMDAwIHksIHBhcmEgZWwgYcOxbyAyMDEwLCBlbCBpbmNyZW1lbnRvIGZ1ZSBkZWwgMTQuNDYlDQpfUHJvZHVjdG8gSW50ZXJubyBCcnV0byB5IFZ1bG5lcmFiaWxpZGFkXyANCkxhIHNpZ3VpZW50ZSBncsOhZmljYSBtdWVzdHJhIGxhIGV2b2x1Y2nDs24gZGVsIFByb2R1Y3RvIEludGVybm8gQnJ1dG8gZGUgbG9zIGRlc3Rpbm9zIHNlbGVjY2lvbmFkb3MgZW50cmUgMjAwMCB5IDIwMTUuIA0KYGBge3J9DQpiYXNlY29tJENWRV9NVU48LWFzLmZhY3RvcihiYXNlY29tJENWRV9NVU4yKQ0KdGFibGEzPC1iYXNlY29tWywyMzoyNl0NCnRhYmxhMzwtYXMuZGF0YS5mcmFtZSh0YWJsYTMpDQp0YWJsYTMNClByb2R1Y3RvPC1yYmluZCh0YWJsYTMkUElCMDAsdGFibGEzJFBJQjA1LHRhYmxhMyRQSUIxMCx0YWJsYTMkUElCMTUpDQpQcm9kdWN0bw0KZGltbmFtZXMoUHJvZHVjdG8pPWxpc3QoYygiMjAwMCIsIjIwMDUiLCIyMDEwIiwiMjAxNSIpLGMoIlRlcG96dGzDg8KhbiIsIkh1YXRsYSBkZSBKaW3Dg8KpbmV6IiwiQ3VldHphbMODwqFuIGRlbCBQcm9ncmVzbyIsIlphY2F0bMODwqFuIiwiRXplcXVpZWwgTW9udGVzIiwiVGVxdWlzcXVpYXDDg8KhbiIpKQ0KYmFycGxvdChQcm9kdWN0byxiZXNpZGU9VCx4bGFiPSdQdWVibG9zIE1hZ2ljb3MnLCB5bGFiPSdQSUInLG1haW49ICdQSUInLGNvbD1jKCJsaWdodGJsdWUiLCJibHVlIiwicGluayIsImFxdWFtYXJpbmUiKSx5bGltPWMoMCw0MDAwKSkNCmxlZ2VuZCh4ID0gInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiMjAwMCIsICIyMDA1IiwiMjAxMCIsIjIwMTUiKSwgZmlsbCA9IGMoImxpZ2h0Ymx1ZSIsICJibHVlIiwicGluayIsImFxdWFtYXJpbmUiKSwgDQogICAgICAgdGl0bGUgPSAiQcOxb3MiKQ0KDQpgYGANCkRlIGxhIG1pc21hIGZvcm1hLCBsYSBzaWd1aWVudGUgZ3LDoWZpY2EgZGUgYmFycmFzIGhhY2UgcmVmZXJlbmNpYSBhIGxvcyBjYW1iaW9zIHF1ZSBleHBlcmltZW50byBlbCBJbmRpY2UgZGUgTWFyZ2luYWNpw7NuLCBkdXJhbnRlIGVsIG1pc21vIHBlcmlvZG8uIA0KYGBge3J9DQp0YWJsYTQ8LWJhc2Vjb21bLDE5NToxOThdDQp0YWJsYTQ8LWFzLmRhdGEuZnJhbWUodGFibGE0KQ0KdGFibGE0DQpJbmRNYXI8LXJiaW5kKHRhYmxhNCRJTV8wMCx0YWJsYTQkSU1fMDUsdGFibGE0JElNXzEwLHRhYmxhNCRJTV8xNSkNCkluZE1hcg0KZGltbmFtZXMoUHJvZHVjdG8pPWxpc3QoYygiMjAwMCIsIjIwMDUiLCIyMDEwIiwiMjAxNSIpLGMoIlRlcG96dGzDg8KhbiIsIkh1YXRsYSBkZSBKaW3Dg8KpbmV6IiwiQ3VldHphbMODwqFuIGRlbCBQcm9ncmVzbyIsIlphY2F0bMODwqFuIiwiRXplcXVpZWwgTW9udGVzIiwiVGVxdWlzcXVpYXDDg8KhbiIpKQ0KYmFycGxvdChJbmRNYXIsYmVzaWRlPVQseGxhYj0nUHVlYmxvcyBNYWdpY29zJywgeWxhYj0nUElCJyxtYWluID0gJ0luZGljZSBkZSBtYXJnaW5hY2lvbicsY29sPWMoImxpZ2h0Ymx1ZSIsImJsdWUiLCJwaW5rIiwiYXF1YW1hcmluZSIpLHlsaW09YygwLDIpKQ0KbGVnZW5kKHggPSAidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCIyMDAwIiwgIjIwMDUiLCIyMDEwIiwiMjAxNSIpLCBmaWxsID0gYygibGlnaHRibHVlIiwgImJsdWUiLCJwaW5rIiwiYXF1YW1hcmluZSIpLCANCiAgICAgICB0aXRsZSA9ICJBw7FvcyIpDQoNCmBgYA0KDQpBZGVtw6FzLCBlbCBzaWd1aWVudGUgZ3LDoWZpY28gZGUgcHVudG9zIG11ZXN0cmEgbGEgcmVsYWNpw7NuIGVudHJlIGVsIFBJQiB5IGVsIEluZGljZSBkZSBNYXJnaW5hY2nDs24gZW4gZWwgMjAxNS4gDQpgYGB7cn0NCnFwbG90KHRhYmxhMyRQSUIxNSx0YWJsYTQkSU1fMTUsZ2VvbSA9IGMoInBvaW50Iiwic21vb3RoIikpDQpgYGANCg0KDQoNCl9BY2Nlc2liaWxpZGFkXw0KYGBge3J9DQpyZWFkX3hsc3goIkFjY2VzaWJpbGlkYWQueGxzeCIpDQoNCg0KQWNjZXNpYmlsaWRhZCA8LSByZWFkX3hsc3goIkFjY2VzaWJpbGlkYWQueGxzeCIpDQoNCg0KdGFibGUoQWNjZXNpYmlsaWRhZCRtdW5pY2lwaW8pDQpiYXJwbG90KHRhYmxlKEFjY2VzaWJpbGlkYWQkbXVuaWNpcGlvKSwgbWFpbj0nQWNjZXNpYmlsaWRhZCBjYXJyZXRlcmEgZW4gMjAxMCcsIGNvbCA9ICdncmVlbicsIHhsYWIgPSAnUHVlYmxvcyBtw6FnaWNvcycsIHlsYWIgPSAnR3JhZG8gZGUgYWNjZXNpYmlsaWRhZCcpDQoNCmBgYA0KQXF1w60gb3RybyBlamVtcGxvIGRlIGxhIGdyYWZpY2EgdXNhbmRvIGdncGxvdA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoQWNjZXNpYmlsaWRhZCwgYWVzKHg9IG11bmljaXBpbykpICsgZ2d0aXRsZSgnQWNjZXNpYmlsaWRhZCBjYXJyZXRlcmEgMjAxMCBQdWVibG9zIE3DoWdpY29zJykgKyBnZW9tX2Jhcih3aWR0aD0wLjUsIGNvbG91cj0icmVkIiwgZmlsbD0icmVkIikgKyBsYWJzKHk9IkdyYWRvIGRlIEFjY2VzaWJpbGlkYWQiKQ0KYGBgDQoNCl9Qcm9kdWNjacOzbiBkZSBsYSBhY3RpdmlkYWQgdHVyw61zdGljYV8NCg0KTG9zIENlbnNvcyBlY29uw7NtaWNvcyBlbiBNw6l4aWNvLCBnZW5lcmFuIGluZGljYWRvcmVzLCBjb24gaW5mb3JtYWNpw7NuIHNvYnJlIHByb2R1Y2Npw7NuIHkgY29tZXJjaWFsaXphY2nDs24gZGUgYmllbmVzIHkgbWVyY2FuY8OtYXMsIGFzw60gY29tbyBkZSBsYSBwcmVzdGFjacOzbiBkZSBzZXJ2aWNpb3MuRW4gZXN0ZSBhcGFydGFkbyBzZSBhbmFsaXphcsOhIGxhIHByb2R1Y2Npw7NuIGJydXRhIHRvdGFsIHF1ZSBzZSByZWZpZXJlIGFsIHZhbG9yIGRlIHRvZG9zIGxvcyBiaWVuZXMgeSBzZXJ2aWNpb3MgcHJvZHVjaWRvcyBvIGNvbWVyY2lhbGl6YWRvcyBwb3IgbGEgdW5pZGFkIGVjb27Ds21pY2EgY29tbyByZXN1bHRhZG8gZGVsIGVqZXJjaWNpbyBkZSBzdXMgYWN0aXZpZGFkZXMuIExhIHNpZ3VpZW50ZSB0YWJsYSBtdWVzdHJhIGxhIFByb2R1Y2Npw7NuIGJydXRhIHRvdGFsIGRlbCBTZWN0b3IgRWNvbsOzbWljbyBkZSBzZXJ2aWNpb3MgZGUgQWxvamFtaWVudG8gdGVtcG9yYWwgeSBwcmVwYXJhY2nDs24gZGUgYWxpbWVudG9zIHkgYmViaWRhcy4NCg0KYGBge3J9DQpiYXNlY29tJENWRV9NVU48LWFzLmZhY3RvcihiYXNlY29tJENWRV9NVU4yKQ0KYmFzZWNvbSRDVkVfTVVOPWZhY3RvcihiYXNlY29tJENWRV9NVU4yLGxldmVscz1sZXZlbHMoYmFzZWNvbSRDVkVfTVVOKSxsYWJlbHMgPSBjKCJUZXBvenRsw6FuIiwiSHVhdXRsYSBkZSBKaW3DqW5leiIsIkN1ZXR6YWzDoW4gZGVsIFByb2dyZXNvIiwiWmFjYXRsw6FuIiwiRXplcXVpZWwgTW9udGVzIiwiVGVxdWlzcXVpYXDDoW4iKSxvcmRlcmVkPUYpDQp0YWJsYTE8LWJhc2Vjb21bLDIxNzoyMjNdDQp0YWJsYTE8LWFzLmRhdGEuZnJhbWUodGFibGExKQ0KdGFibGExDQpgYGANCkxhIHNpZ3VpZW50ZSBncsOhZmljYSBzZcOxYWxhIGVsIGNhbWJpbyBkZSBlc3TDoSBQcm9kdWNjacOzbiBCcnV0YSBUb3RhbCAgZHVyYW50ZSAyMDA0LDIwMDkgeSAyMDE0IGVuIGxvcyBkZXN0aW5vcyBzZWxlY2Npb25hZG9zLg0KDQpgYGB7cn0NCnRhYmxhMSRDVkVfTVVOMjwtYXMuZmFjdG9yKHRhYmxhMSRDVkVfTVVOMikNCnRhYmxhMSRDVkVfTVVOMj1mYWN0b3IodGFibGExJENWRV9NVU4yLGxldmVscz1sZXZlbHModGFibGExJENWRV9NVU4yKSxsYWJlbHMgPSBjKCJUZXBvenRsw6FuIiwiSHVhdXRsYSBkZSBKaW3DqW5leiIsIkN1ZXR6YWzDoW4gZGVsIFByb2dyZXNvIiwiWmFjYXRsw6FuIiwiRXplcXVpZWwgTW9udGVzIiwiVGVxdWlzcXVpYXDDoW4iKSxvcmRlcmVkPUYpDQpQcm9kdWNjaW9uPC1yYmluZCh0YWJsYTEkUEJBTF8yMDA0LHRhYmxhMSRQQkFMXzIwMDksdGFibGExJFBCQUxfMjAxNCkNClByb2R1Y2Npb24NCmRpbW5hbWVzKFByb2R1Y2Npb24pPWxpc3QoYygiMjAwNCIsIjIwMDkiLCIyMDE0IiksYygiVGVwb3p0bGFuIiwiSHVhdGxhIGRlIEppbWVuZXoiLCJDdWV0emFsYW4gZGVsIFByb2dyZXNvIiwiWmFjYXRsYW4iLCJFemVxdWllbCBNb250ZXMiLCJUZXF1aXNxdWlhcGFuIikpDQogYmFycGxvdChQcm9kdWNjaW9uLGJlc2lkZT1ULCB5bGFiPSdQcm9kdWNjaW9uIGJydXRhIHRvdGFsJyxtYWluID0gJ1BCVCBlbiBBbG9qYW1pZW50byB0ZW1wb3JhbCcsbGFzPTIsY29sPWMoImxpZ2h0Ymx1ZSIsImJsdWUiLCJ5ZWxsb3ciKSx5bGltPWMoMCwxNTAwMDApKQ0KIGxlZ2VuZCh4ID0gInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiMjAwNCIsICIyMDA5IiwiMjAxNCIpLCBmaWxsID0gYygibGlnaHRibHVlIiwgImJsdWUiLCJ5ZWxsb3ciKSwgDQogICAgICAgdGl0bGUgPSAiQcOxb3MiKQ0KYGBgDQpgYGB7cn0NCm1lYW4odGFibGExJFBCQUxfMjAwNCkNCm1lYW4odGFibGExJFBCQUxfMjAwOSkNCm1lYW4odGFibGExJFBCQUxfMjAxNCkNCmBgYA0KDQoNCkNvbW8gcHVkaW1vcyBvYnNlcnZhciwgYSBleGNlcGNpw7NuIGRlbCBNdW5pY2lwaW8gZGUgSHVhdXRsYSBkZSBKaW3DqW5leiwgdG9kb3MgbG9zIG11bmljaXBpb3MgZXhwZXJpbWVudGFyb24gdW4gaW5jcmVtZW50byBjb24gcmVzcGVjdG8gYWwgYcOxbyBhbnRlcmlvci5MYSBzaWd1aWVudGUgdGFibGEgbXVlc3RyYSBsYSB0YXNhIGRlIHZhcmlhY2nDs24gcG9zaXRpdmEgZGUgY2FkYSB1bm8gZGUgZWxsb3MuIEVsIHByb21lZGlvIGRlIGVzdGFzIHRhc2FzIGRlIHZhcmlhY2nDs24gZXMgMTM3JSwgZXMgcXVlIGVsIGRlc2VtcGXDsW8gZGVsIHNlY3RvciB0dXLDrXN0aWNvIG1lam9yw7MgYW1wbGlhbWVudGUgZHVyYW50ZSBlc2EgZMOpY2FkYS4gQXVucXVlLCBlcyBpbXBvcnRhbnRlIG1lbmNpb25hciBxdWUgc3UgaW5jbHVzacOzbiBlbiBlbCBwcm9ncmFtYSBkZSAiUHVlYmxvcyBNw6FnaWNvcywiIGRpZmllcmUgZW4gYcOxb3MsIGluY2x1c28gYW50ZXMgZGUgZXN0ZSBwZXJpb2RvLiANCg0KDQoNCnwgIF9fUHVlYmxvIE3DoWdpY29fXyAgICAgIHwgICAgIF9fVGFzYSBkZSB2YXJpYWNpw7NuICgyMDA0LTIwMTQpX18gICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBUZXBvenRsw6FuICAgICAgICAgICAgICB8IDIyNC4yNjIyDQp8IEh1YXV0bGEgZGUgSmltw6luZXogICAgICAgICAgICAgIHwgLTQ2LjM0OTU1IHwNCnwgQ3VldHphbMOhbiBkZWwgUHJvZ3Jlc28gIHwgOTEuMjQxOCB8DQp8IFphY2F0bMOhbiAgfDE5My4xMTU3IHwNCnxFemVxdWllbCBNb250ZXMgfCAyODAuNDc5OHwgICANCnwgVGVxdWlzcXVpYXDDoW4gIHw3OS4yODg1IHwNCg0KYGBge3J9DQoodGFibGExWzEsNF0vdGFibGExWzEsMl0tMSkqMTAwDQoodGFibGExWzIsNF0vdGFibGExWzIsMl0tMSkqMTAwIA0KKHRhYmxhMVszLDRdL3RhYmxhMVszLDJdLTEpKjEwMA0KKHRhYmxhMVs0LDRdL3RhYmxhMVs0LDJdLTEpKjEwMA0KKHRhYmxhMVs1LDRdL3RhYmxhMVs1LDJdLTEpKjEwMA0KKHRhYmxhMVs2LDRdL3RhYmxhMVs2LDJdLTEpKjEwMA0KDQpgYGANCl9JbnZlcnNpw7NuXw0KDQogTGEgaW52ZXJzaW9uIHNlIHJlZmllcmUgYWwgaW5jcmVtZW50byBlbiBhY3Rpdm9zLCBpbnN1bW9zIHkgcHJvZHVjdG9zIHF1ZSBleHBlcmltZW50YXJvbiBsYXMgdW5pZGFkZXMgZWNvbsOzbWljYXMgZHVyYW50ZSBlbCBhw7FvIGRlIHJlZmVyZW5jaWEuDQpMbyBzaWd1aWVudGUgZ3LDoWZpY29zIG11ZXN0cmFuIGxhIGludmVyc2nDs24gZW4gZWwgc2VjdG9yIGRlIGFsb2phbWllbnRvIHkgcHJlcGFyYWNpw7NuIGRlIGFsaW1lbnRvcyB5IGJlYmlkYXMgLCBlbiBhenVsIHkgbGEgcHJvZHVjY2nDs24gZGVsIG1pc21vIHNlY3RvciBlbiBhenVsIGNsYXJvIGVuIDIwMDQgeSAyMDA5LiBFbCBhw7FvIDIwMTQgc2Ugb21pdGnDsywgZGFkbyBxdWUgbm8gZXMgcG9zaWJsZSBjb25zdWx0YXIgZWwgZGF0byBkZWJpZG8gYSBwcm9ibGVtYXMgZGVsIFNpc3RlbWEgQWN0dWFsaXphZG8gZGUgaW5mb3JtYWNpw7NuIENlbnNhbCBkZWwgSU5FR0kuIA0KIA0KYGBge3J9DQpQX0kyMDA0PC1yYmluZCh0YWJsYTEkSU5WXzIwMDQsdGFibGExJFBCQUxfMjAwNCkNCmRpbW5hbWVzKFBfSTIwMDQpPWxpc3QoYygiSW52ZXJzacOzbiIsIlByb2R1Y2Npw7NuIGJydXRhIHRvdGFsIiksYygiVGVwb3p0bMOhbiIsIkh1YXRsYSBkZSBKaW3DqW5leiIsIkN1ZXR6YWzDoW4gZGVsIFByb2dyZXNvIiwiWmFjYXRsw6FuIiwiRXplcXVpZWwgTW9udGVzIiwiVGVxdWlzcXVpYXDDoW4iKSkNClBfSTIwMDk8LXJiaW5kKHRhYmxhMSRJTlZfMjAwOSx0YWJsYTEkUEJBTF8yMDA5KQ0KZGltbmFtZXMoUF9JMjAwOSk9bGlzdChjKCJJbnZlcnNpw7NuIiwiUHJvZHVjY2nDs24gYnJ1dGEgdG90YWwiKSxjKCJUZXBvenRsw6FuIiwiSHVhdGxhIGRlIEppbcOpbmV6IiwiQ3VldHphbMOhbiBkZWwgUHJvZ3Jlc28iLCJaYWNhdGzDoW4iLCJFemVxdWllbCBNb250ZXMiLCJUZXF1aXNxdWlhcMOhbiIpKQ0KDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KCkgKyANCmdndGl0bGUoJ0ludmVyc2nDs24gZW4gQWxvamFtaWVudG8gdGVtcG9yYWwgeSBQcmVwYXJhY2nDs24gZGUgYWxpbWVudG8nKSsNCmdlb21fYmFyKGRhdGE9dGFibGExLGFlcyh4PUNWRV9NVU4yLCB5PUlOVl8yMDA0KSwgc3RhdD0naWRlbnRpdHknLCBwb3NpdGlvbj0nZG9kZ2UnKSArDQogY29vcmRfZmxpcCgpDQpiYXJwbG90KFBfSTIwMDQsY29sPWMoImJsdWUiLCJsaWdodCBibHVlIiksbWFpbiA9ICJQQlQgdnMgSW52ZXJzacOzbiAyMDA0IikNCg0KZ2dwbG90KCkgKyANCmdndGl0bGUoJ0ludmVyc2nDs24gZW4gQWxvamFtaWVudG8gdGVtcG9yYWwgeSBQcmVwYXJhY2nDs24gZGUgYWxpbWVudG8nKSsNCmdlb21fYmFyKGRhdGE9dGFibGExLGFlcyh4PUNWRV9NVU4yLCB5PUlOVl8yMDA5KSwgc3RhdD0naWRlbnRpdHknLCBwb3NpdGlvbj0nZG9kZ2UnKSArDQogY29vcmRfZmxpcCgpDQpiYXJwbG90KFBfSTIwMDksY29sPWMoImJsdWUiLCJsaWdodCBibHVlIiksbWFpbiA9ICJQQlQgdnMgSW52ZXJzacOzbiAyMDA5IikNCg0KYGBgDQpfUGVyc29uYWwgb2N1cGFkb18NCg0KUG9yIG90cm8gbGFkbywgc2UgYW5hbGl6YXLDoW4gbGEgY2lmcmFzIGRlIFBlcnNvbmFsIG9jdXBhZG8sIHF1ZSBzZSByZWZpZXJlbiBhIGxhcyBwZXJzb25hcyBxdWUgdHJhYmFqYXJvbiBkdXJhbnRlIGVsIHBlcmlvZG8gZGUgcmVmZXJlbmNpYSBkZXBlbmRpZW5kbyBjb250cmFjdHVhbG1lbnRlIG8gbm8gZGUgbGEgdW5pZGFkIGVjb27Ds21pY2EsIHN1amV0YXMgYSBzdSBkaXJlY2Npw7NuIHkgY29udHJvbC5BbCByZXNwZWN0bywgc2UgdHJhdGFyw6EgZGUgaWRlbnRpZmljYXIgc2kgZXhpc3RlIHVuYSByZWxhY2nDs24gbGluZWFsIHNpbXBsZSBlbnRyZSBsYSBwcm9kdWNjacOzbiBicnV0YWwgdG90YWwgeSBlbCBwZXJzb25hbCBvY3VwYWRvIGRlIDIwMDQgZW4gZWwgc2VjdG9yLiBDb21vIHByaW1lciBwYXNvLCBzZSBwcmVzZW50w6FuIGxvcyBoaXN0b2dyYW1hcyBkZSBhbWJhcyB2YXJpYWJsZXMuIA0KYGBge3J9DQpoaXN0KHRhYmxhMSRQQkFMXzIwMDQpDQpoaXN0KHRhYmxhMSRQRVJfMjAwNCkNCg0KYGBgDQpQYXJhIGVzdHVkaWFyIGxhIG5vcm1hbGlkYWQsIGFkZW3DoXMgc2UgcmVhbGl6YSBsYSBwcnVlYmEgZGUgc2hhcGlybyBwb3Igc2VyIHVuYSBtdWVzdHJhIG1lbm9yLiBEYWRvIHF1ZSBhbWJhcyBjaWZyYXMgZGFkYXMgZGVsIHAtdmFsb3IsIHNvbiBtYXlvcmVzIGEgMC4wNSwgcG9kZW1vcyBkZWNpciBxdWUgbm8gdGVuZW1vcyBldmlkZW5jaWEgZGUgcXVlIG5vIHNlIHRyYXRlIGRlIGRpc3RyaWJ1Y2lvbmVzIG5vcm1hbGVzLiBBdW5xdWUsIHBvZGVtb3Mgb2JzZXJ2YXIgZW4gZWwgaGlzdG9ncmFtYSBkZSBsYSBQcm9kdWNjacOzbiBicnV0YSB0b3RhbCAgZXhpc3RlIHVuIHNlc2dvIGEgbGEgZGVyZWNoYSwgbWllbnRyYXMgcXVlIGxhIGRlIFBlcnNvbmFsIGVzIGJhc3RhbnRlIHNpbWV0cmljYS4gIA0KYGBge3J9DQpzaGFwaXJvLnRlc3QodGFibGExJFBCQUxfMjAwNCkNCnNoYXBpcm8udGVzdCh0YWJsYTEkUEVSXzIwMDQpDQpgYGANCkNvbiBlbCBvYmpldGl2byBkZSBzZWd1aXIgZXhwbG9yYW5kbyBsb3MgY29tYW5kb3MgZGUgUiwgaW1wYXJ0aWRvcyBjb21vIHBhcnRlIGRlbCBjdXJzbywgc2UgYXN1bWlyw6EgcXVlIGFtYmFzIHZhcmlhYmxlcyBzb24gbm9ybWFsZXMuIEVuIGVzZSBzZW50aWRvLCBzZSBlamVjdXRhcsOhIGVsIGNvZWZpY2llbnRlIGRlIFBlYXJzb24gcGFyYSBpZGVudGlmaWNhciBzaSBleGlzdGUgdW5hIGNvcnJlbGFjacOzbi4gRWwgY29lZmljaWVudGUgZGUgMC43NCBhcGFyZWNlIGNvbW8gaW5kaWNpbyBkZSBxdWUgZXhpc3RlIHVuYSBjb3JyZWxhY2nDs24gZGlyZWN0YSBtZWRpYS4gIA0KYGBge3J9DQpjb3IodGFibGExJFBFUl8yMDA0LHRhYmxhMSRQQkFMXzIwMDQsIG1ldGhvZD0icGVhcnNvbiIpDQoNCmBgYA0KDQpQb3Igw7psdGltbywgc2UgbGxldmFyw6EgYSBjYWJvIHVuIGVqZXJjaWNpbyBwYXJhIHRyYXRhciBkZSBlc3RhYmxlY2VyIHVuIG1vZGVsbyBsaW5lYWwuIExhcyBjYXJhY3RlcsOtc3RpY2FzIGRlbCBtb2RlbG8gbGluZWFsIG5vcyBpbmRpY2FuIHF1ZSBlbCBwIHZhbG9yIGVzIHPDs2xvIGxpZ2VyYW1lbnRlIG1heW9yIGEgMC4wNSB5IGVsIGFqdXN0ZSBub3MgZGljZSBxdWUgZWwgbW9kZWxvIHNvbG8gZXhwbGljYXLDrWEgZWwgNDAlIGRlIGxhIHZhcmlhYmlsaWRhZCBkZWwgcGVyc29uYWwgb2N1cGFkbyByZXNwZWN0byBhIGxhIFByb2R1Y2Npw7NuIEJydXRhIFRvdGFsLiANCg0KYGBge3J9DQoNCmVqZXJjaWNpbyA8LSBsbSh0YWJsYTEkUEJBTF8yMDA0IH4gdGFibGExJFBFUl8yMDA0KQ0Kc3VtbWFyeShlamVyY2ljaW8pDQpgYGANCg0KDQoNCkFzw60sZWwgc2lndWllbnRlIGdyw6FmaWNvIGFzb2NpYSBlbCBtb2RlbG8gcGxhbnRlYWRvIGFudGVyaW9ybWVudGUgeSBzZSBwdWVkZSBpZGVudGlmaWNhciBxdWUgbGEgY29ycmVsYWNpw7NuIG5vIGVzIG11eSBwcmVjaXNhLCBjb21vIGxvcyBwYXLDoW1ldHJvcywgbWVuY2lvbmFkb3MgYXJyaWJhLCBub3MgaW5kaWNhbi4gQSBlc3TDs3MsIHBvZGVtb3MgYcOxYWRpciBsb3MgcG9zaWJsZXMgZXJyb3JlcyBxdWUgdW5hIG11ZXN0cmEgdGFuIHBlcXVlw7FhIHB1ZWRhbiBzdXBvbmVyIHBhcmEgZXN0ZSB0aXBvIGRlIG1vZGVsb3MuIA0KYGBge3J9DQpwbG90KHRhYmxhMSRQQkFMXzIwMDQgfiB0YWJsYTEkUEVSXzIwMDQpDQphYmxpbmUobG0odGFibGExJFBCQUxfMjAwNH4gdGFibGExJFBFUl8yMDA0KSkNCnFwbG90KHRhYmxhMSRQRVJfMjAwNCx0YWJsYTEkUEJBTF8yMDA0LGdlb209YygicG9pbnQiLCJzbW9vdGgiKSkNCg0KYGBgDQpfQWN0aXZpZGFkIHR1csOtc3RpY2EgZW4gbG9zIFB1ZWJsb3MgTcOhZ2ljb3MgKDIwMTcpXw0KDQpFbiBsYSAgcHJlc2VudGUgc2VlY2Npw7NuLCBzZSBtdWVzdHJhbiBhbHVub3MgZ3LDoWZpY29zIHF1ZSBjb21wYXJhbiBsYSBhY3RpdmlkYWQgdHVyw61zdGljYSBlbiBsb3MgNiBQdWVibG9zIG3DoWdpY29zIHNlbGVjY2lvbmFkb3MgZHVyYW50ZSBlbCBhw7FvIDIwMTcuIExvcyBncsOhZmljb3MgbXVlc3RyYW4gZWwgdG90YWwgZGUgbsO6bWVybyBkZSBjdWFydG9zLCBob3RlbGVzLCB0dXJpc3RhcyByZWNpYmlkb3MsIGUgaW5ncmVzb3MgcG9yIGFjdGl2aWRhZCB0dXLDrXN0aWNhIGVuIGRpY2hvIGHDsW8uDQoNCmBgYHtyfQ0KZGF0b3MyPC1yZWFkLmNzdigiRGF0b3NQTS5jc3YiLCBoZWFkZXIgPSBUKQ0KZGF0b3MyDQoNCkN1YXJ0b3M8LWRhdG9zMiROVU1fQ1VBUg0KQ3VhcnRvcw0KDQpQdWVibG9NYWdpY288LWRhdG9zMiRQTQ0KUHVlYmxvTWFnaWNvDQoNClRFSDwtZGF0b3MyJFRFSA0KVEVIDQoNCkN1YXJ0b3MNCm5hbWVzKEN1YXJ0b3MpPC1kYXRvczIkUE0NCkN1YXJ0b3MNCg0KDQpiYXJwbG90KEN1YXJ0b3MsDQogICAgICAgIG1haW49Ik7Dum1lcm8gZGUgY3VhcnRvcyBkaXNwb25pYmxlcyIsDQogICAgICAgIHhsYWI9IlBNIiwNCiAgICAgICAgeWxhYj0iQ3VhcnRvcyIpDQoNCg0KbmFtZXMoVEVIKTwtZGF0b3MyJFBNDQpURUgNCg0KYmFycGxvdChURUgsDQogICAgICAgIG1haW49Ik7Dum1lcm8gZGUgaG90ZWxlcyBlbiBsb3MgUE0iLA0KICAgICAgICB4bGFiPSJQTSIsDQogICAgICAgIHlsYWI9IkhvdGVsZXMgZGlzcG9uaWJsZXMiKQ0KDQp0dXJpc3RhczwtZGF0b3MyJE5VTV9UVVINCnR1cmlzdGFzDQoNCm5hbWVzKHR1cmlzdGFzKTwtZGF0b3MyJFBNDQp0dXJpc3Rhcw0KDQpiYXJwbG90KHR1cmlzdGFzLA0KICAgICAgICBtYWluPSJOw7ptZXJvIGRlIHR1cmlzdGFzIGVuIGxvcyBQTSIsDQogICAgICAgIHhsYWI9IlBNIiwNCiAgICAgICAgeWxhYj0iTsO6bWVybyBkZSB0dXJpc3RhcyIpDQoNCg0KaW5ncmVzb3M8LWRhdG9zMiRJX0FUDQppbmdyZXNvcw0KDQpuYW1lcyhpbmdyZXNvcyk8LWRhdG9zMiRQTQ0KaW5ncmVzb3MNCg0KYmFycGxvdChpbmdyZXNvcywNCiAgICAgICAgbWFpbj0iSW5ncmVzb3MgcG9yIHR1cmlzbW8gZW4gbG9zIFBNIChNaWxsb25lcyBkZSBwZXNvcykiLA0KICAgICAgICB4bGFiPSJQTSIsDQogICAgICAgIHlsYWI9IkluZ3Jlc28iKQ0KDQoNCkFncmFyaW88LWRhdG9zMiRQX0ENCkFncmFyaW8NCg0KbmFtZXMoQWdyYXJpbyk8LWRhdG9zMiRQTQ0KQWdyYXJpbw0KYGBgDQpBIHBhcnRpciBkZSBsb3MgZGF0b3MgbW9zdHJhZG9zLCBwb2RlbW9zIGRlZmluaXIgbGEgbWVkaWEgZ2VuZXJhZGEgcG9yIGNhZGEgbG9jYWxpZGFkIGVuIGxvcyBydWJyb3MgbWVuY2lvbmFkb3MNCg0KYGBge3J9DQptZWFuKGRhdG9zMiRJX0FUKQ0KbWVhbihkYXRvczIkVEVIKQ0KbWVhbihkYXRvczIkTlVNX1RVUikNCm1lYW4oZGF0b3MyJE5VTV9DVUFSKQ0KYGBgDQoNCkZpbmFsbWVudGUsIGVsIHNpZ3VpZW50ZSBncsOhZmljbyBtdWVzdHJhIHF1ZSBhbCBjb21wYXJhciBsb3MgaW5ncmVzb3MgZGUgbGEgcHJvZHVjY2nDs24gYWdyYXJpYSBjb24gbG9zIGRlIHR1cmlzbW8gZWwgbWlzbW8gYcOxbywgZW4gNSBkZSBsb3MgNiBQdWVibG9zIE3DoWdpY29zLCBzZSBvYnRpZW5lbiBtYXlvcmVzIGlucmVzb3MgcG9yIGFjdGl2aWRhZCB0dXLDrXN0aWNhLiBJbmNsdXNvIGxhIG1lZGlhIG11ZXN0cmEgcXVlIGVuIGdlbmVyYWwgc2Ugb2J0aWVuZSBtw6FzIGRlIGVsIGRvYmxlIGRlIGluZ3Jlc29zIHBvciB0dXJpc21vLiBSZXN1bHRhZG8gZGVsIGFiYW5kb25vIGRlbCBjYW1wbyB5IGxhIGRlcGVuZGVuY2lhIGFsIHR1cmlzbW8gZGUgZXN0b3Mgc2l0aW9zLg0KDQpgYGB7cn0NCkFncmFyaW88LWRhdG9zMiRQX0ENCkFncmFyaW8NCg0KbmFtZXMoQWdyYXJpbyk8LWRhdG9zMiRQTQ0KQWdyYXJpbw0KDQppbmdyZXNvczwtZGF0b3MyJElfQVQNCmluZ3Jlc29zDQoNCm5hbWVzKGluZ3Jlc29zKTwtZGF0b3MyJFBNDQppbmdyZXNvcw0KDQpBeVQ8LXJiaW5kKEFncmFyaW8sDQogICAgICAgICAgIGluZ3Jlc29zKQ0KQXlUDQoNCg0KDQpiYXJwbG90KEF5VCxiZXNpZGU9VCwNCiAgICAgICAgbWFpbj0iSW5ncmVzb3MgcG9yIHByb2R1Y2Npw7NuIEFncmFyaWEgeSBUdXJpc21vIGVuIFBNIChNaWxsb25lcyBkZSBwZXNvcykiLA0KICAgICAgICB4bGFiPSJQTSIsDQogICAgICAgIHlsYWI9Ik1EUCIsDQogICAgICAgIGNvbD1jKCJibHVlIiwiZ3JleSIpKQ0KDQpsZWdlbmQoeCA9ICJ0b3ByaWdodCIsIGxlZ2VuZCA9YygiSW5ncmVzbyBQcm9kdWNjacOzbiBhZ3JhcmlhIiwgIkluZ3Jlc28gcG9yIFR1cmlzbW8iKSwNCiAgICAgICBmaWxsID0gYygiYmx1ZSIsImdyZXkiKSwNCiAgICAgICB0aXRsZT0iSW5ncmVzbyBwb3IgUHJvZHVjY2nDs24gYWdyYXJpYSB5IFR1cmlzbW8gKDIwMTcpIikNCiAgICAgICANCg0KbWVhbihkYXRvczIkUF9BKQ0KbWVhbihkYXRvczIkSV9BVCkNCmBgYA0KDQpfUHJvZHVjY2nDs24gYWdyw61jb2xhXw0KDQpBIGNvbnRpbnVhY2nDs24gc2UgYW5hbGl6YSBsYSBpbmZvcm1hY2nDs24gZGUgbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhIGVuIGxvcyBzZWlzICpQdWVibG9zIE3DoWdpY29zKiBzZWxlY2Npb25hZG9zLiANCg0KU2UgY29uc2lkZXLDsyByZWxldmFudGUgcmV2aXNhciBkaWNoYSBpbmZvcm1hY2nDs24sIGRhZG8gcXVlIGxhIGFjdGl2aWRhZCBlY29uw7NtaWNhIHByaW5jaXBhbCBlbiBlbCBtZWRpbyBydXJhbCBtZXhpY2FubyBlcyBmdW5kYW1lbnRhbG1lbnRlIGFncsOtY29sYSwgcHJpbmNpcGFsbWVudGUgZW4gYXF1ZWxsYXMgbG9jYWxpZGFkZXMgY29uIGFsdGEgY29uY2VudHJhY2nDs24gZGUgcG9ibGFjacOzbiBpbmTDrWdlbmEuIA0KDQpQYXJhIGlkZW50aWZpY2FyIGxhIGltcG9ydGFuY2lhIGRlIGxhIGFjdGl2aWRhZCBhZ3LDrWNvbGEgZW4gbG9zIG11bmljaXBpb3Mgc2VsZWNjaW9uYWRvcyBhZHNjcml0b3MgYWwgKlByb2dyYW1hIGRlIFB1ZWJsb3MgTcOhZ2ljb3MqIHNlIG9ic2VydmFuIGxvcyBkYXRvcyBkZWwgcGVyaW9kbyAyMDAzLTIwMTggZGUgbGFzIHNpZ3VpZW50ZXMgdmFyaWFibGVzOg0KDQoxLiBfX1N1cGVyZmljaWUgc2VtYnJhZGFfXyANCjIuIF9fVmFsb3IgZGUgbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhX18NCg0KYGBge3J9DQpwaXZvdCA8LSBleGNlbF9hZ3JpY29sYSAlPiUgZ3JvdXBfYnkobm9tbXVuaWNpcGlvKSAlPiUgc3VtbWFyaXNlKA0KICBzdXBfdG90YWwgPSBuKCksDQogIHN1cF9zZW1icmFkYSA9IG1lYW4oc2VtYnJhZGEpLA0KICBzdXBfY29zZWNoYWRhID0gbWVhbihjb3NlY2hhZGEpLA0KICB2YWxvcl9wcm9kdWNjaW9uX21pbGVzcGVzb3M9IG1lYW4odmFsb3Jwcm9kdWNjaW9uS1ApKQ0KYGBgDQojIyMgSGlzdG9ncmFtYSBzdXBlcmZpY2llIHNlbWJyYWRhIHBvciBtdW5pY2lwaW8sIDIwMDMtMjAxOA0KYGBge3J9DQpnZ3Bsb3QoZGF0YT1waXZvdCwgYWVzKHg9bm9tbXVuaWNpcGlvLCB5PXN1cF9zZW1icmFkYSkpICsgDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKw0KICB4bGFiKCJNdW5pY2lwaW8iKSArIHlsYWIoIkhlY3TDoXJlYXMiKSArDQogIGdndGl0bGUoIlN1cGVyZmljaWUgc2VtYnJhZGEgcHJvbWVkaW8gcG9yIG11bmljaXBpbyAyMDAzLTIwMTgiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpDQpgYGANCg0KIyMjIEhpc3RvZ3JhbWEgVmFsb3IgZGUgbGEgcHJvZHVjY2nDs24gcG9yIG11bmljaXBpbywgMjAwMy0yMDE4DQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9cGl2b3QsIGFlcyh4PW5vbW11bmljaXBpbywgeT12YWxvcl9wcm9kdWNjaW9uX21pbGVzcGVzb3MpKSArIA0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgDQogIHhsYWIoIk11bmljaXBpbyIpICsgeWxhYigiTWlsZXMgZGUgcGVzb3MiKSArDQogIGdndGl0bGUoIlZhbG9yIGRlIGxhIHByb2R1Y2Npw7NuIHBvciBtdW5pY2lwaW8gMjAwMy0yMDE4IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KYGBgDQoNCkRlc3RhY2EgcXVlIGRlIGxvcyBtdW5pY2lwaW9zIHNlbGVjY2lvbmFkb3MsIGFxdWVsbG9zIGNvbiBwb2JsYWNpw7NuIHByZXBvbmRlcmFudGVtZW50ZSBpbmTDrWdlbmEgY29tbyBzb24gQ3VldHphbMOhbiBkZWwgUHJvZ3Jlc28sIFB1ZWJsYSB5IEh1YXV0bGEgZGUgSmltZW5leiwgT2F4YWNhIGRlc3RpbmFuIGxhcyBtYXlvcmVzIHN1cGVyZmljaWVzIHNlbWJyYWRhcywgbm8gb2JzdGFudGUsIGVsIG1heW9yIHZhbG9yIGRlIGxhIHByb2R1Y2Npw7NuIGFncsOtY29sYSBsbyBvY3VwYSBlbCBtdW5pY2lwaW8gZGUgVGVxdWlzcXVpYXBhbiwgUXVlcsOpdGFyby4gSHVhdXRsYSBkZSBKaW3DqW5leiBwb3Igc3UgcGFydGUgcmVwb3J0YSBlbCBtZW5vciB2YWxvciBkZSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgZGUgbG9zIHNlaXMgbXVuaWNpcGlvcy4NCg0KRW4gbGEgc2lndWllbnRlIGdyw6FmaWNhIHNlIG11ZXN0cmEgbGEgZXZvbHVhY2nDs24gZGVsIHZhbG9yIGRlIGxhIHByb2R1Y2Npw7NuIGFncsOtY29sYSBwYXJhIGNhZGEgdW5vIGRlIGxvcyBzZWlzIG11bmljaXBpb3MuIENvbnZpZW5lIGRlc3RhY2FyIHF1ZSBDdWV0emFsYW4gZGVsIFByb2dyZXNvIHkgRXplcXVpZWwgTW9udGVzIHNlIGFkaGlyaWVyb24gYWwgUHJvZ3JhbWEgZGUgUHVlYmxvcyBNw6FnaWNvcyBlbiAyMDAyIHkgMjAwNSwgcmVzcGVjdGl2YW1lbnRlLiBFbCByZXN0byBvYnR1dm8gbGEgYWRzY3JpcGNpw7NuIHBvc3RlcmlvciBhbCAyMDEwLCBzaWVuZG8gSHVhdXRsYSBkZSBKaW3DqW5leiBlbCDDumx0aW1vICgyMDE1KS4NCmBgYHtyfQ0KZ2dwbG90KFZQQWdyLCBhZXMoeD1BbmlvLCB5PSBWYWxQcm9kQWdyLCBncm91cCA9IE11bmljaXBpbywgY29sb3VyID1NdW5pY2lwaW8gKSkgKyANCiAgZ2VvbV9saW5lKCkgICsgeGxhYigiQcOxbyIpICsgeWxhYigiTWlsZXMgZGUgcGVzb3MiKSArDQogIGdlb21fcG9pbnQoIHNpemU9MC41LCBzaGFwZT0yMSwgZmlsbD0id2hpdGUiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCkEgY29udGludWFjacOzbiBzZSBwcmVzZW50YSBlbCBhbsOhbGlzaXMgcG9yIG11bmljaXBpbyBwYXJhIGlkZW50aWZpY2FyIGxvcyBwcmluY2lwYWxlcyBjdWx0aXZvcyB5IGxhIGV2b2x1Y2nDs24gZGUgc3UgcHJvZHVjY2nDs24gZW4gZWwgcGVyaW9kbyAyMDAzLTIwMTguDQoNCiMgSHVhdXRsYSBkZSBKaW3DqW5leg0KYGBge3J9DQpncnVwb19oajE8LSBleGNlbF9hZ3JpY29sYSAlPiUgZmlsdGVyKG5vbW11bmljaXBpbz09ICdIdWF1dGxhIGRlIEppbcOpbmV6JyAmIGFuaW89PTIwMTgpICU+JSANCiAgZ3JvdXBfYnkgKG5vbWN1bHRpdm8pICU+JSANCiAgc3VtbWFyaXNlICggU3VwUHJvbVNlbWIgPSBtZWFuIChzZW1icmFkYSksDQogICAgICAgICAgICAgIFN1cFByb21Db3MgPSBtZWFuIChjb3NlY2hhZGEpLA0KICAgICAgICAgICAgICBWYWxvclByb2QgPSBtZWFuICh2YWxvcnByb2R1Y2Npb25LUCkpDQoNCmdydXBvX2hqMiA8LSBleGNlbF9hZ3JpY29sYSAlPiUgZmlsdGVyKG5vbW11bmljaXBpbz09ICdIdWF1dGxhIGRlIEppbcOpbmV6JykgJT4lIA0KICBncm91cF9ieSAobm9tY3VsdGl2byxhbmlvLHNlbWJyYWRhKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvcnByb2R1Y2Npb25LUCkNCmBgYA0KDQpFbiBlbCBtdW5pY2lwaW8gZGUgSHVhdXRsYSBkZSBKaW1lbmV6IHNlIG9ic2VydmEgbGEgYWx0YSBjb25jZW50cmFjacOzbiBkZSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgZW4gZG9zIGN1bHRpdm9zIHByb25jaXBhbG1lbnRlOiBjYWbDqSBjZXJlemEgeSBtYcOteiBncmFuby4gDQoNCkNvbW8gc2Ugb2JzZXJ2YSBlbiBsYSBzZWd1bmRhIGdyw6FmaWNhLCBlbCB2YWxvciBkZSBsYSBwcm9kdWNjacOzbiBkZWwgY2Fmw6kgdHV2byB1bmEgY2HDrWRhIGRyw6FzdGljYSBlbiBlbCBhw7FvIDIwMTIuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9Z3J1cG9faGoxLCBhZXMoeD1ub21jdWx0aXZvLCB5PVZhbG9yUHJvZCkpICsgDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249InN0YWNrIikgKyANCiAgeGxhYigiQ3VsdGl2byIpICsgeWxhYigiTWlsZXMgZGUgcGVzb3MiKSArDQogIGdndGl0bGUoIkh1YXV0bGEgZGUgSmltZW5lei4gVmFsb3IgZGUgbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhIDIwMDMtMjAxOCIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkNCmBgYA0KYGBge3J9DQpnZ3Bsb3QoZ3J1cG9faGoyLCBhZXMoeD1hbmlvLCB5PXZhbG9ycHJvZHVjY2lvbktQLCBncm91cCA9IG5vbWN1bHRpdm8sIGNvbG91ciA9bm9tY3VsdGl2byApKSArIA0KICBnZW9tX2xpbmUoKSAgICsgeGxhYigiQcOxbyIpICsgeWxhYigiTWlsZXMgZGUgcGVzb3MiKSArDQogIGdlb21fcG9pbnQoIHNpemU9MC41LCBzaGFwZT0yMSwgZmlsbD0id2hpdGUiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCg0KIyBDdWV0emFsYW4gZGVsIFByb2dyZXNvDQoNCmBgYHtyfQ0KZ3J1cG9fY3VldDE8LSBleGNlbF9hZ3JpY29sYSAlPiUgZmlsdGVyKG5vbW11bmljaXBpbz09ICdDdWV0emFsYW4gZGVsIFByb2dyZXNvJyAmIGFuaW89PTIwMTgpICU+JSANCiAgZ3JvdXBfYnkgKG5vbWN1bHRpdm8pICU+JSANCiAgc3VtbWFyaXNlICggU3VwUHJvbVNlbWIgPSBtZWFuIChzZW1icmFkYSksDQogICAgICAgICAgICAgIFN1cFByb21Db3MgPSBtZWFuIChjb3NlY2hhZGEpLA0KICAgICAgICAgICAgICBWYWxvclByb2QgPSBtZWFuICh2YWxvcnByb2R1Y2Npb25LUCkpDQoNCmdydXBvX2N1ZXQyIDwtIGV4Y2VsX2Fncmljb2xhICU+JSBmaWx0ZXIobm9tbXVuaWNpcGlvPT0gJ0N1ZXR6YWxhbiBkZWwgUHJvZ3Jlc28nKSAlPiUgDQogIGdyb3VwX2J5IChub21jdWx0aXZvLGFuaW8sc2VtYnJhZGEpICU+JSANCiAgc3VtbWFyaXNlKHZhbG9ycHJvZHVjY2lvbktQKQ0KYGBgDQoNCkN1ZXR6YWxhbiBkZWwgUHJvZ3Jlc28gdGFtYmnDqW4gY29uY2VudHJhIHVuYSBhbHRhIGRlcGVuZGVuY2lhIGRlIGxhIHByb2R1Y2Npw7NuIGFncsOtY29sYSBlbiBwb2NvcyBjdWx0aXZvcywgcHJpbmNpcGFsbWVudGUgZWwgY2Fmw6kgY2VyZXphLiBUYW1iacOpbiBzZSBtdWVzdHJhIGxhIGluZXN0YWJpbGlkYWQgZW4gZWwgdmFsb3IgZGUgc3UgcHJvZHVjY2nDs24gZGVsIGNhZsOpLCBhdW5xdWUgY29uIHVuYSB0ZW5kZW5jaWEgY3JlY2llbnRlIGEgcGFydGlyIGRlIDIwMTYuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9Z3J1cG9fY3VldDEsIGFlcyh4PW5vbWN1bHRpdm8sIHk9VmFsb3JQcm9kKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0ic3RhY2siKSArIA0KICB4bGFiKCJDdWx0aXZvIikgKyB5bGFiKCJNaWxlcyBkZSBwZXNvcyIpICsNCiAgZ2d0aXRsZSgiQ3VldHphbGFuIGRlbCBQcm9ncmVzby4gVmFsb3IgZGUgbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhIDIwMDMtMjAxOCIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChncnVwb19jdWV0MiwgYWVzKHg9YW5pbywgeT12YWxvcnByb2R1Y2Npb25LUCwgZ3JvdXAgPSBub21jdWx0aXZvLCBjb2xvdXIgPW5vbWN1bHRpdm8gKSkgKyANCiAgZ2VvbV9saW5lKCkgICsgeGxhYigiQcOxbyIpICsgeWxhYigiTWlsZXMgZGUgcGVzb3MiKSArDQogIGdlb21fcG9pbnQoIHNpemU9MC41LCBzaGFwZT0yMSwgZmlsbD0id2hpdGUiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCg0KIyBUZXF1aXNxdWlhcGFuDQoNCmBgYHtyfQ0KZ3J1cG9fdGVxdWlzMTwtIGV4Y2VsX2Fncmljb2xhICU+JSBmaWx0ZXIobm9tbXVuaWNpcGlvPT0gJ1RlcXVpc3F1aWFwYW4nICYgYW5pbz09MjAxOCkgJT4lIA0KICBncm91cF9ieSAobm9tY3VsdGl2bykgJT4lIA0KICBzdW1tYXJpc2UgKCBTdXBQcm9tU2VtYiA9IG1lYW4gKHNlbWJyYWRhKSwNCiAgICAgICAgICAgICAgU3VwUHJvbUNvcyA9IG1lYW4gKGNvc2VjaGFkYSksDQogICAgICAgICAgICAgIFZhbG9yUHJvZCA9IG1lYW4gKHZhbG9ycHJvZHVjY2lvbktQKSkNCg0KZ3J1cG9fdGVxdWlzMiA8LSBleGNlbF9hZ3JpY29sYSAlPiUgZmlsdGVyKG5vbW11bmljaXBpbz09ICdUZXF1aXNxdWlhcGFuJykgJT4lIA0KICBncm91cF9ieSAobm9tY3VsdGl2byxhbmlvLHNlbWJyYWRhKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvcnByb2R1Y2Npb25LUCkNCmBgYA0KRW4gY29udHJhc3RlIGNvbiBsb3MgbXVuaWNpcGlvcyBkZSBIdWF1dGxhIGRlIEppbcOpbmV6IHkgQ3VldHphbGFuIGRlbCBQcm9ncmVzbywgdGFudG8gZW4gVGVxdWlzcXVpYXBhbiBjb21vIFphY2F0bMOhbiBzZSBvYnNlcnZhIHVuYSBtYXlvciBkaXZlcnNpZGFkIGRlIGN1bHRpdm9zIGUgaW5jbHVzbyBlbiBsYSBldm9sdWNpw7NuIGVudHJlIDIwMDMgeSAyMDE4IHNlIG9ic2VydmEgZWwgY3JlY2ltaWVudG8gZGUgbGEgcGFydGljaXBhY2nDs24gZGUgY3VsdGl2b3Mgbm8gdHJhZGljaW9uYWxlcy4NCmBgYHtyfQ0KZ2dwbG90KGRhdGE9Z3J1cG9fdGVxdWlzMSwgYWVzKHg9bm9tY3VsdGl2bywgeT1WYWxvclByb2QpKSArIA0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJzdGFjayIpICsgDQogIHhsYWIoIkN1bHRpdm8iKSArIHlsYWIoIk1pbGVzIGRlIHBlc29zIikgKw0KICBnZ3RpdGxlKCJUZXF1aXNxdWlhcGFuLiBWYWxvciBkZSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgMjAwMy0yMDE4IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChncnVwb190ZXF1aXMyLCBhZXMoeD1hbmlvLCB5PXZhbG9ycHJvZHVjY2lvbktQLCBncm91cCA9IG5vbWN1bHRpdm8sIGNvbG91ciA9bm9tY3VsdGl2byApKSArIA0KICBnZW9tX2xpbmUoKSAgKyB4bGFiKCJBw7FvIikgKyB5bGFiKCJNaWxlcyBkZSBwZXNvcyIpICsNCiAgZ2VvbV9wb2ludCggc2l6ZT0wLjUsIHNoYXBlPTIxLCBmaWxsPSJ3aGl0ZSIpICsgDQogIHRoZW1lX21pbmltYWwoKSANCmBgYA0KDQojIFphY2F0bMOhbiANCg0KYGBge3J9DQpncnVwb196YWMxPC0gZXhjZWxfYWdyaWNvbGEgJT4lIGZpbHRlcihub21tdW5pY2lwaW89PSAnWmFjYXRsw6FuJyAmIGFuaW89PTIwMTgpICU+JSANCiAgZ3JvdXBfYnkgKG5vbWN1bHRpdm8pICU+JSANCiAgc3VtbWFyaXNlICggU3VwUHJvbVNlbWIgPSBtZWFuIChzZW1icmFkYSksDQogICAgICAgICAgICAgIFN1cFByb21Db3MgPSBtZWFuIChjb3NlY2hhZGEpLA0KICAgICAgICAgICAgICBWYWxvclByb2QgPSBtZWFuICh2YWxvcnByb2R1Y2Npb25LUCkpDQoNCmdydXBvX3phYzIgPC0gZXhjZWxfYWdyaWNvbGEgJT4lIGZpbHRlcihub21tdW5pY2lwaW89PSAnWmFjYXRsw6FuJykgJT4lIA0KICBncm91cF9ieSAobm9tY3VsdGl2byxhbmlvLHNlbWJyYWRhKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvcnByb2R1Y2Npb25LUCkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYXRhPWdydXBvX3phYzEsIGFlcyh4PW5vbWN1bHRpdm8sIHk9VmFsb3JQcm9kKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0ic3RhY2siKSArIA0KICB4bGFiKCJDdWx0aXZvIikgKyB5bGFiKCJNaWxlcyBkZSBwZXNvcyIpICsNCiAgZ2d0aXRsZSgiWmFjYXRsw6FuLiBWYWxvciBkZSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgMjAwMy0yMDE4IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChncnVwb196YWMyLCBhZXMoeD1hbmlvLCB5PXZhbG9ycHJvZHVjY2lvbktQLCBncm91cCA9IG5vbWN1bHRpdm8sIGNvbG91ciA9bm9tY3VsdGl2byApKSArIA0KICBnZW9tX2xpbmUoKSAgKyB4bGFiKCJBw7FvIikgKyB5bGFiKCJNaWxlcyBkZSBwZXNvcyIpICsNCiAgZ2VvbV9wb2ludCggc2l6ZT0wLjUsIHNoYXBlPTIxLCBmaWxsPSJ3aGl0ZSIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg==