Loading [MathJax]/jax/output/HTML-CSS/jax.js

  • Teoría
    • Dr. rer. nat. Humberto LLinás Solano
  • 1 Introducción
    • 1.0.1 Preliminares
    • 1.0.2 Propósito/objetivo
  • 2 El modelo
    • 2.0.1 Generalidades
    • 2.0.2 Matrices de frecuencias absolutas
    • 2.0.3 Matrices de frecuencias relativas
    • 2.0.4 Marginales
  • 3 Independencia
    • 3.0.1 El estadístico
    • 3.0.2 Matrices de residuos estandarizados
    • 3.0.3 Descomposición en valores singulares
    • 3.0.4 Base
    • 3.0.5 Problema CA
  • 4 Perfiles fila y columnas
  • 5 Perfiles fila
    • 5.0.1 Matriz de perfiles filas
    • 5.0.2 Diagrama de perfiles fila
  • 6 Perfiles columna
    • 6.0.1 Matriz de perfiles columna
    • 6.0.2 Diagrama de perfiles columna
  • 7 Distancias chi-cuadradas
    • 7.0.1 Distancia entre filas o columnas
    • 7.0.2 Distancia entre filas
    • 7.0.3 Distancia entre columnas
    • 7.0.4 Distancia (observaciones)
    • 7.0.5 Centro de gravedad
    • 7.0.6 Distancia perfil al centro de gravedad
  • 8 Inercia
    • 8.0.1 Inercia total de las filas
    • 8.0.2 Inercia total de las columnas
    • 8.0.3 Matrices de inercia
    • 8.0.4 Varianzas de filas y columnas
  • 9 Coordenadas de los puntos
    • 9.0.1 i en RJ
    • 9.0.2 j en RK
  • 10 Reconstrucción de la matriz de correspondencia
  • 11 Contribuciones absolutas y relativas
    • 11.0.1 Contribuciones: generalidades
    • 11.0.2 Contribuciones: resumen:
  • 12 Ejercicios
hllinas2023

1 Introducción

1.0.1 Preliminares

El análisis de correspondencia (CA) es una técnica relacionada con el análisis de componentes principales (PCA) pero aplicable a variables cualitativas. Véase la Figura 1.1.

**Resumen y visualización de datos multivariados**

Figure 1.1: Resumen y visualización de datos multivariados

1.0.2 Propósito/objetivo

  1. Ayuda a resumir y visualizar datos en gráficos bidimensionales, especialmente en tablas de contingencia.

  2. Proporciona coordenadas para puntos de fila y columna, lo que permite visualizar asociaciones entre categorías.

  3. En este documento, se explica la teoría correspondiente.

  4. En otro documento, se explica cómo realizar CA utilizando paquetes de R como FactoMineR y factoextra, y cómo interpretar los resultados, incluyendo la identificación de variables importantes y la gestión de valores atípicos.

2 El modelo

2.0.1 Generalidades

Se exponen los principios fundamentales del análisis de correspondencia simple, junto con un ejemplo que destaca la relevancia de esta técnica en contextos específicos, ilustrando la relación entre variables nominales en un mapa perceptual y la interacción entre sus categorías.

El análisis de correspondencia simple aborda la exploración de tablas cruzadas, donde las celdas reflejan algún tipo de relación entre las filas y columnas de una matriz. Este método condensa la información contenida en una tabla de contingencia, ofreciendo dos enfoques interpretativos. Por un lado, se visualiza como una herramienta para representar las variables en un espacio de menor dimensión, y por otro, como un método objetivo para asignar valores numéricos a variables cualitativas.

Un ejemplo paradigmático de aplicación del análisis de correspondencia simple se encuentra en los cursos introductorios de estadística, particularmente en los problemas que abordan la independencia entre dos variables categóricas.

Supongamos la presencia de dos variables categóricas, X e Y, con I y J categorías respectivamente, definidas en una población. La pregunta clave es determinar si estas variables son independientes. Bajo la hipótesis nula:

H0:Las variables X y Y son estadísticamente independientes

versus la hipótesis alternativa:

H1:Las variables X y Y no son estadísticamente independientes.

2.0.2 Matrices de frecuencias absolutas

Supongamos que disponemos de una tabla de contingencia que surge de n elementos seleccionados de una población, donde las variables categóricas X y Y están definidas. La intersección entre una fila i y una columna j representa la frecuencia de individuos que pertenecen a la categoría i de la variable X y a la categoría j de la variable Y simultáneamente, con i=1,,K y j=1,,J. Esto se ilustra en la matriz de frecuencias absolutas siguiente, que será referida como F:

F=(XY12J1F11F12F1J2F21F22F2JMFK1FK2FKJ)=(Fij)I×J

Ejemplo.

Véase la Figura 2.1.

**Matriz $F$ (Frecuencias absolutas)**

Figure 2.1: Matriz F (Frecuencias absolutas)

2.0.3 Matrices de frecuencias relativas

Sea

n:=Ji=1Kj=1Fij

Multiplicar la matriz F por 1n nos proporciona la matriz de frecuencias relativas P=1nF, donde P es la matriz de frecuencias relativas conocida como matriz de correspondencia y n=1TK×1F1J×1 representa el número total de individuos en la tabla.

Es claro que las frecuencias absolutas no son adecuadas para comparar filas o columnas, por lo que se recurre a la matriz de frecuencias relativas (matriz de correspondencia) P. Esta matriz se define explícitamente como la matriz de orden K×J que centra la tabla siguiente:

P=(XY12JMarginal fila1p11p12p1Jf12p21p22p2Jf2KpK1pK2pKJfKMarginal columnac1c2cJ1),

donde

pij=Fijn,fi=Jj=1pij,cj=Ki=1pijyJj=1cj=Ki=1fi=Ji=1Kj=1pij=1.

Ejemplo.

Véase la Figura 2.2.

**Matriz $P$ (Frecuencias relativas)**

Figure 2.2: Matriz P (Frecuencias relativas)

2.0.4 Marginales

Denotaremos como fi la frecuencia marginal de la i-ésima fila y como cj la frecuencia marginal de la j-ésima columna, donde i=1,,K y j=1,,J, o de manera vectorial:

f=P1J×1yc=PT1K×1,

vectores que representan las frecuencias marginales de filas y columnas, respectivamente.

3 Independencia

3.0.1 El estadístico

Es conocido que el estadístico más frecuentemente empleado para analizar la independencia estadística entre dos variables categóricas es:

X2(K1)×(J1)=Ji=1Kj=1(FijE[Fij)]2E(Fij)=n2Ji=1Kj=1[FijnE(Fijn)]2E(Fij)=Ji=1Kj=1[FijnE(Fijn)]2E[Fijn]=n2Ji=1Kj=1(pijeij)2eij,

donde:

  • E(Fij) representa la frecuencia absoluta esperada en la casilla (i,j) de la matriz F, y

  • eij es la frecuencia relativa esperada en la casilla (i,j) de la matriz de correspondencia P.

Observemos que, de (3.1), se tiene que

1nX2(K1)×(J1)=Ji=1Kj=1(pijeij)2eij.

Para el ejemplo:

## 
##  Pearson's Chi-squared test
## 
## data:  tabla
## X-squared = 1240, df = 12, p-value < 2.2e-16

3.0.2 Matrices de residuos estandarizados

Si definimos Df y Dc como las matrices diagonales Df=diag(f)I×I y Dc=diag(c)J×J, representando las frecuencias marginales de filas y columnas respectivamente, entonces la matriz

S=D1/2f(PfcT)D1/2c

es la matriz de residuos estandarizados. Se puede demostrar que

SSTySTS

son matrices simétricas, cuya traza es precisamente el estadístico de prueba en la prueba de independencia para dos variables categóricas, es decir,

traza(SST)=traza(STS)Ji=1Kj=1(pijficj)2eij.

3.0.3 Descomposición en valores singulares

Si realizamos la descomposición en valores singulares de la matriz S, obtenemos:

S=UDλVT,

donde

UUT=IK,VVT=IJyDλ=diag(λ1,λ2,,)K×J,

siendo Dλ una matriz diagonal y los λi, i=1,,rang(S)=t, las raíces cuadradas positivas de los t valores propios de las matrices simétricas SST y STS. Los t primeros vectores de las matrices ortogonales U y V son los vectores propios de las matrices SS y SS, respectivamente.

3.0.4 Base

Los t primeros vectores de U constituyen una base para el subespacio generado por las filas de P y los t primeros vectores de la matriz V constituyen una base para el subespacio generado por las columnas de P. Es decir, si construimos las matrices Ut×t, Vt×t y Dλ,t×t, la matriz

St×t=Ut×tDλ,t×tVt×t

será la matriz de rango mínimo que mejor se aproxima a la matriz S.

3.0.5 Problema CA

Así, el problema de análisis de correspondencia simple se puede expresar como un problema de mínimos cuadrados ponderados para determinar la matriz ˆe=(ˆeij)=fc, de rango reducido que minimiza la

traza(SST)=traza(STS)Ji=1Kj=1(pijficj)2eij.

4 Perfiles fila y columnas

Se hallan dividiendo la frecuencia relativa entre el total de fila o columna correspondiente. Los perfiles de fila y columna se pueden comparar con las distribuciones correspondientes de columna y fila, considerando su respectiva importancia, para evaluar su desviación de la independencia.

5 Perfiles fila

5.0.1 Matriz de perfiles filas

Ejemplo.

Véase la Figura 5.1.

**Matriz de perfiles fila**

Figure 5.1: Matriz de perfiles fila

5.0.2 Diagrama de perfiles fila

En la representación del perfil del color de ojos en relación con el color del cabello, se observa una similitud considerable entre los perfiles de ojos claros y ojos azules, que es similar (aunque ligeramente menor) a la similitud o proximidad entre los perfiles de ojos medios y oscuros (ver Figura 5.2).

**Histograma de perfiles fila**

Figure 5.2: Histograma de perfiles fila

->

6 Perfiles columna

6.0.1 Matriz de perfiles columna

Ejemplo.

Véase la Figura 6.1.

**Matriz de perfiles columna**

Figure 6.1: Matriz de perfiles columna

6.0.2 Diagrama de perfiles columna

En el análisis del perfil de color del cabello, se observa una similitud notable entre los perfiles de cabello rubio y rojo, así como entre los cabellos oscuro y negro. Por otro lado, el perfil de cabello medio se distingue notablemente de los demás perfiles. Esto se puede apreciar en la Figura 6.2.

**Histograma de perfiles columna**

Figure 6.2: Histograma de perfiles columna

7 Distancias chi-cuadradas

7.0.1 Distancia entre filas o columnas

Es la distancia entre filas y columnas de la matriz de datos. Para explicarla, nuevamente, consideremos la matriz P. Supongamos que las filas i y j tienen la siguiente configuración:

i 0.015 0.02 0.01 0.02 fi=0.075
j 0.0015 0.002 0.001 0.002 fj=0.0075

Aparentemente, la fila i parece más densa que la fila j. En la fila i se encuentra el 7.5 de la población, mientras que en la fila j solo el 0.75. Si no consideramos el tamaño, las frecuencias relativas intrafila son idénticas en cada fila. Por lo tanto, para analizar las diferencias relativas entre filas, debemos corregir el efecto tamaño. Esto se logra considerando la matriz cuyos elementos son de la forma pij/fi para las filas y pij/cj para las columnas, obteniendo así dos matrices.

Otro problema al que nos enfrentamos es si las filas i,j y k de la matriz ponderada por las marginales de las filas son:

i 0.15 0.02 0.10 0.43 0.30
j 0.15 0.02 0.10 0.44 0.29
k 0.15 0.01 0.10 0.44 0.30

Observe que la distancia euclidiana entre las filas i y j, y entre las filas i y k, se definen como:

d2e(i,j)=Jl=1(pilfipjlfj)2=(0.430.44)2+(0.300.29)2=0.0002d2e(i,k)=Jl=1(pilfipklfk)2=(0.430.44)2+(0.020.01)2=0.0002,

Esto es claramente problemático, ya que no es lo mismo una discrepancia de 0.01 entre 0.29 y 0.30, que entre 0.01 y 0.02.

7.0.2 Distancia entre filas

Una forma de corregir este problema es ponderando cada elemento de la suma por el marginal de la columna correspondiente:

d2(fi,fj)=Jl=11cl(pilfipjlfj)2=(fifj)TD1c(fifj),

Donde:

  • fi y fj son los vectores cuyos elementos son las filas i y j, respectivamente, de la matriz P; y

  • Dc es una matriz diagonal con elementos cl. A esta distancia se le conoce con el nombre de distancia chi-cuadrado.

7.0.3 Distancia entre columnas

Utilizando un procedimiento análogo se obtienen las distancias chi-cuadrado entre dos columnas j y k de esa matriz de datos, así:

d2(cj,ck)=Kl=11fl(pljcjplkck)2=(cjck)TD1f(cjck),

donde:

  • fj y fk son los vector cuyos elementos son las columnas i y j, respectivamente, de la matriz P; y

  • Df, es una matriz diagonal con elementos fl.

7.0.4 Distancia (observaciones)

Primero.

Note que los valores de las distancias anteriores miden la distancia entre dos distribuciones multinomiales. Es decir, permiten comparar los histogramas (distribuciones empíricas) por cada par de filas o columnas.

Segundo.

Observe también que esta distancia chi-cuadrado es equivalente a la distancia euclidiana, si se toma como puntos en el caso de las filas, para las filas i y K, las de coordenadas:

Wi=(pi1fic1,,piJficJ)yWj=(pk1fkc1,,pkJfkcJ), respectivamente.

7.0.5 Centro de gravedad

Es importante resaltar que las distancias no se calculan entre las filas o las columnas, sino que se expresan en relación con su centro de masa, que podemos definir como el promedio ponderado de esa columna por su masa.

  • En el caso de las columnas, esto se convierte en el vector de columnas generado por las marginales de las filas, f.

  • De manera similar, en el caso de las filas, el vector de filas generado por las marginales de las columnas, c.

Esto es aplicable cuando se analiza la matriz de perfiles (distancia chi-cuadrado) para las filas.

Si el análisis se realiza con la matriz cuyos elementos son de la forma Wi, i=1,,K (utilizando la distancia euclidiana), el centro de masa para las filas sería c, como se muestra a continuación:

Para calcular el centro de masa c de la nube de puntos generada por las filas W1,,WK, ponderando con los pesos de las columnas correspondientes, tendríamos para la i-ésima coordenada del vector c, i=1,,J:

ci=f1(p1if1ci)+f2(p2if2ci)++fK(pKifKci)=1ci(f1i+f2i++fKi)=1cici=ci

7.0.6 Distancia perfil al centro de gravedad

La distancia del perfil de fila i a su centro de gravedad (chi-cuadrado) se define como:

d2(fi,c)=Kl=11cl(pilficl)2=Kl=1(pilficlcl)2=de(fi,c).

Al calcular la distancia entre una fila y su centro de gravedad, en realidad estamos calculando una parte de la varianza o una covarianza. En resumen, la dispersión total de las filas es la suma ponderada de las diferencias al cuadrado de cada elemento de la fila respecto al centro de gravedad.

8 Inercia

La cantidad χ2/N se denomina inercia total. Esta inercia se descompone en un total de k valores característicos (propios), cada uno de los cuales constituye la inercia principal de una dimensión.

8.0.1 Inercia total de las filas

Si denotamos la inercia total de las filas como If, entonces puede calcularse de la siguiente manera:

If=Ki=1fid2(fi,c)=Ki=1Jj=1fi1fj(pijficj)2=Ki=1Jj=1(pijfi×cj)2fi×cj=tra(STS).

8.0.2 Inercia total de las columnas

De manera análoga, la dispersión total de las columnas Ic, se define como:

Ic=Jj=1cjd2(cj,f)=Jj=1Ki=1cj1ci(pijcjfi)2=Jj=1Ki=1(pijfi×cj)2fi×cj=tra(SST)=If.

Se observa que la dispersión total de las filas es igual a la de las columnas.

8.0.3 Matrices de inercia

Las matrices Σf=STS y Σc=SST se denominan matrices de inercia de las filas y columnas, respectivamente.

  • Σf es para el espacio que define los puntos fi de RJ.

  • Σc es para el espacio que define los puntos cj de RK.

8.0.4 Varianzas de filas y columnas

Los elementos de la diagonal de la matriz Σ representan las varianzas de las filas o columnas. además, su suma constituye la dispersión explicada por cada factor en el nuevo espacio. Los autovalores indican qué parte de esa dispersión está explicada por cada factor.

9 Coordenadas de los puntos

9.0.1 i en RJ

Con el fin de obtener sus valores y vectores propios, que permitirán calcular las coordenadas de los puntos i en RJ, para el espacio de J dimensiones que definen los puntos fila, es necesario diagonalizar la matriz Σf. Estas coordenadas tienen la siguiente forma:

Fα(i)=Jj=1μαj(fijficjcj)

o en forma matricial como:

R=(Fα(i))K×t=D1f(Ffc)D1/2cU,

donde:

  • μα es el vector propio (columnas de la matriz U) de Σf, correspondiente al factor α, α=1,,t.

  • Fα(i) es la proyección del punto fila

(fi1fic1c1,fi2fic2c2,,fiQficQcQ)

sobre el vector uα.

9.0.2 j en RK

De manera similar, se obtienen las coordenadas para los puntos j de RK:

Cα(j)=i=1(pijcjfifi)ναi,

en forma matricial como:

C=(Cα(j))P×t=D1c(Ffc)D1/2fV,

donde να es el vector propio (columnas de la matriz V) de Σc, correspondiente al factor α,α=1,,t. También podemos expresar estas coordenadas como:

Fα(i)=λαfiναi y Cα(j)=λαcjυαj,

donde λα, es el valor propio asociado al factor α.

10 Reconstrucción de la matriz de correspondencia

Para reconstruir la matriz de correspondencia P, podemos resolver las ecuaciones (3.2) y (3.3) para P, obteniendo la siguiente ecuación:

P=fc+D1/2fUDVTD1/2c,

o en términos de sus elementos:

pij=ficj+(0,0,,fiPosicióni,,0)UDVT(0,0,,cjPosiciónj,,0)T=ficj[1+α=11λαFα(i)Gα(j)]

11 Contribuciones absolutas y relativas

11.0.1 Contribuciones: generalidades

Las contribuciones ayudan a interpretar los ejes. Por ejemplo,

  1. La contribución absoluta de la fila i a un factor α indica la inercia explicada por ese factor generado por la fila i.

  2. La suma de todas las contribuciones absolutas de las filas para un factor es igual a la inercia del factor.

  3. Por lo tanto, al dividir la contribución absoluta de cada fila entre la inercia correspondiente al factor, obtenemos el porcentaje de variabilidad en el factor debido a esa fila, conocido como contribución relativa de la fila a la inercia del factor:

11.0.2 Contribuciones: resumen:

La contribución absoluta del punto i a la inercia λα es

fiF2α(i) La contribución relativa del punto i a la inercia λα es

fiF2α(i)λα

La contribución relativa del factor α a la inercia total es

λαtj=1λj

12 Ejercicios

Pendiente

Bibliografía

Consultar el documento RPubs :: Análisis multivariado (bibliografía).

 

 
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.  
LS0tDQp0aXRsZTogIkFOw4FMSVNJUyBERSBDT1JSRVNQT05ERU5DSUEiDQpzdWJ0aXRsZTogPGgxPioqVGVvcsOtYSoqPC9oMT4NCg0KYXV0aG9yOiANCiAgLSBuYW1lICAgICAgICAgIDogIkRyLiByZXIuIG5hdC4gSHVtYmVydG8gTExpbsOhcyBTb2xhbm8iDQogICAgYWZmaWxpYXRpb24gICA6ICJEZXBhcnRhbWVudG8gZGUgTWF0ZW3DoXRpY2FzIHkgRXN0YWTDrXN0aWNhLCBVbml2ZXJzaWRhZCBkZWwgTm9ydGUgKEJhcnJhbnF1aWxsYSwgQ29sb21iaWEpIg0KICAgICAjY29ycmVzcG9uZGluZyA6IHllcyAgICAjIERlZmluZSBvbmx5IG9uZSBjb3JyZXNwb25kaW5nIGF1dGhvcg0KICAgICAjYWRkcmVzcyAgICAgICA6ICJEZXBhcnRhbWVudG8gZGUgTWF0ZW3DoXRpY2FzIHkgRXN0YWTDrXN0aWNhIg0KICAgIGVtYWlsICAgICAgICAgOiB8DQogICAgICBobGxpbmFzQHVuaW5vcnRlLmVkdS5jbw0KICAgICAgDQogICAgICBbQmlvZ3JhcGhpY2FsIHNrZXRjaF0oaHR0cHM6Ly9ycHVicy5jb20vaGxsaW5hcy9CaW9fU2tldGNoKQ0KICAgICAgDQogICAgICBgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVkLyVtLyV5IilgIA0KICAgICAgDQogICAgICNyb2xlOiAgICAgICAgICMgQ29udHJpYnV0b3JzaGlwIHJvbGVzIChlLmcuLCBDUmVkaVQsIGh0dHBzOi8vY2FzcmFpLm9yZy9jcmVkaXQvKQ0KICAjICAgIC0gQ29uY2VwdHVhbGl6YXRpb24NCiAgIyAgICAtIFdyaXRpbmcgLSBPcmlnaW5hbCBEcmFmdCBQcmVwYXJhdGlvbg0KICAjICAgIC0gV3JpdGluZyAtIFJldmlldyAmIEVkaXRpbmcNCiAjIC0gbmFtZSAgICAgICAgICA6ICJBdXRvciBudW1lcm8gMiINCiAjICAgYWZmaWxpYXRpb24gICA6ICIxLDIiDQogIyAgIHJvbGU6DQogIyAgICAgLSBXcml0aW5nIC0gUmV2aWV3ICYgRWRpdGluZw0KICAgICAjYWZmaWxpYXRpb246DQogICMtIGlkICAgICAgICAgICAgOiAiMSINCiAgIyAgaW5zdGl0dXRpb24gICA6ICJVbml2ZXJzaWRhZCBkZWwgTm9ydGUgKEJhcnJhbnF1aWxsYSwgQ29sb21iaWEpIg0KICAjIVtdKGhsbGluYXMuanBnKXt3aWR0aD0xaW59IA0KICANCiNkYXRlOiAnYHIgZm9ybWF0KFN5cy50aW1lKCksICIlZC8lbS8leSIpYCcgICMgdmVyIGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay91cGRhdGUtZGF0ZS5odG1sDQpvdXRwdXQ6IA0KICAgIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjogDQogICAgICAgICAgI09KTyBTYWxlbiBjYXBpdHVsb3MsIHNlY2Npb25lcyB5IFRlb3JlbWFzDQogICAgI2Jvb2tkb3duOjpodG1sX2Jvb2s6DQogICAgICAgICAgI09KTyBFUlJPUiBTYWxlbiB0ZW9yZW1hcywgcGVybyBubyBzYWxlbiBsb3MgY2FwaXR1bG9zIA0KICAgICNodG1sX2RvY3VtZW50Og0KICAgICAgICAgIHRvYzogdHJ1ZSAgICAgICMgdGFibGUgb2YgY29udGVudCB0cnVlDQogICAgICAgICAgdG9jX2RlcHRoOiA0ICAgIyB1cHRvIHRocmVlIGRlcHRocyBvZiBoZWFkaW5ncyAoc3BlY2lmaWVkIGJ5ICMsICMjIGFuZCAjIyMpDQogICAgICAgICAgdG9jX2Zsb2F0OiB0cnVlICNDb24gdHJ1ZSwgdG9jIHNhbGUgYWwgbWFyZ2VuIGl6cXVpZXJkbyBkZSBsYSBww6FnaW5hOyBkZSBsbyBjb250cmFyaW8sIGFycmliYQ0KICAgICAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KICAgICAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICMgaWYgeW91IHdhbnQgbnVtYmVyIHNlY3Rpb25zIGF0IGVhY2ggdGFibGUgaGVhZGVyDQogICAgICAgICAgI3RoZW1lOiBzYW5kc3RvbmUNCiAgICAgICAgICAjdGhlbWU6IHVuaXRlZCAgIyBtYW55IG9wdGlvbnMgZm9yIHRoZW1lLCB0aGlzIG9uZSBpcyBteSBmYXZvcml0ZS4NCiAgICAgICAgICAjdGhlbWU6IGZsYXRseSAgIyANCiAgICAgICAgICAjdGhlbWU6IGNlcnVsZWFuICAjIA0KICAgICAgICAgICNoaWdobGlnaHQ6IHRhbmdvICAjIHNwZWNpZmllcyB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyBzdHlsZQ0KICAgICAgICAgICNjc3M6IFNjcmlwdHMgYWNjZXNvcmlvcy9lc3RpbG9ib3Rvbi5jc3MNCiAgICAgICAgICAjY3NzOiBteS5jc3MgICAjIHlvdSBjYW4gYWRkIHlvdXIgY3VzdG9tIGNzcywgc2hvdWxkIGJlIGluIHNhbWUgZm9sZGVyDQogICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICAgICAgICNoaWdobGlnaHQ6IHRhbmdvICAjIGNhbWJpYXIgY29sb3IgZGUgbGlicmFyeSBlbiBhenVsDQogICAgIyBib29rZG93bjo6Z2l0Ym9vazoNCiAgICAjICAgICAgaW5jbHVkZXM6DQogICAgIyAgICAgICAgaW5faGVhZGVyOiBoZWFkZXIuaHRtbA0KICAgICMgYm9va2Rvd246OnBkZl9ib29rOg0KICAgICMgICAgICAga2VlcF90ZXg6IHllcw0KICAgICMgYm9va2Rvd246Omh0bWxfYm9vazoNCiAgICAjICAgICAgIGNzczogdG9jLmNzcw0KICAgICMgYm9va2Rvd246Omh0bWxfYm9vazoNCiAgICAjICAgICAgICAgaW5jbHVkZXM6DQogICAgIyAgICAgICAgICAgaW5faGVhZGVyOiBzdHlsZS5jc3MNCiAgICAjYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOiBkZWZhdWx0DQogICAgIyBib29rZG93bjo6cGRmX2RvY3VtZW50MjoNCiAgICAjICAgICAga2VlcF90ZXg6IHRydWUNCiAgICAjYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYg0KICAgIG1hdGhqYXg6ICJodHRwOi8vZXhhbXBsZS5jb20vbWF0aGpheC9NYXRoSmF4LmpzP2NvbmZpZz1UZVgtQU1TLU1NTF9IVE1Mb3JNTUwiDQpoZWFkZXItaW5jbHVkZXM6DQogICAgXHVzZXBhY2thZ2VbeDExbmFtZXNde3hjb2xvcn0gDQogICAgDQpjc2w6IHNjaWVuY2UuY3NsDQojT2pvOiBTZSB1dGlsaXphIGxlbmd1YWplIFlBTUwNCg0KYWJzdHJhY3Q6IHwNCiAqKkVuIFtScHViczo6IHRvY10oaHR0cHM6Ly9ycHVicy5jb20vaGxsaW5hcy90b2MpIHNlIHB1ZWRlbiB2ZXIgb3Ryb3MgZG9jdW1lbnRvcyBkZSBwb3NpYmxlIGludGVyw6lzLioqDQogIA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBmaWcuYWxpZ249ImNlbnRlciIsICBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFIywNCiAgICAgICAgICAgICAgICAgICAgICAjc3R5bGUgPSAiY29sb3I6ZGFya2JsdWUiDQogICAgICAgICAgICAgICAgICAgICMgY2xhc3Muc291cmNlPSJiZy1kYW5nZXIiLCBjbGFzcy5vdXRwdXQ9ImJnLXdhcm5pbmciICAgI0NvbG9yZXMgZGVudHJvIGRlbCBjaHVuaw0KICAgICAgICAgICAgICAgICAgICAgKQ0KbGlicmFyeShyZ2wpDQprbml0cjo6a25pdF9ob29rcyRzZXQod2ViZ2wgPSBob29rX3dlYmdsKQ0KYGBgDQoNCg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQ0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duL2xhbmd1YWdlLWVuZ2luZXMuaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9tYXJrZG93bi1zeW50YXguaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9hLXNpbmdsZS1kb2N1bWVudC5odG1sDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL21hcmtkb3duLWV4dGVuc2lvbnMtYnktYm9va2Rvd24uaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vYm9va2Rvd24tbWFya2Rvd24uaHRtbCAgIyBUZW9yZW1zIGFuZCBwcm9vZnMNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vbWFya2Rvd24tZXh0ZW5zaW9ucy1ieS1ib29rZG93bi5odG1sI3RoZW9yZW1zDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL2h0bWwuaHRtbA0KDQpodHRwczovL3d3dy5kYXRhLXRvLXZpei5jb20vDQogIA0KW1JwdWJzXShsaW5rKQ0KICANCihcI2VxOmVjLSksICBFY3VhY2lvbiBcQHJlZihlcTplYy0pLCBGaWd1cmEgXEByZWYoZmlnOkZpZy0pLCBUYWJsZSBcQHJlZih0YWI6bXRjYXJzKSwgVGhlb3JlbSBcQHJlZih0aG06Ym9yaW5nKQ0KDQoNCiMgVGl0dWxvIHsjVGl0dWxvU2VjY2lvbn0gICBcQHJlZihUaXR1bG9TZWNjaW9uKQ0KICANCiMgRm9yIEhUTUwsIHdlIGNhbiBzZXQgY29sb3Igd2l0aCBDU1MsIGUuZy4sIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGV4dDwvc3Bhbj4NCiAgDQojIGh0dHBzOi8vcmFkaWFudC1yc3RhdHMuZ2l0aHViLmlvL2RvY3MvbW9kZWwvbG9naXN0aWMuaHRtbCBTaGlubnkgTG9naXQgIA0KICANCmBgYA0KDQoNCmBgYHtyLCBldmFsPUZBTFNFLCBlY2hvPUZBTFNFfQ0KI0xhIGZvdG8gdGFtYcOxbyBjw6lkdWxhDQoNCmh0bWx0b29sczo6aW1nKHNyYyA9IGtuaXRyOjppbWFnZV91cmkoZmlsZS5wYXRoKFIuaG9tZSgiZG9jIiksICJodG1sIiwgImxvZ28uanBnIikpLCANCiAgICAgICAgICAgICAgIGFsdCA9ICdobGxpbmFzJywgDQogICAgICAgICAgICAgICBzdHlsZSA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IHJpZ2h0OjA7IHBhZGRpbmc6MTBweDsnICMsDQogICAgICAgICAgICAgICB3aWR0aCA9ICIyMDBweCIpICAjIEFxdcOtIGVzcGVjaWZpY2FzIGVsIGFuY2hvIGRlc2VhZG8gZW4gcMOteGVsZXMgbyBwb3JjZW50YWplDQpgYGANCg0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIH0NCiMgTGEgZm90byBncmFuZGUNCg0KaHRtbHRvb2xzOjppbWcoc3JjID0ga25pdHI6OmltYWdlX3VyaSgiaGxsaW5hczIwMjMuanBnIiksIA0KICAgICAgICAgICAgICAgYWx0ID0gJ2hsbGluYXMyMDIzJywgDQogICAgICAgICAgICAgICBzdHlsZSA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IHJpZ2h0OjA7IHBhZGRpbmc6MXB4OycsDQogICAgICAgICAgICAgICB3aWR0aD0iMTUlIikNCmBgYA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yICAtLT4NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCi5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30NCmgxIHtjb2xvcjogZGFya2JsdWU7fQ0KaDMge2NvbG9yOiBkYXJrZ3JlZW47fQ0KaDQge2NvbG9yOiBncmVlbjt9DQpgYGANCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIENhcMOtdHVsbyAgLS0+DQoNCg0KYGBge2NzcywgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCiNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTAzMDQ3Ny9jaGFuZ2luZy1jaHVuay1iYWNrZ3JvdW5kLWNvbG9yLWluLXJtYXJrZG93bg0KDQouYmFkQ29kZSB7DQpiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7DQp9DQpgYGANCg0KDQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEludHJvZHVjY2nDs24NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUHJlbGltaW5hcmVzDQoNCkVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWEgKENBKSBlcyB1bmEgdMOpY25pY2EgcmVsYWNpb25hZGEgY29uIGVsIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyAoUENBKSBwZXJvIGFwbGljYWJsZSBhIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMuIFbDqWFzZSBsYSBGaWd1cmEgXEByZWYoZmlnOkNvcnJlc3AxKS4NCg0KDQo8Y2VudGVyPg0KYGBge3IgQ29ycmVzcDEsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipSZXN1bWVuIHkgdmlzdWFsaXphY2nDs24gZGUgZGF0b3MgbXVsdGl2YXJpYWRvcyoqIiwgb3V0LndpZHRoID0gIjEwMCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQ29ycmVzcDEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBQcm9ww7NzaXRvL29iamV0aXZvDQoNCjEuIEF5dWRhIGEgcmVzdW1pciB5IHZpc3VhbGl6YXIgZGF0b3MgZW4gZ3LDoWZpY29zIGJpZGltZW5zaW9uYWxlcywgZXNwZWNpYWxtZW50ZSBlbiB0YWJsYXMgZGUgY29udGluZ2VuY2lhLiANCg0KMi4gUHJvcG9yY2lvbmEgY29vcmRlbmFkYXMgcGFyYSBwdW50b3MgZGUgZmlsYSB5IGNvbHVtbmEsIGxvIHF1ZSBwZXJtaXRlIHZpc3VhbGl6YXIgYXNvY2lhY2lvbmVzIGVudHJlIGNhdGVnb3LDrWFzLiANCg0KMy4gRW4gZXN0ZSBkb2N1bWVudG8sIHNlIGV4cGxpY2EgbGEgdGVvcsOtYSBjb3JyZXNwb25kaWVudGUuIA0KDQo0LiBFbiBvdHJvIGRvY3VtZW50bywgc2UgZXhwbGljYSBjw7NtbyByZWFsaXphciBDQSB1dGlsaXphbmRvIHBhcXVldGVzIGRlIFIgY29tbyBgRmFjdG9NaW5lUmAgeSBgZmFjdG9leHRyYWAsIHkgY8OzbW8gaW50ZXJwcmV0YXIgbG9zIHJlc3VsdGFkb3MsIGluY2x1eWVuZG8gbGEgaWRlbnRpZmljYWNpw7NuIGRlIHZhcmlhYmxlcyBpbXBvcnRhbnRlcyB5IGxhIGdlc3Rpw7NuIGRlIHZhbG9yZXMgYXTDrXBpY29zLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMgRWwgbW9kZWxvIA0KDQojIyMgR2VuZXJhbGlkYWRlcyANCg0KU2UgZXhwb25lbiBsb3MgcHJpbmNpcGlvcyBmdW5kYW1lbnRhbGVzIGRlbCBhbsOhbGlzaXMgZGUgY29ycmVzcG9uZGVuY2lhIHNpbXBsZSwganVudG8gY29uIHVuIGVqZW1wbG8gcXVlIGRlc3RhY2EgbGEgcmVsZXZhbmNpYSBkZSBlc3RhIHTDqWNuaWNhIGVuIGNvbnRleHRvcyBlc3BlY8OtZmljb3MsIGlsdXN0cmFuZG8gbGEgcmVsYWNpw7NuIGVudHJlIHZhcmlhYmxlcyBub21pbmFsZXMgZW4gdW4gbWFwYSBwZXJjZXB0dWFsIHkgbGEgaW50ZXJhY2Npw7NuIGVudHJlIHN1cyBjYXRlZ29yw61hcy4NCg0KRWwgYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYSBzaW1wbGUgYWJvcmRhIGxhIGV4cGxvcmFjacOzbiBkZSB0YWJsYXMgY3J1emFkYXMsIGRvbmRlIGxhcyBjZWxkYXMgcmVmbGVqYW4gYWxnw7puIHRpcG8gZGUgcmVsYWNpw7NuIGVudHJlIGxhcyBmaWxhcyB5IGNvbHVtbmFzIGRlIHVuYSBtYXRyaXouIEVzdGUgbcOpdG9kbyBjb25kZW5zYSBsYSBpbmZvcm1hY2nDs24gY29udGVuaWRhIGVuIHVuYSB0YWJsYSBkZSBjb250aW5nZW5jaWEsIG9mcmVjaWVuZG8gZG9zIGVuZm9xdWVzIGludGVycHJldGF0aXZvcy4gUG9yIHVuIGxhZG8sIHNlIHZpc3VhbGl6YSBjb21vIHVuYSBoZXJyYW1pZW50YSBwYXJhIHJlcHJlc2VudGFyIGxhcyB2YXJpYWJsZXMgZW4gdW4gZXNwYWNpbyBkZSBtZW5vciBkaW1lbnNpw7NuLCB5IHBvciBvdHJvLCBjb21vIHVuIG3DqXRvZG8gb2JqZXRpdm8gcGFyYSBhc2lnbmFyIHZhbG9yZXMgbnVtw6lyaWNvcyBhIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMuDQoNClVuIGVqZW1wbG8gcGFyYWRpZ23DoXRpY28gZGUgYXBsaWNhY2nDs24gZGVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWEgc2ltcGxlIHNlIGVuY3VlbnRyYSBlbiBsb3MgY3Vyc29zIGludHJvZHVjdG9yaW9zIGRlIGVzdGFkw61zdGljYSwgcGFydGljdWxhcm1lbnRlIGVuIGxvcyBwcm9ibGVtYXMgcXVlIGFib3JkYW4gbGEgaW5kZXBlbmRlbmNpYSBlbnRyZSBkb3MgdmFyaWFibGVzIGNhdGVnw7NyaWNhcy4NCg0KU3Vwb25nYW1vcyBsYSBwcmVzZW5jaWEgZGUgZG9zIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMsICRYJCBlICRZJCwgY29uICRJJCB5ICRKJCBjYXRlZ29yw61hcyByZXNwZWN0aXZhbWVudGUsIGRlZmluaWRhcyBlbiB1bmEgcG9ibGFjacOzbi4gTGEgcHJlZ3VudGEgY2xhdmUgZXMgZGV0ZXJtaW5hciBzaSBlc3RhcyB2YXJpYWJsZXMgc29uIGluZGVwZW5kaWVudGVzLiBCYWpvIGxhIGhpcMOzdGVzaXMgbnVsYToNCg0KJCQgSDAgOiBcO1xtYm94e0xhcyB2YXJpYWJsZXMgWCB5IFkgc29uIGVzdGFkw61zdGljYW1lbnRlIGluZGVwZW5kaWVudGVzfSQkDQoNCnZlcnN1cyBsYSBoaXDDs3Rlc2lzIGFsdGVybmF0aXZhOg0KDQokJEgxIDpcO1xtYm94e0xhcyB2YXJpYWJsZXMgWCB5IFkgbm8gc29uIGVzdGFkw61zdGljYW1lbnRlIGluZGVwZW5kaWVudGVzfS4kJA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTWF0cmljZXMgZGUgZnJlY3VlbmNpYXMgYWJzb2x1dGFzDQoNClN1cG9uZ2Ftb3MgcXVlIGRpc3BvbmVtb3MgZGUgdW5hIHRhYmxhIGRlIGNvbnRpbmdlbmNpYSBxdWUgc3VyZ2UgZGUgJG4kIGVsZW1lbnRvcyBzZWxlY2Npb25hZG9zIGRlIHVuYSBwb2JsYWNpw7NuLCBkb25kZSBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyAkWCQgeSAkWSQgZXN0w6FuIGRlZmluaWRhcy4gTGEgaW50ZXJzZWNjacOzbiBlbnRyZSB1bmEgZmlsYSAkaSQgeSB1bmEgY29sdW1uYSAkaiQgcmVwcmVzZW50YSBsYSBmcmVjdWVuY2lhIGRlIGluZGl2aWR1b3MgcXVlIHBlcnRlbmVjZW4gYSBsYSBjYXRlZ29yw61hICRpJCBkZSBsYSB2YXJpYWJsZSAkWCQgeSBhIGxhIGNhdGVnb3LDrWEgJGokIGRlIGxhIHZhcmlhYmxlICRZJCBzaW11bHTDoW5lYW1lbnRlLCBjb24gJGkgPSAxLCBcbGRvdHMsIEskIHkgJGogPSAxLCBcbGRvdHMsIEokLiBFc3RvIHNlIGlsdXN0cmEgZW4gbGEgbWF0cml6IGRlIGZyZWN1ZW5jaWFzIGFic29sdXRhcyBzaWd1aWVudGUsIHF1ZSBzZXLDoSByZWZlcmlkYSBjb21vICRGJDoNCg0KJCRGPVxiZWdpbntwbWF0cml4fQ0KWCBcc2V0bWludXMgWSAmIDEgJiAyICYgXGxkb3RzICYgSlxcIA0KXGhsaW5lDQoxICYgRl97MTF9ICYgRl97MTJ9ICYgXGxkb3RzICAmIEZfezFKfSBcXCANCjIgJiBGX3syMX0gJiBGX3syMn0gJiBcbGRvdHMgICYgRl97Mkp9IFxcIA0KXHZkb3RzICYgICYgICYgICYgXFwgDQpNICYgRl97SzF9ICYgRl97SzJ9ICYgXGxkb3RzICYgRl97S0p9DQpcZW5ke3BtYXRyaXh9PSAoRl97aWp9KV97SSBcdGltZXMgSn0kJA0KDQoNCg0KDQpgYGB7ciwgZWNobz0gRkFMU0V9DQojIENyZWFyIGxvcyB2ZWN0b3JlcyBwYXJhIGNhZGEgZmlsYSB5IGNvbHVtbmENCkNvbG9yX2RlX29qb3MgPC0gYygiT19DbGFybyIsICJPX0F6dWwiLCAiT19NZWRpbyIsICJPX09zY3VybyIpDQpSdWJpbyA8LSBjKDY4OCwgMzI2LCAzNDMsIDk4KQ0KUm9qbyA8LSBjKDExNiwgMzgsIDg0LCA0OCkNCk1lZGlvIDwtIGMoNTg0LCAyNDEsIDkwOSwgNDAzKQ0KT3NjdXJvIDwtIGMoMTg4LCAxMTAsIDQxMiwgNjgxKQ0KTmVncm8gPC0gYyg0LCAzLCAyNiwgODUpDQojVG90YWxfbmkuIDwtIGMoMTU4MCwgNzE4LCAxNzc0LCAxMzE1KQ0KDQojIENhbGN1bGFyIGxvcyB0b3RhbGVzIHBvciBjb2x1bW5hDQojVG90YWxfbi5qIDwtIGMoIlRvdGFsIiwgc3VtKFJ1YmlvKSwgc3VtKFJvam8pLCBzdW0oTWVkaW8pLCBzdW0oT3NjdXJvKSwgc3VtKE5lZ3JvKSwgc3VtKFRvdGFsX25pLikpDQoNCiMgQ29uc3RydWlyIGVsIGRhdGEgZnJhbWUNCmRmIDwtIGRhdGEuZnJhbWUoQ29sb3JfZGVfb2pvcywgUnViaW8sIFJvam8sIE1lZGlvLCBPc2N1cm8sIE5lZ3JvDQogICAgICAgICAgICAgICAgICMsIFRvdGFsX25pLg0KICAgICAgICAgICAgICAgICApDQoNCiMgQcOxYWRpciBsYSBmaWxhIGRlIHRvdGFsZXMgYWwgZmluYWwgZGVsIGRhdGEgZnJhbWUNCiNkZiA8LSByYmluZChkZiwgVG90YWxfbi5qKQ0KDQojIENhbWJpYXIgbG9zIG5vbWJyZXMgZGUgbGFzIGNvbHVtbmFzDQpuYW1lcyhkZikgPC0gYygiQ29sb3IiLCAiQ19SdWJpbyIsICJDX1Jvam8iLCAiQ19NZWRpbyIsICJDX09zY3VybyIsICJDX05lZ3JvIg0KICAgICAgICAgICAgICAgIywgIlRvdGFsIg0KICAgICAgICAgICAgICAgKQ0KDQoNCmBgYA0KDQoNCioqRWplbXBsby4qKiANCg0KVsOpYXNlIGxhIEZpZ3VyYSBcQHJlZihmaWc6Q29sb3IxKS4NCg0KDQo8Y2VudGVyPg0KYGBge3IgQ29sb3IxLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqTWF0cml6ICRGJCAoRnJlY3VlbmNpYXMgYWJzb2x1dGFzKSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1hdHJpY2VzIGRlIGZyZWN1ZW5jaWFzIHJlbGF0aXZhcw0KDQoNClNlYSANCg0KJCRuIFw7IDo9IFw7IFxzdW1cbGltaXRzX3tpPTF9XntKfSBcc3VtXGxpbWl0c197aj0xfV57S31GX3tpan0kJA0KDQpNdWx0aXBsaWNhciBsYSBtYXRyaXogJEYkIHBvciAkXGZyYWN7MX17bn0kIG5vcyBwcm9wb3JjaW9uYSBsYSBtYXRyaXogZGUgZnJlY3VlbmNpYXMgcmVsYXRpdmFzICRQPVxmcmFjezF9e259RiQsIGRvbmRlICRQJCBlcyBsYSBtYXRyaXogZGUgZnJlY3VlbmNpYXMgcmVsYXRpdmFzIGNvbm9jaWRhIGNvbW8gbWF0cml6IGRlIGNvcnJlc3BvbmRlbmNpYSB5ICRuID0gMV97S1x0aW1lcyAxfV5UXCwgRlwsIDFfe0ogXHRpbWVzIDF9JCByZXByZXNlbnRhIGVsIG7Dum1lcm8gdG90YWwgZGUgaW5kaXZpZHVvcyBlbiBsYSB0YWJsYS4NCg0KRXMgY2xhcm8gcXVlIGxhcyBmcmVjdWVuY2lhcyBhYnNvbHV0YXMgbm8gc29uIGFkZWN1YWRhcyBwYXJhIGNvbXBhcmFyIGZpbGFzIG8gY29sdW1uYXMsIHBvciBsbyBxdWUgc2UgcmVjdXJyZSBhIGxhIG1hdHJpeiBkZSBmcmVjdWVuY2lhcyByZWxhdGl2YXMgKG1hdHJpeiBkZSBjb3JyZXNwb25kZW5jaWEpICRQJC4gRXN0YSBtYXRyaXogc2UgZGVmaW5lIGV4cGzDrWNpdGFtZW50ZSBjb21vIGxhIG1hdHJpeiBkZSBvcmRlbiAkSyBcdGltZXMgSiQgcXVlIGNlbnRyYSBsYSB0YWJsYSBzaWd1aWVudGU6DQoNCg0KJCRQPSBcYmVnaW57cG1hdHJpeH0NClhcc2V0bWludXMgWSAmIDEgJiAyICYgXGxkb3RzICYgSiAmIFxtYm94e01hcmdpbmFsIGZpbGF9XFwgDQpcaGxpbmUNCjEgJiBwX3sxMX0gJiBwX3sxMn0gJiBcbGRvdHMgICYgcF97MUp9ICYgZl8xIFxcIA0KMiAmIHBfezIxfSAmIHBfezIyfSAmIFxsZG90cyAgJiBwX3sySn0gJiBmXzJcXCANClx2ZG90cyAgJiAgJiAgJiAgJiAgJiBcdmRvdHMgXFwgDQpLICYgcF97SzF9ICYgcF97SzJ9ICYgXGxkb3RzICYgcF97S0p9ICYgZl9LXFwgDQpcaGxpbmUNClxtYm94e01hcmdpbmFsIGNvbHVtbmF9ICYgY18xICYgY18yICYgXGxkb3RzICYgY19KICYgMQ0KXGVuZHtwbWF0cml4fSwkJA0KDQpkb25kZQ0KDQpcYmVnaW57YWxpZ24qfQ0KIHBfe2lqfSAmPSBcOyBcZnJhY3tGX3tpan19e259LFxcIA0KZl9pICY9IFxzdW1cbGltaXRzX3tqPTF9XntKfXBfe2lqfSxccXF1YWQgDQpjX2ogPSBcc3VtXGxpbWl0c197aT0xfV57S31wX3tpan0gXHF1YWQgXG1ib3h7eX1cXCANClxzdW1cbGltaXRzX3tqPTF9XntKfWNfaiAmPSBcc3VtXGxpbWl0c197aT0xfV57S31mX2kgXDs9IFw7IFxzdW1cbGltaXRzX3tpPTF9XntKfVxzdW1cbGltaXRzX3tqPTF9XntLfXBfe2lqfT0xLg0KXGVuZHthbGlnbip9DQoNCg0KDQoqKkVqZW1wbG8uKiogDQoNClbDqWFzZSBsYSBGaWd1cmEgXEByZWYoZmlnOkNvbG9yMikuDQoNCg0KPGNlbnRlcj4NCmBgYHtyIENvbG9yMiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKk1hdHJpeiAkUCQgKEZyZWN1ZW5jaWFzIHJlbGF0aXZhcykqKiIsIG91dC53aWR0aCA9ICI3MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQ29sb3IyLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1hcmdpbmFsZXMNCg0KXG5vaW5kZW50IERlbm90YXJlbW9zIGNvbW8gJGZfaSQgbGEgZnJlY3VlbmNpYSBtYXJnaW5hbCBkZSBsYSBpLcOpc2ltYSBmaWxhIHkgY29tbyAkY19qJCBsYSBmcmVjdWVuY2lhIG1hcmdpbmFsIGRlIGxhICRqJC3DqXNpbWEgY29sdW1uYSwgZG9uZGUgJGk9MSxcbGRvdHMsIEskIHkgJGo9MSxcbGRvdHMsIEokLCBvIGRlIG1hbmVyYSB2ZWN0b3JpYWw6DQoNCiQkIGYgPSBQXCwgMV97Slx0aW1lcyAxfSBccXF1YWRcbWJveHt5fVxxcXVhZCBjID0gUF5UXCwgMV97S1x0aW1lcyAxfSwgJCQNCg0KdmVjdG9yZXMgcXVlIHJlcHJlc2VudGFuIGxhcyAqZnJlY3VlbmNpYXMgbWFyZ2luYWxlcyBkZSBmaWxhcyogeSAqY29sdW1uYXMqLCByZXNwZWN0aXZhbWVudGUuDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBJbmRlcGVuZGVuY2lhDQoNCiMjIyBFbCBlc3RhZMOtc3RpY28NCg0KRXMgY29ub2NpZG8gcXVlIGVsIGVzdGFkw61zdGljbyBtw6FzIGZyZWN1ZW50ZW1lbnRlIGVtcGxlYWRvIHBhcmEgYW5hbGl6YXIgbGEgaW5kZXBlbmRlbmNpYSBlc3RhZMOtc3RpY2EgZW50cmUgZG9zIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgZXM6DQoNClxiZWdpbnthbGlnbn0NClhfeyhLLTEpXHRpbWVzIChKLTEpfV4yICY9IFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KEZfe2lqfS1FXGxlZnRbRl97aWp9KVxyaWdodF1eMn17RShGX3tpan0pfSA9IG5eMiBcc3VtX3tpPTF9XntKfVxzdW1fe2o9MX1ee0t9IFxmcmFje1xsZWZ0W1xmcmFje0Zfe2lqfX17bn0tRSggXGZyYWN7Rl97aWp9fXtufSlccmlnaHRdXjJ9e0UoRl97aWp9KX0gXG5vdGFnXFwgDQomPSBcc3VtX3tpPTF9XntKfVxzdW1fe2o9MX1ee0t9IFxmcmFje1xsZWZ0W1xmcmFje0Zfe2lqfX17bn0gLSBFKFxmcmFje0Zfe2lqfX17bn0pXHJpZ2h0XV4yfXtFXGxlZnRbXGZyYWN7Rl97aWp9fXtufVxyaWdodF19ID0gbl4yIFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KHBfe2lqfSAtIGVfe2lqfSleMn17ZV97aWp9fSwgKFwjZXE6ZWMtNC0xKQ0KXGVuZHthbGlnbn0NCg0KXG5vaW5kZW50IGRvbmRlOiANCiAgDQogICsgJEUoRl97aWp9KSQgcmVwcmVzZW50YSBsYSBmcmVjdWVuY2lhIGFic29sdXRhIGVzcGVyYWRhIGVuIGxhIGNhc2lsbGEgJChpLGopJCBkZSBsYSBtYXRyaXogJEYkLCB5IA0KICANCiAgKyAkZV97aWp9JCBlcyBsYSBmcmVjdWVuY2lhIHJlbGF0aXZhIGVzcGVyYWRhIGVuIGxhIGNhc2lsbGEgJChpLCBqKSQgZGUgbGEgbWF0cml6IGRlIGNvcnJlc3BvbmRlbmNpYSAkUCQuDQoNCk9ic2VydmVtb3MgcXVlLCBkZSBcQHJlZihlcTplYy00LTEpLCBzZSB0aWVuZSBxdWUNCg0KJCQgXGZyYWN7MX17bn0gWF97KEstMSlcdGltZXMgKEotMSl9XjI9IFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KHBfe2lqfSAtIGVfe2lqfSleMn17ZV97aWp9fS4gJCQNCg0KDQoqKlBhcmEgZWwgZWplbXBsbzoqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnRhYmxhPC1kZlstMV0NCmNoaXNxX3Rlc3QgPC0gY2hpc3EudGVzdCh0YWJsYSkNCmNoaXNxX3Rlc3QNCmBgYA0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1hdHJpY2VzIGRlIHJlc2lkdW9zIGVzdGFuZGFyaXphZG9zDQoNClNpIGRlZmluaW1vcyAkRF9mJCB5ICREX2MkIGNvbW8gbGFzIG1hdHJpY2VzIGRpYWdvbmFsZXMgJERfZiA9IFx0ZXh0e2RpYWd9KGYpX3tJXHRpbWVzIEl9JCB5ICREX2MgPSBcdGV4dHtkaWFnfShjKV97Slx0aW1lcyBKfSQsIHJlcHJlc2VudGFuZG8gbGFzIGZyZWN1ZW5jaWFzIG1hcmdpbmFsZXMgZGUgZmlsYXMgeSBjb2x1bW5hcyByZXNwZWN0aXZhbWVudGUsIGVudG9uY2VzIGxhIG1hdHJpeg0KDQpcYmVnaW57ZXF1YXRpb259IA0KUyA9IERfZl57LTEvMn0gKFAtZlw7IGNeVCkgRF9jXnstMS8yfSAgICAgKFwjZXE6ZWMtNC0yKQ0KXGVuZHtlcXVhdGlvbn0NCg0KXG5vaW5kZW50IGVzIGxhICptYXRyaXogZGUgcmVzaWR1b3MgZXN0YW5kYXJpemFkb3MqLiBTZSBwdWVkZSBkZW1vc3RyYXIgcXVlIA0KDQokJFNcLCBTXlRccXVhZCBcdGV4dHt5fSBccXVhZCBTXlRcLCBTJCQNCg0Kc29uIG1hdHJpY2VzIHNpbcOpdHJpY2FzLCBjdXlhIHRyYXphIGVzIHByZWNpc2FtZW50ZSBlbCBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIGVuIGxhIHBydWViYSBkZSBpbmRlcGVuZGVuY2lhIHBhcmEgZG9zIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMsIGVzIGRlY2lyLA0KDQokJFx0ZXh0e3RyYXphfShTU15UKSA9IFx0ZXh0e3RyYXphfShTXlRTKSBcc3VtX3tpPTF9XntKfVwsIFxzdW1fe2o9MX1ee0t9IFxmcmFjeyhwX3tpan0gXDsgLSBcOyBmX2kgXCwgY19qKV4yfXtlX3tpan19LiQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRGVzY29tcG9zaWNpw7NuIGVuIHZhbG9yZXMgc2luZ3VsYXJlcw0KDQpcbm9pbmRlbnQgU2kgcmVhbGl6YW1vcyBsYSBkZXNjb21wb3NpY2nDs24gZW4gdmFsb3JlcyBzaW5ndWxhcmVzIGRlIGxhIG1hdHJpeiAkUyQsIG9idGVuZW1vczoNCg0KXGJlZ2lue2VxdWF0aW9ufQ0KUyBcOz1cOyAgVVwsRF97XGxhbWJkYX1cLCBWXlQsKFwjZXE6ZWMtNC0zKQ0KXGVuZHtlcXVhdGlvbn0NCg0KXG5vaW5kZW50IGRvbmRlDQoNCiQkVVVeVCA9IElfSywgXDsgVlZeVCA9IElfSiBccXVhZCBcdGV4dHt5fSBccXVhZCBEX1xsYW1iZGEgPSBcdGV4dHtkaWFnfShcbGFtYmRhXzEsXGxhbWJkYV8yLCBcbGRvdHMsKV97S1x0aW1lcyBKfSwkJA0KDQpcbm9pbmRlbnQgc2llbmRvICREX1xsYW1iZGEkIHVuYSBtYXRyaXogZGlhZ29uYWwgeSBsb3MgJFxsYW1iZGFfaSQsICRpID0gMSwgXGxkb3RzLCBcdGV4dHtyYW5nfShTKSA9IHQkLCBsYXMgcmHDrWNlcyBjdWFkcmFkYXMgcG9zaXRpdmFzIGRlIGxvcyAkdCQgdmFsb3JlcyBwcm9waW9zIGRlIGxhcyBtYXRyaWNlcyBzaW3DqXRyaWNhcyAkU1wsU15UJCB5ICRTXlRcLFMkLiBMb3MgJHQkIHByaW1lcm9zIHZlY3RvcmVzIGRlIGxhcyBtYXRyaWNlcyBvcnRvZ29uYWxlcyAkVSQgeSAkViQgc29uIGxvcyB2ZWN0b3JlcyBwcm9waW9zIGRlIGxhcyBtYXRyaWNlcyAkUydTJCB5ICRTUyckLCByZXNwZWN0aXZhbWVudGUuIA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEJhc2UNCg0KTG9zICR0JCBwcmltZXJvcyB2ZWN0b3JlcyBkZSAkVSQgY29uc3RpdHV5ZW4gdW5hIGJhc2UgcGFyYSBlbCBzdWJlc3BhY2lvIGdlbmVyYWRvIHBvciBsYXMgZmlsYXMgZGUgJFAkIHkgbG9zICR0JCBwcmltZXJvcyB2ZWN0b3JlcyBkZSBsYSBtYXRyaXogJFYkIGNvbnN0aXR1eWVuIHVuYSBiYXNlIHBhcmEgZWwgc3ViZXNwYWNpbyBnZW5lcmFkbyBwb3IgbGFzIGNvbHVtbmFzIGRlICRQJC4gRXMgZGVjaXIsIHNpIGNvbnN0cnVpbW9zIGxhcyBtYXRyaWNlcyAkVV97dFx0aW1lcyB0fSQsICRWX3t0XHRpbWVzIHR9JCB5ICREX1xsYW1iZGEsX3t0XHRpbWVzIHR9JCwgbGEgbWF0cml6IA0KDQokJFNfe3RcdGltZXMgdH0gXDs9XDsgIFVfe3RcdGltZXMgdH1cLCBEX1xsYW1iZGEsX3t0XHRpbWVzIHR9XCwgVl97dFx0aW1lcyB0fSQkDQoNCnNlcsOhIGxhIG1hdHJpeiBkZSByYW5nbyBtw61uaW1vIHF1ZSBtZWpvciBzZSBhcHJveGltYSBhIGxhIG1hdHJpeiAkUyQuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUHJvYmxlbWEgQ0ENCg0KQXPDrSwgZWwgcHJvYmxlbWEgZGUgYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYSBzaW1wbGUgc2UgcHVlZGUgZXhwcmVzYXIgY29tbyB1biBwcm9ibGVtYSBkZSBtw61uaW1vcyBjdWFkcmFkb3MgcG9uZGVyYWRvcyBwYXJhIGRldGVybWluYXIgbGEgbWF0cml6ICRcd2lkZWhhdHtlfSA9IChcd2lkZWhhdHtlfV97aWp9KSA9IGZcLGMkLCBkZSByYW5nbyByZWR1Y2lkbyBxdWUgbWluaW1pemEgbGENCg0KJCRcdGV4dHt0cmF6YX0oU1wsIFNeVCkgXDs9XDsgXHRleHR7dHJhemF9KFNeVFwsIFMpIFwsIFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KHBfe2lqfSBcOy1cOyBmX2kgXCxjX2opXjJ9e2Vfe2lqfX0uJCQNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMgUGVyZmlsZXMgZmlsYSB5IGNvbHVtbmFzDQoNClNlIGhhbGxhbiBkaXZpZGllbmRvIGxhIGZyZWN1ZW5jaWEgcmVsYXRpdmEgZW50cmUgZWwgdG90YWwgZGUgZmlsYSBvIGNvbHVtbmEgY29ycmVzcG9uZGllbnRlLiAgTG9zIHBlcmZpbGVzIGRlIGZpbGEgeSBjb2x1bW5hIHNlIHB1ZWRlbiBjb21wYXJhciBjb24gbGFzIGRpc3RyaWJ1Y2lvbmVzIGNvcnJlc3BvbmRpZW50ZXMgZGUgY29sdW1uYSB5IGZpbGEsIGNvbnNpZGVyYW5kbyBzdSByZXNwZWN0aXZhIGltcG9ydGFuY2lhLCBwYXJhIGV2YWx1YXIgc3UgZGVzdmlhY2nDs24gZGUgbGEgaW5kZXBlbmRlbmNpYS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUGVyZmlsZXMgZmlsYSANCg0KIyMjIE1hdHJpeiBkZSBwZXJmaWxlcyBmaWxhcyANCg0KKipFamVtcGxvLioqIA0KDQpWw6lhc2UgbGEgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjMpLg0KDQoNCjxjZW50ZXI+DQpgYGB7ciBDb2xvcjMsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipNYXRyaXogZGUgcGVyZmlsZXMgZmlsYSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjMucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgRGlhZ3JhbWEgZGUgcGVyZmlsZXMgZmlsYSANCg0KIEVuIGxhIHJlcHJlc2VudGFjacOzbiBkZWwgcGVyZmlsIGRlbCAqKmNvbG9yIGRlIG9qb3MgZW4gcmVsYWNpw7NuIGNvbiBlbCBjb2xvciBkZWwgY2FiZWxsbyoqLCBzZSBvYnNlcnZhIHVuYSBzaW1pbGl0dWQgY29uc2lkZXJhYmxlIGVudHJlIGxvcyBwZXJmaWxlcyBkZSAqb2pvcyBjbGFyb3MqIHkgKm9qb3MgYXp1bGVzKiwgcXVlIGVzIHNpbWlsYXIgKGF1bnF1ZSBsaWdlcmFtZW50ZSBtZW5vcikgYSBsYSBzaW1pbGl0dWQgbyBwcm94aW1pZGFkIGVudHJlIGxvcyBwZXJmaWxlcyBkZSAqb2pvcyBtZWRpb3MqIHkgKm9zY3Vyb3MqICh2ZXIgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjQpKS4NCg0KPGNlbnRlcj4NCmBgYHtyIENvbG9yNCwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkhpc3RvZ3JhbWEgZGUgcGVyZmlsZXMgZmlsYSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjQucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQotPg0KDQojIFBlcmZpbGVzIGNvbHVtbmENCg0KIyMjIE1hdHJpeiBkZSBwZXJmaWxlcyBjb2x1bW5hDQoNCg0KKipFamVtcGxvLioqIA0KDQpWw6lhc2UgbGEgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjUpLg0KDQoNCjxjZW50ZXI+DQpgYGB7ciBDb2xvcjUsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipNYXRyaXogZGUgcGVyZmlsZXMgY29sdW1uYSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjUucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIERpYWdyYW1hIGRlIHBlcmZpbGVzIGNvbHVtbmENCg0KRW4gZWwgYW7DoWxpc2lzIGRlbCAqKnBlcmZpbCBkZSBjb2xvciBkZWwgY2FiZWxsbyoqLCBzZSBvYnNlcnZhIHVuYSBzaW1pbGl0dWQgbm90YWJsZSBlbnRyZSBsb3MgcGVyZmlsZXMgZGUgKmNhYmVsbG8gcnViaW8qIHkgKnJvam8qLCBhc8OtIGNvbW8gZW50cmUgbG9zICpjYWJlbGxvcyBvc2N1cm8qIHkgKm5lZ3JvKi4gUG9yIG90cm8gbGFkbywgZWwgcGVyZmlsIGRlICpjYWJlbGxvIG1lZGlvKiBzZSBkaXN0aW5ndWUgbm90YWJsZW1lbnRlIGRlIGxvcyBkZW3DoXMgcGVyZmlsZXMuIEVzdG8gc2UgcHVlZGUgYXByZWNpYXIgZW4gbGEgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjYpLg0KDQo8Y2VudGVyPg0KYGBge3IgQ29sb3I2LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqSGlzdG9ncmFtYSBkZSBwZXJmaWxlcyBjb2x1bW5hKioiLCBvdXQud2lkdGggPSAiNzAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkNvbG9yNi5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIERpc3RhbmNpYXMgY2hpLWN1YWRyYWRhcw0KDQojIyMgRGlzdGFuY2lhIGVudHJlIGZpbGFzIG8gY29sdW1uYXMNCg0KRXMgbGEgZGlzdGFuY2lhIGVudHJlIGZpbGFzIHkgY29sdW1uYXMgZGUgbGEgbWF0cml6IGRlIGRhdG9zLiBQYXJhIGV4cGxpY2FybGEsIG51ZXZhbWVudGUsIGNvbnNpZGVyZW1vcyBsYSBtYXRyaXogJFAkLiBTdXBvbmdhbW9zIHF1ZSBsYXMgZmlsYXMgJGkkIHkgJGokIHRpZW5lbiBsYSBzaWd1aWVudGUgY29uZmlndXJhY2nDs246DQoNCg0KPHRhYmxlIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogNTAlOyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyI+DQogIDx0ciBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPiRpJDwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDE1PC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4wMjwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDE8L3RoPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAyPC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+JGZfaT0wLjA3NSQ8L3RoPg0KICA8L3RyPg0KICA8dHIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4kaiQ8L3RoPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAwMTU8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAwMjwvdGQ+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDAxPC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4wMDI8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4kZl9qPTAuMDA3NSQ8L3RkPg0KICA8L3RyPg0KPC90YWJsZT4NCg0KDQoNCkFwYXJlbnRlbWVudGUsIGxhIGZpbGEgJGkkIHBhcmVjZSBtw6FzIGRlbnNhIHF1ZSBsYSBmaWxhICRqJC4gRW4gbGEgZmlsYSAkaSQgc2UgZW5jdWVudHJhIGVsICQ3LjUlJCBkZSBsYSBwb2JsYWNpw7NuLCBtaWVudHJhcyBxdWUgZW4gbGEgZmlsYSAkaiQgc29sbyBlbCAkMC43NSUkLiBTaSBubyBjb25zaWRlcmFtb3MgZWwgdGFtYcOxbywgbGFzIGZyZWN1ZW5jaWFzIHJlbGF0aXZhcyBpbnRyYWZpbGEgc29uIGlkw6ludGljYXMgZW4gY2FkYSBmaWxhLiBQb3IgbG8gdGFudG8sIHBhcmEgYW5hbGl6YXIgbGFzIGRpZmVyZW5jaWFzIHJlbGF0aXZhcyBlbnRyZSBmaWxhcywgZGViZW1vcyBjb3JyZWdpciBlbCBlZmVjdG8gdGFtYcOxby4gRXN0byBzZSBsb2dyYSBjb25zaWRlcmFuZG8gbGEgbWF0cml6IGN1eW9zIGVsZW1lbnRvcyBzb24gZGUgbGEgZm9ybWEgJHBfe2lqfS9mX2kkIHBhcmEgbGFzIGZpbGFzIHkgJHBfe2lqfS9jX2okIHBhcmEgbGFzIGNvbHVtbmFzLCBvYnRlbmllbmRvIGFzw60gZG9zIG1hdHJpY2VzLg0KDQpPdHJvIHByb2JsZW1hIGFsIHF1ZSBub3MgZW5mcmVudGFtb3MgZXMgc2kgbGFzIGZpbGFzICRpLCBqJCB5ICRrJCBkZSBsYSBtYXRyaXogcG9uZGVyYWRhIHBvciBsYXMgbWFyZ2luYWxlcyBkZSBsYXMgZmlsYXMgc29uOg0KDQo8dGFibGUgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiA1MCU7IG1hcmdpbi1sZWZ0OiBhdXRvOyBtYXJnaW4tcmlnaHQ6IGF1dG87Ij4NCiAgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+JGkkPC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4xNTwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDI8L3RoPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjEwPC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC40MzwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMzA8L3RoPg0KICA8L3RyPg0KICA8dHIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4kaiQ8L3RoPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjE1PC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4wMjwvdGQ+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMTA8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjQ0PC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4yOTwvdGQ+DQogIDwvdHI+DQogIDx0ciBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPiRrJDwvdGg+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMTU8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAxPC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4xMDwvdGQ+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuNDQ8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjMwPC90ZD4NCiAgPC90cj4NCjwvdGFibGU+DQoNCk9ic2VydmUgcXVlIGxhIGRpc3RhbmNpYSBldWNsaWRpYW5hIGVudHJlIGxhcyBmaWxhcyAkaSQgeSAkaiQsIHkgZW50cmUgbGFzIGZpbGFzICRpJCB5ICRrJCwgc2UgZGVmaW5lbiBjb21vOg0KDQpcYmVnaW57YWxpZ24qfQ0KZF9lXjIoaSxqKSAmPSBcc3VtX3tsPTF9XntKfVxsZWZ0IChcZnJhY3twX3tpbH19e2ZfaX0gLSBcZnJhY3twX3tqbH19e2Zfan1ccmlnaHQpXjJcXA0KJj0gKDAuNDMtMC40NCleMiBcOytcOyAoMC4zMC0wLjI5KV4yIFw7PVw7IDAuMDAwMlxcDQomXFwNCmRfZV4yKGksaykgJj1cc3VtX3tsPTF9XntKfVxsZWZ0IChcZnJhY3twX3tpbH19e2ZfaX0gLSBcZnJhY3twX3trbH19e2Zfa31ccmlnaHQpXjIgXFwNCiY9ICgwLjQzLTAuNDQpXjIgXDsrXDsgKDAuMDItMC4wMSleMiBcOz1cOyAwLjAwMDIsDQpcZW5ke2FsaWduKn0NCg0KRXN0byBlcyBjbGFyYW1lbnRlIHByb2JsZW3DoXRpY28sIHlhIHF1ZSBubyBlcyBsbyBtaXNtbyB1bmEgZGlzY3JlcGFuY2lhIGRlIDAuMDEgZW50cmUgMC4yOSB5IDAuMzAsIHF1ZSBlbnRyZSAwLjAxIHkgMC4wMi4gDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBEaXN0YW5jaWEgZW50cmUgZmlsYXMNCg0KVW5hIGZvcm1hIGRlIGNvcnJlZ2lyIGVzdGUgcHJvYmxlbWEgZXMgcG9uZGVyYW5kbyBjYWRhIGVsZW1lbnRvIGRlIGxhIHN1bWEgcG9yIGVsIG1hcmdpbmFsIGRlIGxhIGNvbHVtbmEgY29ycmVzcG9uZGllbnRlOg0KDQokJGReMiAoZl9pLCBmX2opID0gXHN1bV97bD0xfV57Sn1cZnJhY3sxfXtjX2x9XGxlZnQoXGZyYWN7cF97aWx9fXtmX2l9IC0gXGZyYWN7cF97amx9fXtmX2p9XHJpZ2h0ICleMiA9IChmX2kgLSBmX2opXlRcLCBEX2Neey0xfSBcLCAoZl9pIC0gZl9qKSwkJA0KDQpEb25kZToNCiAgDQogICsgJGZfaSQgeSAkZl9qJCBzb24gbG9zIHZlY3RvcmVzIGN1eW9zIGVsZW1lbnRvcyBzb24gbGFzIGZpbGFzICRpJCB5ICRqJCwgcmVzcGVjdGl2YW1lbnRlLCBkZSBsYSBtYXRyaXogJFAkOyB5IA0KICANCiAgKyAkRF9jJCBlcyB1bmEgbWF0cml6IGRpYWdvbmFsIGNvbiBlbGVtZW50b3MgJGNfbCQuIEEgZXN0YSBkaXN0YW5jaWEgc2UgbGUgY29ub2NlIGNvbiBlbCBub21icmUgZGUgKmRpc3RhbmNpYSBjaGktY3VhZHJhZG8qLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBEaXN0YW5jaWEgZW50cmUgY29sdW1uYXMNCg0KVXRpbGl6YW5kbyB1biBwcm9jZWRpbWllbnRvIGFuw6Fsb2dvIHNlIG9idGllbmVuIGxhcyBkaXN0YW5jaWFzIGNoaS1jdWFkcmFkbyBlbnRyZSBkb3MgY29sdW1uYXMgJGokIHkgJGskIGRlIGVzYSBtYXRyaXogZGUgZGF0b3MsIGFzw606DQoNCiQkZF4yIChjX2osIGNfaykgXDs9XDsgXHN1bV97bD0xfV57S31cZnJhY3sxfXtmX2x9XGxlZnQoXGZyYWN7cF97bGp9fXtjX2p9IC0gXGZyYWN7cF97bGt9fXtjX2t9XHJpZ2h0ICleMiBcOz1cOyAoY19qIC0gY19rKV5UIFwsRF9mXnstMX1cLCAoY19qIC0gY19rKSwkJA0KDQpkb25kZToNCiAgDQogICsgJGZfaiQgeSAkZl9rJCBzb24gbG9zIHZlY3RvciBjdXlvcyBlbGVtZW50b3Mgc29uIGxhcyBjb2x1bW5hcyAkaSQgeSAkaiQsIHJlc3BlY3RpdmFtZW50ZSwgZGUgbGEgbWF0cml6ICRQJDsgeSANCiAgDQogICsgJERfZiQsIGVzIHVuYSBtYXRyaXogZGlhZ29uYWwgY29uIGVsZW1lbnRvcyAkZl9sJC4NCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRGlzdGFuY2lhIChvYnNlcnZhY2lvbmVzKQ0KDQoqKlByaW1lcm8uKioNCg0KTm90ZSBxdWUgbG9zIHZhbG9yZXMgZGUgbGFzIGRpc3RhbmNpYXMgYW50ZXJpb3JlcyBtaWRlbiBsYSBkaXN0YW5jaWEgZW50cmUgZG9zIGRpc3RyaWJ1Y2lvbmVzIG11bHRpbm9taWFsZXMuIEVzIGRlY2lyLCBwZXJtaXRlbiBjb21wYXJhciBsb3MgaGlzdG9ncmFtYXMgKGRpc3RyaWJ1Y2lvbmVzIGVtcMOtcmljYXMpIHBvciBjYWRhIHBhciBkZSBmaWxhcyBvIGNvbHVtbmFzLg0KDQoNCioqU2VndW5kby4qKg0KDQpPYnNlcnZlIHRhbWJpw6luIHF1ZSBlc3RhIGRpc3RhbmNpYSBjaGktY3VhZHJhZG8gZXMgZXF1aXZhbGVudGUgYSBsYSBkaXN0YW5jaWEgZXVjbGlkaWFuYSwgc2kgc2UgdG9tYSBjb21vIHB1bnRvcyBlbiBlbCBjYXNvIGRlIGxhcyBmaWxhcywgcGFyYSBsYXMgZmlsYXMgJGkkIHkgJEskLCBsYXMgZGUgY29vcmRlbmFkYXM6IA0KDQokJFdfaSA9IFxsZWZ0KFxmcmFje3Bfe2kxfX17Zl9pIFwsIFxzcXJ0e2NfMX19LCBcbGRvdHMsIFxmcmFje3Bfe2lKfX17Zl9pXCxcc3FydHtjX0p9fVxyaWdodCkgXHF1YWQgXG1ib3h7eX1ccXVhZCBXX2ogPSBcbGVmdChcZnJhY3twX3trMX19e2ZfayBcLCBcc3FydHtjXzF9fSwgXGxkb3RzLCBcZnJhY3twX3trSn19e2ZfayBcLCBcc3FydHtjX0p9fVxyaWdodCksJCQgDQpyZXNwZWN0aXZhbWVudGUuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDZW50cm8gZGUgZ3JhdmVkYWQNCg0KRXMgaW1wb3J0YW50ZSByZXNhbHRhciBxdWUgbGFzIGRpc3RhbmNpYXMgbm8gc2UgY2FsY3VsYW4gZW50cmUgbGFzIGZpbGFzIG8gbGFzIGNvbHVtbmFzLCBzaW5vIHF1ZSBzZSBleHByZXNhbiBlbiByZWxhY2nDs24gY29uIHN1IGNlbnRybyBkZSBtYXNhLCBxdWUgcG9kZW1vcyBkZWZpbmlyIGNvbW8gZWwgcHJvbWVkaW8gcG9uZGVyYWRvIGRlIGVzYSBjb2x1bW5hIHBvciBzdSBtYXNhLiANCiAgDQogICsgRW4gZWwgY2FzbyBkZSBsYXMgY29sdW1uYXMsIGVzdG8gc2UgY29udmllcnRlIGVuIGVsIHZlY3RvciBkZSBjb2x1bW5hcyBnZW5lcmFkbyBwb3IgbGFzIG1hcmdpbmFsZXMgZGUgbGFzIGZpbGFzLCAkZiQuDQogIA0KICArIERlIG1hbmVyYSBzaW1pbGFyLCBlbiBlbCBjYXNvIGRlIGxhcyBmaWxhcywgZWwgdmVjdG9yIGRlIGZpbGFzIGdlbmVyYWRvIHBvciBsYXMgbWFyZ2luYWxlcyBkZSBsYXMgY29sdW1uYXMsICRjJC4gDQogIA0KDQpFc3RvIGVzIGFwbGljYWJsZSBjdWFuZG8gc2UgYW5hbGl6YSBsYSBtYXRyaXogZGUgcGVyZmlsZXMgKGRpc3RhbmNpYSBjaGktY3VhZHJhZG8pIHBhcmEgbGFzIGZpbGFzLg0KDQoNClNpIGVsIGFuw6FsaXNpcyBzZSByZWFsaXphIGNvbiBsYSBtYXRyaXogY3V5b3MgZWxlbWVudG9zIHNvbiBkZSBsYSBmb3JtYSAkV19pJCwgJGkgPSAxLFxsZG90cywgSyQgKHV0aWxpemFuZG8gbGEgZGlzdGFuY2lhIGV1Y2xpZGlhbmEpLCBlbCBjZW50cm8gZGUgbWFzYSBwYXJhIGxhcyBmaWxhcyBzZXLDrWEgJFxzcXJ0e1xzcXJ0e2N9fSQsIGNvbW8gc2UgbXVlc3RyYSBhIGNvbnRpbnVhY2nDs246DQoNClBhcmEgY2FsY3VsYXIgZWwgY2VudHJvIGRlIG1hc2EgJFxzcXJ0e2N9JCBkZSBsYSBudWJlIGRlIHB1bnRvcyBnZW5lcmFkYSBwb3IgbGFzIGZpbGFzICRXXzEsXGxkb3RzLCBXX0skLCBwb25kZXJhbmRvIGNvbiBsb3MgcGVzb3MgZGUgbGFzIGNvbHVtbmFzIGNvcnJlc3BvbmRpZW50ZXMsIHRlbmRyw61hbW9zIHBhcmEgbGEgaS3DqXNpbWEgY29vcmRlbmFkYSBkZWwgdmVjdG9yICRcc3FydHtjfSQsICRpPTEsXGxkb3RzLCBKJDoNCg0KXGJlZ2lue2FsaWduKn0NClxzcXJ0e2NfaX0gJj0gZl8xIFxsZWZ0KFxmcmFje3BfezFpfX17Zl8xXHNxcnR7Y19pfX1ccmlnaHQpICsgZl8yIFxsZWZ0KFxmcmFje3BfezJfaX19e2ZfMlxzcXJ0e2NfaX19XHJpZ2h0KSArIFxjZG90cyArIGZfS1xsZWZ0KFxmcmFje3Bfe0tpfX17Zl9LXHNxcnR7Y19pfX1ccmlnaHQpIFxcDQomPSBcZnJhY3sxfXtcc3FydHtjX2l9fSAoZl97MWl9K2ZfezJpfSArIFxjZG90cyArIGZfe0tpfSlcXA0KJj0gXGZyYWN7MX17XHNxcnR7Y19pfX1jX2lcXA0KJj0gIFxzcXJ0e2NfaX0NClxlbmR7YWxpZ24qfQ0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRGlzdGFuY2lhIHBlcmZpbCBhbCBjZW50cm8gZGUgZ3JhdmVkYWQNCg0KTGEgZGlzdGFuY2lhIGRlbCBwZXJmaWwgZGUgZmlsYSAkaSQgYSBzdSBjZW50cm8gZGUgZ3JhdmVkYWQgKGNoaS1jdWFkcmFkbykgc2UgZGVmaW5lIGNvbW86DQoNCiQkZF4yIFwsKGZfaSwgXDtjKSBcOyA9XDsgIFxzdW1fe2w9MX1ee0t9IFxmcmFjezF9e2NfbH1cbGVmdChcZnJhY3twX3tpbH19e2ZfaX0gLSBjX2xccmlnaHQpXjIgXDs9XDsgXHN1bV97bD0xfV57S30gXGxlZnQoXGZyYWN7cF97aWx9fXtmX2lcLCBcc3FydHtjX2x9fSAtIFxzcXJ0e2NfbH1ccmlnaHQpXjIgPSBkX2UgXCwoZl9pLFw7IGMpLiQkDQoNCkFsIGNhbGN1bGFyIGxhIGRpc3RhbmNpYSBlbnRyZSB1bmEgZmlsYSB5IHN1IGNlbnRybyBkZSBncmF2ZWRhZCwgZW4gcmVhbGlkYWQgZXN0YW1vcyBjYWxjdWxhbmRvIHVuYSBwYXJ0ZSBkZSBsYSB2YXJpYW56YSBvIHVuYSBjb3ZhcmlhbnphLiBFbiByZXN1bWVuLCBsYSBkaXNwZXJzacOzbiB0b3RhbCBkZSBsYXMgZmlsYXMgZXMgbGEgc3VtYSBwb25kZXJhZGEgZGUgbGFzIGRpZmVyZW5jaWFzIGFsIGN1YWRyYWRvIGRlIGNhZGEgZWxlbWVudG8gZGUgbGEgZmlsYSByZXNwZWN0byBhbCBjZW50cm8gZGUgZ3JhdmVkYWQuIA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBJbmVyY2lhDQoNCkxhIGNhbnRpZGFkICRcY2hpXjIvTiQgc2UgZGVub21pbmEgaW5lcmNpYSB0b3RhbC4gRXN0YSBpbmVyY2lhIHNlIGRlc2NvbXBvbmUgZW4gdW4gdG90YWwgZGUgJGskIHZhbG9yZXMgY2FyYWN0ZXLDrXN0aWNvcyAocHJvcGlvcyksIGNhZGEgdW5vIGRlIGxvcyBjdWFsZXMgY29uc3RpdHV5ZSBsYSBpbmVyY2lhIHByaW5jaXBhbCBkZSB1bmEgZGltZW5zacOzbi4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEluZXJjaWEgdG90YWwgZGUgbGFzIGZpbGFzDQoNClNpIGRlbm90YW1vcyBsYSBpbmVyY2lhIHRvdGFsIGRlIGxhcyBmaWxhcyBjb21vICRJX2YkLCBlbnRvbmNlcyBwdWVkZSBjYWxjdWxhcnNlIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNClxiZWdpbnthbGlnbip9DQpJX2YgJj0gXHN1bV97aT0xfV57S30gZl9pIFwsZF4yXCwgKGZfaSwgXDtjKVxcIA0KJj0gXHN1bV97aT0xfV57S30gXHN1bV97aj0xfV57Sn0gZl9pIFxmcmFjezF9e2Zfan1cbGVmdChcZnJhY3twX3tpan19e2ZfaX0gXDstXDsgY19qXHJpZ2h0KV4yXFwgDQogJj0gXHN1bV97aT0xfV57S30gXHN1bV97aj0xfV57Sn0gXGZyYWN7KHBfe2lqfS1mX2kgXHRpbWVzIGNfaileMn17Zl9pIFx0aW1lcyBjX2p9PSB0cmEoU15UXCwgUykuDQpcZW5ke2FsaWduKn0NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBJbmVyY2lhIHRvdGFsIGRlIGxhcyBjb2x1bW5hcw0KDQpEZSBtYW5lcmEgYW7DoWxvZ2EsIGxhIGRpc3BlcnNpw7NuIHRvdGFsIGRlIGxhcyBjb2x1bW5hcyAkSV9jJCwgc2UgZGVmaW5lIGNvbW86DQoNClxiZWdpbnthbGlnbip9DQpJX2MgJj0gXHN1bV97aj0xfV57Sn0gY19qIFwsIGReMiAoY19qLCBcO2YpXFwgDQogJj0gXHN1bV97aj0xfV57Sn0gXHN1bV97aT0xfV57S30gY19qIFxmcmFjezF9e2NfaX1cbGVmdChcZnJhY3twX3tpan19e2Nfan1cOy1cOyBmX2lccmlnaHQpXjJcXCANCiAmPSBcc3VtX3tqPTF9XntKfSBcc3VtX3tpPTF9XntLfSBcZnJhY3socF97aWp9LWZfaSBcdGltZXMgY19qKV4yfXtmX2kgXHRpbWVzIGNfan09IHRyYShTXCwgU15UKSBcOyA9XDsgIElfZi4NClxlbmR7YWxpZ24qfQ0KDQpTZSBvYnNlcnZhIHF1ZSBsYSBkaXNwZXJzacOzbiB0b3RhbCBkZSBsYXMgZmlsYXMgZXMgaWd1YWwgYSBsYSBkZSBsYXMgY29sdW1uYXMuIA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTWF0cmljZXMgZGUgaW5lcmNpYQ0KDQpMYXMgbWF0cmljZXMgJFxTaWdtYV9mID0gU15UXCwgUyQgeSAkXFNpZ21hX2MgPSBTXCwgU15UJCBzZSBkZW5vbWluYW4gKm1hdHJpY2VzIGRlIGluZXJjaWEgZGUgbGFzIGZpbGFzKiB5ICpjb2x1bW5hcyosIHJlc3BlY3RpdmFtZW50ZS4gDQogIA0KICArICRcU2lnbWFfZiQgZXMgcGFyYSBlbCBlc3BhY2lvIHF1ZSBkZWZpbmUgbG9zIHB1bnRvcyAkZl9pJCBkZSAkXG1hdGhiYntSfV5KJC4gDQogIA0KICArICRcU2lnbWFfYyQgZXMgcGFyYSBlbCBlc3BhY2lvIHF1ZSBkZWZpbmUgbG9zIHB1bnRvcyAkY19qJCBkZSAkXG1hdGhiYntSfV5LJC4NCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgVmFyaWFuemFzIGRlIGZpbGFzIHkgY29sdW1uYXMNCg0KTG9zIGVsZW1lbnRvcyBkZSBsYSBkaWFnb25hbCBkZSBsYSBtYXRyaXogJFxTaWdtYSQgcmVwcmVzZW50YW4gbGFzIHZhcmlhbnphcyBkZSBsYXMgZmlsYXMgbyBjb2x1bW5hcy4gYWRlbcOhcywgc3Ugc3VtYSBjb25zdGl0dXllIGxhIGRpc3BlcnNpw7NuIGV4cGxpY2FkYSBwb3IgY2FkYSBmYWN0b3IgZW4gZWwgbnVldm8gZXNwYWNpby4gTG9zIGF1dG92YWxvcmVzIGluZGljYW4gcXXDqSBwYXJ0ZSBkZSBlc2EgZGlzcGVyc2nDs24gZXN0w6EgZXhwbGljYWRhIHBvciBjYWRhIGZhY3Rvci4gDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgQ29vcmRlbmFkYXMgZGUgbG9zIHB1bnRvcw0KDQojIyMgICRpJCBlbiAkXG1hdGhiYntSfV5KJA0KDQpDb24gZWwgZmluIGRlIG9idGVuZXIgc3VzIHZhbG9yZXMgeSB2ZWN0b3JlcyBwcm9waW9zLCBxdWUgcGVybWl0aXLDoW4gY2FsY3VsYXIgbGFzIGNvb3JkZW5hZGFzIGRlIGxvcyBwdW50b3MgJGkkIGVuICRcbWF0aGJie1J9XkokLCBwYXJhIGVsIGVzcGFjaW8gZGUgJEokIGRpbWVuc2lvbmVzIHF1ZSBkZWZpbmVuIGxvcyBwdW50b3MgZmlsYSwgZXMgbmVjZXNhcmlvIGRpYWdvbmFsaXphciBsYSBtYXRyaXogJFxTaWdtYV9mJC4gRXN0YXMgY29vcmRlbmFkYXMgdGllbmVuIGxhIHNpZ3VpZW50ZSBmb3JtYToNCg0KJCRGXGFscGhhKGkpID0gXHN1bV97aj0xfV5KIFxtdV97XGFscGhhIFwsIGp9XGxlZnQoXGZyYWN7Zl97aWp9fXtmX2lcLCBcc3FydHtjX2p9fSAtIFxzcXJ0e2Nfan1ccmlnaHQpJCQNCg0KbyBlbiBmb3JtYSBtYXRyaWNpYWwgY29tbzoNCg0KJCRSXDs9XDsoRl9cYWxwaGEoaSkpX3tLXHRpbWVzIHR9IFw7PVw7IERfZl57LTF9XCwgKEZcOyAtXDsgZlwsIGMgKVwsIERfY157LTEvMn1cLCBVLCQkDQoNCmRvbmRlOiANCg0KKyAkXG11X1xhbHBoYSQgZXMgZWwgdmVjdG9yIHByb3BpbyAoY29sdW1uYXMgZGUgbGEgbWF0cml6ICRVJCkgZGUgJFxTaWdtYV9mJCwgY29ycmVzcG9uZGllbnRlIGFsIGZhY3RvciAkXGFscGhhJCwgJFxhbHBoYSA9IDEsIFxsZG90cywgdCQuIA0KDQorICRGX1xhbHBoYShpKSQgZXMgbGEgcHJveWVjY2nDs24gZGVsIHB1bnRvIGZpbGEgDQoNCiQkXGxlZnQoXGZyYWN7Zl97aTF9fXtmX2kgXHNxcnR7Y18xfX0gLSBcc3FydHtjXzF9LCBcZnJhY3tmX3tpMn19e2ZfaSBcc3FydHtjXzJ9fSAtIFxzcXJ0e2NfMn0sIFxsZG90cywgXGZyYWN7Zl97aVF9fXtmX2kgXHNxcnR7Y19RfX0gLSBcc3FydHtjX1F9XHJpZ2h0KSQkIA0KDQpzb2JyZSBlbCB2ZWN0b3IgJHVfXGFscGhhJC4gDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyAkaiQgZW4gJFxtYXRoYmJ7Un1eSyQNCg0KDQpEZSBtYW5lcmEgc2ltaWxhciwgc2Ugb2J0aWVuZW4gbGFzIGNvb3JkZW5hZGFzIHBhcmEgbG9zIHB1bnRvcyAkaiQgZGUgJFxtYXRoYmJ7Un1eSyQ6DQoNCiQkQ19cYWxwaGEoaik9XHN1bV97aT0xfSBcbGVmdChcZnJhY3twX3tpan19e2NfalxzcXJ0e2ZfaX19LSBcc3FydHtmX2l9XHJpZ2h0KVxudV97XGFscGhhIGl9LCQkDQoNCiBlbiBmb3JtYSBtYXRyaWNpYWwgY29tbzoNCg0KJCRDPShDX1xhbHBoYSAoaikpX3tQXHRpbWVzIHR9ID1EX2Neey0xfShGLWZcOyBjKSdEX2Zeey0xLzJ9ViwkJA0KDQpkb25kZSAkXG51X1xhbHBoYSQgZXMgZWwgdmVjdG9yIHByb3BpbyAoY29sdW1uYXMgZGUgbGEgbWF0cml6ICRWJCkgZGUgJFxTaWdtYV9jJCwgY29ycmVzcG9uZGllbnRlIGFsIGZhY3RvciAkXGFscGhhLCBcYWxwaGEgPSAxLCBcbGRvdHMsIHQkLiBUYW1iacOpbiBwb2RlbW9zIGV4cHJlc2FyIGVzdGFzIGNvb3JkZW5hZGFzIGNvbW86DQoNCiQkRl9cYWxwaGEoaSk9IFxmcmFje1xzcXJ0e1xsYW1iZGFfXGFscGhhfX17XHNxcnR7Zl9pfX0gXDsgXG51X3tcYWxwaGEgaX0kJA0KeQ0KJCRDX1xhbHBoYShqKT0gXGZyYWN7XHNxcnR7XGxhbWJkYV9cYWxwaGF9fXtcc3FydHtjX2p9fSBcOyBcdXBzaWxvbl97XGFscGhhIGp9LCQkDQoNCmRvbmRlICRcbGFtYmRhX1xhbHBoYSQsIGVzIGVsIHZhbG9yIHByb3BpbyBhc29jaWFkbyBhbCBmYWN0b3IgJFxhbHBoYSQuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUmVjb25zdHJ1Y2Npw7NuIGRlIGxhIG1hdHJpeiBkZSBjb3JyZXNwb25kZW5jaWENCg0KUGFyYSByZWNvbnN0cnVpciBsYSBtYXRyaXogZGUgY29ycmVzcG9uZGVuY2lhICRQJCwgcG9kZW1vcyByZXNvbHZlciBsYXMgZWN1YWNpb25lcyBcQHJlZihlcTplYy00LTIpIHkgXEByZWYoZXE6ZWMtNC0zKSBwYXJhICRQJCwgb2J0ZW5pZW5kbyBsYSBzaWd1aWVudGUgZWN1YWNpw7NuOg0KDQpcYmVnaW57ZXF1YXRpb259DQpQIFw7PVw7IGYgXCwgYyBcOytcOyBEX2ZeezEvMn0gVVwsIERcLCBWXlQgRF9jXnsxLzJ9LCAgICAoXCNlcTplYy00LTQpDQpcZW5ke2VxdWF0aW9ufQ0KDQpvIGVuIHTDqXJtaW5vcyBkZSBzdXMgZWxlbWVudG9zOg0KDQoNClxiZWdpbntlcW5hcnJheSp9DQpwX3tpan0gJj0mIGZfaSBjX2ogXDsrXDsgKDAsMCxcbGRvdHMsXHVuZGVyYnJhY2V7XHNxcnR7Zl9pfX1fe1x0ZXh0e1Bvc2ljacOzbn0gXCxpfSwgXGxkb3RzLDApIFw7IFVcLCAgRCBcLCBWXlQgXDsoMCwwLCBcbGRvdHMsIFx1bmRlcmJyYWNle1xzcXJ0e2Nfan19X3tcdGV4dHtQb3NpY2nDs259IFwsan0sIFxsZG90cywgMCleVFxcDQomPSYgZl9pIFwsIGNfalwsIFxsZWZ0WzFcOytcOyBcc3VtX3tcYWxwaGE9MX0gXGZyYWN7MX17XHNxcnR7XGxhbWJkYV9cYWxwaGF9fSBcLCBGX1xhbHBoYSAoaSkgXCwgR19cYWxwaGEoailccmlnaHRdDQpcZW5ke2VxbmFycmF5Kn0NCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCmxpYnJhcnkoRmFjdG9NaW5lUikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCnJlcy5jYSA8LSBDQSh0YWJsYSwgZ3JhcGggPSBGQUxTRSkNCnN1bW1hcnkocmVzLmNhKQ0KYGBgDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBDb250cmlidWNpb25lcyBhYnNvbHV0YXMgeSByZWxhdGl2YXMNCg0KIyMjIENvbnRyaWJ1Y2lvbmVzOiBnZW5lcmFsaWRhZGVzDQoNCkxhcyBjb250cmlidWNpb25lcyBheXVkYW4gYSBpbnRlcnByZXRhciBsb3MgZWplcy4gUG9yIGVqZW1wbG8sIA0KICANCiAgMS4gTGEgY29udHJpYnVjacOzbiBhYnNvbHV0YSBkZSBsYSBmaWxhICRpJCBhIHVuIGZhY3RvciAkXGFscGhhJCBpbmRpY2EgbGEgaW5lcmNpYSBleHBsaWNhZGEgcG9yIGVzZSBmYWN0b3IgZ2VuZXJhZG8gcG9yIGxhIGZpbGEgJGkkLg0KICANCiAgMi4gTGEgc3VtYSBkZSB0b2RhcyBsYXMgY29udHJpYnVjaW9uZXMgYWJzb2x1dGFzIGRlIGxhcyBmaWxhcyBwYXJhIHVuIGZhY3RvciBlcyBpZ3VhbCBhIGxhIGluZXJjaWEgZGVsIGZhY3Rvci4gDQogIA0KICAzLiBQb3IgbG8gdGFudG8sIGFsIGRpdmlkaXIgbGEgY29udHJpYnVjacOzbiBhYnNvbHV0YSBkZSBjYWRhIGZpbGEgZW50cmUgbGEgaW5lcmNpYSBjb3JyZXNwb25kaWVudGUgYWwgZmFjdG9yLCBvYnRlbmVtb3MgZWwgcG9yY2VudGFqZSBkZSB2YXJpYWJpbGlkYWQgZW4gZWwgZmFjdG9yIGRlYmlkbyBhIGVzYSBmaWxhLCBjb25vY2lkbyBjb21vICpjb250cmlidWNpw7NuIHJlbGF0aXZhIGRlIGxhIGZpbGEgYSBsYSBpbmVyY2lhIGRlbCBmYWN0b3IqOiANCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ29udHJpYnVjaW9uZXM6IHJlc3VtZW46ICANCg0KDQogIA0KIExhIGNvbnRyaWJ1Y2nDs24gYWJzb2x1dGEgZGVsIHB1bnRvICRpJCBhIGxhIGluZXJjaWEgJFxsYW1iZGFfXGFscGhhJCBlcyAgDQogDQogJCRmX2kgXCwgRl9cYWxwaGFeMihpKSQkIA0KIExhIGNvbnRyaWJ1Y2nDs24gcmVsYXRpdmEgZGVsIHB1bnRvICRpJCBhIGxhIGluZXJjaWEgJFxsYW1iZGFfXGFscGhhJCBlcw0KIA0KJCRcZnJhY3tmX2kgXCwgRl9cYWxwaGFeMihpKX17XGxhbWJkYV9cYWxwaGF9JCQNCg0KTGEgY29udHJpYnVjacOzbiByZWxhdGl2YSBkZWwgZmFjdG9yICRcYWxwaGEkIGEgbGEgaW5lcmNpYSB0b3RhbCBlcw0KICAgICAgDQokJFxmcmFje1xsYW1iZGFfXGFscGhhfXtcc3VtXGxpbWl0c197aj0xfV50IFxsYW1iZGFfan0kJA0KICANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPSBGQUxTRX0NCiMgRkFMVEEgZWplbXBsb3MgZW4gTWFydGluIGNhcC4gNCANCg0KIyBGYWx0YSB0ZW9yw61hIHkgZWplbXBsb3MgZGUgdW5uYWwgY2FwLiAzDQpgYGANCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMgRWplcmNpY2lvcw0KDQpQZW5kaWVudGUNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCg0KIyBCaWJsaW9ncmFmw61hIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQogIA0KQ29uc3VsdGFyIGVsIGRvY3VtZW50byBbUlB1YnMgOjogQW7DoWxpc2lzIG11bHRpdmFyaWFkbyAoYmlibGlvZ3JhZsOtYSldKGh0dHBzOi8vcnB1YnMuY29tL2hsbGluYXMvUl9NdWx0aXZhcmlhZG9fQmlibGlvZ3JhZmlhKS4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiZuYnNwOw0KDQoNCiZuYnNwOw0KPGNlbnRlcj4NCn5+fg0KSWYgeW91IGZvdW5kIGFueSBFUlJPUlMgb3IgaGF2ZSBTVUdHRVNUSU9OUywgcGxlYXNlIHJlcG9ydCB0aGVtIHRvIG15IGVtYWlsLiBUaGFua3MuICANCn5+fg0KPC9jZW50ZXI+DQoNCg0K