Taller de Simulación en R

Autor: Jaime Reinoso

PROBLEMA 1

1. El Teorema del Límite Central es uno de los más importantes en la inferencia estadística y habla sobre la convergencia de los estimadores como la proporción muestral a la distribución normal. Algunos autores afirman que esta aproximación es bastante buena a partir del umbral n>30.

a. Realice una simulación en la cual genere una población de N=1000 (Lote) y además que el porcentaje de individuos (plantas) enfermas sea del 50%.

El siguente código crea una población con una proporción de plantas enfermas del 50%. Se genera la tabla según tipo de resultado al final.

estadoPlanta = c('Sana','Enferma')
N = 1000
probEnferma = 0.5
poblacionPlantas <- sample(estadoPlanta, 
                           size=N, 
                           replace=TRUE,     # se debe permitir pues si no se acaban los valores a escoger
                           prob=c(1-probEnferma, probEnferma)  # 50% cada tipo, si probEnferma = 0.5
                           )
table(poblacionPlantas)
poblacionPlantas
Enferma    Sana 
    504     496 

Como se observa, la población generada tiene (generalmente) igual cantidad de individuos enfermos como sanos. Por temas de aleatoriedad, normalmente no se obtiene una distribución perfecta 50-50 pero si es bastante cercana siempre.

b. Genere una función que permita obtener una muestra aleatoria de la población y calcule el estimador de la proporción muestral para un tamaño de muestra dado n.

Muestra <- function(n){
              muestra <- sample(poblacionPlantas, size=n, replace=FALSE)  # es un vector de caracteres
           
              #debemos contar cuantos plantas hay Enfermas
              y = length(muestra[muestra== 'Enferma'])
              
              # calculamos la proporción. 
              p = y/n
              return(p)
}

p = Muestra(100)

La función descrita en este punnto toma como parámetro un valor n de la cantidad de elementos que se tomarán de la población para generar la muestra. Se usa el parámetro “replace=FALSE” para evitar que un elemento sea escogido nuevamente, es decir, este solo puede ser escogido una vez.

Como demostración, se ejecuta la función muestra con 100 individuos.

c. Repita el escenario anterior (b) 500 veces y analice los resultados en cuanto al comportamiento de los 500 estimadores. ¿Qué tan simétricos son los datos?, ¿Son sesgados y qué pasa en cuanto a variabilidad?


# Se crea un vector vacío
t<-c()          

 # Se hace un ciclo 500 veces
for (i in 1:500) {      
  t<-c(t,Muestra(500))   # Se captura el indicador para ese tamaño de muestra y se introduce en el vector c, 500 veces.
}

# Ahora calculemos la prueba de bondad y ajuste (shapiro wilks) de esa serie de indicadores a ver si su distribución se parece a la normal
pruebaST <-shapiro.test(t)

# hay que instalar el paquete nortest
#install.packages("nortest")
library(nortest)


# y la prueba kolmogorov-smirnov
pruebaKS <- lillie.test(t)

stConclusion =""
if (pruebaST$p.value <0.05){
  stConclusion="Sh: Se rechaza Ho"
}else{
  stConclusion="Sh:No se rechaza Ho"
}

ksConclusion =""
if (pruebaKS$p.value <0.05){
  ksConclusion="Kol:Se rechaza Ho"
}else{
  ksConclusion="Kol: No se rechaza Ho"
}

#y hacemos un histograma para ver visualmente la distribución.

hist(t, breaks=100,main=paste("n = 100 Sh=",format(pruebaST$p.value,digits=4),"Kol=",format(pruebaKS$p.value, digits=4)),
     sub=paste(stConclusion," - ",ksConclusion))                 

RESPUESTA: Se observa que la distribución tiende ser simétrica, no sesgada, aunque la prueba Shapiro-Wilks y la de Kolmogorov-Smirnov indican que no sigue una distribución normal. Se entiende que la Shapiro-Wilks debería ser usadas para muestras menores a 50 mientras que la Kolmogorov Smirnov debería ser usada para muestras de tamaño mayor o igual a 50. El ejercicio pide Shapiro-Wilks a pesar que la muestra es pedida de tamaño 500. Por eso se muestran ambas.

d. Realice los ejercicios completos b y c para tamaños de muestra n=5, 10, 15, 20, 30, 50, 60, 100, 200, 500. Y compare los resultados de los estimadores en cuanto a la normalidad. Investigue y utilice pruebas de bondad y ajuste (shapiro wilks) y métodos gráficos (grafico qq de normalidad).


vn<-c(5,10,15,20,30,50,60,100,200,500)   # vn es el vector que tiene los diferentes valores de n a probar


#j es el tamaño de muestra que se va a probar

for (n in vn){
  
  t<-c()  # se crea el vector vacío
  
  for (i in 1:500) {      # Se hace un ciclo 500 veces, es decir, se obtienen 500 estadísticos de muestra j
      t<-c(t,Muestra(n))   # Se captura el indicador para ese tamaño de muestra.
  }
  
  # Ahora calculemos la prueba de bondad y ajuste (shapiro wilks) de esa serie de indicadores a ver si su distribución se parece a la normal
  pruebaST <-shapiro.test(t)
  
  stConclusion =""
  if (pruebaST$p.value <0.05){
    stConclusion="Sh: Se rechaza Ho"
  }else{
    stConclusion="Sh:No se rechaza Ho"
  }

  #y hacemos un histograma para ver visualmente la distribución.
  
  hist(t, main=paste("n =",n," Sh=",format(pruebaST$p.value, digits=4)), 
     sub=paste(stConclusion), breaks=40)      
  qqnorm(t, main=paste("n =",n," Sh=",format(pruebaST$p.value, digits=4)))
  
  #hist(t, main = paste("Histograma de n =",j))  # Se publica el resultado.   
}


# nota:  R genera todos los gráficos y estos pueden ser comparados posteriormente.

Como resultado, se observa que a medida que n crece, la distribución del estadístico se acerca a la normal como lo describe el teorema del límite central. Esto también parece confirmarse con la prueba Shapiro-wilk, en donde a medida que se aumenta el tamaño de muestra (n), el p-value va creciendo y por tanto se acerca más y más a no rechazar Ho. Igualmente, al revisasr los gráficos qqnorm, se observa que el gráfica cada vez mas se acerca a la diagonal, indicando que se acerca a una distribución normal.

e. Repita toda la simulación (puntos a – d) pero ahora con lotes con 10% y 90% de plantas enfermas. Concluya todo el ejercicio.e.

Por facilidad de discusión en este taller, se recrea el código cambiano los valores de n a los pedidos. Para esto, se crea un vector con los valores de n esperados y se incluye un for que revisa cada uno de dichos valores.


estadoPlanta = c('Sana','Enferma')
N = 1000
vProbEnferma = c(0.1, 0.9)   # vamos a hacer el mismo proceso para diferentes valores de probabilidad de plantas enfermas

#Se itera por las diferentes probabilidades de enfermedad
for (probEnferma in vProbEnferma){
  
  #Se crea la población correspondiente
  poblacionPlantas <- sample(estadoPlanta, 
                           size=N, 
                           replace=TRUE,     # se debe permitir pues si no se acaban los valores a escoger
                           prob=c(1-probEnferma, probEnferma)  # 50% cada tipo, si probEnferma = 0.5
                           )
  #Se confirma la distribución obtenida
  table(poblacionPlantas)
  
  #Se define el vector de tamaño de muestra
  vn<-c(5,10,15,20,30,50,60,100,200,500)   # vn es el vector que tiene los diferentes valores de n a probar
  
  #j es el tamaño de muestra a probar
  for (n in vn){
    
    t<-c()  # se crea el vector vacío
    
    for (i in 1:500) {      # Se hace un ciclo 500 veces
      t<-c(t,Muestra(n))   # Se captura el indicador para ese tamaño de muestra.
    }
    
    # Se obtiene la prueba shapiro para t
    pruebaST <-shapiro.test(t)
    
    #Se obtiene el histograma correspondiente.
    hist(t, main = paste(" Porcentaje Enfermas: ", probEnferma, "j =", n, "Shap:",format(pruebaST$p.value, digits=4)))  # Se publica el resultado.  
    qqnorm(t, main = paste(" Porcentaje Enfermas: ", probEnferma, "j =", n, "Shap:",format(pruebaST$p.value, digits=4)))
  }
  
}

NA
NA

En el caso de una distribución del 10% de enfermas, se observa una distribución normal con centro en 10%, a medida que n crece. Esto es consistente con la población usada.

Por otro lado, a medida que n tiende a ser más grande, se confirma que la distribución tiende a normal tanto analizando visualmente el histograma resultante, observando el resultado de la prueba Shapiro aplicada y analizando la grafica qqnorm.

en el caso de la distribución con un 90% de plantas enfermas, ocurre lo mismo, con la diferencia que la muestra tiende a ser normal con una media cercana al 90% como corresponde.

Esto convalida lo expresado por el teorema del límite central.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgVGFsbGVyIGRlIFNpbXVsYWNpw7NuIGVuIFIKKipBdXRvcjogIEphaW1lIFJlaW5vc28qKgoKIyMjIFBST0JMRU1BIDEKCioqMS4gIEVsIFRlb3JlbWEgZGVsIEzDrW1pdGUgQ2VudHJhbCBlcyB1bm8gZGUgbG9zIG3DoXMgaW1wb3J0YW50ZXMgZW4gbGEgaW5mZXJlbmNpYSBlc3RhZMOtc3RpY2EgeSBoYWJsYSBzb2JyZSBsYSBjb252ZXJnZW5jaWEgZGUgbG9zIGVzdGltYWRvcmVzIGNvbW8gbGEgcHJvcG9yY2nDs24gbXVlc3RyYWwgYSBsYSBkaXN0cmlidWNpw7NuIG5vcm1hbC4gQWxndW5vcyBhdXRvcmVzIGFmaXJtYW4gcXVlIGVzdGEgYXByb3hpbWFjacOzbiBlcyBiYXN0YW50ZSBidWVuYSBhIHBhcnRpciBkZWwgdW1icmFsIG4+MzAuKioKCioqYS4gUmVhbGljZSB1bmEgc2ltdWxhY2nDs24gZW4gbGEgY3VhbCBnZW5lcmUgdW5hIHBvYmxhY2nDs24gZGUgTj0xMDAwIChMb3RlKSB5IGFkZW3DoXMgcXVlIGVsIHBvcmNlbnRhamUgZGUgaW5kaXZpZHVvcyAocGxhbnRhcykgZW5mZXJtYXMgc2VhIGRlbCA1MCUuKioKCgpFbCBzaWd1ZW50ZSBjw7NkaWdvIGNyZWEgdW5hIHBvYmxhY2nDs24gY29uIHVuYSBwcm9wb3JjacOzbiBkZSBwbGFudGFzIGVuZmVybWFzIGRlbCA1MCUuICAgU2UgZ2VuZXJhIGxhIHRhYmxhIHNlZ8O6biB0aXBvIGRlIHJlc3VsdGFkbyBhbCBmaW5hbC4KCmBgYHtyfQplc3RhZG9QbGFudGEgPSBjKCdTYW5hJywnRW5mZXJtYScpCk4gPSAxMDAwCnByb2JFbmZlcm1hID0gMC41CnBvYmxhY2lvblBsYW50YXMgPC0gc2FtcGxlKGVzdGFkb1BsYW50YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9TiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U9VFJVRSwgICAgICMgc2UgZGViZSBwZXJtaXRpciBwdWVzIHNpIG5vIHNlIGFjYWJhbiBsb3MgdmFsb3JlcyBhIGVzY29nZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYj1jKDEtcHJvYkVuZmVybWEsIHByb2JFbmZlcm1hKSAgIyA1MCUgY2FkYSB0aXBvLCBzaSBwcm9iRW5mZXJtYSA9IDAuNQogICAgICAgICAgICAgICAgICAgICAgICAgICApCnRhYmxlKHBvYmxhY2lvblBsYW50YXMpCmBgYAoKQ29tbyBzZSBvYnNlcnZhLCBsYSBwb2JsYWNpw7NuIGdlbmVyYWRhIHRpZW5lIChnZW5lcmFsbWVudGUpIGlndWFsIGNhbnRpZGFkIGRlIGluZGl2aWR1b3MgZW5mZXJtb3MgY29tbyBzYW5vcy4gICBQb3IgdGVtYXMgZGUgYWxlYXRvcmllZGFkLCBub3JtYWxtZW50ZSBubyBzZSBvYnRpZW5lIHVuYSBkaXN0cmlidWNpw7NuIHBlcmZlY3RhIDUwLTUwIHBlcm8gc2kgZXMgYmFzdGFudGUgY2VyY2FuYSBzaWVtcHJlLgoKCipiLiBHZW5lcmUgdW5hIGZ1bmNpw7NuIHF1ZSBwZXJtaXRhIG9idGVuZXIgdW5hIG11ZXN0cmEgYWxlYXRvcmlhIGRlIGxhIHBvYmxhY2nDs24geSBjYWxjdWxlIGVsIGVzdGltYWRvciBkZSBsYSBwcm9wb3JjacOzbiBtdWVzdHJhbCBwYXJhIHVuIHRhbWHDsW8gZGUgbXVlc3RyYSBkYWRvIG4uKgoKYGBge3J9Ck11ZXN0cmEgPC0gZnVuY3Rpb24obil7CiAgICAgICAgICAgICAgbXVlc3RyYSA8LSBzYW1wbGUocG9ibGFjaW9uUGxhbnRhcywgc2l6ZT1uLCByZXBsYWNlPUZBTFNFKSAgIyBlcyB1biB2ZWN0b3IgZGUgY2FyYWN0ZXJlcwogICAgICAgICAgIAogICAgICAgICAgICAgICNkZWJlbW9zIGNvbnRhciBjdWFudG9zIHBsYW50YXMgaGF5IEVuZmVybWFzCiAgICAgICAgICAgICAgeSA9IGxlbmd0aChtdWVzdHJhW211ZXN0cmE9PSAnRW5mZXJtYSddKQogICAgICAgICAgICAgIAogICAgICAgICAgICAgICMgY2FsY3VsYW1vcyBsYSBwcm9wb3JjacOzbi4gCiAgICAgICAgICAgICAgcCA9IHkvbgogICAgICAgICAgICAgIHJldHVybihwKQp9CgpwID0gTXVlc3RyYSgxMDApCmBgYAoKTGEgZnVuY2nDs24gZGVzY3JpdGEgZW4gZXN0ZSBwdW5udG8gdG9tYSBjb21vIHBhcsOhbWV0cm8gdW4gdmFsb3IgbiBkZSBsYSBjYW50aWRhZCBkZSBlbGVtZW50b3MgcXVlIHNlIHRvbWFyw6FuIGRlIGxhIHBvYmxhY2nDs24gcGFyYSBnZW5lcmFyIGxhIG11ZXN0cmEuICBTZSB1c2EgZWwgcGFyw6FtZXRybyAicmVwbGFjZT1GQUxTRSIgcGFyYSBldml0YXIgcXVlIHVuIGVsZW1lbnRvIHNlYSBlc2NvZ2lkbyBudWV2YW1lbnRlLCBlcyBkZWNpciwgZXN0ZSBzb2xvIHB1ZWRlIHNlciBlc2NvZ2lkbyB1bmEgdmV6LgoKQ29tbyBkZW1vc3RyYWNpw7NuLCBzZSBlamVjdXRhIGxhIGZ1bmNpw7NuIG11ZXN0cmEgY29uIDEwMCBpbmRpdmlkdW9zLgoKKipjLiBSZXBpdGEgZWwgZXNjZW5hcmlvIGFudGVyaW9yIChiKSA1MDAgdmVjZXMgeSBhbmFsaWNlIGxvcyByZXN1bHRhZG9zIGVuIGN1YW50byBhbCBjb21wb3J0YW1pZW50byBkZSBsb3MgNTAwIGVzdGltYWRvcmVzLiDCv1F1w6kgdGFuIHNpbcOpdHJpY29zIHNvbiBsb3MgZGF0b3M/LCDCv1NvbiBzZXNnYWRvcyB5IHF1w6kgcGFzYSBlbiBjdWFudG8gYSB2YXJpYWJpbGlkYWQ/KioKCmBgYHtyfQoKIyBTZSBjcmVhIHVuIHZlY3RvciB2YWPDrW8KdDwtYygpICAgICAgICAgIAoKICMgU2UgaGFjZSB1biBjaWNsbyA1MDAgdmVjZXMKZm9yIChpIGluIDE6NTAwKSB7ICAgICAgCiAgdDwtYyh0LE11ZXN0cmEoNTAwKSkgICAjIFNlIGNhcHR1cmEgZWwgaW5kaWNhZG9yIHBhcmEgZXNlIHRhbWHDsW8gZGUgbXVlc3RyYSB5IHNlIGludHJvZHVjZSBlbiBlbCB2ZWN0b3IgYywgNTAwIHZlY2VzLgp9CgojIEFob3JhIGNhbGN1bGVtb3MgbGEgcHJ1ZWJhIGRlIGJvbmRhZCB5IGFqdXN0ZSAoc2hhcGlybyB3aWxrcykgZGUgZXNhIHNlcmllIGRlIGluZGljYWRvcmVzIGEgdmVyIHNpIHN1IGRpc3RyaWJ1Y2nDs24gc2UgcGFyZWNlIGEgbGEgbm9ybWFsCnBydWViYVNUIDwtc2hhcGlyby50ZXN0KHQpCgojIGhheSBxdWUgaW5zdGFsYXIgZWwgcGFxdWV0ZSBub3J0ZXN0CiNpbnN0YWxsLnBhY2thZ2VzKCJub3J0ZXN0IikKbGlicmFyeShub3J0ZXN0KQoKCiMgeSBsYSBwcnVlYmEga29sbW9nb3Jvdi1zbWlybm92CnBydWViYUtTIDwtIGxpbGxpZS50ZXN0KHQpCgpzdENvbmNsdXNpb24gPSIiCmlmIChwcnVlYmFTVCRwLnZhbHVlIDwwLjA1KXsKICBzdENvbmNsdXNpb249IlNoOiBTZSByZWNoYXphIEhvIgp9ZWxzZXsKICBzdENvbmNsdXNpb249IlNoOk5vIHNlIHJlY2hhemEgSG8iCn0KCmtzQ29uY2x1c2lvbiA9IiIKaWYgKHBydWViYUtTJHAudmFsdWUgPDAuMDUpewogIGtzQ29uY2x1c2lvbj0iS29sOlNlIHJlY2hhemEgSG8iCn1lbHNlewogIGtzQ29uY2x1c2lvbj0iS29sOiBObyBzZSByZWNoYXphIEhvIgp9CgojeSBoYWNlbW9zIHVuIGhpc3RvZ3JhbWEgcGFyYSB2ZXIgdmlzdWFsbWVudGUgbGEgZGlzdHJpYnVjacOzbi4KCmhpc3QodCwgYnJlYWtzPTEwMCxtYWluPXBhc3RlKCJuID0gMTAwIFNoPSIsZm9ybWF0KHBydWViYVNUJHAudmFsdWUsZGlnaXRzPTQpLCJLb2w9Iixmb3JtYXQocHJ1ZWJhS1MkcC52YWx1ZSwgZGlnaXRzPTQpKSwKICAgICBzdWI9cGFzdGUoc3RDb25jbHVzaW9uLCIgLSAiLGtzQ29uY2x1c2lvbikpICAgICAgICAgICAgICAgICAKYGBgClJFU1BVRVNUQTogIFNlIG9ic2VydmEgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gdGllbmRlIHNlciBzaW3DqXRyaWNhLCBubyBzZXNnYWRhLCBhdW5xdWUgbGEgcHJ1ZWJhIFNoYXBpcm8tV2lsa3MgeSBsYSBkZSBLb2xtb2dvcm92LVNtaXJub3YgaW5kaWNhbiBxdWUgbm8gc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLiAgIFNlIGVudGllbmRlIHF1ZSBsYSBTaGFwaXJvLVdpbGtzIGRlYmVyw61hIHNlciB1c2FkYXMgcGFyYSBtdWVzdHJhcyBtZW5vcmVzIGEgNTAgbWllbnRyYXMgcXVlIGxhIEtvbG1vZ29yb3YgU21pcm5vdiBkZWJlcsOtYSBzZXIgdXNhZGEgcGFyYSBtdWVzdHJhcyBkZSB0YW1hw7FvIG1heW9yIG8gaWd1YWwgYSA1MC4gIEVsIGVqZXJjaWNpbyBwaWRlIFNoYXBpcm8tV2lsa3MgYSBwZXNhciBxdWUgbGEgbXVlc3RyYSBlcyBwZWRpZGEgZGUgdGFtYcOxbyA1MDAuICAgUG9yIGVzbyBzZSBtdWVzdHJhbiBhbWJhcy4KCioqZC4gUmVhbGljZSBsb3MgZWplcmNpY2lvcyBjb21wbGV0b3MgYiB5IGMgcGFyYSB0YW1hw7FvcyBkZSBtdWVzdHJhIG49NSwgMTAsIDE1LCAyMCwgMzAsIDUwLCA2MCwgMTAwLCAyMDAsIDUwMC4gWSBjb21wYXJlIGxvcyByZXN1bHRhZG9zIGRlIGxvcyBlc3RpbWFkb3JlcyBlbiBjdWFudG8gYSBsYSBub3JtYWxpZGFkLiBJbnZlc3RpZ3VlIHkgdXRpbGljZSBwcnVlYmFzIGRlIGJvbmRhZCB5IGFqdXN0ZSAoc2hhcGlybyB3aWxrcykgeSBtw6l0b2RvcyBncsOhZmljb3MgKGdyYWZpY28gcXEgZGUgbm9ybWFsaWRhZCkuKioKCmBgYHtyfQoKdm48LWMoNSwxMCwxNSwyMCwzMCw1MCw2MCwxMDAsMjAwLDUwMCkgICAjIHZuIGVzIGVsIHZlY3RvciBxdWUgdGllbmUgbG9zIGRpZmVyZW50ZXMgdmFsb3JlcyBkZSBuIGEgcHJvYmFyCgoKI2ogZXMgZWwgdGFtYcOxbyBkZSBtdWVzdHJhIHF1ZSBzZSB2YSBhIHByb2JhcgoKZm9yIChuIGluIHZuKXsKICAKICB0PC1jKCkgICMgc2UgY3JlYSBlbCB2ZWN0b3IgdmFjw61vCiAgCiAgZm9yIChpIGluIDE6NTAwKSB7ICAgICAgIyBTZSBoYWNlIHVuIGNpY2xvIDUwMCB2ZWNlcywgZXMgZGVjaXIsIHNlIG9idGllbmVuIDUwMCBlc3RhZMOtc3RpY29zIGRlIG11ZXN0cmEgagogICAgICB0PC1jKHQsTXVlc3RyYShuKSkgICAjIFNlIGNhcHR1cmEgZWwgaW5kaWNhZG9yIHBhcmEgZXNlIHRhbWHDsW8gZGUgbXVlc3RyYS4KICB9CiAgCiAgIyBBaG9yYSBjYWxjdWxlbW9zIGxhIHBydWViYSBkZSBib25kYWQgeSBhanVzdGUgKHNoYXBpcm8gd2lsa3MpIGRlIGVzYSBzZXJpZSBkZSBpbmRpY2Fkb3JlcyBhIHZlciBzaSBzdSBkaXN0cmlidWNpw7NuIHNlIHBhcmVjZSBhIGxhIG5vcm1hbAogIHBydWViYVNUIDwtc2hhcGlyby50ZXN0KHQpCiAgCiAgc3RDb25jbHVzaW9uID0iIgogIGlmIChwcnVlYmFTVCRwLnZhbHVlIDwwLjA1KXsKICAgIHN0Q29uY2x1c2lvbj0iU2g6IFNlIHJlY2hhemEgSG8iCiAgfWVsc2V7CiAgICBzdENvbmNsdXNpb249IlNoOk5vIHNlIHJlY2hhemEgSG8iCiAgfQoKICAjeSBoYWNlbW9zIHVuIGhpc3RvZ3JhbWEgcGFyYSB2ZXIgdmlzdWFsbWVudGUgbGEgZGlzdHJpYnVjacOzbi4KICAKICBoaXN0KHQsIG1haW49cGFzdGUoIm4gPSIsbiwiIFNoPSIsZm9ybWF0KHBydWViYVNUJHAudmFsdWUsIGRpZ2l0cz00KSksIAogICAgIHN1Yj1wYXN0ZShzdENvbmNsdXNpb24pLCBicmVha3M9NDApICAgICAgCiAgcXFub3JtKHQsIG1haW49cGFzdGUoIm4gPSIsbiwiIFNoPSIsZm9ybWF0KHBydWViYVNUJHAudmFsdWUsIGRpZ2l0cz00KSkpCn0KYGBgCkNvbW8gcmVzdWx0YWRvLCBzZSBvYnNlcnZhIHF1ZSBhIG1lZGlkYSBxdWUgbiBjcmVjZSwgbGEgZGlzdHJpYnVjacOzbiBkZWwgZXN0YWTDrXN0aWNvIHNlIGFjZXJjYSBhIGxhIG5vcm1hbCBjb21vIGxvIGRlc2NyaWJlIGVsIHRlb3JlbWEgZGVsIGzDrW1pdGUgY2VudHJhbC4gIEVzdG8gdGFtYmnDqW4gcGFyZWNlIGNvbmZpcm1hcnNlIGNvbiBsYSBwcnVlYmEgU2hhcGlyby13aWxrLCBlbiBkb25kZSBhIG1lZGlkYSBxdWUgc2UgYXVtZW50YSBlbCB0YW1hw7FvIGRlIG11ZXN0cmEgKG4pLCBlbCBwLXZhbHVlIHZhIGNyZWNpZW5kbyB5IHBvciB0YW50byBzZSBhY2VyY2EgbcOhcyB5IG3DoXMgYSBubyByZWNoYXphciBIby4gICAgIElndWFsbWVudGUsIGFsIHJldmlzYXNyIGxvcyBncsOhZmljb3MgcXFub3JtLCBzZSBvYnNlcnZhIHF1ZSBlbCBncsOhZmljYSBjYWRhIHZleiBtYXMgc2UgYWNlcmNhIGEgbGEgZGlhZ29uYWwsIGluZGljYW5kbyBxdWUgc2UgYWNlcmNhIGEgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLgoKCioqZS4gUmVwaXRhIHRvZGEgbGEgc2ltdWxhY2nDs24gKHB1bnRvcyBhIOKAkyBkKSBwZXJvIGFob3JhIGNvbiBsb3RlcyBjb24gMTAlIHkgOTAlIGRlIHBsYW50YXMgZW5mZXJtYXMuIENvbmNsdXlhIHRvZG8gZWwgZWplcmNpY2lvLmUuICoqCgpQb3IgZmFjaWxpZGFkIGRlIGRpc2N1c2nDs24gZW4gZXN0ZSB0YWxsZXIsIHNlIHJlY3JlYSBlbCBjw7NkaWdvIGNhbWJpYW5vIGxvcyB2YWxvcmVzIGRlIG4gYSBsb3MgcGVkaWRvcy4gICBQYXJhIGVzdG8sIHNlIGNyZWEgdW4gdmVjdG9yIGNvbiAgbG9zIHZhbG9yZXMgZGUgbiBlc3BlcmFkb3MgeSBzZSBpbmNsdXllIHVuIGZvciBxdWUgcmV2aXNhIGNhZGEgdW5vIGRlIGRpY2hvcyB2YWxvcmVzLgoKYGBge3J9Cgplc3RhZG9QbGFudGEgPSBjKCdTYW5hJywnRW5mZXJtYScpCk4gPSAxMDAwCnZQcm9iRW5mZXJtYSA9IGMoMC4xLCAwLjkpICAgIyB2YW1vcyBhIGhhY2VyIGVsIG1pc21vIHByb2Nlc28gcGFyYSBkaWZlcmVudGVzIHZhbG9yZXMgZGUgcHJvYmFiaWxpZGFkIGRlIHBsYW50YXMgZW5mZXJtYXMKCiNTZSBpdGVyYSBwb3IgbGFzIGRpZmVyZW50ZXMgcHJvYmFiaWxpZGFkZXMgZGUgZW5mZXJtZWRhZApmb3IgKHByb2JFbmZlcm1hIGluIHZQcm9iRW5mZXJtYSl7CiAgCiAgI1NlIGNyZWEgbGEgcG9ibGFjacOzbiBjb3JyZXNwb25kaWVudGUKICBwb2JsYWNpb25QbGFudGFzIDwtIHNhbXBsZShlc3RhZG9QbGFudGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPU4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlPVRSVUUsICAgICAjIHNlIGRlYmUgcGVybWl0aXIgcHVlcyBzaSBubyBzZSBhY2FiYW4gbG9zIHZhbG9yZXMgYSBlc2NvZ2VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2I9YygxLXByb2JFbmZlcm1hLCBwcm9iRW5mZXJtYSkgICMgNTAlIGNhZGEgdGlwbywgc2kgcHJvYkVuZmVybWEgPSAwLjUKICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICNTZSBjb25maXJtYSBsYSBkaXN0cmlidWNpw7NuIG9idGVuaWRhCiAgdGFibGUocG9ibGFjaW9uUGxhbnRhcykKICAKICAjU2UgZGVmaW5lIGVsIHZlY3RvciBkZSB0YW1hw7FvIGRlIG11ZXN0cmEKICB2bjwtYyg1LDEwLDE1LDIwLDMwLDUwLDYwLDEwMCwyMDAsNTAwKSAgICMgdm4gZXMgZWwgdmVjdG9yIHF1ZSB0aWVuZSBsb3MgZGlmZXJlbnRlcyB2YWxvcmVzIGRlIG4gYSBwcm9iYXIKICAKICAjaiBlcyBlbCB0YW1hw7FvIGRlIG11ZXN0cmEgYSBwcm9iYXIKICBmb3IgKG4gaW4gdm4pewogICAgCiAgICB0PC1jKCkgICMgc2UgY3JlYSBlbCB2ZWN0b3IgdmFjw61vCiAgICAKICAgIGZvciAoaSBpbiAxOjUwMCkgeyAgICAgICMgU2UgaGFjZSB1biBjaWNsbyA1MDAgdmVjZXMKICAgICAgdDwtYyh0LE11ZXN0cmEobikpICAgIyBTZSBjYXB0dXJhIGVsIGluZGljYWRvciBwYXJhIGVzZSB0YW1hw7FvIGRlIG11ZXN0cmEuCiAgICB9CiAgICAKICAgICMgU2Ugb2J0aWVuZSBsYSBwcnVlYmEgc2hhcGlybyBwYXJhIHQKICAgIHBydWViYVNUIDwtc2hhcGlyby50ZXN0KHQpCiAgICAKICAgICNTZSBvYnRpZW5lIGVsIGhpc3RvZ3JhbWEgY29ycmVzcG9uZGllbnRlLgogICAgaGlzdCh0LCBtYWluID0gcGFzdGUoIiBQb3JjZW50YWplIEVuZmVybWFzOiAiLCBwcm9iRW5mZXJtYSwgImogPSIsIG4sICJTaGFwOiIsZm9ybWF0KHBydWViYVNUJHAudmFsdWUsIGRpZ2l0cz00KSkpICAKICAgICMgU2UgcHVibGljYSBlbCByZXN1bHRhZG8uICAKICAgIHFxbm9ybSh0LCBtYWluID0gcGFzdGUoIiBQb3JjZW50YWplIEVuZmVybWFzOiAiLCBwcm9iRW5mZXJtYSwgImogPSIsIG4sICJTaGFwOiIsZm9ybWF0KHBydWViYVNUJHAudmFsdWUsIGRpZ2l0cz00KSkpCiAgfQp9CmBgYApFbiBlbCBjYXNvIGRlIHVuYSBkaXN0cmlidWNpw7NuIGRlbCAxMCUgZGUgZW5mZXJtYXMsIHNlIG9ic2VydmEgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBjZW50cm8gZW4gMTAlLCBhIG1lZGlkYSBxdWUgbiBjcmVjZS4gIEVzdG8gZXMgY29uc2lzdGVudGUgY29uIGxhIHBvYmxhY2nDs24gdXNhZGEuCgpQb3Igb3RybyBsYWRvLCBhIG1lZGlkYSBxdWUgbiB0aWVuZGUgYSBzZXIgbcOhcyBncmFuZGUsIHNlIGNvbmZpcm1hIHF1ZSBsYSBkaXN0cmlidWNpw7NuIHRpZW5kZSBhIG5vcm1hbCB0YW50byBhbmFsaXphbmRvIHZpc3VhbG1lbnRlIGVsIGhpc3RvZ3JhbWEgcmVzdWx0YW50ZSwgb2JzZXJ2YW5kbyBlbCByZXN1bHRhZG8gZGUgbGEgcHJ1ZWJhIFNoYXBpcm8gYXBsaWNhZGEgeSBhbmFsaXphbmRvIGxhIGdyYWZpY2EgcXFub3JtLgoKZW4gZWwgY2FzbyBkZSBsYSBkaXN0cmlidWNpw7NuIGNvbiB1biA5MCUgZGUgcGxhbnRhcyBlbmZlcm1hcywgb2N1cnJlIGxvIG1pc21vLCBjb24gbGEgZGlmZXJlbmNpYSBxdWUgbGEgbXVlc3RyYSB0aWVuZGUgYSBzZXIgbm9ybWFsIGNvbiB1bmEgbWVkaWEgY2VyY2FuYSBhbCA5MCUgY29tbyBjb3JyZXNwb25kZS4KCkVzdG8gY29udmFsaWRhIGxvIGV4cHJlc2FkbyBwb3IgZWwgdGVvcmVtYSBkZWwgbMOtbWl0ZSBjZW50cmFsLgoK