Contexto.

La segmentación o clusters es un conjunto de técnicas cuyo proposito es formar grupos apartir de elementos,

Estos datos son el resultado de un análisis químico de vinos cultivados en la región de Italia. Para este analisis se tomaron en cuenta diversos factores como el alcohol, el color, entre otros.

Más información:
Descripción de la base de datos ‘Vinos’

Pasos.

Paso 1

PInstalar paquetes y llamar librerías.

#install.packages("cluster")
library(cluster)
#install.packages("ggplot2")
library(ggplot2)
#install.packages("data.table")
library(data.table)
#install.packages("factoextra")
library(factoextra)

Paso 2

Obtener los datos.

library(readr)
wine <- read_csv("C:\\Users\\LuisD\\Documents\\Concentración\\wine.csv")
## Rows: 178 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (13): Alcohol, Malic_Acid, Ash, Ash_Alcanity, Magnesium, Total_Phenols, ...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#View(wine)
head(wine)
## # A tibble: 6 × 13
##   Alcohol Malic_Acid   Ash Ash_Alcanity Magnesium Total_Phenols Flavanoids
##     <dbl>      <dbl> <dbl>        <dbl>     <dbl>         <dbl>      <dbl>
## 1    14.2       1.71  2.43         15.6       127          2.8        3.06
## 2    13.2       1.78  2.14         11.2       100          2.65       2.76
## 3    13.2       2.36  2.67         18.6       101          2.8        3.24
## 4    14.4       1.95  2.5          16.8       113          3.85       3.49
## 5    13.2       2.59  2.87         21         118          2.8        2.69
## 6    14.2       1.76  2.45         15.2       112          3.27       3.39
## # ℹ 6 more variables: Nonflavanoid_Phenols <dbl>, Proanthocyanins <dbl>,
## #   Color_Intensity <dbl>, Hue <dbl>, OD280 <dbl>, Proline <dbl>

Paso 3

Conociendo nuestros datos.

str(wine)
## spc_tbl_ [178 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Alcohol             : num [1:178] 14.2 13.2 13.2 14.4 13.2 ...
##  $ Malic_Acid          : num [1:178] 1.71 1.78 2.36 1.95 2.59 1.76 1.87 2.15 1.64 1.35 ...
##  $ Ash                 : num [1:178] 2.43 2.14 2.67 2.5 2.87 2.45 2.45 2.61 2.17 2.27 ...
##  $ Ash_Alcanity        : num [1:178] 15.6 11.2 18.6 16.8 21 15.2 14.6 17.6 14 16 ...
##  $ Magnesium           : num [1:178] 127 100 101 113 118 112 96 121 97 98 ...
##  $ Total_Phenols       : num [1:178] 2.8 2.65 2.8 3.85 2.8 3.27 2.5 2.6 2.8 2.98 ...
##  $ Flavanoids          : num [1:178] 3.06 2.76 3.24 3.49 2.69 3.39 2.52 2.51 2.98 3.15 ...
##  $ Nonflavanoid_Phenols: num [1:178] 0.28 0.26 0.3 0.24 0.39 0.34 0.3 0.31 0.29 0.22 ...
##  $ Proanthocyanins     : num [1:178] 2.29 1.28 2.81 2.18 1.82 1.97 1.98 1.25 1.98 1.85 ...
##  $ Color_Intensity     : num [1:178] 5.64 4.38 5.68 7.8 4.32 6.75 5.25 5.05 5.2 7.22 ...
##  $ Hue                 : num [1:178] 1.04 1.05 1.03 0.86 1.04 1.05 1.02 1.06 1.08 1.01 ...
##  $ OD280               : num [1:178] 3.92 3.4 3.17 3.45 2.93 2.85 3.58 3.58 2.85 3.55 ...
##  $ Proline             : num [1:178] 1065 1050 1185 1480 735 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Alcohol = col_double(),
##   ..   Malic_Acid = col_double(),
##   ..   Ash = col_double(),
##   ..   Ash_Alcanity = col_double(),
##   ..   Magnesium = col_double(),
##   ..   Total_Phenols = col_double(),
##   ..   Flavanoids = col_double(),
##   ..   Nonflavanoid_Phenols = col_double(),
##   ..   Proanthocyanins = col_double(),
##   ..   Color_Intensity = col_double(),
##   ..   Hue = col_double(),
##   ..   OD280 = col_double(),
##   ..   Proline = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
summary(wine)
##     Alcohol        Malic_Acid         Ash         Ash_Alcanity  
##  Min.   :11.03   Min.   :0.740   Min.   :1.360   Min.   :10.60  
##  1st Qu.:12.36   1st Qu.:1.603   1st Qu.:2.210   1st Qu.:17.20  
##  Median :13.05   Median :1.865   Median :2.360   Median :19.50  
##  Mean   :13.00   Mean   :2.336   Mean   :2.367   Mean   :19.49  
##  3rd Qu.:13.68   3rd Qu.:3.083   3rd Qu.:2.558   3rd Qu.:21.50  
##  Max.   :14.83   Max.   :5.800   Max.   :3.230   Max.   :30.00  
##    Magnesium      Total_Phenols     Flavanoids    Nonflavanoid_Phenols
##  Min.   : 70.00   Min.   :0.980   Min.   :0.340   Min.   :0.1300      
##  1st Qu.: 88.00   1st Qu.:1.742   1st Qu.:1.205   1st Qu.:0.2700      
##  Median : 98.00   Median :2.355   Median :2.135   Median :0.3400      
##  Mean   : 99.74   Mean   :2.295   Mean   :2.029   Mean   :0.3619      
##  3rd Qu.:107.00   3rd Qu.:2.800   3rd Qu.:2.875   3rd Qu.:0.4375      
##  Max.   :162.00   Max.   :3.880   Max.   :5.080   Max.   :0.6600      
##  Proanthocyanins Color_Intensity       Hue             OD280      
##  Min.   :0.410   Min.   : 1.280   Min.   :0.4800   Min.   :1.270  
##  1st Qu.:1.250   1st Qu.: 3.220   1st Qu.:0.7825   1st Qu.:1.938  
##  Median :1.555   Median : 4.690   Median :0.9650   Median :2.780  
##  Mean   :1.591   Mean   : 5.058   Mean   :0.9574   Mean   :2.612  
##  3rd Qu.:1.950   3rd Qu.: 6.200   3rd Qu.:1.1200   3rd Qu.:3.170  
##  Max.   :3.580   Max.   :13.000   Max.   :1.7100   Max.   :4.000  
##     Proline      
##  Min.   : 278.0  
##  1st Qu.: 500.5  
##  Median : 673.5  
##  Mean   : 746.9  
##  3rd Qu.: 985.0  
##  Max.   :1680.0
nulos<- colSums(is.na(wine))
nulos
##              Alcohol           Malic_Acid                  Ash 
##                    0                    0                    0 
##         Ash_Alcanity            Magnesium        Total_Phenols 
##                    0                    0                    0 
##           Flavanoids Nonflavanoid_Phenols      Proanthocyanins 
##                    0                    0                    0 
##      Color_Intensity                  Hue                OD280 
##                    0                    0                    0 
##              Proline 
##                    0

Paso 4

Escalar los datos.

scaled_wine <- scale(wine) #para escalar los datos

Paso 5

Asignar una cantidad de grupos.

grupos <- 3 #Numero de grupos random

Paso 6

Generar los segmentos.

segmentos <- kmeans(scaled_wine,grupos)
segmentos
## K-means clustering with 3 clusters of sizes 65, 62, 51
## 
## Cluster means:
##      Alcohol Malic_Acid        Ash Ash_Alcanity   Magnesium Total_Phenols
## 1 -0.9234669 -0.3929331 -0.4931257    0.1701220 -0.49032869   -0.07576891
## 2  0.8328826 -0.3029551  0.3636801   -0.6084749  0.57596208    0.88274724
## 3  0.1644436  0.8690954  0.1863726    0.5228924 -0.07526047   -0.97657548
##    Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity        Hue
## 1  0.02075402          -0.03343924      0.05810161      -0.8993770  0.4605046
## 2  0.97506900          -0.56050853      0.57865427       0.1705823  0.4726504
## 3 -1.21182921           0.72402116     -0.77751312       0.9388902 -1.1615122
##        OD280    Proline
## 1  0.2700025 -0.7517257
## 2  0.7770551  1.1220202
## 3 -1.2887761 -0.4059428
## 
## Clustering vector:
##   [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##  [38] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 3 1 1 1 1 1 1 1 1 1 1 1 2
##  [75] 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [112] 1 1 1 1 1 1 1 3 1 1 2 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [149] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## 
## Within cluster sum of squares by cluster:
## [1] 558.6971 385.6983 326.3537
##  (between_SS / total_SS =  44.8 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Paso 7

Asignar el grupo al que pertenece cada observación.

asignacion <- cbind(wine, cluster = segmentos$cluster)
head(asignacion)
##   Alcohol Malic_Acid  Ash Ash_Alcanity Magnesium Total_Phenols Flavanoids
## 1   14.23       1.71 2.43         15.6       127          2.80       3.06
## 2   13.20       1.78 2.14         11.2       100          2.65       2.76
## 3   13.16       2.36 2.67         18.6       101          2.80       3.24
## 4   14.37       1.95 2.50         16.8       113          3.85       3.49
## 5   13.24       2.59 2.87         21.0       118          2.80       2.69
## 6   14.20       1.76 2.45         15.2       112          3.27       3.39
##   Nonflavanoid_Phenols Proanthocyanins Color_Intensity  Hue OD280 Proline
## 1                 0.28            2.29            5.64 1.04  3.92    1065
## 2                 0.26            1.28            4.38 1.05  3.40    1050
## 3                 0.30            2.81            5.68 1.03  3.17    1185
## 4                 0.24            2.18            7.80 0.86  3.45    1480
## 5                 0.39            1.82            4.32 1.04  2.93     735
## 6                 0.34            1.97            6.75 1.05  2.85    1450
##   cluster
## 1       2
## 2       2
## 3       2
## 4       2
## 5       2
## 6       2
#asignacion

Paso 8

Graficar los clusters.

fviz_cluster(segmentos, data=scaled_wine)

Paso 9

Optimizar el cantidad de grupos.

#La cantidad óptima de grupos corresponde al punto más alto de la siguiente gráfica.

set.seed(123)
optimizacion <- clusGap(scaled_wine, FUN = kmeans, nstart=1, K.max = 10)
plot(optimizacion, xlab= 'Número de clusters k')

Nos indica la gráfica que el punto de cluster más alto que existe es de 8, así que cambiamos nuestro número de grupos en la parte de arriba.

Paso 10

Comparación de segmentos.

cluster_prom <- aggregate(. ~ cluster, data=asignacion, FUN=mean)
cluster_prom
##   cluster  Alcohol Malic_Acid      Ash Ash_Alcanity Magnesium Total_Phenols
## 1       1 12.25092   1.897385 2.231231     20.06308  92.73846      2.247692
## 2       2 13.67677   1.997903 2.466290     17.46290 107.96774      2.847581
## 3       3 13.13412   3.307255 2.417647     21.24118  98.66667      1.683922
##   Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity       Hue
## 1  2.0500000            0.3576923        1.624154        2.973077 1.0627077
## 2  3.0032258            0.2920968        1.922097        5.453548 1.0654839
## 3  0.8188235            0.4519608        1.145882        7.234706 0.6919608
##      OD280   Proline
## 1 2.803385  510.1692
## 2 3.163387 1100.2258
## 3 1.696667  619.0588

Conclusión.

Dentro de nuestro df se pudieron identificar 3 tipos de clusters distintos:

Clúster 1: Los vinos en este cluster tienen niveles relativamente altos de alcohol y ácido málico en comparación con los otros clusters. También tienen una alcalinidad de las cenizas más alta. Sin embargo, tienen niveles bajos de fenoles totales, flavonoides, proantocianidinas y color de intensidad. Tienen un tono de color más claro y una concentración de proline moderada.

Clúster 2: Los vinos en este cluster tienen un nivel moderado de alcohol y ácido málico. La alcalinidad de las cenizas es relativamente baja. Tienen los niveles más altos de fenoles totales, flavonoides, proantocianidinas y color de intensidad entre los tres clusters. Tienen un color más intenso y una concentración de proline más alta.

Clúster 3: Los vinos en este cluster tienen los niveles más bajos de alcohol y ácido málico. La alcalinidad de las cenizas está en el rango intermedio. Tienen niveles moderados de fenoles totales, flavonoides y proantocianidinas. Tienen el color de intensidad más bajo entre los tres clusters y una concentración de proline moderada..

LS0tDQp0aXRsZTogIlNlZ21lbnRhY2nDs24gKENsdXN0ZXJpbmcpIFZpbm9zIg0KYXV0aG9yOiAiTHVpcyBEYXZpZCBTw6BuY2hleiBDYXN0aWxsbyAtIEEwMTI3NTY1NSINCmRhdGU6ICIyMDI0LTAyLTE5Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IHNpbXBsZXggDQotLS0gIA0KDQohW10oQzpcXFVzZXJzXFxMdWlzRFxcRG9jdW1lbnRzXFxDb25jZW50cmFjacOzblxcdmlub3MucG5nKQ0KDQoNCiMgPHNwYW4gc3R5bGU9ICJjb2xvcjogIzhCMUExQSI+Q29udGV4dG8uPC9zcGFuPiAgDQoNCkxhICoqc2VnbWVudGFjacOzbioqIG8gKipjbHVzdGVycyoqIGVzIHVuIGNvbmp1bnRvIGRlIHTDqWNuaWNhcyBjdXlvIHByb3Bvc2l0byBlcyBmb3JtYXIgZ3J1cG9zIGFwYXJ0aXIgZGUgZWxlbWVudG9zLCANCg0KDQpFc3RvcyBkYXRvcyBzb24gZWwgcmVzdWx0YWRvIGRlIHVuIGFuw6FsaXNpcyBxdcOtbWljbyBkZSB2aW5vcyBjdWx0aXZhZG9zIGVuIGxhIHJlZ2nDs24gZGUgSXRhbGlhLiBQYXJhIGVzdGUgYW5hbGlzaXMgc2UgdG9tYXJvbiBlbiBjdWVudGEgZGl2ZXJzb3MgZmFjdG9yZXMgY29tbyBlbCBhbGNvaG9sLCBlbCBjb2xvciwgZW50cmUgb3Ryb3MuDQoNCg0KTcOhcyBpbmZvcm1hY2nDs246ICANCltEZXNjcmlwY2nDs24gZGUgbGEgYmFzZSBkZSBkYXRvcyAnVmlub3MnXShodHRwczovL3NlYXJjaC5yLXByb2plY3Qub3JnL0NSQU4vcmVmbWFucy9IRGNsYXNzaWYvaHRtbC93aW5lLmh0bWwpDQoNCiMgPHNwYW4gc3R5bGU9ICJjb2xvcjogIzhCMUExQSI+UGFzb3MuIDwvc3Bhbj4gDQoNCiMjIDxzcGFuIHN0eWxlPSAiY29sb3I6ICM4QjFBMUEiPlBhc28gMTwvc3Bhbj4gDQojIyMgPHNwYW4gc3R5bGU9ICJjb2xvcjogIzhCMUExQSI+UEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMuPC9zcGFuPiANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKCJjbHVzdGVyIikNCmxpYnJhcnkoY2x1c3RlcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCmxpYnJhcnkoZ2dwbG90MikNCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhLnRhYmxlIikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJmYWN0b2V4dHJhIikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0gImNvbG9yOiAjOEIxQTFBIj5QYXNvIDI8L3NwYW4+ICANCiMjIyA8c3BhbiBzdHlsZT0gImNvbG9yOiAjOEIxQTFBIj5PYnRlbmVyIGxvcyBkYXRvcy48L3NwYW4+ICANCmBgYHtyfQ0KbGlicmFyeShyZWFkcikNCndpbmUgPC0gcmVhZF9jc3YoIkM6XFxVc2Vyc1xcTHVpc0RcXERvY3VtZW50c1xcQ29uY2VudHJhY2nDs25cXHdpbmUuY3N2IikNCiNWaWV3KHdpbmUpDQpoZWFkKHdpbmUpDQpgYGANCg0KDQojIyA8c3BhbiBzdHlsZT0gImNvbG9yOiAjOEIxQTFBIj5QYXNvIDM8L3NwYW4+ICANCiMjIyA8c3BhbiBzdHlsZT0gImNvbG9yOiAjOEIxQTFBIj5Db25vY2llbmRvIG51ZXN0cm9zIGRhdG9zLjwvc3Bhbj4gIA0KDQpgYGB7cn0NCnN0cih3aW5lKQ0KYGBgDQoNCg0KYGBge3J9DQpzdW1tYXJ5KHdpbmUpDQpgYGANCg0KYGBge3J9DQpudWxvczwtIGNvbFN1bXMoaXMubmEod2luZSkpDQpudWxvcw0KYGBgDQoNCg0KIyMgPHNwYW4gc3R5bGU9ICJjb2xvcjogIzhCMUExQSI+UGFzbyA0PC9zcGFuPg0KIyMjIDxzcGFuIHN0eWxlPSAiY29sb3I6ICM4QjFBMUEiPkVzY2FsYXIgbG9zIGRhdG9zLjwvc3Bhbj4NCg0KYGBge3J9DQpzY2FsZWRfd2luZSA8LSBzY2FsZSh3aW5lKSAjcGFyYSBlc2NhbGFyIGxvcyBkYXRvcw0KYGBgDQoNCg0KDQojIyA8c3BhbiBzdHlsZT0gImNvbG9yOiAjOEIxQTFBIj5QYXNvIDU8L3NwYW4+ICANCiMjIyA8c3BhbiBzdHlsZT0gImNvbG9yOiAjOEIxQTFBIj5Bc2lnbmFyIHVuYSBjYW50aWRhZCBkZSBncnVwb3MuPC9zcGFuPiAgDQoNCmBgYHtyfQ0KZ3J1cG9zIDwtIDMgI051bWVybyBkZSBncnVwb3MgcmFuZG9tDQpgYGANCg0KDQoNCiMjICA8c3BhbiBzdHlsZT0gImNvbG9yOiAjOEIxQTFBIj5QYXNvIDY8L3NwYW4+DQojIyAgPHNwYW4gc3R5bGU9ICJjb2xvcjogIzhCMUExQSI+R2VuZXJhciBsb3Mgc2VnbWVudG9zLjwvc3Bhbj4gIA0KDQpgYGB7cn0NCnNlZ21lbnRvcyA8LSBrbWVhbnMoc2NhbGVkX3dpbmUsZ3J1cG9zKQ0Kc2VnbWVudG9zDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ICJjb2xvcjogIzhCMUExQSI+UGFzbyA3IDwvc3Bhbj4gIA0KIyMjIDxzcGFuIHN0eWxlPSAiY29sb3I6ICM4QjFBMUEiPkFzaWduYXIgZWwgZ3J1cG8gYWwgcXVlIHBlcnRlbmVjZSBjYWRhIG9ic2VydmFjacOzbi48L3NwYW4+ICANCg0KYGBge3J9DQphc2lnbmFjaW9uIDwtIGNiaW5kKHdpbmUsIGNsdXN0ZXIgPSBzZWdtZW50b3MkY2x1c3RlcikNCmhlYWQoYXNpZ25hY2lvbikNCiNhc2lnbmFjaW9uDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ICJjb2xvcjogIzhCMUExQSI+UGFzbyA4PC9zcGFuPg0KIyMgPHNwYW4gc3R5bGU9ICJjb2xvcjogIzhCMUExQSI+R3JhZmljYXIgbG9zIGNsdXN0ZXJzLjwvc3Bhbj4NCg0KYGBge3J9DQpmdml6X2NsdXN0ZXIoc2VnbWVudG9zLCBkYXRhPXNjYWxlZF93aW5lKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSAiY29sb3I6ICM4QjFBMUEiPlBhc28gOTwvc3Bhbj4NCiMjIyA8c3BhbiBzdHlsZT0gImNvbG9yOiAjOEIxQTFBIj5PcHRpbWl6YXIgZWwgY2FudGlkYWQgZGUgZ3J1cG9zLjwvc3Bhbj4NCg0KYGBge3J9DQojTGEgY2FudGlkYWQgw7NwdGltYSBkZSBncnVwb3MgY29ycmVzcG9uZGUgYWwgcHVudG8gbcOhcyBhbHRvIGRlIGxhIHNpZ3VpZW50ZSBncsOhZmljYS4NCg0Kc2V0LnNlZWQoMTIzKQ0Kb3B0aW1pemFjaW9uIDwtIGNsdXNHYXAoc2NhbGVkX3dpbmUsIEZVTiA9IGttZWFucywgbnN0YXJ0PTEsIEsubWF4ID0gMTApDQpwbG90KG9wdGltaXphY2lvbiwgeGxhYj0gJ07Dum1lcm8gZGUgY2x1c3RlcnMgaycpDQpgYGANCk5vcyBpbmRpY2EgbGEgZ3LDoWZpY2EgcXVlIGVsIHB1bnRvIGRlIGNsdXN0ZXIgbcOhcyBhbHRvIHF1ZSBleGlzdGUgZXMgZGUgOCwgYXPDrSBxdWUgY2FtYmlhbW9zIG51ZXN0cm8gbsO6bWVybyBkZSBncnVwb3MgZW4gbGEgcGFydGUgZGUgYXJyaWJhLg0KDQoNCiMjIDxzcGFuIHN0eWxlPSAiY29sb3I6ICM4QjFBMUEiPlBhc28gMTA8L3NwYW4+DQojIyMgPHNwYW4gc3R5bGU9ICJjb2xvcjogIzhCMUExQSI+Q29tcGFyYWNpw7NuIGRlIHNlZ21lbnRvcy48L3NwYW4+DQoNCmBgYHtyfQ0KY2x1c3Rlcl9wcm9tIDwtIGFnZ3JlZ2F0ZSguIH4gY2x1c3RlciwgZGF0YT1hc2lnbmFjaW9uLCBGVU49bWVhbikNCmNsdXN0ZXJfcHJvbQ0KYGBgDQoNCg0KDQojIDxzcGFuIHN0eWxlPSAiY29sb3I6ICM4QjFBMUEiPkNvbmNsdXNpw7NuLjwvc3Bhbj4gDQoNCiMjIyANCkRlbnRybyBkZSBudWVzdHJvIGRmIHNlIHB1ZGllcm9uIGlkZW50aWZpY2FyIDMgdGlwb3MgZGUgY2x1c3RlcnMgZGlzdGludG9zOiAgDQoNCkNsw7pzdGVyIDE6IExvcyB2aW5vcyBlbiBlc3RlIGNsdXN0ZXIgdGllbmVuIG5pdmVsZXMgcmVsYXRpdmFtZW50ZSBhbHRvcyBkZSBhbGNvaG9sIHkgw6FjaWRvIG3DoWxpY28gZW4gY29tcGFyYWNpw7NuIGNvbiBsb3Mgb3Ryb3MgY2x1c3RlcnMuIFRhbWJpw6luIHRpZW5lbiB1bmEgYWxjYWxpbmlkYWQgZGUgbGFzIGNlbml6YXMgbcOhcyBhbHRhLiBTaW4gZW1iYXJnbywgdGllbmVuIG5pdmVsZXMgYmFqb3MgZGUgZmVub2xlcyB0b3RhbGVzLCBmbGF2b25vaWRlcywgcHJvYW50b2NpYW5pZGluYXMgeSBjb2xvciBkZSBpbnRlbnNpZGFkLiBUaWVuZW4gdW4gdG9ubyBkZSBjb2xvciBtw6FzIGNsYXJvIHkgdW5hIGNvbmNlbnRyYWNpw7NuIGRlIHByb2xpbmUgbW9kZXJhZGEuDQoNCkNsw7pzdGVyIDI6IExvcyB2aW5vcyBlbiBlc3RlIGNsdXN0ZXIgdGllbmVuIHVuIG5pdmVsIG1vZGVyYWRvIGRlIGFsY29ob2wgeSDDoWNpZG8gbcOhbGljby4gTGEgYWxjYWxpbmlkYWQgZGUgbGFzIGNlbml6YXMgZXMgcmVsYXRpdmFtZW50ZSBiYWphLiBUaWVuZW4gbG9zIG5pdmVsZXMgbcOhcyBhbHRvcyBkZSBmZW5vbGVzIHRvdGFsZXMsIGZsYXZvbm9pZGVzLCBwcm9hbnRvY2lhbmlkaW5hcyB5IGNvbG9yIGRlIGludGVuc2lkYWQgZW50cmUgbG9zIHRyZXMgY2x1c3RlcnMuIFRpZW5lbiB1biBjb2xvciBtw6FzIGludGVuc28geSB1bmEgY29uY2VudHJhY2nDs24gZGUgcHJvbGluZSBtw6FzIGFsdGEuDQoNCkNsw7pzdGVyIDM6IExvcyB2aW5vcyBlbiBlc3RlIGNsdXN0ZXIgdGllbmVuIGxvcyBuaXZlbGVzIG3DoXMgYmFqb3MgZGUgYWxjb2hvbCB5IMOhY2lkbyBtw6FsaWNvLiBMYSBhbGNhbGluaWRhZCBkZSBsYXMgY2VuaXphcyBlc3TDoSBlbiBlbCByYW5nbyBpbnRlcm1lZGlvLiBUaWVuZW4gbml2ZWxlcyBtb2RlcmFkb3MgZGUgZmVub2xlcyB0b3RhbGVzLCBmbGF2b25vaWRlcyB5IHByb2FudG9jaWFuaWRpbmFzLiBUaWVuZW4gZWwgY29sb3IgZGUgaW50ZW5zaWRhZCBtw6FzIGJham8gZW50cmUgbG9zIHRyZXMgY2x1c3RlcnMgeSB1bmEgY29uY2VudHJhY2nDs24gZGUgcHJvbGluZSBtb2RlcmFkYS4uIA0KDQoNCg0KDQoNCg0KIA==