Teoría

El MARKET bASKET Analysis es una técnica en el ámbito de análisis y minería de datos en el campo del comercio. Su objetivo principal es descubrir patrones de asociación entre productos que suelen ser comprados juntos por los clientes.

Las 3 métricas principales para evaluar reglas de asociación son:

  • *Confidence (confianza): Probabilidad de comprar B sabiendo que se compró A. Ej. Pan –> Mantequilla 0.8 de cada 100 clientes que compraron pan, 80 compraron mantequilla también.
  • Lift (Elevación) : Cuánto más probable es comprar B cuando se compra A en comparación de la probabilidad de comprar B sin saber si se compró A. Ej. Lift > 1 Compra A impulsa B. Lift = 1 No tienen relación de compra. Lift < 1 A reduce la compra de B.
  • *Support¨(Soporte): Popularidad del producto dentro de las transacciones. Ej. Pan y Mantequilla 0.05 El 5% de todas las transacciones comrparon estos dos productos juntos.

Contexto

Una cadena de tiendas de conveniencia tiene 5 tiendas ubicadas en en distintas ciudades de México. La base de datos “abarrotes” contiene 1 mes de transacciones, pero presenta errores de calidad que impiden realizar análisis confiables. El objetivo es limpiar la base de datos de forma estratégica y posteriormente aplicar MBA para descubrir patrones de compra y diseñar promociones que aumenten las ventas.

Instalar paquetes y llamar librerias

#install.packages("tidyverse") #Paquete global para manipulación y
#análisis de datos
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
#install.packages("janitor") #Examinar y limpiar bases de datos sucias
library (janitor)
## 
## Adjuntando el paquete: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
#install.packages("Matrix") #Para trabajar con matrices
library (Matrix)
## 
## Adjuntando el paquete: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
#install.packages("arules") #Genera reglas de asociación
library (arules)
## 
## Adjuntando el paquete: 'arules'
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
#install.packages("arulesViz") #Visualizar reglas de asociación
library (arulesViz)
#install.packages("plyr") #Visualizar reglas de asociación
library (plyr)
## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
## 
## Adjuntando el paquete: 'plyr'
## 
## The following objects are masked from 'package:dplyr':
## 
##     arrange, count, desc, mutate, rename, summarise, summarize
## 
## The following object is masked from 'package:purrr':
## 
##     compact
#install.packages("dplyr") #Visualizar reglas de asociación
library (dplyr)

Importar la base de datos

#file.choose()
df <-read.csv("C:/Users/sarah/Downloads/abarrotes.csv")

Entender la base de datos

summary(df)
##     ClaveTienda          DescGiro      Codigo.Barras            PLU        
##  Length   :200625   Length   :200625   Min.   :8.347e+05   Min.   : 1.000  
##  N.unique :     5   N.unique :     3   1st Qu.:7.501e+12   1st Qu.: 1.000  
##  N.blank  :     0   N.blank  :     0   Median :7.501e+12   Median : 1.000  
##  Min.nchar:     5   Min.nchar:     8   Mean   :5.950e+12   Mean   : 2.112  
##  Max.nchar:     5   Max.nchar:    10   3rd Qu.:7.501e+12   3rd Qu.: 1.000  
##                                        Max.   :1.750e+13   Max.   :30.000  
##                                                            NAs    :199188  
##        Fecha               Hora              Marca            Fabricante    
##  Length   :200625   Length   :200625   Length   :200625   Length   :200625  
##  N.unique :   195   N.unique : 52145   N.unique :   540   N.unique :   241  
##  N.blank  :     0   N.blank  :     0   N.blank  :     0   N.blank  :     0  
##  Min.nchar:    10   Min.nchar:     8   Min.nchar:     3   Min.nchar:     3  
##  Max.nchar:    10   Max.nchar:     8   Max.nchar:    30   Max.nchar:    40  
##                                                                             
##                                                                             
##       Producto          Precio          Ult.Costo         Unidades     
##  Length   :200625   Min.   :-147.00   Min.   :  0.38   Min.   : 0.200  
##  N.unique :  3406   1st Qu.:  11.00   1st Qu.:  8.46   1st Qu.: 1.000  
##  N.blank  :     0   Median :  16.00   Median : 12.31   Median : 1.000  
##  Min.nchar:     4   Mean   :  19.42   Mean   : 15.31   Mean   : 1.262  
##  Max.nchar:    40   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   N.unique :     9   N.unique :    51   N.unique :   174  
##  Median :105993   N.blank  :     0   N.blank  :     0   N.blank  :     0  
##  Mean   :193990   Min.nchar:     6   Min.nchar:     3   Min.nchar:     2  
##  3rd Qu.:383005   Max.nchar:    20   Max.nchar:    25   Max.nchar:    37  
##  Max.   :450040                                                           
##                                                                           
##        Estado           Mts.2        Tipo.ubicación          Giro       
##  Length   :200625   Min.   :47.0   Length   :200625   Length   :200625  
##  N.unique :     5   1st Qu.:53.0   N.unique :     3   N.unique :     2  
##  N.blank  :     0   Median :60.0   N.blank  :     0   N.blank  :     0  
##  Min.nchar:     7   Mean   :56.6   Min.nchar:     7   Min.nchar:     9  
##  Max.nchar:    12   3rd Qu.:60.0   Max.nchar:    12   Max.nchar:    10  
##                     Max.   :62.0                                        
##                                                                         
##     Hora.inicio        Hora.cierre    
##  Length   :200625   Length   :200625  
##  N.unique :     3   N.unique :     3  
##  N.blank  :     0   N.blank  :     0  
##  Min.nchar:     5   Min.nchar:     5  
##  Max.nchar:     5   Max.nchar:     5  
##                                       
## 
str(df)
## 'data.frame':    200625 obs. of  22 variables:
##  $ ClaveTienda       : 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" ...
#count(df, ClaveTienda, sort=TRUE)
#count(df, Codigo.Barras, sort=TRUE)
#count(df, DescGiro, sort=TRUE)
#count(df, Fecha, sort=TRUE)
#count(df, Fabricante, sort=TRUE)
#count(df, Hora, sort=TRUE)
#count(df, Marca, sort=TRUE)
#count(df, Fabricante, sort=TRUE)
#count(df, Producto, sort=TRUE)
#count(df, NombreDepartamento, sort=TRUE)
#count(df, NombreFamilia, sort=TRUE)
#count(df, NombreCategoria, sort=TRUE)
#count(df, Estado, sort=TRUE)
#count(df, Tipo.ubicación, sort=TRUE)
#count(df, Giro, sort=TRUE)
#count(df, Hora.inicio, sort=TRUE)
#count(df, Hora.cierre, sort=TRUE)
#head(df,10)
#tail(df,10)

#Tabla de Tienda y Departamento
tabyl(df, ClaveTienda, NombreDepartamento)
##  ClaveTienda Abarrotes Bebes e Infantiles Carnes Farmacia Ferretería Mercería
##        MX001     95415                515      1      147        245       28
##        MX002      6590                 21      0        4         10        0
##        MX003      4026                 15      0        2          8        0
##        MX004     82234                932      0      102        114       16
##        MX005     10014                  0      0        0          0        0
##  Papelería Productos a Eliminar Vinos y Licores
##         35                    3              80
##          0                    0               4
##          0                    0               0
##         32                    5              20
##          7                    0               0
#Tabla de Estado y Hora de Inicio
tabyl(df, Estado, Hora.inicio)
##        Estado 07:00 08:00 09:00
##       Chiapas  4051     0     0
##       Jalisco     0     0  6629
##    Nuevo León     0 96469     0
##  Quintana Roo     0 10021     0
##       Sinaloa 83455     0     0

Limpiar la base de datos

Técnica 1. Eliminar valores irrelevantes

#Eliminar columnas
df <-subset(df, select=-c(PLU)) #TE EXTRAE LO QUE QUIERES EXTRAER LO QUE QUIERAS DE UNA TABLA, AQUI ES TODAS MENOS PLU

#Eliminar renglones
df <- df[df$Precio>0, ] #la primera parte son los rengloe sy luego las columnas

Técnica 2. Eliminar valores repetidos

df <- distinct(df)

Técnica 3. Corregir errores tipográficos y similares

df$Unidades <- ceiling(df$Unidades)

Técnica 4. Convertir tipos de datos

df$Fecha <- as.Date(df$Fecha, format= "%d/%m/%Y")

Técnica 5. Tratar valores faltantes

#Borrar todos los NA´s 
#df <- na.omit(df)

#Reemplazar los NA´S con CEROS
#df[is.na(df)] <- 0

#Reemplazar los NA´s con el PROMEDIO
#df$altura[is.na(df$altura)] <- mean(df$altura, na.rn=TRUE)

Técnica 6. Herramientas Estadísticas

boxplot(df$Precio, horizontal = TRUE)

boxplot(df$Unidades, horizontal = TRUE)

# Generar Masket

str(df)
## 'data.frame':    200473 obs. of  21 variables:
##  $ ClaveTienda       : 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 ...
##  $ Fecha             : Date, format: "2020-06-19" "2020-06-19" ...
##  $ 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 9.5 11 9.5 23.5 12 ...
##  $ 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 4 4 4 4 5 ...
##  $ 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" ...
"F.Ticket" %in% colnames(df)
## [1] TRUE
class(df$F.Ticket)
## [1] "integer"
#Ordenar de menor a mayor la columna Ticket
df <- df[order(df$F.Ticket), ]

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

#Eliminar número de ticket
basket$F.Ticket <-NULL

#Cambiar el título de la columna V1 por Marca
colnames(basket) <- c("Marca")

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

Market Masket Analysis

#file.choose()
tr <- read.transactions("C:/Users/sarah/Desktop/basket.csv", format = "basket", sep= ",")
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in asMethod(object): removing duplicated items in transactions
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 ...[604 item(s), 115031 transaction(s)] done [0.05s].
## sorting and recoding items ... [207 item(s)] done [0.00s].
## creating transaction tree ... done [0.07s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [11 rule(s)] done [0.00s].
## creating S4 object  ... done [0.01s].
#summary(reglas.asociacion)
#inspect(reglas.asociacion)

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

top10reglas <- head(reglas.asociacion, n=10, by="confidence")
plot(top10reglas, method="graph", engine="htmlwidget")
LS0tDQp0aXRsZTogIk1hcmtldCBCYXNrZXQgQW5hbHlzaXMtIEFiYXJyb3RlcyINCmF1dGhvcjogIlNhcmFoaSBNYWNpYXMgUnViaW8tIEEwMTc0Mjc5MSINCmRhdGU6ICIxOS8wOC8yMDI2Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IGNvc21vDQotLS0NCiFbXShodHRwczovL21lZGlhLmdpcGh5LmNvbS9tZWRpYS92MS5ZMmxrUFdWalpqQTFaVFEzYVhKcU5UTnFObTlwZVdoNGRYWXliMk00Y3pOeGFHSnVjbkowZFRFNWFIUjBkM1pwYmpFeVl5WmxjRDEyTVY5bmFXWnpYM05sWVhKamFDWmpkRDFuL0h2SzIyaXU4VnBuaU1LR1RTbi9naXBoeS5naWYpDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPlRlb3LDrWE8L3NwYW4+DQpFbCAqKk1BUktFVCBiQVNLRVQgQW5hbHlzaXMqKiBlcyB1bmEgdMOpY25pY2EgZW4gZWwgw6FtYml0byBkZQ0KYW7DoWxpc2lzIHkgbWluZXLDrWEgZGUgZGF0b3MgZW4gZWwgY2FtcG8gZGVsIGNvbWVyY2lvLg0KU3Ugb2JqZXRpdm8gcHJpbmNpcGFsIGVzIGRlc2N1YnJpciBwYXRyb25lcyBkZSBhc29jaWFjacOzbiBlbnRyZSBwcm9kdWN0b3MgcXVlDQpzdWVsZW4gc2VyIGNvbXByYWRvcyBqdW50b3MgcG9yIGxvcyBjbGllbnRlcy4gDQoNCkxhcyAzIG3DqXRyaWNhcyBwcmluY2lwYWxlcyBwYXJhIGV2YWx1YXIgcmVnbGFzIGRlIGFzb2NpYWNpw7NuIHNvbjogDQoNCg0KKiAqQ29uZmlkZW5jZSAoY29uZmlhbnphKTogUHJvYmFiaWxpZGFkIGRlIGNvbXByYXIgQiBzYWJpZW5kbw0KcXVlIHNlIGNvbXByw7MgQS4gRWouIFBhbiAtLT4gTWFudGVxdWlsbGEgMC44IGRlIGNhZGEgMTAwIGNsaWVudGVzDQpxdWUgY29tcHJhcm9uIHBhbiwgODAgY29tcHJhcm9uIG1hbnRlcXVpbGxhIHRhbWJpw6luLiANCiogKkxpZnQqIChFbGV2YWNpw7NuKSA6ICBDdcOhbnRvIG3DoXMgcHJvYmFibGUgZXMgY29tcHJhciBCIGN1YW5kbyBzZSANCmNvbXByYSBBIGVuIGNvbXBhcmFjacOzbiBkZSBsYSBwcm9iYWJpbGlkYWQgZGUgY29tcHJhciBCIHNpbiBzYWJlcg0Kc2kgc2UgY29tcHLDsyBBLiBFai4gTGlmdCA+IDEgQ29tcHJhIEEgaW1wdWxzYSBCLiBMaWZ0ID0gMSBObyANCnRpZW5lbiByZWxhY2nDs24gZGUgY29tcHJhLiBMaWZ0IDwgMSBBIHJlZHVjZSBsYSBjb21wcmEgZGUgQi4NCiogKlN1cHBvcnTCqChTb3BvcnRlKTogUG9wdWxhcmlkYWQgZGVsIHByb2R1Y3RvIGRlbnRybyBkZSBsYXMNCnRyYW5zYWNjaW9uZXMuIEVqLiBQYW4geSBNYW50ZXF1aWxsYSAwLjA1IEVsIDUlIGRlIHRvZGFzIGxhcw0KdHJhbnNhY2Npb25lcyBjb21ycGFyb24gZXN0b3MgZG9zIHByb2R1Y3RvcyBqdW50b3MuDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+Q29udGV4dG88L3NwYW4+DQpVbmEgY2FkZW5hIGRlIHRpZW5kYXMgZGUgY29udmVuaWVuY2lhIHRpZW5lIDUgdGllbmRhcyB1YmljYWRhcyBlbiANCmVuIGRpc3RpbnRhcyBjaXVkYWRlcyBkZSBNw6l4aWNvLiBMYSBiYXNlIGRlIGRhdG9zICJhYmFycm90ZXMiDQpjb250aWVuZSAxIG1lcyBkZSB0cmFuc2FjY2lvbmVzLCBwZXJvIHByZXNlbnRhIGVycm9yZXMgZGUgY2FsaWRhZA0KcXVlIGltcGlkZW4gcmVhbGl6YXIgYW7DoWxpc2lzIGNvbmZpYWJsZXMuIEVsIG9iamV0aXZvIGVzIGxpbXBpYXIgDQpsYSBiYXNlIGRlIGRhdG9zIGRlIGZvcm1hIGVzdHJhdMOpZ2ljYSB5IHBvc3Rlcmlvcm1lbnRlIGFwbGljYXIgDQpNQkEgcGFyYSBkZXNjdWJyaXIgcGF0cm9uZXMgZGUgY29tcHJhIHkgZGlzZcOxYXIgcHJvbW9jaW9uZXMgcXVlIA0KYXVtZW50ZW4gbGFzIHZlbnRhcy4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5JbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXJpYXM8L3NwYW4+DQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpICNQYXF1ZXRlIGdsb2JhbCBwYXJhIG1hbmlwdWxhY2nDs24geQ0KI2Fuw6FsaXNpcyBkZSBkYXRvcw0KbGlicmFyeSh0aWR5dmVyc2UpDQojaW5zdGFsbC5wYWNrYWdlcygiamFuaXRvciIpICNFeGFtaW5hciB5IGxpbXBpYXIgYmFzZXMgZGUgZGF0b3Mgc3VjaWFzDQpsaWJyYXJ5IChqYW5pdG9yKQ0KI2luc3RhbGwucGFja2FnZXMoIk1hdHJpeCIpICNQYXJhIHRyYWJhamFyIGNvbiBtYXRyaWNlcw0KbGlicmFyeSAoTWF0cml4KQ0KI2luc3RhbGwucGFja2FnZXMoImFydWxlcyIpICNHZW5lcmEgcmVnbGFzIGRlIGFzb2NpYWNpw7NuDQpsaWJyYXJ5IChhcnVsZXMpDQojaW5zdGFsbC5wYWNrYWdlcygiYXJ1bGVzVml6IikgI1Zpc3VhbGl6YXIgcmVnbGFzIGRlIGFzb2NpYWNpw7NuDQpsaWJyYXJ5IChhcnVsZXNWaXopDQojaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpICNWaXN1YWxpemFyIHJlZ2xhcyBkZSBhc29jaWFjacOzbg0KbGlicmFyeSAocGx5cikNCiNpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpICNWaXN1YWxpemFyIHJlZ2xhcyBkZSBhc29jaWFjacOzbg0KbGlicmFyeSAoZHBseXIpDQpgYGANCg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPkltcG9ydGFyIGxhIGJhc2UgZGUgZGF0b3M8L3NwYW4+DQpgYGB7cn0NCiNmaWxlLmNob29zZSgpDQpkZiA8LXJlYWQuY3N2KCJDOi9Vc2Vycy9zYXJhaC9Eb3dubG9hZHMvYWJhcnJvdGVzLmNzdiIpDQpgYGANCg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPkVudGVuZGVyIGxhIGJhc2UgZGUgZGF0b3M8L3NwYW4+DQpgYGB7cn0NCnN1bW1hcnkoZGYpDQpzdHIoZGYpDQojY291bnQoZGYsIENsYXZlVGllbmRhLCBzb3J0PVRSVUUpDQojY291bnQoZGYsIENvZGlnby5CYXJyYXMsIHNvcnQ9VFJVRSkNCiNjb3VudChkZiwgRGVzY0dpcm8sIHNvcnQ9VFJVRSkNCiNjb3VudChkZiwgRmVjaGEsIHNvcnQ9VFJVRSkNCiNjb3VudChkZiwgRmFicmljYW50ZSwgc29ydD1UUlVFKQ0KI2NvdW50KGRmLCBIb3JhLCBzb3J0PVRSVUUpDQojY291bnQoZGYsIE1hcmNhLCBzb3J0PVRSVUUpDQojY291bnQoZGYsIEZhYnJpY2FudGUsIHNvcnQ9VFJVRSkNCiNjb3VudChkZiwgUHJvZHVjdG8sIHNvcnQ9VFJVRSkNCiNjb3VudChkZiwgTm9tYnJlRGVwYXJ0YW1lbnRvLCBzb3J0PVRSVUUpDQojY291bnQoZGYsIE5vbWJyZUZhbWlsaWEsIHNvcnQ9VFJVRSkNCiNjb3VudChkZiwgTm9tYnJlQ2F0ZWdvcmlhLCBzb3J0PVRSVUUpDQojY291bnQoZGYsIEVzdGFkbywgc29ydD1UUlVFKQ0KI2NvdW50KGRmLCBUaXBvLnViaWNhY2nDs24sIHNvcnQ9VFJVRSkNCiNjb3VudChkZiwgR2lybywgc29ydD1UUlVFKQ0KI2NvdW50KGRmLCBIb3JhLmluaWNpbywgc29ydD1UUlVFKQ0KI2NvdW50KGRmLCBIb3JhLmNpZXJyZSwgc29ydD1UUlVFKQ0KI2hlYWQoZGYsMTApDQojdGFpbChkZiwxMCkNCg0KI1RhYmxhIGRlIFRpZW5kYSB5IERlcGFydGFtZW50bw0KdGFieWwoZGYsIENsYXZlVGllbmRhLCBOb21icmVEZXBhcnRhbWVudG8pDQoNCiNUYWJsYSBkZSBFc3RhZG8geSBIb3JhIGRlIEluaWNpbw0KdGFieWwoZGYsIEVzdGFkbywgSG9yYS5pbmljaW8pDQoNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPkxpbXBpYXIgbGEgYmFzZSBkZSBkYXRvczwvc3Bhbj4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5Uw6ljbmljYSAxLiBFbGltaW5hciB2YWxvcmVzIGlycmVsZXZhbnRlczwvc3Bhbj4NCmBgYHtyfQ0KI0VsaW1pbmFyIGNvbHVtbmFzDQpkZiA8LXN1YnNldChkZiwgc2VsZWN0PS1jKFBMVSkpICNURSBFWFRSQUUgTE8gUVVFIFFVSUVSRVMgRVhUUkFFUiBMTyBRVUUgUVVJRVJBUyBERSBVTkEgVEFCTEEsIEFRVUkgRVMgVE9EQVMgTUVOT1MgUExVDQoNCiNFbGltaW5hciByZW5nbG9uZXMNCmRmIDwtIGRmW2RmJFByZWNpbz4wLCBdICNsYSBwcmltZXJhIHBhcnRlIHNvbiBsb3MgcmVuZ2xvZSBzeSBsdWVnbyBsYXMgY29sdW1uYXMNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlTDqWNuaWNhIDIuIEVsaW1pbmFyIHZhbG9yZXMgcmVwZXRpZG9zPC9zcGFuPg0KYGBge3J9DQpkZiA8LSBkaXN0aW5jdChkZikNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlTDqWNuaWNhIDMuIENvcnJlZ2lyIGVycm9yZXMgdGlwb2dyw6FmaWNvcyB5IHNpbWlsYXJlczwvc3Bhbj4NCmBgYHtyfQ0KZGYkVW5pZGFkZXMgPC0gY2VpbGluZyhkZiRVbmlkYWRlcykNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlTDqWNuaWNhIDQuIENvbnZlcnRpciB0aXBvcyBkZSBkYXRvczwvc3Bhbj4NCmBgYHtyfQ0KZGYkRmVjaGEgPC0gYXMuRGF0ZShkZiRGZWNoYSwgZm9ybWF0PSAiJWQvJW0vJVkiKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+VMOpY25pY2EgNS4gVHJhdGFyIHZhbG9yZXMgZmFsdGFudGVzPC9zcGFuPg0KYGBge3J9DQojQm9ycmFyIHRvZG9zIGxvcyBOQcK0cyANCiNkZiA8LSBuYS5vbWl0KGRmKQ0KDQojUmVlbXBsYXphciBsb3MgTkHCtFMgY29uIENFUk9TDQojZGZbaXMubmEoZGYpXSA8LSAwDQoNCiNSZWVtcGxhemFyIGxvcyBOQcK0cyBjb24gZWwgUFJPTUVESU8NCiNkZiRhbHR1cmFbaXMubmEoZGYkYWx0dXJhKV0gPC0gbWVhbihkZiRhbHR1cmEsIG5hLnJuPVRSVUUpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5Uw6ljbmljYSA2LiBIZXJyYW1pZW50YXMgRXN0YWTDrXN0aWNhczwvc3Bhbj4NCmBgYHtyfQ0KYm94cGxvdChkZiRQcmVjaW8sIGhvcml6b250YWwgPSBUUlVFKQ0KYm94cGxvdChkZiRVbmlkYWRlcywgaG9yaXpvbnRhbCA9IFRSVUUpDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+R2VuZXJhciBNYXNrZXQ8L3NwYW4+DQpgYGB7cn0NCnN0cihkZikNCiJGLlRpY2tldCIgJWluJSBjb2xuYW1lcyhkZikNCmNsYXNzKGRmJEYuVGlja2V0KQ0KI09yZGVuYXIgZGUgbWVub3IgYSBtYXlvciBsYSBjb2x1bW5hIFRpY2tldA0KZGYgPC0gZGZbb3JkZXIoZGYkRi5UaWNrZXQpLCBdDQoNCiNHZW5lcmFyIEJhc2tldA0KYmFza2V0IDwtIGRkcGx5KGRmLCBjKCJGLlRpY2tldCIpLCBmdW5jdGlvbihkZilwYXN0ZShkZiRNYXJjYSwgY29sbGFwc2U9IiwiKSkNCg0KI0VsaW1pbmFyIG7Dum1lcm8gZGUgdGlja2V0DQpiYXNrZXQkRi5UaWNrZXQgPC1OVUxMDQoNCiNDYW1iaWFyIGVsIHTDrXR1bG8gZGUgbGEgY29sdW1uYSBWMSBwb3IgTWFyY2ENCmNvbG5hbWVzKGJhc2tldCkgPC0gYygiTWFyY2EiKQ0KDQojRXhwb3J0YXIgYmFza2V0DQp3cml0ZS5jc3YoYmFza2V0LCAiYmFza2V0LmNzdiIsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5NYXJrZXQgTWFza2V0IEFuYWx5c2lzPC9zcGFuPg0KYGBge3J9DQojZmlsZS5jaG9vc2UoKQ0KdHIgPC0gcmVhZC50cmFuc2FjdGlvbnMoIkM6L1VzZXJzL3NhcmFoL0Rlc2t0b3AvYmFza2V0LmNzdiIsIGZvcm1hdCA9ICJiYXNrZXQiLCBzZXA9ICIsIikNCg0KcmVnbGFzLmFzb2NpYWNpb24gPC0gYXByaW9yaSh0ciwgcGFyYW1ldGVyPWxpc3Qoc3VwcD0wLjAwMSwgY29uZj0wLjIsDQptYXhsZW49MTApKQ0KDQojc3VtbWFyeShyZWdsYXMuYXNvY2lhY2lvbikNCiNpbnNwZWN0KHJlZ2xhcy5hc29jaWFjaW9uKQ0KDQpyZWdsYXMuYXNvY2lhY2lvbiA8LSBzb3J0KHJlZ2xhcy5hc29jaWFjaW9uLCBieT0iY29uZmlkZW5jZSIsIGRlY3JlYXNpbmc9VFJVRSkNCiNzdW1tYXJ5KHJlZ2xhcy5hc29jaWFjaW9uKQ0KI2luc3BlY3QocmVnbGFzLmFzb2NpYWNpb24pDQoNCnRvcDEwcmVnbGFzIDwtIGhlYWQocmVnbGFzLmFzb2NpYWNpb24sIG49MTAsIGJ5PSJjb25maWRlbmNlIikNCnBsb3QodG9wMTByZWdsYXMsIG1ldGhvZD0iZ3JhcGgiLCBlbmdpbmU9Imh0bWx3aWRnZXQiKQ0KDQoNCmBgYA0KDQoNCg0K