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. Introducción

El objetivo principal de este trabajo sería un análisis de los Juegos Olímipicos en la historia a través de diferentes variables: género, disciplinas, medallas… Se pondrá en práctica muchos de los conocimientos adquiridos en las clases de ‘Programación y manejo de datos en la era de Big Data’ con sus respectivas y más importantes funciones, gráficos y demás que hemos asimilado durante el curso.

Los Juegos Olímpicos son el mayor evento deportivo internacional multidisciplinario en el que participan atletas de diversas partes del mundo. Los Juegos Olímpicos son considerados la principal competición del mundo deportivo, con más de doscientas naciones participantes. Existen dos tipos: los Juegos Olímpicos de Verano y los Juegos Olímpicos de Invierno, que se realizan con un intervalo de dos años, según la Carta Olímpica: «Los Juegos de la Olimpiada se celebran durante el primer año de una Olimpiada y los Juegos Olímpicos de Invierno durante su tercer año. En nuestro trabajo, algunos de los análisis tratarab sobre los Juegos Olímpicos de Verano y otros de los Juegos Olímpicos en general.

JuegosOlimpicos

2. Datos

Los datos para realizar el análisis oportuno han sido extraidos de Kaggle ya que dicha plataforma contenía unna gran variedad de datos relacionados con esta gran competición.

2.1. Procesando los datos

El análisis se ha realizado sobre 4 dataframes:

aa: 31165 observaciones.

bb:11085 observaciones.

cc:46 observaciones.

dd:93 observaciones.

library(ggplot2) 
library(readr) 
library(plyr)
library(rworldmap)
library(repr)
library(plotly)

3. Participación según Género.

Como se puede observar en el gráfico, la participación de Hombres y mujeres desde 1896 hasta 2012 no ha estado equilibrada. Mediante un gráfico de lineas, se visualiza que año a año, el número de hombres que han participado medidio por la variable freq ha sido bastante superior al de mujeres sobretodo en el pico del año 1920 donde la participación de las mujeres (43) en el juego estaba muy por debajo de la del género masculino (1255). Se ha animado el ggplot para ver mejor el resultado.

df_aa <- aa %>%
select(Year, Gender)%>%
group_by(Gender,Year)%>%
count()
ggplot_aa <- ggplot() + geom_line(data = df_aa, aes(x= Year, y=freq, group = Gender, color = Gender)) +
labs(title = 'Participación año a año (género)',
     color = "Género")  + xlab("Año") + ylab("Nº de Hombres y Mujeres") + theme_void()

ggplotly(ggplot_aa)

4. Diez países con más medallas.

Este gráfico muestra muy visualmente 10 puntos que corresponden a los 10 países que han ganado más medallas en los Juegos Olímipicos.Se ha restringido a 10 para que quedara más visual con la función head.Además se han combinado los colores del gráfico con la opción theme para que se viera claramente. Podemos encontrar países como Australia, Francia, Alemania, Japón,ROC… y claramente, si pinchamos en el punto más alto , el país que destaca es People’s Republic of China con un totoal de 88 medallas.

df_dd <- dd %>%
  head(10)
  
ggplotc <- ggplot(df_dd, aes(Pais, Total, size = 0.75, color= "orange")) +
  geom_point() +
  theme_bw()+ 
  theme(legend.position = "none") +
  labs(x = NULL) + theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank()) + labs(title= "Los 10 países con más Medallas") +
  theme(panel.background = element_rect(fill = 'wheat1', colour = 'red')) + theme(panel.background = element_rect(fill = "White"),
    plot.background = element_rect(fill = "#EEDFCC",
        colour = "#EEDFCC"))

ggplotly(ggplotc)
df_dd
Rank Pais Gold Silver Bronze Total Rank by Total
1 United States of America 39 41 33 113 1
2 People’s Republic of China 38 32 18 88 2
3 Japan 27 14 17 58 5
4 Great Britain 22 21 22 65 4
5 ROC 20 28 23 71 3
6 Australia 17 7 22 46 6
7 Netherlands 10 12 14 36 9
8 France 10 12 11 33 10
9 Germany 10 11 16 37 8
10 Italy 10 10 20 40 7

JuegosOlimpicos

4. 1. Medallas en los diferentes países.

Como podemos ver, los países con más medallas en los Juegos Olímpicos son los países desarrollados de América del Norte, Asia y Europa. Los países más pobres de África y América del Sur no destacan por ello.

Este mapa ha sido realizado de forma más costosa con lo aprendido en clase y la información proporcionada en un kaggle sobre el tema a analizar.

count=c(1)
aa$MedalCount=count
aa$Athlete=as.character(aa$Athlete)

options(repr.plot.width=6, repr.plot.height=6)
world <- map_data(map="world")
world <- world[world$region != "Antarctica",] # 
y=ddply(aa, .(Country,Medal), numcolwise(sum))
sPDF <- joinCountryData2Map( y
                             ,joinCode = "ISO3"
                             ,nameJoinColumn = "Country")
#> 209 codes from your data successfully matched countries in the map
#> 140 codes from your data failed to match with a country code in the map
#> 159 codes from the map weren't represented in your data

mapCountryData(sPDF
               ,nameColumnToPlot='MedalCount')

5. Tipo Medallas en los países más importantes.

En este apartado se analiza el tipo de medallas que se han ganado en cinco países diferentes. Se han filtrado los países y agrupado según el país y el tipo de medalla. Como se observa en el gráfico, el país con más medallas de oro representado en color verde se identifica con USA seguido por Rusia. El que menos medallas de oro ha ganado es Alemania. USA también destaca por su número de medallas de plata y de bronze. Es generalmente el país que más destaca en el análisis.

df_bb <- aa %>%
select(Country, Medal, MedalCount, Year)%>%
group_by(Country, MedalCount)%>%
filter(Country %in% c("GER", "FRA", "GBR", "URS", "USA") )


ggplota <- ggplot(df_bb,aes(x=reorder(Country,MedalCount),y=MedalCount,fill=Medal,group=Medal))+geom_bar(stat='identity')


ggplota

JuegosOlimpicos

6. Número de atletas que participan en cada país.

Mediante un gráfico de barras invertido con coord flip para mejorar la visualización , podemos observar que USA cuenta con el mayor número de atletas que participan en las Olimpiadas seguido de Japón. Nuestro país se queda por debajo de estos.Este gráfico también es interactivo.


atletas_mundo <- bb%>%
    group_by(NOC) %>%
        summarise(count = n()) %>%
        arrange(desc(count))%>%
        head(10)

atletas_mundo
NOC count
United States of America 615
Japan 586
Australia 470
People’s Republic of China 401
Germany 400
France 377
Canada 368
Great Britain 366
Italy 356
Spain 324

ggplotb <-ggplot(atletas_mundo, aes(x = NOC, y = count)) + 
      geom_col(aes(fill = NOC), color = "black")  + theme(legend.position = 'none')+ coord_flip() + xlab("Atletas") + ylab("Países")
 
ggplotly(ggplotb)

7. Número de deportistas que se presentan a las disciplinas más

Mediante este gráfico circular, se observa la disciplina más practicada en los juegos olímpicos. Se trata de gimnasia y voley playa. Una de las que menos es basket. Hemos restringido el análisis a 10 disciplinas.Con theme he modificado la estética del gráfico para que con el color se vea mejor.


df_cc <- cc %>%
arrange(desc(Total))%>%
slice_max(Total, n=10)


df_cca <- ggplot(df_cc, aes(x=reorder(Discipline, Total), y=Total, fill=Discipline))+
  geom_bar(stat="identity") +
  theme(legend.position = "none") +
  coord_polar(start = 0.01) +
  labs (x="Disciplinas") + labs(y="Total personas practican") + labs(title = "Num. Personas que practican cada disciplina") + theme(panel.background = element_rect(fill = "#EEDFCC"),
    plot.background = element_rect(fill = "#EEDFCC"))

df_cc
Discipline Female Male Total
Beach Volleyball 48 48 96
Rhythmic Gymnastics 96 0 96
Canoe Slalom 41 41 82
Karate 40 42 82
Skateboarding 40 40 80
Swimming 361 418 779
Cycling Mountain Bike 38 38 76
Modern Pentathlon 36 36 72
3x3 Basketball 32 32 64
Football 264 344 608
df_cca

8. Trabajos en los que te has basado:

Principalmente me he basado en los tutoriales de lapágina web de trabajo de la asignatura y de Kaggle que seran notificados en la bibliografía del trabajo.

9. Conclusión.

“Nadie llega tan lejos si no es para seguir”

En este trabajo he asentado lo que hemos aprendido en el curso de Programación y manejo de datos en la era de Big data. Sobretodo he enfatizado en la visualización de los diferentes ggplots. Este tema siempre me ha llamado la atención y se ha podido observar un breve análisis sobre las variables más significativas del tema. Puede servir de información útil para la gente aficionada en el tema.

12. Sesión Informativa.

Información de mi R-sesión:

- Session info ---------------------------------------------------------------
 setting  value
 version  R version 4.1.1 (2021-08-10)
 os       Windows 10 x64 (build 19042)
 system   x86_64, mingw32
 ui       RTerm
 language (EN)
 collate  Spanish_Spain.1252
 ctype    Spanish_Spain.1252
 tz       Europe/Paris
 date     2022-01-04
 pandoc   2.11.4 @ C:/Users/Usuario/OneDrive/Documentos/RStudio/bin/pandoc/ (via rmarkdown)

- Packages -------------------------------------------------------------------
 package     * version    date (UTC) lib source
 assertthat    0.2.1      2019-03-21 [1] CRAN (R 4.1.2)
 backports     1.3.0      2021-10-27 [1] CRAN (R 4.1.1)
 base64enc     0.1-3      2015-07-28 [1] CRAN (R 4.1.1)
 broom         0.7.10     2021-10-31 [1] CRAN (R 4.1.2)
 cellranger    1.1.0      2016-07-27 [1] CRAN (R 4.1.2)
 cli           3.1.0      2021-10-27 [1] CRAN (R 4.1.2)
 clipr         0.7.1      2020-10-08 [1] CRAN (R 4.1.2)
 colorspace    2.0-2      2021-06-24 [1] CRAN (R 4.1.2)
 crayon        1.4.2      2021-10-29 [1] CRAN (R 4.1.2)
 crosstalk     1.2.0      2021-11-04 [1] CRAN (R 4.1.2)
 curl          4.3.2      2021-06-23 [1] CRAN (R 4.1.2)
 data.table    1.14.2     2021-09-27 [1] CRAN (R 4.1.2)
 DBI           1.1.1      2021-01-15 [1] CRAN (R 4.1.2)
 dbplyr        2.1.1      2021-04-06 [1] CRAN (R 4.1.2)
 desc          1.4.0      2021-09-28 [1] CRAN (R 4.1.2)
 details       0.2.1      2020-01-12 [1] CRAN (R 4.1.2)
 digest        0.6.29     2021-12-01 [1] CRAN (R 4.1.2)
 dotCall64     1.0-1      2021-02-11 [1] CRAN (R 4.1.2)
 dplyr       * 1.0.7      2021-06-18 [1] CRAN (R 4.1.2)
 ellipsis      0.3.2      2021-04-29 [1] CRAN (R 4.1.2)
 evaluate      0.14       2019-05-28 [1] CRAN (R 4.1.2)
 fansi         0.5.0      2021-05-25 [1] CRAN (R 4.1.2)
 farver        2.1.0      2021-02-28 [1] CRAN (R 4.1.2)
 fastmap       1.1.0      2021-01-25 [1] CRAN (R 4.1.2)
 fields        13.3       2021-10-30 [1] CRAN (R 4.1.2)
 forcats     * 0.5.1      2021-01-27 [1] CRAN (R 4.1.2)
 foreign       0.8-81     2020-12-22 [2] CRAN (R 4.1.1)
 fs            1.5.2      2021-12-08 [1] CRAN (R 4.1.2)
 generics      0.1.1      2021-10-25 [1] CRAN (R 4.1.2)
 ggplot2     * 3.3.5      2021-06-25 [1] CRAN (R 4.1.2)
 glue          1.5.1      2021-11-30 [1] CRAN (R 4.1.2)
 gridExtra     2.3        2017-09-09 [1] CRAN (R 4.1.2)
 gtable        0.3.0      2019-03-25 [1] CRAN (R 4.1.2)
 haven         2.4.3      2021-08-04 [1] CRAN (R 4.1.2)
 here          1.0.1      2020-12-13 [1] CRAN (R 4.1.2)
 highr         0.9        2021-04-16 [1] CRAN (R 4.1.2)
 hms           1.1.1      2021-09-26 [1] CRAN (R 4.1.2)
 htmltools     0.5.2      2021-08-25 [1] CRAN (R 4.1.2)
 htmlwidgets   1.5.4      2021-09-08 [1] CRAN (R 4.1.2)
 httr          1.4.2      2020-07-20 [1] CRAN (R 4.1.2)
 jquerylib     0.1.4      2021-04-26 [1] CRAN (R 4.1.2)
 jsonlite      1.7.2      2020-12-09 [1] CRAN (R 4.1.2)
 klippy      * 0.0.0.9500 2021-12-13 [1] Github (rlesur/klippy@378c247)
 knitr       * 1.36       2021-09-29 [1] CRAN (R 4.1.2)
 labeling      0.4.2      2020-10-20 [1] CRAN (R 4.1.1)
 lattice       0.20-44    2021-05-02 [2] CRAN (R 4.1.1)
 lazyeval      0.2.2      2019-03-15 [1] CRAN (R 4.1.2)
 lifecycle     1.0.1      2021-09-24 [1] CRAN (R 4.1.2)
 lubridate     1.8.0      2021-10-07 [1] CRAN (R 4.1.2)
 magrittr      2.0.1      2020-11-17 [1] CRAN (R 4.1.2)
 maps          3.4.0      2021-09-25 [1] CRAN (R 4.1.2)
 maptools      1.1-2      2021-09-07 [1] CRAN (R 4.1.2)
 modelr        0.1.8      2020-05-19 [1] CRAN (R 4.1.2)
 munsell       0.5.0      2018-06-12 [1] CRAN (R 4.1.2)
 openxlsx      4.2.4      2021-06-16 [1] CRAN (R 4.1.2)
 pillar        1.6.4      2021-10-18 [1] CRAN (R 4.1.2)
 pkgconfig     2.0.3      2019-09-22 [1] CRAN (R 4.1.2)
 plotly      * 4.10.0     2021-10-09 [1] CRAN (R 4.1.2)
 plyr        * 1.8.6      2020-03-03 [1] CRAN (R 4.1.2)
 png           0.1-7      2013-12-03 [1] CRAN (R 4.1.1)
 purrr       * 0.3.4      2020-04-17 [1] CRAN (R 4.1.2)
 R6            2.5.1      2021-08-19 [1] CRAN (R 4.1.2)
 Rcpp          1.0.7      2021-07-07 [1] CRAN (R 4.1.2)
 readr       * 2.1.1      2021-11-30 [1] CRAN (R 4.1.2)
 readxl        1.3.1      2019-03-13 [1] CRAN (R 4.1.2)
 remotes       2.4.2      2021-11-30 [1] CRAN (R 4.1.2)
 repr        * 1.1.3      2021-01-21 [1] CRAN (R 4.1.2)
 reprex        2.0.1      2021-08-05 [1] CRAN (R 4.1.2)
 rio           0.5.29     2021-11-22 [1] CRAN (R 4.1.2)
 rlang         0.4.12     2021-10-18 [1] CRAN (R 4.1.2)
 rmarkdown     2.11       2021-09-14 [1] CRAN (R 4.1.2)
 rprojroot     2.0.2      2020-11-15 [1] CRAN (R 4.1.2)
 rstudioapi    0.13       2020-11-12 [1] CRAN (R 4.1.2)
 rvest         1.0.2      2021-10-16 [1] CRAN (R 4.1.2)
 rworldmap   * 1.3-6      2016-02-03 [1] CRAN (R 4.1.2)
 scales        1.1.1      2020-05-11 [1] CRAN (R 4.1.2)
 sessioninfo   1.2.2      2021-12-06 [1] CRAN (R 4.1.2)
 sp          * 1.4-6      2021-11-14 [1] CRAN (R 4.1.2)
 spam          2.7-0      2021-06-25 [1] CRAN (R 4.1.2)
 stringi       1.7.6      2021-11-29 [1] CRAN (R 4.1.2)
 stringr     * 1.4.0      2019-02-10 [1] CRAN (R 4.1.2)
 tibble      * 3.1.6      2021-11-07 [1] CRAN (R 4.1.2)
 tidyr       * 1.1.4      2021-09-27 [1] CRAN (R 4.1.2)
 tidyselect    1.1.1      2021-04-30 [1] CRAN (R 4.1.2)
 tidyverse   * 1.3.1      2021-04-15 [1] CRAN (R 4.1.2)
 tzdb          0.2.0      2021-10-27 [1] CRAN (R 4.1.2)
 utf8          1.2.2      2021-07-24 [1] CRAN (R 4.1.2)
 vctrs         0.3.8      2021-04-29 [1] CRAN (R 4.1.2)
 viridis       0.6.2      2021-10-13 [1] CRAN (R 4.1.2)
 viridisLite   0.4.0      2021-04-13 [1] CRAN (R 4.1.2)
 withr         2.4.3      2021-11-30 [1] CRAN (R 4.1.2)
 xfun          0.28       2021-11-04 [1] CRAN (R 4.1.2)
 xml2          1.3.3      2021-11-30 [1] CRAN (R 4.1.2)
 yaml          2.2.1      2020-02-01 [1] CRAN (R 4.1.1)
 zip           2.2.0      2021-05-31 [1] CRAN (R 4.1.2)

 [1] C:/Users/Usuario/Documents/R/win-library/4.1
 [2] C:/Program Files/R/R-4.1.1/library

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




LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBKdWVnb3MgT2zDrW1waWNvcyINCnN1YnRpdGxlOiAiQWxiYSAoaW1vbmFsQGFsdW1uaS51di5lcykiDQphdXRob3I6ICJVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEiDQpkYXRlOiAiRGljaWVtYnJlIGRlIDIwMjEgKGFjdHVhbGl6YWRvIGVsIGByIGZvcm1hdChTeXMudGltZSgpLCAnJWQtJW0tJVknKWApIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgICNjc3M6ICIuL2Fzc2V0cy9teV9jc3NfZmlsZS5jc3MiDQogICAgdGhlbWU6IHBhcGVyDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMgDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQouY29sdW1ucyB7ZGlzcGxheTpmbGV4O30NCmgxLnRpdGxlIHtmb250LXNpemU6IDQwIHB4O2NvbG9yOiAjQ0QxMDc2fQ0KaDEge2NvbG9yOiNDRDEwNzY7IGZvbnQtc2l6ZTogMzBweCA7Zm9udC1mYW1pbHk6IEFyaWFsIEJsYWNrfQ0KaDJ7Y29sb3I6ICNDRDEwNzY7IGZvbnQtc2l6ZTogMjBweDsgZm9udC1mYW1pbHk6IEFyaWFsfQ0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6ICNFRURGQ0N9DQphIHtjb2xvcjogI0NEMTA3Njt9DQoubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSwgLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMsIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyIHsNCiAgICB6LWluZGV4OiAyOw0KICAgIGNvbG9yOiA7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI0NEMTA3NjsNCiAgICBib3JkZXItY29sb3I6IHBhbGVyZWQ7DQp9DQoubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYSwgLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGE6aG92ZXIsIC5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiANCmBgYA0KDQoNCg0KDQoNCmBgYHtyIHBhY2thZ2VzLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoa2xpcHB5KSAgIA0KcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KJ2ZvcmNlID0gVFJVRScNCmxpYnJhcnkoa25pdHIpDQpgYGANCg0KYGBge3IgY2h1bmstc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsDQogICAgICAgICAgICAgICAgICAgICAgI2ZpZy53aWR0aCA9IDcsICNmaWcuaGVpZ2h0PSA3LCAgIA0KICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywNCiAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA9IFRSVUUsICBmaWcuc2hvdyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gMC42MjgsIG91dC53aWR0aCA9ICI3NSUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChkZXYgPSAicG5nIiwgZGV2LmFyZ3MgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpDQpgYGANCg0KDQoNCg0KDQpgYGB7ciBvcHRpb25zLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpw7NuIGNpZW50w61maWNhDQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSANCmBgYA0KDQoNCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFfQ0Ka2xpcHB5OjprbGlwcHkocG9zaXRpb24gPSBjKCJ0b3AiLCAicmlnaHQiKSkgIy0gcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KYGBgDQoNCg0KPGhyIGNsYXNzPSJsaW5lYS1ibGFjayI+DQoNCjwhLS0gRWwgcMOhcnJhZm8gZGUgYWJham8gaGFzIGRlIGRlamFybG8gY2FzaSBpZ3VhbCwgc29sbyBIQVMgZGUgU1VTVElUVUlSICJwZXJlenA0NCIgcG9yIHR1IHVzdWFyaW8gZGUgR2l0aHViLS0+DQpUcmFiYWpvIGVsYWJvcmFkbyBwYXJhIGxhIGFzaWduYXR1cmEgIlByb2dyYW1hY2nDs24geSBtYW5lam8gZGUgZGF0b3MgZW4gbGEgZXJhIGRlbCBCaWcgRGF0YSIgZGUgbGEgVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIGR1cmFudGUgZWwgY3Vyc28gMjAyMS0yMDIyLiBFbCByZXBvIGRlbCB0cmFiYWpvIGVzdMOhIFthcXXDrV0oaHR0cHM6Ly9naXRodWIuY29tL2FsYmFpYmFueWV6OC90cmFiYWpvX0JpZ0RhdGEpe3RhcmdldD0iX2JsYW5rIn0uIA0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGV4YWN0YW1lbnRlIGlndWFsLCBOTyBIQVMgREUgQ0FNQklBUiBOQURBLS0+DQoNCkxhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmEgeSBsb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi8wNy10cmFiYWpvcy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQoNCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCg0KIyBbMS4gSW50cm9kdWNjacOzbl17LnZlcmRlY2l0b30NCg0KRWwgb2JqZXRpdm8gcHJpbmNpcGFsIGRlIGVzdGUgdHJhYmFqbyBzZXLDrWEgdW4gYW7DoWxpc2lzIGRlIGxvcyAqKkp1ZWdvcyBPbMOtbWlwaWNvcyoqIGVuIGxhIGhpc3RvcmlhIGEgdHJhdsOpcyBkZSBkaWZlcmVudGVzIHZhcmlhYmxlczogZ8OpbmVybywgZGlzY2lwbGluYXMsIG1lZGFsbGFzLi4uIA0KU2UgcG9uZHLDoSBlbiBwcsOhY3RpY2EgbXVjaG9zIGRlIGxvcyBjb25vY2ltaWVudG9zIGFkcXVpcmlkb3MgZW4gbGFzIGNsYXNlcyBkZSAnUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGUgQmlnIERhdGEnIGNvbiBzdXMgcmVzcGVjdGl2YXMgeSBtw6FzIGltcG9ydGFudGVzIGZ1bmNpb25lcywgZ3LDoWZpY29zIHkgZGVtw6FzIHF1ZSBoZW1vcyBhc2ltaWxhZG8gZHVyYW50ZSBlbCBjdXJzby4NCg0KDQoNCkxvcyAqKkp1ZWdvcyBPbMOtbXBpY29zKiogc29uIGVsIG1heW9yIGV2ZW50byBkZXBvcnRpdm8gaW50ZXJuYWNpb25hbCBtdWx0aWRpc2NpcGxpbmFyaW8gZW4gZWwgcXVlIHBhcnRpY2lwYW4gYXRsZXRhcyBkZSBkaXZlcnNhcyBwYXJ0ZXMgZGVsIG11bmRvLiBMb3MgSnVlZ29zIE9sw61tcGljb3Mgc29uIGNvbnNpZGVyYWRvcyBsYSBwcmluY2lwYWwgY29tcGV0aWNpw7NuIGRlbCBtdW5kbyBkZXBvcnRpdm8sIGNvbiBtw6FzIGRlIGRvc2NpZW50YXMgbmFjaW9uZXMgcGFydGljaXBhbnRlcy4gRXhpc3RlbiBkb3MgdGlwb3M6IGxvcyBKdWVnb3MgT2zDrW1waWNvcyBkZSBWZXJhbm8geSBsb3MgSnVlZ29zIE9sw61tcGljb3MgZGUgSW52aWVybm8sIHF1ZSBzZSByZWFsaXphbiBjb24gdW4gaW50ZXJ2YWxvIGRlIGRvcyBhw7Fvcywgc2Vnw7puIGxhIENhcnRhIE9sw61tcGljYTogwqtMb3MgSnVlZ29zIGRlIGxhIE9saW1waWFkYSBzZSBjZWxlYnJhbiBkdXJhbnRlIGVsIHByaW1lciBhw7FvIGRlIHVuYSBPbGltcGlhZGEgeSBsb3MgSnVlZ29zIE9sw61tcGljb3MgZGUgSW52aWVybm8gZHVyYW50ZSBzdSB0ZXJjZXIgYcOxby4NCkVuIG51ZXN0cm8gdHJhYmFqbywgYWxndW5vcyBkZSBsb3MgYW7DoWxpc2lzIHRyYXRhcmFiIHNvYnJlIGxvcyBKdWVnb3MgT2zDrW1waWNvcyBkZSBWZXJhbm8geSBvdHJvcyBkZSBsb3MgSnVlZ29zIE9sw61tcGljb3MgZW4gZ2VuZXJhbC4NCg0KIVtKdWVnb3NPbGltcGljb3NdKC4vaW1hZ2VuZXMvanVlZ29zLmpwZykgDQoNCiMgMi4gRGF0b3MNCg0KTG9zIGRhdG9zIHBhcmEgcmVhbGl6YXIgZWwgYW7DoWxpc2lzIG9wb3J0dW5vIGhhbiBzaWRvIGV4dHJhaWRvcyBkZSAqKkthZ2dsZSoqIHlhIHF1ZSBkaWNoYSBwbGF0YWZvcm1hIGNvbnRlbsOtYSB1bm5hIGdyYW4gdmFyaWVkYWQgZGUgZGF0b3MgcmVsYWNpb25hZG9zIGNvbiBlc3RhIGdyYW4gY29tcGV0aWNpw7NuLg0KDQoNCiMjIDIuMS4gUHJvY2VzYW5kbyBsb3MgZGF0b3MNCkVsIGFuw6FsaXNpcyBzZSBoYSByZWFsaXphZG8gc29icmUgNCBkYXRhZnJhbWVzOg0KDQogKiphYSoqOiAzMTE2NSBvYnNlcnZhY2lvbmVzLg0KIA0KICoqYmIqKjoxMTA4NSBvYnNlcnZhY2lvbmVzLg0KIA0KICoqY2MqKjo0NiBvYnNlcnZhY2lvbmVzLg0KIA0KICoqZGQqKjo5MyBvYnNlcnZhY2lvbmVzLg0KDQoNCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCg0KZGF0b3MxIDwtIGhlcmU6OmhlcmUoImRhdG9zIiwgInN1bW1lci5jc3YiKQ0KDQphYSA8LSByaW86OmltcG9ydChkYXRvczEpIA0KDQpkYXRvczIgPC0gaGVyZTo6aGVyZSgiZGF0b3MiLCAiQXRobGV0ZXMueGxzeCIpDQoNCmJiIDwtIHJpbzo6aW1wb3J0KGRhdG9zMikgDQoNCmRhdG9zMyA8LSBoZXJlOjpoZXJlKCJkYXRvcyIsICJFbnRyaWVzR2VuZGVyLnhsc3giKQ0KDQpjYyA8LSByaW86OmltcG9ydChkYXRvczMpDQoNCmRhdG9zNCA8LSBoZXJlOjpoZXJlKCJkYXRvcyIsICJNZWRhbHMueGxzeCIpDQoNCmRkIDwtIHJpbzo6aW1wb3J0KGRhdG9zNCkgDQpgYGANCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikgDQpsaWJyYXJ5KHJlYWRyKSANCmxpYnJhcnkocGx5cikNCmxpYnJhcnkocndvcmxkbWFwKQ0KbGlicmFyeShyZXByKQ0KbGlicmFyeShwbG90bHkpDQoNCmBgYA0KDQoNCiMgMy4gUGFydGljaXBhY2nDs24gc2Vnw7puIEfDqW5lcm8uDQoNCkNvbW8gc2UgcHVlZGUgb2JzZXJ2YXIgZW4gZWwgZ3LDoWZpY28sIGxhIHBhcnRpY2lwYWNpw7NuIGRlIEhvbWJyZXMgeSBtdWplcmVzIGRlc2RlIDE4OTYgaGFzdGEgMjAxMiBubyBoYSBlc3RhZG8gZXF1aWxpYnJhZGEuIE1lZGlhbnRlIHVuIGdyw6FmaWNvIGRlIGxpbmVhcywgc2UgdmlzdWFsaXphIHF1ZSBhw7FvIGEgYcOxbywgZWwgbsO6bWVybyBkZSBob21icmVzIHF1ZSBoYW4gcGFydGljaXBhZG8gbWVkaWRpbyBwb3IgbGEgdmFyaWFibGUgZnJlcSBoYSBzaWRvIGJhc3RhbnRlIHN1cGVyaW9yIGFsIGRlIG11amVyZXMgc29icmV0b2RvIGVuIGVsIHBpY28gZGVsIGHDsW8gMTkyMCBkb25kZSBsYSBwYXJ0aWNpcGFjacOzbiBkZSBsYXMgbXVqZXJlcyAoNDMpIGVuIGVsIGp1ZWdvIGVzdGFiYSBtdXkgcG9yIGRlYmFqbyBkZSBsYSBkZWwgZ8OpbmVybyBtYXNjdWxpbm8gKDEyNTUpLiBTZSBoYSBhbmltYWRvIGVsIGdncGxvdCBwYXJhIHZlciBtZWpvciBlbCByZXN1bHRhZG8uDQoNCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgd2FybmluZz1GQUxTRX0NCmRmX2FhIDwtIGFhICU+JQ0Kc2VsZWN0KFllYXIsIEdlbmRlciklPiUNCmdyb3VwX2J5KEdlbmRlcixZZWFyKSU+JQ0KY291bnQoKQ0KZ2dwbG90X2FhIDwtIGdncGxvdCgpICsgZ2VvbV9saW5lKGRhdGEgPSBkZl9hYSwgYWVzKHg9IFllYXIsIHk9ZnJlcSwgZ3JvdXAgPSBHZW5kZXIsIGNvbG9yID0gR2VuZGVyKSkgKw0KbGFicyh0aXRsZSA9ICdQYXJ0aWNpcGFjacOzbiBhw7FvIGEgYcOxbyAoZ8OpbmVybyknLA0KICAgICBjb2xvciA9ICJHw6luZXJvIikgICsgeGxhYigiQcOxbyIpICsgeWxhYigiTsK6IGRlIEhvbWJyZXMgeSBNdWplcmVzIikgKyB0aGVtZV92b2lkKCkNCg0KZ2dwbG90bHkoZ2dwbG90X2FhKQ0KDQpgYGANCg0KIyA0LiAgRGlleiBwYcOtc2VzIGNvbiBtw6FzIG1lZGFsbGFzLg0KDQpFc3RlIGdyw6FmaWNvIG11ZXN0cmEgbXV5IHZpc3VhbG1lbnRlIDEwIHB1bnRvcyBxdWUgY29ycmVzcG9uZGVuIGEgbG9zIDEwIHBhw61zZXMgcXVlIGhhbiBnYW5hZG8gbcOhcyBtZWRhbGxhcyBlbiBsb3MgSnVlZ29zIE9sw61taXBpY29zLlNlIGhhIHJlc3RyaW5naWRvIGEgMTAgcGFyYSBxdWUgcXVlZGFyYSBtw6FzIHZpc3VhbCBjb24gbGEgZnVuY2nDs24gaGVhZC5BZGVtw6FzIHNlIGhhbiBjb21iaW5hZG8gbG9zIGNvbG9yZXMgZGVsIGdyw6FmaWNvIGNvbiBsYSBvcGNpw7NuIHRoZW1lIHBhcmEgcXVlIHNlIHZpZXJhIGNsYXJhbWVudGUuIFBvZGVtb3MgZW5jb250cmFyIHBhw61zZXMgY29tbyBBdXN0cmFsaWEsIEZyYW5jaWEsIEFsZW1hbmlhLCBKYXDDs24sUk9DLi4uIHkgY2xhcmFtZW50ZSwgc2kgcGluY2hhbW9zIGVuIGVsIHB1bnRvIG3DoXMgYWx0byAsIGVsIHBhw61zIHF1ZSBkZXN0YWNhIGVzIFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hIGNvbiB1biB0b3RvYWwgZGUgODggbWVkYWxsYXMuDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUUsIHdhcm5pbmc9RkFMU0V9DQpkZl9kZCA8LSBkZCAlPiUNCiAgaGVhZCgxMCkNCiAgDQpnZ3Bsb3RjIDwtIGdncGxvdChkZl9kZCwgYWVzKFBhaXMsIFRvdGFsLCBzaXplID0gMC43NSwgY29sb3I9ICJvcmFuZ2UiKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICB0aGVtZV9idygpKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoeCA9IE5VTEwpICsgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpKSArIGxhYnModGl0bGU9ICJMb3MgMTAgcGHDrXNlcyBjb24gbcOhcyBNZWRhbGxhcyIpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gJ3doZWF0MScsIGNvbG91ciA9ICdyZWQnKSkgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiV2hpdGUiKSwNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRUVERkNDIiwNCiAgICAgICAgY29sb3VyID0gIiNFRURGQ0MiKSkNCg0KZ2dwbG90bHkoZ2dwbG90YykNCg0KZGZfZGQNCg0KYGBgDQoNCg0KIVtKdWVnb3NPbGltcGljb3NdKC4vaW1hZ2VuZXMvanVlZ29zMi5qcGcpIA0KDQoNCiMjIDQuIDEuIE1lZGFsbGFzIGVuIGxvcyBkaWZlcmVudGVzIHBhw61zZXMuDQoNCkNvbW8gcG9kZW1vcyB2ZXIsIGxvcyBwYcOtc2VzIGNvbiBtw6FzIG1lZGFsbGFzIGVuIGxvcyBKdWVnb3MgT2zDrW1waWNvcyBzb24gbG9zIHBhw61zZXMgZGVzYXJyb2xsYWRvcyBkZSBBbcOpcmljYSBkZWwgTm9ydGUsIEFzaWEgeSBFdXJvcGEuIExvcyBwYcOtc2VzIG3DoXMgcG9icmVzIGRlIMOBZnJpY2EgeSBBbcOpcmljYSBkZWwgU3VyIG5vIGRlc3RhY2FuIHBvciBlbGxvLg0KDQpFc3RlIG1hcGEgaGEgc2lkbyByZWFsaXphZG8gZGUgZm9ybWEgbcOhcyBjb3N0b3NhIGNvbiBsbyBhcHJlbmRpZG8gZW4gY2xhc2UgeSBsYSBpbmZvcm1hY2nDs24gcHJvcG9yY2lvbmFkYSBlbiB1biBrYWdnbGUgc29icmUgZWwgdGVtYSBhIGFuYWxpemFyLg0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCB3YXJuaW5nPUZBTFNFfQ0KY291bnQ9YygxKQ0KYWEkTWVkYWxDb3VudD1jb3VudA0KYWEkQXRobGV0ZT1hcy5jaGFyYWN0ZXIoYWEkQXRobGV0ZSkNCg0Kb3B0aW9ucyhyZXByLnBsb3Qud2lkdGg9NiwgcmVwci5wbG90LmhlaWdodD02KQ0Kd29ybGQgPC0gbWFwX2RhdGEobWFwPSJ3b3JsZCIpDQp3b3JsZCA8LSB3b3JsZFt3b3JsZCRyZWdpb24gIT0gIkFudGFyY3RpY2EiLF0gIyANCnk9ZGRwbHkoYWEsIC4oQ291bnRyeSxNZWRhbCksIG51bWNvbHdpc2Uoc3VtKSkNCnNQREYgPC0gam9pbkNvdW50cnlEYXRhMk1hcCggeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsam9pbkNvZGUgPSAiSVNPMyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLG5hbWVKb2luQ29sdW1uID0gIkNvdW50cnkiKQ0KDQptYXBDb3VudHJ5RGF0YShzUERGDQogICAgICAgICAgICAgICAsbmFtZUNvbHVtblRvUGxvdD0nTWVkYWxDb3VudCcpDQoNCmBgYA0KDQojIDUuIFRpcG8gTWVkYWxsYXMgZW4gbG9zIHBhw61zZXMgbcOhcyBpbXBvcnRhbnRlcy4NCg0KRW4gZXN0ZSBhcGFydGFkbyBzZSBhbmFsaXphIGVsIHRpcG8gZGUgbWVkYWxsYXMgcXVlIHNlIGhhbiBnYW5hZG8gZW4gY2luY28gcGHDrXNlcyBkaWZlcmVudGVzLiBTZSBoYW4gZmlsdHJhZG8gbG9zIHBhw61zZXMgeSBhZ3J1cGFkbyBzZWfDum4gZWwgcGHDrXMgeSBlbCB0aXBvIGRlIG1lZGFsbGEuIENvbW8gc2Ugb2JzZXJ2YSBlbiBlbCBncsOhZmljbywgZWwgcGHDrXMgY29uIG3DoXMgbWVkYWxsYXMgZGUgb3JvIHJlcHJlc2VudGFkbyBlbiBjb2xvciB2ZXJkZSBzZSBpZGVudGlmaWNhIGNvbiBVU0Egc2VndWlkbyBwb3IgUnVzaWEuIEVsIHF1ZSBtZW5vcyBtZWRhbGxhcyBkZSBvcm8gaGEgZ2FuYWRvIGVzIEFsZW1hbmlhLiBVU0EgdGFtYmnDqW4gZGVzdGFjYSBwb3Igc3UgbsO6bWVybyBkZSBtZWRhbGxhcyBkZSBwbGF0YSB5IGRlIGJyb256ZS4gRXMgZ2VuZXJhbG1lbnRlIGVsIHBhw61zIHF1ZSBtw6FzIGRlc3RhY2EgZW4gZWwgYW7DoWxpc2lzLg0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZGZfYmIgPC0gYWEgJT4lDQpzZWxlY3QoQ291bnRyeSwgTWVkYWwsIE1lZGFsQ291bnQsIFllYXIpJT4lDQpncm91cF9ieShDb3VudHJ5LCBNZWRhbENvdW50KSU+JQ0KZmlsdGVyKENvdW50cnkgJWluJSBjKCJHRVIiLCAiRlJBIiwgIkdCUiIsICJVUlMiLCAiVVNBIikgKQ0KDQoNCmdncGxvdGEgPC0gZ2dwbG90KGRmX2JiLGFlcyh4PXJlb3JkZXIoQ291bnRyeSxNZWRhbENvdW50KSx5PU1lZGFsQ291bnQsZmlsbD1NZWRhbCxncm91cD1NZWRhbCkpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5JykNCg0KDQpnZ3Bsb3RhDQpgYGANCg0KIVtKdWVnb3NPbGltcGljb3NdKC4vaW1hZ2VuZXMvanVlZ29zMy5qcGcpIA0KDQojIDYuIE7Dum1lcm8gZGUgYXRsZXRhcyBxdWUgcGFydGljaXBhbiBlbiBjYWRhIHBhw61zLg0KDQpNZWRpYW50ZSB1biBncsOhZmljbyBkZSBiYXJyYXMgaW52ZXJ0aWRvIGNvbiBjb29yZCBmbGlwIHBhcmEgbWVqb3JhciBsYSB2aXN1YWxpemFjacOzbiAsIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIFVTQSBjdWVudGEgY29uIGVsIG1heW9yIG7Dum1lcm8gZGUgYXRsZXRhcyBxdWUgcGFydGljaXBhbiBlbiBsYXMgT2xpbXBpYWRhcyBzZWd1aWRvIGRlIEphcMOzbi4gTnVlc3RybyBwYcOtcyBzZSBxdWVkYSBwb3IgZGViYWpvIGRlIGVzdG9zLkVzdGUgZ3LDoWZpY28gdGFtYmnDqW4gZXMgaW50ZXJhY3Rpdm8uDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUUsIHdhcm5pbmc9RkFMU0V9DQoNCmF0bGV0YXNfbXVuZG8gPC0gYmIlPiUNCiAgICBncm91cF9ieShOT0MpICU+JQ0KICAgICAgICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JQ0KICAgICAgICBhcnJhbmdlKGRlc2MoY291bnQpKSU+JQ0KICAgICAgICBoZWFkKDEwKQ0KDQphdGxldGFzX211bmRvDQoNCmdncGxvdGIgPC1nZ3Bsb3QoYXRsZXRhc19tdW5kbywgYWVzKHggPSBOT0MsIHkgPSBjb3VudCkpICsgDQogICAgICBnZW9tX2NvbChhZXMoZmlsbCA9IE5PQyksIGNvbG9yID0gImJsYWNrIikgICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSsgY29vcmRfZmxpcCgpICsgeGxhYigiQXRsZXRhcyIpICsgeWxhYigiUGHDrXNlcyIpDQogDQpnZ3Bsb3RseShnZ3Bsb3RiKQ0KDQoNCmBgYA0KDQojIDcuIE7Dum1lcm8gZGUgZGVwb3J0aXN0YXMgcXVlIHNlIHByZXNlbnRhbiBhIGxhcyBkaXNjaXBsaW5hcyBtw6FzDQoNCk1lZGlhbnRlIGVzdGUgZ3LDoWZpY28gY2lyY3VsYXIsIHNlIG9ic2VydmEgbGEgZGlzY2lwbGluYSBtw6FzIHByYWN0aWNhZGEgZW4gbG9zIGp1ZWdvcyBvbMOtbXBpY29zLiBTZSB0cmF0YSBkZSBnaW1uYXNpYSB5IHZvbGV5IHBsYXlhLiBVbmEgZGUgbGFzIHF1ZSBtZW5vcyBlcyBiYXNrZXQuIEhlbW9zIHJlc3RyaW5naWRvIGVsIGFuw6FsaXNpcyBhIDEwIGRpc2NpcGxpbmFzLkNvbiB0aGVtZSBoZSBtb2RpZmljYWRvIGxhIGVzdMOpdGljYSBkZWwgZ3LDoWZpY28gcGFyYSBxdWUgY29uIGVsIGNvbG9yIHNlIHZlYSBtZWpvci4NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgd2FybmluZz1GQUxTRX0NCg0KZGZfY2MgPC0gY2MgJT4lDQphcnJhbmdlKGRlc2MoVG90YWwpKSU+JQ0Kc2xpY2VfbWF4KFRvdGFsLCBuPTEwKQ0KDQoNCmRmX2NjYSA8LSBnZ3Bsb3QoZGZfY2MsIGFlcyh4PXJlb3JkZXIoRGlzY2lwbGluZSwgVG90YWwpLCB5PVRvdGFsLCBmaWxsPURpc2NpcGxpbmUpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBjb29yZF9wb2xhcihzdGFydCA9IDAuMDEpICsNCiAgbGFicyAoeD0iRGlzY2lwbGluYXMiKSArIGxhYnMoeT0iVG90YWwgcGVyc29uYXMgcHJhY3RpY2FuIikgKyBsYWJzKHRpdGxlID0gIk51bS4gUGVyc29uYXMgcXVlIHByYWN0aWNhbiBjYWRhIGRpc2NpcGxpbmEiKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRUVERkNDIiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0VFREZDQyIpKQ0KDQpkZl9jYw0KZGZfY2NhDQpgYGANCg0KDQojIDguIFRyYWJham9zIGVuIGxvcyBxdWUgdGUgaGFzIGJhc2FkbzoNCg0KUHJpbmNpcGFsbWVudGUgbWUgaGUgYmFzYWRvIGVuIGxvcyB0dXRvcmlhbGVzIGRlIGxhcMOhZ2luYSB3ZWIgZGUgdHJhYmFqbyBkZSBsYSBhc2lnbmF0dXJhIHkgZGUgS2FnZ2xlIHF1ZSBzZXJhbiBub3RpZmljYWRvcyBlbiBsYSBiaWJsaW9ncmFmw61hIGRlbCB0cmFiYWpvLg0KDQoNCiMgOS4gQ29uY2x1c2nDs24uDQoNCj4gIk5hZGllIGxsZWdhIHRhbiBsZWpvcyBzaSBubyBlcyBwYXJhIHNlZ3VpciINCg0KRW4gZXN0ZSB0cmFiYWpvIGhlIGFzZW50YWRvIGxvIHF1ZSBoZW1vcyBhcHJlbmRpZG8gZW4gZWwgY3Vyc28gZGUgUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGUgQmlnIGRhdGEuIFNvYnJldG9kbyBoZSBlbmZhdGl6YWRvIGVuIGxhIHZpc3VhbGl6YWNpw7NuIGRlIGxvcyBkaWZlcmVudGVzIGdncGxvdHMuIEVzdGUgdGVtYSBzaWVtcHJlIG1lIGhhIGxsYW1hZG8gbGEgYXRlbmNpw7NuIHkgc2UgaGEgcG9kaWRvIG9ic2VydmFyIHVuIGJyZXZlIGFuw6FsaXNpcyBzb2JyZSBsYXMgdmFyaWFibGVzIG3DoXMgc2lnbmlmaWNhdGl2YXMgZGVsIHRlbWEuIFB1ZWRlIHNlcnZpciBkZSBpbmZvcm1hY2nDs24gw7p0aWwgcGFyYSBsYSBnZW50ZSBhZmljaW9uYWRhIGVuIGVsIHRlbWEuDQoNCg0KIyAxMS4gQmlibGlvZ3JhZsOtYQ0KDQotIFtQw6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhLl0oaHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjEtMjItd2ViLzA0LXR1dG9yaWFsZXMuaHRtbCkNCg0KLSBbS2FnZ2xlIHNvYnJlIEp1ZWdvcyBPbMOtbXBpY29zXShodHRwczovL3d3dy5rYWdnbGUuY29tL2FycGl0c29sYW5raTE0L29seW1waWMtZ2FtZXMtZGF0YS1hbmFseXNpcykNCg0KLSBbS2FnZ2xlIHNvYnJlIEp1ZWdvcyBPbMOtbXBpY29zXShodHRwczovL3d3dy5rYWdnbGUuY29tL2FsdmFyb3JvZHJpZ3Vlemcvb2x5bXBpYy1nYW1lcy9kYXRhKQ0KDQo8YnI+PGJyPg0KDQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQoNCiMgMTIuIFNlc2nDs24gSW5mb3JtYXRpdmEuDQoNCmBgYHtyLCBlY2hvID0gRkFMU0V9DQpzZXNzaW9uaW5mbzo6c2Vzc2lvbl9pbmZvKCkgJT4lIGRldGFpbHM6OmRldGFpbHMoc3VtbWFyeSA9ICdJbmZvcm1hY2nDs24gZGUgbWkgUi1zZXNpw7NuOicpIA0KYGBgDQoNCg0KPGJyPjxicj4NCg0KPGRpdiBjbGFzcz0idG9jaWZ5LWV4dGVuZC1wYWdlIiBkYXRhLXVuaXF1ZT0idG9jaWZ5LWV4dGVuZC1wYWdlIiBzdHlsZT0iaGVpZ2h0OiAwOyI+PC9kaXY+DQoNCg0KDQo=