Situación problema 2: Arca Continental Proyecto Siglo XXI

Contexto

Analizar la información de las ventas de 2016 a 2019 de productos de la familia Coca-Cola en algunos de los establecimientos de la zona metropolitana de Guadalajara en los que se implementó el Proyecto Siglo XXI de Arca Continental.

Entender la base de datos

df <- read.csv("/Users/paulettem.a./Desktop/Bootcamp/arca.csv")
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
resumen <- summary(df)
resumen
##        ID              Año        Territorio        Sub.Territorio    
##  Min.   :     1   Min.   :2016   Length:466509      Length:466509     
##  1st Qu.:116628   1st Qu.:2017   Class :character   Class :character  
##  Median :233255   Median :2018   Mode  :character   Mode  :character  
##  Mean   :233255   Mean   :2018                                        
##  3rd Qu.:349882   3rd Qu.:2019                                        
##  Max.   :466509   Max.   :2019                                        
##      CEDI             Cliente             Nombre          Tamaño.Cte.Industria
##  Length:466509      Length:466509      Length:466509      Length:466509       
##  Class :character   Class :character   Class :character   Class :character    
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character    
##                                                                               
##                                                                               
##                                                                               
##  Segmento.Det          Marca           Presentacion          Tamaño         
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Retornable_NR         Enero             Febrero             Marzo          
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     Abril               Mayo              Junio              Julio          
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     Agosto           Septiembre          Octubre           Noviembre        
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##   Diciembre        
##  Length:466509     
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
count(df, Territorio, sort = TRUE)
##    Territorio      n
## 1 Guadalajara 466508
## 2  Territorio      1
# count(df, Sub.Territorio, sort = TRUE)
# count(df, CEDI, sort = TRUE)
# count(df, Cliente, sort = TRUE)
# count(df, Nombre, sort = TRUE)
# count(df, Tamaño.Cte.Industria, sort = TRUE)
# count(df, Segmento.Det, sort = TRUE)
# count(df, Marca, sort = TRUE)
# count(df, Presentacion, sort = TRUE)
# count(df, Tamaño, sort = TRUE)
# count(df, Retornable_NR, sort = TRUE)

Observaciones

1. Eliminar renglón 184065 que tiene títulos en lugar de datos

2. Cambiar formato de Enero a Diciembre de caracter a entero

Limpiar la base de datos

df <- df[-184065,]

df$Enero <- as.integer(df$Enero)
## Warning: NAs introduced by coercion
df$Febrero <- as.integer(df$Febrero)
## Warning: NAs introduced by coercion
df$Marzo <- as.integer(df$Marzo)
## Warning: NAs introduced by coercion
df$Abril <- as.integer(df$Abril)
## Warning: NAs introduced by coercion
df$Mayo <- as.integer(df$Mayo)
## Warning: NAs introduced by coercion
df$Junio <- as.integer(df$Junio)
## Warning: NAs introduced by coercion
df$Julio <- as.integer(df$Julio)
## Warning: NAs introduced by coercion
df$Agosto <- as.integer(df$Agosto)
## Warning: NAs introduced by coercion
df$Septiembre <- as.integer(df$Septiembre)
## Warning: NAs introduced by coercion
df$Octubre <- as.integer(df$Octubre)
## Warning: NAs introduced by coercion
df$Noviembre <- as.integer(df$Noviembre)
## Warning: NAs introduced by coercion
df$Diciembre <- as.integer(df$Diciembre)
## Warning: NAs introduced by coercion
summary(df)
##        ID              Año        Territorio        Sub.Territorio    
##  Min.   :     1   Min.   :2016   Length:466508      Length:466508     
##  1st Qu.:116628   1st Qu.:2017   Class :character   Class :character  
##  Median :233256   Median :2018   Mode  :character   Mode  :character  
##  Mean   :233255   Mean   :2018                                        
##  3rd Qu.:349882   3rd Qu.:2019                                        
##  Max.   :466509   Max.   :2019                                        
##                                                                       
##      CEDI             Cliente             Nombre          Tamaño.Cte.Industria
##  Length:466508      Length:466508      Length:466508      Length:466508       
##  Class :character   Class :character   Class :character   Class :character    
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character    
##                                                                               
##                                                                               
##                                                                               
##                                                                               
##  Segmento.Det          Marca           Presentacion          Tamaño         
##  Length:466508      Length:466508      Length:466508      Length:466508     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  Retornable_NR          Enero           Febrero           Marzo       
##  Length:466508      Min.   :-19.00   Min.   :-11.00   Min.   :-32.00  
##  Class :character   1st Qu.:  1.00   1st Qu.:  1.00   1st Qu.:  1.00  
##  Mode  :character   Median :  2.00   Median :  2.00   Median :  3.00  
##                     Mean   :  9.39   Mean   :  9.09   Mean   : 10.54  
##                     3rd Qu.:  6.00   3rd Qu.:  6.00   3rd Qu.:  6.00  
##                     Max.   :999.00   Max.   :986.00   Max.   :986.00  
##                     NA's   :233551   NA's   :231285   NA's   :227506  
##      Abril             Mayo             Junio             Julio       
##  Min.   :-70.00   Min.   :-106.00   Min.   :-211.00   Min.   :-60.00  
##  1st Qu.:  1.00   1st Qu.:   1.00   1st Qu.:   1.00   1st Qu.:  1.00  
##  Median :  3.00   Median :   3.00   Median :   3.00   Median :  2.00  
##  Mean   : 10.62   Mean   :  11.44   Mean   :  10.98   Mean   : 10.72  
##  3rd Qu.:  6.00   3rd Qu.:   7.00   3rd Qu.:   6.00   3rd Qu.:  6.00  
##  Max.   :993.00   Max.   : 991.00   Max.   : 998.00   Max.   :993.00  
##  NA's   :224185   NA's   :217072    NA's   :215907    NA's   :223537  
##      Agosto          Septiembre        Octubre         Noviembre     
##  Min.   :-211.00   Min.   :-527     Min.   :-38.0    Min.   :-25.0   
##  1st Qu.:   1.00   1st Qu.:   1     1st Qu.:  1.0    1st Qu.:  1.0   
##  Median :   3.00   Median :   3     Median :  3.0    Median :  3.0   
##  Mean   :  10.95   Mean   :  12     Mean   : 12.1    Mean   : 11.8   
##  3rd Qu.:   6.00   3rd Qu.:   7     3rd Qu.:  7.0    3rd Qu.:  6.0   
##  Max.   : 999.00   Max.   : 993     Max.   :998.0    Max.   :991.0   
##  NA's   :220366    NA's   :337401   NA's   :338482   NA's   :338545  
##    Diciembre     
##  Min.   :-28     
##  1st Qu.:  1     
##  Median :  3     
##  Mean   : 13     
##  3rd Qu.:  7     
##  Max.   :997     
##  NA's   :341954

Observaciones

3. Tenemos un NA en las columnas de los meses

4. Tenemos cantidades negativas

5. No tenemos ventas por año

6. Cantidades máximas muy elevadas

# ¿Cuantos NA tengo en la base de datos?
sum(is.na(df))
## [1] 3149791
# ¿Cuántos NA tengo por variable?
sapply(df, function(x) sum(is.na(x)))
##                   ID                  Año           Territorio 
##                    0                    0                    0 
##       Sub.Territorio                 CEDI              Cliente 
##                    0                    0                    0 
##               Nombre Tamaño.Cte.Industria         Segmento.Det 
##                    0                    0                    0 
##                Marca         Presentacion               Tamaño 
##                    0                    0                    0 
##        Retornable_NR                Enero              Febrero 
##                    0               233551               231285 
##                Marzo                Abril                 Mayo 
##               227506               224185               217072 
##                Junio                Julio               Agosto 
##               215907               223537               220366 
##           Septiembre              Octubre            Noviembre 
##               337401               338482               338545 
##            Diciembre 
##               341954
# Reemplazar NA con 0
df[is.na(df)]<-0

# Agregar columna de ventas 
df$Ventas <- df$Enero + df$Febrero + df$Marzo + df$Abril + df$Mayo + df$Junio + df$Julio + df$Agosto + df$Septiembre + df$Octubre + df$Noviembre + df$Diciembre 

boxplot(df$Enero, horizontal = TRUE)

boxplot(df$Agosto, horizontal = TRUE)

summary(df)
##        ID              Año        Territorio        Sub.Territorio    
##  Min.   :     1   Min.   :2016   Length:466508      Length:466508     
##  1st Qu.:116628   1st Qu.:2017   Class :character   Class :character  
##  Median :233256   Median :2018   Mode  :character   Mode  :character  
##  Mean   :233255   Mean   :2018                                        
##  3rd Qu.:349882   3rd Qu.:2019                                        
##  Max.   :466509   Max.   :2019                                        
##      CEDI             Cliente             Nombre          Tamaño.Cte.Industria
##  Length:466508      Length:466508      Length:466508      Length:466508       
##  Class :character   Class :character   Class :character   Class :character    
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character    
##                                                                               
##                                                                               
##                                                                               
##  Segmento.Det          Marca           Presentacion          Tamaño         
##  Length:466508      Length:466508      Length:466508      Length:466508     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Retornable_NR          Enero           Febrero            Marzo        
##  Length:466508      Min.   :-19.00   Min.   :-11.000   Min.   :-32.000  
##  Class :character   1st Qu.:  0.00   1st Qu.:  0.000   1st Qu.:  0.000  
##  Mode  :character   Median :  0.00   Median :  0.000   Median :  0.000  
##                     Mean   :  4.69   Mean   :  4.581   Mean   :  5.401  
##                     3rd Qu.:  2.00   3rd Qu.:  2.000   3rd Qu.:  3.000  
##                     Max.   :999.00   Max.   :986.000   Max.   :986.000  
##      Abril              Mayo              Junio            Julio        
##  Min.   :-70.000   Min.   :-106.000   Min.   :-211.0   Min.   :-60.000  
##  1st Qu.:  0.000   1st Qu.:   0.000   1st Qu.:   0.0   1st Qu.:  0.000  
##  Median :  0.000   Median :   0.000   Median :   0.0   Median :  0.000  
##  Mean   :  5.519   Mean   :   6.117   Mean   :   5.9   Mean   :  5.583  
##  3rd Qu.:  3.000   3rd Qu.:   3.000   3rd Qu.:   3.0   3rd Qu.:  3.000  
##  Max.   :993.000   Max.   : 991.000   Max.   : 998.0   Max.   :993.000  
##      Agosto           Septiembre          Octubre          Noviembre      
##  Min.   :-211.000   Min.   :-527.000   Min.   :-38.000   Min.   :-25.000  
##  1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:  0.000   1st Qu.:  0.000  
##  Median :   0.000   Median :   0.000   Median :  0.000   Median :  0.000  
##  Mean   :   5.777   Mean   :   3.311   Mean   :  3.327   Mean   :  3.248  
##  3rd Qu.:   3.000   3rd Qu.:   1.000   3rd Qu.:  1.000   3rd Qu.:  1.000  
##  Max.   : 999.000   Max.   : 993.000   Max.   :998.000   Max.   :991.000  
##    Diciembre           Ventas       
##  Min.   :-28.000   Min.   :-527.00  
##  1st Qu.:  0.000   1st Qu.:   2.00  
##  Median :  0.000   Median :   7.00  
##  Mean   :  3.477   Mean   :  56.93  
##  3rd Qu.:  0.000   3rd Qu.:  26.00  
##  Max.   :997.000   Max.   :9517.00

Pregunta 1

¿Puede observarse un crecimiento en las ventas de algunos de los segmentos de productos de la familia Coca Cola en las tiendas en las que se implemnetó el proyecto Siglo XXI de Arca Continental?

Respuesta: El incremento de ventas se debió a la incorporación de tamaño de cliente
library(ggplot2)
ggplot(df, aes(x = Año, y = Ventas)) +
  geom_bar(stat = "identity") +
labs(
  title= "Ventas por año", 
  subtitle= "Caso Arca Continental"
)

Pregunta 2

¿El incremento en las ventas es similar entre los diferentes tamaños de clientes?

Respuesta: El incremento de las ventas se debió a la incorporación de cliente Grande y Pequeño. Extra Grande bajo sus ventas el úñtimo año y Micro las subió
ggplot(df, aes(x = Año, y = Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") + 
labs(
  title= "Ventas por año", 
  subtitle= "Caso Arca Continental"
)

df2 <- df %>%filter(Tamaño.Cte.Industria == "Extra Grande" | Tamaño.Cte.Industria == "Micro")

ggplot(df2, aes(x = Año, y = Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") +
labs(
  title= "Ventas por año", 
  subtitle= "Caso Arca Continental"
)

df3 <- df %>%filter(Tamaño.Cte.Industria == "Grande")

ggplot(df3, aes(x = Año, y = Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") +
labs(
  title= "Ventas por año", 
  subtitle= "Caso Arca Continental"
)

df4 <- df %>%filter(Tamaño.Cte.Industria == "Micro")

ggplot(df4, aes(x = Año, y = Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") +
labs(
  title= "Ventas por año", 
  subtitle= "Caso Arca Continental"
)

df5 <- df %>%filter(Tamaño.Cte.Industria == "Pequeño")

ggplot(df5, aes(x = Año, y = Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") +
labs(
  title= "Ventas por año", 
  subtitle= "Caso Arca Continental"
)

Pregunta 3

¿Cuál es el comportamiento observado de las unidades vendidas por mes de cada una de las marcas, independientemente de sus respectivas presentaciones?

La marca Coca-Cola es la más vendida de todas, con incremento de ventas en 2019. La marca Sprite con incremento de ventas año con año
df6 <- df %>% filter(Marca=="Coca-Cola")

ggplot(df6, aes(x=Año, y=Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat="identity") +
  labs(
    title = "Ventas por Año de Coca-Cola",
    subtitle = "Caso Arca Continental"
  )

df7 <- df%>% filter(Marca == "Sprite")

ggplot(df7, aes(x = Año, y = Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") +
labs(
  title= "Ventas por año de Sprite", 
  subtitle= "Caso Arca Continental"
)

Pregunta 4

¿Se ha incrementado la venta de productos en envases retornables en los últimos dos años?

Respuesta: No, solo hubo incremento en el último año
df8 <- df%>% filter(Retornable_NR == "Retornable")

ggplot(df8, aes(x = Año, y = Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") +
labs(
  title= "Ventas por año de envases retornables", 
  subtitle= "Caso Arca Continental"
)

Pregunta 5

¿El comportamiento de la venta de agua ha incrementado en relación al de los refrescos o las bebidas isotónicas?

Respuesta: Las ventas de agua Purificada y Colas Regular bajaron en su último año, sin embargo, los isotónicos regular aumentan año con año
df9 <- df %>% filter(Segmento.Det=="Agua Purificada" | Segmento.Det=="Isotónicos Regular" | Segmento.Det=="Colas Regular")

ggplot(df9, aes(x=Año, y=Ventas, fill=Segmento.Det)) +
  geom_bar(position="dodge", stat="identity") +
  labs(
    title = "Ventas por Año",
    subtitle = "Caso Arca Continental"
  )

Pregunta 6

¿Puede decirse que la venta mensual del agua esta relacionada con la venta mensual de los refrescos en los últimos 4 años?

Respuesta: La venta de aguas y refrescos no esta relacionada
df10 <- df %>% filter(Segmento.Det=="Agua Purificada" | Segmento.Det=="Colas Regular")

ggplot(df10, aes(x=Año, y=Ventas, fill=Segmento.Det)) +
  geom_bar(position="dodge", stat="identity") +
  labs(
    title = "Ventas por Año",
    subtitle = "Caso Arca Continental"
  )

Pregunta 7

¿A cuánto ascienden las ventas esperadas para el 2020 en la Coca-Cola de 500ml NR vidrio ?

Respuesta: Acorde a un modelo predictivo utilizando regresión lineal, las ventas esperadas para Coca Cola de 500 ml NR Vidrio en 2020 son de 444,066 unidades, con una R cuadrada ajustada del 48%.
df11 <- df %>% filter(Marca=="Coca-Cola" & Presentacion=="500 ml NR Vidrio")

df12 <- aggregate(Ventas ~ Año, df11, sum)
df12$Año <- as.integer(df12$Año)
regresion <- lm(Ventas ~ Año, data=df12)
summary(regresion)
## 
## Call:
## lm(formula = Ventas ~ Año, data = df12)
## 
## Residuals:
##        1        2        3        4 
## -23838.5  35316.5    882.5 -12360.5 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)
## (Intercept) -54970594   28310425  -1.942    0.192
## Año             27433      14032   1.955    0.190
## 
## Residual standard error: 31380 on 2 degrees of freedom
## Multiple R-squared:  0.6565, Adjusted R-squared:  0.4847 
## F-statistic: 3.822 on 1 and 2 DF,  p-value: 0.1898
datos <- data.frame(Año=2020)
predict(regresion,datos)
##        1 
## 444065.5
LS0tCnRpdGxlOiAiU1AgQXJjYSIKYXV0aG9yOiAiUGF1bGV0dGUgTXR6ICAgQTAxNzQ3NTM1IgpkYXRlOiAiMjAyMy0wOS0xMyIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICB0b2M6IFRSVUUKICAgdG9jX2Zsb2F0OiBUUlVFCiAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgdGhlbWU6ICJjZXJ1bGVhbiIKICAgaGlnaGxpZ2h0OiAidGFuZ28iIAotLS0KCiFbXSgvVXNlcnMvcGF1bGV0dGVtLmEuL0Rlc2t0b3AvQm9vdGNhbXAvYXJjYS5naWYpCgojIFNpdHVhY2nDs24gcHJvYmxlbWEgMjogQXJjYSBDb250aW5lbnRhbCBQcm95ZWN0byBTaWdsbyBYWEkKIyMgQ29udGV4dG8KIyMjIyBBbmFsaXphciBsYSBpbmZvcm1hY2nDs24gZGUgbGFzIHZlbnRhcyBkZSAyMDE2IGEgMjAxOSBkZSBwcm9kdWN0b3MgZGUgbGEgZmFtaWxpYSBDb2NhLUNvbGEgZW4gYWxndW5vcyBkZSBsb3MgZXN0YWJsZWNpbWllbnRvcyBkZSBsYSB6b25hIG1ldHJvcG9saXRhbmEgZGUgR3VhZGFsYWphcmEgZW4gbG9zIHF1ZSBzZSBpbXBsZW1lbnTDsyBlbCBQcm95ZWN0byBTaWdsbyBYWEkgZGUgQXJjYSBDb250aW5lbnRhbC4gIAoKIyMjIDxzcGFuIHN0eWxlID0gImNvbG9yID0gcmVkOyI+RW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvczwvc3Bhbj4KCmBgYHtyfQpkZiA8LSByZWFkLmNzdigiL1VzZXJzL3BhdWxldHRlbS5hLi9EZXNrdG9wL0Jvb3RjYW1wL2FyY2EuY3N2IikKYGBgCgpgYGB7cn0KbGlicmFyeShkcGx5cikKYGBgCgpgYGB7cn0KcmVzdW1lbiA8LSBzdW1tYXJ5KGRmKQpyZXN1bWVuCgpjb3VudChkZiwgVGVycml0b3Jpbywgc29ydCA9IFRSVUUpCiMgY291bnQoZGYsIFN1Yi5UZXJyaXRvcmlvLCBzb3J0ID0gVFJVRSkKIyBjb3VudChkZiwgQ0VESSwgc29ydCA9IFRSVUUpCiMgY291bnQoZGYsIENsaWVudGUsIHNvcnQgPSBUUlVFKQojIGNvdW50KGRmLCBOb21icmUsIHNvcnQgPSBUUlVFKQojIGNvdW50KGRmLCBUYW1hw7FvLkN0ZS5JbmR1c3RyaWEsIHNvcnQgPSBUUlVFKQojIGNvdW50KGRmLCBTZWdtZW50by5EZXQsIHNvcnQgPSBUUlVFKQojIGNvdW50KGRmLCBNYXJjYSwgc29ydCA9IFRSVUUpCiMgY291bnQoZGYsIFByZXNlbnRhY2lvbiwgc29ydCA9IFRSVUUpCiMgY291bnQoZGYsIFRhbWHDsW8sIHNvcnQgPSBUUlVFKQojIGNvdW50KGRmLCBSZXRvcm5hYmxlX05SLCBzb3J0ID0gVFJVRSkKYGBgCiMgT2JzZXJ2YWNpb25lcwojIyMjIDEuIEVsaW1pbmFyIHJlbmdsw7NuIDE4NDA2NSBxdWUgdGllbmUgdMOtdHVsb3MgZW4gbHVnYXIgZGUgZGF0b3MKIyMjIyAyLiBDYW1iaWFyIGZvcm1hdG8gZGUgRW5lcm8gYSBEaWNpZW1icmUgZGUgY2FyYWN0ZXIgYSBlbnRlcm8KCiMjIyA8c3BhbiBzdHlsZSA9ICJjb2xvciA9IHJlZDsiPkxpbXBpYXIgbGEgYmFzZSBkZSBkYXRvczwvc3Bhbj4KYGBge3J9CmRmIDwtIGRmWy0xODQwNjUsXQoKZGYkRW5lcm8gPC0gYXMuaW50ZWdlcihkZiRFbmVybykKZGYkRmVicmVybyA8LSBhcy5pbnRlZ2VyKGRmJEZlYnJlcm8pCmRmJE1hcnpvIDwtIGFzLmludGVnZXIoZGYkTWFyem8pCmRmJEFicmlsIDwtIGFzLmludGVnZXIoZGYkQWJyaWwpCmRmJE1heW8gPC0gYXMuaW50ZWdlcihkZiRNYXlvKQpkZiRKdW5pbyA8LSBhcy5pbnRlZ2VyKGRmJEp1bmlvKQpkZiRKdWxpbyA8LSBhcy5pbnRlZ2VyKGRmJEp1bGlvKQpkZiRBZ29zdG8gPC0gYXMuaW50ZWdlcihkZiRBZ29zdG8pCmRmJFNlcHRpZW1icmUgPC0gYXMuaW50ZWdlcihkZiRTZXB0aWVtYnJlKQpkZiRPY3R1YnJlIDwtIGFzLmludGVnZXIoZGYkT2N0dWJyZSkKZGYkTm92aWVtYnJlIDwtIGFzLmludGVnZXIoZGYkTm92aWVtYnJlKQpkZiREaWNpZW1icmUgPC0gYXMuaW50ZWdlcihkZiREaWNpZW1icmUpCgpzdW1tYXJ5KGRmKQpgYGAKCiMjIyBPYnNlcnZhY2lvbmVzIAojIyMjIDMuIFRlbmVtb3MgdW4gTkEgZW4gbGFzIGNvbHVtbmFzIGRlIGxvcyBtZXNlcyAKIyMjIyA0LiBUZW5lbW9zIGNhbnRpZGFkZXMgbmVnYXRpdmFzIAojIyMjIDUuIE5vIHRlbmVtb3MgdmVudGFzIHBvciBhw7FvIAojIyMjIDYuIENhbnRpZGFkZXMgbcOheGltYXMgbXV5IGVsZXZhZGFzCgpgYGB7cn0KIyDCv0N1YW50b3MgTkEgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8Kc3VtKGlzLm5hKGRmKSkKCiMgwr9DdcOhbnRvcyBOQSB0ZW5nbyBwb3IgdmFyaWFibGU/CnNhcHBseShkZiwgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKCiMgUmVlbXBsYXphciBOQSBjb24gMApkZltpcy5uYShkZildPC0wCgojIEFncmVnYXIgY29sdW1uYSBkZSB2ZW50YXMgCmRmJFZlbnRhcyA8LSBkZiRFbmVybyArIGRmJEZlYnJlcm8gKyBkZiRNYXJ6byArIGRmJEFicmlsICsgZGYkTWF5byArIGRmJEp1bmlvICsgZGYkSnVsaW8gKyBkZiRBZ29zdG8gKyBkZiRTZXB0aWVtYnJlICsgZGYkT2N0dWJyZSArIGRmJE5vdmllbWJyZSArIGRmJERpY2llbWJyZSAKCmJveHBsb3QoZGYkRW5lcm8sIGhvcml6b250YWwgPSBUUlVFKQpib3hwbG90KGRmJEFnb3N0bywgaG9yaXpvbnRhbCA9IFRSVUUpCgpzdW1tYXJ5KGRmKQpgYGAKIyA8c3BhbiBzdHlsZSA9ICJjb2xvciA9IHJlZDsiPlByZWd1bnRhIDE8L3NwYW4+CiMjIyMgwr9QdWVkZSBvYnNlcnZhcnNlIHVuIGNyZWNpbWllbnRvIGVuIGxhcyB2ZW50YXMgZGUgYWxndW5vcyBkZSBsb3Mgc2VnbWVudG9zIGRlIHByb2R1Y3RvcyBkZSBsYSBmYW1pbGlhIENvY2EgQ29sYSBlbiBsYXMgdGllbmRhcyBlbiBsYXMgcXVlIHNlIGltcGxlbW5ldMOzIGVsIHByb3llY3RvIFNpZ2xvIFhYSSBkZSBBcmNhIENvbnRpbmVudGFsPwojIyMjIyBSZXNwdWVzdGE6IEVsIGluY3JlbWVudG8gZGUgdmVudGFzIHNlIGRlYmnDsyBhIGxhIGluY29ycG9yYWNpw7NuIGRlIHRhbWHDsW8gZGUgY2xpZW50ZSAKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KGRmLCBhZXMoeCA9IEHDsW8sIHkgPSBWZW50YXMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKbGFicygKICB0aXRsZT0gIlZlbnRhcyBwb3IgYcOxbyIsIAogIHN1YnRpdGxlPSAiQ2FzbyBBcmNhIENvbnRpbmVudGFsIgopCmBgYAoKCiMgPHNwYW4gc3R5bGUgPSAiY29sb3IgPSByZWQ7Ij5QcmVndW50YSAyPC9zcGFuPgojIyMjIMK/RWwgaW5jcmVtZW50byBlbiBsYXMgdmVudGFzIGVzIHNpbWlsYXIgZW50cmUgbG9zIGRpZmVyZW50ZXMgdGFtYcOxb3MgZGUgY2xpZW50ZXM/CiMjIyMjIFJlc3B1ZXN0YTogRWwgaW5jcmVtZW50byBkZSBsYXMgdmVudGFzIHNlIGRlYmnDsyBhIGxhIGluY29ycG9yYWNpw7NuIGRlIGNsaWVudGUgR3JhbmRlIHkgUGVxdWXDsW8uIEV4dHJhIEdyYW5kZSBiYWpvIHN1cyB2ZW50YXMgZWwgw7rDsXRpbW8gYcOxbyB5IE1pY3JvIGxhcyBzdWJpw7MKYGBge3J9CmdncGxvdChkZiwgYWVzKHggPSBBw7FvLCB5ID0gVmVudGFzLCBjb2xvdXI9VGFtYcOxby5DdGUuSW5kdXN0cmlhKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIApsYWJzKAogIHRpdGxlPSAiVmVudGFzIHBvciBhw7FvIiwgCiAgc3VidGl0bGU9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCikKCmRmMiA8LSBkZiAlPiVmaWx0ZXIoVGFtYcOxby5DdGUuSW5kdXN0cmlhID09ICJFeHRyYSBHcmFuZGUiIHwgVGFtYcOxby5DdGUuSW5kdXN0cmlhID09ICJNaWNybyIpCgpnZ3Bsb3QoZGYyLCBhZXMoeCA9IEHDsW8sIHkgPSBWZW50YXMsIGNvbG91cj1UYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKbGFicygKICB0aXRsZT0gIlZlbnRhcyBwb3IgYcOxbyIsIAogIHN1YnRpdGxlPSAiQ2FzbyBBcmNhIENvbnRpbmVudGFsIgopCgpkZjMgPC0gZGYgJT4lZmlsdGVyKFRhbWHDsW8uQ3RlLkluZHVzdHJpYSA9PSAiR3JhbmRlIikKCmdncGxvdChkZjMsIGFlcyh4ID0gQcOxbywgeSA9IFZlbnRhcywgY29sb3VyPVRhbWHDsW8uQ3RlLkluZHVzdHJpYSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwpsYWJzKAogIHRpdGxlPSAiVmVudGFzIHBvciBhw7FvIiwgCiAgc3VidGl0bGU9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCikKCmRmNCA8LSBkZiAlPiVmaWx0ZXIoVGFtYcOxby5DdGUuSW5kdXN0cmlhID09ICJNaWNybyIpCgpnZ3Bsb3QoZGY0LCBhZXMoeCA9IEHDsW8sIHkgPSBWZW50YXMsIGNvbG91cj1UYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKbGFicygKICB0aXRsZT0gIlZlbnRhcyBwb3IgYcOxbyIsIAogIHN1YnRpdGxlPSAiQ2FzbyBBcmNhIENvbnRpbmVudGFsIgopCgpkZjUgPC0gZGYgJT4lZmlsdGVyKFRhbWHDsW8uQ3RlLkluZHVzdHJpYSA9PSAiUGVxdWXDsW8iKQoKZ2dwbG90KGRmNSwgYWVzKHggPSBBw7FvLCB5ID0gVmVudGFzLCBjb2xvdXI9VGFtYcOxby5DdGUuSW5kdXN0cmlhKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCmxhYnMoCiAgdGl0bGU9ICJWZW50YXMgcG9yIGHDsW8iLCAKICBzdWJ0aXRsZT0gIkNhc28gQXJjYSBDb250aW5lbnRhbCIKKQpgYGAKCgojIDxzcGFuIHN0eWxlID0gImNvbG9yID0gcmVkOyI+UHJlZ3VudGEgMzwvc3Bhbj4KIyMjIyDCv0N1w6FsIGVzIGVsIGNvbXBvcnRhbWllbnRvIG9ic2VydmFkbyBkZSBsYXMgdW5pZGFkZXMgdmVuZGlkYXMgcG9yIG1lcyBkZSBjYWRhIHVuYSBkZSBsYXMgbWFyY2FzLCBpbmRlcGVuZGllbnRlbWVudGUgZGUgc3VzIHJlc3BlY3RpdmFzIHByZXNlbnRhY2lvbmVzPwojIyMjIyBMYSBtYXJjYSBDb2NhLUNvbGEgZXMgbGEgbcOhcyB2ZW5kaWRhIGRlIHRvZGFzLCBjb24gaW5jcmVtZW50byBkZSB2ZW50YXMgZW4gMjAxOS4gTGEgbWFyY2EgU3ByaXRlIGNvbiBpbmNyZW1lbnRvIGRlIHZlbnRhcyBhw7FvIGNvbiBhw7FvIApgYGB7cn0KZGY2IDwtIGRmICU+JSBmaWx0ZXIoTWFyY2E9PSJDb2NhLUNvbGEiKQoKZ2dwbG90KGRmNiwgYWVzKHg9QcOxbywgeT1WZW50YXMsIGNvbG91cj1UYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZlbnRhcyBwb3IgQcOxbyBkZSBDb2NhLUNvbGEiLAogICAgc3VidGl0bGUgPSAiQ2FzbyBBcmNhIENvbnRpbmVudGFsIgogICkKCmRmNyA8LSBkZiU+JSBmaWx0ZXIoTWFyY2EgPT0gIlNwcml0ZSIpCgpnZ3Bsb3QoZGY3LCBhZXMoeCA9IEHDsW8sIHkgPSBWZW50YXMsIGNvbG91cj1UYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKbGFicygKICB0aXRsZT0gIlZlbnRhcyBwb3IgYcOxbyBkZSBTcHJpdGUiLCAKICBzdWJ0aXRsZT0gIkNhc28gQXJjYSBDb250aW5lbnRhbCIKKQoKYGBgCgoKCiMgPHNwYW4gc3R5bGUgPSAiY29sb3IgPSByZWQ7Ij5QcmVndW50YSA0PC9zcGFuPgojIyMjIMK/U2UgaGEgaW5jcmVtZW50YWRvIGxhIHZlbnRhIGRlIHByb2R1Y3RvcyBlbiBlbnZhc2VzIHJldG9ybmFibGVzIGVuIGxvcyDDumx0aW1vcyBkb3MgYcOxb3M/CiMjIyMjIFJlc3B1ZXN0YTogTm8sIHNvbG8gaHVibyBpbmNyZW1lbnRvIGVuIGVsIMO6bHRpbW8gYcOxbyAKYGBge3J9CmRmOCA8LSBkZiU+JSBmaWx0ZXIoUmV0b3JuYWJsZV9OUiA9PSAiUmV0b3JuYWJsZSIpCgpnZ3Bsb3QoZGY4LCBhZXMoeCA9IEHDsW8sIHkgPSBWZW50YXMsIGNvbG91cj1UYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKbGFicygKICB0aXRsZT0gIlZlbnRhcyBwb3IgYcOxbyBkZSBlbnZhc2VzIHJldG9ybmFibGVzIiwgCiAgc3VidGl0bGU9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCikKYGBgCgoKCiMgPHNwYW4gc3R5bGUgPSAiY29sb3IgPSByZWQ7Ij5QcmVndW50YSA1PC9zcGFuPgojIyMjIMK/RWwgY29tcG9ydGFtaWVudG8gZGUgbGEgdmVudGEgZGUgYWd1YSBoYSBpbmNyZW1lbnRhZG8gZW4gcmVsYWNpw7NuIGFsIGRlIGxvcyByZWZyZXNjb3MgbyBsYXMgYmViaWRhcyBpc290w7NuaWNhcz8KIyMjIyMgUmVzcHVlc3RhOiBMYXMgdmVudGFzIGRlIGFndWEgUHVyaWZpY2FkYSB5IENvbGFzIFJlZ3VsYXIgYmFqYXJvbiBlbiBzdSDDumx0aW1vIGHDsW8sIHNpbiBlbWJhcmdvLCBsb3MgaXNvdMOzbmljb3MgcmVndWxhciBhdW1lbnRhbiBhw7FvIGNvbiBhw7FvIApgYGB7cn0KZGY5IDwtIGRmICU+JSBmaWx0ZXIoU2VnbWVudG8uRGV0PT0iQWd1YSBQdXJpZmljYWRhIiB8IFNlZ21lbnRvLkRldD09Iklzb3TDs25pY29zIFJlZ3VsYXIiIHwgU2VnbWVudG8uRGV0PT0iQ29sYXMgUmVndWxhciIpCgpnZ3Bsb3QoZGY5LCBhZXMoeD1Bw7FvLCB5PVZlbnRhcywgZmlsbD1TZWdtZW50by5EZXQpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZlbnRhcyBwb3IgQcOxbyIsCiAgICBzdWJ0aXRsZSA9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCiAgKQpgYGAKCgoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvciA9IHJlZDsiPlByZWd1bnRhIDY8L3NwYW4+CiMjIyMgwr9QdWVkZSBkZWNpcnNlIHF1ZSBsYSB2ZW50YSBtZW5zdWFsIGRlbCBhZ3VhIGVzdGEgcmVsYWNpb25hZGEgY29uIGxhIHZlbnRhIG1lbnN1YWwgZGUgbG9zIHJlZnJlc2NvcyBlbiBsb3Mgw7psdGltb3MgNCBhw7Fvcz8KIyMjIyMgUmVzcHVlc3RhOiBMYSB2ZW50YSBkZSBhZ3VhcyB5IHJlZnJlc2NvcyBubyBlc3RhIHJlbGFjaW9uYWRhIApgYGB7cn0KZGYxMCA8LSBkZiAlPiUgZmlsdGVyKFNlZ21lbnRvLkRldD09IkFndWEgUHVyaWZpY2FkYSIgfCBTZWdtZW50by5EZXQ9PSJDb2xhcyBSZWd1bGFyIikKCmdncGxvdChkZjEwLCBhZXMoeD1Bw7FvLCB5PVZlbnRhcywgZmlsbD1TZWdtZW50by5EZXQpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZlbnRhcyBwb3IgQcOxbyIsCiAgICBzdWJ0aXRsZSA9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCiAgKQpgYGAKCgoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvciA9IHJlZDsiPlByZWd1bnRhIDc8L3NwYW4+CiMjIyMgwr9BIGN1w6FudG8gYXNjaWVuZGVuIGxhcyB2ZW50YXMgZXNwZXJhZGFzIHBhcmEgZWwgMjAyMCBlbiBsYSBDb2NhLUNvbGEgZGUgNTAwbWwgTlIgdmlkcmlvID8KIyMjIyMgUmVzcHVlc3RhOiBBY29yZGUgYSB1biBtb2RlbG8gcHJlZGljdGl2byB1dGlsaXphbmRvIHJlZ3Jlc2nDs24gbGluZWFsLCBsYXMgdmVudGFzIGVzcGVyYWRhcyBwYXJhIENvY2EgQ29sYSBkZSA1MDAgbWwgTlIgVmlkcmlvIGVuIDIwMjAgc29uIGRlIDQ0NCwwNjYgdW5pZGFkZXMsIGNvbiB1bmEgUiBjdWFkcmFkYSBhanVzdGFkYSBkZWwgNDglLgpgYGB7cn0KZGYxMSA8LSBkZiAlPiUgZmlsdGVyKE1hcmNhPT0iQ29jYS1Db2xhIiAmIFByZXNlbnRhY2lvbj09IjUwMCBtbCBOUiBWaWRyaW8iKQoKZGYxMiA8LSBhZ2dyZWdhdGUoVmVudGFzIH4gQcOxbywgZGYxMSwgc3VtKQpkZjEyJEHDsW8gPC0gYXMuaW50ZWdlcihkZjEyJEHDsW8pCnJlZ3Jlc2lvbiA8LSBsbShWZW50YXMgfiBBw7FvLCBkYXRhPWRmMTIpCnN1bW1hcnkocmVncmVzaW9uKQoKZGF0b3MgPC0gZGF0YS5mcmFtZShBw7FvPTIwMjApCnByZWRpY3QocmVncmVzaW9uLGRhdG9zKQpgYGAKCg==