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 2020-2021. 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 fútbol femenino es el deporte de equipo más practicado por mujeres en todo el mundo. Este deporte empezó a ser practicado en una sección femenina hace mucho tiempo, a finales del siglo XIX, en Londres pero fue a causa de las distintas guerras y los problemas económicos y sociales de los años siguientes que este deporte dejó de ser practicado.
Actualmente, hace años que el fútbol femenino dejó de ser un mundo de hombres y las mujeres dieron el paso para practicar este deporte, a pesar de que tienen que seguir aguantando comentarios despectivos y frases como “el fútbol es un deporte de hombres”.
Según los datos oficiales de la FIFA, más o menos 26 millones de mujeres juegan al fútbol en 180 países del mundo. Europa es el continente que ha experimentado un mayor crecimiento en los últimos años donde el número de mujeres que practican este deporte se ha multiplicado por cinco.
En nuestro país, España, también ha habido un gran progreso y la selección nacional femenina ha estado presente en los últimos años en Mundiales y Eurocopas.
Poco a poco se está normalizando esta modalidad del fútbol pero todavía faltan muchos aspectos para mejorar como el sueldo de las profesionales, ni comparable con las cifras que se mueven en el fútbol masculino.
Debido a la necesidad de dar mayor visibilidad al fútbol femenino y ya que yo también practico este deporte he decidido tratar este tema en el trabajo de la asignatura “Programación y manejo de datos en la era del Big Data”.
La finalidad y objetivo de este análisis es observar el desarrollo a lo largo del tiempo del fútbol femenino en los diferentes países del mundo.
3. Análisis de selecciones
3.1. Evolución del fútbol femenino a lo largo del tiempo
# A partir de la tabla que ya habia arreglado anteriormente, agrupo los años para saber cuantos partidos se jugaron cada año.
evol <- date %>% group_by(Año)%>% count()
# Hago el gráfico que en este caso es un 'barplot'
ggplot(evol, aes(x=Año, y=n, col='red')) +
geom_bar(stat = "identity") + theme(legend.position="none") +
theme(axis.ticks = element_line(linetype = "blank"),
axis.text = element_text(size = 7), axis.text.y = element_text(size = 15),
panel.background = element_rect(fill = "grey100",
size = 0.6)) +labs(title = "Evolución partidos por año",
x = "Años", y = "Nº Partidos") + theme(axis.text.x = element_text(angle = 90))
Podemos ver que ha habido un notable crecimiento de los partidos de fútbol femenino a lo largo del tiempo.
En el año 1969 tan solo se disputaron 4 partidos y en los últimos años ha habido un máximo de 349 partidos oficiales en el mismo año (2018).
Se puede observar una clara tendencia a que hay tres años seguidos con un número alto de partidos seguido de uno que baja el número notablemente, hasta llegar al año 2014 que se han ido igualando. Esto se debe a que cada año se disputa un torneo diferente según el continente, menos el Mundial y los Juegos Olímpicos que ambos son a nivel mundial.
Los años que tenían un mayor número de partidos coinciden con los partidos para la clasificación a la Eurocopa, el Mundial y la clasificación para este, que como veremos más adelante son los torneos oficiales con más partidos disputados.
month <- date %>% group_by(Mes)%>% count()
gr_month <- ggplot (month, aes(x=Mes, y = n), aes(fct_rev(Mes))) + geom_bar(stat="identity", fill = "aquamarine") + coord_flip() + labs(x = "Mes", y = "Número de partidos")+labs(title = "Evolución partidos por mes")
ggplotly(gr_month)
Con respecto a este gráfico, podemos ver los meses en los que más partidos se disputan. En este caso el mes con más partidos y esto se debe a que muchos partidos de la clasificación a la Eurocopa, el Mundial y la Copa de América se juegan en este mes ya que estos torneos se juegan durante los meses de junio y julio. Además, el torneo amistoso de la Copa de Algarve es el segundo torneo que más partidos tiene disputados y este se juega todos los años en marzo desde el año 1994.
3.2. Torneos
tourn <- futfem %>% group_by(tournament)%>% count()
x <- c(86, 115, 268, 173, 226, 16, 545, 42, 126, 145, 6, 157, 20, 284, 172, 106, 78, 32, 6, 130, 30, 6, 153, 1241)
lbl <- c("AFC Asian Cup", "AFC Asian Cup qualification", "AFC Championship", "African Championship", "
African Championship qualification", "African Cup of Nations", "Algarve Cup", "CONCACAF Championship", "
CONCACAF Gold Cup", "CONCACAF Gold Cup qualification", "CONCACAF Invitational Tournament", "Copa América", "Euro", "FIFA World Cup", "FIFA World Cup qualification", "Four Nations Tournament", "OFC Championship", "OFC Nations Cup", "OFC Nations Cup qualification", "Olympic Games", "SheBelieves Cup", "Tournoi de France", "UEFA Euro", "
UEFA Euro qualification")
pie3D(x, labels = lbl, explode = 0.1, main = "Torneos", labelcex = 0.5)
Como ya había mencionado en el apartado anterior y que ahora podemos ver en el gráfico los torneos donde se juegan una mayor cantidad de partidos son las fases de clasificación a la Eurocopa femenina, la Copa de Algarve y el Mundial. Entre estos tres, la Eurocopa y el Mundial son torneos oficiales mientras que la copa de Algarve es un torneo amistoso.
El último campeón de la copa del mundo fue EEUU en 2019, esta misma selección es la que más veces ha ganado este campeonato, un total de 4 veces.
Con respecto a la Eurocopa, el último ganador fue Países Bajos en 2017, sin embargo, la selección que más veces ha ganado este torneo es la selección femenina alemana, un total de 8 títulos.
3.3. Selecciones que más partidos han jugado en casa y más partidos fuera
Partidos jugados en casa
selec_home <- futfem %>% group_by(home_team)%>% count()
selec_home <- selec_home %>% arrange(desc(n))
reactable(selec_home, defaultPageSize = 10, paginationType = "jump", showPageSizeOptions = TRUE , pageSizeOptions = c ( 10 , 50 , 100 ),defaultColDef = colDef(
align = "center",
minWidth = 70,
headerStyle = list(background = "cyan"),
filterable = TRUE), highlight = TRUE, outlined = TRUE,
columns = list(
`Movies&TVShow/año` = colDef(style = function(value) {
if (value > 0) {
color <- "#e00000"}
else {
color <- "#008000"
}
list(color = color, fontWeight = "bold")
})))
Partidos jugados fuera
selec_away <- futfem %>% group_by(away_team)%>% count()
selec_away <- selec_away %>% arrange(desc(n))
reactable(selec_away, defaultPageSize = 10, paginationType = "jump", showPageSizeOptions = TRUE , pageSizeOptions = c ( 10 , 50 , 100 ),defaultColDef = colDef(
align = "center",
minWidth = 70,
headerStyle = list(background = "cyan"),
filterable = TRUE), highlight = TRUE, outlined = TRUE,
columns = list(
`Movies&TVShow/año` = colDef(style = function(value) {
if (value > 0) {
color <- "#e00000"}
else {
color <- "#008000"
}
list(color = color, fontWeight = "bold")
})))
3.4. Pais donde más partidos se han jugado
country <- futfem %>% group_by(country)%>% count() %>% rename(pais = country)
country <- country %>% arrange(desc(n)) %>% rename(partidos = n)
country %>% DT::datatable(extensions = 'Buttons',
options = list(dom = 'Blfrtip',
buttons = c('copy', 'csv', 'excel', 'pdf', 'print'),
pageLength = 5, autoWidth = TRUE ))
El país donde más veces se ha jugado un partido es Portugal, un total de 580 partidos ya que ahí se disputa el torneo de Algarve Cup que es uno de los torneos con más partidos jugados ya que se juega todos los años. A este, le siguen China y Estados Unidos que son dos de los países más importantes respecto al fútbol femenino porque suelen estar presentes en todos los torneos y sobre todo EEUU, la selección femenino siempre ha tenido un mayor apoyo por la población en comparación con otros países.
# Voy a crear un gráfico para poder visualizar mejor los paises. Cogiendo un código de un mapa de una página de internet y he cambiado los paises y las coordenadas de estos.
mapa <- map_data("world") %>% mutate(color = case_when(region == "Portugal" ~ 1,
region == "China" ~ 2,
region == "USA" ~ 3,
region == "Sweden" ~ 4,
region == "Germany" ~ 5,
region == "France" ~ 6,
region == "Canada" ~ 7,
region == "Italy" ~ 8,
region == "Netherlands" ~ 9)) %>% mutate(color = if_else(is.na(color),0,color))
paises <- c("Portugal","China","USA","Sweden","Germany","France","Canada","Italy","Netherlands")
lat <- c(37.17944,19.99194,19.01201,56.29053,53.87075,42.80542,43.93960,36.75703,51.38647)
long <- c(-7.406153,110.8888,-155.58134,16.52852,14.213672,9.480371,59.78760,12.051270,4.226171)
latlong <- data.frame(paises,lat,long)
mapa1 <- ggplot() + geom_map(data = mapa, map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#f7eca1") +
geom_map(data = mapa %>% filter(color==1), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "red") +
geom_map(data = mapa %>% filter(color==2), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "green") +
geom_map(data = mapa %>% filter(color==3), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "cyan") +
geom_map(data = mapa %>% filter(color==4), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#ab6800") +
geom_map(data = mapa %>% filter(color==5), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "yellow") +
geom_map(data = mapa %>% filter(color==6), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#004dff") +
geom_map(data = mapa %>% filter(color==7), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#ff9300") +
geom_map(data = mapa %>% filter(color==8), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#a4034b") +
geom_map(data = mapa %>% filter(color==9), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#238a00") +
geom_point(data = latlong, aes(x = long,y = lat), size = 2) +
ylim(-55,NA) +
theme(panel.background = element_rect(fill = "#a6fffb") , panel.grid = element_line(colour = "#000000"), axis.title = element_blank(),
axis.text = element_blank(), axis.ticks = element_blank())
mapa1 + theme(panel.background = element_rect(fill = "gray100")) +labs(title = "Países donde más partidos se han jugado")
3.5. Mundial vs Eurocopa
comp <- date %>% group_by(Año) %>% count(tournament) %>% filter(tournament %in% c("FIFA World Cup", "UEFA Euro qualification"))
ggplot(comp, aes(fill=tournament, y=n, x=Año)) +
geom_bar(position="dodge", stat="identity") + theme(axis.line = element_line(colour = "gray",
linetype = "solid"), axis.text.x = element_text(angle = 90),
panel.background = element_rect(fill = "gray100")) +labs(title = "Mundial vs Eurocopa")
La Copa Mundial Femenina de la FIFA es el torneo internacional de fútbol femenino a nivel de selecciones nacionales más importante del mundo. Además, existen otras competencias juveniles como la Copa Mundial Femenina de Fútbol Sub-20 y la Copa Mundial Femenina de Fútbol Sub-17, ambas organizadas por la FIFA. La primera edición de este torneo fue en 1991 y a partir de ahí se decidió que se jugaría cada 4 años aunque ha habido años en los que se ha disputado aunque no tocaba. En un principio, este torneo contaba con 16 selecciones y ha ido evolucionando y haciéndose grande hasta que en 2015 subió a 24 y se espera que en el mundial de 2023 se dispute con 32 selecciones.
El Campeonato de Europa Femenino de la UEFA, comúnmente conocido como Eurocopa Femenina, es la competición internacional futbolística más importante entre selecciones nacionales femeninas de la UEFA. Este torneo comenzó a disputarse en 1969 sin embargo estos años no fue considerado oficial y la primera edición del torneo respaldado por la UEFA fue en 1982.
3.6. Tipo de campo
neutral <- date %>% group_by(neutral) %>% count()
datos <- c(2324, 1839)
pie3D(datos, labels = datos, col = 2:3, labelcol = "red", border = "white", main = "Tipo de campo")
legend(x = "topright", legend = c("False", "True"), fill = c("pink", "green"),
title = "Legend")
Con estos datos obtenemos que de 4163 partidos oficiales que se han disputado desde el año 1969, 2324 han sido disputados en campo propio de alguno de los dos paises.
LS0tCnRpdGxlOiAiRsO6dGJvbCBmZW1lbmlubyIKc3VidGl0bGU6ICJNYXJ0YSBPbGl2ZXIgQmVsdHLDoW4ob2JlbG1hckBhbHVtbmkudXYuZXMpIiAKYXV0aG9yOiAiVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIgpkYXRlOiAiRW5lcm8gZGUgMjAyMSAoYWN0dWFsaXphZG8gZWwgYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCkiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgI2NzczogIi4vYXNzZXRzL215X2Nzc19maWxlLmNzcyIKICAgIHRoZW1lOiBwYXBlcgogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSAKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzIAogICAgdG9jX2Zsb2F0OiAKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICBkZl9wcmludDoga2FibGUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQoKYGBge3IgcGFja2FnZXMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoa2xpcHB5KSAKbGlicmFyeShrbml0cikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dUaGVtZUFzc2lzdCkKbGlicmFyeShyZWFjdGFibGUpCmxpYnJhcnkoc2YpCmxpYnJhcnkocGxvdHJpeCkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShnZ2FuaW1hdGUpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoaHJicnRoZW1lcykKYGBgCgpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwKICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwKICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICAKICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywKICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjYwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2ID0gInBuZyIsIGRldi5hcmdzID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKQpgYGAKCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSAKYGBgCgoKYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9CmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikKYGBgCgo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4KClRyYWJham8gZWxhYm9yYWRvIHBhcmEgbGEgYXNpZ25hdHVyYSAiUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhIiBkZSBsYSBVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEgZHVyYW50ZSBlbCBjdXJzbyAyMDIwLTIwMjEuIEVsIHJlcG8gZGVsIHRyYWJham8gZXN0w6EgW2FxdcOtXShodHRwczovL2dpdGh1Yi5jb20vbWFydGFvbGl2ZXIvdHJhYmFqb19CaWdEYXRhKXt0YXJnZXQ9Il9ibGFuayJ9LiBMYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhIHkgbG9zIHRyYWJham9zIGRlIG1pcyBjb21wYcOxZXJvcyBwdWVkZW4gdmVyc2UgW2FxdcOtXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMC0yMS13ZWIvMDctdHJhYmFqb3MuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifS4KCjxociBjbGFzcz0ibGluZWEtcmVkIj4KCiMgKioxLiBJbnRyb2R1Y2Npw7NuKioKCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+RWwgZsO6dGJvbCBmZW1lbmlubyBlcyBlbCBkZXBvcnRlIGRlIGVxdWlwbyBtw6FzIHByYWN0aWNhZG8gcG9yIG11amVyZXMgZW4gdG9kbyBlbCBtdW5kby4gRXN0ZSBkZXBvcnRlIGVtcGV6w7MgYSBzZXIgcHJhY3RpY2FkbyBlbiB1bmEgc2VjY2nDs24gZmVtZW5pbmEgaGFjZSBtdWNobyB0aWVtcG8sIGEgZmluYWxlcyBkZWwgc2lnbG8gWElYLCBlbiBMb25kcmVzIHBlcm8gZnVlIGEgY2F1c2EgZGUgbGFzIGRpc3RpbnRhcyBndWVycmFzIHkgbG9zIHByb2JsZW1hcyBlY29uw7NtaWNvcyB5IHNvY2lhbGVzIGRlIGxvcyBhw7FvcyBzaWd1aWVudGVzIHF1ZSBlc3RlIGRlcG9ydGUgZGVqw7MgZGUgc2VyIHByYWN0aWNhZG8uPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5BY3R1YWxtZW50ZSwgaGFjZSBhw7FvcyBxdWUgZWwgZsO6dGJvbCBmZW1lbmlubyBkZWrDsyBkZSBzZXIgdW4gbXVuZG8gZGUgaG9tYnJlcyB5IGxhcyBtdWplcmVzIGRpZXJvbiBlbCBwYXNvIHBhcmEgcHJhY3RpY2FyIGVzdGUgZGVwb3J0ZSwgYSBwZXNhciBkZSBxdWUgdGllbmVuIHF1ZSBzZWd1aXIgYWd1YW50YW5kbyBjb21lbnRhcmlvcyBkZXNwZWN0aXZvcyB5IGZyYXNlcyBjb21vICJlbCBmw7p0Ym9sIGVzIHVuIGRlcG9ydGUgZGUgaG9tYnJlcyIuPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5TZWfDum4gbG9zIGRhdG9zIG9maWNpYWxlcyBkZSBsYSBGSUZBLCBtw6FzIG8gbWVub3MgMjYgbWlsbG9uZXMgZGUgbXVqZXJlcyBqdWVnYW4gYWwgZsO6dGJvbCBlbiAxODAgcGHDrXNlcyBkZWwgbXVuZG8uIEV1cm9wYSBlcyBlbCBjb250aW5lbnRlIHF1ZSBoYSBleHBlcmltZW50YWRvIHVuIG1heW9yIGNyZWNpbWllbnRvIGVuIGxvcyDDumx0aW1vcyBhw7FvcyBkb25kZSBlbCBuw7ptZXJvIGRlIG11amVyZXMgcXVlIHByYWN0aWNhbiBlc3RlIGRlcG9ydGUgc2UgaGEgbXVsdGlwbGljYWRvIHBvciBjaW5jby48L2Rpdi8+Cgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPkVuIG51ZXN0cm8gcGHDrXMsIEVzcGHDsWEsIHRhbWJpw6luIGhhIGhhYmlkbyB1biBncmFuIHByb2dyZXNvIHkgbGEgc2VsZWNjacOzbiBuYWNpb25hbCBmZW1lbmluYSBoYSBlc3RhZG8gcHJlc2VudGUgZW4gbG9zIMO6bHRpbW9zIGHDsW9zIGVuIE11bmRpYWxlcyB5IEV1cm9jb3Bhcy48L2Rpdi8+Cgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPlBvY28gYSBwb2NvIHNlIGVzdMOhIG5vcm1hbGl6YW5kbyBlc3RhIG1vZGFsaWRhZCBkZWwgZsO6dGJvbCBwZXJvIHRvZGF2w61hIGZhbHRhbiBtdWNob3MgYXNwZWN0b3MgcGFyYSBtZWpvcmFyIGNvbW8gZWwgc3VlbGRvIGRlIGxhcyBwcm9mZXNpb25hbGVzLCBuaSBjb21wYXJhYmxlIGNvbiBsYXMgY2lmcmFzIHF1ZSBzZSBtdWV2ZW4gZW4gZWwgZsO6dGJvbCBtYXNjdWxpbm8uPC9kaXYvPgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUUsIG91dC53aWR0aCA9ICI1MCUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLmNhcD0iU2VsZWNjacOzbiBlc3Bhw7FvbGEifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWFnZW5lcyIsICJmdXRmZW1fZXNwYcOxYS5qcGciKSApIApgYGAKCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+RGViaWRvIGEgbGEgbmVjZXNpZGFkIGRlIGRhciBtYXlvciB2aXNpYmlsaWRhZCBhbCBmw7p0Ym9sIGZlbWVuaW5vIHkgeWEgcXVlIHlvIHRhbWJpw6luIHByYWN0aWNvIGVzdGUgZGVwb3J0ZSBoZSBkZWNpZGlkbyB0cmF0YXIgZXN0ZSB0ZW1hIGVuIGVsIHRyYWJham8gZGUgbGEgYXNpZ25hdHVyYSAiUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhIi48L2Rpdi8+Cgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPkxhIGZpbmFsaWRhZCB5IG9iamV0aXZvIGRlIGVzdGUgYW7DoWxpc2lzIGVzIG9ic2VydmFyIGVsIGRlc2Fycm9sbG8gYSBsbyBsYXJnbyBkZWwgdGllbXBvIGRlbCBmw7p0Ym9sIGZlbWVuaW5vIGVuIGxvcyBkaWZlcmVudGVzIHBhw61zZXMgZGVsIG11bmRvLjwvZGl2Lz4KCiMgKioyLiBEYXRvcyoqCgpMb3MgZGF0b3MgcXVlIGhlIHV0aWxpemFkbyBwYXJhIGhhY2VyIGVsIGFuw6FsaXNpcyBzZSBlbmN1YW50cmFuIGVuIGVsIHNpZ3VpZW50ZSBsaW5rOgpbRGF0b3NdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vbWFydGo0Mi93b21lbnMtaW50ZXJuYXRpb25hbC1mb290YmFsbC1yZXN1bHRzKQoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5FbiBlc3RvcyBkYXRvcyBhcGFyZWNlbiBsb3MgcGFydGlkb3MgZGUgbGFzIHNlbGVjY2lvbmVzIGRlIGbDunRib2wgZmVtZW5pbm8gZGVzZGUgZWwgYcOxbyAxOTY5IGhhc3RhIG1hcnpvIGRlbCBhw7FvIDIwMjAsIGRvbmRlIHBhcmFyb24gbG9zIHBhcnRpZG9zIGRlYmlkbyBhIGxhIHBhbmRlbWlhIHBvciBlbCBDb3JvbmF2aXJ1cy48L2Rpdi8+CgojIyAqKjIuMS4gUHJvY2VzYW5kbyBsb3MgZGF0b3MqKgoKYGBge3IsIGluY2x1ZGUgPSBUUlVFLCBlY2hvPVRSVUV9CgpmdXRmZW0gPC0gcmVhZF9leGNlbCgiLi9EYXRvcy9yZXN1bHRzX2Z1dGZlbS54bHN4IikKCiMgQ29uIGxhIHNpZ3VpZW50ZSBmdW5jacOzbiBoZSBzZXBhcmFkbyBsYSBjb2x1bW5hICJkYXRlIiBwYXJhIHBvZGVyIHRlbmVyIGxvcyBhw7FvcyBlbiB1bmEgc29sYSBjb2x1bW5hIHkgbW9zdHJhciBsYSBldm9sdWNpw7NuIGEgbG8gbGFyZ28gZGUgbG9zIGHDsW9zLgoKZGF0ZSA8LSBmdXRmZW0gJT4lICBzZXBhcmF0ZShjb2wgPSBkYXRlLCAKICAgICAgICAgICAgICBpbnRvID0gYygiQcOxbyIsICJNZXMiLCAiRGlhIiksCiAgICAgICAgICAgICAgc2VwICA9ICItIikKCmBgYAoKIyAqKjMuIEFuw6FsaXNpcyBkZSBzZWxlY2Npb25lcyoqCiMjICoqMy4xLiBFdm9sdWNpw7NuIGRlbCBmw7p0Ym9sIGZlbWVuaW5vIGEgbG8gbGFyZ28gZGVsIHRpZW1wbyoqCgpgYGB7ciBldmFsPVRSVUUsIGVjaG89VFJVRX0KIyBBIHBhcnRpciBkZSBsYSB0YWJsYSBxdWUgeWEgaGFiaWEgYXJyZWdsYWRvIGFudGVyaW9ybWVudGUsIGFncnVwbyBsb3MgYcOxb3MgcGFyYSBzYWJlciBjdWFudG9zIHBhcnRpZG9zIHNlIGp1Z2Fyb24gY2FkYSBhw7FvLgoKZXZvbCA8LSBkYXRlICU+JSBncm91cF9ieShBw7FvKSU+JSBjb3VudCgpCgojIEhhZ28gZWwgZ3LDoWZpY28gcXVlIGVuIGVzdGUgY2FzbyBlcyB1biAnYmFycGxvdCcKCmdncGxvdChldm9sLCBhZXMoeD1Bw7FvLCB5PW4sICBjb2w9J3JlZCcpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICB0aGVtZShheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImJsYW5rIiksIAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JleTEwMCIsIAogICAgICAgIHNpemUgPSAwLjYpKSArbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIHBhcnRpZG9zIHBvciBhw7FvIiwgCiAgICB4ID0gIkHDsW9zIiwgeSA9ICJOwrogUGFydGlkb3MiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKCmBgYAoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Qb2RlbW9zIHZlciBxdWUgaGEgaGFiaWRvIHVuIG5vdGFibGUgY3JlY2ltaWVudG8gZGUgbG9zIHBhcnRpZG9zIGRlIGbDunRib2wgZmVtZW5pbm8gYSBsbyBsYXJnbyBkZWwgdGllbXBvLjwvZGl2Lz4KCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+RW4gZWwgYcOxbyAxOTY5IHRhbiBzb2xvIHNlIGRpc3B1dGFyb24gNCBwYXJ0aWRvcyB5IGVuIGxvcyDDumx0aW1vcyBhw7FvcyBoYSBoYWJpZG8gdW4gbcOheGltbyBkZSAzNDkgcGFydGlkb3Mgb2ZpY2lhbGVzIGVuIGVsIG1pc21vIGHDsW8gKDIwMTgpLjwvZGl2Lz4KCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+U2UgcHVlZGUgb2JzZXJ2YXIgdW5hIGNsYXJhIHRlbmRlbmNpYSBhIHF1ZSBoYXkgdHJlcyBhw7FvcyBzZWd1aWRvcyBjb24gdW4gbsO6bWVybyBhbHRvIGRlIHBhcnRpZG9zIHNlZ3VpZG8gZGUgdW5vIHF1ZSBiYWphIGVsIG7Dum1lcm8gbm90YWJsZW1lbnRlLCBoYXN0YSBsbGVnYXIgYWwgYcOxbyAyMDE0IHF1ZSBzZSBoYW4gaWRvIGlndWFsYW5kby4gRXN0byBzZSBkZWJlIGEgcXVlIGNhZGEgYcOxbyBzZSBkaXNwdXRhIHVuIHRvcm5lbyBkaWZlcmVudGUgc2Vnw7puIGVsIGNvbnRpbmVudGUsIG1lbm9zIGVsIE11bmRpYWwgeSBsb3MgSnVlZ29zIE9sw61tcGljb3MgcXVlIGFtYm9zIHNvbiBhIG5pdmVsIG11bmRpYWwuPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Mb3MgYcOxb3MgcXVlIHRlbsOtYW4gdW4gbWF5b3IgbsO6bWVybyBkZSBwYXJ0aWRvcyBjb2luY2lkZW4gY29uIGxvcyBwYXJ0aWRvcyBwYXJhIGxhIGNsYXNpZmljYWNpw7NuIGEgbGEgRXVyb2NvcGEsICBlbCBNdW5kaWFsIHkgbGEgY2xhc2lmaWNhY2nDs24gcGFyYSBlc3RlLCBxdWUgY29tbyB2ZXJlbW9zIG3DoXMgYWRlbGFudGUgc29uIGxvcyB0b3JuZW9zIG9maWNpYWxlcyBjb24gbcOhcyBwYXJ0aWRvcyBkaXNwdXRhZG9zLjwvZGl2Lz4KCmBgYHtyIGV2YWw9VFJVRSwgZWNobz1UUlVFLCBvdXQud2lkdGggPSAiNTAlIiwgZmlnLmFsaWduID0gImNlbnRlciJ9Cm1vbnRoIDwtIGRhdGUgJT4lIGdyb3VwX2J5KE1lcyklPiUgY291bnQoKQoKZ3JfbW9udGggPC0gZ2dwbG90IChtb250aCwgYWVzKHg9TWVzLCB5ID0gbiksIGFlcyhmY3RfcmV2KE1lcykpKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbCA9ICJhcXVhbWFyaW5lIikgKyBjb29yZF9mbGlwKCkgKyBsYWJzKHggPSAiTWVzIiwgeSA9ICJOw7ptZXJvIGRlIHBhcnRpZG9zIikrbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIHBhcnRpZG9zIHBvciBtZXMiKQpnZ3Bsb3RseShncl9tb250aCkKYGBgCgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPkNvbiByZXNwZWN0byBhIGVzdGUgZ3LDoWZpY28sIHBvZGVtb3MgdmVyIGxvcyBtZXNlcyBlbiBsb3MgcXVlIG3DoXMgcGFydGlkb3Mgc2UgZGlzcHV0YW4uIEVuIGVzdGUgY2FzbyBlbCBtZXMgY29uIG3DoXMgcGFydGlkb3MgeSBlc3RvIHNlIGRlYmUgYSBxdWUgbXVjaG9zIHBhcnRpZG9zIGRlIGxhIGNsYXNpZmljYWNpw7NuIGEgbGEgRXVyb2NvcGEsIGVsIE11bmRpYWwgeSBsYSBDb3BhIGRlIEFtw6lyaWNhIHNlIGp1ZWdhbiBlbiBlc3RlIG1lcyB5YSBxdWUgZXN0b3MgdG9ybmVvcyBzZSBqdWVnYW4gZHVyYW50ZSBsb3MgbWVzZXMgZGUganVuaW8geSBqdWxpby4gQWRlbcOhcywgZWwgdG9ybmVvIGFtaXN0b3NvIGRlIGxhIENvcGEgZGUgQWxnYXJ2ZSBlcyBlbCBzZWd1bmRvIHRvcm5lbyBxdWUgbcOhcyBwYXJ0aWRvcyB0aWVuZSBkaXNwdXRhZG9zIHkgZXN0ZSBzZSBqdWVnYSB0b2RvcyBsb3MgYcOxb3MgZW4gbWFyem8gZGVzZGUgZWwgYcOxbyAxOTk0LjwvZGl2Lz4KCiMjICoqMy4yLiBUb3JuZW9zKioKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFLCBvdXQud2lkdGggPSAiNTAlIiwgZmlnLmFsaWduID0gImNlbnRlciIsIGZpZy5jYXA9Ik11bmRpYWwgZGUgRnJhbmNpYSAyMDE5In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAibXVuZGlhbF9mZW0yMDE5LnBuZyIpICkgCmBgYAoKYGBge3IgZXZhbD1UUlVFLCBlY2hvPVRSVUV9Cgp0b3VybiA8LSBmdXRmZW0gJT4lIGdyb3VwX2J5KHRvdXJuYW1lbnQpJT4lIGNvdW50KCkKeCA8LSBjKDg2LCAxMTUsIDI2OCwgMTczLCAyMjYsIDE2LCA1NDUsIDQyLCAxMjYsIDE0NSwgNiwgMTU3LCAyMCwgMjg0LCAxNzIsIDEwNiwgNzgsIDMyLCA2LCAxMzAsIDMwLCA2LCAxNTMsIDEyNDEpCmxibCA8LSBjKCJBRkMgQXNpYW4gQ3VwIiwgIkFGQyBBc2lhbiBDdXAgcXVhbGlmaWNhdGlvbiIsICJBRkMgQ2hhbXBpb25zaGlwIiwgIkFmcmljYW4gQ2hhbXBpb25zaGlwIiwgIgkKQWZyaWNhbiBDaGFtcGlvbnNoaXAgcXVhbGlmaWNhdGlvbiIsICJBZnJpY2FuIEN1cCBvZiBOYXRpb25zIiwgIkFsZ2FydmUgQ3VwIiwgIkNPTkNBQ0FGIENoYW1waW9uc2hpcCIsICIJCkNPTkNBQ0FGIEdvbGQgQ3VwIiwgIkNPTkNBQ0FGIEdvbGQgQ3VwIHF1YWxpZmljYXRpb24iLCAiQ09OQ0FDQUYgSW52aXRhdGlvbmFsIFRvdXJuYW1lbnQiLCAiQ29wYSBBbcOpcmljYSIsICJFdXJvIiwgIkZJRkEgV29ybGQgQ3VwIiwgIkZJRkEgV29ybGQgQ3VwIHF1YWxpZmljYXRpb24iLCAiRm91ciBOYXRpb25zIFRvdXJuYW1lbnQiLCAiT0ZDIENoYW1waW9uc2hpcCIsICJPRkMgTmF0aW9ucyBDdXAiLCAiT0ZDIE5hdGlvbnMgQ3VwIHF1YWxpZmljYXRpb24iLCAiT2x5bXBpYyBHYW1lcyIsICJTaGVCZWxpZXZlcyBDdXAiLCAiVG91cm5vaSBkZSBGcmFuY2UiLCAiVUVGQSBFdXJvIiwgIgkKVUVGQSBFdXJvIHF1YWxpZmljYXRpb24iKQoKcGllM0QoeCwgbGFiZWxzID0gbGJsLCBleHBsb2RlID0gMC4xLCBtYWluID0gIlRvcm5lb3MiLCBsYWJlbGNleCA9IDAuNSkKCgpgYGAKCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+Q29tbyB5YSBoYWLDrWEgbWVuY2lvbmFkbyBlbiBlbCBhcGFydGFkbyBhbnRlcmlvciB5IHF1ZSBhaG9yYSBwb2RlbW9zIHZlciBlbiBlbCBncsOhZmljbyBsb3MgdG9ybmVvcyBkb25kZSBzZSBqdWVnYW4gdW5hIG1heW9yIGNhbnRpZGFkIGRlIHBhcnRpZG9zIHNvbiBsYXMgZmFzZXMgZGUgY2xhc2lmaWNhY2nDs24gYSBsYSBFdXJvY29wYSBmZW1lbmluYSwgbGEgQ29wYSBkZSBBbGdhcnZlIHkgZWwgTXVuZGlhbC4gRW50cmUgZXN0b3MgdHJlcywgbGEgRXVyb2NvcGEgeSBlbCBNdW5kaWFsIHNvbiB0b3JuZW9zIG9maWNpYWxlcyBtaWVudHJhcyBxdWUgbGEgY29wYSBkZSBBbGdhcnZlIGVzIHVuIHRvcm5lbyBhbWlzdG9zby48L2Rpdi8+Cgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPkVsIMO6bHRpbW8gY2FtcGXDs24gZGUgbGEgY29wYSBkZWwgbXVuZG8gZnVlIEVFVVUgZW4gMjAxOSwgZXN0YSBtaXNtYSBzZWxlY2Npw7NuIGVzIGxhIHF1ZSBtw6FzIHZlY2VzIGhhIGdhbmFkbyBlc3RlIGNhbXBlb25hdG8sIHVuIHRvdGFsIGRlIDQgdmVjZXMuPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Db24gcmVzcGVjdG8gYSBsYSBFdXJvY29wYSwgZWwgw7psdGltbyBnYW5hZG9yIGZ1ZSBQYcOtc2VzIEJham9zIGVuIDIwMTcsIHNpbiBlbWJhcmdvLCBsYSBzZWxlY2Npw7NuIHF1ZSBtw6FzIHZlY2VzIGhhIGdhbmFkbyBlc3RlIHRvcm5lbyBlcyBsYSBzZWxlY2Npw7NuIGZlbWVuaW5hIGFsZW1hbmEsIHVuIHRvdGFsIGRlIDggdMOtdHVsb3MuPC9kaXYvPgoKCiMjICoqMy4zLiBTZWxlY2Npb25lcyBxdWUgbcOhcyBwYXJ0aWRvcyBoYW4ganVnYWRvIGVuIGNhc2EgeSBtw6FzIHBhcnRpZG9zIGZ1ZXJhKip7LnRhYnNldH0KCiMjIyBQYXJ0aWRvcyBqdWdhZG9zIGVuIGNhc2EKCmBgYHtyIGV2YWw9VFJVRSwgZWNobz1UUlVFfQoKc2VsZWNfaG9tZSA8LSBmdXRmZW0gJT4lIGdyb3VwX2J5KGhvbWVfdGVhbSklPiUgY291bnQoKQpzZWxlY19ob21lIDwtIHNlbGVjX2hvbWUgJT4lIGFycmFuZ2UoZGVzYyhuKSkKCgpyZWFjdGFibGUoc2VsZWNfaG9tZSwgZGVmYXVsdFBhZ2VTaXplID0gIDEwLCAgcGFnaW5hdGlvblR5cGUgPSAianVtcCIsIHNob3dQYWdlU2l6ZU9wdGlvbnMgPSAgVFJVRSAsIHBhZ2VTaXplT3B0aW9ucyA9ICBjICggMTAgLCA1MCAsIDEwMCApLGRlZmF1bHRDb2xEZWYgPSBjb2xEZWYoCiAgICBhbGlnbiA9ICJjZW50ZXIiLAogICAgbWluV2lkdGggPSA3MCwKICAgIGhlYWRlclN0eWxlID0gbGlzdChiYWNrZ3JvdW5kID0gImN5YW4iKSwKICAgIGZpbHRlcmFibGUgPSBUUlVFKSwgIGhpZ2hsaWdodCA9IFRSVUUsIG91dGxpbmVkID0gVFJVRSwKICAgIGNvbHVtbnMgPSBsaXN0KAogIGBNb3ZpZXMmVFZTaG93L2HDsW9gID0gY29sRGVmKHN0eWxlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIGlmICh2YWx1ZSA+IDApIHsKICAgICAgY29sb3IgPC0gIiNlMDAwMDAifQogICAgICBlbHNlIHsKICAgICAgY29sb3IgPC0gIiMwMDgwMDAiCiAgICB9CiAgICBsaXN0KGNvbG9yID0gY29sb3IsIGZvbnRXZWlnaHQgPSAiYm9sZCIpCiAgfSkpKQoKYGBgCgojIyMgUGFydGlkb3MganVnYWRvcyBmdWVyYQoKYGBge3IgZXZhbD1UUlVFLCBlY2hvPVRSVUV9CgpzZWxlY19hd2F5IDwtIGZ1dGZlbSAlPiUgZ3JvdXBfYnkoYXdheV90ZWFtKSU+JSBjb3VudCgpCnNlbGVjX2F3YXkgPC0gc2VsZWNfYXdheSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKCnJlYWN0YWJsZShzZWxlY19hd2F5LCBkZWZhdWx0UGFnZVNpemUgPSAgMTAsICBwYWdpbmF0aW9uVHlwZSA9ICJqdW1wIiwgc2hvd1BhZ2VTaXplT3B0aW9ucyA9ICBUUlVFICwgcGFnZVNpemVPcHRpb25zID0gIGMgKCAxMCAsIDUwICwgMTAwICksZGVmYXVsdENvbERlZiA9IGNvbERlZigKICAgIGFsaWduID0gImNlbnRlciIsCiAgICBtaW5XaWR0aCA9IDcwLAogICAgaGVhZGVyU3R5bGUgPSBsaXN0KGJhY2tncm91bmQgPSAiY3lhbiIpLAogICAgZmlsdGVyYWJsZSA9IFRSVUUpLCAgaGlnaGxpZ2h0ID0gVFJVRSwgb3V0bGluZWQgPSBUUlVFLAogICAgY29sdW1ucyA9IGxpc3QoCiAgYE1vdmllcyZUVlNob3cvYcOxb2AgPSBjb2xEZWYoc3R5bGUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKHZhbHVlID4gMCkgewogICAgICBjb2xvciA8LSAiI2UwMDAwMCJ9CiAgICAgIGVsc2UgewogICAgICBjb2xvciA8LSAiIzAwODAwMCIKICAgIH0KICAgIGxpc3QoY29sb3IgPSBjb2xvciwgZm9udFdlaWdodCA9ICJib2xkIikKICB9KSkpCgpgYGAKCiMjICoqMy40LiBQYWlzIGRvbmRlIG3DoXMgcGFydGlkb3Mgc2UgaGFuIGp1Z2FkbyoqCgpgYGB7ciBldmFsPVRSVUUsIGVjaG89VFJVRX0KY291bnRyeSA8LSBmdXRmZW0gJT4lIGdyb3VwX2J5KGNvdW50cnkpJT4lIGNvdW50KCkgJT4lIHJlbmFtZShwYWlzID0gY291bnRyeSkKCmNvdW50cnkgPC0gY291bnRyeSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgcmVuYW1lKHBhcnRpZG9zID0gbikgCgpjb3VudHJ5ICU+JSBEVDo6ZGF0YXRhYmxlKGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsIAogICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmxmcnRpcCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gYygnY29weScsICdjc3YnLCAnZXhjZWwnLCAncGRmJywgJ3ByaW50JyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gNSwgYXV0b1dpZHRoID0gVFJVRSApKQogIApgYGAKCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+RWwgcGHDrXMgZG9uZGUgbcOhcyB2ZWNlcyBzZSBoYSBqdWdhZG8gdW4gcGFydGlkbyBlcyBQb3J0dWdhbCwgdW4gdG90YWwgZGUgNTgwIHBhcnRpZG9zIHlhIHF1ZSBhaMOtIHNlIGRpc3B1dGEgZWwgdG9ybmVvIGRlIEFsZ2FydmUgQ3VwIHF1ZSBlcyB1bm8gZGUgbG9zIHRvcm5lb3MgY29uIG3DoXMgcGFydGlkb3MganVnYWRvcyB5YSBxdWUgc2UganVlZ2EgdG9kb3MgbG9zIGHDsW9zLiBBIGVzdGUsIGxlIHNpZ3VlbiBDaGluYSB5IEVzdGFkb3MgVW5pZG9zIHF1ZSBzb24gZG9zIGRlIGxvcyBwYcOtc2VzIG3DoXMgaW1wb3J0YW50ZXMgcmVzcGVjdG8gYWwgZsO6dGJvbCBmZW1lbmlubyBwb3JxdWUgc3VlbGVuIGVzdGFyIHByZXNlbnRlcyBlbiB0b2RvcyBsb3MgdG9ybmVvcyB5IHNvYnJlIHRvZG8gRUVVVSwgbGEgc2VsZWNjacOzbiBmZW1lbmlubyBzaWVtcHJlIGhhIHRlbmlkbyB1biBtYXlvciBhcG95byBwb3IgbGEgcG9ibGFjacOzbiBlbiBjb21wYXJhY2nDs24gY29uIG90cm9zIHBhw61zZXMuPC9kaXYvPgoKYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRX0KCiMgVm95IGEgY3JlYXIgdW4gZ3LDoWZpY28gcGFyYSBwb2RlciB2aXN1YWxpemFyIG1lam9yIGxvcyBwYWlzZXMuIENvZ2llbmRvIHVuIGPDs2RpZ28gZGUgdW4gbWFwYSBkZSB1bmEgcMOhZ2luYSBkZSBpbnRlcm5ldCAgeSBoZSBjYW1iaWFkbyBsb3MgcGFpc2VzIHkgbGFzIGNvb3JkZW5hZGFzIGRlIGVzdG9zLgptYXBhIDwtIG1hcF9kYXRhKCJ3b3JsZCIpICU+JSBtdXRhdGUoY29sb3IgPSBjYXNlX3doZW4ocmVnaW9uID09ICJQb3J0dWdhbCIgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9PSAiQ2hpbmEiIH4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gPT0gIlVTQSIgfiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9PSAiU3dlZGVuIiB+IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uID09ICJHZXJtYW55IiB+IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uID09ICJGcmFuY2UiIH4gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gPT0gIkNhbmFkYSIgfiA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9PSAiSXRhbHkiIH4gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gPT0gIk5ldGhlcmxhbmRzIiB+IDkpKSAlPiUgbXV0YXRlKGNvbG9yID0gaWZfZWxzZShpcy5uYShjb2xvciksMCxjb2xvcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgpwYWlzZXMgPC0gYygiUG9ydHVnYWwiLCJDaGluYSIsIlVTQSIsIlN3ZWRlbiIsIkdlcm1hbnkiLCJGcmFuY2UiLCJDYW5hZGEiLCJJdGFseSIsIk5ldGhlcmxhbmRzIikKCmxhdCA8LSBjKDM3LjE3OTQ0LDE5Ljk5MTk0LDE5LjAxMjAxLDU2LjI5MDUzLDUzLjg3MDc1LDQyLjgwNTQyLDQzLjkzOTYwLDM2Ljc1NzAzLDUxLjM4NjQ3KQpsb25nIDwtIGMoLTcuNDA2MTUzLDExMC44ODg4LC0xNTUuNTgxMzQsMTYuNTI4NTIsMTQuMjEzNjcyLDkuNDgwMzcxLDU5Ljc4NzYwLDEyLjA1MTI3MCw0LjIyNjE3MSkKCmxhdGxvbmcgPC0gZGF0YS5mcmFtZShwYWlzZXMsbGF0LGxvbmcpCiAgICAgICAgICAgICAgICAgICAgIAoKbWFwYTEgPC0gZ2dwbG90KCkgKyBnZW9tX21hcChkYXRhID0gbWFwYSwgbWFwID0gbWFwYSwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAiI2Y3ZWNhMSIpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX21hcChkYXRhID0gbWFwYSAlPiUgZmlsdGVyKGNvbG9yPT0xKSwgbWFwID0gbWFwYSwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAicmVkIikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSBtYXBhICU+JSBmaWx0ZXIoY29sb3I9PTIpLCBtYXAgPSBtYXBhLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICJncmVlbiIpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX21hcChkYXRhID0gbWFwYSAlPiUgZmlsdGVyKGNvbG9yPT0zKSwgbWFwID0gbWFwYSwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAiY3lhbiIpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX21hcChkYXRhID0gbWFwYSAlPiUgZmlsdGVyKGNvbG9yPT00KSwgbWFwID0gbWFwYSwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAiI2FiNjgwMCIpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX21hcChkYXRhID0gbWFwYSAlPiUgZmlsdGVyKGNvbG9yPT01KSwgbWFwID0gbWFwYSwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAieWVsbG93IikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSBtYXBhICU+JSBmaWx0ZXIoY29sb3I9PTYpLCBtYXAgPSBtYXBhLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICIjMDA0ZGZmIikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSBtYXBhICU+JSBmaWx0ZXIoY29sb3I9PTcpLCBtYXAgPSBtYXBhLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICIjZmY5MzAwIikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSBtYXBhICU+JSBmaWx0ZXIoY29sb3I9PTgpLCBtYXAgPSBtYXBhLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICIjYTQwMzRiIikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSBtYXBhICU+JSBmaWx0ZXIoY29sb3I9PTkpLCBtYXAgPSBtYXBhLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICIjMjM4YTAwIikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGxhdGxvbmcsIGFlcyh4ID0gbG9uZyx5ID0gbGF0KSwgc2l6ZSA9IDIpICsKICAgICAgICAgICAgICAgICAgICB5bGltKC01NSxOQSkgKwogICAgICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjYTZmZmZiIikgLCBwYW5lbC5ncmlkID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjMDAwMDAwIiksIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKSAgCiAgICAgICAgICAgICAgICAgICAgCm1hcGExICAgICAgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTEwMCIpKSArbGFicyh0aXRsZSA9ICJQYcOtc2VzIGRvbmRlIG3DoXMgcGFydGlkb3Mgc2UgaGFuIGp1Z2FkbyIpCgpgYGAKCiMjICoqMy41LiBNdW5kaWFsIHZzIEV1cm9jb3BhKioKCmBgYHtyLCBlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUV9CmNvbXAgPC0gZGF0ZSAlPiUgZ3JvdXBfYnkoQcOxbykgJT4lIGNvdW50KHRvdXJuYW1lbnQpICU+JSBmaWx0ZXIodG91cm5hbWVudCAlaW4lIGMoIkZJRkEgV29ybGQgQ3VwIiwgIlVFRkEgRXVybyBxdWFsaWZpY2F0aW9uIikpIAoKZ2dwbG90KGNvbXAsIGFlcyhmaWxsPXRvdXJuYW1lbnQsIHk9biwgeD1Bw7FvKSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKyB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyYXkiLCAKICAgIGxpbmV0eXBlID0gInNvbGlkIiksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLCAKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5MTAwIikpICtsYWJzKHRpdGxlID0gIk11bmRpYWwgdnMgRXVyb2NvcGEiKQoKCmBgYAoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5MYSBDb3BhIE11bmRpYWwgRmVtZW5pbmEgZGUgbGEgRklGQSBlcyBlbCB0b3JuZW8gaW50ZXJuYWNpb25hbCBkZSBmw7p0Ym9sIGZlbWVuaW5vIGEgbml2ZWwgZGUgc2VsZWNjaW9uZXMgbmFjaW9uYWxlcyBtw6FzIGltcG9ydGFudGUgZGVsIG11bmRvLiBBZGVtw6FzLCBleGlzdGVuIG90cmFzIGNvbXBldGVuY2lhcyBqdXZlbmlsZXMgY29tbyBsYSBDb3BhIE11bmRpYWwgRmVtZW5pbmEgZGUgRsO6dGJvbCBTdWItMjAgeSBsYSBDb3BhIE11bmRpYWwgRmVtZW5pbmEgZGUgRsO6dGJvbCBTdWItMTcsIGFtYmFzIG9yZ2FuaXphZGFzIHBvciBsYSBGSUZBLiBMYSBwcmltZXJhIGVkaWNpw7NuIGRlIGVzdGUgdG9ybmVvIGZ1ZSBlbiAxOTkxIHkgYSBwYXJ0aXIgZGUgYWjDrSBzZSBkZWNpZGnDsyBxdWUgc2UganVnYXLDrWEgY2FkYSA0IGHDsW9zIGF1bnF1ZSBoYSBoYWJpZG8gYcOxb3MgZW4gbG9zIHF1ZSBzZSBoYSBkaXNwdXRhZG8gYXVucXVlIG5vIHRvY2FiYS4gRW4gdW4gcHJpbmNpcGlvLCBlc3RlIHRvcm5lbyBjb250YWJhIGNvbiAxNiBzZWxlY2Npb25lcyB5IGhhIGlkbyBldm9sdWNpb25hbmRvIHkgaGFjacOpbmRvc2UgZ3JhbmRlIGhhc3RhIHF1ZSBlbiAyMDE1IHN1YmnDsyBhIDI0IHkgc2UgZXNwZXJhIHF1ZSBlbiBlbCBtdW5kaWFsIGRlIDIwMjMgc2UgZGlzcHV0ZSBjb24gMzIgc2VsZWNjaW9uZXMuPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5FbCBDYW1wZW9uYXRvIGRlIEV1cm9wYSBGZW1lbmlubyBkZSBsYSBVRUZBLCBjb23Dum5tZW50ZSBjb25vY2lkbyBjb21vIEV1cm9jb3BhIEZlbWVuaW5hLCBlcyBsYSBjb21wZXRpY2nDs24gaW50ZXJuYWNpb25hbCBmdXRib2zDrXN0aWNhIG3DoXMgaW1wb3J0YW50ZSBlbnRyZSBzZWxlY2Npb25lcyBuYWNpb25hbGVzIGZlbWVuaW5hcyBkZSBsYSBVRUZBLiBFc3RlIHRvcm5lbyBjb21lbnrDsyBhIGRpc3B1dGFyc2UgZW4gMTk2OSBzaW4gZW1iYXJnbyBlc3RvcyBhw7FvcyBubyBmdWUgY29uc2lkZXJhZG8gb2ZpY2lhbCB5IGxhIHByaW1lcmEgZWRpY2nDs24gZGVsIHRvcm5lbyByZXNwYWxkYWRvIHBvciBsYSBVRUZBIGZ1ZSBlbiAxOTgyLjwvZGl2Lz4KCiMjICoqMy42LiBUaXBvIGRlIGNhbXBvKioKCmBgYHtyLCBlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUV9CgpuZXV0cmFsIDwtIGRhdGUgJT4lIGdyb3VwX2J5KG5ldXRyYWwpICU+JSBjb3VudCgpIAoKZGF0b3MgPC0gYygyMzI0LCAxODM5KQoKcGllM0QoZGF0b3MsIGxhYmVscyA9IGRhdG9zLCBjb2wgPSAyOjMsIGxhYmVsY29sID0gInJlZCIsIGJvcmRlciA9ICJ3aGl0ZSIsIG1haW4gPSAiVGlwbyBkZSBjYW1wbyIpIAoKbGVnZW5kKHggPSAidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJGYWxzZSIsICJUcnVlIiksIGZpbGwgPSBjKCJwaW5rIiwgImdyZWVuIiksIAogICAgICAgdGl0bGUgPSAiTGVnZW5kIikKCmBgYAoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Db24gZXN0b3MgZGF0b3Mgb2J0ZW5lbW9zIHF1ZSBkZSA0MTYzIHBhcnRpZG9zIG9maWNpYWxlcyBxdWUgc2UgaGFuIGRpc3B1dGFkbyBkZXNkZSBlbCBhw7FvIDE5NjksIDIzMjQgaGFuIHNpZG8gZGlzcHV0YWRvcyBlbiBjYW1wbyBwcm9waW8gZGUgYWxndW5vIGRlIGxvcyBkb3MgcGFpc2VzLjwvZGl2Lz4KCiMgKio0LiBTZWxlY2Npw7NuIGVzcGHDsW9sYSoqCgojIyAqKjQuMS4gTsO6bWVybyBkZSBwYXJ0aWRvcyBqdWdhZG9zIGVuIEVzcGHDsWEqKgoKYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRX0KCnNwYWluIDwtIGRhdGUgJT4lIGdyb3VwX2J5KEHDsW8pICU+JSBjb3VudChjb3VudHJ5KSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlNwYWluIikKCmdncGxvdChzcGFpbiwgYWVzKHg9QcOxbywgeT1uKSkgKyAKICBnZW9tX3BvaW50KHNpemU9MykgKyAKICBnZW9tX3NlZ21lbnQoYWVzKHg9QcOxbywgCiAgICAgICAgICAgICAgICAgICB4ZW5kPUHDsW8sIAogICAgICAgICAgICAgICAgICAgeT0wLCAKICAgICAgICAgICAgICAgICAgIHllbmQ9bikpICsgCiAgbGFicyh0aXRsZT0iUGFydGlkb3MganVnYWRvcyBlbiBFc3Bhw7FhIikgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCwgdmp1c3Q9MC42KSkrbGFicyh4ID0gIkHDsW9zIiwgeSA9ICJuwrogcGFydGlkb3MiKQoKYGBgCgojICoqNS4gQ29uY2x1c2nDs24qKgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Db21vIGNvbmNsdXNpw7NuLCBzZSBwdWVkZSBvYnNlcnZhciBxdWUgZWwgZsO6dGJvbCBmZW1lbmlubyBoYSBleHBlcmltZW50YWRvIHVuIGdyYW4gY3JlY2ltaWVudG8gZGVzZGUgc3VzIGluaWNpb3MgaGFzdGEgYWhvcmEsIHNpbiBlbWJhcmdvIHRvZGF2w61hIGZhbHRhIG11Y2hvIHF1ZSBtZWpvcmFyLiBFc3RlIGNyZWNpbWllbnRvIG5vIHNvbG8gZXN0w6EgcmVsYWNpb25hZG8gY29uIGxvcyBkYXRvcyBhbmFsaXphZG9zIGNvbW8gc29uIGVsIG7Dum1lcm8gZGUgcGFydGlkb3MgcG9yIGHDsW8gZGUgZ29sZXMgbyBkZSBzZWxlY2Npb25lcyBzaW5vIHF1ZSBjYWRhIHZleiBoYXkgbcOhcyBwZXJzb25hcyBpbnRlcmVzYWRhcyBlbiBlc3RlIGRlcG9ydGUgeSBlc3RvIGhhY2UgcXVlIGdhbmUgbcOhcyBwb3B1bGFyaWRhZC48L2Rpdi8+Cgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPkhheSBwYcOtc2VzIGNvbW8gcG9yIGVqZW1wbG8gRUVVVSwgQWxlbWFuaWEgbyBGcmFuY2lhIGRvbmRlIGxvcyBjbHViZXMgeWEgZGVzdGluYW4gdW5hIGNhbnRpZGFkIGNvbnNpZGVyYWJsZSBkZSBkaW5lcm8gcGFyYSBlc3RhIHNlY2Npw7NuIGRlbCBmw7p0Ym9sIHByb2Zlc2lvbmFsIGhhY2llbmRvIHRhbWJpw6luIHF1ZSBzdXMgc2VsZWNjaW9uZXMgbWVqb3JlbiB5IHNlYW4gcmVmZXJlbnRlcyBwYXJhIHRvZG8gZWwgbXVuZG8uPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Fc3Bhw7FhIGVzIGVsIG5vdmVubyBwYcOtcyBlbiBjdWFudG8gYSBsYSBpbnZlcnNpw7NuIGRlIGxvcyBjbHViZXMgeSBsYXMgZmVkZXJhY2lvbmVzIGNvbiA0IG1pbGxvbmVzIGRlIGV1cm9zLiBFcyB1bmEgcG9zaWNpw7NuIGJhc3RhbnRlIGJ1ZW5hIHBhcmEgRXNwYcOxYSBxdWUgZW4gcG9jbyB0aWVtcG8gaGEgc3VwZXJhZG8gYSBtdWNob3Mgb3Ryb3MgcGHDrXNlcyBlbiBlc3RlIGFzcGVjdG8uPC9kaXYvPgoKCiMgKio2LiBUcmFiYWpvcyBlbiBsb3MgcXVlICBtZSBoZSBiYXNhZG8qKgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5FbiBsYSBww6FnaW5hIGRlIGRvbmRlIGhlIGNvZ2lkbyBsb3MgZGF0b3MsIGhheSBhbGd1bm9zIGFuw6FsaXNpcyBjb24gZXN0b3MgbWlzbW9zIGRhdG9zIHF1ZSBhdW5xdWUgbm8gZXN0w6FuIGVuIGxlbmd1YWplIHIgbWUgaGFuIHNlcnZpZG8gY29tbyBlamVtcGxvcyBwYXJhIGFsZ3Vub3MgZGUgbG9zIGdyw6FmaWNvcyB5IG1hcGFzIHF1ZSBoZSB1dGlsaXphZG8gZW4gZXN0ZS48L2Rpdi8+CgpFc3RvcyBzZSBwdWVkZW4gdmVyIFthcXVpXShodHRwczovL3d3dy5rYWdnbGUuY29tL21hcnRqNDIvd29tZW5zLWludGVybmF0aW9uYWwtZm9vdGJhbGwtcmVzdWx0cy9ub3RlYm9va3MpCgoKIyAqKjcuIEJpYmxpb2dyYWZpYSoqCgotIFtlbmxhY2UgYSBsYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMC0yMS13ZWIvMDQtdHV0b3JpYWxlcy5odG1sKQotIFtlamVtcGxvcyBkZSBncsOhZmljb3MgeSBtYXBhc10oaHR0cHM6Ly93d3cuci1ncmFwaC1nYWxsZXJ5LmNvbS8pCi0gW2RhdG9zIGRlbCB0cmFiYWpvXShodHRwczovL3d3dy5rYWdnbGUuY29tL21hcnRqNDIvd29tZW5zLWludGVybmF0aW9uYWwtZm9vdGJhbGwtcmVzdWx0cykKLSBbZWplbXBsbyBkZSBhbsOhbGlzaXNdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZ2NkYXRraW4vd29tZW4tcy1mb290YmFsbC13aW4tcHJlZGljdGlvbikKLSBbZWplbXBsbyBkZSBhbsOhbGlzaXNdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vY211bGU5MC9lZGEtd29tZW4tcy1pbnRlcm5hdGlvbmFsLWZvb3RiYWxsKQotIFtlamVtcGxvIGRlIGFuw6FsaXNpc10oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9hcmluZGFtYmFydWFoL3dvbWVuLXMtZm9vdGJhbGwtaXMtb24tYS1yaXNlKQoKCiMgKio4LiBTZXNpw7NuIEluZm9ybWF0aXZhKioKYGBge3J9CiAgICBzZXNzaW9uaW5mbzo6c2Vzc2lvbl9pbmZvKCkgJT4lIGRldGFpbHM6OmRldGFpbHMoc3VtbWFyeSA9ICdjdXJyZW50IHNlc3Npb24gaW5mbycpCmBgYA==