Resolvamos las siguientes preguntas:

  1. Si un investigador usa la data de The Economist e hipotetiza que la calidad del proceso electoral depende del nivel de funcionamiento de gobierno y el nivel de participación política. ¿Ud qué puede afirmar?
rm(list = ls()) # clean memory
LINK='https://en.wikipedia.org/wiki/Democracy_Index'
PATH='//*[@id="mw-content-text"]/div[1]/table[6]'
demo=htmltab::htmltab(LINK,PATH)
demo=demo[,c(3,7:11)] # just what is needed
names(demo)=c("Country","elect","func","parti","cult","civil")
demo[,-1]=lapply(demo[,-1], as.numeric) 
demo=na.omit(demo)
h1=formula(elect~func + parti)
r1=lm(h1,data=demo)
summary(r1)

Call:
lm(formula = h1, data = demo)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.7820 -1.2590 -0.0798  1.4786  4.4657 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -2.42114    0.43500  -5.566 1.04e-07 ***
func         0.73121    0.08212   8.904 9.73e-16 ***
parti        0.86349    0.10801   7.995 2.21e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.912 on 164 degrees of freedom
Multiple R-squared:  0.7531,    Adjusted R-squared:  0.7501 
F-statistic: 250.1 on 2 and 164 DF,  p-value: < 2.2e-16
  1. El mismo investigador tiene una duda: cree que lograría un modelo mejor que el anterior si añadiese como predictor el nivel de libertades civiles. ¿Qué opinas?
h2=formula(elect~func + parti + civil)
r2=lm(h2,data=demo)

# model selection --------
anova(r1,r2)
Analysis of Variance Table

Model 1: elect ~ func + parti
Model 2: elect ~ func + parti + civil
  Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
1    164 599.32                                  
2    163 364.19  1    235.13 105.24 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  1. Descargue la data de este LINK (note que el documento incluye la metadata). No olvide trabajar con datos completos. ¿Se verifica la hipótesis que la Mortalidad materna es explicada por la fertilidad y la desnutrición?
rm(list = ls())
wb=read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vSpe4ZRgc92WdHLjNdFJGDpEZOTZ2zvwVUUjPuRhZo-pXyoF44B91ut2ChagKB8Iw/pub?gid=1446884572&single=true&output=csv")
# names(wb) # fair
# str(wb)
wb=na.omit(wb)
h1=formula(MaterMort100m~TasaFertil1mMuje + UndernourishPerPop)
r1=lm(h1,data=wb)
summary(r1)

Call:
lm(formula = h1, data = wb)

Residuals:
    Min      1Q  Median      3Q     Max 
-254.49  -56.87  -20.80   16.02  941.71 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -12.1276    10.0810  -1.203  0.23055    
TasaFertil1mMuje     2.6156     0.2217  11.799  < 2e-16 ***
UndernourishPerPop   3.9128     1.0441   3.747  0.00024 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 134.7 on 180 degrees of freedom
Multiple R-squared:  0.9979,    Adjusted R-squared:  0.9979 
F-statistic: 4.335e+04 on 2 and 180 DF,  p-value: < 2.2e-16
# standardized results -------
lm.beta::lm.beta(r1)

Call:
lm(formula = h1, data = wb)

Standardized Coefficients::
       (Intercept)   TasaFertil1mMuje UndernourishPerPop 
                NA          0.7583632          0.2408552 
  1. De lo anterior, Uds. se preguntan si pueden obtener un mejor modelo si añade el empleo, ¿Qué encuentras al correr el modelo actualizado?
h2=formula(MaterMort100m~TasaFertil1mMuje + UndernourishPerPop + EmployPerPop)
r2=lm(h2,data=wb)
anova(r1,r2)
Analysis of Variance Table

Model 1: MaterMort100m ~ TasaFertil1mMuje + UndernourishPerPop
Model 2: MaterMort100m ~ TasaFertil1mMuje + UndernourishPerPop + EmployPerPop
  Res.Df     RSS Df Sum of Sq      F    Pr(>F)    
1    180 3267451                                  
2    179 2922157  1    345295 21.151 8.004e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  1. Diríjase a la pagina web de la CIA. Descargue Infant Mortality rate y Education expenditures (People and Society); Public debt (Economy); Carbon dioxide emissions (Energy). Ud quiere plantearse dos hipótesis. En ambas hipótesis, la deuda publica y las emisiones de carbono son variables independientes. En la primera hipótesis, la mortalidad infantil es la dependiente, y los gastos en educación pasa a ser independiente con las otras; en la segunda, los gastos en educación será la dependiente y la mortalidad infantil pasa a ser independiente con las ya mencionadas. Si Ud prueba ambas hipótesis, ¿Qué encuentras?
inf=htmltab::htmltab(infLink,xPathAll)
No encoding supplied: defaulting to UTF-8.
Warning: Columns [Date of Information] seem to have no data and are removed. Use rm_nodata_cols = F to suppress this behavior.
# hipotheses -------
h1=formula(inf~edu + deb + car)
h2=formula(edu~ inf + deb + car)
# modelling --------------------------------------------------------------
r1=lm(h1,data=alldata)
r2=lm(h2,data=alldata)
# results -------
summary(r1)
summary(r2)
  1. Diversas escuelas de la ciudad están sufriendo quejas por ataques violentos a los alumnos. Los datos están disponibles en este ENLACE. Al probar la hipotesis que el tipo de escuela y la ubicación del colegio afectan los ataques ¿Qué encuentras?
rm(list = ls())
lk="https://docs.google.com/spreadsheets/d/e/2PACX-1vRZgLtdckN--CBTFFzWx_CZF8aqSosuwTZ6GOHAbBOZFEbIjnSvNg_0wrZ-VdW9T2u1qWdhogQIluYN/pub?gid=0&single=true&output=csv"
dataate=read.csv(lk)
#names(dataate)
modeltr <- glm(ataVio ~ tipo + region, family = poisson,
               offset = log(poblacion), data = dataate)
#summary(modeltr)
#overdispersion
AER::dispersiontest(modeltr,alternative='greater')$ p.value<0.05
[1] TRUE
#underdispersion
AER::dispersiontest(modeltr,alternative='less')$ p.value<0.05
[1] FALSE
library(MASS)
modeltr2 <- glm.nb(ataVio ~ tipo + region + offset(log(poblacion)), data = dataate)
summary(modeltr2)

Call:
glm.nb(formula = ataVio ~ tipo + region + offset(log(poblacion)), 
    data = dataate, init.theta = 1.242581365, link = log)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.2499  -1.1136  -0.4544   0.4696   2.4795  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -8.20727    0.27203 -30.171  < 2e-16 ***
tipoPublica -0.16068    0.26537  -0.605  0.54486    
regionMW     0.12305    0.42403   0.290  0.77167    
regionNE     0.99469    0.34807   2.858  0.00427 ** 
regionS      0.54792    0.34520   1.587  0.11245    
regionW      0.06314    0.45582   0.139  0.88982    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Negative Binomial(1.2426) family taken to be 1)

    Null deviance: 97.868  on 79  degrees of freedom
Residual deviance: 87.600  on 74  degrees of freedom
AIC: 420.59

Number of Fisher Scoring iterations: 1

              Theta:  1.243 
          Std. Err.:  0.276 

 2 x log-likelihood:  -406.588 
exp(coef(modeltr2))
 (Intercept)  tipoPublica     regionMW     regionNE      regionS      regionW 
0.0002726629 0.8515661558 1.1309419625 2.7038764497 1.7296441419 1.0651801125 
  1. Se está estudiando los factores que influencian la admisión a los colegios elite del Perú. Para ello se tienen datos de los postulantes procedentes de diferentes escuelas primarias. Descargue la data de este LINK Si usa todas las variables disponibles como predictoras de la admisión, ¿Qué encuentras?
rm(list = ls())
lk="https://docs.google.com/spreadsheets/d/e/2PACX-1vSIeBRLEmHacvpWqAsi5W6B091eeZa0XN6wA3zww1qZlltK-EWCIkLN6J3_FkYvUDElViR67Rkx_80a/pub?gid=0&single=true&output=csv"
mydata <- read.csv(lk)
#str(mydata)
mylogit <- glm(admitido ~ letras + ciencias + prestigio, 
               data = mydata, family = "binomial")
#summary(mylogit)

sdVIs=apply(mydata[,c("letras","ciencias", "prestigio")],2,sd)
list(LogitSt=sdVIs*coef(mylogit)[c(2,3,4)])%>%
    data.frame()
summary(mylogit)

Call:
glm(formula = admitido ~ letras + ciencias + prestigio, family = "binomial", 
    data = mydata)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.5802  -0.8848  -0.6382   1.1575   2.1732  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -6.249705   1.155732  -5.408 6.39e-08 ***
letras       0.002294   0.001092   2.101   0.0356 *  
ciencias     0.007770   0.003275   2.373   0.0177 *  
prestigio    0.560031   0.127137   4.405 1.06e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 499.98  on 399  degrees of freedom
Residual deviance: 459.44  on 396  degrees of freedom
AIC: 467.44

Number of Fisher Scoring iterations: 4
  1. Se está estudiando qué factores influyen en que los convictos puestos en libertad vuelvan a la carcel. Los datos puede descargarlos de aqui. Con esos datos, dos investigadores desean probar algunas hipotesis. Un investigador “A” afirma que mientras mayor la edad, y si uno ya está casado, disminuirá el riesgo de volver a la carcel; mientras que otro investigador “B” asegura que, además de esas predictoras, la experiencia laboral previa también disminuye el riesgo de volver a la carcel. ¿Qué opinas en esta situación?
rm(list = ls())
lk="https://docs.google.com/spreadsheets/d/e/2PACX-1vQSlGaMI8Q8qlXI0Bp3m7BQcEh8ZLzaP7RymVtRYkg3ah1sZVlCi6-HmeKCic1RjfuH3gL_wrbMms88/pub?gid=1573532387&single=true&output=csv"
carcel=read.csv(lk)
#names(carcel)
library(survival)
carcel$survival=with(carcel,Surv(time = semanasLibre,event =  as.numeric(fueArrestado)))
carcel$casado=factor(carcel$casado)
COX_H1= formula(survival~edad + casado)
COX_H2= formula(survival~edad + casado + expLaboralPrevia)
#regression
rcox1 <- coxph(COX_H1,data=carcel)
rcox2 <- coxph(COX_H2,data=carcel)
summary(rcox1)
Call:
coxph(formula = COX_H1, data = carcel)

  n= 432, number of events= 114 

            coef exp(coef) se(coef)      z Pr(>|z|)   
edad    -0.06672   0.93545  0.02082 -3.205  0.00135 **
casado1 -0.49314   0.61070  0.37269 -1.323  0.18576   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

        exp(coef) exp(-coef) lower .95 upper .95
edad       0.9355      1.069    0.8981    0.9744
casado1    0.6107      1.637    0.2942    1.2678

Concordance= 0.616  (se = 0.027 )
Likelihood ratio test= 17.27  on 2 df,   p=2e-04
Wald test            = 13.99  on 2 df,   p=9e-04
Score (logrank) test = 14.51  on 2 df,   p=7e-04
summary(rcox2)
Call:
coxph(formula = COX_H2, data = carcel)

  n= 432, number of events= 114 

                     coef exp(coef) se(coef)      z Pr(>|z|)   
edad             -0.05614   0.94541  0.02158 -2.602  0.00927 **
casado1          -0.39569   0.67322  0.37911 -1.044  0.29662   
expLaboralPrevia -0.30907   0.73413  0.20427 -1.513  0.13026   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                 exp(coef) exp(-coef) lower .95 upper .95
edad                0.9454      1.058    0.9063    0.9862
casado1             0.6732      1.485    0.3202    1.4153
expLaboralPrevia    0.7341      1.362    0.4919    1.0956

Concordance= 0.615  (se = 0.026 )
Likelihood ratio test= 19.58  on 3 df,   p=2e-04
Wald test            = 16.83  on 3 df,   p=8e-04
Score (logrank) test = 17.64  on 3 df,   p=5e-04
anova(rcox1,rcox2)
Analysis of Deviance Table
 Cox model: response is  survival
 Model 1: ~ edad + casado
 Model 2: ~ edad + casado + expLaboralPrevia
   loglik  Chisq Df Pr(>|Chi|)
1 -666.75                     
2 -665.59 2.3132  1     0.1283
  1. A su data de democracia añádale el índice de desarrollo humano (en ingles) que descargará de este LINK. En este caso quédese con los nombres que se escriban de la misma manera. Con la data unida, ¿Cuántos factores serían sugeridos de la data?
#-----
rm(list = ls())
library(htmltab)

# links
WhereDEMO=list(page="https://en.wikipedia.org/wiki/Democracy_Index",
               xpath='//*[@id="mw-content-text"]/div[1]/table[6]/tbody')

#carga
idh  = rio::import("HDR21-22_Statistical_Annex_HDI_Table.xlsx",skip=4)
New names:
• `` -> `...1`
• `` -> `...2`
• `` -> `...4`
• `` -> `...6`
• `` -> `...8`
• `` -> `...10`
• `` -> `...12`
• `` -> `...14`
demo  = htmltab(doc = WhereDEMO$page, 
                which  = WhereDEMO$xpath,
                encoding = "UTF-8")
#-----prepareIDH
#names(idh)
idh=idh[,c(2,3,5,7,9,11)]
newNames=c('Pais','puntuacion','EsperanzaVida','EscolaridadDuracion','EscolaridadPromedio','PBI')
names(idh)=newNames
#idh[idh$Pais=='Somalia' & !is.na(idh$Pais),]
idh=idh[c(1:202),]
idh=idh[!is.na(idh$Pais),]

idh[,-1]=lapply(idh[,-1], as.numeric)
Warning in lapply(idh[, -1], as.numeric) : NAs introduced by coercion
Warning in lapply(idh[, -1], as.numeric) : NAs introduced by coercion
Warning in lapply(idh[, -1], as.numeric) : NAs introduced by coercion
Warning in lapply(idh[, -1], as.numeric) : NAs introduced by coercion
Warning in lapply(idh[, -1], as.numeric) : NAs introduced by coercion
#idh[!complete.cases(idh[,-1]),]
idh=idh[complete.cases(idh[,-1]),]
row.names(idh)=NULL

#---- prepro DEMO
#names(demo)
demo=demo[,-c(1,2,6)]

names(demo)=c("Pais","RegimeType","Score","Electoral","Functioning","participation","culture",'Civilliberties')

demo[,3:8]=lapply(demo[,3:8],as.numeric)

#---- keys
idh$Pais= trimws(idh$Pais,whitespace = "[\\h\\v]")
demo$Pais= trimws(demo$Pais,whitespace = "[\\h\\v]") 

idhdemo=merge(idh,demo)
#----- efa

dontselect=c("Pais","RegimeType","puntuacion",'Score')
select=setdiff(names(idhdemo),dontselect) 
theData=idhdemo[,select]
library(polycor)
corMatrix=polycor::hetcor(theData)$correlations
library(psych)
#psych::KMO(corMatrix) 
#cortest.bartlett(corMatrix,n=nrow(theData))$p.value>0.05
library(matrixcalc)
#is.singular.matrix(corMatrix)
fa.parallel(theData, fa = 'fa',correct = T,plot = F)
Parallel analysis suggests that the number of factors =  2  and the number of components =  NA 
  1. Si siguiese la recomendación para reducir la dimensionalidad, ¿Cuánta info logran recuperar los factores?
library(GPArotation)
resfa <- fa(theData,
            nfactors = 2,
            cor = 'mixed',
            rotate = "varimax",
            fm="minres")
print(resfa$loadings,cutoff = 0.5)

Loadings:
                    MR2   MR1  
EsperanzaVida       0.867      
EscolaridadDuracion 0.813      
EscolaridadPromedio 0.791      
PBI                 0.806      
Electoral                 0.901
Functioning         0.521 0.738
participation             0.767
culture                        
Civilliberties            0.913

                 MR2   MR1
SS loadings    3.450 3.443
Proportion Var 0.383 0.383
Cumulative Var 0.383 0.766
  1. ¿Cómo interpreta el rol de complejidad y comunalidad de las variables utilizadas?
sort(resfa$communality)
            culture       participation EscolaridadPromedio 
          0.4264771           0.7059212           0.7288980 
                PBI         Functioning EscolaridadDuracion 
          0.7300781           0.8168660           0.8237711 
      EsperanzaVida           Electoral      Civilliberties 
          0.8384541           0.8777419           0.9443247 
sort(resfa$complexity)
          Electoral       EsperanzaVida                 PBI 
           1.160066            1.226160            1.242377 
     Civilliberties EscolaridadPromedio       participation 
           1.261717            1.318609            1.385843 
EscolaridadDuracion         Functioning             culture 
           1.463350            1.798043            1.983687 
  1. Si plantease un análisis factorial basado en alguna teoría, ¿Qué usaría para darle sustento a los resultados de esa técnica?
modelCFA='demo=~ Electoral + Functioning + participation + culture + Civilliberties
idh=~EsperanzaVida + EscolaridadDuracion + EscolaridadPromedio + PBI'

# normalizar las variables:
theDataNorm=scale(theData)

library(lavaan)
cfa_fit <- cfa(modelCFA, data=theDataNorm, 
               std.lv=TRUE,  
               missing="fiml")
allParamCFA=parameterEstimates(cfa_fit,standardized = T)
allFitCFA=as.list(fitMeasures(cfa_fit))
allFitCFA[c("chisq", "df", "pvalue")] # pvalue>0.05
$chisq
[1] 120.3633

$df
[1] 26

$pvalue
[1] 4.274359e-14
allFitCFA$tli 
[1] 0.9017975
allFitCFA[c('rmsea.ci.lower','rmsea' ,'rmsea.ci.upper')] 
$rmsea.ci.lower
[1] 0.1302663

$rmsea
[1] 0.1582089

$rmsea.ci.upper
[1] 0.1873278
  1. Con la data original del Democracy Index pide 4 clusters y compara el resultado con lo propuesto por The Economist. ¿Qué observas?
#### 1
dataClus=demo[,-c(1:3)]
row.names(dataClus)=demo$Pais
library(cluster)
g.dist = daisy(dataClus, metric="gower")
set.seed(123)
res.pam=pam(g.dist,4,cluster.only = F)

#nueva columna
dataClus$pam=res.pam$cluster

#aggregate(.~ pam, data=dataClus,mean)
demo$pam=res.pam$cluster
table(demo$pam,demo$RegimeType,dnn = c('Particion','Econo'))
         Econo
Particion Authoritarian Flawed democracy Full democracy Hybrid regime
        1             0               20             21             0
        2             0               25              0             6
        3             0                8              0            28
        4            59                0              0             0
  1. Con la data original del IDH averigua cuantos clusters se recomiendan siguiendo la técnica aglomerativa.
#boxplot(idh[,-c(1:2)],horizontal = F,las=2,cex.axis = 0.5)


dataClus=BBmisc::normalize(idh[,-c(1:2)],method='standardize')
row.names(dataClus)=idh$Pais
library(cluster)
g.dist = daisy(dataClus, metric="gower")
set.seed(123)


library(factoextra)
fviz_nbclust(dataClus, hcut,diss=g.dist,method = "gap_stat",k.max = 10,verbose = F,hc_func = "agnes")

  1. Con la data original del Democracy Index pide los clusters que se recomienden, ¿Cuántos países quedan mal clusterizados?
demo$pam=NULL
dataClus=demo[,-c(1:3)]
row.names(dataClus)=demo$Pais
library(cluster)
g.dist = daisy(dataClus, metric="gower")
fviz_nbclust(dataClus, pam,diss=g.dist,method = "gap_stat",k.max = 10,verbose = F)

set.seed(123)
res.pam=pam(g.dist,7,cluster.only = F)
silPAM=data.frame(res.pam$silinfo$widths)
silPAM$country=row.names(silPAM)

poorPAM=silPAM[silPAM$sil_width<0,'country']#%>%sort()
poorPAM
 [1] "Trinidad and Tobago" "Slovakia"            "Kenya"              
 [4] "Tunisia"             "Ukraine"             "Albania"            
 [7] "Mexico"              "Guyana"              "Namibia"            
[10] "Ghana"               "Turkey"              "Hong Kong"          
[13] "Qatar"               "Angola"              "Eswatini"           
[16] "Laos"               
  1. Haz un merge con IDH y Democracy Index, pero recuperando todos los paises aun cuando no se escriban igual. Normalice los valores del IDH con el metodo rango (del 1 al 10). ¿Hay diferencias en cuanto a las sugerencia de la cantidad de clusters para cada tecnica jerarquica si usa los componentes de ambos conceptos?

fviz_nbclust(dataClus, hcut,diss=g.dist,method = "gap_stat",k.max = 10,verbose = F,hc_func = "diana")

  1. Para el caso anterior, si Ud pide 3 clusters, ¿Qué diferencias encuentra al clusterizar por ambas técnicas?
res.agnes<- hcut(g.dist, k = 3,hc_func='agnes',hc_method = "ward.D")
fviz_silhouette(res.agnes,print.summary = F)


res.diana <- hcut(g.dist, k = 3,hc_func='diana')
fviz_silhouette(res.diana,print.summary = F)

silDIANA=data.frame(res.diana$silinfo$widths)
silDIANA$country=row.names(silDIANA)
poorDIANA=silDIANA[silDIANA$sil_width<0,'country']#%>%sort()
poorDIANA
 [1] "Senegal"          "Liberia"          "Guatemala"       
 [4] "Turkey"           "Madagascar"       "Zambia"          
 [7] "Morocco"          "Malawi"           "Papua New Guinea"
[10] "Bolivia"          "Honduras"        
silAGNES=data.frame(res.agnes$silinfo$widths)
silAGNES$country=row.names(silAGNES)
poorAGNES=silAGNES[silAGNES$sil_width<0,'country']#%>%sort()
poorAGNES
 [1] "Guatemala"        "Madagascar"       "Turkey"          
 [4] "Zambia"           "Morocco"          "Malawi"          
 [7] "Papua New Guinea" "Honduras"         "Bolivia"         
[10] "Lesotho"          "Bhutan"           "Latvia"          
[13] "Lithuania"       
  1. Rehaga las preguntas 16 y 17, pero normalizando toda la data con la técnica de estandarización.
idhdemo2=merge(idh,demo)
idhdemo2[,c(3:6,9:13)]=BBmisc::normalize(idhdemo2[,c(3:6,9:13)],method='standardize')
dataClus=idhdemo2[,c(3:6,9:13)]
row.names(dataClus)=idhdemo2$Pais

library(cluster)
g.dist = daisy(dataClus, metric="gower")
fviz_nbclust(dataClus, hcut,diss=g.dist,method = "gap_stat",k.max = 10,verbose = F,hc_func = "agnes")

fviz_nbclust(dataClus, hcut,diss=g.dist,method = "gap_stat",k.max = 10,verbose = F,hc_func = "diana")

res.agnes<- hcut(g.dist, k = 3,hc_func='agnes',hc_method = "ward.D")
fviz_silhouette(res.agnes,print.summary = F)


res.diana <- hcut(g.dist, k = 3,hc_func='diana')
fviz_silhouette(res.diana,print.summary = F)

silDIANA=data.frame(res.diana$silinfo$widths)
silDIANA$country=row.names(silDIANA)
poorDIANA=silDIANA[silDIANA$sil_width<0,'country']#%>%sort()
poorDIANA
 [1] "Senegal"          "Liberia"          "Guatemala"       
 [4] "Turkey"           "Madagascar"       "Zambia"          
 [7] "Morocco"          "Malawi"           "Papua New Guinea"
[10] "Bolivia"          "Honduras"        
silAGNES=data.frame(res.agnes$silinfo$widths)
silAGNES$country=row.names(silAGNES)
poorAGNES=silAGNES[silAGNES$sil_width<0,'country']#%>%sort()
poorAGNES
 [1] "Guatemala"        "Madagascar"       "Turkey"          
 [4] "Zambia"           "Morocco"          "Malawi"          
 [7] "Papua New Guinea" "Honduras"         "Bolivia"         
[10] "Lesotho"          "Bhutan"           "Latvia"          
[13] "Lithuania"       
LS0tCnRpdGxlOiAiUmVwYXNvIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpSZXNvbHZhbW9zIGxhcyBzaWd1aWVudGVzIHByZWd1bnRhczoKCjEuIFNpIHVuIGludmVzdGlnYWRvciB1c2EgbGEgZGF0YSBkZSBbVGhlIEVjb25vbWlzdF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVtb2NyYWN5X0luZGV4KSBlIGhpcG90ZXRpemEgcXVlIGxhIGNhbGlkYWQgZGVsIHByb2Nlc28gZWxlY3RvcmFsIGRlcGVuZGUgZGVsIG5pdmVsIGRlIGZ1bmNpb25hbWllbnRvIGRlIGdvYmllcm5vIHkgZWwgbml2ZWwgZGUgcGFydGljaXBhY2nDs24gcG9sw610aWNhLiDCv1VkIHF1w6kgcHVlZGUgYWZpcm1hcj8KYGBge3J9CnJtKGxpc3QgPSBscygpKSAjIGNsZWFuIG1lbW9yeQpMSU5LPSdodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZW1vY3JhY3lfSW5kZXgnClBBVEg9Jy8vKltAaWQ9Im13LWNvbnRlbnQtdGV4dCJdL2RpdlsxXS90YWJsZVs2XScKZGVtbz1odG1sdGFiOjpodG1sdGFiKExJTkssUEFUSCkKZGVtbz1kZW1vWyxjKDMsNzoxMSldICMganVzdCB3aGF0IGlzIG5lZWRlZApuYW1lcyhkZW1vKT1jKCJDb3VudHJ5IiwiZWxlY3QiLCJmdW5jIiwicGFydGkiLCJjdWx0IiwiY2l2aWwiKQpkZW1vWywtMV09bGFwcGx5KGRlbW9bLC0xXSwgYXMubnVtZXJpYykgCmRlbW89bmEub21pdChkZW1vKQpoMT1mb3JtdWxhKGVsZWN0fmZ1bmMgKyBwYXJ0aSkKcjE9bG0oaDEsZGF0YT1kZW1vKQpzdW1tYXJ5KHIxKQpgYGAKCgoKCgoyLiBFbCBtaXNtbyBpbnZlc3RpZ2Fkb3IgdGllbmUgdW5hIGR1ZGE6IGNyZWUgcXVlIGxvZ3JhcsOtYSB1biBtb2RlbG8gbWVqb3IgcXVlIGVsIGFudGVyaW9yIHNpIGHDsWFkaWVzZSBjb21vIHByZWRpY3RvciAgZWwgbml2ZWwgZGUgbGliZXJ0YWRlcyBjaXZpbGVzLiDCv1F1w6kgIG9waW5hcz8KCmBgYHtyfQpoMj1mb3JtdWxhKGVsZWN0fmZ1bmMgKyBwYXJ0aSArIGNpdmlsKQpyMj1sbShoMixkYXRhPWRlbW8pCmFub3ZhKHIxLHIyKQpgYGAKCgozLiBEZXNjYXJndWUgbGEgZGF0YSBkZSBlc3RlIFtMSU5LXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xczJOZTl1UTdud1R2U282Y2tOUUhWMzVOWnQtT1lzOFYvZWRpdD91c3A9c2hhcmluZyZvdWlkPTEwNjkzNTc4ODUxODk0NzE2NTkxNyZydHBvZj10cnVlJnNkPXRydWUpIChub3RlIHF1ZSBlbCBkb2N1bWVudG8gaW5jbHV5ZSBsYSBtZXRhZGF0YSkuIE5vIG9sdmlkZSB0cmFiYWphciBjb24gZGF0b3MgY29tcGxldG9zLiDCv1NlIHZlcmlmaWNhIGxhIGhpcMOzdGVzaXMgcXVlIGxhIE1vcnRhbGlkYWQgbWF0ZXJuYSBlcyBleHBsaWNhZGEgcG9yIGxhIGZlcnRpbGlkYWQgeSBsYSBkZXNudXRyaWNpw7NuPwoKYGBge3J9CnJtKGxpc3QgPSBscygpKQp3Yj1yZWFkLmNzdigiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvZS8yUEFDWC0xdlNwZTRaUmdjOTJXZEhMak5kRkpHRHBFWk9UWjJ6dndWVVVqUHVSaFpvLXBYeW9GNDRCOTF1dDJDaGFnS0I4SXcvcHViP2dpZD0xNDQ2ODg0NTcyJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiKQojIG5hbWVzKHdiKSAjIGZhaXIKIyBzdHIod2IpCndiPW5hLm9taXQod2IpCmgxPWZvcm11bGEoTWF0ZXJNb3J0MTAwbX5UYXNhRmVydGlsMW1NdWplICsgVW5kZXJub3VyaXNoUGVyUG9wKQpyMT1sbShoMSxkYXRhPXdiKQpzdW1tYXJ5KHIxKQpgYGAKCmBgYHtyfQojIHN0YW5kYXJkaXplZCByZXN1bHRzIC0tLS0tLS0KbG0uYmV0YTo6bG0uYmV0YShyMSkKYGBgCjQuIERlIGxvIGFudGVyaW9yLCBVZHMuIHNlIHByZWd1bnRhbiBzaSBwdWVkZW4gb2J0ZW5lciB1biBtZWpvciBtb2RlbG8gc2kgYcOxYWRlIGVsIGVtcGxlbywgwr9RdcOpIGVuY3VlbnRyYXMgIGFsIGNvcnJlciBlbCBtb2RlbG8gYWN0dWFsaXphZG8/CmBgYHtyfQpoMj1mb3JtdWxhKE1hdGVyTW9ydDEwMG1+VGFzYUZlcnRpbDFtTXVqZSArIFVuZGVybm91cmlzaFBlclBvcCArIEVtcGxveVBlclBvcCkKcjI9bG0oaDIsZGF0YT13YikKYW5vdmEocjEscjIpCmBgYAoKCjUuIERpcsOtamFzZSBhIGxhIHBhZ2luYSB3ZWIgZGUgbGEgW0NJQV0oaHR0cHM6Ly93d3cuY2lhLmdvdi90aGUtd29ybGQtZmFjdGJvb2svYWJvdXQvYXJjaGl2ZXMvMjAyMS8pLiBEZXNjYXJndWUgX0luZmFudCBNb3J0YWxpdHkgcmF0ZV8geSAKX0VkdWNhdGlvbiBleHBlbmRpdHVyZXNfIChQZW9wbGUgYW5kIFNvY2lldHkpOyBfUHVibGljIGRlYnRfIChFY29ub215KTsgX0NhcmJvbiBkaW94aWRlIGVtaXNzaW9uc18gKEVuZXJneSkuIFVkIHF1aWVyZSBwbGFudGVhcnNlIGRvcyBoaXDDs3Rlc2lzLiBFbiBhbWJhcyBoaXDDs3Rlc2lzLCBsYSBkZXVkYSBwdWJsaWNhIHkgbGFzIGVtaXNpb25lcyBkZSBjYXJib25vIHNvbiB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMuIEVuIGxhIHByaW1lcmEgaGlww7N0ZXNpcywgbGEgbW9ydGFsaWRhZCBpbmZhbnRpbCBlcyBsYSBkZXBlbmRpZW50ZSwgeSBsb3MgZ2FzdG9zIGVuIGVkdWNhY2nDs24gcGFzYSBhIHNlciBpbmRlcGVuZGllbnRlIGNvbiBsYXMgb3RyYXM7IGVuIGxhIHNlZ3VuZGEsIGxvcyBnYXN0b3MgZW4gZWR1Y2FjacOzbiBzZXLDoSBsYSBkZXBlbmRpZW50ZSB5IGxhIG1vcnRhbGlkYWQgaW5mYW50aWwgcGFzYSBhIHNlciBpbmRlcGVuZGllbnRlIGNvbiBsYXMgeWEgbWVuY2lvbmFkYXMuIFNpIFVkIHBydWViYSBhbWJhcyBoaXDDs3Rlc2lzLCDCv1F1w6kgZW5jdWVudHJhcz8KCmBgYHtyfQpybShsaXN0ID0gbHMoKSkKI2xpbmsgdG8gcGFnZXMKY2lhPSdodHRwczovL3d3dy5jaWEuZ292L3RoZS13b3JsZC1mYWN0Ym9vay9maWVsZC8nCmluZkxpbms9cGFzdGUwKGNpYSwiaW5mYW50LW1vcnRhbGl0eS1yYXRlL2NvdW50cnktY29tcGFyaXNvbiIpCmVkdUxpbms9cGFzdGUwKGNpYSwiZWR1Y2F0aW9uLWV4cGVuZGl0dXJlcy9jb3VudHJ5LWNvbXBhcmlzb24iKQpkZWJMaW5rPXBhc3RlMChjaWEsInB1YmxpYy1kZWJ0L2NvdW50cnktY29tcGFyaXNvbiIpCmNhckxpbms9cGFzdGUwKGNpYSwiY2FyYm9uLWRpb3hpZGUtZW1pc3Npb25zL2NvdW50cnktY29tcGFyaXNvbiIpCgojIGxpbmsgdG8gcGF0aHMKeFBhdGhBbGw9Jy8vKltAaWQ9ImluZGV4LWNvbnRlbnQtc2VjdGlvbiJdL2Rpdi9kaXZbMl0vZGl2L2Rpdi9kaXYvZGl2L2Rpdi90YWJsZScKaW5mPWh0bWx0YWI6Omh0bWx0YWIoaW5mTGluayx4UGF0aEFsbCkKZWR1PWh0bWx0YWI6Omh0bWx0YWIoZWR1TGluayx4UGF0aEFsbCkKZGViPWh0bWx0YWI6Omh0bWx0YWIoZGViTGluayx4UGF0aEFsbCkKY2FyPWh0bWx0YWI6Omh0bWx0YWIoY2FyTGluayx4UGF0aEFsbCkKCiMga2VlcCB3aGF0IHlvdSBuZWVkOgppbmY9aW5mWyxjKDIsMyldCmVkdT1lZHVbLGMoMiwzKV0KZGViPWRlYlssYygyLDMpXQpjYXI9Y2FyWyxjKDIsMyldCgojIHJlbmFtZSAtLS0tLQpuYW1lcyhpbmYpPWMoIkNvdW50cnkiLCJpbmYiKQpuYW1lcyhlZHUpPWMoIkNvdW50cnkiLCJlZHUiKQpuYW1lcyhkZWIpPWMoIkNvdW50cnkiLCJkZWIiKQpuYW1lcyhjYXIpPWMoIkNvdW50cnkiLCJjYXIiKQoKIyBtZXJnaW5nIC0tLS0tLQphbGxDaWE9bWVyZ2UoaW5mLGVkdSxhbGwueCA9IFQsIGFsbC55ID0gVCwgYnkgPSAnQ291bnRyeScpCmFsbENpYT1tZXJnZShhbGxDaWEsZGViLGFsbC54ID0gVCwgYWxsLnkgPSBULCBieSA9ICdDb3VudHJ5JykKYWxsQ2lhPW1lcmdlKGFsbENpYSxjYXIsYWxsLnggPSBULCBhbGwueSA9IFQsIGJ5ID0gJ0NvdW50cnknKQoKIyB2ZXJpZnkgZGF0YSB0eXBlIC0tLS0tLQojc3RyKGFsbENpYSkKCiMgcGFyc2luZzoKYWxsQ2lhJGNhcj1hcy5udW1lcmljKGdzdWIoIiwiLCIiLGFsbENpYSRjYXIpKQoKIyBzZXQgZGF0YSB0eXBlIC0tLS0gIyMgYWZ0ZXIgcGFyc2luZyEKYWxsQ2lhWywtMV09bGFwcGx5KGFsbENpYVssLTFdLCBhcy5udW1lcmljKQoKIyBubyBtaXNzaW5nIC0tLS0tCmFsbENpYT1uYS5vbWl0KGFsbENpYSkKYGBgCgpgYGB7cn0KIyBoaXBvdGhlc2VzIC0tLS0tLS0KaDE9Zm9ybXVsYShpbmZ+ZWR1ICsgZGViICsgY2FyKQpoMj1mb3JtdWxhKGVkdX4gaW5mICsgZGViICsgY2FyKQojIG1vZGVsbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpyMT1sbShoMSxkYXRhPWFsbGRhdGEpCnIyPWxtKGgyLGRhdGE9YWxsZGF0YSkKIyByZXN1bHRzIC0tLS0tLS0Kc3VtbWFyeShyMSkKc3VtbWFyeShyMikKYGBgCgoKNi4gRGl2ZXJzYXMgZXNjdWVsYXMgZGUgbGEgY2l1ZGFkIGVzdMOhbiBzdWZyaWVuZG8gcXVlamFzIHBvciBhdGFxdWVzIHZpb2xlbnRvcyBhIGxvcyBhbHVtbm9zLiBMb3MgZGF0b3MgZXN0w6FuIGRpc3BvbmlibGVzIGVuIGVzdGUgW0VOTEFDRV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMUM5QzhjMjBvQlNqUFJEaGZaN19vQWk3WE9FbWVDX0xsbVpEWlZmSWVXdHMvZWRpdD91c3A9c2hhcmluZykuIEFsIHByb2JhciBsYSBoaXBvdGVzaXMgcXVlIGVsIHRpcG8gZGUgZXNjdWVsYSB5IGxhIHViaWNhY2nDs24gZGVsIGNvbGVnaW8gYWZlY3RhbiBsb3MgYXRhcXVlcyDCv1F1w6kgZW5jdWVudHJhcz8KCmBgYHtyfQpybShsaXN0ID0gbHMoKSkKbGs9Imh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZSWmdMdGRja04tLUNCVEZGeld4X0NaRjhhcVNvc3V3VFo2R09IQWJCT1pGRWJJam5Tdk5nXzB3clotVmRXOVQydTFxV2Rob2dRSWx1WU4vcHViP2dpZD0wJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiCmRhdGFhdGU9cmVhZC5jc3YobGspCiNuYW1lcyhkYXRhYXRlKQptb2RlbHRyIDwtIGdsbShhdGFWaW8gfiB0aXBvICsgcmVnaW9uLCBmYW1pbHkgPSBwb2lzc29uLAogICAgICAgICAgICAgICBvZmZzZXQgPSBsb2cocG9ibGFjaW9uKSwgZGF0YSA9IGRhdGFhdGUpCiNzdW1tYXJ5KG1vZGVsdHIpCiNvdmVyZGlzcGVyc2lvbgpBRVI6OmRpc3BlcnNpb250ZXN0KG1vZGVsdHIsYWx0ZXJuYXRpdmU9J2dyZWF0ZXInKSQgcC52YWx1ZTwwLjA1CiN1bmRlcmRpc3BlcnNpb24KQUVSOjpkaXNwZXJzaW9udGVzdChtb2RlbHRyLGFsdGVybmF0aXZlPSdsZXNzJykkIHAudmFsdWU8MC4wNQoKbGlicmFyeShNQVNTKQptb2RlbHRyMiA8LSBnbG0ubmIoYXRhVmlvIH4gdGlwbyArIHJlZ2lvbiArIG9mZnNldChsb2cocG9ibGFjaW9uKSksIGRhdGEgPSBkYXRhYXRlKQpzdW1tYXJ5KG1vZGVsdHIyKQpleHAoY29lZihtb2RlbHRyMikpCmBgYAoKCjcuIFNlIGVzdMOhIGVzdHVkaWFuZG8gbG9zIGZhY3RvcmVzIHF1ZSBpbmZsdWVuY2lhbiBsYSBhZG1pc2nDs24gYSBsb3MgY29sZWdpb3MgZWxpdGUgZGVsIFBlcsO6LiBQYXJhIGVsbG8gc2UgdGllbmVuIGRhdG9zIGRlIGxvcyBwb3N0dWxhbnRlcyBwcm9jZWRlbnRlcyBkZSBkaWZlcmVudGVzIGVzY3VlbGFzIHByaW1hcmlhcy4gCkRlc2Nhcmd1ZSBsYSBkYXRhIGRlIGVzdGUgW0xJTktdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFxclJGRUFCLWpaQlVVam45WHdFbThtaS1sMGw0bUpuQ1dVUFg2YVh0cHo0L2VkaXQ/dXNwPXNoYXJpbmcpIFNpIHVzYSB0b2RhcyBsYXMgdmFyaWFibGVzIGRpc3BvbmlibGVzIGNvbW8gcHJlZGljdG9yYXMgZGUgbGEgYWRtaXNpw7NuLCDCv1F1w6kgZW5jdWVudHJhcz8KCmBgYHtyfQpybShsaXN0ID0gbHMoKSkKbGs9Imh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZTSWVCUkxFbUhhY3ZwV3FBc2k1VzZCMDkxZWVaYTBYTjZ3QTN6d3cxcVpsbHRLLUVXQ0lrTE42SjNfRmtZdlVERWxWaVI2N1JreF84MGEvcHViP2dpZD0wJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiCm15ZGF0YSA8LSByZWFkLmNzdihsaykKI3N0cihteWRhdGEpCm15bG9naXQgPC0gZ2xtKGFkbWl0aWRvIH4gbGV0cmFzICsgY2llbmNpYXMgKyBwcmVzdGlnaW8sIAogICAgICAgICAgICAgICBkYXRhID0gbXlkYXRhLCBmYW1pbHkgPSAiYmlub21pYWwiKQojc3VtbWFyeShteWxvZ2l0KQoKc2RWSXM9YXBwbHkobXlkYXRhWyxjKCJsZXRyYXMiLCJjaWVuY2lhcyIsICJwcmVzdGlnaW8iKV0sMixzZCkKbGlzdChMb2dpdFN0PXNkVklzKmNvZWYobXlsb2dpdClbYygyLDMsNCldKSU+JQogICAgZGF0YS5mcmFtZSgpCmBgYApgYGB7cn0Kc3VtbWFyeShteWxvZ2l0KQpgYGAKCgo4LiBTZSBlc3TDoSBlc3R1ZGlhbmRvIHF1w6kgZmFjdG9yZXMgaW5mbHV5ZW4gZW4gcXVlIGxvcyBjb252aWN0b3MgcHVlc3RvcyBlbiBsaWJlcnRhZCB2dWVsdmFuIGEgbGEgY2FyY2VsLiBMb3MgZGF0b3MgcHVlZGUgZGVzY2FyZ2FybG9zIGRlIFthcXVpXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xQWhsb1pJYXBvSWh6NC1xT2duM3UyQVhLeWtLb0E5LWZER25oVDJDR3h0MC9lZGl0P3VzcD1zaGFyaW5nKS4gQ29uIGVzb3MgZGF0b3MsIGRvcyBpbnZlc3RpZ2Fkb3JlcyBkZXNlYW4gcHJvYmFyIGFsZ3VuYXMgaGlwb3Rlc2lzLiBVbiBpbnZlc3RpZ2Fkb3IgIkEiIGFmaXJtYSBxdWUgbWllbnRyYXMgbWF5b3IgbGEgZWRhZCwgeSBzaSB1bm8geWEgZXN0w6EgY2FzYWRvLCBkaXNtaW51aXLDoSBlbCByaWVzZ28gZGUgdm9sdmVyIGEgbGEgY2FyY2VsOyBtaWVudHJhcyBxdWUgb3RybyBpbnZlc3RpZ2Fkb3IgIkIiIGFzZWd1cmEgcXVlLCBhZGVtw6FzIGRlIGVzYXMgcHJlZGljdG9yYXMsIGxhIGV4cGVyaWVuY2lhIGxhYm9yYWwgcHJldmlhIHRhbWJpw6luIGRpc21pbnV5ZSBlbCByaWVzZ28gZGUgdm9sdmVyIGEgbGEgY2FyY2VsLiDCv1F1w6kgb3BpbmFzIGVuIGVzdGEgc2l0dWFjacOzbj8KYGBge3J9CnJtKGxpc3QgPSBscygpKQpsaz0iaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvZS8yUEFDWC0xdlFTbEdhTUk4UThxbFhJMEJwM203QlFjRWg4Wkx6YVA3UnltVnRSWWtnM2FoMXNaVmxDaTYtSG1lS0NpYzFSamZ1SDNnTF93cmJNbXM4OC9wdWI/Z2lkPTE1NzM1MzIzODcmc2luZ2xlPXRydWUmb3V0cHV0PWNzdiIKY2FyY2VsPXJlYWQuY3N2KGxrKQojbmFtZXMoY2FyY2VsKQpsaWJyYXJ5KHN1cnZpdmFsKQpjYXJjZWwkc3Vydml2YWw9d2l0aChjYXJjZWwsU3Vydih0aW1lID0gc2VtYW5hc0xpYnJlLGV2ZW50ID0gIGFzLm51bWVyaWMoZnVlQXJyZXN0YWRvKSkpCmNhcmNlbCRjYXNhZG89ZmFjdG9yKGNhcmNlbCRjYXNhZG8pCkNPWF9IMT0gZm9ybXVsYShzdXJ2aXZhbH5lZGFkICsgY2FzYWRvKQpDT1hfSDI9IGZvcm11bGEoc3Vydml2YWx+ZWRhZCArIGNhc2FkbyArIGV4cExhYm9yYWxQcmV2aWEpCiNyZWdyZXNzaW9uCnJjb3gxIDwtIGNveHBoKENPWF9IMSxkYXRhPWNhcmNlbCkKcmNveDIgPC0gY294cGgoQ09YX0gyLGRhdGE9Y2FyY2VsKQpzdW1tYXJ5KHJjb3gxKQpzdW1tYXJ5KHJjb3gyKQpgYGAKYGBge3J9CmFub3ZhKHJjb3gxLHJjb3gyKQpgYGAKCgo5LiBBIHN1IGRhdGEgZGUgZGVtb2NyYWNpYSBhw7HDoWRhbGUgZWwgw61uZGljZSBkZSBkZXNhcnJvbGxvIGh1bWFubyAoZW4gaW5nbGVzKSBxdWUgZGVzY2FyZ2Fyw6EgZGUgZXN0ZSBbTElOS10oaHR0cHM6Ly9oZHIudW5kcC5vcmcvc2l0ZXMvZGVmYXVsdC9maWxlcy8yMDIxLTIyX0hEUi9IRFIyMS0yMl9TdGF0aXN0aWNhbF9Bbm5leF9IRElfVGFibGUueGxzeCkuIEVuIGVzdGUgY2FzbyBxdcOpZGVzZSBjb24gbG9zIG5vbWJyZXMgcXVlIHNlIGVzY3JpYmFuIGRlIGxhIG1pc21hIG1hbmVyYS4gQ29uIGxhIGRhdGEgdW5pZGEsIMK/Q3XDoW50b3MgZmFjdG9yZXMgc2Vyw61hbiBzdWdlcmlkb3MgZGUgbGEgZGF0YT8KYGBge3J9CiMtLS0tLQpybShsaXN0ID0gbHMoKSkKbGlicmFyeShodG1sdGFiKQoKIyBsaW5rcwpXaGVyZURFTU89bGlzdChwYWdlPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZW1vY3JhY3lfSW5kZXgiLAogICAgICAgICAgICAgICB4cGF0aD0nLy8qW0BpZD0ibXctY29udGVudC10ZXh0Il0vZGl2WzFdL3RhYmxlWzZdL3Rib2R5JykKCiNjYXJnYQpXaGVyZUlESD0naHR0cHM6Ly9naXRodWIuY29tL0VzdGFkaXN0aWNhLUFuYWxpc2lzUG9saXRpY28vRGF0YUZpbGVzLWVzdGFkaXN0aWNhL3Jhdy9tYWluL0hEUjIxLTIyX1N0YXRpc3RpY2FsX0FubmV4X0hESV9UYWJsZS54bHN4JwoKI2NhcmdhCmlkaCAgPSByaW86OmltcG9ydChXaGVyZUlESCxza2lwPTQsLm5hbWVfcmVwYWlyPSdtaW5pbWFsJykKZGVtbyAgPSBodG1sdGFiKGRvYyA9IFdoZXJlREVNTyRwYWdlLCAKICAgICAgICAgICAgICAgIHdoaWNoICA9IFdoZXJlREVNTyR4cGF0aCwKICAgICAgICAgICAgICAgIGVuY29kaW5nID0gIlVURi04IikKIy0tLS0tcHJlcGFyZUlESAojbmFtZXMoaWRoKQppZGg9aWRoWyxjKDIsMyw1LDcsOSwxMSldCm5ld05hbWVzPWMoJ1BhaXMnLCdwdW50dWFjaW9uJywnRXNwZXJhbnphVmlkYScsJ0VzY29sYXJpZGFkRHVyYWNpb24nLCdFc2NvbGFyaWRhZFByb21lZGlvJywnUEJJJykKbmFtZXMoaWRoKT1uZXdOYW1lcwojaWRoW2lkaCRQYWlzPT0nU29tYWxpYScgJiAhaXMubmEoaWRoJFBhaXMpLF0KaWRoPWlkaFtjKDE6MjAyKSxdCmlkaD1pZGhbIWlzLm5hKGlkaCRQYWlzKSxdCgppZGhbLC0xXT1sYXBwbHkoaWRoWywtMV0sIGFzLm51bWVyaWMpCgojaWRoWyFjb21wbGV0ZS5jYXNlcyhpZGhbLC0xXSksXQppZGg9aWRoW2NvbXBsZXRlLmNhc2VzKGlkaFssLTFdKSxdCnJvdy5uYW1lcyhpZGgpPU5VTEwKCiMtLS0tIHByZXBybyBERU1PCiNuYW1lcyhkZW1vKQpkZW1vPWRlbW9bLC1jKDEsMiw2KV0KCm5hbWVzKGRlbW8pPWMoIlBhaXMiLCJSZWdpbWVUeXBlIiwiU2NvcmUiLCJFbGVjdG9yYWwiLCJGdW5jdGlvbmluZyIsInBhcnRpY2lwYXRpb24iLCJjdWx0dXJlIiwnQ2l2aWxsaWJlcnRpZXMnKQoKZGVtb1ssMzo4XT1sYXBwbHkoZGVtb1ssMzo4XSxhcy5udW1lcmljKQoKIy0tLS0ga2V5cwppZGgkUGFpcz0gdHJpbXdzKGlkaCRQYWlzLHdoaXRlc3BhY2UgPSAiW1xcaFxcdl0iKQpkZW1vJFBhaXM9IHRyaW13cyhkZW1vJFBhaXMsd2hpdGVzcGFjZSA9ICJbXFxoXFx2XSIpIAoKaWRoZGVtbz1tZXJnZShpZGgsZGVtbykKYGBgCgpgYGB7cn0KIy0tLS0tIGVmYQoKZG9udHNlbGVjdD1jKCJQYWlzIiwiUmVnaW1lVHlwZSIsInB1bnR1YWNpb24iLCdTY29yZScpCnNlbGVjdD1zZXRkaWZmKG5hbWVzKGlkaGRlbW8pLGRvbnRzZWxlY3QpIAp0aGVEYXRhPWlkaGRlbW9bLHNlbGVjdF0KbGlicmFyeShwb2x5Y29yKQpjb3JNYXRyaXg9cG9seWNvcjo6aGV0Y29yKHRoZURhdGEpJGNvcnJlbGF0aW9ucwpsaWJyYXJ5KHBzeWNoKQojcHN5Y2g6OktNTyhjb3JNYXRyaXgpIAojY29ydGVzdC5iYXJ0bGV0dChjb3JNYXRyaXgsbj1ucm93KHRoZURhdGEpKSRwLnZhbHVlPjAuMDUKbGlicmFyeShtYXRyaXhjYWxjKQojaXMuc2luZ3VsYXIubWF0cml4KGNvck1hdHJpeCkKZmEucGFyYWxsZWwodGhlRGF0YSwgZmEgPSAnZmEnLGNvcnJlY3QgPSBULHBsb3QgPSBGKQpgYGAKCgoxMC4gU2kgc2lndWllc2UgbGEgcmVjb21lbmRhY2nDs24gcGFyYSByZWR1Y2lyIGxhIGRpbWVuc2lvbmFsaWRhZCwgwr9DdcOhbnRhIGluZm8gbG9ncmFuIHJlY3VwZXJhciBsb3MgZmFjdG9yZXM/CmBgYHtyfQpsaWJyYXJ5KEdQQXJvdGF0aW9uKQpyZXNmYSA8LSBmYSh0aGVEYXRhLAogICAgICAgICAgICBuZmFjdG9ycyA9IDIsCiAgICAgICAgICAgIGNvciA9ICdtaXhlZCcsCiAgICAgICAgICAgIHJvdGF0ZSA9ICJ2YXJpbWF4IiwKICAgICAgICAgICAgZm09Im1pbnJlcyIpCnByaW50KHJlc2ZhJGxvYWRpbmdzLGN1dG9mZiA9IDAuNSkKYGBgCgoKMTEuIMK/Q8OzbW8gaW50ZXJwcmV0YSBlbCByb2wgZGUgY29tcGxlamlkYWQgeSBjb211bmFsaWRhZCBkZSBsYXMgdmFyaWFibGVzIHV0aWxpemFkYXM/CgpgYGB7cn0Kc29ydChyZXNmYSRjb21tdW5hbGl0eSkKYGBgCmBgYHtyfQpzb3J0KHJlc2ZhJGNvbXBsZXhpdHkpCmBgYAoKCgoxMi4gU2kgcGxhbnRlYXNlIHVuIGFuw6FsaXNpcyBmYWN0b3JpYWwgYmFzYWRvIGVuIGFsZ3VuYSB0ZW9yw61hLCDCv1F1w6kgdXNhcsOtYSBwYXJhIGRhcmxlIHN1c3RlbnRvIGEgbG9zIHJlc3VsdGFkb3MgZGUgZXNhIHTDqWNuaWNhPwoKYGBge3J9Cm1vZGVsQ0ZBPSdkZW1vPX4gRWxlY3RvcmFsICsgRnVuY3Rpb25pbmcgKyBwYXJ0aWNpcGF0aW9uICsgY3VsdHVyZSArIENpdmlsbGliZXJ0aWVzCmlkaD1+RXNwZXJhbnphVmlkYSArIEVzY29sYXJpZGFkRHVyYWNpb24gKyBFc2NvbGFyaWRhZFByb21lZGlvICsgUEJJJwoKIyBub3JtYWxpemFyIGxhcyB2YXJpYWJsZXM6CnRoZURhdGFOb3JtPXNjYWxlKHRoZURhdGEpCgpsaWJyYXJ5KGxhdmFhbikKY2ZhX2ZpdCA8LSBjZmEobW9kZWxDRkEsIGRhdGE9dGhlRGF0YU5vcm0sIAogICAgICAgICAgICAgICBzdGQubHY9VFJVRSwgIAogICAgICAgICAgICAgICBtaXNzaW5nPSJmaW1sIikKYWxsUGFyYW1DRkE9cGFyYW1ldGVyRXN0aW1hdGVzKGNmYV9maXQsc3RhbmRhcmRpemVkID0gVCkKYWxsRml0Q0ZBPWFzLmxpc3QoZml0TWVhc3VyZXMoY2ZhX2ZpdCkpCmFsbEZpdENGQVtjKCJjaGlzcSIsICJkZiIsICJwdmFsdWUiKV0gIyBwdmFsdWU+MC4wNQpgYGAKCmBgYHtyfQphbGxGaXRDRkEkdGxpIApgYGAKCmBgYHtyfQphbGxGaXRDRkFbYygncm1zZWEuY2kubG93ZXInLCdybXNlYScgLCdybXNlYS5jaS51cHBlcicpXSAKYGBgCgoKMTMuIENvbiBsYSBkYXRhIG9yaWdpbmFsIGRlbCBEZW1vY3JhY3kgSW5kZXggcGlkZSA0IGNsdXN0ZXJzIHkgY29tcGFyYSBlbCByZXN1bHRhZG8gY29uIGxvIHByb3B1ZXN0byBwb3IgVGhlIEVjb25vbWlzdC4gwr9RdcOpIG9ic2VydmFzPwoKYGBge3J9CiMjIyMgMQpkYXRhQ2x1cz1kZW1vWywtYygxOjMpXQpyb3cubmFtZXMoZGF0YUNsdXMpPWRlbW8kUGFpcwpsaWJyYXJ5KGNsdXN0ZXIpCmcuZGlzdCA9IGRhaXN5KGRhdGFDbHVzLCBtZXRyaWM9Imdvd2VyIikKc2V0LnNlZWQoMTIzKQpyZXMucGFtPXBhbShnLmRpc3QsNCxjbHVzdGVyLm9ubHkgPSBGKQoKI251ZXZhIGNvbHVtbmEKZGF0YUNsdXMkcGFtPXJlcy5wYW0kY2x1c3RlcgoKI2FnZ3JlZ2F0ZSgufiBwYW0sIGRhdGE9ZGF0YUNsdXMsbWVhbikKZGVtbyRwYW09cmVzLnBhbSRjbHVzdGVyCnRhYmxlKGRlbW8kcGFtLGRlbW8kUmVnaW1lVHlwZSxkbm4gPSBjKCdQYXJ0aWNpb24nLCdFY29ubycpKQoKYGBgCjE0LiBDb24gbGEgZGF0YSBvcmlnaW5hbCBkZWwgSURIIGF2ZXJpZ3VhIGN1YW50b3MgY2x1c3RlcnMgc2UgcmVjb21pZW5kYW4gc2lndWllbmRvIGxhIHTDqWNuaWNhIGFnbG9tZXJhdGl2YS4KCmBgYHtyfQojYm94cGxvdChpZGhbLC1jKDE6MildLGhvcml6b250YWwgPSBGLGxhcz0yLGNleC5heGlzID0gMC41KQoKCmRhdGFDbHVzPUJCbWlzYzo6bm9ybWFsaXplKGlkaFssLWMoMToyKV0sbWV0aG9kPSdzdGFuZGFyZGl6ZScpCnJvdy5uYW1lcyhkYXRhQ2x1cyk9aWRoJFBhaXMKbGlicmFyeShjbHVzdGVyKQpnLmRpc3QgPSBkYWlzeShkYXRhQ2x1cywgbWV0cmljPSJnb3dlciIpCnNldC5zZWVkKDEyMykKCgpsaWJyYXJ5KGZhY3RvZXh0cmEpCmZ2aXpfbmJjbHVzdChkYXRhQ2x1cywgaGN1dCxkaXNzPWcuZGlzdCxtZXRob2QgPSAiZ2FwX3N0YXQiLGsubWF4ID0gMTAsdmVyYm9zZSA9IEYsaGNfZnVuYyA9ICJhZ25lcyIpCgpgYGAKMTUuIENvbiBsYSBkYXRhIG9yaWdpbmFsIGRlbCBEZW1vY3JhY3kgSW5kZXggcGlkZSBsb3MgY2x1c3RlcnMgcXVlIHNlIHJlY29taWVuZGVuLCDCv0N1w6FudG9zIHBhw61zZXMgcXVlZGFuIG1hbCBjbHVzdGVyaXphZG9zPwoKYGBge3J9CmRlbW8kcGFtPU5VTEwKZGF0YUNsdXM9ZGVtb1ssLWMoMTozKV0Kcm93Lm5hbWVzKGRhdGFDbHVzKT1kZW1vJFBhaXMKbGlicmFyeShjbHVzdGVyKQpnLmRpc3QgPSBkYWlzeShkYXRhQ2x1cywgbWV0cmljPSJnb3dlciIpCmZ2aXpfbmJjbHVzdChkYXRhQ2x1cywgcGFtLGRpc3M9Zy5kaXN0LG1ldGhvZCA9ICJnYXBfc3RhdCIsay5tYXggPSAxMCx2ZXJib3NlID0gRikKc2V0LnNlZWQoMTIzKQpyZXMucGFtPXBhbShnLmRpc3QsNyxjbHVzdGVyLm9ubHkgPSBGKQpzaWxQQU09ZGF0YS5mcmFtZShyZXMucGFtJHNpbGluZm8kd2lkdGhzKQpzaWxQQU0kY291bnRyeT1yb3cubmFtZXMoc2lsUEFNKQoKcG9vclBBTT1zaWxQQU1bc2lsUEFNJHNpbF93aWR0aDwwLCdjb3VudHJ5J10jJT4lc29ydCgpCnBvb3JQQU0KYGBgCgoxNi4gSGF6IHVuIG1lcmdlIGNvbiBJREggeSBEZW1vY3JhY3kgSW5kZXgsIHBlcm8gcmVjdXBlcmFuZG8gdG9kb3MgbG9zIHBhaXNlcyBhdW4gY3VhbmRvIG5vIHNlIGVzY3JpYmFuIGlndWFsLiBOb3JtYWxpY2UgbG9zIHZhbG9yZXMgZGVsIElESCBjb24gZWwgbWV0b2RvIHJhbmdvIChkZWwgMSBhbCAxMCkuIMK/SGF5IGRpZmVyZW5jaWFzIGVuIGN1YW50byBhIGxhcyBzdWdlcmVuY2lhIGRlIGxhIGNhbnRpZGFkIGRlIGNsdXN0ZXJzIHBhcmEgY2FkYSB0ZWNuaWNhIGplcmFycXVpY2Egc2kgdXNhIGxvcyBjb21wb25lbnRlcyBkZSBhbWJvcyBjb25jZXB0b3M/CgpgYGB7cn0KaWRoW2lkaCRQYWlzPT0iQm9saXZpYSAoUGx1cmluYXRpb25hbCBTdGF0ZSBvZikiLCdQYWlzJ109ICJCb2xpdmlhIgppZGhbaWRoJFBhaXM9PSJDYWJvIFZlcmRlIiwnUGFpcyddPSAiQ2FwZSBWZXJkZSIKaWRoW2lkaCRQYWlzPT0iQ3plY2hpYSIsJ1BhaXMnXT0gIkN6ZWNoIFJlcHVibGljIgppZGhbaWRoJFBhaXM9PSJDb25nbyAoRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUpIiwnUGFpcyddPSAiRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28iCmlkaFtpZGgkUGFpcz09IlRpbW9yLUxlc3RlIiwnUGFpcyddPSAgIkVhc3QgVGltb3IiCmlkaFtpZGgkUGFpcz09IkVzd2F0aW5pIChLaW5nZG9tIG9mKSIsJ1BhaXMnXT0gIkVzd2F0aW5pIgppZGhbaWRoJFBhaXM9PSJIb25nIEtvbmcsIENoaW5hIChTQVIpIiwnUGFpcyddPSAiSG9uZyBLb25nIgppZGhbaWRoJFBhaXM9PSJJcmFuIChJc2xhbWljIFJlcHVibGljIG9mKSIsJ1BhaXMnXT0gIklyYW4iCmlkaFtpZGgkUGFpcz09IkPDtHRlIGQnSXZvaXJlIiwnUGFpcyddPSAiSXZvcnkgQ29hc3QiCmlkaFtpZGgkUGFpcz09IkxhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIiAsJ1BhaXMnXT0gIkxhb3MiCmlkaFtpZGgkUGFpcz09Ik1vbGRvdmEgKFJlcHVibGljIG9mKSIsJ1BhaXMnXT0gIk1vbGRvdmEiCmlkaFtpZGgkUGFpcz09IlBhbGVzdGluZSwgU3RhdGUgb2YiLCdQYWlzJ109ICJQYWxlc3RpbmUiCmlkaFtpZGgkUGFpcz09IkNvbmdvIiwnUGFpcyddPSAiUmVwdWJsaWMgb2YgdGhlIENvbmdvIgppZGhbaWRoJFBhaXM9PSJSdXNzaWFuIEZlZGVyYXRpb24iLCdQYWlzJ109ICAiUnVzc2lhIgppZGhbaWRoJFBhaXM9PSJLb3JlYSAoUmVwdWJsaWMgb2YpIiwnUGFpcyddPSAiU291dGggS29yZWEiCmlkaFtpZGgkUGFpcz09IlN5cmlhbiBBcmFiIFJlcHVibGljIiwnUGFpcyddPSJTeXJpYSIKaWRoW2lkaCRQYWlzPT0iVGFuemFuaWEgKFVuaXRlZCBSZXB1YmxpYyBvZikiLCdQYWlzJ109ICJUYW56YW5pYSIKaWRoW2lkaCRQYWlzPT0iVMO8cmtpeWUiICwnUGFpcyddPSAiVHVya2V5IgppZGhbaWRoJFBhaXM9PSJWZW5lenVlbGEgKEJvbGl2YXJpYW4gUmVwdWJsaWMgb2YpIiwnUGFpcyddPSJWZW5lenVlbGEiCmlkaFtpZGgkUGFpcz09IlZpZXQgTmFtIiAsJ1BhaXMnXT0iVmlldG5hbSIKaWRoZGVtbz1tZXJnZShpZGgsZGVtbykKCgppZGhkZW1vWyxjKDM6NildPUJCbWlzYzo6bm9ybWFsaXplKGlkaGRlbW9bLGMoMzo2KV0sbWV0aG9kPSdyYW5nZScscmFuZ2U9YygwLDEwKSkKZGF0YUNsdXM9aWRoZGVtb1ssYygzOjYsOToxMyldCnJvdy5uYW1lcyhkYXRhQ2x1cyk9aWRoZGVtbyRQYWlzCgpsaWJyYXJ5KGNsdXN0ZXIpCmcuZGlzdCA9IGRhaXN5KGRhdGFDbHVzLCBtZXRyaWM9Imdvd2VyIikKZnZpel9uYmNsdXN0KGRhdGFDbHVzLCBoY3V0LGRpc3M9Zy5kaXN0LG1ldGhvZCA9ICJnYXBfc3RhdCIsay5tYXggPSAxMCx2ZXJib3NlID0gRixoY19mdW5jID0gImFnbmVzIikKYGBgCmBgYHtyfQpmdml6X25iY2x1c3QoZGF0YUNsdXMsIGhjdXQsZGlzcz1nLmRpc3QsbWV0aG9kID0gImdhcF9zdGF0IixrLm1heCA9IDEwLHZlcmJvc2UgPSBGLGhjX2Z1bmMgPSAiZGlhbmEiKQpgYGAKCgoKCjE3LiBQYXJhIGVsIGNhc28gYW50ZXJpb3IsIHNpIFVkIHBpZGUgMyBjbHVzdGVycywgwr9RdcOpIGRpZmVyZW5jaWFzIGVuY3VlbnRyYSBhbCBjbHVzdGVyaXphciBwb3IgYW1iYXMgdMOpY25pY2FzPwpgYGB7cn0KcmVzLmFnbmVzPC0gaGN1dChnLmRpc3QsIGsgPSAzLGhjX2Z1bmM9J2FnbmVzJyxoY19tZXRob2QgPSAid2FyZC5EIikKZnZpel9zaWxob3VldHRlKHJlcy5hZ25lcyxwcmludC5zdW1tYXJ5ID0gRikKCnJlcy5kaWFuYSA8LSBoY3V0KGcuZGlzdCwgayA9IDMsaGNfZnVuYz0nZGlhbmEnKQpmdml6X3NpbGhvdWV0dGUocmVzLmRpYW5hLHByaW50LnN1bW1hcnkgPSBGKQoKYGBgCmBgYHtyfQpzaWxESUFOQT1kYXRhLmZyYW1lKHJlcy5kaWFuYSRzaWxpbmZvJHdpZHRocykKc2lsRElBTkEkY291bnRyeT1yb3cubmFtZXMoc2lsRElBTkEpCnBvb3JESUFOQT1zaWxESUFOQVtzaWxESUFOQSRzaWxfd2lkdGg8MCwnY291bnRyeSddIyU+JXNvcnQoKQpwb29yRElBTkEKCnNpbEFHTkVTPWRhdGEuZnJhbWUocmVzLmFnbmVzJHNpbGluZm8kd2lkdGhzKQpzaWxBR05FUyRjb3VudHJ5PXJvdy5uYW1lcyhzaWxBR05FUykKcG9vckFHTkVTPXNpbEFHTkVTW3NpbEFHTkVTJHNpbF93aWR0aDwwLCdjb3VudHJ5J10jJT4lc29ydCgpCnBvb3JBR05FUwpgYGAKCgoKMTguIFJlaGFnYSBsYXMgcHJlZ3VudGFzIDE2IHkgMTcsIHBlcm8gbm9ybWFsaXphbmRvIHRvZGEgbGEgZGF0YSBjb24gbGEgdMOpY25pY2EgZGUgZXN0YW5kYXJpemFjacOzbi4KCmBgYHtyfQppZGhkZW1vMj1tZXJnZShpZGgsZGVtbykKaWRoZGVtbzJbLGMoMzo2LDk6MTMpXT1CQm1pc2M6Om5vcm1hbGl6ZShpZGhkZW1vMlssYygzOjYsOToxMyldLG1ldGhvZD0nc3RhbmRhcmRpemUnKQpkYXRhQ2x1cz1pZGhkZW1vMlssYygzOjYsOToxMyldCnJvdy5uYW1lcyhkYXRhQ2x1cyk9aWRoZGVtbzIkUGFpcwoKbGlicmFyeShjbHVzdGVyKQpnLmRpc3QgPSBkYWlzeShkYXRhQ2x1cywgbWV0cmljPSJnb3dlciIpCmZ2aXpfbmJjbHVzdChkYXRhQ2x1cywgaGN1dCxkaXNzPWcuZGlzdCxtZXRob2QgPSAiZ2FwX3N0YXQiLGsubWF4ID0gMTAsdmVyYm9zZSA9IEYsaGNfZnVuYyA9ICJhZ25lcyIpCmBgYApgYGB7cn0KZnZpel9uYmNsdXN0KGRhdGFDbHVzLCBoY3V0LGRpc3M9Zy5kaXN0LG1ldGhvZCA9ICJnYXBfc3RhdCIsay5tYXggPSAxMCx2ZXJib3NlID0gRixoY19mdW5jID0gImRpYW5hIikKYGBgCmBgYHtyfQpyZXMuYWduZXM8LSBoY3V0KGcuZGlzdCwgayA9IDMsaGNfZnVuYz0nYWduZXMnLGhjX21ldGhvZCA9ICJ3YXJkLkQiKQpmdml6X3NpbGhvdWV0dGUocmVzLmFnbmVzLHByaW50LnN1bW1hcnkgPSBGKQoKcmVzLmRpYW5hIDwtIGhjdXQoZy5kaXN0LCBrID0gMyxoY19mdW5jPSdkaWFuYScpCmZ2aXpfc2lsaG91ZXR0ZShyZXMuZGlhbmEscHJpbnQuc3VtbWFyeSA9IEYpCmBgYAoKYGBge3J9CnNpbERJQU5BPWRhdGEuZnJhbWUocmVzLmRpYW5hJHNpbGluZm8kd2lkdGhzKQpzaWxESUFOQSRjb3VudHJ5PXJvdy5uYW1lcyhzaWxESUFOQSkKcG9vckRJQU5BPXNpbERJQU5BW3NpbERJQU5BJHNpbF93aWR0aDwwLCdjb3VudHJ5J10jJT4lc29ydCgpCnBvb3JESUFOQQoKc2lsQUdORVM9ZGF0YS5mcmFtZShyZXMuYWduZXMkc2lsaW5mbyR3aWR0aHMpCnNpbEFHTkVTJGNvdW50cnk9cm93Lm5hbWVzKHNpbEFHTkVTKQpwb29yQUdORVM9c2lsQUdORVNbc2lsQUdORVMkc2lsX3dpZHRoPDAsJ2NvdW50cnknXSMlPiVzb3J0KCkKcG9vckFHTkVTCmBgYAoK