Introducción

En la inferencia Bayesiana, normalmente se conoce \(f(y|\theta)\) y \(p(\theta)\) donde \(y\) son las observaciones y \(\theta\) los parámetros, en muchas ocasiones por la complejidad que puede adquirir la distribución a posteriori \(p(\theta|y)\) es dificil de muestrearla, por lo que se requiere de métodos iterativos para poder obtener la forma de la distribución y poder resumir sus características. En estos casos, la aproximación se puede realizar a través de un Gibbs Sampling, ya que este algoritmo se construye en base a una secuencia que depende de valores de parámetros provenientes de una distribucón que sabemos que converge.

En este informe trataremos de demostrar que el Gibbs Sampling, es efectivo bajo ciertas condiciones, ya que, demostraremos que para ciertos valroes de la varianza el algoritmo no converge o le cuesta más, lo cual se debe a que no se tiene un parámetro mínimo suficiente, lo que no asegura la convergencia del proceso. Por lo que, se analizarán los casos en los que es efectivo y cuales no, a través de diversas simulaciones.

Definción posteriori empírica

Tal como se nos introdujo en clase, se ha estado trabajando en el modelo Bayesiano, el cual esta compuesto por:

  1. Distribución de muestreo:

\[ (Y_i| a,b) \sim N(a + b, \sigma^2), \hspace{0.5 cm} i = 1,...,n; \hspace{1 cm} \perp\perp_{1 \leq i \leq n} Y_i | (a, b)\]

  1. Especificación a priori de los parámetros

\[ a \sim N(\mu_a, \sigma^2_a),\hspace{0.5 cm} b \sim N(\mu_b, \sigma_b^2), \hspace{0.5 cm} a ⊥⊥ b \]

Si queremos obtener la distribución a posteriori empírica de los parámetros, podemos trabajar bajo el supuesto de que como todas las \(Yes\) distribuyen Normal y los parámetros a priori también lo hacen, se puede trabajar bajo el supuesto que a posteriori seguirán distribuyendo Normal, por lo que tenemos:

\[E(a | Y_1) = E(a) + Cov(a,Y_1)Var[Y_1]^{-1}(Y_1-E(Y_1))\] \[E(a| Y_1) = \mu_a + \frac{\sigma_a^2}{\sigma_a^2+\sigma_b^2+\sigma^2} (Y_1 - \mu_a -\mu_b)\] \[E(a| Y_1) = \frac{ (\sigma_a^2 + \sigma^2)\mu_a + \sigma_a^2(Y_1 -\mu_b) }{\sigma_a^2+\sigma_b^2+\sigma^2}\] Luego para la varianza tenemos:

\[Var(a | Y_1) = Var(a) + Cov(a,Y_1)Var[Y_1]^{-1}Cov(Y_1,a)\]

\[Var(a| Y_1) = \sigma_a + \frac{\sigma_a^2\sigma_b^2}{\sigma_a^2+\sigma_b^2+\sigma^2}\] \[Var(a| Y_1) = \frac{\sigma_a^2(\sigma_b^2 + \sigma^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\] Por lo que podemos concluir que la distribución es:

\[(a|Y_1) \sim N\bigg( \frac{ (\sigma_a^2 + \sigma^2)\mu_a + \sigma_a^2(Y_1 -\mu_b) }{\sigma_a^2+\sigma_b^2+\sigma^2},\frac{\sigma_a^2(\sigma_b^2 + \sigma^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\]

Analogamente para el caso de \((b|Y_1)\) y \((a+b|Y_1)\) tenemos:

\[(b|Y_1) \sim N\bigg( \frac{ (\sigma_b^2 + \sigma^2)\mu_b + \sigma_b^2(Y_1 -\mu_a) }{\sigma_a^2+\sigma_b^2+\sigma^2},\frac{\sigma_b^2(\sigma_a^2 + \sigma^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\] y

\[(a+b|Y_1) \sim N\bigg( \frac{ \sigma^2(\mu_a^2 + \mu_b^2) + Y_1(\sigma_a^2 -\sigma_b^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}, \frac{\sigma^2(\sigma_a^2 + \sigma_b^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\]

Claramente aquí estamos basando nuestro análisis solo para el caso univariado, es decir, solo para \(Y_1\), por lo que si lo generalizamos para \(n\) \(Yes\) tenemos:

\[(a|Y_i) \sim N_i\bigg( \frac{ (\sigma_a^2 + \sigma^2)\mu_a + \sigma_a^2(Y_i -\mu_b) }{\sigma_a^2+\sigma_b^2+\sigma^2},\frac{\sigma_a^2(\sigma_b^2 + \sigma^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\] ,

\[(b|Y_i) \sim N_i\bigg( \frac{ (\sigma_b^2 + \sigma^2)\mu_b + \sigma_b^2(Y_i -\mu_a) }{\sigma_a^2+\sigma_b^2+\sigma^2},\frac{\sigma_b^2(\sigma_a^2 + \sigma^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\] y

\[(a+b|Y_i) \sim N_i\bigg( \frac{ \sigma^2(\mu_a^2 + \mu_b^2) + Y_i(\sigma_a^2 -\sigma_b^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}, \frac{\sigma^2(\sigma_a^2 + \sigma_b^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\]

De modo, que cada distribución será una coordenada del vector y tendremos \(n\) entradas.

Definición de posteriori con Gibbs Sampleing

Ahora que ya sabemos como distribuye empíricamente nuestros parámetros, mediante el proceso de Gibbs Sampling intentaremos explicar si esto es consistente, para ellos revisaremos distintos casos.

Lo primero a hacer es definir la distribución que tendrán los parámetros a posteriori, pero cuando son simulados desde un Gibbs Sampler, serán:

\[ (a^{(k)}|Y_i,b^{(k-1)}) \sim N\bigg(\frac{\mu_a + \sigma_a^2(Y_i - b^{(k-1)})}{ \sigma_a^2 + \sigma^2},\frac{\sigma_a^2}{\sigma_a^2+\sigma^2} \bigg) \]

\[ (b^{(k)}|Y_i,a^{(k-1)}) \sim N\bigg(\frac{\mu_b + \sigma_b^2(Y_i - a^{(k-1)})}{ \sigma_b^2 + \sigma^2},\frac{\sigma_b^2}{\sigma_b^2+\sigma^2} \bigg) \]

\[ (a^{(k)}+b^{(k)}|Y_i,a^{(k-1)},b^{(k-1)}) = (a^{(k)}|Y_i,b^{(k-1)})+(b^{(k)}|Y_i,a^{(k-1)}) \]

Con esto podemos analizar la convergencia del algoritmo, para cuando las medias son 0 y las desviaciones estándar 1:

# Definimos el tamaño del vector Y

n = 10000

# Definimos los hiperparámetros mu_a, mu_b, sigma_a, sigma_b y sigma

mu_a = 0
mu_b = 0 
sigma_a = 1
sigma_b = 1
sigma = 1 

# Definimos los valores iniciales de a y b
# 
a_0 = rnorm(1,mu_a,sigma_a)
b_0 = rnorm(1,mu_b,sigma_b)

# Definimos el vector de las observaciones 

Y_obs <- rnorm(n,a_0 + b_0, sigma)

# Con ello empezamos el algoritmo de Gibbs para obtener la dist a posteriori
# de la (a|Y_obs),(b|Y_obs) y (a+b|Y_obs)

a_sim = vector(mode = "numeric", length = n)
b_sim = vector(mode = "numeric", length = n)
a_b_sim = vector(mode = "numeric", length = n)

a_sim[1] = a_0 
b_sim[1] = b_0
a_b_sim[1] = a_0 + b_0

i = 2
k = 21000

while (i<=k) {
  a_sim[i] <- rnorm(1,mean = (mu_a + sigma_a^2*(Y_obs - b_sim[i-1]))/(sigma_a^2+sigma^2),
                    sd = sqrt((sigma_a^2)/(sigma_a^2+sigma^2)))
  b_sim[i] <- rnorm(1,mean = (mu_b + sigma_b^2*(Y_obs - a_sim[i-1]))/(sigma_b^2+sigma^2),
                    sd = sqrt((sigma_b^2)/(sigma_b^2+sigma^2)))
  a_b_sim[i] <- a_sim[i] + b_sim[i]
  i=i+1  
}

a_sim_20000 <- a_sim[1001:21000]
b_sim_20000 <- b_sim[1001:21000]
a_b_sim_20000 <- a_b_sim[1001:21000]

pos <- seq(1,20000, by = 10)

a_sim_2000 <- c()
b_sim_2000 <- c()
a_b_sim_2000 <- c()

for (i in pos) {
  aux1 <- a_sim_20000[i]
  aux2 <- b_sim_20000[i]
  aux3 <- a_b_sim_20000[i]
  a_sim_2000 <- c(a_sim_2000,aux1)
  b_sim_2000 <- c(b_sim_2000,aux2)
  a_b_sim_2000 <- c(a_b_sim_2000,aux3)
}

Una vez obtenidos los valores de las parámetros a través de la simulación de Gibbs, podemos analizar su convergencia mediante un traceplot():

medias = 0 y sigmas = 1

medias = 0 y sigmas = 1

Aquí podemos ver que el parámetro de \(a\) converge a 0.3259672 y \(b\) converge a 0.3360609, mientras que el mínimo suficiente \(a+b\), converge a 0.6620281 que coincide exactamente con la suma de los parámetros \(a\) y \(b\) (0.6620281) , por lo que hasta el minuto podemos ver que todo va bien encaminado. Ahora que tenemos las distribuciones a posteriori mediante un qqplot() y el ks.test() las podemos comparar en base a la distribución empírica original:

  1. Para el parámetro \(a\), tenemos que el qqplot() se acerca mucho a la Normal, como se puede ver en el siguiente gráfico:

y analizando el resultado que nos da el ks.test() es claro que el parámetro si distribuye Normal, ya que su valor es demasiado pequeño, como se muestra a continuación:


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_a
D = 0.60929, p-value < 2.2e-16
alternative hypothesis: two-sided
  1. Para el parámetro \(b\), tenemos que el qqplot() se acerca mucho a la Normal:

Es claro observar que practicamente todos los valores son cercanos a la Normal, nuevamente si analizamos de manera cuantitativa usando el ks.test(), el valor es demasiado pequeño lo que hace validar nuestro supuesto.


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_b
D = 0.59964, p-value < 2.2e-16
alternative hypothesis: two-sided
  1. Para el parámetro \(a+b\), tenemos que el qqplot() se acerca mucho a la Normal, mucho más que los parámetros de forma individual, esto tambien se debe principalmente a que es el mínimo suficiente:

Nuevamente en este caso la gráfica es practicamente perfecta, y el ks.test() nos confirma esta idea de que el parámetro distribuye Normal, dado su tamaño extremadamente pequeño:


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_a_b
D = 0.29368, p-value < 2.2e-16
alternative hypothesis: two-sided

Finalmente, si nos interesa revisar si las distribuciones a posteriori de \((a|Y_1,...,Y_n)\) y de \((b|Y_1,...,Y_n)\) son función o se parecen en algo a la distribución a posteriori del parámetro mínimo suficiente podemos usar un histograma para revisar su comportamiento:

Con lo anterior, podemos ver que el algoritmo de Gibbs aplicado a una cadena de 10^{4} observaciones, cuyas medias son \(0_s\) y sus desviaciones estándar son \(1_s\), todo resulta perfecto. Sin embargo, ¿Qué ocurre cuando la varianza comienza a aumentar?. A continuación, ampliaremos el análisis para distintos casos donde la desviación estándar comienza a cambiar (para revisar todos los casos ver Anexos):

Caso 1: sigma_a > sigma_b > sigma

En este caso definimos, los valores de sigma como :

sigma_a_caso1 = 10000
sigma_b_caso1 = 50
sigma_caso1 = 1 

El traceplot() de dicho caso, nos muestra que el parámetro de \(a\) tiene mayor dispersión que el de \(b\), por lo que al final el parámetro mínimo suficiente tiende a dispersarse mucho, sin embargo si revisamos los qqplot(), tanto el de \(a\) como \(b\) no son muy adecuados, sin embargo el mínimo sufiente \(a+b\) tiende a ser mucho más correcto y parecerse a una Normal.

Caso 3: sigma_b > sigma_a > sigma

En este caso definimos, los valores de sigma como :

sigma_a_caso1 = 10000
sigma_b_caso1 = 50
sigma_caso1 = 1 

El traceplot() de dicho caso, nos muestra que el parámetro de \(a\) tiene mayor dispersión que el de \(b\), por lo que al final el parámetro mínimo suficiente tiende a dispersarse mucho, sin embargo si revisamos los qqplot(), tanto el de \(a\) como \(b\) no son muy adecuados, sin embargo el mínimo sufiente \(a+b\) tiende a ser mucho más correcto y parecerse a una Normal.

Caso 2: sigma > sigma_b > sigma_a

En este caso definimos, los valores de sigma como :

sigma_a_caso2 = 1
sigma_b_caso2 = 50
sigma_caso2 = 10000

El traceplot() de dicho caso, nos muestra que el parámetro de \(a\) es el menos disperso, mientras que el de \(b\) es muy disperso, por lo que al final el parámetro mínimo suficiente tiende a dispersarse mucho, sin embargo si revisamos los qqplot(), tanto el de \(a\), como el de \(b\) y como el mínimo sufiente \(a+b\), no se acercan al valor de la Normal. Aquí, tenemos un caso particular en el que donde la dispersión de las observaciones hace que el algoritmo de Gibbs no simula los valores de manera correcta. A pesar de que el valor del ks.test() nos da muy pequeño, los valores gráficos nos demuestran que no es correcto. Esto ocurre de manera similar en el caso 4(revisar Anexos).

Caso 5: sigma_a > sigma_b = sigma y Caso 6: sigma_b > sigma_a = sigma

En este caso definimos, los valores de sigma como :

# caso 5

sigma_a_caso5 = 10000
sigma_b_caso5 = 3
sigma_caso5 = 3

# caso 6

sigma_a_caso6 = 3
sigma_b_caso6 = 10000
sigma_caso6 = 3

Aquí podemos ver que cuando la varianza de alguno de los parámetros es demasiado grande la convergencia es muy complicada, tanto del parámetro correspondiente como la del mínimo suficiente, esto se puede ver claramente en los qqplots() de dichos casos. Por lo que podemos ver que en casos como este la convergencia se le complica al algoritmo de Gibbs.

Caso 7: sigma > sigma_a = sigma_b

En este caso definimos, los valores de sigma como :

sigma_a_caso7 = 1 
sigma_b_caso7 = 1
sigma_caso7 = 10000 

Aquí tenemos otro caso interesante, ya que al definir la desviación estándar de las observaciones tan alta, hace que ningún parámetro converja de manera correcta, algo similar al caso 2 o caso 4, y esto se aprecia considerablemente en el qqplot() de dicho problema.

Caso 8: sigma_a = sigma_b > sigma

En este caso definimos, los valores de sigma como :

sigma_a_caso8 = 10000 
sigma_b_caso8 = 10000
sigma_caso8 = 1 

Finalmente, en este último caso que se ha decidido analizar, podemos es claro ver que a pesar que la dispersión de los parámetros es altisima, si el de las observaciones es bajo, podemos asegurar una buena convergencia del algoritmo.

Reflexión de preguntas

Según lo expuesto a lo largo de este informe, ya nos encontramos con el conocimiento suficiente para dar una respuesta mucho más clara de lo solicitado.

La primera pregunta a analizar es: ¿Es correcto afirmar que la cadena de Markov asociada al parámetro mínimo suficiente converge “más fácilmente” que las cadenas de Markov asociadas a los parámetros a y b?, y bueno como lo revisamos en los traceplot() de los distintos casos, la convergencia es algo que siempre trata de hacer el algotitmo del Gibbs, sin embargo, podemos notar claramente que cuando la varianza de alguno de los parámetros o de las observaciones aumenta de manera considerable hace que la convergencia sea más difícil de ocurrir, haciendo que el parámetro llegue a oscilar de manera bastante ruidosa, no obstante, a pesar de que a \(a\) y a \(b\) les cueste, siempre para el parámetro mínimo suficiente será más sencillo.

Luego, si respondemos a la segunda pregunta que es: ¿En qué medida el Gibbs sampling permite constatar que la distribución a posteriori de un párametro que no es el mínimo suficiente (por ejemplo, a) se reduce a la distribución a posteriori del párametro mínimo suficiente? está pregunta al igual que la anterior esta altamente relacionada a la anterior, ya que, al saber que el algoritmo

Conclusión

En conclusión de todo este trabajo, podemos decir que el algortimo de Gibbs es una herramienta altamente poderosa, ya que, nos permite encontrar la forma de las distribuciones a posteriori cuando es muy complejo hacerlo a mano. Sin embargo, es necesario tener presente que cuando se analiza problemas de este estilo, antes de determinar la convegencia del algoritmo o no, es muy importante conocer la naturaleza de nuestros datos, para saber si afectará o no en la convergencia del algoritmo. Otro punto importante a destacar aquí es que a priori no importa como sea la distribución de los parámetros, sino que para tomar un juicio es muy importante que el parámetro sea mínimo suficiente, ya que, de esta manera aseguramos la convergencia del algoritmo.

Referencias

  1. Hoff, P. D. (2009). A First Course in Bayesian Statistical Methods. Springer.

  2. Material explicado en clases.

Anexos

Caso 1: sigma_a > sigma_b > sigma

Caso 1: sigma_a > sigma_b > sigma

Caso 1: sigma_a > sigma_b > sigma


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso1_a
D = 0.48916, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso1_b
D = 0.47519, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso1_a_b
D = 0.82388, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 2: sigma > sigma_b > sigma_a

Caso 2: sigma > sigma_b > sigma_a

Caso 2: sigma > sigma_b > sigma_a


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso2_a
D = 0.48706, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso2_b
D = 0.48794, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso2_a_b
D = 0.48799, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 3: sigma_b > sigma_a > sigma

Caso 3: sigma_b > sigma_a > sigma

Caso 3: sigma_b > sigma_a > sigma


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso3_a
D = 0.47137, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso3_b
D = 0.49592, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso3_a_b
D = 0.73385, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 4: sigma > sigma_a > sigma_b

Caso 4: sigma > sigma_a > sigma_b

Caso 4: sigma > sigma_a > sigma_b


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso4_a
D = 0.97789, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso4_b
D = 0.49879, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso4_a_b
D = 0.97785, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 5: sigma_a > sigma_b = sigma

Caso 5: sigma_a > sigma_b = sigma

Caso 5: sigma_a > sigma_b = sigma


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso5_a
D = 0.94527, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso5_b
D = 0.30027, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso5_a_b
D = 0.97988, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 6: sigma_b > sigma_a = sigma

Caso 6: sigma_b > sigma_a = sigma

Caso 6: sigma_b > sigma_a = sigma


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso6_a
D = 0.30262, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso6_b
D = 0.96133, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso6_a_b
D = 0.97717, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 7: sigma > sigma_a = sigma_b

Caso 7: sigma > sigma_a = sigma_b

Caso 7: sigma > sigma_a = sigma_b


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso7_a
D = 0.92548, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso7_b
D = 0.0094631, p-value = 0.05564
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso7_a_b
D = 0.82482, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 8: sigma_a = sigma_b > sigma

Caso 8: sigma_a = sigma_b > sigma

Caso 8: sigma_a = sigma_b > sigma


    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso8_a
D = 0.49966, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso8_b
D = 0.49979, p-value < 2.2e-16
alternative hypothesis: two-sided

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  datos_ordenados_caso8_a_b
D = 0.13896, p-value < 2.2e-16
alternative hypothesis: two-sided

LS0tDQp0aXRsZTogIjxjZW50ZXI+SW50ZXJyb2dhY2nDs24gMyAtIE3DqXRvZG9zIEJheWVzaWFub3M8L2NlbnRlcj4iDQpzdWJ0aXRsZTogIjxjZW50ZXI+RnJhbmNpc2NhIFZpbGNhIFPDoW5jaGV6PC9jZW50ZXI+Ig0KYXV0b3I6ICIiDQpkYXRlOiAiPGNlbnRlcj5gciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkLyVtLyVZJylgPC9jZW50ZXI+Ig0Kb3V0cHV0OiANCiAgICBodG1sX2RvY3VtZW50Og0KICAgICAgICB0b2M6IHRydWUNCiAgICAgICAgdG9jX2Zsb2F0Og0KICAgICAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICAgICAgdGhlbWU6DQogICAgICAgICAgICBiZzogJyMyMDIxMjMnICAgICAgIyBDb2xvciBkZSBmb25kbw0KICAgICAgICAgICAgZmc6ICcjQjhCQ0MyJyAgICAgICMgQ29sb3IgZnVlbnRlIHkgbGluZWFzLg0KICAgICAgICAgICAgcHJpbWFyeTogIiM3ZjAwYjIiICMgUmVzYWx0YWRvDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiA3Mg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gICAgICA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSAgID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyAgID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAgID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gJ2NlbnRlcicsDQogICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBUUlVFKQ0KDQpyZXF1aXJlKGRwbHlyKQ0KcmVxdWlyZShyaW8pDQpyZXF1aXJlKGthYmxlRXh0cmEpDQpyZXF1aXJlKGJlZXByKQ0KcmVxdWlyZShoZXJlKQ0KYGBgDQoNCmBgYHtyIGNhY2hlPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpzb3VyY2UoaGVyZSgiY29kaWdvX2kzLlIiKSwgbG9jYWwgPSBrbml0cjo6a25pdF9nbG9iYWwoKSkNCmBgYA0KDQojIyBJbnRyb2R1Y2Npw7NuDQoNCkVuIGxhIGluZmVyZW5jaWEgQmF5ZXNpYW5hLCBub3JtYWxtZW50ZSBzZSBjb25vY2UgJGYoeXxcdGhldGEpJCB5DQokcChcdGhldGEpJCBkb25kZSAkeSQgc29uIGxhcyBvYnNlcnZhY2lvbmVzIFxuIHkgJFx0aGV0YSQgbG9zIHBhcsOhbWV0cm9zLA0KZW4gbXVjaGFzIG9jYXNpb25lcyBwb3IgbGEgY29tcGxlamlkYWQgcXVlIHB1ZWRlIGFkcXVpcmlyIGxhDQpkaXN0cmlidWNpw7NuIGEgcG9zdGVyaW9yaSAkcChcdGhldGF8eSkkIGVzIGRpZmljaWwgZGUgbXVlc3RyZWFybGEsIHBvcg0KbG8gcXVlIHNlIHJlcXVpZXJlIGRlIG3DqXRvZG9zIGl0ZXJhdGl2b3MgcGFyYSBwb2RlciBvYnRlbmVyIGxhIGZvcm1hIGRlDQpsYSBkaXN0cmlidWNpw7NuIHkgcG9kZXIgcmVzdW1pciBzdXMgY2FyYWN0ZXLDrXN0aWNhcy4gRW4gZXN0b3MgY2Fzb3MsIGxhDQphcHJveGltYWNpw7NuIHNlIHB1ZWRlIHJlYWxpemFyIGEgdHJhdsOpcyBkZSB1biBHaWJicyBTYW1wbGluZywgeWEgcXVlDQplc3RlIGFsZ29yaXRtbyBzZSBjb25zdHJ1eWUgZW4gYmFzZSBhIHVuYSBzZWN1ZW5jaWEgcXVlIGRlcGVuZGUgZGUNCnZhbG9yZXMgZGUgcGFyw6FtZXRyb3MgcHJvdmVuaWVudGVzIGRlIHVuYSBkaXN0cmlidWPDs24gcXVlIHNhYmVtb3MNCnF1ZSBjb252ZXJnZS4NCg0KRW4gZXN0ZSBpbmZvcm1lIHRyYXRhcmVtb3MgZGUgZGVtb3N0cmFyIHF1ZSBlbCBHaWJicyBTYW1wbGluZywgZXMNCmVmZWN0aXZvIGJham8gY2llcnRhcyBjb25kaWNpb25lcywgeWEgcXVlLCBkZW1vc3RyYXJlbW9zIHF1ZSBwYXJhIGNpZXJ0b3MgdmFscm9lcyBkZSBsYSB2YXJpYW56YSBlbCBhbGdvcml0bW8gbm8gY29udmVyZ2UgbyBsZSBjdWVzdGEgbcOhcywgbG8gY3VhbCBzZSBkZWJlIGEgcXVlIG5vIHNlIHRpZW5lIHVuIHBhcsOhbWV0cm8gbcOtbmltbyBzdWZpY2llbnRlLCBsbyBxdWUgbm8gYXNlZ3VyYSBsYSBjb252ZXJnZW5jaWEgZGVsIHByb2Nlc28uIFBvciBsbyBxdWUsIHNlIGFuYWxpemFyw6FuIGxvcyBjYXNvcyBlbiBsb3MgcXVlIGVzIGVmZWN0aXZvIHkgY3VhbGVzIG5vLCBhIHRyYXbDqXMgZGUgZGl2ZXJzYXMgc2ltdWxhY2lvbmVzLg0KDQojIyBEZWZpbmNpw7NuIHBvc3RlcmlvcmkgZW1ww61yaWNhDQoNClRhbCBjb21vIHNlIG5vcyBpbnRyb2R1am8gZW4gY2xhc2UsIHNlIGhhIGVzdGFkbyB0cmFiYWphbmRvIGVuIGVsIG1vZGVsbyBCYXllc2lhbm8sIGVsIGN1YWwgZXN0YSBjb21wdWVzdG8gcG9yOg0KDQoxLiAgRGlzdHJpYnVjacOzbiBkZSBtdWVzdHJlbzoNCg0KJCQgKFlfaXwgYSxiKSBcc2ltIE4oYSArIGIsIFxzaWdtYV4yKSwgXGhzcGFjZXswLjUgY219IGkgPSAxLC4uLixuOyBcaHNwYWNlezEgY219ICBccGVycFxwZXJwX3sxICBcbGVxIGkgIFxsZXEgbn0gWV9pIHwgKGEsIGIpJCQNCg0KMi4gIEVzcGVjaWZpY2FjacOzbiBhIHByaW9yaSBkZSBsb3MgcGFyw6FtZXRyb3MNCg0KJCQgYSBcc2ltIE4oXG11X2EsIFxzaWdtYV4yX2EpLFxoc3BhY2V7MC41IGNtfSAgYiBcc2ltIE4oXG11X2IsIFxzaWdtYV9iXjIpLCBcaHNwYWNlezAuNSBjbX0gYSDiiqXiiqUgYiAkJA0KDQpTaSBxdWVyZW1vcyBvYnRlbmVyIGxhIGRpc3RyaWJ1Y2nDs24gYSBwb3N0ZXJpb3JpIGVtcMOtcmljYSBkZSBsb3MNCnBhcsOhbWV0cm9zLCBwb2RlbW9zIHRyYWJhamFyIGJham8gZWwgc3VwdWVzdG8gZGUgcXVlIGNvbW8gdG9kYXMgbGFzDQokWWVzJCBkaXN0cmlidXllbiBOb3JtYWwgeSBsb3MgcGFyw6FtZXRyb3MgYSBwcmlvcmkgdGFtYmnDqW4gbG8gaGFjZW4sIHNlDQpwdWVkZSB0cmFiYWphciBiYWpvIGVsIHN1cHVlc3RvIHF1ZSBhIHBvc3Rlcmlvcmkgc2VndWlyw6FuIGRpc3RyaWJ1eWVuZG8NCk5vcm1hbCwgcG9yIGxvIHF1ZSB0ZW5lbW9zOg0KDQokJEUoYSB8IFlfMSkgPSBFKGEpICsgQ292KGEsWV8xKVZhcltZXzFdXnstMX0oWV8xLUUoWV8xKSkkJA0KJCRFKGF8IFlfMSkgPSBcbXVfYSArIFxmcmFje1xzaWdtYV9hXjJ9e1xzaWdtYV9hXjIrXHNpZ21hX2JeMitcc2lnbWFeMn0gKFlfMSAtIFxtdV9hIC1cbXVfYikkJA0KJCRFKGF8IFlfMSkgPSBcZnJhY3sgKFxzaWdtYV9hXjIgKyBcc2lnbWFeMilcbXVfYSArIFxzaWdtYV9hXjIoWV8xIC1cbXVfYikgfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9JCQNCkx1ZWdvIHBhcmEgbGEgdmFyaWFuemEgdGVuZW1vczoNCg0KJCRWYXIoYSB8IFlfMSkgPSBWYXIoYSkgKyBDb3YoYSxZXzEpVmFyW1lfMV1eey0xfUNvdihZXzEsYSkkJA0KDQokJFZhcihhfCBZXzEpID0gXHNpZ21hX2EgKyBcZnJhY3tcc2lnbWFfYV4yXHNpZ21hX2JeMn17XHNpZ21hX2FeMitcc2lnbWFfYl4yK1xzaWdtYV4yfSQkDQokJFZhcihhfCBZXzEpID0gXGZyYWN7XHNpZ21hX2FeMihcc2lnbWFfYl4yICsgXHNpZ21hXjIpfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9JCQNClBvciBsbyBxdWUgcG9kZW1vcyBjb25jbHVpciBxdWUgbGEgZGlzdHJpYnVjacOzbiBlczoNCg0KJCQoYXxZXzEpIFxzaW0gTlxiaWdnKCBcZnJhY3sgKFxzaWdtYV9hXjIgKyBcc2lnbWFeMilcbXVfYSArIFxzaWdtYV9hXjIoWV8xIC1cbXVfYikgfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9LFxmcmFje1xzaWdtYV9hXjIoXHNpZ21hX2JeMiArIFxzaWdtYV4yKX17XHNpZ21hX2FeMitcc2lnbWFfYl4yK1xzaWdtYV4yfVxiaWdnKSQkDQoNCkFuYWxvZ2FtZW50ZSBwYXJhIGVsIGNhc28gZGUgJChifFlfMSkkIHkgJChhK2J8WV8xKSQgdGVuZW1vczoNCg0KJCQoYnxZXzEpIFxzaW0gTlxiaWdnKCBcZnJhY3sgKFxzaWdtYV9iXjIgKyBcc2lnbWFeMilcbXVfYiArIFxzaWdtYV9iXjIoWV8xIC1cbXVfYSkgfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9LFxmcmFje1xzaWdtYV9iXjIoXHNpZ21hX2FeMiArIFxzaWdtYV4yKX17XHNpZ21hX2FeMitcc2lnbWFfYl4yK1xzaWdtYV4yfVxiaWdnKSQkDQp5DQoNCiQkKGErYnxZXzEpIFxzaW0gTlxiaWdnKCBcZnJhY3sgXHNpZ21hXjIoXG11X2FeMiArIFxtdV9iXjIpICsgWV8xKFxzaWdtYV9hXjIgLVxzaWdtYV9iXjIpfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9LA0KXGZyYWN7XHNpZ21hXjIoXHNpZ21hX2FeMiArIFxzaWdtYV9iXjIpfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9XGJpZ2cpJCQNCg0KQ2xhcmFtZW50ZSBhcXXDrSBlc3RhbW9zIGJhc2FuZG8gbnVlc3RybyBhbsOhbGlzaXMgc29sbyBwYXJhIGVsIGNhc28NCnVuaXZhcmlhZG8sIGVzIGRlY2lyLCBzb2xvIHBhcmEgJFlfMSQsIHBvciBsbyBxdWUgc2kgbG8gZ2VuZXJhbGl6YW1vcw0KcGFyYSAkbiQgJFllcyQgdGVuZW1vczoNCg0KJCQoYXxZX2kpIFxzaW0gTl9pXGJpZ2coIFxmcmFjeyAoXHNpZ21hX2FeMiArIFxzaWdtYV4yKVxtdV9hICsgXHNpZ21hX2FeMihZX2kgLVxtdV9iKSB9e1xzaWdtYV9hXjIrXHNpZ21hX2JeMitcc2lnbWFeMn0sXGZyYWN7XHNpZ21hX2FeMihcc2lnbWFfYl4yICsgXHNpZ21hXjIpfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9XGJpZ2cpJCQNCiwNCg0KJCQoYnxZX2kpIFxzaW0gTl9pXGJpZ2coIFxmcmFjeyAoXHNpZ21hX2JeMiArIFxzaWdtYV4yKVxtdV9iICsgXHNpZ21hX2JeMihZX2kgLVxtdV9hKSB9e1xzaWdtYV9hXjIrXHNpZ21hX2JeMitcc2lnbWFeMn0sXGZyYWN7XHNpZ21hX2JeMihcc2lnbWFfYV4yICsgXHNpZ21hXjIpfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9XGJpZ2cpJCQNCnkNCg0KJCQoYStifFlfaSkgXHNpbSBOX2lcYmlnZyggXGZyYWN7IFxzaWdtYV4yKFxtdV9hXjIgKyBcbXVfYl4yKSArIFlfaShcc2lnbWFfYV4yIC1cc2lnbWFfYl4yKX17XHNpZ21hX2FeMitcc2lnbWFfYl4yK1xzaWdtYV4yfSwNClxmcmFje1xzaWdtYV4yKFxzaWdtYV9hXjIgKyBcc2lnbWFfYl4yKX17XHNpZ21hX2FeMitcc2lnbWFfYl4yK1xzaWdtYV4yfVxiaWdnKSQkDQoNCkRlIG1vZG8sIHF1ZSBjYWRhIGRpc3RyaWJ1Y2nDs24gc2Vyw6EgdW5hIGNvb3JkZW5hZGEgZGVsIHZlY3RvciB5DQp0ZW5kcmVtb3MgJG4kIGVudHJhZGFzLg0KDQojIyBEZWZpbmljacOzbiBkZSBwb3N0ZXJpb3JpIGNvbiBHaWJicyBTYW1wbGVpbmcNCg0KQWhvcmEgcXVlIHlhIHNhYmVtb3MgY29tbyBkaXN0cmlidXllIGVtcMOtcmljYW1lbnRlIG51ZXN0cm9zIHBhcsOhbWV0cm9zLA0KbWVkaWFudGUgZWwgcHJvY2VzbyBkZSBHaWJicyBTYW1wbGluZyBpbnRlbnRhcmVtb3MgZXhwbGljYXIgc2kgZXN0byBlcw0KY29uc2lzdGVudGUsIHBhcmEgZWxsb3MgcmV2aXNhcmVtb3MgZGlzdGludG9zIGNhc29zLg0KDQpMbyBwcmltZXJvIGEgaGFjZXIgZXMgZGVmaW5pciBsYSBkaXN0cmlidWNpw7NuIHF1ZSB0ZW5kcsOhbiBsb3MgcGFyw6FtZXRyb3MgYSBwb3N0ZXJpb3JpLCBwZXJvIGN1YW5kbyBzb24gc2ltdWxhZG9zIGRlc2RlIHVuIEdpYmJzIFNhbXBsZXIsIHNlcsOhbjoNCg0KJCQgKGFeeyhrKX18WV9pLGJeeyhrLTEpfSkgXHNpbSBOXGJpZ2coXGZyYWN7XG11X2EgKyBcc2lnbWFfYV4yKFlfaSAtIGJeeyhrLTEpfSl9eyBcc2lnbWFfYV4yICsgXHNpZ21hXjJ9LFxmcmFje1xzaWdtYV9hXjJ9e1xzaWdtYV9hXjIrXHNpZ21hXjJ9IFxiaWdnKSAkJA0KDQokJCAoYl57KGspfXxZX2ksYV57KGstMSl9KSBcc2ltIE5cYmlnZyhcZnJhY3tcbXVfYiArIFxzaWdtYV9iXjIoWV9pIC0gYV57KGstMSl9KX17IFxzaWdtYV9iXjIgKyBcc2lnbWFeMn0sXGZyYWN7XHNpZ21hX2JeMn17XHNpZ21hX2JeMitcc2lnbWFeMn0gXGJpZ2cpICQkDQoNCiQkIChhXnsoayl9K2JeeyhrKX18WV9pLGFeeyhrLTEpfSxiXnsoay0xKX0pID0gKGFeeyhrKX18WV9pLGJeeyhrLTEpfSkrKGJeeyhrKX18WV9pLGFeeyhrLTEpfSkgJCQNCg0KQ29uIGVzdG8gcG9kZW1vcyBhbmFsaXphciBsYSBjb252ZXJnZW5jaWEgZGVsIGFsZ29yaXRtbywgcGFyYSBjdWFuZG8gbGFzIG1lZGlhcyBzb24gMCB5IGxhcyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIDE6DQoNCmBgYHtyfQ0KIyBEZWZpbmltb3MgZWwgdGFtYcOxbyBkZWwgdmVjdG9yIFkNCg0KbiA9IDEwMDAwDQoNCiMgRGVmaW5pbW9zIGxvcyBoaXBlcnBhcsOhbWV0cm9zIG11X2EsIG11X2IsIHNpZ21hX2EsIHNpZ21hX2IgeSBzaWdtYQ0KDQptdV9hID0gMA0KbXVfYiA9IDAgDQpzaWdtYV9hID0gMQ0Kc2lnbWFfYiA9IDENCnNpZ21hID0gMSANCg0KIyBEZWZpbmltb3MgbG9zIHZhbG9yZXMgaW5pY2lhbGVzIGRlIGEgeSBiDQojIA0KYV8wID0gcm5vcm0oMSxtdV9hLHNpZ21hX2EpDQpiXzAgPSBybm9ybSgxLG11X2Isc2lnbWFfYikNCg0KIyBEZWZpbmltb3MgZWwgdmVjdG9yIGRlIGxhcyBvYnNlcnZhY2lvbmVzIA0KDQpZX29icyA8LSBybm9ybShuLGFfMCArIGJfMCwgc2lnbWEpDQoNCiMgQ29uIGVsbG8gZW1wZXphbW9zIGVsIGFsZ29yaXRtbyBkZSBHaWJicyBwYXJhIG9idGVuZXIgbGEgZGlzdCBhIHBvc3RlcmlvcmkNCiMgZGUgbGEgKGF8WV9vYnMpLChifFlfb2JzKSB5IChhK2J8WV9vYnMpDQoNCmFfc2ltID0gdmVjdG9yKG1vZGUgPSAibnVtZXJpYyIsIGxlbmd0aCA9IG4pDQpiX3NpbSA9IHZlY3Rvcihtb2RlID0gIm51bWVyaWMiLCBsZW5ndGggPSBuKQ0KYV9iX3NpbSA9IHZlY3Rvcihtb2RlID0gIm51bWVyaWMiLCBsZW5ndGggPSBuKQ0KDQphX3NpbVsxXSA9IGFfMCANCmJfc2ltWzFdID0gYl8wDQphX2Jfc2ltWzFdID0gYV8wICsgYl8wDQoNCmkgPSAyDQprID0gMjEwMDANCg0Kd2hpbGUgKGk8PWspIHsNCiAgYV9zaW1baV0gPC0gcm5vcm0oMSxtZWFuID0gKG11X2EgKyBzaWdtYV9hXjIqKFlfb2JzIC0gYl9zaW1baS0xXSkpLyhzaWdtYV9hXjIrc2lnbWFeMiksDQogICAgICAgICAgICAgICAgICAgIHNkID0gc3FydCgoc2lnbWFfYV4yKS8oc2lnbWFfYV4yK3NpZ21hXjIpKSkNCiAgYl9zaW1baV0gPC0gcm5vcm0oMSxtZWFuID0gKG11X2IgKyBzaWdtYV9iXjIqKFlfb2JzIC0gYV9zaW1baS0xXSkpLyhzaWdtYV9iXjIrc2lnbWFeMiksDQogICAgICAgICAgICAgICAgICAgIHNkID0gc3FydCgoc2lnbWFfYl4yKS8oc2lnbWFfYl4yK3NpZ21hXjIpKSkNCiAgYV9iX3NpbVtpXSA8LSBhX3NpbVtpXSArIGJfc2ltW2ldDQogIGk9aSsxICANCn0NCg0KYV9zaW1fMjAwMDAgPC0gYV9zaW1bMTAwMToyMTAwMF0NCmJfc2ltXzIwMDAwIDwtIGJfc2ltWzEwMDE6MjEwMDBdDQphX2Jfc2ltXzIwMDAwIDwtIGFfYl9zaW1bMTAwMToyMTAwMF0NCg0KcG9zIDwtIHNlcSgxLDIwMDAwLCBieSA9IDEwKQ0KDQphX3NpbV8yMDAwIDwtIGMoKQ0KYl9zaW1fMjAwMCA8LSBjKCkNCmFfYl9zaW1fMjAwMCA8LSBjKCkNCg0KZm9yIChpIGluIHBvcykgew0KICBhdXgxIDwtIGFfc2ltXzIwMDAwW2ldDQogIGF1eDIgPC0gYl9zaW1fMjAwMDBbaV0NCiAgYXV4MyA8LSBhX2Jfc2ltXzIwMDAwW2ldDQogIGFfc2ltXzIwMDAgPC0gYyhhX3NpbV8yMDAwLGF1eDEpDQogIGJfc2ltXzIwMDAgPC0gYyhiX3NpbV8yMDAwLGF1eDIpDQogIGFfYl9zaW1fMjAwMCA8LSBjKGFfYl9zaW1fMjAwMCxhdXgzKQ0KfQ0KYGBgDQoNClVuYSB2ZXogb2J0ZW5pZG9zIGxvcyB2YWxvcmVzIGRlIGxhcyBwYXLDoW1ldHJvcyBhIHRyYXbDqXMgZGUgbGEgc2ltdWxhY2nDs24gZGUgR2liYnMsIHBvZGVtb3MgYW5hbGl6YXIgc3UgY29udmVyZ2VuY2lhIG1lZGlhbnRlIHVuIGB0cmFjZXBsb3QoKWA6DQoNCmBgYHtyIGZpZy5jYXA9ICJtZWRpYXMgPSAwIHkgc2lnbWFzID0gMSIgLGVjaG89RkFMU0UsIG91dC53aWR0aD0gIjEwMCUiLCBmaWcuYWxpZ249J2NlbnRlcicgLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCnBhcihtZnJvdz1jKDEsMykpDQp2YWxvcmVzPSBjKGFfc2ltXzIwMDAsYl9zaW1fMjAwMCxhX2Jfc2ltXzIwMDApDQoNCnBsb3QoYV9zaW1fMjAwMCwgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzKSxtYXgodmFsb3JlcykpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IHBhcmEgKGF8WV9pLGIpIFxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXMpLG1heCh2YWxvcmVzKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QgcGFyYSAoYnxZX2ksYSkgIFxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChhX2Jfc2ltXzIwMDAsIHR5cGU9ImwiLCB5bGltID0gYyhtaW4odmFsb3JlcyksbWF4KHZhbG9yZXMpKSwgeGxhYiA9ICJDYW50aWRhZCBkZSBzaW11bGFjaW9uZXMiLHlsYWIgPSAiU2ltdWxhY2lvbmVzIGRlIEdpYmJzIiwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24ocGFzdGUoIlRyYWNlcGxvdCBwYXJhIChhK2J8WV9pLGEsYikgXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCmBgYA0KDQpBcXXDrSBwb2RlbW9zIHZlciBxdWUgZWwgcGFyw6FtZXRybyBkZSAkYSQgY29udmVyZ2UgYSBgciBtZWFuKGFfc2ltXzIwMDApIGAgeSAkYiQgY29udmVyZ2UgYSBgciBtZWFuKGJfc2ltXzIwMDApIGAsIG1pZW50cmFzIHF1ZSBlbCBtw61uaW1vIHN1ZmljaWVudGUgJGErYiQsIGNvbnZlcmdlIGEgYHIgbWVhbihhX2Jfc2ltXzIwMDApIGAgcXVlIGNvaW5jaWRlIGV4YWN0YW1lbnRlIGNvbiBsYSBzdW1hIGRlIGxvcyBwYXLDoW1ldHJvcyAkYSQgeSAkYiQgKGByIG1lYW4oYV9zaW1fMjAwMCkgKyBtZWFuKGJfc2ltXzIwMDApYCkgLCBwb3IgbG8gcXVlIGhhc3RhIGVsIG1pbnV0byBwb2RlbW9zIHZlciBxdWUgdG9kbyB2YSBiaWVuIGVuY2FtaW5hZG8uIEFob3JhIHF1ZSB0ZW5lbW9zIGxhcyBkaXN0cmlidWNpb25lcyBhIHBvc3RlcmlvcmkgbWVkaWFudGUgdW4gYHFxcGxvdCgpYCB5IGVsIGBrcy50ZXN0KClgIGxhcyBwb2RlbW9zIGNvbXBhcmFyIGVuIGJhc2UgYSBsYSBkaXN0cmlidWNpw7NuIGVtcMOtcmljYSBvcmlnaW5hbDoNCg0KMS4gUGFyYSBlbCBwYXLDoW1ldHJvICRhJCwgdGVuZW1vcyBxdWUgZWwgYHFxcGxvdCgpYCBzZSBhY2VyY2EgbXVjaG8gYSBsYSBOb3JtYWwsIGNvbW8gc2UgcHVlZGUgdmVyIGVuIGVsIHNpZ3VpZW50ZSBncsOhZmljbzoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KZGF0b3Nfb3JkZW5hZG9zX2EgPC0gc29ydChhX3NpbV8yMDAwMCkNCmxhcmdvX2EgPC0gbGVuZ3RoKGRhdG9zX29yZGVuYWRvc19hKQ0KdmFsb3Jlc19hIDwtIGMoMTpsYXJnb19hKQ0KcGlfYSA8LSAodmFsb3Jlc19hLTAuNSkvbGFyZ29fYQ0KDQpxdWFudGlsZXNfbl9hID0gcW5vcm0oIHAgPSBwaV9hLCBtZWFuID0gKChzaWdtYV9iXjIrc2lnbWFeMikqbXVfYSArIHNpZ21hX2FeMiooWV9vYnMgLSBtdV9iKSkvKHNpZ21hX2FeMitzaWdtYV9iXjIrc2lnbWFeMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNxcnQoKHNpZ21hX2FeMiooc2lnbWFfYl4yK3NpZ21hXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSkpDQpwbG90KGRhdG9zX29yZGVuYWRvc19hLCBxdWFudGlsZXNfbl9hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KYGBgDQoNCnkgYW5hbGl6YW5kbyBlbCByZXN1bHRhZG8gcXVlIG5vcyBkYSBlbCBga3MudGVzdCgpYCBlcyBjbGFybyBxdWUgZWwgcGFyw6FtZXRybyBzaSBkaXN0cmlidXllIE5vcm1hbCwgeWEgcXVlIHN1IHZhbG9yIGVzIGRlbWFzaWFkbyBwZXF1ZcOxbywgY29tbyBzZSBtdWVzdHJhIGEgY29udGludWFjacOzbjoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iXjIrc2lnbWFeMikqbXVfYSArIHNpZ21hX2FeMiooWV9vYnMgLSBtdV9iKSkvKHNpZ21hX2FeMitzaWdtYV9iXjIrc2lnbWFeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FeMiooc2lnbWFfYl4yK3NpZ21hXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSkpDQpgYGANCg0KMi4gUGFyYSBlbCBwYXLDoW1ldHJvICRiJCwgdGVuZW1vcyBxdWUgZWwgYHFxcGxvdCgpYCBzZSBhY2VyY2EgbXVjaG8gYSBsYSBOb3JtYWw6DQoNCmBgYHtyIGVjaG89RkFMU0UsIG91dC53aWR0aD0gIjEwMCUiLCBmaWcuYWxpZ249J2NlbnRlcicgLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCmRhdG9zX29yZGVuYWRvc19iIDwtIHNvcnQoYl9zaW1fMjAwMDApDQpsYXJnb19iIDwtIGxlbmd0aChkYXRvc19vcmRlbmFkb3NfYikNCnZhbG9yZXNfYiA8LSBjKDE6bGFyZ29fYikNCnBpX2IgPC0gKHZhbG9yZXNfYi0wLjUpL2xhcmdvX2INCg0KcXVhbnRpbGVzX25fYiA9IHFub3JtKCBwID0gcGlfYiwgbWVhbiA9ICgoc2lnbWFfYV4yK3NpZ21hXjIpKm11X2IgKyBzaWdtYV9iXjIqKFlfb2JzIC0gbXVfYSkpLyhzaWdtYV9hXjIrc2lnbWFfYl4yK3NpZ21hXjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNxcnQoKHNpZ21hX2JeMiooc2lnbWFfYV4yK3NpZ21hXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSkpDQpwbG90KGRhdG9zX29yZGVuYWRvc19iLCBxdWFudGlsZXNfbl9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQpgYGANCg0KRXMgY2xhcm8gb2JzZXJ2YXIgcXVlIHByYWN0aWNhbWVudGUgdG9kb3MgbG9zIHZhbG9yZXMgc29uIGNlcmNhbm9zIGEgbGEgTm9ybWFsLCBudWV2YW1lbnRlIHNpIGFuYWxpemFtb3MgZGUgbWFuZXJhIGN1YW50aXRhdGl2YSB1c2FuZG8gZWwgYGtzLnRlc3QoKWAsIGVsIHZhbG9yIGVzIGRlbWFzaWFkbyBwZXF1ZcOxbyBsbyBxdWUgaGFjZSB2YWxpZGFyIG51ZXN0cm8gc3VwdWVzdG8uDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19iLCB5ID0gInBub3JtIiwgKChzaWdtYV9hXjIrc2lnbWFeMikqbXVfYiArIHNpZ21hX2JeMiooWV9vYnMgLSBtdV9hKSkvKHNpZ21hX2FeMitzaWdtYV9iXjIrc2lnbWFeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2JeMiooc2lnbWFfYV4yK3NpZ21hXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSkpDQpgYGANCg0KMy4gUGFyYSBlbCBwYXLDoW1ldHJvICRhK2IkLCB0ZW5lbW9zIHF1ZSBlbCBgcXFwbG90KClgIHNlIGFjZXJjYSBtdWNobyBhIGxhIE5vcm1hbCwgbXVjaG8gbcOhcyBxdWUgbG9zIHBhcsOhbWV0cm9zIGRlIGZvcm1hIGluZGl2aWR1YWwsIGVzdG8gdGFtYmllbiBzZSBkZWJlIHByaW5jaXBhbG1lbnRlIGEgcXVlIGVzIGVsIG3DrW5pbW8gc3VmaWNpZW50ZToNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KZGF0b3Nfb3JkZW5hZG9zX2FfYiA8LSBzb3J0KGFfYl9zaW1fMjAwMDApDQpsYXJnb19hX2IgPC0gbGVuZ3RoKGRhdG9zX29yZGVuYWRvc19hX2IpDQp2YWxvcmVzX2FfYiA8LSBjKDE6bGFyZ29fYV9iKQ0KcGlfYV9iIDwtICh2YWxvcmVzX2FfYi0wLjUpL2xhcmdvX2FfYg0KDQpxdWFudGlsZXNfbl9hX2IgPSBxbm9ybSggcCA9IHBpX2FfYiwgbWVhbiA9ICgobXVfYV4yK211X2JeMikqc2lnbWFeMiArIFlfb2JzKihzaWdtYV9hXjIgLSBzaWdtYV9iXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzcXJ0KChzaWdtYV4yKihzaWdtYV9hXjIrc2lnbWFfYl4yKSkvKHNpZ21hX2FeMitzaWdtYV9iXjIrc2lnbWFeMikpKQ0KcGxvdChkYXRvc19vcmRlbmFkb3NfYV9iLCBxdWFudGlsZXNfbl9hX2IseGxhYiA9ICJEYXRvcyBvcmRlbmFkb3MgZW4gYStiIix5bGFiID0gIkN1YW50aWxlcyBkZSBhK2IiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGErYiIsIGNvbCA9ICIjN2YwMGIyIikNCmFibGluZShhID0gMCwgYiA9IDEsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCmBgYA0KDQpOdWV2YW1lbnRlIGVuIGVzdGUgY2FzbyBsYSBncsOhZmljYSBlcyBwcmFjdGljYW1lbnRlIHBlcmZlY3RhLCB5IGVsIGBrcy50ZXN0KClgIG5vcyBjb25maXJtYSBlc3RhIGlkZWEgZGUgcXVlIGVsIHBhcsOhbWV0cm8gZGlzdHJpYnV5ZSBOb3JtYWwsIGRhZG8gc3UgdGFtYcOxbyBleHRyZW1hZGFtZW50ZSBwZXF1ZcOxbzoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19hX2IsIHkgPSAicG5vcm0iLCgobXVfYV4yK211X2JeMikqc2lnbWFeMiArIFlfb2JzKihzaWdtYV9hXjIgLSBzaWdtYV9iXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFeMiooc2lnbWFfYV4yK3NpZ21hX2JeMikpLyhzaWdtYV9hXjIrc2lnbWFfYl4yK3NpZ21hXjIpKSkNCg0KYGBgDQoNCkZpbmFsbWVudGUsIHNpIG5vcyBpbnRlcmVzYSByZXZpc2FyIHNpIGxhcyBkaXN0cmlidWNpb25lcyBhIHBvc3RlcmlvcmkgZGUgJChhfFlfMSwuLi4sWV9uKSQgeSBkZSAkKGJ8WV8xLC4uLixZX24pJCBzb24gZnVuY2nDs24gbyBzZSBwYXJlY2VuIGVuIGFsZ28gYSBsYSBkaXN0cmlidWNpw7NuIGEgcG9zdGVyaW9yaSBkZWwgcGFyw6FtZXRybyBtw61uaW1vIHN1ZmljaWVudGUgcG9kZW1vcyB1c2FyIHVuIGhpc3RvZ3JhbWEgcGFyYSByZXZpc2FyIHN1IGNvbXBvcnRhbWllbnRvOg0KDQpgYGB7ciBlY2hvID0gRkFMU0V9DQpwYXIobWZyb3c9YygxLDMpKQ0KaGlzdChhX3NpbV8yMDAwLCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYSIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBhIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYl9zaW1fMjAwMCwgZnJlcSA9IEYsIHhsYWIgPSAic2ltdWxhY2lvbmVzIGRlIGIiLHlsYWIgPSAiRGVuc2lkYWQiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbWEgZGUgYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpoaXN0KGFfYl9zaW1fMjAwMCwgZnJlcSA9IEYsIHhsYWIgPSAic2ltdWxhY2lvbmVzIGRlIGErYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBhK2IiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KYGBgDQoNCkNvbiBsbyBhbnRlcmlvciwgcG9kZW1vcyB2ZXIgcXVlIGVsIGFsZ29yaXRtbyBkZSBHaWJicyBhcGxpY2FkbyBhIHVuYSBjYWRlbmEgZGUgYHIgbmAgb2JzZXJ2YWNpb25lcywgY3V5YXMgbWVkaWFzIHNvbiAkMF9zJCB5IHN1cyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIHNvbiAkMV9zJCwgdG9kbyByZXN1bHRhIHBlcmZlY3RvLiBTaW4gZW1iYXJnbywgKirCv1F1w6kgb2N1cnJlIGN1YW5kbyBsYSB2YXJpYW56YSBjb21pZW56YSBhIGF1bWVudGFyPyoqLiBBIGNvbnRpbnVhY2nDs24sIGFtcGxpYXJlbW9zIGVsIGFuw6FsaXNpcyBwYXJhIGRpc3RpbnRvcyBjYXNvcyBkb25kZSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgY29taWVuemEgYSBjYW1iaWFyIChwYXJhIHJldmlzYXIgdG9kb3MgbG9zIGNhc29zIHZlciBBbmV4b3MpOg0KDQojIyMgQ2FzbyAxOiBzaWdtYV9hID4gc2lnbWFfYiA+IHNpZ21hDQoNCkVuIGVzdGUgY2FzbyBkZWZpbmltb3MsIGxvcyB2YWxvcmVzIGRlIHNpZ21hIGNvbW8gOg0KDQpgYGB7cn0NCnNpZ21hX2FfY2FzbzEgPSAxMDAwMA0Kc2lnbWFfYl9jYXNvMSA9IDUwDQpzaWdtYV9jYXNvMSA9IDEgDQpgYGANCg0KRWwgYHRyYWNlcGxvdCgpYCBkZSBkaWNobyBjYXNvLCBub3MgbXVlc3RyYSBxdWUgZWwgcGFyw6FtZXRybyBkZSAkYSQgdGllbmUgbWF5b3IgZGlzcGVyc2nDs24gcXVlIGVsIGRlICRiJCwgcG9yIGxvIHF1ZSBhbCBmaW5hbCBlbCBwYXLDoW1ldHJvIG3DrW5pbW8gc3VmaWNpZW50ZSB0aWVuZGUgYSBkaXNwZXJzYXJzZSBtdWNobywgc2luIGVtYmFyZ28gc2kgcmV2aXNhbW9zIGxvcyBgcXFwbG90KClgLCB0YW50byBlbCBkZSAkYSQgY29tbyAkYiQgbm8gc29uIG11eSBhZGVjdWFkb3MsIHNpbiBlbWJhcmdvIGVsIG3DrW5pbW8gc3VmaWVudGUgJGErYiQgdGllbmRlIGEgc2VyIG11Y2hvIG3DoXMgY29ycmVjdG8geSBwYXJlY2Vyc2UgYSB1bmEgTm9ybWFsLg0KDQojIyMgQ2FzbyAzOiBzaWdtYV9iID4gc2lnbWFfYSA+IHNpZ21hDQoNCkVuIGVzdGUgY2FzbyBkZWZpbmltb3MsIGxvcyB2YWxvcmVzIGRlIHNpZ21hIGNvbW8gOg0KDQpgYGB7cn0NCnNpZ21hX2FfY2FzbzEgPSAxMDAwMA0Kc2lnbWFfYl9jYXNvMSA9IDUwDQpzaWdtYV9jYXNvMSA9IDEgDQpgYGANCg0KRWwgYHRyYWNlcGxvdCgpYCBkZSBkaWNobyBjYXNvLCBub3MgbXVlc3RyYSBxdWUgZWwgcGFyw6FtZXRybyBkZSAkYSQgdGllbmUgbWF5b3IgZGlzcGVyc2nDs24gcXVlIGVsIGRlICRiJCwgcG9yIGxvIHF1ZSBhbCBmaW5hbCBlbCBwYXLDoW1ldHJvIG3DrW5pbW8gc3VmaWNpZW50ZSB0aWVuZGUgYSBkaXNwZXJzYXJzZSBtdWNobywgc2luIGVtYmFyZ28gc2kgcmV2aXNhbW9zIGxvcyBgcXFwbG90KClgLCB0YW50byBlbCBkZSAkYSQgY29tbyAkYiQgbm8gc29uIG11eSBhZGVjdWFkb3MsIHNpbiBlbWJhcmdvIGVsIG3DrW5pbW8gc3VmaWVudGUgJGErYiQgdGllbmRlIGEgc2VyIG11Y2hvIG3DoXMgY29ycmVjdG8geSBwYXJlY2Vyc2UgYSB1bmEgTm9ybWFsLg0KDQojIyMgQ2FzbyAyOiBzaWdtYSA+IHNpZ21hX2IgPiBzaWdtYV9hDQoNCkVuIGVzdGUgY2FzbyBkZWZpbmltb3MsIGxvcyB2YWxvcmVzIGRlIHNpZ21hIGNvbW8gOg0KDQpgYGB7cn0NCnNpZ21hX2FfY2FzbzIgPSAxDQpzaWdtYV9iX2Nhc28yID0gNTANCnNpZ21hX2Nhc28yID0gMTAwMDANCmBgYA0KDQpFbCBgdHJhY2VwbG90KClgIGRlIGRpY2hvIGNhc28sIG5vcyBtdWVzdHJhIHF1ZSBlbCBwYXLDoW1ldHJvIGRlICRhJCBlcyBlbCBtZW5vcyBkaXNwZXJzbywgbWllbnRyYXMgcXVlIGVsIGRlICRiJCBlcyBtdXkgZGlzcGVyc28sIHBvciBsbyBxdWUgYWwgZmluYWwgZWwgcGFyw6FtZXRybyBtw61uaW1vIHN1ZmljaWVudGUgdGllbmRlIGEgZGlzcGVyc2Fyc2UgbXVjaG8sIHNpbiBlbWJhcmdvIHNpIHJldmlzYW1vcyBsb3MgYHFxcGxvdCgpYCwgdGFudG8gZWwgZGUgJGEkLCBjb21vIGVsIGRlICRiJCB5IGNvbW8gZWwgbcOtbmltbyBzdWZpZW50ZSAkYStiJCwgbm8gc2UgYWNlcmNhbiBhbCB2YWxvciBkZSBsYSBOb3JtYWwuIEFxdcOtLCB0ZW5lbW9zIHVuICBjYXNvIHBhcnRpY3VsYXIgZW4gZWwgcXVlIGRvbmRlIGxhIGRpc3BlcnNpw7NuIGRlIGxhcyBvYnNlcnZhY2lvbmVzIGhhY2UgcXVlIGVsIGFsZ29yaXRtbyBkZSBHaWJicyBubyBzaW11bGEgbG9zIHZhbG9yZXMgZGUgbWFuZXJhIGNvcnJlY3RhLiBBIHBlc2FyIGRlIHF1ZSBlbCB2YWxvciBkZWwgYGtzLnRlc3QoKWAgbm9zIGRhIG11eSBwZXF1ZcOxbywgbG9zIHZhbG9yZXMgZ3LDoWZpY29zIG5vcyBkZW11ZXN0cmFuIHF1ZSBubyBlcyBjb3JyZWN0by4gRXN0byBvY3VycmUgZGUgbWFuZXJhIHNpbWlsYXIgZW4gZWwgY2FzbyA0KHJldmlzYXIgQW5leG9zKS4NCg0KIyMjIENhc28gNTogc2lnbWFfYSA+IHNpZ21hX2IgPSBzaWdtYSB5IENhc28gNjogc2lnbWFfYiA+IHNpZ21hX2EgPSBzaWdtYQ0KDQpFbiBlc3RlIGNhc28gZGVmaW5pbW9zLCBsb3MgdmFsb3JlcyBkZSBzaWdtYSBjb21vIDoNCg0KYGBge3J9DQojIGNhc28gNQ0KDQpzaWdtYV9hX2Nhc281ID0gMTAwMDANCnNpZ21hX2JfY2FzbzUgPSAzDQpzaWdtYV9jYXNvNSA9IDMNCg0KIyBjYXNvIDYNCg0Kc2lnbWFfYV9jYXNvNiA9IDMNCnNpZ21hX2JfY2FzbzYgPSAxMDAwMA0Kc2lnbWFfY2FzbzYgPSAzDQoNCmBgYA0KDQpBcXXDrSBwb2RlbW9zIHZlciBxdWUgY3VhbmRvIGxhIHZhcmlhbnphIGRlIGFsZ3VubyBkZSBsb3MgcGFyw6FtZXRyb3MgZXMgZGVtYXNpYWRvIGdyYW5kZSBsYSBjb252ZXJnZW5jaWEgZXMgbXV5IGNvbXBsaWNhZGEsIHRhbnRvIGRlbCBwYXLDoW1ldHJvIGNvcnJlc3BvbmRpZW50ZSBjb21vIGxhIGRlbCBtw61uaW1vIHN1ZmljaWVudGUsIGVzdG8gc2UgcHVlZGUgdmVyIGNsYXJhbWVudGUgZW4gbG9zIGBxcXBsb3RzKClgIGRlIGRpY2hvcyBjYXNvcy4gUG9yIGxvIHF1ZSBwb2RlbW9zIHZlciBxdWUgZW4gY2Fzb3MgY29tbyBlc3RlIGxhIGNvbnZlcmdlbmNpYSBzZSBsZSBjb21wbGljYSBhbCBhbGdvcml0bW8gZGUgR2liYnMuDQoNCiMjIyBDYXNvIDc6IHNpZ21hID4gc2lnbWFfYSA9IHNpZ21hX2INCg0KRW4gZXN0ZSBjYXNvIGRlZmluaW1vcywgbG9zIHZhbG9yZXMgZGUgc2lnbWEgY29tbyA6DQoNCmBgYHtyfQ0Kc2lnbWFfYV9jYXNvNyA9IDEgDQpzaWdtYV9iX2Nhc283ID0gMQ0Kc2lnbWFfY2FzbzcgPSAxMDAwMCANCmBgYA0KDQpBcXXDrSB0ZW5lbW9zIG90cm8gY2FzbyBpbnRlcmVzYW50ZSwgeWEgcXVlIGFsIGRlZmluaXIgbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlIGxhcyBvYnNlcnZhY2lvbmVzIHRhbiBhbHRhLCBoYWNlIHF1ZSBuaW5nw7puIHBhcsOhbWV0cm8gY29udmVyamEgZGUgbWFuZXJhIGNvcnJlY3RhLCBhbGdvIHNpbWlsYXIgYWwgY2FzbyAyIG8gY2FzbyA0LCB5IGVzdG8gc2UgYXByZWNpYSBjb25zaWRlcmFibGVtZW50ZSBlbiBlbCBgcXFwbG90KClgIGRlIGRpY2hvIHByb2JsZW1hLg0KDQojIyMgQ2FzbyA4OiBzaWdtYV9hID0gc2lnbWFfYiA+IHNpZ21hDQoNCkVuIGVzdGUgY2FzbyBkZWZpbmltb3MsIGxvcyB2YWxvcmVzIGRlIHNpZ21hIGNvbW8gOg0KDQpgYGB7cn0NCnNpZ21hX2FfY2FzbzggPSAxMDAwMCANCnNpZ21hX2JfY2FzbzggPSAxMDAwMA0Kc2lnbWFfY2FzbzggPSAxIA0KYGBgDQoNCkZpbmFsbWVudGUsIGVuIGVzdGUgw7psdGltbyBjYXNvIHF1ZSBzZSBoYSBkZWNpZGlkbyBhbmFsaXphciwgcG9kZW1vcyBlcyBjbGFybyB2ZXIgcXVlIGEgcGVzYXIgcXVlIGxhIGRpc3BlcnNpw7NuIGRlIGxvcyBwYXLDoW1ldHJvcyBlcyBhbHRpc2ltYSwgc2kgZWwgZGUgbGFzIG9ic2VydmFjaW9uZXMgZXMgYmFqbywgcG9kZW1vcyBhc2VndXJhciB1bmEgYnVlbmEgY29udmVyZ2VuY2lhIGRlbCBhbGdvcml0bW8uDQoNCiMjIFJlZmxleGnDs24gZGUgcHJlZ3VudGFzDQoNClNlZ8O6biBsbyBleHB1ZXN0byBhIGxvIGxhcmdvIGRlIGVzdGUgaW5mb3JtZSwgeWEgbm9zIGVuY29udHJhbW9zIGNvbiBlbCBjb25vY2ltaWVudG8gc3VmaWNpZW50ZSBwYXJhIGRhciB1bmEgcmVzcHVlc3RhIG11Y2hvIG3DoXMgY2xhcmEgZGUgbG8gc29saWNpdGFkby4NCg0KTGEgcHJpbWVyYSBwcmVndW50YSBhIGFuYWxpemFyIGVzOiAqKsK/RXMgY29ycmVjdG8gYWZpcm1hciBxdWUgbGEgY2FkZW5hIGRlIE1hcmtvdiBhc29jaWFkYSBhbCBwYXLDoW1ldHJvIG3DrW5pbW8gc3VmaWNpZW50ZSBjb252ZXJnZSDigJxtw6FzIGbDoWNpbG1lbnRl4oCdIHF1ZSBsYXMgY2FkZW5hcyBkZSBNYXJrb3YgYXNvY2lhZGFzIGEgbG9zIHBhcsOhbWV0cm9zIGEgeSBiPyoqLCB5IGJ1ZW5vIGNvbW8gbG8gcmV2aXNhbW9zIGVuIGxvcyBgdHJhY2VwbG90KClgIGRlIGxvcyBkaXN0aW50b3MgY2Fzb3MsIGxhIGNvbnZlcmdlbmNpYSBlcyBhbGdvIHF1ZSBzaWVtcHJlIHRyYXRhIGRlIGhhY2VyIGVsIGFsZ290aXRtbyBkZWwgR2liYnMsIHNpbiBlbWJhcmdvLCBwb2RlbW9zIG5vdGFyIGNsYXJhbWVudGUgcXVlIGN1YW5kbyBsYSB2YXJpYW56YSBkZSBhbGd1bm8gZGUgbG9zIHBhcsOhbWV0cm9zIG8gZGUgbGFzIG9ic2VydmFjaW9uZXMgYXVtZW50YSBkZSBtYW5lcmEgY29uc2lkZXJhYmxlIGhhY2UgcXVlIGxhIGNvbnZlcmdlbmNpYSBzZWEgbcOhcyBkaWbDrWNpbCBkZSBvY3VycmlyLCBoYWNpZW5kbyBxdWUgZWwgcGFyw6FtZXRybyBsbGVndWUgYSBvc2NpbGFyIGRlIG1hbmVyYSBiYXN0YW50ZSBydWlkb3NhLCBubyBvYnN0YW50ZSwgYSBwZXNhciBkZSBxdWUgYSAkYSQgeSBhICRiJCBsZXMgY3Vlc3RlLCBzaWVtcHJlIHBhcmEgZWwgcGFyw6FtZXRybyBtw61uaW1vIHN1ZmljaWVudGUgc2Vyw6EgbcOhcyBzZW5jaWxsby4NCg0KTHVlZ28sIHNpIHJlc3BvbmRlbW9zIGEgbGEgc2VndW5kYSBwcmVndW50YSBxdWUgZXM6ICoqwr9FbiBxdcOpIG1lZGlkYSBlbCBHaWJicyBzYW1wbGluZyBwZXJtaXRlIGNvbnN0YXRhciBxdWUgbGEgZGlzdHJpYnVjacOzbiBhIHBvc3RlcmlvcmkgZGUgdW4gcMOhcmFtZXRybyBxdWUgbm8gZXMgZWwgbcOtbmltbyBzdWZpY2llbnRlIChwb3IgZWplbXBsbywgYSkgc2UgcmVkdWNlIGEgbGEgZGlzdHJpYnVjacOzbiBhIHBvc3RlcmlvcmkgZGVsIHDDoXJhbWV0cm8gbcOtbmltbyBzdWZpY2llbnRlPyoqIGVzdMOhIHByZWd1bnRhIGFsIGlndWFsIHF1ZSBsYSBhbnRlcmlvciBlc3RhIGFsdGFtZW50ZSByZWxhY2lvbmFkYSBhIGxhIGFudGVyaW9yLCB5YSBxdWUsIGFsIHNhYmVyIHF1ZSBlbCBhbGdvcml0bW8gDQoNCiMjIENvbmNsdXNpw7NuDQoNCkVuIGNvbmNsdXNpw7NuIGRlIHRvZG8gZXN0ZSB0cmFiYWpvLCBwb2RlbW9zIGRlY2lyIHF1ZSBlbCBhbGdvcnRpbW8gZGUgR2liYnMgZXMgdW5hIGhlcnJhbWllbnRhIGFsdGFtZW50ZSBwb2Rlcm9zYSwgeWEgcXVlLCBub3MgcGVybWl0ZSBlbmNvbnRyYXIgbGEgZm9ybWEgZGUgbGFzIGRpc3RyaWJ1Y2lvbmVzIGEgcG9zdGVyaW9yaSBjdWFuZG8gZXMgbXV5IGNvbXBsZWpvIGhhY2VybG8gYSBtYW5vLiBTaW4gZW1iYXJnbywgZXMgbmVjZXNhcmlvIHRlbmVyIHByZXNlbnRlIHF1ZSBjdWFuZG8gc2UgYW5hbGl6YSBwcm9ibGVtYXMgZGUgZXN0ZSBlc3RpbG8sIGFudGVzIGRlIGRldGVybWluYXIgbGEgY29udmVnZW5jaWEgZGVsIGFsZ29yaXRtbyBvIG5vLCBlcyBtdXkgaW1wb3J0YW50ZSBjb25vY2VyIGxhIG5hdHVyYWxlemEgZGUgbnVlc3Ryb3MgZGF0b3MsIHBhcmEgc2FiZXIgc2kgYWZlY3RhcsOhIG8gbm8gZW4gbGEgY29udmVyZ2VuY2lhIGRlbCBhbGdvcml0bW8uIE90cm8gcHVudG8gaW1wb3J0YW50ZSBhIGRlc3RhY2FyIGFxdcOtIGVzIHF1ZSBhIHByaW9yaSBubyBpbXBvcnRhIGNvbW8gc2VhIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIHBhcsOhbWV0cm9zLCBzaW5vIHF1ZSBwYXJhIHRvbWFyIHVuIGp1aWNpbyBlcyBtdXkgaW1wb3J0YW50ZSBxdWUgZWwgcGFyw6FtZXRybyBzZWEgbcOtbmltbyBzdWZpY2llbnRlLCB5YSBxdWUsIGRlIGVzdGEgbWFuZXJhIGFzZWd1cmFtb3MgbGEgY29udmVyZ2VuY2lhIGRlbCBhbGdvcml0bW8uDQoNCiMjIFJlZmVyZW5jaWFzDQoNCjEuIEhvZmYsIFAuIEQuICgyMDA5KS4gKkEgRmlyc3QgQ291cnNlIGluIEJheWVzaWFuIFN0YXRpc3RpY2FsIE1ldGhvZHMqLiBTcHJpbmdlci4NCg0KMi4gTWF0ZXJpYWwgZXhwbGljYWRvIGVuIGNsYXNlcy4NCg0KIyMgQW5leG9zDQoNCiMjIyBDYXNvIDE6IHNpZ21hX2EgPiBzaWdtYV9iID4gc2lnbWENCg0KYGBge3IgZmlnLmNhcD0gIkNhc28gMTogc2lnbWFfYSA+IHNpZ21hX2IgPiBzaWdtYSIgLGVjaG89RkFMU0UsIG91dC53aWR0aD0gIjEwMCUiLCBmaWcuYWxpZ249J2NlbnRlcicgLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCnBhcihtZnJvdyA9IGMoMSwzKSkNCg0KdmFsb3Jlc19jYXNvMSA9IGMoYV9zaW1fMjAwMF9jYXNvMSxiX3NpbV8yMDAwX2Nhc28xLGFfYl9zaW1fMjAwMF9jYXNvMSkNCg0KcGxvdChhX3NpbV8yMDAwX2Nhc28xLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzEpLG1heCh2YWxvcmVzX2Nhc28xKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QgKGF8WV9pLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQpwbG90KGJfc2ltXzIwMDBfY2FzbzEsIHR5cGU9ImwiLCB5bGltID0gYyhtaW4odmFsb3Jlc19jYXNvMSksbWF4KHZhbG9yZXNfY2FzbzEpKSwgeGxhYiA9ICJDYW50aWRhZCBkZSBzaW11bGFjaW9uZXMiLHlsYWIgPSAiU2ltdWxhY2lvbmVzIGRlIEdpYmJzIiwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24ocGFzdGUoIlRyYWNlcGxvdChifFlfaSxhKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChhX2Jfc2ltXzIwMDBfY2FzbzEsIHR5cGU9ImwiLCB5bGltID0gYyhtaW4odmFsb3Jlc19jYXNvMSksbWF4KHZhbG9yZXNfY2FzbzEpKSwgeGxhYiA9ICJDYW50aWRhZCBkZSBzaW11bGFjaW9uZXMiLHlsYWIgPSAiU2ltdWxhY2lvbmVzIGRlIEdpYmJzIiwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24ocGFzdGUoIlRyYWNlcGxvdChhK2J8WV9pLGEsYilcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc28xX2EsIHF1YW50aWxlc19uX2Nhc28xX2EsIHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGEiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGEiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGEiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc28xX2IsIHF1YW50aWxlc19uX2Nhc28xX2IseGxhYiA9ICJEYXRvcyBvcmRlbmFkb3MgZW4gYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYiIsbWFpbiA9ICJxcXBsb3QgZGVsIHBhcsOhbWV0cm8gYiIsIGNvbCA9ICIjN2YwMGIyIikNCmFibGluZShhID0gMCwgYiA9IDEsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCg0KcGxvdChkYXRvc19vcmRlbmFkb3NfY2FzbzFfYV9iLCBxdWFudGlsZXNfbl9jYXNvMV9hX2IseGxhYiA9ICJEYXRvcyBvcmRlbmFkb3MgZW4gYStiIix5bGFiID0gIkN1YW50aWxlcyBkZSBhK2IiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGErYiIsIGNvbCA9ICIjN2YwMGIyIikNCmFibGluZShhID0gMCwgYiA9IDEsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG91dC53aWR0aD0gIjEwMCUiLCBmaWcuYWxpZ249J2NlbnRlcicgLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc28xX2EsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2JfY2FzbzFeMitzaWdtYV9jYXNvMV4yKSptdV9hICsgc2lnbWFfYV9jYXNvMV4yKihZX29ic19jYXNvMSAtIG11X2IpKS8oc2lnbWFfYV9jYXNvMV4yK3NpZ21hX2JfY2FzbzFeMitzaWdtYV9jYXNvMV4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYV9jYXNvMV4yKihzaWdtYV9iX2Nhc28xXjIrc2lnbWFfY2FzbzFeMikpLyhzaWdtYV9hX2Nhc28xXjIrc2lnbWFfYl9jYXNvMV4yK3NpZ21hX2Nhc28xXjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzFfYiwgeSA9ICJwbm9ybSIsICgoc2lnbWFfYV9jYXNvMV4yK3NpZ21hX2Nhc28xXjIpKm11X2IgKyBzaWdtYV9iX2Nhc28xXjIqKFlfb2JzX2Nhc28xIC0gbXVfYSkpLyhzaWdtYV9hX2Nhc28xXjIrc2lnbWFfYl9jYXNvMV4yK3NpZ21hX2Nhc28xXjIpLA0KICAgICAgICBzcXJ0KChzaWdtYV9iX2Nhc28xXjIqKHNpZ21hX2FfY2FzbzFeMitzaWdtYV9jYXNvMV4yKSkvKHNpZ21hX2FfY2FzbzFeMitzaWdtYV9iX2Nhc28xXjIrc2lnbWFfY2FzbzFeMikpKQ0KDQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvMV9hX2IsIHkgPSAicG5vcm0iLCgobXVfYV4yK211X2JeMikqc2lnbWFeMiArIFlfb2JzX2Nhc28xKihzaWdtYV9hX2Nhc28xXjIgLSBzaWdtYV9iX2Nhc28xXjIpKS8oc2lnbWFfYV9jYXNvMV4yK3NpZ21hX2JfY2FzbzFeMitzaWdtYV9jYXNvMV4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfY2FzbzFeMiooc2lnbWFfYV9jYXNvMV4yK3NpZ21hX2JfY2FzbzFeMikpLyhzaWdtYV9hX2Nhc28xXjIrc2lnbWFfYl9jYXNvMV4yK3NpZ21hX2Nhc28xXjIpKSkNCg0KDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFfQ0KcGFyKG1mcm93PWMoMSwzKSkNCmhpc3QoYV9zaW1fMjAwMF9jYXNvMSwgZnJlcSA9IEYsIHhsYWIgPSAic2ltdWxhY2lvbmVzIGRlIGEiLHlsYWIgPSAiRGVuc2lkYWQiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbWEgZGUgYSIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpoaXN0KGJfc2ltXzIwMDBfY2FzbzEsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGIiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChhX2Jfc2ltXzIwMDBfY2FzbzEsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhK2IiLHlsYWIgPSAiRGVuc2lkYWQiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbWEgZGUgYStiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmBgYA0KDQojIyMgQ2FzbyAyOiBzaWdtYSA+IHNpZ21hX2IgPiBzaWdtYV9hDQoNCmBgYHtyIGZpZy5jYXA9ICJDYXNvIDI6IHNpZ21hID4gc2lnbWFfYiA+IHNpZ21hX2EiICxlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzIgPSBjKGFfc2ltXzIwMDBfY2FzbzIsYl9zaW1fMjAwMF9jYXNvMixhX2Jfc2ltXzIwMDBfY2FzbzIpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvMiwgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc28yKSxtYXgodmFsb3Jlc19jYXNvMikpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc28yLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzIpLG1heCh2YWxvcmVzX2Nhc28yKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc28yLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzIpLG1heCh2YWxvcmVzX2Nhc28yKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvMl9hLCBxdWFudGlsZXNfbl9jYXNvMl9hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvMl9iLCBxdWFudGlsZXNfbl9jYXNvMl9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc28yX2FfYiwgcXVhbnRpbGVzX25fY2FzbzJfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvMl9hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc28yXjIrc2lnbWFfY2FzbzJeMikqbXVfYSArIHNpZ21hX2FfY2FzbzJeMiooWV9vYnNfY2FzbzIgLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzJeMitzaWdtYV9iX2Nhc28yXjIrc2lnbWFfY2FzbzJeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzJeMiooc2lnbWFfYl9jYXNvMl4yK3NpZ21hX2Nhc28yXjIpKS8oc2lnbWFfYV9jYXNvMl4yK3NpZ21hX2JfY2FzbzJeMitzaWdtYV9jYXNvMl4yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc28yX2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzJeMitzaWdtYV9jYXNvMl4yKSptdV9iICsgc2lnbWFfYl9jYXNvMl4yKihZX29ic19jYXNvMiAtIG11X2EpKS8oc2lnbWFfYV9jYXNvMl4yK3NpZ21hX2JfY2FzbzJeMitzaWdtYV9jYXNvMl4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvMl4yKihzaWdtYV9hX2Nhc28yXjIrc2lnbWFfY2FzbzJeMikpLyhzaWdtYV9hX2Nhc28yXjIrc2lnbWFfYl9jYXNvMl4yK3NpZ21hX2Nhc28yXjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzJfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvMiooc2lnbWFfYV9jYXNvMl4yIC0gc2lnbWFfYl9jYXNvMl4yKSkvKHNpZ21hX2FfY2FzbzJeMitzaWdtYV9iX2Nhc28yXjIrc2lnbWFfY2FzbzJeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc28yXjIqKHNpZ21hX2FfY2FzbzJeMitzaWdtYV9iX2Nhc28yXjIpKS8oc2lnbWFfYV9jYXNvMl4yK3NpZ21hX2JfY2FzbzJeMitzaWdtYV9jYXNvMl4yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzIsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc28yLCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc28yLCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KIyMjIENhc28gMzogc2lnbWFfYiA+IHNpZ21hX2EgPiBzaWdtYQ0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyAzOiBzaWdtYV9iID4gc2lnbWFfYSA+IHNpZ21hIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzMgPSBjKGFfc2ltXzIwMDBfY2FzbzMsYl9zaW1fMjAwMF9jYXNvMyxhX2Jfc2ltXzIwMDBfY2FzbzMpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvMywgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc28zKSxtYXgodmFsb3Jlc19jYXNvMykpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc28zLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzMpLG1heCh2YWxvcmVzX2Nhc28zKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc28zLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzMpLG1heCh2YWxvcmVzX2Nhc28zKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvM19hLCBxdWFudGlsZXNfbl9jYXNvM19hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvM19iLCBxdWFudGlsZXNfbl9jYXNvM19iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc28zX2FfYiwgcXVhbnRpbGVzX25fY2FzbzNfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvM19hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc28zXjIrc2lnbWFfY2FzbzNeMikqbXVfYSArIHNpZ21hX2FfY2FzbzNeMiooWV9vYnNfY2FzbzMgLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzNeMitzaWdtYV9iX2Nhc28zXjIrc2lnbWFfY2FzbzNeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzNeMiooc2lnbWFfYl9jYXNvM14yK3NpZ21hX2Nhc28zXjIpKS8oc2lnbWFfYV9jYXNvM14yK3NpZ21hX2JfY2FzbzNeMitzaWdtYV9jYXNvM14yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc28zX2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzNeMitzaWdtYV9jYXNvM14yKSptdV9iICsgc2lnbWFfYl9jYXNvM14yKihZX29ic19jYXNvMyAtIG11X2EpKS8oc2lnbWFfYV9jYXNvM14yK3NpZ21hX2JfY2FzbzNeMitzaWdtYV9jYXNvM14yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvM14yKihzaWdtYV9hX2Nhc28zXjIrc2lnbWFfY2FzbzNeMikpLyhzaWdtYV9hX2Nhc28zXjIrc2lnbWFfYl9jYXNvM14yK3NpZ21hX2Nhc28zXjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzNfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvMyooc2lnbWFfYV9jYXNvM14yIC0gc2lnbWFfYl9jYXNvM14yKSkvKHNpZ21hX2FfY2FzbzNeMitzaWdtYV9iX2Nhc28zXjIrc2lnbWFfY2FzbzNeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc28zXjIqKHNpZ21hX2FfY2FzbzNeMitzaWdtYV9iX2Nhc28zXjIpKS8oc2lnbWFfYV9jYXNvM14yK3NpZ21hX2JfY2FzbzNeMitzaWdtYV9jYXNvM14yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzMsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc28zLCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc28zLCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KIyMjIENhc28gNDogc2lnbWEgPiBzaWdtYV9hID4gc2lnbWFfYg0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyA0OiBzaWdtYSA+IHNpZ21hX2EgPiBzaWdtYV9iIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzQgPSBjKGFfc2ltXzIwMDBfY2FzbzQsYl9zaW1fMjAwMF9jYXNvNCxhX2Jfc2ltXzIwMDBfY2FzbzQpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvNCwgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc280KSxtYXgodmFsb3Jlc19jYXNvNCkpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc280LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzQpLG1heCh2YWxvcmVzX2Nhc280KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc280LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzQpLG1heCh2YWxvcmVzX2Nhc280KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG91dC53aWR0aD0gIjEwMCUiLCBmaWcuYWxpZ249J2NlbnRlcicgLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCnBhcihtZnJvdyA9IGMoMSwzKSkNCg0KcGxvdChkYXRvc19vcmRlbmFkb3NfY2FzbzRfYSwgcXVhbnRpbGVzX25fY2FzbzRfYSwgeGxhYiA9ICJEYXRvcyBvcmRlbmFkb3MgZW4gYSIseWxhYiA9ICJDdWFudGlsZXMgZGUgYSIsbWFpbiA9ICJxcXBsb3QgZGVsIHBhcsOhbWV0cm8gYSIsIGNvbCA9ICIjN2YwMGIyIikNCmFibGluZShhID0gMCwgYiA9IDEsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCg0KcGxvdChkYXRvc19vcmRlbmFkb3NfY2FzbzRfYiwgcXVhbnRpbGVzX25fY2FzbzRfYix4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBiIix5bGFiID0gIkN1YW50aWxlcyBkZSBiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBiIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvNF9hX2IsIHF1YW50aWxlc19uX2Nhc280X2FfYix4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhK2IiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGErYiIsbWFpbiA9ICJxcXBsb3QgZGVsIHBhcsOhbWV0cm8gYStiIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzRfYSwgeSA9ICJwbm9ybSIsICgoc2lnbWFfYl9jYXNvNF4yK3NpZ21hX2Nhc280XjIpKm11X2EgKyBzaWdtYV9hX2Nhc280XjIqKFlfb2JzX2Nhc280IC0gbXVfYikpLyhzaWdtYV9hX2Nhc280XjIrc2lnbWFfYl9jYXNvNF4yK3NpZ21hX2Nhc280XjIpLA0KICAgICAgICBzcXJ0KChzaWdtYV9hX2Nhc280XjIqKHNpZ21hX2JfY2FzbzReMitzaWdtYV9jYXNvNF4yKSkvKHNpZ21hX2FfY2FzbzReMitzaWdtYV9iX2Nhc280XjIrc2lnbWFfY2FzbzReMikpKQ0KDQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvNF9iLCB5ID0gInBub3JtIiwgKChzaWdtYV9hX2Nhc280XjIrc2lnbWFfY2FzbzReMikqbXVfYiArIHNpZ21hX2JfY2FzbzReMiooWV9vYnNfY2FzbzQgLSBtdV9hKSkvKHNpZ21hX2FfY2FzbzReMitzaWdtYV9iX2Nhc280XjIrc2lnbWFfY2FzbzReMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2JfY2FzbzReMiooc2lnbWFfYV9jYXNvNF4yK3NpZ21hX2Nhc280XjIpKS8oc2lnbWFfYV9jYXNvNF4yK3NpZ21hX2JfY2FzbzReMitzaWdtYV9jYXNvNF4yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc280X2FfYiwgeSA9ICJwbm9ybSIsKChtdV9hXjIrbXVfYl4yKSpzaWdtYV4yICsgWV9vYnNfY2FzbzQqKHNpZ21hX2FfY2FzbzReMiAtIHNpZ21hX2JfY2FzbzReMikpLyhzaWdtYV9hX2Nhc280XjIrc2lnbWFfYl9jYXNvNF4yK3NpZ21hX2Nhc280XjIpLA0KICAgICAgICBzcXJ0KChzaWdtYV9jYXNvNF4yKihzaWdtYV9hX2Nhc280XjIrc2lnbWFfYl9jYXNvNF4yKSkvKHNpZ21hX2FfY2FzbzReMitzaWdtYV9iX2Nhc280XjIrc2lnbWFfY2FzbzReMikpKQ0KDQoNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0V9DQpwYXIobWZyb3c9YygxLDMpKQ0KaGlzdChhX3NpbV8yMDAwX2Nhc280LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYSIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBhIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYl9zaW1fMjAwMF9jYXNvNCwgZnJlcSA9IEYsIHhsYWIgPSAic2ltdWxhY2lvbmVzIGRlIGIiLHlsYWIgPSAiRGVuc2lkYWQiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbWEgZGUgYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpoaXN0KGFfYl9zaW1fMjAwMF9jYXNvNCwgZnJlcSA9IEYsIHhsYWIgPSAic2ltdWxhY2lvbmVzIGRlIGErYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBhK2IiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KYGBgDQoNCg0KIyMjIENhc28gNTogc2lnbWFfYSA+IHNpZ21hX2IgPSBzaWdtYQ0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyA1OiBzaWdtYV9hID4gc2lnbWFfYiA9IHNpZ21hIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzUgPSBjKGFfc2ltXzIwMDBfY2FzbzUsYl9zaW1fMjAwMF9jYXNvNSxhX2Jfc2ltXzIwMDBfY2FzbzUpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvNSwgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc281KSxtYXgodmFsb3Jlc19jYXNvNSkpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc281LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzUpLG1heCh2YWxvcmVzX2Nhc281KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc281LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzUpLG1heCh2YWxvcmVzX2Nhc281KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvNV9hLCBxdWFudGlsZXNfbl9jYXNvNV9hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvNV9iLCBxdWFudGlsZXNfbl9jYXNvNV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc281X2FfYiwgcXVhbnRpbGVzX25fY2FzbzVfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvNV9hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc281XjIrc2lnbWFfY2FzbzVeMikqbXVfYSArIHNpZ21hX2FfY2FzbzVeMiooWV9vYnNfY2FzbzUgLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzVeMitzaWdtYV9iX2Nhc281XjIrc2lnbWFfY2FzbzVeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzVeMiooc2lnbWFfYl9jYXNvNV4yK3NpZ21hX2Nhc281XjIpKS8oc2lnbWFfYV9jYXNvNV4yK3NpZ21hX2JfY2FzbzVeMitzaWdtYV9jYXNvNV4yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc281X2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzVeMitzaWdtYV9jYXNvNV4yKSptdV9iICsgc2lnbWFfYl9jYXNvNV4yKihZX29ic19jYXNvNSAtIG11X2EpKS8oc2lnbWFfYV9jYXNvNV4yK3NpZ21hX2JfY2FzbzVeMitzaWdtYV9jYXNvNV4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvNV4yKihzaWdtYV9hX2Nhc281XjIrc2lnbWFfY2FzbzVeMikpLyhzaWdtYV9hX2Nhc281XjIrc2lnbWFfYl9jYXNvNV4yK3NpZ21hX2Nhc281XjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzVfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvNSooc2lnbWFfYV9jYXNvNV4yIC0gc2lnbWFfYl9jYXNvNV4yKSkvKHNpZ21hX2FfY2FzbzVeMitzaWdtYV9iX2Nhc281XjIrc2lnbWFfY2FzbzVeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc281XjIqKHNpZ21hX2FfY2FzbzVeMitzaWdtYV9iX2Nhc281XjIpKS8oc2lnbWFfYV9jYXNvNV4yK3NpZ21hX2JfY2FzbzVeMitzaWdtYV9jYXNvNV4yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzUsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc281LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc281LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KIyMjIENhc28gNjogc2lnbWFfYiA+IHNpZ21hX2EgPSBzaWdtYQ0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyA2OiBzaWdtYV9iID4gc2lnbWFfYSA9IHNpZ21hIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzYgPSBjKGFfc2ltXzIwMDBfY2FzbzYsYl9zaW1fMjAwMF9jYXNvNixhX2Jfc2ltXzIwMDBfY2FzbzYpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvNiwgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc282KSxtYXgodmFsb3Jlc19jYXNvNikpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc282LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzYpLG1heCh2YWxvcmVzX2Nhc282KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc282LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzYpLG1heCh2YWxvcmVzX2Nhc282KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvNl9hLCBxdWFudGlsZXNfbl9jYXNvNl9hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvNl9iLCBxdWFudGlsZXNfbl9jYXNvNl9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc282X2FfYiwgcXVhbnRpbGVzX25fY2FzbzZfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvNl9hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc282XjIrc2lnbWFfY2FzbzZeMikqbXVfYSArIHNpZ21hX2FfY2FzbzZeMiooWV9vYnNfY2FzbzYgLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzZeMitzaWdtYV9iX2Nhc282XjIrc2lnbWFfY2FzbzZeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzZeMiooc2lnbWFfYl9jYXNvNl4yK3NpZ21hX2Nhc282XjIpKS8oc2lnbWFfYV9jYXNvNl4yK3NpZ21hX2JfY2FzbzZeMitzaWdtYV9jYXNvNl4yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc282X2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzZeMitzaWdtYV9jYXNvNl4yKSptdV9iICsgc2lnbWFfYl9jYXNvNl4yKihZX29ic19jYXNvNiAtIG11X2EpKS8oc2lnbWFfYV9jYXNvNl4yK3NpZ21hX2JfY2FzbzZeMitzaWdtYV9jYXNvNl4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvNl4yKihzaWdtYV9hX2Nhc282XjIrc2lnbWFfY2FzbzZeMikpLyhzaWdtYV9hX2Nhc282XjIrc2lnbWFfYl9jYXNvNl4yK3NpZ21hX2Nhc282XjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzZfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvNiooc2lnbWFfYV9jYXNvNl4yIC0gc2lnbWFfYl9jYXNvNl4yKSkvKHNpZ21hX2FfY2FzbzZeMitzaWdtYV9iX2Nhc282XjIrc2lnbWFfY2FzbzZeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc282XjIqKHNpZ21hX2FfY2FzbzZeMitzaWdtYV9iX2Nhc282XjIpKS8oc2lnbWFfYV9jYXNvNl4yK3NpZ21hX2JfY2FzbzZeMitzaWdtYV9jYXNvNl4yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzYsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc282LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc282LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KIyMjIENhc28gNzogc2lnbWEgPiBzaWdtYV9hID0gc2lnbWFfYg0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyA3OiBzaWdtYSA+IHNpZ21hX2EgPSBzaWdtYV9iIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzcgPSBjKGFfc2ltXzIwMDBfY2FzbzcsYl9zaW1fMjAwMF9jYXNvNyxhX2Jfc2ltXzIwMDBfY2FzbzcpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvNywgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc283KSxtYXgodmFsb3Jlc19jYXNvNykpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc283LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzcpLG1heCh2YWxvcmVzX2Nhc283KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc283LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzcpLG1heCh2YWxvcmVzX2Nhc283KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvN19hLCBxdWFudGlsZXNfbl9jYXNvN19hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvN19iLCBxdWFudGlsZXNfbl9jYXNvN19iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc283X2FfYiwgcXVhbnRpbGVzX25fY2FzbzdfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvN19hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc283XjIrc2lnbWFfY2FzbzdeMikqbXVfYSArIHNpZ21hX2FfY2FzbzdeMiooWV9vYnNfY2FzbzcgLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzdeMitzaWdtYV9iX2Nhc283XjIrc2lnbWFfY2FzbzdeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzdeMiooc2lnbWFfYl9jYXNvN14yK3NpZ21hX2Nhc283XjIpKS8oc2lnbWFfYV9jYXNvN14yK3NpZ21hX2JfY2FzbzdeMitzaWdtYV9jYXNvN14yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc283X2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzdeMitzaWdtYV9jYXNvN14yKSptdV9iICsgc2lnbWFfYl9jYXNvN14yKihZX29ic19jYXNvNyAtIG11X2EpKS8oc2lnbWFfYV9jYXNvN14yK3NpZ21hX2JfY2FzbzdeMitzaWdtYV9jYXNvN14yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvN14yKihzaWdtYV9hX2Nhc283XjIrc2lnbWFfY2FzbzdeMikpLyhzaWdtYV9hX2Nhc283XjIrc2lnbWFfYl9jYXNvN14yK3NpZ21hX2Nhc283XjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzdfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvNyooc2lnbWFfYV9jYXNvN14yIC0gc2lnbWFfYl9jYXNvN14yKSkvKHNpZ21hX2FfY2FzbzdeMitzaWdtYV9iX2Nhc283XjIrc2lnbWFfY2FzbzdeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc283XjIqKHNpZ21hX2FfY2FzbzdeMitzaWdtYV9iX2Nhc283XjIpKS8oc2lnbWFfYV9jYXNvN14yK3NpZ21hX2JfY2FzbzdeMitzaWdtYV9jYXNvN14yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzcsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc283LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc283LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KIyMjIENhc28gODogc2lnbWFfYSA9IHNpZ21hX2IgPiBzaWdtYQ0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyA4OiBzaWdtYV9hID0gc2lnbWFfYiA+IHNpZ21hIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCnBhcihtZnJvdyA9IGMoMSwzKSkNCg0KdmFsb3Jlc19jYXNvOCA9IGMoYV9zaW1fMjAwMF9jYXNvOCxiX3NpbV8yMDAwX2Nhc284LGFfYl9zaW1fMjAwMF9jYXNvOCkNCg0KcGxvdChhX3NpbV8yMDAwX2Nhc284LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzgpLG1heCh2YWxvcmVzX2Nhc284KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QgKGF8WV9pLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQpwbG90KGJfc2ltXzIwMDBfY2FzbzgsIHR5cGU9ImwiLCB5bGltID0gYyhtaW4odmFsb3Jlc19jYXNvOCksbWF4KHZhbG9yZXNfY2FzbzgpKSwgeGxhYiA9ICJDYW50aWRhZCBkZSBzaW11bGFjaW9uZXMiLHlsYWIgPSAiU2ltdWxhY2lvbmVzIGRlIEdpYmJzIiwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24ocGFzdGUoIlRyYWNlcGxvdChifFlfaSxhKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChhX2Jfc2ltXzIwMDBfY2FzbzgsIHR5cGU9ImwiLCB5bGltID0gYyhtaW4odmFsb3Jlc19jYXNvOCksbWF4KHZhbG9yZXNfY2FzbzgpKSwgeGxhYiA9ICJDYW50aWRhZCBkZSBzaW11bGFjaW9uZXMiLHlsYWIgPSAiU2ltdWxhY2lvbmVzIGRlIEdpYmJzIiwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24ocGFzdGUoIlRyYWNlcGxvdChhK2J8WV9pLGEsYilcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvOF9hLCBxdWFudGlsZXNfbl9jYXNvOF9hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvOF9iLCBxdWFudGlsZXNfbl9jYXNvOF9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc284X2FfYiwgcXVhbnRpbGVzX25fY2FzbzhfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvOF9hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc284XjIrc2lnbWFfY2FzbzheMikqbXVfYSArIHNpZ21hX2FfY2FzbzheMiooWV9vYnNfY2FzbzggLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzheMitzaWdtYV9iX2Nhc284XjIrc2lnbWFfY2FzbzheMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzheMiooc2lnbWFfYl9jYXNvOF4yK3NpZ21hX2Nhc284XjIpKS8oc2lnbWFfYV9jYXNvOF4yK3NpZ21hX2JfY2FzbzheMitzaWdtYV9jYXNvOF4yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc284X2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzheMitzaWdtYV9jYXNvOF4yKSptdV9iICsgc2lnbWFfYl9jYXNvOF4yKihZX29ic19jYXNvOCAtIG11X2EpKS8oc2lnbWFfYV9jYXNvOF4yK3NpZ21hX2JfY2FzbzheMitzaWdtYV9jYXNvOF4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvOF4yKihzaWdtYV9hX2Nhc284XjIrc2lnbWFfY2FzbzheMikpLyhzaWdtYV9hX2Nhc284XjIrc2lnbWFfYl9jYXNvOF4yK3NpZ21hX2Nhc284XjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzhfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvOCooc2lnbWFfYV9jYXNvOF4yIC0gc2lnbWFfYl9jYXNvOF4yKSkvKHNpZ21hX2FfY2FzbzheMitzaWdtYV9iX2Nhc284XjIrc2lnbWFfY2FzbzheMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc284XjIqKHNpZ21hX2FfY2FzbzheMitzaWdtYV9iX2Nhc284XjIpKS8oc2lnbWFfYV9jYXNvOF4yK3NpZ21hX2JfY2FzbzheMitzaWdtYV9jYXNvOF4yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzgsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc284LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc284LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJlZXAoOCkNCmBgYA0KDQo=