instalar paquetes y llamar librerias

#install.packages("tidyverse")
library(tidyverse)
#install.packages("dplyr")
library (dplyr)
#install.packages("lubridate")
library(lubridate)
#install.packages("Matrix")
library(Matrix)
#install.packages("arules")
library(arules)
#install.packages("arulesViz")
library(arulesViz)
#install.packages("datasets")
library(datasets)
# install.packages ("plyr")
library (plyr)

Importar la base de datos

#file.choose()
bd <- read.csv("/Users/maya/Downloads/abarrotes.csv")

Entender la base de datos

summary(bd)
##  vcClaveTienda        DescGiro         Codigo.Barras            PLU        
##  Length:200625      Length:200625      Min.   :8.347e+05   Min.   : 1.00   
##  Class :character   Class :character   1st Qu.:7.501e+12   1st Qu.: 1.00   
##  Mode  :character   Mode  :character   Median :7.501e+12   Median : 1.00   
##                                        Mean   :5.950e+12   Mean   : 2.11   
##                                        3rd Qu.:7.501e+12   3rd Qu.: 1.00   
##                                        Max.   :1.750e+13   Max.   :30.00   
##                                                            NA's   :199188  
##     Fecha               Hora              Marca            Fabricante       
##  Length:200625      Length:200625      Length:200625      Length:200625     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##    Producto             Precio          Ult.Costo         Unidades     
##  Length:200625      Min.   :-147.00   Min.   :  0.38   Min.   : 0.200  
##  Class :character   1st Qu.:  11.00   1st Qu.:  8.46   1st Qu.: 1.000  
##  Mode  :character   Median :  16.00   Median : 12.31   Median : 1.000  
##                     Mean   :  19.42   Mean   : 15.31   Mean   : 1.262  
##                     3rd Qu.:  25.00   3rd Qu.: 19.23   3rd Qu.: 1.000  
##                     Max.   :1000.00   Max.   :769.23   Max.   :96.000  
##                                                                        
##     F.Ticket      NombreDepartamento NombreFamilia      NombreCategoria   
##  Min.   :     1   Length:200625      Length:200625      Length:200625     
##  1st Qu.: 33964   Class :character   Class :character   Class :character  
##  Median :105993   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :193990                                                           
##  3rd Qu.:383005                                                           
##  Max.   :450040                                                           
##                                                                           
##     Estado              Mts.2      Tipo.ubicación         Giro          
##  Length:200625      Min.   :47.0   Length:200625      Length:200625     
##  Class :character   1st Qu.:53.0   Class :character   Class :character  
##  Mode  :character   Median :60.0   Mode  :character   Mode  :character  
##                     Mean   :56.6                                        
##                     3rd Qu.:60.0                                        
##                     Max.   :62.0                                        
##                                                                         
##  Hora.inicio        Hora.cierre       
##  Length:200625      Length:200625     
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 
str(bd)
## 'data.frame':    200625 obs. of  22 variables:
##  $ vcClaveTienda     : chr  "MX001" "MX001" "MX001" "MX001" ...
##  $ DescGiro          : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Codigo.Barras     : num  7.5e+12 7.5e+12 7.5e+12 7.5e+12 7.5e+12 ...
##  $ PLU               : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Fecha             : chr  "19/06/2020" "19/06/2020" "19/06/2020" "19/06/2020" ...
##  $ Hora              : chr  "08:16:21" "08:23:33" "08:24:33" "08:24:33" ...
##  $ Marca             : chr  "NUTRI LECHE" "DAN UP" "BIMBO" "PEPSI" ...
##  $ Fabricante        : chr  "MEXILAC" "DANONE DE MEXICO" "GRUPO BIMBO" "PEPSI-COLA MEXICANA" ...
##  $ Producto          : chr  "Nutri Leche 1 Litro" "DANUP STRAWBERRY P/BEBER 350GR NAL" "Rebanadas Bimbo 2Pz" "Pepsi N.R. 400Ml" ...
##  $ Precio            : num  16 14 5 8 19.5 16 14 5 8 19.5 ...
##  $ Ult.Costo         : num  12.3 14 5 8 15 ...
##  $ Unidades          : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ F.Ticket          : int  1 2 3 3 4 1 2 3 3 4 ...
##  $ NombreDepartamento: chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ NombreFamilia     : chr  "Lacteos y Refrigerados" "Lacteos y Refrigerados" "Pan y Tortilla" "Bebidas" ...
##  $ NombreCategoria   : chr  "Leche" "Yogurt" "Pan Dulce Empaquetado" "Refrescos Plástico (N.R.)" ...
##  $ Estado            : chr  "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ Mts.2             : int  60 60 60 60 60 60 60 60 60 60 ...
##  $ Tipo.ubicación    : chr  "Esquina" "Esquina" "Esquina" "Esquina" ...
##  $ Giro              : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Hora.inicio       : chr  "08:00" "08:00" "08:00" "08:00" ...
##  $ Hora.cierre       : chr  "22:00" "22:00" "22:00" "22:00" ...
head(bd,n=10)
##    vcClaveTienda  DescGiro Codigo.Barras PLU      Fecha     Hora
## 1          MX001 Abarrotes  7.501021e+12  NA 19/06/2020 08:16:21
## 2          MX001 Abarrotes  7.501032e+12  NA 19/06/2020 08:23:33
## 3          MX001 Abarrotes  7.501000e+12  NA 19/06/2020 08:24:33
## 4          MX001 Abarrotes  7.501031e+12  NA 19/06/2020 08:24:33
## 5          MX001 Abarrotes  7.501026e+12  NA 19/06/2020 08:26:28
## 6          MX001 Abarrotes  7.501021e+12  NA 19/06/2020 08:16:21
## 7          MX001 Abarrotes  7.501032e+12  NA 19/06/2020 08:23:33
## 8          MX001 Abarrotes  7.501000e+12  NA 19/06/2020 08:24:33
## 9          MX001 Abarrotes  7.501031e+12  NA 19/06/2020 08:24:33
## 10         MX001 Abarrotes  7.501026e+12  NA 19/06/2020 08:26:28
##                         Marca                 Fabricante
## 1                 NUTRI LECHE                    MEXILAC
## 2                      DAN UP           DANONE DE MEXICO
## 3                       BIMBO                GRUPO BIMBO
## 4                       PEPSI        PEPSI-COLA MEXICANA
## 5  BLANCA NIEVES (DETERGENTE) FABRICA DE JABON LA CORONA
## 6                 NUTRI LECHE                    MEXILAC
## 7                      DAN UP           DANONE DE MEXICO
## 8                       BIMBO                GRUPO BIMBO
## 9                       PEPSI        PEPSI-COLA MEXICANA
## 10 BLANCA NIEVES (DETERGENTE) FABRICA DE JABON LA CORONA
##                              Producto Precio Ult.Costo Unidades F.Ticket
## 1                 Nutri Leche 1 Litro   16.0     12.31        1        1
## 2  DANUP STRAWBERRY P/BEBER 350GR NAL   14.0     14.00        1        2
## 3                 Rebanadas Bimbo 2Pz    5.0      5.00        1        3
## 4                    Pepsi N.R. 400Ml    8.0      8.00        1        3
## 5       Detergente Blanca Nieves 500G   19.5     15.00        1        4
## 6                 Nutri Leche 1 Litro   16.0     12.31        1        1
## 7  DANUP STRAWBERRY P/BEBER 350GR NAL   14.0     14.00        1        2
## 8                 Rebanadas Bimbo 2Pz    5.0      5.00        1        3
## 9                    Pepsi N.R. 400Ml    8.0      8.00        1        3
## 10      Detergente Blanca Nieves 500G   19.5     15.00        1        4
##    NombreDepartamento          NombreFamilia           NombreCategoria
## 1           Abarrotes Lacteos y Refrigerados                     Leche
## 2           Abarrotes Lacteos y Refrigerados                    Yogurt
## 3           Abarrotes         Pan y Tortilla     Pan Dulce Empaquetado
## 4           Abarrotes                Bebidas Refrescos Plástico (N.R.)
## 5           Abarrotes     Limpieza del Hogar                Lavandería
## 6           Abarrotes Lacteos y Refrigerados                     Leche
## 7           Abarrotes Lacteos y Refrigerados                    Yogurt
## 8           Abarrotes         Pan y Tortilla     Pan Dulce Empaquetado
## 9           Abarrotes                Bebidas Refrescos Plástico (N.R.)
## 10          Abarrotes     Limpieza del Hogar                Lavandería
##        Estado Mts.2 Tipo.ubicación      Giro Hora.inicio Hora.cierre
## 1  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 2  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 3  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 4  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 5  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 6  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 7  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 8  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 9  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 10 Nuevo León    60        Esquina Abarrotes       08:00       22:00
tail(bd,n=10)
##        vcClaveTienda DescGiro Codigo.Barras PLU      Fecha     Hora
## 200616         MX005 Depósito   7.62221e+12  NA 07/08/2020 19:30:13
## 200617         MX005 Depósito   7.62221e+12  NA 25/07/2020 18:42:24
## 200618         MX005 Depósito   7.62221e+12  NA 18/07/2020 22:45:58
## 200619         MX005 Depósito   7.62221e+12  NA 12/07/2020 00:36:34
## 200620         MX005 Depósito   7.62221e+12  NA 12/07/2020 01:08:25
## 200621         MX005 Depósito   7.62221e+12  NA 23/10/2020 22:17:37
## 200622         MX005 Depósito   7.62221e+12  NA 10/10/2020 20:30:20
## 200623         MX005 Depósito   7.62221e+12  NA 10/10/2020 22:40:43
## 200624         MX005 Depósito   7.62221e+12  NA 27/06/2020 22:30:19
## 200625         MX005 Depósito   7.62221e+12  NA 26/06/2020 23:43:34
##                    Marca    Fabricante                          Producto Precio
## 200616 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200617 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200618 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200619 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200620 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200621 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200622 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200623 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200624 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200625 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
##        Ult.Costo Unidades F.Ticket NombreDepartamento NombreFamilia
## 200616      6.92        1   106411          Abarrotes      Dulcería
## 200617      6.92        1   104693          Abarrotes      Dulcería
## 200618      6.92        1   103856          Abarrotes      Dulcería
## 200619      6.92        1   103087          Abarrotes      Dulcería
## 200620      6.92        1   103100          Abarrotes      Dulcería
## 200621      6.92        1   116598          Abarrotes      Dulcería
## 200622      6.92        1   114886          Abarrotes      Dulcería
## 200623      6.92        1   114955          Abarrotes      Dulcería
## 200624      6.92        1   101121          Abarrotes      Dulcería
## 200625      6.92        1   100879          Abarrotes      Dulcería
##        NombreCategoria       Estado Mts.2 Tipo.ubicación       Giro Hora.inicio
## 200616 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200617 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200618 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200619 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200620 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200621 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200622 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200623 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200624 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200625 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
##        Hora.cierre
## 200616       21:00
## 200617       21:00
## 200618       21:00
## 200619       21:00
## 200620       21:00
## 200621       21:00
## 200622       21:00
## 200623       21:00
## 200624       21:00
## 200625       21:00
# dplyr :: count(bd,vcClaveTienda, sort=TRUE)
# dplyr :: count(bd,DescGiro, sort=TRUE)
# dplyr :: count(bd,Fecha, sort=TRUE)
# dplyr :: count(bd,Hora, sort=TRUE)
# dplyr :: count(bd,Marca, sort=TRUE)
# dplyr :: count(bd,Fabricante, sort=TRUE)
# dplyr :: count(bd,NombreDepartamento, sort=TRUE)
# dplyr :: count(bd,NombreFamilia, sort=TRUE)
# dplyr :: count(bd,NombreCategoria, sort=TRUE)
# dplyr :: count(bd,Estado, sort=TRUE)
# dplyr :: count(bd,Tipo.ubicación, sort=TRUE)
# dplyr :: count(bd,Giro, sort=TRUE)
# dplyr :: count(bd,Hora.inicio, sort=TRUE)
# dplyr :: count(bd,Hora.cierre, sort=TRUE)

Liampiar la base de datos

##Tecnica 1. Eliminar valores ireelevantes

# Eliminar columnas
bd1 <- bd
bd1 <- subset(bd1, select = -c(PLU, Codigo.Barras))

# Eliminar renglones
bd2 <- bd1
bd2 <- bd2[bd2$Precio > 0, ]
summary (bd1$Precio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -147.00   11.00   16.00   19.42   25.00 1000.00
summary (bd2$Precio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.50   11.00   16.00   19.45   25.00 1000.00

##Tecnica 2. Remover valores duplicados

# ¿Cuantos rengoles duplicados tenemos?
sum(duplicated(bd2))
## [1] 5
# ¿Cuales son los rengolnes duplicados?
bd2[duplicated(bd2),]
##    vcClaveTienda  DescGiro      Fecha     Hora                      Marca
## 6          MX001 Abarrotes 19/06/2020 08:16:21                NUTRI LECHE
## 7          MX001 Abarrotes 19/06/2020 08:23:33                     DAN UP
## 8          MX001 Abarrotes 19/06/2020 08:24:33                      BIMBO
## 9          MX001 Abarrotes 19/06/2020 08:24:33                      PEPSI
## 10         MX001 Abarrotes 19/06/2020 08:26:28 BLANCA NIEVES (DETERGENTE)
##                    Fabricante                           Producto Precio
## 6                     MEXILAC                Nutri Leche 1 Litro   16.0
## 7            DANONE DE MEXICO DANUP STRAWBERRY P/BEBER 350GR NAL   14.0
## 8                 GRUPO BIMBO                Rebanadas Bimbo 2Pz    5.0
## 9         PEPSI-COLA MEXICANA                   Pepsi N.R. 400Ml    8.0
## 10 FABRICA DE JABON LA CORONA      Detergente Blanca Nieves 500G   19.5
##    Ult.Costo Unidades F.Ticket NombreDepartamento          NombreFamilia
## 6      12.31        1        1          Abarrotes Lacteos y Refrigerados
## 7      14.00        1        2          Abarrotes Lacteos y Refrigerados
## 8       5.00        1        3          Abarrotes         Pan y Tortilla
## 9       8.00        1        3          Abarrotes                Bebidas
## 10     15.00        1        4          Abarrotes     Limpieza del Hogar
##              NombreCategoria     Estado Mts.2 Tipo.ubicación      Giro
## 6                      Leche Nuevo León    60        Esquina Abarrotes
## 7                     Yogurt Nuevo León    60        Esquina Abarrotes
## 8      Pan Dulce Empaquetado Nuevo León    60        Esquina Abarrotes
## 9  Refrescos Plástico (N.R.) Nuevo León    60        Esquina Abarrotes
## 10                Lavandería Nuevo León    60        Esquina Abarrotes
##    Hora.inicio Hora.cierre
## 6        08:00       22:00
## 7        08:00       22:00
## 8        08:00       22:00
## 9        08:00       22:00
## 10       08:00       22:00
# Eliminar renglones duplicados
bd3 <- bd2
bd3 <- distinct (bd3)

##Tecnica 3. Eliminar los errores tipograficos y similares

# Cantidades en enteros
bd4 <- bd3
bd4$Unidades <- ceiling(bd4$Unidades)

##Tecnica 4. Convertir tipos de datos

# Convertir de caracter a fecha
bd5 <- bd4 
bd5$Fecha <- as.Date(bd5$Fecha, format="%d/%m/%Y")

# Convertir de caracter a entero
bd6 <- bd5
bd6$Hora <- substr (bd6$Hora, start=1, stop=2)
bd6$Hora <- as.integer(bd6$Hora)

##Tecnica 5. Reemplazar nvalor faltantes

# ¿Cuantos NAs tengo en la base de datos?
sum(is.na(bd6))
## [1] 0
sum(is.na(bd))
## [1] 199188
# ¿Cuantos NAs tengo por variable?
sapply(bd, function(x) sum(is.na(x)))
##      vcClaveTienda           DescGiro      Codigo.Barras                PLU 
##                  0                  0                  0             199188 
##              Fecha               Hora              Marca         Fabricante 
##                  0                  0                  0                  0 
##           Producto             Precio          Ult.Costo           Unidades 
##                  0                  0                  0                  0 
##           F.Ticket NombreDepartamento      NombreFamilia    NombreCategoria 
##                  0                  0                  0                  0 
##             Estado              Mts.2     Tipo.ubicación               Giro 
##                  0                  0                  0                  0 
##        Hora.inicio        Hora.cierre 
##                  0                  0
# Opcion 1. Borrar todos los NAs de una tabla
# bd100 <- na.omit(bd)

# Opcion. Reemplazar los NAs con CEROS
# bd101 <- bd
# bd101[is.na(bd101)]<-0

# Opcion 3. Reemplazar NAs con prom
# bd102 <- bd
# bd102$PLU[is.na(bd101$PLU)]<-mean(bd102$PLU, na.rm=TRUE)

##Tecnica 6. Correcciones por metodos estadisticos

boxplot(bd6$Precio, horizontal=TRUE)

boxplot(bd6$Unidades, horizontal=TRUE)

# Agregar columnas

# Agregar dia de la semana
bd6$Dia_Semana <- wday(bd6$Fecha)

#Agregar el subtotal de la venta
bd6$Subtotal <- bd6$Precio * bd6$Unidades

Exportar la base de datos

# write.csv(bd6, file="abarrotes_limpia.csv", row.names=FALSE)

Generar Market Basket Analysis

# ordenar de menor a mayor la columna ticket
bd7 <- bd6
bd7 <- bd7[order(bd7$F.Ticket),]

# Generar el canasto
basket <- ddply(bd7,c("F.Ticket"), function(bd7)paste(bd7$Marca,collapse =","))

# Eliminar la columna ticket
basket$F.Ticket <- NULL 

# Renombrar nombre de columna a Marca
colnames(basket) <- c("Marca")

# Exportar basket
write.csv(basket, file="basket.csv", row.names=FALSE)

# Importar transacciones
# file.choose()
tr <- read.transactions("/Users/maya/basket.csv", format = "basket", sep = ",")

# Generar reglas de asociacion
reglas.asociacion <- apriori(tr,parameter = list(supp=0.001,conf=0.2,maxlen=10))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.2    0.1    1 none FALSE            TRUE       5   0.001      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 115 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[28710 item(s), 115031 transaction(s)] done [0.02s].
## sorting and recoding items ... [119 item(s)] done [0.00s].
## creating transaction tree ... done [0.01s].
## checking subsets of size 1 done [0.00s].
## writing ... [0 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
summary(reglas.asociacion)
## set of 0 rules
inspect(reglas.asociacion)

# Ordenar reglas de asociacion
reglas.asociacion <- sort(reglas.asociacion, by="confidence", decreasing=TRUE)

# Graficar TOP10 de Reglas de asociacion
top10reglas <- head(reglas.asociacion, n=10, by="confidence")
# plot(top10reglas, method ="graph", engine ="htmlwidget")

#Conclusiones

En esta actividad lo que mas llama la atencion fueron las fallas de asociacion de reglas y de el count, pues solo fueron pocas personas las que experimentaron fallas con el codigo y se desconoce la razon.

Igual es importante recalcar que tenemos que hacer el trabajo estructurado y correr las lineas mientras se realiza para confirmar que todo este bien.

En esta actividad igual se nos enseño como hacer graficas y como interpretarlas despues de limpiar una base de datos. Tambien, pues se nos enseño a como descargar, limpiar, y exportar una base de datos.

Finalmente, al momento de ver la base de datos, aprendi a identificar y ajustar los datos que tienen que ir de manera numerica.

LS0tCnRpdGxlOiAiTUJBIgphdXRob3I6ICJtYXlhIGEwMTcyMjUwOCIKZGF0ZTogIjIwMjUtMDMtMTkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogInlldGkiCi0tLQoKIVtdKGh0dHBzOi8vbWVkaWEyLmdpcGh5LmNvbS9tZWRpYS92MS5ZMmxrUFRjNU1HSTNOakV4ZURZMWRUZGthbVZ1Tm1kc1pUTjZZWGw2WW1sallXNXRhbVpyTld4a05uTm1hV3B0WTNocWJpWmxjRDEyTVY5cGJuUmxjbTVoYkY5bmFXWmZZbmxmYVdRbVkzUTlady8zbzdXSXVVaWIzN0RsU2FnOHcvZ2lwaHkuZ2lmKQoKIyBpbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXJpYXMKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCmxpYnJhcnkodGlkeXZlcnNlKQojaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQpsaWJyYXJ5IChkcGx5cikKI2luc3RhbGwucGFja2FnZXMoImx1YnJpZGF0ZSIpCmxpYnJhcnkobHVicmlkYXRlKQojaW5zdGFsbC5wYWNrYWdlcygiTWF0cml4IikKbGlicmFyeShNYXRyaXgpCiNpbnN0YWxsLnBhY2thZ2VzKCJhcnVsZXMiKQpsaWJyYXJ5KGFydWxlcykKI2luc3RhbGwucGFja2FnZXMoImFydWxlc1ZpeiIpCmxpYnJhcnkoYXJ1bGVzVml6KQojaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKQpsaWJyYXJ5KGRhdGFzZXRzKQojIGluc3RhbGwucGFja2FnZXMgKCJwbHlyIikKbGlicmFyeSAocGx5cikKYGBgCgojIEltcG9ydGFyIGxhIGJhc2UgZGUgZGF0b3MKYGBge3J9CiNmaWxlLmNob29zZSgpCmJkIDwtIHJlYWQuY3N2KCIvVXNlcnMvbWF5YS9Eb3dubG9hZHMvYWJhcnJvdGVzLmNzdiIpCmBgYAoKIyBFbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zCmBgYHtyfQpzdW1tYXJ5KGJkKQpzdHIoYmQpCmhlYWQoYmQsbj0xMCkKdGFpbChiZCxuPTEwKQpgYGAKYGBge3J9CiMgZHBseXIgOjogY291bnQoYmQsdmNDbGF2ZVRpZW5kYSwgc29ydD1UUlVFKQojIGRwbHlyIDo6IGNvdW50KGJkLERlc2NHaXJvLCBzb3J0PVRSVUUpCiMgZHBseXIgOjogY291bnQoYmQsRmVjaGEsIHNvcnQ9VFJVRSkKIyBkcGx5ciA6OiBjb3VudChiZCxIb3JhLCBzb3J0PVRSVUUpCiMgZHBseXIgOjogY291bnQoYmQsTWFyY2EsIHNvcnQ9VFJVRSkKIyBkcGx5ciA6OiBjb3VudChiZCxGYWJyaWNhbnRlLCBzb3J0PVRSVUUpCiMgZHBseXIgOjogY291bnQoYmQsTm9tYnJlRGVwYXJ0YW1lbnRvLCBzb3J0PVRSVUUpCiMgZHBseXIgOjogY291bnQoYmQsTm9tYnJlRmFtaWxpYSwgc29ydD1UUlVFKQojIGRwbHlyIDo6IGNvdW50KGJkLE5vbWJyZUNhdGVnb3JpYSwgc29ydD1UUlVFKQojIGRwbHlyIDo6IGNvdW50KGJkLEVzdGFkbywgc29ydD1UUlVFKQojIGRwbHlyIDo6IGNvdW50KGJkLFRpcG8udWJpY2FjacOzbiwgc29ydD1UUlVFKQojIGRwbHlyIDo6IGNvdW50KGJkLEdpcm8sIHNvcnQ9VFJVRSkKIyBkcGx5ciA6OiBjb3VudChiZCxIb3JhLmluaWNpbywgc29ydD1UUlVFKQojIGRwbHlyIDo6IGNvdW50KGJkLEhvcmEuY2llcnJlLCBzb3J0PVRSVUUpCmBgYAoKIyBMaWFtcGlhciBsYSBiYXNlIGRlIGRhdG9zCgojI1RlY25pY2EgMS4gRWxpbWluYXIgdmFsb3JlcyBpcmVlbGV2YW50ZXMKYGBge3J9CiMgRWxpbWluYXIgY29sdW1uYXMKYmQxIDwtIGJkCmJkMSA8LSBzdWJzZXQoYmQxLCBzZWxlY3QgPSAtYyhQTFUsIENvZGlnby5CYXJyYXMpKQoKIyBFbGltaW5hciByZW5nbG9uZXMKYmQyIDwtIGJkMQpiZDIgPC0gYmQyW2JkMiRQcmVjaW8gPiAwLCBdCnN1bW1hcnkgKGJkMSRQcmVjaW8pCnN1bW1hcnkgKGJkMiRQcmVjaW8pCmBgYAoKIyNUZWNuaWNhIDIuIFJlbW92ZXIgdmFsb3JlcyBkdXBsaWNhZG9zCmBgYHtyfQojIMK/Q3VhbnRvcyByZW5nb2xlcyBkdXBsaWNhZG9zIHRlbmVtb3M/CnN1bShkdXBsaWNhdGVkKGJkMikpCgojIMK/Q3VhbGVzIHNvbiBsb3MgcmVuZ29sbmVzIGR1cGxpY2Fkb3M/CmJkMltkdXBsaWNhdGVkKGJkMiksXQoKIyBFbGltaW5hciByZW5nbG9uZXMgZHVwbGljYWRvcwpiZDMgPC0gYmQyCmJkMyA8LSBkaXN0aW5jdCAoYmQzKQpgYGAKCiMjVGVjbmljYSAzLiBFbGltaW5hciBsb3MgZXJyb3JlcyB0aXBvZ3JhZmljb3MgeSBzaW1pbGFyZXMKYGBge3J9CiMgQ2FudGlkYWRlcyBlbiBlbnRlcm9zCmJkNCA8LSBiZDMKYmQ0JFVuaWRhZGVzIDwtIGNlaWxpbmcoYmQ0JFVuaWRhZGVzKQpgYGAKCiMjVGVjbmljYSA0LiBDb252ZXJ0aXIgdGlwb3MgZGUgZGF0b3MgCmBgYHtyfQojIENvbnZlcnRpciBkZSBjYXJhY3RlciBhIGZlY2hhCmJkNSA8LSBiZDQgCmJkNSRGZWNoYSA8LSBhcy5EYXRlKGJkNSRGZWNoYSwgZm9ybWF0PSIlZC8lbS8lWSIpCgojIENvbnZlcnRpciBkZSBjYXJhY3RlciBhIGVudGVybwpiZDYgPC0gYmQ1CmJkNiRIb3JhIDwtIHN1YnN0ciAoYmQ2JEhvcmEsIHN0YXJ0PTEsIHN0b3A9MikKYmQ2JEhvcmEgPC0gYXMuaW50ZWdlcihiZDYkSG9yYSkKYGBgCgojI1RlY25pY2EgNS4gUmVlbXBsYXphciBudmFsb3IgZmFsdGFudGVzCmBgYHtyfQojIMK/Q3VhbnRvcyBOQXMgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8Kc3VtKGlzLm5hKGJkNikpCnN1bShpcy5uYShiZCkpCgojIMK/Q3VhbnRvcyBOQXMgdGVuZ28gcG9yIHZhcmlhYmxlPwpzYXBwbHkoYmQsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCgojIE9wY2lvbiAxLiBCb3JyYXIgdG9kb3MgbG9zIE5BcyBkZSB1bmEgdGFibGEKIyBiZDEwMCA8LSBuYS5vbWl0KGJkKQoKIyBPcGNpb24uIFJlZW1wbGF6YXIgbG9zIE5BcyBjb24gQ0VST1MKIyBiZDEwMSA8LSBiZAojIGJkMTAxW2lzLm5hKGJkMTAxKV08LTAKCiMgT3BjaW9uIDMuIFJlZW1wbGF6YXIgTkFzIGNvbiBwcm9tCiMgYmQxMDIgPC0gYmQKIyBiZDEwMiRQTFVbaXMubmEoYmQxMDEkUExVKV08LW1lYW4oYmQxMDIkUExVLCBuYS5ybT1UUlVFKQpgYGAKCiMjVGVjbmljYSA2LiBDb3JyZWNjaW9uZXMgcG9yIG1ldG9kb3MgZXN0YWRpc3RpY29zCmBgYHtyfQpib3hwbG90KGJkNiRQcmVjaW8sIGhvcml6b250YWw9VFJVRSkKYm94cGxvdChiZDYkVW5pZGFkZXMsIGhvcml6b250YWw9VFJVRSkKYGBgCiMgQWdyZWdhciBjb2x1bW5hcwpgYGB7cn0KIyBBZ3JlZ2FyIGRpYSBkZSBsYSBzZW1hbmEKYmQ2JERpYV9TZW1hbmEgPC0gd2RheShiZDYkRmVjaGEpCgojQWdyZWdhciBlbCBzdWJ0b3RhbCBkZSBsYSB2ZW50YQpiZDYkU3VidG90YWwgPC0gYmQ2JFByZWNpbyAqIGJkNiRVbmlkYWRlcwpgYGAKCiMgRXhwb3J0YXIgbGEgYmFzZSBkZSBkYXRvcyAKYGBge3J9CiMgd3JpdGUuY3N2KGJkNiwgZmlsZT0iYWJhcnJvdGVzX2xpbXBpYS5jc3YiLCByb3cubmFtZXM9RkFMU0UpCmBgYAoKIyBHZW5lcmFyIE1hcmtldCBCYXNrZXQgQW5hbHlzaXMKYGBge3J9CiMgb3JkZW5hciBkZSBtZW5vciBhIG1heW9yIGxhIGNvbHVtbmEgdGlja2V0CmJkNyA8LSBiZDYKYmQ3IDwtIGJkN1tvcmRlcihiZDckRi5UaWNrZXQpLF0KCiMgR2VuZXJhciBlbCBjYW5hc3RvCmJhc2tldCA8LSBkZHBseShiZDcsYygiRi5UaWNrZXQiKSwgZnVuY3Rpb24oYmQ3KXBhc3RlKGJkNyRNYXJjYSxjb2xsYXBzZSA9IiwiKSkKCiMgRWxpbWluYXIgbGEgY29sdW1uYSB0aWNrZXQKYmFza2V0JEYuVGlja2V0IDwtIE5VTEwgCgojIFJlbm9tYnJhciBub21icmUgZGUgY29sdW1uYSBhIE1hcmNhCmNvbG5hbWVzKGJhc2tldCkgPC0gYygiTWFyY2EiKQoKIyBFeHBvcnRhciBiYXNrZXQKd3JpdGUuY3N2KGJhc2tldCwgZmlsZT0iYmFza2V0LmNzdiIsIHJvdy5uYW1lcz1GQUxTRSkKCiMgSW1wb3J0YXIgdHJhbnNhY2Npb25lcwojIGZpbGUuY2hvb3NlKCkKdHIgPC0gcmVhZC50cmFuc2FjdGlvbnMoIi9Vc2Vycy9tYXlhL2Jhc2tldC5jc3YiLCBmb3JtYXQgPSAiYmFza2V0Iiwgc2VwID0gIiwiKQoKIyBHZW5lcmFyIHJlZ2xhcyBkZSBhc29jaWFjaW9uCnJlZ2xhcy5hc29jaWFjaW9uIDwtIGFwcmlvcmkodHIscGFyYW1ldGVyID0gbGlzdChzdXBwPTAuMDAxLGNvbmY9MC4yLG1heGxlbj0xMCkpCnN1bW1hcnkocmVnbGFzLmFzb2NpYWNpb24pCmluc3BlY3QocmVnbGFzLmFzb2NpYWNpb24pCgojIE9yZGVuYXIgcmVnbGFzIGRlIGFzb2NpYWNpb24KcmVnbGFzLmFzb2NpYWNpb24gPC0gc29ydChyZWdsYXMuYXNvY2lhY2lvbiwgYnk9ImNvbmZpZGVuY2UiLCBkZWNyZWFzaW5nPVRSVUUpCgojIEdyYWZpY2FyIFRPUDEwIGRlIFJlZ2xhcyBkZSBhc29jaWFjaW9uCnRvcDEwcmVnbGFzIDwtIGhlYWQocmVnbGFzLmFzb2NpYWNpb24sIG49MTAsIGJ5PSJjb25maWRlbmNlIikKIyBwbG90KHRvcDEwcmVnbGFzLCBtZXRob2QgPSJncmFwaCIsIGVuZ2luZSA9Imh0bWx3aWRnZXQiKQpgYGAKIVtdKC9Vc2Vycy9tYXlhL0Rlc2t0b3AvY2xhc2UucG5nKQojQ29uY2x1c2lvbmVzCgpFbiBlc3RhIGFjdGl2aWRhZCBsbyBxdWUgbWFzIGxsYW1hIGxhIGF0ZW5jaW9uIGZ1ZXJvbiBsYXMgZmFsbGFzIGRlIGFzb2NpYWNpb24gZGUgcmVnbGFzIHkgZGUgZWwgY291bnQsIHB1ZXMgc29sbyBmdWVyb24gcG9jYXMgcGVyc29uYXMgbGFzIHF1ZSBleHBlcmltZW50YXJvbiBmYWxsYXMgY29uIGVsIGNvZGlnbyB5IHNlIGRlc2Nvbm9jZSBsYSByYXpvbi4KCklndWFsIGVzIGltcG9ydGFudGUgcmVjYWxjYXIgcXVlIHRlbmVtb3MgcXVlIGhhY2VyIGVsIHRyYWJham8gZXN0cnVjdHVyYWRvIHkgY29ycmVyIGxhcyBsaW5lYXMgbWllbnRyYXMgc2UgcmVhbGl6YSBwYXJhIGNvbmZpcm1hciBxdWUgdG9kbyBlc3RlIGJpZW4uCgpFbiBlc3RhIGFjdGl2aWRhZCBpZ3VhbCBzZSBub3MgZW5zZcOxbyBjb21vIGhhY2VyIGdyYWZpY2FzIHkgY29tbyBpbnRlcnByZXRhcmxhcyBkZXNwdWVzIGRlIGxpbXBpYXIgdW5hIGJhc2UgZGUgZGF0b3MuIFRhbWJpZW4sIHB1ZXMgc2Ugbm9zIGVuc2XDsW8gYSBjb21vIGRlc2NhcmdhciwgbGltcGlhciwgeSBleHBvcnRhciB1bmEgYmFzZSBkZSBkYXRvcy4KCkZpbmFsbWVudGUsIGFsIG1vbWVudG8gZGUgdmVyIGxhIGJhc2UgZGUgZGF0b3MsIGFwcmVuZGkgYSBpZGVudGlmaWNhciB5IGFqdXN0YXIgbG9zIGRhdG9zIHF1ZSB0aWVuZW4gcXVlIGlyIGRlIG1hbmVyYSBudW1lcmljYS4gIAoK