A6U1 | Equipo 3

Jose Alfredo Núñez, Mario Alejandro Salcedo, Carlos Arturo Valle, Julio Mario Mejia

3/4/2022

Caso de estudio | Seguro Medico y Salario

Para este caso de estudio utilizaremos el set de datos wage que se encuentra en el paquete ISLR.

imagen1.1 Entre mejor sea el salario de una persona, ¿tendrá Seguro Medico?

Importacion de Bibliotecas

library(pacman)
p_load("prettydoc","ISLR", "ggplot2", "xfun","DT","cluster")

Datos ‘Wages’

A continuacion se muestran los datos a manera de tabla, los cuales seran utilizados para este caso de estudio:

datatable(Wage)

Utilizando k-means determinamos la posibilidad de predecir si una persona tiene o no tiene seguro médico utilizando como dato de entrada cuanto gana.

La hipótesis es que las personas más adineradas tienen seguro médico dado que pueden costearlo.

Separamos y extraemos los datos que utilizaremos para la clasificacion no supervisada (k-means).

 wages <- data.frame(wage=Wage$wage,age=Wage$age,health_ins=Wage$health_ins)
  
  
 datatable(wages)

Tal como se muestra en la tabla tenemos las edades, sueldo logaritmico, y si es que cuenta con seguro.

Gráfica

ggplot(wages, aes(wage,age)) + geom_point(aes (col=health_ins), size=3   )

Podemos observar en la gráfica las personas que cuentan con seguro están marcadas de rojo, y las personas sin servicio médico están marcadas de azul.

A simple vista podemos asumir que las personas que cuentan con un servicio médico predominan, aunque podemos observar que en la mayría de los casos las personas con servicio son personas que superan los 20 años y cuentan con un sueldo mayor a 100, mientras que las personas sin servicio, suelen ser los más jovenes y con un sueldo bajo, claro que existen excepciones.

Clusters K-means

Clasificación

Creamos nuestro clusters para clasificar.

wagesCluster <- kmeans(wages[,1:2],centers=2, nstart = 20)

wagesCluster
## K-means clustering with 2 clusters of sizes 2261, 739
## 
## Cluster means:
##        wage      age
## 1  94.05367 41.44449
## 2 165.70429 45.38295
## 
## Clustering vector:
##    [1] 1 1 2 2 1 1 2 1 1 1 1 1 1 2 2 1 1 2 1 1 2 1 1 2 1 2 1 1 1 1 2 1 1 1 1 1 1
##   [38] 1 1 1 1 1 1 1 1 2 2 2 1 1 2 1 2 1 1 1 2 2 1 1 2 1 1 1 1 1 2 2 1 1 1 1 1 1
##   [75] 1 1 2 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1
##  [112] 1 1 1 1 1 1 2 2 1 1 1 2 2 1 1 2 1 1 1 1 2 2 1 2 1 1 1 1 1 1 1 1 1 1 1 2 2
##  [149] 2 1 1 2 1 1 2 2 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 2 2 1 2 1 2 1 1 1 1 1 2
##  [186] 1 1 1 1 1 2 1 1 1 2 2 1 2 1 1 1 1 1 1 1 1 2 2 2 1 2 1 2 1 1 1 2 1 1 1 1 1
##  [223] 1 2 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2
##  [260] 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 2 1 1 1
##  [297] 1 1 2 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 2 1
##  [334] 1 2 1 1 1 1 1 1 1 1 1 2 1 1 2 2 2 2 2 1 1 2 1 1 1 1 1 1 2 2 1 1 1 1 1 2 2
##  [371] 1 1 1 2 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##  [408] 1 1 1 2 1 1 1 2 1 1 1 2 1 1 1 2 2 2 2 1 1 1 2 1 1 2 1 1 1 1 1 2 1 1 1 2 1
##  [445] 1 1 1 2 2 2 1 2 1 1 1 2 1 1 2 2 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1
##  [482] 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 2 1 2
##  [519] 1 2 1 2 1 1 1 2 2 2 1 1 1 1 1 2 1 2 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 1 2 2 1
##  [556] 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 2 1 1 1 1
##  [593] 1 1 1 1 1 1 2 1 1 1 2 2 2 1 1 1 2 1 1 1 2 1 1 1 1 1 1 2 2 1 1 1 2 1 1 2 2
##  [630] 2 1 2 2 1 1 2 1 1 1 1 1 1 2 1 1 2 1 1 1 1 2 1 2 1 2 1 1 2 1 1 1 1 1 1 1 1
##  [667] 2 1 2 1 2 1 2 1 1 1 1 1 1 2 2 1 1 1 1 1 2 1 2 1 1 2 1 2 1 1 1 2 2 1 1 1 2
##  [704] 1 2 2 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 2 1 2 2 2 2 2 1 1 1 1 2
##  [741] 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 2 2 1 1 2 1 1 1 1 1 1 2 2 1 1 1 1 2 1 1 1
##  [778] 1 1 1 2 1 2 1 2 1 1 2 2 2 1 2 2 1 1 1 2 2 1 2 1 2 1 2 1 1 2 1 1 2 1 1 1 1
##  [815] 1 1 1 2 1 2 1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1
##  [852] 1 1 1 1 2 1 2 1 1 1 2 2 2 1 1 2 2 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1
##  [889] 1 1 1 1 2 1 1 1 1 1 2 1 1 2 1 1 1 1 2 2 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 1
##  [926] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 2 1 1 1 2 2 1 2 1 2 2 1 1 1 1 2
##  [963] 1 1 1 1 1 2 2 1 1 2 1 1 1 1 2 2 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1
## [1000] 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 2 1 1 1 1 2 1 1 2 1 1 1 1 1 1
## [1037] 2 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [1074] 1 1 1 1 2 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1
## [1111] 1 2 2 1 1 1 1 1 1 1 1 2 1 2 1 1 1 2 1 2 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1
## [1148] 1 2 1 1 1 2 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 2 1
## [1185] 2 2 1 2 1 2 1 1 2 1 1 2 1 2 2 1 2 1 1 1 2 1 1 1 1 1 2 1 2 1 2 1 1 1 1 2 2
## [1222] 1 1 1 1 2 1 1 1 2 1 1 1 2 1 1 1 1 2 2 1 1 1 1 1 1 1 2 1 1 2 2 1 1 1 1 2 1
## [1259] 1 2 1 1 1 1 1 2 1 1 2 1 1 2 1 2 1 2 1 1 1 1 1 2 2 2 1 1 1 2 2 1 1 1 1 2 1
## [1296] 1 2 1 1 1 2 1 1 2 1 2 1 2 1 2 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 2
## [1333] 1 1 1 1 2 1 1 1 1 1 2 2 1 2 1 1 1 1 2 1 2 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1
## [1370] 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1
## [1407] 1 1 1 1 2 1 1 1 1 1 1 1 2 1 2 1 2 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 1 1 1 2 1
## [1444] 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1
## [1481] 2 2 1 2 2 2 1 2 1 1 1 1 1 1 1 1 2 2 1 2 1 1 1 1 1 2 2 2 1 1 1 1 2 2 1 2 1
## [1518] 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 2 2
## [1555] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 2 2 1 1 2 1 2 1 1 1 1
## [1592] 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 2 2 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1
## [1629] 1 1 1 1 2 1 1 2 2 2 1 1 1 1 2 1 1 1 1 1 1 1 1 2 2 1 2 1 1 1 1 1 1 2 1 1 1
## [1666] 1 1 2 1 2 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 2 2 1 1 1 1 2 1 2 1 1 1 2 1 1 1 2
## [1703] 1 2 2 1 1 1 1 1 1 2 2 1 2 1 2 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1
## [1740] 1 1 2 1 2 1 1 1 2 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 1
## [1777] 2 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1
## [1814] 1 2 1 1 1 1 1 1 1 2 1 2 1 1 2 2 1 1 1 1 2 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1
## [1851] 1 1 1 1 1 1 1 1 2 1 1 1 1 2 2 1 1 1 1 1 2 1 2 2 2 1 1 1 1 1 2 1 2 1 2 1 1
## [1888] 1 1 1 1 2 1 1 1 2 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2
## [1925] 1 1 1 1 1 2 2 1 1 1 2 1 1 1 1 1 1 1 1 2 1 2 2 1 1 1 1 1 1 2 1 1 2 1 1 1 1
## [1962] 1 1 1 1 1 1 1 1 2 2 1 2 1 1 1 1 2 1 1 2 1 1 1 2 1 1 1 1 2 1 2 1 2 1 2 1 2
## [1999] 1 2 1 1 1 2 1 2 2 1 1 1 1 1 1 1 1 1 2 1 2 2 1 1 1 1 1 1 2 1 1 1 1 2 1 1 1
## [2036] 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 2 1 1 1 2 1 1 1 1 1 2 2 1 1
## [2073] 1 1 1 2 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 2 2
## [2110] 1 2 1 1 1 2 2 2 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1
## [2147] 2 1 2 1 1 2 1 1 1 2 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 2 1 2 2
## [2184] 1 2 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1
## [2221] 1 2 1 2 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1
## [2258] 2 1 1 1 2 1 1 2 1 1 1 1 2 1 2 2 1 1 1 1 1 2 1 2 2 1 2 1 1 2 1 2 1 2 1 1 1
## [2295] 1 1 1 1 1 2 1 1 1 2 1 1 1 2 1 2 2 2 1 1 2 1 1 1 1 2 1 1 1 1 2 1 1 1 1 1 1
## [2332] 2 2 1 2 1 2 1 1 2 1 1 1 1 1 1 1 1 2 1 1 2 2 1 2 1 1 2 1 1 1 2 1 1 1 1 1 1
## [2369] 2 2 1 2 1 1 1 2 2 1 1 1 1 2 2 1 2 1 1 1 1 2 1 1 1 1 1 1 2 1 2 1 1 1 1 2 1
## [2406] 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1
## [2443] 1 1 2 2 1 1 1 2 2 2 1 1 1 1 1 2 1 1 2 2 1 1 1 1 2 1 1 1 1 2 2 1 1 2 1 2 1
## [2480] 1 1 2 1 1 1 1 1 2 1 1 1 1 2 1 1 1 1 2 1 1 2 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1
## [2517] 1 1 2 1 2 1 1 2 1 1 1 1 1 1 1 2 2 1 1 2 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1
## [2554] 1 2 1 2 2 1 1 1 2 2 1 2 2 1 1 2 1 1 1 2 1 1 1 1 1 1 1 2 1 1 2 1 1 1 2 2 1
## [2591] 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 2 2 1 1 2 1 1 1 1 2 1 2 1 1 2 1 1 1 2 1 1
## [2628] 1 1 2 2 1 2 1 1 1 1 1 1 1 2 1 2 1 2 1 2 2 1 2 1 1 1 1 1 1 2 1 1 1 1 1 2 2
## [2665] 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 2 2 1 1 2 2 1 2 1 2 1 2 1 1 1 1
## [2702] 1 2 1 2 2 1 1 1 2 1 1 2 1 1 2 1 1 1 2 1 1 2 2 1 2 2 2 2 1 1 1 1 2 1 1 1 1
## [2739] 1 1 1 2 1 1 1 1 1 1 2 1 1 1 2 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2
## [2776] 1 2 1 1 2 1 1 2 1 2 1 1 1 1 2 1 1 1 1 2 1 2 1 1 1 1 2 1 2 2 2 1 1 2 1 1 1
## [2813] 1 1 2 1 1 1 1 1 2 1 1 1 1 1 2 1 1 2 2 1 2 2 2 1 2 1 1 1 2 2 2 1 1 1 2 1 1
## [2850] 2 1 1 1 1 1 1 2 2 2 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1
## [2887] 1 1 2 2 1 1 1 2 1 1 1 1 1 2 1 2 1 2 1 1 1 1 1 2 1 2 1 1 1 1 2 1 1 1 2 1 1
## [2924] 1 2 2 1 1 2 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1
## [2961] 1 1 1 1 1 1 1 1 1 1 2 2 1 2 1 1 1 1 1 2 1 1 2 1 1 1 2 2 1 2 2 1 1 1 2 2 1
## [2998] 1 1 1
## 
## Within cluster sum of squares by cluster:
## [1] 1342984 1410685
##  (between_SS / total_SS =  51.0 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Comparación

Comparamos el cluster con nuestra seleccion de datos

table(wagesCluster$cluster,wages$health_ins)
##    
##     1. Yes 2. No
##   1   1437   824
##   2    646    93

Agrupación

Agrupamos los cluster’s

clusplot(wages[1:2], wagesCluster$cluster, color=T, shade=T, lines=0)

Podemos observar que hay mucha coincidencias entre el hecho de tener un salario alto y contar con un servicio médico, por lo que realizaremos el método de codo para de mejor manera los clusters de los datos.

tot.withinss <- vector(mode="character", length = 20)

for (i in 1:20){
  
 wagesCluster <- kmeans(wages[,1:2], center=i, nstart=20)
  tot.withinss[i] <- wagesCluster$tot.withinss
}

tot.withinss
##  [1] "5621633.92437929" "2753669.4795475"  "1469609.6299398"  "947279.806487967"
##  [5] "735748.831721912" "612592.773178981" "505911.324925544" "439829.254396146"
##  [9] "386955.064563823" "343525.297444354" "313735.521696539" "288813.878837243"
## [13] "269053.591824997" "250282.50690359"  "231997.712014997" "219004.682722938"
## [17] "207771.433705589" "196585.41803971"  "185609.684378564" "176939.205301344"
plot(1:20, tot.withinss, type="b", pch=19, cex=.5)

Conclusion

Después de éste estudio, se puede concluir que si hay una relación entre tener un sueldo alto y contar con servicio médico, ya que seria muy normal tomar en cuenta que alguien con un sueldo alto se puede costear un servicio médico, mientras que alguien sin un buen sueldo sería muy dificil.

Descarga este modelo

xfun::embed_file("A6U1.Rmd")

Download A6U1.Rmd

LS0tDQp0aXRsZTogIkE2VTEgfCBFcXVpcG8gMyINCmF1dGhvcjogIkpvc2UgQWxmcmVkbyBOw7rDsWV6LCBNYXJpbyBBbGVqYW5kcm8gU2FsY2VkbywgQ2FybG9zIEFydHVybyBWYWxsZSwgSnVsaW8gTWFyaW8gTWVqaWEiDQpkYXRlOiAiMy80LzIwMjIiDQpvdXRwdXQ6IA0KICBybWRmb3JtYXRzOjpkb3duY3V0ZToNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgZGVmYXVsdDogZGFyaw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojICpDYXNvIGRlIGVzdHVkaW8gfCBTZWd1cm8gTWVkaWNvIHkgU2FsYXJpbyoNCg0KUGFyYSBlc3RlIGNhc28gZGUgZXN0dWRpbyB1dGlsaXphcmVtb3MgZWwgc2V0IGRlIGRhdG9zICoqd2FnZSoqIHF1ZSBzZSBlbmN1ZW50cmEgZW4gZWwgcGFxdWV0ZSBJU0xSLg0KDQohW19faW1hZ2VuMS4xX18gX19fRW50cmUgbWVqb3Igc2VhIGVsIHNhbGFyaW8gZGUgdW5hIHBlcnNvbmEsIMK/dGVuZHLDoSBTZWd1cm8gTWVkaWNvP19fX10oaHR0cHM6Ly93d3cuY29uc2FsdWQuZXMvdXBsb2Fkcy9zMS8xNS8zMy85Mi8zL2VzdGV0b3Njb3Bpby15LXNhbGFyaW8tZW4tZXVyb3MtZm90by1waXhhYmF5LTEuanBlZykNCg0KDQojIyAqKkltcG9ydGFjaW9uIGRlIEJpYmxpb3RlY2FzKioNCg0KYGBge3J9DQpsaWJyYXJ5KHBhY21hbikNCnBfbG9hZCgicHJldHR5ZG9jIiwiSVNMUiIsICJnZ3Bsb3QyIiwgInhmdW4iLCJEVCIsImNsdXN0ZXIiKQ0KDQpgYGANCg0KIyMgKipEYXRvcyAnV2FnZXMnKioNCg0KQSBjb250aW51YWNpb24gc2UgbXVlc3RyYW4gbG9zIGRhdG9zIGEgbWFuZXJhIGRlIHRhYmxhLCBsb3MgY3VhbGVzIHNlcmFuIHV0aWxpemFkb3MgcGFyYSBlc3RlIGNhc28gZGUgZXN0dWRpbzoNCg0KDQpgYGB7cn0NCg0KZGF0YXRhYmxlKFdhZ2UpDQoNCmBgYAkNCg0KVXRpbGl6YW5kbyBrLW1lYW5zIGRldGVybWluYW1vcyBsYSBwb3NpYmlsaWRhZCBkZSBwcmVkZWNpciBzaSB1bmEgcGVyc29uYSB0aWVuZSBvIG5vIHRpZW5lIHNlZ3VybyBtw6lkaWNvIHV0aWxpemFuZG8gY29tbyBkYXRvIGRlIGVudHJhZGEgY3VhbnRvIGdhbmEuDQoNCkxhIGhpcMOzdGVzaXMgZXMgcXVlIGxhcyBwZXJzb25hcyBtw6FzIGFkaW5lcmFkYXMgdGllbmVuIHNlZ3VybyBtw6lkaWNvIGRhZG8gcXVlIHB1ZWRlbiBjb3N0ZWFybG8uIA0KDQoNClNlcGFyYW1vcyB5IGV4dHJhZW1vcyBsb3MgZGF0b3MgcXVlIHV0aWxpemFyZW1vcyBwYXJhIGxhIGNsYXNpZmljYWNpb24gbm8gc3VwZXJ2aXNhZGEgKGstbWVhbnMpLg0KDQpgYGB7cn0NCg0KICANCiB3YWdlcyA8LSBkYXRhLmZyYW1lKHdhZ2U9V2FnZSR3YWdlLGFnZT1XYWdlJGFnZSxoZWFsdGhfaW5zPVdhZ2UkaGVhbHRoX2lucykNCiAgDQogIA0KIGRhdGF0YWJsZSh3YWdlcykNCg0KYGBgDQpUYWwgY29tbyBzZSBtdWVzdHJhIGVuIGxhIHRhYmxhIHRlbmVtb3MgbGFzIGVkYWRlcywgc3VlbGRvIGxvZ2FyaXRtaWNvLCB5IHNpIGVzIHF1ZSBjdWVudGEgY29uIHNlZ3Vyby4gDQoNCg0KIyMjICoqR3LDoWZpY2EqKg0KDQoNCmBgYHtyfQ0KZ2dwbG90KHdhZ2VzLCBhZXMod2FnZSxhZ2UpKSArIGdlb21fcG9pbnQoYWVzIChjb2w9aGVhbHRoX2lucyksIHNpemU9MyAgICkNCmBgYA0KDQpQb2RlbW9zIG9ic2VydmFyIGVuIGxhIGdyw6FmaWNhIGxhcyBwZXJzb25hcyBxdWUgY3VlbnRhbiBjb24gc2VndXJvIGVzdMOhbiBtYXJjYWRhcyBkZSByb2pvLCB5IGxhcyBwZXJzb25hcyBzaW4gc2VydmljaW8gbcOpZGljbyBlc3TDoW4gbWFyY2FkYXMgZGUgYXp1bC4NCg0KQSBzaW1wbGUgdmlzdGEgcG9kZW1vcyBhc3VtaXIgcXVlIGxhcyBwZXJzb25hcyBxdWUgY3VlbnRhbiBjb24gdW4gc2VydmljaW8gbcOpZGljbyBwcmVkb21pbmFuLCBhdW5xdWUgcG9kZW1vcyBvYnNlcnZhciBxdWUgZW4gbGEgbWF5csOtYSBkZSBsb3MgY2Fzb3MgbGFzIHBlcnNvbmFzIGNvbiBzZXJ2aWNpbyBzb24gcGVyc29uYXMgcXVlIHN1cGVyYW4gbG9zIDIwIGHDsW9zIHkgY3VlbnRhbiBjb24gdW4gc3VlbGRvIG1heW9yIGEgMTAwLCBtaWVudHJhcyBxdWUgbGFzIHBlcnNvbmFzIHNpbiBzZXJ2aWNpbywgc3VlbGVuIHNlciBsb3MgbcOhcyBqb3ZlbmVzIHkgY29uIHVuIHN1ZWxkbyBiYWpvLCBjbGFybyBxdWUgZXhpc3RlbiBleGNlcGNpb25lcy4NCg0KIyMjICoqQ2x1c3RlcnMgSy1tZWFucyoqDQoNCg0KIyMjIyAqKkNsYXNpZmljYWNpw7NuKioNCg0KDQpDcmVhbW9zIG51ZXN0cm8gY2x1c3RlcnMgcGFyYSBjbGFzaWZpY2FyLg0KDQpgYGB7cn0NCg0Kd2FnZXNDbHVzdGVyIDwtIGttZWFucyh3YWdlc1ssMToyXSxjZW50ZXJzPTIsIG5zdGFydCA9IDIwKQ0KDQp3YWdlc0NsdXN0ZXINCg0KYGBgDQoNCiMjIyMgKipDb21wYXJhY2nDs24qKg0KDQoNCkNvbXBhcmFtb3MgZWwgY2x1c3RlciBjb24gbnVlc3RyYSBzZWxlY2Npb24gZGUgZGF0b3MNCg0KYGBge3J9DQoNCnRhYmxlKHdhZ2VzQ2x1c3RlciRjbHVzdGVyLHdhZ2VzJGhlYWx0aF9pbnMpDQogIA0KYGBgDQoNCiMjIyMgKipBZ3J1cGFjacOzbioqDQoNCg0KQWdydXBhbW9zIGxvcyBjbHVzdGVyJ3MgDQoNCmBgYHtyfQ0KDQpjbHVzcGxvdCh3YWdlc1sxOjJdLCB3YWdlc0NsdXN0ZXIkY2x1c3RlciwgY29sb3I9VCwgc2hhZGU9VCwgbGluZXM9MCkNCg0KYGBgDQoNClBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGhheSBtdWNoYSBjb2luY2lkZW5jaWFzIGVudHJlIGVsIGhlY2hvIGRlIHRlbmVyIHVuIHNhbGFyaW8gYWx0byB5IGNvbnRhciBjb24gdW4gc2VydmljaW8gbcOpZGljbywgcG9yIGxvIHF1ZSByZWFsaXphcmVtb3MgZWwgbcOpdG9kbyBkZSBjb2RvIHBhcmEgZGUgbWVqb3IgbWFuZXJhIGxvcyBjbHVzdGVycyBkZSBsb3MgZGF0b3MuDQoNCmBgYHtyfQ0KDQoNCnRvdC53aXRoaW5zcyA8LSB2ZWN0b3IobW9kZT0iY2hhcmFjdGVyIiwgbGVuZ3RoID0gMjApDQoNCmZvciAoaSBpbiAxOjIwKXsNCiAgDQogd2FnZXNDbHVzdGVyIDwtIGttZWFucyh3YWdlc1ssMToyXSwgY2VudGVyPWksIG5zdGFydD0yMCkNCiAgdG90LndpdGhpbnNzW2ldIDwtIHdhZ2VzQ2x1c3RlciR0b3Qud2l0aGluc3MNCn0NCg0KdG90LndpdGhpbnNzDQoNCmBgYA0KDQpgYGB7cn0NCg0KcGxvdCgxOjIwLCB0b3Qud2l0aGluc3MsIHR5cGU9ImIiLCBwY2g9MTksIGNleD0uNSkNCmBgYA0KDQojIyAqQ29uY2x1c2lvbioNCg0KRGVzcHXDqXMgZGUgw6lzdGUgZXN0dWRpbywgc2UgcHVlZGUgY29uY2x1aXIgcXVlIHNpIGhheSB1bmEgcmVsYWNpw7NuIGVudHJlIHRlbmVyIHVuIHN1ZWxkbyBhbHRvIHkgY29udGFyIGNvbiBzZXJ2aWNpbyBtw6lkaWNvLCB5YSBxdWUgc2VyaWEgbXV5IG5vcm1hbCB0b21hciBlbiBjdWVudGEgcXVlIGFsZ3VpZW4gY29uIHVuIHN1ZWxkbyBhbHRvIHNlIHB1ZWRlIGNvc3RlYXIgdW4gc2VydmljaW8gbcOpZGljbywgbWllbnRyYXMgcXVlIGFsZ3VpZW4gc2luIHVuIGJ1ZW4gc3VlbGRvIHNlcsOtYSBtdXkgZGlmaWNpbC4NCg0KDQojIyAqRGVzY2FyZ2EgZXN0ZSBtb2RlbG8qDQoNCmBgYHtyfQ0KeGZ1bjo6ZW1iZWRfZmlsZSgiQTZVMS5SbWQiKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=