Home


En este informe se pueden explorar las diferencias en la inserción en el mercado de trabajo, en los ingresos que perciben, en la cantidad de horas que trabajan semanalmente, y la distribución de las tareas domésticas entre varones y mujeres. Presentamos esta información para el país en general y desagregada por región.

Estos datos están disponibles para su divulgación 1. Si te gusta lo que hacemos podés apoyarnos haciéndote socie del #ClubEcofeminita o realizando una donación.


1 Si necesitás citarnos en un trabajo, podés hacerlo como: “Ecofeminita. (2023). Ecofeminita/EcoFemiData: informes ecofemidata. Zenodo. http://doi.org/10.5281/zenodo.4540185”

Mercado de Trabajo


Sobre la composiciĂłn del Mercado de Trabajo



En esta sección se intenta mostrar las asimetrías que existen en el mercado de trabajo en cuanto a su composición. Para esto se utilizan las tasas de actividad, empleo, desempleo y subocupación según el sexo de las personas. El objetivo es ver qué tan masculinizado se encuentra el mercado laboral y ver si las mujeres encuentran más problemas a la hora de conseguir un empleo. También se analizan estos indicadores teniendo en cuenta la edad de las personas y se examina la incidencia de la informalidad en las relaciones de dependencia de asalariados y asalariadas. A su vez, se grafica la diferencia en acceso a cargos jerárquicos y la estructura de las diferentes ramas de ocupación, vinculando estos datos a las ideas de segregación vertical y horizontal en el mercado de trabajo.


Tasas básicas


Total nacional


En primer lugar se presentan algunos indicadores clásicos (utilizados a nivel internacional) que caracterizan la composición del mercado de trabajo, desagregados según el sexo. Para ahondar en los conceptos utilizados se puede explorar el glosario de este informe.

La tasa de actividad es ampliamente mayor entre los varones (la diferencia ronda los 19 puntos porcentuales). Esta discrepancia podría ser explicada por múltiples causas. Una de ellas es que una importante porción de las mujeres en edad laboral dediquen su tiempo a realizar tareas domésticas no remuneradas, en lugar de tener una actividad en el mercado de trabajo. Otra razón posible podría ser el hecho de que las mujeres tiendan, en promedio, a educarse más que sus pares varones. La tasa de empleo, por su parte, exhibe una diferencia entre varones y mujeres que ronda los 18 puntos, denotando el mismo fenómeno anteriormente mencionado.

Es importante aclarar que estas tasas expresan el comportamiento agregado de la población, y que las diferencias entre varones y mujeres sufren variaciones si se tienen en cuenta otras variables, como pueden ser los grupos de edad, el nivel educativo, la presencia de niñes en el hogar o el nivel de ingresos.

Tasas de actividad y empleo por sexo

Población de 14 años y más. Total de aglomerados urbanos. 4to trimestre 2023


A diferencia de las tasas anteriores, las tasas de desocupación y subocupación expresan la proporción que estos grupos representan en la Población Económicamente Activa. Usualmente, ambas tasas son mayores para las mujeres que para los varones, señalando que, incluso siendo minoría en el mercado de trabajo, las mujeres tendrían más dificultades para conseguir trabajo y/o para trabajar una jornada completa.

En su conjunto, los cuatro indicadores presentados en esta sección muestran una primera imagen de la problemática que enfrentan las mujeres en el mercado de trabajo argentino.

Tasas de desocupaciĂłn y subocupaciĂłn por sexo

Población de 14 años y más. Total de aglomerados urbanos. 4to trimestre 2023

Por regiĂłn


A continuaciĂłn se presentan las tasas de actividad, empleo, desocupaciĂłn y subocupaciĂłn para varones y mujeres segĂşn la regiĂłn.

Tasas de actividad y empleo por regiĂłn y sexo

Población de 14 años y más. 4to trimestre 2023

Tasas de desocupaciĂłn y subocupaciĂłn por regiĂłn y sexo

Población de 14 años y más. 4to trimestre 2023

Por grupos de edad


A continuación se exponen los mismos indicadores, pero desagregados por grupos de edad además de por sexo.

En este caso, llama la atención que son las mujeres más jóvenes las que presentan las mayores tasas de desocupación y subocupación. Para dar un ejemplo, un 13.4% de las mujeres de 14 a 29 años está desocupada, es decir que, no teniendo ocupación, están buscando activamente un trabajo y no lo consiguen. En cambio, en el caso de los varones jóvenes, el porcentaje de desocupados es de más del 12%.

Asimismo, se verifica una diferencia en las tasas de actividad y empleo entre las mujeres y varones de entre 30 y 64 años.

Total nacional

Principales tasas del mercado de trabajo, por grupos de edad y sexo

Población de 14 años a 64 años. Total de aglomerados urbanos. 4to trimestre 2023


de 14 a 29 años
de 30 a 64 años
Indicadores Mujeres Varones Mujeres Varones
Tasa Actividad 43.0% 55.4% 71.7% 90.9%
Tasa Empleo 37.2% 49.0% 68.9% 87.9%
Tasa DesocupaciĂłn 13.4% 11.5% 3.9% 3.3%
Tasa SubocupaciĂłn 15.3% 10.2% 13.6% 7.0%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
Por regiĂłn


Las tasas del mercado de trabajo presentan diferentes valores para mujeres y varones, pero también hay diferencias según el grupo de edad. Los y las jóvenes presentan menores tasas de actividad y empleo y mayores tasas de desocupación y subocupación que las personas de entre 30 y 64 años en todas las regiones del país.


Tasa de actividad por grupo de edad y sexo

Población de 14 años a 64 años, según región. Total de aglomerados urbanos. 4to trimestre 2023


Tasa de empleo por grupo de edad y sexo

Población de 14 años a 64 años, según región. 4to trimestre 2023


Tasa de desocupaciĂłn por grupo de edad y sexo

Población de 14 años a 64 años, según región. 4to trimestre 2023


Tasa de subocupaciĂłn por grupo de edad y sexo

Población de 14 años a 64 años, según región. 4to trimestre 2023

Empleo no registrado


La falta de descuento jubilatorio suele ser un indicador que aproxima la falta de registro de la relación laboral asalariada. La incidencia de esta problemática es mayor entre las asalariadas mujeres. A su vez, este indicador varía de acuerdo a las características de cada economía regional.

Total nacional


En concreto, en el paĂ­s hay un 37.2% de las asalariadas que por su trabajo realizado no posee descuentos jubilatorios, mientras que para los asalariados varones dicha tasa es del 34.4%.

Empleo sin descuento jubilatorio por sexo

Ocupadas/os asalariadas/os. Total de aglomerados urbanos. 4to trimestre 2023

Sexo Sin descuento jubilatorio
Mujeres 37.2%
Varones 34.4%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
Por regiĂłn


Porcentaje de asalariadas/os sin descuento jubilatorio por sexo

Población de 14 años y más. Según región. 4to trimestre 2023

Cargos jerárquicos


Además de tener una participación más restringida en el mercado de trabajo, las ocupadas encuentran más obstáculos para acceder a cargos jerárquicos: mientras que un 7.9% de los ocupados varones tienen cargos de dirección o son jefes, solo un 5.8% de las ocupadas ejercen puestos de esas características.

Esta problemática es conocida como techo de cristal o segregación vertical del mercado de trabajo, y hace referencia a la dificultad que poseen las mujeres para ascender profesionalmente en el mercado laboral. Si se tiene en cuenta que el mercado de trabajo en general se encuentra masculinizado, estos porcentajes indican que hay muchas más probabilidades de tener un jefe o director varón en los espacios de trabajo. Para una descripción más extensa de estos términos se puede consultar el Glosario de este informe.

Mujeres y Varones en cargos de direcciĂłn y jefatura

Porcentaje de cargos jerárquicos entre ocupadas/os. Total de aglomerados urbanos. 4to trimestre 2023

Ramas de la ocupaciĂłn


La siguiente tabla presenta los porcentajes de ocupadas mujeres sobre el total de ocupados y ocupadas para cada rama de ocupación. La tasa de feminización indica el porcentaje de mujeres que hay en cada una de ellas y, como puede observarse, las mujeres se encuentran sobrerrepresentadas en aquellos sectores vinculados al cuidado y las tareas de reproducción, como son el servicio doméstico, la enseñanza y los servicios sociales y de salud. Por su parte, sectores como la construcción, transporte y comunicaciones, las actividades primarias e incluso la industria manufacturera se encuentran masculinizadas.

Este fenómeno se conoce como paredes de cristal o segregación horizontal, y hace referencia a los muros invisibles que segmentan el mercado de trabajo de acuerdo a los estereotipos de género aún vigentes. Para una descripción más extensa de estos términos se puede consultar el Glosario de este informe.

Indicadores por ramas de la ocupaciĂłn (seleccionadas)

Ocupadas/os. Tasa de feminizaciĂłn, ingreso mensual promedio, ingreso horario. Total de aglomerados urbanos. 4to trimestre 2023

Rama de la ocupaciĂłn Tasa de feminizaciĂłn Ingreso mensual promedio Ingreso horario
Servicio domestico 97.0% $ 75.200 $1.034
Ensenanza 74.9% $239.700 $2.429
Servicios sociales y de salud 72.4% $284.900 $2.110
Industria manufacturera 31.8% $252.100 $1.508
Transporte, almacenamiento y comunicaciones 18.5% $318.700 $1.860
Actividades primarias 18.0% $424.500 $2.176
Construccion 4.2% $205.700 $1.395

#Ecofemidata y Ecofeminita en base a EPH-INDEC


Si observamos la distribución de ingresos de las y los ocupados según rama de ocupación, vemos que Servicio Doméstico no sólo es la rama más feminizada sino que además concentra los menores ingresos.

DistribuciĂłn del ingreso segĂşn ramas de ocupaciĂłn (seleccionadas)

Ocupadas/os. Total de aglomerados urbanos. 4to trimestre 2023

Ingresos


Ingresos



En esta sección se coloca el foco en las diferencias de montos de ingresos que perciben los varones y las mujeres. Estos ingresos pueden provenir de diversas fuentes y al mismo tiempo pueden desagregarse según características adicionales de las personas o los puestos que desempeñan. A su vez, pueden distinguirse los ingresos mensuales y los ingresos por hora trabajada.

Para dimensionar estas diferencias hacemos uso del concepto de “brecha”, que en este caso se calcula como la diferencia entre los ingresos promedios de los varones y las mujeres, expresada en términos del ingreso más alto. Es decir, que puede leerse como “las mujeres perciben ingresos que, en promedio, son un …% menores que los de los varones”.


Ingresos mensuales

En todas las regiones del paĂ­s, los ingresos promedios de las mujeres son menores que los de los varones.

Total Nacional



Brechas de ingresos mensuales


Como se ve en el siguiente cuadro, para el caso de todas las personas perceptoras de ingresos, la brecha entre mujeres y varones respecto al ingreso total individual es de 25.8%. Es decir, contemplando todos los ingresos que se perciben, sean de origen laboral o no laboral (como jubilaciones y pensiones, cuotas alimentarias, subsidios, etc.), las mujeres perciben ingresos que, en promedio, son un 25.8% menores que los de los varones.

Simultáneamente, en el mercado de trabajo, las mujeres ganan en promedio un 25.6% menos que los varones ($204.400 vs. $274.700). Estos datos corresponden a la totalidad de ocupadas/os, cualquiera sea su categoría ocupacional, calificación o jerarquía, y observando en este caso los ingresos provenientes de su ocupación principal.

Si tomamos en cuenta Ăşnicamente a aquellas personas que no poseen descuentos jubilatorios, se observa cĂłmo las mujeres ganan en promedio un 38.3% menos que sus pares. Es decir que la brecha de ingresos entre las y los trabajadores se amplĂ­a cuando vemos a aquellas/os asalariadas/os que tienen peores condiciones de trabajo.

Finalmente, puede observarse que también existe una brecha, aunque mucho menor, entre las jubilaciones que perciben las mujeres y los varones.

Brechas de ingresos mensuales

Por poblaciones y tipos de ingresos. Total de aglomerados urbanos. 4to trimestre 2023


Media del ingreso

PoblaciĂłn Ingreso Mujeres Varones Brecha
Perceptores de ingresos Ingreso Total Individual $207.500 $279.700 25.8%
Ocupadas/os Ingreso de la OcupaciĂłn Principal $204.400 $274.700 25.6%
Asalariadas/os sin desc. jubil. Ingreso de la OcupaciĂłn Principal $107.600 $174.600 38.3%
Perceptores de jubilaciĂłn JubilaciĂłn $139.400 $164.800 15.4%

#Ecofemidata y Ecofeminita en base a EPH-INDEC

Brecha de ingresos mensuales por calificaciĂłn del puesto de trabajo


El siguiente gráfico señala cómo la brecha de ingresos mensuales de las/os ocupadas/os se mantiene incluso a iguales niveles de calificación del puesto de trabajo. Por ejemplo, mientras que los varones que trabajan en ocupaciones profesionales tienen un ingreso medio de $532.500, las mujeres ocupadas en ese mismo segmento perciben un ingreso medio de $387.800, es decir, un 27.2% menos.
En los puestos no calificados, los varones ganan $155.900 en promedio, al tiempo que las mujeres ganan alrededor de $105.900. Esta brecha es del 32.0%.

Brecha de ingresos de la ocupaciĂłn principal por sexo y calificaciĂłn ocupacional

Ocupadas/os. Total de aglomerados urbanos. 4to trimestre 2023


Brecha de ingresos mensuales por nivel educativo


Como puede observarse en el cuadro siguiente, el porcentaje de personas que cuentan con un nivel educativo superior es notablemente mayor entre las ocupadas mujeres, en comparaciĂłn a los ocupados varones.

Sin embargo, a igual nivel educativo, los ingresos laborales de las mujeres trabajadoras son inferiores a los de los varones. Esta diferencia de ingresos es del 29.3% para las de nivel universitario/superior, y del 45.2% para las que cuentan con nivel primario.

Nivel educativo de mujeres y varones

Porcentaje por columnas. Ocupadas/os. Total de aglomerados urbanos. 4to trimestre 2023

Nivel Educativo Mujeres Varones
Sin InstrucciĂłn 1.9% 2.7%
Primaria 20.4% 33.3%
Secundaria 46.1% 43.4%
Superior 31.6% 20.6%

#Ecofemidata y Ecofeminita en base a EPH-INDEC


Brecha de ingresos de la ocupaciĂłn principal por sexo y nivel educativo

Ocupadas/os. Total de aglomerados urbanos. 4to trimestre 2023

Cuyo



Ingresos mensuales promedio y brecha

Por poblaciones y tipos de ingresos. Cuyo. 4to trimestre 2023


Media del ingreso

PoblaciĂłn Ingreso Mujeres Varones Brecha
Asalariadas/os sin desc. jubil. Ingreso de la OcupaciĂłn Principal $ 99.400 $143.600 30.8%
Ocupadas/os Ingreso de la OcupaciĂłn Principal $165.000 $222.000 25.7%
Perceptores de ingresos Ingreso Total Individual $175.900 $232.800 24.5%
Perceptores de jubilaciĂłn JubilaciĂłn $128.100 $150.800 15.1%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
GBA



Ingresos mensuales promedio y brecha

Por poblaciones y tipos de ingresos. GBA. 4to trimestre 2023


Media del ingreso

PoblaciĂłn Ingreso Mujeres Varones Brecha
Asalariadas/os sin desc. jubil. Ingreso de la OcupaciĂłn Principal $117.800 $200.400 41.2%
Ocupadas/os Ingreso de la OcupaciĂłn Principal $225.800 $298.900 24.5%
Perceptores de ingresos Ingreso Total Individual $225.800 $303.000 25.5%
Perceptores de jubilaciĂłn JubilaciĂłn $132.400 $156.400 15.3%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
NEA



Ingresos mensuales promedio y brecha

Por poblaciones y tipos de ingresos. NEA. 4to trimestre 2023


Media del ingreso

PoblaciĂłn Ingreso Mujeres Varones Brecha
Asalariadas/os sin desc. jubil. Ingreso de la OcupaciĂłn Principal $ 78.800 $126.200 37.6%
Ocupadas/os Ingreso de la OcupaciĂłn Principal $144.800 $188.900 23.4%
Perceptores de ingresos Ingreso Total Individual $155.300 $199.900 22.3%
Perceptores de jubilaciĂłn JubilaciĂłn $141.300 $176.500 19.9%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
NOA



Ingresos mensuales promedio y brecha

Por poblaciones y tipos de ingresos. NOA. 4to trimestre 2023


Media del ingreso

PoblaciĂłn Ingreso Mujeres Varones Brecha
Asalariadas/os sin desc. jubil. Ingreso de la OcupaciĂłn Principal $ 77.900 $112.300 30.6%
Ocupadas/os Ingreso de la OcupaciĂłn Principal $135.300 $178.000 24.0%
Perceptores de ingresos Ingreso Total Individual $152.500 $184.200 17.3%
Perceptores de jubilaciĂłn JubilaciĂłn $123.500 $141.900 13.0%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
Pampeana



Ingresos mensuales promedio y brecha

Por poblaciones y tipos de ingresos. Pampeana. 4to trimestre 2023


Media del ingreso

PoblaciĂłn Ingreso Mujeres Varones Brecha
Asalariadas/os sin desc. jubil. Ingreso de la OcupaciĂłn Principal $109.300 $163.400 33.1%
Ocupadas/os Ingreso de la OcupaciĂłn Principal $193.200 $265.700 27.3%
Perceptores de ingresos Ingreso Total Individual $201.800 $274.100 26.4%
Perceptores de jubilaciĂłn JubilaciĂłn $155.700 $179.500 13.3%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
Patagonia



Ingresos mensuales promedio y brecha

Por poblaciones y tipos de ingresos. Patagonia. 4to trimestre 2023


Media del ingreso

PoblaciĂłn Ingreso Mujeres Varones Brecha
Asalariadas/os sin desc. jubil. Ingreso de la OcupaciĂłn Principal $125.300 $236.500 47.0%
Ocupadas/os Ingreso de la OcupaciĂłn Principal $270.000 $417.200 35.3%
Perceptores de ingresos Ingreso Total Individual $258.900 $409.600 36.8%
Perceptores de jubilaciĂłn JubilaciĂłn $197.900 $258.500 23.4%

#Ecofemidata y Ecofeminita en base a EPH-INDEC

Ingresos horarios

Si en lugar de comparar ingresos mensuales tomamos el ingreso por hora trabajada que perciben las personas, la historia es un poco diferente. En este caso, la brecha disminuye considerablemente. Que las brechas sean más amplias comparando ingresos mensuales de bolsillo, y que sean más estrechas cuando se toman los ingresos por hora, sugiere que las mujeres venden en el mercado de trabajo, por lo general, menos horas que los varones. Como se verá más adelante, esto está ligado al trabajo que las mismas suelen realizar al interior de los hogares.

Total Nacional



Brechas de ingresos horarios

Total de aglomerados urbanos. 4to trimestre 2023


Media del ingreso horario

PoblaciĂłn Mujeres Varones Brecha
Ocupadas/os $1.654 $1.690 2.1%
Asalariadas/os $1.730 $1.734 0.2%
Asalariadas/os sin desc. jubil. $1.177 $1.094 -7.5%

#Ecofemidata y Ecofeminita en base a EPH-INDEC

Brecha de ingresos horarios por nivel educativo


Tal como se analizĂł en el caso anterior, si se observa la brecha de ingresos horarios por nivel educativo alcanzado, la misma se reduce significativamente, aunque sigue presente en algunas categorĂ­as.

Brecha de ingresos horarios de la ocupaciĂłn principal por sexo y nivel educativo

Ocupadas/os. Total de aglomerados urbanos. 4to trimestre 2023

Cuyo



Ingresos horarios promedio y brecha

Cuyo. 4to trimestre 2023


Media del ingreso horario

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os $1.547 $1.432 -8.1%
Asalariadas/os sin desc. jubil. $1.039 $ 859 -20.9%
Ocupadas/os $1.422 $1.374 -3.5%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
GBA



Ingresos horarios promedio y brecha

GBA. 4to trimestre 2023


Media del ingreso horario

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os $1.902 $1.876 -1.4%
Asalariadas/os sin desc. jubil. $1.341 $1.245 -7.7%
Ocupadas/os $1.843 $1.837 -0.4%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
NEA



Ingresos horarios promedio y brecha

NEA. 4to trimestre 2023


Media del ingreso horario

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os $1.294 $1.179 -9.7%
Asalariadas/os sin desc. jubil. $ 872 $ 819 -6.5%
Ocupadas/os $1.180 $1.154 -2.3%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
NOA



Ingresos horarios promedio y brecha

NOA. 4to trimestre 2023


Media del ingreso horario

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os $1.290 $1.200 -7.5%
Asalariadas/os sin desc. jubil. $ 879 $ 718 -22.5%
Ocupadas/os $1.177 $1.142 -3.1%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
Pampeana



Ingresos horarios promedio y brecha

Pampeana. 4to trimestre 2023


Media del ingreso horario

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os $1.594 $1.724 7.5%
Asalariadas/os sin desc. jubil. $1.093 $1.067 -2.5%
Ocupadas/os $1.509 $1.669 9.6%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
Patagonia



Ingresos horarios promedio y brecha

Patagonia. 4to trimestre 2023


Media del ingreso horario

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os $1.898 $2.217 14.4%
Asalariadas/os sin desc. jubil. $1.163 $1.253 7.1%
Ocupadas/os $1.920 $2.290 16.2%

#Ecofemidata y Ecofeminita en base a EPH-INDEC

Horas trabajadas


Horas trabajadas



La idea de la “brecha” también puede aplicarse para comparar las horas que trabajan en promedio mujeres y varones en su ocupación principal en el mercado de trabajo, de forma remunerada. De aquí se desprende que, en promedio, las mujeres trabajan menos horas que los varones, y esto explica una parte importante (aunque no toda) de la brecha de ingresos mensuales.

Cabe cuestionarse entonces respecto al por qué de la diferencia de horas trabajadas por mujeres y por varones. ¿Existe una falta de voluntad de las mujeres para trabajar? ¿Son más “vagas”? ¿O en realidad existe otro motivo por el cual las mujeres deben relegar sus trabajos, del cual los varones están exentos? Como veremos más adelante, los datos sugieren una estrecha relación con la distribución de las tareas domésticas hacia el interior de los hogares.

Total nacional



Brechas de horas trabajadas

Total de aglomerados urbanos. 4to trimestre 2023


Horas semanales (media)

PoblaciĂłn Mujeres Varones Brecha
Ocupadas/os 32.1 41.4 22.4%
Asalariadas/os 31.7 41.8 24.2%
Asalariadas/os sin desc. jubil. 25.8 39.5 34.7%

#Ecofemidata y Ecofeminita en base a EPH-INDEC


Cuyo



Brechas de horas trabajadas

Cuyo. 4to trimestre 2023


Horas semanales (media)

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os 29.4 41.4 29.0%
Asalariadas/os sin desc. jubil. 25.5 38.8 34.2%
Ocupadas/os 30.2 40.5 25.4%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
GBA



Brechas de horas trabajadas

GBA. 4to trimestre 2023


Horas semanales (media)

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os 32.3 42.5 24.0%
Asalariadas/os sin desc. jubil. 25.5 40.8 37.4%
Ocupadas/os 32.4 42.0 22.8%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
NEA



Brechas de horas trabajadas

NEA. 4to trimestre 2023


Horas semanales (media)

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os 30.3 41.3 26.8%
Asalariadas/os sin desc. jubil. 25.4 38.9 34.7%
Ocupadas/os 32.0 41.2 22.2%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
NOA



Brechas de horas trabajadas

NOA. 4to trimestre 2023


Horas semanales (media)

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os 30.0 40.0 24.9%
Asalariadas/os sin desc. jubil. 26.4 38.1 30.5%
Ocupadas/os 30.1 39.2 23.3%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
Pampeana



Brechas de horas trabajadas

Pampeana. 4to trimestre 2023


Horas semanales (media)

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os 31.4 40.7 23.0%
Asalariadas/os sin desc. jubil. 26.0 37.4 30.3%
Ocupadas/os 32.3 40.5 20.2%

#Ecofemidata y Ecofeminita en base a EPH-INDEC
Patagonia



Brechas de horas trabajadas

Patagonia. 4to trimestre 2023


Horas semanales (media)

PoblaciĂłn Mujeres Varones Brecha
Asalariadas/os 34.5 45.0 23.4%
Asalariadas/os sin desc. jubil. 26.9 41.1 34.6%
Ocupadas/os 34.4 44.1 21.9%

#Ecofemidata y Ecofeminita en base a EPH-INDEC

Tareas del hogar


Distribución de las tareas domésticas



El trabajo doméstico suele recaer más en las mujeres que en los varones. Es decir, es más probable que sean ellas las encargadas de realizar tareas de cuidado y reproducción para otros miembros de su hogar. En estos casos, el trabajo no se comercia en el mercado, se realiza entre quienes tienen un vínculo personal, y por lo tanto, no se remunera.

Este reparto desigual de las tareas domésticas entre varones y mujeres podría asociarse a las desigualdades vistas anteriormente en la composición del mercado de trabajo (obstáculos en el acceso a cargos jerárquicos, precarización laboral, etc ) y responde a un conjunto de normas sociales y estereotipos de género que asignan mandatos diferenciales a varones y mujeres.

Dicha feminizaciĂłn de las tareas de cuidado penaliza a estas Ăşltimas, haciendo que enfrenten extensas cargas de trabajo en el hogar y, por ende, imponiendo una fuerte restricciĂłn temporal y afectando el acceso al mercado de trabajo y a la trayectoria laboral.



Total nacional


A modo ilustrativo, se señala que: del total de personas que realizan tareas domésticas, un 69% son mujeres y un 31% son varones. Esto sucede si tenemos en cuenta el total de los hogares, y seguramente la diferencia se agravaría si quitáramos los hogares unipersonales del conteo y/o incluyéramos a las trabajadoras de servicio doméstico.

Personas que realizan las tareas domésticas del hogar según sexo

No incluye trabajadoras de servicio doméstico. Total de aglomerados urbanos. 4to trimestre 2023

A esto se suma el hecho de que prácticamente todas las personas que se dedican al servicio doméstico (es decir, que sí venden este trabajo en el mercado) son mujeres, un 98.2%. Asimismo, del total de mujeres ocupadas, un 13.8% se dedica a esta ocupación, conformando entonces una salida laboral popular. Para más información, podés consultar el informe Las trabajadoras de servicio doméstico en Argentina.

Por regiĂłn


Personas que realizan las tareas domésticas del hogar según sexo

Por región. 4to trimestre 2023 . No incluye trabajadoras de servicio doméstico


DistribuciĂłn del ingreso


DistribuciĂłn del Ingreso



También podemos analizar las brechas de género en la distribución de los ingresos.

DistribuciĂłn del ingreso


En primer lugar, se ordena por deciles a las personas según su ingreso per cápita familiar (el ingreso total del hogar dividido por la cantidad de personas que lo componen). Es decir, se forman diez grupos de individuos, de igual tamaño, ordenados según el nivel de ingresos que le corresponden por el hogar al que pertenece. En el siguiente gráfico se puede observar la proporción de mujeres y de varones que finalmente componen cada decil.

En este caso, no hay diferencias destacables más allá de una leve preponderancia de las mujeres en todos los deciles, explicable por cuestiones demográficas (hay más mujeres que varones en la población general). A su vez, los resultados para cada región son muy similares a los del total nacional, por lo cúal no resulta significativa su publicación.

Composición según sexo de los deciles del ingreso per cápita familiar

Total de la poblaciĂłn. Total de aglomerados urbanos. 4to trimestre 2023

En segundo lugar, se separa a la población en deciles según el ingreso total individual. Es decir, se ordena en base al nivel de ingresos que percibe cada individuo, no el hogar (caso anterior). En este caso puede verse que los deciles más bajos de ingresos están compuestos mayoritariamente por mujeres y, en paralelo, los deciles de mayores ingresos se componen mayoritariamente por varones. Decimos entonces que los estratos de menores ingresos están feminizados, al tiempo que los estratos de mayores ingresos se encuentran masculinizados. En este caso también, los resultado para cada región son muy similares a los del total nacional, por lo cúal no resulta significativa su publicación.

ComposiciĂłn segĂşn sexo de los deciles de ingresos totales individuales

PoblaciĂłn perceptora de ingresos. Total de aglomerados urbanos. 4to trimestre 2023

¿Cuál es la diferencia entre los gráficos presentados? En el primer gráfico, las unidades de análisis son los hogares, sólo que se distribuyeron de forma “pareja” sus ingresos entre los miembros. De esta forma, la composición por sexo de los estratos de menores ingresos no tiene mayores diferencias respecto a la de los estratos de mayores ingresos. En cambio, en el segundo gráfico de esta sección vemos lo que pasa a nivel individual, lo cual es una forma de “abrir” hacia el interior de los hogares. La unidad familiar parece resolver la diferencia entre sexos, pero dentro de los hogares la diferencia se mantiene: los varones tienen más probabilidades de ganar más que las mujeres del mismo hogar. La distribución de los ingresos de las mujeres, sesgada hacia los menores ingresos, se compensa en la estructura familiar con la distribución de los ingresos de los varones, sesgada hacia los mayores ingresos. Entonces, la familia como unidad de reproducción esconde y resuelve debajo de la superficie (la distribución aparentemente equitativa según los ingresos per cápita) la inequitativa distribución de las tareas de reproducción y las dificultades asociadas que tienen las mujeres para participar de forma plena en el mercado de trabajo y por tanto percibir ingresos semejantes a los de los varones.


Hogares monomarentales


Los hogares monomaparentales son aquellos con un solo jefe/a de hogar, sin cĂłnyuge y con menores a cargo. Los llamamos monomarentales cuando la jefa de hogar es mujer, y monoparental cuando el jefe es varĂłn.

En el gráfico presentado se evidencia que los hogares monomaparentales se concentran en los deciles de menores ingresos. Además, si consideramos el sexo del jefe/a de hogar observamos que los más concentrados en los primeros deciles (de menores ingresos) son los que tienen jefatura femenina.

Como se lee en el gráfico, del total de hogares del primer decil, un 26,1% son hogares monomarentales, y un 3,2% son hogares monoparentales, con lo cual la suma de hogares con un solo jefe/a de hogar, sin cónyuge y con menores a cargo totaliza el 29,3% de los hogares. En cambio, en el décimo decil, la suma de este tipo de hogares representa solo el 6,5% del total.

Cuando se habla de feminización de la pobreza se puede referir a la mayor incidencia cuantitativa de la pobreza en las mujeres respecto a los varones (que se puede observar en la sección “Pobreza”); a la diferente manera en que varones y mujeres viven las situaciones de pobreza y la enfrentan; como a la vulnerabilidad a la pobreza de las mujeres jefas de hogar, o de los hogares comandados por mujeres (que se observa en el gráfico).

Hogares monomarentales y monoparentales sobre el total de hogares por decil de ingreso total familiar

Total de la poblaciĂłn. Total de aglomerados urbanos. 4to trimestre 2023

Pobreza


Pobreza



La definición más frecuente utilizada para hablar de pobreza es la monetaria, la cual se centra en la capacidad (o no) que tengan los hogares para cubrir ciertas necesidades materiales a partir de sus ingresos. En Argentina, la forma de medición de la pobreza utilizada oficialmente se conoce como método indirecto o “línea”, el cual procura definir si los hogares cuentan con ingresos suficientes para cubrir una canasta de alimentos llamada Canasta Básica Alimentaria y/o otros consumos básicos no alimentarios que conforman una Canasta Básica Total. Estas canastas son a su vez comparadas con los ingresos totales del hogar, permitiendo clasificarlos como no pobres, pobres o indigentes, extendiéndose esa caracterización a cada una de las personas que los integran.


Total nacional


Si en vez de caracterizar a las personas de acuerdo al hogar al que pertenecen, observamos la capacidad que tienen varones y mujeres para cubrir sus necesidades recurriendo a los ingresos que obtienen individualmente, verĂ­amos que la incidencia de la pobreza afecta en mayor medida a las ocupadas que a los ocupados.

Las brechas están calculadas como Tasa de pobreza mujeres - Tasa de pobreza varones, por lo que las diferencias que vemos están expresadas en puntos porcentuales, en este sentido si se observan valores negativos es porque existe una mayor incidencia de la pobreza en varones, mientras que si el valor de la brecha de positivo implica que son las mujeres las que se ven afectadas mayormente.

En el siguiente gráfico vemos que tomando al hogar como unidad de medida, los varones tienen un 0.6p.p. mayor de incidencia en la pobreza que las mujeres ocupadas. En cambio, si contrastamos las canastas calculadas para cada persona con sus ingresos totales individuales, la incidencia pasa a ser de un 1.8p.p. más para las mujeres. Esto pone en evidencia que la pobreza medida por ingresos afecta mayoritariamente a las mujeres si tuvieran que cubrir sus necesidades de forma individual.

Diferencias de tasas de pobreza e indigencia por sexo

Ocupadas/os. MetodologĂ­a hogar e individual. Total de aglomerados urbanos. 4to trimestre 2023

MetodologĂ­a Brecha Pobreza Brecha Indigencia
Hogar -0.6 -0.3
Individual 1.8 0.0

#Ecofemidata y Ecofeminita en base a EPH-INDEC



A continuación vemos las tasas de pobreza e indigencia por rama de la ocupación en la que se encuentran las ocupadas y ocupados de acuerdo a la medición por hogar. Podemos afirmar que las trabajadoras del servicio doméstico están sobrerrepresentadas en los hogares en situación de mayor vulnerabilidad, superando incluso las tasas a nivel general calculadas por INDEC.

Tasas de pobreza e indigencia

SegĂşn ramas de la ocupaciĂłn. MediciĂłn hogar. Total de aglomerados urbanos. 4to trimestre 2023

Por regiĂłn


Si en vez de caracterizar a las personas de acuerdo al hogar al que pertenecen, observamos la capacidad que tienen varones y mujeres para cubrir sus necesidades recurriendo a los ingresos que obtienen individualmente, verĂ­amos que la incidencia de la pobreza afecta en mayor medida a las ocupadas que a los ocupados.

Las brechas están calculadas como Tasa de pobreza mujeres - Tasa de pobreza varones, por lo que las diferencias que vemos están expresadas en puntos porcentuales, en este sentido si se observan valores negativos es porque existe una mayor incidencia de la pobreza en varones, mientras que si el valor de la brecha de positivo implica que son las mujeres las que se ven afectadas mayormente.

Diferencias de tasas de pobreza por sexo y regiĂłn

Ocupadas/os. MetodologĂ­a hogar e individual. Total de aglomerados urbanos. 4to trimestre 2023

MetodologĂ­a Cuyo GBA NEA NOA Pampeana Patagonia
Hogar -2.2 0.4 -5.9 -1.9 -1.1 3.5
Individual -2.5 3.5 -7.6 -3.3 3.1 4.2

#Ecofemidata y Ecofeminita en base a EPH-INDEC



A continuación vemos las tasas de pobreza e indigencia por región y rama de la ocupación en la que se encuentran las ocupadas y ocupados de acuerdo a la medición por hogar. Podemos afirmar que las trabajadoras del servicio doméstico están sobrerrepresentadas en los hogares en situación de mayor vulnerabilidad indistintamente de la región en la que se encuentren, superando incluso las tasas a nivel general calculadas por INDEC.

ProporciĂłn de personas que integran hogares en situaciĂłn de pobreza

SegĂşn regiĂłn y ramas de la ocupaciĂłn. Total de aglomerados urbanos. 4to trimestre 2023

Glosario


Glosario



En esta secciĂłn definimos conceptos que facilitan la lectura del informe.

Brecha de ingresos: El ingreso total contempla ingresos laborales y no laborales, como rentas o subsidios. Este indicador calcula la diferencia entre los ingresos individuales promedios de los varones y las mujeres, expresada en términos del ingreso de los varones (generalmente el más alto). Es decir, que puede leerse como “las mujeres perciben ingresos que, en promedio, son un …% menores que los de los varones”. En Argentina esta brecha es estructural, aunque sensible a los ciclos económicos.

Brecha de la ocupación principal: Este indicador es la brecha de ingresos derivada de la ocupación principal, que calcula la diferencia entre los ingresos promedios percibidos por el empleo principal de los varones y las mujeres, expresada en términos del promedio percibido por los varones (generalmente el más alto). Excluye los ingresos no laborales, como rentas o subsidios. Puede leerse como “las mujeres perciben ingresos derivados de su ocupación principal que, en promedio, son aún …% menores que los de los varones”. El fenómeno de que sea menor para las mujeres es algo que se repite en todo el mundo y se debe al tipo de inserción laboral que tienen las personas cuyo género condiciona la jerarquía del puesto donde trabajan, la rama de la ocupación, la cantidad de tiempo que destinan al mercado remunerado, cuánta responsabilidad tienen sobre las tareas domésticas, entre otras. Si bien existe la discriminación lisa y llana, la presencia de una brecha salarial mensual no implica necesariamente una diferencia salarial por hora.

CalificaciĂłn: Refiere a las competencias que requiere el puesto de trabajo.

Categoría de jefes/jefas: La categoría de jefes/jefas refiere a ocupaciones cuyo fin es transmitir y aplicar decisiones generales directivas , así como organizar, supervisar y controlar procesos y personas comprometidas en su ejecución. Junto con la de Dirección constituyen las categorías jerárquicas más altas en la estructura organizativa de los establecimientos, que nos permiten ver el acceso de varones y mujeres a cargos jerárquicos.

Desocupado: es el estado de una persona que está inserta en el mercado laboral, buscando un empleo aunque no lo consiga.

Estadísticas binarias: Hace referencia a que la variable “sexo” sólo adopta el valor de “masculino” o “femenino” en la base de datos utilizada, reforzando el paradigma heteronormativo y el binarismo de género. Sin disponer de una variable que aluda a la identidad de género, muchas identidades quedan invisibilizadas y con ellas, sus situaciones y necesidades específicas.

Falta de descuento jubilatorio: Muestra el estado de una relación laboral asalariada que no cumple con la obligación de aportes. La falta de descuento jubilatorio suele ser un indicador de la falta de registro de la relación. Si bien es un fenómeno estructural en Argentina, la incidencia de esta problemática es mayor entre las mujeres asalariadas.

Feminización de la pobreza: Refiere al conjunto de procesos de empobrecimiento que afectan en mayor medida a las mujeres y que se manifiestan en una mayor proporción de mujeres entre las personas cuyos ingresos no llegan a cubrir la canasta básica.

Nivel educativo: El nivel educativo alcanzado es una forma de ver cuánto dedicaron al estudio quienes trabajan.

Ocupado/a/e: Es el estado de una persona que está inserta en el mercado laboral con un empleo, sea formal, informal, de jornada reducida, asalariado, por cuenta propia, de jefatura, entre otros.

Ocupados/as demandantes: las personas que ya tienen un empleo pero buscan activamente otro o trabajar más horas.

Paredes de cristal / segregación horizontal: Es una forma de visibilizar la distribución asimétrica de las mujeres en ramas de la ocupación, que además de reproducir estereotipos de género representa un problema de ingresos, ya que las ramas feminizadas tienen sueldos promedios más bajos y mayores niveles de informalidad que los masculinizados.

Población de 14 años y más: Es la población total de este informe, que incluye todas las personas que hayan alcanzado el umbral de los 14 años, el límite inferior de lo que se considera la “edad activa”.

Población Económicamente Activa (PEA): La Población Económicamente Activa (PEA) incluye a las personas que ofrecen su trabajo en el mercado, sea que lo consiguen (ocupadas/os) o no (desocupadas/os). Al considerar únicamente el mercado laboral no contempla la condición de actividad expandida a tareas domésticas y de cuidados no remunerados.

Ramas de la ocupaciĂłn: Es una clasificaciĂłn de las actividades econĂłmicas que realiza el establecimiento dĂłnde trabajan las personas. La rama de actividad econĂłmica de una persona no depende de las tareas especĂ­ficas de su trabajo, sino de las caracterĂ­sticas de la unidad econĂłmica en la que trabaja.

Regiones: En este informe se identifican 6 regiones: Gran Buenos Aires, Noroeste Argentino (NOA), Noreste Argentino (NEA), Cuyo, Pampeana y Patagonia. Debido a la disponibilidad de la muestra, algunas desagregaciones pierden validez y por esa razón se omite su publicación. En otros casos, las aperturas por región devuelven resultados muy similares a los del total nacional, y por esa razón no resulta significativa su publicación. Obtener datos específicos sobre cada una de las regiones no solo posibilita evidenciar las particularidades regionales de las asimetrías recorridas a lo largo del informe, sino que también permiten realizar comparaciones.

Subocupados/as: Todas las personas que trabajan menos de 35 horas semanales, están disponibles para trabajar más horas y desean aumentar la cantidad de horas que trabajan.

Subocupados/as demandantes: Proporción de personas de la población económicamente activa que tienen un empleo de menos de 35 horas semanales, están disponibles para trabajar más horas y se encuentran buscando empleo

Subocupados/as no demandantes: Las personas que trabajan menos de 35 horas semanales, no están buscando activamente otro trabajo aunque desearían trabajar más horas pero por causas involuntarias no lo hacen.

Tasa de actividad: Se calcula como la proporción que representa la Población Económicamente Activa entre la población total, ya sea de mujeres o de varones. Cabe destacar que esta definición de “Actividad” no contempla actividades como cocinar, limpiar, cuidar, etc. que son realizadas principalmente por mujeres fuera del mercado.

Tasa de empleo: La tasa muestra la proporción de quienes están en el mercado laboral como ocupades en relación a la población de mujeres y de varones, es decir, se recorta de la tasa de actividad la proporción de quienes están desocupadas.

Tasa de desocupación: a tasa muestra la proporción de personas que están buscando empleo pero no lo consiguen, entre la población económicamente activa . Esta situación es más recurrente entre mujeres.

Tasa de subocupación: La tasa relaciona la cantidad de personas en situación de subocupación horaria respecto al total de la PEA. Estos empleos dan mayor flexibilidad para el manejo de las responsabilidades y son las mujeres las que presentan tasas de subocupación más altas, muchas veces debido a la carga de trabajo de cuidados que demanda muchas horas que no se llevan al mercado de trabajo. Las trabajadoras tienen mayores complicaciones al momento de conseguir un trabajo de tiempo completo.

Techo de cristal / segregación vertical: Alude a los obstáculos que enfrentan las mujeres para ascender a cargos jerárquicos y puestos de decisión. La metáfora del cristal muestra que los impedimentos no son visibles ya que no hay normas explícitas que busquen segregar a las trabajadoras, pero que las barreras existen incluso cuando están igual o mejor calificadas que sus compañeros varones.

Trabajo doméstico y de cuidados: También conocido como “trabajo reproductivo” es aquel que es imprescindible para mantener la vida de las personas. Se manifiesta en tareas como cocinar, lavar, ordenar, atender las necesidades de lxs miembrxs de un hogar y de la familia en general. Todas las personas necesitamos cuidados a lo largo de nuestras vidas y la concreción de los mismos suele depender en mayor medida de las identidades feminizadas.

MetodologĂ­a


Aclaraciones metodolĂłgicas



Para realizar los cálculos se utilizan bases de datos publicadas por la Encuesta Permanente de Hogares del INDEC. Esta encuesta releva características demográficas, sociales, económicas, con especial atención a las formas de participación en el mercado laboral, entre hogares y personas de 31 aglomerados urbanos.

Respecto del impacto de la pandemia por COVID-19, tanto sobre los resultados como sobre la calidad de los datos, cabe aclarar que la encuesta pasĂł de la modalidad presencial a la telefĂłnica para contactar y realizar la entrevista a los hogares. El propio INDEC advierte que ciertos datos no cuentan con la calidad con la que habitualmente la EPH presenta sus resultados.

En cuanto a la medición de pobreza por hogar, se utiliza la metodología de INDEC para el cálculo oficial, disponible aquí. Además proponemos una metodología diferente que define la situación de pobreza de las personas a nivel individual. Para esto construimos Canastas Básicas Totales Individuales que resultan de multiplicar la Canasta Básica Total con las unidades de referencia que le corresponden a cada ocupade, según la tabla de equivalencias de INDEC, para luego compararla con el Ingreso Total Individual.

El documento se realizĂł utilizando el lenguaje de programaciĂłn R. Para les curioses, todo el cĂłdigo se encuentra disponible para su descarga1.


1 Presionando en_ Code > Download Rmd _se accede a la descarga de la sintaxis completa de este informe.

LS0tDQp0aXRsZTogIkxhIGRlc2lndWFsZGFkIGRlIGfDqW5lcm8gc2UgcHVlZGUgbWVkaXIiDQpkYXRlOiAiQWJyaWwgZGUgMjAyNCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0aGVtZTogZmxhdGx5DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQpzdWJ0aXRsZTogRGF0b3MgZGUgbGEgRW5jdWVzdGEgUGVybWFuZW50ZSBkZSBIb2dhcmVzLiA0dG8gdHJpbWVzdHJlIGRlIDIwMjMuDQp1cmxjb2xvcjogbnVsbA0KLS0tDQoNCjxzdHlsZT4NCi5uYXY+bGk+YSB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIGRpc3BsYXk6IGJsb2NrOw0KICAgIHBhZGRpbmc6IDEwcHggMTVweDsNCiAgICBjb2xvcjogI0U1NjE2RTsNCn0NCg0KIC5uYXYtcGlsbHM+bGkuYWN0aXZlPmEsIC5uYXYtcGlsbHM+bGkuYWN0aXZlPmE6Zm9jdXMsIC5uYXYtcGlsbHM+bGkuYWN0aXZlPmE6aG92ZXIgew0KICAgIGNvbG9yOiAjZmZmZmZmOw0KICAgIGJhY2tncm91bmQtY29sb3I6ICNFNTYxNkU7DQp9DQo8L3N0eWxlPg0KDQotLS0NCg0KIyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMgSG9tZQ0KDQotLS0NCg0KIyMjIA0KRW4gZXN0ZSBpbmZvcm1lIHNlIHB1ZWRlbiBleHBsb3JhciBsYXMgZGlmZXJlbmNpYXMgZW4gbGEgaW5zZXJjacOzbiBlbiBlbCBtZXJjYWRvIGRlIHRyYWJham8sIGVuIGxvcyBpbmdyZXNvcyBxdWUgcGVyY2liZW4sIGVuIGxhIGNhbnRpZGFkIGRlIGhvcmFzIHF1ZSB0cmFiYWphbiBzZW1hbmFsbWVudGUsIHkgbGEgZGlzdHJpYnVjacOzbiBkZSBsYXMgdGFyZWFzIGRvbcOpc3RpY2FzIGVudHJlIHZhcm9uZXMgeSBtdWplcmVzLiBQcmVzZW50YW1vcyBlc3RhIGluZm9ybWFjacOzbiBwYXJhIGVsIHBhw61zIGVuIGdlbmVyYWwgeSBkZXNhZ3JlZ2FkYSBwb3IgcmVnacOzbi4gDQo8YnI+PGJyPg0KDQpFc3RvcyBkYXRvcyBlc3TDoW4gZGlzcG9uaWJsZXMgcGFyYSBzdSBkaXZ1bGdhY2nDs24gXjFeLiBTaSB0ZSBndXN0YSBsbyBxdWUgaGFjZW1vcyBwb2TDqXMgYXBveWFybm9zIGhhY2nDqW5kb3RlIHNvY2llIGRlbCBbI0NsdWJFY29mZW1pbml0YSBvIHJlYWxpemFuZG8gdW5hIGRvbmFjacOzbl0oaHR0cHM6Ly9kb25hcm9ubGluZS5vcmcvZWNvbm9taWEtZmVtaW5pLXMtdGEvY2x1Yi1lY29mZW1pbml0YSkuDQoNCi0tLQ0KDQpeMV4gU2kgbmVjZXNpdMOhcyBjaXRhcm5vcyBlbiB1biB0cmFiYWpvLCBwb2TDqXMgaGFjZXJsbyBjb21vOiAiRWNvZmVtaW5pdGEuICgyMDIzKS4gRWNvZmVtaW5pdGEvRWNvRmVtaURhdGE6IGluZm9ybWVzIGVjb2ZlbWlkYXRhLiBaZW5vZG8uIGh0dHA6Ly9kb2kub3JnLzEwLjUyODEvemVub2RvLjQ1NDAxODUiDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIFNlIGxpbXBpYSBsYSBtZW1vcmlhIHkgc2UgY2FyZ2FuIGxpYnJlcsOtYXMgw7p0aWxlcw0KIyBSZWluaWNpYXIgUg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGh0dHIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGdndGhlbWVzKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShnZ2FsdCkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoZm9ybWF0dGFibGUpDQpsaWJyYXJ5KG9wZW54bHN4KQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGVwaCkgIyBVbiBwYXF1ZXRlIHBhcmEgdHJhYmFqYXIgY29uIGxhcyBiYXNlcyBkZSBsYSBFbmN1ZXN0YSBwZXJtYW5lbnRlIGRlIEhvZ2FyZXMhDQojIENvbW8gZnVlbnRlIHRvbWFtb3MgdW4gc2NyaXB0IGNvbiBlbCBjw7NkaWdvIGRlIGZ1bmNpb25lcyBwYXJhIG1vZGlmaWNhciBlbCBmb3JtYXRvIGRlIGxvcyBkYXRvcy4NCm9wdGlvbnMoc2NpcGVuID0gOTk5OSkNCnNvdXJjZSgiLi4vLi4vUi9mdW5jaW9uZXMgZm9ybWF0by5SIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBTZSBsZXZhbnRhbiBsYXMgYmFzZXMgdXN1YXJpYXMgZGUgbGEgRVBIIGRlbCB0cmltZXN0cmUgY29ycmVzcG9uZGllbnRlDQojbGV2YW50byBtYW51YWxtZW50ZSBwb3JxdWUgbWUgZmFsbGEgZ2V0X21pY3JvZGF0YS4gcHLDs3hpbW8gdHJpbWVzdHJlIHVzYXIgZWwgY8OzZGlnbyBncmlzYWRvIChDUykNCmxpYnJhcnkocmVhZHhsKQ0KI2Jhc2VfaW5kaXZpZHVhbCA8LSByZWFkX2V4Y2VsKCIvVXNlcnMvTWluaXN0ZXJpby5ERVNLVE9QLTQ2QlMyTUYvRG9jdW1lbnRzL0VGL3VzdV9pbmRpdmlkdWFsX1Q0MjIueGxzeC54bHN4IikNCiNiYXNlX2hvZ2FyIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9NaW5pc3RlcmlvLkRFU0tUT1AtNDZCUzJNRi9Eb2N1bWVudHMvRUYvdXN1X2hvZ2FyX1Q0MjIueGxzeC54bHN4IikNCg0KIyAoZnVuY2lvbmVzIGRlbCBwYXF1ZXRlICdlcGgnKQ0KYmFzZV9pbmRpdmlkdWFsIDwtIGdldF9taWNyb2RhdGEoeWVhciA9IDIwMjMsIHRyaW1lc3RlciA9IDQsIHR5cGUgPSAiaW5kaXZpZHVhbCIpDQpiYXNlX2hvZ2FyIDwtIGdldF9taWNyb2RhdGEoeWVhciA9IDIwMjMsIHRyaW1lc3RlciA9IDQsIHR5cGUgPSAiaG9nYXIiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIFN1YnRpdHVsbyB5IGZ1ZW50ZSBwYXJhIGdyYWZpY29zDQojIGRhdGUgPC0gIjFlciB0cmltZXN0cmUgMjAyMiINCmRhdGUgPC0gcGFzdGUwKGJhc2VfaW5kaXZpZHVhbCRUUklNRVNUUkVbMV0sIGlmZWxzZShiYXNlX2luZGl2aWR1YWwkVFJJTUVTVFJFWzFdICVpbiUgYygxLDMpLCAiZXIiLCBpZmVsc2UoYmFzZV9pbmRpdmlkdWFsJFRSSU1FU1RSRVsxXT09MiwgImRvIiwgInRvIikpLCAiIHRyaW1lc3RyZSAiLCBiYXNlX2luZGl2aWR1YWwkQU5PNFsxXSkNCmFnbG9fZGF0ZSA8LSBwYXN0ZTAoIlRvdGFsIGRlIGFnbG9tZXJhZG9zIHVyYmFub3MuICIsIGRhdGUpDQpmdWVudGUgPC0gIiNFY29mZW1pZGF0YSB5IEVjb2ZlbWluaXRhIGVuIGJhc2UgYSBFUEgtSU5ERUMiDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1vZGlmaWNhY2lvbmVzIGVuIGxhIGJhc2UNCmJhc2VfaW5kaXZpZHVhbCA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBtdXRhdGUoU2V4byA9IGFzLmNoYXJhY3RlcihDSDA0KSwNCiAgICAgICAgIFNleG8gPSBjYXNlX3doZW4oU2V4bz09IjEiIH4gIlZhcm9uZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBTZXhvPT0iMiIgfiAiTXVqZXJlcyIpLA0KICAgICAgICAgUmVnaW9uID0gYXMuY2hhcmFjdGVyKFJFR0lPTiksDQogICAgICAgICBSZWdpb24gPSBjYXNlX3doZW4oUkVHSU9OPT0iMSIgfiAiR3JhbiBCdWVub3MgQWlyZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR0lPTj09IjQwIiB+ICJOT0EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR0lPTj09IjQxIiB+ICJORUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR0lPTj09IjQyIiB+ICJDdXlvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdJT049PSI0MyIgfiAiUGFtcGVhbmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR0lPTj09IjQ0IiB+ICJQYXRhZ29uaWEiKSwNCiAgICAgICAgIFBQMDREX0NPRCA9IGFzLmNoYXJhY3RlcihQUDA0RF9DT0QpLA0KICAgICAgICAgUFAwNERfQ09EID0gY2FzZV93aGVuKG5jaGFyKFBQMDREX0NPRCkgPT0gNSB+IFBQMDREX0NPRCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2hhcihQUDA0RF9DT0QpID09IDQgfiBwYXN0ZTAoIjAiLCBQUDA0RF9DT0QpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jaGFyKFBQMDREX0NPRCkgPT0gMyB+IHBhc3RlMCgiMDAiLCBQUDA0RF9DT0QpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jaGFyKFBQMDREX0NPRCkgPT0gMiB+IHBhc3RlMCgiMDAwIiwgUFAwNERfQ09EKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2hhcihQUDA0RF9DT0QpID09IDEgfiBwYXN0ZTAoIjAwMDAiLCBQUDA0RF9DT0QpKSwNCiAgICAgICAgIENBTElGSUNBQ0lPTiA9IHN1YnN0cihQUDA0RF9DT0QsIDUsIDUpLA0KICAgICAgICAgQ0FMSUZJQ0FDSU9OID0gY2FzZV93aGVuKENBTElGSUNBQ0lPTj09IjEiIH4gIlByb2Zlc2lvbmFsZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTElGSUNBQ0lPTj09IjIiIH4gIlTDqWNuaWNvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUZJQ0FDSU9OPT0iMyIgfiAiT3BlcmF0aXZvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUZJQ0FDSU9OPT0iNCIgfiAiTm8gQ2FsaWZpY2Fkb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiMCIpLA0KICAgICAgICAgQ0FMSUZJQ0FDSU9OID0gZmFjdG9yKENBTElGSUNBQ0lPTiwgYygiTm8gQ2FsaWZpY2Fkb3MiLCAiT3BlcmF0aXZvcyIsICJUw6ljbmljb3MiLCAiUHJvZmVzaW9uYWxlcyIpKSwNCiAgICAgICAgIEpFUkFSUVVJQSA9IHN1YnN0cihQUDA0RF9DT0QsIDMsIDMpLA0KICAgICAgICAgSkVSQVJRVUlBID0gY2FzZV93aGVuKEpFUkFSUVVJQSAlaW4lIGMoIjAiLCAiMiIpIH4gIkRpcmVjY2nDs24gbyBKZWZlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkVSQVJRVUlBPT0iMSIgfiAiQ3VlbnRhcHJvcGlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRVJBUlFVSUE9PSIzIiB+ICJUcmFiYWphZG9yZXMgQXNhbGFyaWFkb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiMCIpLA0KICAgICAgICAgSkVSQVJRVUlBID0gZmFjdG9yKEpFUkFSUVVJQSwgYygiRGlyZWNjacOzbiBvIEplZmVzIiwgIlRyYWJhamFkb3JlcyBBc2FsYXJpYWRvcyIsICJDdWVudGFwcm9waWEiKSksDQogICAgICAgICBOSVZFTF9FRFVDQVRJVk8gPSBjYXNlX3doZW4oTklWRUxfRUQgJWluJSBjKDEsIDcpIH4gIlNpbiBJbnN0cnVjY2nDs24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JVkVMX0VEICVpbiUgYygyLCAzKSB+ICJQcmltYXJpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklWRUxfRUQgJWluJSBjKDQsIDUpIH4gIlNlY3VuZGFyaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JVkVMX0VEID09IDYgICAgICAgICB+ICJTdXBlcmlvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklWRUxfRUQgPT0gOSAgICAgICAgIH4gIk5TL05SIiksDQogICAgICAgICBOSVZFTF9FRFVDQVRJVk8gPSBmYWN0b3IoTklWRUxfRURVQ0FUSVZPLCBsZXZlbHMgPSBjKCJTaW4gSW5zdHJ1Y2Npw7NuIiwgIlByaW1hcmlhIiwgIlNlY3VuZGFyaWEiLCAiU3VwZXJpb3IiKSksDQogICAgICAgICBHUlVQT19FREFEID0gY2FzZV93aGVuKENIMDYgPj0gMTQgJiBDSDA2IDw9IDI5IH4gImRlIDE0IGEgMjkgYcOxb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDA2ID49IDMwICYgQ0gwNiA8PSA2NCB+ICJkZSAzMCBhIDY0IGHDsW9zIikpDQoNCiMgY29sb3JlcyA9IGMoIiNhYTE2NWEiLCIjMTZhYTY2IikNCmNvbG9yZXMgPSBjKCIjRTU2MTZFIiwgIiNjOWM5YzkiKQ0KY29sb3Jlc2IgPSBjKCIjOENEREQzIiwgIiM4NTk0QzYiLCAiI0Y4RjVFRSIpDQpgYGANCg0KIyMgTWVyY2FkbyBkZSBUcmFiYWpvDQoNCi0tLQ0KDQojIyMgU29icmUgbGEgY29tcG9zaWNpw7NuIGRlbCBNZXJjYWRvIGRlIFRyYWJham8gey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQo8YnI+PGJyPg0KRW4gZXN0YSBzZWNjacOzbiBzZSBpbnRlbnRhIG1vc3RyYXIgbGFzIGFzaW1ldHLDrWFzIHF1ZSBleGlzdGVuIGVuIGVsIG1lcmNhZG8gZGUgdHJhYmFqbyBlbiBjdWFudG8gYSBzdSBjb21wb3NpY2nDs24uIFBhcmEgZXN0byBzZSB1dGlsaXphbiBsYXMgdGFzYXMgZGUgYWN0aXZpZGFkLCBlbXBsZW8sIGRlc2VtcGxlbyB5IHN1Ym9jdXBhY2nDs24gc2Vnw7puIGVsIHNleG8gZGUgbGFzIHBlcnNvbmFzLiBFbCBvYmpldGl2byBlcyB2ZXIgcXXDqSB0YW4gbWFzY3VsaW5pemFkbyBzZSBlbmN1ZW50cmEgZWwgbWVyY2FkbyBsYWJvcmFsIHkgdmVyIHNpIGxhcyBtdWplcmVzIGVuY3VlbnRyYW4gbcOhcyBwcm9ibGVtYXMgYSBsYSBob3JhIGRlIGNvbnNlZ3VpciB1biBlbXBsZW8uIFRhbWJpw6luIHNlIGFuYWxpemFuIGVzdG9zIGluZGljYWRvcmVzIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBlZGFkIGRlIGxhcyBwZXJzb25hcyB5IHNlIGV4YW1pbmEgbGEgaW5jaWRlbmNpYSBkZSBsYSBpbmZvcm1hbGlkYWQgZW4gbGFzIHJlbGFjaW9uZXMgZGUgZGVwZW5kZW5jaWEgZGUgYXNhbGFyaWFkb3MgeSBhc2FsYXJpYWRhcy4gQSBzdSB2ZXosIHNlIGdyYWZpY2EgbGEgZGlmZXJlbmNpYSBlbiBhY2Nlc28gYSBjYXJnb3MgamVyw6FycXVpY29zIHkgbGEgZXN0cnVjdHVyYSBkZSBsYXMgZGlmZXJlbnRlcyByYW1hcyBkZSBvY3VwYWNpw7NuLCB2aW5jdWxhbmRvIGVzdG9zIGRhdG9zIGEgbGFzIGlkZWFzIGRlIHNlZ3JlZ2FjacOzbiB2ZXJ0aWNhbCB5IGhvcml6b250YWwgZW4gZWwgbWVyY2FkbyBkZSB0cmFiYWpvLg0KDQotLS0NCg0KIyMjIyBUYXNhcyBiw6FzaWNhcw0KPGJyPg0KDQojIyMjIyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyMjIFRvdGFsIG5hY2lvbmFsDQo8YnI+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQp0YWJsYTEuMSA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoQ0gwNiA+PSAxNCkgJT4lIA0KICBncm91cF9ieShTZXhvKSAlPiUgDQogIHN1bW1hcmlzZShQb2JsYWNpb24gICAgICAgICA9IHN1bShQT05ERVJBKSwNCiAgICAgICAgICAgIE9jdXBhZG9zICAgICAgICAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDFdKSwNCiAgICAgICAgICAgIERlc29jdXBhZG9zICAgICAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDJdKSwNCiAgICAgICAgICAgIFBFQSAgICAgICAgICAgICAgID0gT2N1cGFkb3MgKyBEZXNvY3VwYWRvcywNCiAgICAgICAgICAgIE9jdXBhZG9zX2RlbWFuZCAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBQUDAzSiA9PTFdKSwNCiAgICAgICAgICAgIFN1Ym9jX2RlbWFuZGFudGUgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBJTlRFTlNJID09MSAmIFBQMDNKPT0xXSksDQogICAgICAgICAgICBTdWJvY19ub19kZW1hbmQgICA9IHN1bShQT05ERVJBW0VTVEFETyA9PSAxICYgSU5URU5TSSA9PTEgJiBQUDAzSiAlaW4lIGMoMiw5KV0pLA0KICAgICAgICAgICAgU3Vib2N1cGFkb3MgICAgICAgPSBTdWJvY19kZW1hbmRhbnRlICsgU3Vib2Nfbm9fZGVtYW5kLA0KICAgICAgICAgICAgJ1Rhc2EgQWN0aXZpZGFkJyAgICAgICAgICAgICAgICAgID0gcm91bmQoUEVBL1BvYmxhY2lvbiwgMyksDQogICAgICAgICAgICAnVGFzYSBFbXBsZW8nICAgICAgICAgICAgICAgICAgICAgPSByb3VuZChPY3VwYWRvcy9Qb2JsYWNpb24sIDMpLA0KICAgICAgICAgICAgJ1Rhc2EgRGVzb2N1cGFjacOzbicgICAgICAgICAgICAgICA9IHJvdW5kKERlc29jdXBhZG9zL1BFQSwgMyksDQogICAgICAgICAgICAnVGFzYSBPY3VwYWRvcyBEZW1hbmRhbnRlcycgICAgICAgPSByb3VuZChPY3VwYWRvc19kZW1hbmQvUEVBLCAzKSwNCiAgICAgICAgICAgICdUYXNhIFN1Ym9jdXBhY2nDs24nICAgICAgICAgICAgICAgPSByb3VuZChTdWJvY3VwYWRvcy9QRUEsIDMpLA0KICAgICAgICAgICAgJ1Rhc2EgU3Vib2N1cGFjacOzbiBkZW1hbmRhbnRlJyAgICA9IHJvdW5kKFN1Ym9jX2RlbWFuZGFudGUvUEVBLCAzKSwNCiAgICAgICAgICAgICdUYXNhIFN1Ym9jdXBhY2nDs24gbm8gZGVtYW5kYW50ZScgPSByb3VuZChTdWJvY19ub19kZW1hbmQvUEVBLCAzKSkgJT4lIA0KICBzZWxlY3QoLWMoMjo5KSkgJT4lIA0KICBwaXZvdF9sb25nZXIoLiwgY29scyA9IDI6OCwgbmFtZXNfdG8gPSAiSW5kaWNhZG9yZXMiLCB2YWx1ZXNfdG8gPSAiVmFsb3IiKSAlPiUgDQogIHBpdm90X3dpZGVyKC4sIG5hbWVzX2Zyb20gPSBTZXhvLCB2YWx1ZXNfZnJvbSA9IFZhbG9yKQ0KDQppbmxpbmVfMSA8LSB0YWJsYTEuMSAlPiUgDQogIGZpbHRlcihJbmRpY2Fkb3JlcyA9PSAiVGFzYSBBY3RpdmlkYWQiKSAlPiUgDQogIHRyYW5zbXV0ZShkaWZlcmVuY2lhID0gcm91bmQoKFZhcm9uZXMtTXVqZXJlcykqMTAwLCAwKSkgJT4lIA0KICBwdWxsKGRpZmVyZW5jaWEpDQoNCmlubGluZV8yIDwtIHRhYmxhMS4xICU+JSANCiAgZmlsdGVyKEluZGljYWRvcmVzID09ICJUYXNhIEVtcGxlbyIpICU+JSANCiAgdHJhbnNtdXRlKGRpZmVyZW5jaWEgPSByb3VuZCgoVmFyb25lcy1NdWplcmVzKSoxMDAsIDApKSAlPiUgDQogIHB1bGwoZGlmZXJlbmNpYSkNCmBgYA0KDQpFbiBwcmltZXIgbHVnYXIgc2UgcHJlc2VudGFuIGFsZ3Vub3MgaW5kaWNhZG9yZXMgY2zDoXNpY29zICh1dGlsaXphZG9zIGEgbml2ZWwgaW50ZXJuYWNpb25hbCkgcXVlIGNhcmFjdGVyaXphbiBsYSBjb21wb3NpY2nDs24gZGVsIG1lcmNhZG8gZGUgdHJhYmFqbywgZGVzYWdyZWdhZG9zIHNlZ8O6biBlbCBzZXhvLiBQYXJhIGFob25kYXIgZW4gbG9zIGNvbmNlcHRvcyB1dGlsaXphZG9zIHNlIHB1ZWRlIGV4cGxvcmFyIGVsIGdsb3NhcmlvIGRlIGVzdGUgaW5mb3JtZS4NCjxicj48YnI+DQoNCkxhIF9fdGFzYSBkZSBhY3RpdmlkYWRfXyBlcyBhbXBsaWFtZW50ZSBtYXlvciBlbnRyZSBsb3MgdmFyb25lcyAobGEgZGlmZXJlbmNpYSByb25kYSBsb3MgYHIgaW5saW5lXzFgIHB1bnRvcyBwb3JjZW50dWFsZXMpLiBFc3RhIGRpc2NyZXBhbmNpYSBwb2Ryw61hIHNlciBleHBsaWNhZGEgcG9yIG3Dumx0aXBsZXMgY2F1c2FzLiBVbmEgZGUgZWxsYXMgZXMgcXVlIHVuYSBpbXBvcnRhbnRlIHBvcmNpw7NuIGRlIGxhcyBtdWplcmVzIGVuIGVkYWQgbGFib3JhbCBkZWRpcXVlbiBzdSB0aWVtcG8gYSByZWFsaXphciB0YXJlYXMgZG9tw6lzdGljYXMgbm8gcmVtdW5lcmFkYXMsIGVuIGx1Z2FyIGRlIHRlbmVyIHVuYSBhY3RpdmlkYWQgZW4gZWwgbWVyY2FkbyBkZSB0cmFiYWpvLiBPdHJhIHJhesOzbiBwb3NpYmxlIHBvZHLDrWEgc2VyIGVsIGhlY2hvIGRlIHF1ZSBsYXMgbXVqZXJlcyB0aWVuZGFuLCBlbiBwcm9tZWRpbywgYSBlZHVjYXJzZSBtw6FzIHF1ZSBzdXMgcGFyZXMgdmFyb25lcy4gTGEgX190YXNhIGRlIGVtcGxlb19fLCBwb3Igc3UgcGFydGUsIGV4aGliZSB1bmEgZGlmZXJlbmNpYSBlbnRyZSB2YXJvbmVzIHkgbXVqZXJlcyBxdWUgcm9uZGEgbG9zIGByIGlubGluZV8yYCBwdW50b3MsIGRlbm90YW5kbyBlbCBtaXNtbyBmZW7Ds21lbm8gYW50ZXJpb3JtZW50ZSBtZW5jaW9uYWRvLg0KPGJyPjxicj4NCg0KRXMgaW1wb3J0YW50ZSBhY2xhcmFyIHF1ZSBlc3RhcyB0YXNhcyBleHByZXNhbiBlbCBjb21wb3J0YW1pZW50byBhZ3JlZ2FkbyBkZSBsYSBwb2JsYWNpw7NuLCB5IHF1ZSBsYXMgZGlmZXJlbmNpYXMgZW50cmUgdmFyb25lcyB5IG11amVyZXMgc3VmcmVuIHZhcmlhY2lvbmVzIHNpIHNlIHRpZW5lbiBlbiBjdWVudGEgb3RyYXMgdmFyaWFibGVzLCBjb21vIHB1ZWRlbiBzZXIgbG9zIGdydXBvcyBkZSBlZGFkLCBlbCBuaXZlbCBlZHVjYXRpdm8sIGxhIHByZXNlbmNpYSBkZSBuacOxZXMgZW4gZWwgaG9nYXIgbyBlbCBuaXZlbCBkZSBpbmdyZXNvcy4NCjxicj48YnI+DQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX1Rhc2FzIGRlIGFjdGl2aWRhZCB5IGVtcGxlbyBwb3Igc2V4b19fPC9wPg0KPHAgc3R5bGU9ImNvbG9yOiNjOWM5YzkiPl9fUG9ibGFjacOzbiBkZSAxNCBhw7FvcyB5IG3DoXMuIGByIGFnbG9fZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0YWJsYTEuMiA8LSB0YWJsYTEuMSAlPiUgDQogIGZpbHRlcihJbmRpY2Fkb3JlcyAlaW4lIGMoIlRhc2EgQWN0aXZpZGFkIiwgIlRhc2EgRW1wbGVvIikpICU+JSANCiAgZ2F0aGVyKC4sIFNleG8sIHByb3BvcmNpb24sIDI6MykNCg0KZ2dwbG90KHRhYmxhMS4yLCBhZXMoeCA9ICcnLCBwcm9wb3JjaW9uLCBmaWxsID0gU2V4bywgZ3JvdXAgPSBTZXhvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBwZXJjZW50KHByb3BvcmNpb24sIGRpZ2l0cyA9IDEpKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksIHZqdXN0ID0yLCBzaXplID0gNikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArDQogIGZhY2V0X3dyYXAofkluZGljYWRvcmVzLCBzdHJpcC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGxhYnMoY2FwdGlvbiA9IGZ1ZW50ZSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEFxdcOtIGhheSBxdWUgY2FtYmlhciBlbCBkaXJlY3RvcmlvIGVuIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZWwgZ3LDoWZpY28uDQojZ2dzYXZlKCJGaWd1cmExLnBuZyIsIHNjYWxlID0gMC43LCBkcGkgPSAzMDAsIHdpZHRoID0gMTAsIGhlaWdodCA9IDcsIGJnID0gIiNmZmZmZmYiKQ0KYGBgDQoNCi0tLQ0KDQpBIGRpZmVyZW5jaWEgZGUgbGFzIHRhc2FzIGFudGVyaW9yZXMsIGxhcyBfX3Rhc2FzIGRlIGRlc29jdXBhY2nDs24geSBzdWJvY3VwYWNpw7NuX18gZXhwcmVzYW4gbGEgcHJvcG9yY2nDs24gcXVlIGVzdG9zIGdydXBvcyByZXByZXNlbnRhbiBlbiBsYSBQb2JsYWNpw7NuIEVjb27Ds21pY2FtZW50ZSBBY3RpdmEuIFVzdWFsbWVudGUsIGFtYmFzIHRhc2FzIHNvbiBtYXlvcmVzIHBhcmEgbGFzIG11amVyZXMgcXVlIHBhcmEgbG9zIHZhcm9uZXMsIHNlw7FhbGFuZG8gcXVlLCBpbmNsdXNvIHNpZW5kbyBtaW5vcsOtYSBlbiBlbCBtZXJjYWRvIGRlIHRyYWJham8sIGxhcyBtdWplcmVzIHRlbmRyw61hbiBtw6FzIGRpZmljdWx0YWRlcyBwYXJhIGNvbnNlZ3VpciB0cmFiYWpvIHkvbyBwYXJhIHRyYWJhamFyIHVuYSBqb3JuYWRhIGNvbXBsZXRhLiANCjxicj48YnI+DQpFbiBzdSBjb25qdW50bywgbG9zIGN1YXRybyBpbmRpY2Fkb3JlcyBwcmVzZW50YWRvcyBlbiBlc3RhIHNlY2Npw7NuIG11ZXN0cmFuIHVuYSBwcmltZXJhIGltYWdlbiBkZSBsYSBwcm9ibGVtw6F0aWNhIHF1ZSBlbmZyZW50YW4gbGFzIG11amVyZXMgZW4gZWwgbWVyY2FkbyBkZSB0cmFiYWpvIGFyZ2VudGluby4NCjxicj48YnI+DQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX1Rhc2FzIGRlIGRlc29jdXBhY2nDs24geSBzdWJvY3VwYWNpw7NuIHBvciBzZXhvX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb2JsYWNpw7NuIGRlIDE0IGHDsW9zIHkgbcOhcy4gYHIgYWdsb19kYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMS4zIDwtIHRhYmxhMS4xICU+JSANCiAgZmlsdGVyKEluZGljYWRvcmVzICVpbiUgYygiVGFzYSBEZXNvY3VwYWNpw7NuIiwgIlRhc2EgU3Vib2N1cGFjacOzbiIpKSAlPiUgDQogIGdhdGhlciguLCBTZXhvLCBwcm9wb3JjaW9uLCAyOjMpDQoNCmdncGxvdCh0YWJsYTEuMywgYWVzKHggPSAnJywgcHJvcG9yY2lvbiwgZmlsbCA9IFNleG8sIGdyb3VwID0gU2V4bywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gcGVyY2VudChwcm9wb3JjaW9uLCBkaWdpdHMgPSAxKSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLCB2anVzdCA9Miwgc2l6ZSA9IDYpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKw0KICBmYWNldF93cmFwKH5JbmRpY2Fkb3Jlcywgc3RyaXAucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICBsYWJzKGNhcHRpb24gPSBmdWVudGUpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBBcXXDrSBoYXkgcXVlIGNhbWJpYXIgZWwgZGlyZWN0b3JpbyBlbiBxdWUgc2UgdmEgYSBndWFyZGFyIGVsIGdyw6FmaWNvLg0KI2dnc2F2ZSgiRmlndXJhMi5wbmciLCBzY2FsZSA9IDAuNywgZHBpID0gMzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBiZyA9ICIjZmZmZmZmIikNCmBgYA0KDQojIyMjIyMgUG9yIHJlZ2nDs24NCjxicj4NCkEgY29udGludWFjacOzbiBzZSBwcmVzZW50YW4gbGFzIHRhc2FzIGRlIGFjdGl2aWRhZCwgZW1wbGVvLCBkZXNvY3VwYWNpw7NuIHkgc3Vib2N1cGFjacOzbiBwYXJhIHZhcm9uZXMgeSBtdWplcmVzIHNlZ8O6biBsYSByZWdpw7NuLiANCjxicj48YnI+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojY2hlcXVlYW1vcyBjYW50aWRhZGVzIG11ZXN0cmFsZXMNCnRhYmxhMS40IDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihDSDA2ID49IDE0KSAlPiUgDQogIG11dGF0ZShuID0gMSkgJT4lIA0KICBncm91cF9ieShTZXhvLCBSZWdpb24pICU+JSANCiAgc3VtbWFyaXNlKG5fUG9ibGFjaW9uICAgICAgICAgPSBzdW0obiksDQogICAgICAgICAgICBuX09jdXBhZG9zICAgICAgICAgID0gc3VtKG5bRVNUQURPID09IDFdKSwNCiAgICAgICAgICAgIG5fRGVzb2N1cGFkb3MgICAgICAgPSBzdW0obltFU1RBRE8gPT0gMV0pLA0KICAgICAgICAgICAgbl9QRUEgICAgICAgICAgICAgICA9IG5fT2N1cGFkb3MgKyBuX0Rlc29jdXBhZG9zLA0KICAgICAgICAgICAgbl9PY3VwYWRvc19kZW1hbmQgICA9IHN1bShuW0VTVEFETyA9PSAxICYgUFAwM0ogPT0xXSksDQogICAgICAgICAgICBuX1N1Ym9jX2RlbWFuZGFudGUgID0gc3VtKG5bRVNUQURPID09IDEgJiBJTlRFTlNJID09MSAmIFBQMDNKPT0xXSksDQogICAgICAgICAgICBuX1N1Ym9jX25vX2RlbWFuZCAgID0gc3VtKG5bRVNUQURPID09IDEgJiBJTlRFTlNJID09MSAmIFBQMDNKICVpbiUgYygyLDkpXSksDQogICAgICAgICAgICBuX1N1Ym9jdXBhZG9zICAgICAgID0gbl9TdWJvY19kZW1hbmRhbnRlICsgbl9TdWJvY19ub19kZW1hbmQpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiN0YWJsYSBkZSB0YXNhcyBiw6FzaWNhcyBwb3IgcmVnacOzbg0KdGFibGExLjUgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKENIMDYgPj0gMTQpICU+JSANCiAgZ3JvdXBfYnkoU2V4bywgUmVnaW9uKSAlPiUgDQogIHN1bW1hcmlzZShQb2JsYWNpb24gICAgICAgICA9IHN1bShQT05ERVJBKSwNCiAgICAgICAgICAgIE9jdXBhZG9zICAgICAgICAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDFdKSwNCiAgICAgICAgICAgIERlc29jdXBhZG9zICAgICAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDJdKSwNCiAgICAgICAgICAgIFBFQSAgICAgICAgICAgICAgID0gT2N1cGFkb3MgKyBEZXNvY3VwYWRvcywNCiAgICAgICAgICAgIE9jdXBhZG9zX2RlbWFuZCAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBQUDAzSiA9PTFdKSwNCiAgICAgICAgICAgIFN1Ym9jX2RlbWFuZGFudGUgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBJTlRFTlNJID09MSAmIFBQMDNKPT0xXSksDQogICAgICAgICAgICBTdWJvY19ub19kZW1hbmQgICA9IHN1bShQT05ERVJBW0VTVEFETyA9PSAxICYgSU5URU5TSSA9PTEgJiBQUDAzSiAlaW4lIGMoMiw5KV0pLA0KICAgICAgICAgICAgU3Vib2N1cGFkb3MgICAgICAgPSBTdWJvY19kZW1hbmRhbnRlICsgU3Vib2Nfbm9fZGVtYW5kLA0KICAgICAgICAgICAgJ0FjdGl2aWRhZCcgICAgICAgICAgICAgICAgICA9IHJvdW5kKFBFQS9Qb2JsYWNpb24sIDMpLA0KICAgICAgICAgICAgJ0VtcGxlbycgICAgICAgICAgICAgICAgICAgICA9IHJvdW5kKE9jdXBhZG9zL1BvYmxhY2lvbiwgMyksDQogICAgICAgICAgICAnRGVzb2N1cGFjacOzbicgICAgICAgICAgICAgICA9IHJvdW5kKERlc29jdXBhZG9zL1BFQSwgMyksDQogICAgICAgICAgICAnU3Vib2N1cGFjacOzbicgICAgICAgICAgICAgICA9IHJvdW5kKFN1Ym9jdXBhZG9zL1BFQSwgMykpICU+JSANCiAgc2VsZWN0KC1jKDM6MTApKSAlPiUgDQogIHBpdm90X2xvbmdlciguLCBjb2xzID0gMzo2LCBuYW1lc190byA9ICJJbmRpY2Fkb3JlcyIsIHZhbHVlc190byA9ICJWYWxvciIpICU+JSANCiAgbXV0YXRlKFZhbG9yID0gcGVyY2VudChWYWxvciwgMSkpICU+JSANCiAgcGl2b3Rfd2lkZXIoLiwgbmFtZXNfZnJvbSA9IFNleG8sIHZhbHVlc19mcm9tID0gVmFsb3IpICU+JSANCiAgbXV0YXRlKEluZGljYWRvcmVzID0gZmFjdG9yKEluZGljYWRvcmVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkFjdGl2aWRhZCIsICJFbXBsZW8iLCAiRGVzb2N1cGFjacOzbiIsICJTdWJvY3VwYWNpw7NuIikpKSAlPiUgDQogIGFycmFuZ2UoSW5kaWNhZG9yZXMpDQpgYGANCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fVGFzYXMgZGUgYWN0aXZpZGFkIHkgZW1wbGVvIHBvciByZWdpw7NuIHkgc2V4b19fPC9wPg0KPHAgc3R5bGU9ImNvbG9yOiNjOWM5YzkiPl9fUG9ibGFjacOzbiBkZSAxNCBhw7FvcyB5IG3DoXMuIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2N1YWRybyBkZSB0YXNhcyBiw6FzaWNhcyBwb3IgcmVnacOzbiBvcGNpw7NuIDIgZGUgdmlzdWFsaXphY2nDs24NCnRhYmxhMS41X2dyYWYxIDwtIHRhYmxhMS41ICU+JSANCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHM9Mzo0LCBuYW1lc190byA9ICJTZXhvIiwgdmFsdWVzX3RvID0gInByb3BvcmNpb24iKSAlPiUgDQogIGZpbHRlcihJbmRpY2Fkb3JlcyAlaW4lIGMoIkFjdGl2aWRhZCIsICJFbXBsZW8iKSkNCg0KZ2dwbG90KHRhYmxhMS41X2dyYWYxLCBhZXMoeCA9IEluZGljYWRvcmVzLCBwcm9wb3JjaW9uLCBmaWxsID0gU2V4bywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gcGVyY2VudChwcm9wb3JjaW9uLCBkaWdpdHMgPSAxKSkpICsNCiAgZmFjZXRfd3JhcCggfiBSZWdpb24pICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLCB2anVzdCA9Miwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKw0KICBsYWJzKGNhcHRpb24gPSBmdWVudGUpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBBcXXDrSBoYXkgcXVlIGNhbWJpYXIgZWwgZGlyZWN0b3JpbyBlbiBxdWUgc2UgdmEgYSBndWFyZGFyIGVsIGdyw6FmaWNvLg0KI2dnc2F2ZSgiVGFzYXNiYXNpY2FzMXJlZ2lvbi5wbmciLCBzY2FsZSA9IDAuNywgZHBpID0gMzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBiZyA9ICIjZmZmZmZmIikNCmBgYA0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19UYXNhcyBkZSBkZXNvY3VwYWNpw7NuIHkgc3Vib2N1cGFjacOzbiBwb3IgcmVnacOzbiB5IHNleG9fXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX1BvYmxhY2nDs24gZGUgMTQgYcOxb3MgeSBtw6FzLiBgciBkYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMS41X2dyYWYyIDwtIHRhYmxhMS41ICU+JSANCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHM9Mzo0LCBuYW1lc190byA9ICJTZXhvIiwgdmFsdWVzX3RvID0gInByb3BvcmNpb24iKSAlPiUgDQogIGZpbHRlcihJbmRpY2Fkb3JlcyAlaW4lIGMoIkRlc29jdXBhY2nDs24iLCAiU3Vib2N1cGFjacOzbiIpKQ0KDQpnZ3Bsb3QodGFibGExLjVfZ3JhZjIsIGFlcyh4ID0gSW5kaWNhZG9yZXMsIHByb3BvcmNpb24sIGZpbGwgPSBTZXhvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBwZXJjZW50KHByb3BvcmNpb24sIGRpZ2l0cyA9IDEpKSkgKw0KICBmYWNldF93cmFwKCB+IFJlZ2lvbikgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksIHZqdXN0ID0yLCBzaXplID0gMykgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArDQogIGxhYnMoY2FwdGlvbiA9IGZ1ZW50ZSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEFxdcOtIGhheSBxdWUgY2FtYmlhciBlbCBkaXJlY3RvcmlvIGVuIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZWwgZ3LDoWZpY28uDQojZ2dzYXZlKCJUYXNhc2Jhc2ljYXMycmVnaW9uLnBuZyIsIHNjYWxlID0gMC43LCBkcGkgPSAzMDAsIHdpZHRoID0gMTAsIGhlaWdodCA9IDcsIGJnID0gIiNmZmZmZmYiKQ0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnJtKHRhYmxhMS4xLCB0YWJsYTEuMiwgdGFibGExLjMsIHRhYmxhMS40LCB0YWJsYTEuNSwgdGFibGExLjVfZ3JhZjEsIHRhYmxhMS41X2dyYWYyKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQp0YWJsYTEuNiA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoQ0gwNiA+PSAxNCkgJT4lIA0KICBncm91cF9ieShTZXhvLCBHUlVQT19FREFEKSAlPiUgDQogIHN1bW1hcmlzZShQb2JsYWNpb24gICAgICAgICA9IHN1bShQT05ERVJBKSwNCiAgICAgICAgICAgIE9jdXBhZG9zICAgICAgICAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDFdKSwNCiAgICAgICAgICAgIERlc29jdXBhZG9zICAgICAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDJdKSwNCiAgICAgICAgICAgIFBFQSAgICAgICAgICAgICAgID0gT2N1cGFkb3MgKyBEZXNvY3VwYWRvcywNCiAgICAgICAgICAgIE9jdXBhZG9zX2RlbWFuZCAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBQUDAzSiA9PTFdKSwNCiAgICAgICAgICAgIFN1Ym9jX2RlbWFuZGFudGUgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBJTlRFTlNJID09MSAmIFBQMDNKPT0xXSksDQogICAgICAgICAgICBTdWJvY19ub19kZW1hbmQgICA9IHN1bShQT05ERVJBW0VTVEFETyA9PSAxICYgSU5URU5TSSA9PTEgJiBQUDAzSiAlaW4lIGMoMiw5KV0pLA0KICAgICAgICAgICAgU3Vib2N1cGFkb3MgICAgICAgPSBTdWJvY19kZW1hbmRhbnRlICsgU3Vib2Nfbm9fZGVtYW5kLA0KICAgICAgICAgICAgJ1Rhc2EgQWN0aXZpZGFkJyAgICAgICAgICAgICAgICAgID0gcGVyY2VudChQRUEvUG9ibGFjaW9uLCAxKSwNCiAgICAgICAgICAgICdUYXNhIEVtcGxlbycgICAgICAgICAgICAgICAgICAgICA9IHBlcmNlbnQoT2N1cGFkb3MvUG9ibGFjaW9uLCAxKSwNCiAgICAgICAgICAgICdUYXNhIERlc29jdXBhY2nDs24nICAgICAgICAgICAgICAgPSBwZXJjZW50KERlc29jdXBhZG9zL1BFQSwgMSksDQogICAgICAgICAgICAnVGFzYSBTdWJvY3VwYWNpw7NuJyAgICAgICAgICAgICAgID0gcGVyY2VudChTdWJvY3VwYWRvcy9QRUEsIDEpKSAlPiUgDQogIHNlbGVjdCgtYygzOjEwKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKEdSVVBPX0VEQUQpKSAlPiUgDQogIGdhdGhlcihJbmRpY2Fkb3JlcywgVmFsb3IsIDM6NikgJT4lIA0KICBzcHJlYWQoLiwgU2V4bywgVmFsb3IpICU+JSANCiAgbXV0YXRlKEluZGljYWRvcmVzID0gZmFjdG9yKEluZGljYWRvcmVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlRhc2EgQWN0aXZpZGFkIiwgIlRhc2EgRW1wbGVvIiwgIlRhc2EgRGVzb2N1cGFjacOzbiIsICJUYXNhIFN1Ym9jdXBhY2nDs24iKSkpICU+JSANCiAgYXJyYW5nZShJbmRpY2Fkb3JlcykNCg0KdGFibGExLjZtIDwtIHRhYmxhMS42ICU+JSANCiAgc2VsZWN0KC1WYXJvbmVzKSAlPiUgDQogIHNwcmVhZCguLCBHUlVQT19FREFELCBNdWplcmVzKQ0KDQp0YWJsYTEuNnYgPC0gdGFibGExLjYgJT4lIA0KICBzZWxlY3QoLU11amVyZXMpICU+JSANCiAgc3ByZWFkKC4sIEdSVVBPX0VEQUQsIFZhcm9uZXMpDQoNCnRhYmxhMS43IDwtIGxlZnRfam9pbih0YWJsYTEuNm0sIHRhYmxhMS42diwgYnkgPSAiSW5kaWNhZG9yZXMiKSAlPiUgDQogIHNlbGVjdChJbmRpY2Fkb3JlcywgYE11amVyZXNgID0gYGRlIDE0IGEgMjkgYcOxb3MueGAsIGBWYXJvbmVzYCA9IGBkZSAxNCBhIDI5IGHDsW9zLnlgLA0KICAgICAgICAgYCBNdWplcmVzYCA9IGBkZSAzMCBhIDY0IGHDsW9zLnhgLCBgIFZhcm9uZXNgID0gYGRlIDMwIGEgNjQgYcOxb3MueWApDQoNCmlubGluZV8zIDwtIHRhYmxhMS42bSAlPiUgDQogIGZpbHRlcihJbmRpY2Fkb3JlcyA9PSAiVGFzYSBEZXNvY3VwYWNpw7NuIikgJT4lIA0KICBwdWxsKGBkZSAxNCBhIDI5IGHDsW9zYCkNCg0KaW5saW5lXzQgPC0gdGFibGExLjZ2ICU+JSANCiAgZmlsdGVyKEluZGljYWRvcmVzID09ICJUYXNhIERlc29jdXBhY2nDs24iKSAlPiUgDQogIHB1bGwoYGRlIDE0IGEgMjkgYcOxb3NgKSAlPiUgDQogIHBlcmNlbnQoLiwgMCkNCmBgYA0KDQojIyMjIFBvciBncnVwb3MgZGUgZWRhZA0KPGJyPg0KQSBjb250aW51YWNpw7NuIHNlIGV4cG9uZW4gbG9zIG1pc21vcyBpbmRpY2Fkb3JlcywgcGVybyBkZXNhZ3JlZ2Fkb3MgcG9yIGdydXBvcyBkZSBlZGFkIGFkZW3DoXMgZGUgcG9yIHNleG8uDQo8YnI+PGJyPg0KRW4gZXN0ZSBjYXNvLCBsbGFtYSBsYSBhdGVuY2nDs24gcXVlIHNvbiBsYXMgbXVqZXJlcyBtw6FzIGrDs3ZlbmVzIGxhcyBxdWUgcHJlc2VudGFuIGxhcyBtYXlvcmVzIHRhc2FzIGRlIGRlc29jdXBhY2nDs24geSBzdWJvY3VwYWNpw7NuLiBQYXJhIGRhciB1biBlamVtcGxvLCBfX3VuIGByIGlubGluZV8zYCBkZSBsYXMgbXVqZXJlcyBkZSAxNCBhIDI5IGHDsW9zIGVzdMOhIGRlc29jdXBhZGFfXywgZXMgZGVjaXIgcXVlLCBubyB0ZW5pZW5kbyBvY3VwYWNpw7NuLCBlc3TDoW4gYnVzY2FuZG8gYWN0aXZhbWVudGUgdW4gdHJhYmFqbyB5IG5vIGxvIGNvbnNpZ3Vlbi4gRW4gY2FtYmlvLCBlbiBlbCBjYXNvIGRlIGxvcyB2YXJvbmVzIGrDs3ZlbmVzLCBlbCBwb3JjZW50YWplIGRlIGRlc29jdXBhZG9zIGVzIGRlIG3DoXMgZGVsIF9fYHIgaW5saW5lXzRgLl9fDQo8YnI+PGJyPg0KQXNpbWlzbW8sIHNlIHZlcmlmaWNhIHVuYSBkaWZlcmVuY2lhIGVuIGxhcyB0YXNhcyBkZSBhY3RpdmlkYWQgeSBlbXBsZW8gZW50cmUgbGFzIG11amVyZXMgeSB2YXJvbmVzIGRlIGVudHJlIDMwIHkgNjQgYcOxb3MuDQo8YnI+PGJyPg0KDQojIyMjIyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyMjIFRvdGFsIG5hY2lvbmFsDQo8YnI+DQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19QcmluY2lwYWxlcyB0YXNhcyBkZWwgbWVyY2FkbyBkZSB0cmFiYWpvLCBwb3IgZ3J1cG9zIGRlIGVkYWQgeSBzZXhvX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb2JsYWNpw7NuIGRlIDE0IGHDsW9zIGEgNjQgYcOxb3MuIGByIGFnbG9fZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0YWJsYTEuNyAlPiUgDQogIGthYmxlKGFsaWduID0gImxjY2NjIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCANCiAgICAgICAgICAgICAgICAjZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlxuIiA9IDEsICJkZSAxNCBhIDI5IGHDsW9zIiA9IDIsICJkZSAzMCBhIDY0IGHDsW9zIiA9IDIpLA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9IGZ1ZW50ZSwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICJcbiIpICU+JQ0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI0Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDIsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICIzY20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjNjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoNCwgd2lkdGggPSAiM2NtIikgJT4lDQogIGNvbHVtbl9zcGVjKDUsIHdpZHRoID0gIjNjbSIpICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KIyMjIyMjIFBvciByZWdpw7NuDQo8YnI+DQoNCkxhcyB0YXNhcyBkZWwgbWVyY2FkbyBkZSB0cmFiYWpvIHByZXNlbnRhbiBkaWZlcmVudGVzIHZhbG9yZXMgcGFyYSBtdWplcmVzIHkgdmFyb25lcywgcGVybyB0YW1iacOpbiBoYXkgZGlmZXJlbmNpYXMgc2Vnw7puIGVsIGdydXBvIGRlIGVkYWQuIExvcyB5IGxhcyBqw7N2ZW5lcyBwcmVzZW50YW4gbWVub3JlcyB0YXNhcyBkZSBhY3RpdmlkYWQgeSBlbXBsZW8geSBtYXlvcmVzIHRhc2FzIGRlIGRlc29jdXBhY2nDs24geSBzdWJvY3VwYWNpw7NuIHF1ZSBsYXMgcGVyc29uYXMgZGUgZW50cmUgMzAgeSA2NCBhw7FvcyBlbiB0b2RhcyBsYXMgcmVnaW9uZXMgZGVsIHBhw61zLiANCjxicj4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiNjaGVxdWVhbW9zIGNhbnRpZGFkZXMgbXVlc3RyYWxlcw0KDQp0YWJsYTEuOCA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoQ0gwNiA+PSAxNCAmIENIMDYgPD0gMjkpICU+JSANCiAgbXV0YXRlKG4gPSAxKSAlPiUgDQogIGdyb3VwX2J5KFNleG8sIFJlZ2lvbikgJT4lIA0KICBzdW1tYXJpc2Uobl9Qb2JsYWNpb24gICAgICAgICA9IHN1bShuKSwNCiAgICAgICAgICAgIG5fT2N1cGFkb3MgICAgICAgICAgPSBzdW0obltFU1RBRE8gPT0gMV0pLA0KICAgICAgICAgICAgbl9EZXNvY3VwYWRvcyAgICAgICA9IHN1bShuW0VTVEFETyA9PSAxXSksDQogICAgICAgICAgICBuX1BFQSAgICAgICAgICAgICAgID0gbl9PY3VwYWRvcyArIG5fRGVzb2N1cGFkb3MpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiN0YWJsYSBkZSB0YXNhcyBiw6FzaWNhcyBwb3IgcmVnacOzbiB5IGdydXBvIGRlIGVkYWQgbWVub3JlcyAzMA0KDQp0YWJsYTEuOSA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBncm91cF9ieShTZXhvLCBSZWdpb24sIEdSVVBPX0VEQUQpICU+JSANCiAgc3VtbWFyaXNlKFBvYmxhY2lvbiAgICAgICAgID0gc3VtKFBPTkRFUkEpLA0KICAgICAgICAgICAgT2N1cGFkb3MgICAgICAgICAgPSBzdW0oUE9OREVSQVtFU1RBRE8gPT0gMV0pLA0KICAgICAgICAgICAgRGVzb2N1cGFkb3MgICAgICAgPSBzdW0oUE9OREVSQVtFU1RBRE8gPT0gMl0pLA0KICAgICAgICAgICAgUEVBICAgICAgICAgICAgICAgPSBPY3VwYWRvcyArIERlc29jdXBhZG9zLA0KICAgICAgICAgICAgT2N1cGFkb3NfZGVtYW5kICAgPSBzdW0oUE9OREVSQVtFU1RBRE8gPT0gMSAmIFBQMDNKID09MV0pLA0KICAgICAgICAgICAgU3Vib2NfZGVtYW5kYW50ZSAgPSBzdW0oUE9OREVSQVtFU1RBRE8gPT0gMSAmIElOVEVOU0kgPT0xICYgUFAwM0o9PTFdKSwNCiAgICAgICAgICAgIFN1Ym9jX25vX2RlbWFuZCAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBJTlRFTlNJID09MSAmIFBQMDNKICVpbiUgYygyLDkpXSksDQogICAgICAgICAgICBTdWJvY3VwYWRvcyAgICAgICA9IFN1Ym9jX2RlbWFuZGFudGUgKyBTdWJvY19ub19kZW1hbmQsDQogICAgICAgICAgICAnQWN0aXZpZGFkJyAgICAgICAgICAgICAgICAgID0gcGVyY2VudChyb3VuZChQRUEvUG9ibGFjaW9uLCAzKSwxKSwNCiAgICAgICAgICAgICdFbXBsZW8nICAgICAgICAgICAgICAgICAgICAgPSBwZXJjZW50KHJvdW5kKE9jdXBhZG9zL1BvYmxhY2lvbiwgMyksMSksDQogICAgICAgICAgICAnRGVzb2N1cGFjacOzbicgICAgICAgICAgICAgICA9IHBlcmNlbnQocm91bmQoRGVzb2N1cGFkb3MvUEVBLCAzKSwxKSwNCiAgICAgICAgICAgICdTdWJvY3VwYWNpw7NuJyAgICAgICAgICAgICAgID0gcGVyY2VudChyb3VuZChTdWJvY3VwYWRvcy9QRUEsIDMpLDEpKSAlPiUgDQogIHNlbGVjdCgtYyg0OjExKSkgDQpgYGANCg0KPGJyPg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fVGFzYSBkZSBhY3RpdmlkYWQgcG9yIGdydXBvIGRlIGVkYWQgeSBzZXhvX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb2JsYWNpw7NuIGRlIDE0IGHDsW9zIGEgNjQgYcOxb3MsIHNlZ8O6biByZWdpw7NuLiBgciBhZ2xvX2RhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp0YWJsYTEuOV9ncmFmMSA8LSB0YWJsYTEuOSAlPiUgDQogIGZpbHRlcihHUlVQT19FREFEICAhPSAiTkEiKSAlPiUgDQogIHNlbGVjdChjKDE6NCkpDQoNCmdncGxvdCh0YWJsYTEuOV9ncmFmMSwgYWVzKHggPSBHUlVQT19FREFELCBBY3RpdmlkYWQsIGZpbGwgPSBTZXhvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBBY3RpdmlkYWQpKSArDQogIGZhY2V0X3dyYXAoIH4gUmVnaW9uKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwgdmp1c3QgPTIsIHNpemUgPSAzKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yZXMpICsNCiAgbGFicyhjYXB0aW9uID0gZnVlbnRlKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgQXF1w60gaGF5IHF1ZSBjYW1iaWFyIGVsIGRpcmVjdG9yaW8gZW4gcXVlIHNlIHZhIGEgZ3VhcmRhciBlbCBncsOhZmljby4NCiNnZ3NhdmUoIlRhc2FzYmFzaWNhczJyZWdpb24ucG5nIiwgc2NhbGUgPSAwLjcsIGRwaSA9IDMwMCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNywgYmcgPSAiI2ZmZmZmZiIpDQpgYGANCg0KPGJyPg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fVGFzYSBkZSBlbXBsZW8gcG9yIGdydXBvIGRlIGVkYWQgeSBzZXhvX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb2JsYWNpw7NuIGRlIDE0IGHDsW9zIGEgNjQgYcOxb3MsIHNlZ8O6biByZWdpw7NuLiBgciBkYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KdGFibGExLjlfZ3JhZjIgPC0gdGFibGExLjkgJT4lIA0KICBmaWx0ZXIoR1JVUE9fRURBRCAgIT0gIk5BIikgJT4lIA0KICBzZWxlY3QoYygxOjMsIDUpKQ0KDQpnZ3Bsb3QodGFibGExLjlfZ3JhZjIsIGFlcyh4ID0gR1JVUE9fRURBRCwgRW1wbGVvLCBmaWxsID0gU2V4bywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gRW1wbGVvKSkgKw0KICBmYWNldF93cmFwKCB+IFJlZ2lvbikgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksIHZqdXN0ID0yLCBzaXplID0gMykgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArDQogIGxhYnMoY2FwdGlvbiA9IGZ1ZW50ZSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEFxdcOtIGhheSBxdWUgY2FtYmlhciBlbCBkaXJlY3RvcmlvIGVuIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZWwgZ3LDoWZpY28uDQojZ2dzYXZlKCJUYXNhc2Jhc2ljYXMycmVnaW9uLnBuZyIsIHNjYWxlID0gMC43LCBkcGkgPSAzMDAsIHdpZHRoID0gMTAsIGhlaWdodCA9IDcsIGJnID0gIiNmZmZmZmYiKQ0KYGBgDQoNCjxicj4NCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX1Rhc2EgZGUgZGVzb2N1cGFjacOzbiBwb3IgZ3J1cG8gZGUgZWRhZCB5IHNleG9fXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX1BvYmxhY2nDs24gZGUgMTQgYcOxb3MgYSA2NCBhw7Fvcywgc2Vnw7puIHJlZ2nDs24uIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp0YWJsYTEuOV9ncmFmMyA8LSB0YWJsYTEuOSAlPiUgDQogIGZpbHRlcihHUlVQT19FREFEICAhPSAiTkEiKSAlPiUgDQogIHNlbGVjdChjKDE6MywgNikpDQoNCmdncGxvdCh0YWJsYTEuOV9ncmFmMywgYWVzKHggPSBHUlVQT19FREFELCBEZXNvY3VwYWNpw7NuLCBmaWxsID0gU2V4bywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gRGVzb2N1cGFjacOzbikpICsNCiAgZmFjZXRfd3JhcCggfiBSZWdpb24pICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLCB2anVzdCA9Miwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKw0KICBsYWJzKGNhcHRpb24gPSBmdWVudGUpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBBcXXDrSBoYXkgcXVlIGNhbWJpYXIgZWwgZGlyZWN0b3JpbyBlbiBxdWUgc2UgdmEgYSBndWFyZGFyIGVsIGdyw6FmaWNvLg0KI2dnc2F2ZSgiVGFzYXNiYXNpY2FzMnJlZ2lvbi5wbmciLCBzY2FsZSA9IDAuNywgZHBpID0gMzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBiZyA9ICIjZmZmZmZmIikNCmBgYA0KDQo8YnI+DQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19UYXNhIGRlIHN1Ym9jdXBhY2nDs24gcG9yIGdydXBvIGRlIGVkYWQgeSBzZXhvX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb2JsYWNpw7NuIGRlIDE0IGHDsW9zIGEgNjQgYcOxb3MsIHNlZ8O6biByZWdpw7NuLiBgciBkYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KdGFibGExLjlfZ3JhZjQgPC0gdGFibGExLjkgJT4lIA0KICBmaWx0ZXIoR1JVUE9fRURBRCAgIT0gIk5BIikgJT4lIA0KICBzZWxlY3QoYygxOjMsNykpDQoNCmdncGxvdCh0YWJsYTEuOV9ncmFmNCwgYWVzKHggPSBHUlVQT19FREFELCBTdWJvY3VwYWNpw7NuLCBmaWxsID0gU2V4bywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gU3Vib2N1cGFjacOzbikpICsNCiAgZmFjZXRfd3JhcCggfiBSZWdpb24pICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLCB2anVzdCA9Miwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKw0KICBsYWJzKGNhcHRpb24gPSBmdWVudGUpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBBcXXDrSBoYXkgcXVlIGNhbWJpYXIgZWwgZGlyZWN0b3JpbyBlbiBxdWUgc2UgdmEgYSBndWFyZGFyIGVsIGdyw6FmaWNvLg0KI2dnc2F2ZSgiVGFzYXNiYXNpY2FzMnJlZ2lvbi5wbmciLCBzY2FsZSA9IDAuNywgZHBpID0gMzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBiZyA9ICIjZmZmZmZmIikNCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpybSh0YWJsYTEuNiwgdGFibGExLjZ2LCB0YWJsYTEuNm0sIHRhYmxhMS43LCB0YWJsYTEuOCwgdGFibGExLjksIHRhYmxhMS45X2dyYWYxLCB0YWJsYTEuOV9ncmFmMiwgdGFibGExLjlfZ3JhZjMsIHRhYmxhMS45X2dyYWY0KQ0KYGBgDQoNCiMjIyMgRW1wbGVvIG5vIHJlZ2lzdHJhZG8NCjxicj4NCkxhIGZhbHRhIGRlIGRlc2N1ZW50byBqdWJpbGF0b3JpbyBzdWVsZSBzZXIgdW4gaW5kaWNhZG9yIHF1ZSBhcHJveGltYSBsYSBmYWx0YSBkZSByZWdpc3RybyBkZSBsYSByZWxhY2nDs24gbGFib3JhbCBhc2FsYXJpYWRhLiBMYSBpbmNpZGVuY2lhIGRlIGVzdGEgcHJvYmxlbcOhdGljYSBlcyBtYXlvciBlbnRyZSBsYXMgYXNhbGFyaWFkYXMgbXVqZXJlcy4gQSBzdSB2ZXosIGVzdGUgaW5kaWNhZG9yIHZhcsOtYSBkZSBhY3VlcmRvIGEgbGFzIGNhcmFjdGVyw61zdGljYXMgZGUgY2FkYSBlY29ub23DrWEgcmVnaW9uYWwuIA0KPGJyPjxicj4NCg0KIyMjIyMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIyBUb3RhbCBuYWNpb25hbA0KPGJyPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnRhYmxhMS4xMCA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoRVNUQURPPT0xLA0KICAgICAgICAgQ0FUX09DVVA9PTMpICU+JSANCiAgZ3JvdXBfYnkoU2V4bykgJT4lIA0KICBzdW1tYXJpc2UoIlNpbiBkZXNjdWVudG8ganViaWxhdG9yaW8iID0gcGVyY2VudChzdW0oUE9OREVSQVtQUDA3SD09Ml0pL3N1bShQT05ERVJBKSwgMSkpDQoNCmlubGluZV81IDwtIHRhYmxhMS4xMCAlPiUgDQogIGZpbHRlcihTZXhvID09ICJNdWplcmVzIikgJT4lIA0KICBwdWxsKGBTaW4gZGVzY3VlbnRvIGp1YmlsYXRvcmlvYCkNCg0KaW5saW5lXzYgPC0gdGFibGExLjEwICU+JSANCiAgZmlsdGVyKFNleG8gPT0gIlZhcm9uZXMiKSAlPiUgDQogIHB1bGwoYFNpbiBkZXNjdWVudG8ganViaWxhdG9yaW9gKQ0KYGBgDQoNCkVuIGNvbmNyZXRvLCBlbiBlbCBwYcOtcyBoYXkgdW4gX19gciBpbmxpbmVfNWBfXyBkZSBsYXMgYXNhbGFyaWFkYXMgcXVlIHBvciBzdSB0cmFiYWpvIHJlYWxpemFkbyBubyBwb3NlZSBkZXNjdWVudG9zIGp1YmlsYXRvcmlvcywgbWllbnRyYXMgcXVlIHBhcmEgbG9zIGFzYWxhcmlhZG9zIHZhcm9uZXMgZGljaGEgdGFzYSBlcyBkZWwgX19gciBpbmxpbmVfNmAuX18NCjxicj48YnI+DQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX0VtcGxlbyBzaW4gZGVzY3VlbnRvIGp1YmlsYXRvcmlvIHBvciBzZXhvX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19PY3VwYWRhcy9vcyBhc2FsYXJpYWRhcy9vcy4gYHIgYWdsb19kYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMS4xMCAlPiUgDQogIGthYmxlKGFsaWduID0gImMiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCANCiAgICAgICAgICAgICAgICAjZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JQ0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuIikgJT4lDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjVjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiN2NtIikgJT4lIA0KICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGExLjEwKQ0KYGBgDQoNCiMjIyMjIyBQb3IgcmVnacOzbg0KPGJyPg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KdGFibGExLjExIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihFU1RBRE89PTEsDQogICAgICAgICBDQVRfT0NVUD09MykgJT4lIA0KICBncm91cF9ieShTZXhvLCBSZWdpb24pICU+JSANCiAgc3VtbWFyaXNlKCJObyIgPSBwZXJjZW50KHN1bShQT05ERVJBW1BQMDdIPT0yXSkvc3VtKFBPTkRFUkEpLCAxKSkgJT4lIA0KICByZW5hbWUoUmVnacOzbiA9IFJlZ2lvbikgJT4lIA0KICBwaXZvdF93aWRlciguLCBuYW1lc19mcm9tID0gU2V4bywgdmFsdWVzX2Zyb20gPSBObykNCg0KYGBgDQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX1BvcmNlbnRhamUgZGUgYXNhbGFyaWFkYXMvb3Mgc2luIGRlc2N1ZW50byBqdWJpbGF0b3JpbyBwb3Igc2V4b19fPC9wPg0KPHAgc3R5bGU9ImNvbG9yOiNjOWM5YzkiPl9fUG9ibGFjacOzbiBkZSAxNCBhw7FvcyB5IG3DoXMuIFNlZ8O6biByZWdpw7NuLiBgciBkYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMS4xMV9ncmFmMSA8LSB0YWJsYTEuMTEgJT4lIA0KICBwaXZvdF9sb25nZXIoLiwgY29scz0yOjMsIG5hbWVzX3RvID0gIlNleG8iLCB2YWx1ZXNfdG8gPSAicHJvcG9yY2lvbiIpIA0KDQpnZ3Bsb3QodGFibGExLjExX2dyYWYxLCBhZXMoeCA9ICIgIiwgcHJvcG9yY2lvbiwgZmlsbCA9IFNleG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHBlcmNlbnQocHJvcG9yY2lvbiwgZGlnaXRzID0gMSkpKSArDQogIGZhY2V0X3dyYXAofiBSZWdpw7NuKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwgdmp1c3QgPTIsIHNpemUgPSA0KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yZXMpICsNCiAgbGFicyhjYXB0aW9uID0gZnVlbnRlKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGExLjExLCB0YWJsYTEuMTFfZ3JhZjEpDQpgYGANCg0KIyMjIyBDYXJnb3MgamVyw6FycXVpY29zDQo8YnI+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQp0YWJsYTEuMTIgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEpFUkFSUVVJQSAhPSAiMCIsDQogICAgICAgICBFU1RBRE8gPT0gMSkgJT4lDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgbXV0YXRlKEZyZWN1ZW5jaWEgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgZ3JvdXBfYnkoU2V4bywgSkVSQVJRVUlBKSAlPiUgDQogIHN1bW1hcmlzZShwcm9wb3JjaW9uID0gcm91bmQoc3VtKFBPTkRFUkEpL3VuaXF1ZShGcmVjdWVuY2lhKSwgMyksDQogICAgICAgICAgICBjYW50aWRhZCA9IHN1bShQT05ERVJBKSkNCg0KaW5saW5lXzcgPC0gdGFibGExLjEyICU+JSANCiAgZmlsdGVyKEpFUkFSUVVJQSAlaW4lIGMoIkRpcmVjY2nDs24gbyBKZWZlcyIpICYNCiAgICAgICAgICAgU2V4byA9PSAiVmFyb25lcyIpICU+JSANCiAgcHVsbChwcm9wb3JjaW9uKSAlPiUgDQogIHBlcmNlbnQoLiwgMSkNCg0KaW5saW5lXzggPC0gdGFibGExLjEyICU+JSANCiAgZmlsdGVyKEpFUkFSUVVJQSAlaW4lIGMoIkRpcmVjY2nDs24gbyBKZWZlcyIpICYgDQogICAgICAgICAgIFNleG8gPT0gIk11amVyZXMiKSAlPiUgDQogIHB1bGwocHJvcG9yY2lvbikgJT4lIA0KICBwZXJjZW50KC4sIDEpDQpgYGANCg0KQWRlbcOhcyBkZSB0ZW5lciB1bmEgcGFydGljaXBhY2nDs24gbcOhcyByZXN0cmluZ2lkYSBlbiBlbCBtZXJjYWRvIGRlIHRyYWJham8sIGxhcyBvY3VwYWRhcyBlbmN1ZW50cmFuIG3DoXMgb2JzdMOhY3Vsb3MgcGFyYSBhY2NlZGVyIGEgY2FyZ29zIGplcsOhcnF1aWNvczogIG1pZW50cmFzIHF1ZSB1biBfX2ByIGlubGluZV83YF9fIGRlIGxvcyBvY3VwYWRvcyB2YXJvbmVzIHRpZW5lbiBjYXJnb3MgZGUgZGlyZWNjacOzbiBvIHNvbiBqZWZlcywgc29sbyB1biBfX2ByIGlubGluZV84YF9fIGRlIGxhcyBvY3VwYWRhcyBlamVyY2VuIHB1ZXN0b3MgZGUgZXNhcyBjYXJhY3RlcsOtc3RpY2FzLg0KPGJyPjxicj4NCkVzdGEgcHJvYmxlbcOhdGljYSBlcyBjb25vY2lkYSBjb21vIF9fdGVjaG8gZGUgY3Jpc3RhbF9fIG8gX19zZWdyZWdhY2nDs24gdmVydGljYWxfXyBkZWwgbWVyY2FkbyBkZSB0cmFiYWpvLCB5IGhhY2UgcmVmZXJlbmNpYSBhIGxhIGRpZmljdWx0YWQgcXVlIHBvc2VlbiBsYXMgbXVqZXJlcyBwYXJhIGFzY2VuZGVyIHByb2Zlc2lvbmFsbWVudGUgZW4gZWwgbWVyY2FkbyBsYWJvcmFsLiBTaSBzZSB0aWVuZSBlbiBjdWVudGEgcXVlIGVsIG1lcmNhZG8gZGUgdHJhYmFqbyBlbiBnZW5lcmFsIHNlIGVuY3VlbnRyYSBtYXNjdWxpbml6YWRvLCBlc3RvcyBwb3JjZW50YWplcyBpbmRpY2FuIHF1ZSBoYXkgbXVjaGFzIG3DoXMgcHJvYmFiaWxpZGFkZXMgZGUgdGVuZXIgdW4gamVmZSBvIGRpcmVjdG9yIHZhcsOzbiBlbiBsb3MgZXNwYWNpb3MgZGUgdHJhYmFqby4gUGFyYSB1bmEgZGVzY3JpcGNpw7NuIG3DoXMgZXh0ZW5zYSBkZSBlc3RvcyB0w6lybWlub3Mgc2UgcHVlZGUgY29uc3VsdGFyIGVsIEdsb3NhcmlvIGRlIGVzdGUgaW5mb3JtZS4gDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19NdWplcmVzIHkgVmFyb25lcyBlbiBjYXJnb3MgZGUgZGlyZWNjacOzbiB5IGplZmF0dXJhX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb3JjZW50YWplIGRlIGNhcmdvcyBqZXLDoXJxdWljb3MgZW50cmUgb2N1cGFkYXMvb3MuIGByIGFnbG9fZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QodGFibGExLjEyICU+JSBmaWx0ZXIoSkVSQVJRVUlBID09ICJEaXJlY2Npw7NuIG8gSmVmZXMiKSwgDQogICAgICAgYWVzKHggPSAnJywgcHJvcG9yY2lvbiwgZmlsbCA9IFNleG8sIGdyb3VwID0gU2V4bywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gcGVyY2VudChwcm9wb3JjaW9uLCBkaWdpdHMgPSAxKSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLCB2anVzdCA9Miwgc2l6ZSA9IDYpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKw0KICBsYWJzKGNhcHRpb24gPSBmdWVudGUpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQogICAgICAgDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgQXF1w60gaGF5IHF1ZSBjYW1iaWFyIGVsIGRpcmVjdG9yaW8gZW4gcXVlIHNlIHZhIGEgZ3VhcmRhciBlbCBncsOhZmljby4NCiNnZ3NhdmUoIkZpZ3VyYTUucG5nIiwgc2NhbGUgPSAwLjcsIGRwaSA9IDMwMCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNywgYmcgPSAiI2ZmZmZmZiIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnJtKHRhYmxhMS4xMikNCmBgYA0KDQojIyMjIFJhbWFzIGRlIGxhIG9jdXBhY2nDs24NCjxicj4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMS4xMyA8LSBvcmdhbml6ZV9jYWVzKGJhc2VfaW5kaXZpZHVhbCkgJT4lIA0KICBtdXRhdGUoUmFtYSA9IGNhZXNfZXBoX2xhYmVsKSAlPiUgDQogIGZpbHRlcihFU1RBRE8gPT0gMSwNCiAgICAgICAgIFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgUFAzRV9UT1QgIT0gOTk5LA0KICAgICAgICAgUDIxID4gMCwNCiAgICAgICAgIFBPTkRJSU8gPiAwKSAlPiUgICMgSW5ncmVzb3MgcG9zaXRpdm9zDQogIGdyb3VwX2J5KFJhbWEpICU+JSANCiAgbXV0YXRlKFBQM0VfVE9UID0gYXMubnVtZXJpYyhnc3ViKCIsIiwgI2NhbWJpbyAiLiIgcG9yICJjb21hcyIsIiBlbiBsb3MgZGVjaW1hbGVzIHBhcmEgcG9kZXIgb3BlcmFyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDNFX1RPVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkID0gVFJVRSkpKSAlPiUgDQogIHN1bW1hcmlzZSh0YXNhX2ZlbWluaXphY2lvbiA9IHBlcmNlbnQoc3VtKFBPTkRFUkFbU2V4byA9PSAiTXVqZXJlcyJdKS9zdW0oUE9OREVSQSksIDEpLA0KICAgICAgICAgICAgaW5ncmVzb19wcm9tZWRpbyA9IHdlaWdodGVkLm1lYW4oUDIxLCBQT05ESUlPL3N1bShQT05ESUlPKSksDQogICAgICAgICAgICBpbmdyZXNvX2hvciA9IHJvdW5kKHdlaWdodGVkLm1lYW4oUDIxLyhQUDNFX1RPVCAqIDMwIC8gNyksIFBPTkRJSU8pLCAyKSkgJT4lIA0KICBhcnJhbmdlKC10YXNhX2ZlbWluaXphY2lvbikgJT4lIA0KICBmaWx0ZXIoUmFtYSAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIsICJFbnNlbmFuemEiLCAiU2VydmljaW9zIHNvY2lhbGVzIHkgZGUgc2FsdWQiLCANCiAgIkluZHVzdHJpYSBtYW51ZmFjdHVyZXJhIiwgIkFjdGl2aWRhZGVzIHByaW1hcmlhcyIsICJUcmFuc3BvcnRlLCBhbG1hY2VuYW1pZW50byB5IGNvbXVuaWNhY2lvbmVzIiwNCiAgIkNvbnN0cnVjY2lvbiIpKSAlPiUgDQogIHRyYW5zbXV0ZSgiUmFtYSBkZSBsYSBvY3VwYWNpw7NuIiA9IFJhbWEsDQogICAgICAgICAgICAiVGFzYSBkZSBmZW1pbml6YWNpw7NuIiA9IHRhc2FfZmVtaW5pemFjaW9uLA0KICAgICAgICAgICAgIkluZ3Jlc28gbWVuc3VhbCBwcm9tZWRpbyIgPSBmb3JtYXRvX3Blc29zKHJvdW5kKGluZ3Jlc29fcHJvbWVkaW8sIC0yKSwgMCksDQogICAgICAgICAgICAiSW5ncmVzbyBob3JhcmlvIiA9IGZvcm1hdG9fcGVzb3Mocm91bmQoaW5ncmVzb19ob3IpLCAwKSkNCmBgYA0KDQpMYSBzaWd1aWVudGUgdGFibGEgcHJlc2VudGEgbG9zIHBvcmNlbnRhamVzIGRlIG9jdXBhZGFzIG11amVyZXMgc29icmUgZWwgdG90YWwgZGUgb2N1cGFkb3MgeSBvY3VwYWRhcyBwYXJhIGNhZGEgcmFtYSBkZSBvY3VwYWNpw7NuLiBMYSB0YXNhIGRlIGZlbWluaXphY2nDs24gaW5kaWNhIGVsIHBvcmNlbnRhamUgZGUgbXVqZXJlcyBxdWUgaGF5IGVuIGNhZGEgdW5hIGRlIGVsbGFzIHksIGNvbW8gcHVlZGUgb2JzZXJ2YXJzZSwgbGFzIG11amVyZXMgc2UgZW5jdWVudHJhbiBzb2JyZXJyZXByZXNlbnRhZGFzIGVuIGFxdWVsbG9zIHNlY3RvcmVzIHZpbmN1bGFkb3MgYWwgY3VpZGFkbyB5IGxhcyB0YXJlYXMgZGUgcmVwcm9kdWNjacOzbiwgY29tbyBzb24gZWwgc2VydmljaW8gZG9tw6lzdGljbywgbGEgZW5zZcOxYW56YSB5IGxvcyBzZXJ2aWNpb3Mgc29jaWFsZXMgeSBkZSBzYWx1ZC4gUG9yIHN1IHBhcnRlLCBzZWN0b3JlcyBjb21vIGxhIGNvbnN0cnVjY2nDs24sIHRyYW5zcG9ydGUgeSBjb211bmljYWNpb25lcywgbGFzIGFjdGl2aWRhZGVzIHByaW1hcmlhcyBlIGluY2x1c28gbGEgaW5kdXN0cmlhIG1hbnVmYWN0dXJlcmEgc2UgZW5jdWVudHJhbiBtYXNjdWxpbml6YWRhcy4NCjxicj48YnI+DQpFc3RlIGZlbsOzbWVubyBzZSBjb25vY2UgY29tbyBfX3BhcmVkZXMgZGUgY3Jpc3RhbF9fIG8gX19zZWdyZWdhY2nDs24gaG9yaXpvbnRhbF9fLCB5IGhhY2UgcmVmZXJlbmNpYSBhIGxvcyBtdXJvcyBpbnZpc2libGVzIHF1ZSBzZWdtZW50YW4gZWwgbWVyY2FkbyBkZSB0cmFiYWpvIGRlIGFjdWVyZG8gYSBsb3MgZXN0ZXJlb3RpcG9zIGRlIGfDqW5lcm8gYcO6biB2aWdlbnRlcy4gUGFyYSB1bmEgZGVzY3JpcGNpw7NuIG3DoXMgZXh0ZW5zYSBkZSBlc3RvcyB0w6lybWlub3Mgc2UgcHVlZGUgY29uc3VsdGFyIGVsIEdsb3NhcmlvIGRlIGVzdGUgaW5mb3JtZS4gDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19JbmRpY2Fkb3JlcyBwb3IgcmFtYXMgZGUgbGEgb2N1cGFjacOzbiAoc2VsZWNjaW9uYWRhcylfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX09jdXBhZGFzL29zLiBUYXNhIGRlIGZlbWluaXphY2nDs24sIGluZ3Jlc28gbWVuc3VhbCBwcm9tZWRpbywgaW5ncmVzbyBob3JhcmlvLiBgciBhZ2xvX2RhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGExLjEzICU+JSANCiAga2FibGUoYWxpZ24gPSAnbGNjYycpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgI2Z1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUNCiAgZm9vdG5vdGUoZ2VuZXJhbCA9IGZ1ZW50ZSwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICJcbiIpICU+JSANCiAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiNmNtIikgJT4lIA0KICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGExLjEzKQ0KYGBgDQoNCi0tLQ0KDQo8YnI+DQpTaSBvYnNlcnZhbW9zIGxhIGRpc3RyaWJ1Y2nDs24gZGUgaW5ncmVzb3MgZGUgbGFzIHkgbG9zIG9jdXBhZG9zIHNlZ8O6biByYW1hIGRlIG9jdXBhY2nDs24sIHZlbW9zIHF1ZSBTZXJ2aWNpbyBEb23DqXN0aWNvIG5vIHPDs2xvIGVzIGxhIHJhbWEgbcOhcyBmZW1pbml6YWRhIHNpbm8gcXVlIGFkZW3DoXMgY29uY2VudHJhIGxvcyBtZW5vcmVzIGluZ3Jlc29zLg0KPGJyPjxicj4NCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGExLjE0IDwtIG9yZ2FuaXplX2NhZXMoYmFzZV9pbmRpdmlkdWFsKSAlPiUgDQogIG11dGF0ZShSYW1hID0gY2Flc19lcGhfbGFiZWwpICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxLA0KICAgICAgICAgUFAzRV9UT1QgPiAwLCAjIEhvcmFzIHRyYWJhamFkYXMgcG9zaXRpdmFzDQogICAgICAgICBQUDNFX1RPVCAhPSA5OTksDQogICAgICAgICBQMjEgPiAwLA0KICAgICAgICAgUE9ORElJTyA+IDApICU+JSAgIyBJbmdyZXNvcyBwb3NpdGl2b3MNCiAgZmlsdGVyKFJhbWEgJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iLCAiRW5zZW5hbnphIiwgIlNlcnZpY2lvcyBzb2NpYWxlcyB5IGRlIHNhbHVkIiwgDQogICJJbmR1c3RyaWEgbWFudWZhY3R1cmVyYSIsICJBY3RpdmlkYWRlcyBwcmltYXJpYXMiLCAiVHJhbnNwb3J0ZSwgYWxtYWNlbmFtaWVudG8geSBjb211bmljYWNpb25lcyIsDQogICJDb25zdHJ1Y2Npb24iKSkNCmBgYA0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19EaXN0cmlidWNpw7NuIGRlbCBpbmdyZXNvIHNlZ8O6biByYW1hcyBkZSBvY3VwYWNpw7NuIChzZWxlY2Npb25hZGFzKV9fPC9wPg0KPHAgc3R5bGU9ImNvbG9yOiNjOWM5YzkiPl9fT2N1cGFkYXMvb3MuIGByIGFnbG9fZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsICByZXN1bHRzPSdoaWRlJ30NCiMgVGlyYSB3YXJuaW5ncyBwb3JxdWUgYWp1c3RhbW9zIGVsIGxpbWl0ZSBzdXBlcmlvciBkZWwgZWplIHggYSBtYW5vIHkgaGF5IG9ic2VydmFjaW9uZXMgY29uIFAyMSBwb3IgZW5jaW1hIGRlICQxNTAuMDAwDQpnZ3Bsb3QodGFibGExLjE0LCBhZXMoeCA9IFAyMSwgeSA9IFJhbWEsIHdlaWdodHMgPSBQT05ESUlPLCBncm91cCA9IFJhbWEsIGFscGhhID0gUmFtYSAhPSAiU2VydmljaW8gZG9tZXN0aWNvIikpICsNCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhzY2FsZSA9IDIsIGZpbGwgPSBjb2xvcmVzYlsyXSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNDAwMDAwKSkgKw0KICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygxLCAwLjQpLCBndWlkZSA9IEZBTFNFKSArDQogICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3Jlc2JbMl0pICsNCiAgbGFicyhjYXB0aW9uID0gZnVlbnRlLA0KICAgIHggPSAiSW5ncmVzbyBkZSBsYSBPY3VwYWNpb24gUHJpbmNpcGFsIChJT1ApIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBsb3Quc3VidGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJtKHRhYmxhMS4xNCkNCmBgYA0KDQojIyBJbmdyZXNvcw0KDQotLS0NCg0KIyMjIEluZ3Jlc29zIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KPGJyPjxicj4NCkVuIGVzdGEgc2VjY2nDs24gc2UgY29sb2NhIGVsIGZvY28gZW4gbGFzIGRpZmVyZW5jaWFzIGRlIG1vbnRvcyBkZSBpbmdyZXNvcyBxdWUgcGVyY2liZW4gbG9zIHZhcm9uZXMgeSBsYXMgbXVqZXJlcy4gRXN0b3MgaW5ncmVzb3MgcHVlZGVuIHByb3ZlbmlyIGRlIGRpdmVyc2FzIGZ1ZW50ZXMgeSBhbCBtaXNtbyB0aWVtcG8gcHVlZGVuIGRlc2FncmVnYXJzZSBzZWfDum4gY2FyYWN0ZXLDrXN0aWNhcyBhZGljaW9uYWxlcyBkZSBsYXMgcGVyc29uYXMgbyBsb3MgcHVlc3RvcyBxdWUgZGVzZW1wZcOxYW4uIEEgc3UgdmV6LCBwdWVkZW4gZGlzdGluZ3VpcnNlIGxvcyBpbmdyZXNvcyBtZW5zdWFsZXMgeSBsb3MgaW5ncmVzb3MgcG9yIGhvcmEgdHJhYmFqYWRhLg0KPGJyPjxicj4NClBhcmEgZGltZW5zaW9uYXIgZXN0YXMgZGlmZXJlbmNpYXMgaGFjZW1vcyB1c28gZGVsIGNvbmNlcHRvIGRlICJicmVjaGEiLCBxdWUgZW4gZXN0ZSBjYXNvIHNlIGNhbGN1bGEgY29tbyBsYSBkaWZlcmVuY2lhIGVudHJlIGxvcyBpbmdyZXNvcyBwcm9tZWRpb3MgZGUgbG9zIHZhcm9uZXMgeSBsYXMgbXVqZXJlcywgZXhwcmVzYWRhIGVuIHTDqXJtaW5vcyBkZWwgaW5ncmVzbyBtw6FzIGFsdG8uIEVzIGRlY2lyLCBxdWUgcHVlZGUgbGVlcnNlIGNvbW8gXyJsYXMgbXVqZXJlcyBwZXJjaWJlbiBpbmdyZXNvcyBxdWUsIGVuIHByb21lZGlvLCBzb24gdW4gLi4uJSBtZW5vcmVzIHF1ZSBsb3MgZGUgbG9zIHZhcm9uZXMiLl8NCg0KLS0tDQoNCiMjIyMgSW5ncmVzb3MgbWVuc3VhbGVzDQoNCkVuIHRvZGFzIGxhcyByZWdpb25lcyBkZWwgcGHDrXMsIGxvcyBpbmdyZXNvcyBwcm9tZWRpb3MgZGUgbGFzIG11amVyZXMgc29uIG1lbm9yZXMgcXVlIGxvcyBkZSBsb3MgdmFyb25lcy4NCjxicj48YnI+DQoNCiMjIyMjIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQojIyMjIyMgVG90YWwgTmFjaW9uYWwNCjxicj48YnI+DQoNCiMjIyMjIyMgX19CcmVjaGFzIGRlIGluZ3Jlc29zIG1lbnN1YWxlc19fDQo8YnI+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIEluZ3Jlc28gVG90YWwgSW5kaXZpZHVhbA0KIyBhcy5udW1lcmljIHBvcnF1ZSBzYWxpYSBjb21vIE5BIHBvciBzZXIgaW50ZWdlciBkZW1hc2lhZG8gZ3JhbmRlLCBtYXlvciBkZSBsbyBxdWUgc2UgcHVlZGUgcmVwcmVzZW50YXIgZW4gUg0KdGFibGEyLjEgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKFA0N1QgPiAwKSAlPiUgDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgc3VtbWFyaXNlKCBNZWRpYS5JVEkgPSByb3VuZCh3ZWlnaHRlZC5tZWFuKGFzLm51bWVyaWMoUDQ3VCkgLCBhcy5udW1lcmljKFBPTkRJSSkpKSkgJT4lIA0KICBzcHJlYWQoLiwgU2V4bywgTWVkaWEuSVRJKSAlPiUgDQogIG11dGF0ZShQb2JsYWNpw7NuID0gIlBlcmNlcHRvcmVzIGRlIGluZ3Jlc29zIiwNCiAgICAgICAgIEluZ3Jlc28gPSAiSW5ncmVzbyBUb3RhbCBJbmRpdmlkdWFsIikNCg0KI1ZFQU1PUyBDT01PIFNVTUFNT1MgRVNUTyBBTCBURVhUTyBERUwgSU5GT1JNRSEhIQ0KdGFibGEyLjEuYSA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoUDQ3VCA+IDApICU+JSANCiAgZ3JvdXBfYnkoU2V4bykgJT4lDQogIHN1bW1hcmlzZShNZWRpYW5hLklUSSA9IGZvcm1hdG9fcGVzb3Mocm91bmQoc3BhdHN0YXQuZ2VvbTo6d2VpZ2h0ZWQubWVkaWFuKGFzLm51bWVyaWMoUDQ3VCksIGFzLm51bWVyaWMoUE9ORElJKSkpKSkgJT4lDQogIHNwcmVhZCguLCBTZXhvLCBNZWRpYW5hLklUSSkgJT4lDQogIG11dGF0ZShQb2JsYWNpw7NuID0gIlBlcmNlcHRvcmVzIGRlIGluZ3Jlc29zIiwNCiAgICAgICAgIEluZ3Jlc28gPSAiNTAlIGNvYnJhIG1lbm9zIGRlIikNCg0KIyBJbmdyZXNvIGRlIGxhIE9jdXBhY2nDs24gUHJpbmNpcGFsDQp0YWJsYTIuMiA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoRVNUQURPID09IDEpICU+JSANCiAgZ3JvdXBfYnkoU2V4bykgJT4lIA0KICBzdW1tYXJpc2UoTWVkaWEuSU9QID0gcm91bmQod2VpZ2h0ZWQubWVhbihhcy5udW1lcmljKFAyMSksIGFzLm51bWVyaWMoUE9ORElJTykpKSkgJT4lIA0KICBzcHJlYWQoLiwgU2V4bywgTWVkaWEuSU9QKSAlPiUgDQogIG11dGF0ZShQb2JsYWNpw7NuID0gIk9jdXBhZGFzL29zIiwNCiAgICAgICAgIEluZ3Jlc28gPSAiSW5ncmVzbyBkZSBsYSBPY3VwYWNpw7NuIFByaW5jaXBhbCIpDQoNCiMgQXNhbC4gc2luIGRlc2N1ZW50byBqdWJpbGF0b3Jpby4gSW5ncmVzbyBkZSBsYSBPY3VwYWNpw7NuIFByaW5jaXBhbA0KI2ZpbHRybyBpbmdyZXNvcyBtYXlvcmVzIGEgY2Vybw0KdGFibGEyLjMgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxICYgQ0FUX09DVVAgPT0gMyAmIFBQMDdIID09IDIgJiBQMjE+MCkgJT4lDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgc3VtbWFyaXNlKE1lZGlhLklPUCA9IHJvdW5kKHdlaWdodGVkLm1lYW4oYXMubnVtZXJpYyhQMjEpLCBhcy5udW1lcmljKFBPTkRJSU8pKSkpICU+JSANCiAgc3ByZWFkKC4sIFNleG8sIE1lZGlhLklPUCkgJT4lIA0KICBtdXRhdGUoUG9ibGFjacOzbiA9ICJBc2FsYXJpYWRhcy9vcyBzaW4gZGVzYy4ganViaWwuIiwNCiAgICAgICAgIEluZ3Jlc28gPSAiSW5ncmVzbyBkZSBsYSBPY3VwYWNpw7NuIFByaW5jaXBhbCIpDQoNCiMgSnViaWxhY2lvbmVzDQp0YWJsYTIuNCA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoVjJfTSA+IDApICU+JSANCiAgZ3JvdXBfYnkoU2V4bykgJT4lIA0KICBzdW1tYXJpc2UoTWVkaWEuSlVCID0gcm91bmQod2VpZ2h0ZWQubWVhbihhcy5udW1lcmljKFYyX00pLCBhcy5udW1lcmljKFBPTkRJSSkpKSkgJT4lIA0KICBzcHJlYWQoLiwgU2V4bywgTWVkaWEuSlVCKSAlPiUgDQogIG11dGF0ZShQb2JsYWNpw7NuID0gIlBlcmNlcHRvcmVzIGRlIGp1YmlsYWNpw7NuIiwNCiAgICAgICAgIEluZ3Jlc28gPSAiSnViaWxhY2nDs24iKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQp0YWJsYTIuNSA8LSBiaW5kX3Jvd3ModGFibGEyLjEsIHRhYmxhMi4yLCB0YWJsYTIuMywgdGFibGEyLjQpICU+JSANCiAgbXV0YXRlKEJyZWNoYSA9IHBlcmNlbnQoKChWYXJvbmVzLU11amVyZXMpL1Zhcm9uZXMpLCAxKSwNCiAgICAgICAgIE11amVyZXMgPSBmb3JtYXRvX3Blc29zKHJvdW5kKE11amVyZXMsIC0yKSwgMCksDQogICAgICAgICBWYXJvbmVzID0gZm9ybWF0b19wZXNvcyhyb3VuZChWYXJvbmVzLCAtMiksIDApKSAlPiUgDQogIHNlbGVjdChQb2JsYWNpw7NuLCBJbmdyZXNvLCBNdWplcmVzLCBWYXJvbmVzLCBCcmVjaGEpDQoNCmlubGluZV85IDwtIHRhYmxhMi41ICU+JSANCiAgZmlsdGVyKFBvYmxhY2nDs24gPT0gIlBlcmNlcHRvcmVzIGRlIGluZ3Jlc29zIikgJT4lIA0KICBwdWxsKEJyZWNoYSkNCg0KaW5saW5lXzEwIDwtIHRhYmxhMi41ICU+JSANCiAgZmlsdGVyKFBvYmxhY2nDs24gPT0gIk9jdXBhZGFzL29zIikgJT4lIA0KICBwdWxsKEJyZWNoYSkNCg0KaW5saW5lXzExIDwtIHRhYmxhMi41ICU+JSANCiAgZmlsdGVyKFBvYmxhY2nDs24gPT0gIk9jdXBhZGFzL29zIikgJT4lIA0KICBwdWxsKE11amVyZXMpDQoNCmlubGluZV8xMiA8LSB0YWJsYTIuNSAlPiUgDQogIGZpbHRlcihQb2JsYWNpw7NuID09ICJPY3VwYWRhcy9vcyIpICU+JSANCiAgcHVsbChWYXJvbmVzKQ0KDQppbmxpbmVfMTMgPC0gdGFibGEyLjUgJT4lIA0KICBmaWx0ZXIoUG9ibGFjacOzbiA9PSAiQXNhbGFyaWFkYXMvb3Mgc2luIGRlc2MuIGp1YmlsLiIpICU+JSANCiAgcHVsbChCcmVjaGEpDQpgYGANCg0KQ29tbyBzZSB2ZSBlbiBlbCBzaWd1aWVudGUgY3VhZHJvLCBwYXJhIGVsIGNhc28gZGUgdG9kYXMgbGFzIHBlcnNvbmFzIHBlcmNlcHRvcmFzIGRlIGluZ3Jlc29zLCBsYSBicmVjaGEgZW50cmUgbXVqZXJlcyB5IHZhcm9uZXMgcmVzcGVjdG8gYWwgaW5ncmVzbyB0b3RhbCBpbmRpdmlkdWFsIGVzIGRlIF9fYHIgaW5saW5lXzlgX18uIEVzIGRlY2lyLCBjb250ZW1wbGFuZG8gdG9kb3MgbG9zIGluZ3Jlc29zIHF1ZSBzZSBwZXJjaWJlbiwgc2VhbiBkZSBvcmlnZW4gbGFib3JhbCBvIG5vIGxhYm9yYWwgKGNvbW8ganViaWxhY2lvbmVzIHkgcGVuc2lvbmVzLCBjdW90YXMgYWxpbWVudGFyaWFzLCBzdWJzaWRpb3MsIGV0Yy4pLCBsYXMgbXVqZXJlcyBwZXJjaWJlbiBpbmdyZXNvcyBxdWUsIGVuIHByb21lZGlvLCBzb24gdW4gYHIgaW5saW5lXzlgIG1lbm9yZXMgcXVlIGxvcyBkZSBsb3MgdmFyb25lcy4NCjxicj48YnI+DQpTaW11bHTDoW5lYW1lbnRlLCBlbiBlbCBtZXJjYWRvIGRlIHRyYWJham8sIGxhcyBtdWplcmVzIGdhbmFuIGVuIHByb21lZGlvIHVuIF9fYHIgaW5saW5lXzEwYF9fIG1lbm9zIHF1ZSBsb3MgdmFyb25lcyAoX2ByIGlubGluZV8xMWBfIHZzLiBfYHIgaW5saW5lXzEyYF8pLiBFc3RvcyBkYXRvcyBjb3JyZXNwb25kZW4gYSBsYSB0b3RhbGlkYWQgZGUgb2N1cGFkYXMvb3MsIGN1YWxxdWllcmEgc2VhIHN1IGNhdGVnb3LDrWEgb2N1cGFjaW9uYWwsIGNhbGlmaWNhY2nDs24gbyBqZXJhcnF1w61hLCB5IG9ic2VydmFuZG8gZW4gZXN0ZSBjYXNvIGxvcyBpbmdyZXNvcyBwcm92ZW5pZW50ZXMgZGUgc3Ugb2N1cGFjacOzbiBwcmluY2lwYWwuDQo8YnI+PGJyPg0KU2kgdG9tYW1vcyBlbiBjdWVudGEgw7puaWNhbWVudGUgYSBhcXVlbGxhcyBwZXJzb25hcyBxdWUgbm8gcG9zZWVuIGRlc2N1ZW50b3MganViaWxhdG9yaW9zLCBzZSBvYnNlcnZhIGPDs21vIGxhcyBtdWplcmVzIGdhbmFuIGVuIHByb21lZGlvIHVuIF9fYHIgaW5saW5lXzEzYF9fIG1lbm9zIHF1ZSBzdXMgcGFyZXMuIEVzIGRlY2lyIHF1ZSBsYSBicmVjaGEgZGUgaW5ncmVzb3MgZW50cmUgbGFzIHkgbG9zIHRyYWJhamFkb3JlcyBzZSBhbXBsw61hIGN1YW5kbyB2ZW1vcyBhIGFxdWVsbGFzL29zIGFzYWxhcmlhZGFzL29zIHF1ZSB0aWVuZW4gcGVvcmVzIGNvbmRpY2lvbmVzIGRlIHRyYWJham8uDQo8YnI+PGJyPg0KRmluYWxtZW50ZSwgcHVlZGUgb2JzZXJ2YXJzZSBxdWUgdGFtYmnDqW4gZXhpc3RlIHVuYSBicmVjaGEsIGF1bnF1ZSBtdWNobyBtZW5vciwgZW50cmUgbGFzIGp1YmlsYWNpb25lcyBxdWUgcGVyY2liZW4gbGFzIG11amVyZXMgeSBsb3MgdmFyb25lcy4NCjxicj48YnI+DQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX0JyZWNoYXMgZGUgaW5ncmVzb3MgbWVuc3VhbGVzX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb3IgcG9ibGFjaW9uZXMgeSB0aXBvcyBkZSBpbmdyZXNvcy4gYHIgYWdsb19kYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMi41ICU+JSANCiAgc2VsZWN0KFBvYmxhY2nDs24sIEluZ3Jlc28sIE11amVyZXMsIFZhcm9uZXMsIEJyZWNoYSkgJT4lIA0KICBrYWJsZShhbGlnbiA9ICdsbGNjYycpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgI2Z1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJcbiIgPSAyLCAiTWVkaWEgZGVsIGluZ3Jlc28iID0gMiwgIlxuIiA9IDEpLCANCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjZjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoNSwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjJjbSIpICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQoNCiMgRW4gZXN0ZSBjdWFkcm8gbGEgYnJlY2hhIG1hbnRpZW5lIGNvbXBhcmFiaWxpZGFkIGNvbiB0cmltZXN0cmVzIGFudGVyaW9yZXMgcG9ycXVlIHNlIGNhbGN1bGEgc29icmUgbG9zIHZhbG9yZXMgc2luIHJlZG9uZGVhcg0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpybSh0YWJsYTIuMSwgdGFibGEyLjIsIHRhYmxhMi4zLCB0YWJsYTIuNCwgdGFibGEyLjUpDQpgYGANCg0KLS0tDQoNCiMjIyMjIyMgX19CcmVjaGEgZGUgaW5ncmVzb3MgbWVuc3VhbGVzIHBvciBjYWxpZmljYWNpw7NuIGRlbCBwdWVzdG8gZGUgdHJhYmFqb19fDQo8YnI+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIE9jdXBhZGVzDQp0YWJsYTIuNiA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoQ0FMSUZJQ0FDSU9OICE9ICIwIiwNCiAgICAgICAgIEVTVEFETyA9PSAxLA0KICAgICAgICAgUDIxID49IDAsDQogICAgICAgICBQT05ESUlPID49IDApICU+JSAgIyBJbmdyZXNvcyBwb3NpdGl2b3MpICU+JSANCiAgZ3JvdXBfYnkoU2V4bywgQ0FMSUZJQ0FDSU9OKSAlPiUgDQogIHN1bW1hcmlzZShJT1BfbWVuc3VhbCAgPSByb3VuZCh3ZWlnaHRlZC5tZWFuKFAyMSwgUE9ORElJTy9zdW0oUE9ORElJTykpLCAyKSkgDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmlubGluZV8xNCA8LSB0YWJsYTIuNiAlPiUgDQogIGZpbHRlcihTZXhvID09ICJWYXJvbmVzIiwgDQogICAgICAgICBDQUxJRklDQUNJT04gPT0gIlByb2Zlc2lvbmFsZXMiKSAlPiUgDQogIHB1bGwoSU9QX21lbnN1YWwpICU+JSANCiAgcm91bmQoLiwgLTIpICU+JSANCiAgZm9ybWF0b19wZXNvcyguLCAwKQ0KDQppbmxpbmVfMTUgPC0gdGFibGEyLjYgJT4lIA0KICBmaWx0ZXIoU2V4byA9PSAiTXVqZXJlcyIsDQogICAgICAgICBDQUxJRklDQUNJT04gPT0gIlByb2Zlc2lvbmFsZXMiKSAlPiUgDQogIHB1bGwoSU9QX21lbnN1YWwpICU+JSANCiAgcm91bmQoLiwgLTIpICU+JSANCiAgZm9ybWF0b19wZXNvcyguLCAwKQ0KDQppbmxpbmVfMTYgPC0gdGFibGEyLjYgJT4lIA0KICBmaWx0ZXIoQ0FMSUZJQ0FDSU9OID09ICJQcm9mZXNpb25hbGVzIikgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gU2V4bywgdmFsdWVzX2Zyb20gPSBJT1BfbWVuc3VhbCkgJT4lIA0KICBtdXRhdGUoYnJlY2hhID0gKFZhcm9uZXMtTXVqZXJlcykvVmFyb25lcykgJT4lIA0KICBwdWxsKGJyZWNoYSkgJT4lIA0KICBwZXJjZW50KC4sIDEpDQogIA0KaW5saW5lXzE3IDwtIHRhYmxhMi42ICU+JSANCiAgZmlsdGVyKFNleG8gPT0gIlZhcm9uZXMiLA0KICAgICAgICAgQ0FMSUZJQ0FDSU9OID09ICJObyBDYWxpZmljYWRvcyIpICU+JSANCiAgcHVsbChJT1BfbWVuc3VhbCkgJT4lIA0KICByb3VuZCguLCAtMikgJT4lIA0KICBmb3JtYXRvX3Blc29zKC4sIDApDQoNCmlubGluZV8xOCA8LSB0YWJsYTIuNiAlPiUgDQogIGZpbHRlcihTZXhvID09ICJNdWplcmVzIiwNCiAgICAgICAgIENBTElGSUNBQ0lPTiA9PSAiTm8gQ2FsaWZpY2Fkb3MiKSAlPiUNCiAgcHVsbChJT1BfbWVuc3VhbCkgJT4lIA0KICByb3VuZCguLCAtMikgJT4lIA0KICBmb3JtYXRvX3Blc29zKC4sIDApDQoNCmlubGluZV8xOSA8LSB0YWJsYTIuNiAlPiUgDQogIGZpbHRlcihDQUxJRklDQUNJT04gPT0gIk5vIENhbGlmaWNhZG9zIikgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gU2V4bywgdmFsdWVzX2Zyb20gPSBJT1BfbWVuc3VhbCkgJT4lIA0KICBtdXRhdGUoYnJlY2hhID0gKFZhcm9uZXMtTXVqZXJlcykvVmFyb25lcykgJT4lIA0KICBwdWxsKGJyZWNoYSkgJT4lIA0KICBwZXJjZW50KC4sIDEpDQpgYGANCg0KRWwgc2lndWllbnRlIGdyw6FmaWNvIHNlw7FhbGEgY8OzbW8gbGEgYnJlY2hhIGRlIGluZ3Jlc29zIG1lbnN1YWxlcyBkZSBsYXMvb3Mgb2N1cGFkYXMvb3Mgc2UgbWFudGllbmUgaW5jbHVzbyBhIGlndWFsZXMgbml2ZWxlcyBkZSBjYWxpZmljYWNpw7NuIGRlbCBwdWVzdG8gZGUgdHJhYmFqby4gUG9yIGVqZW1wbG8sIG1pZW50cmFzIHF1ZSBsb3MgdmFyb25lcyBxdWUgdHJhYmFqYW4gZW4gb2N1cGFjaW9uZXMgcHJvZmVzaW9uYWxlcyB0aWVuZW4gdW4gaW5ncmVzbyBtZWRpbyBkZSBfYHIgaW5saW5lXzE0YF8sIGxhcyBtdWplcmVzIG9jdXBhZGFzIGVuIGVzZSBtaXNtbyBzZWdtZW50byBwZXJjaWJlbiB1biBpbmdyZXNvIG1lZGlvIGRlIF9gciBpbmxpbmVfMTVgXywgZXMgZGVjaXIsIHVuIF9fYHIgaW5saW5lXzE2YF9fIG1lbm9zLiAgICANCkVuIGxvcyBwdWVzdG9zIG5vIGNhbGlmaWNhZG9zLCBsb3MgdmFyb25lcyBnYW5hbiBfYHIgaW5saW5lXzE3YF8gZW4gcHJvbWVkaW8sIGFsIHRpZW1wbyBxdWUgbGFzIG11amVyZXMgZ2FuYW4gYWxyZWRlZG9yIGRlIF9gciBpbmxpbmVfMThgXy4gRXN0YSBicmVjaGEgZXMgZGVsIF9fYHIgaW5saW5lXzE5YF9fLg0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fQnJlY2hhIGRlIGluZ3Jlc29zIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsDQogICAgICAgcG9yIHNleG8geSBjYWxpZmljYWNpw7NuIG9jdXBhY2lvbmFsX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19PY3VwYWRhcy9vcy4gYHIgYWdsb19kYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMi42X2dyYWYxIDwtIHRhYmxhMi42ICU+JSANCiAgcGl2b3Rfd2lkZXIoLiwgbmFtZXNfZnJvbSA9IFNleG8sIHZhbHVlc19mcm9tID0gSU9QX21lbnN1YWwpICU+JSANCiAgbXV0YXRlKGJyZWNoYSA9IHBlcmNlbnQoKFZhcm9uZXMtTXVqZXJlcykvVmFyb25lcywgMSksDQogICAgICAgICB4ID0gKFZhcm9uZXMrTXVqZXJlcykvMikNCg0KZ2dwbG90KHRhYmxhMi42X2dyYWYxLCANCiAgICAgICBhZXMoeCA9IE11amVyZXMsIHhlbmQgPSBWYXJvbmVzLCB5ID0gQ0FMSUZJQ0FDSU9OLCANCiAgICAgICAgICAgZ3JvdXAgPSBDQUxJRklDQUNJT04sIGxhYmVsID0gYnJlY2hhKSkgKw0KICBnZW9tX2R1bWJiZWxsKGNvbG9yID0gIiM4MDgwODAiLA0KICAgICAgICAgICAgICAgIHNpemVfeCA9IDMsIHNpemVfeGVuZCA9IDMsDQogICAgICAgICAgICAgICAgY29sb3VyX3ggPSBjb2xvcmVzWzFdLA0KICAgICAgICAgICAgICAgIGNvbG91cl94ZW5kID0gY29sb3Jlc1syXSkgKw0KICBnZW9tX3RleHQoZGF0YSA9IHRhYmxhMi42X2dyYWYxLCANCiAgICAgICAgICAgIGFlcyh4LCBDQUxJRklDQUNJT04sIGxhYmVsID0gYnJlY2hhKSwgbnVkZ2VfeSA9IC4yKSArDQogIGxhYnMoeCA9ICJJbmdyZXNvIE1lbnN1YWwiLA0KICAgICAgIHkgPSBOVUxMLCANCiAgICAgICBjYXB0aW9uID0gZnVlbnRlKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEFxdcOtIGhheSBxdWUgY2FtYmlhciBlbCBkaXJlY3RvcmlvIGVuIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZWwgZ3LDoWZpY28uDQojZ2dzYXZlKCJGaWd1cmE4LnBuZyIsIHNjYWxlID0gMC43LCBkcGkgPSAzMDAsIHdpZHRoID0gMTAsIGhlaWdodCA9IDcsIGJnID0gIiNmZmZmZmYiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpybSh0YWJsYTIuNiwgdGFibGEyLjZfZ3JhZjEpDQpgYGANCg0KLS0tDQoNCiMjIyMjIyMgX19CcmVjaGEgZGUgaW5ncmVzb3MgbWVuc3VhbGVzIHBvciBuaXZlbCBlZHVjYXRpdm9fXyANCjxicj4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnRhYmxhMi43IDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihFU1RBRE8gPT0gMSwgDQogICAgICAgICAhaXMubmEoTklWRUxfRURVQ0FUSVZPKSkgJT4lIA0KICBncm91cF9ieShTZXhvKSAlPiUNCiAgbXV0YXRlKEZyZWN1ZW5jaWEgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgZ3JvdXBfYnkoU2V4bywgTklWRUxfRURVQ0FUSVZPKSAlPiUgDQogIHN1bW1hcmlzZShUYXNhID0gcGVyY2VudChzdW0oUE9OREVSQSkvdW5pcXVlKEZyZWN1ZW5jaWEpLCAxKSkgJT4lIA0KICBwaXZvdF93aWRlciguLCBuYW1lc19mcm9tID0gU2V4bywgdmFsdWVzX2Zyb20gPSBUYXNhKSAlPiUgDQogIHJlbmFtZSgiTml2ZWwgRWR1Y2F0aXZvIiA9IE5JVkVMX0VEVUNBVElWTykNCg0KdGFibGEyLjggPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxLCANCiAgICAgICAgICFpcy5uYShOSVZFTF9FRFVDQVRJVk8pLA0KICAgICAgICAgUDIxPj0wLA0KICAgICAgICAgUE9ORElJTz49MCkgJT4lIA0KICBncm91cF9ieShTZXhvLCBOSVZFTF9FRFVDQVRJVk8pICU+JSANCiAgc3VtbWFyaXNlKElPUF9tZW5zdWFsICA9IHJvdW5kKHdlaWdodGVkLm1lYW4oUDIxLCBQT05ESUlPL3N1bShQT05ESUlPKSksIDIpKSANCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KaW5saW5lXzIwIDwtIHRhYmxhMi44ICU+JSANCiAgZmlsdGVyKE5JVkVMX0VEVUNBVElWTyA9PSAiU3VwZXJpb3IiKSAlPiUgDQogIHBpdm90X3dpZGVyKC4sIG5hbWVzX2Zyb20gPSBTZXhvLCB2YWx1ZXNfZnJvbSA9IElPUF9tZW5zdWFsKSAlPiUgDQogIG11dGF0ZShicmVjaGEgPSAoVmFyb25lcy1NdWplcmVzKS9WYXJvbmVzKSAlPiUgDQogIHB1bGwoYnJlY2hhKSAlPiUgDQogIHBlcmNlbnQoLiwgMSkNCg0KaW5saW5lXzIxIDwtIHRhYmxhMi44ICU+JSANCiAgZmlsdGVyKE5JVkVMX0VEVUNBVElWTyA9PSAiUHJpbWFyaWEiKSAlPiUgDQogIHBpdm90X3dpZGVyKC4sIG5hbWVzX2Zyb20gPSBTZXhvLCB2YWx1ZXNfZnJvbSA9IElPUF9tZW5zdWFsKSAlPiUgDQogIG11dGF0ZShicmVjaGEgPSAoVmFyb25lcy1NdWplcmVzKS9WYXJvbmVzKSAlPiUgDQogIHB1bGwoYnJlY2hhKSAlPiUgDQogIHBlcmNlbnQoLiwgMSkNCmBgYA0KDQpDb21vIHB1ZWRlIG9ic2VydmFyc2UgZW4gZWwgY3VhZHJvIHNpZ3VpZW50ZSwgZWwgcG9yY2VudGFqZSBkZSBwZXJzb25hcyBxdWUgY3VlbnRhbiBjb24gdW4gbml2ZWwgZWR1Y2F0aXZvIHN1cGVyaW9yIGVzIG5vdGFibGVtZW50ZSBtYXlvciBlbnRyZSBsYXMgb2N1cGFkYXMgbXVqZXJlcywgZW4gY29tcGFyYWNpw7NuIGEgbG9zIG9jdXBhZG9zIHZhcm9uZXMuDQo8YnI+PGJyPg0KU2luIGVtYmFyZ28sIGEgaWd1YWwgbml2ZWwgZWR1Y2F0aXZvLCBsb3MgaW5ncmVzb3MgbGFib3JhbGVzIGRlIGxhcyBtdWplcmVzIHRyYWJhamFkb3JhcyBzb24gaW5mZXJpb3JlcyBhIGxvcyBkZSBsb3MgdmFyb25lcy4gRXN0YSBkaWZlcmVuY2lhIGRlIGluZ3Jlc29zIGVzIGRlbCBfX2ByIGlubGluZV8yMGBfXyBwYXJhIGxhcyBkZSBuaXZlbCB1bml2ZXJzaXRhcmlvL3N1cGVyaW9yLCB5IGRlbCBfX2ByIGlubGluZV8yMWBfXyBwYXJhIGxhcyBxdWUgY3VlbnRhbiBjb24gbml2ZWwgcHJpbWFyaW8uDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19OaXZlbCBlZHVjYXRpdm8gZGUgbXVqZXJlcyB5IHZhcm9uZXNfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX1BvcmNlbnRhamUgcG9yIGNvbHVtbmFzLiBPY3VwYWRhcy9vcy4gYHIgYWdsb19kYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMi43ICU+JSANCiAgbXV0YXRlKE11amVyZXMgPSBjb2xvcl90aWxlKCIjZjdjZmQzIiwgY29sb3Jlc1sxXSkoKE11amVyZXMpKSwNCiAgICAgICAgIFZhcm9uZXMgPSBjb2xvcl90aWxlKCIjRURFREVEIiwgY29sb3Jlc1syXSkoKFZhcm9uZXMpKSkgJT4lIA0KICBzZWxlY3QoJ05pdmVsIEVkdWNhdGl2bycsIE11amVyZXMsIFZhcm9uZXMpICU+JSANCiAga2FibGUoZXNjYXBlID0gRkFMU0UsIGRpZ2l0cyA9IDEsIGFsaWduID0gJ2xjYycpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIA0KICAgICAgICAgICAgICAgICNmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuIikgJT4lIA0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI3Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDIsIGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSAiNGNtIikgJT4lIA0KICBjb2x1bW5fc3BlYygzLCBjb2xvciA9ICJibGFjayIsIHdpZHRoID0gIjRjbSIpICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnRhYmxhMi44X2dyYWYxIDwtIHRhYmxhMi44ICU+JSANCiAgcGl2b3Rfd2lkZXIoLiwgbmFtZXNfZnJvbSA9IFNleG8sIHZhbHVlc19mcm9tID0gSU9QX21lbnN1YWwpICU+JQ0KICBtdXRhdGUoYnJlY2hhID0gcGVyY2VudCgoVmFyb25lcy1NdWplcmVzKS9WYXJvbmVzLCAxKSwNCiAgICAgICAgIHggPSAoVmFyb25lcytNdWplcmVzKS8yKQ0KYGBgDQoNCjxicj48YnI+DQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19CcmVjaGEgZGUgaW5ncmVzb3MgZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwNCiAgICAgICBwb3Igc2V4byB5IG5pdmVsIGVkdWNhdGl2b19fPC9wPg0KPHAgc3R5bGU9ImNvbG9yOiNjOWM5YzkiPl9fT2N1cGFkYXMvb3MuIGByIGFnbG9fZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QodGFibGEyLjhfZ3JhZjEsIA0KICAgICAgIGFlcyh4ID0gTXVqZXJlcywgeGVuZCA9IFZhcm9uZXMsIHkgPSBOSVZFTF9FRFVDQVRJVk8sIA0KICAgICAgICAgICBncm91cCA9IE5JVkVMX0VEVUNBVElWTywgbGFiZWwgPSBicmVjaGEpKSArDQogIGdlb21fZHVtYmJlbGwoY29sb3IgPSAiIzgwODA4MCIsDQogICAgICAgICAgICAgICAgc2l6ZV94ID0gMywgc2l6ZV94ZW5kID0gMywNCiAgICAgICAgICAgICAgICBjb2xvdXJfeCA9IGNvbG9yZXNbMV0sDQogICAgICAgICAgICAgICAgY29sb3VyX3hlbmQgPSBjb2xvcmVzWzJdKSArDQogIGdlb21fdGV4dChkYXRhID0gdGFibGEyLjhfZ3JhZjEsIA0KICAgICAgICAgICAgYWVzKHgsIE5JVkVMX0VEVUNBVElWTywgbGFiZWwgPSBicmVjaGEpLCBudWRnZV95ID0gLjIpICsNCiAgbGFicyh4ID0gIkluZ3Jlc28gTWVuc3VhbCIsDQogICAgICAgeSA9IE5VTEwsIA0KICAgICAgIGNhcHRpb24gPSBmdWVudGUpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JlcykrDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEFxdcOtIGhheSBxdWUgY2FtYmlhciBlbCBkaXJlY3RvcmlvIGVuIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZWwgZ3LDoWZpY28uDQojZ2dzYXZlKCJGaWd1cmExMC5wbmciLCBzY2FsZSA9IDAuNywgZHBpID0gMzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBiZyA9ICIjZmZmZmZmIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGEyLjcsIHRhYmxhMi44LCB0YWJsYTIuOF9ncmFmMSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI1RhYmxhIHBhcmEgaW5ncmVzb3MgbWVuc3VhbGVzIHBvciByZWdpw7NuICBwYXNvIDENCg0KIyBJbmdyZXNvIFRvdGFsIEluZGl2aWR1YWwNCnRhYmxhMi45IDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihQNDdUID4gMCkgJT4lIA0KICBncm91cF9ieShTZXhvLCBSZWdpb24pICU+JSANCiAgc3VtbWFyaXNlKE1lZGlhLklUSSA9IHJvdW5kKHdlaWdodGVkLm1lYW4oYXMubnVtZXJpYyhQNDdUKSwgYXMubnVtZXJpYyhQT05ESUkpKSkpICU+JSANCiAgc3ByZWFkKC4sIFNleG8sIE1lZGlhLklUSSkgJT4lIA0KICBtdXRhdGUoUG9ibGFjacOzbiA9ICJQZXJjZXB0b3JlcyBkZSBpbmdyZXNvcyIsDQogICAgICAgICBJbmdyZXNvID0gIkluZ3Jlc28gVG90YWwgSW5kaXZpZHVhbCIpDQoNCiMgSW5ncmVzbyBkZSBsYSBPY3VwYWNpw7NuIFByaW5jaXBhbA0KdGFibGEyLjEwIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihFU1RBRE8gPT0gMSkgJT4lIA0KICBncm91cF9ieShTZXhvLCBSZWdpb24pICU+JSANCiAgc3VtbWFyaXNlKE1lZGlhLklPUCA9IHJvdW5kKHdlaWdodGVkLm1lYW4oYXMubnVtZXJpYyhQMjEpLCBhcy5udW1lcmljKFBPTkRJSU8pKSkpICU+JSANCiAgc3ByZWFkKC4sIFNleG8sIE1lZGlhLklPUCkgJT4lIA0KICBtdXRhdGUoUG9ibGFjacOzbiA9ICJPY3VwYWRhcy9vcyIsDQogICAgICAgICBJbmdyZXNvID0gIkluZ3Jlc28gZGUgbGEgT2N1cGFjacOzbiBQcmluY2lwYWwiKQ0KDQojIEFzYWwuIHNpbiBkZXNjdWVudG8ganViaWxhdG9yaW8uIEluZ3Jlc28gZGUgbGEgT2N1cGFjacOzbiBQcmluY2lwYWwNCnRhYmxhMi4xMSA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoRVNUQURPID09IDEgJiBDQVRfT0NVUCA9PSAzICYgUFAwN0ggPT0gMiAmIFAyMT4wKSAlPiUgDQogIGdyb3VwX2J5KFNleG8sIFJlZ2lvbikgJT4lIA0KICBzdW1tYXJpc2UoTWVkaWEuSU9QID0gcm91bmQod2VpZ2h0ZWQubWVhbihhcy5udW1lcmljKFAyMSksIGFzLm51bWVyaWMoUE9ORElJTykpKSkgJT4lIA0KICBzcHJlYWQoLiwgU2V4bywgTWVkaWEuSU9QKSAlPiUgDQogIG11dGF0ZShQb2JsYWNpw7NuID0gIkFzYWxhcmlhZGFzL29zIHNpbiBkZXNjLiBqdWJpbC4iLA0KICAgICAgICAgSW5ncmVzbyA9ICJJbmdyZXNvIGRlIGxhIE9jdXBhY2nDs24gUHJpbmNpcGFsIikNCg0KIyBKdWJpbGFjaW9uZXMNCnRhYmxhMi4xMiA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoVjJfTSA+IDApICU+JSANCiAgZ3JvdXBfYnkoU2V4bywgUmVnaW9uKSAlPiUgDQogIHN1bW1hcmlzZShNZWRpYS5KVUIgPSByb3VuZCh3ZWlnaHRlZC5tZWFuKGFzLm51bWVyaWMoVjJfTSksIGFzLm51bWVyaWMoUE9ORElJKSkpKSAlPiUgDQogIHNwcmVhZCguLCBTZXhvLCBNZWRpYS5KVUIpICU+JSANCiAgbXV0YXRlKFBvYmxhY2nDs24gPSAiUGVyY2VwdG9yZXMgZGUganViaWxhY2nDs24iLA0KICAgICAgICAgSW5ncmVzbyA9ICJKdWJpbGFjacOzbiIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KI1RhYmxhIHBhcmEgaW5ncmVzb3MgbWVuc3VhbGVzIHBvciByZWdpw7NuIHBhc28gMg0KDQp0YWJsYTIuMTMgPC0gYmluZF9yb3dzKHRhYmxhMi45LCB0YWJsYTIuMTAsIHRhYmxhMi4xMSwgdGFibGEyLjEyKSAlPiUgDQogIG11dGF0ZShCcmVjaGEgPSBwZXJjZW50KCgoVmFyb25lcy1NdWplcmVzKS9WYXJvbmVzKSwgMSksDQogICAgICAgICBNdWplcmVzID0gZm9ybWF0b19wZXNvcyhyb3VuZChNdWplcmVzLCAtMiksIDApLA0KICAgICAgICAgVmFyb25lcyA9IGZvcm1hdG9fcGVzb3Mocm91bmQoVmFyb25lcywgLTIpLCAwKSkgJT4lIA0KICBzZWxlY3QoUmVnaW9uLCBQb2JsYWNpw7NuLCBJbmdyZXNvLCBNdWplcmVzLCBWYXJvbmVzLCBCcmVjaGEpDQoNCnRhYmxhMi4xM20gPC0gdGFibGEyLjEzICU+JSANCiAgc2VsZWN0KGMoMTo0KSkgJT4lIA0KICBzcHJlYWQoLiwgUmVnaW9uLCBNdWplcmVzKQ0KDQp0YWJsYTIuMTN2IDwtIHRhYmxhMi4xMyAlPiUgDQogIHNlbGVjdChjKDE6MywgNSkpICU+JSANCiAgc3ByZWFkKC4sIFJlZ2lvbiwgVmFyb25lcykNCg0KdGFibGEyLjEzYiA8LSB0YWJsYTIuMTMgJT4lIA0KICBzZWxlY3QoYygxOjMsIDYpKSAlPiUgDQogIHNwcmVhZCguLCBSZWdpb24sIEJyZWNoYSkNCg0KdGFibGEyLjE0IDwtIGxlZnRfam9pbih0YWJsYTIuMTNtLCB0YWJsYTIuMTN2LCBieSA9IGMoIlBvYmxhY2nDs24iLCAiSW5ncmVzbyIpKSAlPiUgDQogIHNlbGVjdChQb2JsYWNpw7NuLCBJbmdyZXNvLCBgTXVqZXJlc2AgPSBgQ3V5by54YCwgYFZhcm9uZXNgID0gYEN1eW8ueWAsDQogICAgICAgICAgICAgICAgICAgICBgIE11amVyZXNgID0gYEdyYW4gQnVlbm9zIEFpcmVzLnhgLCBgIFZhcm9uZXNgID0gYEdyYW4gQnVlbm9zIEFpcmVzLnlgLA0KICAgICAgICAgICAgICAgICAgICBgICBNdWplcmVzYCA9IGBORUEueGAsIGAgIFZhcm9uZXNgID0gYE5FQS55YCwNCiAgICAgICAgICAgICAgICAgICBgICAgTXVqZXJlc2AgPSBgTk9BLnhgLCBgICAgVmFyb25lc2AgPSBgTk9BLnlgLA0KICAgICAgICAgICAgICAgICAgYCAgICBNdWplcmVzYCA9IGBQYW1wZWFuYS54YCwgYCAgICBWYXJvbmVzYCA9IGBQYW1wZWFuYS55YCwNCiAgICAgICAgICAgICAgICAgYCAgICAgTXVqZXJlc2AgPSBgUGF0YWdvbmlhLnhgLCBgICAgICBWYXJvbmVzYCA9IGBQYXRhZ29uaWEueWApICU+JSANCiAgbGVmdF9qb2luKC4sIHRhYmxhMi4xM2IsIGJ5ID0gYygiUG9ibGFjacOzbiIsICJJbmdyZXNvIikpICU+JSANCiAgbXV0YXRlKGBCcmVjaGFgID0gYEN1eW9gLA0KICAgICAgICAgYCBCcmVjaGFgID0gYEdyYW4gQnVlbm9zIEFpcmVzYCwNCiAgICAgICAgIGAgIEJyZWNoYWAgPSBgTkVBYCwNCiAgICAgICAgIGAgICBCcmVjaGFgID0gYE5PQWAsDQogICAgICAgICBgICAgIEJyZWNoYWAgPSBgUGFtcGVhbmFgLA0KICAgICAgICAgYCAgICAgQnJlY2hhYCA9IGBQYXRhZ29uaWFgKSAlPiUgDQogIHNlbGVjdChQb2JsYWNpw7NuLCBJbmdyZXNvLA0KICAgICAgICAgYE11amVyZXNgLCBgVmFyb25lc2AsIGBCcmVjaGFgLA0KICAgICAgICAgYCBNdWplcmVzYCwgYCBWYXJvbmVzYCwgYCBCcmVjaGFgLA0KICAgICAgICAgYCAgTXVqZXJlc2AsIGAgIFZhcm9uZXNgLCBgICBCcmVjaGFgLA0KICAgICAgICAgYCAgIE11amVyZXNgLCBgICAgVmFyb25lc2AsIGAgICBCcmVjaGFgLA0KICAgICAgICAgYCAgICBNdWplcmVzYCwgYCAgICBWYXJvbmVzYCwgYCAgICBCcmVjaGFgLA0KICAgICAgICAgYCAgICAgTXVqZXJlc2AsIGAgICAgIFZhcm9uZXNgLCBgICAgICBCcmVjaGFgKQ0KDQpgYGANCg0KIyMjIyMjIEN1eW8NCjxicj48YnI+DQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX0luZ3Jlc29zIG1lbnN1YWxlcyBwcm9tZWRpbyB5IGJyZWNoYV9fPC9wPg0KPHAgc3R5bGU9ImNvbG9yOiNjOWM5YzkiPl9fUG9yIHBvYmxhY2lvbmVzIHkgdGlwb3MgZGUgaW5ncmVzb3MuIEN1eW8uIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGEyLjE0ICU+JSANCiAgc2VsZWN0KDE6NSkgJT4lIA0KICBrYWJsZShhbGlnbiA9ICdsbGNjYycpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgI2Z1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJcbiIgPSAyLCAiTWVkaWEgZGVsIGluZ3Jlc28iID0gMiwgIlxuIiA9IDEpLCANCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjdjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI3Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjNjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg0LCB3aWR0aCA9ICIzY20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDUsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICIyY20iKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KDQojIyMjIyMgR0JBDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19JbmdyZXNvcyBtZW5zdWFsZXMgcHJvbWVkaW8geSBicmVjaGFfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX1BvciBwb2JsYWNpb25lcyB5IHRpcG9zIGRlIGluZ3Jlc29zLiBHQkEuIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGEyLjE0ICU+JSANCiAgc2VsZWN0KGMoMSwyLDYsNyw4KSkgJT4lIA0KICBrYWJsZShhbGlnbiA9ICdsbGNjYycpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgI2Z1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJcbiIgPSAyLCAiTWVkaWEgZGVsIGluZ3Jlc28iID0gMiwgIlxuIiA9IDEpLCANCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjdjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI3Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjNjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg0LCB3aWR0aCA9ICIzY20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDUsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICIyY20iKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KIyMjIyMjIE5FQQ0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fSW5ncmVzb3MgbWVuc3VhbGVzIHByb21lZGlvIHkgYnJlY2hhX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb3IgcG9ibGFjaW9uZXMgeSB0aXBvcyBkZSBpbmdyZXNvcy4gTkVBLiBgciBkYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMi4xNCAlPiUgDQogIHNlbGVjdChjKDEsMiw5LDEwLDExKSkgJT4lIA0KICBrYWJsZShhbGlnbiA9ICdsbGNjYycpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgI2Z1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJcbiIgPSAyLCAiTWVkaWEgZGVsIGluZ3Jlc28iID0gMiwgIlxuIiA9IDEpLCANCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjdjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI3Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjNjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg0LCB3aWR0aCA9ICIzY20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDUsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICIyY20iKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KIyMjIyMjIE5PQQ0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fSW5ncmVzb3MgbWVuc3VhbGVzIHByb21lZGlvIHkgYnJlY2hhX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb3IgcG9ibGFjaW9uZXMgeSB0aXBvcyBkZSBpbmdyZXNvcy4gTk9BLiBgciBkYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMi4xNCAlPiUgDQogIHNlbGVjdChjKDEsMiwxMiwxMywxNCkpICU+JSANCiAga2FibGUoYWxpZ24gPSAnbGxjY2MnKSAlPiUNCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIA0KICAgICAgICAgICAgICAgICNmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiXG4iID0gMiwgIk1lZGlhIGRlbCBpbmdyZXNvIiA9IDIsICJcbiIgPSAxKSwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuIikgJT4lIA0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI3Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiN2NtIikgJT4lIA0KICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9ICIzY20iKSAlPiUNCiAgY29sdW1uX3NwZWMoNCwgd2lkdGggPSAiM2NtIikgJT4lIA0KICBjb2x1bW5fc3BlYyg1LCBib2xkID0gVFJVRSwgd2lkdGggPSAiMmNtIikgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKQ0KYGBgDQoNCiMjIyMjIyBQYW1wZWFuYQ0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fSW5ncmVzb3MgbWVuc3VhbGVzIHByb21lZGlvIHkgYnJlY2hhX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb3IgcG9ibGFjaW9uZXMgeSB0aXBvcyBkZSBpbmdyZXNvcy4gUGFtcGVhbmEuIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGEyLjE0ICU+JQ0KICBzZWxlY3QoYygxLDIsMTUsMTYsMTcpKSAlPiUgDQogIGthYmxlKGFsaWduID0gJ2xsY2NjJykgJT4lDQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCANCiAgICAgICAgICAgICAgICAjZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlxuIiA9IDIsICJNZWRpYSBkZWwgaW5ncmVzbyIgPSAyLCAiXG4iID0gMSksIA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9IGZ1ZW50ZSwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICJcbiIpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiN2NtIikgJT4lDQogIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjdjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiM2NtIikgJT4lDQogIGNvbHVtbl9zcGVjKDQsIHdpZHRoID0gIjNjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoNSwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjJjbSIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkNCmBgYA0KDQojIyMjIyMgUGF0YWdvbmlhDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19JbmdyZXNvcyBtZW5zdWFsZXMgcHJvbWVkaW8geSBicmVjaGFfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX1BvciBwb2JsYWNpb25lcyB5IHRpcG9zIGRlIGluZ3Jlc29zLiBQYXRhZ29uaWEuIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGEyLjE0ICU+JSANCiAgc2VsZWN0KGMoMSwyLDE4LDE5LDIwKSkgJT4lIA0KICBrYWJsZShhbGlnbiA9ICdsbGNjYycpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgI2Z1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJcbiIgPSAyLCAiTWVkaWEgZGVsIGluZ3Jlc28iID0gMiwgIlxuIiA9IDEpLCANCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjdjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI3Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjNjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg0LCB3aWR0aCA9ICIzY20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDUsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICIyY20iKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnJtKHRhYmxhMi45LCB0YWJsYTIuMTAsIHRhYmxhMi4xMSwgdGFibGEyLjEyLCB0YWJsYTIuMTMsIHRhYmxhMi4xM2IsIHRhYmxhMi4xM20sIHRhYmxhMi4xM3YsIHRhYmxhMi4xNCkNCmBgYA0KDQojIyMjIEluZ3Jlc29zIGhvcmFyaW9zDQoNClNpIGVuIGx1Z2FyIGRlIGNvbXBhcmFyIGluZ3Jlc29zIG1lbnN1YWxlcyB0b21hbW9zIGVsIGluZ3Jlc28gcG9yIGhvcmEgdHJhYmFqYWRhIHF1ZSBwZXJjaWJlbiBsYXMgcGVyc29uYXMsIGxhIGhpc3RvcmlhIGVzIHVuIHBvY28gZGlmZXJlbnRlLiBFbiBlc3RlIGNhc28sIGxhIGJyZWNoYSBkaXNtaW51eWUgY29uc2lkZXJhYmxlbWVudGUuIFF1ZSBsYXMgYnJlY2hhcyBzZWFuIG3DoXMgYW1wbGlhcyBjb21wYXJhbmRvIGluZ3Jlc29zIG1lbnN1YWxlcyBkZSBib2xzaWxsbywgeSBxdWUgc2VhbiBtw6FzIGVzdHJlY2hhcyBjdWFuZG8gc2UgdG9tYW4gbG9zIGluZ3Jlc29zIHBvciBob3JhLCBzdWdpZXJlIHF1ZSBsYXMgbXVqZXJlcyB2ZW5kZW4gZW4gZWwgbWVyY2FkbyBkZSB0cmFiYWpvLCBwb3IgbG8gZ2VuZXJhbCwgbWVub3MgaG9yYXMgcXVlIGxvcyB2YXJvbmVzLiBDb21vIHNlIHZlcsOhIG3DoXMgYWRlbGFudGUsIGVzdG8gZXN0w6EgbGlnYWRvIGFsIHRyYWJham8gcXVlIGxhcyBtaXNtYXMgc3VlbGVuIHJlYWxpemFyIGFsIGludGVyaW9yIGRlIGxvcyBob2dhcmVzLg0KPGJyPjxicj4NCg0KIyMjIyMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIyBUb3RhbCBOYWNpb25hbA0KPGJyPjxicj4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgT2N1cGFkZXMuIEluZ3Jlc28gZGUgbGEgT2N1cGFjacOzbiBQcmluY2lwYWwNCnRhYmxhMi4xNSA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoRVNUQURPID09IDEsDQogICAgICAgICBQUDNFX1RPVCA+IDAsICMgSG9yYXMgdHJhYmFqYWRhcyBwb3NpdGl2YXMNCiAgICAgICAgIFBQM0VfVE9UICE9IDk5OSkgJT4lIA0KICBncm91cF9ieShTZXhvKSAlPiUgDQogICAgbXV0YXRlKFBQM0VfVE9UID0gYXMubnVtZXJpYyhnc3ViKCIsIiwgI2NhbWJpbyAiLiIgcG9yICJjb21hcyIsIiBlbiBsb3MgZGVjaW1hbGVzIHBhcmEgcG9kZXIgb3BlcmFyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDNFX1RPVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkID0gVFJVRSkpKSAlPiUgDQogIHN1bW1hcmlzZShJT1BfaHIgPSB3ZWlnaHRlZC5tZWFuKFAyMS8oUFAzRV9UT1QgKiAzMCAvIDcpLCBQT05ESUlPKSkgJT4lIA0KICBwaXZvdF93aWRlciguLCBuYW1lc19mcm9tID0gU2V4bywgdmFsdWVzX2Zyb20gPSBJT1BfaHIpICU+JSANCiAgbXV0YXRlKFBvYmxhY2nDs24gPSAiT2N1cGFkYXMvb3MiKQ0KDQojIEFzYWxhcmlhZGVzLiBJbmdyZXNvIGRlIGxhIE9jdXBhY2nDs24gUHJpbmNpcGFsDQp0YWJsYTIuMTYgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxLA0KICAgICAgICAgQ0FUX09DVVAgPT0gMywNCiAgICAgICAgIFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgUFAzRV9UT1QgIT0gOTk5KSAlPiUgDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgICBtdXRhdGUoUFAzRV9UT1QgPSBhcy5udW1lcmljKGdzdWIoIiwiLCAjY2FtYmlvICIuIiBwb3IgImNvbWFzIiwiIGVuIGxvcyBkZWNpbWFsZXMgcGFyYSBwb2RlciBvcGVyYXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQM0VfVE9ULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgPSBUUlVFKSkpICU+JSANCiAgc3VtbWFyaXNlKElPUF9ociA9IHdlaWdodGVkLm1lYW4oUDIxLyhQUDNFX1RPVCAqIDMwIC8gNyksIFBPTkRJSU8pKSAlPiUgDQogIHBpdm90X3dpZGVyKC4sIG5hbWVzX2Zyb20gPSBTZXhvLCB2YWx1ZXNfZnJvbSA9IElPUF9ocikgJT4lIA0KICBtdXRhdGUoUG9ibGFjacOzbiA9ICJBc2FsYXJpYWRhcy9vcyIpDQoNCiMgQXNhbC4gc2luIGRlc2N1ZW50byBqdWJpbGF0b3Jpby4gSW5ncmVzbyBkZSBsYSBPY3VwYWNpw7NuIFByaW5jaXBhbA0KdGFibGEyLjE3IDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihFU1RBRE8gPT0gMSwgDQogICAgICAgICBDQVRfT0NVUCA9PSAzLA0KICAgICAgICAgUFAwN0ggPT0gMiwNCiAgICAgICAgIFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgUFAzRV9UT1QgIT0gOTk5KSAlPiUgDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgICBtdXRhdGUoUFAzRV9UT1QgPSBhcy5udW1lcmljKGdzdWIoIiwiLCAjY2FtYmlvICIuIiBwb3IgImNvbWFzIiwiIGVuIGxvcyBkZWNpbWFsZXMgcGFyYSBwb2RlciBvcGVyYXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQM0VfVE9ULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgPSBUUlVFKSkpICU+JSANCiAgc3VtbWFyaXNlKElPUF9ociA9IHdlaWdodGVkLm1lYW4oUDIxLyhQUDNFX1RPVCAqIDMwIC8gNyksIFBPTkRJSU8pKSAlPiUgDQogIHBpdm90X3dpZGVyKC4sIG5hbWVzX2Zyb20gPSBTZXhvLCB2YWx1ZXNfZnJvbSA9IElPUF9ocikgJT4lIA0KICBtdXRhdGUoUG9ibGFjacOzbiA9ICJBc2FsYXJpYWRhcy9vcyBzaW4gZGVzYy4ganViaWwuIikNCg0KdGFibGEyLjE4IDwtIGJpbmRfcm93cyh0YWJsYTIuMTUsIHRhYmxhMi4xNiwgdGFibGEyLjE3KSAlPiUgDQogIG11dGF0ZShCcmVjaGEgPSBwZXJjZW50KCgoVmFyb25lcy1NdWplcmVzKS9WYXJvbmVzKSwgMSksDQogICAgICAgICBNdWplcmVzID0gZm9ybWF0b19wZXNvcyhNdWplcmVzLCAwKSwNCiAgICAgICAgIFZhcm9uZXMgPSBmb3JtYXRvX3Blc29zKFZhcm9uZXMsIDApKSAlPiUgDQogIHNlbGVjdChQb2JsYWNpw7NuLCBNdWplcmVzLCBWYXJvbmVzLCBCcmVjaGEpDQpgYGANCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fQnJlY2hhcyBkZSBpbmdyZXNvcyBob3Jhcmlvc19fPC9wPg0KPHAgc3R5bGU9ImNvbG9yOiNjOWM5YzkiPl9fYHIgYWdsb19kYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmthYmxlKHRhYmxhMi4xOCwgZGlnaXRzID0gMSwgYWxpZ24gPSAnbGNjYycpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlxuIiA9IDEsICJNZWRpYSBkZWwgaW5ncmVzbyBob3JhcmlvIiA9IDIsICJcbiIgPSAxKSwNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGZpeGVkX3NtYWxsX3NpemUgPSBUUlVFLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuIikgJT4lIA0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI4Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDQsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI0Y20iKSAlPiUgDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpybSh0YWJsYTIuMTUsIHRhYmxhMi4xNiwgdGFibGEyLjE3LCB0YWJsYTIuMTgpDQpgYGANCg0KLS0tDQoNCiMjIyMjIyMgX19CcmVjaGEgZGUgaW5ncmVzb3MgaG9yYXJpb3MgcG9yIG5pdmVsIGVkdWNhdGl2b19fDQo8YnI+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQp0YWJsYTIuMTkgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxLCANCiAgICAgICAgIFBQM0VfVE9UID4gMCwNCiAgICAgICAgIFBQM0VfVE9UICE9IDk5OSwNCiAgICAgICAgICFpcy5uYShOSVZFTF9FRFVDQVRJVk8pKSAlPiUgDQogIGdyb3VwX2J5KFNleG8sIE5JVkVMX0VEVUNBVElWTykgJT4lIA0KICAgIG11dGF0ZShQUDNFX1RPVCA9IGFzLm51bWVyaWMoZ3N1YigiLCIsICNjYW1iaW8gIi4iIHBvciAiY29tYXMiLCIgZW4gbG9zIGRlY2ltYWxlcyBwYXJhIHBvZGVyIG9wZXJhcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAzRV9UT1QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCA9IFRSVUUpKSkgJT4lIA0KICBzdW1tYXJpc2UoSU9QX2hyID0gcm91bmQod2VpZ2h0ZWQubWVhbihQMjEvKFBQM0VfVE9UICogMzAgLyA3KSwgUE9ORElJTyksIDIpLA0KICAgICAgICAgICAgSU9QX21lbnN1YWwgID0gcm91bmQod2VpZ2h0ZWQubWVhbihQMjEsIFBPTkRJSU8pLCAyKSkNCg0KdGFibGEyLjE5X2dyYWYxIDwtIHRhYmxhMi4xOSAlPiUgDQogIHNlbGVjdCgtSU9QX21lbnN1YWwpICU+JSANCiAgcGl2b3Rfd2lkZXIoLiwgbmFtZXNfZnJvbSA9IFNleG8sIHZhbHVlc19mcm9tID0gSU9QX2hyKSAlPiUgDQogIG11dGF0ZShicmVjaGEgPSBwZXJjZW50KChWYXJvbmVzLU11amVyZXMpL1Zhcm9uZXMsIDEpLA0KICAgICAgICAgeCA9IChWYXJvbmVzK011amVyZXMpLzIpDQpgYGANCg0KVGFsIGNvbW8gc2UgYW5hbGl6w7MgZW4gZWwgY2FzbyBhbnRlcmlvciwgc2kgc2Ugb2JzZXJ2YSBsYSBicmVjaGEgZGUgaW5ncmVzb3MgaG9yYXJpb3MgcG9yIG5pdmVsIGVkdWNhdGl2byBhbGNhbnphZG8sIGxhIG1pc21hIHNlIHJlZHVjZSBzaWduaWZpY2F0aXZhbWVudGUsIGF1bnF1ZSBzaWd1ZSBwcmVzZW50ZSBlbiBhbGd1bmFzIGNhdGVnb3LDrWFzLg0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fQnJlY2hhIGRlIGluZ3Jlc29zIGhvcmFyaW9zIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsDQogICAgICAgcG9yIHNleG8geSBuaXZlbCBlZHVjYXRpdm9fXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX09jdXBhZGFzL29zLiBgciBhZ2xvX2RhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KHRhYmxhMi4xOV9ncmFmMSwgDQogICAgICAgYWVzKHggPSBNdWplcmVzLCB4ZW5kID0gVmFyb25lcywgeSA9IE5JVkVMX0VEVUNBVElWTywgDQogICAgICAgICAgIGdyb3VwID0gTklWRUxfRURVQ0FUSVZPLCBsYWJlbCA9IGJyZWNoYSkpICsNCiAgZ2VvbV9kdW1iYmVsbChjb2xvcj0gIiM4MDgwODAiLA0KICAgICAgICAgICAgICAgIHNpemVfeCA9IDMsIHNpemVfeGVuZCA9IDMsDQogICAgICAgICAgICAgICAgY29sb3VyX3ggPSBjb2xvcmVzWzFdLA0KICAgICAgICAgICAgICAgIGNvbG91cl94ZW5kID0gY29sb3Jlc1syXSkgKw0KICBnZW9tX3RleHQoZGF0YSA9IHRhYmxhMi4xOV9ncmFmMSwNCiAgICAgICAgICAgIGFlcyh4LCBOSVZFTF9FRFVDQVRJVk8sIGxhYmVsID0gYnJlY2hhKSwgbnVkZ2VfeSA9IC4yKSArDQogIGxhYnMoeD0iSW5ncmVzbyBIb3JhcmlvIiwNCiAgICAgICB5PU5VTEwsIA0KICAgICAgIGNhcHRpb24gPSBmdWVudGUpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JlcykrDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEFxdcOtIGhheSBxdWUgY2FtYmlhciBlbCBkaXJlY3RvcmlvIGVuIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZWwgZ3LDoWZpY28uDQojZ2dzYXZlKCJGaWd1cmExMy5wbmciLCBzY2FsZSA9IDAuNywgZHBpID0gMzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBiZyA9ICIjZmZmZmZmIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGEyLjE5LCB0YWJsYTIuMTlfZ3JhZjEpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KI1RhYmxhIHBhcmEgaW5ncmVzb3MgaG9yYXJpb3MgcG9yIHJlZ2nDs24gIHBhc28gMQ0KDQojIE9jdXBhZGVzLiBJbmdyZXNvIGRlIGxhIE9jdXBhY2nDs24gUHJpbmNpcGFsDQp0YWJsYTIuMjAgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxLA0KICAgICAgICAgUFAzRV9UT1QgPiAwLCAjIEhvcmFzIHRyYWJhamFkYXMgcG9zaXRpdmFzDQogICAgICAgICBQUDNFX1RPVCAhPSA5OTkpICU+JSANCiAgZ3JvdXBfYnkoU2V4bywgUmVnaW9uKSAlPiUgDQogICAgbXV0YXRlKFBQM0VfVE9UID0gYXMubnVtZXJpYyhnc3ViKCIsIiwgI2NhbWJpbyAiLiIgcG9yICJjb21hcyIsIiBlbiBsb3MgZGVjaW1hbGVzIHBhcmEgcG9kZXIgb3BlcmFyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDNFX1RPVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkID0gVFJVRSkpKSAlPiUgDQogIHN1bW1hcmlzZShJT1BfaHIgPSB3ZWlnaHRlZC5tZWFuKFAyMS8oUFAzRV9UT1QgKiAzMCAvIDcpLCBQT05ESUlPKSkgJT4lIA0KICBwaXZvdF93aWRlciguLCBuYW1lc19mcm9tID0gU2V4bywgdmFsdWVzX2Zyb20gPSBJT1BfaHIpICU+JSANCiAgbXV0YXRlKFBvYmxhY2nDs24gPSAiT2N1cGFkYXMvb3MiKQ0KDQojIEFzYWxhcmlhZGVzLiBJbmdyZXNvIGRlIGxhIE9jdXBhY2nDs24gUHJpbmNpcGFsDQp0YWJsYTIuMjEgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxLA0KICAgICAgICAgQ0FUX09DVVAgPT0gMywNCiAgICAgICAgIFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgUFAzRV9UT1QgIT0gOTk5KSAlPiUgDQogIGdyb3VwX2J5KFNleG8sIFJlZ2lvbikgJT4lIA0KICAgIG11dGF0ZShQUDNFX1RPVCA9IGFzLm51bWVyaWMoZ3N1YigiLCIsICNjYW1iaW8gIi4iIHBvciAiY29tYXMiLCIgZW4gbG9zIGRlY2ltYWxlcyBwYXJhIHBvZGVyIG9wZXJhcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAzRV9UT1QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCA9IFRSVUUpKSkgJT4lIA0KICBzdW1tYXJpc2UoSU9QX2hyID0gd2VpZ2h0ZWQubWVhbihQMjEvKFBQM0VfVE9UICogMzAgLyA3KSwgUE9ORElJTykpICU+JSANCiAgcGl2b3Rfd2lkZXIoLiwgbmFtZXNfZnJvbSA9IFNleG8sIHZhbHVlc19mcm9tID0gSU9QX2hyKSAlPiUgDQogIG11dGF0ZShQb2JsYWNpw7NuID0gIkFzYWxhcmlhZGFzL29zIikNCg0KIyBBc2FsLiBzaW4gZGVzY3VlbnRvIGp1YmlsYXRvcmlvLiBJbmdyZXNvIGRlIGxhIE9jdXBhY2nDs24gUHJpbmNpcGFsDQp0YWJsYTIuMjIgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxLCANCiAgICAgICAgIENBVF9PQ1VQID09IDMsDQogICAgICAgICBQUDA3SCA9PSAyLA0KICAgICAgICAgUFAzRV9UT1QgPiAwLCAjIEhvcmFzIHRyYWJhamFkYXMgcG9zaXRpdmFzDQogICAgICAgICBQUDNFX1RPVCAhPSA5OTkpICU+JSANCiAgZ3JvdXBfYnkoU2V4bywgUmVnaW9uKSAlPiUgDQogICAgbXV0YXRlKFBQM0VfVE9UID0gYXMubnVtZXJpYyhnc3ViKCIsIiwgI2NhbWJpbyAiLiIgcG9yICJjb21hcyIsIiBlbiBsb3MgZGVjaW1hbGVzIHBhcmEgcG9kZXIgb3BlcmFyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDNFX1RPVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkID0gVFJVRSkpKSAlPiUgDQogIHN1bW1hcmlzZShJT1BfaHIgPSB3ZWlnaHRlZC5tZWFuKFAyMS8oUFAzRV9UT1QgKiAzMCAvIDcpLCBQT05ESUlPKSkgJT4lIA0KICBwaXZvdF93aWRlciguLCBuYW1lc19mcm9tID0gU2V4bywgdmFsdWVzX2Zyb20gPSBJT1BfaHIpICU+JSANCiAgbXV0YXRlKFBvYmxhY2nDs24gPSAiQXNhbGFyaWFkYXMvb3Mgc2luIGRlc2MuIGp1YmlsLiIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KI1RhYmxhIHBhcmEgaW5ncmVzb3MgbWVuc3VhbGVzIHBvciByZWdpw7NuIHBhc28gMg0KDQp0YWJsYTIuMjMgPC0gYmluZF9yb3dzKHRhYmxhMi4yMCwgdGFibGEyLjIxLCB0YWJsYTIuMjIpICU+JSANCiAgbXV0YXRlKEJyZWNoYSA9IHBlcmNlbnQoKChWYXJvbmVzLU11amVyZXMpL1Zhcm9uZXMpLCAxKSwNCiAgICAgICAgIE11amVyZXMgPSBmb3JtYXRvX3Blc29zKE11amVyZXMsIDApLA0KICAgICAgICAgVmFyb25lcyA9IGZvcm1hdG9fcGVzb3MoVmFyb25lcywgMCkpICU+JSANCiAgc2VsZWN0KFJlZ2lvbiwgUG9ibGFjacOzbiwgTXVqZXJlcywgVmFyb25lcywgQnJlY2hhKQ0KDQp0YWJsYTIuMjNtIDwtIHRhYmxhMi4yMyAlPiUgDQogIHNlbGVjdChjKDE6MykpICU+JSANCiAgc3ByZWFkKC4sIFJlZ2lvbiwgTXVqZXJlcykNCg0KdGFibGEyLjIzdiA8LSB0YWJsYTIuMjMgJT4lIA0KICBzZWxlY3QoYygxLCAyLCA0KSkgJT4lIA0KICBzcHJlYWQoLiwgUmVnaW9uLCBWYXJvbmVzKQ0KDQp0YWJsYTIuMjNiIDwtIHRhYmxhMi4yMyAlPiUgDQogIHNlbGVjdChjKDEsIDIsIDUpKSAlPiUgDQogIHNwcmVhZCguLCBSZWdpb24sIEJyZWNoYSkNCg0KdGFibGEyLjI0IDwtIGxlZnRfam9pbih0YWJsYTIuMjNtLCB0YWJsYTIuMjN2LCBieSA9IGMoIlBvYmxhY2nDs24iKSkgJT4lIA0KICBzZWxlY3QoUG9ibGFjacOzbiwgYE11amVyZXNgID0gYEN1eW8ueGAsIGBWYXJvbmVzYCA9IGBDdXlvLnlgLA0KICAgICAgICAgICAgICAgICAgICAgYCBNdWplcmVzYCA9IGBHcmFuIEJ1ZW5vcyBBaXJlcy54YCwgYCBWYXJvbmVzYCA9IGBHcmFuIEJ1ZW5vcyBBaXJlcy55YCwNCiAgICAgICAgICAgICAgICAgICAgYCAgTXVqZXJlc2AgPSBgTkVBLnhgLCBgICBWYXJvbmVzYCA9IGBORUEueWAsDQogICAgICAgICAgICAgICAgICAgYCAgIE11amVyZXNgID0gYE5PQS54YCwgYCAgIFZhcm9uZXNgID0gYE5PQS55YCwNCiAgICAgICAgICAgICAgICAgIGAgICAgTXVqZXJlc2AgPSBgUGFtcGVhbmEueGAsIGAgICAgVmFyb25lc2AgPSBgUGFtcGVhbmEueWAsDQogICAgICAgICAgICAgICAgIGAgICAgIE11amVyZXNgID0gYFBhdGFnb25pYS54YCwgYCAgICAgVmFyb25lc2AgPSBgUGF0YWdvbmlhLnlgKSAlPiUgDQogIGxlZnRfam9pbiguLCB0YWJsYTIuMjNiLCBieSA9IGMoIlBvYmxhY2nDs24iKSkgJT4lIA0KICBtdXRhdGUoYEJyZWNoYWAgPSBgQ3V5b2AsDQogICAgICAgICBgIEJyZWNoYWAgPSBgR3JhbiBCdWVub3MgQWlyZXNgLA0KICAgICAgICAgYCAgQnJlY2hhYCA9IGBORUFgLA0KICAgICAgICAgYCAgIEJyZWNoYWAgPSBgTk9BYCwNCiAgICAgICAgIGAgICAgQnJlY2hhYCA9IGBQYW1wZWFuYWAsDQogICAgICAgICBgICAgICBCcmVjaGFgID0gYFBhdGFnb25pYWApICU+JSANCiAgc2VsZWN0KFBvYmxhY2nDs24sDQogICAgICAgICBgTXVqZXJlc2AsIGBWYXJvbmVzYCwgYEJyZWNoYWAsDQogICAgICAgICBgIE11amVyZXNgLCBgIFZhcm9uZXNgLCBgIEJyZWNoYWAsDQogICAgICAgICBgICBNdWplcmVzYCwgYCAgVmFyb25lc2AsIGAgIEJyZWNoYWAsDQogICAgICAgICBgICAgTXVqZXJlc2AsIGAgICBWYXJvbmVzYCwgYCAgIEJyZWNoYWAsDQogICAgICAgICBgICAgIE11amVyZXNgLCBgICAgIFZhcm9uZXNgLCBgICAgIEJyZWNoYWAsDQogICAgICAgICBgICAgICBNdWplcmVzYCwgYCAgICAgVmFyb25lc2AsIGAgICAgIEJyZWNoYWApDQoNCmBgYA0KDQojIyMjIyMgQ3V5bw0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fSW5ncmVzb3MgaG9yYXJpb3MgcHJvbWVkaW8geSBicmVjaGFfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX0N1eW8uIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGEyLjI0ICU+JSANCiAgc2VsZWN0KDE6NCkgJT4lIA0KICBrYWJsZShhbGlnbiA9ICdsY2NjJykgJT4lDQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCANCiAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiXG4iID0gMSwgIk1lZGlhIGRlbCBpbmdyZXNvIGhvcmFyaW8iID0gMiwgIlxuIiA9IDEpLA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9IGZ1ZW50ZSwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICJcbiIpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiOGNtIikgJT4lIA0KICBjb2x1bW5fc3BlYyg0LCBib2xkID0gVFJVRSwgd2lkdGggPSAiNGNtIikgJT4lIA0KICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkNCg0KDQpgYGANCg0KIyMjIyMjIEdCQQ0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fSW5ncmVzb3MgaG9yYXJpb3MgcHJvbWVkaW8geSBicmVjaGFfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX0dCQS4gYHIgZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0YWJsYTIuMjQgJT4lIA0KICBzZWxlY3QoMSwgNTo3KSAlPiUgDQogIGthYmxlKGFsaWduID0gJ2xjY2MnKSAlPiUNCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIA0KICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJcbiIgPSAxLCAiTWVkaWEgZGVsIGluZ3Jlc28gaG9yYXJpbyIgPSAyLCAiXG4iID0gMSksDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuIikgJT4lIA0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI4Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDQsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI0Y20iKSAlPiUgDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKQ0KYGBgDQoNCiMjIyMjIyBORUENCjxicj48YnI+DQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX0luZ3Jlc29zIGhvcmFyaW9zIHByb21lZGlvIHkgYnJlY2hhX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19ORUEuIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGEyLjI0ICU+JSANCiAgc2VsZWN0KDEsIDg6MTApICU+JSANCiAga2FibGUoYWxpZ24gPSAnbGNjYycpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlxuIiA9IDEsICJNZWRpYSBkZWwgaW5ncmVzbyBob3JhcmlvIiA9IDIsICJcbiIgPSAxKSwNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjhjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoNCwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjRjbSIpICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KIyMjIyMjIE5PQQ0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fSW5ncmVzb3MgaG9yYXJpb3MgcHJvbWVkaW8geSBicmVjaGFfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX05PQS4gYHIgZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0YWJsYTIuMjQgJT4lIA0KICBzZWxlY3QoMSwgMTE6MTMpICU+JSANCiAga2FibGUoYWxpZ24gPSAnbGNjYycpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlxuIiA9IDEsICJNZWRpYSBkZWwgaW5ncmVzbyBob3JhcmlvIiA9IDIsICJcbiIgPSAxKSwNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjhjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoNCwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjRjbSIpICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KIyMjIyMjIFBhbXBlYW5hDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19JbmdyZXNvcyBob3JhcmlvcyBwcm9tZWRpbyB5IGJyZWNoYV9fPC9wPg0KPHAgc3R5bGU9ImNvbG9yOiNjOWM5YzkiPl9fUGFtcGVhbmEuIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGEyLjI0ICU+JSANCiAgc2VsZWN0KDEsIDE0OjE2KSAlPiUgDQogIGthYmxlKGFsaWduID0gJ2xjY2MnKSAlPiUNCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIA0KICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJcbiIgPSAxLCAiTWVkaWEgZGVsIGluZ3Jlc28gaG9yYXJpbyIgPSAyLCAiXG4iID0gMSksDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuIikgJT4lIA0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI4Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDQsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI0Y20iKSAlPiUgDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKQ0KYGBgDQoNCiMjIyMjIyBQYXRhZ29uaWENCjxicj48YnI+DQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX0luZ3Jlc29zIGhvcmFyaW9zIHByb21lZGlvIHkgYnJlY2hhX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19QYXRhZ29uaWEuIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGEyLjI0ICU+JSANCiAgc2VsZWN0KDEsIDE3OjE5KSAlPiUgDQogIGthYmxlKGFsaWduID0gJ2xjY2MnKSAlPiUNCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIA0KICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJcbiIgPSAxLCAiTWVkaWEgZGVsIGluZ3Jlc28gaG9yYXJpbyIgPSAyLCAiXG4iID0gMSksDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuIikgJT4lIA0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI4Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDQsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI0Y20iKSAlPiUgDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpybSh0YWJsYTIuMjAsIHRhYmxhMi4yMSwgdGFibGEyLjIyLCB0YWJsYTIuMjMsIHRhYmxhMi4yM2IsIHRhYmxhMi4yM20sIHRhYmxhMi4yM3YsIHRhYmxhMi4yNCkNCmBgYA0KDQoNCiMjIEhvcmFzIHRyYWJhamFkYXMNCg0KLS0tDQoNCiMjIyBIb3JhcyB0cmFiYWphZGFzDQo8YnI+PGJyPg0KDQpMYSBpZGVhIGRlIGxhICJicmVjaGEiIHRhbWJpw6luIHB1ZWRlIGFwbGljYXJzZSBwYXJhIGNvbXBhcmFyIGxhcyBob3JhcyBxdWUgdHJhYmFqYW4gZW4gcHJvbWVkaW8gbXVqZXJlcyB5IHZhcm9uZXMgZW4gc3Ugb2N1cGFjacOzbiBwcmluY2lwYWwgZW4gZWwgbWVyY2FkbyBkZSB0cmFiYWpvLCBkZSBmb3JtYSByZW11bmVyYWRhLiBEZSBhcXXDrSBzZSBkZXNwcmVuZGUgcXVlLCBlbiBwcm9tZWRpbywgbGFzIG11amVyZXMgdHJhYmFqYW4gbWVub3MgaG9yYXMgcXVlIGxvcyB2YXJvbmVzLCB5IGVzdG8gZXhwbGljYSB1bmEgcGFydGUgaW1wb3J0YW50ZSAoYXVucXVlIG5vIHRvZGEpIGRlIGxhIGJyZWNoYSBkZSBpbmdyZXNvcyBtZW5zdWFsZXMuDQo8YnI+PGJyPg0KQ2FiZSBjdWVzdGlvbmFyc2UgZW50b25jZXMgcmVzcGVjdG8gYWwgcG9yIHF1w6kgZGUgbGEgZGlmZXJlbmNpYSBkZSBob3JhcyB0cmFiYWphZGFzIHBvciBtdWplcmVzIHkgcG9yIHZhcm9uZXMuIMK/RXhpc3RlIHVuYSBmYWx0YSBkZSB2b2x1bnRhZCBkZSBsYXMgbXVqZXJlcyBwYXJhIHRyYWJhamFyPyDCv1NvbiBtw6FzICJ2YWdhcyI/IMK/TyBlbiByZWFsaWRhZCBleGlzdGUgb3RybyBtb3Rpdm8gcG9yIGVsIGN1YWwgbGFzIG11amVyZXMgZGViZW4gcmVsZWdhciBzdXMgdHJhYmFqb3MsIGRlbCBjdWFsIGxvcyB2YXJvbmVzIGVzdMOhbiBleGVudG9zPyBDb21vIHZlcmVtb3MgbcOhcyBhZGVsYW50ZSwgbG9zIGRhdG9zIHN1Z2llcmVuIHVuYSBlc3RyZWNoYSByZWxhY2nDs24gY29uIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGFzIHRhcmVhcyBkb23DqXN0aWNhcyBoYWNpYSBlbCBpbnRlcmlvciBkZSBsb3MgaG9nYXJlcy4NCjxicj48YnI+DQoNCiMjIyMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIFRvdGFsIG5hY2lvbmFsDQo8YnI+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIE9jdXBhZGVzDQp0YWJsYTMuMSA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoRVNUQURPID09IDEsDQogICAgICAgICBQUDNFX1RPVCA+IDAsICMgSG9yYXMgdHJhYmFqYWRhcyBwb3NpdGl2YXMNCiAgICAgICAgIFBQM0VfVE9UICE9IDk5OSkgJT4lIA0KICBncm91cF9ieShTZXhvKSAlPiUgDQogICAgbXV0YXRlKFBQM0VfVE9UID0gYXMubnVtZXJpYyhnc3ViKCIsIiwgI2NhbWJpbyAiLiIgcG9yICJjb21hcyIsIiBlbiBsb3MgZGVjaW1hbGVzIHBhcmEgcG9kZXIgb3BlcmFyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDNFX1RPVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkID0gVFJVRSkpKSAlPiUgDQogIHN1bW1hcmlzZShIb3JhcyA9IHdlaWdodGVkLm1lYW4oUFAzRV9UT1QsIFBPTkRFUkEpKSAlPiUgDQogIHBpdm90X3dpZGVyKC4sIG5hbWVzX2Zyb20gPSBTZXhvLCB2YWx1ZXNfZnJvbSA9IEhvcmFzKSAlPiUgDQogIG11dGF0ZShQb2JsYWNpw7NuID0gIk9jdXBhZGFzL29zIikNCg0KIyBBc2FsYXJpYWRlcw0KdGFibGEzLjIgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxLA0KICAgICAgICAgQ0FUX09DVVAgPT0gMywNCiAgICAgICAgIFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgUFAzRV9UT1QgIT0gOTk5KSAlPiUgDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgICBtdXRhdGUoUFAzRV9UT1QgPSBhcy5udW1lcmljKGdzdWIoIiwiLCAjY2FtYmlvICIuIiBwb3IgImNvbWFzIiwiIGVuIGxvcyBkZWNpbWFsZXMgcGFyYSBwb2RlciBvcGVyYXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQM0VfVE9ULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgPSBUUlVFKSkpICU+JSANCiAgc3VtbWFyaXNlKEhvcmFzID0gd2VpZ2h0ZWQubWVhbihQUDNFX1RPVCwgUE9OREVSQSkpICU+JSANCiAgcGl2b3Rfd2lkZXIoLiwgbmFtZXNfZnJvbSA9IFNleG8sIHZhbHVlc19mcm9tID0gSG9yYXMpICU+JSANCiAgbXV0YXRlKFBvYmxhY2nDs24gPSAiQXNhbGFyaWFkYXMvb3MiKQ0KDQojIEFzYWwuIHNpbiBkZXNjdWVudG8ganViaWxhdG9yaW8NCnRhYmxhMy4zIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihFU1RBRE8gPT0gMSwgDQogICAgICAgICBDQVRfT0NVUCA9PSAzLA0KICAgICAgICAgUFAwN0ggPT0gMiwNCiAgICAgICAgIFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgUFAzRV9UT1QgIT0gOTk5KSAlPiUgDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgICBtdXRhdGUoUFAzRV9UT1QgPSBhcy5udW1lcmljKGdzdWIoIiwiLCAjY2FtYmlvICIuIiBwb3IgImNvbWFzIiwiIGVuIGxvcyBkZWNpbWFsZXMgcGFyYSBwb2RlciBvcGVyYXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQM0VfVE9ULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgPSBUUlVFKSkpICU+JSANCiAgc3VtbWFyaXNlKEhvcmFzID0gd2VpZ2h0ZWQubWVhbihQUDNFX1RPVCwgUE9OREVSQSkpICU+JSANCiAgcGl2b3Rfd2lkZXIoLiwgbmFtZXNfZnJvbSA9IFNleG8sIHZhbHVlc19mcm9tID0gSG9yYXMpICU+JSANCiAgbXV0YXRlKFBvYmxhY2nDs24gPSAiQXNhbGFyaWFkYXMvb3Mgc2luIGRlc2MuIGp1YmlsLiIpDQoNCnRhYmxhMy40IDwtIGJpbmRfcm93cyh0YWJsYTMuMSwgdGFibGEzLjIsIHRhYmxhMy4zKSAlPiUgDQogIG11dGF0ZShCcmVjaGEgPSBwZXJjZW50KCgoVmFyb25lcy1NdWplcmVzKS9WYXJvbmVzKSwgMSksDQogICAgICAgICBNdWplcmVzID0gKE11amVyZXMpLA0KICAgICAgICAgVmFyb25lcyA9IChWYXJvbmVzKSkgJT4lIA0KICBzZWxlY3QoUG9ibGFjacOzbiwgTXVqZXJlcywgVmFyb25lcywgQnJlY2hhKQ0KYGBgDQoNCjxicj4NCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX0JyZWNoYXMgZGUgaG9yYXMgdHJhYmFqYWRhc19fPC9wPg0KPHAgc3R5bGU9ImNvbG9yOiNjOWM5YzkiPl9fYHIgYWdsb19kYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmthYmxlKHRhYmxhMy40LCBkaWdpdHMgPSAxLCBhbGlnbiA9ICdsY2NjJykgJT4lDQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCANCiAgICAgICAgICAgICAgICAjZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlxuIiA9IDEsICJIb3JhcyBzZW1hbmFsZXMgKG1lZGlhKSIgPSAyLCAiXG4iID0gMSksDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuIikgJT4lIA0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI4Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDQsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI0Y20iKSAlPiUgDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpybSh0YWJsYTMuMSwgdGFibGEzLjIsIHRhYmxhMy4zLCB0YWJsYTMuNCkNCmBgYA0KDQo8YnI+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQoNCiNUYWJsYSBwYXJhIGhvcmFzIHRyYWJhamFkYXMgcG9yIHJlZ2nDs24gcGFzbyAxDQoNCiMgT2N1cGFkZXMNCnRhYmxhMy41IDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihFU1RBRE8gPT0gMSwNCiAgICAgICAgIFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgUFAzRV9UT1QgIT0gOTk5KSAlPiUgDQogIGdyb3VwX2J5KFNleG8sIFJlZ2lvbikgJT4lIA0KICAgIG11dGF0ZShQUDNFX1RPVCA9IGFzLm51bWVyaWMoZ3N1YigiLCIsICNjYW1iaW8gIi4iIHBvciAiY29tYXMiLCIgZW4gbG9zIGRlY2ltYWxlcyBwYXJhIHBvZGVyIG9wZXJhcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAzRV9UT1QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCA9IFRSVUUpKSkgJT4lIA0KICBzdW1tYXJpc2UoSG9yYXMgPSB3ZWlnaHRlZC5tZWFuKFBQM0VfVE9ULCBQT05ERVJBKSkgJT4lIA0KICBwaXZvdF93aWRlciguLCBuYW1lc19mcm9tID0gU2V4bywgdmFsdWVzX2Zyb20gPSBIb3JhcykgJT4lIA0KICBtdXRhdGUoUG9ibGFjacOzbiA9ICJPY3VwYWRhcy9vcyIpDQoNCiMgQXNhbGFyaWFkZXMNCnRhYmxhMy42IDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihFU1RBRE8gPT0gMSwNCiAgICAgICAgIENBVF9PQ1VQID09IDMsDQogICAgICAgICBQUDNFX1RPVCA+IDAsICMgSG9yYXMgdHJhYmFqYWRhcyBwb3NpdGl2YXMNCiAgICAgICAgIFBQM0VfVE9UICE9IDk5OSkgJT4lIA0KICBncm91cF9ieShTZXhvLCBSZWdpb24pICU+JSANCiAgICBtdXRhdGUoUFAzRV9UT1QgPSBhcy5udW1lcmljKGdzdWIoIiwiLCAjY2FtYmlvICIuIiBwb3IgImNvbWFzIiwiIGVuIGxvcyBkZWNpbWFsZXMgcGFyYSBwb2RlciBvcGVyYXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQM0VfVE9ULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgPSBUUlVFKSkpICU+JSANCiAgc3VtbWFyaXNlKEhvcmFzID0gd2VpZ2h0ZWQubWVhbihQUDNFX1RPVCwgUE9OREVSQSkpICU+JSANCiAgcGl2b3Rfd2lkZXIoLiwgbmFtZXNfZnJvbSA9IFNleG8sIHZhbHVlc19mcm9tID0gSG9yYXMpICU+JSANCiAgbXV0YXRlKFBvYmxhY2nDs24gPSAiQXNhbGFyaWFkYXMvb3MiKQ0KDQojIEFzYWwuIHNpbiBkZXNjdWVudG8ganViaWxhdG9yaW8NCnRhYmxhMy43IDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihFU1RBRE8gPT0gMSwgDQogICAgICAgICBDQVRfT0NVUCA9PSAzLA0KICAgICAgICAgUFAwN0ggPT0gMiwNCiAgICAgICAgIFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgUFAzRV9UT1QgIT0gOTk5KSAlPiUgDQogIGdyb3VwX2J5KFNleG8sIFJlZ2lvbikgJT4lIA0KICAgIG11dGF0ZShQUDNFX1RPVCA9IGFzLm51bWVyaWMoZ3N1YigiLCIsICNjYW1iaW8gIi4iIHBvciAiY29tYXMiLCIgZW4gbG9zIGRlY2ltYWxlcyBwYXJhIHBvZGVyIG9wZXJhcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAzRV9UT1QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCA9IFRSVUUpKSkgJT4lIA0KICBzdW1tYXJpc2UoSG9yYXMgPSB3ZWlnaHRlZC5tZWFuKFBQM0VfVE9ULCBQT05ERVJBKSkgJT4lIA0KICBwaXZvdF93aWRlciguLCBuYW1lc19mcm9tID0gU2V4bywgdmFsdWVzX2Zyb20gPSBIb3JhcykgJT4lIA0KICBtdXRhdGUoUG9ibGFjacOzbiA9ICJBc2FsYXJpYWRhcy9vcyBzaW4gZGVzYy4ganViaWwuIikNCg0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQoNCiNUYWJsYSBwYXJhIGhvcmFzIHRyYWJhamFkYXMgcG9yIHJlZ2nDs24gcGFzbyAyDQoNCnRhYmxhMy44IDwtIGJpbmRfcm93cyh0YWJsYTMuNSwgdGFibGEzLjYsIHRhYmxhMy43KSAlPiUgDQogIG11dGF0ZShCcmVjaGEgPSBwZXJjZW50KCgoVmFyb25lcy1NdWplcmVzKS9WYXJvbmVzKSwgMSksDQogICAgICAgICBNdWplcmVzID0gKE11amVyZXMpLA0KICAgICAgICAgVmFyb25lcyA9IChWYXJvbmVzKSkgJT4lIA0KICBzZWxlY3QoUmVnaW9uLCBQb2JsYWNpw7NuLCBNdWplcmVzLCBWYXJvbmVzLCBCcmVjaGEpDQoNCnRhYmxhMy44bSA8LSB0YWJsYTMuOCAlPiUgDQogIHNlbGVjdChjKDE6MykpICU+JSANCiAgc3ByZWFkKC4sIFJlZ2lvbiwgTXVqZXJlcykNCg0KdGFibGEzLjh2IDwtIHRhYmxhMy44ICU+JSAgDQogIHNlbGVjdChjKDEsIDIsIDQpKSAlPiUgDQogIHNwcmVhZCguLCBSZWdpb24sIFZhcm9uZXMpDQoNCnRhYmxhMy44YiA8LSB0YWJsYTMuOCAlPiUgIA0KICBzZWxlY3QoYygxLCAyLCA1KSkgJT4lIA0KICBzcHJlYWQoLiwgUmVnaW9uLCBCcmVjaGEpDQoNCnRhYmxhMy45IDwtIGxlZnRfam9pbih0YWJsYTMuOG0sIHRhYmxhMy44diwgYnkgPSBjKCJQb2JsYWNpw7NuIikpICU+JSANCiAgc2VsZWN0KFBvYmxhY2nDs24sIGBNdWplcmVzYCA9IGBDdXlvLnhgLCBgVmFyb25lc2AgPSBgQ3V5by55YCwNCiAgICAgICAgICAgICAgICAgICAgIGAgTXVqZXJlc2AgPSBgR3JhbiBCdWVub3MgQWlyZXMueGAsIGAgVmFyb25lc2AgPSBgR3JhbiBCdWVub3MgQWlyZXMueWAsDQogICAgICAgICAgICAgICAgICAgIGAgIE11amVyZXNgID0gYE5FQS54YCwgYCAgVmFyb25lc2AgPSBgTkVBLnlgLA0KICAgICAgICAgICAgICAgICAgIGAgICBNdWplcmVzYCA9IGBOT0EueGAsIGAgICBWYXJvbmVzYCA9IGBOT0EueWAsDQogICAgICAgICAgICAgICAgICBgICAgIE11amVyZXNgID0gYFBhbXBlYW5hLnhgLCBgICAgIFZhcm9uZXNgID0gYFBhbXBlYW5hLnlgLA0KICAgICAgICAgICAgICAgICBgICAgICBNdWplcmVzYCA9IGBQYXRhZ29uaWEueGAsIGAgICAgIFZhcm9uZXNgID0gYFBhdGFnb25pYS55YCkgJT4lIA0KICBsZWZ0X2pvaW4oLiwgdGFibGEzLjhiLCBieSA9IGMoIlBvYmxhY2nDs24iKSkgJT4lIA0KICBtdXRhdGUoYEJyZWNoYWAgPSBgQ3V5b2AsDQogICAgICAgICBgIEJyZWNoYWAgPSBgR3JhbiBCdWVub3MgQWlyZXNgLA0KICAgICAgICAgYCAgQnJlY2hhYCA9IGBORUFgLA0KICAgICAgICAgYCAgIEJyZWNoYWAgPSBgTk9BYCwNCiAgICAgICAgIGAgICAgQnJlY2hhYCA9IGBQYW1wZWFuYWAsDQogICAgICAgICBgICAgICBCcmVjaGFgID0gYFBhdGFnb25pYWApICU+JSANCiAgc2VsZWN0KFBvYmxhY2nDs24sDQogICAgICAgICBgTXVqZXJlc2AsIGBWYXJvbmVzYCwgYEJyZWNoYWAsDQogICAgICAgICBgIE11amVyZXNgLCBgIFZhcm9uZXNgLCBgIEJyZWNoYWAsDQogICAgICAgICBgICBNdWplcmVzYCwgYCAgVmFyb25lc2AsIGAgIEJyZWNoYWAsDQogICAgICAgICBgICAgTXVqZXJlc2AsIGAgICBWYXJvbmVzYCwgYCAgIEJyZWNoYWAsDQogICAgICAgICBgICAgIE11amVyZXNgLCBgICAgIFZhcm9uZXNgLCBgICAgIEJyZWNoYWAsDQogICAgICAgICBgICAgICBNdWplcmVzYCwgYCAgICAgVmFyb25lc2AsIGAgICAgIEJyZWNoYWApDQoNCmBgYA0KDQojIyMjIyBDdXlvDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19CcmVjaGFzIGRlIGhvcmFzIHRyYWJhamFkYXNfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX0N1eW8uIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGEzLjkgJT4lIA0KICBzZWxlY3QoMTo0KSAlPiUgDQogIGthYmxlKGRpZ2l0cyA9IDEsIGFsaWduID0gJ2xjY2MnKSAlPiUNCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIA0KICAgICAgICAgICAgICAgICNmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiXG4iID0gMSwgIkhvcmFzIHNlbWFuYWxlcyAobWVkaWEpIiA9IDIsICJcbiIgPSAxKSwNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjhjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoNCwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjRjbSIpICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCiMjIyMjIEdCQQ0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fQnJlY2hhcyBkZSBob3JhcyB0cmFiYWphZGFzX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19HQkEuIGByIGRhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGEzLjkgJT4lIA0KICBzZWxlY3QoMSwgNTo3KSAlPiUgDQogIGthYmxlKGRpZ2l0cyA9IDEsIGFsaWduID0gJ2xjY2MnKSAlPiUNCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIA0KICAgICAgICAgICAgICAgICNmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiXG4iID0gMSwgIkhvcmFzIHNlbWFuYWxlcyAobWVkaWEpIiA9IDIsICJcbiIgPSAxKSwNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjhjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoNCwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjRjbSIpICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KIyMjIyMgTkVBDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19CcmVjaGFzIGRlIGhvcmFzIHRyYWJhamFkYXNfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX05FQS4gYHIgZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0YWJsYTMuOSAlPiUgDQogIHNlbGVjdCgxLCA4OjEwKSAlPiUgDQogIGthYmxlKGRpZ2l0cyA9IDEsIGFsaWduID0gJ2xjY2MnKSAlPiUNCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIA0KICAgICAgICAgICAgICAgICNmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiXG4iID0gMSwgIkhvcmFzIHNlbWFuYWxlcyAobWVkaWEpIiA9IDIsICJcbiIgPSAxKSwNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjhjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoNCwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjRjbSIpICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KIyMjIyMgTk9BDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19CcmVjaGFzIGRlIGhvcmFzIHRyYWJhamFkYXNfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX05PQS4gYHIgZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0YWJsYTMuOSAlPiUgDQogIHNlbGVjdCgxLCAxMToxMykgJT4lIA0KICBrYWJsZShkaWdpdHMgPSAxLCBhbGlnbiA9ICdsY2NjJykgJT4lDQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCANCiAgICAgICAgICAgICAgICAjZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlxuIiA9IDEsICJIb3JhcyBzZW1hbmFsZXMgKG1lZGlhKSIgPSAyLCAiXG4iID0gMSksDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuIikgJT4lIA0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI4Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDQsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI0Y20iKSAlPiUgDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKQ0KYGBgDQoNCiMjIyMjIFBhbXBlYW5hDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19CcmVjaGFzIGRlIGhvcmFzIHRyYWJhamFkYXNfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX1BhbXBlYW5hLiBgciBkYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMy45ICU+JSANCiAgc2VsZWN0KDEsIDE0OjE2KSAlPiUgDQogIGthYmxlKGRpZ2l0cyA9IDEsIGFsaWduID0gJ2xjY2MnKSAlPiUNCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIA0KICAgICAgICAgICAgICAgICNmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiXG4iID0gMSwgIkhvcmFzIHNlbWFuYWxlcyAobWVkaWEpIiA9IDIsICJcbiIgPSAxKSwNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiXG4iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjhjbSIpICU+JSANCiAgY29sdW1uX3NwZWMoNCwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjRjbSIpICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNbMV0pDQpgYGANCg0KIyMjIyMgUGF0YWdvbmlhDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19CcmVjaGFzIGRlIGhvcmFzIHRyYWJhamFkYXNfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX1BhdGFnb25pYS4gYHIgZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0YWJsYTMuOSAlPiUgDQogIHNlbGVjdCgxLCAxNzoxOSkgJT4lIA0KICBrYWJsZShkaWdpdHMgPSAxLCBhbGlnbiA9ICdsY2NjJykgJT4lDQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCANCiAgICAgICAgICAgICAgICAjZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlxuIiA9IDEsICJIb3JhcyBzZW1hbmFsZXMgKG1lZGlhKSIgPSAyLCAiXG4iID0gMSksDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gY29sb3Jlc1sxXSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuIikgJT4lIA0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI4Y20iKSAlPiUgDQogIGNvbHVtbl9zcGVjKDQsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI0Y20iKSAlPiUgDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBjb2xvcmVzWzFdKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpybSh0YWJsYTMuNSwgdGFibGEzLjYsIHRhYmxhMy43LCB0YWJsYTMuOCwgdGFibGEzLjhiLCB0YWJsYTMuOG0sIHRhYmxhMy44diwgdGFibGEzLjkpDQpgYGANCg0KIyMgVGFyZWFzIGRlbCBob2dhcg0KDQotLS0NCg0KIyMjIERpc3RyaWJ1Y2nDs24gZGUgbGFzIHRhcmVhcyBkb23DqXN0aWNhcw0KPGJyPjxicj4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnRhYmxhNC4xX2dyYWYgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgbGVmdF9qb2luKC4sIGJhc2VfaG9nYXIgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoQ09EVVNVLCBOUk9fSE9HQVIsIFZJSTFfMSwgVklJMV8yKSwgDQogICAgICAgICAgICBieSA9IGMoIkNPRFVTVSIsICJOUk9fSE9HQVIiKSkgJT4lIA0KICBtdXRhdGUocHJvcG9yY2lvbiA9IGNhc2Vfd2hlbihWSUkxXzEgPT0gQ09NUE9ORU5URSB8IFZJSTFfMiA9PSBDT01QT05FTlRFIH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSAlPiUgDQogIHNlbGVjdChTZXhvLCBwcm9wb3JjaW9uLCBQT05ERVJBKSAlPiUgDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgc3VtbWFyaXNlKHByb3BvcmNpb24gPSBzdW0ocHJvcG9yY2lvbipQT05ERVJBKSkgJT4lIA0KICBtdXRhdGUocHJvcG9yY2lvbiA9IHJvdW5kKHByb3BvcmNpb24vc3VtKHByb3BvcmNpb24pKjEwMCwgMCkpDQoNCmlubGluZV8yMiA8LSB0YWJsYTQuMV9ncmFmICU+JSANCiAgZmlsdGVyKFNleG8gPT0gIk11amVyZXMiKSAlPiUgDQogIHB1bGwocHJvcG9yY2lvbikNCiAgDQppbmxpbmVfMjMgPC0gdGFibGE0LjFfZ3JhZiAlPiUgDQogIGZpbHRlcihTZXhvID09ICJWYXJvbmVzIikgJT4lIA0KICBwdWxsKHByb3BvcmNpb24pDQpgYGANCg0KRWwgdHJhYmFqbyBkb23DqXN0aWNvIHN1ZWxlIHJlY2FlciBtw6FzIGVuIGxhcyBtdWplcmVzIHF1ZSBlbiBsb3MgdmFyb25lcy4gRXMgZGVjaXIsIGVzIG3DoXMgcHJvYmFibGUgcXVlIHNlYW4gZWxsYXMgbGFzIGVuY2FyZ2FkYXMgZGUgcmVhbGl6YXIgdGFyZWFzIGRlIGN1aWRhZG8geSByZXByb2R1Y2Npw7NuIHBhcmEgb3Ryb3MgbWllbWJyb3MgZGUgc3UgaG9nYXIuIEVuIGVzdG9zIGNhc29zLCBlbCB0cmFiYWpvIG5vIHNlIGNvbWVyY2lhIGVuIGVsIG1lcmNhZG8sIHNlIHJlYWxpemEgZW50cmUgcXVpZW5lcyB0aWVuZW4gdW4gdsOtbmN1bG8gcGVyc29uYWwsIHkgcG9yIGxvIHRhbnRvLCBubyBzZSByZW11bmVyYS4NCg0KRXN0ZSByZXBhcnRvIGRlc2lndWFsIGRlIGxhcyB0YXJlYXMgZG9tw6lzdGljYXMgZW50cmUgdmFyb25lcyB5IG11amVyZXMgcG9kcsOtYSBhc29jaWFyc2UgYSBsYXMgZGVzaWd1YWxkYWRlcyB2aXN0YXMgYW50ZXJpb3JtZW50ZSBlbiBsYSBjb21wb3NpY2nDs24gZGVsIG1lcmNhZG8gZGUgdHJhYmFqbyAob2JzdMOhY3Vsb3MgZW4gZWwgYWNjZXNvIGEgY2FyZ29zIGplcsOhcnF1aWNvcywgcHJlY2FyaXphY2nDs24gbGFib3JhbCwgZXRjICkgeSByZXNwb25kZSBhIHVuIGNvbmp1bnRvIGRlIG5vcm1hcyBzb2NpYWxlcyB5IGVzdGVyZW90aXBvcyBkZSBnw6luZXJvIHF1ZSBhc2lnbmFuIG1hbmRhdG9zIGRpZmVyZW5jaWFsZXMgYSB2YXJvbmVzIHkgbXVqZXJlcy4NCg0KRGljaGEgZmVtaW5pemFjacOzbiBkZSBsYXMgdGFyZWFzIGRlIGN1aWRhZG8gcGVuYWxpemEgYSBlc3RhcyDDumx0aW1hcywgaGFjaWVuZG8gcXVlIGVuZnJlbnRlbiBleHRlbnNhcyBjYXJnYXMgZGUgdHJhYmFqbyBlbiBlbCBob2dhciB5LCBwb3IgZW5kZSwgaW1wb25pZW5kbyB1bmEgZnVlcnRlIHJlc3RyaWNjacOzbiB0ZW1wb3JhbCB5IGFmZWN0YW5kbyBlbCBhY2Nlc28gYWwgbWVyY2FkbyBkZSB0cmFiYWpvIHkgYSBsYSB0cmF5ZWN0b3JpYSBsYWJvcmFsLiANCg0KPGJyPjxicj4NCg0KIyMjIyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyMgVG90YWwgbmFjaW9uYWwNCjxicj4NCg0KQSBtb2RvIGlsdXN0cmF0aXZvLCBzZSBzZcOxYWxhIHF1ZTogX19kZWwgdG90YWwgZGUgcGVyc29uYXMgcXVlIHJlYWxpemFuIHRhcmVhcyBkb23DqXN0aWNhcywgdW4gYHIgaW5saW5lXzIyYCUgc29uIG11amVyZXMgeSB1biBgciBpbmxpbmVfMjNgJSBzb24gdmFyb25lcy5fXyBFc3RvIHN1Y2VkZSBzaSB0ZW5lbW9zIGVuIGN1ZW50YSBlbCB0b3RhbCBkZSBsb3MgaG9nYXJlcywgeSBzZWd1cmFtZW50ZSBsYSBkaWZlcmVuY2lhIHNlIGFncmF2YXLDrWEgc2kgcXVpdMOhcmFtb3MgbG9zIGhvZ2FyZXMgdW5pcGVyc29uYWxlcyBkZWwgY29udGVvIHkvbyBpbmNsdXnDqXJhbW9zIGEgbGFzIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvLg0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fUGVyc29uYXMgcXVlIHJlYWxpemFuIGxhcyB0YXJlYXMgZG9tw6lzdGljYXMgZGVsIGhvZ2FyIHNlZ8O6biBzZXhvX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19ObyBpbmNsdXllIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvLiBgciBhZ2xvX2RhdGVgX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMgUHJlcCBkYXRhIChub3RoaW5nIHRvIGNoYW5nZSBoZXJlKQ0KbnJvd3MgPC0gMTANCmRmIDwtIGV4cGFuZC5ncmlkKHggPSAxOm5yb3dzLCB5ID0gMTpucm93cykNCmRmJFNleG8gPC0gZmFjdG9yKHJlcCh0YWJsYTQuMV9ncmFmJFNleG8sIHRhYmxhNC4xX2dyYWYkcHJvcG9yY2lvbikpICANCiMjIFBsb3QNCmdncGxvdChkZiwgYWVzKHggPSB4LCB5ID0geSwgZmlsbCA9IFNleG8pKSArIA0KICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41KSArDQogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCB0cmFucyA9ICdyZXZlcnNlJykgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArDQogIGxhYnMoY2FwdGlvbiA9IGZ1ZW50ZSwNCiAgICAgICB4ID0gTlVMTCwNCiAgICAgICB5ID0gTlVMTCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIGdnc2F2ZSgiR3JhZmljb3MvRmlndXJhMTQucG5nIiwgc2NhbGUgPSAzKQ0KDQojIEFxdcOtIGhheSBxdWUgY2FtYmlhciBlbCBkaXJlY3RvcmlvIGVuIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZWwgZ3LDoWZpY28uDQojZ2dzYXZlKCJGaWd1cmExNC5wbmciLCBzY2FsZSA9IDAuNywgZHBpID0gMzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBiZyA9ICIjZmZmZmZmIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGE0LjFfZ3JhZiwgZGYpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnRhYmxhNC4xIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihQUDA0QjEgPT0gMSkgJT4lIA0KICBtdXRhdGUoVG90YWwgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgZ3JvdXBfYnkoU2V4bykgJT4lIA0KICBzdW1tYXJpc2UoUHJvcG9yY2lvbiA9IHBlcmNlbnQoc3VtKFBPTkRFUkEpL3VuaXF1ZShUb3RhbCksIDEpKQ0KDQp0YWJsYTQuMiA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoRVNUQURPID09IDEsDQogICAgICAgICBTZXhvID09ICJNdWplcmVzIikgJT4lIA0KICBtdXRhdGUoc2VydmljaW8uZG9tZXN0aWNvID0gY2FzZV93aGVuKFBQMDRCMSA9PSAxIH4gIlPDrSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwNEIxICE9IDEgfiAiTm8iKSkgJT4lIA0KICBncm91cF9ieShzZXJ2aWNpby5kb21lc3RpY28pICU+JSANCiAgc3VtbWFyaXNlKGZyZWN1ZW5jaWEgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgbXV0YXRlKHByb3BvcmNpb24gPSBwZXJjZW50KGZyZWN1ZW5jaWEvc3VtKGZyZWN1ZW5jaWEpLCAxKSkNCg0KaW5saW5lXzI0IDwtIHRhYmxhNC4xICU+JSANCiAgZmlsdGVyKFNleG8gPT0gIk11amVyZXMiKSAlPiUgDQogIHB1bGwoUHJvcG9yY2lvbikNCg0KaW5saW5lXzI1IDwtIHRhYmxhNC4yICU+JSANCiAgZmlsdGVyKHNlcnZpY2lvLmRvbWVzdGljbyA9PSAiU8OtIikgJT4lIA0KICBwdWxsKHByb3BvcmNpb24pDQpgYGANCg0KQSBlc3RvIHNlIHN1bWEgZWwgaGVjaG8gZGUgcXVlIHByw6FjdGljYW1lbnRlIHRvZGFzIGxhcyBwZXJzb25hcyBxdWUgc2UgZGVkaWNhbiBhbCBzZXJ2aWNpbyBkb23DqXN0aWNvIChlcyBkZWNpciwgcXVlIHPDrSB2ZW5kZW4gZXN0ZSB0cmFiYWpvIGVuIGVsIG1lcmNhZG8pIHNvbiBtdWplcmVzLCB1biBfX2ByIGlubGluZV8yNGAuX18gQXNpbWlzbW8sIGRlbCB0b3RhbCBkZSBtdWplcmVzIG9jdXBhZGFzLCB1biBfX2ByIGlubGluZV8yNWBfXyBzZSBkZWRpY2EgYSBlc3RhIG9jdXBhY2nDs24sIGNvbmZvcm1hbmRvIGVudG9uY2VzIHVuYSBzYWxpZGEgbGFib3JhbCBwb3B1bGFyLiBQYXJhIG3DoXMgaW5mb3JtYWNpw7NuLCBwb2TDqXMgY29uc3VsdGFyIGVsIGluZm9ybWUgW0xhcyB0cmFiYWphZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljbyBlbiBBcmdlbnRpbmFdKGh0dHA6Ly9lY29ub21pYWZlbWluaXRhLmNvbS9pbmZvcm1lLXNlcnZpY2lvLWRvbWVzdGljby8pLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGE0LjEsIHRhYmxhNC4yKQ0KYGBgDQoNCiMjIyMjIFBvciByZWdpw7NuDQo8YnI+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KdGFibGE0LjMgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgbGVmdF9qb2luKC4sIGJhc2VfaG9nYXIgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoQ09EVVNVLCBOUk9fSE9HQVIsIFZJSTFfMSwgVklJMV8yKSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiQ09EVVNVIiwgIk5ST19IT0dBUiIpKSAlPiUgDQogIG11dGF0ZShwcm9wb3JjaW9uID0gY2FzZV93aGVuKFZJSTFfMSA9PSBDT01QT05FTlRFIHwgVklJMV8yID09IENPTVBPTkVOVEUgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpICU+JSANCiAgc2VsZWN0KFNleG8sIHByb3BvcmNpb24sIFBPTkRFUkEsIFJlZ2lvbikgJT4lIA0KICBncm91cF9ieShSZWdpb24sIFNleG8pICU+JSANCiAgc3VtbWFyaXNlKHByb3BvcmNpb24gPSBzdW0ocHJvcG9yY2lvbipQT05ERVJBKSkgJT4lIA0KICBtdXRhdGUocHJvcG9yY2lvbiA9IHBlcmNlbnQocm91bmQocHJvcG9yY2lvbi9zdW0ocHJvcG9yY2lvbiksMyksMSkpDQpgYGANCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fUGVyc29uYXMgcXVlIHJlYWxpemFuIGxhcyB0YXJlYXMgZG9tw6lzdGljYXMgZGVsIGhvZ2FyIHNlZ8O6biBzZXhvX188L3A+DQo8cCBzdHlsZT0iY29sb3I6I2M5YzljOSI+X19Qb3IgcmVnacOzbi4gYHIgZGF0ZWAgLiBObyBpbmNsdXllIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvX188L3A+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KZ2dwbG90KHRhYmxhNC4zLCBhZXMoeD1SZWdpb24sIHk9cHJvcG9yY2lvbiwgZmlsbD1TZXhvKSkgKw0KICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgc3RhdD0iaWRlbnRpdHkiLCB3aWR0aCA9IDAuNSkgKw0KICBnZW9tX3RleHQoDQogIHN0YXQgPSAiaWRlbnRpdHkiLA0KICBwb3NpdGlvbiA9ICJzdGFjayIsIHZqdXN0ID0yLCBzaXplID0gMywNCiAgYWVzKFJlZ2lvbiwgcHJvcG9yY2lvbiwgbGFiZWwgPSBwcm9wb3JjaW9uKSkrDQogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKw0KICBsYWJzKGNhcHRpb24gPSBmdWVudGUpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQ0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIGdnc2F2ZSgiR3JhZmljb3MvRmlndXJhMTQucG5nIiwgc2NhbGUgPSAzKQ0KDQojIEFxdcOtIGhheSBxdWUgY2FtYmlhciBlbCBkaXJlY3RvcmlvIGVuIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZWwgZ3LDoWZpY28uDQojZ2dzYXZlKCJGaWd1cmExNC5wbmciLCBzY2FsZSA9IDAuNywgZHBpID0gMzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBiZyA9ICIjZmZmZmZmIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGE0LjMpDQpgYGANCjxicj4NCg0KIyMgRGlzdHJpYnVjacOzbiBkZWwgaW5ncmVzbw0KDQotLS0NCg0KIyMjIERpc3RyaWJ1Y2nDs24gZGVsIEluZ3Jlc28NCjxicj48YnI+DQoNClRhbWJpw6luIHBvZGVtb3MgYW5hbGl6YXIgbGFzIGJyZWNoYXMgZGUgZ8OpbmVybyBlbiBsYSBkaXN0cmlidWNpw7NuIGRlIGxvcyBpbmdyZXNvcy4gDQo8YnI+PGJyPg0KDQojIyMjIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQojIyMjIyBEaXN0cmlidWNpw7NuIGRlbCBpbmdyZXNvDQo8YnI+DQpFbiBwcmltZXIgbHVnYXIsIHNlIG9yZGVuYSBwb3IgZGVjaWxlcyBhIGxhcyBwZXJzb25hcyBzZWfDum4gc3UgaW5ncmVzbyBwZXIgY8OhcGl0YSBmYW1pbGlhciAoZWwgaW5ncmVzbyB0b3RhbCBkZWwgaG9nYXIgZGl2aWRpZG8gcG9yIGxhIGNhbnRpZGFkIGRlIHBlcnNvbmFzIHF1ZSBsbyBjb21wb25lbikuIEVzIGRlY2lyLCBzZSBmb3JtYW4gZGlleiBncnVwb3MgZGUgaW5kaXZpZHVvcywgZGUgaWd1YWwgdGFtYcOxbywgb3JkZW5hZG9zIHNlZ8O6biBlbCBuaXZlbCBkZSBpbmdyZXNvcyBxdWUgbGUgY29ycmVzcG9uZGVuIHBvciBlbCBob2dhciBhbCBxdWUgcGVydGVuZWNlLiBFbiBlbCBzaWd1aWVudGUgZ3LDoWZpY28gc2UgcHVlZGUgb2JzZXJ2YXIgbGEgcHJvcG9yY2nDs24gZGUgbXVqZXJlcyB5IGRlIHZhcm9uZXMgcXVlIGZpbmFsbWVudGUgY29tcG9uZW4gY2FkYSBkZWNpbC4gDQoNCkVuIGVzdGUgY2Fzbywgbm8gaGF5IGRpZmVyZW5jaWFzIGRlc3RhY2FibGVzIG3DoXMgYWxsw6EgZGUgdW5hIGxldmUgcHJlcG9uZGVyYW5jaWEgZGUgbGFzIG11amVyZXMgZW4gdG9kb3MgbG9zIGRlY2lsZXMsIGV4cGxpY2FibGUgcG9yIGN1ZXN0aW9uZXMgZGVtb2dyw6FmaWNhcyAoaGF5IG3DoXMgbXVqZXJlcyBxdWUgdmFyb25lcyBlbiBsYSBwb2JsYWNpw7NuIGdlbmVyYWwpLiBBIHN1IHZleiwgbG9zIHJlc3VsdGFkb3MgcGFyYSBjYWRhIHJlZ2nDs24gc29uIG11eSBzaW1pbGFyZXMgYSBsb3MgZGVsIHRvdGFsIG5hY2lvbmFsLCBwb3IgbG8gY8O6YWwgbm8gcmVzdWx0YSBzaWduaWZpY2F0aXZhIHN1IHB1YmxpY2FjacOzbi4gDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19Db21wb3NpY2nDs24gc2Vnw7puIHNleG8gZGUgbG9zIGRlY2lsZXMgZGVsIGluZ3Jlc28gcGVyIGPDoXBpdGEgZmFtaWxpYXJfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX1RvdGFsIGRlIGxhIHBvYmxhY2nDs24uIGByIGFnbG9fZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KdGFibGE1LjFfZ3JhZiA8LWJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIHNlbGVjdChERUNDRlIsIElQQ0YsIFBPTkRJSCwgU2V4bykgJT4lIA0KICBtdXRhdGUoREVDQ0ZSID0gYXMubnVtZXJpYyhERUNDRlIpKSAlPiUgDQogIGZpbHRlcihERUNDRlIgJWluJSBjKDE6MTApKSAlPiUgDQogIGdyb3VwX2J5KERFQ0NGUikgJT4lIA0KICBtdXRhdGUoUG9iID0gc3VtKFBPTkRJSCkpICU+JSANCiAgZ3JvdXBfYnkoREVDQ0ZSLCBTZXhvKSAlPiUNCiAgc3VtbWFyaXNlKFByb3AgPSBzdW0oUE9ORElIKS91bmlxdWUoUG9iKSkNCg0KZ2dwbG90KHRhYmxhNS4xX2dyYWYsIGFlcyh4ID0gYXMubnVtZXJpYyhERUNDRlIpLCBQcm9wLCBmaWxsID0gU2V4bywgZ3JvdXAgPSBTZXhvLCBsYWJlbCA9IHBlcmNlbnQoUHJvcCwgMCkpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwgdmp1c3QgPS0uMSwgc2l6ZSA9IDIuNSkgKw0KICBsYWJzKHkgPSAnJykgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArDQogIHNjYWxlX3hfY29udGludW91cygiRGVjaWwgZGVsIGluZ3Jlc28gcGVyIGPDoXBpdGEgZmFtaWxpYXIiLCBicmVha3MgPSBjKDE6MTApKSArDQogIGxhYnMoY2FwdGlvbiA9IGZ1ZW50ZSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQogICAgICAgICAgICAgDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgZ2dzYXZlKCJHcmFmaWNvcy9GaWd1cmExNS5wbmciLCBzY2FsZSA9IDEpDQoNCiMgQXF1w60gaGF5IHF1ZSBjYW1iaWFyIGVsIGRpcmVjdG9yaW8gZW4gcXVlIHNlIHZhIGEgZ3VhcmRhciBlbCBncsOhZmljby4NCiNnZ3NhdmUoIkZpZ3VyYTE1LnBuZyIsIHNjYWxlID0gMC43LCBkcGkgPSAzMDAsIHdpZHRoID0gMTAsIGhlaWdodCA9IDcsIGJnID0gIiNmZmZmZmYiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpybSh0YWJsYTUuMV9ncmFmKQ0KYGBgDQoNCkVuIHNlZ3VuZG8gbHVnYXIsIHNlIHNlcGFyYSBhIGxhIHBvYmxhY2nDs24gZW4gZGVjaWxlcyBzZWfDum4gZWwgaW5ncmVzbyB0b3RhbCBpbmRpdmlkdWFsLiBFcyBkZWNpciwgc2Ugb3JkZW5hIGVuIGJhc2UgYWwgbml2ZWwgZGUgaW5ncmVzb3MgcXVlIHBlcmNpYmUgY2FkYSBpbmRpdmlkdW8sIG5vIGVsIGhvZ2FyIChjYXNvIGFudGVyaW9yKS4gRW4gZXN0ZSBjYXNvIHB1ZWRlIHZlcnNlIHF1ZSBsb3MgZGVjaWxlcyBtw6FzIGJham9zIGRlIGluZ3Jlc29zIGVzdMOhbiBjb21wdWVzdG9zIG1heW9yaXRhcmlhbWVudGUgcG9yIG11amVyZXMgeSwgZW4gcGFyYWxlbG8sIGxvcyBkZWNpbGVzIGRlIG1heW9yZXMgaW5ncmVzb3Mgc2UgY29tcG9uZW4gbWF5b3JpdGFyaWFtZW50ZSBwb3IgdmFyb25lcy4gDQpEZWNpbW9zIGVudG9uY2VzIHF1ZSBsb3MgZXN0cmF0b3MgZGUgbWVub3JlcyBpbmdyZXNvcyBlc3TDoW4gZmVtaW5pemFkb3MsIGFsIHRpZW1wbyBxdWUgbG9zIGVzdHJhdG9zIGRlIG1heW9yZXMgaW5ncmVzb3Mgc2UgZW5jdWVudHJhbiBtYXNjdWxpbml6YWRvcy4gDQpFbiBlc3RlIGNhc28gdGFtYmnDqW4sIGxvcyByZXN1bHRhZG8gcGFyYSBjYWRhIHJlZ2nDs24gc29uIG11eSBzaW1pbGFyZXMgYSBsb3MgZGVsIHRvdGFsIG5hY2lvbmFsLCBwb3IgbG8gY8O6YWwgbm8gcmVzdWx0YSBzaWduaWZpY2F0aXZhIHN1IHB1YmxpY2FjacOzbi4gDQo8YnI+PGJyPg0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19Db21wb3NpY2nDs24gc2Vnw7puIHNleG8gZGUgbG9zIGRlY2lsZXMgZGUgaW5ncmVzb3MgdG90YWxlcyBpbmRpdmlkdWFsZXNfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX1BvYmxhY2nDs24gcGVyY2VwdG9yYSBkZSBpbmdyZXNvcy4gYHIgYWdsb19kYXRlYF9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQp0YWJsYTUuMl9ncmFmIDwtYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgc2VsZWN0KERFQ0lORFIsIFA0N1QsIFBPTkRJSSwgU2V4bykgJT4lIA0KICBtdXRhdGUoREVDSU5EUiA9IGFzLm51bWVyaWMoREVDSU5EUikpICU+JSANCiAgZmlsdGVyKERFQ0lORFIgJWluJSBjKDE6MTApKSAlPiUgDQogIGdyb3VwX2J5KERFQ0lORFIpICU+JSANCiAgbXV0YXRlKFBvYiA9IHN1bShQT05ESUkpKSAlPiUgDQogIGdyb3VwX2J5KERFQ0lORFIsIFNleG8pICU+JQ0KICBzdW1tYXJpc2UoUHJvcCA9IHN1bShQT05ESUkpL3VuaXF1ZShQb2IpKQ0KDQpnZ3Bsb3QodGFibGE1LjJfZ3JhZiwgYWVzKHggPSBhcy5udW1lcmljKERFQ0lORFIpLCBQcm9wLCBmaWxsID0gU2V4bywgZ3JvdXA9IFNleG8sIGxhYmVsID0gcGVyY2VudChQcm9wLCAwKSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksIHZqdXN0ID0tLjEsIHNpemUgPSAyLjUpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh5ID0gJycpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoIkRlY2lsIGRlIGluZ3Jlc28gdG90YWwgaW5kaXZpZHVhbCIsIGJyZWFrcyA9YygxOjEwKSkgKw0KICBsYWJzKGNhcHRpb24gPSBmdWVudGUpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIGdnc2F2ZSgiR3JhZmljb3MvRmlndXJhMTYucG5nIiwgc2NhbGUgPSAxKQ0KDQojIEFxdcOtIGhheSBxdWUgY2FtYmlhciBlbCBkaXJlY3RvcmlvIGVuIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZWwgZ3LDoWZpY28uDQojZ2dzYXZlKCJGaWd1cmExNi5wbmciLCBzY2FsZSA9IDAuNywgZHBpID0gMzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBiZyA9ICIjZmZmZmZmIikNCmBgYA0KDQrCv0N1w6FsIGVzIGxhIGRpZmVyZW5jaWEgZW50cmUgbG9zIGdyw6FmaWNvcyBwcmVzZW50YWRvcz8gRW4gZWwgcHJpbWVyIGdyw6FmaWNvLCBsYXMgdW5pZGFkZXMgZGUgYW7DoWxpc2lzIHNvbiBsb3MgaG9nYXJlcywgc8OzbG8gcXVlIHNlIGRpc3RyaWJ1eWVyb24gZGUgZm9ybWEgInBhcmVqYSIgc3VzIGluZ3Jlc29zIGVudHJlIGxvcyBtaWVtYnJvcy4gRGUgZXN0YSBmb3JtYSwgbGEgY29tcG9zaWNpw7NuIHBvciBzZXhvIGRlIGxvcyBlc3RyYXRvcyBkZSBtZW5vcmVzIGluZ3Jlc29zIG5vIHRpZW5lIG1heW9yZXMgZGlmZXJlbmNpYXMgcmVzcGVjdG8gYSBsYSBkZSBsb3MgZXN0cmF0b3MgZGUgbWF5b3JlcyBpbmdyZXNvcy4gRW4gY2FtYmlvLCBlbiBlbCBzZWd1bmRvIGdyw6FmaWNvIGRlIGVzdGEgc2VjY2nDs24gdmVtb3MgbG8gcXVlIHBhc2EgYSBuaXZlbCBpbmRpdmlkdWFsLCBsbyBjdWFsIGVzIHVuYSBmb3JtYSBkZSAiYWJyaXIiIGhhY2lhIGVsIGludGVyaW9yIGRlIGxvcyBob2dhcmVzLiBMYSB1bmlkYWQgZmFtaWxpYXIgcGFyZWNlIHJlc29sdmVyIGxhIGRpZmVyZW5jaWEgZW50cmUgc2V4b3MsIHBlcm8gZGVudHJvIGRlIGxvcyBob2dhcmVzIGxhIGRpZmVyZW5jaWEgc2UgbWFudGllbmU6IGxvcyB2YXJvbmVzIHRpZW5lbiBtw6FzIHByb2JhYmlsaWRhZGVzIGRlIGdhbmFyIG3DoXMgcXVlIGxhcyBtdWplcmVzIGRlbCBtaXNtbyBob2dhci4gTGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgaW5ncmVzb3MgZGUgbGFzIG11amVyZXMsIHNlc2dhZGEgaGFjaWEgbG9zIG1lbm9yZXMgaW5ncmVzb3MsIHNlIGNvbXBlbnNhIGVuIGxhIGVzdHJ1Y3R1cmEgZmFtaWxpYXIgY29uIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGluZ3Jlc29zIGRlIGxvcyB2YXJvbmVzLCBzZXNnYWRhIGhhY2lhIGxvcyBtYXlvcmVzIGluZ3Jlc29zLg0KRW50b25jZXMsIF9sYSBmYW1pbGlhIGNvbW8gdW5pZGFkIGRlIHJlcHJvZHVjY2nDs24gZXNjb25kZSB5IHJlc3VlbHZlIGRlYmFqbyBkZSBsYSBzdXBlcmZpY2llIChsYSBkaXN0cmlidWNpw7NuIGFwYXJlbnRlbWVudGUgZXF1aXRhdGl2YSBzZWfDum4gbG9zIGluZ3Jlc29zIHBlciBjw6FwaXRhKSBsYSBpbmVxdWl0YXRpdmEgZGlzdHJpYnVjacOzbiBkZSBsYXMgdGFyZWFzIGRlIHJlcHJvZHVjY2nDs24geSBsYXMgZGlmaWN1bHRhZGVzIGFzb2NpYWRhcyBxdWUgdGllbmVuIGxhcyBtdWplcmVzIHBhcmEgcGFydGljaXBhciBkZSBmb3JtYSBwbGVuYSBlbiBlbCBtZXJjYWRvIGRlIHRyYWJham8geSBwb3IgdGFudG8gcGVyY2liaXIgaW5ncmVzb3Mgc2VtZWphbnRlcyBhIGxvcyBkZSBsb3MgdmFyb25lcy5fIA0KICAgICAgDQo8YnI+DQoNCiMjIyMjIEhvZ2FyZXMgbW9ub21hcmVudGFsZXMNCjxicj4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQp0YWJsYTUuM19ncmFmIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihIMTUgPT0xKSAlPiUgDQogIG11dGF0ZShERUNDRlIgPSBhcy5udW1lcmljKERFQ0NGUikpICU+JSANCiAgZmlsdGVyKERFQ0NGUiAlaW4lIGMoMToxMCkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShERUNDRlIpKSAlPiUgDQogIG11dGF0ZShjb255dWdlID0gY2FzZV93aGVuKENIMDMgPT0gMiB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lIA0KICBtdXRhdGUobWVub3Jlcz0gY2FzZV93aGVuIChDSDAzID09IDMgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSAlPiUNCiAgbXV0YXRlKGhpamVzID0gY2FzZV93aGVuKENIMDMgPT0gMyB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpICU+JQ0KICBncm91cF9ieShDT0RVU1UsIE5ST19IT0dBUikgJT4lIA0KICBtdXRhdGUoY29ueXVnZUggPSBzdW0oY29ueXVnZSksDQogICAgICAgICBtZW5vcmVzSCA9IHN1bShtZW5vcmVzKSwNCiAgICAgICAgIGhpamVzSCA9IHN1bShoaWplcyksDQogICAgICAgICBKZWZlID0gY2FzZV93aGVuKENIMDMgPT0gMSAmIENIMDQgPT0gMSB+ICJWYXJvbmVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ0gwMyA9PSAxICYgQ0gwNCA9PSAyIH4gIk11amVyZXMiKSkgJT4lDQogIGZpbHRlcighaXMubmEoSmVmZSkpICU+JSANCiAgc3VtbWFyaXNlKG1vbm9wYXJlbnRhbCA9IGNhc2Vfd2hlbihtZW5vcmVzSCAhPSAwICYgY29ueXVnZUggPT0gMCAmIGhpamVzSCAhPSAwIH4gMSAsDQogICAgICAgICAgICBUUlVFIH4wKSwNCiAgICAgICAgICAgIERFQ0NGUiA9IHVuaXF1ZShERUNDRlIpLA0KICAgICAgICAgICAgSmVmZSA9IEplZmUsDQogICAgICAgICAgICBQT05ESUggPSB1bmlxdWUoUE9ORElIKSkgJT4lIA0KICBncm91cF9ieShERUNDRlIsIG1vbm9wYXJlbnRhbCwgSmVmZSkgJT4lIA0KICBzdW1tYXJpc2UoY2Fzb3MgPSBzdW0oUE9ORElIKSkgJT4lIA0KICBncm91cF9ieShERUNDRlIpICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKGNhc29zKSwNCiAgICAgICAgIFByb3AgPSAoY2Fzb3MvdG90YWwpKjEwMCkgJT4lIA0KICBmaWx0ZXIobW9ub3BhcmVudGFsID09IDEpICU+JSANCiAgc3VtbWFyaXNlKERFQ0NGUiwgDQogICAgICAgICAgICBKZWZlLA0KICAgICAgICAgICAgUHJvcCA9IFByb3AvMTAwKQ0KDQppbmxpbmVfMjggPC0gdGFibGE1LjNfZ3JhZiAlPiUgDQogIGZpbHRlcihERUNDRlIgPT0gMSwgSmVmZSA9PSAiTXVqZXJlcyIpICU+JQ0KICBtdXRhdGUoUHJvcCA9IGZvcm1hdG9fcG9yYyhQcm9wKjEwMCkpICU+JSANCiAgcHVsbChQcm9wKQ0KDQppbmxpbmVfMjkgPC0gdGFibGE1LjNfZ3JhZiAlPiUgDQogIGZpbHRlcihERUNDRlIgPT0gMSwgSmVmZSA9PSAiVmFyb25lcyIpICU+JQ0KICBtdXRhdGUoUHJvcCA9IGZvcm1hdG9fcG9yYyhQcm9wKjEwMCkpICU+JSANCiAgcHVsbChQcm9wKQ0KDQppbmxpbmVfMzAgPC0gdGFibGE1LjNfZ3JhZiAlPiUgDQogIGdyb3VwX2J5KERFQ0NGUikgJT4lIA0KICBzdW1tYXJpc2UoUHJvcCA9IHN1bShQcm9wKSkgJT4lIA0KICBmaWx0ZXIoREVDQ0ZSID09IDEpICU+JQ0KICBtdXRhdGUoUHJvcCA9IGZvcm1hdG9fcG9yYyhQcm9wKjEwMCkpICU+JSANCiAgcHVsbChQcm9wKQ0KICANCmlubGluZV8zMSA8LSB0YWJsYTUuM19ncmFmICU+JSANCiAgZ3JvdXBfYnkoREVDQ0ZSKSAlPiUgDQogIHN1bW1hcmlzZShQcm9wID0gc3VtKFByb3ApKSAlPiUgDQogIGZpbHRlcihERUNDRlIgPT0gMTApICU+JQ0KICBtdXRhdGUoUHJvcCA9IGZvcm1hdG9fcG9yYyhQcm9wKjEwMCkpICU+JSANCiAgcHVsbChQcm9wKQ0KYGBgDQoNCkxvcyBob2dhcmVzIG1vbm9tYXBhcmVudGFsZXMgc29uIGFxdWVsbG9zIGNvbiB1biBzb2xvIGplZmUvYSBkZSBob2dhciwgc2luIGPDs255dWdlIHkgY29uIG1lbm9yZXMgYSBjYXJnby4gTG9zIGxsYW1hbW9zIG1vbm9tYXJlbnRhbGVzIGN1YW5kbyBsYSBqZWZhIGRlIGhvZ2FyIGVzIG11amVyLCB5IG1vbm9wYXJlbnRhbCBjdWFuZG8gZWwgamVmZSBlcyB2YXLDs24uIA0KDQpFbiBlbCBncsOhZmljbyBwcmVzZW50YWRvIHNlIGV2aWRlbmNpYSBxdWUgbG9zIGhvZ2FyZXMgbW9ub21hcGFyZW50YWxlcyBzZSBjb25jZW50cmFuIGVuIGxvcyBkZWNpbGVzIGRlIG1lbm9yZXMgaW5ncmVzb3MuIEFkZW3DoXMsIHNpIGNvbnNpZGVyYW1vcyBlbCBzZXhvIGRlbCBqZWZlL2EgZGUgaG9nYXIgb2JzZXJ2YW1vcyBxdWUgbG9zIG3DoXMgY29uY2VudHJhZG9zIGVuIGxvcyBwcmltZXJvcyBkZWNpbGVzIChkZSBtZW5vcmVzIGluZ3Jlc29zKSBzb24gbG9zIHF1ZSBfX3RpZW5lbiBqZWZhdHVyYSBmZW1lbmluYV9fLiANCg0KQ29tbyBzZSBsZWUgZW4gZWwgZ3LDoWZpY28sIGRlbCB0b3RhbCBkZSBob2dhcmVzIGRlbCBwcmltZXIgZGVjaWwsIHVuIGByIGlubGluZV8yOGAlIHNvbiBob2dhcmVzIG1vbm9tYXJlbnRhbGVzLCB5IHVuIGByIGlubGluZV8yOWAlIHNvbiBob2dhcmVzIG1vbm9wYXJlbnRhbGVzLCBjb24gbG8gY3VhbCBsYSBzdW1hIGRlIGhvZ2FyZXMgY29uIHVuIHNvbG8gamVmZS9hIGRlIGhvZ2FyLCBzaW4gY8Ozbnl1Z2UgeSBjb24gbWVub3JlcyBhIGNhcmdvIHRvdGFsaXphIGVsIGByIGlubGluZV8zMGAlIGRlIGxvcyBob2dhcmVzLiBFbiBjYW1iaW8sIGVuIGVsIGTDqWNpbW8gZGVjaWwsIGxhIHN1bWEgZGUgZXN0ZSB0aXBvIGRlIGhvZ2FyZXMgcmVwcmVzZW50YSBzb2xvIGVsIGByIGlubGluZV8zMWAlIGRlbCB0b3RhbC4gDQoNCkN1YW5kbyBzZSBoYWJsYSBkZSBmZW1pbml6YWNpw7NuIGRlIGxhIHBvYnJlemEgc2UgcHVlZGUgcmVmZXJpciBhIGxhIG1heW9yIGluY2lkZW5jaWEgY3VhbnRpdGF0aXZhIGRlIGxhIHBvYnJlemEgZW4gbGFzIG11amVyZXMgcmVzcGVjdG8gYSBsb3MgdmFyb25lcyAocXVlIHNlIHB1ZWRlIG9ic2VydmFyIGVuIGxhIHNlY2Npw7NuICJQb2JyZXphIik7IGEgbGEgZGlmZXJlbnRlIG1hbmVyYSBlbiBxdWUgdmFyb25lcyB5IG11amVyZXMgdml2ZW4gbGFzIHNpdHVhY2lvbmVzIGRlIHBvYnJlemEgeSBsYSBlbmZyZW50YW47IGNvbW8gYSBsYSB2dWxuZXJhYmlsaWRhZCBhIGxhIHBvYnJlemEgZGUgbGFzIG11amVyZXMgamVmYXMgZGUgaG9nYXIsIG8gZGUgbG9zIGhvZ2FyZXMgY29tYW5kYWRvcyBwb3IgbXVqZXJlcyAocXVlIHNlIG9ic2VydmEgZW4gZWwgZ3LDoWZpY28pLg0KPGJyPjxicj4NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fSG9nYXJlcyBtb25vbWFyZW50YWxlcyB5IG1vbm9wYXJlbnRhbGVzIHNvYnJlIGVsIHRvdGFsIGRlIGhvZ2FyZXMgcG9yIGRlY2lsIGRlIGluZ3Jlc28gdG90YWwgZmFtaWxpYXJfXzwvcD4NCjxwIHN0eWxlPSJjb2xvcjojYzljOWM5Ij5fX1RvdGFsIGRlIGxhIHBvYmxhY2nDs24uIGByIGFnbG9fZGF0ZWBfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KZ2dwbG90KHRhYmxhNS4zX2dyYWYsIGFlcyh4ID0gYXMubnVtZXJpYyhERUNDRlIpLCBQcm9wLCBmaWxsID0gSmVmZSwgZ3JvdXA9IEplZmUsIGxhYmVsID0gcGVyY2VudChQcm9wLCAwKSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksIHZqdXN0ID0tLjEsIHNpemUgPSAyLjUpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh5ID0gJycpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoIkRlY2lsIGRlIGluZ3Jlc28gdG90YWwgZmFtaWxpYXIiLCBicmVha3MgPWMoMToxMCkpICsNCiAgbGFicyhjYXB0aW9uID0gZnVlbnRlKQ0KICANCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGE1LjJfZ3JhZiwgdGFibGE1LjNfZ3JhZikNCmBgYA0KDQojIyBQb2JyZXphIHsjcG9icmV6YX0NCg0KLS0tDQoNCiMjIyBQb2JyZXphey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQo8YnI+PGJyPg0KDQpMYSBkZWZpbmljacOzbiBtw6FzIGZyZWN1ZW50ZSB1dGlsaXphZGEgcGFyYSBoYWJsYXIgZGUgcG9icmV6YSBlcyBsYSBtb25ldGFyaWEsIGxhIGN1YWwgc2UgY2VudHJhIGVuIGxhIGNhcGFjaWRhZCAobyBubykgcXVlIHRlbmdhbiBsb3MgaG9nYXJlcyBwYXJhIGN1YnJpciBjaWVydGFzIG5lY2VzaWRhZGVzIG1hdGVyaWFsZXMgYSBwYXJ0aXIgZGUgc3VzIGluZ3Jlc29zLiBFbiBBcmdlbnRpbmEsIGxhIGZvcm1hIGRlIG1lZGljacOzbiBkZSBsYSBwb2JyZXphIHV0aWxpemFkYSBvZmljaWFsbWVudGUgc2UgY29ub2NlIGNvbW8gbcOpdG9kbyBpbmRpcmVjdG8gbyDigJxsw61uZWHigJ0sIGVsIGN1YWwgcHJvY3VyYSBkZWZpbmlyIHNpIGxvcyBob2dhcmVzIGN1ZW50YW4gY29uIGluZ3Jlc29zIHN1ZmljaWVudGVzIHBhcmEgY3VicmlyIHVuYSBjYW5hc3RhIGRlIGFsaW1lbnRvcyBsbGFtYWRhIENhbmFzdGEgQsOhc2ljYSBBbGltZW50YXJpYSB5L28gb3Ryb3MgY29uc3Vtb3MgYsOhc2ljb3Mgbm8gYWxpbWVudGFyaW9zIHF1ZSBjb25mb3JtYW4gdW5hIENhbmFzdGEgQsOhc2ljYSBUb3RhbC4gRXN0YXMgY2FuYXN0YXMgc29uIGEgc3UgdmV6IGNvbXBhcmFkYXMgY29uIGxvcyBpbmdyZXNvcyB0b3RhbGVzIGRlbCBob2dhciwgcGVybWl0aWVuZG8gY2xhc2lmaWNhcmxvcyBjb21vIF9ubyBwb2JyZXNfLCBfcG9icmVzXyBvIF9pbmRpZ2VudGVzXywgZXh0ZW5kacOpbmRvc2UgZXNhIGNhcmFjdGVyaXphY2nDs24gYSBjYWRhIHVuYSBkZSBsYXMgcGVyc29uYXMgcXVlIGxvcyBpbnRlZ3Jhbi4NCjxicj4NCg0KLS0tDQoNCiMjIyMgVG90YWwgbmFjaW9uYWwNCjxicj4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIENhcmdhbW9zIGxhcyBDQkEgeSBDQlQNCmNhbmFzdGFzIDwtIGdldF9wb3ZlcnR5X2xpbmVzKHJlZ2lvbmFsID0gVFJVRSkNCg0KIyBjb25kaWNpb25hbCBwYXJhIHF1ZSBzZSBtdWVzdHJlIGxhIHNlY2Npb24gc2kgaGF5IGNhbmFzdGFzIGRpc3BvbmlibGVzDQpkYXRlX3RyaW1lc3RyZSA8LSBwYXN0ZShiYXNlX2luZGl2aWR1YWwkQU5PNFsxXSwgYmFzZV9pbmRpdmlkdWFsJFRSSU1FU1RSRVsxXSwgc2VwID0gIi4iKQ0Kc2hvdy5wb2JyZXphIDwtIG5yb3coY2FuYXN0YXMgJT4lIGZpbHRlcihwZXJpb2RvPT1kYXRlX3RyaW1lc3RyZSkpPjANCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmlmKHNob3cucG9icmV6YSl7DQogIA0KICAjIENhbGN1bGFtb3MgcG9icmV6YSBlIGluZGlnZW5jaWEgcG9yIG1ldG9kbyB0cmFkaWNpb25hbA0KICB0YWJsYTYuMSA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICAgIGNhbGN1bGF0ZV9wb3ZlcnR5KC4sIGJhc2tldCA9IGNhbmFzdGFzLCBwcmludF9zdW1tYXJ5ID0gRkFMU0UpICU+JQ0KICAgIGZpbHRlcihFU1RBRE8gPT0gMSwNCiAgICAgICAgICAgUFAzRV9UT1QgPiAwLCAjIEhvcmFzIHRyYWJhamFkYXMgcG9zaXRpdmFzDQogICAgICAgICAgIFBQM0VfVE9UICE9IDk5OSwNCiAgICAgICAgICAgUDIxID4gMCkNCiAgDQogICMgQ2FsY3VsYW1vcyBwb2JyZXphIGUgaW5kaWdlbmNpYSBwb3IgaW5ncmVzbyB0b3RhbCBpbmRpdmlkdWFsDQogIHRhYmxhNi4yIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogICAgZmlsdGVyKEVTVEFETyA9PSAxLA0KICAgICAgICAgICBQUDNFX1RPVCA+IDAsICMgSG9yYXMgdHJhYmFqYWRhcyBwb3NpdGl2YXMNCiAgICAgICAgICAgUFAzRV9UT1QgIT0gOTk5LA0KICAgICAgICAgICBQMjEgPiAwLA0KICAgICAgICAgICBQNDdUICE9IC05KSAlPiUgI0lUSQ0KICAgIG11dGF0ZShwZXJpb2RvID0gcGFzdGUoQU5PNCwgVFJJTUVTVFJFLCBzZXAgPSAiLiIpKSAlPiUgDQogICAgbGVmdF9qb2luKGVwaDo6YWR1bHRvX2VxdWl2YWxlbnRlLCBieSA9IGMoIkNIMDQiLCAiQ0gwNiIpKSAlPiUgDQogICAgbGVmdF9qb2luKGNhbmFzdGFzLCBieSA9IGMoUkVHSU9OID0gImNvZGlnbyIsICJwZXJpb2RvIikpICU+JSANCiAgICBtdXRhdGUoQ0JBX2luZGl2aWR1YWwgPSBDQkEgKiBhZGVxdWksIA0KICAgICAgICAgICBDQlRfaW5kaXZpZHVhbCA9IENCVCAqIGFkZXF1aSwgDQogICAgICAgICAgIHNpdHVhY2lvbiA9IGNhc2Vfd2hlbihQNDdUIDwgQ0JBX2luZGl2aWR1YWwgfiAiaW5kaWdlbnRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQNDdUID49IENCQV9pbmRpdmlkdWFsICYgUDQ3VCA8IENCVF9pbmRpdmlkdWFsIH4gInBvYnJlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQNDdUID49IENCVF9pbmRpdmlkdWFsIH4gIm5vX3BvYnJlIiksIA0KICAgICAgICAgICBzaXR1YWNpb24gPSBjYXNlX3doZW4oUE9ORElJID09IDAgfiBOQV9jaGFyYWN0ZXJfLCBUUlVFIH4gc2l0dWFjaW9uKSkgJT4lIA0KICAgIHNlbGVjdCgtYWRlcXVpLCAtcGVyaW9kbywgLUNCQSwgLUNCVCkgDQogIA0KICANCiAgdGFibGE2LjFfZ3JhZiA8LSB0YWJsYTYuMSAlPiUgDQogICAgZ3JvdXBfYnkoU2V4bykgJT4lIA0KICAgIHN1bW1hcmlzZSgNCiAgICAgIFBvYnJlemEgPSByb3VuZChzdW0oUE9ORElIW3NpdHVhY2lvbiAlaW4lIGMoInBvYnJlIiwiaW5kaWdlbnRlIildLCBuYS5ybSA9IFRSVUUpL3N1bShQT05ESUgsIG5hLnJtID0gVFJVRSkqMTAwLCAyKSwgDQogICAgICBJbmRpZ2VuY2lhID0gcm91bmQoc3VtKFBPTkRJSFtzaXR1YWNpb24gPT0gImluZGlnZW50ZSJdLCBuYS5ybSA9IFRSVUUpL3N1bShQT05ESUgsIG5hLnJtID0gVFJVRSkqMTAwLCAyKSkgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGMoUG9icmV6YSwgSW5kaWdlbmNpYSksDQogICAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IFNleG8pICU+JQ0KICAgIG11dGF0ZShCcmVjaGFfUG9icmV6YSA9IHJvdW5kKFBvYnJlemFfTXVqZXJlcy1Qb2JyZXphX1Zhcm9uZXMsIDEpLA0KICAgICAgICAgICBCcmVjaGFfSW5kaWdlbmNpYSA9IHJvdW5kKEluZGlnZW5jaWFfTXVqZXJlcy1JbmRpZ2VuY2lhX1Zhcm9uZXMsIDEpLA0KICAgICAgICAgICBNZXRvZG9sb2fDrWEgPSAiSG9nYXIiKQ0KICANCiAgdGFibGE2LjJfZ3JhZiA8LSB0YWJsYTYuMiAlPiUgDQogICAgZ3JvdXBfYnkoU2V4bykgJT4lIA0KICAgIHN1bW1hcmlzZSgNCiAgICAgIFBvYnJlemEgPSByb3VuZChzdW0oUE9ORElIW3NpdHVhY2lvbiAlaW4lIGMoInBvYnJlIiwiaW5kaWdlbnRlIildLCBuYS5ybSA9IFRSVUUpL3N1bShQT05ESUgsIG5hLnJtID0gVFJVRSkqMTAwLCAyKSwgDQogICAgICBJbmRpZ2VuY2lhID0gcm91bmQoc3VtKFBPTkRJSFtzaXR1YWNpb24gPT0gImluZGlnZW50ZSJdLCBuYS5ybSA9IFRSVUUpL3N1bShQT05ESUgsIG5hLnJtID0gVFJVRSkqMTAwLCAyKSkgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGMoUG9icmV6YSwgSW5kaWdlbmNpYSksDQogICAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IFNleG8pICU+JQ0KICAgIG11dGF0ZShCcmVjaGFfUG9icmV6YSA9IHJvdW5kKFBvYnJlemFfTXVqZXJlcy1Qb2JyZXphX1Zhcm9uZXMsIDEpLA0KICAgICAgICAgICBCcmVjaGFfSW5kaWdlbmNpYSA9IHJvdW5kKEluZGlnZW5jaWFfTXVqZXJlcy1JbmRpZ2VuY2lhX1Zhcm9uZXMsIDEpLA0KICAgICAgICAgICAjIHhwID0gUG9icmV6YV9NdWplcmVzLShCcmVjaGFfUG9icmV6YS8yKSwNCiAgICAgICAgICAgIyB4aSA9IEluZGlnZW5jaWFfTXVqZXJlcy0oQnJlY2hhX0luZGlnZW5jaWEvMiksDQogICAgICAgICAgIE1ldG9kb2xvZ8OtYSA9ICJJbmRpdmlkdWFsIikNCiAgDQogIHRhYmxhNi4xX2dyYWYgPC0gYmluZF9yb3dzKHNlbGVjdCh0YWJsYTYuMV9ncmFmLCBNZXRvZG9sb2fDrWEsIEJyZWNoYV9Qb2JyZXphLCBCcmVjaGFfSW5kaWdlbmNpYSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodGFibGE2LjJfZ3JhZiwgTWV0b2RvbG9nw61hLCBCcmVjaGFfUG9icmV6YSwgQnJlY2hhX0luZGlnZW5jaWEpKQ0KICANCiAgaW5saW5lXzI2IDwtIHRhYmxhNi4xX2dyYWYgJT4lIA0KICAgIGZpbHRlcihNZXRvZG9sb2fDrWEgPT0gIkhvZ2FyIikgJT4lIA0KICAgIHB1bGwoQnJlY2hhX1BvYnJlemEpICU+JSANCiAgICBhYnMoKQ0KICANCiAgaW5saW5lXzI3IDwtIHRhYmxhNi4xX2dyYWYgJT4lIA0KICAgIGZpbHRlcihNZXRvZG9sb2fDrWEgPT0gIkluZGl2aWR1YWwiKSAlPiUgDQogICAgcHVsbChCcmVjaGFfUG9icmV6YSkgJT4lIA0KICAgIGFicygpDQp9DQogIA0KYGBgDQoNCmByIGlmKHNob3cucG9icmV6YSkge3Bhc3RlMCgiU2kgZW4gdmV6IGRlIGNhcmFjdGVyaXphciBhIGxhcyBwZXJzb25hcyBkZSBhY3VlcmRvIGFsIGhvZ2FyIGFsIHF1ZSBwZXJ0ZW5lY2VuLCBvYnNlcnZhbW9zIGxhIGNhcGFjaWRhZCBxdWUgdGllbmVuIHZhcm9uZXMgeSBtdWplcmVzIHBhcmEgY3VicmlyIHN1cyBuZWNlc2lkYWRlcyByZWN1cnJpZW5kbyBhIGxvcyBpbmdyZXNvcyBxdWUgb2J0aWVuZW4gaW5kaXZpZHVhbG1lbnRlLCB2ZXLDrWFtb3MgcXVlIGxhIGluY2lkZW5jaWEgZGUgbGEgcG9icmV6YSBhZmVjdGEgZW4gbWF5b3IgbWVkaWRhIGEgbGFzIG9jdXBhZGFzIHF1ZSBhIGxvcyBvY3VwYWRvcy4gPGJyPjxicj5MYXMgYnJlY2hhcyBlc3TDoW4gY2FsY3VsYWRhcyBjb21vIF9fX1Rhc2EgZGUgcG9icmV6YSBtdWplcmVzIC0gVGFzYSBkZSBwb2JyZXphIHZhcm9uZXNfX18sIHBvciBsbyBxdWUgbGFzIGRpZmVyZW5jaWFzIHF1ZSB2ZW1vcyBlc3TDoW4gZXhwcmVzYWRhcyBlbiBwdW50b3MgcG9yY2VudHVhbGVzLCBlbiBlc3RlIHNlbnRpZG8gc2kgc2Ugb2JzZXJ2YW4gdmFsb3JlcyBuZWdhdGl2b3MgZXMgcG9ycXVlIGV4aXN0ZSB1bmEgbWF5b3IgaW5jaWRlbmNpYSBkZSBsYSBwb2JyZXphIGVuIHZhcm9uZXMsIG1pZW50cmFzIHF1ZSBzaSBlbCB2YWxvciBkZSBsYSBicmVjaGEgZGUgcG9zaXRpdm8gaW1wbGljYSBxdWUgc29uIGxhcyBtdWplcmVzIGxhcyBxdWUgc2UgdmVuIGFmZWN0YWRhcyBtYXlvcm1lbnRlLiA8YnI+PGJyPkVuIGVsIHNpZ3VpZW50ZSBncsOhZmljbyB2ZW1vcyBxdWUgdG9tYW5kbyBhbCBob2dhciBjb21vIHVuaWRhZCBkZSBtZWRpZGEsIGxvcyB2YXJvbmVzIHRpZW5lbiB1biAiLGlubGluZV8yNiwicC5wLiBtYXlvciBkZSBpbmNpZGVuY2lhIGVuIGxhIHBvYnJlemEgcXVlIGxhcyBtdWplcmVzIG9jdXBhZGFzLiBFbiBjYW1iaW8sIHNpIGNvbnRyYXN0YW1vcyBsYXMgY2FuYXN0YXMgY2FsY3VsYWRhcyBwYXJhIGNhZGEgcGVyc29uYSBjb24gc3VzIGluZ3Jlc29zIHRvdGFsZXMgaW5kaXZpZHVhbGVzLCBsYSBpbmNpZGVuY2lhIHBhc2EgYSBzZXIgZGUgdW4gIixpbmxpbmVfMjcsInAucC4gbcOhcyBwYXJhIGxhcyBtdWplcmVzLiBFc3RvIHBvbmUgZW4gZXZpZGVuY2lhIHF1ZSBsYSBwb2JyZXphIG1lZGlkYSBwb3IgaW5ncmVzb3MgYWZlY3RhIG1heW9yaXRhcmlhbWVudGUgYSBsYXMgbXVqZXJlcyBzaSB0dXZpZXJhbiBxdWUgY3VicmlyIHN1cyBuZWNlc2lkYWRlcyBkZSBmb3JtYSBpbmRpdmlkdWFsLiA8YnI+PGJyPiIpfSBlbHNlIHsiX1RvZGF2w61hIG5vIGVzdGFuIGRpc3BvbmlibGVzIGxvcyBkYXRvcyBkZSBwb2JyZXphIHBhcmEgZXN0ZSB0cmltZXN0cmUuIFBvZGVzIHZlciBsYSDDumx0aW1hIGFjdHVhbGl6YWNpw7NuIGRlIGVzdGEgc2VjY2nDs24gZW4gZWwgaW5mb3JtZSBkZWwgdHJpbWVzdHJlIGFudGVyaW9yLl8ifWANCg0KYHIgaWYoc2hvdy5wb2JyZXphKSB7cGFzdGUwKCI8cCBzdHlsZT0nY29sb3I6I0U1NjE2RSc+X19EaWZlcmVuY2lhcyBkZSB0YXNhcyBkZSBwb2JyZXphIGUgaW5kaWdlbmNpYSBwb3Igc2V4b19fPC9wPjxwIHN0eWxlPSdjb2xvcjojYzljOWM5Jz5fX09jdXBhZGFzL29zLiBNZXRvZG9sb2fDrWEgaG9nYXIgZSBpbmRpdmlkdWFsLiAiLCBhZ2xvX2RhdGUgLCJfXzwvcD4iKX1gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQppZihzaG93LnBvYnJlemEpew0KICANCiAgdGFibGE2LjFfZ3JhZiAlPiUgDQogICAgbXV0YXRlKEJyZWNoYV9Qb2JyZXphID0gY29sb3JfdGlsZSgiI0UzRTJFNyIsIGNvbG9yZXNiWzJdKSgoQnJlY2hhX1BvYnJlemEpKSwNCiAgICAgICAgICAgQnJlY2hhX0luZGlnZW5jaWEgPSBjb2xvcl90aWxlKCIjRTZGMUU5IiwgY29sb3Jlc2JbMV0pKChCcmVjaGFfSW5kaWdlbmNpYSkpKSAlPiUgDQogICAgc2VsZWN0KCdNZXRvZG9sb2fDrWEnLCAnQnJlY2hhIFBvYnJlemEnPUJyZWNoYV9Qb2JyZXphLCAnQnJlY2hhIEluZGlnZW5jaWEnPUJyZWNoYV9JbmRpZ2VuY2lhKSAlPiUgDQogICAga2FibGUoZXNjYXBlID0gRkFMU0UsIGRpZ2l0cyA9IDEsIGFsaWduID0gJ2xjYycpICU+JSANCiAgICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgICAjZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIA0KICAgIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICJcbiIpICU+JSANCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI1Y20iKSAlPiUgDQogICAgY29sdW1uX3NwZWMoMiwgY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9ICIzY20iKSAlPiUgDQogICAgY29sdW1uX3NwZWMoMywgY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9ICIzY20iKSAlPiUgDQogICAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNiWzJdKQ0KfQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpybSh0YWJsYTYuMV9ncmFmLCB0YWJsYTYuMl9ncmFmLCBjYW5hc3RhcykNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaWYoc2hvdy5wb2JyZXphKXsNCiAgDQogIHRhYmxhNi4zX2dyYWYgPC0gb3JnYW5pemVfY2Flcyh0YWJsYTYuMSkgJT4lIA0KICAgIG11dGF0ZShSYW1hID0gY2Flc19lcGhfbGFiZWwpICU+JSANCiAgICBmaWx0ZXIoRVNUQURPID09IDEsDQogICAgICAgICAgIFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgICBQUDNFX1RPVCAhPSA5OTksDQogICAgICAgICAgIFAyMSA+IDAsDQogICAgICAgICAgICFpcy5uYShSYW1hKSkgJT4lICAjIEluZ3Jlc29zIHBvc2l0aXZvcw0KICAgIGZpbHRlcihSYW1hICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiwgIkVuc2VuYW56YSIsICJTZXJ2aWNpb3Mgc29jaWFsZXMgeSBkZSBzYWx1ZCIsDQogICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaWEgbWFudWZhY3R1cmVyYSIsICJBY3RpdmlkYWRlcyBwcmltYXJpYXMiLCAiVHJhbnNwb3J0ZSwgYWxtYWNlbmFtaWVudG8geSBjb211bmljYWNpb25lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICJDb25zdHJ1Y2Npb24iKSkgJT4lIA0KICAgIG11dGF0ZShSYW1hID0gYXMuY2hhcmFjdGVyKFJhbWEpLA0KICAgICAgICAgICBSYW1hID0gY2FzZV93aGVuKA0KICAgICAgICAgICAgIFJhbWEgPT0gIlNlcnZpY2lvcyBzb2NpYWxlcyB5IGRlIHNhbHVkIiB+ICJTZXJ2LiBzb2NpYWxlcyB5IGRlIHNhbHVkIiwNCiAgICAgICAgICAgICBSYW1hID09ICJUcmFuc3BvcnRlLCBhbG1hY2VuYW1pZW50byB5IGNvbXVuaWNhY2lvbmVzIiB+ICJUcmFuc3BvcnRlLCBhbG1hY2VuLiB5IGNvbXUuIiwNCiAgICAgICAgICAgICBUUlVFIH4gUmFtYQ0KICAgICAgICAgICApKSAlPiUgDQogICAgZ3JvdXBfYnkoUmFtYSkgJT4lIA0KICAgIHN1bW1hcmlzZSgNCiAgICAgIFBvYnJlemEgPSByb3VuZChzdW0oUE9ORElIW3NpdHVhY2lvbiAlaW4lIGMoInBvYnJlIiwiaW5kaWdlbnRlIildLCBuYS5ybSA9IFRSVUUpL3N1bShQT05ESUgsIG5hLnJtID0gVFJVRSkqMTAwLCAxKSwgDQogICAgICBJbmRpZ2VuY2lhID0gcm91bmQoc3VtKFBPTkRJSFtzaXR1YWNpb24gPT0gImluZGlnZW50ZSJdLCBuYS5ybSA9IFRSVUUpL3N1bShQT05ESUgsIG5hLnJtID0gVFJVRSkqMTAwLCAxKSkgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKFBvYnJlemEsIEluZGlnZW5jaWEpLA0KICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJTaXR1YWNpw7NuIiwNCiAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIlRhc2EiKSANCn0NCmBgYA0KDQpgciBpZihzaG93LnBvYnJlemEpIHsiPGJyPjxicj4gQSBjb250aW51YWNpw7NuIHZlbW9zIGxhcyB0YXNhcyBkZSBwb2JyZXphIGUgaW5kaWdlbmNpYSBwb3IgcmFtYSBkZSBsYSBvY3VwYWNpw7NuIGVuIGxhIHF1ZSBzZSBlbmN1ZW50cmFuIGxhcyBvY3VwYWRhcyB5IG9jdXBhZG9zIGRlIGFjdWVyZG8gYSBsYSBtZWRpY2nDs24gcG9yIGhvZ2FyLiBQb2RlbW9zIGFmaXJtYXIgcXVlIGxhcyB0cmFiYWphZG9yYXMgZGVsIHNlcnZpY2lvIGRvbcOpc3RpY28gZXN0w6FuIHNvYnJlcnJlcHJlc2VudGFkYXMgZW4gbG9zIGhvZ2FyZXMgZW4gc2l0dWFjacOzbiBkZSBtYXlvciB2dWxuZXJhYmlsaWRhZCwgc3VwZXJhbmRvIGluY2x1c28gbGFzIHRhc2FzIGEgbml2ZWwgZ2VuZXJhbCBjYWxjdWxhZGFzIHBvciBJTkRFQy4gPGJyPjxicj4ifWANCg0KYHIgaWYoc2hvdy5wb2JyZXphKSB7cGFzdGUwKCI8cCBzdHlsZT0nY29sb3I6I0U1NjE2RSc+X19UYXNhcyBkZSBwb2JyZXphIGUgaW5kaWdlbmNpYV9fPC9wPjxwIHN0eWxlPSdjb2xvcjojYzljOWM5Jz5fX1NlZ8O6biByYW1hcyBkZSBsYSBvY3VwYWNpw7NuLiBNZWRpY2nDs24gaG9nYXIuICIsIGFnbG9fZGF0ZSAsIl9fPC9wPiIpfWANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmlmKHNob3cucG9icmV6YSl7DQogIA0KICBnZ3Bsb3QodGFibGE2LjNfZ3JhZiwgYWVzKHggPSBUYXNhLCB5PSBSYW1hICU+JSByZW9yZGVyKFRhc2EpLCBmaWxsID0gU2l0dWFjacOzbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoVGFzYSwgIiUiKSkpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwgaGp1c3QgPS0uMSwgc2l6ZSA9IDIuNSkgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoY29sb3Jlc2JbMl0sIGNvbG9yZXNiWzFdKSwgYnJlYWtzID0gYygiUG9icmV6YSIsICJJbmRpZ2VuY2lhIikpICsNCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA2MykpICsNCiAgICBsYWJzKGNhcHRpb24gPSBmdWVudGUpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICAgcGxvdC5zdWJ0aXRsZT1lbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT04KSwNCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTcpLA0KICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC41LCAnY20nKSkNCn0NCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kcm0odGFibGE2LjNfZ3JhZikNCmBgYA0KDQojIyMjIFBvciByZWdpw7NuDQo8YnI+DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KaWYoc2hvdy5wb2JyZXphKXsNCiAgDQogIHRhYmxhNi40X2dyYWYgPC0gdGFibGE2LjEgJT4lIA0KICAgIGdyb3VwX2J5KFNleG8sIFJlZ2lvbikgJT4lIA0KICAgIHN1bW1hcmlzZSgNCiAgICAgIFBvYnJlemEgPSByb3VuZChzdW0oUE9ORElIW3NpdHVhY2lvbiAlaW4lIGMoInBvYnJlIiwiaW5kaWdlbnRlIildLCBuYS5ybSA9IFRSVUUpL3N1bShQT05ESUgsIG5hLnJtID0gVFJVRSkqMTAwLCAyKSwgDQogICAgICBJbmRpZ2VuY2lhID0gcm91bmQoc3VtKFBPTkRJSFtzaXR1YWNpb24gPT0gImluZGlnZW50ZSJdLCBuYS5ybSA9IFRSVUUpL3N1bShQT05ESUgsIG5hLnJtID0gVFJVRSkqMTAwLCAyKSkgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBwaXZvdF93aWRlcihpZF9jb2xzID0gUmVnaW9uLA0KICAgICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gUG9icmV6YSwNCiAgICAgICAgICAgICAgICBuYW1lc19mcm9tID0gU2V4bykgJT4lDQogICAgbXV0YXRlKEJyZWNoYV9Qb2JyZXphID0gcm91bmQoTXVqZXJlcy1WYXJvbmVzLCAxKSwNCiAgICAgICAgICAgIyB4cCA9IE11amVyZXMtKEJyZWNoYV9Qb2JyZXphLzIpLA0KICAgICAgICAgICBNZXRvZG9sb2fDrWEgPSAiSG9nYXIiKQ0KICAjIGFycmFuZ2UoZGVzYyhCcmVjaGFfUG9icmV6YSkpDQogIA0KICB0YWJsYTYuNV9ncmFmIDwtIHRhYmxhNi4yICU+JSANCiAgICBncm91cF9ieShTZXhvLCBSZWdpb24pICU+JSANCiAgICBzdW1tYXJpc2UoDQogICAgICBQb2JyZXphID0gcm91bmQoc3VtKFBPTkRJSFtzaXR1YWNpb24gJWluJSBjKCJwb2JyZSIsImluZGlnZW50ZSIpXSwgbmEucm0gPSBUUlVFKS9zdW0oUE9ORElILCBuYS5ybSA9IFRSVUUpKjEwMCwgMiksIA0KICAgICAgSW5kaWdlbmNpYSA9IHJvdW5kKHN1bShQT05ESUhbc2l0dWFjaW9uID09ICJpbmRpZ2VudGUiXSwgbmEucm0gPSBUUlVFKS9zdW0oUE9ORElILCBuYS5ybSA9IFRSVUUpKjEwMCwgMikpICU+JSANCiAgICB1bmdyb3VwKCkgJT4lDQogICAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IFJlZ2lvbiwNCiAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IFBvYnJlemEsDQogICAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IFNleG8pICU+JQ0KICAgIG11dGF0ZShCcmVjaGFfUG9icmV6YSA9IHJvdW5kKE11amVyZXMtVmFyb25lcywgMSksDQogICAgICAgICAgICMgeHAgPSBNdWplcmVzLShCcmVjaGFfUG9icmV6YS8yKSwNCiAgICAgICAgICAgTWV0b2RvbG9nw61hID0gIkluZGl2aWR1YWwiKSANCiAgIyBhcnJhbmdlKGRlc2MoQnJlY2hhX1BvYnJlemEpKQ0KICANCiAgdGFibGE2LjRfZ3JhZiA8LSBiaW5kX3Jvd3Moc2VsZWN0KHRhYmxhNi40X2dyYWYsIE1ldG9kb2xvZ8OtYSwgUmVnaW9uLCBCcmVjaGFfUG9icmV6YSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodGFibGE2LjVfZ3JhZiwgTWV0b2RvbG9nw61hLCBSZWdpb24sIEJyZWNoYV9Qb2JyZXphKSkgJT4lIA0KICAgIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBNZXRvZG9sb2fDrWEsDQogICAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IFJlZ2lvbiwNCiAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IEJyZWNoYV9Qb2JyZXphKQ0KfQ0KYGBgDQoNCmByIGlmKHNob3cucG9icmV6YSkgeyJTaSBlbiB2ZXogZGUgY2FyYWN0ZXJpemFyIGEgbGFzIHBlcnNvbmFzIGRlIGFjdWVyZG8gYWwgaG9nYXIgYWwgcXVlIHBlcnRlbmVjZW4sIG9ic2VydmFtb3MgbGEgY2FwYWNpZGFkIHF1ZSB0aWVuZW4gdmFyb25lcyB5IG11amVyZXMgcGFyYSBjdWJyaXIgc3VzIG5lY2VzaWRhZGVzIHJlY3VycmllbmRvIGEgbG9zIGluZ3Jlc29zIHF1ZSBvYnRpZW5lbiBpbmRpdmlkdWFsbWVudGUsIHZlcsOtYW1vcyBxdWUgbGEgaW5jaWRlbmNpYSBkZSBsYSBwb2JyZXphIGFmZWN0YSBlbiBtYXlvciBtZWRpZGEgYSBsYXMgb2N1cGFkYXMgcXVlIGEgbG9zIG9jdXBhZG9zLiA8YnI+PGJyPkxhcyBicmVjaGFzIGVzdMOhbiBjYWxjdWxhZGFzIGNvbW8gX19fVGFzYSBkZSBwb2JyZXphIG11amVyZXMgLSBUYXNhIGRlIHBvYnJlemEgdmFyb25lc19fXywgcG9yIGxvIHF1ZSBsYXMgZGlmZXJlbmNpYXMgcXVlIHZlbW9zIGVzdMOhbiBleHByZXNhZGFzIGVuIHB1bnRvcyBwb3JjZW50dWFsZXMsIGVuIGVzdGUgc2VudGlkbyBzaSBzZSBvYnNlcnZhbiB2YWxvcmVzIG5lZ2F0aXZvcyBlcyBwb3JxdWUgZXhpc3RlIHVuYSBtYXlvciBpbmNpZGVuY2lhIGRlIGxhIHBvYnJlemEgZW4gdmFyb25lcywgbWllbnRyYXMgcXVlIHNpIGVsIHZhbG9yIGRlIGxhIGJyZWNoYSBkZSBwb3NpdGl2byBpbXBsaWNhIHF1ZSBzb24gbGFzIG11amVyZXMgbGFzIHF1ZSBzZSB2ZW4gYWZlY3RhZGFzIG1heW9ybWVudGUuPGJyPjxicj4ifSBlbHNlIHsiX1RvZGF2w61hIG5vIGVzdGFuIGRpc3BvbmlibGVzIGxvcyBkYXRvcyBkZSBwb2JyZXphIHBhcmEgZXN0ZSB0cmltZXN0cmUuIFBvZGVzIHZlciBsYSDDumx0aW1hIGFjdHVhbGl6YWNpw7NuIGRlIGVzdGEgc2VjY2nDs24gZW4gZWwgaW5mb3JtZSBkZWwgdHJpbWVzdHJlIGFudGVyaW9yLl8ifWANCg0KYHIgaWYoc2hvdy5wb2JyZXphKSB7cGFzdGUwKCI8cCBzdHlsZT0nY29sb3I6I0U1NjE2RSc+X19EaWZlcmVuY2lhcyBkZSB0YXNhcyBkZSBwb2JyZXphIHBvciBzZXhvIHkgcmVnacOzbl9fPC9wPjxwIHN0eWxlPSdjb2xvcjojYzljOWM5Jz5fX09jdXBhZGFzL29zLiBNZXRvZG9sb2fDrWEgaG9nYXIgZSBpbmRpdmlkdWFsLiAiLCBhZ2xvX2RhdGUgLCJfXzwvcD4iKX1gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQppZihzaG93LnBvYnJlemEpew0KICANCiAgdGFibGE2LjRfZ3JhZiAlPiUgDQogICAgcmVuYW1lKEdCQT0nR3JhbiBCdWVub3MgQWlyZXMnKSAlPiUgDQogICAgbXV0YXRlKEN1eW8gPSBjb2xvcl90aWxlKCIjRTNFMkU3IiwgY29sb3Jlc2JbMl0pKChDdXlvKSksDQogICAgICAgICAgIEdCQSA9IGNvbG9yX3RpbGUoIiNFM0UyRTciLCBjb2xvcmVzYlsyXSkoKEdCQSkpLA0KICAgICAgICAgICBORUEgPSBjb2xvcl90aWxlKCIjRTNFMkU3IiwgY29sb3Jlc2JbMl0pKChORUEpKSwNCiAgICAgICAgICAgTk9BID0gY29sb3JfdGlsZSgiI0UzRTJFNyIsIGNvbG9yZXNiWzJdKSgoTk9BKSksDQogICAgICAgICAgIFBhbXBlYW5hID0gY29sb3JfdGlsZSgiI0UzRTJFNyIsIGNvbG9yZXNiWzJdKSgoUGFtcGVhbmEpKSwNCiAgICAgICAgICAgUGF0YWdvbmlhID0gY29sb3JfdGlsZSgiI0UzRTJFNyIsIGNvbG9yZXNiWzJdKSgoUGF0YWdvbmlhKSkpICU+JSANCiAgICBrYWJsZShlc2NhcGUgPSBGQUxTRSwgZGlnaXRzID0gMSwgYWxpZ24gPSAnbGNjY2NjYycpICU+JSANCiAgICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgDQogICAgICAgICAgICAgICAgICAjZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLA0KICAgICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIA0KICAgIGZvb3Rub3RlKGdlbmVyYWwgPSBmdWVudGUsDQogICAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICJcbiIpICU+JSANCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI1Y20iKSAlPiUgDQogICAgY29sdW1uX3NwZWMoMiwgY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9ICIzY20iKSAlPiUgDQogICAgY29sdW1uX3NwZWMoMywgY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9ICIzY20iKSAlPiUgDQogICAgY29sdW1uX3NwZWMoNCwgY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9ICIzY20iKSAlPiUgDQogICAgY29sdW1uX3NwZWMoNSwgY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9ICIzY20iKSAlPiUgDQogICAgY29sdW1uX3NwZWMoNiwgY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9ICIzY20iKSAlPiUgDQogICAgY29sdW1uX3NwZWMoNywgY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9ICIzY20iKSAlPiUgDQogICAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IGNvbG9yZXNiWzJdKQ0KfQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpybSh0YWJsYTYuNF9ncmFmLCB0YWJsYTYuNV9ncmFmKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KaWYoc2hvdy5wb2JyZXphKXsNCiAgDQogIHRhYmxhNi42X2dyYWYgPC0gb3JnYW5pemVfY2Flcyh0YWJsYTYuMSkgJT4lIA0KICAgIG11dGF0ZShSYW1hID0gY2Flc19lcGhfbGFiZWwpICU+JSANCiAgICBmaWx0ZXIoRVNUQURPID09IDEsDQogICAgICAgICAgIFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgICBQUDNFX1RPVCAhPSA5OTksDQogICAgICAgICAgIFAyMSA+IDAsDQogICAgICAgICAgICFpcy5uYShSYW1hKSkgJT4lICAjIEluZ3Jlc29zIHBvc2l0aXZvcw0KICAgIGZpbHRlcihSYW1hICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiwgIkVuc2VuYW56YSIsICJTZXJ2aWNpb3Mgc29jaWFsZXMgeSBkZSBzYWx1ZCIsDQogICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaWEgbWFudWZhY3R1cmVyYSIsICJBY3RpdmlkYWRlcyBwcmltYXJpYXMiLCAiVHJhbnNwb3J0ZSwgYWxtYWNlbmFtaWVudG8geSBjb211bmljYWNpb25lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICJDb25zdHJ1Y2Npb24iKSkgJT4lIA0KICAgIG11dGF0ZShSYW1hID0gYXMuY2hhcmFjdGVyKFJhbWEpLA0KICAgICAgICAgICBSYW1hID0gY2FzZV93aGVuKA0KICAgICAgICAgICAgIFJhbWEgPT0gIlNlcnZpY2lvcyBzb2NpYWxlcyB5IGRlIHNhbHVkIiB+ICJTZXJ2LiBzb2NpYWxlcyB5IGRlIHNhbHVkIiwNCiAgICAgICAgICAgICBSYW1hID09ICJUcmFuc3BvcnRlLCBhbG1hY2VuYW1pZW50byB5IGNvbXVuaWNhY2lvbmVzIiB+ICJUcmFuc3BvcnRlLCBhbG1hY2VuLiB5IGNvbXUuIiwNCiAgICAgICAgICAgICBUUlVFIH4gUmFtYQ0KICAgICAgICAgICApKSAlPiUgDQogICAgZ3JvdXBfYnkoUmFtYSwgUmVnaW9uKSAlPiUgDQogICAgc3VtbWFyaXNlKA0KICAgICAgUG9icmV6YSA9IHJvdW5kKHN1bShQT05ESUhbc2l0dWFjaW9uICVpbiUgYygicG9icmUiLCJpbmRpZ2VudGUiKV0sIG5hLnJtID0gVFJVRSkvc3VtKFBPTkRJSCwgbmEucm0gPSBUUlVFKSoxMDAsIDEpLCANCiAgICAgIEluZGlnZW5jaWEgPSByb3VuZChzdW0oUE9ORElIW3NpdHVhY2lvbiA9PSAiaW5kaWdlbnRlIl0sIG5hLnJtID0gVFJVRSkvc3VtKFBPTkRJSCwgbmEucm0gPSBUUlVFKSoxMDAsIDEpKSAlPiUgDQogICAgdW5ncm91cCgpICU+JSANCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGMoUG9icmV6YSwgSW5kaWdlbmNpYSksDQogICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIlNpdHVhY2nDs24iLA0KICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVGFzYSIpICU+JSANCiAgICBmaWx0ZXIoU2l0dWFjacOzbj09IlBvYnJlemEiKQ0KfQ0KYGBgDQoNCmByIGlmKHNob3cucG9icmV6YSkgeyI8YnI+PGJyPiBBIGNvbnRpbnVhY2nDs24gdmVtb3MgbGFzIHRhc2FzIGRlIHBvYnJlemEgZSBpbmRpZ2VuY2lhIHBvciByZWdpw7NuIHkgcmFtYSBkZSBsYSBvY3VwYWNpw7NuIGVuIGxhIHF1ZSBzZSBlbmN1ZW50cmFuIGxhcyBvY3VwYWRhcyB5IG9jdXBhZG9zIGRlIGFjdWVyZG8gYSBsYSBtZWRpY2nDs24gcG9yIGhvZ2FyLiBQb2RlbW9zIGFmaXJtYXIgcXVlIGxhcyB0cmFiYWphZG9yYXMgZGVsIHNlcnZpY2lvIGRvbcOpc3RpY28gZXN0w6FuIHNvYnJlcnJlcHJlc2VudGFkYXMgZW4gbG9zIGhvZ2FyZXMgZW4gc2l0dWFjacOzbiBkZSBtYXlvciB2dWxuZXJhYmlsaWRhZCBpbmRpc3RpbnRhbWVudGUgZGUgbGEgcmVnacOzbiBlbiBsYSBxdWUgc2UgZW5jdWVudHJlbiwgc3VwZXJhbmRvIGluY2x1c28gbGFzIHRhc2FzIGEgbml2ZWwgZ2VuZXJhbCBjYWxjdWxhZGFzIHBvciBJTkRFQy4gPGJyPjxicj4ifWANCg0KYHIgaWYoc2hvdy5wb2JyZXphKSB7cGFzdGUwKCI8cCBzdHlsZT0nY29sb3I6I0U1NjE2RSc+X19Qcm9wb3JjacOzbiBkZSBwZXJzb25hcyBxdWUgaW50ZWdyYW4gaG9nYXJlcyBlbiBzaXR1YWNpw7NuIGRlIHBvYnJlemFfXzwvcD48cCBzdHlsZT0nY29sb3I6I2M5YzljOSc+X19TZWfDum4gcmVnacOzbiB5IHJhbWFzIGRlIGxhIG9jdXBhY2nDs24uICIsIGFnbG9fZGF0ZSAsIl9fPC9wPiIpfWANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQppZihzaG93LnBvYnJlemEpew0KICANCiAgZ2dwbG90KHRhYmxhNi42X2dyYWYsIGFlcyhSZWdpb24sIFJhbWEsIGZpbGw9IFRhc2EpKSArIA0KICAgIGdlb21fdGlsZSgpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gVGFzYSksIHNpemU9NCkgKyANCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICIjRjhGNUVFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICMgbG93ID0gY29sb3Jlc2JbMV0sDQogICAgICAgICAgICAgICAgICAgICAgICBoaWdoID0gY29sb3Jlc2JbMl0pICsNCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoIkN1eW8iLCAiR0JBIiwgIk5FQSIsICJOT0EiLCAiUGFtcGVhbmEiLCAiUGF0YWdvbmlhIiksDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKCJDdXlvIiwgIkdyYW4gQnVlbm9zIEFpcmVzIiwgIk5FQSIsICJOT0EiLCAiUGFtcGVhbmEiLCAiUGF0YWdvbmlhIikpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIGxhYnMoY2FwdGlvbiA9IGZ1ZW50ZSkgKw0KICAgIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGxvdC5zdWJ0aXRsZT1lbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApKQ0KfQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpybSh0YWJsYTYuNl9ncmFmLCB0YWJsYTYuMSwgdGFibGE2LjIpDQpgYGANCg0KIyMgR2xvc2FyaW8NCg0KLS0tDQoNCiMjIyBHbG9zYXJpbyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCjxicj48YnI+DQpFbiBlc3RhIHNlY2Npw7NuIGRlZmluaW1vcyBjb25jZXB0b3MgcXVlIGZhY2lsaXRhbiBsYSBsZWN0dXJhIGRlbCBpbmZvcm1lLiAgDQo8YnI+DQoNCl9fQnJlY2hhIGRlIGluZ3Jlc29zOl9fIEVsIGluZ3Jlc28gdG90YWwgY29udGVtcGxhIGluZ3Jlc29zIGxhYm9yYWxlcyB5IG5vIGxhYm9yYWxlcywgY29tbyByZW50YXMgbyBzdWJzaWRpb3MuIEVzdGUgaW5kaWNhZG9yIGNhbGN1bGEgbGEgZGlmZXJlbmNpYSBlbnRyZSBsb3MgaW5ncmVzb3MgaW5kaXZpZHVhbGVzIHByb21lZGlvcyBkZSBsb3MgdmFyb25lcyB5IGxhcyBtdWplcmVzLCBleHByZXNhZGEgZW4gdMOpcm1pbm9zIGRlbCBpbmdyZXNvIGRlIGxvcyB2YXJvbmVzIChnZW5lcmFsbWVudGUgZWwgbcOhcyBhbHRvKS4gRXMgZGVjaXIsIHF1ZSBwdWVkZSBsZWVyc2UgY29tbyDigJxsYXMgbXVqZXJlcyBwZXJjaWJlbiBpbmdyZXNvcyBxdWUsIGVuIHByb21lZGlvLCBzb24gdW4g4oCmJSBtZW5vcmVzIHF1ZSBsb3MgZGUgbG9zIHZhcm9uZXPigJ0uIEVuIEFyZ2VudGluYSBlc3RhIGJyZWNoYSBlcyBlc3RydWN0dXJhbCwgYXVucXVlIHNlbnNpYmxlIGEgbG9zIGNpY2xvcyBlY29uw7NtaWNvcy4NCjxicj4NCg0KX19CcmVjaGEgZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWw6X18gRXN0ZSBpbmRpY2Fkb3IgZXMgbGEgYnJlY2hhIGRlIGluZ3Jlc29zIGRlcml2YWRhIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsLCBxdWUgY2FsY3VsYSBsYSBkaWZlcmVuY2lhIGVudHJlIGxvcyBpbmdyZXNvcyBwcm9tZWRpb3MgcGVyY2liaWRvcyBwb3IgZWwgZW1wbGVvIHByaW5jaXBhbCBkZSBsb3MgdmFyb25lcyB5IGxhcyBtdWplcmVzLCBleHByZXNhZGEgZW4gdMOpcm1pbm9zIGRlbCBwcm9tZWRpbyBwZXJjaWJpZG8gcG9yIGxvcyB2YXJvbmVzIChnZW5lcmFsbWVudGUgZWwgbcOhcyBhbHRvKS4gRXhjbHV5ZSBsb3MgaW5ncmVzb3Mgbm8gbGFib3JhbGVzLCBjb21vIHJlbnRhcyBvIHN1YnNpZGlvcy4gIFB1ZWRlIGxlZXJzZSBjb21vIOKAnGxhcyBtdWplcmVzIHBlcmNpYmVuIGluZ3Jlc29zIGRlcml2YWRvcyBkZSBzdSBvY3VwYWNpw7NuIHByaW5jaXBhbCBxdWUsIGVuIHByb21lZGlvLCBzb24gYcO6biDigKYlIG1lbm9yZXMgcXVlIGxvcyBkZSBsb3MgdmFyb25lc+KAnS4gRWwgZmVuw7NtZW5vIGRlIHF1ZSBzZWEgbWVub3IgcGFyYSBsYXMgbXVqZXJlcyBlcyBhbGdvIHF1ZSBzZSByZXBpdGUgZW4gdG9kbyBlbCBtdW5kbyB5IHNlIGRlYmUgYWwgdGlwbyBkZSBpbnNlcmNpw7NuIGxhYm9yYWwgcXVlIHRpZW5lbiBsYXMgcGVyc29uYXMgY3V5byBnw6luZXJvIGNvbmRpY2lvbmEgbGEgamVyYXJxdcOtYSBkZWwgcHVlc3RvIGRvbmRlIHRyYWJhamFuLCBsYSByYW1hIGRlIGxhIG9jdXBhY2nDs24sIGxhIGNhbnRpZGFkIGRlIHRpZW1wbyBxdWUgZGVzdGluYW4gYWwgbWVyY2FkbyByZW11bmVyYWRvLCBjdcOhbnRhIHJlc3BvbnNhYmlsaWRhZCB0aWVuZW4gc29icmUgbGFzIHRhcmVhcyBkb23DqXN0aWNhcywgZW50cmUgb3RyYXMuIFNpIGJpZW4gZXhpc3RlIGxhIGRpc2NyaW1pbmFjacOzbiBsaXNhIHkgbGxhbmEsIGxhIHByZXNlbmNpYSBkZSB1bmEgYnJlY2hhIHNhbGFyaWFsIG1lbnN1YWwgbm8gaW1wbGljYSBuZWNlc2FyaWFtZW50ZSB1bmEgZGlmZXJlbmNpYSBzYWxhcmlhbCBwb3IgaG9yYS4NCjxicj4NCg0KX19DYWxpZmljYWNpw7NuOl9fIFJlZmllcmUgYSBsYXMgY29tcGV0ZW5jaWFzIHF1ZSByZXF1aWVyZSBlbCBwdWVzdG8gZGUgdHJhYmFqby4gDQo8YnI+DQoNCl9fQ2F0ZWdvcsOtYSBkZSBqZWZlcy9qZWZhczpfXyBMYSBjYXRlZ29yw61hIGRlIGplZmVzL2plZmFzIHJlZmllcmUgYSBvY3VwYWNpb25lcyBjdXlvIGZpbiBlcyB0cmFuc21pdGlyIHkgYXBsaWNhciBkZWNpc2lvbmVzIGdlbmVyYWxlcyBkaXJlY3RpdmFzICwgYXPDrSBjb21vIG9yZ2FuaXphciwgc3VwZXJ2aXNhciB5IGNvbnRyb2xhciBwcm9jZXNvcyB5IHBlcnNvbmFzIGNvbXByb21ldGlkYXMgZW4gc3UgZWplY3VjacOzbi4gSnVudG8gY29uIGxhIGRlIERpcmVjY2nDs24gY29uc3RpdHV5ZW4gbGFzIGNhdGVnb3LDrWFzIGplcsOhcnF1aWNhcyBtw6FzIGFsdGFzIGVuIGxhIGVzdHJ1Y3R1cmEgb3JnYW5pemF0aXZhIGRlIGxvcyBlc3RhYmxlY2ltaWVudG9zLCBxdWUgbm9zIHBlcm1pdGVuIHZlciBlbCBhY2Nlc28gZGUgdmFyb25lcyB5IG11amVyZXMgYSBjYXJnb3MgamVyw6FycXVpY29zLiANCjxicj4NCg0KX19EZXNvY3VwYWRvOl9fIGVzIGVsIGVzdGFkbyBkZSB1bmEgcGVyc29uYSBxdWUgZXN0w6EgaW5zZXJ0YSBlbiBlbCBtZXJjYWRvIGxhYm9yYWwsIGJ1c2NhbmRvIHVuIGVtcGxlbyBhdW5xdWUgbm8gbG8gY29uc2lnYS4gDQo8YnI+DQoNCl9fRXN0YWTDrXN0aWNhcyBiaW5hcmlhczpfXyBIYWNlIHJlZmVyZW5jaWEgYSBxdWUgbGEgdmFyaWFibGUg4oCcc2V4b+KAnSBzw7NsbyBhZG9wdGEgZWwgdmFsb3IgZGUg4oCcbWFzY3VsaW5v4oCdIG8g4oCcZmVtZW5pbm/igJ0gZW4gbGEgYmFzZSBkZSBkYXRvcyB1dGlsaXphZGEsIHJlZm9yemFuZG8gZWwgcGFyYWRpZ21hIGhldGVyb25vcm1hdGl2byB5IGVsIGJpbmFyaXNtbyBkZSBnw6luZXJvLiBTaW4gZGlzcG9uZXIgZGUgdW5hIHZhcmlhYmxlIHF1ZSBhbHVkYSBhIGxhIGlkZW50aWRhZCBkZSBnw6luZXJvLCBtdWNoYXMgaWRlbnRpZGFkZXMgcXVlZGFuIGludmlzaWJpbGl6YWRhcyB5IGNvbiBlbGxhcywgc3VzIHNpdHVhY2lvbmVzIHkgbmVjZXNpZGFkZXMgZXNwZWPDrWZpY2FzLg0KPGJyPg0KDQpfX0ZhbHRhIGRlIGRlc2N1ZW50byBqdWJpbGF0b3JpbzpfXyBNdWVzdHJhIGVsIGVzdGFkbyBkZSB1bmEgcmVsYWNpw7NuIGxhYm9yYWwgYXNhbGFyaWFkYSBxdWUgbm8gY3VtcGxlIGNvbiBsYSBvYmxpZ2FjacOzbiBkZSBhcG9ydGVzLiBMYSBmYWx0YSBkZSBkZXNjdWVudG8ganViaWxhdG9yaW8gc3VlbGUgc2VyIHVuIGluZGljYWRvciBkZSBsYSBmYWx0YSBkZSByZWdpc3RybyBkZSBsYSByZWxhY2nDs24uIFNpIGJpZW4gZXMgdW4gZmVuw7NtZW5vIGVzdHJ1Y3R1cmFsIGVuIEFyZ2VudGluYSwgbGEgaW5jaWRlbmNpYSBkZSBlc3RhIHByb2JsZW3DoXRpY2EgZXMgbWF5b3IgZW50cmUgbGFzIG11amVyZXMgYXNhbGFyaWFkYXMuDQo8YnI+DQoNCl9fRmVtaW5pemFjacOzbiBkZSBsYSBwb2JyZXphOl9fIFJlZmllcmUgYWwgY29uanVudG8gZGUgcHJvY2Vzb3MgZGUgZW1wb2JyZWNpbWllbnRvIHF1ZSBhZmVjdGFuIGVuIG1heW9yIG1lZGlkYSBhIGxhcyBtdWplcmVzIHkgcXVlIHNlIG1hbmlmaWVzdGFuIGVuIHVuYSBtYXlvciBwcm9wb3JjacOzbiBkZSBtdWplcmVzIGVudHJlIGxhcyBwZXJzb25hcyBjdXlvcyBpbmdyZXNvcyBubyBsbGVnYW4gYSBjdWJyaXIgbGEgY2FuYXN0YSBiw6FzaWNhLg0KPGJyPg0KDQpfX05pdmVsIGVkdWNhdGl2bzpfXyBFbCBuaXZlbCBlZHVjYXRpdm8gYWxjYW56YWRvIGVzIHVuYSBmb3JtYSBkZSB2ZXIgY3XDoW50byBkZWRpY2Fyb24gYWwgZXN0dWRpbyBxdWllbmVzIHRyYWJhamFuLg0KPGJyPg0KDQpfX09jdXBhZG8vYS9lOl9fIEVzIGVsIGVzdGFkbyBkZSB1bmEgcGVyc29uYSBxdWUgZXN0w6EgaW5zZXJ0YSBlbiBlbCBtZXJjYWRvIGxhYm9yYWwgY29uIHVuIGVtcGxlbywgc2VhIGZvcm1hbCwgaW5mb3JtYWwsIGRlIGpvcm5hZGEgcmVkdWNpZGEsIGFzYWxhcmlhZG8sIHBvciBjdWVudGEgcHJvcGlhLCBkZSBqZWZhdHVyYSwgZW50cmUgb3Ryb3MuIA0KPGJyPg0KDQpfX09jdXBhZG9zL2FzIGRlbWFuZGFudGVzOl9fICBsYXMgcGVyc29uYXMgcXVlIHlhIHRpZW5lbiB1biBlbXBsZW8gcGVybyBidXNjYW4gYWN0aXZhbWVudGUgb3RybyBvIHRyYWJhamFyIG3DoXMgaG9yYXMuDQo8YnI+DQoNCl9fUGFyZWRlcyBkZSBjcmlzdGFsIC8gc2VncmVnYWNpw7NuIGhvcml6b250YWw6X18gRXMgdW5hIGZvcm1hIGRlIHZpc2liaWxpemFyIGxhIGRpc3RyaWJ1Y2nDs24gYXNpbcOpdHJpY2EgZGUgbGFzIG11amVyZXMgZW4gcmFtYXMgZGUgbGEgb2N1cGFjacOzbiwgcXVlIGFkZW3DoXMgZGUgcmVwcm9kdWNpciBlc3RlcmVvdGlwb3MgZGUgZ8OpbmVybyByZXByZXNlbnRhIHVuIHByb2JsZW1hIGRlIGluZ3Jlc29zLCB5YSBxdWUgbGFzIHJhbWFzIGZlbWluaXphZGFzIHRpZW5lbiBzdWVsZG9zIHByb21lZGlvcyBtw6FzIGJham9zIHkgbWF5b3JlcyBuaXZlbGVzIGRlIGluZm9ybWFsaWRhZCBxdWUgbG9zIG1hc2N1bGluaXphZG9zLg0KPGJyPg0KDQpfX1BvYmxhY2nDs24gZGUgMTQgYcOxb3MgeSBtw6FzOl9fIEVzIGxhIHBvYmxhY2nDs24gdG90YWwgZGUgZXN0ZSBpbmZvcm1lLCBxdWUgaW5jbHV5ZSB0b2RhcyBsYXMgcGVyc29uYXMgcXVlIGhheWFuIGFsY2FuemFkbyBlbCB1bWJyYWwgZGUgbG9zIDE0IGHDsW9zLCBlbCBsw61taXRlIGluZmVyaW9yIGRlIGxvIHF1ZSBzZSBjb25zaWRlcmEgbGEg4oCcZWRhZCBhY3RpdmHigJ0uDQo8YnI+DQoNCl9fUG9ibGFjacOzbiBFY29uw7NtaWNhbWVudGUgQWN0aXZhIChQRUEpOl9fICBMYSBQb2JsYWNpw7NuIEVjb27Ds21pY2FtZW50ZSBBY3RpdmEgKFBFQSkgaW5jbHV5ZSBhIGxhcyBwZXJzb25hcyBxdWUgb2ZyZWNlbiBzdSB0cmFiYWpvIGVuIGVsIG1lcmNhZG8sIHNlYSBxdWUgbG8gY29uc2lndWVuIChvY3VwYWRhcy9vcykgbyBubyAoZGVzb2N1cGFkYXMvb3MpLiBBbCBjb25zaWRlcmFyIMO6bmljYW1lbnRlIGVsIG1lcmNhZG8gbGFib3JhbCBubyBjb250ZW1wbGEgbGEgY29uZGljacOzbiBkZSBhY3RpdmlkYWQgZXhwYW5kaWRhIGEgdGFyZWFzIGRvbcOpc3RpY2FzIHkgZGUgY3VpZGFkb3Mgbm8gcmVtdW5lcmFkb3MuIA0KPGJyPg0KDQpfX1JhbWFzIGRlIGxhIG9jdXBhY2nDs246X18gRXMgdW5hIGNsYXNpZmljYWNpw7NuIGRlIGxhcyBhY3RpdmlkYWRlcyBlY29uw7NtaWNhcyBxdWUgcmVhbGl6YSBlbCBlc3RhYmxlY2ltaWVudG8gZMOzbmRlIHRyYWJhamFuIGxhcyBwZXJzb25hcy4gTGEgcmFtYSBkZSBhY3RpdmlkYWQgZWNvbsOzbWljYSBkZSB1bmEgcGVyc29uYSBubyBkZXBlbmRlIGRlIGxhcyB0YXJlYXMgZXNwZWPDrWZpY2FzIGRlIHN1IHRyYWJham8sIHNpbm8gZGUgbGFzIGNhcmFjdGVyw61zdGljYXMgZGUgbGEgdW5pZGFkIGVjb27Ds21pY2EgZW4gbGEgcXVlIHRyYWJhamEuIA0KPGJyPg0KDQpfX1JlZ2lvbmVzOl9fIEVuIGVzdGUgaW5mb3JtZSBzZSBpZGVudGlmaWNhbiA2IHJlZ2lvbmVzOiBHcmFuIEJ1ZW5vcyBBaXJlcywgTm9yb2VzdGUgQXJnZW50aW5vIChOT0EpLCBOb3Jlc3RlIEFyZ2VudGlubyAoTkVBKSwgQ3V5bywgUGFtcGVhbmEgeSBQYXRhZ29uaWEuIERlYmlkbyBhIGxhIGRpc3BvbmliaWxpZGFkIGRlIGxhIG11ZXN0cmEsIGFsZ3VuYXMgZGVzYWdyZWdhY2lvbmVzIHBpZXJkZW4gdmFsaWRleiB5IHBvciBlc2EgcmF6w7NuIHNlIG9taXRlIHN1IHB1YmxpY2FjacOzbi4gRW4gb3Ryb3MgY2Fzb3MsIGxhcyBhcGVydHVyYXMgcG9yIHJlZ2nDs24gZGV2dWVsdmVuIHJlc3VsdGFkb3MgbXV5IHNpbWlsYXJlcyBhIGxvcyBkZWwgdG90YWwgbmFjaW9uYWwsIHkgcG9yIGVzYSByYXrDs24gbm8gcmVzdWx0YSBzaWduaWZpY2F0aXZhIHN1IHB1YmxpY2FjacOzbi4gT2J0ZW5lciBkYXRvcyBlc3BlY8OtZmljb3Mgc29icmUgY2FkYSB1bmEgZGUgbGFzIHJlZ2lvbmVzIG5vIHNvbG8gcG9zaWJpbGl0YSBldmlkZW5jaWFyIGxhcyBwYXJ0aWN1bGFyaWRhZGVzIHJlZ2lvbmFsZXMgZGUgbGFzIGFzaW1ldHLDrWFzIHJlY29ycmlkYXMgYSBsbyBsYXJnbyBkZWwgaW5mb3JtZSwgc2lubyBxdWUgdGFtYmnDqW4gcGVybWl0ZW4gcmVhbGl6YXIgY29tcGFyYWNpb25lcy4gDQo8YnI+DQoNCl9fU3Vib2N1cGFkb3MvYXM6X18gVG9kYXMgbGFzIHBlcnNvbmFzIHF1ZSB0cmFiYWphbiBtZW5vcyBkZSAzNSBob3JhcyBzZW1hbmFsZXMsIGVzdMOhbiBkaXNwb25pYmxlcyBwYXJhIHRyYWJhamFyIG3DoXMgaG9yYXMgeSBkZXNlYW4gYXVtZW50YXIgbGEgY2FudGlkYWQgZGUgaG9yYXMgcXVlIHRyYWJhamFuLg0KPGJyPg0KDQpfX1N1Ym9jdXBhZG9zL2FzIGRlbWFuZGFudGVzOl9fIFByb3BvcmNpw7NuIGRlIHBlcnNvbmFzIGRlIGxhIHBvYmxhY2nDs24gZWNvbsOzbWljYW1lbnRlIGFjdGl2YSBxdWUgdGllbmVuIHVuIGVtcGxlbyBkZSBtZW5vcyBkZSAzNSBob3JhcyBzZW1hbmFsZXMsIGVzdMOhbiBkaXNwb25pYmxlcyBwYXJhIHRyYWJhamFyIG3DoXMgaG9yYXMgeSBzZSBlbmN1ZW50cmFuIGJ1c2NhbmRvIGVtcGxlbw0KPGJyPg0KDQpfX1N1Ym9jdXBhZG9zL2FzIG5vIGRlbWFuZGFudGVzOl9fICBMYXMgcGVyc29uYXMgcXVlIHRyYWJhamFuIG1lbm9zIGRlIDM1IGhvcmFzIHNlbWFuYWxlcywgbm8gZXN0w6FuIGJ1c2NhbmRvIGFjdGl2YW1lbnRlIG90cm8gdHJhYmFqbyBhdW5xdWUgZGVzZWFyw61hbiB0cmFiYWphciBtw6FzIGhvcmFzIHBlcm8gcG9yIGNhdXNhcyBpbnZvbHVudGFyaWFzIG5vIGxvIGhhY2VuLiANCjxicj4NCg0KX19UYXNhIGRlIGFjdGl2aWRhZDpfXyBTZSBjYWxjdWxhIGNvbW8gbGEgcHJvcG9yY2nDs24gcXVlIHJlcHJlc2VudGEgbGEgUG9ibGFjacOzbiBFY29uw7NtaWNhbWVudGUgQWN0aXZhIGVudHJlIGxhIHBvYmxhY2nDs24gdG90YWwsIHlhIHNlYSBkZSBtdWplcmVzIG8gZGUgdmFyb25lcy4gQ2FiZSBkZXN0YWNhciBxdWUgZXN0YSBkZWZpbmljacOzbiBkZSAiQWN0aXZpZGFkIiBubyBjb250ZW1wbGEgYWN0aXZpZGFkZXMgY29tbyBjb2NpbmFyLCBsaW1waWFyLCBjdWlkYXIsIGV0Yy4gcXVlIHNvbiByZWFsaXphZGFzIHByaW5jaXBhbG1lbnRlIHBvciBtdWplcmVzIGZ1ZXJhIGRlbCBtZXJjYWRvLiANCjxicj4NCg0KX19UYXNhIGRlIGVtcGxlbzpfXyBMYSB0YXNhIG11ZXN0cmEgbGEgcHJvcG9yY2nDs24gZGUgcXVpZW5lcyBlc3TDoW4gZW4gZWwgbWVyY2FkbyBsYWJvcmFsIGNvbW8gb2N1cGFkZXMgZW4gcmVsYWNpw7NuIGEgbGEgcG9ibGFjacOzbiBkZSBtdWplcmVzIHkgZGUgdmFyb25lcywgZXMgZGVjaXIsIHNlIHJlY29ydGEgZGUgbGEgdGFzYSBkZSBhY3RpdmlkYWQgbGEgcHJvcG9yY2nDs24gZGUgcXVpZW5lcyBlc3TDoW4gZGVzb2N1cGFkYXMuDQo8YnI+DQoNCl9fVGFzYSBkZSBkZXNvY3VwYWNpw7NuOl9fIGEgdGFzYSBtdWVzdHJhIGxhIHByb3BvcmNpw7NuIGRlIHBlcnNvbmFzIHF1ZSBlc3TDoW4gYnVzY2FuZG8gZW1wbGVvIHBlcm8gbm8gbG8gY29uc2lndWVuLCBlbnRyZSBsYSBwb2JsYWNpw7NuIGVjb27Ds21pY2FtZW50ZSBhY3RpdmEgLiBFc3RhIHNpdHVhY2nDs24gZXMgbcOhcyByZWN1cnJlbnRlIGVudHJlIG11amVyZXMuDQo8YnI+DQoNCl9fVGFzYSBkZSBzdWJvY3VwYWNpw7NuOl9fIExhIHRhc2EgcmVsYWNpb25hIGxhIGNhbnRpZGFkIGRlIHBlcnNvbmFzIGVuIHNpdHVhY2nDs24gZGUgc3Vib2N1cGFjacOzbiBob3JhcmlhIHJlc3BlY3RvIGFsIHRvdGFsIGRlIGxhIFBFQS4gRXN0b3MgZW1wbGVvcyBkYW4gbWF5b3IgZmxleGliaWxpZGFkIHBhcmEgZWwgbWFuZWpvIGRlIGxhcyByZXNwb25zYWJpbGlkYWRlcyB5IHNvbiBsYXMgbXVqZXJlcyBsYXMgcXVlIHByZXNlbnRhbiB0YXNhcyBkZSBzdWJvY3VwYWNpw7NuIG3DoXMgYWx0YXMsIG11Y2hhcyB2ZWNlcyBkZWJpZG8gYSBsYSBjYXJnYSBkZSB0cmFiYWpvIGRlIGN1aWRhZG9zIHF1ZSBkZW1hbmRhIG11Y2hhcyBob3JhcyBxdWUgbm8gc2UgbGxldmFuIGFsIG1lcmNhZG8gZGUgdHJhYmFqby4gTGFzIHRyYWJhamFkb3JhcyB0aWVuZW4gbWF5b3JlcyBjb21wbGljYWNpb25lcyBhbCBtb21lbnRvIGRlIGNvbnNlZ3VpciB1biB0cmFiYWpvIGRlIHRpZW1wbyBjb21wbGV0by4gDQo8YnI+DQoNCl9fVGVjaG8gZGUgY3Jpc3RhbCAvIHNlZ3JlZ2FjacOzbiB2ZXJ0aWNhbDpfXyBBbHVkZSBhIGxvcyBvYnN0w6FjdWxvcyBxdWUgZW5mcmVudGFuIGxhcyBtdWplcmVzIHBhcmEgYXNjZW5kZXIgYSBjYXJnb3MgamVyw6FycXVpY29zIHkgcHVlc3RvcyBkZSBkZWNpc2nDs24uIExhIG1ldMOhZm9yYSBkZWwgY3Jpc3RhbCBtdWVzdHJhIHF1ZSBsb3MgaW1wZWRpbWVudG9zIG5vIHNvbiB2aXNpYmxlcyB5YSBxdWUgbm8gaGF5IG5vcm1hcyBleHBsw61jaXRhcyBxdWUgYnVzcXVlbiBzZWdyZWdhciBhIGxhcyB0cmFiYWphZG9yYXMsIHBlcm8gcXVlIGxhcyBiYXJyZXJhcyBleGlzdGVuIGluY2x1c28gY3VhbmRvIGVzdMOhbiBpZ3VhbCBvIG1lam9yIGNhbGlmaWNhZGFzIHF1ZSBzdXMgY29tcGHDsWVyb3MgdmFyb25lcy4NCjxicj4NCg0KX19UcmFiYWpvIGRvbcOpc3RpY28geSBkZSBjdWlkYWRvczpfXyBUYW1iacOpbiBjb25vY2lkbyBjb21vIOKAnHRyYWJham8gcmVwcm9kdWN0aXZv4oCdIGVzIGFxdWVsIHF1ZSBlcyBpbXByZXNjaW5kaWJsZSBwYXJhIG1hbnRlbmVyIGxhIHZpZGEgZGUgbGFzIHBlcnNvbmFzLiBTZSBtYW5pZmllc3RhIGVuIHRhcmVhcyBjb21vIGNvY2luYXIsIGxhdmFyLCBvcmRlbmFyLCBhdGVuZGVyIGxhcyBuZWNlc2lkYWRlcyBkZSBseHMgbWllbWJyeHMgZGUgdW4gaG9nYXIgeSBkZSBsYSBmYW1pbGlhIGVuIGdlbmVyYWwuIFRvZGFzIGxhcyBwZXJzb25hcyBuZWNlc2l0YW1vcyBjdWlkYWRvcyBhIGxvIGxhcmdvIGRlIG51ZXN0cmFzIHZpZGFzIHkgbGEgY29uY3JlY2nDs24gZGUgbG9zIG1pc21vcyBzdWVsZSBkZXBlbmRlciBlbiBtYXlvciBtZWRpZGEgZGUgbGFzIGlkZW50aWRhZGVzIGZlbWluaXphZGFzLg0KPGJyPg0KDQojIyBNZXRvZG9sb2fDrWENCg0KLS0tDQoNCiMjIyBBY2xhcmFjaW9uZXMgbWV0b2RvbMOzZ2ljYXMNCjxicj48YnI+DQpQYXJhIHJlYWxpemFyIGxvcyBjw6FsY3Vsb3Mgc2UgdXRpbGl6YW4gYmFzZXMgZGUgZGF0b3MgcHVibGljYWRhcyBwb3IgbGEgRW5jdWVzdGEgUGVybWFuZW50ZSBkZSBIb2dhcmVzIGRlbCBJTkRFQy4gRXN0YSBlbmN1ZXN0YSByZWxldmEgY2FyYWN0ZXLDrXN0aWNhcyBkZW1vZ3LDoWZpY2FzLCBzb2NpYWxlcywgZWNvbsOzbWljYXMsIGNvbiBlc3BlY2lhbCBhdGVuY2nDs24gYSBsYXMgZm9ybWFzIGRlIHBhcnRpY2lwYWNpw7NuIGVuIGVsIG1lcmNhZG8gbGFib3JhbCwgZW50cmUgaG9nYXJlcyB5IHBlcnNvbmFzIGRlIDMxIGFnbG9tZXJhZG9zIHVyYmFub3MuIA0KPGJyPjxicj4NClJlc3BlY3RvIGRlbCBpbXBhY3RvIGRlIGxhIHBhbmRlbWlhIHBvciBDT1ZJRC0xOSwgdGFudG8gc29icmUgbG9zIHJlc3VsdGFkb3MgY29tbyBzb2JyZSBsYSBjYWxpZGFkIGRlIGxvcyBkYXRvcywgY2FiZSBhY2xhcmFyIHF1ZSBsYSBlbmN1ZXN0YSBwYXPDsyBkZSBsYSBtb2RhbGlkYWQgcHJlc2VuY2lhbCBhIGxhIHRlbGVmw7NuaWNhIHBhcmEgY29udGFjdGFyIHkgcmVhbGl6YXIgbGEgZW50cmV2aXN0YSBhIGxvcyBob2dhcmVzLiBFbCBwcm9waW8gSU5ERUMgYWR2aWVydGUgcXVlIGNpZXJ0b3MgZGF0b3Mgbm8gY3VlbnRhbiBjb24gbGEgY2FsaWRhZCBjb24gbGEgcXVlIGhhYml0dWFsbWVudGUgbGEgRVBIIHByZXNlbnRhIHN1cyByZXN1bHRhZG9zLg0KPGJyPjxicj4NCkVuIGN1YW50byBhIGxhIG1lZGljacOzbiBkZSBwb2JyZXphIHBvciBob2dhciwgc2UgdXRpbGl6YSBsYSBtZXRvZG9sb2fDrWEgZGUgSU5ERUMgcGFyYSBlbCBjw6FsY3VsbyBvZmljaWFsLCBkaXNwb25pYmxlIFthcXXDrV0oaHR0cHM6Ly93d3cuaW5kZWMuZ29iLmFyL2Z0cC9jdWFkcm9zL3NvY2llZGFkL0VQSF9tZXRvZG9sb2dpYV8yMl9wb2JyZXphLnBkZikuIEFkZW3DoXMgcHJvcG9uZW1vcyB1bmEgbWV0b2RvbG9nw61hIGRpZmVyZW50ZSBxdWUgZGVmaW5lIGxhIHNpdHVhY2nDs24gZGUgcG9icmV6YSBkZSBsYXMgcGVyc29uYXMgYSBuaXZlbCBpbmRpdmlkdWFsLiBQYXJhIGVzdG8gY29uc3RydWltb3MgQ2FuYXN0YXMgQsOhc2ljYXMgVG90YWxlcyBJbmRpdmlkdWFsZXMgcXVlIHJlc3VsdGFuIGRlIG11bHRpcGxpY2FyIGxhIENhbmFzdGEgQsOhc2ljYSBUb3RhbCBjb24gbGFzIHVuaWRhZGVzIGRlIHJlZmVyZW5jaWEgcXVlIGxlIGNvcnJlc3BvbmRlbiBhIGNhZGEgb2N1cGFkZSwgc2Vnw7puIGxhIHRhYmxhIGRlIGVxdWl2YWxlbmNpYXMgZGUgSU5ERUMsIHBhcmEgbHVlZ28gY29tcGFyYXJsYSBjb24gZWwgSW5ncmVzbyBUb3RhbCBJbmRpdmlkdWFsLg0KPGJyPjxicj4NCkVsIGRvY3VtZW50byBzZSByZWFsaXrDsyB1dGlsaXphbmRvIGVsIGxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24gUi4gUGFyYSBsZXMgY3VyaW9zZXMsIHRvZG8gZWwgY8OzZGlnbyBzZSBlbmN1ZW50cmEgZGlzcG9uaWJsZSBwYXJhIHN1IGRlc2NhcmdhXjFeLiANCg0KLS0tDQoNCl4xXiBQcmVzaW9uYW5kbyBlbl8gIENvZGUgPiBEb3dubG9hZCBSbWQgX3NlIGFjY2VkZSBhIGxhIGRlc2NhcmdhIGRlIGxhIHNpbnRheGlzIGNvbXBsZXRhIGRlIGVzdGUgaW5mb3JtZS4NCjxicj48YnI+DQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiNGSU4gREVMIElORk9STUUNCmBgYA0K