Transiciones de situación.
En esta clase veremos un ejemplo de trabajo con datos de Panel. El ejercicio consiste en identificar a cada Individuo según su pertenencia a las categorías: Indigente, Pobre y No Pobre, en dos períodos consecutivos.
Es importante aclarar que los resultado no van a ser los mismos que los publicados, porque el calculo oficial se hace en una base semestral, mientras que este cálculo es una aproximación, en base trimestral.
Comenzamos limpiando la memoria y creando los directorios
rm(list=ls())
dir <- paste0(dirname(rstudioapi::getActiveDocumentContext()$path),"/")
bases.dir <- paste0(dirname(dir),"/Fuentes/")
resultados.dir <- paste0(dirname(dir),"/Resultados/")
Para el tipo especial de gráficos, utilizamos el paquete alluvial
library(alluvial, warn=FALSE)
library(tidyverse, warn=FALSE)
library(readxl, warn=FALSE)
library(questionr, warn=FALSE)
Levantamos las Bases Individuales de 2 trimestres consecutivos.
A su vez levantamos fuentes secundarias con información de la canasta alimentaria y la canasta total, categorías de Adulto equivalente, y códigos de regiones y aglomerados.
La información de estas tablas la podemos sacar del comunicado de pobreza.
individual.316 <- read.table(paste0(bases.dir, "usu_individual_t316.txt"), sep=";", dec=",", header = TRUE, fill = TRUE)
individual.416 <- read.table(paste0(bases.dir, "usu_individual_t416.txt"), sep=";", dec=",", header = TRUE, fill = TRUE)
Adequi <- read_excel(paste0(bases.dir,"ADEQUI.xls"))
Adequi
CBA <- read_excel(paste0(bases.dir,"CANASTAS.xls"),sheet = "CBA")
CBA
CBT <- read_excel(paste0(bases.dir,"CANASTAS.xls"),sheet = "CBT")
CBT
dic.regiones <- read_excel(paste0(bases.dir,'Regiones.xlsx'))
dic.regiones
Canastas Trimestrales por Region
A partir de los datos mensuales de la Canasta Básica Alimentaria y Total publicados por INDEC, calculamos un valor trimestral de ambas canastas, para un Adulto Equivalente perteneciente a cada una de las regiones.
CBA$Canasta <- 'CBA'
CBT$Canasta <- 'CBT'
Canasta <- bind_rows(CBA,CBT) %>%
gather(.,Region, Valor, c(3:(ncol(.)-1) )) %>%
mutate(Trimestre = case_when(Mes %in% c(1:3) ~1,
Mes %in% c(4:6) ~2,
Mes %in% c(7:9) ~3,
Mes %in% c(10:12) ~4),
Periodo = paste(Año, Trimestre, sep='.')) %>%
group_by(Canasta, Region, Periodo) %>%
summarise(Valor = mean(Valor)) %>%
spread(., Canasta,Valor) %>%
left_join(., dic.regiones, by = "Region") %>%
ungroup() %>%
select(-Region)
package 㤼㸱bindrcpp㤼㸲 was built under R version 3.4.1
Canasta
Armamos un vector que contiene las variables relevantes para el ejercicio. Para luego seleccionar de la tabla solo las mismas.
var.ind <- c('CODUSU', 'ANO4','TRIMESTRE','NRO_HOGAR','COMPONENTE','REGION',
'AGLOMERADO', 'PONDERA', 'CH04', 'CH06', 'ITF', 'PONDIH','P21')
Calculo de las Unidades de Adulto Equivalente por hogar, en la base Individual
- Chequeamos la consistencia entre los individuos entre un período y otro. Para ello utilizamos la función lead para observar las características de los individuos en en t+1.
- Incorporamos a cada registro de nuestra base la Unidad de Adulto Equivalente (UAE) correspondiente, matcheando las columnas de Edad (CH06) y género (CH04) mediante la función left_join.
- Utilizamos la función group_by para calcular el total de UAE por hogar. Notesé que al usar la función mutate creamos una nueva columna, permitiendo conservar la dimensión individual de la base.
- En base a las UAE del hogar al que pertenece cada individuo calculamos el valor de las canastas que delimitan las lineas de pobreza e indigencia correspondientes.
- Realizamos la comparación lógica entre el Ingreso Total Familiar y las Canastas calculadas para asignar a cada individuo su “situación” mediante la función case_when.
Pobreza_Individual <- bind_rows(individual.316 %>%
select(var.ind),
individual.416 %>%
select(var.ind)) %>%
mutate(Periodo = paste(ANO4, TRIMESTRE, sep='.')) %>%
group_by(CODUSU,NRO_HOGAR,COMPONENTE) %>%
mutate(CH06_Diff = abs(lead(CH06) - CH06)<3,
CH04_Diff = lead(CH04==CH04),
Consistencia= ifelse((CH06_Diff & CH04_Diff)== FALSE,
"inconsistente","consistente")) %>%
ungroup() %>%
left_join(., Adequi, by = c("CH04", "CH06")) %>%
group_by(CODUSU, NRO_HOGAR, Periodo) %>%
mutate(Adequi_hogar = sum(adequi)) %>%
ungroup() %>%
left_join(., Canasta, by = c("REGION", "Periodo")) %>%
mutate(CBA = CBA*Adequi_hogar,
CBT = CBT*Adequi_hogar,
Situacion = case_when(ITF<CBA ~ 'Indigente',
ITF>=CBA & ITF<CBT ~ 'Pobre',
ITF>=CBT ~ 'No.Pobre'))
Pobreza_Individual
Armado de Paneles
Dada la estructura de rotación de la muestra de la EPH, solo la mitad de los hogares permanece en la muestra en dos trimestres consecutivos. Por ende identificamos a aquellos hogares que entraron en ambas muestras. Para eso, utilizamos las función lag (lead) que sirve para obtener el valor anterior (posterior) de una variable en el Dataframe. Al estar trabajando de manera agrupada por hogar, podemos chequear si existe un valor con determinado CODUSU en el período siguiente o no.
Una vez identificados los hogares que permanecen en la muestra, con la función lead podemos crear una variable de Situación_t1.
Panel_Ind <- Pobreza_Individual %>%
filter(PONDIH>0) %>%
#Si no saco estos me queda gente que en alguno de los dos periodos no respondio ingresos y distorsiona todo
group_by(CODUSU, NRO_HOGAR, COMPONENTE) %>%
arrange(Periodo) %>%
mutate(Cod.Panel = as.factor(ifelse(!is.na(lead(Periodo)),1,0)),
Situacion_t1 = lead(Situacion)) %>%
filter(Cod.Panel == 1,Consistencia=="consistente")
Panel_Ind
Cálculo de Tasas de Pobreza e Indigencia - Base completa y Panel
Pobreza_resumen <- Pobreza_Individual %>%
group_by(Periodo) %>%
summarise(Tasa_pobreza = sum(PONDIH[Situacion %in% c('Pobre', 'Indigente')],na.rm = TRUE)/
sum(PONDIH,na.rm = TRUE),
Tasa_indigencia = sum(PONDIH[Situacion == 'Indigente'],na.rm = TRUE)/
sum(PONDIH,na.rm = TRUE))
Pobreza_resumen
Pobreza.panel <- Panel_Ind %>%
group_by(Periodo) %>%
summarise(Tasa_pobreza = sum(PONDIH[Situacion %in% c('Pobre', 'Indigente')],na.rm = TRUE)/
sum(PONDIH,na.rm = TRUE),
Tasa_indigencia = sum(PONDIH[Situacion == 'Indigente'],na.rm = TRUE)/
sum(PONDIH,na.rm = TRUE))
Pobreza.panel
Grafico de Transición
Para realizar el gráfico de transición, utilizaremos el paquete alluvial, con la función homónima.
Para ello debemos construir un Dataframe que contenga la cantidad de casos observado para cada posible transición. Utilizamos el Ponderador de Ingresos (PONDIH).
Adicionalmente, reescribimos como factores a las variables de Situación, para ordenar su aparición en el gráfico.
datos.alluvial <- Panel_Ind %>%
group_by(Situacion,Situacion_t1, REGION) %>%
summarise(frecuencia = sum(PONDIH),
n_muestral = n()) %>%
left_join(.,dic.regiones, by= "REGION") %>%
arrange(REGION)
datos.alluvial$Situacion <- factor(datos.alluvial$Situacion, levels =
c("No.Pobre","Pobre","Indigente"))
datos.alluvial$Situacion_t1 <- factor(datos.alluvial$Situacion_t1, levels =
c("No.Pobre","Pobre","Indigente"))
datos.alluvial
Loop de Gráficos
- Con la función pdf(generamos un archivo “.pdf” en la dirección y nombre especificados)
- Realizamos un loop por aglomerado para ir armando los gráficos.
- Filtramos iterativamente nuestra tabla a graficar según el aglomerado en curso y creamos un vector con el nombre del mismo.
- Especificamos un vector de colores en función de las posibles transiciones.
- Realizamos el gráfico con las especificaciones de data, color y tamaño.
- Con
dev.off() cerramos el archivo .pdf
# pdf(paste(resultados.dir, "Transiciones de Situación - Regiones - t316-t416.pdf", sep = ""), onefile = T)
for(Reg in unique(datos.alluvial$REGION)){
data.Reg <- datos.alluvial %>% filter(REGION == Reg)
tmp.nom <- dic.regiones$Region[dic.regiones$REGION==Reg]
colores <- ifelse(data.Reg$Situacion==data.Reg$Situacion_t1,"gray90",
ifelse(data.Reg$Situacion_t1=="Indigente","firebrick1",
ifelse(data.Reg$Situacion_t1 == 'Pobre','goldenrod1',
ifelse(data.Reg$Situacion_t1 == 'No.Pobre','chartreuse2','red'))))
transiciones <- alluvial(data.Reg[,c(1:2)], freq=data.Reg$frecuencia, border=NA,
col = colores, cex=0.75, xw=.15)
mtext(paste0('Region: ',tmp.nom), 3, line=3, font=2)
paste(Sys.time(),tmp.nom)
}






# dev.off()
LS0tDQp0aXRsZTogIkNsYXNlIDQuIERhdG9zIGVuIFBhbmVsIC0gVHJhbnNpY2lvbmVzIGRlIFNpdHVhY2nDs24gcG9yIEhvZ2FyLiINCmF1dGhvcjogIk5hdHN1bWkgU2hva2lkYSwgR3VkaW8gV2Vrc2xlciB5IERpZWdvIEtvemxvd3NraSINCmRhdGU6ICIyNyBkZSBPY3R1YnJlIGRlIDIwMTciDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZSANCi0tLQ0KDQojIFRyYW5zaWNpb25lcyBkZSBzaXR1YWNpw7NuLiANCg0KRW4gZXN0YSBjbGFzZSB2ZXJlbW9zIHVuIGVqZW1wbG8gZGUgdHJhYmFqbyBjb24gZGF0b3MgZGUgUGFuZWwuIEVsIGVqZXJjaWNpbyBjb25zaXN0ZSBlbiBpZGVudGlmaWNhciBhIGNhZGEgSW5kaXZpZHVvIHNlZ8O6biBzdSBwZXJ0ZW5lbmNpYSBhIGxhcyBjYXRlZ29yw61hczogX0luZGlnZW50ZV8sIF9Qb2JyZV8geSBfTm8gUG9icmVfLCBlbiBkb3MgcGVyw61vZG9zIGNvbnNlY3V0aXZvcy4gICAgICANCkVzIGltcG9ydGFudGUgYWNsYXJhciBxdWUgbG9zIHJlc3VsdGFkbyBubyB2YW4gYSBzZXIgbG9zIG1pc21vcyBxdWUgbG9zIHB1YmxpY2Fkb3MsIHBvcnF1ZSBlbCBjYWxjdWxvIG9maWNpYWwgc2UgaGFjZSBlbiB1bmEgYmFzZSBzZW1lc3RyYWwsIG1pZW50cmFzIHF1ZSBlc3RlIGPDoWxjdWxvIGVzIHVuYSBhcHJveGltYWNpw7NuLCBlbiBiYXNlIHRyaW1lc3RyYWwuDQoNCiANCkNvbWVuemFtb3MgbGltcGlhbmRvIGxhIG1lbW9yaWEgeSBjcmVhbmRvIGxvcyBkaXJlY3Rvcmlvcw0KDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCnJtKGxpc3Q9bHMoKSkNCg0KZGlyIDwtIHBhc3RlMChkaXJuYW1lKHJzdHVkaW9hcGk6OmdldEFjdGl2ZURvY3VtZW50Q29udGV4dCgpJHBhdGgpLCIvIikNCmJhc2VzLmRpciAgICAgIDwtICBwYXN0ZTAoZGlybmFtZShkaXIpLCIvRnVlbnRlcy8iKQ0KcmVzdWx0YWRvcy5kaXIgPC0gcGFzdGUwKGRpcm5hbWUoZGlyKSwiL1Jlc3VsdGFkb3MvIikNCmBgYA0KDQpQYXJhIGVsIHRpcG8gZXNwZWNpYWwgZGUgZ3LDoWZpY29zLCB1dGlsaXphbW9zIGVsIHBhcXVldGUgX2FsbHV2aWFsXw0KDQpgYGB7cn0NCmxpYnJhcnkoYWxsdXZpYWwsIHdhcm4gPSBGQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlLCB3YXJuID0gRkFMU0UpDQpsaWJyYXJ5KHJlYWR4bCwgd2FybiA9IEZBTFNFKQ0KbGlicmFyeShxdWVzdGlvbnIsIHdhcm4gPSBGQUxTRSkNCmBgYA0KDQpMZXZhbnRhbW9zIGxhcyBCYXNlcyBJbmRpdmlkdWFsZXMgZGUgMiB0cmltZXN0cmVzIGNvbnNlY3V0aXZvcy4gICAgICAgDQpBIHN1IHZleiBsZXZhbnRhbW9zIGZ1ZW50ZXMgc2VjdW5kYXJpYXMgY29uIGluZm9ybWFjacOzbiBkZSBsYSBjYW5hc3RhIGFsaW1lbnRhcmlhIHkgbGEgY2FuYXN0YSB0b3RhbCwgY2F0ZWdvcsOtYXMgZGUgQWR1bHRvIGVxdWl2YWxlbnRlLCB5IGPDs2RpZ29zIGRlIHJlZ2lvbmVzIHkgYWdsb21lcmFkb3MuICAgICANCkxhIGluZm9ybWFjacOzbiBkZSBlc3RhcyB0YWJsYXMgbGEgcG9kZW1vcyBzYWNhciBkZWwgW2NvbXVuaWNhZG8gZGUgcG9icmV6YV0oaHR0cDovL3d3dy5pbmRlYy5nb2IuYXIvdXBsb2Fkcy9pbmZvcm1lc2RlcHJlbnNhL2VwaF9wb2JyZXphXzAyXzE2LnBkZikuDQoNCg0KYGBge3J9DQppbmRpdmlkdWFsLjMxNiA8LSByZWFkLnRhYmxlKHBhc3RlMChiYXNlcy5kaXIsICJ1c3VfaW5kaXZpZHVhbF90MzE2LnR4dCIpLCBzZXA9IjsiLCBkZWM9IiwiLCBoZWFkZXIgPSBUUlVFLCBmaWxsID0gVFJVRSkNCmluZGl2aWR1YWwuNDE2IDwtIHJlYWQudGFibGUocGFzdGUwKGJhc2VzLmRpciwgInVzdV9pbmRpdmlkdWFsX3Q0MTYudHh0IiksIHNlcD0iOyIsIGRlYz0iLCIsIGhlYWRlciA9IFRSVUUsIGZpbGwgPSBUUlVFKQ0KDQoNCkFkZXF1aSA8LSByZWFkX2V4Y2VsKHBhc3RlMChiYXNlcy5kaXIsIkFERVFVSS54bHMiKSkNCkFkZXF1aQ0KQ0JBIDwtIHJlYWRfZXhjZWwocGFzdGUwKGJhc2VzLmRpciwiQ0FOQVNUQVMueGxzIiksc2hlZXQgPSAiQ0JBIikNCkNCQQ0KQ0JUIDwtIHJlYWRfZXhjZWwocGFzdGUwKGJhc2VzLmRpciwiQ0FOQVNUQVMueGxzIiksc2hlZXQgPSAiQ0JUIikNCkNCVA0KZGljLnJlZ2lvbmVzIDwtIHJlYWRfZXhjZWwocGFzdGUwKGJhc2VzLmRpciwnUmVnaW9uZXMueGxzeCcpKQ0KZGljLnJlZ2lvbmVzDQpgYGANCg0KIyMgQ2FuYXN0YXMgVHJpbWVzdHJhbGVzIHBvciBSZWdpb24NCg0KQSBwYXJ0aXIgZGUgbG9zIGRhdG9zIG1lbnN1YWxlcyBkZSBsYSBDYW5hc3RhIELDoXNpY2EgQWxpbWVudGFyaWEgeSBUb3RhbCBwdWJsaWNhZG9zIHBvciBJTkRFQywgY2FsY3VsYW1vcyB1biB2YWxvciB0cmltZXN0cmFsIGRlIGFtYmFzIGNhbmFzdGFzLCBwYXJhIHVuIEFkdWx0byBFcXVpdmFsZW50ZSBwZXJ0ZW5lY2llbnRlIGEgY2FkYSB1bmEgZGUgbGFzIHJlZ2lvbmVzLg0KDQpgYGB7cn0NCkNCQSRDYW5hc3RhIDwtICdDQkEnDQpDQlQkQ2FuYXN0YSA8LSAnQ0JUJw0KQ2FuYXN0YSA8LSBiaW5kX3Jvd3MoQ0JBLENCVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJT4lIA0KICBnYXRoZXIoLixSZWdpb24sIFZhbG9yLCBjKDM6KG5jb2woLiktMSkgKSkgICAgICAgICAgICAgJT4lDQogIG11dGF0ZShUcmltZXN0cmUgPSBjYXNlX3doZW4oTWVzICVpbiUgYygxOjMpICAgfjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzICVpbiUgYyg0OjYpICAgfjIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzICVpbiUgYyg3OjkpICAgfjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzICVpbiUgYygxMDoxMikgfjQpLA0KICAgICAgICAgUGVyaW9kbyA9IHBhc3RlKEHDsW8sIFRyaW1lc3RyZSwgc2VwPScuJykpICAgICAgICU+JSANCiAgZ3JvdXBfYnkoQ2FuYXN0YSwgUmVnaW9uLCBQZXJpb2RvKSAgICAgICAgICAgICAgICAgICAgICU+JSANCiAgc3VtbWFyaXNlKFZhbG9yID0gbWVhbihWYWxvcikpICAgICAgICAgICAgICAgICAgICAgICAgICU+JSANCiAgc3ByZWFkKC4sIENhbmFzdGEsVmFsb3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICU+JSANCiAgbGVmdF9qb2luKC4sIGRpYy5yZWdpb25lcywgYnkgPSAiUmVnaW9uIikgICAgICAgICAgICAgICU+JSANCiAgdW5ncm91cCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICU+JSANCiAgc2VsZWN0KC1SZWdpb24pDQpDYW5hc3RhDQpgYGANCg0KQXJtYW1vcyB1biB2ZWN0b3IgcXVlIGNvbnRpZW5lIGxhcyB2YXJpYWJsZXMgcmVsZXZhbnRlcyBwYXJhIGVsIGVqZXJjaWNpby4gUGFyYSBsdWVnbyBzZWxlY2Npb25hciBkZSBsYSB0YWJsYSBzb2xvIGxhcyBtaXNtYXMuDQpgYGB7cn0NCg0KdmFyLmluZCA8LSBjKCdDT0RVU1UnLCAnQU5PNCcsJ1RSSU1FU1RSRScsJ05ST19IT0dBUicsJ0NPTVBPTkVOVEUnLCdSRUdJT04nLA0KICAgICAgICAgICAgICdBR0xPTUVSQURPJywgJ1BPTkRFUkEnLCAnQ0gwNCcsICdDSDA2JywgJ0lURicsICdQT05ESUgnLCdQMjEnKQ0KYGBgDQoNCiMjQ2FsY3VsbyBkZSBsYXMgVW5pZGFkZXMgZGUgQWR1bHRvIEVxdWl2YWxlbnRlIHBvciBob2dhciwgZW4gbGEgYmFzZSBJbmRpdmlkdWFsDQoNCjEuIENoZXF1ZWFtb3MgbGEgY29uc2lzdGVuY2lhIGVudHJlIGxvcyBpbmRpdmlkdW9zIGVudHJlIHVuIHBlcsOtb2RvIHkgb3Ryby4gUGFyYSBlbGxvIHV0aWxpemFtb3MgbGEgZnVuY2nDs24gX19sZWFkX18gcGFyYSBvYnNlcnZhciBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBsb3MgaW5kaXZpZHVvcyBlbiBlbiB0KzEuICAgICAgICAgIA0KMi4gSW5jb3Jwb3JhbW9zIGEgY2FkYSByZWdpc3RybyBkZSBudWVzdHJhIGJhc2UgbGEgVW5pZGFkIGRlIEFkdWx0byBFcXVpdmFsZW50ZSAoVUFFKSBjb3JyZXNwb25kaWVudGUsIG1hdGNoZWFuZG8gbGFzIGNvbHVtbmFzIGRlIEVkYWQgKENIMDYpIHkgZ8OpbmVybyAoQ0gwNCkgbWVkaWFudGUgbGEgZnVuY2nDs24gX19sZWZ0X2pvaW5fXy4gICAgICAgICAgICANCjMuIFV0aWxpemFtb3MgbGEgZnVuY2nDs24gX19ncm91cF9ieV9fIHBhcmEgY2FsY3VsYXIgZWwgdG90YWwgZGUgVUFFIHBvciBob2dhci4gTm90ZXPDqSBxdWUgYWwgdXNhciBsYSBmdW5jacOzbiBfX211dGF0ZV9fIGNyZWFtb3MgdW5hIG51ZXZhIGNvbHVtbmEsIHBlcm1pdGllbmRvIGNvbnNlcnZhciBsYSBkaW1lbnNpw7NuIGluZGl2aWR1YWwgZGUgbGEgYmFzZS4gICAgICAgICAgICAgIA0KNC4gRW4gYmFzZSBhIGxhcyBVQUUgZGVsIGhvZ2FyIGFsIHF1ZSBwZXJ0ZW5lY2UgY2FkYSBpbmRpdmlkdW8gY2FsY3VsYW1vcyBlbCB2YWxvciBkZSBsYXMgY2FuYXN0YXMgcXVlIGRlbGltaXRhbiBsYXMgbGluZWFzIGRlIHBvYnJlemEgZSBpbmRpZ2VuY2lhIGNvcnJlc3BvbmRpZW50ZXMuICANCjUuIFJlYWxpemFtb3MgbGEgY29tcGFyYWNpw7NuIGzDs2dpY2EgZW50cmUgZWwgSW5ncmVzbyBUb3RhbCBGYW1pbGlhciB5IGxhcyBDYW5hc3RhcyBjYWxjdWxhZGFzIHBhcmEgYXNpZ25hciBhIGNhZGEgaW5kaXZpZHVvIHN1ICJzaXR1YWNpw7NuIiBtZWRpYW50ZSBsYSBmdW5jacOzbiBfX2Nhc2Vfd2hlbl9fLiAgDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KUG9icmV6YV9JbmRpdmlkdWFsIDwtIGJpbmRfcm93cyhpbmRpdmlkdWFsLjMxNiAgICAgICAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodmFyLmluZCksDQogICAgICAgICAgICAgICAgICAgICAgICBpbmRpdmlkdWFsLjQxNiAgICAgICAgICAgICAgICAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCh2YXIuaW5kKSkgICAgICAgICAgICAgICAgICAgICAgJT4lIA0KICBtdXRhdGUoUGVyaW9kbyA9IHBhc3RlKEFOTzQsIFRSSU1FU1RSRSwgc2VwPScuJykpICAgICAgICAgICAgICU+JSANCiAgZ3JvdXBfYnkoQ09EVVNVLE5ST19IT0dBUixDT01QT05FTlRFKSAgICAgICAgICAgICAgICAgICAgICAgICAlPiUgDQogIG11dGF0ZShDSDA2X0RpZmYgICA9IGFicyhsZWFkKENIMDYpIC0gQ0gwNik8MywNCiAgICAgICAgIENIMDRfRGlmZiAgID0gbGVhZChDSDA0PT1DSDA0KSwNCiAgICAgICAgIENvbnNpc3RlbmNpYT0gIGlmZWxzZSgoQ0gwNl9EaWZmICYgQ0gwNF9EaWZmKT09IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnRlIiwiY29uc2lzdGVudGUiKSkgICU+JSAgDQogIHVuZ3JvdXAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJT4lIA0KICBsZWZ0X2pvaW4oLiwgQWRlcXVpLCBieSA9IGMoIkNIMDQiLCAiQ0gwNiIpKSAgICAgICAgICAgICAgICAgICU+JSAgDQogIGdyb3VwX2J5KENPRFVTVSwgTlJPX0hPR0FSLCBQZXJpb2RvKSAgICAgICAgICAgICAgICAgICAgICAgICAgJT4lIA0KICBtdXRhdGUoQWRlcXVpX2hvZ2FyID0gc3VtKGFkZXF1aSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICU+JQ0KICB1bmdyb3VwKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICU+JSANCiAgbGVmdF9qb2luKC4sIENhbmFzdGEsIGJ5ID0gYygiUkVHSU9OIiwgIlBlcmlvZG8iKSkgICAgICAgICAgICAlPiUgDQogIG11dGF0ZShDQkEgPSBDQkEqQWRlcXVpX2hvZ2FyLA0KICAgICAgICAgQ0JUID0gQ0JUKkFkZXF1aV9ob2dhciwNCiAgICAgICAgIFNpdHVhY2lvbiA9IGNhc2Vfd2hlbihJVEY8Q0JBICAgICAgICAgICAgfiAnSW5kaWdlbnRlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVEY+PUNCQSAmIElURjxDQlQgfiAnUG9icmUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElURj49Q0JUICAgICAgICAgICB+ICdOby5Qb2JyZScpKSAgDQoNClBvYnJlemFfSW5kaXZpZHVhbA0KYGBgDQoNCiMjIEFybWFkbyBkZSBQYW5lbGVzDQoNCkRhZGEgbGEgZXN0cnVjdHVyYSBkZSByb3RhY2nDs24gZGUgbGEgbXVlc3RyYSBkZSBsYSBFUEgsIHNvbG8gbGEgbWl0YWQgZGUgbG9zIGhvZ2FyZXMgcGVybWFuZWNlIGVuIGxhIG11ZXN0cmEgZW4gZG9zIHRyaW1lc3RyZXMgY29uc2VjdXRpdm9zLiBQb3IgZW5kZSBpZGVudGlmaWNhbW9zIGEgYXF1ZWxsb3MgaG9nYXJlcyBxdWUgZW50cmFyb24gZW4gYW1iYXMgbXVlc3RyYXMuIFBhcmEgZXNvLCB1dGlsaXphbW9zIGxhcyBmdW5jacOzbiBfX2xhZ19fIF9fKGxlYWQpX18gcXVlIHNpcnZlIHBhcmEgb2J0ZW5lciBlbCB2YWxvciBhbnRlcmlvciAocG9zdGVyaW9yKSBkZSB1bmEgdmFyaWFibGUgZW4gZWwgRGF0YWZyYW1lLiBBbCBlc3RhciB0cmFiYWphbmRvIGRlIG1hbmVyYSBhZ3J1cGFkYSBwb3IgaG9nYXIsIHBvZGVtb3MgY2hlcXVlYXIgc2kgZXhpc3RlIHVuIHZhbG9yIGNvbiBkZXRlcm1pbmFkbyBDT0RVU1UgZW4gZWwgcGVyw61vZG8gc2lndWllbnRlIG8gbm8uICAgICAgIA0KDQpVbmEgdmV6IGlkZW50aWZpY2Fkb3MgbG9zIGhvZ2FyZXMgcXVlIHBlcm1hbmVjZW4gZW4gbGEgbXVlc3RyYSwgY29uIGxhIGZ1bmNpw7NuIF9fbGVhZF9fIHBvZGVtb3MgY3JlYXIgdW5hIHZhcmlhYmxlIGRlIFNpdHVhY2nDs25fdDEuDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KUGFuZWxfSW5kIDwtIFBvYnJlemFfSW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihQT05ESUg+MCkgJT4lIA0KI1NpIG5vIHNhY28gZXN0b3MgbWUgcXVlZGEgZ2VudGUgcXVlIGVuIGFsZ3VubyBkZSBsb3MgZG9zIHBlcmlvZG9zIG5vIHJlc3BvbmRpbyBpbmdyZXNvcyB5IGRpc3RvcnNpb25hIHRvZG8NCiAgZ3JvdXBfYnkoQ09EVVNVLCBOUk9fSE9HQVIsIENPTVBPTkVOVEUpICU+JSANCiAgYXJyYW5nZShQZXJpb2RvKSAlPiUgDQogIG11dGF0ZShDb2QuUGFuZWwgPSBhcy5mYWN0b3IoaWZlbHNlKCFpcy5uYShsZWFkKFBlcmlvZG8pKSwxLDApKSwNCiAgICAgICAgIFNpdHVhY2lvbl90MSA9IGxlYWQoU2l0dWFjaW9uKSkgJT4lIA0KICAgICAgICAgZmlsdGVyKENvZC5QYW5lbCA9PSAxLENvbnNpc3RlbmNpYT09ImNvbnNpc3RlbnRlIikNCg0KUGFuZWxfSW5kDQpgYGANCg0KIyNDw6FsY3VsbyBkZSBUYXNhcyBkZSBQb2JyZXphIGUgSW5kaWdlbmNpYSAtIEJhc2UgY29tcGxldGEgeSBQYW5lbA0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpQb2JyZXphX3Jlc3VtZW4gPC0gUG9icmV6YV9JbmRpdmlkdWFsICU+JSANCiAgZ3JvdXBfYnkoUGVyaW9kbykgJT4lIA0KICBzdW1tYXJpc2UoVGFzYV9wb2JyZXphICAgID0gc3VtKFBPTkRJSFtTaXR1YWNpb24gJWluJSBjKCdQb2JyZScsICdJbmRpZ2VudGUnKV0sbmEucm0gPSBUUlVFKS8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShQT05ESUgsbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgVGFzYV9pbmRpZ2VuY2lhID0gc3VtKFBPTkRJSFtTaXR1YWNpb24gPT0gJ0luZGlnZW50ZSddLG5hLnJtID0gVFJVRSkvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oUE9ORElILG5hLnJtID0gVFJVRSkpIA0KUG9icmV6YV9yZXN1bWVuDQoNClBvYnJlemEucGFuZWwgPC0gUGFuZWxfSW5kICU+JSANCiAgZ3JvdXBfYnkoUGVyaW9kbykgJT4lIA0KICBzdW1tYXJpc2UoVGFzYV9wb2JyZXphICAgID0gc3VtKFBPTkRJSFtTaXR1YWNpb24gJWluJSBjKCdQb2JyZScsICdJbmRpZ2VudGUnKV0sbmEucm0gPSBUUlVFKS8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShQT05ESUgsbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgVGFzYV9pbmRpZ2VuY2lhID0gc3VtKFBPTkRJSFtTaXR1YWNpb24gPT0gJ0luZGlnZW50ZSddLG5hLnJtID0gVFJVRSkvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oUE9ORElILG5hLnJtID0gVFJVRSkpIA0KUG9icmV6YS5wYW5lbA0KYGBgDQoNCiMjR3JhZmljbyBkZSBUcmFuc2ljacOzbg0KUGFyYSByZWFsaXphciBlbCBncsOhZmljbyBkZSB0cmFuc2ljacOzbiwgdXRpbGl6YXJlbW9zIGVsIHBhcXVldGUgX19hbGx1dmlhbF9fLCBjb24gbGEgZnVuY2nDs24gaG9tw7NuaW1hLiAgICAgDQpQYXJhIGVsbG8gZGViZW1vcyBjb25zdHJ1aXIgdW4gRGF0YWZyYW1lIHF1ZSBjb250ZW5nYSBsYSBjYW50aWRhZCBkZSBjYXNvcyBvYnNlcnZhZG8gcGFyYSBjYWRhIHBvc2libGUgdHJhbnNpY2nDs24uIFV0aWxpemFtb3MgZWwgUG9uZGVyYWRvciBkZSBJbmdyZXNvcyAoUE9ORElIKS4gICAgICAgIA0KQWRpY2lvbmFsbWVudGUsIHJlZXNjcmliaW1vcyBjb21vIGZhY3RvcmVzIGEgbGFzIHZhcmlhYmxlcyBkZSBTaXR1YWNpw7NuLCBwYXJhIG9yZGVuYXIgc3UgYXBhcmljacOzbiBlbiBlbCBncsOhZmljby4NCmBgYHtyfQ0KZGF0b3MuYWxsdXZpYWwgPC0gUGFuZWxfSW5kICU+JSANCiAgZ3JvdXBfYnkoU2l0dWFjaW9uLFNpdHVhY2lvbl90MSwgUkVHSU9OKSAlPiUgDQogIHN1bW1hcmlzZShmcmVjdWVuY2lhID0gc3VtKFBPTkRJSCksDQogICAgICAgICAgICBuX211ZXN0cmFsID0gbigpKSAlPiUgDQogIGxlZnRfam9pbiguLGRpYy5yZWdpb25lcywgYnk9ICJSRUdJT04iKSAlPiUgDQogIGFycmFuZ2UoUkVHSU9OKQ0KDQpkYXRvcy5hbGx1dmlhbCRTaXR1YWNpb24gPC0gZmFjdG9yKGRhdG9zLmFsbHV2aWFsJFNpdHVhY2lvbiwgbGV2ZWxzID0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTm8uUG9icmUiLCJQb2JyZSIsIkluZGlnZW50ZSIpKQ0KZGF0b3MuYWxsdXZpYWwkU2l0dWFjaW9uX3QxIDwtIGZhY3RvcihkYXRvcy5hbGx1dmlhbCRTaXR1YWNpb25fdDEsIGxldmVscyA9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIk5vLlBvYnJlIiwiUG9icmUiLCJJbmRpZ2VudGUiKSkNCg0KZGF0b3MuYWxsdXZpYWwNCmBgYA0KIyNMb29wIGRlIEdyw6FmaWNvcyANCg0KMS4gQ29uIGxhIGZ1bmNpw7NuIF9fcGRmX18oZ2VuZXJhbW9zIHVuIGFyY2hpdm8gIi5wZGYiIGVuIGxhIGRpcmVjY2nDs24geSBub21icmUgZXNwZWNpZmljYWRvcykgICANCjIuIFJlYWxpemFtb3MgdW4gX2xvb3BfIHBvciBhZ2xvbWVyYWRvIHBhcmEgaXIgYXJtYW5kbyBsb3MgZ3LDoWZpY29zLg0KICAgIC0gRmlsdHJhbW9zIGl0ZXJhdGl2YW1lbnRlIG51ZXN0cmEgdGFibGEgYSBncmFmaWNhciBzZWfDum4gZWwgYWdsb21lcmFkbyBlbiBjdXJzbyB5IGNyZWFtb3MgdW4gdmVjdG9yIGNvbiBlbCBub21icmUgZGVsIG1pc21vLiAgICAgICAgDQogICAgLSBFc3BlY2lmaWNhbW9zIHVuIHZlY3RvciBkZSBjb2xvcmVzIGVuIGZ1bmNpw7NuIGRlIGxhcyBwb3NpYmxlcyB0cmFuc2ljaW9uZXMuICAgICAgDQogICAgLSBSZWFsaXphbW9zIGVsIGdyw6FmaWNvIGNvbiBsYXMgZXNwZWNpZmljYWNpb25lcyBkZSBkYXRhLCBjb2xvciB5IHRhbWHDsW8uIA0KMy4gQ29uIGBgYGRldi5vZmYoKWBgYCBfY2VycmFtb3MgZWwgYXJjaGl2byAucGRmXw0KYGBge3Isd2FybmluZz1GQUxTRSxlcnJvcj1GQUxTRX0NCiMgcGRmKHBhc3RlKHJlc3VsdGFkb3MuZGlyLCAiVHJhbnNpY2lvbmVzIGRlIFNpdHVhY2nDs24gLSBSZWdpb25lcyAtIHQzMTYtdDQxNi5wZGYiLCBzZXAgPSAiIiksIG9uZWZpbGUgPSBUKQ0KZm9yKFJlZyBpbiB1bmlxdWUoZGF0b3MuYWxsdXZpYWwkUkVHSU9OKSl7DQogIA0KICBkYXRhLlJlZyA8LSBkYXRvcy5hbGx1dmlhbCAlPiUgZmlsdGVyKFJFR0lPTiA9PSBSZWcpDQogIHRtcC5ub20gPC0gZGljLnJlZ2lvbmVzJFJlZ2lvbltkaWMucmVnaW9uZXMkUkVHSU9OPT1SZWddDQogIGNvbG9yZXMgPC0gaWZlbHNlKGRhdGEuUmVnJFNpdHVhY2lvbj09ZGF0YS5SZWckU2l0dWFjaW9uX3QxLCJncmF5OTAiLA0KICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YS5SZWckU2l0dWFjaW9uX3QxPT0iSW5kaWdlbnRlIiwiZmlyZWJyaWNrMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YS5SZWckU2l0dWFjaW9uX3QxID09ICdQb2JyZScsJ2dvbGRlbnJvZDEnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkYXRhLlJlZyRTaXR1YWNpb25fdDEgPT0gJ05vLlBvYnJlJywnY2hhcnRyZXVzZTInLCdyZWQnKSkpKQ0KICANCiAgdHJhbnNpY2lvbmVzIDwtIGFsbHV2aWFsKGRhdGEuUmVnWyxjKDE6MildLCBmcmVxPWRhdGEuUmVnJGZyZWN1ZW5jaWEsIGJvcmRlcj1OQSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBjb2xvcmVzLCBjZXg9MC43NSwgeHc9LjE1KQ0KICBtdGV4dChwYXN0ZTAoJ1JlZ2lvbjogJyx0bXAubm9tKSwgMywgbGluZT0zLCBmb250PTIpDQogIHBhc3RlKFN5cy50aW1lKCksdG1wLm5vbSkNCn0NCiMgZGV2Lm9mZigpDQpgYGA=