AE1UC2_1

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

22/10/2021

Introdución

En el siguiente caso de estudio investigamos acerca de la movilidad urbana y su efecto sobre el aumento de contagios de COVID-19 y la calidad del aire. Si bien, el aislamiento preventivo ha mostrado ser una herramienta eficaz para la prevención y expansión del Covid-19. Hemos observado que a pesar de lograr mitigar la curva de contagios, esto a ocasionado el avance hacia la reapertura total de las actividades económicas, sociales y culturales, incrementando así la movilidad urbana que a su vez incrementa proporcional o inclusive exponencialmente el flujo de contagios por COVID-19 y afectando la calidad del aire por la reapertura de todas las actividades económicas En base a lo establecido anteriormente, durante esta nueva etapa donde no solamente debemos preocuparnos por el Covid-19 sino también por sus variantes, el desafío será poder llevar a cabo una reapertura eficiente, donde podamos actuar de manera sabia y no causar desequilibrios ambientales, económicos y sociales.

# install.packages("GGally")
# install.packages("corrplot")
# install.packages("PerformanceAnalytics")
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","gridExtra","corrplot","GGally","PerformanceAnalytics")

Antecedentes

  • Ozono (O3)

El ozono (O3) es un gas altamente reactivo compuesto por tres átomos de oxígeno. Es un producto tanto natural como artificial que se encuentra en la atmósfera superior de la Tierra.

El ozono a nivel del suelo proviene de la contaminación emitida por automóviles, plantas de energía, calderas industriales, refinerías y plantas químicas. La contaminación por ozono incluso puede provenir de pinturas, limpiadores, solventes y equipos de césped motorizados. Por esta razón, los niveles de ozono a nivel del suelo tienden a ser los más altos cerca de los centros urbanos en comparación con las áreas rurales.

Ozono

Ozono

  • Dióxido de azufre (SO3)

El Dióxido de azufre es un gas incoloro e irritante. No es un gas inflamable, ni explosivo y tiene mucha estabilidad, es muy soluble en agua y en contacto con ella se convierte en ácido sulfúrico. Consiste en un átomo de azufre y dos de oxígeno.

La principal fuente de emisión de dióxido de azufre a la atmósfera es la combustión de productos petrolíferos y la quema de carbón en centrales eléctricas y calefacciones centrales. Existen también algunas fuentes naturales, como es el caso de los volcanes.

Dióxido de azufre

  • PM10

Las PM10 se pueden definir como aquellas partículas sólidas o líquidas de polvo, cenizas, hollín, partículas metálicas, cemento o polen, dispersas en la atmósfera, y cuyo diámetro varía entre 2,5 y 10 µm (1 micrómetro corresponde la milésima parte de 1 milímetro). Están formadas principalmente por compuestos inorgánicos como silicatos y aluminatos, metales pesados entre otros, y material orgánico asociado a partículas de carbono, las principales fuentes de las PM10 son humo, sal marina, emisiones de motores de combustión interna y la industria.

PM10

¿Qué es la movilidad urbana?

La movilidad urbana se define como el conjunto de desplazamientos, tanto de personas como de mercancías, que se producen en una ciudad con el objetivo de recorrer la distancia que separa un lugar de otro. Se suele clasificar la movilidad urbana que utilizan un medio de transporte en transporte público y privado. La movilidad urbana es entonces un factor determinante tanto para la productividad económica del territorio como para la calidad de vida de sus ciudadanos y el acceso a servicios básicos de salud y educación.

¿Qué es la calidad del aire?

Se define la inmisión o calidad del aire como la concentración de contaminante que llega a un receptor, más o menos lejano de la fuente de emisión, una vez transportado y difundido por la atmósfera. La capacidad de la atmósfera para diluir las concentraciones de contaminantes es fundamental para preservar una buena calidad del aire, y esto va a venir marcado principalmente por las condiciones meteorológicas. Así, en una atmósfera estable, se propiciará la acumulación de contaminantes y se facilitará la formación de contaminantes secundarios, mientras que en una atmósfera inestable, la difusión de los contaminantes será más eficaz debido a las turbulencias.

¿En qué nos afecta el aumento de movilidad urbana?

Gracias al descenso y aumento de movilidad urbana durante la pandemia de Covid-19 pudimos observar gracias al ICA, índice de calidad del aire, las consecuencias que trae consigo y el impacto que se tiene. La Organización Panamericana de la Salud estima que cerca de 7 millones de personas en el mundo mueren a causa de la contaminación del aire. Además, la contaminación es uno de los 5 factores de riesgo para enfermedades no transmisibles y se asocia a enfermedades respiratorias y cardiovasculares, cáncer de pulmón, enfermedad pulmonar obstructiva crónica y episodios asmáticos.

Metodología

Análisis de 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 término serie de tiempo se aplica por ejemplo a datos registrados en forma periódica que muestran, por ejemplo, las ventas anuales totales de almacenes, el valor trimestral total de contratos de construcción otorgados, el valor trimestral del PIB.

Análisis de Correlación

El análisis de correlación intenta medir la fuerza de tales relaciones entre dos variables por medio de un solo número denominado coeficiente de correlación. El coeficiente de correlación de Pearson es una prueba que mide la relación estadística entre dos variables continuas. Si la asociación entre los elementos no es lineal, entonces el coeficiente no se encuentra representado adecuadamente.

El coeficiente de correlación puede tomar un rango de valores de +1 a -1. Un valor de 0 indica que no hay asociación entre las dos variables. Un valor mayor que 0 indica una asociación positiva. Es decir, a medida que aumenta el valor de una variable, también lo hace el valor de la otra. Un valor menor que 0 indica una asociación negativa; es decir, a medida que aumenta el valor de una variable, el valor de la otra disminuye.

Resultados

  • Importamos datos
xfun::embed_file('DatosMovcovid.csv');

Download DatosMovcovid.csv

DatosMov_covid <- read_csv("DatosMovcovid.csv")
## New names:
## * `` -> ...12
## * `` -> ...13
## * `` -> ...14
## * `` -> ...15
## * `` -> ...16
## * ...
## Rows: 447 Columns: 458
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr   (2): Fecha, SO2
## dbl   (7): Reactivacion_Comercial, Supermercado_Farmacia, Parques_Centros, E...
## lgl (447): ...12, ...13, ...14, ...15, ...16, ...17, ...18, ...19, ...20, .....
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
Fecha <- seq.Date(as.Date("2020-02-15") , to= as.Date("2021-05-06"),by = "day" )
scala_month <- seq.Date(as.Date("2020-02-15") , to= as.Date("2021-05-06"),by = "month" )
data_O3 <- as.vector(DatosMov_covid$O3)


vecSo2<- as.vector(DatosMov_covid$SO2)
filtroSO2 <- gsub(",", "", vecSo2)
data_SO2 <-as.double(filtroSO2)
data_PM10 <- as.vector(DatosMov_covid$PM10)
data_Comercial <- as.vector(DatosMov_covid$Reactivacion_Comercial)
data_Farmacia <- as.vector(DatosMov_covid$Supermercado_Farmacia)
data_Parques <- as.vector(DatosMov_covid$Parques_Centros)
data_Transito <- as.vector(DatosMov_covid$Estaciones_Transito)
data_Trabajo <- as.vector(DatosMov_covid$Lugares_Trabajo)
data_Residencia <- as.vector(DatosMov_covid$Residencia)
data_covid <- as.vector(DatosMov_covid$covid)


data1 <- data.frame(Fecha=Fecha,O3=data_O3,SO2=data_SO2,PM10=data_PM10,Reactivacion_Comercial=data_Comercial, Supermercado_Farmacia=data_Farmacia,Parques_Centros= data_Parques, Estaciones_Transito=data_Transito, Residencia =data_Residencia,Datos_Covid =data_covid)

Tabla Interactiva de Datos para este analisis

datatable(data1)
plot0 <- ggplot( data= data1) +
 
   geom_line(aes(Fecha, data_Comercial, colour="Reactivacion Comercial")) + 
   geom_line(aes(Fecha, data_Farmacia, colour="Supermercados Farmacia")) + 
   geom_line(aes(Fecha, data_Parques, colour="Parques Centros")) + 
   geom_line(aes(Fecha, data_Transito, colour="Estaciones Transito")) + 
   geom_line(aes(Fecha, data_Trabajo, colour="Lugares Trabajo")) +
   geom_line(aes(Fecha, data_Residencia, colour="Estaciones Residencia")) +
    geom_line(aes(Fecha, data_covid, colour="Covid")) + 
   
 

  
  xlab("Fecha") +
  ylab("COVID-19 en México") +
  scale_y_continuous(labels = comma) +
  theme(axis.text.x = element_text(angle = 65, hjust = 1)) 
plot1 <- ggplot( data= data1) +
  geom_line(aes(Fecha, data_O3, colour="O3")) + 
    geom_line(aes(Fecha, data_SO2, colour="SO2")) + 
   geom_line(aes(Fecha, data_PM10, colour="PM10")) + 
   geom_line(aes(Fecha, data_Comercial, colour="Reactivacion Comercial")) + 
   geom_line(aes(Fecha, data_Farmacia, colour="Supermercados Farmacia")) + 
   geom_line(aes(Fecha, data_Parques, colour="Parques Centros")) + 
   geom_line(aes(Fecha, data_Transito, colour="Estaciones Transito")) + 
   geom_line(aes(Fecha, data_Trabajo, colour="Lugares Trabajo")) +
   geom_line(aes(Fecha, data_Residencia, colour="Estaciones Residencia")) +
  geom_line(aes(Fecha, data_covid, colour="Covid")) + 
   
 

  
  xlab("Fecha") +
  ylab("Datos") +
  scale_y_continuous(labels = comma) +
  theme(axis.text.x = element_text(angle = 65, hjust = 1)) 
  • Recuerda puedes Seleccionar los datos que solo deseas ver para comparar
ggplotly(plot0, width = 1200)
#plot2 <-ggplotly(gcov, width = 850) 

# gcoc <- grid.arrange(plot1, plot2,plot3, nrow = 3)
# 
# ggplotly( width = 850)


ggplotly(plot1, width = 1200)
  • Emisiones y Reactivación económica

Se observa que con el inicio de la pandemia el nivel de emisiones bajo de forma considerable, esto es debido a la disminución de en el uso del transporte público y automóviles, la reducción del volumen industrial, el aumento en el precio de hidrocarburos y el aumento en el uso de métodos de transporte alternativos, tal como la bicicleta, a lo largo de la pandemia podemos observar que el nivel de emisiones se ha logrado recuperar de forma parcial, esto gracias al proceso de reactivación económica.

Bicicleta

Transporte público

  • Ciclo de la pandemia

Pese a la reactivación económica, no se ha observado una fuerte correlación entre esta y el aumento en casos de la pandemia, sin embargo se puede observar que en los puntos más álgidos la reactivación comercial sufre una caída significativa así como el uso de los parques, esto se le puede atribuir a medidas establecidas a nivel gubernamental, tales como cuarentena o limitar el acceso a áreas públicas.

Cronología de la pandemia en México

Matriz de Correlacion

datos2 <- select(data1,-Fecha)

d<- cor(datos2)

datatable(d)

Diagrama de Disperción.

chart.Correlation(datos2, histogram = TRUE, method = "pearson")

En este gráfico de disperción buscamos la relación que hay entre las variables, de acuerdo al coeficiente de correlación. Los valores de movilidad tienen fuerte relación entre sí ya sea de forma negativa, es decir que disminuyen o positiva que aumentan en base a \(X\) y \(Y\).Las variables qué tienen fuerte relación son reactivacion comercial y estaciones de tránsito con un valor de coeficiente \(0.94\) observamos como aumentan a la par. Para la relación negativa nuestras variables son Residencia y Reactivacion comercial con un valor de coeficiente \(−0.84\). Sin embargo al comparar con los datos de covid o gases la perspectiva es muy distinta.

  • ¿Qué variable de movilidad urbana aumenta más los casos de covid? Residencia.

  • ¿Qué variable de movilidad urbana aumenta o disminuye más los contaminantes? la variable de movilidad Resisdencia disminuye los contaminantes.

Referencias

LS0tDQp0aXRsZTogIkFFMVVDMl8xIg0KYXV0aG9yOiAiKiBKb3NlIE51bmV6LCAqIE1hcmlvIEFsZWphbmRybyBTYWxjZWRvLCogVmljdG9yIE1hbnVlbCINCmRhdGU6ICIyMi8xMC8yMDIxIg0Kb3V0cHV0OiANCiAgcm1kZm9ybWF0czo6ZG93bmN1dGU6DQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KIyBfX0ludHJvZHVjacOzbl9fDQoNCkVuIGVsIHNpZ3VpZW50ZSBjYXNvIGRlIGVzdHVkaW8gaW52ZXN0aWdhbW9zIGFjZXJjYSBkZSBsYSBtb3ZpbGlkYWQgdXJiYW5hIHkgc3UgZWZlY3RvIHNvYnJlIGVsIGF1bWVudG8gZGUgY29udGFnaW9zIGRlIENPVklELTE5IHkgbGEgY2FsaWRhZCBkZWwgYWlyZS4gU2kgYmllbiwgZWwgYWlzbGFtaWVudG8gcHJldmVudGl2byBoYSBtb3N0cmFkbyBzZXIgdW5hIGhlcnJhbWllbnRhIGVmaWNheiBwYXJhIGxhIHByZXZlbmNpw7NuIHkgZXhwYW5zacOzbiBkZWwgQ292aWQtMTkuIEhlbW9zIG9ic2VydmFkbyBxdWUgYSBwZXNhciBkZSBsb2dyYXIgbWl0aWdhciBsYSBjdXJ2YSBkZSBjb250YWdpb3MsIGVzdG8gYSBvY2FzaW9uYWRvIGVsIGF2YW5jZSBoYWNpYSBsYSByZWFwZXJ0dXJhIHRvdGFsIGRlIGxhcyBhY3RpdmlkYWRlcyBlY29uw7NtaWNhcywgc29jaWFsZXMgeSBjdWx0dXJhbGVzLCBpbmNyZW1lbnRhbmRvIGFzw60gbGEgbW92aWxpZGFkIHVyYmFuYSBxdWUgYSBzdSB2ZXogaW5jcmVtZW50YSBwcm9wb3JjaW9uYWwgbyBpbmNsdXNpdmUgZXhwb25lbmNpYWxtZW50ZSBlbCBmbHVqbyBkZSBjb250YWdpb3MgcG9yIENPVklELTE5IHkgYWZlY3RhbmRvIGxhIGNhbGlkYWQgZGVsIGFpcmUgcG9yIGxhIHJlYXBlcnR1cmEgZGUgdG9kYXMgbGFzIGFjdGl2aWRhZGVzIGVjb27Ds21pY2FzIEVuIGJhc2UgYSBsbyBlc3RhYmxlY2lkbyBhbnRlcmlvcm1lbnRlLCBkdXJhbnRlIGVzdGEgbnVldmEgZXRhcGEgZG9uZGUgbm8gc29sYW1lbnRlIGRlYmVtb3MgcHJlb2N1cGFybm9zIHBvciBlbCBDb3ZpZC0xOSBzaW5vIHRhbWJpw6luIHBvciBzdXMgdmFyaWFudGVzLCBlbCBkZXNhZsOtbyBzZXLDoSBwb2RlciBsbGV2YXIgYSBjYWJvIHVuYSByZWFwZXJ0dXJhIGVmaWNpZW50ZSwgZG9uZGUgcG9kYW1vcyBhY3R1YXIgZGUgbWFuZXJhIHNhYmlhIHkgbm8gY2F1c2FyIGRlc2VxdWlsaWJyaW9zIGFtYmllbnRhbGVzLCBlY29uw7NtaWNvcyB5IHNvY2lhbGVzLg0KDQoNCmBgYHtyIEluc3RhbGFyIHBhcXVldGVzfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJHR2FsbHkiKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJjb3JycGxvdCIpDQojIGluc3RhbGwucGFja2FnZXMoIlBlcmZvcm1hbmNlQW5hbHl0aWNzIikNCmBgYA0KDQoNCmBgYHtyIEltcG9ydGFjaW9uIGRlIExpYnJlcmlhc30NCmxpYnJhcnkocGFjbWFuKSAjcGFyYSBpbXBvcnRhciBsYSBiaWJsaW90ZWNhICJwYWNtYW4iDQpwX2xvYWQoImJhc2U2NGVuYyIsICJodG1sdG9vbHMiLCAibWltZSIsICJ4ZnVuIiwgInByZXR0eWRvYyIsInJlYWRyIiwgImtuaXRyIiwiRFQiLCJkcGx5ciIsICJnZ3Bsb3QyIiwicGxvdGx5IiwgImdnYW5pbWF0ZSIsImdpZnNraSIsInNjYWxlcyIsImdnZGFyayIsInh0cyIsImdyaWRFeHRyYSIsImNvcnJwbG90IiwiR0dhbGx5IiwiUGVyZm9ybWFuY2VBbmFseXRpY3MiKQ0KYGBgDQoNCg0KDQojIF9fQW50ZWNlZGVudGVzX18NCg0KKiBPem9ubyAoTzMpDQoNCkVsIG96b25vIChPMykgZXMgdW4gZ2FzIGFsdGFtZW50ZSByZWFjdGl2byBjb21wdWVzdG8gcG9yIHRyZXMgw6F0b21vcyBkZSBveMOtZ2Vuby4gRXMgdW4gcHJvZHVjdG8gdGFudG8gbmF0dXJhbCBjb21vIGFydGlmaWNpYWwgcXVlIHNlIGVuY3VlbnRyYSBlbiBsYSBhdG3Ds3NmZXJhIHN1cGVyaW9yIGRlIGxhIFRpZXJyYS4NCg0KRWwgb3pvbm8gYSBuaXZlbCBkZWwgc3VlbG8gcHJvdmllbmUgZGUgbGEgY29udGFtaW5hY2nDs24gZW1pdGlkYSBwb3IgYXV0b23Ds3ZpbGVzLCBwbGFudGFzIGRlIGVuZXJnw61hLCBjYWxkZXJhcyBpbmR1c3RyaWFsZXMsIHJlZmluZXLDrWFzIHkgcGxhbnRhcyBxdcOtbWljYXMuIExhIGNvbnRhbWluYWNpw7NuIHBvciBvem9ubyBpbmNsdXNvIHB1ZWRlIHByb3ZlbmlyIGRlIHBpbnR1cmFzLCBsaW1waWFkb3Jlcywgc29sdmVudGVzIHkgZXF1aXBvcyBkZSBjw6lzcGVkIG1vdG9yaXphZG9zLiBQb3IgZXN0YSByYXrDs24sIGxvcyBuaXZlbGVzIGRlIG96b25vIGEgbml2ZWwgZGVsIHN1ZWxvIHRpZW5kZW4gYSBzZXIgbG9zIG3DoXMgYWx0b3MgY2VyY2EgZGUgbG9zIGNlbnRyb3MgdXJiYW5vcyBlbiBjb21wYXJhY2nDs24gY29uIGxhcyDDoXJlYXMgcnVyYWxlcy4NCg0KW096b25vXShodHRwczovL3d3dy5lcGEuZ292L296b25lLXBvbGx1dGlvbi1hbmQteW91ci1wYXRpZW50cy1oZWFsdGgvd2hhdC1vem9uZSkNCg0KW096b25vXShodHRwOi8vd3d3LmF6ZGVxLmdvdi9ncm91bmQtbGV2ZWwtb3pvbmUtbzMtcG9sbHV0aW9uIzp+OnRleHQ9R3JvdW5kJTJEbGV2ZWwlMjBvem9uZSUyMCkNCg0KDQoqIERpw7N4aWRvIGRlIGF6dWZyZSAoU08zKQ0KDQpFbCBEacOzeGlkbyBkZSBhenVmcmUgZXMgdW4gZ2FzIGluY29sb3JvIGUgaXJyaXRhbnRlLiBObyBlcyB1biBnYXMgaW5mbGFtYWJsZSwgbmkgZXhwbG9zaXZvIHkgdGllbmUgbXVjaGEgZXN0YWJpbGlkYWQsIGVzIG11eSBzb2x1YmxlIGVuIGFndWEgeSBlbiBjb250YWN0byBjb24gZWxsYSBzZSBjb252aWVydGUgZW4gw6FjaWRvIHN1bGbDunJpY28uIENvbnNpc3RlIGVuIHVuIMOhdG9tbyBkZSBhenVmcmUgeSBkb3MgZGUgb3jDrWdlbm8uDQoNCkxhIHByaW5jaXBhbCBmdWVudGUgZGUgZW1pc2nDs24gZGUgZGnDs3hpZG8gZGUgYXp1ZnJlIGEgbGEgYXRtw7NzZmVyYSBlcyBsYSBjb21idXN0acOzbiBkZSBwcm9kdWN0b3MgcGV0cm9sw61mZXJvcyB5IGxhIHF1ZW1hIGRlIGNhcmLDs24gZW4gY2VudHJhbGVzIGVsw6ljdHJpY2FzIHkgY2FsZWZhY2Npb25lcyBjZW50cmFsZXMuIEV4aXN0ZW4gdGFtYmnDqW4gYWxndW5hcyBmdWVudGVzIG5hdHVyYWxlcywgY29tbyBlcyBlbCBjYXNvIGRlIGxvcyB2b2xjYW5lcy4NCg0KW0Rpw7N4aWRvIGRlIGF6dWZyZV0oaHR0cHM6Ly93d3cuc2FsdWRnZW9hbWJpZW50YWwub3JnL2Rpb3hpZG8tYXp1ZnJlLXNvMikNCg0KKiBQTTEwDQoNCkxhcyBQTTEwIHNlIHB1ZWRlbiBkZWZpbmlyIGNvbW8gYXF1ZWxsYXMgcGFydMOtY3VsYXMgc8OzbGlkYXMgbyBsw61xdWlkYXMgZGUgcG9sdm8sIGNlbml6YXMsIGhvbGzDrW4sIHBhcnTDrWN1bGFzIG1ldMOhbGljYXMsIGNlbWVudG8gbyBwb2xlbiwgZGlzcGVyc2FzIGVuIGxhIGF0bcOzc2ZlcmEsIHkgY3V5byBkacOhbWV0cm8gdmFyw61hIGVudHJlIDIsNSB5IDEwIMK1bSAoMSBtaWNyw7NtZXRybyBjb3JyZXNwb25kZSBsYSBtaWzDqXNpbWEgcGFydGUgZGUgMSBtaWzDrW1ldHJvKS4gRXN0w6FuIGZvcm1hZGFzIHByaW5jaXBhbG1lbnRlIHBvciBjb21wdWVzdG9zIGlub3Jnw6FuaWNvcyBjb21vIHNpbGljYXRvcyB5IGFsdW1pbmF0b3MsIG1ldGFsZXMgcGVzYWRvcyBlbnRyZSBvdHJvcywgeSBtYXRlcmlhbCBvcmfDoW5pY28gYXNvY2lhZG8gYSBwYXJ0w61jdWxhcyBkZSBjYXJib25vLCBsYXMgcHJpbmNpcGFsZXMgZnVlbnRlcyBkZSBsYXMgUE0xMCBzb24gaHVtbywgc2FsIG1hcmluYSwgZW1pc2lvbmVzIGRlIG1vdG9yZXMgZGUgY29tYnVzdGnDs24gaW50ZXJuYSB5IGxhIGluZHVzdHJpYS4NCg0KW1BNMTBdKGh0dHBzOi8vcHJ0ci1lcy5lcy9wYXJ0aWN1bGFzLXBtMTAsMTU2NzMsMTEsMjAwNy5odG1sKQ0KDQoNCl9fwr9RdcOpIGVzIGxhIG1vdmlsaWRhZCB1cmJhbmE/X18NCg0KTGEgbW92aWxpZGFkIHVyYmFuYSBzZSBkZWZpbmUgY29tbyBlbCBjb25qdW50byBkZSBkZXNwbGF6YW1pZW50b3MsIHRhbnRvIGRlIHBlcnNvbmFzIGNvbW8gZGUgbWVyY2FuY8OtYXMsIHF1ZSBzZSBwcm9kdWNlbiBlbiB1bmEgY2l1ZGFkIGNvbiBlbCBvYmpldGl2byBkZSByZWNvcnJlciBsYSBkaXN0YW5jaWEgcXVlIHNlcGFyYSB1biBsdWdhciBkZSBvdHJvLiBTZSBzdWVsZSBjbGFzaWZpY2FyIGxhIG1vdmlsaWRhZCB1cmJhbmEgcXVlIHV0aWxpemFuIHVuIG1lZGlvIGRlIHRyYW5zcG9ydGUgZW4gdHJhbnNwb3J0ZSBww7pibGljbyB5IHByaXZhZG8uIExhIG1vdmlsaWRhZCB1cmJhbmEgZXMgZW50b25jZXMgdW4gZmFjdG9yIGRldGVybWluYW50ZSB0YW50byBwYXJhIGxhIHByb2R1Y3RpdmlkYWQgZWNvbsOzbWljYSBkZWwgdGVycml0b3JpbyBjb21vIHBhcmEgbGEgY2FsaWRhZCBkZSB2aWRhIGRlIHN1cyBjaXVkYWRhbm9zIHkgZWwgYWNjZXNvIGEgc2VydmljaW9zIGLDoXNpY29zIGRlIHNhbHVkIHkgZWR1Y2FjacOzbi4NCg0KX1/Cv1F1w6kgZXMgbGEgY2FsaWRhZCBkZWwgYWlyZT9fXw0KDQpTZSBkZWZpbmUgbGEgaW5taXNpw7NuIG8gY2FsaWRhZCBkZWwgYWlyZSBjb21vIGxhIGNvbmNlbnRyYWNpw7NuIGRlIGNvbnRhbWluYW50ZSBxdWUgbGxlZ2EgYSB1biByZWNlcHRvciwgbcOhcyBvIG1lbm9zIGxlamFubyBkZSBsYSBmdWVudGUgZGUgZW1pc2nDs24sIHVuYSB2ZXogdHJhbnNwb3J0YWRvIHkgZGlmdW5kaWRvIHBvciBsYSBhdG3Ds3NmZXJhLiBMYSBjYXBhY2lkYWQgZGUgbGEgYXRtw7NzZmVyYSBwYXJhIGRpbHVpciBsYXMgY29uY2VudHJhY2lvbmVzIGRlIGNvbnRhbWluYW50ZXMgZXMgZnVuZGFtZW50YWwgcGFyYSBwcmVzZXJ2YXIgdW5hIGJ1ZW5hIGNhbGlkYWQgZGVsIGFpcmUsIHkgZXN0byB2YSBhIHZlbmlyIG1hcmNhZG8gcHJpbmNpcGFsbWVudGUgcG9yIGxhcyBjb25kaWNpb25lcyBtZXRlb3JvbMOzZ2ljYXMuIEFzw60sIGVuIHVuYSBhdG3Ds3NmZXJhIGVzdGFibGUsIHNlIHByb3BpY2lhcsOhIGxhIGFjdW11bGFjacOzbiBkZSBjb250YW1pbmFudGVzIHkgc2UgZmFjaWxpdGFyw6EgbGEgZm9ybWFjacOzbiBkZSBjb250YW1pbmFudGVzIHNlY3VuZGFyaW9zLCBtaWVudHJhcyBxdWUgZW4gdW5hIGF0bcOzc2ZlcmEgaW5lc3RhYmxlLCBsYSBkaWZ1c2nDs24gZGUgbG9zIGNvbnRhbWluYW50ZXMgc2Vyw6EgbcOhcyBlZmljYXogZGViaWRvIGEgbGFzIHR1cmJ1bGVuY2lhcy4NCg0KX1/Cv0VuIHF1w6kgbm9zIGFmZWN0YSBlbCBhdW1lbnRvIGRlIG1vdmlsaWRhZCB1cmJhbmE/X18NCg0KR3JhY2lhcyBhbCBkZXNjZW5zbyB5IGF1bWVudG8gZGUgbW92aWxpZGFkIHVyYmFuYSBkdXJhbnRlIGxhIHBhbmRlbWlhIGRlIENvdmlkLTE5IHB1ZGltb3Mgb2JzZXJ2YXIgZ3JhY2lhcyBhbCBJQ0EsIMOtbmRpY2UgZGUgY2FsaWRhZCBkZWwgYWlyZSwgbGFzIGNvbnNlY3VlbmNpYXMgcXVlIHRyYWUgY29uc2lnbyB5IGVsIGltcGFjdG8gcXVlIHNlIHRpZW5lLiBMYSBPcmdhbml6YWNpw7NuIFBhbmFtZXJpY2FuYSBkZSBsYSBTYWx1ZCBlc3RpbWEgcXVlIGNlcmNhIGRlIDcgbWlsbG9uZXMgZGUgcGVyc29uYXMgZW4gZWwgbXVuZG8gbXVlcmVuIGEgY2F1c2EgZGUgbGEgY29udGFtaW5hY2nDs24gZGVsIGFpcmUuIEFkZW3DoXMsIGxhIGNvbnRhbWluYWNpw7NuIGVzIHVubyBkZSBsb3MgNSBmYWN0b3JlcyBkZSByaWVzZ28gcGFyYSBlbmZlcm1lZGFkZXMgbm8gdHJhbnNtaXNpYmxlcyB5IHNlIGFzb2NpYSBhIGVuZmVybWVkYWRlcyByZXNwaXJhdG9yaWFzIHkgY2FyZGlvdmFzY3VsYXJlcywgY8OhbmNlciBkZSBwdWxtw7NuLCBlbmZlcm1lZGFkIHB1bG1vbmFyIG9ic3RydWN0aXZhIGNyw7NuaWNhIHkgZXBpc29kaW9zIGFzbcOhdGljb3MuDQoNCiMgX19NZXRvZG9sb2fDrWFfXw0KDQojIyBfX0Fuw6FsaXNpcyBkZSBTZXJpZXMgZGUgVGllbXBvX18NClBvciBzZXJpZSBkZSB0aWVtcG8gbm9zIHJlZmVyaW1vcyBhIGRhdG9zIGVzdGFkw61zdGljb3MgcXVlIHNlIHJlY29waWxhbiwgb2JzZXJ2YW4gbyByZWdpc3RyYW4gZW4gaW50ZXJ2YWxvcyBkZSB0aWVtcG8gcmVndWxhcmVzIChkaWFyaW8sIHNlbWFuYWwsIHNlbWVzdHJhbCwgYW51YWwsIGVudHJlIG90cm9zKS4gRWwgdMOpcm1pbm8gc2VyaWUgZGUgdGllbXBvIHNlIGFwbGljYSBwb3IgZWplbXBsbyBhIGRhdG9zIHJlZ2lzdHJhZG9zIGVuIGZvcm1hIHBlcmnDs2RpY2EgcXVlIG11ZXN0cmFuLCBwb3IgZWplbXBsbywgbGFzIHZlbnRhcyBhbnVhbGVzIHRvdGFsZXMgZGUgYWxtYWNlbmVzLCBlbCB2YWxvciB0cmltZXN0cmFsIHRvdGFsIGRlIGNvbnRyYXRvcyBkZSBjb25zdHJ1Y2Npw7NuIG90b3JnYWRvcywgZWwgdmFsb3IgdHJpbWVzdHJhbCBkZWwgUElCLg0KICANCiMjIF9fQW7DoWxpc2lzIGRlIENvcnJlbGFjacOzbl9fDQpFbCBhbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuIGludGVudGEgbWVkaXIgbGEgZnVlcnphIGRlIHRhbGVzIHJlbGFjaW9uZXMgZW50cmUgZG9zIHZhcmlhYmxlcyBwb3IgbWVkaW8gZGUgdW4gc29sbyBuw7ptZXJvIGRlbm9taW5hZG8gY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuLiBFbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbiBlcyB1bmEgcHJ1ZWJhIHF1ZSBtaWRlIGxhIHJlbGFjacOzbiBlc3RhZMOtc3RpY2EgZW50cmUgZG9zIHZhcmlhYmxlcyBjb250aW51YXMuIFNpIGxhIGFzb2NpYWNpw7NuIGVudHJlIGxvcyBlbGVtZW50b3Mgbm8gZXMgbGluZWFsLCBlbnRvbmNlcyBlbCBjb2VmaWNpZW50ZSBubyBzZSBlbmN1ZW50cmEgcmVwcmVzZW50YWRvIGFkZWN1YWRhbWVudGUuDQoNCkVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBwdWVkZSB0b21hciB1biByYW5nbyBkZSB2YWxvcmVzIGRlICsxIGEgLTEuIFVuIHZhbG9yIGRlIDAgaW5kaWNhIHF1ZSBubyBoYXkgYXNvY2lhY2nDs24gZW50cmUgbGFzIGRvcyB2YXJpYWJsZXMuIFVuIHZhbG9yIG1heW9yIHF1ZSAwIGluZGljYSB1bmEgYXNvY2lhY2nDs24gcG9zaXRpdmEuIEVzIGRlY2lyLCBhIG1lZGlkYSBxdWUgYXVtZW50YSBlbCB2YWxvciBkZSB1bmEgdmFyaWFibGUsIHRhbWJpw6luIGxvIGhhY2UgZWwgdmFsb3IgZGUgbGEgb3RyYS4gVW4gdmFsb3IgbWVub3IgcXVlIDAgaW5kaWNhIHVuYSBhc29jaWFjacOzbiBuZWdhdGl2YTsgZXMgZGVjaXIsIGEgbWVkaWRhIHF1ZSBhdW1lbnRhIGVsIHZhbG9yIGRlIHVuYSB2YXJpYWJsZSwgZWwgdmFsb3IgZGUgbGEgb3RyYSBkaXNtaW51eWUuDQogIA0KDQojIF9fUmVzdWx0YWRvc19fDQoNCiogSW1wb3J0YW1vcyBkYXRvcw0KDQpgYGB7cn0NCnhmdW46OmVtYmVkX2ZpbGUoJ0RhdG9zTW92Y292aWQuY3N2Jyk7DQpgYGANCg0KYGBge3IgSW1wb3J0YWNpb24gZGUgRGF0b3N9DQoNCkRhdG9zTW92X2NvdmlkIDwtIHJlYWRfY3N2KCJEYXRvc01vdmNvdmlkLmNzdiIpDQoNCkZlY2hhIDwtIHNlcS5EYXRlKGFzLkRhdGUoIjIwMjAtMDItMTUiKSAsIHRvPSBhcy5EYXRlKCIyMDIxLTA1LTA2IiksYnkgPSAiZGF5IiApDQpzY2FsYV9tb250aCA8LSBzZXEuRGF0ZShhcy5EYXRlKCIyMDIwLTAyLTE1IikgLCB0bz0gYXMuRGF0ZSgiMjAyMS0wNS0wNiIpLGJ5ID0gIm1vbnRoIiApDQoNCg0KDQoNCmBgYA0KDQoNCmBgYHtyIENvbmZpZ3VyYWNpb24gZGUgZGF0b3N9DQoNCmRhdGFfTzMgPC0gYXMudmVjdG9yKERhdG9zTW92X2NvdmlkJE8zKQ0KDQoNCnZlY1NvMjwtIGFzLnZlY3RvcihEYXRvc01vdl9jb3ZpZCRTTzIpDQpmaWx0cm9TTzIgPC0gZ3N1YigiLCIsICIiLCB2ZWNTbzIpDQpkYXRhX1NPMiA8LWFzLmRvdWJsZShmaWx0cm9TTzIpDQpkYXRhX1BNMTAgPC0gYXMudmVjdG9yKERhdG9zTW92X2NvdmlkJFBNMTApDQpkYXRhX0NvbWVyY2lhbCA8LSBhcy52ZWN0b3IoRGF0b3NNb3ZfY292aWQkUmVhY3RpdmFjaW9uX0NvbWVyY2lhbCkNCmRhdGFfRmFybWFjaWEgPC0gYXMudmVjdG9yKERhdG9zTW92X2NvdmlkJFN1cGVybWVyY2Fkb19GYXJtYWNpYSkNCmRhdGFfUGFycXVlcyA8LSBhcy52ZWN0b3IoRGF0b3NNb3ZfY292aWQkUGFycXVlc19DZW50cm9zKQ0KZGF0YV9UcmFuc2l0byA8LSBhcy52ZWN0b3IoRGF0b3NNb3ZfY292aWQkRXN0YWNpb25lc19UcmFuc2l0bykNCmRhdGFfVHJhYmFqbyA8LSBhcy52ZWN0b3IoRGF0b3NNb3ZfY292aWQkTHVnYXJlc19UcmFiYWpvKQ0KZGF0YV9SZXNpZGVuY2lhIDwtIGFzLnZlY3RvcihEYXRvc01vdl9jb3ZpZCRSZXNpZGVuY2lhKQ0KZGF0YV9jb3ZpZCA8LSBhcy52ZWN0b3IoRGF0b3NNb3ZfY292aWQkY292aWQpDQoNCg0KZGF0YTEgPC0gZGF0YS5mcmFtZShGZWNoYT1GZWNoYSxPMz1kYXRhX08zLFNPMj1kYXRhX1NPMixQTTEwPWRhdGFfUE0xMCxSZWFjdGl2YWNpb25fQ29tZXJjaWFsPWRhdGFfQ29tZXJjaWFsLCBTdXBlcm1lcmNhZG9fRmFybWFjaWE9ZGF0YV9GYXJtYWNpYSxQYXJxdWVzX0NlbnRyb3M9IGRhdGFfUGFycXVlcywgRXN0YWNpb25lc19UcmFuc2l0bz1kYXRhX1RyYW5zaXRvLCBSZXNpZGVuY2lhID1kYXRhX1Jlc2lkZW5jaWEsRGF0b3NfQ292aWQgPWRhdGFfY292aWQpDQpgYGANCg0KDQojIyBUYWJsYSBJbnRlcmFjdGl2YSBkZSAgRGF0b3MgcGFyYSAgZXN0ZSBhbmFsaXNpcw0KDQpgYGB7ciBUYWJsYSBkZSBkYXRvc30NCg0KZGF0YXRhYmxlKGRhdGExKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KDQpwbG90MCA8LSBnZ3Bsb3QoIGRhdGE9IGRhdGExKSArDQogDQogICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBkYXRhX0NvbWVyY2lhbCwgY29sb3VyPSJSZWFjdGl2YWNpb24gQ29tZXJjaWFsIikpICsgDQogICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBkYXRhX0Zhcm1hY2lhLCBjb2xvdXI9IlN1cGVybWVyY2Fkb3MgRmFybWFjaWEiKSkgKyANCiAgIGdlb21fbGluZShhZXMoRmVjaGEsIGRhdGFfUGFycXVlcywgY29sb3VyPSJQYXJxdWVzIENlbnRyb3MiKSkgKyANCiAgIGdlb21fbGluZShhZXMoRmVjaGEsIGRhdGFfVHJhbnNpdG8sIGNvbG91cj0iRXN0YWNpb25lcyBUcmFuc2l0byIpKSArIA0KICAgZ2VvbV9saW5lKGFlcyhGZWNoYSwgZGF0YV9UcmFiYWpvLCBjb2xvdXI9Ikx1Z2FyZXMgVHJhYmFqbyIpKSArDQogICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBkYXRhX1Jlc2lkZW5jaWEsIGNvbG91cj0iRXN0YWNpb25lcyBSZXNpZGVuY2lhIikpICsNCiAgICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBkYXRhX2NvdmlkLCBjb2xvdXI9IkNvdmlkIikpICsgDQogICANCiANCg0KICANCiAgeGxhYigiRmVjaGEiKSArDQogIHlsYWIoIkNPVklELTE5IGVuIE3Dg8KpeGljbyIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjUsIGhqdXN0ID0gMSkpIA0KYGBgDQoNCg0KDQpgYGB7ciBHcmFmaWNhIFNlcmllIGRlIFRpZW1wb30NCg0KDQpwbG90MSA8LSBnZ3Bsb3QoIGRhdGE9IGRhdGExKSArDQogIGdlb21fbGluZShhZXMoRmVjaGEsIGRhdGFfTzMsIGNvbG91cj0iTzMiKSkgKyANCiAgICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBkYXRhX1NPMiwgY29sb3VyPSJTTzIiKSkgKyANCiAgIGdlb21fbGluZShhZXMoRmVjaGEsIGRhdGFfUE0xMCwgY29sb3VyPSJQTTEwIikpICsgDQogICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBkYXRhX0NvbWVyY2lhbCwgY29sb3VyPSJSZWFjdGl2YWNpb24gQ29tZXJjaWFsIikpICsgDQogICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBkYXRhX0Zhcm1hY2lhLCBjb2xvdXI9IlN1cGVybWVyY2Fkb3MgRmFybWFjaWEiKSkgKyANCiAgIGdlb21fbGluZShhZXMoRmVjaGEsIGRhdGFfUGFycXVlcywgY29sb3VyPSJQYXJxdWVzIENlbnRyb3MiKSkgKyANCiAgIGdlb21fbGluZShhZXMoRmVjaGEsIGRhdGFfVHJhbnNpdG8sIGNvbG91cj0iRXN0YWNpb25lcyBUcmFuc2l0byIpKSArIA0KICAgZ2VvbV9saW5lKGFlcyhGZWNoYSwgZGF0YV9UcmFiYWpvLCBjb2xvdXI9Ikx1Z2FyZXMgVHJhYmFqbyIpKSArDQogICBnZW9tX2xpbmUoYWVzKEZlY2hhLCBkYXRhX1Jlc2lkZW5jaWEsIGNvbG91cj0iRXN0YWNpb25lcyBSZXNpZGVuY2lhIikpICsNCiAgZ2VvbV9saW5lKGFlcyhGZWNoYSwgZGF0YV9jb3ZpZCwgY29sb3VyPSJDb3ZpZCIpKSArIA0KICAgDQogDQoNCiAgDQogIHhsYWIoIkZlY2hhIikgKw0KICB5bGFiKCJEYXRvcyIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjUsIGhqdXN0ID0gMSkpIA0KDQoNCg0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoqICAgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+X19SZWN1ZXJkYSBwdWVkZXMgU2VsZWNjaW9uYXIgbG9zIGRhdG9zIHF1ZSBzb2xvIGRlc2VhcyB2ZXIgcGFyYSBjb21wYXJhcl9fIDwvc3Bhbj4NCg0KYGBge3J9DQpnZ3Bsb3RseShwbG90MCwgd2lkdGggPSAxMjAwKQ0KYGBgDQoNCg0KDQpgYGB7ciBHcmFmaWNhIEludGVyYWN0aXZhfQ0KDQojcGxvdDIgPC1nZ3Bsb3RseShnY292LCB3aWR0aCA9IDg1MCkgDQoNCiMgZ2NvYyA8LSBncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLHBsb3QzLCBucm93ID0gMykNCiMgDQojIGdncGxvdGx5KCB3aWR0aCA9IDg1MCkNCg0KDQpnZ3Bsb3RseShwbG90MSwgd2lkdGggPSAxMjAwKQ0KDQoNCg0KYGBgDQoNCiogRW1pc2lvbmVzIHkgUmVhY3RpdmFjacOzbiBlY29uw7NtaWNhDQoNClNlIG9ic2VydmEgcXVlIGNvbiBlbCBpbmljaW8gZGUgbGEgcGFuZGVtaWEgZWwgbml2ZWwgZGUgZW1pc2lvbmVzIGJham8gZGUgZm9ybWEgY29uc2lkZXJhYmxlLCBlc3RvIGVzIGRlYmlkbyBhIGxhIGRpc21pbnVjacOzbiBkZSBlbiBlbCB1c28gZGVsIHRyYW5zcG9ydGUgcMO6YmxpY28geSBhdXRvbcOzdmlsZXMsIGxhIHJlZHVjY2nDs24gZGVsIHZvbHVtZW4gaW5kdXN0cmlhbCwgZWwgYXVtZW50byBlbiBlbCBwcmVjaW8gZGUgaGlkcm9jYXJidXJvcyB5IGVsIGF1bWVudG8gZW4gZWwgdXNvIGRlIG3DqXRvZG9zIGRlIHRyYW5zcG9ydGUgYWx0ZXJuYXRpdm9zLCB0YWwgY29tbyBsYSBiaWNpY2xldGEsIGEgbG8gbGFyZ28gZGUgbGEgcGFuZGVtaWEgcG9kZW1vcyBvYnNlcnZhciBxdWUgZWwgbml2ZWwgZGUgZW1pc2lvbmVzIHNlIGhhIGxvZ3JhZG8gcmVjdXBlcmFyIGRlIGZvcm1hIHBhcmNpYWwsIGVzdG8gZ3JhY2lhcyBhbCBwcm9jZXNvIGRlIHJlYWN0aXZhY2nDs24gZWNvbsOzbWljYS4NCg0KDQpbQmljaWNsZXRhXShodHRwczovL3d3dy5lbGVjb25vbWlzdGEuY29tLm14L2xpc3Rhcy9MYS1iaWNpY2xldGEtZW4tdGllbXBvcy1kZS1wYW5kZW1pYS10MjAyMTAxMjkwMDAxLmh0bWwpDQoNCltUcmFuc3BvcnRlIHDDumJsaWNvXShodHRwczovL3d3dy5lbGVjb25vbWlzdGEuY29tLm14L2FydGVzZWlkZWFzL1VyZ2UtZWwtcmVzY2F0ZS1kZWwtdHJhbnNwb3J0ZS1wdWJsaWNvLXRyYXMtbG9zLWltcGFjdG9zLWRlLWxhLXBhbmRlbWlhLTIwMjEwNjI3LTAwNzUuaHRtbCkNCg0KKiBDaWNsbyBkZSBsYSBwYW5kZW1pYQ0KDQpQZXNlIGEgbGEgcmVhY3RpdmFjacOzbiBlY29uw7NtaWNhLCBubyBzZSBoYSBvYnNlcnZhZG8gdW5hIGZ1ZXJ0ZSBjb3JyZWxhY2nDs24gZW50cmUgZXN0YSB5IGVsIGF1bWVudG8gZW4gY2Fzb3MgZGUgbGEgcGFuZGVtaWEsIHNpbiBlbWJhcmdvIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBlbiBsb3MgcHVudG9zIG3DoXMgw6FsZ2lkb3MgbGEgcmVhY3RpdmFjacOzbiBjb21lcmNpYWwgc3VmcmUgdW5hIGNhw61kYSBzaWduaWZpY2F0aXZhIGFzw60gY29tbyBlbCB1c28gZGUgbG9zIHBhcnF1ZXMsIGVzdG8gc2UgbGUgcHVlZGUgYXRyaWJ1aXIgYSBtZWRpZGFzIGVzdGFibGVjaWRhcyBhIG5pdmVsIGd1YmVybmFtZW50YWwsIHRhbGVzIGNvbW8gY3VhcmVudGVuYSBvIGxpbWl0YXIgZWwgYWNjZXNvIGEgw6FyZWFzIHDDumJsaWNhcy4NCg0KW0Nyb25vbG9nw61hIGRlIGxhIHBhbmRlbWlhIGVuIE3DqXhpY29dKGh0dHBzOi8vd3d3LmVsZWNvbm9taXN0YS5jb20ubXgvcG9saXRpY2EvQ3Jvbm9sb2dpYS1kZS1sYS1wYW5kZW1pYS1lbi1NZXhpY28tMjAyMTAzMDEtMDA0NS5odG1sKQ0KDQoNCiMjIE1hdHJpeiBkZSBDb3JyZWxhY2lvbg0KDQpgYGB7cn0NCg0KZGF0b3MyIDwtIHNlbGVjdChkYXRhMSwtRmVjaGEpDQoNCmQ8LSBjb3IoZGF0b3MyKQ0KDQpkYXRhdGFibGUoZCkNCmBgYA0KDQojIyBEaWFncmFtYSBkZSBEaXNwZXJjacOzbi4NCg0KDQpgYGB7cn0NCg0KY2hhcnQuQ29ycmVsYXRpb24oZGF0b3MyLCBoaXN0b2dyYW0gPSBUUlVFLCBtZXRob2QgPSAicGVhcnNvbiIpDQpgYGANCg0KRW4gZXN0ZSBncsOhZmljbyBkZSBkaXNwZXJjacOzbiBidXNjYW1vcyBsYSByZWxhY2nDs24gcXVlIGhheSBlbnRyZSBsYXMgdmFyaWFibGVzLCBkZSBhY3VlcmRvIGFsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbi4gTG9zIHZhbG9yZXMgZGUgbW92aWxpZGFkIHRpZW5lbiBmdWVydGUgcmVsYWNpw7NuIGVudHJlIHPDrSB5YSBzZWEgZGUgZm9ybWEgbmVnYXRpdmEsIGVzIGRlY2lyIHF1ZSBkaXNtaW51eWVuIG8gcG9zaXRpdmEgcXVlIGF1bWVudGFuIGVuIGJhc2UgYSAkWCQgeSAkWSQuTGFzIHZhcmlhYmxlcyBxdcOpIHRpZW5lbiBmdWVydGUgcmVsYWNpw7NuIHNvbiByZWFjdGl2YWNpb24gY29tZXJjaWFsIHkgZXN0YWNpb25lcyBkZSB0csOhbnNpdG8gY29uIHVuIHZhbG9yIGRlIGNvZWZpY2llbnRlICQwLjk0JCBvYnNlcnZhbW9zIGNvbW8gYXVtZW50YW4gYSBsYSBwYXIuIFBhcmEgbGEgcmVsYWNpw7NuIG5lZ2F0aXZhIG51ZXN0cmFzIHZhcmlhYmxlcyBzb24gUmVzaWRlbmNpYSB5IFJlYWN0aXZhY2lvbiBjb21lcmNpYWwgY29uIHVuIHZhbG9yIGRlIGNvZWZpY2llbnRlICTiiJIwLjg0JC4gU2luIGVtYmFyZ28gYWwgY29tcGFyYXIgY29uIGxvcyBkYXRvcyBkZSBjb3ZpZCBvIGdhc2VzIGxhIHBlcnNwZWN0aXZhIGVzIG11eSBkaXN0aW50YS4NCg0KKiBfwr9RdcOpIHZhcmlhYmxlIGRlIG1vdmlsaWRhZCB1cmJhbmEgYXVtZW50YSBtw6FzIGxvcyBjYXNvcyBkZSBjb3ZpZD9fIFJlc2lkZW5jaWEuDQoNCiogX8K/UXXDqSB2YXJpYWJsZSBkZSBtb3ZpbGlkYWQgdXJiYW5hIGF1bWVudGEgbyBkaXNtaW51eWUgbcOhcyBsb3MgY29udGFtaW5hbnRlcz9fIGxhIHZhcmlhYmxlIGRlIG1vdmlsaWRhZCBSZXNpc2RlbmNpYSBkaXNtaW51eWUgbG9zIGNvbnRhbWluYW50ZXMuDQoNCiMgX19SZWZlcmVuY2lhc19fDQoNCiogV2hhdCBpcyBPem9uZT8gKDIwMjEsIDE2IGp1bmlvKS4gVVMgRVBBLiBSZWN1cGVyYWRvIDI1IGRlIG9jdHVicmUgZGUgMjAyMSwgZGUgaHR0cHM6Ly93d3cuZXBhLmdvdi9vem9uZS1wb2xsdXRpb24tYW5kLXlvdXItcGF0aWVudHMtaGVhbHRoL3doYXQtb3pvbmUNCg0KKiBHcm91bmQtTGV2ZWwgT3pvbmUgKE8zKSBQb2xsdXRpb24gfCBBREVRIEFyaXpvbmEgRGVwYXJ0bWVudCBvZiBFbnZpcm9ubWVudGFsIFF1YWxpdHkuICgyMDIxLCAxMiBmZWJyZXJvKS4gQXJpem9uYSBEZXBhcnRtZW50IG9mIEVudmlyb25tZW50YWwgUXVhbGl0eS4gUmVjdXBlcmFkbyAyNSBkZSBvY3R1YnJlIGRlIDIwMjEsIGRlIGh0dHA6Ly93d3cuYXpkZXEuZ292L2dyb3VuZC1sZXZlbC1vem9uZS1vMy1wb2xsdXRpb24jOiU3RTp0ZXh0PUdyb3VuZCUyRGxldmVsJTIwb3pvbmUlMjANCg0KKiBFbCBkacOzeGlkbyBkZSBhenVmcmUgU08yLiAoMjAyMCwgMjQgYWJyaWwpLiBJbnN0aXR1dG8gcGFyYSBsYSBTYWx1ZCBHZW9hbWJpZW50YWwuIFJlY3VwZXJhZG8gMjUgZGUgb2N0dWJyZSBkZSAyMDIxLCBkZSBodHRwczovL3d3dy5zYWx1ZGdlb2FtYmllbnRhbC5vcmcvZGlveGlkby1henVmcmUtc28yDQoNCiogUGFydMOtY3VsYXMgUE0xMCB8IFBSVFIgRXNwYcOxYS4gKHMuIGYuKS4gUFJUUiBFc3Bhw7FhLiBSZWN1cGVyYWRvIDI1IGRlIG9jdHVicmUgZGUgMjAyMSwgZGUgaHR0cHM6Ly9wcnRyLWVzLmVzL3BhcnRpY3VsYXMtcG0xMCwxNTY3MywxMSwyMDA3Lmh0bWwNCg0KKiBNYXJxdWluYSwgRy4gKDIwMjEsIDMwIGVuZXJvKS4gTGEgYmljaWNsZXRhIGVuIHRpZW1wb3MgZGUgcGFuZGVtaWEuIEVsIEVjb25vbWlzdGEuIFJlY3VwZXJhZG8gMjUgZGUgb2N0dWJyZSBkZSAyMDIxLCBkZSBodHRwczovL3d3dy5lbGVjb25vbWlzdGEuY29tLm14L2xpc3Rhcy9MYS1iaWNpY2xldGEtZW4tdGllbXBvcy1kZS1wYW5kZW1pYS10MjAyMTAxMjkwMDAxLmh0bWwNCg0KKiBDcm9ub2xvZ8OtYSBkZSBsYSBwYW5kZW1pYSBlbiBNw6l4aWNvLiAoMjAyMSwgMiBtYXJ6bykuIEVsIEVjb25vbWlzdGEuIFJlY3VwZXJhZG8gMTcgZGUgb2N0dWJyZSBkZSAyMDIxLCBkZSBodHRwczovL3d3dy5lbGVjb25vbWlzdGEuY29tLm14L3BvbGl0aWNhL0Nyb25vbG9naWEtZGUtbGEtcGFuZGVtaWEtZW4tTWV4aWNvLTIwMjEwMzAxLTAwNDUuaHRtbA0KDQoqIFN1w6FyZXogTGFzdHJhLCBNLiAoMjAxNywgMSBqdW5pbykuIEVuIE3DqXhpY28gODAlIGRlIGxvcyB0cmFzbGFkb3Mgc2UgaGFjZW4gZW4gdHJhbnNwb3J0ZSBww7pibGljby4gQm9sZXTDrW4gVU5BTS1ER0NTLiBSZWN1cGVyYWRvIDE3IGRlIG9jdHVicmUgZGUgMjAyMSwgZGUgaHR0cHM6Ly93d3cuZGdjcy51bmFtLm14L2JvbGV0aW4vYmRib2xldGluLzIwMTdfMzg0Lmh0bWwNCg0KDQoNCg0KDQo=