AE3UC1_11

* Jose Nunez, * Mario Alejandro Salcedo,* Victor Manuel

15/10/2021

I. Introduccion

El coronavirus es una familia de virus que causa enfermedades desde un resfriado común hasta enfermedades severas que requieren mayor atención clínica similares a las observadas en el síndrome respiratorio por coronavirus de Medio Oriente (MERS) y el Síndrome respiratorio agudo grave (SARS). Coronavirus

II. Antecedentes

Coronavirus SARS-COV-2, es un virus que apareció por primera vez en China en noviembre de 2019 y provoca una enfermedad llamada COVID-19, que se extendió por el mundo y fue declarada pandemia global por la Organización Mundial de la Salud. Esta enfermedad afecta principalmente a los siguientes grupos poblacionales:

  • Personas de la tercera edad.
  • Personas con sobrepeso u obesidad.
  • Personas con enfermedades crónicas como: cáncer, diabetes, e hipertensión.
  • Mujeres con embarazo.

La Organización Mundial de la Salud recomienda como medidas para la reducción de contagios: * Evitar lugares aglomerados (transporte público, centros de convenciones/deportivos, supermercados, etc). * Mantener medidas sanitarias (lavado de manos, uso de cubrebocas, evitar el contacto con personas contagiadas, etc).

World Health Organizatio

El periodo de pandemia a nivel federal en México dio comienzo con la jornada de “Sana Distancia” el 23 de marzo, como punto de comparación la Organización Mundial de la Salud declaró el brote una emergencia de salud pública de importancia internacional el 30 de enero de 2020 y una pandemia el 11 de marzo de 2020.

Cronología de la pandemia en México * En México residen 15.4 millones de personas de 60 años o más y el 69.4% presentan algún tipo de discapacidad. * México ocupa el segundo lugar de prevalencia mundial de obesidad en la población adulta; De la población de 5 a 11 años, 18% tiene sobrepeso y va en incremento conforme aumenta la edad; 21% de los hombres de 12 a 19 años y 27% de las mujeres de la misma edad, presentan sobrepeso. En la población de 20 años o más, los hombres (42%) reportan una prevalencia más alta que las mujeres (37%). * Se estima que el 70.3% de la población adulta en México vive con al menos un factor de riesgo cardiovascular.

Obesidad en México Riesgo cardiovascular en México

Factores a considerar

En México el 80% de la población utilizaba de manera frecuente cómo método de transporte el sistema público, cerca del 40% lo utiliza como único método de transporte, este número bajó de forma significativa con el inicio de la pandemia. La densidad poblacional en México varía de gran manera de estado a estado, por ejemplo la densidad de población es de 6163.3 habitantes por kilómetro cuadrado en la capital del país, y contrasta con la media nacional de 64.3 habitantes por kilómetro cuadrado.

Transporte público

Transporte público Población

Prevencion del COVID-19

Para evitar el contagio puedes realizar las siguientes medidas:

  • Lavar manos usando jabón durante 20 segundos como minimo.

  • No tocarse los ojos, nariza o boca si tus manos no están limpias

  • Cubrir nariz y boca con el brazo o usar un pañuelo desechable al momento de estornudar o toser. Dbes tirar al la basura en una bolsa el pañuelo.

  • Mantener distancia entre las demas Personas

Palabras Clave

  • (MERS) es una enfermedad respiratoria contagiosa que puede ser fatal. Suele propagarse mediante el contacto directo con una persona infectada. Los síntomas incluyen fiebre, tos y dificultad para respirar. Otros síntomas son las náuseas, los vómitos y la diarrea. El tratamiento incluye reposo, ingesta de líquidos, analgésicos y, en casos severos, oxigenoterapia.

  • SARS El síndrome agudo respiratorio severo (SARS) es una neumonía muy grave, causada por un nuevo virus de la familia de los coronavirus. La enfermedad se extendió en 2003 a varios países del sudeste asiático, Europa y América del Norte y ha provocado alarma mundial debido al número de afectados y a que no se dispone de tratamiento ni vacuna aprobada.

III. OBJETIVO

El objetivo de nuestro estudio se basa en un análisis acerca de la variación de los picos de contagio en una serie de tiempo para así determinar su comportamiento y conocer mejor su conducta.

IV. METODOLOGÍA

Estadística Descriptiva

La estadística descriptiva es una disciplina que se encarga de recoger, almacenar, ordenar, realizar tablas o gráficos y calcular parámetros básicos sobre el conjunto de datos. # V. Resultados

Importamos los datos

De los siguientes enlaces puedes usar los datos, para realizar la comprobacion sobre este este analisis, o bien en la parte inicial al lado derecho se encuentra el Archivo .Rmd.

library(pacman) #para importar la biblioteca "pacman"
p_load("base64enc", "htmltools", "mime", "xfun", "prettydoc","readr", "knitr","DT","dplyr", "ggplot2","plotly", "gganimate","gifski","scales","ggdark","xts")
#se realiza la declaración de las variables que contendrán las url en donde se encuentran los datos crudos de confirmados, decesos, recuperados
url_conf <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
url_decesos <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv"
url_recuperados <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv"
#Leer los archivos .csv de las url 
datos_conf <- read.csv(url_conf)
datos_decesos <- read.csv(url_decesos)
datos_recuperados <- read.csv(url_recuperados)
#definir variables 
conf_mex <- t(datos_conf[datos_conf$Country.Region=="Mexico" ,])
dec_mex  <- t(datos_decesos[datos_decesos$Country.Region=="Mexico" ,])
rec_mex  <- t(datos_recuperados[datos_recuperados$Country.Region=="Mexico" ,])
#casos <- read.csv("docs/Casos_Diarios_Estado_Nacional_Confirmados_20211014.csv")
Fecha <- seq(from = as.Date("2020-01-22"), to = as.Date("2021-10-16"), by = "day"   )
#casos confirmados 
vec1 <- as.vector(conf_mex)
vec2 <- vec1[5:638]
num1 <- as.numeric(vec2)
Confirmados <- as.vector(num1)
#decesos 
vec1 <- as.vector(dec_mex)
vec2 <- vec1[5:638]
num1 <- as.numeric(vec2)
Decesos <- as.vector(num1)
#recuperados
vec1 <- as.vector(rec_mex)
vec2 <- vec1[5:638]
num1 <- as.numeric(vec2)
Recuperados <- as.vector(num1)
#generación de un marco de datos (data frame)
datos1 <- data.frame(Fecha, Confirmados, Decesos, Recuperados)

Series de tiempo

Por serie de tiempo nos referimos a datos estadísticos que se recopilan, observan o registran en intervalos de tiempo regulares (diario, semanal, semestral, anual, entre otros). El termino se aplica a datos que se registran de forma periodica que en este caso muestran diariamente y mensualmente en los siguientes graficos.

Graficos

  • !!Advertencia!!, Toma en cuenta que al elegir la vista por día son demasiados datos

Por mes

ggplotly(gcov, width = 850)

Por dia

ggplotly(gcov, width = 1000,dynamicTicks = )

Grafica Animada

# Sequencia por meses para escalar grafico.
gcov <- ggplot(data = datos1) +
  geom_line(aes(Fecha, Confirmados, colour="Confirmados")) + 
  geom_line(aes(Fecha, Decesos, colour="Decesos")) +
  geom_line(aes(Fecha, Recuperados, colour="Recuperados")) + 
 
   geom_point(aes(Fecha,Confirmados, colour="Confirmados")) + 
 geom_point(aes(Fecha,Decesos, colour="Decesos")) + 
  geom_point(aes(Fecha,Recuperados, colour="Recuperados")) +
  
  geom_text(aes(x = min(Fecha), y = min(Confirmados), label = as.factor(Fecha)) , hjust=-2, vjust = -0.2, alpha = 0.2,  col = "gray", size = 20) +
  
  xlab("Fecha") +
  
  ylab("COVID-19 en México") +
  
  labs(colour="Casos")+
  
  ggtitle("Casos de COVID-19 en México (Fuente: JHU CSSE)") +
  
  scale_y_continuous(labels = comma) +
  
  scale_x_continuous(breaks = scala) +
  
  theme(axis.text.x = element_text(angle = 65, hjust = 1)) +
  transition_reveal(Fecha) +
  view_follow() +
  ease_aes('linear') 
 
animate(gcov,nframes= 500, duration=40)

Descomposición

  • Filtramos los datos de acuerdo al ultimo dia del mes
datosFiltrados <-  datos1 %>%
filter( Fecha == as.Date("2020-01-31") |
        Fecha == as.Date("2020-02-28") |
        Fecha == as.Date("2020-03-31") |
        Fecha == as.Date("2020-04-30") |
        Fecha == as.Date("2020-05-31") |
        Fecha == as.Date("2020-06-30") |
        Fecha == as.Date("2020-07-31") |
        Fecha == as.Date("2020-08-30") |
        Fecha == as.Date("2020-09-30") |
        Fecha == as.Date("2020-10-31") |
        Fecha == as.Date("2020-11-30") |
        Fecha == as.Date("2020-12-31") |
        Fecha == as.Date("2021-01-31") |
        Fecha == as.Date("2021-02-28") |
        Fecha == as.Date("2021-03-31") |
        Fecha == as.Date("2021-04-30") |
        Fecha == as.Date("2021-05-31") |
        Fecha == as.Date("2021-06-30") |
        Fecha == as.Date("2021-07-31") |
        Fecha == as.Date("2021-08-30") |
        Fecha == as.Date("2021-09-30") |
        Fecha == as.Date("2021-10-31") |
        Fecha == as.Date("2021-11-30") |
        Fecha == as.Date("2021-12-31")   )
  
  
 
  Confirmados.ts<-ts(datosFiltrados$Confirmados, start= as.Date("2020-01-22"), freq=12)
  Decesos.ts<-ts(datosFiltrados$Decesos, start= as.Date("2020-01-22"), freq=12)
  Recuperados.ts<-ts(datosFiltrados$Recuperados, start= as.Date("2020-01-22"), freq=12)

Decomposicion Es el proceso de identificar y calcular las diversas componentes existentes en una serie así como la forma en que estas se relacionan entre sí. Se adecua cuando se obtienen 2 o mas periodos de 12 meses para poder identificar la tendecia.

  • Graficos de Caja y Bigote
boxplot(Confirmados.ts ~ cycle(Confirmados.ts))

boxplot(Recuperados.ts ~ cycle(Recuperados.ts))

boxplot( Decesos.ts ~ cycle(Decesos.ts))

Se muestra graficamente lo explicado anteriormente sobre los periodos, en este caso no se completan 2 periodos (2 anios) para realizar la descomposicion y comprobamos con los graficos de caja y bigote. A simple vista se observa que no se culminan los Meses de: Octubre, Noviembre, y Diciembre.

  • Eliminacion de Tendencia
x <- log(Confirmados.ts)
Confirmados.diff <- diff(x)
x <- log(Recuperados.ts)
Recuperados.diff <- diff(x)
x <- log(Decesos.ts)
Decesos.diff <- diff(x)
data <- data.frame(Recuperados.diff, Confirmados.diff,Decesos.diff,scala[1:20])
data
##    Recuperados.diff Confirmados.diff Decesos.diff scala.1.20.
## 1               NaN              Inf          NaN  2020-01-22
## 2               Inf       7.10249936          Inf  2020-02-22
## 3        5.78803608       2.76141542   4.16049816  2020-03-22
## 4        1.71968536       1.55100087   1.67552177  2020-04-22
## 5        1.00682826       0.91376836   1.02835981  2020-05-22
## 6        0.62816931       0.63030596   0.51956688  2020-06-22
## 7        0.40353018       0.33873917   0.31786162  2020-07-22
## 8        0.24870935       0.22101286   0.19081124  2020-08-22
## 9        0.21593587       0.21876594   0.16694015  2020-09-22
## 10       0.05518079       0.18554945   0.14377271  2020-10-22
## 11       0.26621725       0.24739241   0.17187609  2020-11-22
## 12       0.27315548       0.26792495   0.23123271  2020-12-22
## 13       0.14568437       0.11283373   0.15823154  2021-01-22
## 14       0.08183633       0.07028095   0.09002669  2021-02-22
## 15       0.05040881       0.04620205   0.06522876  2021-03-22
## 16       0.03351045       0.02899732   0.03024693  2021-04-22
## 17       0.03668676       0.04279054   0.04152453  2021-05-22
## 18       0.10223928       0.12273669   0.03316667  2021-06-22
## 19             -Inf       0.15964371   0.07045406  2021-07-22
## 20              NaN       0.09226713   0.07098528  2021-08-22
conf <- ggplot(data) +
  geom_line(aes(scala[1:20] ,data$`Confirmados.diff`, colour="Confirmados" ))+
  geom_point(aes(scala[1:20] ,data$`Confirmados.diff`, colour="Confirmados" ))
 Rec<- ggplot(data) +
  geom_line(aes(scala[1:20] ,data$`Recuperados.diff`, colour="Recuperados"))+
  geom_point(aes(scala[1:20] ,data$`Recuperados.diff`, colour="Recuperados")) 
    
 Dec <-   ggplot(data) +
     geom_line(aes(scala[1:20] ,data$`Decesos.diff`, colour="Decesos"))+
  geom_point(aes(scala[1:20] ,data$`Decesos.diff`, colour="Decesos")) 
conf
## Don't know how to automatically pick scale for object of type ts. Defaulting to continuous.

Rec
## Don't know how to automatically pick scale for object of type ts. Defaulting to continuous.

Dec
## Don't know how to automatically pick scale for object of type ts. Defaulting to continuous.

Referencias

Encyclopedia Britannica. (s. f.). coronavirus | Definition, Features, & Examples. Recuperado 17 de octubre de 2021, de https://www.britannica.com/science/coronavirus-virus-group#ref1277304

Toche, N. (2021, 28 junio). Urge el rescate del transporte público tras los impactos de la pandemia. El Economista. Recuperado 17 de octubre de 2021, de https://www.eleconomista.com.mx/arteseideas/Urge-el-rescate-del-transporte-publico-traslos-impactos-de-la-pandemia-20210627-0075.html

WHO. (s. f.). Orientaciones para el público. World Health Organization. Recuperado 17 de octubre de 2021, de https://www.who.int/es/emergencies/diseases/novel-coronavirus-2019/advice-for-public

Suárez Lastra, M. (2017, 1 junio). En México 80% de los traslados se hacen en transporte público. Boletín UNAM-DGCS. Recuperado 17 de octubre de 2021, de https://www.dgcs.unam.mx/boletin/bdboletin/2017_384.html

Enfermedades Cardiovasculares, principal causa de muerte entre los mexicanos. (s. f.). Asociación Ale. Recuperado 17 de octubre de 2021, de https://asociacionale.org.mx/enfermedades-cardiovasculares-principal-causa-de-muerte-e ntre-los-mexicanos/

Cronología de la pandemia en México. (2021, 2 marzo). El Economista. Recuperado 17 de octubre de 2021, de https://www.eleconomista.com.mx/politica/Cronologia-de-la-pandemia-en-Mexico-2021030 1-0045.html

LS0tDQp0aXRsZTogIkFFM1VDMV8xMSINCmF1dGhvcjogIiogSm9zZSBOdW5leiwgKiBNYXJpbyBBbGVqYW5kcm8gU2FsY2VkbywqIFZpY3RvciBNYW51ZWwiDQpkYXRlOiAiMTUvMTAvMjAyMSINCm91dHB1dDogDQogIHJtZGZvcm1hdHM6OmRvd25jdXRlOg0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICANCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFKQ0KYGBgDQoNCg0KDQojIEkuIF9fX0ludHJvZHVjY2lvbl9fXw0KDQpFbCBjb3JvbmF2aXJ1cyBlcyB1bmEgZmFtaWxpYSBkZSB2aXJ1cyBxdWUgY2F1c2EgZW5mZXJtZWRhZGVzIGRlc2RlIHVuIHJlc2ZyaWFkbyBjb23Dum4NCmhhc3RhIGVuZmVybWVkYWRlcyBzZXZlcmFzIHF1ZSByZXF1aWVyZW4gbWF5b3IgYXRlbmNpw7NuIGNsw61uaWNhIHNpbWlsYXJlcyBhIGxhcw0Kb2JzZXJ2YWRhcyBlbiBlbCBzw61uZHJvbWUgcmVzcGlyYXRvcmlvIHBvciBjb3JvbmF2aXJ1cyBkZSBNZWRpbyBPcmllbnRlIChNRVJTKSB5IGVsDQpTw61uZHJvbWUgcmVzcGlyYXRvcmlvIGFndWRvIGdyYXZlIChTQVJTKS4NCltDb3JvbmF2aXJ1c10oaHR0cHM6Ly93d3cuYnJpdGFubmljYS5jb20vc2NpZW5jZS9jb3JvbmF2aXJ1cy12aXJ1cy1ncm91cCNyZWYxMjc3MzA0KQ0KDQohW10oaHR0cHM6Ly93d3cuaXNnbG9iYWwub3JnL2RvY3VtZW50cy8xMDE3OS83NzU5MDI3L0Nvcm9uYXZpcnVzK1NBUlMtQ29WLTIrZGUrQ0RDK2VuK1Vuc3BsYXNoLzZlNWU3NjMzLTRlZDktNDg0Yi1hOTVmLTM0MTk1ZTU1ZTE0Mj90PTE1ODQ1MzQwNjEwMDApDQoNCg0KDQojIElJLiBfX19BbnRlY2VkZW50ZXNfX18NCg0KQ29yb25hdmlydXMgU0FSUy1DT1YtMiwgZXMgdW4gdmlydXMgcXVlIGFwYXJlY2nDsyBwb3IgcHJpbWVyYSB2ZXogZW4gQ2hpbmEgZW4NCm5vdmllbWJyZSBkZSAyMDE5IHkgcHJvdm9jYSB1bmEgZW5mZXJtZWRhZCBsbGFtYWRhIENPVklELTE5LCBxdWUgc2UgZXh0ZW5kacOzIHBvciBlbA0KbXVuZG8geSBmdWUgZGVjbGFyYWRhIHBhbmRlbWlhIGdsb2JhbCBwb3IgbGEgT3JnYW5pemFjacOzbiBNdW5kaWFsIGRlIGxhIFNhbHVkLg0KRXN0YSBlbmZlcm1lZGFkIGFmZWN0YSBwcmluY2lwYWxtZW50ZSBhIGxvcyBzaWd1aWVudGVzIGdydXBvcyBwb2JsYWNpb25hbGVzOg0KDQoqIFBlcnNvbmFzIGRlIGxhIHRlcmNlcmEgZWRhZC4NCiogUGVyc29uYXMgY29uIHNvYnJlcGVzbyB1IG9iZXNpZGFkLg0KKiBQZXJzb25hcyBjb24gZW5mZXJtZWRhZGVzIGNyw7NuaWNhcyBjb21vOiBjw6FuY2VyLCBkaWFiZXRlcywgZSBoaXBlcnRlbnNpw7NuLg0KKiBNdWplcmVzIGNvbiBlbWJhcmF6by4NCg0KTGEgT3JnYW5pemFjacOzbiBNdW5kaWFsIGRlIGxhIFNhbHVkIHJlY29taWVuZGEgY29tbyBtZWRpZGFzIHBhcmEgbGEgcmVkdWNjacOzbiBkZQ0KY29udGFnaW9zOg0KKiBFdml0YXIgbHVnYXJlcyBhZ2xvbWVyYWRvcyAodHJhbnNwb3J0ZSBww7pibGljbywgY2VudHJvcyBkZQ0KY29udmVuY2lvbmVzL2RlcG9ydGl2b3MsIHN1cGVybWVyY2Fkb3MsIGV0YykuDQoqIE1hbnRlbmVyIG1lZGlkYXMgc2FuaXRhcmlhcyAobGF2YWRvIGRlIG1hbm9zLCB1c28gZGUgY3VicmVib2NhcywgZXZpdGFyIGVsDQpjb250YWN0byBjb24gcGVyc29uYXMgY29udGFnaWFkYXMsIGV0YykuDQoNCltXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9dKGh0dHBzOi8vd3d3Lndoby5pbnQvZXMvZW1lcmdlbmNpZXMvZGlzZWFzZXMvbm92ZWwtY29yb25hdmlydXMtMjAxOS9hZHZpY2UtZm9yLXB1YmxpYykNCg0KRWwgcGVyaW9kbyBkZSBwYW5kZW1pYSBhIG5pdmVsIGZlZGVyYWwgZW4gTcOpeGljbyBkaW8gY29taWVuem8gY29uIGxhIGpvcm5hZGEgZGUg4oCcU2FuYQ0KRGlzdGFuY2lh4oCdIGVsIDIzIGRlIG1hcnpvLCBjb21vIHB1bnRvIGRlIGNvbXBhcmFjacOzbiBsYSBPcmdhbml6YWNpw7NuIE11bmRpYWwgZGUgbGENClNhbHVkIGRlY2xhcsOzIGVsIGJyb3RlIHVuYSBlbWVyZ2VuY2lhIGRlIHNhbHVkIHDDumJsaWNhIGRlIGltcG9ydGFuY2lhIGludGVybmFjaW9uYWwgZWwgMzANCmRlIGVuZXJvIGRlIDIwMjAgeSB1bmEgcGFuZGVtaWEgZWwgMTEgZGUgbWFyem8gZGUgMjAyMC4NCg0KW0Nyb25vbG9nw61hIGRlIGxhIHBhbmRlbWlhIGVuIE3DqXhpY29dKGh0dHBzOi8vd3d3LmVsZWNvbm9taXN0YS5jb20ubXgvcG9saXRpY2EvQ3Jvbm9sb2dpYS1kZS1sYS1wYW5kZW1pYS1lbi1NZXhpY28yMDIxMDMwMS0wMDQ1Lmh0bWwpDQoqIEVuIE3DqXhpY28gcmVzaWRlbiAxNS40IG1pbGxvbmVzIGRlIHBlcnNvbmFzIGRlIDYwIGHDsW9zIG8gbcOhcyB5IGVsIDY5LjQlDQpwcmVzZW50YW4gYWxnw7puIHRpcG8gZGUgZGlzY2FwYWNpZGFkLg0KKiBNw6l4aWNvIG9jdXBhIGVsIHNlZ3VuZG8gbHVnYXIgZGUgcHJldmFsZW5jaWEgbXVuZGlhbCBkZSBvYmVzaWRhZCBlbiBsYQ0KcG9ibGFjacOzbiBhZHVsdGE7IERlIGxhIHBvYmxhY2nDs24gZGUgNSBhIDExIGHDsW9zLCAxOCUgdGllbmUgc29icmVwZXNvIHkgdmEgZW4NCmluY3JlbWVudG8gY29uZm9ybWUgYXVtZW50YSBsYSBlZGFkOyAyMSUgZGUgbG9zIGhvbWJyZXMgZGUgMTIgYSAxOSBhw7FvcyB5DQoyNyUgZGUgbGFzIG11amVyZXMgZGUgbGEgbWlzbWEgZWRhZCwgcHJlc2VudGFuIHNvYnJlcGVzby4gRW4gbGEgcG9ibGFjacOzbiBkZQ0KMjAgYcOxb3MgbyBtw6FzLCBsb3MgaG9tYnJlcyAoNDIlKSByZXBvcnRhbiB1bmEgcHJldmFsZW5jaWEgbcOhcyBhbHRhIHF1ZSBsYXMNCm11amVyZXMgKDM3JSkuDQoqIFNlIGVzdGltYSBxdWUgZWwgNzAuMyUgZGUgbGEgcG9ibGFjacOzbiBhZHVsdGEgZW4gTcOpeGljbyB2aXZlIGNvbiBhbCBtZW5vcyB1bg0KZmFjdG9yIGRlIHJpZXNnbyBjYXJkaW92YXNjdWxhci4NCg0KW09iZXNpZGFkIGVuIE3DqXhpY29dKGh0dHBzOi8vd3d3LmluZWdpLm9yZy5teC9jb250ZW5pZG9zL3NhbGFkZXByZW5zYS9hcHJvcG9zaXRvLzIwMjAvRUFQX09iZXNpZGFkMjAucGRmKQ0KW1JpZXNnbyBjYXJkaW92YXNjdWxhciBlbiBNw6l4aWNvXShodHRwczovL2Fzb2NpYWNpb25hbGUub3JnLm14L2VuZmVybWVkYWRlcy1jYXJkaW92YXNjdWxhcmVzLXByaW5jaXBhbC1jYXVzYS1kZW11ZXJ0ZS1lbnRyZS1sb3MtbWV4aWNhbm9zLykNCg0KIyMgX19GYWN0b3JlcyBhIGNvbnNpZGVyYXJfXw0KRW4gTcOpeGljbyBlbCA4MCUgZGUgbGEgcG9ibGFjacOzbiB1dGlsaXphYmEgZGUgbWFuZXJhIGZyZWN1ZW50ZSBjw7NtbyBtw6l0b2RvIGRlDQp0cmFuc3BvcnRlIGVsIHNpc3RlbWEgcMO6YmxpY28sIGNlcmNhIGRlbCA0MCUgbG8gdXRpbGl6YSBjb21vIMO6bmljbyBtw6l0b2RvIGRlIHRyYW5zcG9ydGUsDQplc3RlIG7Dum1lcm8gYmFqw7MgZGUgZm9ybWEgc2lnbmlmaWNhdGl2YSBjb24gZWwgaW5pY2lvIGRlIGxhIHBhbmRlbWlhLg0KTGEgZGVuc2lkYWQgcG9ibGFjaW9uYWwgZW4gTcOpeGljbyB2YXLDrWEgZGUgZ3JhbiBtYW5lcmEgZGUgZXN0YWRvIGEgZXN0YWRvLCBwb3IgZWplbXBsbw0KbGEgZGVuc2lkYWQgZGUgcG9ibGFjacOzbiBlcyBkZSA2MTYzLjMgaGFiaXRhbnRlcyBwb3Iga2lsw7NtZXRybyBjdWFkcmFkbyBlbiBsYSBjYXBpdGFsIGRlbA0KcGHDrXMsIHkgY29udHJhc3RhIGNvbiBsYSBtZWRpYSBuYWNpb25hbCBkZSA2NC4zIGhhYml0YW50ZXMgcG9yIGtpbMOzbWV0cm8gY3VhZHJhZG8uDQoNCltUcmFuc3BvcnRlIHDDumJsaWNvXShodHRwczovL3d3dy5lbGVjb25vbWlzdGEuY29tLm14L2FydGVzZWlkZWFzL1VyZ2UtZWwtcmVzY2F0ZS1kZWwtdHJhbnNwb3J0ZS1wdWJsaWNvLXRyYXMtbG9zLWltcGFjdG9zLWRlLWxhLXBhbmRlbWlhLTIwMjEwNjI3LTAwNzUuaHRtbCkNCg0KW1RyYW5zcG9ydGUgcMO6YmxpY29dKGh0dHBzOi8vd3d3LmRnY3MudW5hbS5teC9ib2xldGluL2JkYm9sZXRpbi8yMDE3XzM4NC5odG1sKQ0KW1BvYmxhY2nDs25dKGh0dHBzOi8vd3d3LmluZWdpLm9yZy5teC9jb250ZW5pZG9zL3NhbGFkZXByZW5zYS9ib2xldGluZXMvMjAyMS9Fc3RTb2Npb2RlDQptby9SZXN1bHRDZW5zbzIwMjBfQ2RNeC5wZGYpDQoNCg0KDQoNCg0KIyMgX19fUHJldmVuY2lvbiBkZWwgQ09WSUQtMTlfX18NCg0KUGFyYSBldml0YXIgZWwgY29udGFnaW8gcHVlZGVzIHJlYWxpemFyIGxhcyBzaWd1aWVudGVzIG1lZGlkYXM6DQoNCiogTGF2YXIgbWFub3MgdXNhbmRvIGphYsOzbiBkdXJhbnRlIDIwIHNlZ3VuZG9zIGNvbW8gbWluaW1vLg0KDQoqIE5vIHRvY2Fyc2UgbG9zIG9qb3MsIG5hcml6YSBvIGJvY2Egc2kgdHVzIG1hbm9zIG5vIGVzdMOhbiBsaW1waWFzDQoNCiogQ3VicmlyIG5hcml6IHkgYm9jYSBjb24gZWwgYnJhem8gbyB1c2FyIHVuIHBhw7F1ZWxvIGRlc2VjaGFibGUgYWwgbW9tZW50byBkZSBlc3Rvcm51ZGFyIG8gdG9zZXIuIERiZXMgdGlyYXIgYWwgbGEgYmFzdXJhIGVuIHVuYSBib2xzYSBlbCBwYcOxdWVsby4NCg0KKiBNYW50ZW5lciBkaXN0YW5jaWEgZW50cmUgbGFzIGRlbWFzIFBlcnNvbmFzIA0KDQoNCg0KDQojIyAgUGFsYWJyYXMgQ2xhdmUNCg0KDQoqICoqKE1FUlMpKiogIGVzIHVuYSBlbmZlcm1lZGFkIHJlc3BpcmF0b3JpYSBjb250YWdpb3NhIHF1ZSBwdWVkZSBzZXIgZmF0YWwuIFN1ZWxlIHByb3BhZ2Fyc2UgbWVkaWFudGUgZWwgY29udGFjdG8gZGlyZWN0byBjb24gdW5hIHBlcnNvbmEgaW5mZWN0YWRhLg0KTG9zIHPDrW50b21hcyBpbmNsdXllbiBmaWVicmUsIHRvcyB5IGRpZmljdWx0YWQgcGFyYSByZXNwaXJhci4gT3Ryb3Mgc8OtbnRvbWFzIHNvbiBsYXMgbsOhdXNlYXMsIGxvcyB2w7NtaXRvcyB5IGxhIGRpYXJyZWEuDQpFbCB0cmF0YW1pZW50byBpbmNsdXllIHJlcG9zbywgaW5nZXN0YSBkZSBsw61xdWlkb3MsIGFuYWxnw6lzaWNvcyB5LCBlbiBjYXNvcyBzZXZlcm9zLCBveGlnZW5vdGVyYXBpYS4NCg0KDQoNCiogKipTQVJTKiogRWwgc8OtbmRyb21lIGFndWRvIHJlc3BpcmF0b3JpbyBzZXZlcm8gKFNBUlMpIGVzIHVuYSBuZXVtb27DrWEgbXV5IGdyYXZlLCBjYXVzYWRhIHBvciB1biBudWV2byB2aXJ1cyBkZSBsYSBmYW1pbGlhIGRlIGxvcyBjb3JvbmF2aXJ1cy4gTGEgZW5mZXJtZWRhZCBzZSBleHRlbmRpw7MgZW4gMjAwMyBhIHZhcmlvcyBwYcOtc2VzIGRlbCBzdWRlc3RlIGFzacOhdGljbywgRXVyb3BhIHkgQW3DqXJpY2EgZGVsIE5vcnRlIHkgaGEgcHJvdm9jYWRvIGFsYXJtYSBtdW5kaWFsIGRlYmlkbyBhbCBuw7ptZXJvIGRlIGFmZWN0YWRvcyB5IGEgcXVlIG5vIHNlIGRpc3BvbmUgZGUgdHJhdGFtaWVudG8gbmkgdmFjdW5hIGFwcm9iYWRhLg0KDQojIElJSS4gX19PQkpFVElWT19fDQoNCkVsIG9iamV0aXZvIGRlIG51ZXN0cm8gZXN0dWRpbyBzZSBiYXNhIGVuIHVuIGFuw6FsaXNpcyBhY2VyY2EgZGUgbGEgdmFyaWFjacOzbg0KZGUgbG9zIHBpY29zIGRlIGNvbnRhZ2lvIGVuIHVuYSBzZXJpZSBkZSB0aWVtcG8gcGFyYSBhc8OtIGRldGVybWluYXIgc3UgY29tcG9ydGFtaWVudG8NCnkgY29ub2NlciBtZWpvciBzdSBjb25kdWN0YS4NCg0KDQojIElWLiBfX01FVE9ET0xPR8ONQV9fDQoNCkVzdGFkw61zdGljYSBEZXNjcmlwdGl2YQ0KDQo+IExhIGVzdGFkw61zdGljYSBkZXNjcmlwdGl2YSBlcyB1bmEgZGlzY2lwbGluYSBxdWUgc2UgZW5jYXJnYSBkZSByZWNvZ2VyLCANCmFsbWFjZW5hciwgb3JkZW5hciwgcmVhbGl6YXIgdGFibGFzIG8gZ3LDoWZpY29zIHkgY2FsY3VsYXIgcGFyw6FtZXRyb3MgYsOhc2ljb3MgDQpzb2JyZSBlbCBjb25qdW50byBkZSBkYXRvcy4NCiMgVi4gX19SZXN1bHRhZG9zX18NCg0KIyMgSW1wb3J0YW1vcyBsb3MgZGF0b3MgDQoNCkRlIGxvcyBzaWd1aWVudGVzIGVubGFjZXMgcHVlZGVzIHVzYXIgbG9zIGRhdG9zLCBwYXJhIHJlYWxpemFyIGxhIGNvbXByb2JhY2lvbiBzb2JyZSBlc3RlIGVzdGUgYW5hbGlzaXMsIG8gYmllbiBlbiBsYSBwYXJ0ZSBpbmljaWFsIGFsIGxhZG8gZGVyZWNobyBzZSBlbmN1ZW50cmEgZWwgQXJjaGl2byAuUm1kLg0KDQoqIFtDYXNvcyBDb25maXJtYWRvc10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5L21hc3Rlci9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X2NvbmZpcm1lZF9nbG9iYWwuY3N2KQ0KDQoqIFtSZWN1cGVyYWRvc10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5L21hc3Rlci9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X2RlYXRoc19nbG9iYWwuY3N2KQ0KDQoqIFtEZWNlc29zXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkvbWFzdGVyL2Nzc2VfY292aWRfMTlfZGF0YS9jc3NlX2NvdmlkXzE5X3RpbWVfc2VyaWVzL3RpbWVfc2VyaWVzX2NvdmlkMTlfcmVjb3ZlcmVkX2dsb2JhbC5jc3YpDQoNCmBgYHtyIGltcG9ydGFjaW9uIGRlIGxpYnJlcmlhc30NCmxpYnJhcnkocGFjbWFuKSAjcGFyYSBpbXBvcnRhciBsYSBiaWJsaW90ZWNhICJwYWNtYW4iDQpwX2xvYWQoImJhc2U2NGVuYyIsICJodG1sdG9vbHMiLCAibWltZSIsICJ4ZnVuIiwgInByZXR0eWRvYyIsInJlYWRyIiwgImtuaXRyIiwiRFQiLCJkcGx5ciIsICJnZ3Bsb3QyIiwicGxvdGx5IiwgImdnYW5pbWF0ZSIsImdpZnNraSIsInNjYWxlcyIsImdnZGFyayIsInh0cyIpDQpgYGANCg0KDQoNCg0KYGBge3IgfQ0KI3NlIHJlYWxpemEgbGEgZGVjbGFyYWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgcXVlIGNvbnRlbmRyw6FuIGxhcyB1cmwgZW4gZG9uZGUgc2UgZW5jdWVudHJhbiBsb3MgZGF0b3MgY3J1ZG9zIGRlIGNvbmZpcm1hZG9zLCBkZWNlc29zLCByZWN1cGVyYWRvcw0KdXJsX2NvbmYgPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS9tYXN0ZXIvY3NzZV9jb3ZpZF8xOV9kYXRhL2Nzc2VfY292aWRfMTlfdGltZV9zZXJpZXMvdGltZV9zZXJpZXNfY292aWQxOV9jb25maXJtZWRfZ2xvYmFsLmNzdiINCnVybF9kZWNlc29zIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkvbWFzdGVyL2Nzc2VfY292aWRfMTlfZGF0YS9jc3NlX2NvdmlkXzE5X3RpbWVfc2VyaWVzL3RpbWVfc2VyaWVzX2NvdmlkMTlfZGVhdGhzX2dsb2JhbC5jc3YiDQp1cmxfcmVjdXBlcmFkb3MgPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS9tYXN0ZXIvY3NzZV9jb3ZpZF8xOV9kYXRhL2Nzc2VfY292aWRfMTlfdGltZV9zZXJpZXMvdGltZV9zZXJpZXNfY292aWQxOV9yZWNvdmVyZWRfZ2xvYmFsLmNzdiINCiNMZWVyIGxvcyBhcmNoaXZvcyAuY3N2IGRlIGxhcyB1cmwgDQpkYXRvc19jb25mIDwtIHJlYWQuY3N2KHVybF9jb25mKQ0KZGF0b3NfZGVjZXNvcyA8LSByZWFkLmNzdih1cmxfZGVjZXNvcykNCmRhdG9zX3JlY3VwZXJhZG9zIDwtIHJlYWQuY3N2KHVybF9yZWN1cGVyYWRvcykNCiNkZWZpbmlyIHZhcmlhYmxlcyANCmNvbmZfbWV4IDwtIHQoZGF0b3NfY29uZltkYXRvc19jb25mJENvdW50cnkuUmVnaW9uPT0iTWV4aWNvIiAsXSkNCmRlY19tZXggIDwtIHQoZGF0b3NfZGVjZXNvc1tkYXRvc19kZWNlc29zJENvdW50cnkuUmVnaW9uPT0iTWV4aWNvIiAsXSkNCnJlY19tZXggIDwtIHQoZGF0b3NfcmVjdXBlcmFkb3NbZGF0b3NfcmVjdXBlcmFkb3MkQ291bnRyeS5SZWdpb249PSJNZXhpY28iICxdKQ0KI2Nhc29zIDwtIHJlYWQuY3N2KCJkb2NzL0Nhc29zX0RpYXJpb3NfRXN0YWRvX05hY2lvbmFsX0NvbmZpcm1hZG9zXzIwMjExMDE0LmNzdiIpDQpGZWNoYSA8LSBzZXEoZnJvbSA9IGFzLkRhdGUoIjIwMjAtMDEtMjIiKSwgdG8gPSBhcy5EYXRlKCIyMDIxLTEwLTE2IiksIGJ5ID0gImRheSIgICApDQpgYGANCg0KDQoNCmBgYHtyfQ0KI2Nhc29zIGNvbmZpcm1hZG9zIA0KdmVjMSA8LSBhcy52ZWN0b3IoY29uZl9tZXgpDQp2ZWMyIDwtIHZlYzFbNTo2MzhdDQpudW0xIDwtIGFzLm51bWVyaWModmVjMikNCkNvbmZpcm1hZG9zIDwtIGFzLnZlY3RvcihudW0xKQ0KI2RlY2Vzb3MgDQp2ZWMxIDwtIGFzLnZlY3RvcihkZWNfbWV4KQ0KdmVjMiA8LSB2ZWMxWzU6NjM4XQ0KbnVtMSA8LSBhcy5udW1lcmljKHZlYzIpDQpEZWNlc29zIDwtIGFzLnZlY3RvcihudW0xKQ0KI3JlY3VwZXJhZG9zDQp2ZWMxIDwtIGFzLnZlY3RvcihyZWNfbWV4KQ0KdmVjMiA8LSB2ZWMxWzU6NjM4XQ0KbnVtMSA8LSBhcy5udW1lcmljKHZlYzIpDQpSZWN1cGVyYWRvcyA8LSBhcy52ZWN0b3IobnVtMSkNCiNnZW5lcmFjacOzbiBkZSB1biBtYXJjbyBkZSBkYXRvcyAoZGF0YSBmcmFtZSkNCmRhdG9zMSA8LSBkYXRhLmZyYW1lKEZlY2hhLCBDb25maXJtYWRvcywgRGVjZXNvcywgUmVjdXBlcmFkb3MpDQpgYGANCg0KIyMgU2VyaWVzIGRlIHRpZW1wbw0KDQpQb3Igc2VyaWUgZGUgdGllbXBvIG5vcyByZWZlcmltb3MgYSBkYXRvcyBlc3RhZMOtc3RpY29zIHF1ZSBzZSByZWNvcGlsYW4sIG9ic2VydmFuIG8gcmVnaXN0cmFuDQplbiBpbnRlcnZhbG9zIGRlIHRpZW1wbyByZWd1bGFyZXMgKGRpYXJpbywgc2VtYW5hbCwgc2VtZXN0cmFsLCBhbnVhbCwgZW50cmUgb3Ryb3MpLiBFbCB0ZXJtaW5vIHNlIGFwbGljYSBhIGRhdG9zIHF1ZSBzZSByZWdpc3RyYW4gZGUgZm9ybWEgcGVyaW9kaWNhIHF1ZSBlbiBlc3RlIGNhc28gbXVlc3RyYW4gZGlhcmlhbWVudGUgeSBtZW5zdWFsbWVudGUgZW4gbG9zIHNpZ3VpZW50ZXMgZ3JhZmljb3MuDQoNCg0KIyMjIF9fR3JhZmljb3NfXyB7LnRhYnNldH0gDQoNCg0KDQoqICA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+KiohIUFkdmVydGVuY2lhISEsPC9zcGFuPiBUb21hIGVuIGN1ZW50YSBxdWUgYWwgZWxlZ2lyIGxhIHZpc3RhIHBvciBkw61hIHNvbiBkZW1hc2lhZG9zIGRhdG9zKioNCg0KDQoNCg0KIyMjIyBfX1BvciBtZXNfXw0KDQoNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojIFNlcXVlbmNpYSBwb3IgbWVzZXMgcGFyYSBlc2NhbGFyIGdyYWZpY28uDQpzY2FsYSA8LSBzZXEoZnJvbSA9IGFzLkRhdGUoIjIwMjAtMDEtMjIiKSwgdG8gPSBhcy5EYXRlKCIyMDIxLTEwLTE2IiksIGJ5ID0gIm1vbnRoIikNCmdjb3YgPC0gZ2dwbG90KGRhdGEgPSBkYXRvczEpICsNCiAgZ2VvbV9saW5lKGFlcyhGZWNoYSwgQ29uZmlybWFkb3MsIGNvbG91cj0iQ29uZmlybWFkb3MiKSkgKyANCiAgZ2VvbV9saW5lKGFlcyhGZWNoYSwgRGVjZXNvcywgY29sb3VyPSJEZWNlc29zIikpICsNCiAgZ2VvbV9saW5lKGFlcyhGZWNoYSwgUmVjdXBlcmFkb3MsIGNvbG91cj0iUmVjdXBlcmFkb3MiKSkgKyANCiAgDQogIHhsYWIoIkZlY2hhIikgKw0KICB5bGFiKCJDT1ZJRC0xOSBlbiBNw6l4aWNvIikgKw0KICBsYWJzKGNvbG91cj0iY2Fzb3MiKSsNCiAgZ2d0aXRsZSgiQ2Fzb3MgZGUgQ09WSUQtMTkgZW4gTcOpeGljbyAoRnVlbnRlOiBKSFUgQ1NTRSkiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0Kc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNjYWxhKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjUsIGhqdXN0ID0gMSkpIA0KZ2Nvdg0KYGBgDQoNCg0KYGBge3J9DQpnZ3Bsb3RseShnY292LCB3aWR0aCA9IDg1MCkNCmBgYA0KDQoNCiMjIyMgX19Qb3IgZGlhX18NCg0KYGBge3IgLCBpbmNsdWRlPUZBTFNFfQ0KZ2NvdiA8LSBnZ3Bsb3QoZGF0YSA9IGRhdG9zMSkgKw0KICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBDb25maXJtYWRvcywgY29sb3VyPSJDb25maXJtYWRvcyIpKSArIA0KICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBEZWNlc29zLCBjb2xvdXI9IkRlY2Vzb3MiKSkgKw0KICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBSZWN1cGVyYWRvcywgY29sb3VyPSJSZWN1cGVyYWRvcyIpKSArIA0KICANCiAgeGxhYigiRmVjaGEiKSArDQogIHlsYWIoIkNPVklELTE5IGVuIE3DqXhpY28iKSArDQogIGxhYnMoY29sb3VyPSJjYXNvcyIpKw0KICBnZ3RpdGxlKCJDYXNvcyBkZSBDT1ZJRC0xOSBlbiBNw6l4aWNvIChGdWVudGU6IEpIVSBDU1NFKSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gRmVjaGEpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxKSkgDQpnY292DQpgYGANCg0KYGBge3J9DQpnZ3Bsb3RseShnY292LCB3aWR0aCA9IDEwMDAsZHluYW1pY1RpY2tzID0gKQ0KYGBgDQoNCg0KDQojIyMjIF9fR3JhZmljYSBBbmltYWRhX18NCg0KYGBge3J9DQojIFNlcXVlbmNpYSBwb3IgbWVzZXMgcGFyYSBlc2NhbGFyIGdyYWZpY28uDQpnY292IDwtIGdncGxvdChkYXRhID0gZGF0b3MxKSArDQogIGdlb21fbGluZShhZXMoRmVjaGEsIENvbmZpcm1hZG9zLCBjb2xvdXI9IkNvbmZpcm1hZG9zIikpICsgDQogIGdlb21fbGluZShhZXMoRmVjaGEsIERlY2Vzb3MsIGNvbG91cj0iRGVjZXNvcyIpKSArDQogIGdlb21fbGluZShhZXMoRmVjaGEsIFJlY3VwZXJhZG9zLCBjb2xvdXI9IlJlY3VwZXJhZG9zIikpICsgDQogDQogICBnZW9tX3BvaW50KGFlcyhGZWNoYSxDb25maXJtYWRvcywgY29sb3VyPSJDb25maXJtYWRvcyIpKSArIA0KIGdlb21fcG9pbnQoYWVzKEZlY2hhLERlY2Vzb3MsIGNvbG91cj0iRGVjZXNvcyIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhGZWNoYSxSZWN1cGVyYWRvcywgY29sb3VyPSJSZWN1cGVyYWRvcyIpKSArDQogIA0KICBnZW9tX3RleHQoYWVzKHggPSBtaW4oRmVjaGEpLCB5ID0gbWluKENvbmZpcm1hZG9zKSwgbGFiZWwgPSBhcy5mYWN0b3IoRmVjaGEpKSAsIGhqdXN0PS0yLCB2anVzdCA9IC0wLjIsIGFscGhhID0gMC4yLCAgY29sID0gImdyYXkiLCBzaXplID0gMjApICsNCiAgDQogIHhsYWIoIkZlY2hhIikgKw0KICANCiAgeWxhYigiQ09WSUQtMTkgZW4gTcOpeGljbyIpICsNCiAgDQogIGxhYnMoY29sb3VyPSJDYXNvcyIpKw0KICANCiAgZ2d0aXRsZSgiQ2Fzb3MgZGUgQ09WSUQtMTkgZW4gTcOpeGljbyAoRnVlbnRlOiBKSFUgQ1NTRSkiKSArDQogIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsYSkgKw0KICANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxKSkgKw0KICB0cmFuc2l0aW9uX3JldmVhbChGZWNoYSkgKw0KICB2aWV3X2ZvbGxvdygpICsNCiAgZWFzZV9hZXMoJ2xpbmVhcicpIA0KIA0KYW5pbWF0ZShnY292LG5mcmFtZXM9IDUwMCwgZHVyYXRpb249NDApDQpgYGANCg0KIyMjIERlc2NvbXBvc2ljacOzbiANCg0KKiBGaWx0cmFtb3MgbG9zIGRhdG9zIGRlIGFjdWVyZG8gYWwgdWx0aW1vIGRpYSBkZWwgbWVzDQoNCmBgYHtyfQ0KZGF0b3NGaWx0cmFkb3MgPC0gIGRhdG9zMSAlPiUNCmZpbHRlciggRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0wMS0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0wMi0yOCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0wMy0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0wNC0zMCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0wNS0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0wNi0zMCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0wNy0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0wOC0zMCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0wOS0zMCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0xMC0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0xMS0zMCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMC0xMi0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0wMS0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0wMi0yOCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0wMy0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0wNC0zMCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0wNS0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0wNi0zMCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0wNy0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0wOC0zMCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0wOS0zMCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0xMC0zMSIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0xMS0zMCIpIHwNCiAgICAgICAgRmVjaGEgPT0gYXMuRGF0ZSgiMjAyMS0xMi0zMSIpICAgKQ0KICANCiAgDQogDQogIENvbmZpcm1hZG9zLnRzPC10cyhkYXRvc0ZpbHRyYWRvcyRDb25maXJtYWRvcywgc3RhcnQ9IGFzLkRhdGUoIjIwMjAtMDEtMjIiKSwgZnJlcT0xMikNCiAgRGVjZXNvcy50czwtdHMoZGF0b3NGaWx0cmFkb3MkRGVjZXNvcywgc3RhcnQ9IGFzLkRhdGUoIjIwMjAtMDEtMjIiKSwgZnJlcT0xMikNCiAgUmVjdXBlcmFkb3MudHM8LXRzKGRhdG9zRmlsdHJhZG9zJFJlY3VwZXJhZG9zLCBzdGFydD0gYXMuRGF0ZSgiMjAyMC0wMS0yMiIpLCBmcmVxPTEyKQ0KYGBgDQoNCg0KDQpfX0RlY29tcG9zaWNpb25fXyBFcyBlbCBwcm9jZXNvIGRlIGlkZW50aWZpY2FyIHkgY2FsY3VsYXIgbGFzIGRpdmVyc2FzIGNvbXBvbmVudGVzIGV4aXN0ZW50ZXMgZW4gdW5hIHNlcmllIGFzw60gY29tbyBsYSBmb3JtYSBlbiBxdWUgZXN0YXMgc2UgcmVsYWNpb25hbiBlbnRyZSBzw60uDQpTZSBhZGVjdWEgY3VhbmRvIHNlIG9idGllbmVuIDIgbyBtYXMgcGVyaW9kb3MgZGUgMTIgbWVzZXMgcGFyYSBwb2RlciBpZGVudGlmaWNhciBsYSB0ZW5kZWNpYS4NCg0KDQoNCiogR3JhZmljb3MgZGUgQ2FqYSB5IEJpZ290ZQ0KDQpgYGB7cn0NCmJveHBsb3QoQ29uZmlybWFkb3MudHMgfiBjeWNsZShDb25maXJtYWRvcy50cykpDQpgYGANCg0KYGBge3J9DQpib3hwbG90KFJlY3VwZXJhZG9zLnRzIH4gY3ljbGUoUmVjdXBlcmFkb3MudHMpKQ0KYGBgDQpgYGB7cn0NCmJveHBsb3QoIERlY2Vzb3MudHMgfiBjeWNsZShEZWNlc29zLnRzKSkNCmBgYA0KDQogU2UgbXVlc3RyYSBncmFmaWNhbWVudGUgbG8gZXhwbGljYWRvIGFudGVyaW9ybWVudGUgc29icmUgbG9zIHBlcmlvZG9zLCBlbiBlc3RlIGNhc28gbm8gc2UgY29tcGxldGFuIDIgcGVyaW9kb3MgXygyIGFuaW9zKV8gcGFyYSByZWFsaXphciBsYSBkZXNjb21wb3NpY2lvbiB5IGNvbXByb2JhbW9zIGNvbiBsb3MgZ3JhZmljb3MgZGUgY2FqYSB5IGJpZ290ZS4gQSBzaW1wbGUgdmlzdGEgc2Ugb2JzZXJ2YSBxdWUgbm8gc2UgY3VsbWluYW4gbG9zIE1lc2VzIGRlOiBPY3R1YnJlLCBOb3ZpZW1icmUsIHkgRGljaWVtYnJlLg0KDQoNCiogRWxpbWluYWNpb24gZGUgVGVuZGVuY2lhDQoNCmBgYHtyfQ0KeCA8LSBsb2coQ29uZmlybWFkb3MudHMpDQpDb25maXJtYWRvcy5kaWZmIDwtIGRpZmYoeCkNCnggPC0gbG9nKFJlY3VwZXJhZG9zLnRzKQ0KUmVjdXBlcmFkb3MuZGlmZiA8LSBkaWZmKHgpDQp4IDwtIGxvZyhEZWNlc29zLnRzKQ0KRGVjZXNvcy5kaWZmIDwtIGRpZmYoeCkNCmRhdGEgPC0gZGF0YS5mcmFtZShSZWN1cGVyYWRvcy5kaWZmLCBDb25maXJtYWRvcy5kaWZmLERlY2Vzb3MuZGlmZixzY2FsYVsxOjIwXSkNCmRhdGENCmNvbmYgPC0gZ2dwbG90KGRhdGEpICsNCiAgZ2VvbV9saW5lKGFlcyhzY2FsYVsxOjIwXSAsZGF0YSRgQ29uZmlybWFkb3MuZGlmZmAsIGNvbG91cj0iQ29uZmlybWFkb3MiICkpKw0KICBnZW9tX3BvaW50KGFlcyhzY2FsYVsxOjIwXSAsZGF0YSRgQ29uZmlybWFkb3MuZGlmZmAsIGNvbG91cj0iQ29uZmlybWFkb3MiICkpDQogUmVjPC0gZ2dwbG90KGRhdGEpICsNCiAgZ2VvbV9saW5lKGFlcyhzY2FsYVsxOjIwXSAsZGF0YSRgUmVjdXBlcmFkb3MuZGlmZmAsIGNvbG91cj0iUmVjdXBlcmFkb3MiKSkrDQogIGdlb21fcG9pbnQoYWVzKHNjYWxhWzE6MjBdICxkYXRhJGBSZWN1cGVyYWRvcy5kaWZmYCwgY29sb3VyPSJSZWN1cGVyYWRvcyIpKSANCiAgICANCiBEZWMgPC0gICBnZ3Bsb3QoZGF0YSkgKw0KICAgICBnZW9tX2xpbmUoYWVzKHNjYWxhWzE6MjBdICxkYXRhJGBEZWNlc29zLmRpZmZgLCBjb2xvdXI9IkRlY2Vzb3MiKSkrDQogIGdlb21fcG9pbnQoYWVzKHNjYWxhWzE6MjBdICxkYXRhJGBEZWNlc29zLmRpZmZgLCBjb2xvdXI9IkRlY2Vzb3MiKSkgDQogICAgIA0KICAgICANCiAgICAgDQogIA0KYGBgDQoNCmBgYHtyIH0NCmNvbmYNCmBgYA0KDQoNCmBgYHtyfQ0KUmVjDQpgYGANCg0KYGBge3J9DQpEZWMNCmBgYA0KDQoNCg0KDQoNCg0KIyBSZWZlcmVuY2lhcyANCg0KDQoNCkVuY3ljbG9wZWRpYSBCcml0YW5uaWNhLiAocy4gZi4pLiBjb3JvbmF2aXJ1cyB8IERlZmluaXRpb24sIEZlYXR1cmVzLCAmIEV4YW1wbGVzLg0KUmVjdXBlcmFkbyAxNyBkZSBvY3R1YnJlIGRlIDIwMjEsIGRlDQpodHRwczovL3d3dy5icml0YW5uaWNhLmNvbS9zY2llbmNlL2Nvcm9uYXZpcnVzLXZpcnVzLWdyb3VwI3JlZjEyNzczMDQNCg0KVG9jaGUsIE4uICgyMDIxLCAyOCBqdW5pbykuIFVyZ2UgZWwgcmVzY2F0ZSBkZWwgdHJhbnNwb3J0ZSBww7pibGljbyB0cmFzIGxvcyBpbXBhY3RvcyBkZSBsYQ0KcGFuZGVtaWEuIEVsIEVjb25vbWlzdGEuIFJlY3VwZXJhZG8gMTcgZGUgb2N0dWJyZSBkZSAyMDIxLCBkZQ0KaHR0cHM6Ly93d3cuZWxlY29ub21pc3RhLmNvbS5teC9hcnRlc2VpZGVhcy9VcmdlLWVsLXJlc2NhdGUtZGVsLXRyYW5zcG9ydGUtcHVibGljby10cmFzbG9zLWltcGFjdG9zLWRlLWxhLXBhbmRlbWlhLTIwMjEwNjI3LTAwNzUuaHRtbA0KDQpXSE8uIChzLiBmLikuIE9yaWVudGFjaW9uZXMgcGFyYSBlbCBww7pibGljby4gV29ybGQgSGVhbHRoIE9yZ2FuaXphdGlvbi4gUmVjdXBlcmFkbyAxNyBkZQ0Kb2N0dWJyZSBkZSAyMDIxLCBkZQ0KaHR0cHM6Ly93d3cud2hvLmludC9lcy9lbWVyZ2VuY2llcy9kaXNlYXNlcy9ub3ZlbC1jb3JvbmF2aXJ1cy0yMDE5L2FkdmljZS1mb3ItcHVibGljDQoNClN1w6FyZXogTGFzdHJhLCBNLiAoMjAxNywgMSBqdW5pbykuIEVuIE3DqXhpY28gODAlIGRlIGxvcyB0cmFzbGFkb3Mgc2UgaGFjZW4gZW4gdHJhbnNwb3J0ZQ0KcMO6YmxpY28uIEJvbGV0w61uIFVOQU0tREdDUy4gUmVjdXBlcmFkbyAxNyBkZSBvY3R1YnJlIGRlIDIwMjEsIGRlDQpodHRwczovL3d3dy5kZ2NzLnVuYW0ubXgvYm9sZXRpbi9iZGJvbGV0aW4vMjAxN18zODQuaHRtbA0KDQpFbmZlcm1lZGFkZXMgQ2FyZGlvdmFzY3VsYXJlcywgcHJpbmNpcGFsIGNhdXNhIGRlIG11ZXJ0ZSBlbnRyZSBsb3MgbWV4aWNhbm9zLiAocy4gZi4pLg0KQXNvY2lhY2nDs24gQWxlLiBSZWN1cGVyYWRvIDE3IGRlIG9jdHVicmUgZGUgMjAyMSwgZGUNCmh0dHBzOi8vYXNvY2lhY2lvbmFsZS5vcmcubXgvZW5mZXJtZWRhZGVzLWNhcmRpb3Zhc2N1bGFyZXMtcHJpbmNpcGFsLWNhdXNhLWRlLW11ZXJ0ZS1lDQpudHJlLWxvcy1tZXhpY2Fub3MvDQoNCkNyb25vbG9nw61hIGRlIGxhIHBhbmRlbWlhIGVuIE3DqXhpY28uICgyMDIxLCAyIG1hcnpvKS4gRWwgRWNvbm9taXN0YS4gUmVjdXBlcmFkbyAxNyBkZQ0Kb2N0dWJyZSBkZSAyMDIxLCBkZQ0KaHR0cHM6Ly93d3cuZWxlY29ub21pc3RhLmNvbS5teC9wb2xpdGljYS9Dcm9ub2xvZ2lhLWRlLWxhLXBhbmRlbWlhLWVuLU1leGljby0yMDIxMDMwDQoxLTAwNDUuaHRtbA==