Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2021-2022. El repo del trabajo está aquí.

La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.


1.1 Introducción

El objetivo principal del trabajo es analizar a través de una serie de indicadores la calidad de vida en nuestra comunidad para conoocer nuestra posición con respecto al resto de comunidades españolas.En ciertos aspectos analizaremos un ámbito de mayor nivel, es decir, analizaremos la posición de España en comparación con la UE para ver como esto se refleja en la calidad de vida de la Comunidad Valenciana.

1.2 Datos

Los datos los obtendremos a partir del Instituto Nacional de Estadística, en concreto, analizaremos indicadores de calidad de vida para conocer el progreso de la sociedad y el bienestar de los individuos más cercanos de nuestro de entorno como son las condiciones económicas, trabajo, educación, desigualdad, salud, etc.

1.3 Procesando los datos

Extraeremos los datos de Excel, seleccionaremos las variables que consideramos más importantes para determinar lo que es calidad de vida y posiblemente tendremos que juntar o fusionar tablas con el objetivo de comparar con respecto a la UE.


1.4 Bibliografía


Hemos utilizado datos del INE.


Información de mi R-sesión:

- Session info  --------------------------------------------------------------
 hash: flag: Canary Islands, flag: Jamaica, flag: Slovenia

 setting  value
 version  R version 4.0.3 (2020-10-10)
 os       Windows 10 x64 (build 19043)
 system   x86_64, mingw32
 ui       RTerm
 language (EN)
 collate  English_United Kingdom.1252
 ctype    English_United Kingdom.1252
 tz       Europe/Paris
 date     2021-12-16
 pandoc   2.14.0.3 @ C:/Program Files/RStudio/bin/pandoc/ (via rmarkdown)

- Packages -------------------------------------------------------------------
 package     * version    date (UTC) lib source
 abind         1.4-5      2016-07-21 [1] CRAN (R 4.0.3)
 assertthat    0.2.1      2019-03-21 [1] CRAN (R 4.0.3)
 backports     1.3.0      2021-10-27 [1] CRAN (R 4.0.5)
 broom         0.7.10     2021-10-31 [1] CRAN (R 4.0.3)
 car           3.0-12     2021-11-06 [1] CRAN (R 4.0.5)
 carData       3.0-4      2020-05-22 [1] CRAN (R 4.0.3)
 cellranger    1.1.0      2016-07-27 [1] CRAN (R 4.0.3)
 class         7.3-17     2020-04-26 [2] CRAN (R 4.0.3)
 classInt      0.4-3      2020-04-07 [1] CRAN (R 4.0.5)
 cli           3.1.0      2021-10-27 [1] CRAN (R 4.0.5)
 clipr         0.7.1      2020-10-08 [1] CRAN (R 4.0.3)
 colorspace    2.0-2      2021-06-24 [1] CRAN (R 4.0.5)
 crayon        1.4.2      2021-10-29 [1] CRAN (R 4.0.5)
 curl          4.3.2      2021-06-23 [1] CRAN (R 4.0.5)
 data.table  * 1.14.2     2021-09-27 [1] CRAN (R 4.0.5)
 DBI           1.1.1      2021-01-15 [1] CRAN (R 4.0.5)
 dbplyr        2.1.1      2021-04-06 [1] CRAN (R 4.0.5)
 desc          1.4.0      2021-09-28 [1] CRAN (R 4.0.5)
 details       0.2.1      2020-01-12 [1] CRAN (R 4.0.5)
 digest        0.6.28     2021-09-23 [1] CRAN (R 4.0.5)
 dplyr       * 1.0.7      2021-06-18 [1] CRAN (R 4.0.5)
 e1071         1.7-9      2021-09-16 [1] CRAN (R 4.0.5)
 ellipsis      0.3.2      2021-04-29 [1] CRAN (R 4.0.5)
 evaluate      0.14       2019-05-28 [1] CRAN (R 4.0.5)
 extrafont   * 0.17       2014-12-08 [1] CRAN (R 4.0.5)
 extrafontdb   1.0        2012-06-11 [1] CRAN (R 4.0.3)
 fansi         0.5.0      2021-05-25 [1] CRAN (R 4.0.5)
 farver        2.1.0      2021-02-28 [1] CRAN (R 4.0.5)
 fastmap       1.1.0      2021-01-25 [1] CRAN (R 4.0.5)
 forcats     * 0.5.1      2021-01-27 [1] CRAN (R 4.0.5)
 foreign       0.8-80     2020-05-24 [2] CRAN (R 4.0.3)
 fs            1.5.0      2020-07-31 [1] CRAN (R 4.0.5)
 gdtools       0.2.3      2021-01-06 [1] CRAN (R 4.0.5)
 generics      0.1.1      2021-10-25 [1] CRAN (R 4.0.5)
 gganimate   * 1.0.7      2020-10-15 [1] CRAN (R 4.0.5)
 ggplot2     * 3.3.5      2021-06-25 [1] CRAN (R 4.0.5)
 ggpubr      * 0.4.0      2020-06-27 [1] CRAN (R 4.0.5)
 ggsignif      0.6.3      2021-09-09 [1] CRAN (R 4.0.5)
 ggthemes    * 4.2.4      2021-01-20 [1] CRAN (R 4.0.5)
 gifski        1.4.3-1    2021-05-02 [1] CRAN (R 4.0.5)
 glue          1.4.2      2020-08-27 [1] CRAN (R 4.0.3)
 gt          * 0.3.1      2021-08-07 [1] CRAN (R 4.0.5)
 gtable        0.3.0      2019-03-25 [1] CRAN (R 4.0.5)
 haven         2.4.3      2021-08-04 [1] CRAN (R 4.0.5)
 here          1.0.1      2020-12-13 [1] CRAN (R 4.0.5)
 hms           1.1.1      2021-09-26 [1] CRAN (R 4.0.5)
 hrbrthemes  * 0.8.0      2020-03-06 [1] CRAN (R 4.0.5)
 htmltools     0.5.2      2021-08-25 [1] CRAN (R 4.0.5)
 htmlwidgets   1.5.4      2021-09-08 [1] CRAN (R 4.0.5)
 httr          1.4.2      2020-07-20 [1] CRAN (R 4.0.5)
 jquerylib     0.1.4      2021-04-26 [1] CRAN (R 4.0.5)
 jsonlite      1.7.2      2020-12-09 [1] CRAN (R 4.0.5)
 kableExtra  * 1.3.4      2021-02-20 [1] CRAN (R 4.0.5)
 KernSmooth    2.23-17    2020-04-26 [2] CRAN (R 4.0.3)
 klippy      * 0.0.0.9500 2021-12-14 [1] Github (rlesur/klippy@378c247)
 knitr       * 1.36       2021-09-29 [1] CRAN (R 4.0.5)
 lazyeval      0.2.2      2019-03-15 [1] CRAN (R 4.0.5)
 lifecycle     1.0.1      2021-09-24 [1] CRAN (R 4.0.5)
 lpSolve       5.6.15     2020-01-24 [1] CRAN (R 4.0.3)
 lubridate     1.8.0      2021-10-07 [1] CRAN (R 4.0.5)
 magrittr      2.0.1      2020-11-17 [1] CRAN (R 4.0.3)
 modelr        0.1.8      2020-05-19 [1] CRAN (R 4.0.5)
 munsell       0.5.0      2018-06-12 [1] CRAN (R 4.0.5)
 openxlsx      4.2.4      2021-06-16 [1] CRAN (R 4.0.5)
 paletteer   * 1.4.0      2021-07-20 [1] CRAN (R 4.0.5)
 pillar        1.6.4      2021-10-18 [1] CRAN (R 4.0.5)
 pkgconfig     2.0.3      2019-09-22 [1] CRAN (R 4.0.3)
 plotly      * 4.10.0     2021-10-09 [1] CRAN (R 4.0.5)
 png           0.1-7      2013-12-03 [1] CRAN (R 4.0.3)
 prettyunits   1.1.1      2020-01-24 [1] CRAN (R 4.0.3)
 progress      1.2.2      2019-05-16 [1] CRAN (R 4.0.3)
 proxy         0.4-26     2021-06-07 [1] CRAN (R 4.0.5)
 purrr       * 0.3.4      2020-04-17 [1] CRAN (R 4.0.5)
 R6            2.5.1      2021-08-19 [1] CRAN (R 4.0.5)
 Rcpp          1.0.7      2021-07-07 [1] CRAN (R 4.0.5)
 readr       * 2.0.2      2021-09-27 [1] CRAN (R 4.0.5)
 readxl        1.3.1      2019-03-13 [1] CRAN (R 4.0.3)
 rematch2      2.1.2      2020-05-01 [1] CRAN (R 4.0.5)
 reprex        2.0.1      2021-08-05 [1] CRAN (R 4.0.5)
 rio           0.5.27     2021-06-21 [1] CRAN (R 4.0.5)
 rlang         0.4.12     2021-10-18 [1] CRAN (R 4.0.5)
 rmarkdown     2.11       2021-09-14 [1] CRAN (R 4.0.5)
 rprojroot     2.0.2      2020-11-15 [1] CRAN (R 4.0.5)
 rstatix       0.7.0      2021-02-13 [1] CRAN (R 4.0.5)
 rstudioapi    0.13       2020-11-12 [1] CRAN (R 4.0.5)
 Rttf2pt1      1.3.9      2021-07-22 [1] CRAN (R 4.0.5)
 rvest         1.0.2      2021-10-16 [1] CRAN (R 4.0.5)
 scales        1.1.1      2020-05-11 [1] CRAN (R 4.0.5)
 sessioninfo   1.2.0      2021-10-31 [1] CRAN (R 4.0.3)
 sf            1.0-3      2021-10-07 [1] CRAN (R 4.0.5)
 stringi       1.7.5      2021-10-04 [1] CRAN (R 4.0.5)
 stringr     * 1.4.0      2019-02-10 [1] CRAN (R 4.0.5)
 svglite       2.0.0      2021-02-20 [1] CRAN (R 4.0.5)
 systemfonts   1.0.3      2021-10-13 [1] CRAN (R 4.0.5)
 tibble      * 3.1.5      2021-09-30 [1] CRAN (R 4.0.5)
 tidyr       * 1.1.4      2021-09-27 [1] CRAN (R 4.0.5)
 tidyselect    1.1.1      2021-04-30 [1] CRAN (R 4.0.5)
 tidyverse   * 1.3.1      2021-04-15 [1] CRAN (R 4.0.5)
 transformr  * 0.1.3      2020-07-05 [1] CRAN (R 4.0.5)
 tweenr        1.0.2      2021-03-23 [1] CRAN (R 4.0.5)
 tzdb          0.2.0      2021-10-27 [1] CRAN (R 4.0.5)
 units         0.7-2      2021-06-08 [1] CRAN (R 4.0.5)
 utf8          1.2.2      2021-07-24 [1] CRAN (R 4.0.5)
 vctrs         0.3.8      2021-04-29 [1] CRAN (R 4.0.5)
 viridisLite   0.4.0      2021-04-13 [1] CRAN (R 4.0.5)
 webshot       0.5.2      2019-11-22 [1] CRAN (R 4.0.5)
 withr         2.4.2      2021-04-18 [1] CRAN (R 4.0.5)
 xfun          0.26       2021-09-14 [1] CRAN (R 4.0.5)
 xml2          1.3.2      2020-04-23 [1] CRAN (R 4.0.5)
 yaml          2.2.1      2020-02-01 [1] CRAN (R 4.0.5)
 zip           2.2.0      2021-05-31 [1] CRAN (R 4.0.5)

 [1] C:/Users/Lawrence/Documents/R/win-library/4.0
 [2] C:/Program Files/R/R-4.0.3/library

------------------------------------------------------------------------------




2. CONDICIONES MATERIALES


Las condiciones materiales y/o económicas de los ciudadanos son uno de los principales factores del nivel de vida y uno de los indicadores más importantes a la hora de comparar la riqueza entre dos regiones o países. Aunque no nos guste, el dinero mueve el mundo y por tanto es esencial incluir este aspecto en nuestro análisis del nivel de vida en la Comunidad Valenciana. A continuación, os presentaremos cuatro indicadores que hemos considerados prioritarios con el fin de contrastar el nivel de las condiciones materiales en las distintas Comunidades Autónomas, haciendo hincapié en nuestra Comunidad.



2.1 RENTA MEDIA


En nuestros datos, la renta media representa la renta disponible neta anual de cada hogar en base a la Encuesta de condiciones de Vida. Es el indicador que nos viene de primeras a la cabeza cuando pensamos en realizar una comparación del nivel de vida entre dos regiones distintas. Por lo general, cuanto más elevada sea la renta media mayor será la renta individual de cada hogar y por tanto de cada ciudadano. El único inconveniente de utilizar la renta media es el gran peso que tienen los “outliers” (valores atípicos) que podrían distorsionar nuestros resultados. Por ejemplo, una renta media de un multimillonario nos elevaría la renta media promedio, pero sin llegar a aumentar realmente la renta de los demás ciudadanos. Esto es un problema que se puede corregir empleando, además de valores medios, los valores medianos (cosa que veremos en el siguiente apartado). A continuación, os mostramos una tabla resaltando los valores de la renta media en 2020 con las tres CCAA con menor renta media y las tres con mayor renta media, sin olvidarnos de la comunidad Valenciana y en este caso la UE-27.
Observamos que no tenemos datos de la UE para este año, pero podemos asumir que el valor sería aproximado al 2019. La tabla está ordenada de mayor a menor, siendo País Vasco la región “número 1”, cosa que se repetirá durante mucho de nuestro trabajo.


Comparación de la Renta media de la CV con otras CCAA y la UE-27
Comunidad Autónoma 2015 2016 2017 2018 2019 2020
Pais_Vasco 20264 21058 21198 21760 22480 23174
Navarra 19715 19697 20022 20094 20697 22391
Madrid 18593 18709 19314 19648 21030 21429
Comunidad_Valenciana 13305 13589 14365 15038 15582 16518
Andalucia 11862 12560 13709 13977 13755 14958
Murcia 11993 12635 13324 14041 13637 14921
Extremadura 12421 12775 12006 12376 12816 13297
UE_27 18613 18939 19447 20026 19674 NA
Datos recogidos del INE, expresados en € y el año 2013 como base.



2.2 RENTA MEDIANA


Como hemos dicho antes, los valores atípicos pueden distorsionar la media de las variables y por tanto es recomendado tomar en cuenta los valores medianos. En este caso, no afecta al resultado final y por tanto podemos asumir que no existen muchos “outliers”.

En este gráfico se representa la evolución de la renta mediana desde 2008 hasta 2020 en las mismas regiones que en el apartado anterior de la renta media. Pero al estar en formato de gráfico, podemos observar la serie temporal y vemos de una manera más rápida y fácil la tendencia de los valores. En este caso, podemos ver el fuerte impacto negativo de la crisis económica de la Gran recesión de 2008 y el decrecimiento de la renta mediana en todas las CCAA (pero no en la UE) hasta aproximadamente en año 2015 en donde la tendencia se vuelve creciente hasta llegar a superar los niveles precrisis en los últimos dos años. Podemos intuir que, en las cifras de 2021, que habrá una tendencia negativa debido a la crisis sanitaria de la COVID-19 y sus grandes impactos negativos.




2.3 Desigualdad


La desigualdad es un aspecto de la economía que últimamente está teniendo un gran peso en las decisiones político-económicas a nivel mundial. Dado que, en los últimos 30 años, las diferencias del nivel de renta entre los más ricos y más pobres se están exacerbando tanto entre distintos continentes y países como en un mismo país. Es por esto, que decidimos incluir este indicador en nuestro estudio Concretamente, el indicador de desigualdad que analiza el “INE” se mide de la siguiente manera: la relación entre la renta media del 20% de la población con la renta más alto y la renta media del 20% de la población con la renta más baja, tomando como año base el 2013. Analizando el gráfico, extrapolamos el hecho de que en muchas CCAA la relación se ha mantenido constante, incluyendo en la Comunidad Valenciana. Como excepción, encontramos Melilla y Ceuta (con una gran oscilación y un gran crecimiento últimamente de la desigualdad en Melilla) y Asturias, que ha sufrido un repunte en 2019 y 2020.




2.4 Riesgo de pobreza


Otro indicador que se usa para medir la situación económica de los ciudadanos es el umbral de riesgo de pobreza. El umbral de riesgo de pobreza se define como: el porcentaje de personas cuyos ingresos anuales por unidad de consumo recibidos en el año anterior al que se realiza la encuesta, están por debajo del umbral de riesgo de pobreza (fijado en el 60% de la mediana de los ingresos por unidad de consumo de todos los hogares a nivel nacional) Por tanto, cuanto menor es el porcentaje menor riesgo de pobreza en cada CCAA. Hemos representado los datos en formato de tabla con el fin de analizar el nivel de los últimos años y su evolución con una perspectiva más reciente.

Lo primero que nos llama la atención es que nuestra Comunidad presenta un elevado nivel de riesgo de pobreza. ¡Casi uno de cada cuatro unidades de consumo está en situación de riesgo de pobreza! Aún peor la situación de Extremadura, con casi uno de cada tres. En el otro extremo, se encuentran Navarra y el País Vasco, y algo peor se encuentran las Islas Baleares.


Comparación del Riesgo de Pobreza de la CV con otras CCAA y la UE-27
El umbral de pobreza está fijado en el 60% de la mediana de ingresos de todos los hogares a nivel nacional
Comunidad Autónoma 2015 2016 2017 2018 2019 2020
Navarra 9.6 9.0 8.3 8.9 7.7 9.9
Pais_Vasco 10.9 9.0 9.7 8.6 10.0 10.0
Baleares 21.7 15.5 21.3 15.4 12.0 14.1
Comunidad_Valenciana 25.3 24.4 25.6 26.0 23.7 24.6
Extremadura 29.0 30.4 38.8 37.6 31.5 31.4
UE_27 17.3 17.3 16.9 17.0 16.5 NA
Datos recogidos del INE, expresados en % y el año 2013 como base.



3. TRABAJO

3.1 TASA DE EMPLEO


El trabajo es un elemento esencial en la calidad de vida de los individuos puesto que permite alcanzar mejores condiciones materiales y la integración en la sociedad.

Asimismo, tiene importantes efectos positivos sobre la salud y el bienestar subjetivo de las personas. Es importante no solo la existencia de un trabajo remunerado sino también que éste se desarrolle en condiciones de calidad, por la cantidad de tiempo que se le dedica y las interacciones con otras personas.

Para analizar este indicador y ver su implicación en la calidad de vida de la Comunidad Valenciana, empleamos un gráfico de la evolución temporal de la tasa de empleo para distintas Comunidades Autónomas.



Como podemos observar, las mayores tasas de empleo desde el año 2006 se han observado en Madrid y en las Islas Baleares, mientras que por otro lado las peores tasas se observan en Extremadura y Andalucía (Comunidades donde predomina en mayor medida el sector primario)

La Comunidad Valenciana presenta unas tasas de empleo que se situan entorno a la media española, por lo tanto, en cuanto a este indicador de empleo podríamos decir que tendríamos más oportunidad de estar empleados en la Comunidad Valenciana que en otras Comunidades Autónomas.

Como dato para comparar con la Comunidad Valenciana, a nivel nacional (en el año 2020), la tasa de empleo en España fue del 48,5%.



3.2 TASA DE PARO


Gráfico con la expicación

La falta de trabajo disminuye en gran medida la calidad de vida de los individuos. Esta falta produce un conjunto de efectos sociales y personales en gran medida interrelacionados, aumentando las desigualdades sociales y de salud, disminuyendo los niveles de capacitación, bienestar material y subjetivo de las personas.

Para ver que implicación tiene la tasa de paro en la calidad de vida de la Comunidad Valenciana, hemos extraido las 10 Comunidades Autónomas con mayores tasas de paro y podemos observar que dentro de ella se encuentra la Comunidad Valenciana.



Código


names(tasa_paro) <- as.matrix(tasa_paro[1, ])
tasa_paro <- tasa_paro[-1, ]
tasa_paro[] <- lapply(tasa_paro, function(x) type.convert(as.character(x)))


names(tasa_paro) = c("CCAA", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020")
# Cambio el nombre de las columnas para que la primera  columna se llame ccAA y podamos pasar a formato LONG

df_long2 <- tasa_paro %>% pivot_longer(cols=2:16 , names_to= "Años", values_to = "Tasa_Paro")
# Pasamos del formato wide al formato long

df_long2$Tasa_Paro <- as.numeric(gsub(",", ".", gsub("\\.", "", df_long2$Tasa_Paro)))
#Gráfico 10 comunidades con mayor tasa de paro (dentro se encuentra valencia)
df_ccaa <- df_long2 %>% 
  filter(Años == 2020, CCAA != "Pais Vasco" ) %>% # hemos eliminado al Pais Vasco ya que nos salía dentro del Top 10 con mas Tasa de Paro y en realidad, es el que menor tasa presenta :)
  select(CCAA , Tasa_Paro) %>%
  slice_max(Tasa_Paro, n = 10)

graf_paro <- ggplot(df_ccaa, aes(x = CCAA, y = Tasa_Paro)) + 
  geom_bar(stat = "identity",aes(fill = Tasa_Paro))

graf_paro1<- graf_paro + labs(title = "% Tasa de Paro Año 2020",
       subtitle = "10 comunidades con mas paro",
       caption = "Elaboración propia",
       x = "CCAA",
       y = "% paro") + theme_light() + 
  geom_text(aes(label = Tasa_Paro),nudge_y =0.3, colour = "black")

view(df_ccaa)

graf_paro1


  


Gráfico con la explicacicón

A nivel nacional la tasa de paro en el año 2020 fue del 15,5%, un valor superior a la tasa de paro del año 2019 que fue del 14,1%.

En el año 2020 los valores más altos en la tasa de paro correspondieron a las comunidades de: Ceuta (24,5%), Melilla (23,8%) y Canarias (22,6%).

Los valores más bajos en la tasa de paro se situaron en: País Vasco (9,5%), Comunidad Foral de Navarra (10,1%) y La Rioja (10,8%), ya que son empleos más bien vinculados a la industria.

La tasa de paro de la Comunidad Valenciana es un tanto superior a la tasa de nivel nacional, en concreto es del 16,2%, y en parte esta vinculada a la temporalidad del sector servicios, entre ellos del turismo, y de las actividades vinculadas a esta actividad.



3.3 SATISFACCIÓN CON EL TRABAJO


Este indicador sobre el bienestar responde a la pregunta de ¿Cuál es su grado de satisfacción global con su trabajo actual?. Para responder a la pregunta se utiliza una escala de 0 a 10, en la que 0 significa nada satisfecho y 10 plenamente satisfecho.

Con este indicador pretendemos conocer otro aspecto de la calidad de vida que se puede encontrar en la Comunidad Valenciana y que va más alla de la dimensión material o de los ingresos percibidos


CCAA De 0 a 4 De 5 a 6 De 7 a 8 De 9 a 10 Satisfaccion Media
2
3 Total 6,4 20,4 47,6 25,6 7,3
4 Andalucia 7,9 23,8 45,9 22,5 7,1
5 Aragon 4 15,7 49,4 31 7,7
6 Asturias, Principado de 7,5 17,9 50,2 24,4 7,3
7 Balears, Illes 3,7 18,3 47 31 7,6
8 Canarias 2,2 14,8 38,2 44,8 8
9 Cantabria 5,4 19,6 47,4 27,5 7,4
10 Castilla y Leon 6,6 20,4 46,3 26,7 7,3
11 Castilla - La Mancha 7 21 44,3 27,7 7,3
12 Cataluna 4,4 20,4 51,9 23,3 7,4
13 Comunitat Valenciana 6,7 17,2 47,5 28,6 7,4
14 Extremadura 4,4 18,8 50 26,7 7,4
15 Galicia 4,1 22 49,9 24 7,4
16 Madrid, Comunidad de 9 19,9 48 23,1 7,2
17 Murcia, Region de 7,7 28 47,6 16,7 6,9
18 Navarra, Comunidad Foral de 6,6 23,6 43,3 26,6 7,3
19 Pais Vasco 8 22,2 45,3 24,5 7,2
20 Rioja, La 6 17,1 53,6 23,3 7,4
21 Ceuta 7,8 20,7 42 29,5 7,4
22 Melilla 0,5 10,8 36,2 52,5 8,3


Según el Módulo sobre Bienestar del año 2018 de la Encuesta de Condiciones de Vida las comunidades con porcentajes más altos de personas que están muy satisfechas con el trabajo (9 y 10 puntos) corresponden a: Melilla (52,5%), Canarias (44,8%) y Aragón (31,0%).

Los porcentajes más bajos de personas que están muy satisfechas con el trabajo (9 y 10 puntos) corresponden a: Región de Murcia (16,7%), Andalucía (22,5%) y Comunidad de Madrid (23,1%).

Como podemos observar en la Tabla, la Comunidad Valenciana a nivel nacional ocupa una posición intermedia con una satisfacción media de 7,4, muy próxima a la media española

3.4 TRABAJO TEMPORAL


La temporalidad laboral supone un detrimento en la calidad de vida de los individuos porque disminuye la percepción subjetiva de seguridad en el empleo y tiene efectos negativos en la formación.

Además la temporalidad va asociada a diferentes grados de precariedad según la normativa de regulación del despido.

Por tanto, en el siguiente gráfico circular vamos a hablar del porcentaje de trabajadores que presentan contratos temporales sobre el total, es decir, pretendemos conocer el porcentaje de trabajadores que se encuentran menos protegidos tanto en el empleo como en el desempleo, ya que están poco protegidos por la regulación y son más vulnerables a los despidos.



En el año 2020, un 24,1% de asalariados tenían contrato de trabajo temporal. La comunidad con el porcentaje más bajo de asalariados con contrato temporal correspondió a la Comunidad de Madrid (18,8%) mientras que el porcentaje más alto de asalariados con contrato temporal en 2020 correspondió a Extremadura (34,9%).

La Comunidad Valenciana presenta una alta tasa de temporalidad (25,2%), la razón puede ser su dependencia al sector servicios (principalmente destaca el turismo)



4. SALUD Y EDUCACIÓN


La salud es otro de los aspectos importantes cuando hablamos sobre la calidad de vida de las personas. Tener unas buenas condiciones de salud son claves para poder conseguir mayores oportunidades laborales, obtener una mayor formación educativa y poder disfrutar mejor del ocio personal. Para obtener unas buenas condiciones de salud hay que seguir unos hábitos adecuados tanto en el ámbito físico, mental y social, no solamente hay que tener en cuenta la aparición de enfermedades. Para analizar este punto, vamos a observar la evolución de un dato muy importante como es la esperanza de vida. Y también, cómo se encuentra el acceso a los servicios sanitarios ya que son una fuente directa a la hora de solucionar los problemas de salud de la población.

4.1 Esperanza de Vida


4.1.1 Datos Comunidades Autónomas

En la tabla que tenemos a continuación, podemos observar cual es la esperanza de vida en las diferentes Comunidades Autónomas en el año 2020.

Los datos presentados son bastante positivos ya que, en aspectos generales, todas las comunidades tienen una esperanza de vida mayor de 80 años. Podríamos destacar a la población de las comunidades de Islas Baleares (83,46 años) y Navarra (83,36 años) como las que tienen una mayor esperanza de vida en España. Por otro lado, la población de Ceuta (79,28 años) y Melilla (78,82 años) son las que tienen una menor esperanza de vida en España, aunque sus datos siguen siendo bastante positivos.

Por lo que respecta a la Comunidad Valenciana, actualmente se encuentra en una posición intermedia en España, con una esperanza de vida de 82,36 años, llegando a superar a dos de las grandes comunidades como Cataluña y Madrid.


Esperanza de vida en las Comunidades Autonomas
En años
Comunidades y Ciudades Autónomas Total
Balears, Illes 83.46
Navarra, Comunidad Foral de 83.36
Galicia 83.33
País Vasco 83.17
Cantabria 83.02
Canarias 82.67
Castilla y León 82.53
Rioja, La 82.47
Aragón 82.39
Comunitat Valenciana 82.36
Madrid, Comunidad de 82.33
Murcia, Región de 82.27
Cataluña 82.26
Asturias, Principado de 82.09
Extremadura 81.78
Andalucía 81.54
Castilla - La Mancha 81.22
Ceuta 79.28
Melilla 78.82
Fuente: datos de INE


En este gráfico vamos a comparar cómo ha evolucionado en el tiempo la esperanza de vida en las actuales comunidades con mejores datos (Islas Baleares y Navarra) y a las comunidades de Cataluña y Madrid con la Comunidad Valenciana.

En esta evolución podemos llegar a la conclusión de que la Comunidad Valenciana, en la mayor parte del tiempo, se ha encontrado por debajo de las comunidades punteras en cuanto a esperanza de vida. Sin embargo, en el 2020, ha obtenido un resultado mayor que Cataluña y Madrid. Esto puede deberse principalmente a las consecuencias que deja la pandemia del COVID-19.


4.1.2 Datos Comunidad Valenciana

Por lo que respecta a los datos en la Comunidad, la tendencia de la esperanza de vida es creciente. Es cierto, que, en este último período, se ha sufrido un descenso por culpa de la pandemia, pero el efecto no es tan grande como el que se ha podido observar en Cataluña o en Madrid.

También hay que destacar, que la esperanza de vida de las mujeres en la Comunidad Valenciana es de, aproximadamente, 5 años más que la que tienen los hombres. Esta diferencia no ha conseguido reducirse durante el período analizado entre 1975 y 2020.




## 4.2 ACCESO A CUIDADOS SANITARIOS

Además de seguir unos buenos hábitos de vida para poder tener una buena salud, también se debe de contar con unos buenos servicios sanitarios. Estos deben de tener una buena accesibilidad en la que el paciente pueda ser atendido ante cualquier problema. Para conocer esta disponibilidad, vamos a analizar los datos de personas que no han accedido a cuidados médicos cuando lo han necesitado.


4.2.1 DATOS EN LAS COMUNIDADES AUTÓNOMAS

Datos No Acceso a Servicios Sanitarios 2020
Datos en %
CCAA No Acceso 1 No Acceso 2
Canarias 1.4 1.1
Navarra, Comunidad Foral de 0.9 1.5
Comunitat Valenciana 0.8 2.8
Balears, Illes 0.6 0.4
Andalucia 0.5 1.7
Castilla - La Mancha 0.5 0.7
Madrid, Comunidad de 0.4 2.3
Castilla y Leon 0.3 2.0
Cataluna 0.3 2.4
Asturias, Principado de 0.2 1.4
Murcia, Region de 0.2 1.3
Extremadura 0.1 0.4
Pais Vasco 0.1 0.6
Rioja, La 0.1 0.4
Aragon 0.0 0.6
Cantabria 0.0 1.9
Galicia 0.0 0.8
Ceuta 0.0 0.0
Melilla 0.0 1.2
Fuente: datos de INE
No Acceso 1: muy caro; muy lejos para acceder; problemas de lista de espera
No Acceso 2:no disponer de tiempo; no conoce ningún buen especialista; miedo al médico, hospitales, exploraciones médicas o tratamiento; esperar y ver si el problema mejora; otras razones



En esta tabla podemos ver los datos acerca de las personas que no han podido acceder a los servicios sanitarios cuando lo han necesitado. Este dato se divide en dos tipos de no acceso.

Las razones de no acceso 1 incluye todas aquellas razones acerca de que el servicio es caro y el paciente no se lo puede permitir. También incluye la lejanía del centro de salud en el que tiene que ser atendido. Y, los problemas de las listas de espera ya que algunos pacientes necesitan una intervención cuanto antes y se ven con restricciones.

En cuanto a las razones de no acceso 2 incluye aquellas acerca de no disponer de tiempo, no conocer un buen especialista, el miedo del paciente a ir al médico o a los hospitales o a exponerse a algún tratamiento, y que el propio paciente prefiere esperar a ver si el problema mejora en vez de acudir al centro sanitario y ser tratado.

En el año 2020, la comunidad en la que un mayor porcentaje de población tuvo problemas de no acceso 1 fue Canarias con un 1,4%. Muy cerca de ella, encontramos a la Comunidad Valenciana con un 0,8%. Además, hay varias comunidades que se encontraron con un 0% de su población que se acogió a estos problemas como Galicia, Cantabria, Aragón, Ceuta y Melilla.

En cuanto a las razones de no acceso 2, la comunidad con mayor porcentaje de población que tuvo ese tipo de problemas fue la Comunidad Valenciana con un 2,8%. En este tipo de razones es donde más comunidades tienen mínimo un 1% de su población afectada a excepción de Ceuta que es la única con un 0%.

4.2.2 DATOS EN LA COMUNIDAD VALENCIANA



En cuanto a los datos en la Comunidad Valenciana, vamos a observar la evolución de los problemas de acceso al sistema sanitario por las razones de no acceso 1.

Durante el período 2004-2006, llegó a tener un 2% de la población afectada, pero consiguió descender ese porcentaje hasta el 2013. Finalmente, se volvieron a reducir los datos hasta el 2020, donde ha ascendido hasta un 0,8% de la población. Es muy probable que esto se deba a las consecuencias de la pandemia del COVID-19 que ha supuesto una aglomeración de pacientes.


En cuanto a los datos sobre las razones de no acceso 2, vemos que el porcentaje de población que se acogió a estos problemas comparando las razones de no acceso 1 es mucho mayor. El año donde más afectó fue en 2010 donde llego al 10,8% de la población.

Un dato positivo, es que se pudo reducir en una gran medida estas cifras en el periodo 2017-2019. Hasta que, en el año 2020, a causa del COVID-19, ha vuelto a aumentar este porcentaje hasta el 2,8% y siendo la peor Comunidad Autónoma.

En conclusión, la posición de la Comunidad Valenciana comparando con las comunidades no es muy buena ya que en uno de los tipos de razones es la que más población tiene problemas de acceso al servicio sanitario. Sin embargo, un aspecto positivo es que, antes de llegar la pandemia en 2020, se han conseguido reducir esos datos, lo que significa que los problemas para acceder al sistema sanitario se han solucionado.



4.3 NIVEL DE EDUCACIÓN DE LA POBLACIÓN

La educación es un indicador importante para la persona ya que de manera directa consigue que el individuo aprenda nuevos conocimientos, pero otorga otros beneficios de manera indirecta como un aumento de su bienestar y de su calidad de vida.

La manera en la que la educación otorga una mayor calidad de vida en el individuo es que puede conseguir un mejor empleo en el futuro el cual le otorgue un salario mayor que le permita vivir en unas condiciones agradables. Al mismo tiempo, la educación permite al individuo conocer mejores estilos de vida saludables con efectos positivos en su salud y le genera unas mayores habilidades para que su integración en la sociedad sea más sencilla.


4.3.1 NIVEL DE EDUCACIÓN 0-2

Nivel de formación alcanzado por la población de 16 a 64 años (%)
Nivel 0-2
CCAA 2018 2019 2020
Extremadura 53,8 52,9 51,4
Ceuta 54,9 54,9 51,3
Castilla - La Mancha 49,9 48,7 47,3
Andalucia 49,2 48,2 47,2
Murcia, Region de 47,7 47,9 45,9
Melilla 49,7 49,9 43,6
Canarias 45,1 43,3 40,3
Balears, Illes 43,6 43,1 39,3
Rioja, La 39,1 39,1 38,8
Comunitat Valenciana 41,8 40,6 38,5
Castilla y Leon 40,3 39,1 38,1
Galicia 41,7 39,9 38
Cataluna 38,6 37,6 37,4
Aragon 36,8 35,6 33,5
Cantabria 32,3 32,7 33,2
Asturias, Principado de 34,3 33,9 31,7
Navarra, Comunidad Foral de 32,5 30,8 29,9
Madrid, Comunidad de 30 27,9 26,4
Pais Vasco 29,2 28,9 26,2
Fuente: datos de INE
Nivel 0-2:preescolar, primaria y 1ª etapa de educación secundaria



En cuanto al nivel de formación 0-2, acoge a todos aquellos estudiantes que hayan recibido una educación de preescolar, primaria y 1º etapa de educación secundaria. Digamos que este es el nivel de educación más básica, por tanto, un nivel de educación más bajo supone unos beneficios básicos para el individuo.

Como se puede observar en la tabla, vemos como Extremadura es la comunidad con más población con solo estudios básicos con un 51.4%. La situación de la Comunidad Valenciana en esta tabla es una posición intermedia baja, aunque su dato se podría considerar positivo ya que menos de la mitad de la población (un 38,5%) tiene una formación básica.


Si comparamos estos datos con las dos comunidades con mayor población con nivel 0-2, se observa que la Comunidad Valenciana ha estado siempre por debajo, y cada vez se ha ido reduciendo más. Sin embargo, al comparar con las comunidades con menor población con nivel 0-2, la Comunidad Valenciana no ha conseguido reducir las distancias con comunidades como Madrid.

4.3.2 NIVEL DE EDUCACIÓN 3-8

En cuanto al nivel 3-8, este hace referencia a la población que ha recibido una educación de 2ª etapa de secundaria y postsecundaria no superior, 1º ciclo y 2º ciclo de educación superior y doctorado.

Este es el nivel de formación más alto que un individuo puede conseguir. De esta manera, el individuo puede conseguir un mayor nivel de renta en el futuro, un empleo con mejores condiciones laborales, etc.

Nivel de formación alcanzado por la población de 16 a 64 años (%)
Nivel 3-8
CCAA 2018 2019 2020
Pais Vasco 70,8 71,1 73,8
Madrid, Comunidad de 70 72,1 73,6
Navarra, Comunidad Foral de 67,5 69,2 70,1
Asturias, Principado de 65,7 66,1 68,3
Cantabria 67,7 67,3 66,8
Aragon 63,2 64,4 66,5
Cataluna 61,4 62,4 62,6
Galicia 58,3 60,1 62
Castilla y Leon 59,7 60,9 61,9
Comunitat Valenciana 58,2 59,4 61,5
Rioja, La 60,9 60,9 61,2
Balears, Illes 56,4 56,9 60,7
Canarias 54,9 56,7 59,7
Melilla 50,3 50,1 56,4
Murcia, Region de 52,3 52,1 54,1
Andalucia 50,8 51,8 52,8
Castilla - La Mancha 50,1 51,3 52,7
Ceuta 45,1 45,1 48,7
Extremadura 46,2 47,1 48,6
Fuente: datos de INE
Nivel 3-8:2ª etapa de educación secundaria y postsecundaria no superior, 1º y 2º ciclo de educación superior y doctorado



La Comunidad Autónoma con mayor nivel de educación de su población es el País Vasco con un total de 73,8%, aumentando sus datos cada año. La situación de la Comunidad Valenciana es intermedia, aunque su dato es positivo ya que más del 50% de su población (un 61,5%) tiene una formación elevada lo que podría llegar a un aumento en su calidad de vida.


En comparación con las mejores Comunidades Autónomas en cuanto a formación educativa, la Comunidad Valenciana se encuentra muy lejos de Madrid y del País Vasco. Aunque, hay que destacar que el nivel de formación ha tenido una evolución creciente durante el tiempo.


En conclusión, se podría considerar que el nivel educativo en la Comunidad Valenciana es elevado ya que más del 50% de su población tiene estudios de nivel 3-8. Aunque, tiene una gran diferencia con las mejores Comunidades Autónomas.

4.4 NIVEL DE ABANDONO ESCOLAR

Uno de los aspectos importantes a tener en cuenta es el abandono escolar. El abandono escolar supone que un individuo carezca de educación, con sus correspondientes consecuencias en la calidad de vida. Si antes decíamos que con unos estudios elevados, se conseguía aumentar las posibilidades de mayor empleo, mayor salud, etc, si un individuo abandona su formación se verá privado de estas posibilidades de mejorar su calidad de vida.

Es por ello que para una sociedad es muy importante mantener a los jóvenes en el ámbito educativo para que puedan desarrollar sus habilidades e integrarse mejor y conseguir tanto resultados positivos para el propio individuo, como ofrecer beneficios a la sociedad.

Los datos de abandono escolar estudian a los individuos entre 18 a 24 años que no ha completado la 2ª etapa de secundaria.

En el siguiente gráfico observamos los datos de abandono escolar en las Comunidades Autónomas durante el año 2020. Las zonas donde el abandono es mayor son en Ceuta (25,5%) y en Melilla (22,8%). Respecto a la Comunidad Valenciana, se encuentra dentro de la media de España, y tiene un 15% de población entre 18 y 24 años que abandona sus estudios.




5. OTROS INDICADORES


5.1 POBLACIÓN QUE SUFRE PROBLEMAS DE RUIDOS PRODUCIDOS POR VECINOS O DEL EXTERIOR


La contaminación acústica se define como el exceso de ruido ambiental y afecta a la salud de las personas (estrés, pérdida de la audición, trastornos del sueño) y por tanto a su calidad de vida.

A partir de este gráfico se muestra el porcentaje de personas que tienen la vivienda con problemas de ruidos producidos por los vecinos o procedentes del exterior (tráfico, negocios, fábricas colindantes).

Para analizar la situación de la Comunidad Valenciana mostramos dos gráficos en el que se diferencian las Comunidades Autónomas con más porcentaje de población que sufre ruidos frente a las Comunidades menos afectadas

Como dato a nivel nacional, en el año 2020 un 21,9% de personas declaraba problemas de ruidos producidos por vecinos o del exterior, y como podemos observar en los gráficos, la Comunidad Valenciana se encuentra un poco alejada de las 4 Comunidades más afectadas por ruidos, pero se encuentra por encima del total nacional con un 26% de la población afectada por ruidos.

5.2 DELINCUENCIA O VANDALISMO EN LA ZONA

La seguridad física y la comodidad de poder realizar cualquier actividad es muy importante para los individuos y afecta directamente a su bienestar. Las condiciones del entorno en el que se encuentran las personas llega a ser importante para medir su calidad de vida. Es por ello que vamos a comprobar cuál es el nivel de delincuencia o vandalismo en las distintas Comunidades Autónomas.

5.2.1 DATOS EN LAS COMUNIDADES AUTÓNOMAS

En esta tabla podemos ver como la zona con mayor porcentaje de delincuencia es Melilla con un 35,5%. Por lo que respecta a la Comunidad Valenciana, se encuentra en unos puestos bajos y con un índice relativamente pequeño, de un 7,7%.


Delincuencia en las Comunidades Autonomas. Año 2020
En %
Comunidades y Ciudades Autónomas Total
Melilla 35.5
Ceuta 24.0
Murcia, Región de 20.7
Canarias 20.2
Cataluña 19.0
Andalucía 17.5
Madrid, Comunidad de 16.8
País Vasco 13.9
Castilla - La Mancha 11.3
Aragón 10.9
Balears, Illes 8.3
Extremadura 7.9
Comunitat Valenciana 7.7
Castilla y León 7.3
Galicia 7.2
Navarra, Comunidad Foral de 7.1
Asturias, Principado de 6.8
Rioja, La 5.1
Cantabria 4.0
Fuente: datos de INE



5.2.2 DATOS EN LA COMUNIDAD VALENCIANA

Para concluir como ha evolucionado los datos en la Comunidad Valenciana, podemos observar como en el periodo 2005-2010, la delincuencia era bastante elevada llegando a estar en un 25%. Pero, la tendencia de este dato ha sido decreciente y esto es bastante positivo para la calidad de vida de la población de la Comunidad Valenciana




6. ÍNDICE DE BUENA VIDA


A lo largo del trabajo nos hemos planteado algo que vosotros también seguramente os habéis preguntado, ¿Dónde realmente se sitúa la Comunidad Valenciana en comparación con las otras Comunidades Autónomas? Ya que este es el objetivo final y la razón de ser de este trabajo. Esta es la razón por la cual hemos creado nuestro propio Índice: “Una Vida Mejor” ®.
Nos hemos basado/inspirado en el “Better Life Index” de la OCDE que surge como una forma alternativa de comparar el bienestar entre distintos países, en lugar del Producto Interior Bruto. El Índice lo hemos basado en la mayoría de los indicadores que hemos ido analizando y representando gráficamente durante nuestro trabajo.
Hemos incluido en nuestro Índice variables de todo tipo, tanto objetivos y subjetivos. Esto nos permite realizar un análisis exhaustivo cuantitativo y cualitativo tomando en consideración datos “puros” (como valores monetarios) y datos “personales” (como la satisfacción personal con un tema). En nuestro caso hemos considerado un peso igual de las 4 categorías para que el resultado no presente ningún sesgo a favor de ciertas variables.
El índice lo hemos creado mediante una función de normalización con una escala de 0 a 1, siendo 0 el valor más pequeño y 1 el valor más elevado.
A continuación, os presentaremos el ranking de cada uno de los 14 indicadores y la situación de cada CCAA en comparación con los demás.

6.1 Índices de los 14 indicadores



6.1.1 Índices de las condiciones materiales

En cuanto a las condicones materiales, vemos que destaca sobre todo el País Vasco, Navarra, Madrid y Cataluña. En las últimas posiciones, vemos a Ceuta, Melilla, Extremadura y Andalucia. La Comunidad Valenciana se encuentra muy por debajo también de las regiones top y algo por encima de las más pobres.




6.1.2 Índices del trabajo

Podemos observar en el caso del trabajo, que la Comunidad Valenciana se posiciona en la parte inferior baja de la tabla, pero sí es verdad que en satisfacción del trabajo y en la tasa de empleo se encuentra más arriba que la posición en la que se encuentra normalmente. En términos generales, vemos como en este caso la hegemonía del País Vasco no se mantiene, sino que es adelantado por varias comunidades en varios de los indicadores. Algo que podemos resaltar de este ranking, es la posición de las CCAA en cuanto a la satisfacción de trabajo sobre todo la primera posición de Melilla. De hecho, es el único indicador en el cual lidera el ranking y nos hace pensar si realmente la renta es un buen indicador del nivel de vida.




6.1.3 Índices de la educación y la salud

En temas de salud y educación, destacan las regiones de País vasco, Cantabria, Madrid, Asturias y Galicia mientras que a la cola están Ceuta, Melilla, Andalucía, Canarias y Castilla la Mancha. La Comunidad Valenciana está justo debajo de la mitad como en muchos otros indicadores.




6.1.4 Índices de otros indicadores

En “otros indicadores”, destcan regiones que no suelen estar en la cima como por ejemplo Cantabria, Extremadura y Castilla y León y a su vez, la Comunidad Valenciana está por encima del 50% justo por delante de Cataluña y justo por debajo del País vasco.




6.2 Índice de las cuatro categorías




6.3 Índice final

En conclusión, vemos que la Comunidad Valenciana suele estar a niveles medios en comparación con el resto de las CCAA. Existen indicadores en el cual está por encima de la media de España pero otros en el cual su ranking es muy inferior. Además, observamos una clara tendencia en donde las zonas industriales como País Vasco Navrra y Madrid lideran el ranking, mientras que las zonas tradionalmente mñas subdesarrollados como Ceuta, Melilla, Andalucía, Canarias y Murcia están muy alejados del resto de España. A todo esto, habría que actualizar los datos de este año con los efectos econñomicos negativos provcados por la crisis sanitaria d ela COVID-19 y analizar el efecto, si ha sido homogéneo o heterogéneo entre las Comunidades Autónomas de España.

LS0tDQp0aXRsZTogIsK/U2Ugdml2ZSBiaWVuIGVuIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hPyINCmF1dGhvcjogIkxhd3JlbmNlIERhbmllbCBQaGlsbGlwcyBCYXRlcyAobGFkYXBAYWx1bW5pLnV2LmVzKSAgXG5cbiBQZWRybyBKdWxpw6FuIEzDs3BleiBNZWrDrWFzIChwZWp1bG9tZUBhbHVtbmkudXYuZXMpICBcbiBcbiBKdWxpbyBHb256YWxleiBNaXJhbGxlcyhqdWdvbm1pQGFsdW1uaS51di5lcykuIFxuXG4gVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIg0KZGF0ZTogIkRpY2llbWJyZSBkZSAyMDIxIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICAjY3NzOiAiLi9hc3NldHMvbXlfY3NzX2ZpbGUuY3NzIg0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlIA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMyANCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgZGZfcHJpbnQ6IGthYmxlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtyIHBhY2thZ2VzLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQojSU5TVEFMQU1PUyBMSUJSRVLDjUFTDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoa2xpcHB5KSAgIA0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoZ3QpDQpsaWJyYXJ5KGdndGhlbWVzKQ0KbGlicmFyeShnZ2FuaW1hdGUpDQpsaWJyYXJ5KHRyYW5zZm9ybXIpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGhyYnJ0aGVtZXMpDQpsaWJyYXJ5KHBhbGV0dGVlcikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShleHRyYWZvbnQpIA0KDQpgYGANCg0KYGBge3IgY2h1bmstc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsDQogICAgICAgICAgICAgICAgICAgICAgI2ZpZy53aWR0aCA9IDcsICNmaWcuaGVpZ2h0PSA3LCAgIA0KICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywNCiAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA9IFRSVUUsICBmaWcuc2hvdyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gMC42MjgsIG91dC53aWR0aCA9ICI3NSUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChkZXYgPSAicG5nIiwgZGV2LmFyZ3MgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpDQpgYGANCg0KYGBge3Igb3B0aW9ucy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQ0Kb3B0aW9ucygieWFtbC5ldmFsLmV4cHIiID0gVFJVRSkgDQpgYGANCg0KDQpgYGB7ciBrbGlwcHksIGVjaG8gPSBGQUxTRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYA0KDQoNCmBgYHtyIGxpbXBpZXphIGRhdG9zLCBpbmNsdWRlID0gRkFMU0V9DQoNCiNDQVJHQU1PUyBMT1MgREFUT1MNCg0KUmVudGFfbWVkaWEgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiLi9kYXRvcy9SZW50YV9tZWRpYS5jc3YiKSkNClJlbnRhX21lZGlhX1VFIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoIi4vZGF0b3MvUmVudGFfbWVkaWFfVUUuY3N2IikpDQoNClJlbnRhX21lZGlhbmEgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiLi9kYXRvcy9SZW50YV9tZWRpYW5hLmNzdiIpKQ0KUmVudGFfbWVkaWFuYV9VRSA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCIuL2RhdG9zL1JlbnRhX21lZGlhbmFfVUUuY3N2IikpDQoNCkRlc2lndWFsZGFkIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoIi4vZGF0b3MvRGVzaWd1YWxkYWQuY3N2IikpDQpEZXNpZ3VhbGRhZF9VRSA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCIuL2RhdG9zL0Rlc2lndWFsZGFkX1VFLmNzdiIpKSAgICAgICAgICAgICAgICAgICAgDQpSX3BvYnJlemEgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiLi9kYXRvcy9SaWVzZ29fcG9icmV6YS5jc3YiKSkNClJfcG9icmV6YV9VRSA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCIuL2RhdG9zL1JpZXNnb19wb2JyZXphX1VFLmNzdiIpKQ0KDQp0YXNhX2VtcGxlbyA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCIuL2RhdG9zL3Rhc2FfZW1wbGVvLmNzdiIpKQ0KZGZfdGFzYV9lbXBsZW8gPC0gdGFzYV9lbXBsZW8NCg0KdGFzYV9wYXJvIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoIi4vZGF0b3MvdGFzYV9wYXJvLmNzdiIpKQ0KZGZfdGFzYV9wYXJvIDwtIHRhc2FfcGFybw0KDQpzYXRpc190cmFiIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoIi4vZGF0b3Mvc2F0aXNmYWNjaW9uLmNzdiIpKQ0KZGZfc2F0aXNfdHJhYiA8LSBzYXRpc190cmFiDQoNCnRyYWJham9fdGVtcCA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCIuL2RhdG9zL3RyYWJham9fdGVtcG9yYWwuY3N2IikpDQpkZl90cmFiYWpvX3RlbXAgPC0gdHJhYmFqb190ZW1wDQoNCmFiYW5kb25vIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zL2FiYW5kb25vX2NjYWEuY3N2IikpDQoNCmVzcGVyYW56YV92aWRhIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zL2VzcGVyYW56YV92aWRhLmNzdiIpKSANCg0Kbm9fYWNjZXNvXzEgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3Mvbm9fYWNjZXNvXzEuY3N2IikpIA0KDQpydWlkb3MgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiLi9kYXRvcy9ydWlkb3MuY3N2IikpDQpkZl9ydWlkb3MgPC0gcnVpZG9zDQoNCmRmX2RlbF9jY2FhIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zL2RlbF9jY2FhLmNzdiIpKSANCg0KdmlkYV9obSA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcy92aWRhX2htLmNzdiIpKQ0KDQpub19hY2Nlc29fMSA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcy9ub19hY2Nlc29fMS5jc3YiKSkNCg0Kbm9fYWNjZXNvXzIgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3Mvbm9fYWNjZXNvXzIuY3N2IikpDQoNCmVkdWNfMDIgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MvZWR1Y18wMi5jc3YiKSkNCg0KZWR1Y18zOCA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcy9lZHVjXzM4LmNzdiIpKQ0KDQpkZWxpbmN1ZW5jaWEgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MvZGVsX2NjYWFfanVsaW8uY3N2IikpDQoNCmFiYW5kb25vIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zL2FiYW5kb25vX2NjYWEuY3N2IikpDQoNCiNMYXdyZW5jZSwgbWlyYXIgY3N2cyB5IGNvcGlhciBsb3Mgb3JpZ2luYWxlcyBlbiBhcmhjaXZvIGRhdG9zDQpkZl9ub19hY2Nlc29fMSA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCIuL2RhdG9zL25vX2FjY2Vzb18xX2xhd3JlbmNlLmNzdiIpKSANCg0KZGZfYWJhbmRvbm8gPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MvYWJhbmRvbm9fY2NhYV9sYXdyZW5jZS5jc3YiKSkNCg0KZGZfZWR1Y18zOCA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcy9lZHVjXzM4X2xhd3JlbmNlLmNzdiIpKSANCg0KZGZfZXNwZXJhbnphX3ZpZGEgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MvZXNwZXJhbnphX3ZpZGFfbGF3cmVuY2UuY3N2IikpDQoNCmRmX3J1aWRvcyA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCIuL2RhdG9zL3J1aWRvcy5jc3YiKSkNCg0KZGZfZGVsX2NjYWEgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MvZGVsX2NjYWFfbGF3cmVuY2UuY3N2IikpIA0KDQpgYGANCg0KDQo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4NCg0KPCEtLSBFbCBww6FycmFmbyBkZSBhYmFqbyBoYXMgZGUgZGVqYXJsbyBjYXNpIGlndWFsLCBzb2xvIEhBUyBkZSBTVVNUSVRVSVIgInBlcmV6cDQ0IiBwb3IgdHUgdXN1YXJpbyBkZSBHaXRodWItLT4NClRyYWJham8gZWxhYm9yYWRvIHBhcmEgbGEgYXNpZ25hdHVyYSAiUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhIiBkZSBsYSBVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEgZHVyYW50ZSBlbCBjdXJzbyAyMDIxLTIwMjIuIEVsIHJlcG8gZGVsIHRyYWJham8gZXN0w6EgW2FxdcOtXShodHRwczovL2dpdGh1Yi5jb20vbG9yZW56bzE5OTkvdHJhYmFqb19CaWdEYXRhX2VxdWlwbyl7dGFyZ2V0PSJfYmxhbmsifS4gDQoNCjwhLS0gRWwgcMOhcnJhZm8gZGUgYWJham8gaGFzIGRlIGRlamFybG8gZXhhY3RhbWVudGUgaWd1YWwsIE5PIGhhcyBkZSBjYW1iaWFyIG5hZGEtLT4NCg0KTGEgcMOhZ2luYSB3ZWIgZGUgbGEgYXNpZ25hdHVyYSB5IGxvcyB0cmFiYWpvcyBkZSBtaXMgY29tcGHDsWVyb3MgcHVlZGVuIHZlcnNlIFthcXXDrV0oaHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjEtMjItd2ViLzA3LXRyYWJham9zLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uDQoNCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCg0KDQojIDEuMSBJbnRyb2R1Y2Npw7NuDQoNCkVsIG9iamV0aXZvIHByaW5jaXBhbCBkZWwgdHJhYmFqbyBlcyBhbmFsaXphciBhIHRyYXbDqXMgZGUgdW5hIHNlcmllIGRlIGluZGljYWRvcmVzIGxhIGNhbGlkYWQgZGUgdmlkYSBlbiBudWVzdHJhIGNvbXVuaWRhZCBwYXJhIGNvbm9vY2VyIG51ZXN0cmEgcG9zaWNpw7NuIGNvbiByZXNwZWN0byBhbCByZXN0byBkZSBjb211bmlkYWRlcyBlc3Bhw7FvbGFzLkVuIGNpZXJ0b3MgYXNwZWN0b3MgYW5hbGl6YXJlbW9zIHVuIMOhbWJpdG8gZGUgbWF5b3Igbml2ZWwsIGVzIGRlY2lyLCBhbmFsaXphcmVtb3MgbGEgcG9zaWNpw7NuIGRlIEVzcGHDsWEgZW4gY29tcGFyYWNpw7NuIGNvbiBsYSBVRSBwYXJhIHZlciBjb21vIGVzdG8gc2UgcmVmbGVqYSBlbiBsYSBjYWxpZGFkIGRlIHZpZGEgZGUgbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEuDQoNCg0KDQoNCg0KIyAxLjIgRGF0b3MNCkxvcyBkYXRvcyBsb3Mgb2J0ZW5kcmVtb3MgYSBwYXJ0aXIgZGVsIEluc3RpdHV0byBOYWNpb25hbCBkZSBFc3RhZMOtc3RpY2EsIGVuIGNvbmNyZXRvLCBhbmFsaXphcmVtb3MgaW5kaWNhZG9yZXMgZGUgY2FsaWRhZCBkZSB2aWRhIHBhcmEgY29ub2NlciBlbCBwcm9ncmVzbyBkZSBsYSBzb2NpZWRhZCB5IGVsIGJpZW5lc3RhciBkZSBsb3MgaW5kaXZpZHVvcyBtw6FzIGNlcmNhbm9zIGRlIG51ZXN0cm8gZGUgZW50b3JubyBjb21vIHNvbiBsYXMgY29uZGljaW9uZXMgZWNvbsOzbWljYXMsIHRyYWJham8sIGVkdWNhY2nDs24sIGRlc2lndWFsZGFkLCBzYWx1ZCwgZXRjLg0KDQoNCg0KDQojIyAxLjMgUHJvY2VzYW5kbyBsb3MgZGF0b3MNCkV4dHJhZXJlbW9zIGxvcyBkYXRvcyBkZSBFeGNlbCwgc2VsZWNjaW9uYXJlbW9zIGxhcyB2YXJpYWJsZXMgcXVlIGNvbnNpZGVyYW1vcyBtw6FzIGltcG9ydGFudGVzIHBhcmEgZGV0ZXJtaW5hciBsbyBxdWUgZXMgY2FsaWRhZCBkZSB2aWRhIHkgcG9zaWJsZW1lbnRlIHRlbmRyZW1vcyBxdWUganVudGFyIG8gZnVzaW9uYXIgdGFibGFzIGNvbiBlbCBvYmpldGl2byBkZSBjb21wYXJhciBjb24gcmVzcGVjdG8gYSBsYSBVRS4NCg0KDQo8YnI+DQoNCg0KDQojIDEuNCBCaWJsaW9ncmFmw61hDQoNCjxicj4NCg0KSGVtb3MgdXRpbGl6YWRvIGRhdG9zIGRlbCBJTkUuDQoNCjxicj4NCg0KDQoNCg0KYGBge3IsIGVjaG8gPSBGQUxTRX0NCnNlc3Npb25pbmZvOjpzZXNzaW9uX2luZm8oKSAlPiUgZGV0YWlsczo6ZGV0YWlscyhzdW1tYXJ5ID0gJ0luZm9ybWFjacOzbiBkZSBtaSBSLXNlc2nDs246JykgDQpgYGANCg0KDQo8YnI+PGJyPg0KDQo8ZGl2IGNsYXNzPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIGRhdGEtdW5pcXVlPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIHN0eWxlPSJoZWlnaHQ6IDA7Ij48L2Rpdj4NCg0KDQpgYGB7ciBjb2RpZ29fdW5pdmVyc2FsLCBldmFsPSBUUlVFLCBlY2hvPSBGQUxTRSwgd2FybmluZz0gRkFMU0UsIGNvbW1lbnQgPSBGQUxTRX0NCg0KI0NPRElHTyBVTklWRVJTQUwtLS0tLS0tLS0tLS0tLQ0KI0NyZWFyIHZlY3RvciBkZSBsYXMgQ29tdW5pZGFkZXMgQXV0w7Nub21hcy0tLS0tDQpDQ0FBIDwtIGMoIkFuZGFsdWNpYSIsICJBcmFnb24iLCAiQXN0dXJpYXMiLCAgIkJhbGVhcmVzIiwgIkNhbmFyaWFzIiwgIkNhbnRhYnJpYSIsICJDYXN0aWxsYV9MYV9NYW5jaGEiLCAiQ2FzdGlsbGFfeV9MZW9uIiwgIkNhdGFsdW55YSIsICJDZXV0YSIsICJDb211bmlkYWRfVmFsZW5jaWFuYSIsICJFeHRyZW1hZHVyYSIsICJHYWxpY2lhIiwgIk1hZHJpZCIsICJNZWxpbGxhIiwgIk11cmNpYSIsICJOYXZhcnJhIiwgIlBhaXNfVmFzY28iLCAiTGFfUmlvamEiLCAiRXNwYcOxYSIsICJVRV8yNyIsICJVRV8yOCIpDQoNCiNwYXJhIHF1ZSBzZWEgbWlzbWEgbG9uZ2l0dWQgKHNpbiBVRTI3LCBVRTI4IHkgRXNwYcOxYSkgeWEgcXVlIGVuIGxhIGNyZWFjacOzbiBkZWwgcmFua2luZyB2YW1vcyBhIHV0aWxpemFyIENDQUEgc29sbw0KQ0NBQV9zaW5fVUUgPC0gYygiQW5kYWx1Y2lhIiwgIkFyYWdvbiIsICJBc3R1cmlhcyIsICAiQmFsZWFyZXMiLCAiQ2FuYXJpYXMiLCAiQ2FudGFicmlhIiwgIkNhc3RpbGxhX0xhX01hbmNoYSIsICJDYXN0aWxsYV95X0xlb24iLCAiQ2F0YWx1bnlhIiwgIkNldXRhIiwgIkNvbXVuaWRhZF9WYWxlbmNpYW5hIiwgIkV4dHJlbWFkdXJhIiwgIkdhbGljaWEiLCAiTWFkcmlkIiwgIk1lbGlsbGEiLCAiTXVyY2lhIiwgIk5hdmFycmEiLCAiUGFpc19WYXNjbyIsICJMYV9SaW9qYSIpDQoNCiNDQ0FBIHBlcm8gb3JkZW5hZG8gcGFyYSBkYXRvcyBqdWxpbyB5IFBlZHJvICh0cmFiYWpvLCBlZHVjX3NhbHVkKQ0KQ0NBQV9zaW5fVUVfc2luX29yZCA8LSBjKCJBbmRhbHVjaWEiLCAiQXJhZ29uIiwgIkFzdHVyaWFzIiwgICJCYWxlYXJlcyIsICJDYW5hcmlhcyIsICJDYW50YWJyaWEiLCAiQ2FzdGlsbGFfeV9MZW9uIiwgIkNhc3RpbGxhX0xhX01hbmNoYSIsICJDYXRhbHVueWEiLCAiQ29tdW5pZGFkX1ZhbGVuY2lhbmEiLCAiRXh0cmVtYWR1cmEiLCAiR2FsaWNpYSIsICJNYWRyaWQiLCAiTXVyY2lhIiwgIk5hdmFycmEiLCAiUGFpc19WYXNjbyIsICJMYV9SaW9qYSIsIkNldXRhIiwgIk1lbGlsbGEiKQ0KDQojQ0NBQSBwYXJhICJydWlkb3MiLCANCkNDQUFfMiA8LSBjKCJDZXV0YSIsICJNdXJjaWEiLCAiQ2FuYXJpYXMiLCAiTWVsaWxsYSIsICJNYWRyaWQiLCAiQ29tdW5pZGFkX1ZhbGVuY2lhbmEiLCAiQW5kYWx1Y2lhIiwgIkJhbGVhcmVzIiwgIk5hdmFycmEiLCAiTGFfUmlvamEiLCAiUGFpc19WYXNjbyIsICJDYXRhbHVueWEiLCAiQXN0dXJpYXMiLCAiQXJhZ29uIiwgIkNhbnRhYnJpYSIsICJHYWxpY2lhIiwgIkNhc3RpbGxhX3lfTGVvbiIsICJDYXN0aWxsYV9MYV9NYW5jaGEiLCAiRXh0cmVtYWR1cmEiKQ0KI0NDQUEgcGFyYSBjb2x1bW5hIGRlIFRvdGFsIG5vcm0gZWYgYW1iDQpDQ0FBXzMgPC0gYygiQ2FudGFicmlhIiwgIkV4dHJlbWFkdXJhIiwgIkNhc3RpbGxhX3lfTGVvbiIsICJHYWxpY2lhIiwgIkNhc3RpbGxhX0xhX01hbmNoYSIsICJBc3R1cmlhcyIsICJMYV9SaW9qYSIsICJBcmFnb24iLCAiTmF2YXJyYSIsICJCYWxlYXJlcyIsICJQYWlzX1Zhc2NvIiwgIkNvbXVuaWRhZF9WYWxlbmNpYW5hIiwgIkNhdGFsdW55YSIsICJBbmRhbHVjaWEiLCAiTWFkcmlkIiwgIkNhbmFyaWFzIiwgIk11cmNpYSIsICJDZXV0YSIsICJNZWxpbGxhIikNCiNDQ0FBIHBhcmEgcmFua2luZyBmaW5hbA0KQ0NBQV9yYW5rX2ZpbmFsIDwtIGMoIlBhaXNfVmFzY28iLCAiTmF2YXJyYSIsICJNYWRyaWQiLCAiQ2F0YWx1bnlhIiwgIkJhbGVhcmVzIiwgIkxhX1Jpb2phIiwgIkFyYWdvbiIsICJDYXN0aWxsYV95X0xlb24iLCAiQ2FudGFicmlhIiwgIkdhbGljaWEiLCAiQXN0dXJpYXMiLCAiQ2FzdGlsbGFfTGFfTWFuY2hhIiwgIkNvbXVuaWRhZF9WYWxlbmNpYW5hIiwgIk11cmNpYSIsICJBbmRhbHVjaWEiLCAiQ2FuYXJpYXMiLCAiRXh0cmVtYWR1cmEiLCAiTWVsaWxsYSIsICJDZXV0YSIpDQojZnVuY2lvbiBwYXJhIG5vcm1hbGl6YXIgbnVtZXJvcywgY3VhbnRvIG1hcyBncmFuZGUgbWVqb3INCm1pbl9tYXhfbm9ybV9ncmFuIDwtIGZ1bmN0aW9uKHgpIHsNCiAgKHggLSBtaW4oeCkpIC8gKG1heCh4KSAtIG1pbih4KSkNCn0NCg0KI2Z1bmNpb24gcGFyYSBub3JtYWxpemFyIG51bWVyb3MsIGN1YW50byBtYXMgcGVxdWXDsW8gbWVqb3INCm1pbl9tYXhfbm9ybV9wZXEgPC0gZnVuY3Rpb24oeCkgew0KICAxIC0gKCh4IC0gbWluKHgpKSAvIChtYXgoeCkgLSBtaW4oeCkpKQ0KfQ0KYGBgDQoNCg0KDQojIDIuIENPTkRJQ0lPTkVTIE1BVEVSSUFMRVMNCg0KPGJyPg0KDQpMYXMgY29uZGljaW9uZXMgbWF0ZXJpYWxlcyB5L28gZWNvbsOzbWljYXMgZGUgbG9zIGNpdWRhZGFub3Mgc29uIHVubyBkZSBsb3MgcHJpbmNpcGFsZXMgZmFjdG9yZXMgZGVsIG5pdmVsIGRlIHZpZGEgeSB1bm8gZGUgbG9zIGluZGljYWRvcmVzIG3DoXMgaW1wb3J0YW50ZXMgYSBsYSBob3JhIGRlIGNvbXBhcmFyIGxhIHJpcXVlemEgZW50cmUgZG9zIHJlZ2lvbmVzIG8gcGHDrXNlcy4gQXVucXVlIG5vIG5vcyBndXN0ZSwgZWwgZGluZXJvIG11ZXZlIGVsIG11bmRvIHkgcG9yIHRhbnRvIGVzIGVzZW5jaWFsIGluY2x1aXIgZXN0ZSBhc3BlY3RvIGVuIG51ZXN0cm8gYW7DoWxpc2lzIGRlbCBuaXZlbCBkZSB2aWRhIGVuIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLiBBIGNvbnRpbnVhY2nDs24sIG9zIHByZXNlbnRhcmVtb3MgY3VhdHJvIGluZGljYWRvcmVzIHF1ZSBoZW1vcyBjb25zaWRlcmFkb3MgcHJpb3JpdGFyaW9zIGNvbiBlbCBmaW4gZGUgY29udHJhc3RhciBlbCBuaXZlbCBkZSBsYXMgY29uZGljaW9uZXMgbWF0ZXJpYWxlcyBlbiBsYXMgZGlzdGludGFzIENvbXVuaWRhZGVzIEF1dMOzbm9tYXMsIGhhY2llbmRvIGhpbmNhcGnDqSBlbiBudWVzdHJhIENvbXVuaWRhZC4NCg0KPGJyPjxicj4NCg0KIyMgMi4xIFJFTlRBIE1FRElBDQoNCjxicj4NCg0KRW4gbnVlc3Ryb3MgZGF0b3MsIGxhIHJlbnRhIG1lZGlhIHJlcHJlc2VudGEgbGEgcmVudGEgZGlzcG9uaWJsZSBuZXRhIGFudWFsIGRlIGNhZGEgaG9nYXIgZW4gYmFzZSBhIGxhIEVuY3Vlc3RhIGRlIGNvbmRpY2lvbmVzIGRlIFZpZGEuIEVzIGVsIGluZGljYWRvciBxdWUgbm9zIHZpZW5lIGRlIHByaW1lcmFzIGEgbGEgY2FiZXphIGN1YW5kbyBwZW5zYW1vcyBlbiByZWFsaXphciB1bmEgY29tcGFyYWNpw7NuIGRlbCBuaXZlbCBkZSB2aWRhIGVudHJlIGRvcyByZWdpb25lcyBkaXN0aW50YXMuIFBvciBsbyBnZW5lcmFsLCBjdWFudG8gbcOhcyBlbGV2YWRhIHNlYSBsYSByZW50YSBtZWRpYSBtYXlvciBzZXLDoSBsYSByZW50YSBpbmRpdmlkdWFsIGRlIGNhZGEgaG9nYXIgeSBwb3IgdGFudG8gZGUgY2FkYSBjaXVkYWRhbm8uDQogRWwgw7puaWNvIGluY29udmVuaWVudGUgZGUgdXRpbGl6YXIgbGEgcmVudGEgbWVkaWEgZXMgZWwgZ3JhbiBwZXNvIHF1ZSB0aWVuZW4gbG9zIOKAnG91dGxpZXJz4oCdICh2YWxvcmVzIGF0w61waWNvcykgcXVlIHBvZHLDrWFuIGRpc3RvcnNpb25hciBudWVzdHJvcyByZXN1bHRhZG9zLiBQb3IgZWplbXBsbywgdW5hIHJlbnRhIG1lZGlhIGRlIHVuIG11bHRpbWlsbG9uYXJpbyBub3MgZWxldmFyw61hIGxhIHJlbnRhIG1lZGlhIHByb21lZGlvLCBwZXJvIHNpbiBsbGVnYXIgYSBhdW1lbnRhciByZWFsbWVudGUgbGEgcmVudGEgZGUgbG9zIGRlbcOhcyBjaXVkYWRhbm9zLiBFc3RvIGVzIHVuIHByb2JsZW1hIHF1ZSBzZSBwdWVkZSBjb3JyZWdpciBlbXBsZWFuZG8sIGFkZW3DoXMgZGUgdmFsb3JlcyBtZWRpb3MsIGxvcyB2YWxvcmVzIG1lZGlhbm9zIChjb3NhIHF1ZSB2ZXJlbW9zIGVuIGVsIHNpZ3VpZW50ZSBhcGFydGFkbykuDQpBIGNvbnRpbnVhY2nDs24sIG9zIG1vc3RyYW1vcyB1bmEgdGFibGEgcmVzYWx0YW5kbyBsb3MgdmFsb3JlcyBkZSBsYSByZW50YSBtZWRpYSBlbiAyMDIwIGNvbiBsYXMgdHJlcyBDQ0FBIGNvbiBtZW5vciByZW50YSBtZWRpYSB5IGxhcyB0cmVzIGNvbiBtYXlvciByZW50YSBtZWRpYSwgc2luIG9sdmlkYXJub3MgZGUgbGEgY29tdW5pZGFkIFZhbGVuY2lhbmEgeSBlbiBlc3RlIGNhc28gbGEgVUUtMjcuICANCk9ic2VydmFtb3MgcXVlIG5vIHRlbmVtb3MgZGF0b3MgZGUgbGEgVUUgcGFyYSBlc3RlIGHDsW8sIHBlcm8gcG9kZW1vcyBhc3VtaXIgcXVlIGVsIHZhbG9yIHNlcsOtYSBhcHJveGltYWRvIGFsIDIwMTkuIExhIHRhYmxhIGVzdMOhIG9yZGVuYWRhIGRlIG1heW9yIGEgbWVub3IsIHNpZW5kbyBQYcOtcyBWYXNjbyBsYSByZWdpw7NuIOKAnG7Dum1lcm8gMeKAnSwgY29zYSBxdWUgc2UgcmVwZXRpcsOhIGR1cmFudGUgbXVjaG8gZGUgbnVlc3RybyB0cmFiYWpvLg0KDQo8YnI+DQpgYGB7ciByZW50YSBtZWRpYSwgZXZhbD0gVFJVRSwgZWNobz0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFLCBjb21tZW50ID0gRkFMU0V9DQojUmVudGEgbWVkaWENCnRyYW5zcHVlc3RvX21lZGlhIDwtIGRjYXN0KG1lbHQoUmVudGFfbWVkaWEsIGlkLnZhcnMgPSAiVjEiKSwgdmFyaWFibGUgfiBWMSkNCnRyYW5zcHVlc3RvX1VFX21lZGlhIDwtIGRjYXN0KG1lbHQoUmVudGFfbWVkaWFfVUUsIGlkLnZhcnMgPSAiVjEiKSwgdmFyaWFibGUgfiBWMSkNCg0KdHJhbnNwdWVzdG9fVUVfbWVkaWEkTWVkaWEgPC0gTlVMTA0KdHJhbnNwdWVzdG9fbWVkaWEkTWVkaWEgPC0gTlVMTA0KDQp0cmFuc3B1ZXN0b19VRV9tZWRpYSRWYXIuMiA8LSBhcy5udW1lcmljKHRyYW5zcHVlc3RvX1VFX21lZGlhJFZhci4yKSANCg0KVUVfRVNQX21lZGlhIDwtIGlubmVyX2pvaW4odHJhbnNwdWVzdG9fbWVkaWEsIHRyYW5zcHVlc3RvX1VFX21lZGlhLCBieSA9ICJWYXIuMiIpDQp0cmFuc3B1ZXN0b19VRV9tZWRpYSA8LSBkY2FzdChtZWx0KFVFX0VTUF9tZWRpYSwgaWQudmFycyA9ICJWYXIuMiIpLCB2YXJpYWJsZSB+IFZhci4yKQ0KDQojZWxpbWluYXIgY29sdW1uYXMgInZhcmlhYmxlIiAidG90YWwyIChlc3RhYmEgcmVwZXRpZGEpLCAidmFyaWFibGUiDQp0cmFuc3B1ZXN0b19VRV9tZWRpYSA8LSB0cmFuc3B1ZXN0b19VRV9tZWRpYVstYygxLCAyMiwgMjMpLF0NCg0KI3F1aXRhciBmaWxhIGRlICJ2YXJpYWJsZSINCnRyYW5zcHVlc3RvX1VFX21lZGlhJHZhcmlhYmxlIDwtIE5VTEwNCiNhw7FhZGlyIHZlY3RvciBkZSBDQ0FBIGFsIGRhdGEgZnJhbWUgdHJhbnNwdWVzdG9fVUUNCnRyYW5zcHVlc3RvX1VFX21lZGlhJENDQUEgPC0gQ0NBQQ0KI3Jlb3JkZW5hciBwYXJhIHBvbmVyIGNvbHVtbmEgZGUgQ0NBQSBwcmltZXJvDQp0cmFuc3B1ZXN0b19VRV9tZWRpYSA8LSB0cmFuc3B1ZXN0b19VRV9tZWRpYSAgJT4lIHNlbGVjdCgiQ0NBQSIsIGV2ZXJ5dGhpbmcoKSkNCg0KI2ZpbHRyYXIgc29sbyB2YWxlbmNpYSwgRXNwYcOxYSB5IFVFDQpkZl9DVl9FU1BfVUVfbWVkaWEgPC0gdHJhbnNwdWVzdG9fVUVfbWVkaWEgJT4lIGZpbHRlcihDQ0FBICVpbiUgYygiQ29tdW5pZGFkX1ZhbGVuY2lhbmEiLCAiRXNwYcOxYSIsICJVRV8yNyIsICJVRV8yOCIpKQ0KDQpkZl9SZW50YV9tZWRpYSA8LSB0cmFuc3B1ZXN0b19VRV9tZWRpYSAlPiUgZmlsdGVyKCFDQ0FBICVpbiUgYygiVUVfMjgiLCAiVUVfMjciLCAiRXNwYcOxYSIpKQ0KDQojR3LDoWZpY28gcmVudGEgbWVkaWEtLS0tLQ0KZGZfUmVudGFfbWVkaWFfZ3JhcGggPC0gdHJhbnNwdWVzdG9fVUVfbWVkaWEgJT4lIHBpdm90X2xvbmdlciguLCAhQ0NBQSwgdmFsdWVzX3RvID0gIlJlbnRhX21lZGlhIiwgbmFtZXNfdG8gPSAiWWVhciIpDQp2aWV3KGRmX1JlbnRhX21lZGlhX2dyYXBoKQ0KZGZfUmVudGFfbWVkaWFfZ3JhcGgkUmVudGFfbWVkaWEgPC0gYXMubnVtZXJpYyhkZl9SZW50YV9tZWRpYV9ncmFwaCRSZW50YV9tZWRpYSkNCg0KdHJhbnNwdWVzdG9fVUVfbWVkaWFfb3JkIDwtIHRyYW5zcHVlc3RvX1VFX21lZGlhICU+JSBhcnJhbmdlKGRlc2MoYDIwMjBgKSkNCnRyYW5zcHVlc3RvX1VFX21lZGlhX29yZCRgMjAyMGAgPC0gYXMubnVtZXJpYyh0cmFuc3B1ZXN0b19VRV9tZWRpYV9vcmQkYDIwMjBgKQ0KDQpwX3JlbnRhX21lZGlhIDwtIHRyYW5zcHVlc3RvX1VFX21lZGlhX29yZCAlPiUgc2VsZWN0KC1jKGAyMDA4YCxgMjAwOWAsIGAyMDEwYCwgYDIwMTFgLCBgMjAxMmAsIGAyMDEzYCwgYDIwMTRgKSkgICU+JSANCiAgZmlsdGVyKENDQUEgJWluJSBjKCJOYXZhcnJhIiwgIlBhaXNfVmFzY28iLCAiTWFkcmlkIiwgIkV4dHJlbWFkdXJhIiwgIk11cmNpYSIsICJBbmRhbHVjaWEiLCAiQ29tdW5pZGFkX1ZhbGVuY2lhbmEiLCAiVUVfMjciKSkgJT4lIGd0KCkgJT4lDQogIGNvbHNfbGFiZWwoQ0NBQSA9ICJDb211bmlkYWQgQXV0w7Nub21hIikgJT4lIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiQ29tcGFyYWNpw7NuIGRlIGxhIFJlbnRhIG1lZGlhIGRlIGxhIENWIGNvbiBvdHJhcyBDQ0FBIHkgbGEgVUUtMjciKSkgJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShzb3VyY2Vfbm90ZSA9ICJEYXRvcyByZWNvZ2lkb3MgZGVsIElORSwgZXhwcmVzYWRvcyBlbiDigqwgeSBlbCBhw7FvIDIwMTMgY29tbyBiYXNlLiIpICU+JQ0KICB0YWJfc3R5bGUoDQogICAgbG9jYXRpb25zID0gY2VsbHNfY29sdW1uX2xhYmVscyhjb2x1bW5zID0gZXZlcnl0aGluZygpKSwNCiAgICAgICAgICAgIHN0eWxlID0gbGlzdCgNCiAgICAgICAgICAgICAgY2VsbF9ib3JkZXJzKHNpZGVzID0gImJvdHRvbSIsIHdlaWdodCA9IHB4KDMpKSwNCiAgICAgICAgICAgICAgY2VsbF90ZXh0KHdlaWdodCA9ICJib2xkIikpDQogICkgJT4lIHRhYl9zdHlsZSgNCiAgICBsb2NhdGlvbnMgPSBjZWxsc190aXRsZShncm91cHMgPSAidGl0bGUiKSwNCiAgICBzdHlsZSAgICAgPSBsaXN0KA0KICAgICAgY2VsbF90ZXh0KHdlaWdodCA9ICJib2xkIiwgc2l6ZSA9IDI0KQ0KICAgICkNCiAgKSAlPiUNCiAgZGF0YV9jb2xvcigNCiAgICBjb2x1bW5zID0gYDIwMjBgLA0KICAgIGNvbG9ycyA9IHNjYWxlczo6Y29sX251bWVyaWMgKA0KICAgICAgcGFsZXR0ZSA9IGMoDQogICAgICAgICJyZWQiLCAib3JhbmdlIiwgImdyZWVuIiwgImJsdWUiKSwNCiAgICAgIGRvbWFpbiA9IGMoMTMwMDAsIDIzNTAwKSkNCiAgKQ0KDQpwX3JlbnRhX21lZGlhDQpgYGANCg0KPGJyPjxicj4NCg0KIyMgMi4yIFJFTlRBIE1FRElBTkENCg0KPGJyPg0KDQpDb21vIGhlbW9zIGRpY2hvIGFudGVzLCBsb3MgdmFsb3JlcyBhdMOtcGljb3MgcHVlZGVuIGRpc3RvcnNpb25hciBsYSBtZWRpYSBkZSBsYXMgdmFyaWFibGVzIHkgcG9yIHRhbnRvIGVzIHJlY29tZW5kYWRvIHRvbWFyIGVuIGN1ZW50YSBsb3MgdmFsb3JlcyBtZWRpYW5vcy4gRW4gZXN0ZSBjYXNvLCBubyBhZmVjdGEgYWwgcmVzdWx0YWRvIGZpbmFsIHkgcG9yIHRhbnRvIHBvZGVtb3MgYXN1bWlyIHF1ZSBubyBleGlzdGVuIG11Y2hvcyDigJxvdXRsaWVyc+KAnS4gDQoNCkVuIGVzdGUgZ3LDoWZpY28gc2UgcmVwcmVzZW50YSBsYSBldm9sdWNpw7NuIGRlIGxhIHJlbnRhIG1lZGlhbmEgZGVzZGUgMjAwOCBoYXN0YSAyMDIwIGVuIGxhcyBtaXNtYXMgcmVnaW9uZXMgcXVlIGVuIGVsIGFwYXJ0YWRvIGFudGVyaW9yIGRlIGxhIHJlbnRhIG1lZGlhLiBQZXJvIGFsIGVzdGFyIGVuIGZvcm1hdG8gZGUgZ3LDoWZpY28sIHBvZGVtb3Mgb2JzZXJ2YXIgbGEgc2VyaWUgdGVtcG9yYWwgeSB2ZW1vcyBkZSB1bmEgbWFuZXJhIG3DoXMgcsOhcGlkYSB5IGbDoWNpbCBsYSB0ZW5kZW5jaWEgZGUgbG9zIHZhbG9yZXMuIEVuIGVzdGUgY2FzbywgcG9kZW1vcyB2ZXIgZWwgZnVlcnRlIGltcGFjdG8gbmVnYXRpdm8gZGUgbGEgY3Jpc2lzIGVjb27Ds21pY2EgZGUgbGEgR3JhbiByZWNlc2nDs24gZGUgMjAwOCB5IGVsIGRlY3JlY2ltaWVudG8gZGUgbGEgcmVudGEgbWVkaWFuYSBlbiB0b2RhcyBsYXMgQ0NBQSAocGVybyBubyBlbiBsYSBVRSkgaGFzdGEgYXByb3hpbWFkYW1lbnRlIGVuIGHDsW8gMjAxNSBlbiBkb25kZSBsYSB0ZW5kZW5jaWEgc2UgdnVlbHZlIGNyZWNpZW50ZSBoYXN0YSBsbGVnYXIgYSBzdXBlcmFyIGxvcyBuaXZlbGVzIHByZWNyaXNpcyBlbiBsb3Mgw7psdGltb3MgZG9zIGHDsW9zLiANClBvZGVtb3MgaW50dWlyIHF1ZSwgZW4gbGFzIGNpZnJhcyBkZSAyMDIxLCBxdWUgaGFicsOhIHVuYSB0ZW5kZW5jaWEgbmVnYXRpdmEgZGViaWRvIGEgbGEgY3Jpc2lzIHNhbml0YXJpYSBkZSBsYSBDT1ZJRC0xOSB5IHN1cyBncmFuZGVzIGltcGFjdG9zIG5lZ2F0aXZvcy4gDQoNCjxicj4NCmBgYHtyIHJlbnRhIG1lZGlhbmEsIGV2YWw9IFRSVUUsIGVjaG89IEZBTFNFLCB3YXJuaW5nPSBGQUxTRSwgY29tbWVudCA9IEZBTFNFfQ0KDQojUmVudGEgbWVkaWFuYQ0KdHJhbnNwdWVzdG9fbWVkaWFuYSA8LSBkY2FzdChtZWx0KFJlbnRhX21lZGlhbmEsIGlkLnZhcnMgPSAiVjEiKSwgdmFyaWFibGUgfiBWMSkNCnRyYW5zcHVlc3RvX1VFX21lZGlhbmEgPC0gZGNhc3QobWVsdChSZW50YV9tZWRpYW5hX1VFLCBpZC52YXJzID0gIlYxIiksIHZhcmlhYmxlIH4gVjEpDQoNCnRyYW5zcHVlc3RvX1VFX21lZGlhbmEkTWVkaWFuYSA8LSBOVUxMDQp0cmFuc3B1ZXN0b19tZWRpYW5hJE1lZGlhbmEgPC0gTlVMTA0KDQp0cmFuc3B1ZXN0b19VRV9tZWRpYW5hJFZhci4yIDwtIGFzLm51bWVyaWModHJhbnNwdWVzdG9fVUVfbWVkaWFuYSRWYXIuMikNCg0KVUVfRVNQX21lZGlhbmEgPC0gaW5uZXJfam9pbih0cmFuc3B1ZXN0b19tZWRpYW5hLCB0cmFuc3B1ZXN0b19VRV9tZWRpYW5hLCBieSA9ICJWYXIuMiIpDQoNCnRyYW5zcHVlc3RvX1VFX21lZGlhbmEgPC0gZGNhc3QobWVsdChVRV9FU1BfbWVkaWFuYSwgaWQudmFycyA9ICJWYXIuMiIpLCB2YXJpYWJsZSB+IFZhci4yKQ0KDQojZWxpbWlyYXIgY29sdW1uYXMgInZhcmlhYmxlIiAidG90YWwyIChlc3RhYmEgcmVwZXRpZGEpLCAidmFyaWFibGUiDQp0cmFuc3B1ZXN0b19VRV9tZWRpYW5hIDwtIHRyYW5zcHVlc3RvX1VFX21lZGlhbmFbLWMoMSwgMjIsIDIzKSxdDQoNCiNxdWl0YXIgZmlsYSBkZSAidmFyaWFibGUiDQp0cmFuc3B1ZXN0b19VRV9tZWRpYW5hJHZhcmlhYmxlIDwtIE5VTEwNCiNhw7FhZGlyIHZlY3RvciBkZSBDQ0FBIGFsIGRhdGEgZnJhbWUgdHJhbnNwdWVzdG9fVUUNCnRyYW5zcHVlc3RvX1VFX21lZGlhbmEkQ0NBQSA8LSBDQ0FBDQojcmVvcmRlbmFyIHBhcmEgcG9uZXIgY29sdW1uYSBkZSBDQ0FBIHByaW1lcm8NCnRyYW5zcHVlc3RvX1VFX21lZGlhbmEgPC0gdHJhbnNwdWVzdG9fVUVfbWVkaWFuYSAgJT4lIHNlbGVjdCgiQ0NBQSIsIGV2ZXJ5dGhpbmcoKSkNCg0KI2ZpbHRyYXIgc29sbyB2YWxlbmNpYSwgRXNwYcOxYSB5IFVFDQpkZl9DVl9FU1BfVUVfbWVkaWFuYSA8LSB0cmFuc3B1ZXN0b19VRV9tZWRpYW5hICU+JSBmaWx0ZXIoQ0NBQSAlaW4lIGMoIkNvbXVuaWRhZF9WYWxlbmNpYW5hIiwgIkVzcGHDsWEiLCAiVUVfMjciLCAiVUVfMjgiKSkNCg0KZGZfUmVudGFfbWVkaWFuYSA8LSB0cmFuc3B1ZXN0b19VRV9tZWRpYW5hICU+JSBmaWx0ZXIoIUNDQUEgJWluJSBjKCJVRV8yOCIsICJVRV8yNyIsICJFc3Bhw7FhIikpDQoNCiNHcsOhZmljbyByZW50YSBtZWRpYW5hLS0tLS0tDQpkZl9SZW50YV9tZWRpYW5hX2dyYXBoIDwtIHRyYW5zcHVlc3RvX1VFX21lZGlhbmEgJT4lIHBpdm90X2xvbmdlciguLCAhQ0NBQSwgdmFsdWVzX3RvID0gIlJlbnRhX21lZGlhbmEiLCBuYW1lc190byA9ICJZZWFyIikNCnZpZXcoZGZfUmVudGFfbWVkaWFuYV9ncmFwaCkNCmRmX1JlbnRhX21lZGlhbmFfZ3JhcGgkUmVudGFfbWVkaWFuYSA8LSBhcy5udW1lcmljKGRmX1JlbnRhX21lZGlhbmFfZ3JhcGgkUmVudGFfbWVkaWFuYSkNCg0KZGZfUmVudGFfbWVkaWFuYV9ncmFwaCRZZWFyIDwtIGFzLm51bWVyaWMoZGZfUmVudGFfbWVkaWFuYV9ncmFwaCRZZWFyKQ0KDQpwX3JlbnRhX21lZGlhbmEgPC0gZGZfUmVudGFfbWVkaWFuYV9ncmFwaCAlPiUgZmlsdGVyKCBDQ0FBICVpbiUgYygiTmF2YXJyYSIsICJQYWlzX1Zhc2NvIiwgIk1hZHJpZCIsICJFeHRyZW1hZHVyYSIsICJNdXJjaWEiLCAiQW5kYWx1Y2lhIiwgIkNvbXVuaWRhZF9WYWxlbmNpYW5hIiwgIlVFXzI3IikpICU+JSANCiAgZ2dwbG90KC4sIGFlcyh4ID0gWWVhciwgeSA9IFJlbnRhX21lZGlhbmEsIGdyb3VwID0gQ0NBQSwgY29sb3IgPSBDQ0FBKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX2xpbmUoKSAgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyg5MDAwLCAyMjAwMCksIGJyZWFrcyA9IHNlcSgwLCAyNTAwMCwgYnkgPSAyNTAwKSkgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gIlJlbnRhIG1lZGlhbmEgKOKCrCkiLA0KICAgICAgIHRpdGxlID0gIkNvbXBhcmFjacOzbiBkZSBsYSBSZW50YSBtZWRpYW5hIGRlIGxhIENWIGNvbiBvdHJhcyBDQ0FBIHkgbGEgVUUtMjciLA0KICAgICAgIHN1YnRpdGxlID0gIlZlbW9zIHVuIGNsYXJvIGVmZWN0byBkZSBsYSBHcmFuIFJlY2VzacOzbiB5IHN1IHBvc3RlcmlvciByZWN1cGVyYWNpw7NuIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdG9zIHJlY29naWRvcyBkZWwgSU5FLiBBw7FvIGJhc2UgMjAxMyIpICsgDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4odCA9IDEwKSwgc2l6ZSA9IDE1KSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMTApLCBzaXplID0gMTUpKSArDQogIHRoZW1lX3N0YXRhKCkNCiAgDQpwX3JlbnRhX21lZGlhbmENCg0KDQpgYGANCjxicj48YnI+DQoNCiMjIDIuMyBEZXNpZ3VhbGRhZA0KDQo8YnI+DQoNCkxhIGRlc2lndWFsZGFkIGVzIHVuIGFzcGVjdG8gZGUgbGEgZWNvbm9tw61hIHF1ZSDDumx0aW1hbWVudGUgZXN0w6EgdGVuaWVuZG8gdW4gZ3JhbiBwZXNvIGVuIGxhcyBkZWNpc2lvbmVzIHBvbMOtdGljby1lY29uw7NtaWNhcyBhIG5pdmVsIG11bmRpYWwuIERhZG8gcXVlLCBlbiBsb3Mgw7psdGltb3MgMzAgYcOxb3MsIGxhcyBkaWZlcmVuY2lhcyBkZWwgbml2ZWwgZGUgcmVudGEgZW50cmUgbG9zIG3DoXMgcmljb3MgeSBtw6FzIHBvYnJlcyBzZSBlc3TDoW4gZXhhY2VyYmFuZG8gdGFudG8gZW50cmUgZGlzdGludG9zIGNvbnRpbmVudGVzIHkgcGHDrXNlcyBjb21vIGVuIHVuIG1pc21vIHBhw61zLiBFcyBwb3IgZXN0bywgcXVlIGRlY2lkaW1vcyBpbmNsdWlyIGVzdGUgaW5kaWNhZG9yIGVuIG51ZXN0cm8gZXN0dWRpbw0KQ29uY3JldGFtZW50ZSwgZWwgaW5kaWNhZG9yIGRlIGRlc2lndWFsZGFkIHF1ZSBhbmFsaXphIGVsIOKAnElOReKAnSBzZSBtaWRlIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6IGxhIHJlbGFjacOzbiBlbnRyZSBsYSByZW50YSBtZWRpYSBkZWwgMjAlIGRlIGxhIHBvYmxhY2nDs24gY29uIGxhIHJlbnRhIG3DoXMgYWx0byB5IGxhIHJlbnRhIG1lZGlhIGRlbCAyMCUgZGUgbGEgcG9ibGFjacOzbiBjb24gbGEgcmVudGEgbcOhcyBiYWphLCB0b21hbmRvIGNvbW8gYcOxbyBiYXNlIGVsIDIwMTMuDQpBbmFsaXphbmRvIGVsIGdyw6FmaWNvLCBleHRyYXBvbGFtb3MgZWwgaGVjaG8gZGUgcXVlIGVuIG11Y2hhcyBDQ0FBIGxhIHJlbGFjacOzbiBzZSBoYSBtYW50ZW5pZG8gY29uc3RhbnRlLCBpbmNsdXllbmRvIGVuIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLiBDb21vIGV4Y2VwY2nDs24sIGVuY29udHJhbW9zIE1lbGlsbGEgeSBDZXV0YSAoY29uIHVuYSBncmFuIG9zY2lsYWNpw7NuIHkgdW4gZ3JhbiBjcmVjaW1pZW50byDDumx0aW1hbWVudGUgZGUgbGEgZGVzaWd1YWxkYWQgZW4gTWVsaWxsYSkgeSBBc3R1cmlhcywgcXVlIGhhIHN1ZnJpZG8gdW4gcmVwdW50ZSBlbiAyMDE5IHkgMjAyMC4NCg0KPGJyPg0KYGBge3IgZGVzaWd1YWxhZGFkLCBldmFsPSBUUlVFLCBlY2hvPSBGQUxTRSwgd2FybmluZz0gRkFMU0UsIGNvbW1lbnQgPSBGQUxTRX0NCg0KI0RFU0lHVUFMREFEDQoNCnRyYW5zcHVlc3RvX2Rlc2lndWFsZGFkIDwtIGRjYXN0KG1lbHQoRGVzaWd1YWxkYWQsIGlkLnZhcnMgPSAiVjEiKSwgdmFyaWFibGUgfiBWMSkNCnRyYW5zcHVlc3RvX2Rlc2lndWFsZGFkX1VFIDwtIGRjYXN0KG1lbHQoRGVzaWd1YWxkYWRfVUUsIGlkLnZhcnMgPSAiVjEiKSwgdmFyaWFibGUgfiBWMSkNCg0KdHJhbnNwdWVzdG9fZGVzaWd1YWxkYWRfVUUkVmFyLjIgPC0gYXMubnVtZXJpYyh0cmFuc3B1ZXN0b19kZXNpZ3VhbGRhZF9VRSRWYXIuMikgDQp0cmFuc3B1ZXN0b19kZXNpZ3VhbGRhZCRWYXIuMiA8LSBhcy5udW1lcmljKHRyYW5zcHVlc3RvX2Rlc2lndWFsZGFkJFZhci4yKSANCg0KVUVfRVNQX2Rlc2lndWFsZGFkIDwtIGlubmVyX2pvaW4odHJhbnNwdWVzdG9fZGVzaWd1YWxkYWQsIHRyYW5zcHVlc3RvX2Rlc2lndWFsZGFkX1VFLCBieSA9ICJWYXIuMiIpDQoNCnRyYW5zcHVlc3RvX2Rlc2lndWFsZGFkX1VFIDwtIGRjYXN0KG1lbHQoVUVfRVNQX2Rlc2lndWFsZGFkLCBpZC52YXJzID0gIlZhci4yIiksIHZhcmlhYmxlIH4gVmFyLjIpDQoNCiNlbGltaXJhciBjb2x1bW5hcyAidmFyaWFibGUiICJ0b3RhbDIgKGVzdGFiYSByZXBldGlkYSksICJ2YXJpYWJsZSINCnRyYW5zcHVlc3RvX2Rlc2lndWFsZGFkX1VFIDwtIHRyYW5zcHVlc3RvX2Rlc2lndWFsZGFkX1VFWy1jKDEsIDIyLCAyMywyNCksXQ0KDQojcXVpdGFyIGZpbGEgZGUgInZhcmlhYmxlIg0KdHJhbnNwdWVzdG9fZGVzaWd1YWxkYWRfVUUkdmFyaWFibGUgPC0gTlVMTA0KI2HDsWFkaXIgdmVjdG9yIGRlIENDQUEgYWwgZGF0YSBmcmFtZSB0cmFuc3B1ZXN0b19VRQ0KdHJhbnNwdWVzdG9fZGVzaWd1YWxkYWRfVUUkQ0NBQSA8LSBDQ0FBDQojcmVvcmRlbmFyIHBhcmEgcG9uZXIgY29sdW1uYSBkZSBDQ0FBIHByaW1lcm8NCnRyYW5zcHVlc3RvX2Rlc2lndWFsZGFkX1VFIDwtIHRyYW5zcHVlc3RvX2Rlc2lndWFsZGFkX1VFICAlPiUgc2VsZWN0KCJDQ0FBIiwgZXZlcnl0aGluZygpKQ0KDQojZmlsdHJhciBzb2xvIHZhbGVuY2lhLCBFc3Bhw7FhIHkgVUUNCmRmX0NWX0VTUF9VRV9kZXNpZ3VhbGRhZCA8LSB0cmFuc3B1ZXN0b19kZXNpZ3VhbGRhZF9VRSAlPiUgZmlsdGVyKENDQUEgJWluJSBjKCJDb211bmlkYWRfVmFsZW5jaWFuYSIsICJFc3Bhw7FhIiwgIlVFXzI3IiwgIlVFXzI4IikpDQoNCmRmX0Rlc2lndWFsZGFkIDwtIHRyYW5zcHVlc3RvX2Rlc2lndWFsZGFkX1VFICU+JSBmaWx0ZXIoIUNDQUEgJWluJSBjKCJVRV8yOCIsICJVRV8yNyIsICJFc3Bhw7FhIikpDQoNCiNHcsOhZmljbyBEZXNpZ3VhbGRhZC0tLS0tDQojY2FtYmlhciB0b2RhcyBjb21hcyBhIHB1bnRvcyBlbiB1bmEgbMOtbmVhDQpkZl9EZXNpZ3VhbGRhZF9zaW5fQ0NBQSA8LSBkZl9EZXNpZ3VhbGRhZFstMV0NCmRmX0Rlc2lndWFsZGFkX3Npbl9DQ0FBIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmX0Rlc2lndWFsZGFkX3Npbl9DQ0FBLCBmdW5jdGlvbih4KSBnc3ViKCIsIiwgIi4iLCB4LCBmaXhlZCA9IFRSVUUpKSkNCmRmX0Rlc2lndWFsZGFkX3Npbl9DQ0FBIDwtIGFzLmRhdGEuZnJhbWUoc2FwcGx5KGRmX0Rlc2lndWFsZGFkX3Npbl9DQ0FBLCBhcy5udW1lcmljKSkNCg0KZGZfRGVzaWd1YWxkYWRfc2luX0NDQUEkQ0NBQSA8LSBDQ0FBX3Npbl9VRQ0KZGZfRGVzaWd1YWxkYWRfc2luX0NDQUEgPC0gZGZfRGVzaWd1YWxkYWRfc2luX0NDQUEgICU+JSBzZWxlY3QoQ0NBQSwgZXZlcnl0aGluZygpKQ0KZGZfRGVzaWd1YWxkYWQgPC0gZGZfRGVzaWd1YWxkYWRfc2luX0NDQUENCg0KZGZfRGVzaWd1bGFkYWRfZ3JhcGggPC0gdHJhbnNwdWVzdG9fZGVzaWd1YWxkYWRfVUUgJT4lIHBpdm90X2xvbmdlciguLCAhQ0NBQSwgdmFsdWVzX3RvID0gIkRlc2lndWFsZGFkIiwgbmFtZXNfdG8gPSAiWWVhciIpDQoNCmRmX0Rlc2lndWxhZGFkX2dyYXBoJERlc2lndWFsZGFkIDwtIGFzLm51bWVyaWMoZ3N1YigiLCIsICIuIiwgZ3N1YigiXFwuIiwgIiIsIGRmX0Rlc2lndWxhZGFkX2dyYXBoJERlc2lndWFsZGFkKSkpDQpkZl9EZXNpZ3VsYWRhZF9ncmFwaCRZZWFyIDwtIGFzLm51bWVyaWMoZGZfRGVzaWd1bGFkYWRfZ3JhcGgkWWVhcikNCg0KcF9kZXNpZ3VhbGRhZCA8LSBkZl9EZXNpZ3VsYWRhZF9ncmFwaCAlPiUgZmlsdGVyKCFDQ0FBID09ICJVRV8yNyIsIENDQUEgJWluJSBjKCJNZWxpbGxhIiwgIkNldXRhIiwgIkFzdHVyaWFzIiwgImNhc3RpbGxhX3lfTGVvbiIsICJFeHRyZW1hZHVyYSIsICJOYXZhcnJhIiwgIkNvbXVuaWRhZF9WYWxlbmNpYW5hIikpICU+JSANCiAgZ2dwbG90KCBhZXMoeCA9IFllYXIsIHkgPSBEZXNpZ3VhbGRhZCwgZ3JvdXAgPSBDQ0FBLCBjb2xvciA9IENDQUEpKSArIGdlb21fcG9pbnQoKSArIGdlb21fbGluZSgpICArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDIsIDE2KSwgYnJlYWtzID0gc2VxKDAsIDIwLCBieSA9IDIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMDgsIDIwMjApLCBicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSA1KSkgICsgZmFjZXRfd3JhcCh+IENDQUEpICsNCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJSYXRpbyBkZSBkZXNpZ3VhbGRhZCIsDQogICAgICAgdGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGxhIERlc2lndWFsZGFkIGRlIGxhIENWIGNvbiBvdHJhcyBDQ0FBIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJSZWxhY2nDs24gZW50cmUgbGEgcmVudGEgbWVkaWEgZGVsIHF1aW50aWwgbcOhcyBhbHRvIGNvbiByZXNwZWN0byBhbCBxdWludGlsIG3DoXMgYmFqbyIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRvcyByZWNvZ2lkb3MgZGVsIElORS4gQcOxbyBiYXNlIDIwMTMiKSArIA0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQgPSAxMCksIHNpemUgPSAxNSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4ociA9IDEwKSwgc2l6ZSA9IDE1KSkgKw0KICB0aGVtZV9zdGF0YSgpDQoNCnBfZGVzaWd1YWxkYWQNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIDIuNCBSaWVzZ28gZGUgcG9icmV6YQ0KDQo8YnI+DQoNCk90cm8gaW5kaWNhZG9yIHF1ZSBzZSB1c2EgcGFyYSBtZWRpciBsYSBzaXR1YWNpw7NuIGVjb27Ds21pY2EgZGUgbG9zIGNpdWRhZGFub3MgZXMgZWwgdW1icmFsIGRlIHJpZXNnbyBkZSBwb2JyZXphLiBFbCB1bWJyYWwgZGUgcmllc2dvIGRlIHBvYnJlemEgc2UgZGVmaW5lIGNvbW86IGVsIHBvcmNlbnRhamUgZGUgcGVyc29uYXMgY3V5b3MgaW5ncmVzb3MgYW51YWxlcyBwb3IgdW5pZGFkIGRlIGNvbnN1bW8gcmVjaWJpZG9zIGVuIGVsIGHDsW8gYW50ZXJpb3IgYWwgcXVlIHNlIHJlYWxpemEgbGEgZW5jdWVzdGEsIGVzdMOhbiBwb3IgZGViYWpvIGRlbCB1bWJyYWwgZGUgcmllc2dvIGRlIHBvYnJlemEgKGZpamFkbyBlbiBlbCA2MCUgZGUgbGEgbWVkaWFuYSBkZSBsb3MgaW5ncmVzb3MgcG9yIHVuaWRhZCBkZSBjb25zdW1vIGRlIHRvZG9zIGxvcyBob2dhcmVzIGEgbml2ZWwgbmFjaW9uYWwpDQpQb3IgdGFudG8sIGN1YW50byBtZW5vciBlcyBlbCBwb3JjZW50YWplIG1lbm9yIHJpZXNnbyBkZSBwb2JyZXphIGVuIGNhZGEgQ0NBQS4gSGVtb3MgcmVwcmVzZW50YWRvIGxvcyBkYXRvcyBlbiBmb3JtYXRvIGRlIHRhYmxhIGNvbiBlbCBmaW4gZGUgYW5hbGl6YXIgZWwgbml2ZWwgZGUgbG9zIMO6bHRpbW9zIGHDsW9zIHkgc3UgZXZvbHVjacOzbiBjb24gdW5hIHBlcnNwZWN0aXZhIG3DoXMgcmVjaWVudGUuIA0KDQpMbyBwcmltZXJvIHF1ZSBub3MgbGxhbWEgbGEgYXRlbmNpw7NuIGVzIHF1ZSBudWVzdHJhIENvbXVuaWRhZCBwcmVzZW50YSB1biBlbGV2YWRvIG5pdmVsIGRlIHJpZXNnbyBkZSBwb2JyZXphLiDCoUNhc2kgdW5vIGRlIGNhZGEgY3VhdHJvIHVuaWRhZGVzIGRlIGNvbnN1bW8gZXN0w6EgZW4gc2l0dWFjacOzbiBkZSByaWVzZ28gZGUgcG9icmV6YSEgQcO6biBwZW9yIGxhIHNpdHVhY2nDs24gZGUgRXh0cmVtYWR1cmEsIGNvbiBjYXNpIHVubyBkZSBjYWRhIHRyZXMuIEVuIGVsIG90cm8gZXh0cmVtbywgc2UgZW5jdWVudHJhbiBOYXZhcnJhIHkgZWwgUGHDrXMgVmFzY28sIHkgYWxnbyBwZW9yIHNlIGVuY3VlbnRyYW4gbGFzIElzbGFzIEJhbGVhcmVzLg0KDQo8YnI+DQpgYGB7ciByaWVzZ28gcG9icmV6YSwgZXZhbD0gVFJVRSwgZWNobz0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFLCBjb21tZW50ID0gRkFMU0V9DQoNCiNSaWVzZ28gcG9icmV6YQ0KDQp0cmFuc3B1ZXN0b19SX3BvYnJlemEgPC0gZGNhc3QobWVsdChSX3BvYnJlemEsIGlkLnZhcnMgPSAiVjEiKSwgdmFyaWFibGUgfiBWMSkNCnRyYW5zcHVlc3RvX1JfcG9icmV6YV9VRSA8LSBkY2FzdChtZWx0KFJfcG9icmV6YV9VRSwgaWQudmFycyA9ICJWMSIpLCB2YXJpYWJsZSB+IFYxKQ0KDQp0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUUkVmFyLjIgPC0gYXMubnVtZXJpYyh0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUUkVmFyLjIpIA0KdHJhbnNwdWVzdG9fUl9wb2JyZXphJFZhci4yIDwtIGFzLm51bWVyaWModHJhbnNwdWVzdG9fUl9wb2JyZXphJFZhci4yKSANCg0KVUVfRVNQX1JfcG9icmV6YSA8LSBpbm5lcl9qb2luKHRyYW5zcHVlc3RvX1JfcG9icmV6YSwgdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFLCBieSA9ICJWYXIuMiIpDQp0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUUgPC0gZGNhc3QobWVsdChVRV9FU1BfUl9wb2JyZXphLCBpZC52YXJzID0gIlZhci4yIiksIHZhcmlhYmxlIH4gVmFyLjIpDQoNCiNlbGltaXJhciBjb2x1bW5hcyAidmFyaWFibGUiICJ0b3RhbDIgKGVzdGFiYSByZXBldGlkYSksICJ2YXJpYWJsZSINCnRyYW5zcHVlc3RvX1JfcG9icmV6YV9VRSA8LSB0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUVbLWMoMSwgMjIsIDIzKSxdDQoNCiNxdWl0YXIgZmlsYSBkZSAidmFyaWFibGUiDQp0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUUkdmFyaWFibGUgPC0gTlVMTA0KI2HDsWFkaXIgdmVjdG9yIGRlIENDQUEgYWwgZGF0YSBmcmFtZSB0cmFuc3B1ZXN0b19VRQ0KdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFJENDQUEgPC0gQ0NBQQ0KI3Jlb3JkZW5hciBwYXJhIHBvbmVyIGNvbHVtbmEgZGUgQ0NBQSBwcmltZXJvDQp0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUUgPC0gdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFICAlPiUgc2VsZWN0KCJDQ0FBIiwgZXZlcnl0aGluZygpKQ0KDQojZmlsdHJhciBzb2xvIHZhbGVuY2lhLCBFc3Bhw7FhIHkgVUUNCmRmX0NWX0VTUF9VRV9SX3BvYnJlemEgPC0gdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFICU+JSBmaWx0ZXIoQ0NBQSAlaW4lIGMoIkNvbXVuaWRhZF9WYWxlbmNpYW5hIiwgIkVzcGHDsWEiLCAiVUVfMjciLCAiVUVfMjgiKSkNCg0KZGZfUmllc2dvX3BvYnJlemEgPC0gdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFICU+JSBmaWx0ZXIoIUNDQUEgJWluJSBjKCJVRV8yOCIsICJVRV8yNyIsICJFc3Bhw7FhIikpDQoNCiNHcsOhZmljbyBSaWVzZ28gUG9icmV6YS0tLS0tDQoNCg0KZGZfUmllc2dvX3BvYnJlemFfc2luX0NDQUEgPC0gZGZfUmllc2dvX3BvYnJlemFbLTFdDQpkZl9SaWVzZ29fcG9icmV6YV9zaW5fQ0NBQSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZl9SaWVzZ29fcG9icmV6YV9zaW5fQ0NBQSwgZnVuY3Rpb24oeCkgZ3N1YigiLCIsICIuIiwgeCwgZml4ZWQgPSBUUlVFKSkpDQpkZl9SaWVzZ29fcG9icmV6YV9zaW5fQ0NBQSA8LSBhcy5kYXRhLmZyYW1lKHNhcHBseShkZl9SaWVzZ29fcG9icmV6YV9zaW5fQ0NBQSwgYXMubnVtZXJpYykpDQoNCmRmX1JpZXNnb19wb2JyZXphX3Npbl9DQ0FBJENDQUEgPC0gQ0NBQV9zaW5fVUUNCmRmX1JpZXNnb19wb2JyZXphX3Npbl9DQ0FBIDwtIGRmX1JpZXNnb19wb2JyZXphX3Npbl9DQ0FBICAlPiUgc2VsZWN0KENDQUEsIGV2ZXJ5dGhpbmcoKSkNCmRmX1JpZXNnb19wb2JyZXphIDwtIGRmX1JpZXNnb19wb2JyZXphX3Npbl9DQ0FBDQoNCmRmX1JpZXNnb19wb2JyZXphX2dyYXBoPC0gdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFICU+JSBwaXZvdF9sb25nZXIoLiwgIUNDQUEsIHZhbHVlc190byA9ICJSaWVzZ29fcG9icmV6YSIsIG5hbWVzX3RvID0gIlllYXIiKQ0KDQpkZl9SaWVzZ29fcG9icmV6YV9ncmFwaCRSaWVzZ29fcG9icmV6YSA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCAiLiIsIGdzdWIoIlxcLiIsICIiLCBkZl9SaWVzZ29fcG9icmV6YV9ncmFwaCRSaWVzZ29fcG9icmV6YSkpKQ0KI3A0IDwtIGRmX1JpZXNnb19wb2JyZXphX2dyYXBoICU+JSBmaWx0ZXIoIUNDQUEgPT0gIlVFXzI3IiwgQ0NBQSAlaW4lIGMoIk1lbGlsbGEiLCAiQ2V1dGEiLCAiRXh0cmVtYWR1cmEiLCAiTmF2YXJyYSIsICJQYWlzX1Zhc2NvIiwgIkJhbGVhcmVzIiwgIkNvbXVuaWRhZF9WYWxlbmNpYW5hIikpICU+JSANCiAjIGdncGxvdCguLCBhZXMoeCA9IFllYXIsIHkgPSBSaWVzZ29fcG9icmV6YSwgZ3JvdXAgPSBDQ0FBLCBjb2xvciA9IENDQUEpKSArIGdlb21fcG9pbnQoKSArIGdlb21fbGluZSgpICArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDUwKSwgYnJlYWtzID0gc2VxKDAsIDUwLCBieSA9IDUpKQ0KI3A0DQojZWxpbWluYXIgeCBkZSB0b2RhcyBsYXMgY29sdW1uYXMNCmNvbG5hbWVzIChkZl9SaWVzZ29fcG9icmV6YSkgPC0gZ3N1YigiWCIsICIiLCBjb2xuYW1lcyhkZl9SaWVzZ29fcG9icmV6YSkpDQojY2FtYmlhciBjb21hcyBhIHB1bnRvcyAoc2UgdmUgbWVqb3IgZW4gbGEgdGFibGEpDQp0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUUkYDIwMjBgIDwtIGFzLm51bWVyaWMoZ3N1YigiLCIsICIuIiwgZ3N1YigiXFwuIiwgIiIsIHRyYW5zcHVlc3RvX1JfcG9icmV6YV9VRSRgMjAyMGApKSkNCnRyYW5zcHVlc3RvX1JfcG9icmV6YV9VRSRgMjAxOWAgPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwgIi4iLCBnc3ViKCJcXC4iLCAiIiwgdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFJGAyMDE5YCkpKQ0KdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFJGAyMDE4YCA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCAiLiIsIGdzdWIoIlxcLiIsICIiLCB0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUUkYDIwMThgKSkpDQp0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUUkYDIwMTdgIDwtIGFzLm51bWVyaWMoZ3N1YigiLCIsICIuIiwgZ3N1YigiXFwuIiwgIiIsIHRyYW5zcHVlc3RvX1JfcG9icmV6YV9VRSRgMjAxN2ApKSkNCnRyYW5zcHVlc3RvX1JfcG9icmV6YV9VRSRgMjAxNmAgPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwgIi4iLCBnc3ViKCJcXC4iLCAiIiwgdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFJGAyMDE2YCkpKQ0KdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFJGAyMDE1YCA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCAiLiIsIGdzdWIoIlxcLiIsICIiLCB0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUUkYDIwMTVgKSkpDQogIA0KdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFX29yZCA8LSB0cmFuc3B1ZXN0b19SX3BvYnJlemFfVUUgJT4lIGFycmFuZ2UoYDIwMjBgKQ0KICANCnBfcmllc2dvX3BvYnJlemEgPC0gdHJhbnNwdWVzdG9fUl9wb2JyZXphX1VFX29yZCAlPiUgc2VsZWN0KC1jKGAyMDA4YCxgMjAwOWAsIGAyMDEwYCwgYDIwMTFgLCBgMjAxMmAsIGAyMDEzYCwgYDIwMTRgKSkgICU+JSANCiAgICBmaWx0ZXIoQ0NBQSAlaW4lIGMoIk5hdmFycmEiLCAiUGFpc19WYXNjbyIsICJCYWxlYXJlcyIsICJFeHRyZW1hZHVyYSIsICJjZXV0YSIsICJFeHRyZW1hZHVyYSIsICJDb211bmlkYWRfVmFsZW5jaWFuYSIsICJVRV8yNyIpKSAlPiUgZ3QoKSAlPiUNCiAgICBjb2xzX2xhYmVsKENDQUEgPSAiQ29tdW5pZGFkIEF1dMOzbm9tYSIpICU+JSB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIkNvbXBhcmFjacOzbiBkZWwgUmllc2dvIGRlIFBvYnJlemEgZGUgbGEgQ1YgY29uIG90cmFzIENDQUEgeSBsYSBVRS0yNyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IG1kKCJFbCB1bWJyYWwgZGUgcG9icmV6YSBlc3TDoSBmaWphZG8gZW4gZWwgNjAlIGRlIGxhIG1lZGlhbmEgZGUgaW5ncmVzb3MgZGUgdG9kb3MgbG9zIGhvZ2FyZXMgYSBuaXZlbCBuYWNpb25hbCAiKSkgJT4lDQogICAgdGFiX3NvdXJjZV9ub3RlKHNvdXJjZV9ub3RlID0gIkRhdG9zIHJlY29naWRvcyBkZWwgSU5FLCBleHByZXNhZG9zIGVuICUgeSBlbCBhw7FvIDIwMTMgY29tbyBiYXNlLiIpICU+JQ0KICAgIHRhYl9zdHlsZSgNCiAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2NvbHVtbl9sYWJlbHMoY29sdW1ucyA9IGV2ZXJ5dGhpbmcoKSksDQogICAgICBzdHlsZSA9IGxpc3QoDQogICAgICAgIGNlbGxfYm9yZGVycyhzaWRlcyA9ICJib3R0b20iLCB3ZWlnaHQgPSBweCgzKSksDQogICAgICAgIGNlbGxfdGV4dCh3ZWlnaHQgPSAiYm9sZCIpKQ0KICAgICkgJT4lIHRhYl9zdHlsZSgNCiAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX3RpdGxlKGdyb3VwcyA9ICJ0aXRsZSIpLA0KICAgICAgc3R5bGUgICAgID0gbGlzdCgNCiAgICAgICAgY2VsbF90ZXh0KHdlaWdodCA9ICJib2xkIiwgc2l6ZSA9IDI0KQ0KICAgICAgKQ0KICAgICkgJT4lDQogICAgZGF0YV9jb2xvcigNCiAgICAgIGNvbHVtbnMgPSBgMjAyMGAsDQogICAgICBjb2xvcnMgPSBzY2FsZXM6OmNvbF9udW1lcmljKA0KICAgICAgICBwYWxldHRlID0gYygNCiAgICAgICAgICAiYmx1ZSIsICJncmVlbiIsICJvcmFuZ2UiLCJyZWQiKSwNCiAgICAgICAgZG9tYWluID0gYyg5LCAzMikpKQ0KDQpwX3JpZXNnb19wb2JyZXphDQoNCmBgYA0KDQo8YnI+DQo8YnI+DQoNCiMgMy4gVFJBQkFKTw0KDQojIyAzLjEgVEFTQSBERSBFTVBMRU8NCjxicj4NCg0KRWwgdHJhYmFqbyBlcyB1biBlbGVtZW50byBlc2VuY2lhbCBlbiBsYSBjYWxpZGFkIGRlIHZpZGEgZGUgbG9zIGluZGl2aWR1b3MgcHVlc3RvIHF1ZSBwZXJtaXRlIGFsY2FuemFyIG1lam9yZXMgY29uZGljaW9uZXMgbWF0ZXJpYWxlcyB5IGxhIGludGVncmFjacOzbiBlbiBsYSBzb2NpZWRhZC4NCg0KQXNpbWlzbW8sIHRpZW5lIGltcG9ydGFudGVzIGVmZWN0b3MgcG9zaXRpdm9zIHNvYnJlIGxhIHNhbHVkIHkgZWwgYmllbmVzdGFyIHN1YmpldGl2byBkZSBsYXMgcGVyc29uYXMuIEVzIGltcG9ydGFudGUgbm8gc29sbyBsYSBleGlzdGVuY2lhIGRlIHVuIHRyYWJham8gcmVtdW5lcmFkbyBzaW5vIHRhbWJpw6luIHF1ZSDDqXN0ZSBzZSBkZXNhcnJvbGxlIGVuIGNvbmRpY2lvbmVzIGRlIGNhbGlkYWQsIHBvciBsYSBjYW50aWRhZCBkZSB0aWVtcG8gcXVlIHNlIGxlIGRlZGljYSB5IGxhcyBpbnRlcmFjY2lvbmVzIGNvbiBvdHJhcyBwZXJzb25hcy4NCg0KUGFyYSBhbmFsaXphciBlc3RlIGluZGljYWRvciB5IHZlciBzdSBpbXBsaWNhY2nDs24gZW4gbGEgY2FsaWRhZCBkZSB2aWRhIGRlIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLCBlbXBsZWFtb3MgdW4gZ3LDoWZpY28gZGUgbGEgZXZvbHVjacOzbiB0ZW1wb3JhbCBkZSBsYSB0YXNhIGRlIGVtcGxlbyBwYXJhIGRpc3RpbnRhcyBDb211bmlkYWRlcyBBdXTDs25vbWFzLg0KDQo8YnI+DQpgYGB7ciBlc3R1ZGlvMyBwMSwgZXZhbD0gVFJVRSwgZWNobz0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFLCBjb21tZW50ID0gRkFMU0V9DQoNCg0KDQpuYW1lcyh0YXNhX2VtcGxlbykgPC0gYXMubWF0cml4KHRhc2FfZW1wbGVvWzEsIF0pDQp0YXNhX2VtcGxlbyA8LSB0YXNhX2VtcGxlb1stMSwgXQ0KdGFzYV9lbXBsZW9bXSA8LSBsYXBwbHkodGFzYV9lbXBsZW8sIGZ1bmN0aW9uKHgpIHR5cGUuY29udmVydChhcy5jaGFyYWN0ZXIoeCkpKQ0KDQoNCm5hbWVzKHRhc2FfZW1wbGVvKSA9IGMoIkNDQUEiLCAiMjAwNiIsICIyMDA3IiwgIjIwMDgiLCAiMjAwOSIsICIyMDEwIiwgIjIwMTEiLCAiMjAxMiIsICIyMDEzIiwgIjIwMTQiLCAiMjAxNSIsICIyMDE2IiwgIjIwMTciLCAiMjAxOCIsICIyMDE5IiwgIjIwMjAiKQ0KIyBDYW1iaW8gZWwgbm9tYnJlIGRlIGxhcyBjb2x1bW5hcyBwYXJhIHF1ZSBsYSBwcmltZXJhICBjb2x1bW5hIHNlIGxsYW1lIGNjQUEgeSBwb2RhbW9zIHBhc2FyIGEgZm9ybWF0byBMT05HDQoNCmRmX2xvbmcgPC0gdGFzYV9lbXBsZW8gJT4lIHBpdm90X2xvbmdlcihjb2xzPTI6MTYgLCBuYW1lc190bz0gIkHDsW9zIiwgdmFsdWVzX3RvID0gIlRhc2FfRW1wbGVvIikgDQojIFBhc2Ftb3MgZGVsIGZvcm1hdG8gd2lkZSBhbCBmb3JtYXRvIGxvbmcNCg0KdGFzYV9lbXBsZW9fMSA8LSBkZl9sb25nICU+JSBmaWx0ZXIoQ0NBQSAhPSAiVG90YWwiKQ0KIyBGaWx0cmFtb3MgcHJpbWVybyBwYXJhIG9idGVuZXIgc29sbyBsb3MgZGF0b3MgZGUgbGFzIGRpZmVyZW50ZXMgY29tdW5pZGFkZXMgYXV0w7Nub21hcywgZWxpbWluYW5kbyBlbCB0b3RhbCBuYWNpb25hbC4NCg0KIyBDb21vIGVsIGdyw6FmaWNvIHNlcsOtYSBtdXkgcG9jbyB2aXNpYmxlLCB2YW1vcyBhIGNvbXBhcmFyIHVuaWNhbWVudGUgbGFzIENDQUEgY29uIG1heW9yIHkgbWVub3IgdGFzYSBkZSBlbXBsZW8sIHBhcmEgcG9zdGVyaW9ybWVudGUgYW5hbGl6YXIgbGEgQ29tdW5pZGFkIHZhbGVuY2lhbmEgDQoNCnRhc2FfZW1wbGVvXzIgPC0gdGFzYV9lbXBsZW9fMSAlPiUgDQogIGZpbHRlcihDQ0FBICVpbiUgYygiQ29tdW5pdGF0IFZhbGVuY2lhbmEiLCAiTWFkcmlkLCBDb211bmlkYWQgZGUiLCAiQ2F0YWx1w7FhIiwgIlBhaXMgVmFzY28iLCAiQmFsZWFycywgSWxsZXMiLCAiQW5kYWx1Y2lhIiwgIk11cmNpYSwgUmVnaW9uIGRlIiwgIkV4dHJlbWFkdXJhIikpDQoNCnRhc2FfZW1wbGVvXzIkVGFzYV9FbXBsZW8gPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwgIi4iLCBnc3ViKCJcXC4iLCAiIiwgdGFzYV9lbXBsZW9fMiRUYXNhX0VtcGxlbykpKSAjbWUgY2FtYmlhIGxhcyBjb21hcyBwb3IgcHVudG9zDQoNCnRhc2FfZW1wbGVvXzIkVGFzYV9FbXBsZW8gPC0gYXMubnVtZXJpYyh0YXNhX2VtcGxlb18yJFRhc2FfRW1wbGVvKSNjb252aWVydG8gbGEgdmFyaWFibGUgcXVlIGVzIGNoYXJhY3RlciBlbiBudW1lcmljDQoNCmdyYWZfZW1wbGVvIDwtIGdncGxvdCh0YXNhX2VtcGxlb18yLCBhZXMoQcOxb3MsIFRhc2FfRW1wbGVvLCBjb2xvciA9IENDQUEsIGdyb3VwPSBDQ0FBKSkgKyBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKSANCiNzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygyMCw4MCksIGJyZWFrcyA9IHNlcSgyMCwgODAsIGJ5ID0gMikpDQogZ3JhZl9lbXBsZW8gKyB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgDQogICAgY29sb3VyID0gImdyYXkxMSIsIGhqdXN0ID0gMC41KSwgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgDQogICAgY29sb3VyID0gImdyYXkxMSIpLCBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjcpLCANCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjcpLCANCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgDQogICAgICAgIGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMS43NSksIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIA0KICAgICAgICBjb2xvdXIgPSAiZ3JheTQiKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiLCANCiAgICAgICAgc2l6ZSA9IDM1LCBmYWNlID0gImJvbGQuaXRhbGljIiwgDQogICAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IDEuNzUpLCBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTk1IiwgDQogICAgICAgIHNpemUgPSAwLjcpLCBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJyb3N5YnJvd24zIiwgDQogICAgICAgIGNvbG91ciA9ICJncmF5MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygzNSwgNjMpLCBicmVha3MgPSBzZXEoMzUsIDYzLCBieSA9IDUpKSsNCiAgIGxhYnModGl0bGUgPSAiVEFTQSBFTVBMRU8iLCANCiAgICB4ID0gIkHDkU9TIiwgeSA9ICJUQVNBIEVNUExFTyAoJSAxNiB5IG1hcyBhw7FvcykiLCANCiAgICBzdWJ0aXRsZSA9ICIoRGVzZGUgMjAwNiBhIDIwMjAgcG9yIENDQUEpIiwgDQogICAgY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIElORSIpDQogDQpgYGANCg0KPGJyPg0KDQpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIsIGxhcyBtYXlvcmVzIHRhc2FzIGRlIGVtcGxlbyBkZXNkZSBlbCBhw7FvIDIwMDYgc2UgaGFuIG9ic2VydmFkbyBlbiAqKk1hZHJpZCB5IGVuIGxhcyBJc2xhcyBCYWxlYXJlcyoqLCBtaWVudHJhcyBxdWUgcG9yIG90cm8gbGFkbyBsYXMgcGVvcmVzIHRhc2FzIHNlIG9ic2VydmFuIGVuICoqRXh0cmVtYWR1cmEgeSBBbmRhbHVjw61hKiogKENvbXVuaWRhZGVzIGRvbmRlIHByZWRvbWluYSBlbiBtYXlvciBtZWRpZGEgZWwgc2VjdG9yIHByaW1hcmlvKQ0KDQpMYSAqKkNvbXVuaWRhZCBWYWxlbmNpYW5hKiogcHJlc2VudGEgdW5hcyB0YXNhcyBkZSBlbXBsZW8gcXVlIHNlIHNpdHVhbiBlbnRvcm5vIGEgbGEgbWVkaWEgZXNwYcOxb2xhLCBwb3IgbG8gdGFudG8sIGVuIGN1YW50byBhIGVzdGUgaW5kaWNhZG9yIGRlIGVtcGxlbyBwb2Ryw61hbW9zIGRlY2lyIHF1ZSB0ZW5kcsOtYW1vcyBtw6FzIG9wb3J0dW5pZGFkIGRlIGVzdGFyIGVtcGxlYWRvcyBlbiBsYSBDb211bmlkYWQgVmFsZW5jaWFuYSBxdWUgZW4gb3RyYXMgQ29tdW5pZGFkZXMgQXV0w7Nub21hcy4NCg0KQ29tbyBkYXRvIHBhcmEgY29tcGFyYXIgY29uIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLCBhIG5pdmVsIG5hY2lvbmFsIChlbiBlbCBhw7FvIDIwMjApLCBsYSB0YXNhIGRlIGVtcGxlbyBlbiBFc3Bhw7FhIGZ1ZSBkZWwgNDgsNSUuIA0KDQoNCjxicj4NCg0KPGJyPg0KDQojIyAzLjIgVEFTQSBERSBQQVJPIHsudGFic2V0fQ0KDQo8YnI+DQoNCg0KIyMjIEdyw6FmaWNvIGNvbiBsYSBleHBpY2FjacOzbg0KDQpMYSBmYWx0YSBkZSB0cmFiYWpvIGRpc21pbnV5ZSBlbiBncmFuIG1lZGlkYSBsYSBjYWxpZGFkIGRlIHZpZGEgZGUgbG9zIGluZGl2aWR1b3MuIEVzdGEgZmFsdGEgcHJvZHVjZSB1biBjb25qdW50byBkZSBlZmVjdG9zIHNvY2lhbGVzIHkgcGVyc29uYWxlcyBlbiBncmFuIG1lZGlkYSBpbnRlcnJlbGFjaW9uYWRvcywgYXVtZW50YW5kbyBsYXMgZGVzaWd1YWxkYWRlcyBzb2NpYWxlcyB5IGRlIHNhbHVkLCBkaXNtaW51eWVuZG8gbG9zIG5pdmVsZXMgZGUgY2FwYWNpdGFjacOzbiwgYmllbmVzdGFyIG1hdGVyaWFsIHkgc3ViamV0aXZvIGRlIGxhcyBwZXJzb25hcy4NCg0KUGFyYSB2ZXIgcXVlIGltcGxpY2FjacOzbiB0aWVuZSBsYSB0YXNhIGRlIHBhcm8gZW4gbGEgY2FsaWRhZCBkZSB2aWRhIGRlIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLCBoZW1vcyBleHRyYWlkbyBsYXMgMTAgQ29tdW5pZGFkZXMgQXV0w7Nub21hcyBjb24gbWF5b3JlcyB0YXNhcyBkZSBwYXJvIHkgcG9kZW1vcyBvYnNlcnZhciBxdWUgZGVudHJvIGRlIGVsbGEgc2UgZW5jdWVudHJhIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLg0KDQo8YnI+DQoNCmBgYHtyIHRhc2EgcGFybywgZXZhbD0gVFJVRSwgZWNobz0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFLCBjb21tZW50ID0gRkFMU0V9DQoNCm5hbWVzKHRhc2FfcGFybykgPC0gYXMubWF0cml4KHRhc2FfcGFyb1sxLCBdKQ0KdGFzYV9wYXJvIDwtIHRhc2FfcGFyb1stMSwgXQ0KdGFzYV9wYXJvW10gPC0gbGFwcGx5KHRhc2FfcGFybywgZnVuY3Rpb24oeCkgdHlwZS5jb252ZXJ0KGFzLmNoYXJhY3Rlcih4KSkpDQoNCg0KbmFtZXModGFzYV9wYXJvKSA9IGMoIkNDQUEiLCAiMjAwNiIsICIyMDA3IiwgIjIwMDgiLCAiMjAwOSIsICIyMDEwIiwgIjIwMTEiLCAiMjAxMiIsICIyMDEzIiwgIjIwMTQiLCAiMjAxNSIsICIyMDE2IiwgIjIwMTciLCAiMjAxOCIsICIyMDE5IiwgIjIwMjAiKQ0KIyBDYW1iaW8gZWwgbm9tYnJlIGRlIGxhcyBjb2x1bW5hcyBwYXJhIHF1ZSBsYSBwcmltZXJhICBjb2x1bW5hIHNlIGxsYW1lIGNjQUEgeSBwb2RhbW9zIHBhc2FyIGEgZm9ybWF0byBMT05HDQoNCmRmX2xvbmcyIDwtIHRhc2FfcGFybyAlPiUgcGl2b3RfbG9uZ2VyKGNvbHM9MjoxNiAsIG5hbWVzX3RvPSAiQcOxb3MiLCB2YWx1ZXNfdG8gPSAiVGFzYV9QYXJvIikNCiMgUGFzYW1vcyBkZWwgZm9ybWF0byB3aWRlIGFsIGZvcm1hdG8gbG9uZw0KDQpkZl9sb25nMiRUYXNhX1Bhcm8gPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwgIi4iLCBnc3ViKCJcXC4iLCAiIiwgZGZfbG9uZzIkVGFzYV9QYXJvKSkpDQoNCiNHcsOhZmljbyAxMCBjb211bmlkYWRlcyBjb24gbWF5b3IgdGFzYSBkZSBwYXJvIChkZW50cm8gc2UgZW5jdWVudHJhIHZhbGVuY2lhKQ0KZGZfY2NhYSA8LSBkZl9sb25nMiAlPiUgDQogIGZpbHRlcihBw7FvcyA9PSAyMDIwLCBDQ0FBICE9ICJQYWlzIFZhc2NvIiApICU+JSAjIGhlbW9zIGVsaW1pbmFkbyBhbCBQYWlzIFZhc2NvIHlhIHF1ZSBub3Mgc2Fsw61hIGRlbnRybyBkZWwgVG9wIDEwIGNvbiBtYXMgVGFzYSBkZSBQYXJvIHkgZW4gcmVhbGlkYWQsIGVzIGVsIHF1ZSBtZW5vciB0YXNhIHByZXNlbnRhIDopDQogIHNlbGVjdChDQ0FBICwgVGFzYV9QYXJvKSAlPiUNCiAgc2xpY2VfbWF4KFRhc2FfUGFybywgbiA9IDEwKQ0KDQpncmFmX3Bhcm8gPC0gZ2dwbG90KGRmX2NjYWEsIGFlcyh4ID0gQ0NBQSwgeSA9IFRhc2FfUGFybykpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLGFlcyhmaWxsID0gVGFzYV9QYXJvKSkNCg0KZ3JhZl9wYXJvMTwtIGdyYWZfcGFybyArIGxhYnModGl0bGUgPSAiJSBUYXNhIGRlIFBhcm8gQcOxbyAyMDIwIiwNCiAgICAgICBzdWJ0aXRsZSA9ICIxMCBjb211bmlkYWRlcyBjb24gbWFzIHBhcm8iLA0KICAgICAgIGNhcHRpb24gPSAiRWxhYm9yYWNpw7NuIHByb3BpYSIsDQogICAgICAgeCA9ICJDQ0FBIiwNCiAgICAgICB5ID0gIiUgcGFybyIpICsgdGhlbWVfbGlnaHQoKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gVGFzYV9QYXJvKSxudWRnZV95ID0wLjMsIGNvbG91ciA9ICJibGFjayIpDQoNCg0KDQpnZ3Bsb3RseShncmFmX3Bhcm8xKQ0KDQoNCiAgDQpgYGANCjxicj4NCg0KDQoNCg0KDQojIyMgQ8OzZGlnbw0KDQpgYGB7ciBUYWJsYSBUYXNhIGRlIHBhcm8sZXZhbD0gRkFMU0UsIGVjaG89IFRSVUUsIHdhcm5pbmc9IEZBTFNFLCBjb21tZW50ID0gRkFMU0V9DQoNCm5hbWVzKHRhc2FfcGFybykgPC0gYXMubWF0cml4KHRhc2FfcGFyb1sxLCBdKQ0KdGFzYV9wYXJvIDwtIHRhc2FfcGFyb1stMSwgXQ0KdGFzYV9wYXJvW10gPC0gbGFwcGx5KHRhc2FfcGFybywgZnVuY3Rpb24oeCkgdHlwZS5jb252ZXJ0KGFzLmNoYXJhY3Rlcih4KSkpDQoNCg0KbmFtZXModGFzYV9wYXJvKSA9IGMoIkNDQUEiLCAiMjAwNiIsICIyMDA3IiwgIjIwMDgiLCAiMjAwOSIsICIyMDEwIiwgIjIwMTEiLCAiMjAxMiIsICIyMDEzIiwgIjIwMTQiLCAiMjAxNSIsICIyMDE2IiwgIjIwMTciLCAiMjAxOCIsICIyMDE5IiwgIjIwMjAiKQ0KIyBDYW1iaW8gZWwgbm9tYnJlIGRlIGxhcyBjb2x1bW5hcyBwYXJhIHF1ZSBsYSBwcmltZXJhICBjb2x1bW5hIHNlIGxsYW1lIGNjQUEgeSBwb2RhbW9zIHBhc2FyIGEgZm9ybWF0byBMT05HDQoNCmRmX2xvbmcyIDwtIHRhc2FfcGFybyAlPiUgcGl2b3RfbG9uZ2VyKGNvbHM9MjoxNiAsIG5hbWVzX3RvPSAiQcOxb3MiLCB2YWx1ZXNfdG8gPSAiVGFzYV9QYXJvIikNCiMgUGFzYW1vcyBkZWwgZm9ybWF0byB3aWRlIGFsIGZvcm1hdG8gbG9uZw0KDQpkZl9sb25nMiRUYXNhX1Bhcm8gPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwgIi4iLCBnc3ViKCJcXC4iLCAiIiwgZGZfbG9uZzIkVGFzYV9QYXJvKSkpDQojR3LDoWZpY28gMTAgY29tdW5pZGFkZXMgY29uIG1heW9yIHRhc2EgZGUgcGFybyAoZGVudHJvIHNlIGVuY3VlbnRyYSB2YWxlbmNpYSkNCmRmX2NjYWEgPC0gZGZfbG9uZzIgJT4lIA0KICBmaWx0ZXIoQcOxb3MgPT0gMjAyMCwgQ0NBQSAhPSAiUGFpcyBWYXNjbyIgKSAlPiUgIyBoZW1vcyBlbGltaW5hZG8gYWwgUGFpcyBWYXNjbyB5YSBxdWUgbm9zIHNhbMOtYSBkZW50cm8gZGVsIFRvcCAxMCBjb24gbWFzIFRhc2EgZGUgUGFybyB5IGVuIHJlYWxpZGFkLCBlcyBlbCBxdWUgbWVub3IgdGFzYSBwcmVzZW50YSA6KQ0KICBzZWxlY3QoQ0NBQSAsIFRhc2FfUGFybykgJT4lDQogIHNsaWNlX21heChUYXNhX1Bhcm8sIG4gPSAxMCkNCg0KZ3JhZl9wYXJvIDwtIGdncGxvdChkZl9jY2FhLCBhZXMoeCA9IENDQUEsIHkgPSBUYXNhX1Bhcm8pKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IixhZXMoZmlsbCA9IFRhc2FfUGFybykpDQoNCmdyYWZfcGFybzE8LSBncmFmX3Bhcm8gKyBsYWJzKHRpdGxlID0gIiUgVGFzYSBkZSBQYXJvIEHDsW8gMjAyMCIsDQogICAgICAgc3VidGl0bGUgPSAiMTAgY29tdW5pZGFkZXMgY29uIG1hcyBwYXJvIiwNCiAgICAgICBjYXB0aW9uID0gIkVsYWJvcmFjacOzbiBwcm9waWEiLA0KICAgICAgIHggPSAiQ0NBQSIsDQogICAgICAgeSA9ICIlIHBhcm8iKSArIHRoZW1lX2xpZ2h0KCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFRhc2FfUGFybyksbnVkZ2VfeSA9MC4zLCBjb2xvdXIgPSAiYmxhY2siKQ0KDQp2aWV3KGRmX2NjYWEpDQoNCmdyYWZfcGFybzENCg0KDQogIA0KYGBgDQo8YnI+DQoNCiMjIEdyw6FmaWNvIGNvbiBsYSBleHBsaWNhY2ljw7NuDQoNCg0KQSAqKm5pdmVsIG5hY2lvbmFsIGxhIHRhc2EgZGUgcGFybyBlbiBlbCBhw7FvIDIwMjAgZnVlIGRlbCAxNSw1JSoqLCB1biB2YWxvciBzdXBlcmlvciBhIGxhIHRhc2EgZGUgcGFybyBkZWwgYcOxbyAyMDE5IHF1ZSBmdWUgZGVsIDE0LDElLg0KDQpFbiBlbCBhw7FvIDIwMjAgbG9zIHZhbG9yZXMgbcOhcyBhbHRvcyBlbiBsYSB0YXNhIGRlIHBhcm8gY29ycmVzcG9uZGllcm9uIGEgbGFzIGNvbXVuaWRhZGVzIGRlOiBDZXV0YSAoMjQsNSUpLCBNZWxpbGxhICgyMyw4JSkgeSBDYW5hcmlhcyAoMjIsNiUpLg0KDQpMb3MgdmFsb3JlcyBtw6FzIGJham9zIGVuIGxhIHRhc2EgZGUgcGFybyBzZSBzaXR1YXJvbiBlbjogUGHDrXMgVmFzY28gKDksNSUpLCBDb211bmlkYWQgRm9yYWwgZGUgTmF2YXJyYSAoMTAsMSUpIHkgTGEgUmlvamEgKDEwLDglKSwgeWEgcXVlIHNvbiBlbXBsZW9zIG3DoXMgYmllbiB2aW5jdWxhZG9zIGEgbGEgaW5kdXN0cmlhLg0KDQpMYSAqKnRhc2EgZGUgcGFybyBkZSBsYSBDb211bmlkYWQgVmFsZW5jaWFuYSBlcyB1biB0YW50byBzdXBlcmlvciBhIGxhIHRhc2EgZGUgbml2ZWwgbmFjaW9uYWwqKiwgZW4gY29uY3JldG8gZXMgZGVsICoqMTYsMiUqKiwgeSBlbiBwYXJ0ZSBlc3RhIHZpbmN1bGFkYSBhIGxhIHRlbXBvcmFsaWRhZCBkZWwgc2VjdG9yIHNlcnZpY2lvcywgZW50cmUgZWxsb3MgZGVsIHR1cmlzbW8sIHkgZGUgbGFzIGFjdGl2aWRhZGVzIHZpbmN1bGFkYXMgYSBlc3RhIGFjdGl2aWRhZC4NCg0KDQo8YnI+PGJyPg0KDQojIyAzLjMgU0FUSVNGQUNDScOTTiBDT04gRUwgVFJBQkFKTw0KPGJyPg0KDQpFc3RlIGluZGljYWRvciBzb2JyZSBlbCBiaWVuZXN0YXIgcmVzcG9uZGUgYSBsYSBwcmVndW50YSBkZSDCv0N1w6FsIGVzIHN1IGdyYWRvIGRlIHNhdGlzZmFjY2nDs24gZ2xvYmFsIGNvbiBzdSB0cmFiYWpvIGFjdHVhbD8uIFBhcmEgcmVzcG9uZGVyIGEgbGEgcHJlZ3VudGEgc2UgdXRpbGl6YSB1bmEgZXNjYWxhIGRlIDAgYSAxMCwgZW4gbGEgcXVlIDAgc2lnbmlmaWNhIG5hZGEgc2F0aXNmZWNobyB5IDEwIHBsZW5hbWVudGUgc2F0aXNmZWNoby4NCg0KQ29uIGVzdGUgaW5kaWNhZG9yIHByZXRlbmRlbW9zIGNvbm9jZXIgb3RybyBhc3BlY3RvIGRlIGxhIGNhbGlkYWQgZGUgdmlkYSBxdWUgc2UgcHVlZGUgZW5jb250cmFyIGVuIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIHkgcXVlIHZhIG3DoXMgYWxsYSBkZSBsYSBkaW1lbnNpw7NuIG1hdGVyaWFsIG8gZGUgbG9zIGluZ3Jlc29zIHBlcmNpYmlkb3MNCg0KPGJyPg0KDQpgYGB7ciBUYWJsYSwgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KDQpuYW1lcyhzYXRpc190cmFiKSA8LSBhcy5tYXRyaXgoc2F0aXNfdHJhYlsxLCBdKQ0Kc2F0aXNfdHJhYiA8LSBzYXRpc190cmFiWy0xLCBdDQpzYXRpc190cmFiW10gPC0gbGFwcGx5KHNhdGlzX3RyYWIsIGZ1bmN0aW9uKHgpIHR5cGUuY29udmVydChhcy5jaGFyYWN0ZXIoeCkpKQ0KDQoNCm5hbWVzKHNhdGlzX3RyYWIpID0gYygiQ0NBQSIsICJEZSAwIGEgNCIsICJEZSA1IGEgNiIsICJEZSA3IGEgOCIsICJEZSA5IGEgMTAiLCAiU2F0aXNmYWNjaW9uIE1lZGlhIikNCiMgQ2FtYmlvIGVsIG5vbWJyZSBkZSBsYXMgY29sdW1uYXMgcGFyYSBxdWUgbGEgcHJpbWVyYSAgY29sdW1uYSBzZSBsbGFtZSBjY0FBIHkgcG9kYW1vcyBwYXNhciBhIGZvcm1hdG8gTE9ORw0KDQojcGFxdWV0ZToNCg0KDQprbml0cjo6a2FibGUoc2F0aXNfdHJhYikgJT4lDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBsaXN0KGVuYWJsZWQgPSBULCBiYWNrZ3JvdW5kID0gIm9yYW5nZSIpKSAlPiUgIGNvbHVtbl9zcGVjKDcsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiZ3JleSIpICU+JSByb3dfc3BlYyg3LCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gImdyZXkiKQ0KDQpgYGANCg0KPGJyPg0KDQpTZWfDum4gZWwgTcOzZHVsbyBzb2JyZSBCaWVuZXN0YXIgZGVsIGHDsW8gMjAxOCBkZSBsYSBFbmN1ZXN0YSBkZSBDb25kaWNpb25lcyBkZSBWaWRhIGxhcyAqKmNvbXVuaWRhZGVzIGNvbiBwb3JjZW50YWplcyBtw6FzIGFsdG9zKiogZGUgcGVyc29uYXMgcXVlIGVzdMOhbiBtdXkgc2F0aXNmZWNoYXMgY29uIGVsIHRyYWJham8gKDkgeSAxMCBwdW50b3MpIGNvcnJlc3BvbmRlbiBhOiBNZWxpbGxhICg1Miw1JSksIENhbmFyaWFzICg0NCw4JSkgeSBBcmFnw7NuICgzMSwwJSkuDQoNCkxvcyAqKnBvcmNlbnRhamVzIG3DoXMgYmFqb3MqKiBkZSBwZXJzb25hcyBxdWUgZXN0w6FuIG11eSBzYXRpc2ZlY2hhcyBjb24gZWwgdHJhYmFqbyAoOSB5IDEwIHB1bnRvcykgY29ycmVzcG9uZGVuIGE6IFJlZ2nDs24gZGUgTXVyY2lhICgxNiw3JSksIEFuZGFsdWPDrWEgKDIyLDUlKSB5IENvbXVuaWRhZCBkZSBNYWRyaWQgKDIzLDElKS4NCg0KQ29tbyBwb2RlbW9zIG9ic2VydmFyIGVuIGxhIFRhYmxhLCBsYSAqKkNvbXVuaWRhZCBWYWxlbmNpYW5hKiogYSBuaXZlbCBuYWNpb25hbCBvY3VwYSB1bmEgcG9zaWNpw7NuIGludGVybWVkaWEgY29uIHVuYSAqKnNhdGlzZmFjY2nDs24gbWVkaWEgZGUgNyw0KiosIG11eSBwcsOzeGltYSBhIGxhIG1lZGlhIGVzcGHDsW9sYQ0KPGJyPg0KPGJyPg0KDQojIyAzLjQgVFJBQkFKTyBURU1QT1JBTA0KDQo8YnI+DQoNCkxhIHRlbXBvcmFsaWRhZCBsYWJvcmFsIHN1cG9uZSB1biBkZXRyaW1lbnRvIGVuIGxhIGNhbGlkYWQgZGUgdmlkYSBkZSBsb3MgaW5kaXZpZHVvcyBwb3JxdWUgZGlzbWludXllIGxhIHBlcmNlcGNpw7NuIHN1YmpldGl2YSBkZSBzZWd1cmlkYWQgZW4gZWwgZW1wbGVvIHkgdGllbmUgZWZlY3RvcyBuZWdhdGl2b3MgZW4gbGEgZm9ybWFjacOzbi4NCg0KQWRlbcOhcyBsYSB0ZW1wb3JhbGlkYWQgdmEgYXNvY2lhZGEgYSBkaWZlcmVudGVzIGdyYWRvcyBkZSBwcmVjYXJpZWRhZCBzZWfDum4gbGEgbm9ybWF0aXZhIGRlIHJlZ3VsYWNpw7NuIGRlbCBkZXNwaWRvLg0KDQpQb3IgdGFudG8sIGVuIGVsIHNpZ3VpZW50ZSBncsOhZmljbyBjaXJjdWxhciB2YW1vcyBhIGhhYmxhciBkZWwgcG9yY2VudGFqZSBkZSB0cmFiYWphZG9yZXMgcXVlIHByZXNlbnRhbiBjb250cmF0b3MgdGVtcG9yYWxlcyBzb2JyZSBlbCB0b3RhbCwgZXMgZGVjaXIsIHByZXRlbmRlbW9zIGNvbm9jZXIgZWwgcG9yY2VudGFqZSBkZSB0cmFiYWphZG9yZXMgcXVlIHNlIGVuY3VlbnRyYW4gbWVub3MgcHJvdGVnaWRvcyB0YW50byBlbiBlbCBlbXBsZW8gY29tbyBlbiBlbCBkZXNlbXBsZW8sIHlhIHF1ZSBlc3TDoW4gcG9jbyBwcm90ZWdpZG9zIHBvciBsYSByZWd1bGFjacOzbiB5IHNvbiBtw6FzIHZ1bG5lcmFibGVzIGEgbG9zIGRlc3BpZG9zLg0KDQo8YnI+DQpgYGB7ciBHcsOhZmljbyBUYXNhIGRlIHRlbXBvcmFsaWRhZGQsIGVjaG89RkFMU0V9DQoNCm5hbWVzKHRyYWJham9fdGVtcCkgPC0gYXMubWF0cml4KHRyYWJham9fdGVtcFsxLCBdKQ0KdHJhYmFqb190ZW1wIDwtIHRyYWJham9fdGVtcFstMSwgXQ0KdHJhYmFqb190ZW1wW10gPC0gbGFwcGx5KHRyYWJham9fdGVtcCwgZnVuY3Rpb24oeCkgdHlwZS5jb252ZXJ0KGFzLmNoYXJhY3Rlcih4KSkpDQoNCg0KbmFtZXModHJhYmFqb190ZW1wKSA9IGMoIkNDQUEiLCAiMjAwNiIsICIyMDA3IiwgIjIwMDgiLCAiMjAwOSIsICIyMDEwIiwgIjIwMTEiLCAiMjAxMiIsICIyMDEzIiwgIjIwMTQiLCAiMjAxNSIsICIyMDE2IiwgIjIwMTciLCAiMjAxOCIsICIyMDE5IiwgIjIwMjAiKQ0KIyBDYW1iaW8gZWwgbm9tYnJlIGRlIGxhcyBjb2x1bW5hcyBwYXJhIHF1ZSBsYSBwcmltZXJhICBjb2x1bW5hIHNlIGxsYW1lIGNjQUEgeSBwb2RhbW9zIHBhc2FyIGEgZm9ybWF0byBMT05HDQoNCmRmX2xvbmc0IDwtIHRyYWJham9fdGVtcCAlPiUgcGl2b3RfbG9uZ2VyKGNvbHM9MjoxNiAsIG5hbWVzX3RvPSAiQcOxb3MiLCB2YWx1ZXNfdG8gPSAiVGFzYV9UZW1wb3JhbGlkYWQiKQ0KIyBQYXNhbW9zIGRlbCBmb3JtYXRvIHdpZGUgYWwgZm9ybWF0byBsb25nDQoNCmRmX2xvbmc0JFRhc2FfVGVtcG9yYWxpZGFkIDwtIGFzLm51bWVyaWMoZ3N1YigiLCIsICIuIiwgZ3N1YigiXFwuIiwgIiIsIGRmX2xvbmc0JFRhc2FfVGVtcG9yYWxpZGFkKSkpDQojaW5zdGFsbC5wYWNrYWdlcygicGFsZXR0ZWVyIikNCg0KDQoNCnRlbXBfMSA8LSBkZl9sb25nNCAlPiUgZ3JvdXBfYnkoQ0NBQSkgJT4lIGZpbHRlcihBw7FvcyA9PSAyMDIwKSAlPiUgYXJyYW5nZShkZXNjKFRhc2FfVGVtcG9yYWxpZGFkKSkgDQoNCmdyYWZpY290ZW1wXzIwMjAgPC0gZ2dwbG90KHRlbXBfMSwgYWVzKHg9IiIsIHkgPSBUYXNhX1RlbXBvcmFsaWRhZCwgZmlsbD1DQ0FBKSkgKyAgICAgZ2VvbV9iYXIoc3RhdCA9ImlkZW50aXR5IiwgY29sb3IgPSAiYmxhY2siKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBUYXNhX1RlbXBvcmFsaWRhZCksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3Q9MC41KSwgY29sb3I9ImJsYWNrIiwgc2l6ZSA9IDQsICkgKyANCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiU1RFRUxCTFVFIiwgIkJMVUUiLCAiT1JBTkdFIiwgIlJFRCIsIkJST1dOIiwiR1JFRU4iLCAiREFSS0dSRVkiLCAiIzY2Q0RBQSIsIiM4QjIzMjMiLCAiIzAwMDA4QiIsICIjOThGNUZGIiwgIiNGRjcyNTYiLCAiI0ZGRjhEQyIsICIjNzZFRTAwIiwgIiNDQUZGNzAiLCAiI0I4ODYwQiIsICIjRkYxNDkzIiwiI0JGM0VGRiIsICIjRkY2QTZBIiwgIiM2QjhFMjMiLCAiREFSSyBPUkFOR0UiKSkrDQogIGxhYnModGl0bGUgPSAiJSBUUkFCQUpBRE9SRVMgQ09OIENPTlRSQVRPIFRFTVBPUkFMIikNCmdyYWZpY290ZW1wXzIwMjAgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImJsYW5rIikpICtsYWJzKGZpbGwgPSAiVEFTQSBURU1QT1JBTElEQUQiKSANCg0KYGBgDQo8YnI+DQoNCkVuIGVsIGHDsW8gMjAyMCwgdW4gKioyNCwxJSBkZSBhc2FsYXJpYWRvcyB0ZW7DrWFuIGNvbnRyYXRvIGRlIHRyYWJham8gdGVtcG9yYWwqKi4gTGEgY29tdW5pZGFkIGNvbiBlbCBwb3JjZW50YWplIG3DoXMgYmFqbyBkZSBhc2FsYXJpYWRvcyBjb24gY29udHJhdG8gdGVtcG9yYWwgY29ycmVzcG9uZGnDsyBhIGxhICoqQ29tdW5pZGFkIGRlIE1hZHJpZCAoMTgsOCUpKiogbWllbnRyYXMgcXVlIGVsIHBvcmNlbnRhamUgbcOhcyBhbHRvIGRlIGFzYWxhcmlhZG9zIGNvbiBjb250cmF0byB0ZW1wb3JhbCBlbiAyMDIwIGNvcnJlc3BvbmRpw7MgYSAqKkV4dHJlbWFkdXJhICgzNCw5JSkqKi4NCg0KTGEgKipDb211bmlkYWQgVmFsZW5jaWFuYSBwcmVzZW50YSB1bmEgYWx0YSB0YXNhIGRlIHRlbXBvcmFsaWRhZCAoMjUsMiUpKiosIGxhIHJhesOzbiBwdWVkZSBzZXIgc3UgZGVwZW5kZW5jaWEgYWwgc2VjdG9yIHNlcnZpY2lvcyAocHJpbmNpcGFsbWVudGUgZGVzdGFjYSBlbCB0dXJpc21vKQ0KDQo8YnI+DQo8YnI+DQoNCiMgNC4gU0FMVUQgWSBFRFVDQUNJw5NODQo8YnI+DQoNCkxhIHNhbHVkIGVzIG90cm8gZGUgbG9zIGFzcGVjdG9zIGltcG9ydGFudGVzIGN1YW5kbyBoYWJsYW1vcyBzb2JyZSBsYSBjYWxpZGFkIGRlIHZpZGEgZGUgbGFzIHBlcnNvbmFzLiBUZW5lciB1bmFzIGJ1ZW5hcyBjb25kaWNpb25lcyBkZSBzYWx1ZCBzb24gY2xhdmVzIHBhcmEgcG9kZXIgY29uc2VndWlyIG1heW9yZXMgb3BvcnR1bmlkYWRlcyBsYWJvcmFsZXMsIG9idGVuZXIgdW5hIG1heW9yIGZvcm1hY2nDs24gZWR1Y2F0aXZhIHkgcG9kZXIgZGlzZnJ1dGFyIG1lam9yIGRlbCBvY2lvIHBlcnNvbmFsLg0KUGFyYSBvYnRlbmVyIHVuYXMgYnVlbmFzIGNvbmRpY2lvbmVzIGRlIHNhbHVkIGhheSBxdWUgc2VndWlyIHVub3MgaMOhYml0b3MgYWRlY3VhZG9zIHRhbnRvIGVuIGVsIMOhbWJpdG8gZsOtc2ljbywgbWVudGFsIHkgc29jaWFsLCBubyBzb2xhbWVudGUgaGF5IHF1ZSB0ZW5lciBlbiBjdWVudGEgbGEgYXBhcmljacOzbiBkZSBlbmZlcm1lZGFkZXMuIA0KUGFyYSBhbmFsaXphciBlc3RlIHB1bnRvLCB2YW1vcyBhIG9ic2VydmFyIGxhIGV2b2x1Y2nDs24gZGUgdW4gZGF0byBtdXkgaW1wb3J0YW50ZSBjb21vIGVzIGxhIGVzcGVyYW56YSBkZSB2aWRhLiBZIHRhbWJpw6luLCBjw7NtbyBzZSBlbmN1ZW50cmEgZWwgYWNjZXNvIGEgbG9zIHNlcnZpY2lvcyBzYW5pdGFyaW9zIHlhIHF1ZSBzb24gdW5hIGZ1ZW50ZSBkaXJlY3RhIGEgbGEgaG9yYSBkZSBzb2x1Y2lvbmFyIGxvcyBwcm9ibGVtYXMgZGUgc2FsdWQgZGUgbGEgcG9ibGFjacOzbi4gDQoNCg0KIyMgNC4xIEVzcGVyYW56YSBkZSBWaWRhDQoNCg0KPGJyPg0KDQojIyMgNC4xLjEgRGF0b3MgQ29tdW5pZGFkZXMgQXV0w7Nub21hcw0KDQpFbiBsYSB0YWJsYSBxdWUgdGVuZW1vcyBhIGNvbnRpbnVhY2nDs24sIHBvZGVtb3Mgb2JzZXJ2YXIgY3VhbCBlcyBsYSBlc3BlcmFuemEgZGUgdmlkYSBlbiBsYXMgZGlmZXJlbnRlcyBDb211bmlkYWRlcyBBdXTDs25vbWFzIGVuIGVsIGHDsW8gMjAyMC4gPGJyPiAgDQoNCkxvcyBkYXRvcyBwcmVzZW50YWRvcyBzb24gYmFzdGFudGUgcG9zaXRpdm9zIHlhIHF1ZSwgZW4gYXNwZWN0b3MgZ2VuZXJhbGVzLCB0b2RhcyBsYXMgY29tdW5pZGFkZXMgdGllbmVuIHVuYSBlc3BlcmFuemEgZGUgdmlkYSBtYXlvciBkZSA4MCBhw7Fvcy4gUG9kcsOtYW1vcyBkZXN0YWNhciBhIGxhIHBvYmxhY2nDs24gZGUgbGFzIGNvbXVuaWRhZGVzIGRlIElzbGFzIEJhbGVhcmVzICg4Myw0NiBhw7FvcykgeSBOYXZhcnJhICg4MywzNiBhw7FvcykgY29tbyBsYXMgcXVlIHRpZW5lbiB1bmEgbWF5b3IgZXNwZXJhbnphIGRlIHZpZGEgZW4gRXNwYcOxYS4gUG9yIG90cm8gbGFkbywgbGEgcG9ibGFjacOzbiBkZSBDZXV0YSAoNzksMjggYcOxb3MpIHkgTWVsaWxsYSAoNzgsODIgYcOxb3MpIHNvbiBsYXMgcXVlIHRpZW5lbiB1bmEgbWVub3IgZXNwZXJhbnphIGRlIHZpZGEgZW4gRXNwYcOxYSwgYXVucXVlIHN1cyBkYXRvcyBzaWd1ZW4gc2llbmRvIGJhc3RhbnRlIHBvc2l0aXZvcy4gIDxicj4NCg0KUG9yIGxvIHF1ZSByZXNwZWN0YSBhIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLCBhY3R1YWxtZW50ZSBzZSBlbmN1ZW50cmEgZW4gdW5hIHBvc2ljacOzbiBpbnRlcm1lZGlhIGVuIEVzcGHDsWEsIGNvbiB1bmEgZXNwZXJhbnphIGRlIHZpZGEgZGUgODIsMzYgYcOxb3MsIGxsZWdhbmRvIGEgc3VwZXJhciBhIGRvcyBkZSBsYXMgZ3JhbmRlcyBjb211bmlkYWRlcyBjb21vIENhdGFsdcOxYSB5IE1hZHJpZC4gIA0KDQo8YnI+DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQoNCnZpZGFfaG0kVG90YWwgPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwiLiIsIGdzdWIoIlxcLiIsIiIsIHZpZGFfaG0kVG90YWwpKSkNCnZpZGFfaG0kVG90YWw8LSBhcy5udW1lcmljKHZpZGFfaG0kVG90YWwpDQojRGF0b3MgY29uIGVsIHJlc3RvIGRlIGNvbXVuaWRhZGVzDQp2aWRhX2NjYWEgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MvdmlkYV9jY2FhLmNzdiIpKQ0KdmlkYV9jY2FhJFRvdGFsIDwtIGFzLm51bWVyaWMoZ3N1YigiLCIsIi4iLCBnc3ViKCJcXC4iLCIiLCB2aWRhX2NjYWEkVG90YWwpKSkNCnZpZGFfY2NhYSRUb3RhbDwtIGFzLm51bWVyaWModmlkYV9jY2FhJFRvdGFsKQ0KDQp2aWRhX2NjYWEyMDIwIDwtIHZpZGFfY2NhYSAlPiUNCiAgZmlsdGVyKFBlcmlvZG8gPT0gMjAyMCkgJT4lDQogIGFycmFuZ2UoZGVzYyhUb3RhbCkpICU+JQ0KICBzZWxlY3QoYENvbXVuaWRhZGVzIHkgQ2l1ZGFkZXMgQXV0w7Nub21hc2AsIFRvdGFsKQ0KDQojVGFibGENCnRhYmxhX2NjYWEgPC0gdmlkYV9jY2FhMjAyMCAlPiUgZ3QoKQ0KdGFibGFfY2NhYSA8LSBndDo6Z3QodmlkYV9jY2FhMjAyMCkgJT4lDQogIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipFc3BlcmFuemEgZGUgdmlkYSBlbiBsYXMgQ29tdW5pZGFkZXMgQXV0b25vbWFzKioiKSwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9IG1kKCIqRW4gYcOxb3MqIikpICU+JQ0KICB0YWJfc291cmNlX25vdGUobWQoIkZ1ZW50ZTogZGF0b3MgZGUgW0lORV0oaHR0cHM6Ly93d3cuaW5lLmVzL2pheGlUMy9EYXRvcy5odG0/dD0xNDQ4KSIpKSU+JQ0KICBjb2xzX3dpZHRoKGNvbHVtbnMgPSBjKFRvdGFsKSB+IHB4KDEwMCkpICU+JQ0KICB0YWJfb3B0aW9ucyhjb2x1bW5fbGFiZWxzLmJvcmRlci5ib3R0b20uY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICB0YWJsZV9ib2R5LmJvcmRlci5ib3R0b20uY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICB0YWJsZV9ib2R5LmhsaW5lcy5jb2xvciA9ICJibGFjayIpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX2ZpbGwoY29sb3IgPSAibGlnaHRibHVlIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsPCA4MSkpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IFRvdGFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gVG90YWw8IDgxKSkgJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfZmlsbChjb2xvciA9ICJibHVlIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsPiA4MSkpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IFRvdGFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gVG90YWwgPjgxKSklPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF9maWxsKGNvbG9yID0gInB1cnBsZSIpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gVG90YWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBUb3RhbD4gODMpKSAlPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF90ZXh0KGNvbG9yID0gIndoaXRlIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsPiA4MykpDQp0YWJsYV9jY2FhDQoNCiNEYXRvcyBwYXJhIGVsIGdyYWZpY28gKyBlbCBncmFmaWNvDQoNCnZpZGFfZXZvbCA8LSB2aWRhX2NjYWEgJT4lDQogIGZpbHRlcihgQ29tdW5pZGFkZXMgeSBDaXVkYWRlcyBBdXTDs25vbWFzYCAlaW4lIGMgKCJCYWxlYXJzLCBJbGxlcyIsICJOYXZhcnJhLCBDb211bmlkYWQgRm9yYWwgZGUiLCAiQ29tdW5pdGF0IFZhbGVuY2lhbmEiLCAiTWFkcmlkLCBDb211bmlkYWQgZGUiLCAiQ2F0YWx1w7FhIikpJT4lDQogIHNlbGVjdChgQ29tdW5pZGFkZXMgeSBDaXVkYWRlcyBBdXTDs25vbWFzYCwgUGVyaW9kbywgVG90YWwpDQp2aWRhX2V2b2wgJT4lDQogIGdncGxvdCggYWVzKHg9UGVyaW9kbywgeT1Ub3RhbCwgZ3JvdXA9IGBDb211bmlkYWRlcyB5IENpdWRhZGVzIEF1dMOzbm9tYXNgLCBjb2xvcj1gQ29tdW5pZGFkZXMgeSBDaXVkYWRlcyBBdXTDs25vbWFzYCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZ3RpdGxlKCJFdm9sdWNpw7NuIEVzcGVyYW56YSBkZSBWaWRhIikgKw0KICB0aGVtZV9mdF9yYygpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk3NSwgMjAyMCksIGJyZWFrcyA9IHNlcSgxOTc1LCAyMDIwLCBieSA9IDE1KSkrDQogIHlsYWIoIk51bWVybyBkZSBhw7FvcyIpICsNCiAgdHJhbnNpdGlvbl9yZXZlYWwoUGVyaW9kbykNCmBgYA0KPGJyPg0KDQpFbiBlc3RlIGdyw6FmaWNvIHZhbW9zIGEgY29tcGFyYXIgY8OzbW8gaGEgZXZvbHVjaW9uYWRvIGVuIGVsIHRpZW1wbyBsYSBlc3BlcmFuemEgZGUgdmlkYSBlbiBsYXMgYWN0dWFsZXMgY29tdW5pZGFkZXMgY29uIG1lam9yZXMgZGF0b3MgKElzbGFzIEJhbGVhcmVzIHkgTmF2YXJyYSkgeSBhIGxhcyBjb211bmlkYWRlcyBkZSBDYXRhbHXDsWEgeSBNYWRyaWQgY29uIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLiAgPGJyPg0KDQpFbiBlc3RhIGV2b2x1Y2nDs24gcG9kZW1vcyBsbGVnYXIgYSBsYSBjb25jbHVzacOzbiBkZSBxdWUgbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEsIGVuIGxhIG1heW9yIHBhcnRlIGRlbCB0aWVtcG8sIHNlIGhhIGVuY29udHJhZG8gcG9yIGRlYmFqbyBkZSBsYXMgY29tdW5pZGFkZXMgcHVudGVyYXMgZW4gY3VhbnRvIGEgZXNwZXJhbnphIGRlIHZpZGEuIFNpbiBlbWJhcmdvLCBlbiBlbCAyMDIwLCBoYSBvYnRlbmlkbyB1biByZXN1bHRhZG8gbWF5b3IgcXVlIENhdGFsdcOxYSB5IE1hZHJpZC4gRXN0byBwdWVkZSBkZWJlcnNlIHByaW5jaXBhbG1lbnRlIGEgbGFzIGNvbnNlY3VlbmNpYXMgcXVlIGRlamEgbGEgcGFuZGVtaWEgZGVsIENPVklELTE5LiAgDQoNCjxicj4NCg0KIyMjIDQuMS4yIERhdG9zIENvbXVuaWRhZCBWYWxlbmNpYW5hDQoNClBvciBsbyBxdWUgcmVzcGVjdGEgYSBsb3MgZGF0b3MgZW4gbGEgQ29tdW5pZGFkLCBsYSB0ZW5kZW5jaWEgZGUgbGEgZXNwZXJhbnphIGRlIHZpZGEgZXMgY3JlY2llbnRlLiBFcyBjaWVydG8sIHF1ZSwgZW4gZXN0ZSDDumx0aW1vIHBlcsOtb2RvLCBzZSBoYSBzdWZyaWRvIHVuIGRlc2NlbnNvIHBvciBjdWxwYSBkZSBsYSBwYW5kZW1pYSwgcGVybyBlbCBlZmVjdG8gbm8gZXMgdGFuIGdyYW5kZSBjb21vIGVsIHF1ZSBzZSBoYSBwb2RpZG8gb2JzZXJ2YXIgZW4gQ2F0YWx1w7FhIG8gZW4gTWFkcmlkLjxicj4gIA0KDQpUYW1iacOpbiBoYXkgcXVlIGRlc3RhY2FyLCBxdWUgbGEgZXNwZXJhbnphIGRlIHZpZGEgZGUgbGFzIG11amVyZXMgZW4gbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEgZXMgZGUsIGFwcm94aW1hZGFtZW50ZSwgNSBhw7FvcyBtw6FzIHF1ZSBsYSBxdWUgdGllbmVuIGxvcyBob21icmVzLiBFc3RhIGRpZmVyZW5jaWEgbm8gaGEgY29uc2VndWlkbyByZWR1Y2lyc2UgZHVyYW50ZSBlbCBwZXLDrW9kbyBhbmFsaXphZG8gZW50cmUgMTk3NSB5IDIwMjAuIA0KDQo8YnI+DQpgYGB7ciAsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCg0KI0dyYWZpY28gYW5pbWFkbyBDVg0KdmlkYV9obSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1QZXJpb2RvLCB5PVRvdGFsLCBncm91cD1TZXhvLCBjb2xvcj1TZXhvKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdndGl0bGUoIkVzcGVyYW56YSBkZSB2aWRhIHBvciBzZXhvIGVuIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIikgKw0KICB5bGFiKCJOdW1lcm8gZGUgYcOxb3MiKSArDQogIHRyYW5zaXRpb25fcmV2ZWFsKFBlcmlvZG8pKw0KICB0aGVtZV9tb2Rlcm5fcmMoKSsNCiAgdmlld19mb2xsb3coKQ0KYGBgDQo8YnI+IDxicj4NCiMjIDQuMiBBQ0NFU08gQSBDVUlEQURPUyBTQU5JVEFSSU9TDQoNCkFkZW3DoXMgZGUgc2VndWlyIHVub3MgYnVlbm9zIGjDoWJpdG9zIGRlIHZpZGEgcGFyYSBwb2RlciB0ZW5lciB1bmEgYnVlbmEgc2FsdWQsIHRhbWJpw6luIHNlIGRlYmUgZGUgY29udGFyIGNvbiB1bm9zIGJ1ZW5vcyBzZXJ2aWNpb3Mgc2FuaXRhcmlvcy4gRXN0b3MgZGViZW4gZGUgdGVuZXIgdW5hIGJ1ZW5hIGFjY2VzaWJpbGlkYWQgZW4gbGEgcXVlIGVsIHBhY2llbnRlIHB1ZWRhIHNlciBhdGVuZGlkbyBhbnRlIGN1YWxxdWllciBwcm9ibGVtYS4gUGFyYSBjb25vY2VyIGVzdGEgZGlzcG9uaWJpbGlkYWQsIHZhbW9zIGEgYW5hbGl6YXIgbG9zIGRhdG9zIGRlIHBlcnNvbmFzIHF1ZSBubyBoYW4gYWNjZWRpZG8gYSBjdWlkYWRvcyBtw6lkaWNvcyBjdWFuZG8gbG8gaGFuIG5lY2VzaXRhZG8uICANCg0KPGJyPg0KDQojIDQuMi4xIERBVE9TIEVOIExBUyBDT01VTklEQURFUyBBVVTDk05PTUFTDQoNCmBgYHtyICwgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KDQpuYW1lcyhub19hY2Nlc29fMSkgPC0gYXMubWF0cml4KG5vX2FjY2Vzb18xWzEsIF0pDQpub19hY2Nlc29fMSA8LSBub19hY2Nlc29fMVstMSwgXQ0Kbm9fYWNjZXNvXzFbXSA8LSBsYXBwbHkobm9fYWNjZXNvXzEsIGZ1bmN0aW9uKHgpIHR5cGUuY29udmVydChhcy5jaGFyYWN0ZXIoeCkpKQ0KDQoNCm5vX2FjY2Vzb18xIDwtIG5vX2FjY2Vzb18xICU+JQ0KICBhcnJhbmdlKGRlc2MoYDIwMjBgKSkgJT4lDQogIHBpdm90X2xvbmdlciguLCFDQ0FBLCB2YWx1ZXNfdG8gPSAiTm8gQWNjZXNvIDEiLCBuYW1lc190byA9ICJ5ZWFyIikNCm5vX2FjY2Vzb18xJGBObyBBY2Nlc28gMWAgPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwiLiIsIGdzdWIoIlxcLiIsIiIsIG5vX2FjY2Vzb18xJGBObyBBY2Nlc28gMWApKSkNCm5vX2FjY2Vzb18xJGBObyBBY2Nlc28gMWAgPC0gYXMubnVtZXJpYyhub19hY2Nlc29fMSRgTm8gQWNjZXNvIDFgKQ0KDQoNCiANCm5hbWVzKG5vX2FjY2Vzb18yKSA8LSBhcy5tYXRyaXgobm9fYWNjZXNvXzJbMSwgXSkNCm5vX2FjY2Vzb18yIDwtIG5vX2FjY2Vzb18yWy0xLCBdDQpub19hY2Nlc29fMltdIDwtIGxhcHBseShub19hY2Nlc29fMiwgZnVuY3Rpb24oeCkgdHlwZS5jb252ZXJ0KGFzLmNoYXJhY3Rlcih4KSkpDQoNCg0Kbm9fYWNjZXNvXzIgPC0gbm9fYWNjZXNvXzIgJT4lDQogIGFycmFuZ2UoZGVzYyhgMjAyMGApKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIUNDQUEsIHZhbHVlc190byA9ICJObyBBY2Nlc28gMiIsIG5hbWVzX3RvID0gInllYXIiKQ0KDQpub19hY2Nlc29fMiRgTm8gQWNjZXNvIDJgIDwtIGFzLm51bWVyaWMoZ3N1YigiLCIsIi4iLCBnc3ViKCJcXC4iLCIiLCBub19hY2Nlc29fMiRgTm8gQWNjZXNvIDJgKSkpDQpub19hY2Nlc29fMiRgTm8gQWNjZXNvIDJgIDwtIGFzLm51bWVyaWMobm9fYWNjZXNvXzIkYE5vIEFjY2VzbyAyYCkNCg0KI1VuaW9uIHRhYmxhcw0KZGZfaW5uZXIgPC0gaW5uZXJfam9pbihub19hY2Nlc29fMSwgbm9fYWNjZXNvXzIpDQoNCiNmaWx0cmFkb3MNCmNvbXBhcmFjaW9uX2NjYWEgPC0gZGZfaW5uZXIgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMjApICU+JQ0KICBzZWxlY3QoQ0NBQSwgYE5vIEFjY2VzbyAxYCwgYE5vIEFjY2VzbyAyYCkNCg0KI1RhYmxhIGRlZmluaXRpdmENCg0KdGFibGFfY29tIDwtIGNvbXBhcmFjaW9uX2NjYWEgJT4lIGd0KCkNCnRhYmxhX2NvbSA8LSBndDo6Z3QoY29tcGFyYWNpb25fY2NhYSkgJT4lDQogIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipEYXRvcyBObyBBY2Nlc28gYSBTZXJ2aWNpb3MgU2FuaXRhcmlvcyAyMDIwKioiKSwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9IG1kKCIqRGF0b3MgZW4gJSoiKSkgJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShtZCgiKipGdWVudGUqKjogZGF0b3MgZGUgW0lORV0oaHR0cHM6Ly93d3cuaW5lLmVzL3NzL1NhdGVsbGl0ZT9MPWVzX0VTJmM9SU5FU2VjY2lvbl9DJmNpZD0xMjU5OTQ0NDg3ODY3JnA9MTI1NDczNTExMDY3MiZwYWdlbmFtZT1Qcm9kdWN0b3NZU2VydmljaW9zJTJGUFlTTGF5b3V0JnBhcmFtMT1QWVNEZXRhbGxlRmljaGFJbmRpY2Fkb3ImcGFyYW0zPTEyNTk5Mzc0OTkwODQpIikpICU+JQ0KICB0YWJfc291cmNlX25vdGUobWQoIioqTm8gQWNjZXNvIDEqKjogbXV5IGNhcm87IG11eSBsZWpvcyBwYXJhIGFjY2VkZXI7IHByb2JsZW1hcyBkZSBsaXN0YSBkZSBlc3BlcmEiKSkgJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShtZCgiKipObyBBY2Nlc28gMioqOm5vIGRpc3BvbmVyIGRlIHRpZW1wbzsgbm8gY29ub2NlIG5pbmfDum4gYnVlbiBlc3BlY2lhbGlzdGE7IG1pZWRvIGFsIG3DqWRpY28sIGhvc3BpdGFsZXMsIGV4cGxvcmFjaW9uZXMgbcOpZGljYXMgbyB0cmF0YW1pZW50bzsgZXNwZXJhciB5IHZlciBzaSBlbCBwcm9ibGVtYSBtZWpvcmE7IG90cmFzIHJhem9uZXMiKSkgJT4lDQogIGNvbHNfd2lkdGgoY29sdW1ucyA9IGMoYE5vIEFjY2VzbyAxYCkgfiBweCgxMDApKSAlPiUNCiAgY29sc193aWR0aChjb2x1bW5zID0gYyhgTm8gQWNjZXNvIDJgKSB+IHB4KDEwMCkpICU+JQ0KICB0YWJfb3B0aW9ucyhjb2x1bW5fbGFiZWxzLmJvcmRlci5ib3R0b20uY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICB0YWJsZV9ib2R5LmJvcmRlci5ib3R0b20uY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICB0YWJsZV9ib2R5LmhsaW5lcy5jb2xvciA9ICJibGFjayIpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX2ZpbGwoY29sb3IgPSAiYnJvd24xIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBgTm8gQWNjZXNvIDFgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gYE5vIEFjY2VzbyAxYD4gMSkpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGBObyBBY2Nlc28gMWAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBgTm8gQWNjZXNvIDFgPiAxKSkgJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfZmlsbChjb2xvciA9ICJicm93bjEiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGBObyBBY2Nlc28gMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBgTm8gQWNjZXNvIDJgPiAxKSkgJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfdGV4dChjb2xvciA9ICJ3aGl0ZSIpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gYE5vIEFjY2VzbyAyYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IGBObyBBY2Nlc28gMmAgPiAxKSkgJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfYm9yZGVycyhjb2xvciA9ICJibGFjayIsIHdlaWdodCA9IHB4KDMpKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGBObyBBY2Nlc28gMWAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBgTm8gQWNjZXNvIDFgPj0gMCkpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX2JvcmRlcnMoY29sb3IgPSAiYmxhY2siLCB3ZWlnaHQgPSBweCgzKSksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBgTm8gQWNjZXNvIDJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gYE5vIEFjY2VzbyAyYD49IDApKQ0KdGFibGFfY29tDQpgYGANCjxicj4gPGJyPg0KDQpFbiBlc3RhIHRhYmxhIHBvZGVtb3MgdmVyIGxvcyBkYXRvcyBhY2VyY2EgZGUgbGFzIHBlcnNvbmFzIHF1ZSBubyBoYW4gcG9kaWRvIGFjY2VkZXIgYSBsb3Mgc2VydmljaW9zIHNhbml0YXJpb3MgY3VhbmRvIGxvIGhhbiBuZWNlc2l0YWRvLiBFc3RlIGRhdG8gc2UgZGl2aWRlIGVuIGRvcyB0aXBvcyBkZSBubyBhY2Nlc28uICA8YnI+DQoNCkxhcyByYXpvbmVzIGRlIG5vIGFjY2VzbyAxIGluY2x1eWUgdG9kYXMgYXF1ZWxsYXMgcmF6b25lcyBhY2VyY2EgZGUgcXVlIGVsIHNlcnZpY2lvIGVzIGNhcm8geSBlbCBwYWNpZW50ZSBubyBzZSBsbyBwdWVkZSBwZXJtaXRpci4gVGFtYmnDqW4gaW5jbHV5ZSBsYSBsZWphbsOtYSBkZWwgY2VudHJvIGRlIHNhbHVkIGVuIGVsIHF1ZSB0aWVuZSBxdWUgc2VyIGF0ZW5kaWRvLiBZLCBsb3MgcHJvYmxlbWFzIGRlIGxhcyBsaXN0YXMgZGUgZXNwZXJhIHlhIHF1ZSBhbGd1bm9zIHBhY2llbnRlcyBuZWNlc2l0YW4gdW5hIGludGVydmVuY2nDs24gY3VhbnRvIGFudGVzIHkgc2UgdmVuIGNvbiByZXN0cmljY2lvbmVzLiAgPGJyPg0KDQpFbiBjdWFudG8gYSBsYXMgcmF6b25lcyBkZSBubyBhY2Nlc28gMiBpbmNsdXllIGFxdWVsbGFzIGFjZXJjYSBkZSBubyBkaXNwb25lciBkZSB0aWVtcG8sIG5vIGNvbm9jZXIgdW4gYnVlbiBlc3BlY2lhbGlzdGEsIGVsIG1pZWRvIGRlbCBwYWNpZW50ZSBhIGlyIGFsIG3DqWRpY28gbyBhIGxvcyBob3NwaXRhbGVzIG8gYSBleHBvbmVyc2UgYSBhbGfDum4gdHJhdGFtaWVudG8sIHkgcXVlIGVsIHByb3BpbyBwYWNpZW50ZSBwcmVmaWVyZSBlc3BlcmFyIGEgdmVyIHNpIGVsIHByb2JsZW1hIG1lam9yYSBlbiB2ZXogZGUgYWN1ZGlyIGFsIGNlbnRybyBzYW5pdGFyaW8geSBzZXIgdHJhdGFkby4gIDxicj4NCg0KRW4gZWwgYcOxbyAyMDIwLCBsYSBjb211bmlkYWQgZW4gbGEgcXVlIHVuIG1heW9yIHBvcmNlbnRhamUgZGUgcG9ibGFjacOzbiB0dXZvIHByb2JsZW1hcyBkZSBubyBhY2Nlc28gMSBmdWUgQ2FuYXJpYXMgY29uIHVuIDEsNCUuIE11eSBjZXJjYSBkZSBlbGxhLCBlbmNvbnRyYW1vcyBhIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIGNvbiB1biAwLDglLiBBZGVtw6FzLCBoYXkgdmFyaWFzIGNvbXVuaWRhZGVzIHF1ZSBzZSBlbmNvbnRyYXJvbiBjb24gdW4gMCUgZGUgc3UgcG9ibGFjacOzbiBxdWUgc2UgYWNvZ2nDsyBhIGVzdG9zIHByb2JsZW1hcyBjb21vIEdhbGljaWEsIENhbnRhYnJpYSwgQXJhZ8OzbiwgQ2V1dGEgeSBNZWxpbGxhLiA8YnI+DQoNCiANCg0KRW4gY3VhbnRvIGEgbGFzIHJhem9uZXMgZGUgbm8gYWNjZXNvIDIsIGxhIGNvbXVuaWRhZCBjb24gbWF5b3IgcG9yY2VudGFqZSBkZSBwb2JsYWNpw7NuIHF1ZSB0dXZvIGVzZSB0aXBvIGRlIHByb2JsZW1hcyBmdWUgbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEgY29uIHVuIDIsOCUuIEVuIGVzdGUgdGlwbyBkZSByYXpvbmVzIGVzIGRvbmRlIG3DoXMgY29tdW5pZGFkZXMgdGllbmVuIG3DrW5pbW8gdW4gMSUgZGUgc3UgcG9ibGFjacOzbiBhZmVjdGFkYSBhIGV4Y2VwY2nDs24gZGUgQ2V1dGEgcXVlIGVzIGxhIMO6bmljYSBjb24gdW4gMCUuPGJyPiANCg0KIyA0LjIuMiBEQVRPUyBFTiBMQSBDT01VTklEQUQgVkFMRU5DSUFOQQ0KDQpgYGB7ciAsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCg0Kbm9fYWNjZXNvX2N2IDwtIGRmX2lubmVyICU+JQ0KICBmaWx0ZXIoQ0NBQSAlaW4lIGMgKCAiQ29tdW5pdGF0IFZhbGVuY2lhbmEiKSkNCg0KZ3JhZmljb19jdjEgPC0gZ2dwbG90KG5vX2FjY2Vzb19jdiwgYWVzKHllYXIsIGBObyBBY2Nlc28gMWAsIGZpbGwgPSBDQ0FBKSkgKyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZV9pZ3JheSgpKw0KICBsYWJzKHRpdGxlID0gIkRhdG9zIGRlIE5vIEFjY2VzbyBwb3IgUmF6w7NuIDEiKSsNCiAgbGFicyhzdWJ0aXRsZSA9ICJEYXRvcyBDViIpKw0KICBsYWJzKGNhcHRpb24gPSAiRGF0b3MgcHJvdmVuaWVudGVzIGRlbCBJTkUiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDgsIGFuZ2xlID0gOTAsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAuNSkpDQoNCmdyYWZpY29fY3YxDQoNCmdyYWZpY29fY3YyIDwtIGdncGxvdChub19hY2Nlc29fY3YsIGFlcyh5ZWFyLCBgTm8gQWNjZXNvIDJgLCBmaWxsID0gQ0NBQSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX2lncmF5KCkrDQogIGxhYnModGl0bGUgPSAiRGF0b3MgZGUgTm8gQWNjZXNvIHBvciBSYXrDs24gMiIpKw0KICBsYWJzKHN1YnRpdGxlID0gIkRhdG9zIENWIikrDQogIGxhYnMoY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIElORSIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gOCwgYW5nbGUgPSA5MCwgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMC41KSkNCiAgDQpncmFmaWNvX2N2Mg0KDQoNCmBgYA0KPGJyPiA8YnI+DQoNCkVuIGN1YW50byBhIGxvcyBkYXRvcyBlbiBsYSBDb211bmlkYWQgVmFsZW5jaWFuYSwgdmFtb3MgYSBvYnNlcnZhciBsYSBldm9sdWNpw7NuIGRlIGxvcyBwcm9ibGVtYXMgZGUgYWNjZXNvIGFsIHNpc3RlbWEgc2FuaXRhcmlvIHBvciBsYXMgcmF6b25lcyBkZSBubyBhY2Nlc28gMS4gPGJyPg0KDQpEdXJhbnRlIGVsIHBlcsOtb2RvIDIwMDQtMjAwNiwgbGxlZ8OzIGEgdGVuZXIgdW4gMiUgZGUgbGEgcG9ibGFjacOzbiBhZmVjdGFkYSwgcGVybyBjb25zaWd1acOzIGRlc2NlbmRlciBlc2UgcG9yY2VudGFqZSBoYXN0YSBlbCAyMDEzLiBGaW5hbG1lbnRlLCBzZSB2b2x2aWVyb24gYSByZWR1Y2lyIGxvcyBkYXRvcyBoYXN0YSBlbCAyMDIwLCBkb25kZSBoYSBhc2NlbmRpZG8gaGFzdGEgdW4gMCw4JSBkZSBsYSBwb2JsYWNpw7NuLiBFcyBtdXkgcHJvYmFibGUgcXVlIGVzdG8gc2UgZGViYSBhIGxhcyBjb25zZWN1ZW5jaWFzIGRlIGxhIHBhbmRlbWlhIGRlbCBDT1ZJRC0xOSBxdWUgaGEgc3VwdWVzdG8gdW5hIGFnbG9tZXJhY2nDs24gZGUgcGFjaWVudGVzLiAgDQoNCiA8YnI+DQoNCkVuIGN1YW50byBhIGxvcyBkYXRvcyBzb2JyZSBsYXMgcmF6b25lcyBkZSBubyBhY2Nlc28gMiwgdmVtb3MgcXVlIGVsIHBvcmNlbnRhamUgZGUgcG9ibGFjacOzbiBxdWUgc2UgYWNvZ2nDsyBhIGVzdG9zIHByb2JsZW1hcyBjb21wYXJhbmRvIGxhcyByYXpvbmVzIGRlIG5vIGFjY2VzbyAxIGVzIG11Y2hvIG1heW9yLiBFbCBhw7FvIGRvbmRlIG3DoXMgYWZlY3TDsyBmdWUgZW4gMjAxMCBkb25kZSBsbGVnbyBhbCAxMCw4JSBkZSBsYSBwb2JsYWNpw7NuLiAgDQo8YnI+DQpVbiBkYXRvIHBvc2l0aXZvLCBlcyBxdWUgc2UgcHVkbyByZWR1Y2lyIGVuIHVuYSBncmFuIG1lZGlkYSBlc3RhcyBjaWZyYXMgZW4gZWwgcGVyaW9kbyAyMDE3LTIwMTkuIEhhc3RhIHF1ZSwgZW4gZWwgYcOxbyAyMDIwLCBhIGNhdXNhIGRlbCBDT1ZJRC0xOSwgaGEgdnVlbHRvIGEgYXVtZW50YXIgZXN0ZSBwb3JjZW50YWplIGhhc3RhIGVsIDIsOCUgeSBzaWVuZG8gbGEgcGVvciBDb211bmlkYWQgQXV0w7Nub21hLiAgDQo8YnI+DQogDQoNCkVuIGNvbmNsdXNpw7NuLCBsYSBwb3NpY2nDs24gZGUgbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEgY29tcGFyYW5kbyBjb24gbGFzIGNvbXVuaWRhZGVzIG5vIGVzIG11eSBidWVuYSB5YSBxdWUgZW4gdW5vIGRlIGxvcyB0aXBvcyBkZSByYXpvbmVzIGVzIGxhIHF1ZSBtw6FzIHBvYmxhY2nDs24gdGllbmUgcHJvYmxlbWFzIGRlIGFjY2VzbyBhbCBzZXJ2aWNpbyBzYW5pdGFyaW8uIFNpbiBlbWJhcmdvLCB1biBhc3BlY3RvIHBvc2l0aXZvIGVzIHF1ZSwgYW50ZXMgZGUgbGxlZ2FyIGxhIHBhbmRlbWlhIGVuIDIwMjAsIHNlIGhhbiBjb25zZWd1aWRvIHJlZHVjaXIgZXNvcyBkYXRvcywgbG8gcXVlIHNpZ25pZmljYSBxdWUgbG9zIHByb2JsZW1hcyBwYXJhIGFjY2VkZXIgYWwgc2lzdGVtYSBzYW5pdGFyaW8gc2UgaGFuIHNvbHVjaW9uYWRvLiANCg0KPGJyPiA8YnI+DQoNCiMjIDQuMyBOSVZFTCBERSBFRFVDQUNJw5NOIERFIExBIFBPQkxBQ0nDk04NCg0KTGEgZWR1Y2FjacOzbiBlcyB1biBpbmRpY2Fkb3IgaW1wb3J0YW50ZSBwYXJhIGxhIHBlcnNvbmEgeWEgcXVlIGRlIG1hbmVyYSBkaXJlY3RhIGNvbnNpZ3VlIHF1ZSBlbCBpbmRpdmlkdW8gYXByZW5kYSBudWV2b3MgY29ub2NpbWllbnRvcywgcGVybyBvdG9yZ2Egb3Ryb3MgYmVuZWZpY2lvcyBkZSBtYW5lcmEgaW5kaXJlY3RhIGNvbW8gdW4gYXVtZW50byBkZSBzdSBiaWVuZXN0YXIgeSBkZSBzdSBjYWxpZGFkIGRlIHZpZGEuICA8YnI+DQoNCkxhIG1hbmVyYSBlbiBsYSBxdWUgbGEgZWR1Y2FjacOzbiBvdG9yZ2EgdW5hIG1heW9yIGNhbGlkYWQgZGUgdmlkYSBlbiBlbCBpbmRpdmlkdW8gZXMgcXVlIHB1ZWRlIGNvbnNlZ3VpciB1biBtZWpvciBlbXBsZW8gZW4gZWwgZnV0dXJvIGVsIGN1YWwgbGUgb3Rvcmd1ZSB1biBzYWxhcmlvIG1heW9yIHF1ZSBsZSBwZXJtaXRhIHZpdmlyIGVuIHVuYXMgY29uZGljaW9uZXMgYWdyYWRhYmxlcy4gQWwgbWlzbW8gdGllbXBvLCBsYSBlZHVjYWNpw7NuIHBlcm1pdGUgYWwgaW5kaXZpZHVvIGNvbm9jZXIgbWVqb3JlcyBlc3RpbG9zIGRlIHZpZGEgc2FsdWRhYmxlcyBjb24gZWZlY3RvcyBwb3NpdGl2b3MgZW4gc3Ugc2FsdWQgeSBsZSBnZW5lcmEgdW5hcyBtYXlvcmVzIGhhYmlsaWRhZGVzIHBhcmEgcXVlIHN1IGludGVncmFjacOzbiBlbiBsYSBzb2NpZWRhZCBzZWEgbcOhcyBzZW5jaWxsYS4gIA0KDQo8YnI+DQoNCiMjIyA0LjMuMSBOSVZFTCBERSBFRFVDQUNJw5NOIDAtMg0KYGBge3IgLCBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQoNCiNOaXZlbCAwLTINCg0KbmFtZXMoZWR1Y18wMikgPC0gYXMubWF0cml4KGVkdWNfMDJbMSwgXSkNCmVkdWNfMDIgPC0gZWR1Y18wMlstMSwgXQ0KZWR1Y18wMltdIDwtIGxhcHBseShlZHVjXzAyLCBmdW5jdGlvbih4KSB0eXBlLmNvbnZlcnQoYXMuY2hhcmFjdGVyKHgpKSkNCg0KDQojRWRpdGFuZG8gZGF0b3MNCg0KZWR1YzIwMjAgPC0gZWR1Y18wMiAlPiUNCiAgc2VsZWN0KENDQUEsYDIwMThgLGAyMDE5YCwgYDIwMjBgKSU+JQ0KICBhcnJhbmdlKGRlc2MoYDIwMjBgKSkNCg0KI1RhYmxhIDENCg0KdGFibGEyMDIwIDwtIGVkdWMyMDIwICU+JSBndCgpDQp0YWJsYTIwMjAgPC0gZ3Q6Omd0KGVkdWMyMDIwKQ0KDQoNCnRhYmxhMjAyMCA8LSB0YWJsYTIwMjAgJT4lIA0KICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqTml2ZWwgZGUgZm9ybWFjacOzbiBhbGNhbnphZG8gcG9yIGxhIHBvYmxhY2nDs24gZGUgMTYgYSA2NCBhw7FvcyAoJSkqKiIpLA0KICAgICAgICAgICAgIHN1YnRpdGxlID0gbWQoIipOaXZlbCAwLTIqIikpICU+JQ0KICB0YWJfc291cmNlX25vdGUobWQoIkZ1ZW50ZTogZGF0b3MgZGUgW0lORV0oaHR0cHM6Ly93d3cuaW5lLmVzL3NzL1NhdGVsbGl0ZT9MPWVzX0VTJmM9SU5FU2VjY2lvbl9DJmNpZD0xMjU5OTQ5NDc3MDgyJnA9MTI1NDczNTExMDY3MiZwYWdlbmFtZT1Qcm9kdWN0b3NZU2VydmljaW9zJTJGUFlTTGF5b3V0JnBhcmFtMT1QWVNEZXRhbGxlRmljaGFJbmRpY2Fkb3ImcGFyYW0zPTEyNTk5Mzc0OTkwODQpIikpJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShtZCgiKipOaXZlbCAwLTIqKjpwcmVlc2NvbGFyLCBwcmltYXJpYSB5IDHCqiBldGFwYSBkZSBlZHVjYWNpw7NuIHNlY3VuZGFyaWEiKSkNCg0KDQp0YWJsYTIwMjAgPC0gdGFibGEyMDIwICU+JSANCiAgY29sc193aWR0aChjb2x1bW5zID0gYyhgMjAyMGApIH4gcHgoMTAwKSkNCg0KDQoNCnRhYmxhMjAyMCA8LSB0YWJsYTIwMjAgJT4lDQogIHRhYl9vcHRpb25zKGNvbHVtbl9sYWJlbHMuYm9yZGVyLmJvdHRvbS5jb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIHRhYmxlX2JvZHkuYm9yZGVyLmJvdHRvbS5jb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIHRhYmxlX2JvZHkuaGxpbmVzLmNvbG9yID0gImJsYWNrIikNCg0KDQp0YWJsYTIwMjAgPC0gdGFibGEyMDIwICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX2ZpbGwoY29sb3IgPSAicmVkIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBgMjAyMGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBgMjAyMGA8IDM1KSkgJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfdGV4dChjb2xvciA9ICJ3aGl0ZSIpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gYDIwMjBgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gYDIwMjBgPCAzNSkpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX2ZpbGwoY29sb3IgPSAib3JhbmdlIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBgMjAyMGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBgMjAyMGA+IDM1KSkgJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfdGV4dChjb2xvciA9ICJ3aGl0ZSIpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gYDIwMjBgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gYDIwMjBgID4zNSkpJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfZmlsbChjb2xvciA9ICJncmVlbiIpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gYDIwMjBgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gYDIwMjBgPiA0NSkpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGAyMDIwYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IGAyMDIwYD4gNDUpKQ0KDQp0YWJsYTIwMjANCg0KI1RyYXNuZm9ybWFuZG8gZGF0b3MNCg0KZWR1Y19tYXgwMiA8LSBlZHVjXzAyICU+JQ0KICBhcnJhbmdlKGRlc2MoYDIwMjBgKSkgJT4lDQogIHNsaWNlX21heChgMjAyMGAsIG49MTApJT4lDQogIHBpdm90X2xvbmdlciguLCFDQ0FBLCB2YWx1ZXNfdG8gPSAicG9ibGFjaW9uIiwgbmFtZXNfdG8gPSAieWVhciIpICU+JQ0KICBmaWx0ZXIoYmV0d2Vlbih5ZWFyLDIwMTMsMjAyMCkpICU+JQ0KICBmaWx0ZXIoQ0NBQSAlaW4lIGMgKCJFeHRyZW1hZHVyYSIsIkNldXRhIiwgIkNvbXVuaXRhdCBWYWxlbmNpYW5hIikpDQplZHVjX21heDAyJHBvYmxhY2lvbiA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCIuIiwgZ3N1YigiXFwuIiwiIiwgZWR1Y19tYXgwMiRwb2JsYWNpb24pKSkNCmVkdWNfbWF4MDIkcG9ibGFjaW9uPC0gYXMubnVtZXJpYyhlZHVjX21heDAyJHBvYmxhY2lvbikNCg0KZWR1Y19jdiA8LSBlZHVjXzAyICU+JQ0KICBhcnJhbmdlKGRlc2MoYDIwMjBgKSkgJT4lDQogIHNsaWNlX21pbihgMjAyMGAsIG49MTApJT4lDQogIHBpdm90X2xvbmdlciguLCFDQ0FBLCB2YWx1ZXNfdG8gPSAicG9ibGFjaW9uIiwgbmFtZXNfdG8gPSAieWVhciIpICU+JQ0KICBmaWx0ZXIoYmV0d2Vlbih5ZWFyLDIwMTMsMjAyMCkpICU+JQ0KICBmaWx0ZXIoQ0NBQSAlaW4lIGMgKCJNYWRyaWQsIENvbXVuaWRhZCBkZSIsIkNhdGFsdW5hIiwgIkNvbXVuaXRhdCBWYWxlbmNpYW5hIiwgIkFyYWdvbiIpKQ0KI0dyYWZpY28gMQ0KDQpncmFmaWNvX2VkdWNtYXggPC0gZ2dwbG90KGVkdWNfbWF4MDIsIGFlcyh5ZWFyLCBwb2JsYWNpb24sIGZpbGwgPSBDQ0FBKSkgKyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gOCwgYW5nbGUgPSA5MCwgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMC41KSkrDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTgsIGFuZ2xlID0gOTAsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAuNSkpKw0KICBsYWJzKHRpdGxlID0gIk5pdmVsIGRlIGZvcm1hY2nDs24gYWxjYW56YWRvIHBvciBsYSBwb2JsYWNpw7NuIGRlIDE2IGEgNjQgYcOxb3MgKCUpIikrDQogIGxhYnMoc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGxhIENvbXVuaXRhdCBWYWxlbmNpYW5hIGNvbiBDZXV0YSB5IEV4dHJlbWFkdXJhIChOaXZlbCAwLTIpIikrDQogIGxhYnMoY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIElORSIpDQoNCiAgZ3JhZmljb19lZHVjbWF4DQoNCiNHcmFmaWNvIDINCmdyYWZpY29fZWR1Y21pbiA8LSBnZ3Bsb3QoZWR1Y19jdiwgYWVzKHllYXIsIHBvYmxhY2lvbiwgZmlsbCA9IENDQUEpKSArIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIGxhYnModGl0bGUgPSAiTml2ZWwgZGUgZm9ybWFjacOzbiBhbGNhbnphZG8gcG9yIGxhIHBvYmxhY2nDs24gZGUgMTYgYSA2NCBhw7FvcyAoJSkiKSsNCiAgbGFicyhzdWJ0aXRsZSA9ICJDb21wYXJhY2nDs24gZGUgbGEgQ29tdW5pdGF0IFZhbGVuY2lhbmEgY29uIEFyYWfDs24sIENhdGFsdcOxYSwgTWFkcmlkIChOaXZlbCAwLTIpIikrDQogIGxhYnMoY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIElORSIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gOCwgYW5nbGUgPSA5MCwgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMC41KSkNCiAgDQpncmFmaWNvX2VkdWNtaW4NCg0KDQoNCmBgYA0KPGJyPg0KPGJyPg0KDQpFbiBjdWFudG8gYWwgbml2ZWwgZGUgZm9ybWFjacOzbiAwLTIsIGFjb2dlIGEgdG9kb3MgYXF1ZWxsb3MgZXN0dWRpYW50ZXMgcXVlIGhheWFuIHJlY2liaWRvIHVuYSBlZHVjYWNpw7NuIGRlIHByZWVzY29sYXIsIHByaW1hcmlhIHkgMcK6IGV0YXBhIGRlIGVkdWNhY2nDs24gc2VjdW5kYXJpYS4gRGlnYW1vcyBxdWUgZXN0ZSBlcyBlbCBuaXZlbCBkZSBlZHVjYWNpw7NuIG3DoXMgYsOhc2ljYSwgcG9yIHRhbnRvLCB1biBuaXZlbCBkZSBlZHVjYWNpw7NuIG3DoXMgYmFqbyBzdXBvbmUgdW5vcyBiZW5lZmljaW9zIGLDoXNpY29zIHBhcmEgZWwgaW5kaXZpZHVvLiAgDQo8YnI+DQogDQoNCkNvbW8gc2UgcHVlZGUgb2JzZXJ2YXIgZW4gbGEgdGFibGEsIHZlbW9zIGNvbW8gRXh0cmVtYWR1cmEgZXMgbGEgY29tdW5pZGFkIGNvbiBtw6FzIHBvYmxhY2nDs24gY29uIHNvbG8gZXN0dWRpb3MgYsOhc2ljb3MgY29uIHVuIDUxLjQlLiBMYSBzaXR1YWNpw7NuIGRlIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIGVuIGVzdGEgdGFibGEgZXMgdW5hIHBvc2ljacOzbiBpbnRlcm1lZGlhIGJhamEsIGF1bnF1ZSBzdSBkYXRvIHNlIHBvZHLDrWEgY29uc2lkZXJhciBwb3NpdGl2byB5YSBxdWUgbWVub3MgZGUgbGEgbWl0YWQgZGUgbGEgcG9ibGFjacOzbiAodW4gMzgsNSUpIHRpZW5lIHVuYSBmb3JtYWNpw7NuIGLDoXNpY2EuICANCg0KIDxicj4NCg0KU2kgY29tcGFyYW1vcyBlc3RvcyBkYXRvcyBjb24gbGFzIGRvcyBjb211bmlkYWRlcyBjb24gbWF5b3IgcG9ibGFjacOzbiBjb24gbml2ZWwgMC0yLCBzZSBvYnNlcnZhIHF1ZSBsYSBDb211bmlkYWQgVmFsZW5jaWFuYSBoYSBlc3RhZG8gc2llbXByZSBwb3IgZGViYWpvLCB5IGNhZGEgdmV6IHNlIGhhIGlkbyByZWR1Y2llbmRvIG3DoXMuIFNpbiBlbWJhcmdvLCBhbCBjb21wYXJhciBjb24gbGFzIGNvbXVuaWRhZGVzIGNvbiBtZW5vciBwb2JsYWNpw7NuIGNvbiBuaXZlbCAwLTIsIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIG5vIGhhIGNvbnNlZ3VpZG8gcmVkdWNpciBsYXMgZGlzdGFuY2lhcyBjb24gY29tdW5pZGFkZXMgY29tbyBNYWRyaWQuICANCjxicj4NCg0KIyMjIDQuMy4yIE5JVkVMIERFIEVEVUNBQ0nDk04gMy04DQoNCkVuIGN1YW50byBhbCBuaXZlbCAzLTgsIGVzdGUgaGFjZSByZWZlcmVuY2lhIGEgbGEgcG9ibGFjacOzbiBxdWUgaGEgcmVjaWJpZG8gdW5hIGVkdWNhY2nDs24gZGUgMsKqIGV0YXBhIGRlIHNlY3VuZGFyaWEgeSBwb3N0c2VjdW5kYXJpYSBubyBzdXBlcmlvciwgMcK6IGNpY2xvIHkgMsK6IGNpY2xvIGRlIGVkdWNhY2nDs24gc3VwZXJpb3IgeSBkb2N0b3JhZG8uICANCg0KRXN0ZSBlcyBlbCBuaXZlbCBkZSBmb3JtYWNpw7NuIG3DoXMgYWx0byBxdWUgdW4gaW5kaXZpZHVvIHB1ZWRlIGNvbnNlZ3Vpci4gRGUgZXN0YSBtYW5lcmEsIGVsIGluZGl2aWR1byBwdWVkZSBjb25zZWd1aXIgdW4gbWF5b3Igbml2ZWwgZGUgcmVudGEgZW4gZWwgZnV0dXJvLCB1biBlbXBsZW8gY29uIG1lam9yZXMgY29uZGljaW9uZXMgbGFib3JhbGVzLCBldGMuIDxicj4NCg0KYGBge3IgLCBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQoNCiNOaXZlbCAzLTg6DQoNCm5hbWVzKGVkdWNfMzgpIDwtIGFzLm1hdHJpeChlZHVjXzM4WzEsIF0pDQplZHVjXzM4IDwtIGVkdWNfMzhbLTEsIF0NCmVkdWNfMzhbXSA8LSBsYXBwbHkoZWR1Y18zOCwgZnVuY3Rpb24oeCkgdHlwZS5jb252ZXJ0KGFzLmNoYXJhY3Rlcih4KSkpDQoNCg0KDQoNCmVkdWMyMDM4IDwtIGVkdWNfMzggJT4lDQogIHNlbGVjdChDQ0FBLGAyMDE4YCxgMjAxOWAsIGAyMDIwYCklPiUNCiAgYXJyYW5nZShkZXNjKGAyMDIwYCkpDQoNCiN0YWJsYQ0KDQp0YWJsYTIwMzggPC0gZWR1YzIwMzggJT4lIGd0KCkNCnRhYmxhMjAzOCA8LSBndDo6Z3QoZWR1YzIwMzgpICU+JQ0KICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqTml2ZWwgZGUgZm9ybWFjacOzbiBhbGNhbnphZG8gcG9yIGxhIHBvYmxhY2nDs24gZGUgMTYgYSA2NCBhw7FvcyAoJSkqKiIpLA0KICAgICAgICAgICAgIHN1YnRpdGxlID0gbWQoIipOaXZlbCAzLTgqIikpICU+JQ0KICB0YWJfc291cmNlX25vdGUobWQoIkZ1ZW50ZTogZGF0b3MgZGUgW0lORV0oaHR0cHM6Ly93d3cuaW5lLmVzL3NzL1NhdGVsbGl0ZT9MPWVzX0VTJmM9SU5FU2VjY2lvbl9DJmNpZD0xMjU5OTQ5NDc3MDgyJnA9MTI1NDczNTExMDY3MiZwYWdlbmFtZT1Qcm9kdWN0b3NZU2VydmljaW9zJTJGUFlTTGF5b3V0JnBhcmFtMT1QWVNEZXRhbGxlRmljaGFJbmRpY2Fkb3ImcGFyYW0zPTEyNTk5Mzc0OTkwODQpIikpJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShtZCgiKipOaXZlbCAzLTgqKjoywqogZXRhcGEgZGUgZWR1Y2FjacOzbiBzZWN1bmRhcmlhIHkgcG9zdHNlY3VuZGFyaWEgbm8gc3VwZXJpb3IsIDHCuiB5IDLCuiBjaWNsbyBkZSBlZHVjYWNpw7NuIHN1cGVyaW9yIHkgZG9jdG9yYWRvIikpICU+JQ0KICBjb2xzX3dpZHRoKGNvbHVtbnMgPSBjKGAyMDIwYCkgfiBweCgxMDApKSAlPiUNCiAgdGFiX29wdGlvbnMoY29sdW1uX2xhYmVscy5ib3JkZXIuYm90dG9tLmNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgdGFibGVfYm9keS5ib3JkZXIuYm90dG9tLmNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgdGFibGVfYm9keS5obGluZXMuY29sb3IgPSAiYmxhY2siKSAlPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF9maWxsKGNvbG9yID0gInJlZCIpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gYDIwMjBgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gYDIwMjBgPCA1MCkpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGAyMDIwYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IGAyMDIwYDwgNTApKSAlPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF9maWxsKGNvbG9yID0gIm9yYW5nZSIpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gYDIwMjBgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gYDIwMjBgPiA1MCkpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGAyMDIwYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IGAyMDIwYCA+NTApKSU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX2ZpbGwoY29sb3IgPSAiZ3JlZW4iKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGAyMDIwYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IGAyMDIwYD4gNjApKSAlPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF90ZXh0KGNvbG9yID0gIndoaXRlIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBgMjAyMGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBgMjAyMGA+IDYwKSkNCnRhYmxhMjAzOA0KI1RyYW5zZm9ybWFuZG8gZGF0b3MNCg0KZWR1Y19tYXgzOCA8LSBlZHVjXzM4ICU+JQ0KICBhcnJhbmdlKGRlc2MoYDIwMjBgKSkgJT4lDQogIHNsaWNlX21heChgMjAyMGAsIG49MTApJT4lDQogIHBpdm90X2xvbmdlciguLCFDQ0FBLCB2YWx1ZXNfdG8gPSAicG9ibGFjaW9uIiwgbmFtZXNfdG8gPSAieWVhciIpICU+JQ0KICBmaWx0ZXIoYmV0d2Vlbih5ZWFyLDIwMTMsMjAyMCkpICU+JQ0KICBmaWx0ZXIoQ0NBQSAlaW4lIGMgKCJQYWlzIFZhc2NvIiwiTWFkcmlkLCBDb211bmlkYWQgZGUiLCAiQ29tdW5pdGF0IFZhbGVuY2lhbmEiKSkNCg0KI0dyYWZpY28gMw0KDQpncmFmaWNvX2VkdWNtYXgzOCA8LSBnZ3Bsb3QoZWR1Y19tYXgzOCwgYWVzKHllYXIsIHBvYmxhY2lvbiwgZmlsbCA9IENDQUEpKSArIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIsIHNpemUgPSA4LCBhbmdsZSA9IDkwLCBoanVzdCA9IDAuNSwgdmp1c3QgPSAwLjUpKSsNCiAgbGFicyh0aXRsZSA9ICJOaXZlbCBkZSBmb3JtYWNpw7NuIGFsY2FuemFkbyBwb3IgbGEgcG9ibGFjacOzbiBkZSAxNiBhIDY0IGHDsW9zICglKSIpKw0KICBsYWJzKHN1YnRpdGxlID0gIkNvbXBhcmFjacOzbiBkZSBsYSBDb211bml0YXQgVmFsZW5jaWFuYSBjb24gUGHDrXMgVmFzY28sIE1hZHJpZCAoTml2ZWwgMy04KSIpKw0KICBsYWJzKGNhcHRpb24gPSAiRGF0b3MgcHJvdmVuaWVudGVzIGRlbCBJTkUiKQ0KICANCmdyYWZpY29fZWR1Y21heDM4DQoNCiNUcmFuc2Zvcm1hbmRvIGRhdG9zDQoNCmVkdWNfY3YzOCA8LSBlZHVjXzM4ICU+JQ0KICBhcnJhbmdlKGRlc2MoYDIwMjBgKSkgJT4lDQogIHNsaWNlX21pbihgMjAyMGAsIG49MTUpJT4lDQogIHBpdm90X2xvbmdlciguLCFDQ0FBLCB2YWx1ZXNfdG8gPSAicG9ibGFjaW9uIiwgbmFtZXNfdG8gPSAieWVhciIpICU+JQ0KICBmaWx0ZXIoYmV0d2Vlbih5ZWFyLDIwMTMsMjAyMCkpICU+JQ0KICBmaWx0ZXIoQ0NBQSAlaW4lIGMgKCJBbmRhbHVjaWEiLCJNdXJjaWEsIFJlZ2lvbiBkZSIsICJDb211bml0YXQgVmFsZW5jaWFuYSIsICJCYWxlYXJzLCBJbGxlcyIpKQ0KI0dyYWZpY28gNA0KDQpncmFmaWNvX2VkdWNtaW4zOCA8LSBnZ3Bsb3QoZWR1Y19jdjM4LCBhZXMoeWVhciwgcG9ibGFjaW9uLCBmaWxsID0gQ0NBQSkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDgsIGFuZ2xlID0gOTAsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAuNSkpKw0KICBsYWJzKHRpdGxlID0gIk5pdmVsIGRlIGZvcm1hY2nDs24gYWxjYW56YWRvIHBvciBsYSBwb2JsYWNpw7NuIGRlIDE2IGEgNjQgYcOxb3MgKCUpIikrDQogIGxhYnMoc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGxhIENvbXVuaXRhdCBWYWxlbmNpYW5hIGNvbiBBbmRhbHVjw61hLCBJc2xhcyBCYWxlYXJlcywgTXVyY2lhIChOaXZlbCAzLTgpIikrDQogIGxhYnMoY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIElORSIpDQoNCmdyYWZpY29fZWR1Y21pbjM4DQpgYGANCg0KPGJyPg0KPGJyPg0KDQpMYSBDb211bmlkYWQgQXV0w7Nub21hIGNvbiBtYXlvciBuaXZlbCBkZSBlZHVjYWNpw7NuIGRlIHN1IHBvYmxhY2nDs24gZXMgZWwgUGHDrXMgVmFzY28gY29uIHVuIHRvdGFsIGRlIDczLDglLCBhdW1lbnRhbmRvIHN1cyBkYXRvcyBjYWRhIGHDsW8uIExhIHNpdHVhY2nDs24gZGUgbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEgZXMgaW50ZXJtZWRpYSwgYXVucXVlIHN1IGRhdG8gZXMgcG9zaXRpdm8geWEgcXVlIG3DoXMgZGVsIDUwJSBkZSBzdSBwb2JsYWNpw7NuICh1biA2MSw1JSkgdGllbmUgdW5hIGZvcm1hY2nDs24gZWxldmFkYSBsbyBxdWUgcG9kcsOtYSBsbGVnYXIgYSB1biBhdW1lbnRvIGVuIHN1IGNhbGlkYWQgZGUgdmlkYS4gIA0KDQogPGJyPg0KDQpFbiBjb21wYXJhY2nDs24gY29uIGxhcyBtZWpvcmVzIENvbXVuaWRhZGVzIEF1dMOzbm9tYXMgZW4gY3VhbnRvIGEgZm9ybWFjacOzbiBlZHVjYXRpdmEsIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIHNlIGVuY3VlbnRyYSBtdXkgbGVqb3MgZGUgTWFkcmlkIHkgZGVsIFBhw61zIFZhc2NvLiBBdW5xdWUsIGhheSBxdWUgZGVzdGFjYXIgcXVlIGVsIG5pdmVsIGRlIGZvcm1hY2nDs24gaGEgdGVuaWRvIHVuYSBldm9sdWNpw7NuIGNyZWNpZW50ZSBkdXJhbnRlIGVsIHRpZW1wby4gIA0KDQogDQo8YnI+DQogDQoNCkVuIGNvbmNsdXNpw7NuLCBzZSBwb2Ryw61hIGNvbnNpZGVyYXIgcXVlIGVsIG5pdmVsIGVkdWNhdGl2byBlbiBsYSBDb211bmlkYWQgVmFsZW5jaWFuYSBlcyBlbGV2YWRvIHlhIHF1ZSBtw6FzIGRlbCA1MCUgZGUgc3UgcG9ibGFjacOzbiB0aWVuZSBlc3R1ZGlvcyBkZSBuaXZlbCAzLTguIEF1bnF1ZSwgdGllbmUgdW5hIGdyYW4gZGlmZXJlbmNpYSBjb24gbGFzIG1lam9yZXMgQ29tdW5pZGFkZXMgQXV0w7Nub21hcy48YnI+IDxicj4NCg0KIyMgNC40IE5JVkVMIERFIEFCQU5ET05PIEVTQ09MQVINCg0KVW5vIGRlIGxvcyBhc3BlY3RvcyBpbXBvcnRhbnRlcyBhIHRlbmVyIGVuIGN1ZW50YSBlcyBlbCBhYmFuZG9ubyBlc2NvbGFyLiBFbCBhYmFuZG9ubyBlc2NvbGFyIHN1cG9uZSBxdWUgdW4gaW5kaXZpZHVvIGNhcmV6Y2EgZGUgZWR1Y2FjacOzbiwgY29uIHN1cyBjb3JyZXNwb25kaWVudGVzIGNvbnNlY3VlbmNpYXMgZW4gbGEgY2FsaWRhZCBkZSB2aWRhLiBTaSBhbnRlcyBkZWPDrWFtb3MgcXVlIGNvbiB1bm9zIGVzdHVkaW9zIGVsZXZhZG9zLCBzZSBjb25zZWd1w61hIGF1bWVudGFyIGxhcyBwb3NpYmlsaWRhZGVzIGRlIG1heW9yIGVtcGxlbywgbWF5b3Igc2FsdWQsIGV0Yywgc2kgdW4gaW5kaXZpZHVvIGFiYW5kb25hIHN1IGZvcm1hY2nDs24gc2UgdmVyw6EgcHJpdmFkbyBkZSBlc3RhcyBwb3NpYmlsaWRhZGVzIGRlIG1lam9yYXIgc3UgY2FsaWRhZCBkZSB2aWRhLiAgPGJyPg0KDQpFcyBwb3IgZWxsbyBxdWUgcGFyYSB1bmEgc29jaWVkYWQgZXMgbXV5IGltcG9ydGFudGUgbWFudGVuZXIgYSBsb3MgasOzdmVuZXMgZW4gZWwgw6FtYml0byBlZHVjYXRpdm8gcGFyYSBxdWUgcHVlZGFuIGRlc2Fycm9sbGFyIHN1cyBoYWJpbGlkYWRlcyBlIGludGVncmFyc2UgbWVqb3IgeSBjb25zZWd1aXIgdGFudG8gcmVzdWx0YWRvcyBwb3NpdGl2b3MgcGFyYSBlbCBwcm9waW8gaW5kaXZpZHVvLCBjb21vIG9mcmVjZXIgYmVuZWZpY2lvcyBhIGxhIHNvY2llZGFkLiA8YnI+DQoNCiANCg0KTG9zIGRhdG9zIGRlIGFiYW5kb25vIGVzY29sYXIgZXN0dWRpYW4gYSBsb3MgaW5kaXZpZHVvcyBlbnRyZSAxOCBhIDI0IGHDsW9zIHF1ZSBubyBoYSBjb21wbGV0YWRvIGxhIDLCqiBldGFwYSBkZSBzZWN1bmRhcmlhLiAgDQo8YnI+DQpFbiBlbCBzaWd1aWVudGUgZ3LDoWZpY28gb2JzZXJ2YW1vcyBsb3MgZGF0b3MgZGUgYWJhbmRvbm8gZXNjb2xhciBlbiBsYXMgQ29tdW5pZGFkZXMgQXV0w7Nub21hcyBkdXJhbnRlIGVsIGHDsW8gMjAyMC4gTGFzIHpvbmFzIGRvbmRlIGVsIGFiYW5kb25vIGVzIG1heW9yIHNvbiBlbiBDZXV0YSAoMjUsNSUpIHkgZW4gTWVsaWxsYSAoMjIsOCUpLiBSZXNwZWN0byBhIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLCBzZSBlbmN1ZW50cmEgZGVudHJvIGRlIGxhIG1lZGlhIGRlIEVzcGHDsWEsIHkgdGllbmUgdW4gMTUlIGRlIHBvYmxhY2nDs24gZW50cmUgMTggeSAyNCBhw7FvcyBxdWUgYWJhbmRvbmEgc3VzIGVzdHVkaW9zLiANCg0KPGJyPg0KDQpgYGB7ciAsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCg0KI1BhcnRlIGRlbCBhYmFuZG9ubyBlc2NvbGFyDQoNCg0KbmFtZXMoYWJhbmRvbm8pIDwtIGFzLm1hdHJpeChhYmFuZG9ub1sxLCBdKQ0KYWJhbmRvbm8gPC0gYWJhbmRvbm9bLTEsIF0NCmFiYW5kb25vW10gPC0gbGFwcGx5KGFiYW5kb25vLCBmdW5jdGlvbih4KSB0eXBlLmNvbnZlcnQoYXMuY2hhcmFjdGVyKHgpKSkNCg0KDQoNCmFiYW5kb25vX2N2IDwtIGFiYW5kb25vICU+JQ0KICBhcnJhbmdlKGRlc2MoYDIwMjBgKSkgJT4lDQogIHBpdm90X2xvbmdlciguLCFDQ0FBLCB2YWx1ZXNfdG8gPSAicG9ibGFjaW9uIiwgbmFtZXNfdG8gPSAieWVhciIpICAlPiUNCiAgZmlsdGVyKENDQUEgJWluJSBjICgiQ29tdW5pdGF0IFZhbGVuY2lhbmEiKSkNCg0KYWJhbmRvbm9fY3YkcG9ibGFjaW9uIDwtIGFzLm51bWVyaWMoZ3N1YigiLCIsIi4iLCBnc3ViKCJcXC4iLCIiLCBhYmFuZG9ub19jdiRwb2JsYWNpb24pKSkNCmFiYW5kb25vX2N2JHBvYmxhY2lvbiA8LSBhcy5udW1lcmljKGFiYW5kb25vX2N2JHBvYmxhY2lvbikNCg0KYWJhbmRvbm9fY3YkeWVhciA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCIuIiwgZ3N1YigiXFwuIiwiIiwgYWJhbmRvbm9fY3YkeWVhcikpKQ0KYWJhbmRvbm9fY3YkeWVhciA8LSBhcy5udW1lcmljKGFiYW5kb25vX2N2JHllYXIpDQoNCg0KYWJhbmRvbm9fY2NhYSA8LSBhYmFuZG9ubyAlPiUNCiAgYXJyYW5nZShgMjAyMGApICU+JQ0KICBwaXZvdF9sb25nZXIoLiwgIUNDQUEsIHZhbHVlc190byA9ICJwb2JsYWNpb24iLCBuYW1lc190byA9ICJ5ZWFyIikgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMjApDQogIA0KYWJhbmRvbm9fY2NhYSRwb2JsYWNpb24gPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwiLiIsIGdzdWIoIlxcLiIsIiIsIGFiYW5kb25vX2NjYWEkcG9ibGFjaW9uKSkpDQphYmFuZG9ub19jY2FhJHBvYmxhY2lvbiA8LSBhcy5udW1lcmljKGFiYW5kb25vX2NjYWEkcG9ibGFjaW9uKQ0KDQoNCiNHcmFmaWNvIGJ1ZW5vDQpnX2FiYW4gPC0gZ2dwbG90KGFiYW5kb25vX2NjYWEsIGFlcyh4PUNDQUEsIHk9cG9ibGFjaW9uKSkgKw0KICBnZW9tX3NlZ21lbnQoIGFlcyh4PUNDQUEsIHhlbmQ9Q0NBQSwgeT0wLCB5ZW5kPXBvYmxhY2lvbikpICsNCiAgZ2VvbV9wb2ludCggc2l6ZT01LCBjb2xvcj0icmVkIiwgZmlsbD1hbHBoYSgib3JhbmdlIiwgMC4zKSwgYWxwaGE9MC43LCBzaGFwZT0yMSwgc3Ryb2tlPTIpICsNCiAgdGhlbWVfbGlnaHQoKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpDQogICkrDQogIGxhYnModGl0bGUgPSAiRGF0b3MgYWJhbmRvbm8gZXNjb2xhciBlbiBsYXMgQ29tdW5pZGFkZXMgQXV0b25vbWFzIikrDQogIGxhYnMoc3VidGl0bGUgPSAiQcOxbyAyMDIwIikrDQogIGxhYnMoY2FwdGlvbiA9ICJEYXRvcyAoZW4gJSkgcHJvdmVuaWVudGVzIGRlbCBJTkUiKQ0KDQpnX2FiYW4NCmBgYA0KPGJyPjxicj4NCg0KDQojIDUuIE9UUk9TIElORElDQURPUkVTDQoNCjxicj4NCg0KIyMgNS4xIFBPQkxBQ0nDk04gUVVFIFNVRlJFIFBST0JMRU1BUyBERSBSVUlET1MgUFJPRFVDSURPUyBQT1IgVkVDSU5PUyBPIERFTCBFWFRFUklPUg0KDQo8YnI+DQpMYSBjb250YW1pbmFjacOzbiBhY8O6c3RpY2Egc2UgZGVmaW5lIGNvbW8gZWwgZXhjZXNvIGRlIHJ1aWRvIGFtYmllbnRhbCB5IGFmZWN0YSBhIGxhIHNhbHVkIGRlIGxhcyBwZXJzb25hcyAoZXN0csOpcywgcMOpcmRpZGEgZGUgbGEgYXVkaWNpw7NuLCB0cmFzdG9ybm9zIGRlbCBzdWXDsW8pIHkgcG9yIHRhbnRvIGEgc3UgY2FsaWRhZCBkZSB2aWRhLg0KDQpBIHBhcnRpciBkZSBlc3RlIGdyw6FmaWNvIHNlIG11ZXN0cmEgZWwgcG9yY2VudGFqZSBkZSBwZXJzb25hcyBxdWUgdGllbmVuIGxhIHZpdmllbmRhIGNvbiBwcm9ibGVtYXMgZGUgcnVpZG9zIHByb2R1Y2lkb3MgcG9yIGxvcyB2ZWNpbm9zIG8gcHJvY2VkZW50ZXMgZGVsIGV4dGVyaW9yICh0csOhZmljbywgbmVnb2Npb3MsIGbDoWJyaWNhcyBjb2xpbmRhbnRlcykuDQoNClBhcmEgYW5hbGl6YXIgbGEgc2l0dWFjacOzbiBkZSBsYSBDb211bmlkYWQgVmFsZW5jaWFuYSBtb3N0cmFtb3MgZG9zIGdyw6FmaWNvcyBlbiBlbCBxdWUgc2UgZGlmZXJlbmNpYW4gbGFzIENvbXVuaWRhZGVzIEF1dMOzbm9tYXMgY29uIG3DoXMgcG9yY2VudGFqZSBkZSBwb2JsYWNpw7NuIHF1ZSBzdWZyZSBydWlkb3MgZnJlbnRlIGEgbGFzIENvbXVuaWRhZGVzIG1lbm9zIGFmZWN0YWRhcw0KPGJyPg0KYGBge3IgR3LDoWZpY28gcnVpZG9zICxlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQoNCm5hbWVzKHJ1aWRvcykgPC0gYXMubWF0cml4KHJ1aWRvc1sxLCBdKQ0KcnVpZG9zIDwtIHJ1aWRvc1stMSwgXQ0KcnVpZG9zW10gPC0gbGFwcGx5KHJ1aWRvcywgZnVuY3Rpb24oeCkgdHlwZS5jb252ZXJ0KGFzLmNoYXJhY3Rlcih4KSkpDQoNCg0KDQpuYW1lcyhydWlkb3MpID0gYygiQ0NBQSIsICIyMDA0IiwgIjIwMDUiLCAiMjAwNiIsICIyMDA3IiwgIjIwMDgiLCAiMjAwOSIsICIyMDEwIiwgIjIwMTEiLCAiMjAxMiIsICIyMDEzIiwgIjIwMTQiLCAiMjAxNSIsICIyMDE2IiwgIjIwMTciLCAiMjAxOCIsICIyMDE5IiwgIjIwMjAiKQ0KIyBDYW1iaW8gZWwgbm9tYnJlIGRlIGxhcyBjb2x1bW5hcyBwYXJhIHF1ZSBsYSBwcmltZXJhICBjb2x1bW5hIHNlIGxsYW1lIGNjQUEgeSBwb2RhbW9zIHBhc2FyIGEgZm9ybWF0byBMT05HDQoNCg0KZGZfbG9uZzUgPC0gcnVpZG9zICU+JSBwaXZvdF9sb25nZXIoY29scz0yOjE4ICwgbmFtZXNfdG89ICJBw7FvcyIsIHZhbHVlc190byA9ICJwb3JjZW50X3BvYl9ydWlkb3MiKSANCmRmX2xvbmdfNV8yIDwtIGRmX2xvbmc1ICU+JSBmaWx0ZXIoQcOxb3MgPT0gMjAyMCkNCiMgUGFzYW1vcyBkZWwgZm9ybWF0byB3aWRlIGFsIGZvcm1hdG8gbG9uZw0KZGZfbG9uZ181XzIkcG9yY2VudF9wb2JfcnVpZG9zIDwtIGFzLm51bWVyaWMoZ3N1YigiLCIsICIuIiwgZ3N1YigiXFwuIiwgIiIsIGRmX2xvbmdfNV8yJHBvcmNlbnRfcG9iX3J1aWRvcykpKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygiZ2d0aGVtZXMiKQ0KDQoNCiMgNCBjb211bmlkYWRlcyBjb24gbWFzIHJ1aWRvDQptYXNfcnVpZG88LSBkZl9sb25nXzVfMiAlPiUgZmlsdGVyKENDQUEgJWluJSBjKCJDZXV0YSIsICJNdXJjaWEiLA0KIkNhbmFyaWFzIiwgIk1lbGlsbGEiLCAiQ1ZhbGVuY2lhbmEiKSkNCg0KcnVpZG8xIDwtIGdncGxvdChtYXNfcnVpZG8sIGFlcyhDQ0FBLHBvcmNlbnRfcG9iX3J1aWRvcykpKyBnZW9tX2NvbCgpKyBsYWJzKHRpdGxlID0gIkNDQUEgQ09OIE1BUyBSVUlET1MiLCBzdWJ0aXRsZSA9ICIlIHBvYmxhY2lvbiBzdWZyZSBydWlkb3MgcG9yIENDQUEiLCB4ID0gIkNDQUEiLCB5ID0gIiUgcG9ibGFjaW9uIHJ1aWRvcyIpKyANCiAgdGhlbWVfc29sYXJpemVkKCkgDQoNCg0KIyA0IGNvbXVuaWRhZGVzIGNvbiBtZW5vcyBydWlkbw0KDQptZW5vc19ydWlkbzwtIGRmX2xvbmdfNV8yICU+JSBmaWx0ZXIoQ0NBQSAlaW4lIGMoIkdhbGljaWEiLCAiQ2FzdGlsbGFMZW9uIiwNCiJDYXN0aWxsYUxhTWFuY2hhIiwgIkV4dHJlbWFkdXJhIikpDQoNCnJ1aWRvMiA8LSBnZ3Bsb3QobWVub3NfcnVpZG8sIGFlcyhDQ0FBLHBvcmNlbnRfcG9iX3J1aWRvcykpKyANCiAgZ2VvbV9jb2woKSsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMjUpLCBicmVha3MgPSBzZXEoMCwgMjUsIGJ5ID0gNSkpICsgbGFicyh0aXRsZSA9ICJDQ0FBIENPTiBNRU5PUyBSVUlET1MiLCBzdWJ0aXRsZSA9ICIlIHBvYmxhY2lvbiBzdWZyZSBydWlkb3MgcG9yIENDQUEiLCB4ID0gIkNDQUEiLCB5ID0gIiUgcG9ibGFjaW9uIHJ1aWRvcyIpKyANCiAgdGhlbWVfc29sYXJpemVkKCkgDQoNCg0KcnVpZG8xIA0KcnVpZG8yDQoNCmBgYA0KPGJyPg0KDQpDb21vIGRhdG8gYSAqKm5pdmVsIG5hY2lvbmFsKiosIGVuIGVsIGHDsW8gMjAyMCB1biAqKjIxLDklKiogZGUgcGVyc29uYXMgZGVjbGFyYWJhIHByb2JsZW1hcyBkZSBydWlkb3MgcHJvZHVjaWRvcyBwb3IgdmVjaW5vcyBvIGRlbCBleHRlcmlvciwgeSBjb21vIHBvZGVtb3Mgb2JzZXJ2YXIgZW4gbG9zIGdyw6FmaWNvcywgbGEgKipDb211bmlkYWQgVmFsZW5jaWFuYSoqIHNlIGVuY3VlbnRyYSB1biBwb2NvIGFsZWphZGEgZGUgbGFzIDQgQ29tdW5pZGFkZXMgbcOhcyBhZmVjdGFkYXMgcG9yIHJ1aWRvcywgcGVybyBzZSBlbmN1ZW50cmEgcG9yIGVuY2ltYSBkZWwgdG90YWwgbmFjaW9uYWwgY29uIHVuICoqMjYlKiogZGUgbGEgcG9ibGFjacOzbiBhZmVjdGFkYSBwb3IgcnVpZG9zLg0KPGJyPiA8YnI+DQoNCiMjIDUuMiBERUxJTkNVRU5DSUEgTyBWQU5EQUxJU01PIEVOIExBIFpPTkENCg0KTGEgc2VndXJpZGFkIGbDrXNpY2EgeSBsYSBjb21vZGlkYWQgZGUgcG9kZXIgcmVhbGl6YXIgY3VhbHF1aWVyIGFjdGl2aWRhZCBlcyBtdXkgaW1wb3J0YW50ZSBwYXJhIGxvcyBpbmRpdmlkdW9zIHkgYWZlY3RhIGRpcmVjdGFtZW50ZSBhIHN1IGJpZW5lc3Rhci4gTGFzIGNvbmRpY2lvbmVzIGRlbCBlbnRvcm5vIGVuIGVsIHF1ZSBzZSBlbmN1ZW50cmFuIGxhcyBwZXJzb25hcyBsbGVnYSBhIHNlciBpbXBvcnRhbnRlIHBhcmEgbWVkaXIgc3UgY2FsaWRhZCBkZSB2aWRhLiBFcyBwb3IgZWxsbyBxdWUgdmFtb3MgYSBjb21wcm9iYXIgY3XDoWwgZXMgZWwgbml2ZWwgZGUgZGVsaW5jdWVuY2lhIG8gdmFuZGFsaXNtbyBlbiBsYXMgZGlzdGludGFzIENvbXVuaWRhZGVzIEF1dMOzbm9tYXMuIDxicj4NCg0KIyMjIDUuMi4xIERBVE9TIEVOIExBUyBDT01VTklEQURFUyBBVVTDk05PTUFTDQoNCkVuIGVzdGEgdGFibGEgcG9kZW1vcyB2ZXIgY29tbyBsYSB6b25hIGNvbiBtYXlvciBwb3JjZW50YWplIGRlIGRlbGluY3VlbmNpYSBlcyBNZWxpbGxhIGNvbiB1biAzNSw1JS4gUG9yIGxvIHF1ZSByZXNwZWN0YSBhIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLCBzZSBlbmN1ZW50cmEgZW4gdW5vcyBwdWVzdG9zIGJham9zIHkgY29uIHVuIMOtbmRpY2UgcmVsYXRpdmFtZW50ZSBwZXF1ZcOxbywgZGUgdW4gNyw3JS4NCg0KPGJyPg0KDQpgYGB7ciAsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCg0KDQpkZWxpbmN1ZW5jaWEkVG90YWwgPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwiLiIsIGdzdWIoIlxcLiIsIiIsIGRlbGluY3VlbmNpYSRUb3RhbCkpKQ0KZGVsaW5jdWVuY2lhJFRvdGFsPC0gYXMubnVtZXJpYyhkZWxpbmN1ZW5jaWEkVG90YWwpDQoNCmRlbGluX2NjYWEgPC0gZGVsaW5jdWVuY2lhICU+JQ0KICBmaWx0ZXIoIHBlcmlvZG8gPT0gMjAyMCklPiUNCiAgYXJyYW5nZShkZXNjKFRvdGFsKSklPiUNCiAgc2VsZWN0KGBDb211bmlkYWRlcyB5IENpdWRhZGVzIEF1dMOzbm9tYXNgLCBUb3RhbCkNCg0KI1RhYmxhIERhdG9zDQoNCmRlbF9jY2FhIDwtIGRlbGluX2NjYWEgJT4lIGd0KCkNCmRlbF9jY2FhIDwtIGd0OjpndChkZWxpbl9jY2FhKSAlPiUNCiAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKkRlbGluY3VlbmNpYSBlbiBsYXMgQ29tdW5pZGFkZXMgQXV0b25vbWFzLiBBw7FvIDIwMjAqKiIpLA0KICAgICAgICAgICAgIHN1YnRpdGxlID0gbWQoIipFbiAlKiIpKSAlPiUNCiAgdGFiX3NvdXJjZV9ub3RlKG1kKCJGdWVudGU6IGRhdG9zIGRlIFtJTkVdKGh0dHBzOi8vd3d3LmluZS5lcy9qYXhpL0RhdG9zLmh0bT9wYXRoPS90MDAvSUNWX2FudC9kaW02LyZmaWxlPTYxMjAxLnB4KSIpKSU+JQ0KICBjb2xzX3dpZHRoKGNvbHVtbnMgPSBjKFRvdGFsKSB+IHB4KDgwKSkgJT4lDQogIHRhYl9vcHRpb25zKGNvbHVtbl9sYWJlbHMuYm9yZGVyLmJvdHRvbS5jb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIHRhYmxlX2JvZHkuYm9yZGVyLmJvdHRvbS5jb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIHRhYmxlX2JvZHkuaGxpbmVzLmNvbG9yID0gImJsYWNrIikgJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfZmlsbChjb2xvciA9ICJvbGl2ZWRyYWIxIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsID4gMikpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IFRvdGFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gVG90YWwgPiAyKSklPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF9maWxsKGNvbG9yID0gImNoYXJ0cmV1c2UyIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsID4gNS41KSkgJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfdGV4dChjb2xvciA9ICJ3aGl0ZSIpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gVG90YWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBUb3RhbCA+IDUuNSkpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX2ZpbGwoY29sb3IgPSAiY2hhcnRyZXVzZTMiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IFRvdGFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gVG90YWwgPiA3LjUpKSAlPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF90ZXh0KGNvbG9yID0gIndoaXRlIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsID4gNy41KSklPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF9maWxsKGNvbG9yID0gImdvbGQzIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsID4gMTApKSAlPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF90ZXh0KGNvbG9yID0gIndoaXRlIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsID4gMTApKSAlPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF9maWxsKGNvbG9yID0gImdvbGQiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IFRvdGFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gVG90YWwgPiAxNSkpICU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IFRvdGFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gVG90YWwgPiAxNSkpJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfZmlsbChjb2xvciA9ICJnb2xkIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsID4gMjApKSAlPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF90ZXh0KGNvbG9yID0gIndoaXRlIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsID4gMjApKSU+JQ0KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX2ZpbGwoY29sb3IgPSAiZmlyZWJyaWNrMyIpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gVG90YWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBUb3RhbCA+IDI1KSkgJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfdGV4dChjb2xvciA9ICJ3aGl0ZSIpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gVG90YWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBUb3RhbCA+IDI1KSkgJT4lDQogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfZmlsbChjb2xvciA9ICJmaXJlYnJpY2sxIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsID4gMzApKSAlPiUNCiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF90ZXh0KGNvbG9yID0gIndoaXRlIiksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBUb3RhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IFRvdGFsID4gMzApKQ0KZGVsX2NjYWENCg0KDQojVG9wIGRlbGluY3VlbmNpYQ0KDQpkZWxpbl90b3AgPC0gZGVsaW5jdWVuY2lhICU+JQ0KICBmaWx0ZXIoYENvbXVuaWRhZGVzIHkgQ2l1ZGFkZXMgQXV0w7Nub21hc2AgJWluJSBjICgiTWVsaWxsYSIsICJDZXV0YSIsICJNdXJjaWEsIFJlZ2nDs24gZGUiLCAiQ2FuYXJpYXMiLCAiQ2F0YWx1w7FhIikpJT4lDQogIGZpbHRlcihiZXR3ZWVuIChwZXJpb2RvLCAyMDEwLDIwMjApKQ0KDQpwX3RvcCA8LSBkZWxpbl90b3AgJT4lDQogIGdncGxvdCggYWVzKHg9cGVyaW9kbywgeT1Ub3RhbCwgZ3JvdXA9IGBDb211bmlkYWRlcyB5IENpdWRhZGVzIEF1dMOzbm9tYXNgLCBjb2xvcj1gQ29tdW5pZGFkZXMgeSBDaXVkYWRlcyBBdXTDs25vbWFzYCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZ3RpdGxlKCJUb3AgNSBDQ0FBIC0gRGVsaW5jdWVuY2lhIikgKw0KICB5bGFiKCIlIGRlIHBvYmxhY2nDs24gdG90YWwiKSArDQogIHRyYW5zaXRpb25fcmV2ZWFsKHBlcmlvZG8pKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gc2VxKDIwMTAsIDIwMjAsIGJ5ID0gNCkpICsNCiAgdGhlbWVfc29sYXJpemVkKCkNCnBfdG9wDQoNCiNUb3AgbWVub3MgZGVsaW5jdWVuY2lhDQoNCmRlbGluX3RvcG1lbm9zIDwtIGRlbGluY3VlbmNpYSAlPiUNCiAgZmlsdGVyKGBDb211bmlkYWRlcyB5IENpdWRhZGVzIEF1dMOzbm9tYXNgICVpbiUgYyAoIkNhbnRhYnJpYSIsICJSaW9qYSwgTGEiLCAiQXN0dXJpYXMsIFByaW5jaXBhZG8gZGUiLCAiTmF2YXJyYSwgQ29tdW5pZGFkIEZvcmFsIGRlIiwgIkdhbGljaWEiKSklPiUNCiAgZmlsdGVyKGJldHdlZW4gKHBlcmlvZG8sIDIwMTAsMjAyMCkpDQoNCnBfbWluIDwtIGRlbGluX3RvcG1lbm9zICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PXBlcmlvZG8sIHk9VG90YWwsIGdyb3VwPSBgQ29tdW5pZGFkZXMgeSBDaXVkYWRlcyBBdXTDs25vbWFzYCwgY29sb3I9YENvbXVuaWRhZGVzIHkgQ2l1ZGFkZXMgQXV0w7Nub21hc2ApKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2d0aXRsZSgiVG9wIDUgQ0NBQSAtIENvbiBtZW5vcyBEZWxpbmN1ZW5jaWEiKSArDQogIHRoZW1lX3NvbGFyaXplZCgpICsNCiAgeWxhYigiJSBkZSBwb2JsYWNpw7NuIHRvdGFsIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gc2VxKDIwMTAsIDIwMjAsIGJ5ID0gNCkpICsgdHJhbnNpdGlvbl9yZXZlYWwocGVyaW9kbykNCg0KcF9taW4NCg0KYGBgDQo8YnI+PGJyPg0KDQojIyMgNS4yLjIgREFUT1MgRU4gTEEgQ09NVU5JREFEIFZBTEVOQ0lBTkENCg0KUGFyYSBjb25jbHVpciBjb21vIGhhIGV2b2x1Y2lvbmFkbyBsb3MgZGF0b3MgZW4gbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEsIHBvZGVtb3Mgb2JzZXJ2YXIgY29tbyBlbiBlbCBwZXJpb2RvIDIwMDUtMjAxMCwgbGEgZGVsaW5jdWVuY2lhIGVyYSBiYXN0YW50ZSBlbGV2YWRhIGxsZWdhbmRvIGEgZXN0YXIgZW4gdW4gMjUlLiBQZXJvLCBsYSB0ZW5kZW5jaWEgZGUgZXN0ZSBkYXRvIGhhIHNpZG8gZGVjcmVjaWVudGUgeSBlc3RvIGVzIGJhc3RhbnRlIHBvc2l0aXZvIHBhcmEgbGEgY2FsaWRhZCBkZSB2aWRhIGRlIGxhIHBvYmxhY2nDs24gZGUgbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEgDQoNCjxicj4NCmBgYHtyICwgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KDQojRGVsaW5jdWVuY2lhIENWDQoNCmRlbGluX2N2IDwtIGRlbGluY3VlbmNpYSAlPiUNCiAgZmlsdGVyKGBDb211bmlkYWRlcyB5IENpdWRhZGVzIEF1dMOzbm9tYXNgICVpbiUgYyAoIkNvbXVuaXRhdCBWYWxlbmNpYW5hIikpDQoNCiNHcmFmaWNvIGRlbGluY3VlbmNpYSBDVg0KDQpwX2RlbGN2IDwtIGRlbGluX2N2ICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PXBlcmlvZG8sIHk9VG90YWwsIGdyb3VwPSBgQ29tdW5pZGFkZXMgeSBDaXVkYWRlcyBBdXTDs25vbWFzYCwgY29sb3I9YENvbXVuaWRhZGVzIHkgQ2l1ZGFkZXMgQXV0w7Nub21hc2ApKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2d0aXRsZSgiRGVsaW5jdWVuY2lhIGVuIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIikgKw0KICB0aGVtZV9pcHN1bSgpICsNCiAgeWxhYigiJSBkZSBwb2JsYWNpw7NuIHRvdGFsIikgKw0KICB0cmFuc2l0aW9uX3JldmVhbChwZXJpb2RvKSANCg0KcF9kZWxjdg0KDQpgYGANCjxicj48YnI+DQoNCiMgNi4gw41ORElDRSBERSBCVUVOQSBWSURBDQo8YnI+DQoNCkEgbG8gbGFyZ28gZGVsIHRyYWJham8gbm9zIGhlbW9zIHBsYW50ZWFkbyBhbGdvIHF1ZSB2b3NvdHJvcyB0YW1iacOpbiBzZWd1cmFtZW50ZSBvcyBoYWLDqWlzIHByZWd1bnRhZG8sIMK/RMOzbmRlIHJlYWxtZW50ZSBzZSBzaXTDumEgbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEgZW4gY29tcGFyYWNpw7NuIGNvbiBsYXMgb3RyYXMgQ29tdW5pZGFkZXMgQXV0w7Nub21hcz8gIFlhIHF1ZSBlc3RlIGVzIGVsIG9iamV0aXZvIGZpbmFsIHkgbGEgcmF6w7NuIGRlIHNlciBkZSBlc3RlIHRyYWJham8uDQpFc3RhIGVzIGxhIHJhesOzbiBwb3IgbGEgY3VhbCBoZW1vcyBjcmVhZG8gbnVlc3RybyBwcm9waW8gw41uZGljZTog4oCcVW5hIFZpZGEgTWVqb3LigJ0gwq4uIDxicj4NCk5vcyBoZW1vcyBiYXNhZG8vaW5zcGlyYWRvIGVuIGVsIOKAnEJldHRlciBMaWZlIEluZGV44oCdIGRlIGxhIE9DREUgcXVlIHN1cmdlIGNvbW8gdW5hIGZvcm1hIGFsdGVybmF0aXZhIGRlIGNvbXBhcmFyIGVsIGJpZW5lc3RhciBlbnRyZSBkaXN0aW50b3MgcGHDrXNlcywgZW4gbHVnYXIgZGVsIFByb2R1Y3RvIEludGVyaW9yIEJydXRvLiBFbCDDjW5kaWNlIGxvIGhlbW9zIGJhc2FkbyBlbiBsYSBtYXlvcsOtYSBkZSBsb3MgaW5kaWNhZG9yZXMgcXVlIGhlbW9zIGlkbyBhbmFsaXphbmRvIHkgcmVwcmVzZW50YW5kbyBncsOhZmljYW1lbnRlIGR1cmFudGUgbnVlc3RybyB0cmFiYWpvLiA8YnI+DQpIZW1vcyBpbmNsdWlkbyBlbiBudWVzdHJvIMONbmRpY2UgdmFyaWFibGVzIGRlIHRvZG8gdGlwbywgdGFudG8gb2JqZXRpdm9zIHkgc3ViamV0aXZvcy4gRXN0byBub3MgcGVybWl0ZSByZWFsaXphciB1biBhbsOhbGlzaXMgZXhoYXVzdGl2byBjdWFudGl0YXRpdm8geSBjdWFsaXRhdGl2byB0b21hbmRvIGVuIGNvbnNpZGVyYWNpw7NuIGRhdG9zIOKAnHB1cm9z4oCdIChjb21vIHZhbG9yZXMgbW9uZXRhcmlvcykgeSBkYXRvcyDigJxwZXJzb25hbGVz4oCdIChjb21vIGxhIHNhdGlzZmFjY2nDs24gcGVyc29uYWwgY29uIHVuIHRlbWEpLiBFbiBudWVzdHJvIGNhc28gaGVtb3MgY29uc2lkZXJhZG8gdW4gcGVzbyBpZ3VhbCBkZSBsYXMgNCBjYXRlZ29yw61hcyBwYXJhIHF1ZSBlbCByZXN1bHRhZG8gbm8gcHJlc2VudGUgbmluZ8O6biBzZXNnbyBhIGZhdm9yIGRlIGNpZXJ0YXMgdmFyaWFibGVzLiA8YnI+DQpFbCDDrW5kaWNlIGxvIGhlbW9zIGNyZWFkbyBtZWRpYW50ZSB1bmEgZnVuY2nDs24gZGUgbm9ybWFsaXphY2nDs24gY29uIHVuYSBlc2NhbGEgZGUgMCBhIDEsIHNpZW5kbyAwIGVsIHZhbG9yIG3DoXMgcGVxdWXDsW8geSAxIGVsIHZhbG9yIG3DoXMgZWxldmFkby48YnI+DQpBIGNvbnRpbnVhY2nDs24sIG9zIHByZXNlbnRhcmVtb3MgZWwgcmFua2luZyBkZSBjYWRhIHVubyBkZSBsb3MgMTQgaW5kaWNhZG9yZXMgeSBsYSBzaXR1YWNpw7NuIGRlIGNhZGEgQ0NBQSBlbiBjb21wYXJhY2nDs24gY29uIGxvcyBkZW3DoXMuDQo8YnI+DQoNCiMjIDYuMSDDjW5kaWNlcyBkZSBsb3MgMTQgaW5kaWNhZG9yZXMNCg0KYGBge3IgTGltcGllemEgZGUgZGF0b3MgLCBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQojTGltcGllemEgZGUgZGF0b3MtLS0tLS0tLS0NCiNMaW1waWV6YSBkZSBkYXRvcyBkZSB0YXNhIGVtcGxlbywgcGFyYSBoYWNlciByYW5raW5nDQpuYW1lcyhkZl90YXNhX2VtcGxlbykgPC0gYXMubWF0cml4KGRmX3Rhc2FfZW1wbGVvWzEsIF0pDQpkZl90YXNhX2VtcGxlbyA8LSBkZl90YXNhX2VtcGxlb1stYygxOjMsMjMpLCBdDQpkZl90YXNhX2VtcGxlb1tdIDwtIGxhcHBseShkZl90YXNhX2VtcGxlbywgZnVuY3Rpb24oeCkgdHlwZS5jb252ZXJ0KGFzLmNoYXJhY3Rlcih4KSkpDQoNCmRmX3Rhc2FfZW1wbGVvIDwtIGRmX3Rhc2FfZW1wbGVvWy0xXQ0KZGZfdGFzYV9lbXBsZW8gPC0gZGF0YS5mcmFtZShsYXBwbHkoZGZfdGFzYV9lbXBsZW8sIGZ1bmN0aW9uKHgpIGdzdWIoIiwiLCAiLiIsIHgsIGZpeGVkID0gVFJVRSkpKQ0KZGZfdGFzYV9lbXBsZW8gPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoZGZfdGFzYV9lbXBsZW8sIGFzLm51bWVyaWMpKQ0KDQpkZl90YXNhX2VtcGxlbyRDQ0FBIDwtIENDQUFfc2luX1VFX3Npbl9vcmQNCmRmX3Rhc2FfZW1wbGVvIDwtIGRmX3Rhc2FfZW1wbGVvICAlPiUgc2VsZWN0KENDQUEsIGV2ZXJ5dGhpbmcoKSkNCmNvbG5hbWVzIChkZl90YXNhX2VtcGxlbykgPC0gZ3N1YigiWCIsICIiLCBjb2xuYW1lcyhkZl90YXNhX2VtcGxlbykpDQoNCiNMaW1waWV6YSBkZSBkYXRvcyBkZSB0YXNhIHBhcm8sIHBhcmEgaGFjZXIgcmFua2luZw0KbmFtZXMoZGZfdGFzYV9wYXJvKSA8LSBhcy5tYXRyaXgoZGZfdGFzYV9wYXJvWzEsIF0pDQpkZl90YXNhX3Bhcm8gPC0gZGZfdGFzYV9wYXJvWy1jKDE6MiksIF0NCmRmX3Rhc2FfcGFyb1tdIDwtIGxhcHBseShkZl90YXNhX3Bhcm8sIGZ1bmN0aW9uKHgpIHR5cGUuY29udmVydChhcy5jaGFyYWN0ZXIoeCkpKQ0KDQpkZl90YXNhX3Bhcm8gPC0gZGZfdGFzYV9wYXJvWy0xXQ0KZGZfdGFzYV9wYXJvIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmX3Rhc2FfcGFybywgZnVuY3Rpb24oeCkgZ3N1YigiLCIsICIuIiwgeCwgZml4ZWQgPSBUUlVFKSkpDQpkZl90YXNhX3Bhcm8gPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoZGZfdGFzYV9wYXJvLCBhcy5udW1lcmljKSkNCg0KZGZfdGFzYV9wYXJvJENDQUEgPC0gQ0NBQV9zaW5fVUVfc2luX29yZA0KZGZfdGFzYV9wYXJvIDwtIGRmX3Rhc2FfcGFybyAlPiUgc2VsZWN0KENDQUEsIGV2ZXJ5dGhpbmcoKSkNCmNvbG5hbWVzIChkZl90YXNhX3Bhcm8pIDwtIGdzdWIoIlgiLCAiIiwgY29sbmFtZXMoZGZfdGFzYV9wYXJvKSkNCg0KI0xpbXBpZXphIGRlIGRhdG9zIGRlIHNhdGlzZmFjY2nDs24gdHJhYmFqbywgcGFyYSBoYWNlciByYW5raW5nDQpuYW1lcyhkZl9zYXRpc190cmFiKSA8LSBhcy5tYXRyaXgoZGZfc2F0aXNfdHJhYlsxLCBdKQ0KZGZfc2F0aXNfdHJhYiA8LSBkZl9zYXRpc190cmFiWy1jKDE6MyksIF0NCmRmX3NhdGlzX3RyYWJbXSA8LSBsYXBwbHkoZGZfc2F0aXNfdHJhYiwgZnVuY3Rpb24oeCkgdHlwZS5jb252ZXJ0KGFzLmNoYXJhY3Rlcih4KSkpDQoNCmRmX3NhdGlzX3RyYWIgPC0gZGZfc2F0aXNfdHJhYlstMV0NCmRmX3NhdGlzX3RyYWIgPC0gZGF0YS5mcmFtZShsYXBwbHkoZGZfc2F0aXNfdHJhYiwgZnVuY3Rpb24oeCkgZ3N1YigiLCIsICIuIiwgeCwgZml4ZWQgPSBUUlVFKSkpDQpkZl9zYXRpc190cmFiIDwtIGFzLmRhdGEuZnJhbWUoc2FwcGx5KGRmX3NhdGlzX3RyYWIsIGFzLm51bWVyaWMpKQ0KDQpkZl9zYXRpc190cmFiJENDQUEgPC0gQ0NBQV9zaW5fVUVfc2luX29yZA0KZGZfc2F0aXNfdHJhYiA8LSBkZl9zYXRpc190cmFiICU+JSBzZWxlY3QoQ0NBQSwgZXZlcnl0aGluZygpKQ0KDQojTGltcGllemEgZGUgZGF0b3MgZGUgdHJhYmFqbyB0ZW1wb3JhbCwgcGFyYSBoYWNlciByYW5raW5nDQpuYW1lcyhkZl90cmFiYWpvX3RlbXApIDwtIGFzLm1hdHJpeChkZl90cmFiYWpvX3RlbXBbMSwgXSkNCmRmX3RyYWJham9fdGVtcCA8LSBkZl90cmFiYWpvX3RlbXBbLWMoMTozKSwgXQ0KZGZfdHJhYmFqb190ZW1wIDwtIGxhcHBseShkZl90cmFiYWpvX3RlbXAsIGZ1bmN0aW9uKHgpIHR5cGUuY29udmVydChhcy5jaGFyYWN0ZXIoeCkpKQ0KDQpkZl90cmFiYWpvX3RlbXAgPC0gZGZfdHJhYmFqb190ZW1wWy0xXQ0KZGZfdHJhYmFqb190ZW1wIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmX3RyYWJham9fdGVtcCwgZnVuY3Rpb24oeCkgZ3N1YigiLCIsICIuIiwgeCwgZml4ZWQgPSBUUlVFKSkpDQpkZl90cmFiYWpvX3RlbXAgPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoZGZfdHJhYmFqb190ZW1wLCBhcy5udW1lcmljKSkNCg0KZGZfdHJhYmFqb190ZW1wJENDQUEgPC0gQ0NBQV9zaW5fVUVfc2luX29yZA0KZGZfdHJhYmFqb190ZW1wIDwtIGRmX3RyYWJham9fdGVtcCAlPiUgc2VsZWN0KENDQUEsIGV2ZXJ5dGhpbmcoKSkNCmNvbG5hbWVzIChkZl90cmFiYWpvX3RlbXApIDwtIGdzdWIoIlgiLCAiIiwgY29sbmFtZXMoZGZfdHJhYmFqb190ZW1wKSkNCg0KI2xpbXBpZXphIGRlIGRhdG9zIGFiYW5kb25vDQpuYW1lcyhkZl9hYmFuZG9ubykgPC0gYXMubWF0cml4KGRmX2FiYW5kb25vWzEsIF0pDQpkZl9hYmFuZG9ubyA8LSBkZl9hYmFuZG9ub1stYygxOjIpLCBdDQpkZl9hYmFuZG9ub1tdIDwtIGxhcHBseShkZl9hYmFuZG9ubywgZnVuY3Rpb24oeCkgdHlwZS5jb252ZXJ0KGFzLmNoYXJhY3Rlcih4KSkpDQoNCmRmX2FiYW5kb25vIDwtIGRmX2FiYW5kb25vWy0xXQ0KZGZfYWJhbmRvbm8gPC0gZGF0YS5mcmFtZShsYXBwbHkoZGZfYWJhbmRvbm8sIGZ1bmN0aW9uKHgpIGdzdWIoIiwiLCAiLiIsIHgsIGZpeGVkID0gVFJVRSkpKQ0KZGZfYWJhbmRvbm8gPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoZGZfYWJhbmRvbm8sIGFzLm51bWVyaWMpKQ0KDQpkZl9hYmFuZG9ubyRDQ0FBIDwtIENDQUFfc2luX1VFX3Npbl9vcmQNCmRmX2FiYW5kb25vIDwtIGRmX2FiYW5kb25vICAlPiUgc2VsZWN0KENDQUEsIGV2ZXJ5dGhpbmcoKSkNCmNvbG5hbWVzIChkZl9hYmFuZG9ubykgPC0gZ3N1YigiWCIsICIiLCBjb2xuYW1lcyhkZl9hYmFuZG9ubykpDQoNCiNsaW1waWV6YSBkYXRvcyBlc3BlcmFuemEgZGUgdmlkYQ0KbmFtZXMoZGZfZXNwZXJhbnphX3ZpZGEpIDwtIGFzLm1hdHJpeChkZl9lc3BlcmFuemFfdmlkYVsxLCBdKQ0KZGZfZXNwZXJhbnphX3ZpZGEgPC0gZGZfZXNwZXJhbnphX3ZpZGFbLWMoMToyKSwgXQ0KZGZfZXNwZXJhbnphX3ZpZGFbXSA8LSBsYXBwbHkoZGZfZXNwZXJhbnphX3ZpZGEsIGZ1bmN0aW9uKHgpIHR5cGUuY29udmVydChhcy5jaGFyYWN0ZXIoeCkpKQ0KDQpkZl9lc3BlcmFuemFfdmlkYSRDQ0FBIDwtIENDQUFfc2luX1VFX3Npbl9vcmQNCmRmX2VzcGVyYW56YV92aWRhIDwtIGRmX2VzcGVyYW56YV92aWRhICAlPiUgc2VsZWN0KENDQUEsIGV2ZXJ5dGhpbmcoKSkNCmNvbG5hbWVzIChkZl9lc3BlcmFuemFfdmlkYSkgPC0gZ3N1YigiWCIsICIiLCBjb2xuYW1lcyhkZl9lc3BlcmFuemFfdmlkYSkpDQoNCiNsaW1waWV6YSBkYXRvcyBhY2Nlc28gMQ0KDQpuYW1lcyhkZl9ub19hY2Nlc29fMSkgPC0gYXMubWF0cml4KGRmX25vX2FjY2Vzb18xWzEsIF0pDQpkZl9ub19hY2Nlc29fMSA8LSBkZl9ub19hY2Nlc29fMVstYygxOjIpLCBdDQpkZl9ub19hY2Nlc29fMVtdIDwtIGxhcHBseShkZl9ub19hY2Nlc29fMSwgZnVuY3Rpb24oeCkgdHlwZS5jb252ZXJ0KGFzLmNoYXJhY3Rlcih4KSkpDQoNCmRmX25vX2FjY2Vzb18xJENDQUEgPC0gQ0NBQV9zaW5fVUVfc2luX29yZA0KZGZfbm9fYWNjZXNvXzEgPC0gZGZfbm9fYWNjZXNvXzEgICU+JSBzZWxlY3QoQ0NBQSwgZXZlcnl0aGluZygpKQ0KY29sbmFtZXMgKGRmX25vX2FjY2Vzb18xKSA8LSBnc3ViKCJYIiwgIiIsIGNvbG5hbWVzKGRmX25vX2FjY2Vzb18xKSkNCg0KI2VkY3UzOCBsaW1waWV6YSBkYXRvcw0KbmFtZXMoZGZfZWR1Y18zOCkgPC0gYXMubWF0cml4KGRmX2VkdWNfMzhbMSwgXSkNCmRmX2VkdWNfMzggPC0gZGZfZWR1Y18zOFstYygxOjMpLCBdDQpkZl9lZHVjXzM4W10gPC0gbGFwcGx5KGRmX2VkdWNfMzgsIGZ1bmN0aW9uKHgpIHR5cGUuY29udmVydChhcy5jaGFyYWN0ZXIoeCkpKQ0KDQpkZl9lZHVjXzM4JENDQUEgPC0gQ0NBQV9zaW5fVUVfc2luX29yZA0KZGZfZWR1Y18zOCA8LSBkZl9lZHVjXzM4ICAlPiUgc2VsZWN0KENDQUEsIGV2ZXJ5dGhpbmcoKSkNCmNvbG5hbWVzIChkZl9lZHVjXzM4KSA8LSBnc3ViKCJYIiwgIiIsIGNvbG5hbWVzKGRmX2VkdWNfMzgpKQ0KDQojbGltcGllemEgZGF0b3MgcnVpZG8NCm5hbWVzKGRmX3J1aWRvcykgPC0gYXMubWF0cml4KGRmX3J1aWRvc1sxLCBdKQ0KZGZfcnVpZG9zIDwtIGRmX3J1aWRvc1stYygxLDkpLCBdDQpkZl9ydWlkb3NbXSA8LSBsYXBwbHkoZGZfcnVpZG9zLCBmdW5jdGlvbih4KSB0eXBlLmNvbnZlcnQoYXMuY2hhcmFjdGVyKHgpKSkNCg0KZGZfcnVpZG9zIDwtIGRmX3J1aWRvc1stMV0NCmRmX3J1aWRvcyA8LSBkYXRhLmZyYW1lKGxhcHBseShkZl9ydWlkb3MsIGZ1bmN0aW9uKHgpIGdzdWIoIiwiLCAiLiIsIHgsIGZpeGVkID0gVFJVRSkpKQ0KZGZfcnVpZG9zIDwtIGFzLmRhdGEuZnJhbWUoc2FwcGx5KGRmX3J1aWRvcywgYXMubnVtZXJpYykpDQoNCmRmX3J1aWRvcyRDQ0FBIDwtIENDQUFfMg0KZGZfcnVpZG9zIDwtIGRmX3J1aWRvcyAlPiUgc2VsZWN0KENDQUEsIGV2ZXJ5dGhpbmcoKSkNCmNvbG5hbWVzIChkZl9ydWlkb3MpIDwtIGdzdWIoIlgiLCAiIiwgY29sbmFtZXMoZGZfcnVpZG9zKSkNCg0KI2xpbXBpZXphIGRhdG9zIGRlbGluY3VlbmNpYQ0KbmFtZXMoZGZfZGVsX2NjYWEpIDwtIGFzLm1hdHJpeChkZl9kZWxfY2NhYVsxLCBdKQ0KZGZfZGVsX2NjYWEgPC0gZGZfZGVsX2NjYWFbLWMoMSwyKSwgXQ0KZGZfZGVsX2NjYWFbXSA8LSBsYXBwbHkoZGZfZGVsX2NjYWEsIGZ1bmN0aW9uKHgpIHR5cGUuY29udmVydChhcy5jaGFyYWN0ZXIoeCkpKQ0KDQpkZl9kZWxfY2NhYSA8LSBkZl9kZWxfY2NhYVstMV0NCmRmX2RlbF9jY2FhIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmX2RlbF9jY2FhLCBmdW5jdGlvbih4KSBnc3ViKCIsIiwgIi4iLCB4LCBmaXhlZCA9IFRSVUUpKSkNCmRmX2RlbF9jY2FhIDwtIGFzLmRhdGEuZnJhbWUoc2FwcGx5KGRmX2RlbF9jY2FhLCBhcy5udW1lcmljKSkNCg0KZGZfZGVsX2NjYWEkQ0NBQSA8LSBDQ0FBX3Npbl9VRV9zaW5fb3JkDQpkZl9kZWxfY2NhYSA8LSBkZl9kZWxfY2NhYSAlPiUgc2VsZWN0KENDQUEsIGV2ZXJ5dGhpbmcoKSkNCmNvbG5hbWVzKGRmX2RlbF9jY2FhKSA8LSBnc3ViKCJYIiwgIiIsIGNvbG5hbWVzKGRmX2RlbF9jY2FhKSkNCmBgYA0KPGJyPjxicj4NCg0KIyMjIDYuMS4xIMONbmRpY2VzIGRlIGxhcyBjb25kaWNpb25lcyBtYXRlcmlhbGVzDQoNCkVuIGN1YW50byBhIGxhcyBjb25kaWNvbmVzIG1hdGVyaWFsZXMsIHZlbW9zIHF1ZSBkZXN0YWNhIHNvYnJlIHRvZG8gZWwgUGHDrXMgVmFzY28sIE5hdmFycmEsIE1hZHJpZCB5IENhdGFsdcOxYS4gRW4gbGFzIMO6bHRpbWFzIHBvc2ljaW9uZXMsIHZlbW9zIGEgQ2V1dGEsIE1lbGlsbGEsIEV4dHJlbWFkdXJhIHkgQW5kYWx1Y2lhLiAgTGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEgc2UgZW5jdWVudHJhIG11eSBwb3IgZGViYWpvIHRhbWJpw6luIGRlIGxhcyByZWdpb25lcyB0b3AgeSBhbGdvIHBvciBlbmNpbWEgZGUgbGFzIG3DoXMgcG9icmVzLg0KDQo8YnI+DQpgYGB7ciBpbmRpY2UgY29uZGljaW9uZXMgbWF0ZXJpYWxlcyAsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCg0KI1JlbnRhIG1lZGlhIG5vcm1hbGl6YWRvDQojY29udmVydGlyIDIwMjAgYSBudW1lcm9zDQpkZl9SZW50YV9tZWRpYSRgMjAyMGAgPC0gYXMubnVtZXJpYyhkZl9SZW50YV9tZWRpYSRgMjAyMGApDQojU2FjYXIgdmFsb3JlcyBub3JtYWxpemFkb3MNClJlbnRhX21lZGlhX25vcm0gPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoZGZfUmVudGFfbWVkaWFbMTRdLCBtaW5fbWF4X25vcm1fZ3JhbikpDQpSZW50YV9tZWRpYV9ub3JtJENDQUEgPC0gQ0NBQV9zaW5fVUUNClJlbnRhX21lZGlhX25vcm0gPC0gUmVudGFfbWVkaWFfbm9ybSAgJT4lIHNlbGVjdChDQ0FBID0gIkNDQUEiLCBldmVyeXRoaW5nKCkpDQoNCiNSZW50YSBtZWRpYW5hIG5vcm1hbGl6YWRvDQpkZl9SZW50YV9tZWRpYW5hJGAyMDIwYCA8LSBhcy5udW1lcmljKGRmX1JlbnRhX21lZGlhbmEkYDIwMjBgKQ0KI1NhY2FyIHZhbG9yZXMgbm9ybWFsaXphZG9zDQpSZW50YV9tZWRpYW5hX25vcm0gPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoZGZfUmVudGFfbWVkaWFuYVsxNF0sIG1pbl9tYXhfbm9ybV9ncmFuKSkNClJlbnRhX21lZGlhbmFfbm9ybSRDQ0FBIDwtIENDQUFfc2luX1VFDQpSZW50YV9tZWRpYW5hX25vcm0gPC0gUmVudGFfbWVkaWFuYV9ub3JtICAlPiUgc2VsZWN0KENDQUEgPSAiQ0NBQSIsIGV2ZXJ5dGhpbmcoKSkNCg0KI0Rlc2lndWFsZGFkIG5vcm1hbGl6YWRvDQojY3VhbnRvIG1heW9yIGVzLCBtYXlvciBlcyBsYSBkZXNpZ3VhbGRhZA0KI1NhY2FyIHZhbG9yZXMgbm9ybWFsaXphZG9zDQpEZXNpZ3VhbGRhZF9ub3JtIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGRmX0Rlc2lndWFsZGFkWzE0XSwgbWluX21heF9ub3JtX3BlcSkpDQpEZXNpZ3VhbGRhZF9ub3JtJENDQUEgPC0gQ0NBQV9zaW5fVUUNCkRlc2lndWFsZGFkX25vcm0gPC0gRGVzaWd1YWxkYWRfbm9ybSAgJT4lIHNlbGVjdChDQ0FBID0gIkNDQUEiLCBldmVyeXRoaW5nKCkpDQoNCiNSaWVzZ28gZGUgcG9icmV6YSBub3JtYWxpemFkbw0KDQojbG8gZGUgc3ViIGVzIHBhcmEgY2FtYmlhciBkZSBjb21hIGEgcHVudG8sIHIgbGVlIGRlY2ltYWxlcyBjb24gcHVudG9zDQpkZl9SaWVzZ29fcG9icmV6YSRgMjAyMGAgPC0gYXMubnVtZXJpYyhzdWIoIiwiLCAiLiIsIGRmX1JpZXNnb19wb2JyZXphJGAyMDIwYCwgZml4ZWQgPSBUUlVFKSkNCiNTYWNhciB2YWxvcmVzIG5vcm1hbGl6YWRvcw0KUmllc2dvX3BvYnJlemFfbm9ybSA8LSBhcy5kYXRhLmZyYW1lKGxhcHBseShkZl9SaWVzZ29fcG9icmV6YVsxNF0sIG1pbl9tYXhfbm9ybV9wZXEpKQ0KUmllc2dvX3BvYnJlemFfbm9ybSRDQ0FBIDwtIENDQUFfc2luX1VFDQpSaWVzZ29fcG9icmV6YV9ub3JtIDwtIFJpZXNnb19wb2JyZXphX25vcm0gICU+JSBzZWxlY3QoQ0NBQSA9ICJDQ0FBIiwgZXZlcnl0aGluZygpKQ0KDQojdW5pw7NuIGRlIGNvbmRpY2lvbmVzIGVjb27Ds21pY2FzLS0tLS0tLS0tLS0tDQpkZl9ub3JtX2NvbmRfZWNvbiA8LSBpbm5lcl9qb2luKFJlbnRhX21lZGlhX25vcm0sIFJlbnRhX21lZGlhbmFfbm9ybSwgYnkgPSAiQ0NBQSIpDQpkZl9ub3JtX2NvbmRfZWNvbiA8LSBkZl9ub3JtX2NvbmRfZWNvbiAlPiUgcmVuYW1lKFJlbnRhX21lZGlhID0gWDIwMjAueCwgUmVudGFfbWVkaWFuYSA9IFgyMDIwLnkpDQoNCmRmX25vcm1fY29uZF9lY29uXzIgPC0gaW5uZXJfam9pbihEZXNpZ3VhbGRhZF9ub3JtLCBSaWVzZ29fcG9icmV6YV9ub3JtLCBieSA9ICJDQ0FBIikNCmRmX25vcm1fY29uZF9lY29uXzIgPC0gZGZfbm9ybV9jb25kX2Vjb25fMiAlPiUgcmVuYW1lKERlc2lndWFsZGFkID0gWDIwMjAueCwgUmllc2dvX3BvYnJlemEgPSBYMjAyMC55KQ0KDQojdGFibGEgY29uIGxhcyBjb25kaWNpb25lcyBlY29uw7NtaWNhcyBub3JtYWxpemFkYXMgZGUgY2FkYSB1bmEgZGUgbGFzIENDQUENCmRmX25vcm1fY29uZF9lY29uX3N1bWEgPC0gaW5uZXJfam9pbihkZl9ub3JtX2NvbmRfZWNvbiwgZGZfbm9ybV9jb25kX2Vjb25fMiwgYnkgPSAiQ0NBQSIpDQoNCiNhw7FhZGlyIGNvbHVtbmEgY29uIHRvdGFsIGRlIHZhbG9yZXMgbm9ybWFsaXphZG9zDQpkZl9ub3JtX2NvbmRfZWNvbl9zdW1hX25vX0NDQUEgPC0gZGZfbm9ybV9jb25kX2Vjb25fc3VtYSAlPiUgc2VsZWN0KCEiQ0NBQSIpDQoNCiNTdW1hbW9zIHRvZG9zIGxvcyAoNCkgc3ViaW5kaWNhZG9yZXMgeSBjcmVhbW9zIGNvbHVtbmEgY29uIGVsIHRvdGFsDQpTdW1hX2NvbmRfZWNvbl9ub3JtX29yZCA8LSBkZl9ub3JtX2NvbmRfZWNvbl9zdW1hICAlPiUgbXV0YXRlKGNvbmRfZWNvbl90b3RhbCA9IHJvd1N1bXMoZGZfbm9ybV9jb25kX2Vjb25fc3VtYV9ub19DQ0FBKSkgJT4lIGFycmFuZ2UoZGVzYyhjb25kX2Vjb25fdG90YWwpKQ0KU3VtYV9jb25kX2Vjb25fbm9ybSA8LSBkZl9ub3JtX2NvbmRfZWNvbl9zdW1hICAlPiUgbXV0YXRlKGNvbmRfZWNvbl90b3RhbCA9IHJvd1N1bXMoZGZfbm9ybV9jb25kX2Vjb25fc3VtYV9ub19DQ0FBKSkgDQoNCiNQdW50dWFjacOzbiBkZSBjb25kaWNpb25lcyBlY29uw7NtaWNhcy0tLS0tLS0tLS0NClRvdGFsX25vcm1fY29uZF9lY29uIDwtIFN1bWFfY29uZF9lY29uX25vcm0gJT4lIHNlbGVjdCgiQ0NBQSIsICJjb25kX2Vjb25fdG90YWwiKSANCg0KTm9ybV9jb25kX2Vjb24gPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoVG90YWxfbm9ybV9jb25kX2Vjb25bMl0sIG1pbl9tYXhfbm9ybV9ncmFuKSkNCk5vcm1fY29uZF9lY29uJENDQUEgPC0gQ0NBQV9zaW5fVUUNCk5vcm1fY29uZF9lY29uIDwtIE5vcm1fY29uZF9lY29uICAlPiUgc2VsZWN0KENDQUEgPSAiQ0NBQSIsIGV2ZXJ5dGhpbmcoKSkgJT4lIGFycmFuZ2UoZGVzYyhjb25kX2Vjb25fdG90YWwpKQ0KDQojR3LDoWZpY28gZGUgY29uZGljb25lcyBtYXRlcmlhbGVzDQoNCiNSZW50YSBtZWRpYQ0KQ1ZfUmVudGFfbWVkaWEgPC0gU3VtYV9jb25kX2Vjb25fbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBSZW50YV9tZWRpYSkgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWRfVmFsZW5jaWFuYSIpDQpnX3JlbnRhX21lZGlhIDwtIFN1bWFfY29uZF9lY29uX25vcm1fb3JkICU+JSBzZWxlY3QoQ0NBQSwgUmVudGFfbWVkaWEpICU+JSBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKENDQUEsIFJlbnRhX21lZGlhKSwgeSA9IFJlbnRhX21lZGlhKSkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwNCiAgICAgICAgICAgZmlsbCA9ICJkYXJrIGdyZWVuIikgKw0KICBsYWJzKCB5ID0gIlZhbG9yZXMgZGVsIMONbmRpY2UiICwNCiAgICAgICAgdGl0bGUgPSAiUmVudGEgbWVkaWEiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFydGlsZXMsIGNvbG91ciA9ICJyZWQiKSArDQogIGdlb21fYmFyKGRhdGEgPSBDVl9SZW50YV9tZWRpYSwNCiAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwNCiAgICAgICAgICAgZmlsbCA9ICJwdXJwbGUiKSArDQogIHRoZW1lX3dzaigpDQpnX3JlbnRhX21lZGlhDQoNCiNSZW50YSBtZWRpYW5hDQpDVl9SZW50YV9tZWRpYW5hIDwtIFN1bWFfY29uZF9lY29uX25vcm1fb3JkICU+JSBzZWxlY3QoQ0NBQSwgUmVudGFfbWVkaWFuYSkgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWRfVmFsZW5jaWFuYSIpDQpnX3JlbnRhX21lZGlhbmEgPC0gU3VtYV9jb25kX2Vjb25fbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBSZW50YV9tZWRpYW5hKSAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihDQ0FBLCBSZW50YV9tZWRpYW5hKSwgeSA9IFJlbnRhX21lZGlhbmEpKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gImRhcmsgZ3JlZW4iKSArDQogIGxhYnMoIHkgPSAiVmFsb3JlcyBkZWwgw41uZGljZSIgLA0KICAgICAgICB0aXRsZSA9ICJSZW50YSBtZWRpYW5hIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICAjZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gcXVhcnRpbGVzLCBjb2xvdXIgPSAicmVkIikgKw0KICBnZW9tX2JhcihkYXRhID0gQ1ZfUmVudGFfbWVkaWFuYSwNCiAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwNCiAgICAgICAgICAgZmlsbCA9ICJwdXJwbGUiKSArDQogIHRoZW1lX3dzaigpDQpnX3JlbnRhX21lZGlhbmENCg0KI0Rlc2lndWFsZGFkDQpDVl9EZXNpZ3VhbGRhZCA8LSBTdW1hX2NvbmRfZWNvbl9ub3JtX29yZCAlPiUgc2VsZWN0KENDQUEsIERlc2lndWFsZGFkKSAlPiUgZmlsdGVyKENDQUEgPT0gIkNvbXVuaWRhZF9WYWxlbmNpYW5hIikNCmdfRGVzaWd1YWxkYWQgPC0gU3VtYV9jb25kX2Vjb25fbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBEZXNpZ3VhbGRhZCkgJT4lIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoQ0NBQSwgRGVzaWd1YWxkYWQpLCB5ID0gRGVzaWd1YWxkYWQpKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gImRhcmsgZ3JlZW4iKSArDQogIGxhYnMoIHkgPSAiVmFsb3JlcyBkZWwgw41uZGljZSIgLA0KICAgICAgICB0aXRsZSA9ICJEZXNpZ3VhbGRhZCIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YXJ0aWxlcywgY29sb3VyID0gInJlZCIpICsNCiAgZ2VvbV9iYXIoZGF0YSA9IENWX0Rlc2lndWFsZGFkLA0KICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gInB1cnBsZSIpICsNCiAgdGhlbWVfd3NqKCkNCmdfRGVzaWd1YWxkYWQNCg0KI1JpZXNnbyBQb2JyZXphDQpDVl9SaWVzZ29fcG9icmV6YSA8LSBTdW1hX2NvbmRfZWNvbl9ub3JtX29yZCAlPiUgc2VsZWN0KENDQUEsIFJpZXNnb19wb2JyZXphKSAlPiUgZmlsdGVyKENDQUEgPT0gIkNvbXVuaWRhZF9WYWxlbmNpYW5hIikNCmdfUmllc2dvX3BvYnJlemEgPC0gU3VtYV9jb25kX2Vjb25fbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBSaWVzZ29fcG9icmV6YSkgJT4lIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoQ0NBQSwgUmllc2dvX3BvYnJlemEpLCB5ID0gUmllc2dvX3BvYnJlemEpKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gImRhcmsgZ3JlZW4iKSArDQogIGxhYnMoIHkgPSAiVmFsb3JlcyBkZWwgw41uZGljZSIgLA0KICAgICAgICB0aXRsZSA9ICJSaWVzZ28gUG9icmV6YSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YXJ0aWxlcywgY29sb3VyID0gInJlZCIpICsNCiAgZ2VvbV9iYXIoZGF0YSA9IENWX1JpZXNnb19wb2JyZXphLA0KICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gInB1cnBsZSIpICsNCiAgdGhlbWVfd3NqKCkNCmdfUmllc2dvX3BvYnJlemENCg0KYGBgDQo8YnI+IDxicj4NCg0KIyMjIDYuMS4yIMONbmRpY2VzIGRlbCB0cmFiYWpvDQoNClBvZGVtb3Mgb2JzZXJ2YXIgZW4gZWwgY2FzbyBkZWwgdHJhYmFqbywgcXVlIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIHNlIHBvc2ljaW9uYSBlbiBsYSBwYXJ0ZSBpbmZlcmlvciBiYWphIGRlIGxhIHRhYmxhLCBwZXJvIHPDrSBlcyB2ZXJkYWQgcXVlIGVuIHNhdGlzZmFjY2nDs24gZGVsIHRyYWJham8geSBlbiBsYSB0YXNhIGRlIGVtcGxlbyBzZSBlbmN1ZW50cmEgbcOhcyBhcnJpYmEgcXVlIGxhIHBvc2ljacOzbiBlbiBsYSBxdWUgc2UgZW5jdWVudHJhIG5vcm1hbG1lbnRlLiBFbiB0w6lybWlub3MgZ2VuZXJhbGVzLCB2ZW1vcyBjb21vIGVuIGVzdGUgY2FzbyBsYSBoZWdlbW9uw61hIGRlbCBQYcOtcyBWYXNjbyBubyBzZSBtYW50aWVuZSwgc2lubyBxdWUgZXMgYWRlbGFudGFkbyBwb3IgdmFyaWFzIGNvbXVuaWRhZGVzIGVuIHZhcmlvcyBkZSBsb3MgaW5kaWNhZG9yZXMuIEFsZ28gcXVlIHBvZGVtb3MgcmVzYWx0YXIgZGUgZXN0ZSByYW5raW5nLCBlcyBsYSBwb3NpY2nDs24gZGUgbGFzIENDQUEgZW4gY3VhbnRvIGEgbGEgc2F0aXNmYWNjacOzbiBkZSB0cmFiYWpvIHNvYnJlIHRvZG8gbGEgcHJpbWVyYSBwb3NpY2nDs24gZGUgTWVsaWxsYS4gRGUgaGVjaG8sIGVzIGVsIMO6bmljbyBpbmRpY2Fkb3IgZW4gZWwgY3VhbCBsaWRlcmEgZWwgcmFua2luZyB5IG5vcyBoYWNlIHBlbnNhciBzaSByZWFsbWVudGUgbGEgcmVudGEgZXMgdW4gYnVlbiBpbmRpY2Fkb3IgZGVsIG5pdmVsIGRlIHZpZGEuIA0KDQo8YnI+DQpgYGB7ciBpbmRpY2UgdHJhYmFqbyAsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCg0KI1Rhc2EgZW1wbGVvIG5vcm1hbGl6YWRvDQoNCiNTYWNhciB2YWxvcmVzIG5vcm1hbGl6YWRvcw0KdGFzYV9lbXBsZW9fbm9ybSA8LSBhcy5kYXRhLmZyYW1lKGxhcHBseShkZl90YXNhX2VtcGxlb1sxNl0sIG1pbl9tYXhfbm9ybV9ncmFuKSkNCnRhc2FfZW1wbGVvX25vcm0kQ0NBQSA8LSBDQ0FBX3Npbl9VRV9zaW5fb3JkDQp0YXNhX2VtcGxlb19ub3JtIDwtIHRhc2FfZW1wbGVvX25vcm0gICU+JSBzZWxlY3QoQ0NBQSA9ICJDQ0FBIiwgZXZlcnl0aGluZygpKQ0KDQojVGFzYSBwYXJvIG5vcm1hbGl6YWRvDQoNCnRhc2FfcGFyb19ub3JtIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGRmX3Rhc2FfcGFyb1sxNl0sIG1pbl9tYXhfbm9ybV9wZXEpKQ0KdGFzYV9wYXJvX25vcm0kQ0NBQSA8LSBDQ0FBX3Npbl9VRV9zaW5fb3JkDQp0YXNhX3Bhcm9fbm9ybSA8LSB0YXNhX3Bhcm9fbm9ybSAgJT4lIHNlbGVjdChDQ0FBID0gIkNDQUEiLCBldmVyeXRoaW5nKCkpDQoNCiNzYXRpc2ZhY2Npw7NuIHRyYWJham8gbm9ybWFsaXphZG8NCg0KDQpzYXRpc190cmFiX25vcm0gPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoZGZfc2F0aXNfdHJhYls2XSwgbWluX21heF9ub3JtX2dyYW4pKQ0Kc2F0aXNfdHJhYl9ub3JtJENDQUEgPC0gQ0NBQV9zaW5fVUVfc2luX29yZA0Kc2F0aXNfdHJhYl9ub3JtIDwtIHNhdGlzX3RyYWJfbm9ybSAgJT4lIHNlbGVjdChDQ0FBID0gIkNDQUEiLCBldmVyeXRoaW5nKCkpDQoNCiN0cmFiYWpvIHRlbXBvcmFsIG5vcm1hbGl6YWRvDQoNCg0KdHJhYmFqb190ZW1wX25vcm0gPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoZGZfdHJhYmFqb190ZW1wWzE2XSwgbWluX21heF9ub3JtX3BlcSkpDQp0cmFiYWpvX3RlbXBfbm9ybSRDQ0FBIDwtIENDQUFfc2luX1VFX3Npbl9vcmQNCnRyYWJham9fdGVtcF9ub3JtIDwtIHRyYWJham9fdGVtcF9ub3JtICAlPiUgc2VsZWN0KENDQUEgPSAiQ0NBQSIsIGV2ZXJ5dGhpbmcoKSkNCg0KI3VuacOzbiBkZSBUUkFCQUpPLS0tLS0tLS0tLS0tLQ0KZGZfbm9ybV90cmFiYWpvIDwtIGlubmVyX2pvaW4odGFzYV9lbXBsZW9fbm9ybSwgdGFzYV9wYXJvX25vcm0sIGJ5ID0gIkNDQUEiKQ0KZGZfbm9ybV90cmFiYWpvIDwtIGRmX25vcm1fdHJhYmFqbyAlPiUgcmVuYW1lKHRhc2FfZW1wbGVvID0gWDIwMjAueCwgdGFzYV9wYXJvID0gWDIwMjAueSkNCg0KZGZfbm9ybV90cmFiYWpvXzIgPC0gaW5uZXJfam9pbihzYXRpc190cmFiX25vcm0sIHRyYWJham9fdGVtcF9ub3JtLCBieSA9ICJDQ0FBIikNCmRmX25vcm1fdHJhYmFqb18yIDwtIGRmX25vcm1fdHJhYmFqb18yICU+JSByZW5hbWUoc2F0aXNfdHJhYiA9IFNhdGlzZmFjY2lvbi5tZWRpYSwgdHJhYmFqb190ZW1wID0gWDIwMjApDQoNCiN0YWJsYSBjb24gbGFzIGNvbmRpY2lvbmVzIGVjb27Ds21pY2FzIG5vcm1hbGl6YWRhcyBkZSBjYWRhIHVuYSBkZSBsYXMgQ0NBQQ0KZGZfbm9ybV90cmFiYWpvX3N1bWEgPC0gaW5uZXJfam9pbihkZl9ub3JtX3RyYWJham8sIGRmX25vcm1fdHJhYmFqb18yLCBieSA9ICJDQ0FBIikNCg0KI2HDsWFkaXIgY29sdW1uYSBjb24gdG90YWwgZGUgdmFsb3JlcyBub3JtYWxpemFkb3MNCmRmX25vcm1fdHJhYmFqb19zdW1hX25vX0NDQUEgPC0gZGZfbm9ybV90cmFiYWpvX3N1bWEgJT4lIHNlbGVjdCghIkNDQUEiKQ0KDQojb3JkZW5hZG8NClN1bWFfdHJhYmFqb19ub3JtX29yZCA8LSBkZl9ub3JtX3RyYWJham9fc3VtYSAgJT4lIG11dGF0ZSh0cmFiYWpvX3RvdGFsID0gcm93U3VtcyhkZl9ub3JtX3RyYWJham9fc3VtYV9ub19DQ0FBKSkgJT4lIGFycmFuZ2UoZGVzYyh0cmFiYWpvX3RvdGFsKSkNCiNubyBvcmRlbmFkbw0KU3VtYV90cmFiYWpvX25vcm0gPC0gZGZfbm9ybV90cmFiYWpvX3N1bWEgICU+JSBtdXRhdGUodHJhYmFqb190b3RhbCA9IHJvd1N1bXMoZGZfbm9ybV90cmFiYWpvX3N1bWFfbm9fQ0NBQSkpIA0KDQojUHVudHVhY2nDs24gZGUgdHJhYmFqby0tLS0tDQpUb3RhbF9ub3JtX3RyYWJham8gPC0gU3VtYV90cmFiYWpvX25vcm0gJT4lIHNlbGVjdCgiQ0NBQSIsICJ0cmFiYWpvX3RvdGFsIikgDQoNCk5vcm1fdHJhYmFqbyA8LSBhcy5kYXRhLmZyYW1lKGxhcHBseShUb3RhbF9ub3JtX3RyYWJham9bMl0sIG1pbl9tYXhfbm9ybV9ncmFuKSkNCk5vcm1fdHJhYmFqbyRDQ0FBIDwtIENDQUFfc2luX1VFX3Npbl9vcmQNCk5vcm1fdHJhYmFqbyA8LSBOb3JtX3RyYWJham8gICU+JSBzZWxlY3QoQ0NBQSA9ICJDQ0FBIiwgZXZlcnl0aGluZygpKSAlPiUgYXJyYW5nZShkZXNjKHRyYWJham9fdG90YWwpKQ0KDQojdGFzYSBlbXBsZW8NCkNWX3Rhc2FfZW1wbGVvIDwtIFN1bWFfdHJhYmFqb19ub3JtX29yZCAlPiUgc2VsZWN0KENDQUEsIHRhc2FfZW1wbGVvKSAlPiUgZmlsdGVyKENDQUEgPT0gIkNvbXVuaWRhZF9WYWxlbmNpYW5hIikNCmdfdGFzYV9lbXBsZW8gPC0gU3VtYV90cmFiYWpvX25vcm1fb3JkICU+JSBzZWxlY3QoQ0NBQSwgdGFzYV9lbXBsZW8pICU+JSBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKENDQUEsIHRhc2FfZW1wbGVvKSwgeSA9IHRhc2FfZW1wbGVvKSkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwNCiAgICAgICAgICAgZmlsbCA9ICJyZWQiKSArDQogIGxhYnMoIHkgPSAiVmFsb3JlcyBkZWwgw41uZGljZSIgLA0KICAgICAgICB0aXRsZSA9ICJUYXNhIGRlIGVtcGxlbyIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YXJ0aWxlcywgY29sb3VyID0gInJlZCIpICsNCiAgZ2VvbV9iYXIoZGF0YSA9IENWX3Rhc2FfZW1wbGVvLA0KICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gInllbGxvdyIpICsNCiAgdGhlbWVfd3NqKCkNCmdfdGFzYV9lbXBsZW8NCg0KI3Rhc2EgcGFybw0KQ1ZfdGFzYV9wYXJvIDwtIFN1bWFfdHJhYmFqb19ub3JtX29yZCAlPiUgc2VsZWN0KENDQUEsIHRhc2FfcGFybykgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWRfVmFsZW5jaWFuYSIpDQpnX3Rhc2FfcGFybyA8LSBTdW1hX3RyYWJham9fbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCB0YXNhX3Bhcm8pICU+JSBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKENDQUEsIHRhc2FfcGFybyksIHkgPSB0YXNhX3Bhcm8pKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gInJlZCIpICsNCiAgbGFicyggeSA9ICJWYWxvcmVzIGRlbCDDjW5kaWNlIiAsDQogICAgICAgIHRpdGxlID0gIlRhc2EgZGUgcGFybyIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YXJ0aWxlcywgY29sb3VyID0gInJlZCIpICsNCiAgZ2VvbV9iYXIoZGF0YSA9IENWX3Rhc2FfcGFybywNCiAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwNCiAgICAgICAgICAgZmlsbCA9ICJ5ZWxsb3ciKSArDQogIHRoZW1lX3dzaigpDQpnX3Rhc2FfcGFybw0KDQojc2F0aXNmYWNjaW9uIHRhYmFqbw0KQ1Zfc2F0aXNfdHJhYiA8LSBTdW1hX3RyYWJham9fbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBzYXRpc190cmFiKSAlPiUgZmlsdGVyKENDQUEgPT0gIkNvbXVuaWRhZF9WYWxlbmNpYW5hIikNCmdfc2F0aXNfdHJhYiA8LSBTdW1hX3RyYWJham9fbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBzYXRpc190cmFiKSAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihDQ0FBLCBzYXRpc190cmFiKSwgeSA9IHNhdGlzX3RyYWIpKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gInJlZCIpICsNCiAgbGFicyggeSA9ICJWYWxvcmVzIGRlbCDDjW5kaWNlIiAsDQogICAgICAgIHRpdGxlID0gInNhdGlzZmFjY2nDs24gZGVsIHRyYWJham8iKSArDQogIGNvb3JkX2ZsaXAoKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFydGlsZXMsIGNvbG91ciA9ICJyZWQiKSArDQogIGdlb21fYmFyKGRhdGEgPSBDVl9zYXRpc190cmFiLA0KICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gInllbGxvdyIpICsNCiAgdGhlbWVfd3NqKCkNCmdfc2F0aXNfdHJhYg0KDQojdHJhYmFqbyB0ZW1wb3JhbA0KQ1ZfdHJhYmFqb190ZW1wIDwtIFN1bWFfdHJhYmFqb19ub3JtX29yZCAlPiUgc2VsZWN0KENDQUEsIHRyYWJham9fdGVtcCkgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWRfVmFsZW5jaWFuYSIpDQpnX3RyYWJham9fdGVtcCA8LSBTdW1hX3RyYWJham9fbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCB0cmFiYWpvX3RlbXApICU+JSBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKENDQUEsIHRyYWJham9fdGVtcCksIHkgPSB0cmFiYWpvX3RlbXApKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gInJlZCIpICsNCiAgbGFicyggeSA9ICJWYWxvcmVzIGRlbCDDjW5kaWNlIiAsDQogICAgICAgIHRpdGxlID0gIlRyYWJham8gdGVtcG9yYWwiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFydGlsZXMsIGNvbG91ciA9ICJyZWQiKSArDQogIGdlb21fYmFyKGRhdGEgPSBDVl90cmFiYWpvX3RlbXAsDQogICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAieWVsbG93IikgKw0KICB0aGVtZV93c2ooKQ0KZ190cmFiYWpvX3RlbXANCg0KYGBgDQo8YnI+PGJyPg0KDQojIyA2LjEuMyDDjW5kaWNlcyBkZSBsYSBlZHVjYWNpw7NuIHkgbGEgc2FsdWQNCg0KRW4gdGVtYXMgZGUgc2FsdWQgeSBlZHVjYWNpw7NuLCBkZXN0YWNhbiBsYXMgcmVnaW9uZXMgZGUgUGHDrXMgdmFzY28sIENhbnRhYnJpYSwgTWFkcmlkLCBBc3R1cmlhcyB5IEdhbGljaWEgbWllbnRyYXMgcXVlIGEgbGEgY29sYSBlc3TDoW4gQ2V1dGEsIE1lbGlsbGEsIEFuZGFsdWPDrWEsIENhbmFyaWFzIHkgQ2FzdGlsbGEgbGEgTWFuY2hhLiBMYSBDb211bmlkYWQgVmFsZW5jaWFuYSBlc3TDoSBqdXN0byBkZWJham8gZGUgbGEgbWl0YWQgY29tbyBlbiBtdWNob3Mgb3Ryb3MgaW5kaWNhZG9yZXMuDQoNCjxicj4NCmBgYHtyIGluZGljZSBlZHVjYWNpb24geSBzYWx1ZCAsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCg0KDQojdmFsb3JlcyBub3JtYWxpemFkb3MNCg0KI3Rhc2EgYWJhbmRvbm8gbm9ybWFsaXphZG8NCiNTYWNhciB2YWxvcmVzIG5vcm1hbGl6YWRvcw0KYWJhbmRvbm9fbm9ybSA8LSBhcy5kYXRhLmZyYW1lKGxhcHBseShkZl9hYmFuZG9ub1sxOF0sIG1pbl9tYXhfbm9ybV9wZXEpKQ0KYWJhbmRvbm9fbm9ybSRDQ0FBIDwtIENDQUFfc2luX1VFX3Npbl9vcmQNCmFiYW5kb25vX25vcm0gPC0gYWJhbmRvbm9fbm9ybSAgJT4lIHNlbGVjdChDQ0FBID0gIkNDQUEiLCBldmVyeXRoaW5nKCkpDQoNCiNlc3BlcmFuemEgdmlkYSBub3JtYWxpemFkbw0KZGZfZXNwZXJhbnphX3ZpZGEkYDIwMjBgIDwtIGFzLm51bWVyaWMoc3ViKCIsIiwgIi4iLCBkZl9lc3BlcmFuemFfdmlkYSRgMjAyMCpgLCBmaXhlZCA9IFRSVUUpKQ0KZGZfZXNwZXJhbnphX3ZpZGEgPC0gZGZfZXNwZXJhbnphX3ZpZGFbLWMoMTgpXQ0KI1NhY2FyIHZhbG9yZXMgbm9ybWFsaXphZG9zDQplc3BlcmFuemFfdmlkYV9ub3JtIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGRmX2VzcGVyYW56YV92aWRhWzE4XSwgbWluX21heF9ub3JtX2dyYW4pKQ0KZXNwZXJhbnphX3ZpZGFfbm9ybSRDQ0FBIDwtIENDQUFfc2luX1VFX3Npbl9vcmQNCmVzcGVyYW56YV92aWRhX25vcm0gPC0gZXNwZXJhbnphX3ZpZGFfbm9ybSAgJT4lIHNlbGVjdChDQ0FBID0gIkNDQUEiLCBldmVyeXRoaW5nKCkpDQoNCiNhY2Nlc28gbm9ybWFsaXphZG8NCmRmX25vX2FjY2Vzb18xJGAyMDIwYCA8LSBhcy5udW1lcmljKHN1YigiLCIsICIuIiwgZGZfbm9fYWNjZXNvXzEkYDIwMjBgLCBmaXhlZCA9IFRSVUUpKQ0KI1NhY2FyIHZhbG9yZXMgbm9ybWFsaXphZG9zDQpub19hY2Nlc29fMV9ub3JtIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGRmX25vX2FjY2Vzb18xWzE4XSwgbWluX21heF9ub3JtX3BlcSkpDQpub19hY2Nlc29fMV9ub3JtJENDQUEgPC0gQ0NBQV9zaW5fVUVfc2luX29yZA0Kbm9fYWNjZXNvXzFfbm9ybSA8LSBub19hY2Nlc29fMV9ub3JtICAlPiUgc2VsZWN0KENDQUEgPSAiQ0NBQSIsIGV2ZXJ5dGhpbmcoKSkNCg0KI2VkdWNfMzggbm9ybWFsaXphZG8NCg0KZGZfZWR1Y18zOCRgMjAyMGAgPC0gYXMubnVtZXJpYyhzdWIoIiwiLCAiLiIsIGRmX2VkdWNfMzgkYDIwMjBgLCBmaXhlZCA9IFRSVUUpKQ0KI1NhY2FyIHZhbG9yZXMgbm9ybWFsaXphZG9zDQplZHVjXzM4X25vcm0gPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoZGZfZWR1Y18zOFsxOF0sIG1pbl9tYXhfbm9ybV9ncmFuKSkNCmVkdWNfMzhfbm9ybSRDQ0FBIDwtIENDQUFfc2luX1VFX3Npbl9vcmQNCmVkdWNfMzhfbm9ybSA8LSBlZHVjXzM4X25vcm0gICU+JSBzZWxlY3QoQ0NBQSA9ICJDQ0FBIiwgZXZlcnl0aGluZygpKQ0KDQoNCiN1bmnDs24gZGUgRURVQ0FDScOTTiBZIFNBTFVELS0tLS0tLS0tLS0tLQ0KZGZfbm9ybV9lZHVjX3NhbHVkIDwtIGlubmVyX2pvaW4obm9fYWNjZXNvXzFfbm9ybSwgZXNwZXJhbnphX3ZpZGFfbm9ybSAsIGJ5ID0gIkNDQUEiKQ0KZGZfbm9ybV9lZHVjX3NhbHVkIDwtIGRmX25vcm1fZWR1Y19zYWx1ZCAlPiUgcmVuYW1lKG5vX2FjY2Vzb18xID0gWDIwMjAueCwgZXNwZXJhbnphX3ZpZGEgPSBYMjAyMC55KQ0KDQpkZl9ub3JtX2VkdWNfc2FsdWRfMiA8LSBpbm5lcl9qb2luKGFiYW5kb25vX25vcm0sIGVkdWNfMzhfbm9ybSwgYnkgPSAiQ0NBQSIpDQpkZl9ub3JtX2VkdWNfc2FsdWRfMiA8LSBkZl9ub3JtX2VkdWNfc2FsdWRfMiAlPiUgcmVuYW1lKGFiYW5kb25vID0gWDIwMjAueCwgZWR1Y18zOCA9IFgyMDIwLnkpDQoNCiN0YWJsYSBjb24gbGFzIGNvbmRpY2lvbmVzIGVjb27Ds21pY2FzIG5vcm1hbGl6YWRhcyBkZSBjYWRhIHVuYSBkZSBsYXMgQ0NBQQ0KZGZfbm9ybV9lZHVjX3NhbHVkX3N1bWEgPC0gaW5uZXJfam9pbihkZl9ub3JtX2VkdWNfc2FsdWQsIGRmX25vcm1fZWR1Y19zYWx1ZF8yLCBieSA9ICJDQ0FBIikNCg0KI2HDsWFkaXIgY29sdW1uYSBjb24gdG90YWwgZGUgdmFsb3JlcyBub3JtYWxpemFkb3MNCmRmX25vcm1fZWR1Y19zYWx1ZF9zdW1hX25vX0NDQUEgPC0gZGZfbm9ybV9lZHVjX3NhbHVkX3N1bWEgJT4lIHNlbGVjdCghIkNDQUEiKQ0KDQojb3JkZW5hZG8NClN1bWFfZWR1Y19zYWx1ZF9ub3JtX29yZCA8LSBkZl9ub3JtX2VkdWNfc2FsdWRfc3VtYSAgJT4lIG11dGF0ZShFZHVjX3NhbHVkX1RvdGFsID0gcm93U3VtcyhkZl9ub3JtX2VkdWNfc2FsdWRfc3VtYV9ub19DQ0FBKSkgJT4lIGFycmFuZ2UoZGVzYyhFZHVjX3NhbHVkX1RvdGFsKSkNCiNubyBvcmRlbmFkbw0KU3VtYV9lZHVjX3NhbHVkX25vcm0gPC0gZGZfbm9ybV9lZHVjX3NhbHVkX3N1bWEgICU+JSBtdXRhdGUoRWR1Y19zYWx1ZF9Ub3RhbCA9IHJvd1N1bXMoZGZfbm9ybV9lZHVjX3NhbHVkX3N1bWFfbm9fQ0NBQSkpIA0KDQojUHVudHVhY2nDs24gZGUgZWR1Y19zYWx1ZCwgZmFsdGFyw61hIGhhY2VyIGxvIG1pc21vIHBhcmEgbGFzIG90cmFzIGN1YXRybyBjb25kY2lvbmVzIHkgbHVlZ28gYXNpZ25hciB1biBwb3JjZW50YWplIGEgY2FkYSB1bm8gc2kgZXMgcG9zaWJsZS4tLS0tLS0tLS0tLS0NClRvdGFsX25vcm1fZWR1Y19zYWx1ZCA8LSBTdW1hX2VkdWNfc2FsdWRfbm9ybSAlPiUgc2VsZWN0KCJDQ0FBIiwgIkVkdWNfc2FsdWRfVG90YWwiKSANCg0KTm9ybV9lZHVjX3NhbHVkIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KFRvdGFsX25vcm1fZWR1Y19zYWx1ZFsyXSwgbWluX21heF9ub3JtX2dyYW4pKQ0KTm9ybV9lZHVjX3NhbHVkJENDQUEgPC0gQ0NBQV9zaW5fVUVfc2luX29yZA0KTm9ybV9lZHVjX3NhbHVkIDwtIE5vcm1fZWR1Y19zYWx1ZCAgJT4lIHNlbGVjdChDQ0FBID0gIkNDQUEiLCBldmVyeXRoaW5nKCkpICU+JSBhcnJhbmdlKGRlc2MoRWR1Y19zYWx1ZF9Ub3RhbCkpDQoNCiNubyBhY2Nlc29fMQ0KQ1Zfbm9fYWNjZXNvXzEgPC0gU3VtYV9lZHVjX3NhbHVkX25vcm1fb3JkICU+JSBzZWxlY3QoQ0NBQSwgbm9fYWNjZXNvXzEpICU+JSBmaWx0ZXIoQ0NBQSA9PSAiQ29tdW5pZGFkX1ZhbGVuY2lhbmEiKQ0KZ19ub19hY2Nlc29fMSA8LSBTdW1hX2VkdWNfc2FsdWRfbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBub19hY2Nlc29fMSkgJT4lIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoQ0NBQSwgbm9fYWNjZXNvXzEpLCB5ID0gbm9fYWNjZXNvXzEpKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gImJyb3duIikgKw0KICBsYWJzKCB5ID0gIlZhbG9yZXMgZGVsIMONbmRpY2UiICwNCiAgICAgICAgdGl0bGUgPSAiUHJvYmxlbWFzIGRlIGFjY2VzbyBzYW5pdGFyaW8gIiwNCiAgICAgICAgc3VidGl0bGUgPSAiUG9yIGxhcyByYXpvbmVzIGRlbCBncnVwbyAxIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICAjZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gcXVhcnRpbGVzLCBjb2xvdXIgPSAicmVkIikgKw0KICBnZW9tX2JhcihkYXRhID0gQ1Zfbm9fYWNjZXNvXzEsDQogICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAicGluayIpICsNCiAgdGhlbWVfd3NqKCkNCmdfbm9fYWNjZXNvXzENCg0KI2VzcGVyYW56YSBkZSB2aWRhDQpDVl9lc3BlcmFuemFfdmlkYSA8LSBTdW1hX2VkdWNfc2FsdWRfbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBlc3BlcmFuemFfdmlkYSkgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWRfVmFsZW5jaWFuYSIpDQpnX2VzcGVyYW56YV92aWRhIDwtIFN1bWFfZWR1Y19zYWx1ZF9ub3JtX29yZCAlPiUgc2VsZWN0KENDQUEsIGVzcGVyYW56YV92aWRhKSAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihDQ0FBLCBlc3BlcmFuemFfdmlkYSksIHkgPSBlc3BlcmFuemFfdmlkYSkpICsgDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAiYnJvd24iKSArDQogIGxhYnMoIHkgPSAiVmFsb3JlcyBkZWwgw41uZGljZSIgLA0KICAgICAgICB0aXRsZSA9ICJFc3BlcmFuemEgZGUgVmlkYSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YXJ0aWxlcywgY29sb3VyID0gInJlZCIpICsNCiAgZ2VvbV9iYXIoZGF0YSA9IENWX2VzcGVyYW56YV92aWRhLA0KICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gInBpbmsiKSArDQogIHRoZW1lX3dzaigpDQpnX2VzcGVyYW56YV92aWRhDQoNCiN0YXNhIGFiYW5kb25vDQpDVl9hYmFuZG9ubyA8LSBTdW1hX2VkdWNfc2FsdWRfbm9ybV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBhYmFuZG9ubykgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWRfVmFsZW5jaWFuYSIpDQpnX2FiYW5kb25vIDwtIFN1bWFfZWR1Y19zYWx1ZF9ub3JtX29yZCAlPiUgc2VsZWN0KENDQUEsIGFiYW5kb25vKSAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihDQ0FBLCBhYmFuZG9ubyksIHkgPSBhYmFuZG9ubykpICsgDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAiYnJvd24iKSArDQogIGxhYnMoIHkgPSAiVmFsb3JlcyBkZWwgw41uZGljZSIgLA0KICAgICAgICB0aXRsZSA9ICJUYXNhIGRlIGFiYW5kb25vIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICAjZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gcXVhcnRpbGVzLCBjb2xvdXIgPSAicmVkIikgKw0KICBnZW9tX2JhcihkYXRhID0gQ1ZfYWJhbmRvbm8sDQogICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAicGluayIpICsNCiAgdGhlbWVfd3NqKCkNCmdfYWJhbmRvbm8NCg0KI25pdmVsIGRlIGVkdWNhY2nDs24NCkNWX2VkdWNfMzggPC0gU3VtYV9lZHVjX3NhbHVkX25vcm1fb3JkICU+JSBzZWxlY3QoQ0NBQSwgZWR1Y18zOCkgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWRfVmFsZW5jaWFuYSIpDQpnX2VkdWNfMzggPC0gU3VtYV9lZHVjX3NhbHVkX25vcm1fb3JkICU+JSBzZWxlY3QoQ0NBQSwgZWR1Y18zOCkgJT4lIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoQ0NBQSwgZWR1Y18zOCksIHkgPSBlZHVjXzM4KSkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwNCiAgICAgICAgICAgZmlsbCA9ICJicm93biIpICsNCiAgbGFicyggeSA9ICJWYWxvcmVzIGRlbCDDjW5kaWNlIiAsDQogICAgICAgIHRpdGxlID0gIk5pdmVsIGRlIGVkdWMuIDMtOCIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YXJ0aWxlcywgY29sb3VyID0gInJlZCIpICsNCiAgZ2VvbV9iYXIoZGF0YSA9IENWX2VkdWNfMzgsDQogICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAicGluayIpICsNCiAgdGhlbWVfd3NqKCkNCmdfZWR1Y18zOA0KDQoNCmBgYA0KPGJyPiA8YnI+DQoNCiMjIDYuMS40IMONbmRpY2VzIGRlIG90cm9zIGluZGljYWRvcmVzDQoNCkVuICJvdHJvcyBpbmRpY2Fkb3JlcyIsIGRlc3RjYW4gcmVnaW9uZXMgcXVlIG5vIHN1ZWxlbiBlc3RhciBlbiBsYSBjaW1hIGNvbW8gcG9yIGVqZW1wbG8gQ2FudGFicmlhLCBFeHRyZW1hZHVyYSB5IENhc3RpbGxhIHkgTGXDs24geSBhIHN1IHZleiwgbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEgZXN0w6EgcG9yIGVuY2ltYSBkZWwgNTAlIGp1c3RvIHBvciBkZWxhbnRlIGRlIENhdGFsdcOxYSB5IGp1c3RvIHBvciBkZWJham8gZGVsIFBhw61zIHZhc2NvLg0KDQo8YnI+DQpgYGB7ciBpbmRpY2Ugb3Ryb3MgaW5kaWNhZG9yZXMgLCBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQoNCiNydWlkbyBub3JtYWxpemFkbw0KZGZfcnVpZG9zX25vcm0gPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoZGZfcnVpZG9zWzE4XSwgbWluX21heF9ub3JtX3BlcSkpDQpkZl9ydWlkb3Nfbm9ybSRDQ0FBIDwtIENDQUFfMg0KZGZfcnVpZG9zX25vcm0gPC0gZGZfcnVpZG9zX25vcm0gJT4lIHNlbGVjdChDQ0FBID0gIkNDQUEiLCBldmVyeXRoaW5nKCkpDQoNCiNkZWxpbmN1ZW5jaWENCmRmX2RlbF9jY2FhX25vcm0gPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoZGZfZGVsX2NjYWFbMThdLCBtaW5fbWF4X25vcm1fcGVxKSkNCmRmX2RlbF9jY2FhX25vcm0kQ0NBQSA8LSBDQ0FBX3Npbl9VRV9zaW5fb3JkDQpkZl9kZWxfY2NhYV9ub3JtIDwtIGRmX2RlbF9jY2FhX25vcm0gJT4lIHNlbGVjdChDQ0FBID0gIkNDQUEiLCBldmVyeXRoaW5nKCkpDQoNCiN1bmnDs24gZWZlY3RvcyBhbWJpZW50YWxlcw0KZGZfZWZfYW1iX25vcm0gPC0gaW5uZXJfam9pbihkZl9ydWlkb3Nfbm9ybSwgZGZfZGVsX2NjYWFfbm9ybSwgYnkgPSAiQ0NBQSIpDQpkZl9lZl9hbWJfbm9ybSA8LSBkZl9lZl9hbWJfbm9ybSAlPiUgcmVuYW1lKHJ1aWRvcyA9IFgyMDIwLngsIGRlbGluY3VlbmNpYSA9IFgyMDIwLnkpDQoNCmRmX2VmX2FtYl9ub3JtX3N1bWFfbm9fQ0NBQSA8LSBkZl9lZl9hbWJfbm9ybSAlPiUgc2VsZWN0KCEiQ0NBQSIpDQoNCiNvcmRlbmFkbw0KU3VtYV9lZl9hbWJfbm9ybV9zdW1hIDwtIGRmX2VmX2FtYl9ub3JtICAlPiUgbXV0YXRlKEVmX2FtYl90b3RhbCA9IHJvd1N1bXMoZGZfZWZfYW1iX25vcm1fc3VtYV9ub19DQ0FBKSkgJT4lIGFycmFuZ2UoZGVzYyhFZl9hbWJfdG90YWwpKQ0KI25vIG9yZGVuYWRvDQpTdW1hX2VmX2FtYl9ub3JtX3N1bWFfb3JkIDwtIGRmX2VmX2FtYl9ub3JtICAlPiUgbXV0YXRlKEVmX2FtYl90b3RhbCA9IHJvd1N1bXMoZGZfZWZfYW1iX25vcm1fc3VtYV9ub19DQ0FBKSkNCg0KI1B1bnR1YWNpw7NuIGRlIGVmZWN0b3MgYW1iaWVudGFsZXMsIGZhbHRhcsOtYSBoYWNlciBsbyBtaXNtbyBwYXJhIGxhcyBvdHJhcyBjdWF0cm8gY29uZGNpb25lcyB5IGx1ZWdvIGFzaWduYXIgdW4gcG9yY2VudGFqZSBhIGNhZGEgdW5vIHNpIGVzIHBvc2libGUuLS0tLS0tLS0tLS0tDQpUb3RhbF9ub3JtX2VmX2FtYiA8LSBTdW1hX2VmX2FtYl9ub3JtX3N1bWEgJT4lIHNlbGVjdCgiQ0NBQSIsICJFZl9hbWJfdG90YWwiKSANCg0KTm9ybV9lZl9hbWIgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoVG90YWxfbm9ybV9lZl9hbWJbMl0sIG1pbl9tYXhfbm9ybV9ncmFuKSkNCg0KTm9ybV9lZl9hbWIkQ0NBQSA8LSBDQ0FBXzMNCk5vcm1fZWZfYW1iIDwtIE5vcm1fZWZfYW1iICU+JSBzZWxlY3QoQ0NBQSA9ICJDQ0FBIiwgZXZlcnl0aGluZygpKSAlPiUgYXJyYW5nZShkZXNjKEVmX2FtYl90b3RhbCkpDQoNCiNSdWlkbw0KQ1ZfUnVpZG8gPC0gU3VtYV9lZl9hbWJfbm9ybV9zdW1hX29yZCAlPiUgc2VsZWN0KENDQUEsIHJ1aWRvcykgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWRfVmFsZW5jaWFuYSIpDQpnX3J1aWRvIDwtIFN1bWFfZWZfYW1iX25vcm1fc3VtYV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBydWlkb3MpICU+JSBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKENDQUEsIHJ1aWRvcyksIHkgPSBydWlkb3MpKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gImJsdWUiKSArDQogIGxhYnMoIHkgPSAiVmFsb3JlcyBkZWwgw41uZGljZSIgLA0KICAgICAgICB0aXRsZSA9ICJQcm9ibGVtYXMgZGUgcnVpZG8iKSArDQogIGNvb3JkX2ZsaXAoKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFydGlsZXMsIGNvbG91ciA9ICJyZWQiKSArDQogIGdlb21fYmFyKGRhdGEgPSBDVl9SdWlkbywNCiAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwNCiAgICAgICAgICAgZmlsbCA9ICJyZWQiKSArDQogIHRoZW1lX3dzaigpDQpnX3J1aWRvDQoNCiNEZWxpbmN1ZW5jaWENCkNWX2RlbGluY3VlbmNpYSA8LSBTdW1hX2VmX2FtYl9ub3JtX3N1bWFfb3JkICU+JSBzZWxlY3QoQ0NBQSwgZGVsaW5jdWVuY2lhKSAlPiUgZmlsdGVyKENDQUEgPT0gIkNvbXVuaWRhZF9WYWxlbmNpYW5hIikNCmdfZGVsaW5jdWVuY2lhIDwtIFN1bWFfZWZfYW1iX25vcm1fc3VtYV9vcmQgJT4lIHNlbGVjdChDQ0FBLCBkZWxpbmN1ZW5jaWEpICU+JSBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKENDQUEsIGRlbGluY3VlbmNpYSksIHkgPSBkZWxpbmN1ZW5jaWEpKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gImJsdWUiKSArDQogIGxhYnMoIHkgPSAiVmFsb3JlcyBkZWwgw41uZGljZSIgLA0KICAgICAgICB0aXRsZSA9ICJQZXJjZXBjacOzbiBkZSBkZWxpbmN1ZW5jaWEiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFydGlsZXMsIGNvbG91ciA9ICJyZWQiKSArDQogIGdlb21fYmFyKGRhdGEgPSBDVl9kZWxpbmN1ZW5jaWEsDQogICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAicmVkIikgKw0KICB0aGVtZV93c2ooKQ0KZ19kZWxpbmN1ZW5jaWENCg0KDQpgYGANCjxicj48YnI+DQoNCg0KIyMgNi4yIMONbmRpY2UgZGUgbGFzIGN1YXRybyBjYXRlZ29yw61hcw0KDQo8YnI+DQoNCmBgYHtyIGluZGljZSBkZSBsYXMgY3VhdHJvIGNhdGVnb3JpYXMgY29uanVudG8gLCBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQojR3LDoWZpY28gw61uZGljZSBjb25kaWNpb25lc21hdGVyaWFsZXMtLS0tLS0tLS0tLQ0KDQpDVl9Ob3JtX2NvbmRfZWNvbiA8LSBOb3JtX2NvbmRfZWNvbiAlPiUgZmlsdGVyKENDQUEgPT0gIkNvbXVuaWRhZF9WYWxlbmNpYW5hIikNCg0KcF9jb25kX21hdCA8LSBOb3JtX2NvbmRfZWNvbiAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihDQ0FBLCBjb25kX2Vjb25fdG90YWwpLCB5ID0gY29uZF9lY29uX3RvdGFsKSkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgIGZpbGwgPSAic3RlZWxibHVlIikgKw0KICBsYWJzKCB5ID0gIlZhbG9yZXMgZGVsIMONbmRpY2UiICwNCiAgICAgICB0aXRsZSA9ICJMYXMgY29uZGljaW9uZXMgbWF0ZXJpYWxlcyIsDQogICAgICAgI3N1YnRpdGxlID0gIkRlc3RhY2FuZG8gbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEiLA0KICAgICAgIGNhcHRpb24gPSAiRWxhYm9yYWNpw7NuIHByb3BpYSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YXJ0aWxlcywgY29sb3VyID0gInJlZCIpICsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICdibGFjaycsIHNpemUgPSAxKSkgKw0KICBnZW9tX2JhcihkYXRhID0gQ1ZfTm9ybV9jb25kX2Vjb24sDQogICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAiIGRhcmsgb3JhbmdlIikgKw0KICB0aGVtZV93c2ooKQ0KDQpwX2NvbmRfbWF0DQoNCiNHcsOhZmljbyDDrW5kaWNlIHRyYWJham8tLS0tLS0tLS0NCkNWX05vcm1fdHJhYmFqbyA8LSBOb3JtX3RyYWJham8gJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWRfVmFsZW5jaWFuYSIpDQoNCnBfdHJhYmFqbyA8LSBOb3JtX3RyYWJham8gJT4lIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoQ0NBQSwgdHJhYmFqb190b3RhbCksIHkgPSB0cmFiYWpvX3RvdGFsKSkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwNCiAgICAgICAgICAgZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnMoIHkgPSAiVmFsb3JlcyBkZWwgw41uZGljZSIgLA0KICAgICAgICB0aXRsZSA9ICJFbCB0cmFiYWpvIiwNCiAgICAgICAgI3N1YnRpdGxlID0gIkRlc3RhY2FuZG8gbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEiLA0KICAgICAgICBjYXB0aW9uID0gIkVsYWJvcmFjacOzbiBwcm9waWEiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFydGlsZXMsIGNvbG91ciA9ICJyZWQiKSArDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAnYmxhY2snLCBzaXplID0gMSkpICsNCiAgZ2VvbV9iYXIoZGF0YSA9IENWX05vcm1fdHJhYmFqbywNCiAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwNCiAgICAgICAgICAgZmlsbCA9ICIgZGFyayBvcmFuZ2UiKSArDQogIHRoZW1lX3dzaigpDQpwX3RyYWJham8NCg0KI0dyw6FmaWNvIGVkdWMgc2FsdWQtLS0tLS0tLS0tDQpDVl9Ob3JtX2VkdWNfc2FsdWQgPC0gTm9ybV9lZHVjX3NhbHVkICU+JSBmaWx0ZXIoQ0NBQSA9PSAiQ29tdW5pZGFkX1ZhbGVuY2lhbmEiKQ0KDQpwX2VkdWNfc2FsdWQgPC0gTm9ybV9lZHVjX3NhbHVkICAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihDQ0FBLCBFZHVjX3NhbHVkX1RvdGFsKSwgeSA9IEVkdWNfc2FsdWRfVG90YWwpKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gInN0ZWVsYmx1ZSIpICsNCiAgbGFicyggeSA9ICJWYWxvcmVzIGRlbCDDjW5kaWNlIiAsDQogICAgICAgIHRpdGxlID0gIkVkdWNhY2nDs24geSBsYSBzYWx1ZCIsDQogICAgICAgICNzdWJ0aXRsZSA9ICJEZXN0YWNhbmRvIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIiwNCiAgICAgICAgY2FwdGlvbiA9ICJFbGFib3JhY2nDs24gcHJvcGlhIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICAjZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gcXVhcnRpbGVzLCBjb2xvdXIgPSAicmVkIikgKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ2JsYWNrJywgc2l6ZSA9IDEpKSArDQogIGdlb21fYmFyKGRhdGEgPSBDVl9Ob3JtX2VkdWNfc2FsdWQsDQogICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAiIGRhcmsgb3JhbmdlIikgKw0KICB0aGVtZV93c2ooKQ0KDQpwX2VkdWNfc2FsdWQNCg0KI0dyw6FmaWNvIG90cm9zIGluZGljYWRvcmVzLS0tLS0tLS0tDQpDVl9Ob3JtX2VmX2FtYiA8LSBOb3JtX2VmX2FtYiAlPiUgZmlsdGVyKENDQUEgPT0gIkNvbXVuaWRhZF9WYWxlbmNpYW5hIikNCg0KcF9vdHJvc19pbmQgPC0gTm9ybV9lZl9hbWIgICU+JSBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKENDQUEsIEVmX2FtYl90b3RhbCksIHkgPSBFZl9hbWJfdG90YWwpKSArIA0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gInN0ZWVsYmx1ZSIpICsNCiAgbGFicyggeSA9ICJWYWxvcmVzIGRlbCDDjW5kaWNlIiAsDQogICAgICAgIHRpdGxlID0gIk90cm9zIGluZGljYWRvcmVzIiwNCiAgICAgICAgI3N1YnRpdGxlID0gIkRlc3RhY2FuZG8gbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEiLA0KICAgICAgICBjYXB0aW9uID0gIkVsYWJvcmFjacOzbiBwcm9waWEiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFydGlsZXMsIGNvbG91ciA9ICJyZWQiKSArDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAnYmxhY2snLCBzaXplID0gMSkpICsNCiAgZ2VvbV9iYXIoZGF0YSA9IENWX05vcm1fZWZfYW1iLA0KICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsID0gIiBkYXJrIG9yYW5nZSIpICsNCiAgdGhlbWVfd3NqKCkNCnBfb3Ryb3NfaW5kDQoNCg0KDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyA2LjMgw41uZGljZSBmaW5hbA0KDQpFbiBjb25jbHVzacOzbiwgdmVtb3MgcXVlIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIHN1ZWxlIGVzdGFyIGEgbml2ZWxlcyBtZWRpb3MgZW4gY29tcGFyYWNpw7NuIGNvbiBlbCByZXN0byBkZSBsYXMgQ0NBQS4gRXhpc3RlbiBpbmRpY2Fkb3JlcyBlbiBlbCBjdWFsIGVzdMOhIHBvciBlbmNpbWEgZGUgbGEgbWVkaWEgZGUgRXNwYcOxYSBwZXJvIG90cm9zIGVuIGVsIGN1YWwgc3UgcmFua2luZyBlcyBtdXkgaW5mZXJpb3IuIEFkZW3DoXMsIG9ic2VydmFtb3MgdW5hIGNsYXJhIHRlbmRlbmNpYSBlbiBkb25kZSBsYXMgem9uYXMgaW5kdXN0cmlhbGVzIGNvbW8gUGHDrXMgVmFzY28gTmF2cnJhIHkgTWFkcmlkIGxpZGVyYW4gZWwgcmFua2luZywgbWllbnRyYXMgcXVlIGxhcyB6b25hcyB0cmFkaW9uYWxtZW50ZSBtw7FhcyBzdWJkZXNhcnJvbGxhZG9zIGNvbW8gQ2V1dGEsIE1lbGlsbGEsIEFuZGFsdWPDrWEsIENhbmFyaWFzIHkgTXVyY2lhIGVzdMOhbiBtdXkgYWxlamFkb3MgZGVsIHJlc3RvIGRlIEVzcGHDsWEuIEEgdG9kbyBlc3RvLCBoYWJyw61hIHF1ZSBhY3R1YWxpemFyIGxvcyBkYXRvcyBkZSBlc3RlIGHDsW8gY29uIGxvcyBlZmVjdG9zIGVjb27DsW9taWNvcyBuZWdhdGl2b3MgcHJvdmNhZG9zIHBvciBsYSBjcmlzaXMgc2FuaXRhcmlhIGQgZWxhIENPVklELTE5IHkgYW5hbGl6YXIgZWwgZWZlY3RvLCBzaSBoYSBzaWRvIGhvbW9nw6luZW8gbyBoZXRlcm9nw6luZW8gZW50cmUgbGFzIENvbXVuaWRhZGVzIEF1dMOzbm9tYXMgZGUgRXNwYcOxYS4NCjxicj4NCmBgYHtyIHJhbmtpbmcgZmluYWwgLCBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQoNCiNDcmVhciBSYW5raW5nIEZpbmFsDQoNCmRmX2NvbmRfZWNvbl9lZHVjX3NhbHVkIDwtIGlubmVyX2pvaW4oTm9ybV9jb25kX2Vjb24sIE5vcm1fZWR1Y19zYWx1ZCwgYnkgPSAiQ0NBQSIpDQpkZl9lZl9hbWJfdHJhYmFqbyA8LSBpbm5lcl9qb2luKE5vcm1fZWZfYW1iLCBOb3JtX3RyYWJham8sIGJ5ID0gIkNDQUEiKQ0KDQpkZl9yYW5raW5nX2ZpbmFsIDwtIGlubmVyX2pvaW4oZGZfY29uZF9lY29uX2VkdWNfc2FsdWQsIGRmX2VmX2FtYl90cmFiYWpvLCBieSA9ICJDQ0FBIikNCg0KZGZfcmFua2luZ19maW5hbF9zaW5fQ0NBQSA8LSBkZl9yYW5raW5nX2ZpbmFsICU+JSBzZWxlY3QoISJDQ0FBIikNCg0KI29yZGVuYWRvDQpTdW1hX3JhbmtpbmdfZmluYWxfb3JkIDwtIGRmX3JhbmtpbmdfZmluYWwgJT4lIG11dGF0ZShyYW5raW5nX2ZpbmFsX3RvdGFsID0gcm93U3VtcyhkZl9yYW5raW5nX2ZpbmFsX3Npbl9DQ0FBKSkgJT4lIGFycmFuZ2UoZGVzYyhyYW5raW5nX2ZpbmFsX3RvdGFsKSkNCiNubyBvcmRlbmFkbw0KU3VtYV9yYW5raW5nX2ZpbmFsIDwtIGRmX3JhbmtpbmdfZmluYWwgICU+JSBtdXRhdGUocmFua2luZ19maW5hbF90b3RhbCA9IHJvd1N1bXMoZGZfcmFua2luZ19maW5hbF9zaW5fQ0NBQSkpIA0KDQojUHVudHVhY2nDs24gZGUgcmFua2luZyBmaW5hbA0KVG90YWxfbm9ybV9yYW5raW5nX2ZpbmFsIDwtIFN1bWFfcmFua2luZ19maW5hbCAlPiUgc2VsZWN0KCJDQ0FBIiwgInJhbmtpbmdfZmluYWxfdG90YWwiKSANCg0KTm9ybV9yYW5raW5nX2ZpbmFsIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KFRvdGFsX25vcm1fcmFua2luZ19maW5hbFsyXSwgbWluX21heF9ub3JtX2dyYW4pKQ0KTm9ybV9yYW5raW5nX2ZpbmFsJENDQUEgPC0gQ0NBQV9yYW5rX2ZpbmFsDQpOb3JtX3JhbmtpbmdfZmluYWwgPC0gTm9ybV9yYW5raW5nX2ZpbmFsICAlPiUgc2VsZWN0KENDQUEgPSAiQ0NBQSIsIGV2ZXJ5dGhpbmcoKSkgJT4lIGFycmFuZ2UoZGVzYyhyYW5raW5nX2ZpbmFsX3RvdGFsKSkNCg0KI0dyw6FmaWNvIGNvbiBSYW5raW5nIEZpbmFsLS0tLS0tLS0tLS0tLQ0KQ1ZfcmFua2luZ19maW5hbCA8LSBOb3JtX3JhbmtpbmdfZmluYWwgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWRfVmFsZW5jaWFuYSIpDQoNCnBfcmFua19maW5hbCA8LSBOb3JtX3JhbmtpbmdfZmluYWwgICU+JSBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKENDQUEsIHJhbmtpbmdfZmluYWxfdG90YWwpLCB5ID0gcmFua2luZ19maW5hbF90b3RhbCkpICsgDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAiZ3JlZW4iKSArDQogIGxhYnMoIHkgPSAiVmFsb3JlcyBkZWwgw41uZGljZSIgLA0KICAgICAgICB0aXRsZSA9ICLDjW5kaWNlIGRlIEJ1ZW5hIFZpZGEiLA0KICAgICAgICBjYXB0aW9uID0gIkVsYWJvcmFjacOzbiBwcm9waWEiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFydGlsZXMsIGNvbG91ciA9ICJyZWQiKSArDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAnYmxhY2snLCBzaXplID0gMSkpICsNCiAgZ2VvbV9iYXIoZGF0YSA9IENWX3JhbmtpbmdfZmluYWwsDQogICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGwgPSAiIGRhcmsgb3JhbmdlIikgKw0KICB0aGVtZV93c2ooKQ0KDQpwX3JhbmtfZmluYWwNCg0KYGBgDQo8YnI+