R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

#PLOTS (funciona)

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

#EJERCICIO

#file.choose()

poblacion <- read.csv("C:\\Users\\lynet\\OneDrive\\Documents\\Analítica 2023\\poblacion.csv")

#View(poblacion)
N <- length(poblacion$Pago)

#MEDIA

media_poblacional <- mean(poblacion$Pago)

#MUESTRA

muestra <- read.csv("C:\\Users\\lynet\\OneDrive\\Documents\\Analítica 2023\\muestra.csv")

#MEDIA MUESTRAL

media_muestral <- mean(muestra$Pago)

#MEDIA POBLACIONAL

mediana_poblacional <- median(poblacion$Pago)

#MEDIA MUESTRAL

mediana_muestral <- median(muestra$Pago)

#RESUMEN DE POBLACION Y MUESTRA

summary(poblacion)
##      mes                 Pago      
##  Length:12          Min.   :162.6  
##  Class :character   1st Qu.:203.5  
##  Mode  :character   Median :228.6  
##                     Mean   :245.0  
##                     3rd Qu.:293.5  
##                     Max.   :343.5
summary(muestra)
##      mes                 Pago      
##  Length:5           Min.   :187.2  
##  Class :character   1st Qu.:219.4  
##  Mode  :character   Median :230.5  
##                     Mean   :249.4  
##                     3rd Qu.:266.6  
##                     Max.   :343.5

#MODA

moda <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}
moda_muestral <- moda(muestra$Pago)
moda_poblacional <- moda(poblacion$Pago)

#RELACION ENTRE MEDIA, MEDIANA Y MODA

mtc_poblacional <- c(media_poblacional, mediana_poblacional, moda_poblacional)
names(mtc_poblacional) <- c("media_poblacional", "mediana_poblacional", "moda_poblacional")
mtc_poblacional <- sort(mtc_poblacional)
mtc_poblacional
## mediana_poblacional   media_poblacional    moda_poblacional 
##            228.6300            245.0167            266.6300

#HIST

hist(poblacion$Pago)

#RANGO POBLACIONAL

rango_poblacional <- max(poblacion$Pago) - min(poblacion$Pago)

#RANGO MUESTRAL

rango_muestral <- max(muestra$Pago) - min(muestra$Pago)

#VARIANZA POBLACIONAL

varianza_poblacional <- var(poblacion$Pago)*(N-1)/N

#VARIANZA MUESTRAL

varianza_muestral <- var(muestra$Pago)

#DESVIACION ESTANDAR POBLACIONAL

desviación_estandar_poblacional <- sqrt(varianza_poblacional)

#DESVIACION ESTANDAR MUESTRAL)

desviación_estandar_muestral <- sqrt(varianza_muestral)

#ACTIVIDAD

#BASE DATOS (funciona)

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── 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
library(readxl)
df<- read_xlsx("C:\\Users\\lynet\\OneDrive\\Documents\\Analítica 2023\\Abarrotes_Ventas.xlsx")

#RESUMEN DATOS (funciona)

summary(df)
##  vcClaveTienda        DescGiro         Codigo Barras         PLU         
##  Length:200620      Length:200620      Min.   :8.347e+05   Mode:logical  
##  Class :character   Class :character   1st Qu.:7.501e+12   TRUE:1437     
##  Mode  :character   Mode  :character   Median :7.501e+12   NA's:199183   
##                                        Mean   :5.950e+12                 
##                                        3rd Qu.:7.501e+12                 
##                                        Max.   :1.750e+13                 
##      Fecha                             Hora                       
##  Min.   :2020-05-01 00:00:31.08   Min.   :1899-12-31 00:00:00.00  
##  1st Qu.:2020-06-06 13:24:49.08   1st Qu.:1899-12-31 13:12:42.75  
##  Median :2020-07-11 14:10:21.46   Median :1899-12-31 17:35:59.00  
##  Mean   :2020-07-19 15:19:40.65   Mean   :1899-12-31 16:43:52.05  
##  3rd Qu.:2020-08-29 22:07:47.33   3rd Qu.:1899-12-31 20:47:06.00  
##  Max.   :2020-11-11 23:53:47.73   Max.   :1899-12-31 23:59:59.00  
##     Marca            Fabricante          Producto             Precio       
##  Length:200620      Length:200620      Length:200620      Min.   :-147.00  
##  Class :character   Class :character   Class :character   1st Qu.:  11.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :  16.00  
##                                                           Mean   :  19.42  
##                                                           3rd Qu.:  25.00  
##                                                           Max.   :1000.00  
##    Ult.Costo         Unidades         F.Ticket      NombreDepartamento
##  Min.   :  0.38   Min.   : 0.200   Min.   :     1   Length:200620     
##  1st Qu.:  8.46   1st Qu.: 1.000   1st Qu.: 33967   Class :character  
##  Median : 12.31   Median : 1.000   Median :105996   Mode  :character  
##  Mean   : 15.31   Mean   : 1.262   Mean   :193994                     
##  3rd Qu.: 19.23   3rd Qu.: 1.000   3rd Qu.:383009                     
##  Max.   :769.23   Max.   :96.000   Max.   :450040                     
##  NombreFamilia      NombreCategoria       Estado              Mts 2     
##  Length:200620      Length:200620      Length:200620      Min.   :47.0  
##  Class :character   Class :character   Class :character   1st Qu.:53.0  
##  Mode  :character   Mode  :character   Mode  :character   Median :60.0  
##                                                           Mean   :56.6  
##                                                           3rd Qu.:60.0  
##                                                           Max.   :62.0  
##  Tipo ubicación         Giro            Hora inicio                    
##  Length:200620      Length:200620      Min.   :1899-12-31 07:00:00.00  
##  Class :character   Class :character   1st Qu.:1899-12-31 07:00:00.00  
##  Mode  :character   Mode  :character   Median :1899-12-31 08:00:00.00  
##                                        Mean   :1899-12-31 07:35:49.71  
##                                        3rd Qu.:1899-12-31 08:00:00.00  
##                                        Max.   :1899-12-31 09:00:00.00  
##   Hora cierre                    
##  Min.   :1899-12-31 21:00:00.00  
##  1st Qu.:1899-12-31 22:00:00.00  
##  Median :1899-12-31 22:00:00.00  
##  Mean   :1899-12-31 22:23:11.42  
##  3rd Qu.:1899-12-31 23:00:00.00  
##  Max.   :1899-12-31 23:00:00.00
library(dplyr)

#(funciona)

count(df,vcClaveTienda, soft=TRUE)
## # A tibble: 5 × 3
##   vcClaveTienda soft      n
##   <chr>         <lgl> <int>
## 1 MX001         TRUE  96464
## 2 MX002         TRUE   6629
## 3 MX003         TRUE   4051
## 4 MX004         TRUE  83455
## 5 MX005         TRUE  10021
count(df,DescGiro, soft=TRUE)
## # A tibble: 3 × 3
##   DescGiro   soft       n
##   <chr>      <lgl>  <int>
## 1 Abarrotes  TRUE  100515
## 2 Carnicería TRUE   83455
## 3 Depósito   TRUE   16650
count(df,Marca, soft=TRUE)
## # A tibble: 540 × 3
##    Marca              soft      n
##    <chr>              <lgl> <int>
##  1 1-2-3 (ABARROTES)  TRUE    128
##  2 1-2-3 (LAVANDERíA) TRUE    173
##  3 3 EN 1             TRUE      6
##  4 5 ESTRELLAS        TRUE    305
##  5 ABSOR SEC          TRUE    224
##  6 ABUELITA           TRUE     26
##  7 ACE                TRUE    231
##  8 ACT II             TRUE    329
##  9 ACTIVIA            TRUE     37
## 10 ADES               TRUE      6
## # ℹ 530 more rows
count(df,Fabricante, soft=TRUE)
## # A tibble: 241 × 3
##    Fabricante                              soft      n
##    <chr>                                   <lgl> <int>
##  1 3M MEXICO                               TRUE     12
##  2 ABASTECIMIENTOS PLáSTICOS Y ELéCTRICOS, TRUE     55
##  3 ABSORMEX S.A DE C.V                     TRUE    112
##  4 ACEITES GRASAS Y DERIVADOS              TRUE   1016
##  5 ACT II                                  TRUE    329
##  6 AJEMEX                                  TRUE    159
##  7 AJEMONTERREY                            TRUE    129
##  8 ALEN                                    TRUE   2698
##  9 ALIMENTOS CAPULLO                       TRUE    609
## 10 ALIMENTOS DEL FUERTE                    TRUE   2098
## # ℹ 231 more rows
count(df,NombreDepartamento, soft=TRUE)
## # A tibble: 9 × 3
##   NombreDepartamento   soft       n
##   <chr>                <lgl>  <int>
## 1 Abarrotes            TRUE  198274
## 2 Bebes e Infantiles   TRUE    1483
## 3 Carnes               TRUE       1
## 4 Farmacia             TRUE     255
## 5 Ferretería           TRUE     377
## 6 Mercería             TRUE      44
## 7 Papelería            TRUE      74
## 8 Productos a Eliminar TRUE       8
## 9 Vinos y Licores      TRUE     104
count(df,NombreFamilia, soft=TRUE)
## # A tibble: 51 × 3
##    NombreFamilia           soft      n
##    <chr>                   <lgl> <int>
##  1 Accesorios              TRUE    146
##  2 Aceite                  TRUE   1483
##  3 Aderezos                TRUE   1507
##  4 Alcohol                 TRUE     16
##  5 Alimentos               TRUE    810
##  6 Alimentos a Granel      TRUE      1
##  7 Alimentos para Mascotas TRUE    878
##  8 Analgésicos             TRUE      1
##  9 Antigripal              TRUE     57
## 10 Antiácido               TRUE      1
## # ℹ 41 more rows
count(df,NombreCategoria, soft=TRUE)
## # A tibble: 174 × 3
##    NombreCategoria           soft      n
##    <chr>                     <lgl> <int>
##  1 Achiotes                  TRUE    127
##  2 Aderezo para Ensalada     TRUE     55
##  3 Afeitado y Depilación     TRUE    408
##  4 Aguas                     TRUE   2985
##  5 Aguas Saborizadas         TRUE   2630
##  6 Aluminios y Envolturas    TRUE      2
##  7 Antojitos Mexicanos       TRUE     48
##  8 Aromatizantes de Ambiente TRUE     48
##  9 Arroz                     TRUE   2047
## 10 Artículos de Limpieza     TRUE     26
## # ℹ 164 more rows
count(df,Estado, soft=TRUE)
## # A tibble: 5 × 3
##   Estado       soft      n
##   <chr>        <lgl> <int>
## 1 Chiapas      TRUE   4051
## 2 Jalisco      TRUE   6629
## 3 Nuevo León   TRUE  96464
## 4 Quintana Roo TRUE  10021
## 5 Sinaloa      TRUE  83455
count(df,Giro, soft=TRUE)
## # A tibble: 2 × 3
##   Giro       soft       n
##   <chr>      <lgl>  <int>
## 1 Abarrotes  TRUE  183970
## 2 Mini súper TRUE   16650

#TABLA FRECUENCIAS (funciona)

table(df$NombreDepartamento)
## 
##            Abarrotes   Bebes e Infantiles               Carnes 
##               198274                 1483                    1 
##             Farmacia           Ferretería             Mercería 
##                  255                  377                   44 
##            Papelería Productos a Eliminar      Vinos y Licores 
##                   74                    8                  104
table(df$Estado)
## 
##      Chiapas      Jalisco   Nuevo León Quintana Roo      Sinaloa 
##         4051         6629        96464        10021        83455

install.packages(janitor)

#TABLA CRUZADA

library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
tabla1<- tabyl(df,vcClaveTienda, NombreDepartamento)

#GRAFICO CUALITATIVO (funciona)

library(ggplot2)
df$Subtotal <- df$Precio*df$Unidades
ggplot(df, aes(x=vcClaveTienda, y=Subtotal))+
  geom_bar(stat="identity")

#DIAGRAMA

library(qcc)
## Package 'qcc' version 2.7
## Type 'citation("qcc")' for citing this R package in publications.
tabla1 <- subset(tabla1, select=c(vcClaveTienda,Abarrotes))
pareto.chart(tabla1$Abarrotes)

##    
## Pareto chart analysis for tabla1$Abarrotes
##        Frequency    Cum.Freq.   Percentage Cum.Percent.
##   A 9.541000e+04 9.541000e+04 4.812028e+01 4.812028e+01
##   D 8.223400e+04 1.776440e+05 4.147493e+01 8.959521e+01
##   E 1.001400e+04 1.876580e+05 5.050587e+00 9.464579e+01
##   B 6.590000e+03 1.942480e+05 3.323683e+00 9.796948e+01
##   C 4.026000e+03 1.982740e+05 2.030523e+00 1.000000e+02

#GRAFICA DISPERSION (funciona)

plot(df$Precio,df$Unidades,main="Relación entre Precio y Unidades", xlab="Precio", ylab="Unidades")

#GRAFICA CAJA (funciona)

boxplot(df$Precio, horizontal=TRUE)

boxplot(df$Unidades, horizontal=TRUE)

#PROPUESTA

#Tomando una postura del lado de la mercadotécnia, las soluciones serian realizar un estudio de mercado en donde por medio de preguntas estrategicas se logren obtener datos que nutran las bases para realizar futuros anlaisis

LS0tDQp0aXRsZTogIkFDVDMxTFMiDQphdXRob3I6ICJMeW5ldHRlIFNvbGlzIEEwMTU2MjM4OSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiAieWV0aSINCiAgICANCmRhdGU6ICIyMDIzLTA4LTMxIg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMjIFIgTWFya2Rvd24NCg0KVGhpcyBpcyBhbiBSIE1hcmtkb3duIGRvY3VtZW50LiBNYXJrZG93biBpcyBhIHNpbXBsZSBmb3JtYXR0aW5nIHN5bnRheCBmb3IgYXV0aG9yaW5nIEhUTUwsIFBERiwgYW5kIE1TIFdvcmQgZG9jdW1lbnRzLiBGb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIFIgTWFya2Rvd24gc2VlIDxodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tPi4NCg0KV2hlbiB5b3UgY2xpY2sgdGhlICoqS25pdCoqIGJ1dHRvbiBhIGRvY3VtZW50IHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgaW5jbHVkZXMgYm90aCBjb250ZW50IGFzIHdlbGwgYXMgdGhlIG91dHB1dCBvZiBhbnkgZW1iZWRkZWQgUiBjb2RlIGNodW5rcyB3aXRoaW4gdGhlIGRvY3VtZW50LiBZb3UgY2FuIGVtYmVkIGFuIFIgY29kZSBjaHVuayBsaWtlIHRoaXM6DQoNCmBgYHtyIGNhcnN9DQpzdW1tYXJ5KGNhcnMpDQpgYGANCg0KI1BMT1RTIChmdW5jaW9uYSkNCg0KWW91IGNhbiBhbHNvIGVtYmVkIHBsb3RzLCBmb3IgZXhhbXBsZToNCg0KYGBge3IgcHJlc3N1cmUsIGVjaG89RkFMU0V9DQpwbG90KHByZXNzdXJlKQ0KYGBgDQoNCk5vdGUgdGhhdCB0aGUgYGVjaG8gPSBGQUxTRWAgcGFyYW1ldGVyIHdhcyBhZGRlZCB0byB0aGUgY29kZSBjaHVuayB0byBwcmV2ZW50IHByaW50aW5nIG9mIHRoZSBSIGNvZGUgdGhhdCBnZW5lcmF0ZWQgdGhlIHBsb3QuDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KDQoNCiNFSkVSQ0lDSU8NCg0KDQpgYGB7cn0NCg0KI2ZpbGUuY2hvb3NlKCkNCg0KcG9ibGFjaW9uIDwtIHJlYWQuY3N2KCJDOlxcVXNlcnNcXGx5bmV0XFxPbmVEcml2ZVxcRG9jdW1lbnRzXFxBbmFsw610aWNhIDIwMjNcXHBvYmxhY2lvbi5jc3YiKQ0KDQojVmlldyhwb2JsYWNpb24pDQpgYGANCg0KYGBge3J9DQpOIDwtIGxlbmd0aChwb2JsYWNpb24kUGFnbykNCmBgYA0KDQoNCiNNRURJQQ0KYGBge3J9DQptZWRpYV9wb2JsYWNpb25hbCA8LSBtZWFuKHBvYmxhY2lvbiRQYWdvKQ0KYGBgDQoNCiNNVUVTVFJBDQpgYGB7cn0NCm11ZXN0cmEgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcbHluZXRcXE9uZURyaXZlXFxEb2N1bWVudHNcXEFuYWzDrXRpY2EgMjAyM1xcbXVlc3RyYS5jc3YiKQ0KYGBgDQoNCiNNRURJQSBNVUVTVFJBTA0KYGBge3J9DQptZWRpYV9tdWVzdHJhbCA8LSBtZWFuKG11ZXN0cmEkUGFnbykNCmBgYA0KDQoNCiNNRURJQSBQT0JMQUNJT05BTA0KYGBge3J9DQptZWRpYW5hX3BvYmxhY2lvbmFsIDwtIG1lZGlhbihwb2JsYWNpb24kUGFnbykNCmBgYA0KDQojTUVESUEgTVVFU1RSQUwNCmBgYHtyfQ0KbWVkaWFuYV9tdWVzdHJhbCA8LSBtZWRpYW4obXVlc3RyYSRQYWdvKQ0KDQpgYGANCg0KI1JFU1VNRU4gREUgUE9CTEFDSU9OIFkgTVVFU1RSQQ0KYGBge3J9DQpzdW1tYXJ5KHBvYmxhY2lvbikNCnN1bW1hcnkobXVlc3RyYSkNCg0KYGBgDQoNCg0KI01PREENCg0KYGBge3J9DQptb2RhIDwtIGZ1bmN0aW9uKHgpIHsNCiAgdXggPC0gdW5pcXVlKHgpDQogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0NCn0NCmBgYA0KYGBge3J9DQptb2RhX211ZXN0cmFsIDwtIG1vZGEobXVlc3RyYSRQYWdvKQ0KbW9kYV9wb2JsYWNpb25hbCA8LSBtb2RhKHBvYmxhY2lvbiRQYWdvKQ0KDQpgYGANCg0KDQojUkVMQUNJT04gRU5UUkUgTUVESUEsIE1FRElBTkEgWSBNT0RBDQpgYGB7cn0NCm10Y19wb2JsYWNpb25hbCA8LSBjKG1lZGlhX3BvYmxhY2lvbmFsLCBtZWRpYW5hX3BvYmxhY2lvbmFsLCBtb2RhX3BvYmxhY2lvbmFsKQ0KbmFtZXMobXRjX3BvYmxhY2lvbmFsKSA8LSBjKCJtZWRpYV9wb2JsYWNpb25hbCIsICJtZWRpYW5hX3BvYmxhY2lvbmFsIiwgIm1vZGFfcG9ibGFjaW9uYWwiKQ0KbXRjX3BvYmxhY2lvbmFsIDwtIHNvcnQobXRjX3BvYmxhY2lvbmFsKQ0KbXRjX3BvYmxhY2lvbmFsDQpgYGANCg0KDQojSElTVA0KYGBge3J9DQpoaXN0KHBvYmxhY2lvbiRQYWdvKQ0KDQpgYGANCg0KI1JBTkdPIFBPQkxBQ0lPTkFMDQpgYGB7cn0NCnJhbmdvX3BvYmxhY2lvbmFsIDwtIG1heChwb2JsYWNpb24kUGFnbykgLSBtaW4ocG9ibGFjaW9uJFBhZ28pDQpgYGANCg0KI1JBTkdPIE1VRVNUUkFMDQoNCmBgYHtyfQ0KcmFuZ29fbXVlc3RyYWwgPC0gbWF4KG11ZXN0cmEkUGFnbykgLSBtaW4obXVlc3RyYSRQYWdvKQ0KYGBgDQoNCiNWQVJJQU5aQSBQT0JMQUNJT05BTA0KYGBge3J9DQp2YXJpYW56YV9wb2JsYWNpb25hbCA8LSB2YXIocG9ibGFjaW9uJFBhZ28pKihOLTEpL04NCmBgYA0KDQoNCiNWQVJJQU5aQSBNVUVTVFJBTA0KYGBge3J9DQp2YXJpYW56YV9tdWVzdHJhbCA8LSB2YXIobXVlc3RyYSRQYWdvKQ0KYGBgDQoNCg0KI0RFU1ZJQUNJT04gRVNUQU5EQVIgUE9CTEFDSU9OQUwNCmBgYHtyfQ0KZGVzdmlhY2nDs25fZXN0YW5kYXJfcG9ibGFjaW9uYWwgPC0gc3FydCh2YXJpYW56YV9wb2JsYWNpb25hbCkNCmBgYA0KDQojREVTVklBQ0lPTiBFU1RBTkRBUiBNVUVTVFJBTCkNCmBgYHtyfQ0KZGVzdmlhY2nDs25fZXN0YW5kYXJfbXVlc3RyYWwgPC0gc3FydCh2YXJpYW56YV9tdWVzdHJhbCkNCmBgYA0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCg0KI0FDVElWSURBRA0KDQoNCiNCQVNFIERBVE9TIChmdW5jaW9uYSkNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KZGY8LSByZWFkX3hsc3goIkM6XFxVc2Vyc1xcbHluZXRcXE9uZURyaXZlXFxEb2N1bWVudHNcXEFuYWzDrXRpY2EgMjAyM1xcQWJhcnJvdGVzX1ZlbnRhcy54bHN4IikNCg0KYGBgDQoNCiNSRVNVTUVOIERBVE9TIChmdW5jaW9uYSkNCmBgYHtyfQ0Kc3VtbWFyeShkZikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KIyhmdW5jaW9uYSkNCg0KYGBge3J9DQpjb3VudChkZix2Y0NsYXZlVGllbmRhLCBzb2Z0PVRSVUUpDQpjb3VudChkZixEZXNjR2lybywgc29mdD1UUlVFKQ0KY291bnQoZGYsTWFyY2EsIHNvZnQ9VFJVRSkNCmNvdW50KGRmLEZhYnJpY2FudGUsIHNvZnQ9VFJVRSkNCmNvdW50KGRmLE5vbWJyZURlcGFydGFtZW50bywgc29mdD1UUlVFKQ0KY291bnQoZGYsTm9tYnJlRmFtaWxpYSwgc29mdD1UUlVFKQ0KY291bnQoZGYsTm9tYnJlQ2F0ZWdvcmlhLCBzb2Z0PVRSVUUpDQpjb3VudChkZixFc3RhZG8sIHNvZnQ9VFJVRSkNCmNvdW50KGRmLEdpcm8sIHNvZnQ9VFJVRSkNCmBgYA0KDQojVEFCTEEgRlJFQ1VFTkNJQVMgKGZ1bmNpb25hKQ0KYGBge3J9DQp0YWJsZShkZiROb21icmVEZXBhcnRhbWVudG8pDQp0YWJsZShkZiRFc3RhZG8pDQpgYGANCg0KaW5zdGFsbC5wYWNrYWdlcyhqYW5pdG9yKQ0KDQojVEFCTEEgQ1JVWkFEQQ0KYGBge3J9DQpsaWJyYXJ5KGphbml0b3IpDQp0YWJsYTE8LSB0YWJ5bChkZix2Y0NsYXZlVGllbmRhLCBOb21icmVEZXBhcnRhbWVudG8pDQpgYGANCg0KDQojR1JBRklDTyBDVUFMSVRBVElWTyAoZnVuY2lvbmEpDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmRmJFN1YnRvdGFsIDwtIGRmJFByZWNpbypkZiRVbmlkYWRlcw0KZ2dwbG90KGRmLCBhZXMoeD12Y0NsYXZlVGllbmRhLCB5PVN1YnRvdGFsKSkrDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikNCmBgYA0KDQoNCiNESUFHUkFNQSANCg0KDQpgYGB7cn0NCmxpYnJhcnkocWNjKQ0KdGFibGExIDwtIHN1YnNldCh0YWJsYTEsIHNlbGVjdD1jKHZjQ2xhdmVUaWVuZGEsQWJhcnJvdGVzKSkNCnBhcmV0by5jaGFydCh0YWJsYTEkQWJhcnJvdGVzKQ0KYGBgDQoNCg0KI0dSQUZJQ0EgRElTUEVSU0lPTiAoZnVuY2lvbmEpDQpgYGB7cn0NCnBsb3QoZGYkUHJlY2lvLGRmJFVuaWRhZGVzLG1haW49IlJlbGFjacOzbiBlbnRyZSBQcmVjaW8geSBVbmlkYWRlcyIsIHhsYWI9IlByZWNpbyIsIHlsYWI9IlVuaWRhZGVzIikNCg0KYGBgDQoNCiNHUkFGSUNBIENBSkEgKGZ1bmNpb25hKQ0KYGBge3J9DQpib3hwbG90KGRmJFByZWNpbywgaG9yaXpvbnRhbD1UUlVFKQ0KYm94cGxvdChkZiRVbmlkYWRlcywgaG9yaXpvbnRhbD1UUlVFKQ0KYGBgDQoNCiNQUk9QVUVTVEENCg0KI1RvbWFuZG8gdW5hIHBvc3R1cmEgZGVsIGxhZG8gZGUgbGEgbWVyY2Fkb3TDqWNuaWEsIGxhcyBzb2x1Y2lvbmVzIHNlcmlhbiByZWFsaXphciB1biBlc3R1ZGlvIGRlIG1lcmNhZG8gZW4gZG9uZGUgcG9yIG1lZGlvIGRlIHByZWd1bnRhcyBlc3RyYXRlZ2ljYXMgc2UgbG9ncmVuIG9idGVuZXIgZGF0b3MgcXVlIG51dHJhbiBsYXMgYmFzZXMgcGFyYSByZWFsaXphciBmdXR1cm9zIGFubGFpc2lzDQoNCg0KDQoNCg0KDQoNCg0K