#file.choose()
bajas<-read.csv("/Users/elenavela/Downloads/bajas.csv")

1) ¿Cuántas variables y cuantos registros tiene la base de datos INICIALMENTE?

str(bajas)
## 'data.frame':    233 obs. of  11 variables:
##  $ NOMBRE.COMPLETO    : chr  "MARIO VALDEZ ORTIZ" "ISABEL BARRIOS MENDEZ" "MARIA ELIZABETH GOMEZ HERNANDEZ" "ALONDRA ABIGAIL ESCARCIA GOMEZ" ...
##  $ EDAD               : int  32 36 23 21 29 46 29 31 50 19 ...
##  $ GENERO             : chr  "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
##  $ FECHA.DE.ALTA      : chr  "9/3/2020" "9/11/2021" "10/11/2021" "10/11/2021" ...
##  $ MOTIVO.DE.BAJA     : chr  "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
##  $ DÍAS.DE.DURACIÓN   : int  628 60 59 59 51 37 37 31 18 224 ...
##  $ BAJA               : chr  "27/11/21" "08/01/22" "08/01/22" "08/01/22" ...
##  $ PUESTO             : chr  "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
##  $ SALARIO.DIARIO.IMSS: num  500 152 152 152 152 ...
##  $ ESTADO             : chr  "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ ESTADO.CIVIL       : chr  "Soltero" "Unión libre" "Matrimonio" "Soltero" ...

234 regsitros y 13 variables

4) Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Técnica 4, CONVERTIR TIPO DE DATOS

summary(bajas)
##  NOMBRE.COMPLETO         EDAD          GENERO          FECHA.DE.ALTA     
##  Length:233         Min.   :18.00   Length:233         Length:233        
##  Class :character   1st Qu.:23.00   Class :character   Class :character  
##  Mode  :character   Median :29.00   Mode  :character   Mode  :character  
##                     Mean   :30.77                                        
##                     3rd Qu.:37.00                                        
##                     Max.   :61.00                                        
##                                                                          
##  MOTIVO.DE.BAJA     DÍAS.DE.DURACIÓN      BAJA              PUESTO         
##  Length:233         Min.   :   0.00   Length:233         Length:233        
##  Class :character   1st Qu.:   9.00   Class :character   Class :character  
##  Mode  :character   Median :  20.50   Mode  :character   Mode  :character  
##                     Mean   :  78.84                                        
##                     3rd Qu.:  48.25                                        
##                     Max.   :1966.00                                        
##                     NA's   :13                                             
##  SALARIO.DIARIO.IMSS    ESTADO          ESTADO.CIVIL      
##  Min.   :144.4       Length:233         Length:233        
##  1st Qu.:180.7       Class :character   Class :character  
##  Median :180.7       Mode  :character   Mode  :character  
##  Mean   :177.9                                            
##  3rd Qu.:180.7                                            
##  Max.   :500.0                                            
## 

Convertir de carácter a fecha

bajas2<-bajas
bajas2$FECHA.DE.ALTA<-as.Date(bajas2$FECHA.DE.ALTA,format="%d/%m/%Y")  
str(bajas2)
## 'data.frame':    233 obs. of  11 variables:
##  $ NOMBRE.COMPLETO    : chr  "MARIO VALDEZ ORTIZ" "ISABEL BARRIOS MENDEZ" "MARIA ELIZABETH GOMEZ HERNANDEZ" "ALONDRA ABIGAIL ESCARCIA GOMEZ" ...
##  $ EDAD               : int  32 36 23 21 29 46 29 31 50 19 ...
##  $ GENERO             : chr  "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
##  $ FECHA.DE.ALTA      : Date, format: "2020-03-09" "2021-11-09" ...
##  $ MOTIVO.DE.BAJA     : chr  "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
##  $ DÍAS.DE.DURACIÓN   : int  628 60 59 59 51 37 37 31 18 224 ...
##  $ BAJA               : chr  "27/11/21" "08/01/22" "08/01/22" "08/01/22" ...
##  $ PUESTO             : chr  "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
##  $ SALARIO.DIARIO.IMSS: num  500 152 152 152 152 ...
##  $ ESTADO             : chr  "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ ESTADO.CIVIL       : chr  "Soltero" "Unión libre" "Matrimonio" "Soltero" ...

Convertir de carácter a entero

bajas3<-bajas2
bajas3$EDAD<-as.integer(bajas3$EDAD)
str(bajas3)
## 'data.frame':    233 obs. of  11 variables:
##  $ NOMBRE.COMPLETO    : chr  "MARIO VALDEZ ORTIZ" "ISABEL BARRIOS MENDEZ" "MARIA ELIZABETH GOMEZ HERNANDEZ" "ALONDRA ABIGAIL ESCARCIA GOMEZ" ...
##  $ EDAD               : int  32 36 23 21 29 46 29 31 50 19 ...
##  $ GENERO             : chr  "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
##  $ FECHA.DE.ALTA      : Date, format: "2020-03-09" "2021-11-09" ...
##  $ MOTIVO.DE.BAJA     : chr  "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
##  $ DÍAS.DE.DURACIÓN   : int  628 60 59 59 51 37 37 31 18 224 ...
##  $ BAJA               : chr  "27/11/21" "08/01/22" "08/01/22" "08/01/22" ...
##  $ PUESTO             : chr  "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
##  $ SALARIO.DIARIO.IMSS: num  500 152 152 152 152 ...
##  $ ESTADO             : chr  "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ ESTADO.CIVIL       : chr  "Soltero" "Unión libre" "Matrimonio" "Soltero" ...

Técnica 1, REMOVER DATOS IRRELEVANTES

Eliminar columnas

bajas4<-bajas3
bajas4<-subset(bajas4,select=-c(BAJA))
summary(bajas4)
##  NOMBRE.COMPLETO         EDAD          GENERO          FECHA.DE.ALTA       
##  Length:233         Min.   :18.00   Length:233         Min.   :0016-10-12  
##  Class :character   1st Qu.:23.00   Class :character   1st Qu.:0022-02-18  
##  Mode  :character   Median :29.00   Mode  :character   Median :0022-05-18  
##                     Mean   :30.77                      Mean   :0339-09-15  
##                     3rd Qu.:37.00                      3rd Qu.:0022-07-19  
##                     Max.   :61.00                      Max.   :2022-07-11  
##                                                                            
##  MOTIVO.DE.BAJA     DÍAS.DE.DURACIÓN     PUESTO          SALARIO.DIARIO.IMSS
##  Length:233         Min.   :   0.00   Length:233         Min.   :144.4      
##  Class :character   1st Qu.:   9.00   Class :character   1st Qu.:180.7      
##  Mode  :character   Median :  20.50   Mode  :character   Median :180.7      
##                     Mean   :  78.84                      Mean   :177.9      
##                     3rd Qu.:  48.25                      3rd Qu.:180.7      
##                     Max.   :1966.00                      Max.   :500.0      
##                     NA's   :13                                              
##     ESTADO          ESTADO.CIVIL      
##  Length:233         Length:233        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 

Técnica 5, VALORES FALTANTES

¿Cuántos NA tengo por variable?

sapply(bajas4,function(x) sum(is.na(x)))
##     NOMBRE.COMPLETO                EDAD              GENERO       FECHA.DE.ALTA 
##                   0                   0                   0                   0 
##      MOTIVO.DE.BAJA    DÍAS.DE.DURACIÓN              PUESTO SALARIO.DIARIO.IMSS 
##                   0                  13                   0                   0 
##              ESTADO        ESTADO.CIVIL 
##                   0                   0

Reemplazar NAs por mediana

bajas5<-bajas4
bajas5$DÍAS.DE.DURACIÓN[is.na(bajas5$DÍAS.DE.DURACIÓN)]<- median(bajas5$DÍAS.DE.DURACIÓN, na.rm=TRUE)

¿Cuántos NA tengo por variable?

sapply(bajas5,function(x) sum(is.na(x)))
##     NOMBRE.COMPLETO                EDAD              GENERO       FECHA.DE.ALTA 
##                   0                   0                   0                   0 
##      MOTIVO.DE.BAJA    DÍAS.DE.DURACIÓN              PUESTO SALARIO.DIARIO.IMSS 
##                   0                   0                   0                   0 
##              ESTADO        ESTADO.CIVIL 
##                   0                   0

Reemplazar NA por mediana

bajas6<-bajas5
bajas6$SALARIO.DIARIO.IMSS[is.na(bajas6$SALARIO.DIARIO.IMSS)]<- median(bajas6$SALARIO.DIARIO.IMSS, na.rm=TRUE)

¿Cuántos NA tengo por variable?

sapply(bajas6,function(x) sum(is.na(x)))
##     NOMBRE.COMPLETO                EDAD              GENERO       FECHA.DE.ALTA 
##                   0                   0                   0                   0 
##      MOTIVO.DE.BAJA    DÍAS.DE.DURACIÓN              PUESTO SALARIO.DIARIO.IMSS 
##                   0                   0                   0                   0 
##              ESTADO        ESTADO.CIVIL 
##                   0                   0

Exportar nueva base de datos (limpia)

bajas_limpia<-bajas6
write.csv(bajas_limpia, file ="bajas_limpia.csv", row.names = FALSE)

1.2) ¿Cuántas variables y cuantos registros tiene la base de datos DESPUÉS de la limpieza?

str(bajas6)
## 'data.frame':    233 obs. of  10 variables:
##  $ NOMBRE.COMPLETO    : chr  "MARIO VALDEZ ORTIZ" "ISABEL BARRIOS MENDEZ" "MARIA ELIZABETH GOMEZ HERNANDEZ" "ALONDRA ABIGAIL ESCARCIA GOMEZ" ...
##  $ EDAD               : int  32 36 23 21 29 46 29 31 50 19 ...
##  $ GENERO             : chr  "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
##  $ FECHA.DE.ALTA      : Date, format: "2020-03-09" "2021-11-09" ...
##  $ MOTIVO.DE.BAJA     : chr  "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
##  $ DÍAS.DE.DURACIÓN   : num  628 60 59 59 51 37 37 31 18 224 ...
##  $ PUESTO             : chr  "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
##  $ SALARIO.DIARIO.IMSS: num  500 152 152 152 152 ...
##  $ ESTADO             : chr  "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ ESTADO.CIVIL       : chr  "Soltero" "Unión libre" "Matrimonio" "Soltero" ...

234 registros y 10 variables

2) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua.

Variable Type
Nombre completo Cualitativa
Edad Cuantitativa (discreta)
Género Cualitativa
Fecha de alta Cuantitativa (continua)
Motivo de baja Cualitativa
Días de duración Cuantitativa (discreta)
Puesto Cualitativa
Salario diario IMSS Cuantitativa (discreta)
Estado Cualitativa
Estado civil Cualitativa

3) Elige la escala de medición de cada variable.

Variable Medicion
Nombre completo No aplica
Edad Años
Género No aplica
Fecha de alta Días
Motivo de baja No aplica
Días de duración Días
Puesto No aplica
Salario diario IMSS Pesos mexicanos
Estado No aplica
Estado civil No aplica

5) Análisis estadístico descriptivo.

#install.packages("epiDisplay")
library(epiDisplay)
## Loading required package: foreign
## Loading required package: survival
## Loading required package: MASS
## Loading required package: nnet

Tabla de frecuencia y gráfica de datos CUALITATIVOS: Puesto

En esta observamos que lo que más se tiene en Form es el puesto de ayudante general, por mucho.

puesto<-table(bajas6$PUESTO)
knitr::kable(puesto)
Var1 Freq
ANALISTA DE NOMINAS /AUX DE R.H. 1
AUXILIAR DE EMBARQUES 3
AY. GENERAL 4
AY.GENERAL (MATERIALES) 1
AYUD.EMBARQUES 1
AYUDANTE DE EMBARQUES 3
AYUDANTE DE MTTO 1
AYUDANTE DE SOLDADOR 1
AYUDANTE GENERAL 171
AYUDANTE GENERAL DE EMBARQUES 1
CHOFER 1
CORTADOR 1
COSTURERA 10
COSTURERO 1
DISEÑO 1
ENCARGADA DE CALIDAD 1
FACTURACION 1
GUARDIA DE SEGURIDAD 2
INSPECTOR CALIDAD 1
INSPECTOR DE CALIDAD 2
INSPECTORA DE CALIDAD 1
LIMPIEZA 1
MARCADORA 1
MATERIALISTA 2
MONTACARGUISTA 5
PRACTICANTE DE MTTO 1
RESIDENTE 2
Residente Yanfeng 1
SERVICIO AL CLIENTE 1
SOLDADOR 10

Tabla de frecuencia y gráfica de datos CUALITATIVOS: Motivo de bajas

En el siguiente análisis estadístico notamos cuales son las principales razones, y las que menos, por las que los empleados de Form salen. Principalmente vemos que es por la BAJA POR FALTAS, siguiendo por RENUNCIA VOLUNTARIA. Las que menos vemos son por jubilación y “abandono”.

motivo<-table(bajas6$MOTIVO.DE.BAJA)
knitr::kable(motivo)
Var1 Freq
ABANDONO 1
BAJA POR FALTAS 139
JUBILACION 1
RENUNCIA VOLUNTARIA 84
TERMINO DE CONTRATO 8
pie(prop.table(table(bajas6$MOTIVO.DE.BAJA)),col=c("orange","blue","green","red"),main="Motivo de bajas",las=1)

Comprendemos que la mayor cantidad de las personas que salen son solteras, y las personas que están en matrimonio o en unión libre tienen casi la misma tendencia a salir.

civil<-table(bajas6$ESTADO.CIVIL)
knitr::kable(civil)
Var1 Freq
1
Divorcio 3
Matrimonio 63
Soltero 107
Unión libre 59
tab1(bajas6$ESTADO.CIVIL,sort.group = FALSE,graph=TRUE)

## bajas6$ESTADO.CIVIL : 
##             Frequency Percent Cum. percent
##                     1     0.4          0.4
## Divorcio            3     1.3          1.7
## Matrimonio         63    27.0         28.8
## Soltero           107    45.9         74.7
## Unión libre        59    25.3        100.0
##   Total           233   100.0        100.0

La gran parte de los que salen son de Nuevo León.

estado<-table(bajas6$ESTADO)
knitr::kable(estado)
Var1 Freq
Coahuila 8
Nuevo León 225
tab1(bajas6$ESTADO,sort.group = FALSE,graph=TRUE)

## bajas6$ESTADO : 
##            Frequency Percent Cum. percent
## Coahuila           8     3.4          3.4
## Nuevo León       225    96.6        100.0
##   Total          233   100.0        100.0

De las personas que salen de la empresa, la edad lleva un sesgo positivo, la mayoría de los que salen se concentran en las edades más jóvenes, aproximadamente entre los 20 y los 30.

hist((bajas6$EDAD),col=c("orange"),main="Edad",xlab="Años",ylab="Frecuencia")

En cuanto a los días que duran las personas que bajan, observemaos que muchos no duran ni siguiera el año, al estar la gran mayoría en menos de los 250 días dentro de Form. La antigüedad es poca.

hist((bajas6$DÍAS.DE.DURACIÓN),col=c("yellow"),main="Días de duración",xlab="Días",ylab="Frecuencia")

El salario no ve muchas diferencias, al estar la gran parte entre los 150 y los 200 pesos diarios.

hist((bajas6$SALARIO.DIARIO.IMSS),col=c("blue"),main="Salario diario",xlab="Pesos",ylab="Frecuencia")

Observamos que existe una mayor tendencia en que las personas que salgan sean mujeres.

pie(prop.table(table(bajas6$GENERO)),col=c("pink","blue"),main="Género",las=1)

En cuanto a la relación y la dispersión entre los días de duración y la edad, vemos que la edad no influye mucho en los días que duran, puesto que vemos casi la misma frecuencia de duración entre las diferentes edades. Existeen algunos casos que se salen de los “común” al haber durado mucho.

plot(bajas6$EDAD,bajas6$DÍAS.DE.DURACIÓN, main = "Días de duración y edad",
     pch = 19, frame = FALSE,col=c("orange"))

LS0tCnRpdGxlOiAiYmFqYXMiCmF1dGhvcjogIkVsZW5hVmVsYV9BMDEyODM1MzUiCmRhdGU6ICIyMDIyLTA5LTI4IgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCmBgYHtyfQojZmlsZS5jaG9vc2UoKQpiYWphczwtcmVhZC5jc3YoIi9Vc2Vycy9lbGVuYXZlbGEvRG93bmxvYWRzL2JhamFzLmNzdiIpCmBgYAoKCiMjIyAxKSDCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1YW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3MgSU5JQ0lBTE1FTlRFPyAKCmBgYHtyfQpzdHIoYmFqYXMpCmBgYAoyMzQgcmVnc2l0cm9zIHkgIDEzIHZhcmlhYmxlcwoKCiMjIyA0KSBBcGxpY2EgYWwgbWVub3MgMiB0w6ljbmljYXMgZGUgbGltcGllemEgZGUgYmFzZXMgZGUgZGF0b3MgeSBleHBsw61jYWxhcyBicmV2ZW1lbnRlLCDCv3BvciBxdcOpIHJlYWxpemFzdGUgZXNhcyB0w6ljbmljYXM/CgoqKlTDqWNuaWNhIDQsICpDT05WRVJUSVIgVElQTyBERSBEQVRPUyoqKiAgIAoKYGBge3J9CnN1bW1hcnkoYmFqYXMpCmBgYAoKQ29udmVydGlyIGRlIGNhcsOhY3RlciBhIGZlY2hhCmBgYHtyfQpiYWphczI8LWJhamFzCmJhamFzMiRGRUNIQS5ERS5BTFRBPC1hcy5EYXRlKGJhamFzMiRGRUNIQS5ERS5BTFRBLGZvcm1hdD0iJWQvJW0vJVkiKSAgCnN0cihiYWphczIpCmBgYAoKQ29udmVydGlyIGRlIGNhcsOhY3RlciBhIGVudGVybwpgYGB7cn0KYmFqYXMzPC1iYWphczIKYmFqYXMzJEVEQUQ8LWFzLmludGVnZXIoYmFqYXMzJEVEQUQpCnN0cihiYWphczMpCmBgYAoKKipUw6ljbmljYSAxLCAqUkVNT1ZFUiBEQVRPUyBJUlJFTEVWQU5URVMqKiogIAoKRWxpbWluYXIgY29sdW1uYXMKYGBge3J9CmJhamFzNDwtYmFqYXMzCmJhamFzNDwtc3Vic2V0KGJhamFzNCxzZWxlY3Q9LWMoQkFKQSkpCnN1bW1hcnkoYmFqYXM0KQpgYGAKCgoqKlTDqWNuaWNhIDUsICpWQUxPUkVTIEZBTFRBTlRFUyoqKgoKwr9DdcOhbnRvcyBOQSB0ZW5nbyBwb3IgdmFyaWFibGU/CmBgYHtyfQpzYXBwbHkoYmFqYXM0LGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCmBgYAoKUmVlbXBsYXphciBOQXMgcG9yIG1lZGlhbmEKYGBge3J9CmJhamFzNTwtYmFqYXM0CmJhamFzNSREw41BUy5ERS5EVVJBQ0nDk05baXMubmEoYmFqYXM1JETDjUFTLkRFLkRVUkFDScOTTildPC0gbWVkaWFuKGJhamFzNSREw41BUy5ERS5EVVJBQ0nDk04sIG5hLnJtPVRSVUUpCmBgYAoKwr9DdcOhbnRvcyBOQSB0ZW5nbyBwb3IgdmFyaWFibGU/CmBgYHtyfQpzYXBwbHkoYmFqYXM1LGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCmBgYAoKUmVlbXBsYXphciBOQSBwb3IgbWVkaWFuYQpgYGB7cn0KYmFqYXM2PC1iYWphczUKYmFqYXM2JFNBTEFSSU8uRElBUklPLklNU1NbaXMubmEoYmFqYXM2JFNBTEFSSU8uRElBUklPLklNU1MpXTwtIG1lZGlhbihiYWphczYkU0FMQVJJTy5ESUFSSU8uSU1TUywgbmEucm09VFJVRSkKYGBgCgrCv0N1w6FudG9zIE5BIHRlbmdvIHBvciB2YXJpYWJsZT8KYGBge3J9CnNhcHBseShiYWphczYsZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKYGBgCgoqKkV4cG9ydGFyIG51ZXZhIGJhc2UgZGUgZGF0b3MgKGxpbXBpYSkqKgoKYGBge3J9CmJhamFzX2xpbXBpYTwtYmFqYXM2CndyaXRlLmNzdihiYWphc19saW1waWEsIGZpbGUgPSJiYWphc19saW1waWEuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKIyMjIDEuMikgwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdWFudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zIERFU1BVw4lTIGRlIGxhIGxpbXBpZXphPyAKCmBgYHtyfQpzdHIoYmFqYXM2KQpgYGAKCjIzNCByZWdpc3Ryb3MgeSAgMTAgdmFyaWFibGVzCgojIyMgMikgQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YS4gCgpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSBUUlVFfQpWYXJpYWJsZTwtYygiYE5vbWJyZSBjb21wbGV0b2AiLCJgRWRhZGAiLCJgR8OpbmVyb2AiLCJgRmVjaGEgZGUgYWx0YWAiLCJgTW90aXZvIGRlIGJhamFgIiwiYETDrWFzIGRlIGR1cmFjacOzbmAiLCJgUHVlc3RvYCIsImBTYWxhcmlvIGRpYXJpbyBJTVNTYCIsImBFc3RhZG9gIiwiYEVzdGFkbyBjaXZpbGAiKQpUeXBlPC1jKCJDdWFsaXRhdGl2YSIsICJDdWFudGl0YXRpdmEgKGRpc2NyZXRhKSIsICJDdWFsaXRhdGl2YSIsICJDdWFudGl0YXRpdmEgKGNvbnRpbnVhKSIsIkN1YWxpdGF0aXZhIiwiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCJDdWFsaXRhdGl2YSIsIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIiwiQ3VhbGl0YXRpdmEiLCJDdWFsaXRhdGl2YSIpCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFR5cGUpCmtuaXRyOjprYWJsZSh0YWJsZSkKYGBgCgojIyMgMykgRWxpZ2UgbGEgZXNjYWxhIGRlIG1lZGljacOzbiBkZSBjYWRhIHZhcmlhYmxlLgoKYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gVFJVRX0KVmFyaWFibGU8LWMoImBOb21icmUgY29tcGxldG9gIiwiYEVkYWRgIiwiYEfDqW5lcm9gIiwiYEZlY2hhIGRlIGFsdGFgIiwiYE1vdGl2byBkZSBiYWphYCIsImBEw61hcyBkZSBkdXJhY2nDs25gIiwiYFB1ZXN0b2AiLCJgU2FsYXJpbyBkaWFyaW8gSU1TU2AiLCJgRXN0YWRvYCIsImBFc3RhZG8gY2l2aWxgIikKTWVkaWNpb248LWMoIk5vIGFwbGljYSIsIkHDsW9zIiwiTm8gYXBsaWNhIiwiRMOtYXMiLCJObyBhcGxpY2EiLCJEw61hcyIsIk5vIGFwbGljYSIsIlBlc29zIG1leGljYW5vcyIsIk5vIGFwbGljYSIsIk5vIGFwbGljYSIpCnRhYmxlMjwtZGF0YS5mcmFtZShWYXJpYWJsZSxNZWRpY2lvbikKa25pdHI6OmthYmxlKHRhYmxlMikKYGBgCiMjIyA1KSBBbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlc2NyaXB0aXZvLgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoImVwaURpc3BsYXkiKQpsaWJyYXJ5KGVwaURpc3BsYXkpCmBgYAoKKipUYWJsYSBkZSBmcmVjdWVuY2lhIHkgZ3LDoWZpY2EgZGUgZGF0b3MgQ1VBTElUQVRJVk9TOiAqUHVlc3RvKioqICAKCkVuIGVzdGEgb2JzZXJ2YW1vcyBxdWUgbG8gcXVlIG3DoXMgc2UgdGllbmUgZW4gRm9ybSBlcyBlbCBwdWVzdG8gZGUgYXl1ZGFudGUgZ2VuZXJhbCwgcG9yIG11Y2hvLiAKYGBge3J9CnB1ZXN0bzwtdGFibGUoYmFqYXM2JFBVRVNUTykKa25pdHI6OmthYmxlKHB1ZXN0bykKYGBgCgoKKipUYWJsYSBkZSBmcmVjdWVuY2lhIHkgZ3LDoWZpY2EgZGUgZGF0b3MgQ1VBTElUQVRJVk9TOiAqTW90aXZvIGRlIGJhamFzKioqICAKCkVuIGVsIHNpZ3VpZW50ZSBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIG5vdGFtb3MgY3VhbGVzIHNvbiBsYXMgcHJpbmNpcGFsZXMgcmF6b25lcywgeSBsYXMgcXVlIG1lbm9zLCBwb3IgbGFzIHF1ZSBsb3MgZW1wbGVhZG9zIGRlIEZvcm0gc2FsZW4uIFByaW5jaXBhbG1lbnRlIHZlbW9zIHF1ZSBlcyBwb3IgbGEgQkFKQSBQT1IgRkFMVEFTLCBzaWd1aWVuZG8gcG9yIFJFTlVOQ0lBIFZPTFVOVEFSSUEuIExhcyBxdWUgbWVub3MgdmVtb3Mgc29uIHBvciBqdWJpbGFjacOzbiB5ICJhYmFuZG9ubyIuCmBgYHtyfQptb3Rpdm88LXRhYmxlKGJhamFzNiRNT1RJVk8uREUuQkFKQSkKa25pdHI6OmthYmxlKG1vdGl2bykKCnBpZShwcm9wLnRhYmxlKHRhYmxlKGJhamFzNiRNT1RJVk8uREUuQkFKQSkpLGNvbD1jKCJvcmFuZ2UiLCJibHVlIiwiZ3JlZW4iLCJyZWQiKSxtYWluPSJNb3Rpdm8gZGUgYmFqYXMiLGxhcz0xKQpgYGAKCkNvbXByZW5kZW1vcyBxdWUgbGEgbWF5b3IgY2FudGlkYWQgZGUgbGFzIHBlcnNvbmFzIHF1ZSBzYWxlbiBzb24gc29sdGVyYXMsIHkgbGFzIHBlcnNvbmFzIHF1ZSBlc3TDoW4gZW4gbWF0cmltb25pbyBvIGVuIHVuacOzbiBsaWJyZSB0aWVuZW4gY2FzaSBsYSBtaXNtYSB0ZW5kZW5jaWEgYSBzYWxpci4gCmBgYHtyfQpjaXZpbDwtdGFibGUoYmFqYXM2JEVTVEFETy5DSVZJTCkKa25pdHI6OmthYmxlKGNpdmlsKQoKdGFiMShiYWphczYkRVNUQURPLkNJVklMLHNvcnQuZ3JvdXAgPSBGQUxTRSxncmFwaD1UUlVFKQpgYGAKTGEgZ3JhbiBwYXJ0ZSBkZSBsb3MgcXVlIHNhbGVuIHNvbiBkZSBOdWV2byBMZcOzbi4gCmBgYHtyfQplc3RhZG88LXRhYmxlKGJhamFzNiRFU1RBRE8pCmtuaXRyOjprYWJsZShlc3RhZG8pCgp0YWIxKGJhamFzNiRFU1RBRE8sc29ydC5ncm91cCA9IEZBTFNFLGdyYXBoPVRSVUUpCmBgYAoKCkRlIGxhcyBwZXJzb25hcyBxdWUgc2FsZW4gZGUgbGEgZW1wcmVzYSwgbGEgZWRhZCBsbGV2YSB1biAqc2VzZ28gcG9zaXRpdm8qLCBsYSBtYXlvcsOtYSBkZSBsb3MgcXVlIHNhbGVuIHNlIGNvbmNlbnRyYW4gZW4gbGFzIGVkYWRlcyBtw6FzIGrDs3ZlbmVzLCBhcHJveGltYWRhbWVudGUgZW50cmUgbG9zIDIwIHkgbG9zIDMwLiAKYGBge3J9Cmhpc3QoKGJhamFzNiRFREFEKSxjb2w9Yygib3JhbmdlIiksbWFpbj0iRWRhZCIseGxhYj0iQcOxb3MiLHlsYWI9IkZyZWN1ZW5jaWEiKQpgYGAKCgoKRW4gY3VhbnRvIGEgbG9zIGTDrWFzIHF1ZSBkdXJhbiBsYXMgcGVyc29uYXMgcXVlIGJhamFuLCBvYnNlcnZlbWFvcyBxdWUgbXVjaG9zIG5vIGR1cmFuIG5pIHNpZ3VpZXJhIGVsIGHDsW8sIGFsIGVzdGFyIGxhIGdyYW4gbWF5b3LDrWEgZW4gbWVub3MgZGUgbG9zIDI1MCBkw61hcyBkZW50cm8gZGUgRm9ybS4gTGEgYW50aWfDvGVkYWQgZXMgcG9jYS4gCmBgYHtyfQpoaXN0KChiYWphczYkRMONQVMuREUuRFVSQUNJw5NOKSxjb2w9YygieWVsbG93IiksbWFpbj0iRMOtYXMgZGUgZHVyYWNpw7NuIix4bGFiPSJEw61hcyIseWxhYj0iRnJlY3VlbmNpYSIpCmBgYAoKCkVsIHNhbGFyaW8gbm8gdmUgbXVjaGFzIGRpZmVyZW5jaWFzLCBhbCBlc3RhciBsYSBncmFuIHBhcnRlIGVudHJlIGxvcyAxNTAgeSBsb3MgMjAwIHBlc29zIGRpYXJpb3MuIAoKYGBge3J9Cmhpc3QoKGJhamFzNiRTQUxBUklPLkRJQVJJTy5JTVNTKSxjb2w9YygiYmx1ZSIpLG1haW49IlNhbGFyaW8gZGlhcmlvIix4bGFiPSJQZXNvcyIseWxhYj0iRnJlY3VlbmNpYSIpCmBgYAoKT2JzZXJ2YW1vcyBxdWUgZXhpc3RlIHVuYSBtYXlvciB0ZW5kZW5jaWEgZW4gcXVlIGxhcyBwZXJzb25hcyBxdWUgc2FsZ2FuIHNlYW4gbXVqZXJlcy4gCmBgYHtyfQpwaWUocHJvcC50YWJsZSh0YWJsZShiYWphczYkR0VORVJPKSksY29sPWMoInBpbmsiLCJibHVlIiksbWFpbj0iR8OpbmVybyIsbGFzPTEpCmBgYAoKRW4gY3VhbnRvIGEgbGEgcmVsYWNpw7NuIHkgbGEgZGlzcGVyc2nDs24gZW50cmUgbG9zIGTDrWFzIGRlIGR1cmFjacOzbiB5IGxhIGVkYWQsIHZlbW9zIHF1ZSBsYSBlZGFkIG5vIGluZmx1eWUgbXVjaG8gZW4gbG9zIGTDrWFzIHF1ZSBkdXJhbiwgcHVlc3RvIHF1ZSB2ZW1vcyBjYXNpIGxhIG1pc21hIGZyZWN1ZW5jaWEgZGUgZHVyYWNpw7NuIGVudHJlIGxhcyBkaWZlcmVudGVzIGVkYWRlcy4gRXhpc3RlZW4gYWxndW5vcyBjYXNvcyBxdWUgc2Ugc2FsZW4gZGUgbG9zICJjb23Dum4iIGFsIGhhYmVyIGR1cmFkbyBtdWNoby4gCgpgYGB7cn0KcGxvdChiYWphczYkRURBRCxiYWphczYkRMONQVMuREUuRFVSQUNJw5NOLCBtYWluID0gIkTDrWFzIGRlIGR1cmFjacOzbiB5IGVkYWQiLAogICAgIHBjaCA9IDE5LCBmcmFtZSA9IEZBTFNFLGNvbD1jKCJvcmFuZ2UiKSkKYGBgCgoKCgoKCgoKCgoK