MUESTREO SISTEMÁTICO CON ARRANQUE ALEATORIO

drawing

Definición

Una muestra obtenida al seleccionar aleatoriamente un elemento de los primeros k elementos en el marco y después cada k-ésimo elemento se denomina muestra sistemática 1 de cada k elementos.

Ventajas del muestreo sistematico

  1. El muestreo sistemático es mas fácil de lleva a cabo en el campo, y por lo tanto a diferencia del muestreo aleatorio simple esta menos expuesto a los errores de selección que comenten los encuestadores. Especialmente si no disponen de un marco adecuado.
  2. El muestreo sistemático puede proporcionar mas información por unidad de costo que lo que proporciona el muestreo aleatorio simple para poblaciones con determinados patrones en la organización de elementos.

Ejemplos de encuestas que utilizan muestreo sistemático

  • La Encuesta Gallup inicia su proceso de muestreo enumerando los distritos electorales de los Estados Unidos y luego selecciona sistematicamente 300 para un estudio complementario de familias.

  • La mayoría de los planes de muestreo para el control de calidad industrial suelen ser sistemáticos en su estructura. Un plan de inspección para los artículos fabricados a lo largo de una cadena de montaje en movimiento puede requerir la inspección de cada quincuagésimo artículo. Una inspección de las cajas de los productos almacenados en un depósito puede sugerir muestrear la segunda caja de la izquierda en la tercera fila, de arriba hacia abajo, de cada cinco montones. En la inspección del trabajo realizado en los puestos de operarios, el plan de inspección puede requerir el ir y venir por las filas de los puestos e inspeccionar la maquinaria en cada décimo puesto. La hora del día a menudo es importante, para evaluar la calidad de la labor realizada por el trabajador, y así un plan de inspección puede requerir el muestreo de la producción de un puesto de operario en horas seleccionadas sistemáticamente durante el día.

  • Los investigadores de mercado y los encuestadores, que muestrean personas en movimiento, muy frecuentemente emplean un diseño sistemático. A cada vigésimo cliente en una caja de pago se le puede preguntar su opinión acerca del sabor, color o textura de un producto alimenticio. A cada décima persona que suba a un autobús se le puede pedir que llene un cuestionario acerca del servicio de autobús. Cada centésimo automóvil que entra a un parque de atracciones puede ser detenido y preguntarle al conductor acerca de los sistemas de publicidad del parque o sobre el precio de los boletos. Todas estas muestras son sistemáticas.

Pasos para realizar un muestreo sistemático

Los pasos para obtener una muestra sistemática de tamaño n de una población N son:

  1. Enumere cada elemento de la población.
  2. Determine el valor de k tal que nk=N (ancho del intervalo).
  3. Elija un punto de partida aleatorio(menor o igual a k).
  4. Seleccione cada K-ésimo elemento a partir del punto de partida.

Ejemplo de selección sistemática

Seleccione una muestra sistematica de tamaño 8 del conjunto de datos iris(N=150)

pob <-    iris
N <- nrow(iris)
n <- 8                             # tamaño de muestra
(intervalo <- ceiling(N/n))        # tamaño del intervalo k
## [1] 19
k <- intervalo
set.seed(1234)                   # reproducibilidad 
arranque <- sample(1:intervalo,1) # posición inicial
indices <- seq(arranque,arranque+k*(n-1),k)       # posiciones de la muestra
iris %>%                                        # selección de la muestra
  rowid_to_column() %>% 
  slice(indices)
##   rowid Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1    16          5.7         4.4          1.5         0.4     setosa
## 2    35          4.9         3.1          1.5         0.2     setosa
## 3    54          5.5         2.3          4.0         1.3 versicolor
## 4    73          6.3         2.5          4.9         1.5 versicolor
## 5    92          6.1         3.0          4.6         1.4 versicolor
## 6   111          6.5         3.2          5.1         2.0  virginica
## 7   130          7.2         3.0          5.8         1.6  virginica
## 8   149          6.2         3.4          5.4         2.3  virginica

Población ordenada

Decimos que una población es aleatoria si el orden en el que se encuentran los elementos es aleatoria.

Una población es ordenada si los elementos de la población tienden a aumentar o disminuir cuando se enumeran.

Una población ordenada aparece por ejemplo en listados cronológicos como el balance de hipotecas pendientes de pago, por lo general, las hipotecas mas antiguas tienden a tener menor valor que las nuevas.

Tambien deben considerarse de forma especial los casos en los que una poblacion tiene una tendencia periódica, como seria por ejemplo una curva seonosoidal simple. Para trabajarlas adecuadamente el valor de K debe ser un múltiplo impar del semiperiodo.

Las poblaciones periódicas senosiodales no se esperan en la práctica, pero las poblaciones con una tendencia periódica sí son bastante comunes, un ejemplo de ella son el flujo de trafico que pasa por un punto dado en una carretera en un periodo de 24 horas, o las ventas de un almacén en un periodo de 7 días.

Ejemplo:

En el siguiente ejemplo se realiza un muestreo sistemático sobre un conjunto de datos de diferentes granos de café seleccionados de diferentes lugares del mundo.

coffee <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-07-07/coffee_ratings.csv')
coffee1 <- coffee %>% 
  rowid_to_column()
ggplot(coffee1,aes(x=rowid,y=aftertaste))+
  geom_point()+
  ylim(c(6,8))+
  geom_smooth(method = "loess")

Cuando se observa que la variable aftertaste tiende a disminuir conforme el número de elemento aumenta, podemos decir que es que tenemos una población ordenada.

coffee_desord<-coffee %>% 
  slice_sample(prop=1) %>% rowid_to_column()  # población desordenada

ggplot(coffee_desord,aes(x=rowid,y=aftertaste))+
  geom_point()+
  ylim(c(5,9))+
  geom_smooth(method = "loess")

Comparación de muestra sistemáticas población ordenada y desordenada

pob_ord <-coffee$aftertaste
pob_des <- coffee_desord$aftertaste
N <- length(pob_ord)
n <- 60
k <- floor(N/n)
arranque <- sample(1:k,1)
indices <- seq(arranque,arranque+k*(n-1),k) 
indices2 <- sample(1:N,length(indices))
muestras <- data.frame(
m_o = pob_ord[indices],  # m.sis pob ordenada
m_d = pob_des[indices],  # m.sis pob desdordenada 
m_a = pob_ord[indices2]  # m. aleatorio pob ordenada
)
muestras %>% 
  summarise_all(mean)
##        m_o      m_d    m_a
## 1 7.389333 7.484833 7.4265
mean(pob_des)
## [1] 7.401083

Al realizar una selección sistemática de los elementos de una población, dichos elementos tenderán a estar mas separados numéricamente que en una muestra aleatoria simple, si la población esta ordenada entonces las muestras tendrán observaciones de los valores mas grandes y mas pequeños por lo que la varianza de las medias muestrales serán menores que las varianzas de de las medias muestrales cuando se realiza muestreo aleatorio simple, de modo que utilizar la formula de muestreo aleatorio simple produce una sobrestimación del verdadero error de muestreo.

Inferencias con paquete survey

Para realizar inferencias con el paquete survey debemos suponer que el la población es aleatoria o esta desordenada. Para realizar inferencias primero se define el diseño para posteriormente aplicar los comandos para media total o proporción.

require(survey)
svydesign(data=muestras,
          ids=~1,
          fpc=rep(N,     
                  nrow(muestras)))->d_sis   # Diseño aleatorio simple
svymean(x=~m_o,
        design=d_sis,
        deff=T)                             # Estimación de la media    
##         mean       SE DEff
## m_o 7.389333 0.042579    1

Ejemplo

Utilizando el conjunto de datos BigLucy Realice lo siguiente:

  • tome una muestra de 600 empresas
  • Calcule una estimación una estimación del total de empleados
  • Encuentra una estimación de la proporción de las empresas con ISO=yes
  • Realice una estimación de el ingreso promedio de las empresas
library(TeachingSampling)
data("BigLucy")
N <- nrow(BigLucy)
n <- 600               # tamaño de muestra
(intervalo <- ceiling(N/n))        # tamaño del intervalo k
## [1] 143
k <- intervalo
set.seed(1234)      # reproducibilidad 
arranque <- sample(1:intervalo,1) #posición inicial
indices <- seq(arranque,arranque+k*(n-1),k)
muestra<-BigLucy %>% slice(indices)
d<-svydesign(data=muestra,
             id=~1,
             fpc=rep(N,nrow(muestra)))
svytotal(~Employees,d)
##             total     SE
## Employees 5314498 111014
svymean(~ISO,d)
##           mean     SE
## ISOno  0.66332 0.0193
## ISOyes 0.33668 0.0193
svymean(~Income,d)
##          mean     SE
## Income 431.75 10.694

Muestreo sistemático Repetido

Como en la mayoría de los casos el muestreo aleatorio sistemático no es equivalente al muestreo aleatorio simple, un método alternativo para realizar inferencias consiste en obtener varias replicas de muestreo sistemático para luego obtener estimaciones de parámetros poblacionales.

Diez muestras sistemáticas de 1 de cada 50 equivalen a una muestra sistemática de 1 cada 5.

Las siguientes formulas se pueden utilizar para estimar media y error para un muestreo sistemático repetido.

\[\widehat{\mu}=\sum_{i=1}^{n_s}\frac{\overline{y}_i}{n_s} \] \[\widehat{V}(\widehat{\mu})=\frac{(N-n)}{N}\frac{S_{\overline{y}}^2}{n_s}\] En donde

\[S_{\overline{y}}^2=\frac{\sum_{i=1}^{n_s}{(\overline{y}_i-\mu)}^2}{n_s-1}\]

\[\widehat\tau=N\widehat\mu\]

\[\widehat{V}(\widehat{\tau})=N^2\widehat{V}(\widehat{\tau})\]

Ejemplo muestreo sistemático repetido

Suponga que se tiene una población normal con media 50 y desviación estándar 5 de 400 elementos y tomara una muestra de 80 elementos para estimar la varianza de la distribución muestral de medias. Para esto implemente un muestreo sistemático repetido. de 10 muestras de tamaño 8 cada una. Realice una estimación de la media

N <- 400  # tamaño de la población
n <- 8    # tamaño de la muestra
ns <- 10  # número de muestras
pob <- round(rnorm(N,mean =50,sd = 5)) # población normal


sist<-function(pob,n){
  N <- length(pob)
  k <- floor(N/n)
  a <- sample(1:k,1)
  indices <- seq(a,a+k*(n-1),k)
  m <- pob[indices]
  m
}

replicate(n=ns,
          expr={
  sist(pob,8)
}
) -> muestras

# muestras
medias <- apply(muestras,2,mean)  # Medias de las muestras
mu=sum(medias)/ns              # Estimación de la media poblacional
s_c <- sum((medias-mu)^2)/(ns-1)
fpc <- (N-n)/N
V <- fpc*s_c/ns
c(mu=mu,error_estandar=sqrt(V))
##             mu error_estandar 
##      50.937500       0.718057

Tamaño de las muestras

Para el cálculo del tamaño de muestras se utilizan las fórmulas de muestreo aleatorio simple. Estas fórmulas podrian dar una muestra muy grande para poblaciones ordenadas y muy pequeña para poblaciones periódicas.

Media Proporción Total
\[n=\frac{N\sigma^2}{(N-1)e^2/4+\sigma^2}\] \[n=\frac{Npq}{(N-1)e^2/4+pq}\] \[n=\frac{N\sigma^2}{(N-1)\frac{e^2}{4N^2}+\sigma^2}\]

Ejemplo

Encuentre el tamaño de la muestra para estimar la proporción de empresas que tienen certificación ISO con un error del 5%

B <- 0.05
D <- B^2/4
p <- 0.5
q <- 0.5
N <- nrow(BigLucy)
n <- ceiling(N*p*q/((N-1)*D+p*q))
n
## [1] 399

La muestra sistemática una muestra por Conglomerados

Para aprender más acerca del comportamiento de V(sy), podemos examinar una muestra sistemática de n elementos como una muestra por conglomerados sencilla de k posibles muestras por conglomerados en la población que se estudia. De forma esquemática, considere que la población está organizada como una matriz rectangular, como muestra la Tabla.

drawing

Aquí. N = nk. El muestreo sistemático, como se ha descrito anteriormente, implica seleccionar aleatoriamente uno de los k conglomerados (filas) y así, una de las k posibles medias muestrales. Es decir tomar probabilidades iguales.

con lo que \[V(\overline{y}_s)=\frac{\sigma^2}{n}[1+(n-1)\rho]\] donde \(\rho\) que mide la interrelación entre las unidades dentro de las muestras. Lógicamente,esta interrelación debe ser lo más pequeña posible, ya que en el muestreo sistemático interesa la heterogeneidad intramuestral, con la finalidad de que una única muestra sistemática represente lo mejor posible a toda la población. Para que una muestra sistemática aspire a ser fiel espejo de toda la población ha de ser heterogénea, y la interrelación entre sus unidades ha de ser baja. Por lo tanto, inicialmente parece lógico que interesen valores muy pequeños del coeficiente de correlación intramuestral.

si se dispone de la población de mediciones, se pueden realizar cálculos del tipo ANOVA calculando la suma de cuadrados del error(adentro de conglomerados intravarianza), suma de cuadrados entre conglomerados(suma de cuadrados del tratamiento intervarianza) y suma de cuadrados totales (cuasivarianza).

Las ecuaciones son las siguientes.

\[\widehat {S}²_T=\frac{TSS}{nk-1}=\frac{1}{nk-1}\sum_{i=1}^{k}{\sum_{j=1}^{n}{(y_{ij}-\overline{\overline{y}})^2}}=cuasivarianza\] \[\widehat {S}²_t=\frac{SST}{k-1}=\frac{n}{k-1}\sum_{j=1}^{k}{(\overline{y}_i-\overline{\overline y})^2}=Intervarianza\] \[\widehat {S}²_E=\frac{SSE}{k(n-1)}=\frac{1}{k(n-1)}\sum_{i=1}^{k}{\sum_{j=1}^{n}{(y_{ij}-\overline{y}_i)^2}}=intravarianza\] con \[TSS=SSE+SST\] \[\rho=\frac{n\widehat {S}²_t-\widehat {S}²_T}{(n-1)\widehat {S}²_T}=1-\frac{n}{n-1}\frac{SSE}{TSS}\] TABLA ANOVA

fuente df suma de cuadrados
factor k-1 SST
error nk-k SSE
total nk-1 TSS

Ejemplo de cálculo de correlacion entre elementos del mismo conglomerdado

considere la siguiente población:

sujeto 1 2 3 4 5 6 7 8 9 10 11 12
Ingreso 2000 3000 1000 5000 2500 3600 7000 8000 2900 7700 3500 5000

calcule el valor de \(\rho\) cuando toman muestras sistemáticas de tamaño n=4.

Solución: como 12/4=3 entonces tenemos que k=3 osea que hay tres conglomerados de muestras sistemáticas empezando con k=1,2,3

require(knitr)
N <- 12
n <- 4
k <- N/n
pob <- c(2000, 3000, 1000, 5000, 2500 ,3600, 7000, 8000, 2900, 7700, 3500 ,5000)

conglomerados <- data.frame(indices=1:12,
                  muestra=pob,
                  conglomerado=factor(rep(c("c1","c2","c3"),n)))


conglomerados %>% 
  spread(key = indices,
         value = muestra,
         fill="--") %>% kable()             # Indices a columnas
conglomerado 1 2 3 4 5 6 7 8 9 10 11 12
c1 2000 5000 7000 7700
c2 3000 2500 8000 3500
c3 1000 3600 2900 5000
anova <- aov(muestra~conglomerado,
           data=conglomerados)   # ANOVA

summary(anova)[[1]]->tabla
tabla
##              Df   Sum Sq Mean Sq F value Pr(>F)
## conglomerado  2 10581667 5290833  1.0105 0.4019
## Residuals     9 47125000 5236111
SSE=tabla$`Sum Sq`[2]
TSS=tabla$`Sum Sq`[1]+SSE
(rho=1-n/(n-1)*SSE/TSS)
## [1] -0.08884011

Resumen

  • El muestreo sistemático se presenta como una alternativa para el muestreo aleatorio simple.
  • Es más fácil de llevar a cabo y, por tanto, está menos expuesto que el muestreo aleatorio simple a los errores del entrevistador. Además, el muestreo sistemático frecuentemente proporciona más información que el muestreo aleatorio simple por unidad de coste.
  • Para seleccionar entre el muestreo aleatorio simple y el sistemático, primero debemos considerar el tipo de población que se investiga. Por ejemplo, cuando N es grande y ρ < 0, la varianza de V(sy) es más pequeña que la varianza correspondiente de V(y) basada en una muestra aleatoria simple.
  • Una muestra sistemática es preferible cuando la población está ordenada y N es grande. Cuando la población es aleatoria, los dos procedimientos de muestreo son equivalentes y cualquiera de los dos diseños puede ser utilizado.
  • Debe tenerse cuidado en la aplicación del muestreo sistemático para poblaciones periódicas. Las necesidades de tamaño de muestra para estimar μ, τ y ρ, son determinadas usando las fórmulas presentadas para el muestreo aleatorio simple.
  • El muestreo sistemático repetido que s permite al investigador estimar la media o el total poblacionales y la varianza del estimador, sin establecer ningún supuesto acerca de la naturaleza de la población.

Ejercicios

problema1: 7.5,7.6,

Problema2: 7.7,7.11

Problema3:

considere la siguiente población:

sujeto 1 2 3 4 5 6 7 8 9 10 11 12
Ingreso 2000 3000 7000 5000 5500 3600 7000 9000 2900 5700 2500 5000

calcule el valor de \(\rho\) cuando toman muestras sistemáticas de tamaño n=3.

Problema4:

suponga que se tiene una población de 500 elementos y tomara una muestra de 100 elementos para estimar la varianza de la distribución muestral de medias. Para esto se implementará un muestreo sistemático repetido. de 20 muestras de tamaño 5 cada una.(población normal media=50,sd=5, semilla=edad)

Bibliografía

  • Cochran, W. G. Técnicas de Muestreo.
  • Lopez Cesar, Muestreo estadístico
  • LUMLEY, Thomas. Complex surveys: a guide to analysis using R. John Wiley & Sons, 2011.
  • Scheaffer,Richard L. Elementos de muestreo.
  • Valdivieso Serrano,Luis. Notas de Técnicas de Muestreo.
LS0tDQphdXRob3I6ICJMdWlzIENhcmxvcyBCb2xhw7FvcyINCmRhdGU6ICdgciBmb3JtYXQoU3lzLkRhdGUoKSlgJw0KdGl0bGU6IE1VRVNUUkVPIFNJU1RFTcOBVElDTw0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICB0aGVtZTogc3BhY2VsYWINCiAgICB0b2M6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgaGlnaGxpZ2h0OiBlc3ByZXNzbyANCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCgllY2hvID0gVFJVRSwNCgltZXNzYWdlID0gRkFMU0UsDQoJd2FybmluZyA9IEZBTFNFDQopDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KIyMgKipNVUVTVFJFTyBTSVNURU3DgVRJQ08gQ09OIEFSUkFOUVVFIEFMRUFUT1JJTyoqDQoNCjxpbWcgc3JjPSJzaXN0ZW1hdGljby5wbmciIGFsdD0iZHJhd2luZyIgd2lkdGg9IjQwMCIvPg0KDQoNCiMjICoqRGVmaW5pY2nDs24qKg0KVW5hIG11ZXN0cmEgb2J0ZW5pZGEgYWwgc2VsZWNjaW9uYXIgYWxlYXRvcmlhbWVudGUgdW4gZWxlbWVudG8gZGUgbG9zIHByaW1lcm9zIGsgZWxlbWVudG9zIGVuIGVsIG1hcmNvIHkgZGVzcHXDqXMgY2FkYSBrLcOpc2ltbyBlbGVtZW50byBzZSBkZW5vbWluYSAgbXVlc3RyYSBzaXN0ZW3DoXRpY2EgICAgMSBkZSBjYWRhIGsgZWxlbWVudG9zLg0KDQojIyAqKlZlbnRhamFzICBkZWwgbXVlc3RyZW8gc2lzdGVtYXRpY28qKg0KDQoxLiBFbCBtdWVzdHJlbyBzaXN0ZW3DoXRpY28gZXMgbWFzIGbDoWNpbCAgZGUgbGxldmEgYSBjYWJvIGVuIGVsIGNhbXBvLCAgeSBwb3IgbG8gdGFudG8gYSBkaWZlcmVuY2lhIGRlbCBtdWVzdHJlbyBhbGVhdG9yaW8gc2ltcGxlIGVzdGEgbWVub3MgZXhwdWVzdG8gYSBsb3MgZXJyb3JlcyBkZSBzZWxlY2Npw7NuIHF1ZSBjb21lbnRlbiBsb3MgZW5jdWVzdGFkb3Jlcy4gRXNwZWNpYWxtZW50ZSBzaSBubyBkaXNwb25lbiBkZSB1biBtYXJjbyBhZGVjdWFkby4NCjIuIEVsIG11ZXN0cmVvIHNpc3RlbcOhdGljbyAgcHVlZGUgcHJvcG9yY2lvbmFyICBtYXMgaW5mb3JtYWNpw7NuIHBvciB1bmlkYWQgZGUgY29zdG8gcXVlIGxvIHF1ZSBwcm9wb3JjaW9uYSBlbCBtdWVzdHJlbyBhbGVhdG9yaW8gc2ltcGxlIHBhcmEgcG9ibGFjaW9uZXMgY29uIGRldGVybWluYWRvcyBwYXRyb25lcyBlbiBsYSBvcmdhbml6YWNpw7NuIGRlIGVsZW1lbnRvcy4NCg0KIyMgKipFamVtcGxvcyBkZSBlbmN1ZXN0YXMgIHF1ZSB1dGlsaXphbiBtdWVzdHJlbyBzaXN0ZW3DoXRpY28qKg0KDQoqIExhIEVuY3Vlc3RhIEdhbGx1cCBpbmljaWEgc3UgcHJvY2VzbyAgZGUgbXVlc3RyZW8gZW51bWVyYW5kbyBsb3MgZGlzdHJpdG9zIGVsZWN0b3JhbGVzIGRlIGxvcyBFc3RhZG9zIFVuaWRvcyB5IGx1ZWdvIHNlbGVjY2lvbmEgc2lzdGVtYXRpY2FtZW50ZSAzMDAgIHBhcmEgdW4gZXN0dWRpbyBjb21wbGVtZW50YXJpbyBkZSBmYW1pbGlhcy4NCg0KKiBMYSBtYXlvcsOtYSBkZSBsb3MgcGxhbmVzIGRlIG11ZXN0cmVvIHBhcmEgZWwgY29udHJvbCBkZSBjYWxpZGFkIGluZHVzdHJpYWwgc3VlbGVuIHNlciBzaXN0ZW3DoXRpY29zIGVuIHN1IGVzdHJ1Y3R1cmEuIFVuIHBsYW4gZGUgaW5zcGVjY2nDs24gcGFyYSBsb3MgYXJ0w61jdWxvcyBmYWJyaWNhZG9zIGEgbG8gbGFyZ28gZGUgdW5hIGNhZGVuYSBkZSBtb250YWplIGVuIG1vdmltaWVudG8gcHVlZGUgcmVxdWVyaXIgbGEgaW5zcGVjY2nDs24gZGUgY2FkYSBxdWluY3VhZ8Opc2ltbyBhcnTDrWN1bG8uIFVuYSBpbnNwZWNjacOzbiBkZSBsYXMgY2FqYXMgZGUgbG9zIHByb2R1Y3RvcyBhbG1hY2VuYWRvcyBlbiB1biBkZXDDs3NpdG8gcHVlZGUgc3VnZXJpciBtdWVzdHJlYXIgbGEgc2VndW5kYSBjYWphIGRlIGxhIGl6cXVpZXJkYSBlbiBsYSB0ZXJjZXJhIGZpbGEsIGRlIGFycmliYSBoYWNpYSBhYmFqbywgZGUgY2FkYSBjaW5jbyBtb250b25lcy4gRW4gbGEgaW5zcGVjY2nDs24gZGVsIHRyYWJham8gcmVhbGl6YWRvIGVuIGxvcyBwdWVzdG9zIGRlIG9wZXJhcmlvcywgZWwgcGxhbiBkZSBpbnNwZWNjacOzbiBwdWVkZSByZXF1ZXJpciBlbCBpciB5IHZlbmlyIHBvciBsYXMgZmlsYXMgZGUgbG9zIHB1ZXN0b3MgZSBpbnNwZWNjaW9uYXIgbGEgbWFxdWluYXJpYSBlbiBjYWRhIGTDqWNpbW8gcHVlc3RvLiBMYSBob3JhIGRlbCBkw61hIGEgbWVudWRvIGVzIGltcG9ydGFudGUsIHBhcmEgZXZhbHVhciBsYSBjYWxpZGFkIGRlIGxhIGxhYm9yIHJlYWxpemFkYSBwb3IgZWwgdHJhYmFqYWRvciwgeSBhc8OtIHVuIHBsYW4gZGUgaW5zcGVjY2nDs24gcHVlZGUgcmVxdWVyaXIgZWwgbXVlc3RyZW8gZGUgbGEgcHJvZHVjY2nDs24gZGUgdW4gcHVlc3RvIGRlIG9wZXJhcmlvIGVuIGhvcmFzIHNlbGVjY2lvbmFkYXMgc2lzdGVtw6F0aWNhbWVudGUgZHVyYW50ZSBlbCBkw61hLg0KKiBMb3MgaW52ZXN0aWdhZG9yZXMgZGUgbWVyY2FkbyB5IGxvcyBlbmN1ZXN0YWRvcmVzLCBxdWUgbXVlc3RyZWFuIHBlcnNvbmFzIGVuIG1vdmltaWVudG8sIG11eSBmcmVjdWVudGVtZW50ZSBlbXBsZWFuIHVuIGRpc2XDsW8gc2lzdGVtw6F0aWNvLiBBIGNhZGEgdmlnw6lzaW1vIGNsaWVudGUgZW4gdW5hIGNhamEgZGUgcGFnbyBzZSBsZSBwdWVkZSBwcmVndW50YXIgc3Ugb3BpbmnDs24gYWNlcmNhIGRlbCBzYWJvciwgY29sb3IgbyB0ZXh0dXJhIGRlIHVuIHByb2R1Y3RvIGFsaW1lbnRpY2lvLiBBIGNhZGEgZMOpY2ltYSBwZXJzb25hIHF1ZSBzdWJhIGEgdW4gYXV0b2LDunMgc2UgbGUgcHVlZGUgcGVkaXIgcXVlIGxsZW5lIHVuIGN1ZXN0aW9uYXJpbyBhY2VyY2EgZGVsIHNlcnZpY2lvIGRlIGF1dG9iw7pzLiBDYWRhIGNlbnTDqXNpbW8gYXV0b23Ds3ZpbCBxdWUgZW50cmEgYSB1biBwYXJxdWUgZGUgYXRyYWNjaW9uZXMgcHVlZGUgc2VyIGRldGVuaWRvIHkgcHJlZ3VudGFybGUgYWwgY29uZHVjdG9yIGFjZXJjYSBkZSBsb3Mgc2lzdGVtYXMgZGUgcHVibGljaWRhZCBkZWwgcGFycXVlIG8gc29icmUgZWwgcHJlY2lvIGRlIGxvcyBib2xldG9zLiBUb2RhcyBlc3RhcyBtdWVzdHJhcyBzb24gc2lzdGVtw6F0aWNhcy4NCg0KIyMgKipQYXNvcyBwYXJhIHJlYWxpemFyIHVuIG11ZXN0cmVvIHNpc3RlbcOhdGljbyoqDQpMb3MgcGFzb3MgcGFyYSBvYnRlbmVyIHVuYSBtdWVzdHJhIHNpc3RlbcOhdGljYSBkZSB0YW1hw7FvIG4gICBkZSB1bmEgcG9ibGFjacOzbiAgTiBzb246DQoNCjEuIEVudW1lcmUgY2FkYSBlbGVtZW50byBkZSBsYSBwb2JsYWNpw7NuLg0KMi4gRGV0ZXJtaW5lIGVsIHZhbG9yIGRlIGsgdGFsIHF1ZSBuaz1OIChhbmNobyBkZWwgaW50ZXJ2YWxvKS4NCjMuIEVsaWphIHVuIHB1bnRvIGRlIHBhcnRpZGEgYWxlYXRvcmlvKG1lbm9yIG8gaWd1YWwgYSBrKS4NCjQuIFNlbGVjY2lvbmUgY2FkYSBLLcOpc2ltbyBlbGVtZW50byBhIHBhcnRpciBkZWwgIHB1bnRvIGRlIHBhcnRpZGEuDQoNCg0KDQojIyAqKkVqZW1wbG8gIGRlIHNlbGVjY2nDs24gc2lzdGVtw6F0aWNhKioNCg0KIFNlbGVjY2lvbmUgdW5hIG11ZXN0cmEgc2lzdGVtYXRpY2EgIGRlIHRhbWHDsW8gOCAgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGlyaXMoTj0xNTApDQogDQpgYGB7ciAgbXVlc3RyYSBzaXN0ZW1hdGljYTEgfQ0KcG9iIDwtICAgIGlyaXMNCk4gPC0gbnJvdyhpcmlzKQ0KbiA8LSA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhbWHDsW8gZGUgbXVlc3RyYQ0KKGludGVydmFsbyA8LSBjZWlsaW5nKE4vbikpICAgICAgICAjIHRhbWHDsW8gZGVsIGludGVydmFsbyBrDQprIDwtIGludGVydmFsbw0Kc2V0LnNlZWQoMTIzNCkgICAgICAgICAgICAgICAgICAgIyByZXByb2R1Y2liaWxpZGFkIA0KYXJyYW5xdWUgPC0gc2FtcGxlKDE6aW50ZXJ2YWxvLDEpICMgcG9zaWNpw7NuIGluaWNpYWwNCmluZGljZXMgPC0gc2VxKGFycmFucXVlLGFycmFucXVlK2sqKG4tMSksaykgICAgICAgIyBwb3NpY2lvbmVzIGRlIGxhIG11ZXN0cmENCmlyaXMgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2VsZWNjacOzbiBkZSBsYSBtdWVzdHJhDQogIHJvd2lkX3RvX2NvbHVtbigpICU+JSANCiAgc2xpY2UoaW5kaWNlcykNCg0KYGBgDQoNCiMjICoqUG9ibGFjacOzbiBvcmRlbmFkYSoqIA0KDQoNCkRlY2ltb3MgcXVlIHVuYSBwb2JsYWNpw7NuIGVzIGFsZWF0b3JpYSBzaSBlbCBvcmRlbiBlbiBlbCBxdWUgc2UgZW5jdWVudHJhbiBsb3MgZWxlbWVudG9zIGVzIGFsZWF0b3JpYS4NCg0KVW5hIHBvYmxhY2nDs24gZXMgb3JkZW5hZGEgIHNpIGxvcyBlbGVtZW50b3MgIGRlIGxhIHBvYmxhY2nDs24gIHRpZW5kZW4gYSBhdW1lbnRhciBvIGRpc21pbnVpciAgY3VhbmRvIHNlIGVudW1lcmFuLg0KDQoNClVuYSBwb2JsYWNpw7NuIG9yZGVuYWRhIGFwYXJlY2UgcG9yIGVqZW1wbG8gZW4gbGlzdGFkb3MgY3Jvbm9sw7NnaWNvcyBjb21vIGVsIGJhbGFuY2UgZGUgaGlwb3RlY2FzIHBlbmRpZW50ZXMgZGUgcGFnbywgcG9yIGxvIGdlbmVyYWwsIGxhcyBoaXBvdGVjYXMgbWFzIGFudGlndWFzIHRpZW5kZW4gYSB0ZW5lciBtZW5vciB2YWxvciBxdWUgbGFzIG51ZXZhcy4NCg0KVGFtYmllbiAgZGViZW4gY29uc2lkZXJhcnNlIGRlIGZvcm1hIGVzcGVjaWFsIGxvcyBjYXNvcyBlbiBsb3MgcXVlIHVuYSBwb2JsYWNpb24gdGllbmUgdW5hIHRlbmRlbmNpYSBwZXJpw7NkaWNhLCBjb21vIHNlcmlhIHBvciBlamVtcGxvIHVuYSBjdXJ2YSBzZW9ub3NvaWRhbCBzaW1wbGUuICBQYXJhIHRyYWJhamFybGFzIGFkZWN1YWRhbWVudGUgIGVsIHZhbG9yIGRlIEsgZGViZSBzZXIgdW4gbcO6bHRpcGxvIGltcGFyIGRlbCBzZW1pcGVyaW9kby4NCg0KTGFzIHBvYmxhY2lvbmVzIHBlcmnDs2RpY2FzIHNlbm9zaW9kYWxlcyBubyBzZSBlc3BlcmFuIGVuIGxhIHByw6FjdGljYSwgcGVybyBsYXMgcG9ibGFjaW9uZXMgY29uIHVuYSB0ZW5kZW5jaWEgcGVyacOzZGljYSBzw60gc29uIGJhc3RhbnRlIGNvbXVuZXMsIHVuIGVqZW1wbG8gZGUgZWxsYSAgc29uIGVsIGZsdWpvIGRlIHRyYWZpY28gcXVlIHBhc2EgcG9yIHVuIHB1bnRvIGRhZG8gZW4gdW5hIGNhcnJldGVyYSBlbiB1biBwZXJpb2RvIGRlIDI0IGhvcmFzLCBvIGxhcyB2ZW50YXMgZGUgdW4gYWxtYWPDqW4gIGVuIHVuIHBlcmlvZG8gZGUgNyBkw61hcy4gDQoNCiMjIyBFamVtcGxvOg0KDQpFbiBlbCBzaWd1aWVudGUgZWplbXBsbyBzZSByZWFsaXphIHVuIG11ZXN0cmVvIHNpc3RlbcOhdGljbyBzb2JyZSB1biBjb25qdW50byBkZSBkYXRvcyBkZSBkaWZlcmVudGVzIGdyYW5vcyBkZSBjYWbDqSAgc2VsZWNjaW9uYWRvcyBkZSBkaWZlcmVudGVzIGx1Z2FyZXMgZGVsIG11bmRvLiANCg0KDQpgYGB7ciBtdWVzdHJlbyBzaXN0ZW3DoXRpY28gcG9ibGFjaW9uIG9yZGVuYWRhfQ0KY29mZmVlIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIwLzIwMjAtMDctMDcvY29mZmVlX3JhdGluZ3MuY3N2JykNCmNvZmZlZTEgPC0gY29mZmVlICU+JSANCiAgcm93aWRfdG9fY29sdW1uKCkNCmdncGxvdChjb2ZmZWUxLGFlcyh4PXJvd2lkLHk9YWZ0ZXJ0YXN0ZSkpKw0KICBnZW9tX3BvaW50KCkrDQogIHlsaW0oYyg2LDgpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIikNCmBgYA0KDQpDdWFuZG8gc2Ugb2JzZXJ2YSAgcXVlICBsYSB2YXJpYWJsZSBgYWZ0ZXJ0YXN0ZWAgdGllbmRlIGEgZGlzbWludWlyICBjb25mb3JtZSAgIGVsIG7Dum1lcm8gZGUgZWxlbWVudG8gIGF1bWVudGEsICAgIHBvZGVtb3MgZGVjaXIgcXVlIGVzICBxdWUgdGVuZW1vcyB1bmEgcG9ibGFjacOzbiBvcmRlbmFkYS4NCg0KDQoNCg0KYGBge3Igc2lzdGVtw6F0aWNvIHBvYmxhY2nDs24gZGVzb3JkZW5hZGF9DQpjb2ZmZWVfZGVzb3JkPC1jb2ZmZWUgJT4lIA0KICBzbGljZV9zYW1wbGUocHJvcD0xKSAlPiUgcm93aWRfdG9fY29sdW1uKCkgICMgcG9ibGFjacOzbiBkZXNvcmRlbmFkYQ0KDQpnZ3Bsb3QoY29mZmVlX2Rlc29yZCxhZXMoeD1yb3dpZCx5PWFmdGVydGFzdGUpKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB5bGltKGMoNSw5KSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIpDQoNCg0KYGBgDQoNCiMjIyAqKkNvbXBhcmFjacOzbiBkZSBtdWVzdHJhIHNpc3RlbcOhdGljYXMgcG9ibGFjacOzbiBvcmRlbmFkYSB5IGRlc29yZGVuYWRhKioNCg0KYGBge3IgZXN0YWRpc3RpY2FzIG11ZXN0cmEgc2lzdGVtYXRpY2F9DQpwb2Jfb3JkIDwtY29mZmVlJGFmdGVydGFzdGUNCnBvYl9kZXMgPC0gY29mZmVlX2Rlc29yZCRhZnRlcnRhc3RlDQpOIDwtIGxlbmd0aChwb2Jfb3JkKQ0KbiA8LSA2MA0KayA8LSBmbG9vcihOL24pDQphcnJhbnF1ZSA8LSBzYW1wbGUoMTprLDEpDQppbmRpY2VzIDwtIHNlcShhcnJhbnF1ZSxhcnJhbnF1ZStrKihuLTEpLGspIA0KaW5kaWNlczIgPC0gc2FtcGxlKDE6TixsZW5ndGgoaW5kaWNlcykpDQptdWVzdHJhcyA8LSBkYXRhLmZyYW1lKA0KbV9vID0gcG9iX29yZFtpbmRpY2VzXSwgICMgbS5zaXMgcG9iIG9yZGVuYWRhDQptX2QgPSBwb2JfZGVzW2luZGljZXNdLCAgIyBtLnNpcyBwb2IgZGVzZG9yZGVuYWRhIA0KbV9hID0gcG9iX29yZFtpbmRpY2VzMl0gICMgbS4gYWxlYXRvcmlvIHBvYiBvcmRlbmFkYQ0KKQ0KbXVlc3RyYXMgJT4lIA0KICBzdW1tYXJpc2VfYWxsKG1lYW4pDQptZWFuKHBvYl9kZXMpDQpgYGANCkFsIHJlYWxpemFyIHVuYSBzZWxlY2Npw7NuIHNpc3RlbcOhdGljYSBkZSBsb3MgZWxlbWVudG9zICBkZSB1bmEgcG9ibGFjacOzbiwgZGljaG9zIGVsZW1lbnRvcyAgdGVuZGVyw6FuIGEgZXN0YXIgbWFzIHNlcGFyYWRvcyBudW3DqXJpY2FtZW50ZSAgcXVlIGVuIHVuYSBtdWVzdHJhIGFsZWF0b3JpYSBzaW1wbGUsICAgc2kgbGEgcG9ibGFjacOzbiBlc3RhIG9yZGVuYWRhICBlbnRvbmNlcyBsYXMgbXVlc3RyYXMgICB0ZW5kcsOhbiAgIG9ic2VydmFjaW9uZXMgZGUgbG9zIHZhbG9yZXMgbWFzIGdyYW5kZXMgeSBtYXMgcGVxdWXDsW9zIHBvciBsbyBxdWUgbGEgdmFyaWFuemEgZGUgbGFzIG1lZGlhcyBtdWVzdHJhbGVzICBzZXLDoW4gbWVub3JlcyBxdWUgbGFzIHZhcmlhbnphcyAgZGUgZGUgbGFzIG1lZGlhcyBtdWVzdHJhbGVzIGN1YW5kbyBzZSByZWFsaXphIG11ZXN0cmVvIGFsZWF0b3JpbyBzaW1wbGUsIGRlIG1vZG8gcXVlIHV0aWxpemFyIGxhIGZvcm11bGEgZGUgbXVlc3RyZW8gYWxlYXRvcmlvIHNpbXBsZSBwcm9kdWNlIHVuYSBzb2JyZXN0aW1hY2nDs24gZGVsIHZlcmRhZGVybyBlcnJvciBkZSBtdWVzdHJlby4NCg0KDQojIyAqKkluZmVyZW5jaWFzIGNvbiBwYXF1ZXRlIHN1cnZleSoqDQoNClBhcmEgcmVhbGl6YXIgaW5mZXJlbmNpYXMgY29uIGVsIHBhcXVldGUgc3VydmV5IGRlYmVtb3Mgc3Vwb25lciBxdWUgZWwgbGEgcG9ibGFjacOzbiBlcyBhbGVhdG9yaWEgIG8gZXN0YSBkZXNvcmRlbmFkYS4NClBhcmEgcmVhbGl6YXIgaW5mZXJlbmNpYXMgcHJpbWVybyBzZSBkZWZpbmUgZWwgZGlzZcOxbyBwYXJhIHBvc3Rlcmlvcm1lbnRlICBhcGxpY2FyIGxvcyBjb21hbmRvcyBwYXJhIG1lZGlhIHRvdGFsIG8gcHJvcG9yY2nDs24uDQpgYGB7ciBwYXF1ZXRlIHN1cnZleX0NCnJlcXVpcmUoc3VydmV5KQ0Kc3Z5ZGVzaWduKGRhdGE9bXVlc3RyYXMsDQogICAgICAgICAgaWRzPX4xLA0KICAgICAgICAgIGZwYz1yZXAoTiwgICAgIA0KICAgICAgICAgICAgICAgICAgbnJvdyhtdWVzdHJhcykpKS0+ZF9zaXMgICAjIERpc2XDsW8gYWxlYXRvcmlvIHNpbXBsZQ0Kc3Z5bWVhbih4PX5tX28sDQogICAgICAgIGRlc2lnbj1kX3NpcywNCiAgICAgICAgZGVmZj1UKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFc3RpbWFjacOzbiBkZSBsYSBtZWRpYSAgICANCg0KYGBgDQoNCg0KIyMgRWplbXBsbw0KDQpVdGlsaXphbmRvIGVsIGNvbmp1bnRvIGRlIGRhdG9zICBCaWdMdWN5ICBSZWFsaWNlIGxvIHNpZ3VpZW50ZToNCg0KKiB0b21lIHVuYSBtdWVzdHJhIGRlIDYwMCBlbXByZXNhcw0KKiBDYWxjdWxlIHVuYSBlc3RpbWFjacOzbiAgdW5hIGVzdGltYWNpw7NuIGRlbCB0b3RhbCBkZSBlbXBsZWFkb3MNCiogRW5jdWVudHJhIHVuYSBlc3RpbWFjacOzbiBkZSBsYSBwcm9wb3JjacOzbiBkZSAgbGFzIGVtcHJlc2FzIGNvbiBJU089eWVzDQoqIFJlYWxpY2UgdW5hIGVzdGltYWNpw7NuICBkZSAgZWwgaW5ncmVzbyBwcm9tZWRpbyBkZSBsYXMgZW1wcmVzYXMNCg0KYGBge3J9DQpsaWJyYXJ5KFRlYWNoaW5nU2FtcGxpbmcpDQpkYXRhKCJCaWdMdWN5IikNCk4gPC0gbnJvdyhCaWdMdWN5KQ0KbiA8LSA2MDAgICAgICAgICAgICAgICAjIHRhbWHDsW8gZGUgbXVlc3RyYQ0KKGludGVydmFsbyA8LSBjZWlsaW5nKE4vbikpICAgICAgICAjIHRhbWHDsW8gZGVsIGludGVydmFsbyBrDQprIDwtIGludGVydmFsbw0Kc2V0LnNlZWQoMTIzNCkgICAgICAjIHJlcHJvZHVjaWJpbGlkYWQgDQphcnJhbnF1ZSA8LSBzYW1wbGUoMTppbnRlcnZhbG8sMSkgI3Bvc2ljacOzbiBpbmljaWFsDQppbmRpY2VzIDwtIHNlcShhcnJhbnF1ZSxhcnJhbnF1ZStrKihuLTEpLGspDQptdWVzdHJhPC1CaWdMdWN5ICU+JSBzbGljZShpbmRpY2VzKQ0KZDwtc3Z5ZGVzaWduKGRhdGE9bXVlc3RyYSwNCiAgICAgICAgICAgICBpZD1+MSwNCiAgICAgICAgICAgICBmcGM9cmVwKE4sbnJvdyhtdWVzdHJhKSkpDQpzdnl0b3RhbCh+RW1wbG95ZWVzLGQpDQpzdnltZWFuKH5JU08sZCkNCnN2eW1lYW4ofkluY29tZSxkKQ0KDQpgYGANCg0KDQoNCg0KDQojIyAqKk11ZXN0cmVvIHNpc3RlbcOhdGljbyBSZXBldGlkbyoqIA0KDQpDb21vIGVuIGxhIG1heW9yw61hIGRlIGxvcyBjYXNvcyAgZWwgbXVlc3RyZW8gYWxlYXRvcmlvIHNpc3RlbcOhdGljbyBubyBlcyBlcXVpdmFsZW50ZSBhbCBtdWVzdHJlbyBhbGVhdG9yaW8gc2ltcGxlLCAgdW4gbcOpdG9kbyBhbHRlcm5hdGl2byBwYXJhIHJlYWxpemFyIGluZmVyZW5jaWFzIGNvbnNpc3RlIGVuIG9idGVuZXIgdmFyaWFzIHJlcGxpY2FzIGRlIG11ZXN0cmVvIHNpc3RlbcOhdGljbyBwYXJhIGx1ZWdvICBvYnRlbmVyIGVzdGltYWNpb25lcyBkZSBwYXLDoW1ldHJvcyBwb2JsYWNpb25hbGVzLg0KDQoNCkRpZXogbXVlc3RyYXMgc2lzdGVtw6F0aWNhcyBkZSAxIGRlIGNhZGEgNTAgICBlcXVpdmFsZW4gYSB1bmEgbXVlc3RyYSBzaXN0ZW3DoXRpY2EgIGRlIDEgY2FkYSA1LiANCg0KTGFzIHNpZ3VpZW50ZXMgZm9ybXVsYXMgc2UgcHVlZGVuIHV0aWxpemFyIHBhcmEgIGVzdGltYXIgIG1lZGlhIHkgZXJyb3IgcGFyYSB1biBtdWVzdHJlbyBzaXN0ZW3DoXRpY28gcmVwZXRpZG8uDQoNCiQkXHdpZGVoYXR7XG11fT1cc3VtX3tpPTF9XntuX3N9XGZyYWN7XG92ZXJsaW5le3l9X2l9e25fc30gJCQNCiQkXHdpZGVoYXR7Vn0oXHdpZGVoYXR7XG11fSk9XGZyYWN7KE4tbil9e059XGZyYWN7U197XG92ZXJsaW5le3l9fV4yfXtuX3N9JCQNCkVuIGRvbmRlDQoNCiQkU197XG92ZXJsaW5le3l9fV4yPVxmcmFje1xzdW1fe2k9MX1ee25fc317KFxvdmVybGluZXt5fV9pLVxtdSl9XjJ9e25fcy0xfSQkDQoNCiAkJFx3aWRlaGF0XHRhdT1OXHdpZGVoYXRcbXUkJA0KDQogJCRcd2lkZWhhdHtWfShcd2lkZWhhdHtcdGF1fSk9Tl4yXHdpZGVoYXR7Vn0oXHdpZGVoYXR7XHRhdX0pJCQNCg0KDQojIyMgKipFamVtcGxvIG11ZXN0cmVvIHNpc3RlbcOhdGljbyByZXBldGlkbyoqDQoNClN1cG9uZ2EgcXVlIHNlIHRpZW5lIHVuYSBwb2JsYWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgNTAgeSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgNSBkZSA0MDAgZWxlbWVudG9zIHkgIHRvbWFyYSB1bmEgbXVlc3RyYSBkZSA4MCBlbGVtZW50b3MgIHBhcmEgZXN0aW1hciBsYSB2YXJpYW56YSBkZSBsYSBkaXN0cmlidWNpw7NuIG11ZXN0cmFsIGRlIG1lZGlhcy4NClBhcmEgZXN0byAgIGltcGxlbWVudGUgdW4gbXVlc3RyZW8gc2lzdGVtw6F0aWNvIHJlcGV0aWRvLiBkZSAxMCBtdWVzdHJhcyAgZGUgdGFtYcOxbyA4IGNhZGEgdW5hLiAgUmVhbGljZSB1bmEgZXN0aW1hY2nDs24gZGUgbGEgbWVkaWEgDQoNCmBgYHtyfQ0KDQpOIDwtIDQwMCAgIyB0YW1hw7FvIGRlIGxhIHBvYmxhY2nDs24NCm4gPC0gOCAgICAjIHRhbWHDsW8gZGUgbGEgbXVlc3RyYQ0KbnMgPC0gMTAgICMgbsO6bWVybyBkZSBtdWVzdHJhcw0KcG9iIDwtIHJvdW5kKHJub3JtKE4sbWVhbiA9NTAsc2QgPSA1KSkgIyBwb2JsYWNpw7NuIG5vcm1hbA0KDQoNCnNpc3Q8LWZ1bmN0aW9uKHBvYixuKXsNCiAgTiA8LSBsZW5ndGgocG9iKQ0KICBrIDwtIGZsb29yKE4vbikNCiAgYSA8LSBzYW1wbGUoMTprLDEpDQogIGluZGljZXMgPC0gc2VxKGEsYStrKihuLTEpLGspDQogIG0gPC0gcG9iW2luZGljZXNdDQogIG0NCn0NCg0KcmVwbGljYXRlKG49bnMsDQogICAgICAgICAgZXhwcj17DQogIHNpc3QocG9iLDgpDQp9DQopIC0+IG11ZXN0cmFzDQoNCiMgbXVlc3RyYXMNCm1lZGlhcyA8LSBhcHBseShtdWVzdHJhcywyLG1lYW4pICAjIE1lZGlhcyBkZSBsYXMgbXVlc3RyYXMNCm11PXN1bShtZWRpYXMpL25zICAgICAgICAgICAgICAjIEVzdGltYWNpw7NuIGRlIGxhIG1lZGlhIHBvYmxhY2lvbmFsDQpzX2MgPC0gc3VtKChtZWRpYXMtbXUpXjIpLyhucy0xKQ0KZnBjIDwtIChOLW4pL04NClYgPC0gZnBjKnNfYy9ucw0KYyhtdT1tdSxlcnJvcl9lc3RhbmRhcj1zcXJ0KFYpKQ0KDQpgYGANCg0KDQojIyAqKlRhbWHDsW8gZGUgbGFzIG11ZXN0cmFzKioNCg0KUGFyYSBlbCBjw6FsY3VsbyBkZWwgdGFtYcOxbyBkZSBtdWVzdHJhcyBzZSB1dGlsaXphbiBsYXMgZsOzcm11bGFzIGRlIG11ZXN0cmVvIGFsZWF0b3JpbyBzaW1wbGUuIEVzdGFzIGbDs3JtdWxhcyBwb2RyaWFuIGRhciB1bmEgbXVlc3RyYSBtdXkgZ3JhbmRlIHBhcmEgcG9ibGFjaW9uZXMgb3JkZW5hZGFzIHkgbXV5IHBlcXVlw7FhIHBhcmEgcG9ibGFjaW9uZXMgIHBlcmnDs2RpY2FzLiANCg0KfE1lZGlhfFByb3BvcmNpw7NufFRvdGFsfA0KfC18LXwtfA0KfCQkbj1cZnJhY3tOXHNpZ21hXjJ9eyhOLTEpZV4yLzQrXHNpZ21hXjJ9JCR8JCRuPVxmcmFje05wcX17KE4tMSllXjIvNCtwcX0kJHwkJG49XGZyYWN7TlxzaWdtYV4yfXsoTi0xKVxmcmFje2VeMn17NE5eMn0rXHNpZ21hXjJ9JCR8DQoNCg0KIyMjIEVqZW1wbG8NCg0KRW5jdWVudHJlIGVsIHRhbWHDsW8gZGUgbGEgbXVlc3RyYSAgIHBhcmEgIGVzdGltYXIgIGxhIHByb3BvcmNpw7NuIGRlIGVtcHJlc2FzIHF1ZSB0aWVuZW4gY2VydGlmaWNhY2nDs24gSVNPIGNvbiB1biBlcnJvciAgZGVsIDUlDQoNCmBgYHtyfQ0KQiA8LSAwLjA1DQpEIDwtIEJeMi80DQpwIDwtIDAuNQ0KcSA8LSAwLjUNCk4gPC0gbnJvdyhCaWdMdWN5KQ0KbiA8LSBjZWlsaW5nKE4qcCpxLygoTi0xKSpEK3AqcSkpDQpuDQpgYGANCg0KICANCg0KIyMgKipMYSBtdWVzdHJhIHNpc3RlbcOhdGljYSB1bmEgbXVlc3RyYSBwb3IgQ29uZ2xvbWVyYWRvcyoqDQoNClBhcmEgYXByZW5kZXIgbcOhcyBhY2VyY2EgZGVsIGNvbXBvcnRhbWllbnRvIGRlIFYoc3kpLCBwb2RlbW9zIGV4YW1pbmFyIHVuYSBtdWVzdHJhIHNpc3RlbcOhdGljYSBkZSBuIGVsZW1lbnRvcyBjb21vIHVuYSBtdWVzdHJhIHBvciBjb25nbG9tZXJhZG9zIHNlbmNpbGxhIGRlIGsgcG9zaWJsZXMgbXVlc3RyYXMgcG9yIGNvbmdsb21lcmFkb3MgZW4gbGEgcG9ibGFjacOzbiBxdWUgc2UgZXN0dWRpYS4gRGUgZm9ybWEgZXNxdWVtw6F0aWNhLCBjb25zaWRlcmUgcXVlIGxhIHBvYmxhY2nDs24gZXN0w6Egb3JnYW5pemFkYSBjb21vIHVuYSBtYXRyaXogcmVjdGFuZ3VsYXIsIGNvbW8gbXVlc3RyYSBsYSBUYWJsYS4gDQoNCiA8aW1nIHNyYz0idGFibGEucG5nIiBhbHQ9ImRyYXdpbmciIHdpZHRoPSI0MDAiLz4NCiANCiBBcXXDrS4gTiA9IG5rLiBFbCBtdWVzdHJlbyBzaXN0ZW3DoXRpY28sIGNvbW8gc2UgaGEgZGVzY3JpdG8gYW50ZXJpb3JtZW50ZSwgaW1wbGljYSBzZWxlY2Npb25hciBhbGVhdG9yaWFtZW50ZSB1bm8gZGUgbG9zIGsgY29uZ2xvbWVyYWRvcyAoZmlsYXMpIHkgYXPDrSwgdW5hIGRlIGxhcyBrIHBvc2libGVzIG1lZGlhcyBtdWVzdHJhbGVzLiBFcyBkZWNpciB0b21hciBwcm9iYWJpbGlkYWRlcyBpZ3VhbGVzLg0KIA0KDQogDQpjb24gbG8gcXVlICQkVihcb3ZlcmxpbmV7eX1fcyk9XGZyYWN7XHNpZ21hXjJ9e259WzErKG4tMSlccmhvXSQkIA0KZG9uZGUgJFxyaG8kICBxdWUgbWlkZSBsYSBpbnRlcnJlbGFjacOzbiBlbnRyZSBsYXMgdW5pZGFkZXMgZGVudHJvIGRlIGxhcyBtdWVzdHJhcy4gTMOzZ2ljYW1lbnRlLGVzdGEgaW50ZXJyZWxhY2nDs24gZGViZSBzZXIgbG8gbcOhcyBwZXF1ZcOxYSBwb3NpYmxlLCB5YSBxdWUgZW4gZWwgbXVlc3RyZW8gc2lzdGVtw6F0aWNvIGludGVyZXNhIGxhIGhldGVyb2dlbmVpZGFkIGludHJhbXVlc3RyYWwsIGNvbiBsYSBmaW5hbGlkYWQgZGUgcXVlIHVuYSDDum5pY2EgbXVlc3RyYSBzaXN0ZW3DoXRpY2EgcmVwcmVzZW50ZSBsbyBtZWpvciBwb3NpYmxlIGEgdG9kYSBsYSBwb2JsYWNpw7NuLiBQYXJhIHF1ZSB1bmEgbXVlc3RyYSBzaXN0ZW3DoXRpY2EgYXNwaXJlIGEgc2VyIGZpZWwgZXNwZWpvIGRlIHRvZGEgbGEgcG9ibGFjacOzbiBoYSBkZSBzZXIgaGV0ZXJvZ8OpbmVhLCB5IGxhIGludGVycmVsYWNpw7NuIGVudHJlIHN1cyB1bmlkYWRlcyBoYSBkZSBzZXIgYmFqYS4gUG9yIGxvIHRhbnRvLCBpbmljaWFsbWVudGUgcGFyZWNlIGzDs2dpY28gcXVlIGludGVyZXNlbiB2YWxvcmVzIG11eSBwZXF1ZcOxb3MgZGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBpbnRyYW11ZXN0cmFsLg0KDQpzaSBzZSBkaXNwb25lIGRlIGxhIHBvYmxhY2nDs24gIGRlICBtZWRpY2lvbmVzLCBzZSBwdWVkZW4gcmVhbGl6YXIgY8OhbGN1bG9zIGRlbCB0aXBvIEFOT1ZBICBjYWxjdWxhbmRvIGxhIHN1bWEgZGUgY3VhZHJhZG9zIGRlbCBlcnJvcihhZGVudHJvIGRlIGNvbmdsb21lcmFkb3MgaW50cmF2YXJpYW56YSksIHN1bWEgZGUgY3VhZHJhZG9zIGVudHJlIGNvbmdsb21lcmFkb3Moc3VtYSBkZSBjdWFkcmFkb3MgZGVsIHRyYXRhbWllbnRvIGludGVydmFyaWFuemEpIHkgc3VtYSBkZSBjdWFkcmFkb3MgdG90YWxlcyAoY3Vhc2l2YXJpYW56YSkuDQoNCkxhcyBlY3VhY2lvbmVzIHNvbiBsYXMgc2lndWllbnRlcy4NCg0KJCRcd2lkZWhhdCB7U33Csl9UPVxmcmFje1RTU317bmstMX09XGZyYWN7MX17bmstMX1cc3VtX3tpPTF9XntrfXtcc3VtX3tqPTF9XntufXsoeV97aWp9LVxvdmVybGluZXtcb3ZlcmxpbmV7eX19KV4yfX09Y3Vhc2l2YXJpYW56YSQkDQokJFx3aWRlaGF0IHtTfcKyX3Q9XGZyYWN7U1NUfXtrLTF9PVxmcmFje259e2stMX1cc3VtX3tqPTF9XntrfXsoXG92ZXJsaW5le3l9X2ktXG92ZXJsaW5le1xvdmVybGluZSB5fSleMn09SW50ZXJ2YXJpYW56YSQkDQokJFx3aWRlaGF0IHtTfcKyX0U9XGZyYWN7U1NFfXtrKG4tMSl9PVxmcmFjezF9e2sobi0xKX1cc3VtX3tpPTF9XntrfXtcc3VtX3tqPTF9XntufXsoeV97aWp9LVxvdmVybGluZXt5fV9pKV4yfX09aW50cmF2YXJpYW56YSQkDQpjb24gDQokJFRTUz1TU0UrU1NUJCQNCiQkXHJobz1cZnJhY3tuXHdpZGVoYXQge1N9wrJfdC1cd2lkZWhhdCB7U33Csl9UfXsobi0xKVx3aWRlaGF0IHtTfcKyX1R9PTEtXGZyYWN7bn17bi0xfVxmcmFje1NTRX17VFNTfSQkDQogVEFCTEEgQU5PVkENCiANCiB8ZnVlbnRlfGRmIHxzdW1hIGRlIGN1YWRyYWRvc3wNCiB8LS18LS18LS18DQogfGZhY3RvcnxrLTF8U1NUfA0KIHxlcnJvcnxuay1rfFNTRXwNCiB8dG90YWx8bmstMXxUU1N8DQogDQogDQogDQoNCiMjIyAqKkVqZW1wbG8gZGUgY8OhbGN1bG8gZGUgY29ycmVsYWNpb24gZW50cmUgZWxlbWVudG9zIGRlbCBtaXNtbyBjb25nbG9tZXJkYWRvKioNCiANCiBjb25zaWRlcmUgbGEgc2lndWllbnRlIHBvYmxhY2nDs246DQogDQogfHN1amV0b3wxIHwyfCAzfCA0fDV8IDZ8IDd8IDh8IDl8IDEwfCAxMXwgMTJ8DQogfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfA0KIHxJbmdyZXNvfDIwMDB8IDMwMDB8IDEwMDB8IDUwMDB8IDI1MDAgfDM2MDB8IDcwMDB8IDgwMDB8IDI5MDB8IDc3MDB8IDM1MDAgfDUwMDB8DQogDQogY2FsY3VsZSBlbCB2YWxvciBkZSAgJFxyaG8kICBjdWFuZG8gdG9tYW4gIG11ZXN0cmFzIHNpc3RlbcOhdGljYXMgZGUgdGFtYcOxbyBuPTQuDQogDQoNClNvbHVjacOzbjogY29tbyAxMi80PTMgIGVudG9uY2VzIHRlbmVtb3MgcXVlIGs9MyAgb3NlYSBxdWUgaGF5IHRyZXMgY29uZ2xvbWVyYWRvcyBkZSBtdWVzdHJhcyBzaXN0ZW3DoXRpY2FzICBlbXBlemFuZG8gY29uIGs9MSwyLDMNCiANCmBgYHtyIGVqZW1wbG8gZGUgcmhvfQ0KcmVxdWlyZShrbml0cikNCk4gPC0gMTINCm4gPC0gNA0KayA8LSBOL24NCnBvYiA8LSBjKDIwMDAsIDMwMDAsIDEwMDAsIDUwMDAsIDI1MDAgLDM2MDAsIDcwMDAsIDgwMDAsIDI5MDAsIDc3MDAsIDM1MDAgLDUwMDApDQoNCmNvbmdsb21lcmFkb3MgPC0gZGF0YS5mcmFtZShpbmRpY2VzPTE6MTIsDQogICAgICAgICAgICAgICAgICBtdWVzdHJhPXBvYiwNCiAgICAgICAgICAgICAgICAgIGNvbmdsb21lcmFkbz1mYWN0b3IocmVwKGMoImMxIiwiYzIiLCJjMyIpLG4pKSkNCg0KDQpjb25nbG9tZXJhZG9zICU+JSANCiAgc3ByZWFkKGtleSA9IGluZGljZXMsDQogICAgICAgICB2YWx1ZSA9IG11ZXN0cmEsDQogICAgICAgICBmaWxsPSItLSIpICU+JSBrYWJsZSgpICAgICAgICAgICAgICMgSW5kaWNlcyBhIGNvbHVtbmFzDQoNCmFub3ZhIDwtIGFvdihtdWVzdHJhfmNvbmdsb21lcmFkbywNCiAgICAgICAgICAgZGF0YT1jb25nbG9tZXJhZG9zKSAgICMgQU5PVkENCg0Kc3VtbWFyeShhbm92YSlbWzFdXS0+dGFibGENCnRhYmxhDQpTU0U9dGFibGEkYFN1bSBTcWBbMl0NClRTUz10YWJsYSRgU3VtIFNxYFsxXStTU0UNCihyaG89MS1uLyhuLTEpKlNTRS9UU1MpDQpgYGANCiANCiANCiMjICoqUmVzdW1lbioqDQoNCiogRWwgbXVlc3RyZW8gc2lzdGVtw6F0aWNvIHNlIHByZXNlbnRhIGNvbW8gdW5hIGFsdGVybmF0aXZhIHBhcmEgZWwgbXVlc3RyZW8gYWxlYXRvcmlvIHNpbXBsZS4NCiogRXMgbcOhcyBmw6FjaWwgZGUgbGxldmFyIGEgY2FibyB5LCBwb3IgdGFudG8sIGVzdMOhIG1lbm9zIGV4cHVlc3RvIHF1ZSBlbCBtdWVzdHJlbyBhbGVhdG9yaW8gc2ltcGxlIGEgbG9zIGVycm9yZXMgZGVsIGVudHJldmlzdGFkb3IuIEFkZW3DoXMsIGVsIG11ZXN0cmVvIHNpc3RlbcOhdGljbyBmcmVjdWVudGVtZW50ZSBwcm9wb3JjaW9uYSBtw6FzIGluZm9ybWFjacOzbiBxdWUgZWwgbXVlc3RyZW8gYWxlYXRvcmlvIHNpbXBsZSBwb3IgdW5pZGFkIGRlIGNvc3RlLg0KKiBQYXJhIHNlbGVjY2lvbmFyIGVudHJlIGVsIG11ZXN0cmVvIGFsZWF0b3JpbyBzaW1wbGUgeSBlbCBzaXN0ZW3DoXRpY28sIHByaW1lcm8gZGViZW1vcyBjb25zaWRlcmFyIGVsIHRpcG8gZGUgcG9ibGFjacOzbiBxdWUgc2UgaW52ZXN0aWdhLiBQb3IgZWplbXBsbywgY3VhbmRvIE4gZXMgZ3JhbmRlIHkgz4EgPCAwLCBsYSB2YXJpYW56YSBkZSBWKHN5KSBlcyBtw6FzIHBlcXVlw7FhIHF1ZSBsYSB2YXJpYW56YSBjb3JyZXNwb25kaWVudGUgZGUgVih5KSBiYXNhZGEgZW4gdW5hIG11ZXN0cmEgYWxlYXRvcmlhIHNpbXBsZS4gDQoqIFVuYSBtdWVzdHJhIHNpc3RlbcOhdGljYSBlcyBwcmVmZXJpYmxlIGN1YW5kbyBsYSBwb2JsYWNpw7NuIGVzdMOhIG9yZGVuYWRhIHkgTiBlcyBncmFuZGUuIEN1YW5kbyBsYSBwb2JsYWNpw7NuIGVzIGFsZWF0b3JpYSwgbG9zIGRvcyBwcm9jZWRpbWllbnRvcyBkZSBtdWVzdHJlbyBzb24gZXF1aXZhbGVudGVzIHkgY3VhbHF1aWVyYSBkZSBsb3MgZG9zIGRpc2XDsW9zIHB1ZWRlIHNlciB1dGlsaXphZG8uIA0KKiBEZWJlIHRlbmVyc2UgY3VpZGFkbyBlbiBsYSBhcGxpY2FjacOzbiBkZWwgbXVlc3RyZW8gc2lzdGVtw6F0aWNvIHBhcmEgcG9ibGFjaW9uZXMgcGVyacOzZGljYXMuDQpMYXMgbmVjZXNpZGFkZXMgZGUgdGFtYcOxbyBkZSBtdWVzdHJhIHBhcmEgZXN0aW1hciDOvCwgz4QgeSDPgSwgc29uIGRldGVybWluYWRhcyB1c2FuZG8gbGFzIGbDs3JtdWxhcyBwcmVzZW50YWRhcyBwYXJhIGVsIG11ZXN0cmVvIGFsZWF0b3JpbyBzaW1wbGUuDQoqIEVsIG11ZXN0cmVvIHNpc3RlbcOhdGljbyByZXBldGlkbyBxdWUgcyBwZXJtaXRlIGFsIGludmVzdGlnYWRvciBlc3RpbWFyIGxhIG1lZGlhIG8gZWwgdG90YWwgcG9ibGFjaW9uYWxlcyB5IGxhIHZhcmlhbnphIGRlbCBlc3RpbWFkb3IsIHNpbiBlc3RhYmxlY2VyIG5pbmfDum4gc3VwdWVzdG8gYWNlcmNhIGRlIGxhIG5hdHVyYWxlemEgZGUgbGEgcG9ibGFjacOzbi4NCg0KIyMgKipFamVyY2ljaW9zKiogDQoNCg0KIyMjIyBwcm9ibGVtYTE6IDcuNSw3LjYsDQoNCiMjIyMgUHJvYmxlbWEyOiA3LjcsNy4xMQ0KDQojIyMjIFByb2JsZW1hMzoNCmNvbnNpZGVyZSBsYSBzaWd1aWVudGUgcG9ibGFjacOzbjoNCiANCiB8c3VqZXRvfDEgfDJ8IDN8IDR8NXwgNnwgN3wgOHwgOXwgMTB8IDExfCAxMnwNCiB8LS18LS18LS18LS18LS18LS18LS18LS18LS18LS18LS18LS18LS18DQogfEluZ3Jlc298MjAwMHwgMzAwMHwgNzAwMHwgNTAwMHwgNTUwMCB8MzYwMHwgNzAwMHwgOTAwMHwgMjkwMHwgNTcwMHwgMjUwMCB8NTAwMHwNCiANCmNhbGN1bGUgZWwgdmFsb3IgZGUgICRccmhvJCAgY3VhbmRvIHRvbWFuICBtdWVzdHJhcyBzaXN0ZW3DoXRpY2FzIGRlIHRhbWHDsW8gbj0zLg0KIA0KIyMjIyBQcm9ibGVtYTQ6DQpzdXBvbmdhIHF1ZSBzZSB0aWVuZSB1bmEgcG9ibGFjacOzbiBkZSA1MDAgZWxlbWVudG9zIHkgIHRvbWFyYSB1bmEgbXVlc3RyYSBkZSAxMDAgZWxlbWVudG9zICBwYXJhIGVzdGltYXIgbGEgdmFyaWFuemEgZGUgbGEgZGlzdHJpYnVjacOzbiBtdWVzdHJhbCBkZSBtZWRpYXMuICAgUGFyYSBlc3RvIHNlIGltcGxlbWVudGFyw6EgdW4gbXVlc3RyZW8gc2lzdGVtw6F0aWNvIHJlcGV0aWRvLiBkZSAyMCBtdWVzdHJhcyAgZGUgdGFtYcOxbyA1IGNhZGEgdW5hLihwb2JsYWNpw7NuIG5vcm1hbCBtZWRpYT01MCxzZD01LCBzZW1pbGxhPWVkYWQpDQoNCg0KDQoNCiMjICoqQmlibGlvZ3JhZsOtYSoqDQoNCiogQ29jaHJhbiwgVy4gRy4gVMOpY25pY2FzIGRlIE11ZXN0cmVvLg0KKiBMb3BleiBDZXNhciwgTXVlc3RyZW8gZXN0YWTDrXN0aWNvDQoqIExVTUxFWSwgVGhvbWFzLiBDb21wbGV4IHN1cnZleXM6IGEgZ3VpZGUgdG8gYW5hbHlzaXMgdXNpbmcgUi4gSm9obiBXaWxleSAmIFNvbnMsIDIwMTEuDQoqIFNjaGVhZmZlcixSaWNoYXJkIEwuIEVsZW1lbnRvcyBkZSBtdWVzdHJlby4gIA0KKiBWYWxkaXZpZXNvIFNlcnJhbm8sTHVpcy4gIE5vdGFzIGRlIFTDqWNuaWNhcyBkZSBNdWVzdHJlby4NCg0KDQogDQoNCg0KDQo=