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.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.
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.
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
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
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.
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%.
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.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+