Problema 2 – Dieta de Tyto alba

La lechuza de campanarios (Tyto alba) es una rapaz que se alimenta principalmente de pequeños mamíferos. Sin embargo, puede incorporar en menores proporciones aves, reptiles y anfibios. Un grupo de investigadores quiere estudiar cómo varía el consumo de aves por parte de T. alba entre distintas localidades de la provincia de Entre Ríos. Para ello analizan las egagrópilas de lechuzas (cúmulo de pelos, plumas, huesos y demás restos no digeribles que estas rapaces regurgitan en los nidos) colectadas en 41 localidades de la provincia, 12 colectadas en la región fitogeográfica de Delta e Islas del Paraná, 11 en la región Pampa y 18 en el Espinal. Además los investigadores tienen información sobre el porcentaje de suelo cubierto por construcciones (% urbano) en cada sitio de muestreo del ambiente.

El objetivo del estudio es determinar si el porcentaje de aves consumidas por T. alba varía entre las regiones fitogeográficas y el nivel de urbanización. Base de datos Tyto.txt.

Estadística descriptiva

Leemos el dataset y agregamos una nueva variable: la proporción de presas que son aves en cada observación.

       ID         Region      N_presas         N_aves       porc_urbano        proporcion     
 Min.   : 1   Delta  :12   Min.   :102.0   Min.   : 0.00   Min.   :0.00000   Min.   :0.00000  
 1st Qu.:11   Espinal:18   1st Qu.:214.0   1st Qu.: 5.00   1st Qu.:0.00000   1st Qu.:0.01623  
 Median :21   Pampa  :11   Median :316.0   Median : 9.00   Median :0.00000   Median :0.02961  
 Mean   :21                Mean   :332.8   Mean   :13.51   Mean   :0.07976   Mean   :0.04080  
 3rd Qu.:31                3rd Qu.:418.0   3rd Qu.:20.00   3rd Qu.:0.12000   3rd Qu.:0.05908  
 Max.   :41                Max.   :762.0   Max.   :70.00   Max.   :0.40000   Max.   :0.14019  

¿Cuál es la variable respuesta?

La variable de respuesta es N_aves, el número de presas que son aves, inferido a partir de las egagrópilas de lechuzas. Ese número cobra sentido en relación a una cantidad total de N_presas.

¿Qué valores toma y cómo es su distribución?

N_aves es una variable cuantitativa discreta que toma valores no negativos acotados entre 0 y el total de aves (N_presas) en cada sitio. Puede modelarse con la distribución binomial, como el número de éxitos en un número total de ensayos.

¿Cuáles son los parámetros de la misma?

La distribución binomial toma dos parámetros, el total de ensayos y la cantidad de éxitos, usualmente representados como \((n, \pi)\).

Describa el tipo de variables explicatorias involucradas.

Tenemos dos variables explicatorias:

  • porc_urbano, el porcentaje de suelo cubierto con construcciones, una medida de cuán urbanizada está el área. Se trata de una variable cuantitativa continua que toma valores entre 0 y 1 (es una proporción).
  • Region, la región de recolección de datos, una variable cualitativa o factor con tres niveles: Delta, Pampa y Espinal.

Explore si la proporción de aves consumidas se asocia con ambiente muestreado.

La figura 1 A sugiere que hay menos proporción de aves consumidas en la región Espinal y una proporción intermedia en la región Pampa.

En la figura 1 B se marca el dato de ID 39, que luego será relevante en el análisis.

Estadísticos por región:

Construya un modelo lineal generalizado para predecir la proporción de aves consumidas en función del ambiente y el nivel de urbanización.

El modelo elegido (binomial) tiene la función de enlace logit o log odds. Planteamos primero el modelo completo, con interacciones:

\[ \log \left( \frac{\pi_i}{1 - \pi_i} \right) = \log \text{odds}_i = \eta_i = \beta_D + \beta_E \text{ESPINAL}_i + \beta_P \text{PAMPA}_i + \beta_{D:U} U_i + \beta_{E:U} \text{ESPINAL}_i U_i + \beta_{P:U} \text{PAMPA}_i U_i \tag{1} \]

donde las variables ESPINAL y PAMPA son dummies del factor Region y la variable \(U\) es el porcentaje de urbanización.

Explicite los 3 componentes del GLM.

El componente aleatorio es la variable de respuesta de distribución binomial, el número de N_aves en el total de N_presas.

El predictor lineal es el descripto en la ecuación \((1)\).

La función de enlace es el logaritmo de los odds.

¿De qué maneras puede introducir la proporción de aves consumidas en el modelo?

Creamos una nueva variable, N_aves/N_presas.

Seleccione el mejor modelo, teniendo en cuenta los supuestos y la ocurrencia de sobre/sub-dispersión.

Calculamos a continuación el estadístico de sobredispersión:

\[ \hat{\phi} = \frac{ \sum^{n}_{i=1} e^2_{i, \text{Pearson}} }{ \text{g.l. residuos }} \]

[1] 6.42

Siguiendo el criterio de Zuur et al. (2009), diremos que hay sobredispersión pues el estadístico \(\hat{\phi} > 1.5\).

Antes de cambiar el modelo, comprobemos si hay outliers culpables de la sobredispersión observada.

En base a la distancia de Cook, notamos que el dato de ID \(39\) es muy influyente en la regresión, si bien su residuo no está alejado del cero. Realizaremos el ajuste nuevamente, sin ese dato, para comprobar si la sobredispersión se resuelve de ese modo.

[1] 6.28

Como vemos, el problema de sobredispersión no desaparece. Además, volviendo al scatterplot de la Fig. 1 A, notamos que el dato sólo es “atípico” porque es el único dato de la región Delta con un porcentaje urbano mayor a cero, pero no parece ser un error y su remoción no se justificaría. Mas aún, su proporción de aves no es extrema. Todo indica que debemos conservarlo.

Para resolver la sobredispersión, intentaremos con la técnica OLRE (observation level random effects).

[1] 0

Como vemos, toda la varianza extra es “absorbida” por el efecto aleatorio artificial que agregamos con la variable ID. Conservamos este modelo. Nos interesa ahora saber si hay interacción entre la Region y el porc_urbano, es decir, si el porcentaje de urbanización afecta de manera diferente a la proporción de aves en las presas según la región considerada. Formalmente, consiste en testear la hipótesis

\[ H_0: \beta_{D:U} = \beta_{E:U} = \beta_{P:U} \]

donde la hipótesis alternativa es que al menos uno de esos coeficientes difiere del resto.

Single term deletions

Model:
proporcion ~ Region * porc_urbano + (1 | ID)
                   Df    AIC    LRT Pr(>Chi)
<none>                285.75                
Region:porc_urbano  2 282.91 1.1615   0.5595

El comando drop1 quita variables respetando el principio de marginalidad, de modo que comienza con las interacciones. Vemos que al quitar el efecto de interacción entre ambas variables, la verosimilitud del modelo no cambia significativamente. Es decir, introducir coeficientes de interacción no mejora el ajuste significativamente, de modo que podemos plantear un modelo más simple, aditivo:

\[ \eta_i = \beta_D + \beta_E \text{ESPINAL}_i + \beta_P \text{PAMPA}_i + \beta_U U_i \tag{2} \]

donde hay un solo coeficiente asociado a la variable porc_urbano, \(\beta_U\).

Estime la magnitud del efecto de la/s variables predictoras seleccionadas.

A continuación, planteo el modelo de \((2)\) con una “distribución” cuasi binomial (dejamos el estudio del modelo con OLRE para un trabajo futuro).


Call:
glm(formula = proporcion ~ Region + porc_urbano, family = quasibinomial, 
    data = tyto, weights = N_presas)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-4.3096  -2.0803  -0.3761   1.6889   3.7720  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -2.56988    0.15113 -17.005  < 2e-16 ***
RegionEspinal -1.23203    0.29432  -4.186 0.000168 ***
RegionPampa   -0.74154    0.31545  -2.351 0.024177 *  
porc_urbano   -0.09567    1.16531  -0.082 0.935013    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for quasibinomial family taken to be 6.225518)

    Null deviance: 390.32  on 40  degrees of freedom
Residual deviance: 246.11  on 37  degrees of freedom
AIC: NA

Number of Fisher Scoring iterations: 5

Como vemos, el coeficiente asociado a porc_urbano no es significativamente distinto de cero. Es decir, alcanzaría con la Region para predecir la proporción de aves consumidas. Lo mismo se evidencia al notar que el intervalo de confianza para el coeficiente asociado a porc_urbano incluye el cero:

              2.5 % 97.5 %
(Intercept)   -2.88  -2.29
RegionEspinal -1.83  -0.67
RegionPampa   -1.38  -0.14
porc_urbano   -2.48   2.12

Por ende, esperamos que drop1 nos sugiera remover esta variable. Dado que estamos en un modelo cuasi binomial, usamos el test \(F\) para la comparación de modelos:

Single term deletions

Model:
proporcion ~ Region + porc_urbano
            Df Deviance F value    Pr(>F)    
<none>           246.11                      
Region       2   369.13  9.2472 0.0005535 ***
porc_urbano  1   246.15  0.0063 0.9370256    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Efectivamente, podemos quitar la variable porc_urbano. Planteamos entonces el modelo que sólo usa la región como covariable:

\[ \eta_i = \beta_D + \beta_E \text{ESPINAL}_i + \beta_P \text{PAMPA}_i \tag{3} \]


Call:
glm(formula = proporcion ~ Region, family = quasibinomial, data = tyto, 
    weights = N_presas)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-4.3769  -2.0656  -0.3743   1.7165   3.7179  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    -2.5704     0.1488 -17.269   <2e-16 ***
RegionEspinal  -1.2399     0.2747  -4.513    6e-05 ***
RegionPampa    -0.7563     0.2563  -2.951   0.0054 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for quasibinomial family taken to be 6.050867)

    Null deviance: 390.32  on 40  degrees of freedom
Residual deviance: 246.15  on 38  degrees of freedom
AIC: NA

Number of Fisher Scoring iterations: 5

Comprobamos que la Region es significativa:

Single term deletions

Model:
proporcion ~ Region
       Df Deviance F value   Pr(>F)    
<none>      246.15                     
Region  2   390.32  11.128 0.000157 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Por ende, nos quedamos con el modelo resultante, con los siguientes coeficientes \(\beta_j\) y sus intervalos de confianza 95%:

Waiting for profiling to be done...

El modelo elegido entonces es:

\[ \eta_i = \text{logit}_i = -2.57 + (-1.24) \cdot \text{ESPINAL}_i + (-0.76) \cdot \text{PAMPA}_i \tag{4} \] De aquí podemos calcular el logit o log odds de cada región:

\[ \text{logit}_D = \eta_D = \beta_D = -2.57 \\ \text{logit}_E = \eta_E = \beta_D + \beta_E = -3.81 \\ \text{logit}_P = \eta_P = \beta_D + \beta_P = -3.33 \]

Alternativamente, emmeans lo hace por nosotros y nos da los IC de nivel asintótico 95%:

 Region  emmean    SE  df asymp.LCL asymp.UCL
 Delta    -2.57 0.149 Inf     -2.86     -2.28
 Espinal  -3.81 0.231 Inf     -4.26     -3.36
 Pampa    -3.33 0.209 Inf     -3.74     -2.92

Results are given on the logit (not the response) scale. 
Confidence level used: 0.95 

A continuación obtenemos los odds estimados para cada localidad,

\[ \text{odds}_D = e^{\beta_D} = e^{-2.57} = 0.08 \\ \text{odds}_E = e^{\beta_D} e^{\beta_E} = e^{-3.81} = 0.02 \\ \text{odds}_P = e^{\beta_D} e^{\beta_P} = e^{-3.33} = 0.04 \] con sus IC de confianza 95%:

Por otro lado, \(e\) elevado a cada \(\beta_j\) corresponde con la magnitud del efecto u odds ratio de cada región:

\[ \text{OR}_D = e^{\beta_D} = e^{-2.57} = 0.08 \\ \text{OR}_E = e^{\beta_E} = e^{-1.24} = 0.29 \\ \text{OR}_P = e^{\beta_P} = e^{-0.76} = 0.47 \]

A continuación se muestran estos mismos ORs junto a sus IC de nivel 95%:

Calcule (a mano) la probabilidad estimada de consumo de aves para la región Espinal

Finalmente, podemos despejar la probabilidad de que una presa consumida sea un ave en cada región, es decir, cada valor de \(\pi\):

\[ \pi_D = \frac{e^{\beta_D}}{1 + e^{\beta_D}} = 0.071 \\ \pi_E = \frac{e^{\beta_D + \beta_E}}{1 + e^{\beta_D + \beta_E}} = 0.022 \\ \pi_P = \frac{e^{\beta_D + \beta_P}}{1 + e^{\beta_D + \beta_P}} = 0.035 \]

Como se ve, la probabilidad estimada para la región Espinal es 0.022.

Nuevamente, eemeans calcula estas probabilidades por nosotros con sus intervalos de confianza:

 Region    prob      SE  df asymp.LCL asymp.UCL
 Delta   0.0711 0.00983 Inf    0.0541    0.0929
 Espinal 0.0217 0.00489 Inf    0.0139    0.0336
 Pampa   0.0347 0.00698 Inf    0.0233    0.0513

Confidence level used: 0.95 
Intervals are back-transformed from the logit scale 

Sintetice en un gráfico las estimaciones del modelo seleccionado. Concluya en forma general e Informe sus resultados.

 contrast        estimate    SE  df z.ratio p.value
 Delta - Espinal    1.240 0.275 Inf  4.513  <.0001 
 Delta - Pampa      0.756 0.256 Inf  2.951  0.0089 
 Espinal - Pampa   -0.484 0.311 Inf -1.554  0.2659 

Results are given on the log odds ratio (not the response) scale. 
P value adjustment: tukey method for comparing a family of 3 estimates 
 contrast        odds.ratio    SE  df z.ratio p.value
 Delta / Espinal      3.455 0.949 Inf  4.513  <.0001 
 Delta / Pampa        2.130 0.546 Inf  2.951  0.0089 
 Espinal / Pampa      0.617 0.192 Inf -1.554  0.2659 

P value adjustment: tukey method for comparing a family of 3 estimates 
Tests are performed on the log odds ratio scale 

Una manera es graficar las probabilidades estimadas por región:

En la figura 3 B se ve que en la región Delta hay mayor probabilidad de que las presas consumidas sean aves con respecto a las regiones Pampa y Espinal. Esto se corresponde a que en la figura 3 A se vea un mayor logit en el Delta respecto de las otras regiones, con IC que no se solapan.

De los contrastes, se sigue que en el Delta los odds aumentan un 245% respecto del Espinal y un 130% respecto de la Pampa. En la escala del log odds, las diferencias son otras pero los p valores son los mismos, pues es en esa escala que se realizan los tests.

Por otro lado, los odds no cambian significativamente entre Pampa y Espinal, o al menos no tenemos el suficiente poder estadístico para detectar esa diferencia.

Otro modo de visualizar lo que hizo nuestro modelo se ve en la figura 4:

Las líneas horizontales representan la probabilidad estimada de que las presas sean aves. Este valor es una constante que no depende del porc_urbano y es el mismo para todas las observaciones de cada región. Los valores estimados coinciden exactamente con el cociente entre el total de N_aves y el total de N_presas observados en cada región, como se ve en el siguiente chunk:

LS0tCnRpdGxlOiAiVGFyZWEgcGFyYSBlbnRyZWdhcjogY2FzbyBkaWV0YSBkZSBUeXRvIEFsYmEgKHByb2JsZW1hIDIpIgpzdWJ0aXRsZTogIkJpb21ldHLDrWEgMiwgTcOzZHVsbyAyIC0gRkNFeU4sIFVCQSwgMjAxOSIKYXV0aG9yOiAiSnVhbiBNYW51ZWwgQmVycm9zIgpkYXRlOiAiT2N0b2JlciAxNiwgMjAxOSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGZpZ19oZWlnaHQ6IDQKICAgIGZpZ193aWR0aDogNQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuCiAgICB0aGVtZTogZmxhdGx5Ci0tLQoKIyBQcm9ibGVtYSAyIOKAkyBEaWV0YSBkZSBfVHl0byBhbGJhXwoKPkxhIGxlY2h1emEgZGUgY2FtcGFuYXJpb3MgKF9UeXRvIGFsYmFfKSBlcyB1bmEgcmFwYXogcXVlIHNlIGFsaW1lbnRhCnByaW5jaXBhbG1lbnRlIGRlIHBlcXVlw7FvcyBtYW3DrWZlcm9zLiBTaW4gZW1iYXJnbywgcHVlZGUgaW5jb3Jwb3JhciBlbiBtZW5vcmVzCnByb3BvcmNpb25lcyBhdmVzLCByZXB0aWxlcyB5IGFuZmliaW9zLiBVbiBncnVwbyBkZSBpbnZlc3RpZ2Fkb3JlcyBxdWllcmUKZXN0dWRpYXIgKipjw7NtbyB2YXLDrWEgZWwgY29uc3VtbyBkZSBhdmVzIHBvciBwYXJ0ZSBkZSBfVC4gYWxiYV8gZW50cmUgZGlzdGludGFzCmxvY2FsaWRhZGVzKiogZGUgbGEgcHJvdmluY2lhIGRlIEVudHJlIFLDrW9zLiBQYXJhIGVsbG8gYW5hbGl6YW4gbGFzCioqZWdhZ3LDs3BpbGFzIGRlIGxlY2h1emFzKiogKGPDum11bG8gZGUgcGVsb3MsIHBsdW1hcywgaHVlc29zIHkgZGVtw6FzIHJlc3RvcyBubwpkaWdlcmlibGVzIHF1ZSBlc3RhcyByYXBhY2VzIHJlZ3VyZ2l0YW4gZW4gbG9zIG5pZG9zKSBjb2xlY3RhZGFzIGVuIDQxCmxvY2FsaWRhZGVzIGRlIGxhIHByb3ZpbmNpYSwgMTIgY29sZWN0YWRhcyBlbiBsYSByZWdpw7NuIGZpdG9nZW9ncsOhZmljYSBkZSBEZWx0YQplIElzbGFzIGRlbCBQYXJhbsOhLCAxMSBlbiBsYSByZWdpw7NuIFBhbXBhIHkgMTggZW4gZWwgRXNwaW5hbC4gQWRlbcOhcyBsb3MKaW52ZXN0aWdhZG9yZXMgdGllbmVuIGluZm9ybWFjacOzbiBzb2JyZSBlbCAqKnBvcmNlbnRhamUgZGUgc3VlbG8gY3ViaWVydG8gcG9yCmNvbnN0cnVjY2lvbmVzKiogKCUgdXJiYW5vKSBlbiBjYWRhIHNpdGlvIGRlIG11ZXN0cmVvIGRlbCBhbWJpZW50ZS4KCj5FbCBvYmpldGl2byBkZWwgZXN0dWRpbyBlcyAqKmRldGVybWluYXIgc2kgZWwgcG9yY2VudGFqZSBkZSBhdmVzIGNvbnN1bWlkYXMgcG9yClQuIGFsYmEgdmFyw61hIGVudHJlIGxhcyByZWdpb25lcyBmaXRvZ2VvZ3LDoWZpY2FzIHkgZWwgbml2ZWwgZGUgdXJiYW5pemFjacOzbioqLgpCYXNlIGRlIGRhdG9zIGBUeXRvLnR4dGAuCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCmBgYHtyIG1lc3NhZ2U9VFJVRSwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkoZ2x1ZSkKbGlicmFyeShicm9vbSkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkobG1lNCkKbGlicmFyeShnZ3JlcGVsKQpgYGAKCiMjIEVzdGFkw61zdGljYSBkZXNjcmlwdGl2YQoKTGVlbW9zIGVsIGRhdGFzZXQgeSBhZ3JlZ2Ftb3MgdW5hIG51ZXZhIHZhcmlhYmxlOiBsYSBwcm9wb3JjacOzbiBkZSBwcmVzYXMKcXVlIHNvbiBhdmVzIGVuIGNhZGEgb2JzZXJ2YWNpw7NuLgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdHl0byA8LQogIHJlYWRfdGFibGUyKCJ0eXRvLnR4dCIpICU+JQogIG11dGF0ZSgKICAgIFJlZ2lvbiA9IGZhY3RvcihSZWdpb24pLAogICAgcHJvcG9yY2lvbiA9IE5fYXZlcy9OX3ByZXNhcwogICkKCnR5dG8KYGBgCgpgYGB7cn0Kc3VtbWFyeSh0eXRvKQpgYGAKCj4gwr9DdcOhbCBlcyBsYSB2YXJpYWJsZSByZXNwdWVzdGE/CgpMYSB2YXJpYWJsZSBkZSByZXNwdWVzdGEgZXMgYE5fYXZlc2AsIGVsIG7Dum1lcm8gZGUgcHJlc2FzIHF1ZSBzb24gYXZlcywgaW5mZXJpZG8KYSBwYXJ0aXIgZGUgbGFzIGVnYWdyw7NwaWxhcyBkZSBsZWNodXphcy4gRXNlIG7Dum1lcm8gY29icmEgc2VudGlkbyBlbiByZWxhY2nDs24gYQp1bmEgY2FudGlkYWQgdG90YWwgZGUgYE5fcHJlc2FzYC4KCj4gwr9RdcOpIHZhbG9yZXMgdG9tYSB5IGPDs21vIGVzIHN1IGRpc3RyaWJ1Y2nDs24/CgpgTl9hdmVzYCBlcyB1bmEgdmFyaWFibGUgY3VhbnRpdGF0aXZhIGRpc2NyZXRhIHF1ZSB0b21hIHZhbG9yZXMgbm8gbmVnYXRpdm9zCmFjb3RhZG9zIGVudHJlIDAgeSBlbCB0b3RhbCBkZSBhdmVzIChgTl9wcmVzYXNgKSBlbiBjYWRhIHNpdGlvLiBQdWVkZSBtb2RlbGFyc2UKY29uIGxhIGRpc3RyaWJ1Y2nDs24gYmlub21pYWwsIGNvbW8gZWwgbsO6bWVybyBkZSDDqXhpdG9zIGVuIHVuIG7Dum1lcm8gdG90YWwgZGUKZW5zYXlvcy4KCj4gwr9DdcOhbGVzIHNvbiBsb3MgcGFyw6FtZXRyb3MgZGUgbGEgbWlzbWE/CgpMYSBkaXN0cmlidWNpw7NuIGJpbm9taWFsIHRvbWEgZG9zIHBhcsOhbWV0cm9zLCBlbCB0b3RhbCBkZSBlbnNheW9zIHkgbGEgY2FudGlkYWQKZGUgw6l4aXRvcywgdXN1YWxtZW50ZSByZXByZXNlbnRhZG9zIGNvbW8gJChuLCBccGkpJC4KCj4gRGVzY3JpYmEgZWwgdGlwbyBkZSB2YXJpYWJsZXMgZXhwbGljYXRvcmlhcyBpbnZvbHVjcmFkYXMuCgpUZW5lbW9zIGRvcyB2YXJpYWJsZXMgZXhwbGljYXRvcmlhczoKCi0gYHBvcmNfdXJiYW5vYCwgZWwgcG9yY2VudGFqZSBkZSBzdWVsbyBjdWJpZXJ0byBjb24gY29uc3RydWNjaW9uZXMsIHVuYSBtZWRpZGEKZGUgY3XDoW4gdXJiYW5pemFkYSBlc3TDoSBlbCDDoXJlYS4gU2UgdHJhdGEgZGUgdW5hIHZhcmlhYmxlIGN1YW50aXRhdGl2YSBjb250aW51YQpxdWUgdG9tYSB2YWxvcmVzIGVudHJlIDAgeSAxIChlcyB1bmEgcHJvcG9yY2nDs24pLgotIGBSZWdpb25gLCBsYSByZWdpw7NuIGRlIHJlY29sZWNjacOzbiBkZSBkYXRvcywgdW5hIHZhcmlhYmxlIGN1YWxpdGF0aXZhIG8KZmFjdG9yIGNvbiB0cmVzIG5pdmVsZXM6IGBEZWx0YWAsIGBQYW1wYWAgeSBgRXNwaW5hbGAuCgo+IEV4cGxvcmUgc2kgbGEgcHJvcG9yY2nDs24gZGUgYXZlcyBjb25zdW1pZGFzIHNlIGFzb2NpYSBjb24gYW1iaWVudGUgbXVlc3RyZWFkby4KCmBgYHtyIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQpmaWdfYm94IDwtCiAgZ2dwbG90KHR5dG8pICsKICAgIGFlcyh4ID0gUmVnaW9uLCB5ID0gcHJvcG9yY2lvbiwgY29sb3IgPSBSZWdpb24pICsKICAgIHN0YXRfc3VtbWFyeSgKICAgICAgZnVuLmRhdGEgPSBtZWFuX3NkbCwKICAgICAgZnVuLmFyZ3MgPSBsaXN0KG11bHQgPSAxKSwgIyBtdWx0IGVzIGRlIGN1w6FudG9zIFNEIGRpYnVqYSBlbCByYW5nbwogICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKC4yNSkKICAgICkgKwogICAgZ2VvbV9ib3hwbG90KAogICAgICB3aWR0aCA9IC4yLAogICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKC0uMjUpCiAgICApICsKICAgIGdlb21faml0dGVyKAogICAgICBzaGFwZSA9IDEsCiAgICAgIHNpemUgPSAyLAogICAgICB3aWR0aCA9IC4wNQogICAgKSArCiAgICBsYWJzKAogICAgICBzdWJ0aXRsZSA9ICJDdWFudGlsZXMsIGRhdG9zIHkgbWVkaWEgKy0gZGVzdsOtbyBlc3TDoW5kYXIiCiAgICApICsKICAgIGd1aWRlcyhjb2xvciA9IEYpCgpmaWdfc2NhdCA8LQogIGdncGxvdCh0eXRvKSArCiAgYWVzKHggPSBwb3JjX3VyYmFubywgeSA9IHByb3BvcmNpb24sIGNvbG9yID0gUmVnaW9uKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xhYmVsX3JlcGVsKAogICAgZGF0YSA9IGZpbHRlcih0eXRvLCBJRCA9PSAzOSksCiAgICBtYXBwaW5nID0gYWVzKGxhYmVsID0gSUQpCiAgKQoKIyBFc3RvIGZ1bmNpb25hIGNvbiBsaWJyYXJ5KHBhdGNod29yaykKZmlnX2JveCArIGZpZ19zY2F0ICsgcGxvdF9sYXlvdXQod2lkdGhzID0gYyg2LCAzKSkgKwogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICJGaWcuIDEgRGlzdHJpYnVjacOzbiBkZSBOX2F2ZXMvTl9wcmVzYXMgZW4gY2FkYSBsb2NhbGlkYWQiLAogICAgICAgICAgICAgICAgICB0YWdfbGV2ZWxzID0gIkEiKQogICAgICAKYGBgCgpMYSBmaWd1cmEgMSBBIHN1Z2llcmUgcXVlIGhheSBtZW5vcyBwcm9wb3JjacOzbiBkZSBhdmVzIGNvbnN1bWlkYXMKZW4gbGEgcmVnacOzbiBFc3BpbmFsIHkgdW5hIHByb3BvcmNpw7NuIGludGVybWVkaWEgZW4gbGEgcmVnacOzbiBQYW1wYS4KCkVuIGxhIGZpZ3VyYSAxIEIgc2UgbWFyY2EgZWwgZGF0byBkZSBgSURgIDM5LCBxdWUgbHVlZ28gc2Vyw6EgcmVsZXZhbnRlIGVuIGVsCmFuw6FsaXNpcy4KCkVzdGFkw61zdGljb3MgcG9yIHJlZ2nDs246CgpgYGB7cn0KdHl0byAlJCUKICBwc3ljaDo6ZGVzY3JpYmVCeShwcm9wb3JjaW9uLCBSZWdpb24sIG1hdCA9IFQpICU+JQogIG11dGF0ZV9pZihpcy5kb3VibGUsIHJvdW5kLCAzKQpgYGAKCj4gQ29uc3RydXlhIHVuIG1vZGVsbyBsaW5lYWwgZ2VuZXJhbGl6YWRvIHBhcmEgcHJlZGVjaXIgbGEgcHJvcG9yY2nDs24gZGUgYXZlcwpjb25zdW1pZGFzIGVuIGZ1bmNpw7NuIGRlbCBhbWJpZW50ZSB5IGVsIG5pdmVsIGRlIHVyYmFuaXphY2nDs24uCgpFbCBtb2RlbG8gZWxlZ2lkbyAoYmlub21pYWwpIHRpZW5lIGxhIGZ1bmNpw7NuIGRlIGVubGFjZSBfbG9naXRfIG8gbG9nIG9kZHMuClBsYW50ZWFtb3MgcHJpbWVybyBlbCBtb2RlbG8gY29tcGxldG8sIGNvbiBpbnRlcmFjY2lvbmVzOgoKJCQKXGxvZyBcbGVmdCggXGZyYWN7XHBpX2l9ezEgLSBccGlfaX0gXHJpZ2h0KSA9Clxsb2cgXHRleHR7b2Rkc31faSA9ClxldGFfaSA9IFxiZXRhX0QgKyBcYmV0YV9FIFx0ZXh0e0VTUElOQUx9X2kgKyBcYmV0YV9QIFx0ZXh0e1BBTVBBfV9pICsgXGJldGFfe0Q6VX0gVV9pICsKXGJldGFfe0U6VX0gXHRleHR7RVNQSU5BTH1faSBVX2kgKyBcYmV0YV97UDpVfSBcdGV4dHtQQU1QQX1faSBVX2kKXHRhZ3sxfQokJAoKZG9uZGUgbGFzIHZhcmlhYmxlcyBgRVNQSU5BTGAgeSBgUEFNUEFgIHNvbiBfZHVtbWllc18gZGVsIGZhY3RvciBgUmVnaW9uYCB5IGxhIHZhcmlhYmxlICRVJCBlcyBlbCBwb3JjZW50YWplIGRlIHVyYmFuaXphY2nDs24uCgpgYGB7cn0KbTEgPC0gZ2xtKHByb3BvcmNpb24gfiBSZWdpb24gKiBwb3JjX3VyYmFubywgZmFtaWx5ID0gYmlub21pYWwsIHdlaWdodHMgPSBOX3ByZXNhcywgZGF0YSA9IHR5dG8pCmBgYAoKPiBFeHBsaWNpdGUgbG9zIDMgY29tcG9uZW50ZXMgZGVsIEdMTS4KCkVsIGNvbXBvbmVudGUgYWxlYXRvcmlvIGVzIGxhIHZhcmlhYmxlIGRlIHJlc3B1ZXN0YSBkZSBkaXN0cmlidWNpw7NuIGJpbm9taWFsLAplbCBuw7ptZXJvIGRlIGBOX2F2ZXNgIGVuIGVsIHRvdGFsIGRlIGBOX3ByZXNhc2AuCgpFbCBwcmVkaWN0b3IgbGluZWFsIGVzIGVsIGRlc2NyaXB0byBlbiBsYSBlY3VhY2nDs24gJCgxKSQuCgpMYSBmdW5jacOzbiBkZSBlbmxhY2UgZXMgZWwgbG9nYXJpdG1vIGRlIGxvcyBvZGRzLgoKPiDCv0RlIHF1w6kgbWFuZXJhcyBwdWVkZSBpbnRyb2R1Y2lyIGxhIHByb3BvcmNpw7NuIGRlIGF2ZXMgY29uc3VtaWRhcyBlbiBlbCBtb2RlbG8/CgpDcmVhbW9zIHVuYSBudWV2YSB2YXJpYWJsZSwgYE5fYXZlcy9OX3ByZXNhc2AuCgo+IFNlbGVjY2lvbmUgZWwgbWVqb3IgbW9kZWxvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbG9zIHN1cHVlc3RvcyB5IGxhIG9jdXJyZW5jaWEgZGUgc29icmUvc3ViLWRpc3BlcnNpw7NuLgoKQ2FsY3VsYW1vcyBhIGNvbnRpbnVhY2nDs24gZWwgZXN0YWTDrXN0aWNvIGRlIHNvYnJlZGlzcGVyc2nDs246CgokJApcaGF0e1xwaGl9ID0KXGZyYWN7IFxzdW1ee259X3tpPTF9IGVeMl97aSwgXHRleHR7UGVhcnNvbn19IH17IFx0ZXh0e2cubC4gcmVzaWR1b3MgfX0KJCQKCmBgYHtyfQplc3RpbWFyX3NvYnJlZGlzcGVyc2lvbiA8LSBmdW5jdGlvbihtb2RlbG8pIHsKICByZXNpZHVvc19jdWFkcmFkb3MgPC0gcmVzaWQobW9kZWxvLCB0eXBlID0gInBlYXJzb24iKV4yIAogIHN1bShyZXNpZHVvc19jdWFkcmFkb3MvbW9kZWxvJGRmLnJlc2lkdWFsKSAlPiUgcm91bmQoMikKfQoKZXN0aW1hcl9zb2JyZWRpc3BlcnNpb24obTEpCmBgYAoKU2lndWllbmRvIGVsIGNyaXRlcmlvIGRlIFp1dXIgZXQgYWwuICgyMDA5KSwgZGlyZW1vcyBxdWUgKipoYXkgc29icmVkaXNwZXJzacOzbioqCnB1ZXMgZWwgZXN0YWTDrXN0aWNvICRcaGF0e1xwaGl9ID4gMS41JC4KCkFudGVzIGRlIGNhbWJpYXIgZWwgbW9kZWxvLCBjb21wcm9iZW1vcyBzaSBoYXkgX291dGxpZXJzXyBjdWxwYWJsZXMgZGUgbGEKc29icmVkaXNwZXJzacOzbiBvYnNlcnZhZGEuCgpgYGB7cn0KdHl0byAlPD4lCiAgbXV0YXRlKAogICAgcmVzaWR1b3NfcGVhcnNvbiA9IHJlc2lkdWFscyhtMSwgdHlwZSA9ICJwZWFyc29uIiksCiAgICBwcmVkaWNob3NfVlIgPSBwcmVkaWN0KG0xLCB0eXBlID0gInJlc3BvbnNlIiksCiAgICBwcmVkaWNob3NfbGluayA9IHByZWRpY3QobTEsIHR5cGUgPSAibGluayIpLAogICAgY29va3NfRCA9IGNvb2tzLmRpc3RhbmNlKG0xKQogICkKYGBgCgoKYGBge3IgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTB9CmZpZ19yZXNpZCA8LQogIGdncGxvdCh0eXRvKSArCiAgYWVzKHggPSBwcmVkaWNob3NfVlIsIHkgPSByZXNpZHVvc19wZWFyc29uLCBjb2xvciA9IFJlZ2lvbikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGFiZWxfcmVwZWwoCiAgICBkYXRhID0gZmlsdGVyKHR5dG8sIGNvb2tzX0QgPT0gbWF4KGNvb2tzX0QpKSwKICAgIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBJRCkKICApCgpmaWdfY29vayA8LQogIGdncGxvdCh0eXRvKSArCiAgYWVzKHggPSBJRCwgeSA9IGNvb2tzX0QsIGNvbG9yID0gUmVnaW9uKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ZW5kID0gSUQsIHllbmQgPSAwKSkgKwogIGdlb21fcG9pbnQoKQoKZmlnX3Jlc2lkICsgZmlnX2Nvb2sgKwogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICJGaWcuIDIgUmVncmVzacOzbiBjb24gZWwgbW9kZWxvIGNvbXBsZXRvLCBiaW5vbWlhbCIsCiAgICAgICAgICAgICAgICAgIHRhZ19sZXZlbHMgPSAiQSIpCmBgYAoKRW4gYmFzZSBhIGxhIGRpc3RhbmNpYSBkZSBDb29rLCBub3RhbW9zIHF1ZSBlbCBkYXRvIGRlIElEICQzOSQKZXMgbXV5IGluZmx1eWVudGUgZW4gbGEgcmVncmVzacOzbiwgc2kgYmllbiBzdSByZXNpZHVvIG5vIGVzdMOhIGFsZWphZG8gZGVsIGNlcm8uClJlYWxpemFyZW1vcyBlbCBhanVzdGUgbnVldmFtZW50ZSwgc2luIGVzZSBkYXRvLCBwYXJhIGNvbXByb2JhciBzaSBsYSBzb2JyZWRpc3BlcnNpw7NuIHNlIHJlc3VlbHZlIGRlIGVzZSBtb2RvLgoKYGBge3J9CnR5dG9fc2luX291dGxpZXIgPC0gZmlsdGVyKHR5dG8sIElEICE9IDM5KQoKbTIgPC0gZ2xtKHByb3BvcmNpb24gfiBSZWdpb24gKiBwb3JjX3VyYmFubywgZmFtaWx5ID0gYmlub21pYWwsIHdlaWdodHMgPSBOX3ByZXNhcywgZGF0YSA9IHR5dG9fc2luX291dGxpZXIpCmVzdGltYXJfc29icmVkaXNwZXJzaW9uKG0yKQpgYGAKCkNvbW8gdmVtb3MsIGVsIHByb2JsZW1hIGRlIHNvYnJlZGlzcGVyc2nDs24gbm8gZGVzYXBhcmVjZS4gQWRlbcOhcywgdm9sdmllbmRvIGFsCnNjYXR0ZXJwbG90IGRlIGxhICoqRmlnLiAxIEEqKiwgbm90YW1vcyBxdWUgZWwgZGF0byBzw7NsbyBlcyAiYXTDrXBpY28iIHBvcnF1ZSBlcwplbCDDum5pY28gZGF0byBkZSBsYSByZWdpw7NuIGBEZWx0YWAgY29uIHVuIHBvcmNlbnRhamUgdXJiYW5vIG1heW9yIGEgY2VybywgcGVybwpubyBwYXJlY2Ugc2VyIHVuIGVycm9yIHkgc3UgcmVtb2Npw7NuIG5vIHNlIGp1c3RpZmljYXLDrWEuIE1hcyBhw7puLCBzdSBwcm9wb3JjacOzbgpkZSBhdmVzIG5vIGVzIGV4dHJlbWEuIFRvZG8gaW5kaWNhIHF1ZSBkZWJlbW9zIGNvbnNlcnZhcmxvLgoKUGFyYSByZXNvbHZlciBsYSBzb2JyZWRpc3BlcnNpw7NuLCBpbnRlbnRhcmVtb3MgY29uIGxhIHTDqWNuaWNhICoqT0xSRSoqCihfb2JzZXJ2YXRpb24gbGV2ZWwgcmFuZG9tIGVmZmVjdHNfKS4KCmBgYHtyfQp0eXRvICU8PiUgbXV0YXRlKElEID0gZmFjdG9yKElEKSkKCm0zIDwtIGdsbW1UTUI6OmdsbW1UTUIocHJvcG9yY2lvbiB+IFJlZ2lvbiAqIHBvcmNfdXJiYW5vICsgKDF8SUQpLAogICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSBOX3ByZXNhcywgZmFtaWx5ID0gYmlub21pYWwsIGRhdGEgPSB0eXRvKQoKZXN0aW1hcl9zb2JyZWRpc3BlcnNpb24obTMpCmBgYAoKQ29tbyB2ZW1vcywgdG9kYSBsYSB2YXJpYW56YSBleHRyYSBlcyAiYWJzb3JiaWRhIiBwb3IgZWwgZWZlY3RvIGFsZWF0b3JpbwphcnRpZmljaWFsIHF1ZSBhZ3JlZ2Ftb3MgY29uIGxhIHZhcmlhYmxlIGBJRGAuIENvbnNlcnZhbW9zIGVzdGUgbW9kZWxvLiBOb3MKaW50ZXJlc2EgYWhvcmEgc2FiZXIgc2kgaGF5IGludGVyYWNjacOzbiBlbnRyZSBsYSBgUmVnaW9uYCB5IGVsIGBwb3JjX3VyYmFub2AsIGVzCmRlY2lyLCBzaSBlbCBwb3JjZW50YWplIGRlIHVyYmFuaXphY2nDs24gYWZlY3RhIGRlIG1hbmVyYSBkaWZlcmVudGUgYSBsYQpwcm9wb3JjacOzbiBkZSBhdmVzIGVuIGxhcyBwcmVzYXMgc2Vnw7puIGxhIHJlZ2nDs24gY29uc2lkZXJhZGEuIEZvcm1hbG1lbnRlLApjb25zaXN0ZSBlbiB0ZXN0ZWFyIGxhIGhpcMOzdGVzaXMKCiQkCkhfMDogXGJldGFfe0Q6VX0gPSBcYmV0YV97RTpVfSA9IFxiZXRhX3tQOlV9CiQkCgpkb25kZSBsYSBoaXDDs3Rlc2lzIGFsdGVybmF0aXZhIGVzIHF1ZSBhbCBtZW5vcyB1bm8gZGUgZXNvcyBjb2VmaWNpZW50ZXMgZGlmaWVyZQpkZWwgcmVzdG8uCgpgYGB7cn0KZHJvcDEobTMsIHRlc3QgPSAiQ2hpc3EiKQpgYGAKCkVsIGNvbWFuZG8gYGRyb3AxYCBxdWl0YSB2YXJpYWJsZXMgcmVzcGV0YW5kbyBlbCBwcmluY2lwaW8gZGUgbWFyZ2luYWxpZGFkLApkZSBtb2RvIHF1ZSBjb21pZW56YSBjb24gbGFzIGludGVyYWNjaW9uZXMuClZlbW9zIHF1ZSBhbCBxdWl0YXIgZWwgZWZlY3RvIGRlIGludGVyYWNjacOzbiBlbnRyZSBhbWJhcyB2YXJpYWJsZXMsIGxhCnZlcm9zaW1pbGl0dWQgZGVsIG1vZGVsbyBubyBjYW1iaWEgc2lnbmlmaWNhdGl2YW1lbnRlLiBFcyBkZWNpciwgaW50cm9kdWNpcgpjb2VmaWNpZW50ZXMgZGUgaW50ZXJhY2Npw7NuIG5vIG1lam9yYSBlbCBhanVzdGUgc2lnbmlmaWNhdGl2YW1lbnRlLCBkZSBtb2RvCnF1ZSBwb2RlbW9zIHBsYW50ZWFyIHVuIG1vZGVsbyBtw6FzIHNpbXBsZSwgYWRpdGl2bzoKCiQkClxldGFfaSA9IFxiZXRhX0QgKyBcYmV0YV9FIFx0ZXh0e0VTUElOQUx9X2kgKyBcYmV0YV9QIFx0ZXh0e1BBTVBBfV9pICsgXGJldGFfVSBVX2kgXHRhZ3syfQokJAoKZG9uZGUgaGF5IHVuIHNvbG8gY29lZmljaWVudGUgYXNvY2lhZG8gYSBsYSB2YXJpYWJsZSBgcG9yY191cmJhbm9gLCAkXGJldGFfVSQuCgo+IEVzdGltZSBsYSBtYWduaXR1ZCBkZWwgZWZlY3RvIGRlIGxhL3MgdmFyaWFibGVzIHByZWRpY3RvcmFzIHNlbGVjY2lvbmFkYXMuCgpBIGNvbnRpbnVhY2nDs24sIHBsYW50ZW8gZWwgbW9kZWxvIGRlICQoMikkIGNvbiB1bmEgImRpc3RyaWJ1Y2nDs24iIGN1YXNpCmJpbm9taWFsIChkZWphbW9zIGVsIGVzdHVkaW8gZGVsIG1vZGVsbyBjb24gT0xSRSBwYXJhIHVuIHRyYWJham8gZnV0dXJvKS4KCmBgYHtyfQptNCA8LSBnbG0ocHJvcG9yY2lvbiB+IFJlZ2lvbiArIHBvcmNfdXJiYW5vLAogICAgICAgICAgZmFtaWx5ID0gcXVhc2liaW5vbWlhbCwgd2VpZ2h0cyA9IE5fcHJlc2FzLCBkYXRhID0gdHl0bykKc3VtbWFyeShtNCkKYGBgCgpDb21vIHZlbW9zLCBlbCBjb2VmaWNpZW50ZSBhc29jaWFkbyBhIGBwb3JjX3VyYmFub2Agbm8gZXMgc2lnbmlmaWNhdGl2YW1lbnRlCmRpc3RpbnRvIGRlIGNlcm8uIEVzIGRlY2lyLCBhbGNhbnphcsOtYSBjb24gbGEgYFJlZ2lvbmAgcGFyYSBwcmVkZWNpciBsYQpwcm9wb3JjacOzbiBkZSBhdmVzIGNvbnN1bWlkYXMuCkxvIG1pc21vIHNlIGV2aWRlbmNpYSBhbCBub3RhciBxdWUgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBwYXJhIGVsIGNvZWZpY2llbnRlIAphc29jaWFkbyBhIGBwb3JjX3VyYmFub2AgaW5jbHV5ZSBlbCBjZXJvOgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY29uZmludChtNCkgJT4lIHJvdW5kKDIpCmBgYAoKUG9yIGVuZGUsIGVzcGVyYW1vcyBxdWUgYGRyb3AxYCBub3Mgc3VnaWVyYSByZW1vdmVyIGVzdGEgdmFyaWFibGUuIERhZG8gcXVlCmVzdGFtb3MgZW4gdW4gbW9kZWxvIGN1YXNpIGJpbm9taWFsLCB1c2Ftb3MgZWwgdGVzdCAkRiQgcGFyYSBsYSBjb21wYXJhY2nDs24gZGUKbW9kZWxvczoKCmBgYHtyfQpkcm9wMShtNCwgdGVzdCA9ICJGIikKYGBgCgpFZmVjdGl2YW1lbnRlLCBwb2RlbW9zIHF1aXRhciBsYSB2YXJpYWJsZSBgcG9yY191cmJhbm9gLgpQbGFudGVhbW9zIGVudG9uY2VzIGVsIG1vZGVsbyBxdWUgc8OzbG8gdXNhIGxhIHJlZ2nDs24gY29tbyBjb3ZhcmlhYmxlOgoKJCQKXGV0YV9pID0gXGJldGFfRCArIFxiZXRhX0UgXHRleHR7RVNQSU5BTH1faSArIFxiZXRhX1AgXHRleHR7UEFNUEF9X2kgXHRhZ3szfQokJAoKYGBge3J9Cm01IDwtIGdsbShwcm9wb3JjaW9uIH4gUmVnaW9uLCBmYW1pbHkgPSBxdWFzaWJpbm9taWFsLCB3ZWlnaHRzID0gTl9wcmVzYXMsIGRhdGEgPSB0eXRvKQpzdW1tYXJ5KG01KQpgYGAKCkNvbXByb2JhbW9zIHF1ZSBsYSBgUmVnaW9uYCBlcyBzaWduaWZpY2F0aXZhOgoKYGBge3J9CmRyb3AxKG01LCB0ZXN0ID0gIkYiKQpgYGAKClBvciBlbmRlLCBub3MgcXVlZGFtb3MgY29uIGVsIG1vZGVsbyByZXN1bHRhbnRlLCBjb24gbG9zIHNpZ3VpZW50ZXMgY29lZmljaWVudGVzICRcYmV0YV9qJCB5IHN1cyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSA5NSU6CgpgYGB7cn0KY29lZmljaWVudGVzIDwtCiAgY29uZmludChtNSkgJT4lCiAgYXNfdGliYmxlKHJvd25hbWVzID0gIlJlZ2lvbiIpICU+JQogIG11dGF0ZSgKICAgIEVzdGltYWRvID0gY29lZmZpY2llbnRzKG01KQogICkgJT4lCiAgc2VsZWN0KFJlZ2lvbiwgYDIuNSAlYCwgRXN0aW1hZG8sIGA5Ny41ICVgKSAlPiUKICBtdXRhdGUoUmVnaW9uID0gc3RyX3JlcGxhY2UoUmVnaW9uLCAiXFwoSW50ZXJjZXB0XFwpIiwgIkRlbHRhIiksCiAgICAgICAgIFJlZ2lvbiA9IHN0cl9yZXBsYWNlKFJlZ2lvbiwgIlJlZ2lvbiIsICIiKSkKCmNvZWZpY2llbnRlcyAlPiUgbXV0YXRlX2lmKGlzLmRvdWJsZSwgcm91bmQsIDIpCmBgYAoKRWwgbW9kZWxvIGVsZWdpZG8gZW50b25jZXMgZXM6CgpgYGB7cn0KYmV0YXMgPC0gY29lZmZpY2llbnRzKG01KSAlPiUgcm91bmQoMikKYGBgCgokJApcZXRhX2kgPQpcdGV4dHtsb2dpdH1faSA9CmByIGJldGFzWzFdYCArIChgciBiZXRhc1syXWApIFxjZG90IFx0ZXh0e0VTUElOQUx9X2kgKyAoYHIgYmV0YXNbM11gKSBcY2RvdCBcdGV4dHtQQU1QQX1faQpcdGFnezR9CiQkCkRlIGFxdcOtIHBvZGVtb3MgY2FsY3VsYXIgZWwgX2xvZ2l0XyBvIGxvZyBfb2Rkc18gZGUgY2FkYSByZWdpw7NuOgoKYGBge3J9CmJldGFzICUqJSByYmluZChjKDEsIDEsIDEpLAogICAgICAgICAgICAgICAgYygwLCAxLCAwKSwKICAgICAgICAgICAgICAgIGMoMCwgMCwgMSkpICU+JSAuWzEsXSAtPiBsb2dpdHMKYGBgCgokJApcdGV4dHtsb2dpdH1fRCA9IFxldGFfRCA9IFxiZXRhX0QgPSBgciBsb2dpdHNbMV1gIFxcClx0ZXh0e2xvZ2l0fV9FID0gXGV0YV9FID0gXGJldGFfRCArIFxiZXRhX0UgPSBgciBsb2dpdHNbMl1gIFxcClx0ZXh0e2xvZ2l0fV9QID0gXGV0YV9QID0gXGJldGFfRCArIFxiZXRhX1AgPSBgciBsb2dpdHNbM11gCiQkCgpBbHRlcm5hdGl2YW1lbnRlLCBgZW1tZWFuc2AgbG8gaGFjZSBwb3Igbm9zb3Ryb3MgeSBub3MgZGEgbG9zIElDIGRlIG5pdmVsIGFzaW50w7N0aWNvIDk1JToKCmBgYHtyfQpsb2dpdHNfSUMgPC0gZW1tZWFuczo6ZW1tZWFucyhtNSwgfiBSZWdpb24pCmxvZ2l0c19JQwpgYGAKCkEgY29udGludWFjacOzbiBvYnRlbmVtb3MgbG9zIF9vZGRzXyBlc3RpbWFkb3MgcGFyYSBjYWRhIGxvY2FsaWRhZCwKCmBgYHtyfQpvZGRzIDwtIGV4cChsb2dpdHMpICU+JSByb3VuZCgyKQpgYGAKCiQkClx0ZXh0e29kZHN9X0QgPSBlXntcYmV0YV9EfSA9IGVee2ByIGJldGFzWzFdYH0gPSBgciBvZGRzWzFdYCBcXApcdGV4dHtvZGRzfV9FID0gZV57XGJldGFfRH0gZV57XGJldGFfRX0gPSBlXntgciBiZXRhc1sxXSArIGJldGFzWzJdYH0gPSBgciBvZGRzWzJdYCBcXApcdGV4dHtvZGRzfV9QID0gZV57XGJldGFfRH0gZV57XGJldGFfUH0gPSBlXntgciBiZXRhc1sxXSArIGJldGFzWzNdYH0gPSBgciBvZGRzWzNdYAokJApjb24gc3VzIElDIGRlIGNvbmZpYW56YSA5NSU6CiAKYGBge3J9Cm9kZHNfSUMgPC0KICBsb2dpdHNfSUMgJT4lCiAgYXNfdGliYmxlKCkgJT4lCiAgbXV0YXRlX2lmKGlzLmRvdWJsZSwgfiByb3VuZChleHAoLiksIDIpKSAlPiUKICBzZWxlY3QoLVNFLCAtZGYpCgpvZGRzX0lDCmBgYAoKUG9yIG90cm8gbGFkbywgJGUkIGVsZXZhZG8gYSBjYWRhICRcYmV0YV9qJCBjb3JyZXNwb25kZSBjb24gbGEgKiptYWduaXR1ZCBkZWwgZWZlY3RvKioKdSAqKl9vZGRzIHJhdGlvXyoqIGRlIGNhZGEgcmVnacOzbjoKCmBgYHtyfQpPUnMgPC0gZXhwKGJldGFzKSAlPiUgcm91bmQoMikKYGBgCgokJApcdGV4dHtPUn1fRCA9IGVee1xiZXRhX0R9ID0gZV57YHIgYmV0YXNbMV1gfSA9IGByIE9Sc1sxXWAgXFwKXHRleHR7T1J9X0UgPSBlXntcYmV0YV9FfSA9IGVee2ByIGJldGFzWzJdYH0gPSBgciBPUnNbMl1gIFxcClx0ZXh0e09SfV9QID0gZV57XGJldGFfUH0gPSBlXntgciBiZXRhc1szXWB9ID0gYHIgT1JzWzNdYAokJAoKQSBjb250aW51YWNpw7NuIHNlIG11ZXN0cmFuIGVzdG9zIG1pc21vcyBPUnMganVudG8gYSBzdXMgSUMgZGUgbml2ZWwgOTUlOgoKYGBge3J9CmNvZWZpY2llbnRlcyAlPiUgbXV0YXRlX2lmKGlzLmRvdWJsZSwgfiByb3VuZChleHAoLiksIDIpKQpgYGAKCj4gQ2FsY3VsZSAoYSBtYW5vKSBsYSBwcm9iYWJpbGlkYWQgZXN0aW1hZGEgZGUgY29uc3VtbyBkZSBhdmVzIHBhcmEgbGEgcmVnacOzbiBFc3BpbmFsCgpGaW5hbG1lbnRlLCBwb2RlbW9zIGRlc3BlamFyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW5hIHByZXNhIGNvbnN1bWlkYSBzZWEgdW4KYXZlIGVuIGNhZGEgcmVnacOzbiwgZXMgZGVjaXIsIGNhZGEgdmFsb3IgZGUgJFxwaSQ6CgpgYGB7cn0KdmFsb3Jlc19waSA8LSAoZXhwKGxvZ2l0cykvKDEgKyBleHAobG9naXRzKSkpICU+JSByb3VuZCgzKQpgYGAKCiQkClxwaV9EID0gXGZyYWN7ZV57XGJldGFfRH19ezEgKyBlXntcYmV0YV9EfX0gPSBgciB2YWxvcmVzX3BpWzFdYCBcXApccGlfRSA9IFxmcmFje2Vee1xiZXRhX0QgKyBcYmV0YV9FfX17MSArIGVee1xiZXRhX0QgKyBcYmV0YV9FfX0gPSBgciB2YWxvcmVzX3BpWzJdYCBcXApccGlfUCA9IFxmcmFje2Vee1xiZXRhX0QgKyBcYmV0YV9QfX17MSArIGVee1xiZXRhX0QgKyBcYmV0YV9QfX0gPSBgciB2YWxvcmVzX3BpWzNdYCAKJCQKCkNvbW8gc2UgdmUsIGxhIHByb2JhYmlsaWRhZCBlc3RpbWFkYSBwYXJhIGxhIHJlZ2nDs24gRXNwaW5hbCBlcyBgciB2YWxvcmVzX3BpWzJdYC4KCk51ZXZhbWVudGUsIGBlZW1lYW5zYCBjYWxjdWxhIGVzdGFzIHByb2JhYmlsaWRhZGVzIHBvciBub3NvdHJvcyBjb24gc3VzIGludGVydmFsb3MgZGUgY29uZmlhbnphOgoKYGBge3J9CnByb2JzX0lDIDwtIGVtbWVhbnM6OmVtbWVhbnMobTUsIH4gUmVnaW9uLCB0eXBlID0gInJlc3BvbnNlIikKcHJvYnNfSUMKYGBgCgo+IFNpbnRldGljZSBlbiB1biBncsOhZmljbyBsYXMgZXN0aW1hY2lvbmVzIGRlbCBtb2RlbG8gc2VsZWNjaW9uYWRvLiAKPiBDb25jbHV5YSBlbiBmb3JtYSBnZW5lcmFsIGUgSW5mb3JtZSBzdXMgcmVzdWx0YWRvcy4gCgpgYGB7cn0KY29udHJhc3RlcyA8LSBlbW1lYW5zOjplbW1lYW5zKG01LCBwYWlyd2lzZSB+IFJlZ2lvbiwgdHlwZSA9ICJsaW5rIikKY29udHJhc3RlcyRjb250cmFzdHMKYGBgCgpgYGB7cn0KY29udHJhc3Rlc19WUiA8LSBlbW1lYW5zOjplbW1lYW5zKG01LCBwYWlyd2lzZSB+IFJlZ2lvbiwgdHlwZSA9ICJyZXNwb25zZSIpCmNvbnRyYXN0ZXNfVlIkY29udHJhc3RzCmBgYAoKVW5hIG1hbmVyYSBlcyBncmFmaWNhciBsYXMgcHJvYmFiaWxpZGFkZXMgZXN0aW1hZGFzIHBvciByZWdpw7NuOgoKYGBge3IgZmlnLmhlaWdodD0zLjUsIGZpZy53aWR0aD05fQpmaWdfbGluayA8LQogIHBsb3QoY29udHJhc3RlcywgY29tcGFyaXNvbiA9IFQpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKHRoZS5lbW1lYW4sIDMpKSwgbnVkZ2VfeSA9IC4yKSArCiAgbGFicygKICAgIHN1YnRpdGxlID0gIkxvZyBvZGRzIGRlIGNvbnN1bWlyIHVuIGF2ZSIsCiAgICB4ID0gIk1lZGlhIE1hcmdpbmFsIEVzdGltYWRhIChFLk0uTWVhbikiCiAgKQoKZmlnX3ZyIDwtCiAgcGxvdChjb250cmFzdGVzX1ZSLCBjb21wYXJpc29uID0gVCkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKHRoZS5lbW1lYW4sIDMpKSwgbnVkZ2VfeSA9IC4yKSArCiAgICBsYWJzKHN1YnRpdGxlID0gIlByb2JhYmlsaWRhZCBkZSBjb25zdW1pciB1biBhdmUiKQoKZmlnX2xpbmsgKyBmaWdfdnIgKyBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiRmlnLiAzIEVzdGltYWNpb25lcyIsIHRhZ19sZXZlbCA9ICJBIikKYGBgCgpFbiBsYSBmaWd1cmEgMyBCIHNlIHZlIHF1ZSBlbiBsYSByZWdpw7NuIERlbHRhIGhheSBtYXlvciBwcm9iYWJpbGlkYWQgZGUgcXVlCmxhcyBwcmVzYXMgY29uc3VtaWRhcyBzZWFuIGF2ZXMgY29uIHJlc3BlY3RvIGEgbGFzIHJlZ2lvbmVzIFBhbXBhIHkgRXNwaW5hbC4KRXN0byBzZSBjb3JyZXNwb25kZSBhIHF1ZSBlbiBsYSBmaWd1cmEgMyBBIHNlIHZlYSB1biBtYXlvciBsb2dpdCBlbiBlbCBEZWx0YQpyZXNwZWN0byBkZSBsYXMgb3RyYXMgcmVnaW9uZXMsIGNvbiBJQyBxdWUgbm8gc2Ugc29sYXBhbi4KCkRlIGxvcyBjb250cmFzdGVzLCBzZSBzaWd1ZSBxdWUgZW4gZWwgRGVsdGEgbG9zIF9vZGRzXyBhdW1lbnRhbiB1biAyNDUlCnJlc3BlY3RvIGRlbCBFc3BpbmFsIHkgdW4gMTMwJSByZXNwZWN0byBkZSBsYSBQYW1wYS4gRW4gbGEgZXNjYWxhIGRlbApsb2cgX29kZHNfLCBsYXMgZGlmZXJlbmNpYXMgc29uIG90cmFzIHBlcm8gbG9zIHAgdmFsb3JlcyBzb24gbG9zIG1pc21vcywKcHVlcyBlcyBlbiBlc2EgZXNjYWxhIHF1ZSBzZSByZWFsaXphbiBsb3MgdGVzdHMuCgpQb3Igb3RybyBsYWRvLCBsb3MgX29kZHNfIG5vIGNhbWJpYW4gc2lnbmlmaWNhdGl2YW1lbnRlIGVudHJlIFBhbXBhIHkgRXNwaW5hbCwKbyBhbCBtZW5vcyBubyB0ZW5lbW9zIGVsIHN1ZmljaWVudGUgcG9kZXIgZXN0YWTDrXN0aWNvIHBhcmEgZGV0ZWN0YXIgZXNhIGRpZmVyZW5jaWEuCgpPdHJvIG1vZG8gZGUgdmlzdWFsaXphciBsbyBxdWUgaGl6byBudWVzdHJvIG1vZGVsbyBzZSB2ZSBlbiBsYSBmaWd1cmEgNDoKCmBgYHtyIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTd9CnR5dG8gJTw+JQogIG11dGF0ZSgKICAgIHJlc2lkdW9zX3BlYXJzb24gPSByZXNpZHVhbHMobTUsIHR5cGUgPSAicGVhcnNvbiIpLAogICAgcHJlZGljaG9zX1ZSID0gcHJlZGljdChtNSwgdHlwZSA9ICJyZXNwb25zZSIpLAogICAgcHJlZGljaG9zX2xpbmsgPSBwcmVkaWN0KG01LCB0eXBlID0gImxpbmsiKSwKICAgIGNvb2tzX0QgPSBjb29rcy5kaXN0YW5jZShtNSkKICApCgpnZ3Bsb3QodHl0bykgKwogIGFlcyh4ID0gcG9yY191cmJhbm8sIHkgPSBwcm9wb3JjaW9uLCBjb2xvciA9IFJlZ2lvbikgKwogIGdlb21fc2VnbWVudChhZXMoeWVuZCA9IHByZWRpY2hvc19WUiwgeGVuZCA9IHBvcmNfdXJiYW5vKSwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fbGluZShhZXMoeSA9IHByZWRpY2hvc19WUiksIHNpemUgPSAxKSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IHByZWRpY2hvc19WUiksIHNoYXBlID0gNCwgY29sb3IgPSAiQmxhY2siKSArCiAgZ2VvbV9wb2ludCgpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRmlnLiA0IExhIHByZWRpY2Npw7NuIGVzIGNvbnN0YW50ZSBwb3IgcmVnacOzbiBlIGlnbm9yYSBlbCBwb3JjZW50YWplIHVyYmFubyIKICApCmBgYAoKTGFzIGzDrW5lYXMgaG9yaXpvbnRhbGVzIHJlcHJlc2VudGFuIGxhIHByb2JhYmlsaWRhZCBlc3RpbWFkYSBkZSBxdWUgbGFzIHByZXNhcwpzZWFuIGF2ZXMuIEVzdGUgdmFsb3IgZXMgdW5hIGNvbnN0YW50ZSBxdWUgbm8gZGVwZW5kZSBkZWwgYHBvcmNfdXJiYW5vYCB5IGVzIGVsCm1pc21vIHBhcmEgdG9kYXMgbGFzIG9ic2VydmFjaW9uZXMgZGUgY2FkYSByZWdpw7NuLiBMb3MgdmFsb3JlcyBlc3RpbWFkb3MgY29pbmNpZGVuCmV4YWN0YW1lbnRlIGNvbiBlbCBjb2NpZW50ZSBlbnRyZSBlbCB0b3RhbCBkZSBgTl9hdmVzYCB5IGVsIHRvdGFsIGRlIGBOX3ByZXNhc2AKb2JzZXJ2YWRvcyBlbiBjYWRhIHJlZ2nDs24sIGNvbW8gc2UgdmUgZW4gZWwgc2lndWllbnRlIGNodW5rOgoKYGBge3J9CnR5dG8gJT4lCiAgZ3JvdXBfYnkoUmVnaW9uKSAlPiUKICBzdW1tYXJpc2UocGkgPSBzdW0oTl9hdmVzKS9zdW0oTl9wcmVzYXMpKSAlPiUKICBtdXRhdGUocGkgPSByb3VuZChwaSwgNCkpCmBgYAo=