Introducción
El objetivo de este trabajo es describir los atributos que diferencian entre sí a los distintos estratos de la distribución del ingreso y analizar su evolución durante el período 2016-2019.
Para conocer mejor las variables y los ponderadores que usa la EPH (y avanzar sobre terreno seguro) me propuse trabajar a partir de algunos indicadores ya elaborados por el Instituto Nacional de Estadística y Censos, más puntualmente, los que se encuentran en informe “Trabajo e Ingresos”, de la serie Informes Técnicos.
El trabajo constó de dos pasos: primero busqué reproducir a partir de los micro datos disponibles algunos de los cuadros presentes en esos informes. Una vez logrado, intenté elaborar algunos gráficos ilustrativos de esos datos. Por último, generé algunos cruzamientos nuevos, explorando las principales características de los individuos o los hogares que integran los cuantiles con los que podemos ordenar las diferentes escalas de ingreso.
El trabajo está ordenado de acuerdo a las distintas variables de ingreso disponibles: el Ingreso Total Familiar, el Ingreso per Cápita Familiar, el Ingreso Individual y el Ingreso de la Ocupación Principal.
Las estimaciones puntuales corresponden al primer trimestre de 2019, la última base disponible al momento.Las evoluciones y otras estimaciones longitudinales, hacen uso de las bases disponibles desde 2016, tras el fin de la emergencia estadística. El informe que corresponde a 2019 1Q puede accederse desde aquí: https://www.indec.gob.ar/uploads/informesdeprensa/ingresos_1trim199D0B4B3F26.pdf
trying URL 'https://www.indec.gob.ar/ftp/cuadros/menusuperior/eph/EPH_usu_1_Trim_2019_txt.zip'
Content type 'application/x-zip-compressed' length 3377209 bytes (3.2 MB)
downloaded 3.2 MB
trying URL 'https://www.indec.gob.ar/ftp/cuadros/menusuperior/eph/EPH_usu_4_Trim_2018_txt.zip'
Content type 'application/x-zip-compressed' length 3085714 bytes (2.9 MB)
downloaded 2.9 MB
trying URL 'https://www.indec.gob.ar/ftp/cuadros/menusuperior/eph/EPH_usu_1_Trim_2019_txt.zip'
Content type 'application/x-zip-compressed' length 3377209 bytes (3.2 MB)
downloaded 3.2 MB
Ingreso Total Familiar
El Ingreso Total Familiar contempla la suma del ingreso individual de todos los miembros que integran un hogar. Los siguientes dos cuadros muestran como se distribuyen los hogares según su ingreso total, ordenados en deciles.
Cuadro 1: Hogares según escala de Ingreso Total por fuente, cantidad de miembros promedio por hogar y relación de dependencia.
(Corresponden a los Cuadros 7 y 8 del informe del INDEC).
|
Escala de Ingreso |
Población |
Ingreso Total Familiar |
Decil |
Desde |
Hasta |
Hogares por decil |
Porcentaje de hogares |
Población por decil |
Porcentaje de personas |
Ingreso total por decil |
Porcentaje del Ingreso |
Ingreso medio por decil |
1 |
200 |
11,500 |
933,865 |
9.9 |
2,134,871 |
7.6 |
7,398,505,919 |
1.9 |
7,841.9 |
2 |
11,540 |
16,400 |
932,114 |
9.9 |
2,358,394 |
8.3 |
13,169,280,908 |
3.5 |
14,229.2 |
3 |
16,400 |
21,000 |
932,970 |
9.9 |
2,443,234 |
8.6 |
17,392,074,099 |
4.6 |
18,619.2 |
4 |
21,000 |
25,600 |
933,516 |
9.9 |
2,743,376 |
9.7 |
21,735,480,884 |
5.7 |
23,258.5 |
5 |
25,600 |
31,000 |
933,428 |
9.9 |
2,786,420 |
9.9 |
26,587,384,242 |
7.0 |
28,414.3 |
6 |
31,000 |
38,030 |
932,133 |
9.9 |
3,040,957 |
10.8 |
32,242,098,921 |
8.5 |
34,511.8 |
7 |
38,150 |
46,500 |
934,138 |
9.9 |
3,076,783 |
10.9 |
39,503,696,421 |
10.4 |
42,341.8 |
8 |
46,500 |
58,000 |
933,830 |
9.9 |
3,167,433 |
11.2 |
48,409,725,436 |
12.7 |
51,953.1 |
9 |
58,000 |
78,500 |
931,215 |
9.9 |
3,139,592 |
11.1 |
62,151,993,871 |
16.4 |
66,930.0 |
10 |
78,800 |
2,013,299 |
932,431 |
9.9 |
3,240,807 |
11.5 |
111,438,417,842 |
29.3 |
118,928.9 |
Los hogares más numerosos se ubican en los deciles superiores, ya que estos tienden a contar con mayor cantidad de perceptores de ingresos. Esto explica porque los deciles superiores tienen -en promedio- una mayor cantidad de miembros por hogar. Y también, porque los deciles superiores tienen un mayor porcentaje de personas en su interior. Es importante aclarar que la medición del ITF es a nivel de los hogares, como así también su ordenamiento en cuantiles.
Cuadro 2: Hogares según escala de ingreso total familiar por fuente, cantidad de miembros promedio por hogar y relación de dependencia. Total aglomerados urbanos. Primer trimestre de 2019
|
Ingresos de los Hogares |
Porcentaje de Ingresos |
|
Relación de Dependencia |
Decil |
Ingreso total por decil |
Ingresos laborales |
Ingresos no laborales |
Laborales |
No laborales |
Miembros promedio por hogar |
No ocupados cada 100 ocupados |
1 |
7,398,505,919 |
2,932,211,482 |
4,466,294,437 |
39.6 |
60.4 |
2.3 |
271 |
2 |
13,169,280,908 |
6,612,768,369 |
6,556,512,539 |
50.2 |
49.8 |
2.5 |
215 |
3 |
17,392,074,099 |
8,488,798,080 |
8,903,276,019 |
48.8 |
51.2 |
2.6 |
221 |
4 |
21,735,480,884 |
13,381,217,423 |
8,354,263,461 |
61.6 |
38.4 |
2.9 |
173 |
5 |
26,587,384,242 |
15,479,578,706 |
11,107,805,536 |
58.2 |
41.8 |
3.0 |
196 |
6 |
32,242,098,921 |
23,748,352,130 |
8,493,746,791 |
73.7 |
26.3 |
3.3 |
123 |
7 |
39,503,696,421 |
30,415,059,794 |
9,088,636,627 |
77.0 |
23.0 |
3.3 |
116 |
8 |
48,409,725,436 |
38,937,634,083 |
9,472,091,353 |
80.4 |
19.6 |
3.4 |
100 |
9 |
62,151,993,871 |
50,771,244,761 |
11,380,749,110 |
81.7 |
18.3 |
3.4 |
86 |
10 |
111,438,417,842 |
87,400,205,409 |
24,038,212,433 |
78.4 |
21.6 |
3.5 |
76 |
Los ingresos no laborales tienen un mayor peso en la economía de los hogares de menores ingresos. Esto se debe a que los integrantes de dichos hogares ganan menos, pero también, a que en ellos hay menor cantidad de ocupados. Mientras en la base de la escala hay 271 cada 100 ocupados, en la cima hay 76 cada 100 ocupados.
Gráfico 1: Hogares según escala de ingreso total familiar por sexo del jefe hogar. Total aglomerados urbanos. Primer trimestre de 2019

La distribución de los hogares según su ingreso total también está atravesada por la desigualdad de género. Los hogares de menor ingresos son hogares sostenidos mayoritariamente por mujeres, relación que se invierte a medida que avanzamos en la escala de ingresos.
Ingreso Per Cápita Familiar
A diferencia del ITF, el Ingreso Per Cápita Familiar busca controlar el efecto del tamaño de los hogares, aplicando un promedio simple de los ingresos obtenidos en cada hogar por la cantidad de integrantes.
Cuadro 3: "Hogares según escala de ingreso per cápital familiar. Total Aglomerados Urbanos. Primer Trimestre 2019.
(Corresponde al Cuadro 9 del informe del INDEC).
|
Escala de Ingreso |
Hogares |
Población |
Ingreso per cápita Familiar |
|
Decil |
Desde |
Hasta |
Hogares por decil |
Porcentaje de hogares |
Población por decil |
Porcentaje de personas |
Ingreso total por decil |
Porcentaje del Ingreso |
Ingreso medio por decil |
Miembros promedio por hogar |
1 |
100 |
4,000.0 |
934,013 |
9.9 |
4,321,402 |
15.3 |
11,768,861,364 |
3.1 |
2,723.4 |
4.6 |
2 |
4,000 |
6,008.3 |
932,463 |
9.9 |
3,889,303 |
13.8 |
19,628,426,038 |
5.2 |
5,046.8 |
4.2 |
3 |
6,018 |
8,175.0 |
933,242 |
9.9 |
3,488,101 |
12.3 |
24,805,168,251 |
6.5 |
7,111.4 |
3.7 |
4 |
8,175 |
10,000.0 |
932,240 |
9.9 |
2,944,211 |
10.4 |
26,632,453,785 |
7.0 |
9,045.7 |
3.2 |
5 |
10,000 |
12,500.0 |
932,971 |
9.9 |
2,772,494 |
9.8 |
30,786,994,152 |
8.1 |
11,104.4 |
3.0 |
6 |
12,500 |
15,000.0 |
933,331 |
9.9 |
2,523,378 |
8.9 |
34,448,173,863 |
9.1 |
13,651.6 |
2.7 |
7 |
15,000 |
19,000.0 |
932,548 |
9.9 |
2,371,449 |
8.4 |
39,327,171,194 |
10.3 |
16,583.6 |
2.5 |
8 |
19,000 |
24,333.3 |
935,972 |
10.0 |
2,109,709 |
7.5 |
45,106,725,095 |
11.9 |
21,380.5 |
2.3 |
9 |
24,350 |
35,000.0 |
929,948 |
9.9 |
2,007,919 |
7.1 |
57,648,802,824 |
15.2 |
28,710.7 |
2.2 |
10 |
35,000 |
1,006,649.5 |
932,912 |
9.9 |
1,703,901 |
6.0 |
89,875,880,911 |
23.6 |
52,747.1 |
1.8 |
Utilizando el IPCF como variable de ingreso, la relación entre el tamaño del hogar y la posición en la distribución del ingreso que vimos en el ITF se invierte. De acuerdo a su ingreso per cápita familiar, los hogares más numerosos tienden a ubicarse en la base de la escala.
Gráfico 2: Evolución del porcentaje del IPCF total de cada escala decílica entre 2016 y 2019. Total Aglomerados Urbanos. Primer Trimestre 2019.
Este gráfico muestra la participación de cada decil en el ingreso total y su evolución en los últimos tres años. Es decir, qué porcentaje representa el ingreso total de cada decil en el ingreso total de toda la población.
Según los datos, la participación no varió de manera notoria a lo largo de los últimos tres años. Mientras los ingresos del 10% más rico de la población representaban cerca del 25% del ingreso total, los del 10% más pobre significadan tan solo el 3% del ingreso total. El 30% de la población con mayores ingresos se lleva cerca de la mitad del ingreso total. El último dato de la serie, del primer trimestre de 2019, también se encuentra reflejado en el Cuadro 3.
Gráfico 3: Evolución de la brecha del ingreso per cápita familiar entre decil 10 y decil 1. Total Aglomerados Urbanos. Primer Trimestre 2019.
Otra forma de resumir la desigualdad de los ingresos es a través de la brecha de ingresos. Esta busca medir la separación entre los valores extremos de la distribución a través del cociente entre cuantiles extremos, en este caso entre el ingreso promedio del 10% más rico (decil 10) sobre el ingreso promedio del 10% más pobre (decil 1).
Factor `DECCFR` contains implicit NA, consider using `forcats::fct_explicit_na`

La evolución de este ratio en estos últimos tres años revela que, luego de una reducción de la desigualdad hacía finales del 2017, la brecha comenzó a ensancharse en el último año y medio hasta llegar a los valores actuales. De acuerdo a los datos relevados por la EPH durante el primer trimestre de 2019, el decil 10 tiene ingresos 18.1 veces superiores a los del deciles del decil 1.
Ingreso Individual
Hasta ahora trabajamos con variables que registran los ingresos a nivel de hogares. Para trabajar con los individuos como unidad de análisis, es preferible usar como variable el Ingreso Individual, que contempla los ingresos laborales y no laborales de las personas, sin considerar el hogar al que pertenezcan.
De ahora en más trabajaremos con un recorte de nuestra población, la de los perceptores de ingresos, quedando afuera de nuestra medición los individuos sin ingresos. Por ejemplo, los menores de edad, algunos tipos de estudiantes, desocupados o los trabajadores familiares sin remuneración.
Gráfico 4: Población con ingresos según escala decílica de ingreso individual por fuente y sexo. Total Aglomerados Urbanos. Primer Trimestre 2019.
(Corresponde al Gráfico 2 del informe del INDEC).

Al igual que con el ITF a nivel de los hogares, los ingresos no laborales tienen un peso más importante en los deciles de menores ingresos. Esta relación se acentúa controlando por sexo, ya que las mujeres tienen menor participación en el mercado laboral, suelen cobrar menos que los varones, y suelen suelen ser las destinatarias de las transferencias de la seguridad social.
Gráfico 5: Población con ingresos según escala decílica de ingreso individual por categoría ocupacional o de inactividad. Total Aglomerados Urbanos. Primer Trimestre 2019.
La proporción de los ingresos laborales y no laborales en cada decil de ingreso responde en parte al perfil de los individuos que integran cada cuantil. En el siguiente gráfico seleccionamos cuatro deciles con cuatro composiciones distintas: en la base de la escala (decil 1) priman asalariados, independientes (cuenta propistas) y amas de casa; en los deciles medios (deciles 3 y 5) se destaca la presencia de los jubilados; y en el decil de mayores ingresos (decil 10) asalariados, independientes y patrones.

Ingreso de la Ocupación Principal
Al igual que el ingreso individual, el ingreso de la ocupación principal se trata de un recorte del universo de la EPH, que busca precisar la manera que se reparte el ingreso en el principal ámbito distributivo: el de la actividad económica en general y el mercado de trabajo en particular.
El IOP registra el ingreso que obtienen los individuos activos como resultado de su trabajo actual o reciente. En el caso de tener más de uno, el ingreso del que declara como principal.
Grafico 6: Población ocupada según escala decílica de ingreso de la ocupación principal por nivel educativo. Total Aglomerados Urbanos. Primer Trimestre 2019.
Como primera aproximación a la escala de ingresos de la ocupación principal, los siguientes gráficos ilustran la distinta composición que tienen algunos deciles seleccionados. A medida que se avanza en la escala decílica, aumenta el porcentaje de los ocupados con mayor nivel educativo.




Se trata de una de las múltiples maneras de abordar la desigualdad de los ingresos laborales. Quizás, la más obvia.
A modo de propuesta para continuar el trabajo por nuestra cuenta, consideramos relevante la descripción de los deciles según la edad y el sexo de sus integrantes, su categoría ocupacional, la calificación de sus tareas, el tamaño de los establecimientos donde trabajan, y la tenencia descuento jubilatorio.
Dudas y Consultas
A la hora de usar el IPCF, no pude trabajar a nivel de la población, sino a nivel de hogares, porque el ponderador que le corresponde corresponde al nivel de hogares. Sin embargo, el informe del INDEC de ingresos labura el IPCF a nivel de las personas (Cuadro 3. Población según escala de ingreso per cápita familiar). ¿Cómo se puede hacer?
¿Qué ponderadores usar para el ingreso de las otras ocupaciones (Tot_p12) y para los ingresos no laborales (T_VI)?
A la hora de calcular el porcentaje de ingresos laborales y no laborales de cada escala de ingreso total familiar, tuve problemas para calcular el total del ingreso laboral de cada decil de ITF a partir de las variables p21+Tot_P12. Siempre me daba una cifra menor a la del informe, cómo se me faltara una fuente de ingresos laborales más. No tuve ese problema para calcular el total de ingresos no laborales a partir de T_VI. Los números de mi cuadro y los del informe del INDEC me terminaron coincidiendo cuando calcula el total del ingreso laboral como una diferencia entre el total de P47T - el total de los ingresos no laborales de cada decil de ITF.
En el gráfico Gráfico 2, que representa la evolución de la participación de cada decil en el ingreso total, no pude lograr que el gráfico interactivo con gploty se extienda en todo el ancho de la página del archivo rmd. No tuve problema cuando lo publique como html, pero si como notebook.
Me hubiera gustado presentar los waffle chart de las escalas IOP según nivel educativo con etiquetas con los porcentajes, y en un grid de dos columnas. Primero, intenté usar un facet_grid, con un tabla de data de 100x10, pero siempre me daba error. Por eso opté por graficar cada waffle a través de una funció. Luego, usé gridExtra::grid.arrange, pero me achataba mucho el alto de cada waffle. Cualquier consejo se agradece.
En la fase de elaboración, trabaje el tamaño del establecimiento incorporando a la misma el trabajo en casas particulares. Entre los valores disponibles en la variable PP04B1 figura “2”, pero este valor no figura en el diseño de registro. ¿Saben qué significa?
LS0tDQp0aXRsZTogIkludHJvZHVjY2nDs24gYSBSIHBhcmEgQ2llbmNpYXMgU29jaWFsZXMiDQpzdWJ0aXRsZTogVHJhYmFqbyBGaW5hbA0KYXV0aG9yOiBUb23DoXMgUG9udCBWZXJnw6lzDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICANCi0tLQ0KDQpgYGB7ciBzZXR1cCxlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGKQ0KDQojcGFxdWV0ZXMgbmVjZXNhcmlvcyANCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoZXBoKQ0KbGlicmFyeSh0cmVlbWFwaWZ5KQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoaHRtbHdpZGdldHMpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJ0cmVlbWFwIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJ0cmVlbWFwaWZ5IikNCiNpbnN0YWxsLnBhY2thZ2VzKCJrYWJsZUV4dHJhIikNCiNpbnN0YWxsLnBhY2thZ2VzKHBsb3RseSkNCiNpbnN0YWxsLnBhY2thZ2VzKGh0bWx3aWRnZXRzKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJncmlkRXh0cmEiKQ0KIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoJ2JiYy9iYnBsb3QnKQ0KDQojcGFxdWV0ZXMgcHJvYmFkb3MgeSBkZXNjYXJ0YWRvcw0KI2xpYnJhcnkoYmJwbG90KQ0KI2xpYnJhcnkodHJlZW1hcCkNCiMgbGlicmFyeShncmlkRXh0cmEpDQoNCg0KYGBgDQoNCiMjIEludHJvZHVjY2nDs24NCg0KRWwgb2JqZXRpdm8gZGUgZXN0ZSB0cmFiYWpvIGVzIGRlc2NyaWJpciBsb3MgYXRyaWJ1dG9zIHF1ZSBkaWZlcmVuY2lhbiBlbnRyZSBzw60gYSBsb3MgZGlzdGludG9zIGVzdHJhdG9zIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIGluZ3Jlc28geSBhbmFsaXphciBzdSBldm9sdWNpw7NuIGR1cmFudGUgZWwgcGVyw61vZG8gMjAxNi0yMDE5LiANCg0KUGFyYSBjb25vY2VyIG1lam9yIGxhcyB2YXJpYWJsZXMgeSBsb3MgcG9uZGVyYWRvcmVzIHF1ZSB1c2EgbGEgRVBIICh5IGF2YW56YXIgc29icmUgdGVycmVubyBzZWd1cm8pIG1lIHByb3B1c2UgdHJhYmFqYXIgYSBwYXJ0aXIgZGUgYWxndW5vcyBpbmRpY2Fkb3JlcyB5YSBlbGFib3JhZG9zIHBvciBlbCBJbnN0aXR1dG8gTmFjaW9uYWwgZGUgRXN0YWTDrXN0aWNhIHkgQ2Vuc29zLCBtw6FzIHB1bnR1YWxtZW50ZSwgbG9zIHF1ZSBzZSBlbmN1ZW50cmFuIGVuIGluZm9ybWUgIlRyYWJham8gZSBJbmdyZXNvcyIsIGRlIGxhIHNlcmllIEluZm9ybWVzIFTDqWNuaWNvcy4NCg0KRWwgdHJhYmFqbyBjb25zdMOzIGRlIGRvcyBwYXNvczogcHJpbWVybyBidXNxdcOpIHJlcHJvZHVjaXIgYSBwYXJ0aXIgZGUgbG9zIG1pY3JvIGRhdG9zIGRpc3BvbmlibGVzIGFsZ3Vub3MgZGUgbG9zIGN1YWRyb3MgcHJlc2VudGVzIGVuIGVzb3MgaW5mb3JtZXMuIFVuYSB2ZXogbG9ncmFkbywgaW50ZW50w6kgZWxhYm9yYXIgYWxndW5vcyBncsOhZmljb3MgaWx1c3RyYXRpdm9zIGRlIGVzb3MgZGF0b3MuIFBvciDDumx0aW1vLCBnZW5lcsOpIGFsZ3Vub3MgY3J1emFtaWVudG9zIG51ZXZvcywgZXhwbG9yYW5kbyBsYXMgcHJpbmNpcGFsZXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBsb3MgaW5kaXZpZHVvcyBvIGxvcyBob2dhcmVzIHF1ZSBpbnRlZ3JhbiBsb3MgY3VhbnRpbGVzIGNvbiBsb3MgcXVlIHBvZGVtb3Mgb3JkZW5hciBsYXMgZGlmZXJlbnRlcyBlc2NhbGFzIGRlIGluZ3Jlc28uIA0KDQpFbCB0cmFiYWpvIGVzdMOhIG9yZGVuYWRvIGRlIGFjdWVyZG8gYSBsYXMgZGlzdGludGFzIHZhcmlhYmxlcyBkZSBpbmdyZXNvIGRpc3BvbmlibGVzOiBlbCBJbmdyZXNvIFRvdGFsIEZhbWlsaWFyLCBlbCBJbmdyZXNvIHBlciBDw6FwaXRhIEZhbWlsaWFyLCBlbCBJbmdyZXNvIEluZGl2aWR1YWwgeSBlbCBJbmdyZXNvIGRlIGxhIE9jdXBhY2nDs24gUHJpbmNpcGFsLiANCg0KTGFzIGVzdGltYWNpb25lcyBwdW50dWFsZXMgY29ycmVzcG9uZGVuIGFsIHByaW1lciB0cmltZXN0cmUgZGUgMjAxOSwgbGEgw7psdGltYSBiYXNlIGRpc3BvbmlibGUgYWwgbW9tZW50by5MYXMgZXZvbHVjaW9uZXMgeSBvdHJhcyBlc3RpbWFjaW9uZXMgbG9uZ2l0dWRpbmFsZXMsIGhhY2VuIHVzbyBkZSBsYXMgYmFzZXMgZGlzcG9uaWJsZXMgZGVzZGUgMjAxNiwgdHJhcyBlbCBmaW4gZGUgbGEgZW1lcmdlbmNpYSBlc3RhZMOtc3RpY2EuIEVsIGluZm9ybWUgcXVlIGNvcnJlc3BvbmRlIGEgMjAxOSAxUSBwdWVkZSBhY2NlZGVyc2UgZGVzZGUgYXF1w606DQpodHRwczovL3d3dy5pbmRlYy5nb2IuYXIvdXBsb2Fkcy9pbmZvcm1lc2RlcHJlbnNhL2luZ3Jlc29zXzF0cmltMTk5RDBCNEIzRjI2LnBkZg0KDQoNCmBgYHtyIGJhc2VzLCBlY2hvPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgQ3JlbyB2ZWN0b3JlcyBjb24gcmVjb3J0ZXMgZGUgdmFyaWFibGVzIHBhcmEgYWxpdmlhbmFyIGxhcyBiYXNlcyBjb24gc2VsZWN0LiANCg0KdmFyaWFibGVzIDwtIGMoIkNPRFVTVSIsIk5ST19IT0dBUiIsIkNPTVBPTkVOVEUiLCJBTk80IiwiVFJJTUVTVFJFIiwiUkVHSU9OIiwNCiAgICAgICAgICAgICAgICJBR0xPTUVSQURPIiwiQ0gwMyIsIkNIMDQiLCJDSDA2IiwiRVNUQURPIiwiQ0FUX09DVVAiLCJDQVRfSU5BQyIsDQogICAgICAgICAgICAgICAiTklWRUxfRUQiLCJQUDA3SCIsIlBQMDRCMSIsIlBQMDRBIiwiUFAwNEMiLCJQUDA0RF9DT0QiLA0KICAgICAgICAgICAgICAgIlA0N1QiLCJQMjEiLCJUT1RfUDEyIiwiVF9WSSIsIklURiIsIklQQ0YiLA0KICAgICAgICAgICAgICAgIlBPTkRFUkEiLCJQT05ESUkiLCJQT05ESUlPIiwiUE9ORElIIiwNCiAgICAgICAgICAgICAgICJERUNJTkRSIiwiREVDT0NVUiIsIkRFQ0lGUiIsIkRFQ0NGUiIgKQ0KDQp2YXJpYWJsZXMuYnJlY2hhIDwtIGMoIkNPRFVTVSIsIk5ST19IT0dBUiIsIkFOTzQiLCJUUklNRVNUUkUiLCJFU1RBRE8iLCJQT05ESUlPIiwiUDIxIiwiREVDT0NVUiIsIklQQ0YiLCJERUNDRlIiLCJQT05ESUgiKQ0KDQojTGV2YW50byBsYSDDumx0aW1hIGJhc2UgaW5kaXZpZHVhbCBkaXNwb25pYmxlICgxdDIwMTkpIHBhcmEgbGEgcmVwcm9kdWNjacOzbiBkZSBjdWFkcm9zIGRlIGRpc3RyaWJ1Y2nDs24gZGVsIEluZ3Jlc28uIA0KDQpiYXNlXzE5dDFfaW5kIDwtIGdldF9taWNyb2RhdGEoeWVhciA9IDIwMTksIHRyaW1lc3RlciA9IDEsIHR5cGUgPSAnaW5kaXZpZHVhbCcpDQojYmFzZV8xOXQxX2luZCA8LSBvcmdhbml6ZV9sYWJlbHMoYmFzZV8xOXQxX2luZCwgdHlwZT0naW5kaXZpZHVhbCcpDQoNCmJhc2VfMTl0MV9pbmRfY3V0IDwtIGJhc2VfMTl0MV9pbmQgJT4lIHNlbGVjdCh2YXJpYWJsZXMpDQoNCiNyZW11ZXZvIGxhIGJhc2Ugbm8gcmVjb3J0YWRhIHBhcmEgYWxpdmlhbmFyIGVsIGVudmlyb25tZW50DQogIHJtKGJhc2VfMTl0MV9pbmQpDQoNCiNMZXZhbnRvIGNvbiB1biBtYXAgdG9kYXMgbGFzIGJhc2VzIGluZGl2aWR1YWxlcyBkaXNwb25pYmxlcyBlbiBsb3MgYcOxb3MgMjAxNi0yMDE5IHBhcmEgZWwgY8OhbGN1bG8gZGUgZXZvbHVjaW9uZXMuIA0KDQojIGNyZW8gdW4gbWFwIGRlIGdldF9taWNyb2RhdGEgcGFyYSBiYWphciB0b2RhcyBsYXMgYmFzZXMgDQogIGJhc2VfZGYxNiA8LSBtYXAyX2RmciAoMjAxNiwyOjQsZ2V0X21pY3JvZGF0YSkgJT4lIHNlbGVjdCh2YXJpYWJsZXMuYnJlY2hhKQ0KICBiYXNlX2RmMTcgPC0gbWFwMl9kZnIgKDIwMTcsMTo0LGdldF9taWNyb2RhdGEpICU+JSBzZWxlY3QodmFyaWFibGVzLmJyZWNoYSkNCiAgYmFzZV9kZjE4IDwtIG1hcDJfZGZyICgyMDE4LDE6NCxnZXRfbWljcm9kYXRhKSAlPiUgc2VsZWN0KHZhcmlhYmxlcy5icmVjaGEpIA0KICBiYXNlXzE5dDFfaW5kIDwtIGdldF9taWNyb2RhdGEoeWVhciA9IDIwMTksIHRyaW1lc3RlciA9IDEsIHR5cGUgPSAnaW5kaXZpZHVhbCcpICU+JSBzZWxlY3QodmFyaWFibGVzLmJyZWNoYSkNCiN1bmlmaWNhbW9zIHRvZG9zIGxvcyBkZiBlbiB1bmkNCiAgYmFzZV8xNl8xOSA8LSBiaW5kX3Jvd3MoYmFzZV9kZjE2LGJhc2VfZGYxNyxiYXNlX2RmMTgsYmFzZV8xOXQxX2luZCkNCiAgDQojcmVtdWV2byBsb3MgZGYgaW5zdW1vIHBhcmEgZm9ybWFyIGJhc2VfMTZfMTkgeSBhbGl2aWFuYXIgZWwgZW52aXJvbm1lbnQNCiAgcm0oYmFzZV9kZjE2LGJhc2VfZGYxNyxiYXNlX2RmMTgsYmFzZV8xOXQxX2luZCkNCmBgYA0KDQoNCmBgYHtyIHRvdGFsZXMsIGVjaG89RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIFRhYmxhIGRlIHZhbG9yZXMgYWdyZWdhZG9zIHRvdGFsIEVQSCAoc2luIGRlY2lsZXMpLCBwYXJhIGVsIGNhbGN1bG8gZGUgcG9yY2VudGFqZXMuDQp0b3RhbGVzX2luZ3Jlc29zIDwtIGJhc2VfMTl0MV9pbmRfY3V0ICU+JSANCiAgc3VtbWFyaXNlKA0KICAgICAgICAgICAgaXBjZl90b3RhbCA9IHJvdW5kIChzdW0gKElQQ0YgKlBPTkRJSCxuYS5ybSA9IFRSVUUpLDEpLCANCiAgICAgICAgICAgIGl0aV90b3RhbCA9IHJvdW5kIChzdW0gKFA0N1QgKiBQT05ESUksbmEucm0gPSBUUlVFKSwxKSwNCiAgICAgICAgICAgIGlvcF90b3RhbCA9IHJvdW5kIChzdW0gKFAyMSAqUE9ORElJTyxuYS5ybSA9IFRSVUUpLDEpLA0KICAgICAgICAgICAgaXRmX3RvdGFsID0gcm91bmQgKHN1bSAoSVRGW0NIMDM9PTFdKiBQT05ESUhbQ0gwMz09MV0sbmEucm0gPSBUUlVFKSwxKSwNCiAgICAgICAgICAgIHRvdGFsY2Fzb3NfcG9uZGloID0gc3VtIChQT05ESUgsbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHRvdGFsaF9wb25kaWggPSBzdW0gKFBPTkRJSFtDSDAzPT0xXSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgdG90YWxfcG9uZGlpID0gc3VtIChQT05ESUksbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHRvdGFsX3BvbmRpaW8gPSBzdW0gKFBPTkRJSU9bRVNUQURPPT0xXSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgKQ0KYGBgDQoNCiMjIEluZ3Jlc28gVG90YWwgRmFtaWxpYXINCg0KRWwgSW5ncmVzbyBUb3RhbCBGYW1pbGlhciBjb250ZW1wbGEgbGEgc3VtYSBkZWwgaW5ncmVzbyBpbmRpdmlkdWFsIGRlIHRvZG9zIGxvcyBtaWVtYnJvcyBxdWUgaW50ZWdyYW4gdW4gaG9nYXIuIA0KTG9zIHNpZ3VpZW50ZXMgZG9zIGN1YWRyb3MgbXVlc3RyYW4gY29tbyBzZSBkaXN0cmlidXllbiBsb3MgaG9nYXJlcyBzZWfDum4gc3UgaW5ncmVzbyB0b3RhbCwgb3JkZW5hZG9zIGVuIGRlY2lsZXMuIA0KDQoNCmBgYHtyIElURiBEYXRvcywgZWNobz1UUlVFLGluY2x1ZGU9RkFMU0V9DQojUEFTTyAxOiBwcm9jZXNvIGRhdG9zIA0KDQplc2NhbGFfaXRmIDwtIGJhc2VfMTl0MV9pbmRfY3V0ICU+JSANCiAgc2VsZWN0KENPRFVTVSxOUk9fSE9HQVIsQ0gwMyxDSDA0LENIMDYsQ09NUE9ORU5URSxFU1RBRE8sUDQ3VCxUX1ZJLERFQ0lGUixQT05ESUgsSVRGKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09EVVNVLE5ST19IT0dBUikgJT4lIA0KICAgIG11dGF0ZShtaWVtYnJvc19oID0gbWF4KENPTVBPTkVOVEUpKSU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIGZpbHRlcihERUNJRlIlaW4lIGMoMToxMCkpICU+JSANCiAgICBncm91cF9ieShERUNJRlIpICAlPiUgDQogICAgc3VtbWFyaXNlKA0KICAgICAgICAjQ0FOVElEQUQgREUgQ0FTT1MgWSBIT0dBUkVTIFBPUiBERUNJTA0KICAgICAgICAgICAgICBjYW50X2hvZ2FyZXNfZGVjaWwgPSBzdW0oUE9ORElIW0NIMDM9PTFdKSwNCiAgICAgICAgICAgICAgY2FudF9jYXNvc19kZWNpbCA9IHN1bShQT05ESUgpLA0KICAgICAgICAgICAgICBob2dfeGRlY2lsID0gcm91bmQoDQogICAgICAgICAgICAgIGNhbnRfaG9nYXJlc19kZWNpbC90b3RhbGVzX2luZ3Jlc29zJHRvdGFsaF9wb25kaWgsMykqMTAwLA0KICAgICAgICAgICAgICBwb2JsX3hkZWNpbCA9IHJvdW5kKA0KICAgICAgICAgICAgICBjYW50X2Nhc29zX2RlY2lsL3RvdGFsZXNfaW5ncmVzb3MkdG90YWxjYXNvc19wb25kaWgsMykqMTAwLA0KICAgICAgICAjUFJPTUVESU8gREUgTUlFTUJST1MgUE9SIEhPR0FSDQogICAgICAgICAgICAgIG1pZW1icm9zcG9yaG9nX0RFQ0lGUiA9IHJvdW5kKGNhbnRfY2Fzb3NfZGVjaWwgLyBjYW50X2hvZ2FyZXNfZGVjaWwsMSksDQogICAgICAgICNQT1JDRU5UQUpFIERFTCBJTkdSRVNPIFRPVEFMIERFIENBREEgREVDSUwgRSBJTkdSRVNPIFBST01FRElPDQogICAgICAgICAgICAgIGl0Zl9taW4gPSByb3VuZChtaW4oSVRGKSwxKSwNCiAgICAgICAgICAgICAgaXRmX21heCA9IHJvdW5kKG1heChJVEYpLDEpLA0KICAgICAgICAgICAgICBZX3RvdF9ERUNJRlIgPSBzdW0gKElURltDSDAzPT0xXSAqUE9ORElIW0NIMDM9PTFdKSwNCiAgICAgICAgICAgICAgREVDSUZSX2l0Zl90b3RhbCA9IHJvdW5kKFlfdG90X0RFQ0lGUi90b3RhbGVzX2luZ3Jlc29zJGl0Zl90b3RhbCwzKSoxMDAsDQogICAgICAgICAgICAgIGl0Zl9wcm9tZWRpb194ZGVjaWwgPSByb3VuZCh3ZWlnaHRlZC5tZWFuKElURix3ID0gUE9ORElIKSwxKSwNCiAgICAgICAgI1JFTEFDScOTTiBJTkdSRVNPUyBMQUJPUkFMRVMgWSBOTyBMQUJPUkFMRVMNCiAgICAgICAgICAgICAgWV9ub2xhYl9ERUNJRlIgPSBzdW0gKFRfVklbVF9WST4wXSpQT05ESUhbVF9WST4wXSksDQogICAgICAgICAgICAgIFlfbGFiX0RFQ0lGUiA9IHN1bShQNDdUW1A0N1Q+MF0qUE9ORElIW1A0N1Q+MF0pIC0gWV9ub2xhYl9ERUNJRlIsDQogICAgICAgICAgICAgIGNvbnRyb2xfWV90b3QgPSBZX2xhYl9ERUNJRlIgKyAgWV9ub2xhYl9ERUNJRlIsDQogICAgICAgICAgICAgIHBvcmNlbnRhamVfWWxhYiA9IHJvdW5kKFlfbGFiX0RFQ0lGUi9ZX3RvdF9ERUNJRlIsMykqMTAwLA0KICAgICAgICAgICAgICBwb3JjZW50YWplX1lub2xhYiA9IHJvdW5kKFlfbm9sYWJfREVDSUZSL1lfdG90X0RFQ0lGUiwzKSoxMDAsDQogICAgICAgICNSRUxBQ0nDk04gREUgREVQRU5ERU5DSUEgWSBQRVJDRVBDScOTTiBERSBJTkdSRVNPUw0KICAgICAgICAgICAgICBvY3VwYWRvc194ZGVjaWwgPSBzdW0gKFBPTkRJSFtFU1RBRE89PTFdKSwNCiAgICAgICAgICAgICAgbm9fb2N1cGFkb3NfeGRlY2lsID0gc3VtIChQT05ESUhbRVNUQURPPjFdKSwNCiAgICAgICAgICAgICAgbm9fb2N1cGFkb3Nfb2N1cGFkb3MgPSByb3VuZChub19vY3VwYWRvc194ZGVjaWwvb2N1cGFkb3NfeGRlY2lsLDIpKjEwMCwNCiAgICAgICAgI1NFWE8gREVMIEpFRkUgREUgSE9HQVINCiAgICAgICAgICAgICAgY2FudF9qZWZlc19kZWNpbD1zdW0oUE9ORElIW0NPTVBPTkVOVEU9PTEmQ0gwND09MV0pLA0KICAgICAgICAgICAgICBjYW50X2plZmFzX2RlY2lsPXN1bShQT05ESUhbQ09NUE9ORU5URT09MSZDSDA0PT0yXSksDQogICAgICAgICAgICAgIHBvcmNlbnRhamVfamVmZXM9cm91bmQoY2FudF9qZWZlc19kZWNpbC9jYW50X2hvZ2FyZXNfZGVjaWwsMikqMTAwLA0KICAgICAgICAgICAgICBwb3JjZW50YWplX2plZmFzPXJvdW5kKGNhbnRfamVmYXNfZGVjaWwvY2FudF9ob2dhcmVzX2RlY2lsLDIpKjEwMA0KICAgICAgICAgICAgICApDQogICAgICAgICAgICAgIA0KYGBgDQoNCiMjIyBDdWFkcm8gMTogSG9nYXJlcyBzZWfDum4gZXNjYWxhIGRlIEluZ3Jlc28gVG90YWwgcG9yIGZ1ZW50ZSwgY2FudGlkYWQgZGUgbWllbWJyb3MgcHJvbWVkaW8gcG9yIGhvZ2FyIHkgcmVsYWNpw7NuIGRlIGRlcGVuZGVuY2lhLiANCihDb3JyZXNwb25kZW4gYSBsb3MgQ3VhZHJvcyA3IHkgOCBkZWwgaW5mb3JtZSBkZWwgSU5ERUMpLg0KDQpgYGB7ciBJVEYgQ3VhZHJvIDEsIGVjaG89RkFMU0V9DQoNCiMgUEFTTyAyIC0gQ29ycmpvIG5vbWJyZXMgeSByZWNvcnRvIGxhcyB2YXJpYWJsZXMgY29uIHNlbGVjdA0KY3VhZHJvNyA8LSBlc2NhbGFfaXRmICU+JSANCnJlbmFtZShEZWNpbD1ERUNJRlIsDQogICAgICAgRGVzZGU9aXRmX21pbiwNCiAgICAgICBIYXN0YT1pdGZfbWF4LA0KICAgICAgICJIb2dhcmVzIHBvciBkZWNpbCI9Y2FudF9ob2dhcmVzX2RlY2lsLA0KICAgICAgICJQb3JjZW50YWplIGRlIGhvZ2FyZXMiPWhvZ194ZGVjaWwsDQogICAgICAgIlBvYmxhY2nDs24gcG9yIGRlY2lsIj1jYW50X2Nhc29zX2RlY2lsLA0KICAgICAgICJQb3JjZW50YWplIGRlIHBlcnNvbmFzIj1wb2JsX3hkZWNpbCwNCiAgICAgICAiSW5ncmVzbyB0b3RhbCBwb3IgZGVjaWwiPVlfdG90X0RFQ0lGUiwNCiAgICAgICAiUG9yY2VudGFqZSBkZWwgSW5ncmVzbyI9IERFQ0lGUl9pdGZfdG90YWwsDQogICAgICAgIkluZ3Jlc28gbWVkaW8gcG9yIGRlY2lsIj0gaXRmX3Byb21lZGlvX3hkZWNpbCApICU+JSANCiAgc2VsZWN0KERlY2lsLERlc2RlLEhhc3RhLCJIb2dhcmVzIHBvciBkZWNpbCIsDQogICAgICAgICAiUG9yY2VudGFqZSBkZSBob2dhcmVzIiwiUG9ibGFjacOzbiBwb3IgZGVjaWwiLA0KICAgICAgICAgIlBvcmNlbnRhamUgZGUgcGVyc29uYXMiLCJJbmdyZXNvIHRvdGFsIHBvciBkZWNpbCIsDQogICAgICAgICAiUG9yY2VudGFqZSBkZWwgSW5ncmVzbyIsIkluZ3Jlc28gbWVkaW8gcG9yIGRlY2lsIiApDQoNCiNQQVNPIDMgLSBSZXByb2R1emNvIEN1YWRybyA3IGNvbiBwYXF1ZXRlIGthYmxlDQprYWJsZShjdWFkcm83LCBhbGlnbiA9ICJyIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImNlbnRlciIpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIkVzY2FsYSBkZSBJbmdyZXNvIiA9IDIsICJQb2JsYWNpw7NuIiA9IDQsIkluZ3Jlc28gVG90YWwgRmFtaWxpYXIiPTMpKQ0KDQpgYGANCg0KTG9zIGhvZ2FyZXMgbcOhcyBudW1lcm9zb3Mgc2UgdWJpY2FuIGVuIGxvcyBkZWNpbGVzIHN1cGVyaW9yZXMsIHlhIHF1ZSBlc3RvcyB0aWVuZGVuIGEgY29udGFyIGNvbiBtYXlvciBjYW50aWRhZCBkZSBwZXJjZXB0b3JlcyBkZSBpbmdyZXNvcy4gRXN0byBleHBsaWNhIHBvcnF1ZSBsb3MgZGVjaWxlcyBzdXBlcmlvcmVzIHRpZW5lbiAtZW4gcHJvbWVkaW8tIHVuYSBtYXlvciBjYW50aWRhZCBkZSBtaWVtYnJvcyBwb3IgaG9nYXIuIFkgdGFtYmnDqW4sIHBvcnF1ZSBsb3MgZGVjaWxlcyBzdXBlcmlvcmVzIHRpZW5lbiB1biBtYXlvciBwb3JjZW50YWplIGRlIHBlcnNvbmFzIGVuIHN1IGludGVyaW9yLiBFcyBpbXBvcnRhbnRlIGFjbGFyYXIgcXVlIGxhIG1lZGljacOzbiBkZWwgSVRGIGVzIGEgbml2ZWwgZGUgbG9zIGhvZ2FyZXMsIGNvbW8gYXPDrSB0YW1iacOpbiBzdSBvcmRlbmFtaWVudG8gZW4gY3VhbnRpbGVzLiANCg0KIyMjIEN1YWRybyAyOiBIb2dhcmVzIHNlZ8O6biBlc2NhbGEgZGUgaW5ncmVzbyB0b3RhbCBmYW1pbGlhciBwb3IgZnVlbnRlLCBjYW50aWRhZCBkZSBtaWVtYnJvcyBwcm9tZWRpbyBwb3IgaG9nYXIgeSByZWxhY2nDs24gZGUgZGVwZW5kZW5jaWEuIFRvdGFsIGFnbG9tZXJhZG9zIHVyYmFub3MuIFByaW1lciB0cmltZXN0cmUgZGUgMjAxOQ0KDQpgYGB7ciBJVEYgQ3VhZHJvIDIsIGVjaG89RkFMU0V9DQoNCiMgUEFTTyAyIC0gQ29ycmpvIG5vbWJyZXMgeSByZWNvcnRvIGxhcyB2YXJpYWJsZXMgY29uIHNlbGVjdA0KY3VhZHJvOCA8LSBlc2NhbGFfaXRmICU+JSANCnJlbmFtZShEZWNpbD1ERUNJRlIsDQogICAgICAgIkluZ3Jlc28gdG90YWwgcG9yIGRlY2lsIj1ZX3RvdF9ERUNJRlIsDQogICAgICAgIkluZ3Jlc29zIGxhYm9yYWxlcyIgPSBZX2xhYl9ERUNJRlIsDQogICAgICAgIkluZ3Jlc29zIG5vIGxhYm9yYWxlcyIgPVlfbm9sYWJfREVDSUZSLA0KICAgICAgICJMYWJvcmFsZXMiPXBvcmNlbnRhamVfWWxhYiwNCiAgICAgICAiTm8gbGFib3JhbGVzIj1wb3JjZW50YWplX1lub2xhYiwNCiAgICAgICAiTWllbWJyb3MgcHJvbWVkaW8gcG9yIGhvZ2FyIiA9IG1pZW1icm9zcG9yaG9nX0RFQ0lGUiwNCiAgICAgICAiTm8gb2N1cGFkb3MgY2FkYSAxMDAgb2N1cGFkb3MiID0gbm9fb2N1cGFkb3Nfb2N1cGFkb3MsDQogICAgICAgIyJDYW50aWRhZCBkZSBubyBwZXJjZXB0b3JlcyBjYWRhIDEwMCBwZXJjZXB0b3JlcyIgPSBmYWx0YSwNCiAgICAgICApICU+JSANCiAgc2VsZWN0KERlY2lsLCJJbmdyZXNvIHRvdGFsIHBvciBkZWNpbCIsDQogICAgICAgICAiSW5ncmVzb3MgbGFib3JhbGVzIiwiSW5ncmVzb3Mgbm8gbGFib3JhbGVzIiwNCiAgICAgICAgICJMYWJvcmFsZXMiLCAiTm8gbGFib3JhbGVzIiwNCiAgICAgICAgICJNaWVtYnJvcyBwcm9tZWRpbyBwb3IgaG9nYXIiLA0KICAgICAgICAgIk5vIG9jdXBhZG9zIGNhZGEgMTAwIG9jdXBhZG9zIikNCg0KI1BBU08gMyAtIFJlcHJvZHV6Y28gQ3VhZHJvIDggY29uIHBhcXVldGUga2FibGUNCmthYmxlKGN1YWRybzgsIGFsaWduID0gInIiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAiY2VudGVyIikgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiSW5ncmVzb3MgZGUgbG9zIEhvZ2FyZXMiID0gMywgIlBvcmNlbnRhamUgZGUgSW5ncmVzb3MiID0gMiwiICIgPSAxLCJSZWxhY2nDs24gZGUgRGVwZW5kZW5jaWEiPTEpKQ0KDQppbmxpbmUxPC0gY3VhZHJvOCRgTm8gb2N1cGFkb3MgY2FkYSAxMDAgb2N1cGFkb3NgW2N1YWRybzgkRGVjaWw9PTFdDQppbmxpbmUyPC0gY3VhZHJvOCRgTm8gb2N1cGFkb3MgY2FkYSAxMDAgb2N1cGFkb3NgW2N1YWRybzgkRGVjaWw9PTEwXQ0KICAgICAgIA0KYGBgDQoNCkxvcyBpbmdyZXNvcyBubyBsYWJvcmFsZXMgdGllbmVuIHVuIG1heW9yIHBlc28gZW4gbGEgZWNvbm9tw61hIGRlIGxvcyBob2dhcmVzIGRlIG1lbm9yZXMgaW5ncmVzb3MuIEVzdG8gc2UgZGViZSBhIHF1ZSBsb3MgaW50ZWdyYW50ZXMgZGUgZGljaG9zIGhvZ2FyZXMgZ2FuYW4gbWVub3MsIHBlcm8gdGFtYmnDqW4sIGEgcXVlIGVuIGVsbG9zIGhheSBtZW5vciBjYW50aWRhZCBkZSBvY3VwYWRvcy4gIE1pZW50cmFzIGVuIGxhIGJhc2UgZGUgbGEgZXNjYWxhIGhheSBgciBpbmxpbmUxYCBjYWRhIDEwMCBvY3VwYWRvcywgZW4gbGEgY2ltYSBoYXkgYHIgaW5saW5lMmAgY2FkYSAxMDAgb2N1cGFkb3MuIA0KDQoNCiMjIyBHcsOhZmljbyAxOiBIb2dhcmVzIHNlZ8O6biBlc2NhbGEgZGUgaW5ncmVzbyB0b3RhbCBmYW1pbGlhciBwb3Igc2V4byBkZWwgamVmZSBob2dhci4gVG90YWwgYWdsb21lcmFkb3MgdXJiYW5vcy4gUHJpbWVyIHRyaW1lc3RyZSBkZSAyMDE5DQpgYGB7ciBJVEYgR3JhZmljbyAxLCBlY2hvPUZBTFNFfQ0KDQpkYXRhX2dyYWZfMSA8LSBlc2NhbGFfaXRmICU+JSANCiAgc2VsZWN0KERFQ0lGUixwb3JjZW50YWplX2plZmFzLHBvcmNlbnRhamVfamVmZXMpICU+JSANCiAgcmVuYW1lKERlY2lsPURFQ0lGUiwNCiAgICAgICAgIE11amVyZXM9cG9yY2VudGFqZV9qZWZhcywNCiAgICAgICAgIFZhcm9uZXM9cG9yY2VudGFqZV9qZWZlcykgJT4lIA0KICBnYXRoZXIoc2V4byxwcm9wb3JjaW9uLDI6MykNCg0KZ2dwbG90KGRhdGFfZ3JhZl8xLCBhZXMoRGVjaWwscHJvcG9yY2lvbixmaWxsPXNleG8sbGFiZWwgPSBzcHJpbnRmKCIlMS4xZiUlIixwcm9wb3JjaW9uKSkpICsNCmdlb21fY29sKHBvc2l0aW9uPSJmaWxsIixhbHBoYT0wLjgsKSsgDQpnZW9tX2xhYmVsKHBvc2l0aW9uID0gImZpbGwiLCBzaXplPTIuOCkrDQogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIikrDQogIHRoZW1lX3BhbmRlcigpKw0KICBsYWJzKHk9IlBvcmNlbnRhamUiLA0KICAgICAgICAgdGl0bGUgPSJIb2dhcmVzIHNlZ8O6biBlc2NhbGEgZGUgaW5ncmVzbyB0b3RhbCBmYW1pbGlhciBwb3Igc2V4byBkZWwgamVmZSBkZSBob2dhciIsDQogICAgICAgICBzdWJ0aXRsZSA9ICJUb3RhbCBBZ2xvbWVyYWRvcyB1cmJhbm9zLiBQcmltZXIgVHJpbWVzdHJlIGRlIDIwMTkiDQogICAgICAgICApKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICkgDQoNCmBgYA0KDQpMYSBkaXN0cmlidWNpw7NuIGRlIGxvcyBob2dhcmVzIHNlZ8O6biBzdSBpbmdyZXNvIHRvdGFsIHRhbWJpw6luIGVzdMOhIGF0cmF2ZXNhZGEgcG9yIGxhIGRlc2lndWFsZGFkIGRlIGfDqW5lcm8uIExvcyBob2dhcmVzIGRlIG1lbm9yIGluZ3Jlc29zIHNvbiBob2dhcmVzIHNvc3Rlbmlkb3MgbWF5b3JpdGFyaWFtZW50ZSBwb3IgbXVqZXJlcywgcmVsYWNpw7NuIHF1ZSBzZSBpbnZpZXJ0ZSBhIG1lZGlkYSBxdWUgYXZhbnphbW9zIGVuIGxhIGVzY2FsYSBkZSBpbmdyZXNvcy4gDQoNCiMjIEluZ3Jlc28gUGVyIEPDoXBpdGEgRmFtaWxpYXINCg0KQSBkaWZlcmVuY2lhIGRlbCBJVEYsIGVsIEluZ3Jlc28gUGVyIEPDoXBpdGEgRmFtaWxpYXIgYnVzY2EgY29udHJvbGFyIGVsIGVmZWN0byBkZWwgdGFtYcOxbyBkZSBsb3MgaG9nYXJlcywgYXBsaWNhbmRvIHVuIHByb21lZGlvIHNpbXBsZSBkZSBsb3MgaW5ncmVzb3Mgb2J0ZW5pZG9zIGVuIGNhZGEgaG9nYXIgcG9yIGxhIGNhbnRpZGFkIGRlIGludGVncmFudGVzLiANCg0KIyMjIEN1YWRybyAzOiAiSG9nYXJlcyBzZWfDum4gZXNjYWxhIGRlIGluZ3Jlc28gcGVyIGPDoXBpdGFsIGZhbWlsaWFyLiBUb3RhbCBBZ2xvbWVyYWRvcyBVcmJhbm9zLiBQcmltZXIgVHJpbWVzdHJlIDIwMTkuDQoNCihDb3JyZXNwb25kZSBhbCBDdWFkcm8gOSBkZWwgaW5mb3JtZSBkZWwgSU5ERUMpLg0KDQpgYGB7ciBJUENGIEN1YWRybyAzLCBlY2hvPUZBTFNFfQ0KDQojIEhvZ2FyZXMgc2Vnw7puIGVzY2FsYSBkZSBpbmdyZXNvIHBlciBjw6FwaXRhIGZhbWlsaWFyLiANCg0KI1BBU08gMTogcHJvY2VzbyBkYXRvcyBpcGNmDQoNCmVzY2FsYV9pcGNmIDwtIGJhc2VfMTl0MV9pbmRfY3V0ICU+JSANCiAgc2VsZWN0KENIMDMsREVDQ0ZSLFBPTkRJSCxJUENGLENPRFVTVSxOUk9fSE9HQVIsQ09NUE9ORU5URSkgJT4lIA0KICAgIGZpbHRlcihERUNDRlIlaW4lIGMoMToxMCkpICU+JSANCiAgICBncm91cF9ieShERUNDRlIpICAlPiUgDQogICAgc3VtbWFyaXNlKA0KICAgICAgICAjQ0FOVElEQUQgREUgQ0FTT1MgWSBIT0dBUkVTIFBPUiBERUNJTA0KICAgICAgICAgICAgICBjYW50X2hvZ2FyZXNfZGVjaWwgPSBzdW0oUE9ORElIW0NIMDM9PTFdKSwNCiAgICAgICAgICAgICAgY2FudF9jYXNvc19kZWNpbCA9IHN1bShQT05ESUgpLA0KICAgICAgICAgICAgICBob2dfeGRlY2lsID0gcm91bmQoDQogICAgICAgICAgICAgIGNhbnRfaG9nYXJlc19kZWNpbC90b3RhbGVzX2luZ3Jlc29zJHRvdGFsaF9wb25kaWgsMykqMTAwLA0KICAgICAgICAgICAgICBwb2JsX3hkZWNpbCA9IHJvdW5kKGNhbnRfY2Fzb3NfZGVjaWwvdG90YWxlc19pbmdyZXNvcyR0b3RhbGNhc29zX3BvbmRpaCwzKSoxMDAsDQogICAgICAgICNQUk9NRURJTyBERSBNSUVNQlJPUyBQT1IgSE9HQVINCiAgICAgICAgICAgICAgbWllbWJyb3Nwb3Job2dfREVDQ0ZSX2FsdDEgPSByb3VuZChjYW50X2Nhc29zX2RlY2lsIC8gY2FudF9ob2dhcmVzX2RlY2lsLDEpLA0KICAgICAgICAjUE9SQ0VOVEFKRSBERUwgSU5HUkVTTyBUT1RBTCBERSBDQURBIERFQ0lMIEUgSU5HUkVTTyBQUk9NRURJTw0KICAgICAgICAgICAgICBJUENGX21pbiA9IHJvdW5kKG1pbihJUENGKSwxKSwNCiAgICAgICAgICAgICAgSVBDRl9tYXggPSByb3VuZChtYXgoSVBDRiksMSksDQogICAgICAgICAgICAgIGlwY2ZfcHJvbWVkaW9feGRlY2lsID0gcm91bmQod2VpZ2h0ZWQubWVhbihJUENGLHcgPSBQT05ESUgpLDEpLA0KICAgICAgICAgICAgICBZX3RvdF9ERUNDRlIgPSBzdW0gKElQQ0YgKlBPTkRJSCksDQogICAgICAgICAgICAgIERFQ0NGUl9pcGNmX3RvdGFsID0gcm91bmQoWV90b3RfREVDQ0ZSL3RvdGFsZXNfaW5ncmVzb3MkaXBjZl90b3RhbCwzKSoxMDANCiAgICAgICAgICAgICAgKQ0KDQojIFBBU08gMiAtIENvcnJqbyBub21icmVzIHkgcmVjb3J0byBsYXMgdmFyaWFibGVzIGNvbiBzZWxlY3QNCmN1YWRybzkgPC0gZXNjYWxhX2lwY2YgJT4lIA0KcmVuYW1lKERlY2lsPURFQ0NGUiwNCiAgICAgICBEZXNkZT1JUENGX21pbiwNCiAgICAgICBIYXN0YT1JUENGX21heCwNCiAgICAgICAiSG9nYXJlcyBwb3IgZGVjaWwiPWNhbnRfaG9nYXJlc19kZWNpbCwNCiAgICAgICAiUG9yY2VudGFqZSBkZSBob2dhcmVzIj1ob2dfeGRlY2lsLA0KICAgICAgICJQb2JsYWNpw7NuIHBvciBkZWNpbCI9Y2FudF9jYXNvc19kZWNpbCwNCiAgICAgICAiUG9yY2VudGFqZSBkZSBwZXJzb25hcyI9cG9ibF94ZGVjaWwsDQogICAgICAgIkluZ3Jlc28gdG90YWwgcG9yIGRlY2lsIj1ZX3RvdF9ERUNDRlIsDQogICAgICAgIlBvcmNlbnRhamUgZGVsIEluZ3Jlc28iPSBERUNDRlJfaXBjZl90b3RhbCwNCiAgICAgICAiSW5ncmVzbyBtZWRpbyBwb3IgZGVjaWwiPSBpcGNmX3Byb21lZGlvX3hkZWNpbCwNCiAgICAgICAiTWllbWJyb3MgcHJvbWVkaW8gcG9yIGhvZ2FyIj1taWVtYnJvc3BvcmhvZ19ERUNDRlJfYWx0MQ0KICAgICAgICkgJT4lIA0KICBzZWxlY3QoRGVjaWwsRGVzZGUsSGFzdGEsIkhvZ2FyZXMgcG9yIGRlY2lsIiwNCiAgICAgICAgICJQb3JjZW50YWplIGRlIGhvZ2FyZXMiLCJQb2JsYWNpw7NuIHBvciBkZWNpbCIsDQogICAgICAgICAiUG9yY2VudGFqZSBkZSBwZXJzb25hcyIsIkluZ3Jlc28gdG90YWwgcG9yIGRlY2lsIiwNCiAgICAgICAgICJQb3JjZW50YWplIGRlbCBJbmdyZXNvIiwiSW5ncmVzbyBtZWRpbyBwb3IgZGVjaWwiLA0KICAgICAgICAgIk1pZW1icm9zIHByb21lZGlvIHBvciBob2dhciIpDQoNCiNQQVNPIDMgLSBSZXByb2R1emNvIEN1YWRybyA3IGNvbiBwYXF1ZXRlIGthYmxlDQprYWJsZShjdWFkcm85LCBhbGlnbiA9ICJyIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImNlbnRlciIpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIkVzY2FsYSBkZSBJbmdyZXNvIiA9IDIsIkhvZ2FyZXMiPSAyLCAiUG9ibGFjacOzbiIgPSAyLCJJbmdyZXNvIHBlciBjw6FwaXRhIEZhbWlsaWFyIj0zLCIgIiA9IDEpKQ0KDQpgYGANCg0KVXRpbGl6YW5kbyBlbCBJUENGIGNvbW8gdmFyaWFibGUgZGUgaW5ncmVzbywgbGEgcmVsYWNpw7NuIGVudHJlIGVsIHRhbWHDsW8gZGVsIGhvZ2FyIHkgbGEgcG9zaWNpw7NuIGVuIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIGluZ3Jlc28gcXVlIHZpbW9zIGVuIGVsIElURiBzZSBpbnZpZXJ0ZS4gRGUgYWN1ZXJkbyBhIHN1IGluZ3Jlc28gcGVyIGPDoXBpdGEgZmFtaWxpYXIsIGxvcyBob2dhcmVzIG3DoXMgbnVtZXJvc29zIHRpZW5kZW4gYSB1YmljYXJzZSBlbiBsYSBiYXNlIGRlIGxhIGVzY2FsYS4NCg0KIyMjIEdyw6FmaWNvIDI6IEV2b2x1Y2nDs24gZGVsIHBvcmNlbnRhamUgZGVsIElQQ0YgdG90YWwgZGUgY2FkYSBlc2NhbGEgZGVjw61saWNhIGVudHJlIDIwMTYgeSAyMDE5LiBUb3RhbCBBZ2xvbWVyYWRvcyBVcmJhbm9zLiBQcmltZXIgVHJpbWVzdHJlIDIwMTkuDQoNCmBgYHtyIElQQ0YgR3JhZmljbyAyLCBlY2hvPUZBTFNFfQ0Kb3B0aW9ucyh3aWR0aCA9IDgwMCkNCiAgICAgICAgICANCiMgRXZvbHVjacOzbiBkZWwgcG9yY2VudGFqZSBkZWwgSVBDRiB0b3RhbCBzZWfDum4gZXNjYWxhIGRlY8OtbGljYSBlbnRyZSAyMDE2IHkgMjAxOQ0KDQpiYXNlXzE2XzE5IDwtIGJhc2VfMTZfMTkgJT4lIA0KICBtdXRhdGUocGVyaW9kbz0gcGFzdGUoQU5PNCwgVFJJTUVTVFJFLCBzZXA9Jy4nKSwNCiAgICAgICAgIERFQ0NGUj1hcy5mYWN0b3IoREVDQ0ZSKSkNCg0KdG90YWxfaXBjZl8xNi4xOSA8LSBiYXNlXzE2XzE5ICU+JSANCiAgZ3JvdXBfYnkocGVyaW9kbykgICU+JSANCiAgc3VtbWFyaXNlKGlwY2ZfdG90YWwgPSBzdW0oSVBDRiAqUE9ORElILG5hLnJtID0gVFJVRSkpDQoNCnNoYXJlX2lwY2ZfMTYuMTkgPC0gYmFzZV8xNl8xOSAlPiUgDQogIGZpbHRlcihERUNDRlIlaW4lIGMoMToxMCkpICU+JSANCiAgZ3JvdXBfYnkocGVyaW9kbyxERUNDRlIpICAlPiUgDQogIHN1bW1hcmlzZShZX3RvdF9ERUNDRlIgPSBzdW0gKElQQ0YgKiBQT05ESUgpKjEwMCkgJT4lIA0KICBsZWZ0X2pvaW4oLiwgdG90YWxfaXBjZl8xNi4xOSwgYnkgPSAicGVyaW9kbyIpICU+JQ0KICBncm91cF9ieShwZXJpb2RvLERFQ0NGUikgICU+JSANCiAgc3VtbWFyaXNlKHNoYXJlX0RFQ0NGUiA9IFlfdG90X0RFQ0NGUiAvaXBjZl90b3RhbCkgDQoNCiN0aWR5IG5hbWVzDQoNCnNoYXJlX2lwY2ZfMTYuMTkgPC0gc2hhcmVfaXBjZl8xNi4xOSAlPiUgDQogIG11dGF0ZShQZXJpb2RvPWFzLm51bWVyaWMocGVyaW9kbyksDQogICAgICAgICBQYXJ0aWNpcGFjaW9uPSBzaGFyZV9ERUNDRlIsDQogICAgICAgICBEZWNpbD1ERUNDRlIpDQogICAgICAgICANCiMgc3RhY2tlZCBhcmVhIGNoYXJ0DQoNCnNoYXJlX2FyZWFfaXBjZiA8LSBnZ3Bsb3Qoc2hhcmVfaXBjZl8xNi4xOSxhZXMoeD1QZXJpb2RvLHk9UGFydGljaXBhY2lvbixmaWxsPURlY2lsKSkgKyANCiAgZ2VvbV9hcmVhKGNvbG9yPSJibGFjayIsc2l6ZT0wLjEsYWxwaGE9MC44NSkrDQogIGV4cGFuZF9saW1pdHMoeCA9IDIwMTUuOTkpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobWlub3JfYnJlYWtzPTAuMjUgKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKHBvc2l0aW9uID0gJ3JpZ2h0JywpKw0KICBsYWJzKHRpdGxlPSJQb3JjZW50YWplIGRlbCBpbmdyZXNvIHBlciBjw6FwaXRhIGZhbWlsaWFyIHRvdGFsIHNlZ8O6biBlc2NhbGEgZGVjw61saWNhIiwNCiAgICAgICBzdWJ0aXRsZT0iVG90YWwgQWdsb21lcmFkb3MgdXJiYW5vcy4gUHJpbWVyIFRyaW1lc3RyZSBkZSAyMDE5IikrDQogIHRoZW1lKGF4aXMudGl0bGUueD0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnk9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0gInJpZ2h0IikNCg0KIyBsbyBjb252aWVydG8gZW4gZGluw6FtaWNvIGNvbiBwbG90eQ0Kc2hhcmVfYXJlYV9pcGNmX3Bsb3R5IDwtIGdncGxvdGx5KHNoYXJlX2FyZWFfaXBjZixkeW5hbWljVGlja3M9RiApDQoNCiMgc2F2ZVdpZGdldChzaGFyZV9hcmVhX2lwY2ZfcGxvdHksIGZpbGU9cGFzdGUwKCBnZXR3ZCgpLCAiLi9lamVyY2ljaW8gYW8gdml2by9zaGFyZV9hcmVhX2lwY2ZfcGxvdHkuaHRtbCIpKQ0KDQojI05PIExPR1JPIFFVRSBFTCBQTE9UWSBUT01FUiBGVUxMIFdJRFRIIEVOIEVMIE9VVFBVVCBERUwgQVJDSElWTyBSTUQNCnNoYXJlX2FyZWFfaXBjZl9wbG90eQ0KYGBgDQoNCkVzdGUgZ3LDoWZpY28gbXVlc3RyYSBsYSBwYXJ0aWNpcGFjacOzbiBkZSBjYWRhIGRlY2lsIGVuIGVsIGluZ3Jlc28gdG90YWwgeSBzdSBldm9sdWNpw7NuIGVuIGxvcyDDumx0aW1vcyB0cmVzIGHDsW9zLiBFcyBkZWNpciwgcXXDqSBwb3JjZW50YWplIHJlcHJlc2VudGEgZWwgaW5ncmVzbyB0b3RhbCBkZSBjYWRhIGRlY2lsIGVuIGVsIGluZ3Jlc28gdG90YWwgZGUgdG9kYSBsYSBwb2JsYWNpw7NuLiAgDQoNClNlZ8O6biBsb3MgZGF0b3MsIGxhIHBhcnRpY2lwYWNpw7NuIG5vIHZhcmnDsyBkZSBtYW5lcmEgbm90b3JpYSBhIGxvIGxhcmdvIGRlIGxvcyDDumx0aW1vcyB0cmVzIGHDsW9zLiBNaWVudHJhcyBsb3MgaW5ncmVzb3MgZGVsIDEwJSBtw6FzIHJpY28gZGUgbGEgcG9ibGFjacOzbiByZXByZXNlbnRhYmFuIGNlcmNhIGRlbCAyNSUgZGVsIGluZ3Jlc28gdG90YWwsIGxvcyBkZWwgMTAlIG3DoXMgcG9icmUgc2lnbmlmaWNhZGFuIHRhbiBzb2xvIGVsIDMlIGRlbCBpbmdyZXNvIHRvdGFsLiBFbCAzMCUgZGUgbGEgcG9ibGFjacOzbiBjb24gbWF5b3JlcyBpbmdyZXNvcyBzZSBsbGV2YSBjZXJjYSBkZSBsYSBtaXRhZCBkZWwgaW5ncmVzbyB0b3RhbC4gRWwgw7psdGltbyBkYXRvIGRlIGxhIHNlcmllLCBkZWwgcHJpbWVyIHRyaW1lc3RyZSBkZSAyMDE5LCB0YW1iacOpbiBzZSBlbmN1ZW50cmEgcmVmbGVqYWRvIGVuIGVsIEN1YWRybyAzLiANCg0KIyMjIEdyw6FmaWNvIDM6IEV2b2x1Y2nDs24gZGUgbGEgYnJlY2hhIGRlbCBpbmdyZXNvIHBlciBjw6FwaXRhIGZhbWlsaWFyIGVudHJlIGRlY2lsIDEwIHkgZGVjaWwgMS4gVG90YWwgQWdsb21lcmFkb3MgVXJiYW5vcy4gUHJpbWVyIFRyaW1lc3RyZSAyMDE5Lg0KDQpPdHJhIGZvcm1hIGRlIHJlc3VtaXIgbGEgZGVzaWd1YWxkYWQgZGUgbG9zIGluZ3Jlc29zIGVzIGEgdHJhdsOpcyBkZSBsYSBicmVjaGEgZGUgaW5ncmVzb3MuIEVzdGEgYnVzY2EgbWVkaXIgbGEgc2VwYXJhY2nDs24gZW50cmUgbG9zIHZhbG9yZXMgZXh0cmVtb3MgZGUgbGEgZGlzdHJpYnVjacOzbiBhIHRyYXbDqXMgZGVsICBjb2NpZW50ZSBlbnRyZSBjdWFudGlsZXMgZXh0cmVtb3MsIGVuIGVzdGUgY2FzbyAgZW50cmUgZWwgaW5ncmVzbyBwcm9tZWRpbyBkZWwgMTAlIG3DoXMgcmljbyAoZGVjaWwgMTApIHNvYnJlIGVsIGluZ3Jlc28gcHJvbWVkaW8gZGVsIDEwJSBtw6FzIHBvYnJlIChkZWNpbCAxKS4gDQoNCmBgYHtyIElQQ0YgR3JhZmljbyAzLCBlY2hvPUZBTFNFfQ0KDQojQnJlY2hhIGRlbCBwcm9tZWRpbyBkZWwgaW5ncmVzbyBwZXIgY2FwaXRhIGZhbWlsaWFyIGRlIGxvcyBob2dhcmVzIGVudHJlIGRlY2lsIDEwIHkgZGVjaWwgMQ0KDQojUEFTTyAxIGRhdG9zDQppcGNmXzE2XzE5IDwtIGJhc2VfMTZfMTkgJT4lIA0KICBncm91cF9ieShBTk80LFRSSU1FU1RSRSxERUNDRlIpICU+JSANCiAgZmlsdGVyKFAyMT4wLERFQ0NGUiVpbiUgYygxOjEwKSkgJT4lIA0KICBzdW1tYXJpc2UoWW1lYW5fREVDQ0ZSID0gcm91bmQod2VpZ2h0ZWQubWVhbihJUENGLHcgPSBQT05ESUgpLDEpLA0KICAgICAgICAgICAgI1ltZWRpYW5fREVDQ0ZSID0gd2VpZ2h0ZWQubWVkaWFuKElQQ0Ysdz1QT05ESUgpDQogICAgICAgICAgICApDQoNCmJyZWNoYV9pcGNmXzE2MTkgPC0gaXBjZl8xNl8xOSAlPiUgDQogIGdyb3VwX2J5KEFOTzQsVFJJTUVTVFJFKSAlPiUgDQogIGZpbHRlcihERUNDRlIlaW4lIGMoMSwxMCkpICU+JSANCiAgc3VtbWFyaXNlKGJyZWNoYSA9IHJvdW5kKFltZWFuX0RFQ0NGUltERUNDRlI9PTEwXS9ZbWVhbl9ERUNDRlJbREVDQ0ZSPT0xXSwxKQ0KICAgICAgICAgICAgKQ0KDQojUEFTTyAyIEdyYWZpY28gZXZvbHVjacOzbg0KZGF0YV9ncmFmMiA8LSBicmVjaGFfaXBjZl8xNjE5ICU+JSANCiAgbXV0YXRlKHBlcmlvZG89cGFzdGUoQU5PNCxUUklNRVNUUkUsc2VwPSI6IiksDQogICAgICAgICBwZXJpb2RvPSB5cShwZXJpb2RvKSApDQoNCmdncGxvdChkYXRhX2dyYWYyLCBhZXMoeD1wZXJpb2RvLCB5PWJyZWNoYSxsYWJlbD1icmVjaGEpKSArDQogIGdlb21fbGluZShjb2xvdXI9ImJpc3F1ZTQiLHNpemU9MC43MCxhbHBoYT0wLjg1KSArDQogIGdlb21fcG9pbnQoY29sb3VyID0gIm1hcm9vbiIsc2l6ZSA9IDMsIGFscGhhPTAuODUpKw0KICBnZW9tX3RleHQobnVkZ2VfeT0tMC4zLHNpemU9MywpKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9taW5vcl9icmVha3M9IjMgbW9udGhzIiwgDQogICAgICAgICAgICAgICBsaW1pdHMgPSBjKHlxKCIyMDE2OnExIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHlxKCIyMDE5OnEyIikpLA0KICAgICAgICAgICAgICAgZXhwYW5kPWMoMCwwKSwgZGF0ZV9sYWJlbHMgPSAiJVkiKSArDQogIHRoZW1lX3BhbmRlcigpKw0KICBsYWJzKHRpdGxlID0iQnJlY2hhIGRlbCBwcm9tZWRpbyBkZWwgSVBDRiBkZSBsb3MgaG9nYXJlcyBkZSBsb3MgZGVjaWxlcyAxMCB5IDEiLA0KICAgICAgICAgc3VidGl0bGUgPSAiVG90YWwgQWdsb21lcmFkb3MgdXJiYW5vcy4gUHJpbWVyIFRyaW1lc3RyZSBkZSAyMDE5Ig0KICAgICAgICAgKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpDQogICAgICAgICkgDQoNCmlubGluZTM8LSBkYXRhX2dyYWYyJGJyZWNoYVtkYXRhX2dyYWYyJHBlcmlvZG89PXlxKCIyMDE2OnEyIildDQppbmxpbmU0PC0gZGF0YV9ncmFmMiRicmVjaGFbZGF0YV9ncmFmMiRwZXJpb2RvPT15cSgiMjAxOTpxMSIpXQ0KICAgIA0KDQpgYGANCg0KTGEgZXZvbHVjacOzbiBkZSBlc3RlIHJhdGlvIGVuIGVzdG9zIMO6bHRpbW9zIHRyZXMgYcOxb3MgcmV2ZWxhIHF1ZSwgbHVlZ28gZGUgdW5hIHJlZHVjY2nDs24gZGUgbGEgZGVzaWd1YWxkYWQgaGFjw61hIGZpbmFsZXMgZGVsIDIwMTcsIGxhIGJyZWNoYSBjb21lbnrDsyBhIGVuc2FuY2hhcnNlIGVuIGVsIMO6bHRpbW8gYcOxbyB5IG1lZGlvIGhhc3RhIGxsZWdhciBhIGxvcyB2YWxvcmVzIGFjdHVhbGVzLiBEZSBhY3VlcmRvIGEgbG9zIGRhdG9zIHJlbGV2YWRvcyBwb3IgbGEgRVBIIGR1cmFudGUgZWwgcHJpbWVyIHRyaW1lc3RyZSBkZSAyMDE5LCBlbCBkZWNpbCAxMCB0aWVuZSBpbmdyZXNvcyBgciBpbmxpbmU0YCB2ZWNlcyBzdXBlcmlvcmVzIGEgbG9zIGRlbCBkZWNpbGVzIGRlbCBkZWNpbCAxLg0KDQojIyBJbmdyZXNvIEluZGl2aWR1YWwNCg0KSGFzdGEgYWhvcmEgdHJhYmFqYW1vcyBjb24gdmFyaWFibGVzIHF1ZSByZWdpc3RyYW4gbG9zIGluZ3Jlc29zIGEgbml2ZWwgZGUgaG9nYXJlcy4gUGFyYSB0cmFiYWphciBjb24gbG9zIGluZGl2aWR1b3MgY29tbyB1bmlkYWQgZGUgYW7DoWxpc2lzLCBlcyBwcmVmZXJpYmxlIHVzYXIgY29tbyB2YXJpYWJsZSBlbCBJbmdyZXNvIEluZGl2aWR1YWwsIHF1ZSBjb250ZW1wbGEgbG9zIGluZ3Jlc29zIGxhYm9yYWxlcyB5IG5vIGxhYm9yYWxlcyBkZSBsYXMgcGVyc29uYXMsIHNpbiBjb25zaWRlcmFyIGVsIGhvZ2FyIGFsIHF1ZSBwZXJ0ZW5lemNhbi4gDQoNCkRlIGFob3JhIGVuIG3DoXMgdHJhYmFqYXJlbW9zIGNvbiB1biByZWNvcnRlIGRlIG51ZXN0cmEgcG9ibGFjacOzbiwgbGEgZGUgbG9zIHBlcmNlcHRvcmVzIGRlIGluZ3Jlc29zLCBxdWVkYW5kbyBhZnVlcmEgZGUgbnVlc3RyYSBtZWRpY2nDs24gbG9zIGluZGl2aWR1b3Mgc2luIGluZ3Jlc29zLiBQb3IgZWplbXBsbywgbG9zIG1lbm9yZXMgZGUgZWRhZCwgYWxndW5vcyB0aXBvcyBkZSBlc3R1ZGlhbnRlcywgZGVzb2N1cGFkb3MgbyBsb3MgdHJhYmFqYWRvcmVzIGZhbWlsaWFyZXMgc2luIHJlbXVuZXJhY2nDs24uDQoNCiMjIyBHcsOhZmljbyA0OiBQb2JsYWNpw7NuIGNvbiBpbmdyZXNvcyBzZWfDum4gZXNjYWxhIGRlY8OtbGljYSBkZSBpbmdyZXNvIGluZGl2aWR1YWwgcG9yIGZ1ZW50ZSB5IHNleG8uIFRvdGFsIEFnbG9tZXJhZG9zIFVyYmFub3MuIFByaW1lciBUcmltZXN0cmUgMjAxOS4NCihDb3JyZXNwb25kZSBhbCBHcsOhZmljbyAyIGRlbCBpbmZvcm1lIGRlbCBJTkRFQykuDQoNCmBgYHtyIElUSSBHcmFmaWNvIDQsIGVjaG89Rn0NCg0KI0dSQUZJQ08gREUgRVNDQUxBIElUSQ0KDQojIFBvYmxhY2nDs24gY29uIGluZ3Jlc29zIHNlZ8O6biBlc2NhbGEgZGVjw61saWNhIGRlIGluZ3Jlc28gaW5kaXZpZHVhbCBwb3IgZnVlbnRlIHkgc2V4by4NCg0KZGF0YV9nZW9tLml0aS5jb2wgPC0gYmFzZV8xOXQxX2luZF9jdXQgJT4lDQogIHNlbGVjdChDSDA0LFA0N1QsVF9WSSxUT1RfUDEyLFAyMSxQT05ESUksREVDSU5EUikgJT4lIA0KICBmaWx0ZXIoREVDSU5EUiVpbiUgYygxOjEwKSwhaXMubmEoUDQ3VCksIFA0N1QgPiAwICkgJT4lIA0KICBtdXRhdGUoaW5ncmVzb19sYWJvcmFsID0gVE9UX1AxMiArIFAyMSwNCiAgICAgICAgIGluZ3Jlc29fbm9fbGFib3JhbCA9IFRfVkksDQogICAgICAgICBpbmdyZXNvX3RvdGFsID0gaW5ncmVzb19sYWJvcmFsICsgaW5ncmVzb19ub19sYWJvcmFsLA0KICAgICAgICAgQ0gwNCA9IGNhc2Vfd2hlbihDSDA0ID09IDEgfiAiVmFyb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDSDA0ID09IDIgfiAiTXVqZXIiKSkgJT4lDQogIGdyb3VwX2J5KERFQ0lORFIsQ0gwNCkgJT4lIA0KICAgIHN1bW1hcmlzZSgiaW5ncmVzbyBubyBsYWJvcmFsIiA9ICBzdW0oaW5ncmVzb19ub19sYWJvcmFsKlBPTkRJSSkvc3VtKGluZ3Jlc29fdG90YWwqUE9ORElJKSwNCiAgICAgICJpbmdyZXNvIGxhYm9yYWwiPSBzdW0oaW5ncmVzb19sYWJvcmFsKlBPTkRJSSkvc3VtKGluZ3Jlc29fdG90YWwqUE9ORElJKSkgJT4lIA0KZ2F0aGVyKHRpcG9faW5ncmVzbywgbW9udG8sMzo0ICkgDQoNCiMgR3JhZmljbyAtIGdlb21fY29sDQoNCmdncGxvdChkYXRhX2dlb20uaXRpLmNvbCwgYWVzKHg9Q0gwNCx5PW1vbnRvLCBmaWxsPXRpcG9faW5ncmVzbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gc3ByaW50ZigiJTEuMWYlJSIsIDEwMCptb250bykpKSArDQpnZW9tX2NvbChwb3NpdGlvbiA9ICJmaWxsIiwgYWxwaGE9MC44KSArDQogIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgc2l6ZT0yLjgpKyANCiAgICBsYWJzKHg9IlNleG8iLCB5PSJQb3JjZW50YWplIiwNCiAgICAgICAgIHRpdGxlID0iUG9ibGFjacOzbiBjb24gaW5ncmVzb3Mgc2Vnw7puIGVzY2FsYSBkZWPDrWxpY2EgcG9yIGZ1ZW50ZSB5IHNleG8iLA0KICAgICAgICAgc3VidGl0bGUgPSAiVG90YWwgQWdsb21lcmFkb3MgdXJiYW5vcy4gUHJpbWVyIFRyaW1lc3RyZSBkZSAyMDE5Ig0KICAgICAgICAgKSsNCiAgdGhlbWVfcGFuZGVyKCkrDQogIHNjYWxlX3lfcmV2ZXJzZSgpKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKw0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCx2anVzdCA9IDAuNSksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkNCiAgICAgICAgKSArDQogIGZhY2V0X2dyaWQofkRFQ0lORFIpDQoNCmBgYA0KDQpBbCBpZ3VhbCBxdWUgY29uIGVsIElURiBhIG5pdmVsIGRlIGxvcyBob2dhcmVzLCBsb3MgaW5ncmVzb3Mgbm8gbGFib3JhbGVzIHRpZW5lbiB1biBwZXNvIG3DoXMgaW1wb3J0YW50ZSBlbiBsb3MgZGVjaWxlcyBkZSBtZW5vcmVzIGluZ3Jlc29zLiBFc3RhIHJlbGFjacOzbiBzZSBhY2VudMO6YSBjb250cm9sYW5kbyBwb3Igc2V4bywgeWEgcXVlIGxhcyBtdWplcmVzIHRpZW5lbiBtZW5vciBwYXJ0aWNpcGFjacOzbiBlbiBlbCBtZXJjYWRvIGxhYm9yYWwsIHN1ZWxlbiBjb2JyYXIgbWVub3MgcXVlIGxvcyB2YXJvbmVzLCB5IHN1ZWxlbiBzdWVsZW4gc2VyIGxhcyBkZXN0aW5hdGFyaWFzIGRlIGxhcyB0cmFuc2ZlcmVuY2lhcyBkZSBsYSBzZWd1cmlkYWQgc29jaWFsLiANCg0KIyMjIEdyw6FmaWNvIDU6IFBvYmxhY2nDs24gY29uIGluZ3Jlc29zIHNlZ8O6biBlc2NhbGEgZGVjw61saWNhIGRlIGluZ3Jlc28gaW5kaXZpZHVhbCBwb3IgY2F0ZWdvcsOtYSBvY3VwYWNpb25hbCBvIGRlIGluYWN0aXZpZGFkLiBUb3RhbCBBZ2xvbWVyYWRvcyBVcmJhbm9zLiBQcmltZXIgVHJpbWVzdHJlIDIwMTkuDQoNCkxhIHByb3BvcmNpw7NuIGRlIGxvcyBpbmdyZXNvcyBsYWJvcmFsZXMgeSBubyBsYWJvcmFsZXMgZW4gY2FkYSBkZWNpbCBkZSBpbmdyZXNvIHJlc3BvbmRlIGVuIHBhcnRlIGFsIHBlcmZpbCBkZSBsb3MgaW5kaXZpZHVvcyBxdWUgaW50ZWdyYW4gY2FkYSBjdWFudGlsLiBFbiBlbCBzaWd1aWVudGUgZ3LDoWZpY28gc2VsZWNjaW9uYW1vcyBjdWF0cm8gZGVjaWxlcyBjb24gY3VhdHJvIGNvbXBvc2ljaW9uZXMgZGlzdGludGFzOiBlbiBsYSBiYXNlIGRlIGxhIGVzY2FsYSAoZGVjaWwgMSkgcHJpbWFuIGFzYWxhcmlhZG9zLCBpbmRlcGVuZGllbnRlcyAoY3VlbnRhIHByb3Bpc3RhcykgeSBhbWFzIGRlIGNhc2E7IGVuIGxvcyBkZWNpbGVzIG1lZGlvcyAoZGVjaWxlcyAzIHkgNSkgc2UgZGVzdGFjYSBsYSBwcmVzZW5jaWEgZGUgbG9zIGp1YmlsYWRvczsgeSBlbiBlbCBkZWNpbCBkZSBtYXlvcmVzIGluZ3Jlc29zIChkZWNpbCAxMCkgYXNhbGFyaWFkb3MsIGluZGVwZW5kaWVudGVzIHkgcGF0cm9uZXMuDQoNCmBgYHtyIElUSSBHcmFmaWNvIDUsIGVjaG89Rn0NCiMgUG9ibGFjacOzbiBjb24gaW5ncmVzb3Mgc2Vnw7puIGVzY2FsYSBkZWPDrWxpY2EgZGUgaW5ncmVzbyBpbmRpdmlkdWFsIHBvciBjYXRlZ29yw61hIG9jdXBhY2lvbmFsIG8gZGUgaW5hY3RpdmlkYWQuDQoNCiNwYXNvMTogYXNpZ25hbW9zIHVuYSBjYXRlZ29yw61hIG9jdXBhY2lvbmFsIG8gZGUgaW5hY3RpdmlkYWQgYSB0b2RvcyBsb3MgY2Fzb3MgY29uIGluZ3Jlc29zOiANCg0KYmFzZV9pdGlfY2F0X3RyZWUyIDwtIGJhc2VfMTl0MV9pbmRfY3V0ICU+JQ0KICBzZWxlY3QoRVNUQURPLERFQ0lORFIsUDQ3VCxQT05ESUksQ0FUX0lOQUMsQ0FUX09DVVApJT4lIA0KICBmaWx0ZXIoREVDSU5EUiVpbiUgYygxOjEwKSxQNDdUID4gMCkgJT4lIA0KICBncm91cF9ieShERUNJTkRSKSU+JSANCiAgc3VtbWFyaXNlKA0KICAgICNPY3VwYWRvcyA9IHJvdW5kKHN1bShQT05ESUlbRVNUQURPPT0xXSwNCiAgICAjICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS9zdW0oUE9ORElJKSwyKSoxMDAsDQogICAgI0luYWN0aXZvcyA9IHJvdW5kKHN1bShQT05ESUlbRVNUQURPPT0zXSwNCiAgICAjICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvc3VtKFBPTkRJSSksMikqMTAwLA0KICAgICNEZXNvY3VwYWRvcyA9IHJvdW5kKHN1bShQT05ESUlbRVNUQURPPT0yXSwNCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS9zdW0oUE9ORElJKSwyKSoxMDAsDQogICAgQXNhbGFyaWFkb3M9IHJvdW5kKHN1bShQT05ESUlbQ0FUX09DVVA9PTNdLG5hLnJtID0gVFJVRSkvc3VtKFBPTkRJSSksMykqMTAwLA0KICAgIEluZGVwZW5kaWVudGVzPSByb3VuZCAoc3VtIChQT05ESUlbQ0FUX09DVVA9PTJdLG5hLnJtID0gVFJVRSkvc3VtKFBPTkRJSSksMykqMTAwLA0KICAgIFBhdHJvbmVzPSByb3VuZChzdW0gKFBPTkRJSVtDQVRfT0NVUD09MV0sbmEucm0gPSBUUlVFKS9zdW0oUE9ORElJKSwzKSoxMDAsDQogICAgSnViaWxhZG9zPSByb3VuZChzdW0gKFBPTkRJSVtDQVRfSU5BQz09MV0sbmEucm0gPSBUUlVFKS9zdW0oUE9ORElJKSwzKSoxMDAsDQogICAgRXN0dWRpYW50ZXM9IHJvdW5kKHN1bSAoUE9ORElJW0NBVF9JTkFDPT0zXSxuYS5ybSA9IFRSVUUpL3N1bShQT05ESUkpLDMpKjEwMCwNCiAgICBBbWFzZGVDYXNhID0gcm91bmQoc3VtKFBPTkRJSVtDQVRfSU5BQz09NF0sbmEucm0gPSBUUlVFKS9zdW0oUE9ORElJKSwzKSoxMDAsDQogICAgT3RyYXMgPSByb3VuZChzdW0oUE9ORElJW0NBVF9PQ1VQJWluJWMoNCw5KV0pL3N1bShQT05ESUkpLDMpKjEwMCwNCiAgICBPdHJvcyA9IHJvdW5kKHN1bShQT05ESUlbQ0FUX0lOQUMlaW4lYygyLDUsNiw3LDkpXSkvc3VtKFBPTkRJSSksMykqMTAwKQ0KDQojcGFzbzI6IEFjb21vZG8gbGEgZGF0YSBhIGxvcyByZXF1ZXJpbWllbnRvcyBkZSBnZW9tIHRyZWVtYXANCg0KYmFzZV9pdGlfY2F0X3RyZWUyIDwtIGJhc2VfaXRpX2NhdF90cmVlMiAlPiUgIA0KICBnYXRoZXIoa2V5ID0gIGNhdGVnb3JpYTIsIHZhbHVlID0gIHByb3BvcmNpb24sIDI6OSkgDQoNCmJhc2VfaXRpX2NhdF90cmVlMiA8LSBiYXNlX2l0aV9jYXRfdHJlZTIgJT4lICBhcnJhbmdlKERFQ0lORFIpDQoNCmJhc2VfaXRpX2NhdF90cmVlMiA8LSBiYXNlX2l0aV9jYXRfdHJlZTIgJT4lICANCiAgbXV0YXRlKGNhdGVnb3JpYTEgPSBjYXNlX3doZW4oY2F0ZWdvcmlhMiAlaW4lIGMoIkFzYWxhcmlhZG9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZGVwZW5kaWVudGVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhdHJvbmVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk90cmFzIikgfiAiT2N1cGFkb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWEyID09ICJEZXNvY3VwYWRvcyIgfiAiRGVzb2N1cGFkb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWEyICVpbiUgYyggIkp1YmlsYWRvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFc3R1ZGlhbnRlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbWFzZGVDYXNhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk90cm9zIiApIH4gIkluYWN0aXZvcyIpKQ0KDQojIEdyYWZpY28gVHJlbWFwIGNvbiBnZW9tX3RyZWVtYXAgZGVsIHBhcXVldGUgdHJlZW1hcGlmeQ0KDQpkYXRhZ2VvbV9pdGlfY2F0X3RyZWUyIDwtIGJhc2VfaXRpX2NhdF90cmVlMiAlPiUgDQogIGZpbHRlcihERUNJTkRSICVpbiVjKDEsMyw1LDEwKSApDQoNCmdncGxvdChkYXRhZ2VvbV9pdGlfY2F0X3RyZWUyLCBhZXMoYXJlYSA9IHByb3BvcmNpb24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gcHJvcG9yY2lvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXNwcmludGYoIiUwLjFmJSUiLCBwcm9wb3JjaW9uKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZ3JvdXAgPSBjYXRlZ29yaWExLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJncm91cDI9IGNhdGVnb3JpYTIpKSsNCiAgZ2VvbV90cmVlbWFwKGxheW91dCA9InNxdWFyaWZpZWQiKSsNCiAgZ2VvbV90cmVlbWFwX3N1Ymdyb3VwMl9ib3JkZXIoY29sb3VyPSJ3aGl0ZSIsc2l6ZT0wLjUpKw0KICBnZW9tX3RyZWVtYXBfc3ViZ3JvdXBfYm9yZGVyKGNvbG91cj0ibWFyb29uIixzaXplPTIpKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlB1UmQiLGRpcmVjdGlvbj0xLGd1aWRlID0gImNvbG91cmJhciIpKw0KICAgICAgICAgICAgZ2VvbV90cmVlbWFwX3RleHQocmVmbG93ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3cgPSBGLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRmYWNlID0gIml0YWxpYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSJ3aGl0ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLnNpemUgPSAxNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gImJvdHRvbXJpZ2h0IikrDQogICAgZ2VvbV90cmVlbWFwX3N1Ymdyb3VwX3RleHQocGxhY2UgPSAibWlkZGxlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZsb3cgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdyA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLnNpemUgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy54ID0gdW5pdCg1LCAibW0iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcueSA9IHVuaXQoMjUsICJtbSIpKSArDQogICAgZ2VvbV90cmVlbWFwX3N1Ymdyb3VwMl90ZXh0KGZvbnRmYWNlID0gIml0YWxpYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3cgPSBULCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmbG93ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0id2hpdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4uc2l6ZSA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlPSJ0b3AiKSArDQogIGxhYnModGl0bGU9IkRlY2lsZXMgZGVsIGluZ3Jlc28gaW5kaXZpZHVhbCBzZWfDum4gY2F0ZWdvcsOtYSBvY3VwYWNpb25hbCBvIGRlIGluYWN0aXZpZGFkIiwgDQogICAgICAgc3VidGl0bGUgPSAiVG90YWwgQWdsb21lcmFkb3MuIFByaW1lciBUcmltZXN0cmUgMjAxOS4iLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBFbmN1ZXN0YSBQZXJtYW5lbnRlIGRlIEhvZ2FyZXMiKSsNCiAgZmFjZXRfd3JhcCh+REVDSU5EUixuY29sPTIpIA0KDQojIEludGVudG8gY29uIGVsIHBhcXVldGUgdHJlZW1hcA0KIyB0cmVlbWFwKGJhc2VfaXRpX2NhdF90cmVlMiwNCiMgICAgICAgICBpbmRleD1jKCJjYXRlZ29yaWExIiwiY2F0ZWdvcmlhMiIpLA0KIyAgICAgICAgIHZTaXplPSJwcm9wb3JjaW9uIiwNCiMgICAgICAgICB0eXBlPSJpbmRleCIsDQojICAgICAgICAgdGl0bGU9Ik15IFRyZWVtYXAiLA0KIyAgICAgICAgIGZvbnRzaXplLnRpdGxlPTEyLCAgICAgICAgICAgICAgICAgICAgICAgDQojICAgICAgICAgZm9udHNpemUubGFiZWxzPWMoMTUsMTIpLA0KIyAgICAgICAgIGZvbnRjb2xvci5sYWJlbHM9Yygid2hpdGUiLCJvcmFuZ2UiKSwNCiMgICAgICAgICBmb250ZmFjZS5sYWJlbHM9YygyLDEpLA0KIyAgICAgICAgIGJnLmxhYmVscz1jKCJ0cmFuc3BhcmVudCIpLA0KIyAgICAgICAgIGluZmxhdGUubGFiZWxzPVQsDQojICAgICAgICAgcGFsZXR0ZSA9ICJTcGVjdHJhbCIsDQojICAgICAgICAgdGl0bGUubGVnZW5kPSJ0aXBvIGRlIG9jdXBhY2lvbiIgKQ0KDQpgYGANCg0KDQojIyBJbmdyZXNvIGRlIGxhIE9jdXBhY2nDs24gUHJpbmNpcGFsDQoNCkFsIGlndWFsIHF1ZSBlbCBpbmdyZXNvIGluZGl2aWR1YWwsIGVsIGluZ3Jlc28gZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwgc2UgdHJhdGEgZGUgdW4gcmVjb3J0ZSBkZWwgdW5pdmVyc28gZGUgbGEgRVBILCBxdWUgYnVzY2EgcHJlY2lzYXIgbGEgbWFuZXJhIHF1ZSBzZSByZXBhcnRlIGVsIGluZ3Jlc28gZW4gZWwgcHJpbmNpcGFsIMOhbWJpdG8gZGlzdHJpYnV0aXZvOiBlbCBkZSBsYSBhY3RpdmlkYWQgZWNvbsOzbWljYSBlbiBnZW5lcmFsIHkgZWwgbWVyY2FkbyBkZSB0cmFiYWpvIGVuIHBhcnRpY3VsYXIuIA0KDQpFbCBJT1AgcmVnaXN0cmEgZWwgaW5ncmVzbyBxdWUgb2J0aWVuZW4gbG9zIGluZGl2aWR1b3MgYWN0aXZvcyBjb21vIHJlc3VsdGFkbyBkZSBzdSB0cmFiYWpvIGFjdHVhbCBvIHJlY2llbnRlLiBFbiBlbCBjYXNvIGRlIHRlbmVyIG3DoXMgZGUgdW5vLCBlbCBpbmdyZXNvIGRlbCBxdWUgZGVjbGFyYSBjb21vIHByaW5jaXBhbC4gDQoNCiMjIyBHcmFmaWNvIDY6IFBvYmxhY2nDs24gb2N1cGFkYSBzZWfDum4gZXNjYWxhIGRlY8OtbGljYSBkZSBpbmdyZXNvIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsIHBvciBuaXZlbCBlZHVjYXRpdm8uIFRvdGFsIEFnbG9tZXJhZG9zIFVyYmFub3MuIFByaW1lciBUcmltZXN0cmUgMjAxOS4NCg0KQ29tbyBwcmltZXJhIGFwcm94aW1hY2nDs24gYSBsYSBlc2NhbGEgZGUgaW5ncmVzb3MgZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwsIGxvcyBzaWd1aWVudGVzIGdyw6FmaWNvcyBpbHVzdHJhbiBsYSBkaXN0aW50YSBjb21wb3NpY2nDs24gcXVlIHRpZW5lbiBhbGd1bm9zIGRlY2lsZXMgc2VsZWNjaW9uYWRvcy4gQSBtZWRpZGEgcXVlIHNlIGF2YW56YSBlbiBsYSBlc2NhbGEgZGVjw61saWNhLCBhdW1lbnRhIGVsIHBvcmNlbnRhamUgZGUgbG9zIG9jdXBhZG9zIGNvbiBtYXlvciBuaXZlbCBlZHVjYXRpdm8uIA0KDQpgYGB7cn0NCg0KDQojIEZVTkNJT04gUEFSQSBDUkVBUiBXQUZGTEUgQ0hBUlRTIFNFR1VOIE5JVkVMIEVEVUNBVElWTw0KIyBBIFBBUlRJUiBERSBESVNUSU5UT1MgREVDT0NVUidTDQoNCmRlY2lsX3RpbGVfZnVuY3Rpb24gPC0gZnVuY3Rpb24obmRlY2lsKSB7DQoNCiAgI3NpbXBsaWZpY28gZWwgbml2ZWwgZWR1Y2F0aXZvIGVuIDQgbml2ZWxlcw0KICBiYXNlX2lvcF9jYXRlZ29yaWFzIDwtIGJhc2VfMTl0MV9pbmRfY3V0ICU+JSANCiAgbXV0YXRlKE5JVkVMX0VEVUNBVElWTyA9IGNhc2Vfd2hlbihOSVZFTF9FRCAlaW4lIGMoMSw3KSB+IDEsICNTaW4gSW5zdHJ1Y2Npb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVZFTF9FRCAlaW4lIGMoMiwzKSB+IDIsICNQcmltYXJpYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JVkVMX0VEICVpbiUgYyg0LDUpIH4gMywgI1NlY3VuZGFyaWENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVZFTF9FRCA9PSA2fiA0LCAjU3VwZXJpb3INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVZFTF9FRCA9PSA5fiA1KSkgI05TL05SICANCiAgDQogIGRlY2lsZXNfaW9wX2NhdGVnb3JpYXMgPC0gYmFzZV9pb3BfY2F0ZWdvcmlhcyAlPiUgDQogICAgZmlsdGVyKERFQ09DVVI9PSBuZGVjaWwsRVNUQURPID09IDEsUDIxPjApICU+JQ0KICAgIHN1bW1hcmlzZSgiU2luIEluc3RydWNjacOzbiIgPSByb3VuZCAoc3VtIChQT05ESUlPW05JVkVMX0VEVUNBVElWTz09MV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS9zdW0oUE9ORElJTyksMykqMTAwLA0KICAgICAgICAgICAgICBQcmltYXJpYSA9IHJvdW5kIChzdW0gKFBPTkRJSU9bTklWRUxfRURVQ0FUSVZPPT0yXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvc3VtKFBPTkRJSU8pLDMpKjEwMCwNCiAgICAgICAgICAgICAgU2VjdW5kYXJpYSA9IHJvdW5kIChzdW0gKFBPTkRJSU9bTklWRUxfRURVQ0FUSVZPPT0zXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS9zdW0oUE9ORElJTyksMykqMTAwLA0KICAgICAgICAgICAgICBTdXBlcmlvciA9IHJvdW5kIChzdW0gKFBPTkRJSU9bTklWRUxfRURVQ0FUSVZPPT00XSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvc3VtKFBPTkRJSU8pLDMpKjEwMCwNCiAgICAgICAgICAgICAgTlNfTlIgPSByb3VuZCAoc3VtIChQT05ESUlPW05JVkVMX0VEVUNBVElWTz09NV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpL3N1bShQT05ESUlPKSwzKSoxMDApICU+JSANCiAgICBnYXRoZXIoY2F0ZWdvcmlhLCBwcm9wb3JjaW9uLDE6NSApICU+JSANCiAgICBtdXRhdGUocHJvcG9yY2lvbiA9IHJvdW5kKHByb3BvcmNpb24vc3VtKHByb3BvcmNpb24pKjEwMCwgMCksDQogICAgICAgICAgIGNhdGVnb3JpYSA9IHBhc3RlKGNhdGVnb3JpYSwiLSIscHJvcG9yY2lvbiwiJSIpICkNCiAgDQogICMgV0FGRkxFIENIQVJUIA0KICAjIyBQcmVwIGRhdGENCiAgbnJvd3MgPC0gMTANCiAgZC5kZiA8LSBleHBhbmQuZ3JpZCh4ID0gMTpucm93cywgeSA9IDE6bnJvd3MpDQogIGQuZGYkY2F0ZWdvcmlhIDwtIGZhY3RvcihyZXAoeD1kZWNpbGVzX2lvcF9jYXRlZ29yaWFzJGNhdGVnb3JpYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcz1kZWNpbGVzX2lvcF9jYXRlZ29yaWFzJHByb3BvcmNpb24pKSAgDQogIA0KIyBjb2xzIDwtIGFzLmZhY3RvciggYygiU2luIEluc3RydWNjacOzbiIgPSAicmVkMiIsICJQcmltYXJpYSIgPSAidmlvbGV0cmVkMiIsICJTZWN1bmRhcmlhIiA9ICJzZWFncmVlbjMiLCAiU3VwZXJpb3IiID0gIm9yYW5nZTMiLCJOUy9OUiI9ImdyZXkiKSkNCg0KICANCiMgR3JhZmljbyBXYWZmbGUgc2UgY29uc3RydXllIGEgcGFydGlyIGRlIHVuIGdlb21fdGlsZQ0KICBnZ3Bsb3QoZC5kZiwgYWVzKHg9IHgsIHk9IHksIGZpbGw9IGNhdGVnb3JpYSkpICsgDQogICAgZ2VvbV90aWxlKGNvbG9yPSJibGFjayIsc2l6ZT0wLjIsYWxwaGE9MC43KSArDQogICAgc2NhbGVfeV9yZXZlcnNlKCkrDQogICAgdGhlbWVfcGFuZGVyKGdNPUZBTFNFLGdtPUZBTFNFKSsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQyIiwidmlvbGV0cmVkMiIsInNlYWdyZWVuMyIsIm9yYW5nZTIiLCJvcmFuZ2UyIiksYWVzdGhldGljcyA9ICJmaWxsIikrDQogICAgIyBkaXN0aW50b3MgaW50ZW50b3MgZGUgZmlqYXIgbG9zIGNvbG9yZXMgcGFyYSBxdWUgc2UgbWF0ZW5nYW4gaWd1YWxlcyBwYXJhIHRvZGFzIGxhcyB2ZWNlcyBxdWUgZWplY3V0byBsYSBmdW5jacOzbjogDQogICAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0gY29scykrDQogICAgI3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIsZGlyZWN0aW9uID0gMSkrDQogICAgbGFicyh0aXRsZT1wYXN0ZSgiRGVjaWwiLG5kZWNpbCwiZGUgaW5ncmVzb3Mgc2Vnw7puIG5pdmVsIGVkdWNhdGl2byIpLA0KICAgICAgICAgc3VidGl0bGU9IlRvdGFsIEFnbG9tZXJhZG9zIHVyYmFub3MuIFByaW1lciBUcmltZXN0cmUgZGUgMjAxOSIpKw0KICAgIHRoZW1lKGF4aXMudGl0bGUueD0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGF4aXMudGl0bGUueT0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGF4aXMudGV4dC54PSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50ZXh0Lnk9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBsZWdlbmQudGl0bGU9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBsZWdlbmQucG9zaXRpb249ICJ0b3AiICkNCn0NCg0KDQojVXNvIGxhIGZ1bmNpw7NuIGRlY2lsX3RpbGVfZnVuY3Rpb24oKSBwYXJhIA0KZGVjaWxfdGlsZV9mdW5jdGlvbihuZGVjaWwgPSAxKQ0KI2RlY2lsX3RpbGVfZnVuY3Rpb24obmRlY2lsID0gMykNCmRlY2lsX3RpbGVfZnVuY3Rpb24obmRlY2lsID0gNSkNCmRlY2lsX3RpbGVfZnVuY3Rpb24obmRlY2lsID0gOCkNCmRlY2lsX3RpbGVfZnVuY3Rpb24obmRlY2lsID0gMTApDQoNCiMgQ09NTyBMQSBPUENJw5NOIERFIEZBQ1RFQVIgTk8gRVMgUE9TSUJMRSBDT04gQ09OIFdBRkZMRSBDSEFSVFMsIFVOQSBPUENJw5NOIEVTIFVTQVIgZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UNCiMgDQojIGQxPC0gZGVjaWxfdGlsZV9mdW5jdGlvbihuZGVjaWwgPSAxKQ0KIyBkMzwtIGRlY2lsX3RpbGVfZnVuY3Rpb24obmRlY2lsID0gMykNCiMgZDU8LSBkZWNpbF90aWxlX2Z1bmN0aW9uKG5kZWNpbCA9IDUpDQojIGQ4PC0gZGVjaWxfdGlsZV9mdW5jdGlvbihuZGVjaWwgPSA4KQ0KIyBkMTA8LSBkZWNpbF90aWxlX2Z1bmN0aW9uKG5kZWNpbCA9IDEwKQ0KIyANCiNncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShkMSxkMyxkNSxkOCxkMTAsIG5jb2wgPSAyKQ0KDQoNCg0KYGBgDQoNClNlIHRyYXRhIGRlIHVuYSBkZSBsYXMgbcO6bHRpcGxlcyBtYW5lcmFzIGRlIGFib3JkYXIgbGEgZGVzaWd1YWxkYWQgZGUgbG9zIGluZ3Jlc29zIGxhYm9yYWxlcy4gUXVpesOhcywgbGEgbcOhcyBvYnZpYS4gDQoNCkEgbW9kbyBkZSBwcm9wdWVzdGEgcGFyYSBjb250aW51YXIgZWwgdHJhYmFqbyBwb3IgbnVlc3RyYSBjdWVudGEsIGNvbnNpZGVyYW1vcyByZWxldmFudGUgbGEgZGVzY3JpcGNpw7NuIGRlIGxvcyBkZWNpbGVzIHNlZ8O6biBsYSBlZGFkIHkgZWwgc2V4byBkZSBzdXMgaW50ZWdyYW50ZXMsIHN1IGNhdGVnb3LDrWEgb2N1cGFjaW9uYWwsIGxhIGNhbGlmaWNhY2nDs24gZGUgc3VzIHRhcmVhcywgZWwgdGFtYcOxbyBkZSBsb3MgZXN0YWJsZWNpbWllbnRvcyBkb25kZSB0cmFiYWphbiwgeSBsYSB0ZW5lbmNpYSBkZXNjdWVudG8ganViaWxhdG9yaW8uDQoNCiMjIER1ZGFzIHkgQ29uc3VsdGFzIA0KDQoxKSBBIGxhIGhvcmEgZGUgdXNhciBlbCBJUENGLCBubyBwdWRlIHRyYWJhamFyIGEgbml2ZWwgZGUgbGEgcG9ibGFjacOzbiwgc2lubyBhIG5pdmVsICBkZSBob2dhcmVzLCBwb3JxdWUgZWwgcG9uZGVyYWRvciBxdWUgbGUgY29ycmVzcG9uZGUgY29ycmVzcG9uZGUgYWwgbml2ZWwgZGUgaG9nYXJlcy4gU2luIGVtYmFyZ28sIGVsIGluZm9ybWUgZGVsIElOREVDIGRlIGluZ3Jlc29zIGxhYnVyYSBlbCBJUENGIGEgbml2ZWwgZGUgbGFzIHBlcnNvbmFzIChDdWFkcm8gMy4gUG9ibGFjacOzbiBzZWfDum4gZXNjYWxhIGRlIGluZ3Jlc28gcGVyIGPDoXBpdGEgZmFtaWxpYXIpLiDCv0PDs21vIHNlIHB1ZWRlIGhhY2VyPyANCg0KMikgwr9RdcOpIHBvbmRlcmFkb3JlcyB1c2FyIHBhcmEgZWwgaW5ncmVzbyBkZSBsYXMgb3RyYXMgb2N1cGFjaW9uZXMgKFRvdF9wMTIpIHkgcGFyYSBsb3MgaW5ncmVzb3Mgbm8gbGFib3JhbGVzIChUX1ZJKT8NCg0KMykgQSBsYSBob3JhIGRlIGNhbGN1bGFyIGVsIHBvcmNlbnRhamUgZGUgaW5ncmVzb3MgbGFib3JhbGVzIHkgbm8gbGFib3JhbGVzIGRlIGNhZGEgZXNjYWxhIGRlIGluZ3Jlc28gdG90YWwgZmFtaWxpYXIsIHR1dmUgcHJvYmxlbWFzIHBhcmEgY2FsY3VsYXIgZWwgdG90YWwgZGVsIGluZ3Jlc28gbGFib3JhbCBkZSBjYWRhIGRlY2lsIGRlIElURiBhIHBhcnRpciBkZSBsYXMgdmFyaWFibGVzIHAyMStUb3RfUDEyLiBTaWVtcHJlIG1lIGRhYmEgdW5hIGNpZnJhIG1lbm9yIGEgbGEgZGVsIGluZm9ybWUsIGPDs21vIHNlIG1lIGZhbHRhcmEgdW5hIGZ1ZW50ZSBkZSBpbmdyZXNvcyBsYWJvcmFsZXMgbcOhcy4gTm8gdHV2ZSBlc2UgcHJvYmxlbWEgcGFyYSBjYWxjdWxhciBlbCB0b3RhbCBkZSBpbmdyZXNvcyBubyBsYWJvcmFsZXMgYSBwYXJ0aXIgZGUgVF9WSS4gTG9zIG7Dum1lcm9zIGRlIG1pIGN1YWRybyB5IGxvcyBkZWwgaW5mb3JtZSBkZWwgSU5ERUMgbWUgdGVybWluYXJvbiBjb2luY2lkaWVuZG8gY3VhbmRvIGNhbGN1bGEgZWwgdG90YWwgZGVsIGluZ3Jlc28gbGFib3JhbCBjb21vIHVuYSBkaWZlcmVuY2lhIGVudHJlIGVsIHRvdGFsIGRlIFA0N1QgLSBlbCB0b3RhbCBkZSBsb3MgaW5ncmVzb3Mgbm8gbGFib3JhbGVzIGRlIGNhZGEgZGVjaWwgZGUgSVRGLiANCg0KNCkgRW4gZWwgZ3LDoWZpY28gR3LDoWZpY28gMiwgcXVlIHJlcHJlc2VudGEgbGEgZXZvbHVjacOzbiBkZSBsYSBwYXJ0aWNpcGFjacOzbiBkZSBjYWRhIGRlY2lsIGVuIGVsIGluZ3Jlc28gdG90YWwsIG5vIHB1ZGUgbG9ncmFyIHF1ZSBlbCBncsOhZmljbyBpbnRlcmFjdGl2byBjb24gZ3Bsb3R5IHNlIGV4dGllbmRhIGVuIHRvZG8gZWwgYW5jaG8gZGUgbGEgcMOhZ2luYSBkZWwgYXJjaGl2byBybWQuIE5vIHR1dmUgcHJvYmxlbWEgY3VhbmRvIGxvIHB1YmxpcXVlIGNvbW8gaHRtbCwgcGVybyBzaSBjb21vIG5vdGVib29rLiANCg0KNSkgTWUgaHViaWVyYSBndXN0YWRvIHByZXNlbnRhciBsb3Mgd2FmZmxlIGNoYXJ0IGRlIGxhcyBlc2NhbGFzIElPUCBzZWfDum4gbml2ZWwgZWR1Y2F0aXZvIGNvbiBldGlxdWV0YXMgY29uIGxvcyBwb3JjZW50YWplcywgeSBlbiB1biBncmlkIGRlIGRvcyBjb2x1bW5hcy4gUHJpbWVybywgaW50ZW50w6kgdXNhciB1biBmYWNldF9ncmlkLCBjb24gdW4gdGFibGEgZGUgZGF0YSBkZSAxMDB4MTAsIHBlcm8gc2llbXByZSBtZSBkYWJhIGVycm9yLiBQb3IgZXNvIG9wdMOpIHBvciBncmFmaWNhciBjYWRhIHdhZmZsZSBhIHRyYXbDqXMgZGUgdW5hIGZ1bmNpw7MuIEx1ZWdvLCB1c8OpIGdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlLCBwZXJvIG1lIGFjaGF0YWJhIG11Y2hvIGVsIGFsdG8gZGUgY2FkYSB3YWZmbGUuIEN1YWxxdWllciBjb25zZWpvIHNlIGFncmFkZWNlLiANCg0KNSkgRW4gbGEgZmFzZSBkZSBlbGFib3JhY2nDs24sIHRyYWJhamUgZWwgdGFtYcOxbyBkZWwgZXN0YWJsZWNpbWllbnRvIGluY29ycG9yYW5kbyBhIGxhIG1pc21hIGVsIHRyYWJham8gZW4gY2FzYXMgcGFydGljdWxhcmVzLiBFbnRyZSBsb3MgdmFsb3JlcyBkaXNwb25pYmxlcyBlbiBsYSB2YXJpYWJsZSBQUDA0QjEgZmlndXJhICIyIiwgcGVybyBlc3RlIHZhbG9yIG5vIGZpZ3VyYSBlbiBlbCBkaXNlw7FvIGRlIHJlZ2lzdHJvLiDCv1NhYmVuIHF1w6kgc2lnbmlmaWNhPw0KDQoNCg==