Jimena Miguel| Vanessa Elizondo| Ricardo Galicia| José Luis Elizondo| Daniela Cardenas

Entregable 2.1 - Fuente de Datos Externa

Llamar base de datos.

#file.choose()
Companies <- read.csv("/Users/ricardogc/Desktop/Passport_ProducciónCarton_A00827672xls.csv")

Entender Base de Datos

resumen <- summary(Companies)
resumen
##       Geography                                         Category 
##  Algeria   : 1   Corrugated Paper, Paperboard and Containers:89  
##  Angola    : 1                                                   
##  Argentina : 1                                                   
##  Australia : 1                                                   
##  Austria   : 1                                                   
##  Azerbaijan: 1                                                   
##  (Other)   :83                                                   
##                      Data.Type           Unit          Current.Constant
##  Production (turnover) MSP:89   EUR million:18   Current Prices:89     
##                                 USD million: 3                         
##                                 AED million: 1                         
##                                 AOA million: 1                         
##                                 ARS million: 1                         
##                                 AUD million: 1                         
##                                 (Other)    :64                         
##      X2016              X2017              X2018              X2019         
##  Min.   :       0   Min.   :       0   Min.   :       0   Min.   :       0  
##  1st Qu.:     421   1st Qu.:     432   1st Qu.:     527   1st Qu.:     529  
##  Median :    4383   Median :    4804   Median :    5063   Median :    4849  
##  Mean   :  939400   Mean   :  993634   Mean   : 1193476   Mean   : 1376491  
##  3rd Qu.:   37794   3rd Qu.:   38307   3rd Qu.:   40769   3rd Qu.:   43779  
##  Max.   :25902010   Max.   :27472550   Max.   :35218716   Max.   :39310235  
##                                                                             
##      X2020              X2021         
##  Min.   :       0   Min.   :       0  
##  1st Qu.:     548   1st Qu.:     607  
##  Median :    5020   Median :    5477  
##  Mean   : 1554963   Mean   : 1904399  
##  3rd Qu.:   44564   3rd Qu.:   51280  
##  Max.   :41193660   Max.   :63857942  
## 

1.¿Cuántas variables y cuántos registros tiene la base de datos?

R= 89 registros y 11 variables
str(Companies)
## 'data.frame':    89 obs. of  11 variables:
##  $ Geography       : Factor w/ 89 levels "Algeria","Angola",..: 6 7 12 16 35 38 39 45 46 52 ...
##  $ Category        : Factor w/ 1 level "Corrugated Paper, Paperboard and Containers": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Data.Type       : Factor w/ 1 level "Production (turnover) MSP": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Unit            : Factor w/ 70 levels "AED million",..: 5 6 38 13 27 32 30 36 41 45 ...
##  $ Current.Constant: Factor w/ 1 level "Current Prices": 1 1 1 1 1 1 1 1 1 1 ...
##  $ X2016           : num  40.6 115106.8 247100 309386.9 212.1 ...
##  $ X2017           : num  44.6 135423.7 257700 301286.2 212.7 ...
##  $ X2018           : num  47.3 156788.3 299500 317612.9 217.5 ...
##  $ X2019           : num  52.2 180445.4 314000 310925.3 216.8 ...
##  $ X2020           : num  51.5 198883.5 281100 312534.7 196.7 ...
##  $ X2021           : num  66.1 222755.3 285994.4 344612.2 191.4 ...
#library(psych)
#install.packages("psych")
#describe(Companies)

Nota: Debido a la versión de R, nos deja descargar el paquete “psych”, sin embargo, no nos deja llamar a la librería “psych”, por lo tanto utilizamos str, para obtener el numero de las variables de la base de datos.

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

Realizamos una tabla para poder clasificar cada una de las variables de la base de Datos bd1

Variable<-c("Geography","Category","Data.Type", "Unit","Current Constant","Years")
Type<-c("Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cuantitativa (Continua)")
table<-data.frame(Variable,Type)
knitr::kable(table)
Variable Type
Geography Cualitativa
Category Cualitativa
Data.Type Cualitativa
Unit Cualitativa
Current Constant Cualitativa
Years Cuantitativa (Continua)

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

Realizamos una tabla donde viene clasificado cada variable y agregamos una columna con la escala de medición para cada variable.

Variable<-c("Geography","Category","Data.Type", "Unit","Current Constant","Years")
Type<-c("Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cuantitativa (Continua)")
Escala_de_Medición <- c("Países", "Producto", "Departamento","Tipo de Moneda", "Precio actual", "Ganancia (Razon)")
table<-data.frame(Variable,Type,Escala_de_Medición)
knitr::kable(table)
Variable Type Escala_de_Medición
Geography Cualitativa Países
Category Cualitativa Producto
Data.Type Cualitativa Departamento
Unit Cualitativa Tipo de Moneda
Current Constant Cualitativa Precio actual
Years Cuantitativa (Continua) Ganancia (Razon)

4. Aplica al menos 2 tecnicas de limpieza de base de datos y explicalas brevemente, ¿Porqué realizaste estas tecnicas?

La primer tecnica de limpieza que utilizamos fue, eliminar columnas debido a que contabamos con datos los cuales no eran relevantes para el análisis.

La segunda herramienta de limpieza que utilizamos para la visulización de los datos fue, implementar una nueva columna como el total de la Producción de las variables que se producen por país.

Tecnica 1. Remover Valores Irrelevantes

Eliminar columnas

bd1 <- Companies
bd1<-subset(bd1,select=-c(Category,Data.Type,Current.Constant))
str(bd1)
## 'data.frame':    89 obs. of  8 variables:
##  $ Geography: Factor w/ 89 levels "Algeria","Angola",..: 6 7 12 16 35 38 39 45 46 52 ...
##  $ Unit     : Factor w/ 70 levels "AED million",..: 5 6 38 13 27 32 30 36 41 45 ...
##  $ X2016    : num  40.6 115106.8 247100 309386.9 212.1 ...
##  $ X2017    : num  44.6 135423.7 257700 301286.2 212.7 ...
##  $ X2018    : num  47.3 156788.3 299500 317612.9 217.5 ...
##  $ X2019    : num  52.2 180445.4 314000 310925.3 216.8 ...
##  $ X2020    : num  51.5 198883.5 281100 312534.7 196.7 ...
##  $ X2021    : num  66.1 222755.3 285994.4 344612.2 191.4 ...

Nota: Se eliminan Category, Data.Type y Current.Constant , ya que no nos sirven, debido a que es el mismo dato para todos los registros. Y es algo que no nos aporta alguna información.

Tecnica 6. Metodo Estadistico

Agregar Columnas

library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
bd1$Total_Producción<- bd1$X2016+bd1$X2017+bd1$X2018+bd1$X2019+bd1$X2020+bd1$X2021
summary(bd1)
##       Geography           Unit        X2016              X2017         
##  Algeria   : 1   EUR million:18   Min.   :       0   Min.   :       0  
##  Angola    : 1   USD million: 3   1st Qu.:     421   1st Qu.:     432  
##  Argentina : 1   AED million: 1   Median :    4383   Median :    4804  
##  Australia : 1   AOA million: 1   Mean   :  939400   Mean   :  993634  
##  Austria   : 1   ARS million: 1   3rd Qu.:   37794   3rd Qu.:   38307  
##  Azerbaijan: 1   AUD million: 1   Max.   :25902010   Max.   :27472550  
##  (Other)   :83   (Other)    :64                                        
##      X2018              X2019              X2020              X2021         
##  Min.   :       0   Min.   :       0   Min.   :       0   Min.   :       0  
##  1st Qu.:     527   1st Qu.:     529   1st Qu.:     548   1st Qu.:     607  
##  Median :    5063   Median :    4849   Median :    5020   Median :    5477  
##  Mean   : 1193476   Mean   : 1376491   Mean   : 1554963   Mean   : 1904399  
##  3rd Qu.:   40769   3rd Qu.:   43779   3rd Qu.:   44564   3rd Qu.:   51280  
##  Max.   :35218716   Max.   :39310235   Max.   :41193660   Max.   :63857942  
##                                                                             
##  Total_Producción   
##  Min.   :        0  
##  1st Qu.:     3166  
##  Median :    30333  
##  Mean   :  7962363  
##  3rd Qu.:   254492  
##  Max.   :204523302  
## 
str(bd1)
## 'data.frame':    89 obs. of  9 variables:
##  $ Geography       : Factor w/ 89 levels "Algeria","Angola",..: 6 7 12 16 35 38 39 45 46 52 ...
##  $ Unit            : Factor w/ 70 levels "AED million",..: 5 6 38 13 27 32 30 36 41 45 ...
##  $ X2016           : num  40.6 115106.8 247100 309386.9 212.1 ...
##  $ X2017           : num  44.6 135423.7 257700 301286.2 212.7 ...
##  $ X2018           : num  47.3 156788.3 299500 317612.9 217.5 ...
##  $ X2019           : num  52.2 180445.4 314000 310925.3 216.8 ...
##  $ X2020           : num  51.5 198883.5 281100 312534.7 196.7 ...
##  $ X2021           : num  66.1 222755.3 285994.4 344612.2 191.4 ...
##  $ Total_Producción: num  302 1009403 1685394 1896358 1247 ...

5. Incluir una breve reflexión de la actividad.

En conclusion nosotros estuvimos analizando las diferentes empresas cartoneras y papeleras del mundo, analizamos una fuente de datos externa. En esta base de datos se analizaron el total de producción por año en las diferentes empresas. Con la ayuda de R, Clasificamos , ordenamos y les proporcionamos una medida de medición a las variables de la base de datos. Analizando la base de datos decidimos eliminar dos columnas en la base de datos ya que no eran relevantes para nuestro analisis.

Entregable 2.2 - Fuente de Datos Externa

Realizar un análisis estadístico descriptivo en el que logres destacar el conjunto de datos, que apoyan a la empresa a mejorar su operación. Incorpora al menos dos propuestas concretas, apoyadas de tu análisis en donde se incluye al menos: (1) Tabla de frecuencia, (opcional) Tablas cruzadas, (2-3) Gráficos de datos cualitativos y cuantitativos, así como (2-3) Gráficos de dispersión.

Analisis Estadistico Descriptivo

#describe(bd1)

Función no posible por la versión que se tiene en R ### Tabla de Frecuencia

bd2 <- table(bd1$Unit)
bd2 <- prop.table(bd2)
bd2
## 
## AED million AOA million ARS million AUD million AZN million BDT million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## BGN million BRL million BYR million CAD million CHF million CLP million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## CNY million COP million CRC million CUC million CZK million DKK million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## DOP million DZD million EGP million ETB million EUR million GBP million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.20224719  0.01123596 
## GEL million GHS million HKD million HRK million HuF million IDR million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## ILS million INR million IQD million IRR million ISK million JPY million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## KES million KHR million KRW million KWD million KZT million LKR million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## MAD million MXN million MYR million NGN million NOK million NZD million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## PAB million PEN million PHP million PKR million PLN million QAR million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## RON million RUB million SAR million SEK million SGD million THB million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## TND million TRY million TWD million UAH million USD million UYU million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.03370787  0.01123596 
## UZS million VND million XAF million ZAR million 
##  0.01123596  0.01123596  0.01123596  0.01123596

Graficas de datos Cualitativas y Cuantitativas

Cualitativa con Unit

barplot(bd2, xlab='Tipo de Moneda',
        ylab='Frecuencia Relativa', las=1)

Cuantitativa con Total_Producción

bd3 <- bd1
aggregate(x=bd3$Total_Producción, by=list(bd3$Geography),FUN=sum)
##                 Group.1           x
## 1               Algeria     26366.2
## 2                Angola      4172.7
## 3             Argentina    757754.2
## 4             Australia     21642.9
## 5               Austria     10233.5
## 6            Azerbaijan       302.3
## 7            Bangladesh   1009403.0
## 8               Belarus      2931.2
## 9               Belgium      6339.5
## 10               Brazil    129369.8
## 11             Bulgaria      3166.2
## 12             Cambodia   1685394.4
## 13             Cameroon    197101.1
## 14               Canada     78979.4
## 15                Chile   6391369.9
## 16                China   1896358.2
## 17             Colombia  15542263.1
## 18           Costa Rica    967034.3
## 19              Croatia      8719.9
## 20                 Cuba       619.6
## 21               Cyprus       171.5
## 22       Czech Republic    178808.7
## 23              Denmark     32238.2
## 24   Dominican Republic     37293.6
## 25              Ecuador       949.5
## 26                Egypt     96033.6
## 27              Estonia       387.5
## 28             Ethiopia      5442.2
## 29              Finland      2612.9
## 30               France     33450.4
## 31              Georgia       194.3
## 32              Germany     77218.5
## 33                Ghana       673.7
## 34               Greece      2573.7
## 35     Hong Kong, China      1247.2
## 36              Hungary   1504747.7
## 37              Iceland      5561.8
## 38                India   2264525.5
## 39            Indonesia 204523301.8
## 40                 Iran 186021771.8
## 41                 Iraq     11680.2
## 42              Ireland      1873.4
## 43               Israel     22710.5
## 44                Italy     50972.2
## 45                Japan  15807772.3
## 46           Kazakhstan    203941.1
## 47                Kenya    112343.7
## 48               Kuwait       251.3
## 49               Latvia       463.0
## 50            Lithuania      1775.1
## 51           Luxembourg         0.0
## 52             Malaysia     23655.6
## 53               Mexico    738215.0
## 54              Morocco     16625.1
## 55          Netherlands     13921.1
## 56          New Zealand      7644.6
## 57              Nigeria    206027.0
## 58               Norway     11525.8
## 59             Pakistan    628812.7
## 60               Panama       221.3
## 61                 Peru      5083.5
## 62          Philippines    302208.8
## 63               Poland    118115.9
## 64             Portugal      5366.3
## 65          Puerto Rico       537.2
## 66                Qatar       189.5
## 67              Romania     16388.7
## 68               Russia   1590911.6
## 69         Saudi Arabia     36787.1
## 70            Singapore      3636.7
## 71             Slovakia      1317.9
## 72             Slovenia      1137.3
## 73         South Africa    277898.6
## 74          South Korea  59825405.8
## 75                Spain     31015.4
## 76            Sri Lanka    254492.0
## 77               Sweden     60578.6
## 78          Switzerland      5331.3
## 79               Taiwan    615169.6
## 80             Thailand    201398.4
## 81              Tunisia      2715.6
## 82               Turkey    195406.5
## 83              Ukraine    128095.2
## 84 United Arab Emirates     12957.3
## 85       United Kingdom     30332.9
## 86              Uruguay     83173.7
## 87                  USA    323594.0
## 88           Uzbekistan   5103054.3
## 89              Vietnam 198028864.1
hist(log(bd1$Total_Producción), main = "Histograma de Producción Total", xlab="Producción Total", 
     ylab="Frecuencia", col="blue1")

Graficas de Dispersión

Relación Geography con Producción Total

library(ggplot2)
ggplot(bd1, aes(x=Total_Producción, y=Geography)) + 
  geom_point(shape=19, size=3) + labs(title = "Relación entre los Países y la Producción Total",caption ="Passport_ProducciónCarton",x="Producción_Total", y="Geography") + theme_classic()

boxplot=subset(bd1,select = -c(Total_Producción,Geography))
boxplot(bd1$Total_Producción, main= "Total de producción")

Relación Geography con Producción Total

plot(x = bd1$Geography, y = bd1$Total_Producción, col=bd1$Company.Name, main = "Grafica Dispersión", xlab = "Geography", ylab = "Total_Producción", las=1)

Propuestas de Mejora

Con esta base de datos se espera analizar la información acerca de los países con mayor producción de cartón y cajas corrugadas. FORM puede tomar gran ventaja del análisis de la información que se puede extraer de esta base de datos para conocer y detectar áreas de oportunidad de crecimiento y enfocarse en los países con mayor producción. Por esto les proponemos las siguientes propuestas de mejora:

  1. Conocer el uso que le dan a estos cartones y ver si puede participar como proveedor de cartón para vender a un precio justo las mermas que FORM tiene día tras días y de ese modo darle un buen uso a las sobras y obtener cierta ganancia en las mermas y disminuir los gastos.

  2. Por ejemplo la base de datos nos indica que Estados Unidos obtuvo una producción de más de 323,594 millones de Dólares en los ultimos 6 años a comparación de México 738,215 millones de pesos. Esta información permite conocer el mercado, detectar oportunidades de crecimiento y cantidad de producción que se requiere por país, de esta manera puede saber si puede competir FORM en el mercado de EUA.

Conclusión

Realizamos el analisis de la producción de Carton de los ultimos 6 años, del 2016 al 2021. Realizamos una tabla de frecuencia, en el cual obtuvimos que la moneda o el tipo de moneda con el que se maneja la producción es la de Euros. Así mismo también realizamos graficas para poder analisar los datos cuantitativos y cualitativos, en lo que nos dimos cuenta que tenemos más datos cualitativos que cuantitativos. Al realizar estas graficas obtuvimos que los que tienen mayor producción de carton durante estos 6 años, son Iran, Vietnam y e Indonesía. Dicho analisis pudo permitirnos ver que países tienen mayor participación dentro del mercado de Carton y corrugado, esto brinda mayor información para incluso ver opciones de expansión hacía otros países, no solamente enfocado a EUA, lo que ayudaría a tener una visión a futuro para la empresa cuando tenga un crecimiento más global.

LS0tCnRpdGxlOiA8c3BhbiBzdHlsZT0iQ29sb3I6Y2hvY29sYXRlIj4gRnVlbnRlIGRlIERhdG9zIEV4dGVybmEgMi4xIC0gMi4yCmF1dGhvcjogIkVxdWlwbyAyIgpkYXRlOiAnMjAyMi0wOS0yMScKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUgCi0tLQojIyMgSmltZW5hIE1pZ3VlbHwgVmFuZXNzYSBFbGl6b25kb3wgUmljYXJkbyBHYWxpY2lhfCBKb3PDqSBMdWlzIEVsaXpvbmRvfCBEYW5pZWxhIENhcmRlbmFzCgohW10oL1VzZXJzL3JpY2FyZG9nYy9EZXNrdG9wL1ZXN1oyRk9HWkJBTDNEQzdKNU5WRVBOS09ZLlBORykKCiMjICoqRW50cmVnYWJsZSAyLjEgLSBGdWVudGUgZGUgRGF0b3MgRXh0ZXJuYSoqCiMjIyBMbGFtYXIgYmFzZSBkZSBkYXRvcy4KYGBge3J9CiNmaWxlLmNob29zZSgpCkNvbXBhbmllcyA8LSByZWFkLmNzdigiL1VzZXJzL3JpY2FyZG9nYy9EZXNrdG9wL1Bhc3Nwb3J0X1Byb2R1Y2Npb8yBbkNhcnRvbl9BMDA4Mjc2NzJ4bHMuY3N2IikKYGBgCgojIyMgRW50ZW5kZXIgQmFzZSBkZSBEYXRvcwpgYGB7cn0KcmVzdW1lbiA8LSBzdW1tYXJ5KENvbXBhbmllcykKcmVzdW1lbgpgYGAKCiMjIyAqMS7Cv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1w6FudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPyoKPGNlbnRlcj4gPHNwYW4gc3R5bGU9ImNvbG9yOlJlZCI+IFI9IDg5IHJlZ2lzdHJvcyB5IDExIHZhcmlhYmxlcyA8L2NlbnRlcj4KYGBge3J9CnN0cihDb21wYW5pZXMpCiNsaWJyYXJ5KHBzeWNoKQojaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQojZGVzY3JpYmUoQ29tcGFuaWVzKQpgYGAKCiMjIyMgTm90YTogRGViaWRvIGEgbGEgdmVyc2nDs24gZGUgUiwgbm9zIGRlamEgZGVzY2FyZ2FyIGVsIHBhcXVldGUgInBzeWNoIiwgc2luIGVtYmFyZ28sIG5vIG5vcyBkZWphIGxsYW1hciBhIGxhIGxpYnJlcsOtYSAicHN5Y2giLCBwb3IgbG8gdGFudG8gdXRpbGl6YW1vcyBzdHIsIHBhcmEgb2J0ZW5lciBlbCBudW1lcm8gZGUgbGFzIHZhcmlhYmxlcyBkZSBsYSBiYXNlIGRlIGRhdG9zLgoKIyMjICoyLkNsYXNpZmljYSBjYWRhIHZhcmlhYmxlIGVuIGN1YWxpdGF0aXZhLCBjdWFudGl0YXRpdmEgZGlzY3JldGEgbyBjdWFudGl0YXRpdmEgY29udGludWEuKgojIyMjIFJlYWxpemFtb3MgdW5hIHRhYmxhIHBhcmEgcG9kZXIgY2xhc2lmaWNhciBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzIGRlIGxhIGJhc2UgZGUgRGF0b3MgYmQxCgpgYGB7cn0KVmFyaWFibGU8LWMoIkdlb2dyYXBoeSIsIkNhdGVnb3J5IiwiRGF0YS5UeXBlIiwgIlVuaXQiLCJDdXJyZW50IENvbnN0YW50IiwiWWVhcnMiKQpUeXBlPC1jKCJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFudGl0YXRpdmEgKENvbnRpbnVhKSIpCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFR5cGUpCmtuaXRyOjprYWJsZSh0YWJsZSkKYGBgCgojIyMgKjMuIEVsaWdlIGxhIGVzY2FsYSBkZSBtZWRpY2nDs24gZGUgY2FkYSB2YXJpYWJsZS4qIAojIyMjIFJlYWxpemFtb3MgdW5hIHRhYmxhIGRvbmRlIHZpZW5lIGNsYXNpZmljYWRvIGNhZGEgdmFyaWFibGUgeSBhZ3JlZ2Ftb3MgdW5hIGNvbHVtbmEgY29uIGxhIGVzY2FsYSBkZSBtZWRpY2nDs24gcGFyYSBjYWRhIHZhcmlhYmxlLiAKYGBge3J9ClZhcmlhYmxlPC1jKCJHZW9ncmFwaHkiLCJDYXRlZ29yeSIsIkRhdGEuVHlwZSIsICJVbml0IiwiQ3VycmVudCBDb25zdGFudCIsIlllYXJzIikKVHlwZTwtYygiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbnRpdGF0aXZhIChDb250aW51YSkiKQpFc2NhbGFfZGVfTWVkaWNpw7NuIDwtIGMoIlBhw61zZXMiLCAiUHJvZHVjdG8iLCAiRGVwYXJ0YW1lbnRvIiwiVGlwbyBkZSBNb25lZGEiLCAiUHJlY2lvIGFjdHVhbCIsICJHYW5hbmNpYSAoUmF6b24pIikKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSxFc2NhbGFfZGVfTWVkaWNpw7NuKQprbml0cjo6a2FibGUodGFibGUpCmBgYAoKIyMjICo0LiBBcGxpY2EgYWwgbWVub3MgMiB0ZWNuaWNhcyBkZSBsaW1waWV6YSBkZSBiYXNlIGRlIGRhdG9zIHkgZXhwbGljYWxhcyBicmV2ZW1lbnRlLCDCv1BvcnF1w6kgcmVhbGl6YXN0ZSBlc3RhcyB0ZWNuaWNhcz8qCiMjIyMgTGEgcHJpbWVyIHRlY25pY2EgZGUgbGltcGllemEgcXVlIHV0aWxpemFtb3MgZnVlLCBlbGltaW5hciBjb2x1bW5hcyBkZWJpZG8gYSBxdWUgY29udGFiYW1vcyBjb24gZGF0b3MgbG9zIGN1YWxlcyBubyBlcmFuIHJlbGV2YW50ZXMgcGFyYSBlbCBhbsOhbGlzaXMuIAojIyMjIExhIHNlZ3VuZGEgaGVycmFtaWVudGEgZGUgbGltcGllemEgcXVlIHV0aWxpemFtb3MgcGFyYSBsYSB2aXN1bGl6YWNpw7NuIGRlIGxvcyBkYXRvcyBmdWUsIGltcGxlbWVudGFyIHVuYSBudWV2YSBjb2x1bW5hIGNvbW8gZWwgdG90YWwgZGUgbGEgUHJvZHVjY2nDs24gZGUgbGFzIHZhcmlhYmxlcyBxdWUgc2UgcHJvZHVjZW4gcG9yIHBhw61zLgoKIyMjICpUZWNuaWNhIDEuKiBSZW1vdmVyIFZhbG9yZXMgSXJyZWxldmFudGVzCiMjIyMgRWxpbWluYXIgY29sdW1uYXMgCmBgYHtyfQpiZDEgPC0gQ29tcGFuaWVzCmJkMTwtc3Vic2V0KGJkMSxzZWxlY3Q9LWMoQ2F0ZWdvcnksRGF0YS5UeXBlLEN1cnJlbnQuQ29uc3RhbnQpKQpzdHIoYmQxKQpgYGAKCiMjIyMgTm90YTogU2UgZWxpbWluYW4gQ2F0ZWdvcnksIERhdGEuVHlwZSB5IEN1cnJlbnQuQ29uc3RhbnQgLCB5YSBxdWUgbm8gbm9zIHNpcnZlbiwgZGViaWRvIGEgcXVlIGVzIGVsIG1pc21vIGRhdG8gcGFyYSB0b2RvcyBsb3MgcmVnaXN0cm9zLiBZIGVzIGFsZ28gcXVlIG5vIG5vcyBhcG9ydGEgYWxndW5hIGluZm9ybWFjacOzbi4KCiMjIyAqVGVjbmljYSA2LiogTWV0b2RvIEVzdGFkaXN0aWNvCiMjIyMgQWdyZWdhciBDb2x1bW5hcwpgYGB7cn0KbGlicmFyeShsdWJyaWRhdGUpCmJkMSRUb3RhbF9Qcm9kdWNjacOzbjwtIGJkMSRYMjAxNitiZDEkWDIwMTcrYmQxJFgyMDE4K2JkMSRYMjAxOStiZDEkWDIwMjArYmQxJFgyMDIxCnN1bW1hcnkoYmQxKQpzdHIoYmQxKQpgYGAKCiMjIyAqNS4gSW5jbHVpciB1bmEgYnJldmUgcmVmbGV4acOzbiBkZSBsYSBhY3RpdmlkYWQuKgpFbiBjb25jbHVzaW9uIG5vc290cm9zIGVzdHV2aW1vcyBhbmFsaXphbmRvIGxhcyBkaWZlcmVudGVzIGVtcHJlc2FzIGNhcnRvbmVyYXMgeSBwYXBlbGVyYXMgZGVsIG11bmRvLCBhbmFsaXphbW9zIHVuYSBmdWVudGUgZGUgZGF0b3MgZXh0ZXJuYS4gRW4gZXN0YSBiYXNlIGRlIGRhdG9zIHNlIGFuYWxpemFyb24gZWwgdG90YWwgZGUgcHJvZHVjY2nDs24gcG9yIGHDsW8gZW4gbGFzIGRpZmVyZW50ZXMgZW1wcmVzYXMuIENvbiBsYSBheXVkYSBkZSBSLCBDbGFzaWZpY2Ftb3MgLCBvcmRlbmFtb3MgeSBsZXMgcHJvcG9yY2lvbmFtb3MgdW5hIG1lZGlkYSBkZSBtZWRpY2nDs24gYSBsYXMgdmFyaWFibGVzIGRlIGxhIGJhc2UgZGUgZGF0b3MuIEFuYWxpemFuZG8gbGEgYmFzZSBkZSBkYXRvcyBkZWNpZGltb3MgZWxpbWluYXIgZG9zIGNvbHVtbmFzIGVuIGxhIGJhc2UgZGUgZGF0b3MgeWEgcXVlIG5vIGVyYW4gcmVsZXZhbnRlcyBwYXJhIG51ZXN0cm8gYW5hbGlzaXMuIAoKIyMgKipFbnRyZWdhYmxlIDIuMiAtIEZ1ZW50ZSBkZSBEYXRvcyBFeHRlcm5hKioKUmVhbGl6YXIgdW4gYW7DoWxpc2lzIGVzdGFkw61zdGljbyBkZXNjcmlwdGl2byBlbiBlbCBxdWUgbG9ncmVzIGRlc3RhY2FyIGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBxdWUgYXBveWFuIGEgbGEgZW1wcmVzYSBhIG1lam9yYXIgc3Ugb3BlcmFjacOzbi4gSW5jb3Jwb3JhIGFsIG1lbm9zIGRvcyBwcm9wdWVzdGFzIGNvbmNyZXRhcywgYXBveWFkYXMgZGUgdHUgYW7DoWxpc2lzIGVuIGRvbmRlIHNlIGluY2x1eWUgYWwgbWVub3M6ICgxKSBUYWJsYSBkZSBmcmVjdWVuY2lhLCAob3BjaW9uYWwpIFRhYmxhcyBjcnV6YWRhcywgKDItMykgR3LDoWZpY29zIGRlIGRhdG9zIGN1YWxpdGF0aXZvcyB5IGN1YW50aXRhdGl2b3MsIGFzw60gY29tbyAoMi0zKSBHcsOhZmljb3MgZGUgZGlzcGVyc2nDs24uCgojIyMgKkFuYWxpc2lzIEVzdGFkaXN0aWNvIERlc2NyaXB0aXZvKgpgYGB7cn0KI2Rlc2NyaWJlKGJkMSkKYGBgCkZ1bmNpw7NuIG5vIHBvc2libGUgcG9yIGxhIHZlcnNpw7NuIHF1ZSBzZSB0aWVuZSBlbiBSCiMjIyAqVGFibGEgZGUgRnJlY3VlbmNpYSoKYGBge3J9CmJkMiA8LSB0YWJsZShiZDEkVW5pdCkKYmQyIDwtIHByb3AudGFibGUoYmQyKQpiZDIKYGBgCgojIyMgKkdyYWZpY2FzIGRlIGRhdG9zIEN1YWxpdGF0aXZhcyB5IEN1YW50aXRhdGl2YXMqCiMjIyMgQ3VhbGl0YXRpdmEgY29uIFVuaXQKCmBgYHtyfQpiYXJwbG90KGJkMiwgeGxhYj0nVGlwbyBkZSBNb25lZGEnLAogICAgICAgIHlsYWI9J0ZyZWN1ZW5jaWEgUmVsYXRpdmEnLCBsYXM9MSkKYGBgCgojIyMjIEN1YW50aXRhdGl2YSBjb24gVG90YWxfUHJvZHVjY2nDs24KCmBgYHtyfQpiZDMgPC0gYmQxCmFnZ3JlZ2F0ZSh4PWJkMyRUb3RhbF9Qcm9kdWNjacOzbiwgYnk9bGlzdChiZDMkR2VvZ3JhcGh5KSxGVU49c3VtKQoKaGlzdChsb2coYmQxJFRvdGFsX1Byb2R1Y2Npw7NuKSwgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIFByb2R1Y2Npw7NuIFRvdGFsIiwgeGxhYj0iUHJvZHVjY2nDs24gVG90YWwiLCAKICAgICB5bGFiPSJGcmVjdWVuY2lhIiwgY29sPSJibHVlMSIpCgpgYGAKCgojIyMgKkdyYWZpY2FzIGRlIERpc3BlcnNpw7NuKgojIyMjIFJlbGFjacOzbiBHZW9ncmFwaHkgY29uIFByb2R1Y2Npw7NuIFRvdGFsCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QoYmQxLCBhZXMoeD1Ub3RhbF9Qcm9kdWNjacOzbiwgeT1HZW9ncmFwaHkpKSArIAogIGdlb21fcG9pbnQoc2hhcGU9MTksIHNpemU9MykgKyBsYWJzKHRpdGxlID0gIlJlbGFjacOzbiBlbnRyZSBsb3MgUGHDrXNlcyB5IGxhIFByb2R1Y2Npw7NuIFRvdGFsIixjYXB0aW9uID0iUGFzc3BvcnRfUHJvZHVjY2nDs25DYXJ0b24iLHg9IlByb2R1Y2Npw7NuX1RvdGFsIiwgeT0iR2VvZ3JhcGh5IikgKyB0aGVtZV9jbGFzc2ljKCkKCmJveHBsb3Q9c3Vic2V0KGJkMSxzZWxlY3QgPSAtYyhUb3RhbF9Qcm9kdWNjacOzbixHZW9ncmFwaHkpKQpib3hwbG90KGJkMSRUb3RhbF9Qcm9kdWNjacOzbiwgbWFpbj0gIlRvdGFsIGRlIHByb2R1Y2Npw7NuIikKYGBgCgojIyMjIFJlbGFjacOzbiBHZW9ncmFwaHkgY29uIFByb2R1Y2Npw7NuIFRvdGFsCgpgYGB7cn0KcGxvdCh4ID0gYmQxJEdlb2dyYXBoeSwgeSA9IGJkMSRUb3RhbF9Qcm9kdWNjacOzbiwgY29sPWJkMSRDb21wYW55Lk5hbWUsIG1haW4gPSAiR3JhZmljYSBEaXNwZXJzacOzbiIsIHhsYWIgPSAiR2VvZ3JhcGh5IiwgeWxhYiA9ICJUb3RhbF9Qcm9kdWNjacOzbiIsIGxhcz0xKQpgYGAKCiMjIyAqKlByb3B1ZXN0YXMgZGUgTWVqb3JhKioKCkNvbiBlc3RhIGJhc2UgZGUgZGF0b3Mgc2UgZXNwZXJhIGFuYWxpemFyIGxhIGluZm9ybWFjacOzbiBhY2VyY2EgZGUgbG9zIHBhw61zZXMgY29uIG1heW9yIHByb2R1Y2Npw7NuIGRlIGNhcnTDs24geSBjYWphcyBjb3JydWdhZGFzLiBGT1JNIHB1ZWRlIHRvbWFyIGdyYW4gdmVudGFqYSBkZWwgYW7DoWxpc2lzIGRlIGxhIGluZm9ybWFjacOzbiBxdWUgc2UgcHVlZGUgZXh0cmFlciBkZSBlc3RhIGJhc2UgZGUgZGF0b3MgcGFyYSBjb25vY2VyIHkgZGV0ZWN0YXIgw6FyZWFzIGRlIG9wb3J0dW5pZGFkIGRlIGNyZWNpbWllbnRvIHkgZW5mb2NhcnNlIGVuIGxvcyBwYcOtc2VzIGNvbiBtYXlvciBwcm9kdWNjacOzbi4gUG9yIGVzdG8gbGVzIHByb3BvbmVtb3MgbGFzIHNpZ3VpZW50ZXMgcHJvcHVlc3RhcyBkZSBtZWpvcmE6CgogIDEuIENvbm9jZXIgZWwgdXNvIHF1ZSBsZSBkYW4gYSBlc3RvcyBjYXJ0b25lcyB5IHZlciBzaSBwdWVkZSBwYXJ0aWNpcGFyIGNvbW8gcHJvdmVlZG9yIGRlIGNhcnTDs24gcGFyYSB2ZW5kZXIgYSB1biBwcmVjaW8gICAgICAgICAgICAgIGp1c3RvIGxhcyBtZXJtYXMgcXVlIEZPUk0gdGllbmUgZMOtYSB0cmFzIGTDrWFzIHkgZGUgZXNlIG1vZG8gZGFybGUgdW4gYnVlbiB1c28gYSBsYXMgc29icmFzIHkgb2J0ZW5lciBjaWVydGEgZ2FuYW5jaWEgZW4gbGFzICAgICAgICBtZXJtYXMgeSBkaXNtaW51aXIgIGxvcyBnYXN0b3MuIAogIAogIDIuIFBvciBlamVtcGxvIGxhIGJhc2UgZGUgZGF0b3MgIG5vcyBpbmRpY2EgcXVlIEVzdGFkb3MgVW5pZG9zIG9idHV2byB1bmEgcHJvZHVjY2nDs24gZGUgbcOhcyBkZSAzMjMsNTk0IG1pbGxvbmVzICBkZSBEw7NsYXJlcyBlbiAgICAgICAgbG9zIHVsdGltb3MgNiBhw7FvcyBhIGNvbXBhcmFjacOzbiBkZSBNw6l4aWNvIDczOCwyMTUgbWlsbG9uZXMgZGUgcGVzb3MuIEVzdGEgaW5mb3JtYWNpw7NuIHBlcm1pdGUgY29ub2NlciBlbCBtZXJjYWRvLCBkZXRlY3RhciAgICAgICAgb3BvcnR1bmlkYWRlcyBkZSBjcmVjaW1pZW50byB5IGNhbnRpZGFkIGRlIHByb2R1Y2Npw7NuIHF1ZSBzZSByZXF1aWVyZSBwb3IgcGHDrXMsIGRlIGVzdGEgbWFuZXJhIHB1ZWRlIHNhYmVyIHNpIHB1ZWRlIGNvbXBldGlyICAgICAgIEZPUk0gZW4gZWwgbWVyY2FkbyBkZSBFVUEuIAoKCiMjIyAqKkNvbmNsdXNpw7NuKioKClJlYWxpemFtb3MgZWwgYW5hbGlzaXMgZGUgbGEgcHJvZHVjY2nDs24gZGUgQ2FydG9uIGRlIGxvcyB1bHRpbW9zIDYgYcOxb3MsIGRlbCAyMDE2IGFsIDIwMjEuIFJlYWxpemFtb3MgdW5hIHRhYmxhIGRlIGZyZWN1ZW5jaWEsIGVuIGVsIGN1YWwgb2J0dXZpbW9zIHF1ZSBsYSBtb25lZGEgbyBlbCB0aXBvIGRlIG1vbmVkYSBjb24gZWwgcXVlIHNlIG1hbmVqYSBsYSBwcm9kdWNjacOzbiBlcyBsYSBkZSBFdXJvcy4gQXPDrSBtaXNtbyB0YW1iacOpbiByZWFsaXphbW9zIGdyYWZpY2FzIHBhcmEgcG9kZXIgYW5hbGlzYXIgbG9zIGRhdG9zIGN1YW50aXRhdGl2b3MgeSBjdWFsaXRhdGl2b3MsIGVuIGxvIHF1ZSBub3MgZGltb3MgY3VlbnRhIHF1ZSB0ZW5lbW9zIG3DoXMgZGF0b3MgY3VhbGl0YXRpdm9zIHF1ZSBjdWFudGl0YXRpdm9zLiBBbCByZWFsaXphciBlc3RhcyBncmFmaWNhcyBvYnR1dmltb3MgcXVlIGxvcyBxdWUgdGllbmVuIG1heW9yIHByb2R1Y2Npw7NuIGRlIGNhcnRvbiBkdXJhbnRlIGVzdG9zIDYgYcOxb3MsIHNvbiBJcmFuLCBWaWV0bmFtIHkgZSBJbmRvbmVzw61hLiBEaWNobyBhbmFsaXNpcyBwdWRvIHBlcm1pdGlybm9zIHZlciBxdWUgcGHDrXNlcyB0aWVuZW4gbWF5b3IgcGFydGljaXBhY2nDs24gZGVudHJvIGRlbCBtZXJjYWRvIGRlIENhcnRvbiB5IGNvcnJ1Z2FkbywgZXN0byBicmluZGEgbWF5b3IgaW5mb3JtYWNpw7NuIHBhcmEgaW5jbHVzbyB2ZXIgb3BjaW9uZXMgZGUgZXhwYW5zacOzbiBoYWPDrWEgb3Ryb3MgcGHDrXNlcywgbm8gc29sYW1lbnRlIGVuZm9jYWRvIGEgRVVBLCBsbyBxdWUgYXl1ZGFyw61hIGEgdGVuZXIgdW5hIHZpc2nDs24gYSBmdXR1cm8gcGFyYSBsYSBlbXByZXNhIGN1YW5kbyB0ZW5nYSB1biBjcmVjaW1pZW50byBtw6FzIGdsb2JhbC4gCg==