Este documento contiene el código R para la lectura, limpieza y georreferenciación de los datos recolectados en el proyecto Compartiendo la historia escondida del cambio climatico en Latinoamerica a traves de las TIC, financiado por el Instituto Panamericano de Geografia e Historia (IPGH).

Creditos Daniela Ballari - Universidad del Azuay, Cuenca, Ecuador, dballari@uazuay.edu.ec - Programación R y Visualizacion
Diana Comesana - Universidad de la Republica, Montevideo, Uruguay, diana.comesana@fic.edu.uy - Recoleccion y organizacion de informacion
Luis Vilches - Universidad Javeriana, Bogota, Colombia, lmvilches@javeriana.edu.co - Director del proyecto

El código se ejecuta con Run o Ctrl+Shift+Enter, el resultado aparecerá debajo del código

Cargar las librerias a utilizar.

library(readODS)
library(sp)
library(knitr)

Definir el directorio de trabajo donde se localizan los archivos y leer los archivos. En este caso son archivos de excel por año y por periódico. Se comienza trabajando con los datos de Uruguay.

opts_knit$set(root.dir = "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/uruguay_resultados_corregidos")

El código anterior es equivalente a setwd("D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/uruguay_resultados_corregidos")

files <- list.files(pattern='') #leer archivos de texto
files <- paste0(getwd(),"/",files)
head(files)
[1] "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/uruguay_resultados_corregidos/1831Periodicomanía.ods"          
[2] "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/uruguay_resultados_corregidos/1836Defensor_de_las_Leyes.ods"   
[3] "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/uruguay_resultados_corregidos/1844El Telegrafo de la línea.ods"
[4] "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/uruguay_resultados_corregidos/1853ElOrden.ods"                 
[5] "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/uruguay_resultados_corregidos/1863ElSiglo.ods"                 
[6] "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/uruguay_resultados_corregidos/1865ElSiglo.ods"                 

Leer los datos de Uruguay y unir los diferentes excels en una única variable llamada data

data <- NULL
for(i in 1:length(files)){
  a <- read_ods(files[i], sheet = 1, col_names = TRUE, )
  names(a) <- c("Identificador","codigoISO_pais_registro","codigoISO_pais_evento",
                                 "Año","Periodico","N°","Fecha","Evento", "latitud_norte","latitud_sur", "longitud_este", "longitud_oeste", "Veloc_Viento","creciente",           
                                 "temperatura", "lluvias","nevada","efecto_detectable","URI" )
  data <- rbind(data, a)
}
nrow(data)#618
[1] 618
head(data)

Se procede de similar manera con los datos de Colombia. Se añaden a los datos de Uruguay.

opts_knit$set(root.dir = "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/Colombia_resultados_corregidos/")
files <- list.files(pattern='') #leer archivos de texto
files <- paste0(getwd(),"/",files)
files
[1] "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/Colombia_resultados_corregidos/1860ElAviso.ods"                
[2] "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/Colombia_resultados_corregidos/1882_El-periódico-ilustrado.ods"
[3] "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/Colombia_resultados_corregidos/1886El_Unitario.ods"            
[4] "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/Colombia_resultados_corregidos/1887ElUnitario.ods"             
for(i in 1:length(files)){
  a <- read_ods(files[i], sheet = 1, col_names = TRUE,)
  names(a) <- names(data)
  data <- rbind(data, a)
}
nrow(data)#650
[1] 634

Revisar que los datos de latitud y longitud estén completos, sin datos faltantes

table(is.na(data$latitud_norte))

FALSE 
  634 
table(is.na(data$longitud_este))

FALSE 
  634 

Revisar los valores únicos para eventos

table(data$Evento)

  Altas temperaturas   Altas Temperaturas            Avalancha 
                   5                    1                    1 
    Baja temperatura   Bajas Temperaturas             Borrasca 
                   1                    4                    8 
         Brisa débil         Brisa fresca         Brisa fuerte 
                  12                   54                   37 
      Brisa moderada          Buen tiempo                Calor 
                  19                    1                   13 
              Ciclón             Escarcha        Exesivo calor 
                   5                    1                    1 
                Frío         Frio intenso         Frío intenso 
                   1                    1                    1 
        Frío Intenso            granizada            Granizada 
                   2                    3                    5 
             Granizo              Heladas              Huracán 
                   8                    1                    1 
          Inundacion           Inundación               Lluvia 
                   1                  114                   54 
             Lluvias Lluvias (fin sequía)               nevada 
                   2                    1                    1 
              Nevada               Niebla                Nieve 
                   5                    2                    2 
           Nubosidad          Ola de frío              Pampero 
                   1                    1                    1 
      Poca Nubosidad               Sequía             Temporal 
                   1                   20                  103 
       Temporal duro        Temporal Duro      Temporal fuerte 
                  41                   21                   11 
     Temporal Fuerte  Temporal huracanado  Temporal Huracanado 
                   5                    2                    8 
   Temporal muy duro  Temporal muy fuerte                Tifón 
                   4                    1                    1 
            Tormenta              Tormeta               Viento 
                  12                    1                    6 
       Viento fuerte 
                  26 

Homogenizar los eventos en relación a mayúsculas, minúsculas, espacios, etc.

data$Evento[data$Evento=="Altas Temperaturas"]<- "Altas temperaturas"
data$Evento[data$Evento=="Bajas Temperaturas"]<- "Bajas temperaturas"
data$Evento[data$Evento=="Baja temperatura"]<- "Bajas temperaturas"
data$Evento[data$Evento=="Frio intenso"]<- "Frío intenso"
data$Evento[data$Evento=="Frío Intenso"]<- "Frío intenso"
data$Evento[data$Evento=="granizada"]<- "Granizada"
data$Evento[data$Evento=="Granizo"]<- "Granizada"
data$Evento[data$Evento=="Inundacion"]<- "Inundación"
data$Evento[data$Evento=="Lluvias"]<- "Lluvia"
data$Evento[data$Evento=="nevada"]<- "Nevada"
data$Evento[data$Evento=="Tormeta"]<- "Tormenta"
data$Evento[data$Evento=="Temporal Huracanado"]<- "Temporal huracanado"
data$Evento[data$Evento=="Temporal Duro"]<- "Temporal duro"
data$Evento[data$Evento=="Temporal Fuerte"]<- "Temporal fuerte"
table(data$Evento)

  Altas temperaturas            Avalancha   Bajas temperaturas 
                   6                    1                    5 
            Borrasca          Brisa débil         Brisa fresca 
                   8                   12                   54 
        Brisa fuerte       Brisa moderada          Buen tiempo 
                  37                   19                    1 
               Calor               Ciclón             Escarcha 
                  13                    5                    1 
       Exesivo calor                 Frío         Frío intenso 
                   1                    1                    4 
           Granizada              Heladas              Huracán 
                  16                    1                    1 
          Inundación               Lluvia Lluvias (fin sequía) 
                 115                   56                    1 
              Nevada               Niebla                Nieve 
                   6                    2                    2 
           Nubosidad          Ola de frío              Pampero 
                   1                    1                    1 
      Poca Nubosidad               Sequía             Temporal 
                   1                   20                  103 
       Temporal duro      Temporal fuerte  Temporal huracanado 
                  62                   16                   10 
   Temporal muy duro  Temporal muy fuerte                Tifón 
                   4                    1                    1 
            Tormenta               Viento        Viento fuerte 
                  13                    6                   26 

Homogenizar los periódicos

table(data$Periodico)

     Defensor de las Leyes                   El Aviso 
                         2                          1 
                   El Bien            El Bien Público 
                        75                        303 
             El Orden 1853     El Periódico Ilustrado 
                         6                          9 
                  El Siglo   El Telégrafo de la línea 
                        21                          3 
                El Tribuno                El unitario 
                         9                          6 
                El Uruguay                La Justicia 
                         2                          2 
                    La Paz                La Trinidad 
                        59                         26 
                  O Brazil             Periódicomanía 
                         2                          2 
               The Express The Montevideo Independent 
                       105                          1 
data$Periodico[data$Periodico=="El bien público"]<- "El Bien Público"
data$Periodico[data$Periodico=="El bien Público"]<- "El Bien Público"
data$Periodico[data$Periodico=="La Trinidad 1881"]<- "La Trinidad"
data$Periodico[data$Periodico=="LaTrinidad"]<- "La Trinidad"
table(data$Periodico)

     Defensor de las Leyes                   El Aviso 
                         2                          1 
                   El Bien            El Bien Público 
                        75                        303 
             El Orden 1853     El Periódico Ilustrado 
                         6                          9 
                  El Siglo   El Telégrafo de la línea 
                        21                          3 
                El Tribuno                El unitario 
                         9                          6 
                El Uruguay                La Justicia 
                         2                          2 
                    La Paz                La Trinidad 
                        59                         26 
                  O Brazil             Periódicomanía 
                         2                          2 
               The Express The Montevideo Independent 
                       105                          1 

Georreferenciar los registros

data$lat <- as.numeric(data$latitud_norte)
data$lon <- as.numeric(data$longitud_este)
coordinates(data) <- c("lon", "lat")
class(data)
[1] "SpatialPointsDataFrame"
attr(,"package")
[1] "sp"
head(data)
           coordinates Identificador codigoISO_pais_registro
1 (-56.1666, -34.8669) 010001.01:URY                     URY
2 (-56.1666, -34.8669) 010001.02:URY                     URY
3 (-71.6163, -32.0458) 010001.03:URY                     URY
4             (-79, 9) 010001.04:URY                     URY
5 (-56.2513, -34.8844) 010001:05:URY                     URY
6 (-56.2513, -34.8844) 010001:06:URY                     URY
  codigoISO_pais_evento  Año                Periodico N. Fecha
1                   URY 1831           Periódicomanía  5  #N/A
2                   URY 1831           Periódicomanía  6  #N/A
3                   CHL 1836    Defensor de las Leyes 60  #N/A
4                   PAN 1836    Defensor de las Leyes 86  #N/A
5                   URY 1844 El Telégrafo de la línea  5  #N/A
6                   URY 1844 El Telégrafo de la línea  5  #N/A
           Evento latitud_norte latitud_sur longitud_este longitud_oeste
1     Buen tiempo      -34.8669        <NA>      -56.1666           <NA>
2        Temporal      -34.8669        <NA>      -56.1666           <NA>
3        Temporal      -32.0458        <NA>      -71.6163           <NA>
4 Temporal fuerte       09.0000        <NA>      -79.0000           <NA>
5        Temporal      -34.8844        <NA>      -56.2513           <NA>
6          Niebla      -34.8844        <NA>      -56.2513           <NA>
   Veloc_Viento creciente temperatura lluvias nevada
1   0 a 1 Km/hr      <NA>        <NA>    <NA>   <NA>
2 62 a 87 km/hr      <NA>        <NA>    <NA>   <NA>
3 62 a 74 Km/hr      <NA>        <NA>    <NA>   <NA>
4 75 a 84 km/hr      <NA>        <NA>    <NA>   <NA>
5 62 a 74 km/hr      <NA>        <NA>    <NA>   <NA>
6          <NA>      <NA>        <NA>    <NA>   <NA>
                                                              efecto_detectable
1                                                     sin indicios de tempestad
2                            Pasó la tormenta puntual, destrozos consideralbles
3                                    Valparaiso, problemas fragata por temporal
4                                                    Istmo de Paraná. Destrozos
5 1844-12-14 hr. 14:30 Lanchón General Medina varó en Punta Lobos por el viento
6            1844-12-15 hr. 7: 45 no pueden hacerse observaciones por la niebla
                                                                      URI
1 http://bibliotecadigital.bibna.gub.uy:8080/jspui/handle/123456789/24368
2 http://bibliotecadigital.bibna.gub.uy:8080/jspui/handle/123456789/24369
3 http://bibliotecadigital.bibna.gub.uy:8080/jspui/handle/123456789/23887
4 http://bibliotecadigital.bibna.gub.uy:8080/jspui/handle/123456789/23888
5 http://bibliotecadigital.bibna.gub.uy:8080/jspui/handle/123456789/21715
6 http://bibliotecadigital.bibna.gub.uy:8080/jspui/handle/123456789/21715

Guardar los datos homogenizados como archivo RDATA

opts_knit$set(root.dir = "D:/adm/Documents/RESEARCH/IPGH-Tendencias/datos/corregidos/")
data$year <- data$Año
save(data, file = "CleanData.RData")

Para reducir el numero de eventos a considerar, se realizó la siguiente clasificación.

data$Evento_r[data$Evento=="Altas temperaturas"]<- "Calor"
data$Evento_r[data$Evento=="Calor"]<-"Calor"
data$Evento_r[data$Evento=="Exesivo calor"]<-"Calor"
data$Evento_r[data$Evento=="Bajas temperaturas"]<- "Frio"
data$Evento_r[data$Evento=="Frío"]<- "Frio"
data$Evento_r[data$Evento=="Frío intenso"]<-"Frio"
data$Evento_r[data$Evento=="Escarcha"]<-"Frio"
data$Evento_r[data$Evento=="Heladas"]<-"Frio"
data$Evento_r[data$Evento=="Ola de frío"]<-"Frio"
  
data$Evento_r[data$Evento=="Brisa débil"]<- "Viento"
data$Evento_r[data$Evento=="Brisa fresca"]<-"Viento"
data$Evento_r[data$Evento=="Brisa fuerte"]<-"Viento"
data$Evento_r[data$Evento=="Brisa moderada"]<-"Viento"
data$Evento_r[data$Evento=="Viento"]<-"Viento"
data$Evento_r[data$Evento=="Viento fuerte"]<-"Viento"
data$Evento_r[data$Evento=="Pampero"]<-"Viento"
#"Hidrometeoro - precipitación" 5 eventos
data$Evento_r[data$Evento=="Lluvia"]<- "Hidrometeoro - precipitación"
data$Evento_r[data$Evento=="Lluvias (fin sequía)"]<-"Hidrometeoro - precipitación"
data$Evento_r[data$Evento=="Granizada"]<-"Hidrometeoro - precipitación"
data$Evento_r[data$Evento=="Nevada"]<-"Hidrometeoro - precipitación"
data$Evento_r[data$Evento=="Nieve"]<-"Hidrometeoro - precipitación"
data$Evento_r[data$Evento=="Temporal"]<-"Tempestad"
data$Evento_r[data$Evento=="Temporal duro"]<-"Tempestad"
data$Evento_r[data$Evento=="Temporal fuerte"]<-"Tempestad"
data$Evento_r[data$Evento=="Temporal huracanado"]<-"Tempestad"
data$Evento_r[data$Evento=="Temporal muy duro"]<-"Tempestad"
data$Evento_r[data$Evento=="Temporal muy fuerte"]<-"Tempestad"
data$Evento_r[data$Evento=="Tifón"]<-"Tempestad"
data$Evento_r[data$Evento=="Tormenta"]<-"Tempestad"
data$Evento_r[data$Evento=="Borrasca"]<-"Tempestad"
data$Evento_r[data$Evento=="Ciclón"]<- "Tempestad"
#"Tiempo severo" 1 evebti
data$Evento_r[data$Evento=="Huracán"]<-"Tiempo severo"
data$Evento_r[data$Evento=="Niebla"]<-"Hidrometeoro - Suspención"
data$Evento_r[data$Evento=="Nubosidad"]<-"Cobertura del cielo"
data$Evento_r[data$Evento=="Poca Nubosidad"]<-"Cobertura del cielo"
data$Evento_r[data$Evento=="Buen tiempo"] <-"Cobertura del cielo"
data$Evento_r[data$Evento=="Inundación"] <-"Inundación"
data$Evento_r[data$Evento=="Sequía"] <-"Sequía"
data$Evento_r[data$Evento=="Avalancha"] <-"Avalancha"
table(data$Evento_r)

                   Avalancha                        Calor          Cobertura del cielo 
                           1                           20                            3 
                        Frio Hidrometeoro - precipitación    Hidrometeoro - Suspención 
                          13                           81                            2 
                  Inundación                       Sequía                    Tempestad 
                         115                           20                          223 
               Tiempo severo                       Viento 
                           1                          155 
save(data, file = "CleanData_reclasificado.RData")
LS0tDQp0aXRsZTogIkxlY3R1cmEgeSBwcmVwYXJhY2lvbiBkZSBkYXRvcyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCkVzdGUgZG9jdW1lbnRvIGNvbnRpZW5lIGVsIGPzZGlnbyBSIHBhcmEgbGEgbGVjdHVyYSwgbGltcGllemEgeSBnZW9ycmVmZXJlbmNpYWNp824gZGUgbG9zIGRhdG9zIHJlY29sZWN0YWRvcyBlbiBlbCBwcm95ZWN0byBgQ29tcGFydGllbmRvIGxhIGhpc3RvcmlhIGVzY29uZGlkYSBkZWwgY2FtYmlvIGNsaW1hdGljbyBlbiBMYXRpbm9hbWVyaWNhIGEgdHJhdmVzIGRlIGxhcyBUSUNgLCBmaW5hbmNpYWRvIHBvciBlbCBJbnN0aXR1dG8gUGFuYW1lcmljYW5vIGRlIEdlb2dyYWZpYSBlIEhpc3RvcmlhIChJUEdIKS4gDQoNCkNyZWRpdG9zDQpEYW5pZWxhIEJhbGxhcmkgLSBVbml2ZXJzaWRhZCBkZWwgQXp1YXksIEN1ZW5jYSwgRWN1YWRvciwgZGJhbGxhcmlAdWF6dWF5LmVkdS5lYyAtIFByb2dyYW1hY2nzbiBSIHkgVmlzdWFsaXphY2lvbiA8YnIvPg0KRGlhbmEgQ29tZXNhbmEgLSBVbml2ZXJzaWRhZCBkZSBsYSBSZXB1YmxpY2EsIE1vbnRldmlkZW8sIFVydWd1YXksIGRpYW5hLmNvbWVzYW5hQGZpYy5lZHUudXkgLSBSZWNvbGVjY2lvbiB5IG9yZ2FuaXphY2lvbiBkZSBpbmZvcm1hY2lvbiA8YnIvPg0KTHVpcyBWaWxjaGVzIC0gVW5pdmVyc2lkYWQgSmF2ZXJpYW5hLCBCb2dvdGEsIENvbG9tYmlhLCBsbXZpbGNoZXNAamF2ZXJpYW5hLmVkdS5jbyAtIERpcmVjdG9yIGRlbCBwcm95ZWN0byA8YnIvPiANCg0KRWwgY/NkaWdvIHNlIGVqZWN1dGEgY29uIGBSdW5gIG8gYEN0cmwrU2hpZnQrRW50ZXJgLCBlbCByZXN1bHRhZG8gYXBhcmVjZXLhIGRlYmFqbyBkZWwgY/NkaWdvDQoNCg0KQ2FyZ2FyIGxhcyBsaWJyZXJpYXMgYSB1dGlsaXphci4NCmBgYHtyfQ0KbGlicmFyeShyZWFkT0RTKQ0KbGlicmFyeShzcCkNCmxpYnJhcnkoa25pdHIpDQpgYGANCkRlZmluaXIgZWwgZGlyZWN0b3JpbyBkZSB0cmFiYWpvIGRvbmRlIHNlIGxvY2FsaXphbiBsb3MgYXJjaGl2b3MgeSBsZWVyIGxvcyBhcmNoaXZvcy4gRW4gZXN0ZSBjYXNvIHNvbiBhcmNoaXZvcyBkZSBleGNlbCBwb3IgYfFvIHkgcG9yIHBlcmnzZGljby4gU2UgY29taWVuemEgdHJhYmFqYW5kbyBjb24gbG9zIGRhdG9zIGRlIFVydWd1YXkuDQoNCmBgYHtyfQ0Kb3B0c19rbml0JHNldChyb290LmRpciA9ICJEOi9hZG0vRG9jdW1lbnRzL1JFU0VBUkNIL0lQR0gtVGVuZGVuY2lhcy9kYXRvcy9jb3JyZWdpZG9zL3VydWd1YXlfcmVzdWx0YWRvc19jb3JyZWdpZG9zIikNCmBgYA0KRWwgY/NkaWdvIGFudGVyaW9yIGVzIGVxdWl2YWxlbnRlIGEgIGBzZXR3ZCgiRDovYWRtL0RvY3VtZW50cy9SRVNFQVJDSC9JUEdILVRlbmRlbmNpYXMvZGF0b3MvY29ycmVnaWRvcy91cnVndWF5X3Jlc3VsdGFkb3NfY29ycmVnaWRvcyIpYA0KDQpgYGB7cn0NCmZpbGVzIDwtIGxpc3QuZmlsZXMocGF0dGVybj0nJykgI2xlZXIgYXJjaGl2b3MgZGUgdGV4dG8NCmZpbGVzIDwtIHBhc3RlMChnZXR3ZCgpLCIvIixmaWxlcykNCmhlYWQoZmlsZXMpDQpgYGANCkxlZXIgbG9zIGRhdG9zIGRlIFVydWd1YXkgeSB1bmlyIGxvcyBkaWZlcmVudGVzIGV4Y2VscyBlbiB1bmEg+m5pY2EgdmFyaWFibGUgbGxhbWFkYSBgZGF0YWANCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSxlcnJvcj1GQUxTRX0NCmRhdGEgPC0gTlVMTA0KZm9yKGkgaW4gMTpsZW5ndGgoZmlsZXMpKXsNCiAgYSA8LSByZWFkX29kcyhmaWxlc1tpXSwgc2hlZXQgPSAxLCBjb2xfbmFtZXMgPSBUUlVFLCApDQogIG5hbWVzKGEpIDwtIGMoIklkZW50aWZpY2Fkb3IiLCJjb2RpZ29JU09fcGFpc19yZWdpc3RybyIsImNvZGlnb0lTT19wYWlzX2V2ZW50byIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQfFvIiwiUGVyaW9kaWNvIiwiTrAiLCJGZWNoYSIsIkV2ZW50byIsICJsYXRpdHVkX25vcnRlIiwibGF0aXR1ZF9zdXIiLCAibG9uZ2l0dWRfZXN0ZSIsICJsb25naXR1ZF9vZXN0ZSIsICJWZWxvY19WaWVudG8iLCJjcmVjaWVudGUiLCAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVtcGVyYXR1cmEiLCAibGx1dmlhcyIsIm5ldmFkYSIsImVmZWN0b19kZXRlY3RhYmxlIiwiVVJJIiApDQogIGRhdGEgPC0gcmJpbmQoZGF0YSwgYSkNCn0NCmBgYA0KDQpgYGB7cn0NCm5yb3coZGF0YSkjNjE4DQpoZWFkKGRhdGEpDQpgYGANClNlIHByb2NlZGUgZGUgc2ltaWxhciBtYW5lcmEgY29uIGxvcyBkYXRvcyBkZSBDb2xvbWJpYS4gU2UgYfFhZGVuIGEgbG9zIGRhdG9zIGRlIFVydWd1YXkuDQoNCmBgYHtyfQ0Kb3B0c19rbml0JHNldChyb290LmRpciA9ICJEOi9hZG0vRG9jdW1lbnRzL1JFU0VBUkNIL0lQR0gtVGVuZGVuY2lhcy9kYXRvcy9jb3JyZWdpZG9zL0NvbG9tYmlhX3Jlc3VsdGFkb3NfY29ycmVnaWRvcy8iKQ0KYGBgDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZXJyb3I9RkFMU0V9DQpmaWxlcyA8LSBsaXN0LmZpbGVzKHBhdHRlcm49JycpICNsZWVyIGFyY2hpdm9zIGRlIHRleHRvDQpmaWxlcyA8LSBwYXN0ZTAoZ2V0d2QoKSwiLyIsZmlsZXMpDQpmaWxlcw0KZm9yKGkgaW4gMTpsZW5ndGgoZmlsZXMpKXsNCiAgYSA8LSByZWFkX29kcyhmaWxlc1tpXSwgc2hlZXQgPSAxLCBjb2xfbmFtZXMgPSBUUlVFLCkNCiAgbmFtZXMoYSkgPC0gbmFtZXMoZGF0YSkNCiAgZGF0YSA8LSByYmluZChkYXRhLCBhKQ0KfQ0KDQpucm93KGRhdGEpIzYzNA0KYGBgDQpSZXZpc2FyIHF1ZSBsb3MgZGF0b3MgZGUgbGF0aXR1ZCB5IGxvbmdpdHVkIGVzdOluIGNvbXBsZXRvcywgc2luIGRhdG9zIGZhbHRhbnRlcw0KYGBge3J9DQp0YWJsZShpcy5uYShkYXRhJGxhdGl0dWRfbm9ydGUpKQ0KdGFibGUoaXMubmEoZGF0YSRsb25naXR1ZF9lc3RlKSkNCmBgYA0KUmV2aXNhciBsb3MgdmFsb3JlcyD6bmljb3MgcGFyYSBldmVudG9zDQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRFdmVudG8pDQpgYGANCkhvbW9nZW5pemFyIGxvcyBldmVudG9zIGVuIHJlbGFjafNuIGEgbWF5+nNjdWxhcywgbWlu+nNjdWxhcywgZXNwYWNpb3MsIGV0Yy4NCmBgYHtyfQ0KZGF0YSRFdmVudG9bZGF0YSRFdmVudG89PSJBbHRhcyBUZW1wZXJhdHVyYXMiXTwtICJBbHRhcyB0ZW1wZXJhdHVyYXMiDQpkYXRhJEV2ZW50b1tkYXRhJEV2ZW50bz09IkJhamFzIFRlbXBlcmF0dXJhcyJdPC0gIkJhamFzIHRlbXBlcmF0dXJhcyINCmRhdGEkRXZlbnRvW2RhdGEkRXZlbnRvPT0iQmFqYSB0ZW1wZXJhdHVyYSJdPC0gIkJhamFzIHRlbXBlcmF0dXJhcyINCmRhdGEkRXZlbnRvW2RhdGEkRXZlbnRvPT0iRnJpbyBpbnRlbnNvIl08LSAiRnLtbyBpbnRlbnNvIg0KZGF0YSRFdmVudG9bZGF0YSRFdmVudG89PSJGcu1vIEludGVuc28iXTwtICJGcu1vIGludGVuc28iDQoNCmRhdGEkRXZlbnRvW2RhdGEkRXZlbnRvPT0iZ3Jhbml6YWRhIl08LSAiR3Jhbml6YWRhIg0KZGF0YSRFdmVudG9bZGF0YSRFdmVudG89PSJHcmFuaXpvIl08LSAiR3Jhbml6YWRhIg0KDQpkYXRhJEV2ZW50b1tkYXRhJEV2ZW50bz09IkludW5kYWNpb24iXTwtICJJbnVuZGFjafNuIg0KZGF0YSRFdmVudG9bZGF0YSRFdmVudG89PSJMbHV2aWFzIl08LSAiTGx1dmlhIg0KDQpkYXRhJEV2ZW50b1tkYXRhJEV2ZW50bz09Im5ldmFkYSJdPC0gIk5ldmFkYSINCmRhdGEkRXZlbnRvW2RhdGEkRXZlbnRvPT0iVG9ybWV0YSJdPC0gIlRvcm1lbnRhIg0KDQpkYXRhJEV2ZW50b1tkYXRhJEV2ZW50bz09IlRlbXBvcmFsIEh1cmFjYW5hZG8iXTwtICJUZW1wb3JhbCBodXJhY2FuYWRvIg0KZGF0YSRFdmVudG9bZGF0YSRFdmVudG89PSJUZW1wb3JhbCBEdXJvIl08LSAiVGVtcG9yYWwgZHVybyINCmRhdGEkRXZlbnRvW2RhdGEkRXZlbnRvPT0iVGVtcG9yYWwgRnVlcnRlIl08LSAiVGVtcG9yYWwgZnVlcnRlIg0KDQp0YWJsZShkYXRhJEV2ZW50bykNCmBgYA0KSG9tb2dlbml6YXIgbG9zIHBlcmnzZGljb3MNCmBgYHtyfQ0KdGFibGUoZGF0YSRQZXJpb2RpY28pDQpkYXRhJFBlcmlvZGljb1tkYXRhJFBlcmlvZGljbz09IkVsIGJpZW4gcPpibGljbyJdPC0gIkVsIEJpZW4gUPpibGljbyINCmRhdGEkUGVyaW9kaWNvW2RhdGEkUGVyaW9kaWNvPT0iRWwgYmllbiBQ+mJsaWNvIl08LSAiRWwgQmllbiBQ+mJsaWNvIg0KZGF0YSRQZXJpb2RpY29bZGF0YSRQZXJpb2RpY289PSJMYSBUcmluaWRhZCAxODgxIl08LSAiTGEgVHJpbmlkYWQiDQpkYXRhJFBlcmlvZGljb1tkYXRhJFBlcmlvZGljbz09IkxhVHJpbmlkYWQiXTwtICJMYSBUcmluaWRhZCINCnRhYmxlKGRhdGEkUGVyaW9kaWNvKQ0KYGBgDQoNCkdlb3JyZWZlcmVuY2lhciBsb3MgcmVnaXN0cm9zDQpgYGB7cn0NCmRhdGEkbGF0IDwtIGFzLm51bWVyaWMoZGF0YSRsYXRpdHVkX25vcnRlKQ0KZGF0YSRsb24gPC0gYXMubnVtZXJpYyhkYXRhJGxvbmdpdHVkX2VzdGUpDQpjb29yZGluYXRlcyhkYXRhKSA8LSBjKCJsb24iLCAibGF0IikNCmNsYXNzKGRhdGEpDQpoZWFkKGRhdGEpDQpgYGANCkd1YXJkYXIgbG9zIGRhdG9zIGhvbW9nZW5pemFkb3MgY29tbyBhcmNoaXZvIFJEQVRBDQoNCmBgYHtyfQ0Kb3B0c19rbml0JHNldChyb290LmRpciA9ICJEOi9hZG0vRG9jdW1lbnRzL1JFU0VBUkNIL0lQR0gtVGVuZGVuY2lhcy9kYXRvcy9jb3JyZWdpZG9zLyIpDQpgYGANCmBgYHtyfQ0KZGF0YSR5ZWFyIDwtIGRhdGEkQfFvDQpzYXZlKGRhdGEsIGZpbGUgPSAiQ2xlYW5EYXRhLlJEYXRhIikNCmBgYA0KUGFyYSByZWR1Y2lyIGVsIG51bWVybyBkZSBldmVudG9zIGEgY29uc2lkZXJhciwgc2UgcmVhbGl68yBsYSBzaWd1aWVudGUgY2xhc2lmaWNhY2nzbi4NCmBgYHtyfQ0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IkFsdGFzIHRlbXBlcmF0dXJhcyJdPC0gIkNhbG9yIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IkNhbG9yIl08LSJDYWxvciINCmRhdGEkRXZlbnRvX3JbZGF0YSRFdmVudG89PSJFeGVzaXZvIGNhbG9yIl08LSJDYWxvciINCg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IkJhamFzIHRlbXBlcmF0dXJhcyJdPC0gIkZyaW8iDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iRnLtbyJdPC0gIkZyaW8iDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iRnLtbyBpbnRlbnNvIl08LSJGcmlvIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IkVzY2FyY2hhIl08LSJGcmlvIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IkhlbGFkYXMiXTwtIkZyaW8iDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iT2xhIGRlIGZy7W8iXTwtIkZyaW8iDQoNCiAgDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iQnJpc2EgZOliaWwiXTwtICJWaWVudG8iDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iQnJpc2EgZnJlc2NhIl08LSJWaWVudG8iDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iQnJpc2EgZnVlcnRlIl08LSJWaWVudG8iDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iQnJpc2EgbW9kZXJhZGEiXTwtIlZpZW50byINCmRhdGEkRXZlbnRvX3JbZGF0YSRFdmVudG89PSJWaWVudG8iXTwtIlZpZW50byINCmRhdGEkRXZlbnRvX3JbZGF0YSRFdmVudG89PSJWaWVudG8gZnVlcnRlIl08LSJWaWVudG8iDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iUGFtcGVybyJdPC0iVmllbnRvIg0KDQojIkhpZHJvbWV0ZW9ybyAtIHByZWNpcGl0YWNp824iIDUgZXZlbnRvcw0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IkxsdXZpYSJdPC0gIkhpZHJvbWV0ZW9ybyAtIHByZWNpcGl0YWNp824iDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iTGx1dmlhcyAoZmluIHNlcXXtYSkiXTwtIkhpZHJvbWV0ZW9ybyAtIHByZWNpcGl0YWNp824iDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iR3Jhbml6YWRhIl08LSJIaWRyb21ldGVvcm8gLSBwcmVjaXBpdGFjafNuIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09Ik5ldmFkYSJdPC0iSGlkcm9tZXRlb3JvIC0gcHJlY2lwaXRhY2nzbiINCmRhdGEkRXZlbnRvX3JbZGF0YSRFdmVudG89PSJOaWV2ZSJdPC0iSGlkcm9tZXRlb3JvIC0gcHJlY2lwaXRhY2nzbiINCg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IlRlbXBvcmFsIl08LSJUZW1wZXN0YWQiDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iVGVtcG9yYWwgZHVybyJdPC0iVGVtcGVzdGFkIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IlRlbXBvcmFsIGZ1ZXJ0ZSJdPC0iVGVtcGVzdGFkIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IlRlbXBvcmFsIGh1cmFjYW5hZG8iXTwtIlRlbXBlc3RhZCINCmRhdGEkRXZlbnRvX3JbZGF0YSRFdmVudG89PSJUZW1wb3JhbCBtdXkgZHVybyJdPC0iVGVtcGVzdGFkIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IlRlbXBvcmFsIG11eSBmdWVydGUiXTwtIlRlbXBlc3RhZCINCmRhdGEkRXZlbnRvX3JbZGF0YSRFdmVudG89PSJUaWbzbiJdPC0iVGVtcGVzdGFkIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IlRvcm1lbnRhIl08LSJUZW1wZXN0YWQiDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iQm9ycmFzY2EiXTwtIlRlbXBlc3RhZCINCmRhdGEkRXZlbnRvX3JbZGF0YSRFdmVudG89PSJDaWNs824iXTwtICJUZW1wZXN0YWQiDQoNCg0KIyJUaWVtcG8gc2V2ZXJvIiAxIGV2ZWJ0aQ0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09Ikh1cmFj4W4iXTwtIlRpZW1wbyBzZXZlcm8iDQoNCmRhdGEkRXZlbnRvX3JbZGF0YSRFdmVudG89PSJOaWVibGEiXTwtIkhpZHJvbWV0ZW9ybyAtIFN1c3BlbmNp824iDQpkYXRhJEV2ZW50b19yW2RhdGEkRXZlbnRvPT0iTnVib3NpZGFkIl08LSJDb2JlcnR1cmEgZGVsIGNpZWxvIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IlBvY2EgTnVib3NpZGFkIl08LSJDb2JlcnR1cmEgZGVsIGNpZWxvIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IkJ1ZW4gdGllbXBvIl0gPC0iQ29iZXJ0dXJhIGRlbCBjaWVsbyINCg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IkludW5kYWNp824iXSA8LSJJbnVuZGFjafNuIg0KZGF0YSRFdmVudG9fcltkYXRhJEV2ZW50bz09IlNlcXXtYSJdIDwtIlNlcXXtYSINCmRhdGEkRXZlbnRvX3JbZGF0YSRFdmVudG89PSJBdmFsYW5jaGEiXSA8LSJBdmFsYW5jaGEiDQoNCmBgYA0KYGBge3J9DQp0YWJsZShkYXRhJEV2ZW50b19yKQ0KYGBgDQoNCmBgYHtyfQ0Kc2F2ZShkYXRhLCBmaWxlID0gIkNsZWFuRGF0YV9yZWNsYXNpZmljYWRvLlJEYXRhIikNCmBgYA==