1. Introducción

El análisis espacial es una técnica ampliamente usada en topografía y geografía la cual consiste en la recopilación de información en un punto de muestreo específico, esto permitiendo la modelación o interpolación de datos puntuales para volverlos datos continuos, adicionalmente, para este proceso se suele usar el Sistema de Información Geográfica SIG el cual proporciona herramientas de análisis espacial para calcular estadísticas en el geoprocesamiento de datos por medio de celdas en un raster. La interpolación espacial se refiere principalmente al uso de puntos con valores cuantitativos dados, con los cuales se estima el valor de otros datos que son desconocidos. Es decir, es el paso de mediciones puntuales a representaciones continuas de variables que expresan propiedades continuas de la naturaleza. Usualmente, es usada para mediciones de la precipitación, el pH, humedad de suelo, concentración química en el suelo, etc. Este método también abarca varios tipos de interpolación como son:
  • Distancia Inversa Ponderada (IDW)
  • Red Irregular Triangulada (TIN)
  • Kriging
  • Polígonos Thiessen
  • Natural Neighbourhood Interpolation (NN)

La interpolación espacial también tiene como propósito ser una opción viable para los objetos que están distribuidos en el espacio y que tienen relación mutua.1 Es decir, que dependiendo de los puntos de los datos muestra se puede determinar el valor de puntos cercanos a este. En otras palabras, lo que se realiza es la predicción de valores para celdas en un raster a partir de valores de puntos muestra. Aunque este método no ha sido considerado 100% confiable, ya que, la información de los puntos muestra, es decir, los datos originales, pueden tender a degradarse al brindar datos a otras celdas por el nivel de probabilidad que este puede llegar a alzanzar, de igual forma, esto también depende de la distancia a la que se realiza esa predicción de los valores para saber una aproximación con una alta confianza del dato.2 Una de las principales razones por las cuales el método de interpolación espacial ha sido tan usado y práctico es por los niveles de dificultad que se pueden presentar al realizar estudios de variables como el pH del suelo, ya que, se necesitaría de mucho dinero y también de personas para realizar un estudio detallado de, por ejemplo, toda la superficie del suelo de un país. En cambio, con el uso de la interpolación, no es necesario tener tantos estudios en una zona para hacer una determinación aproximada de los valores que pueden tener puntos sin presencia de datos.Por último, pero no menos importante, para la generación de superficies raster existen dos métodos generales: el uso de técnicas deterministas y técnicas estadísticas (geoestadísticas). Las técnicas deterministas se basan en el uso de una función matemática para poder conocer valores desconocidos y adicionalmente dar el valor de estas características. Por otro lado, las técnicas estadísticas o geoestadísticas, producen límites de confianza para la precisión de una predicción, aunque son un poco más difíciles de ejecutar es necesario para poder obtener un mayor numero de parámetros.3

En este informe, se muestran tres métodos de interpolación espacial, usados en el departamento del Amazonas en el país de Colombia con el uso de datos de precipitación CHIRPS con el objetivo de brindar la información necesaria para la comprensión de los diferentes conceptos e información que abarca el análisis espacial y uno de sus usos. Fueron elegidos los datos de precipitación ya que gráficamente proporcionan información útil a diferencia de la humedad y elevación del suelo, ya que, el amazonas es un departamento con una alta y uniforme humedad y la elevación del terreno es en general muy baja y sin muchas variaciones, a diferencia de la precipitación ya que presenta variaciones en diferentes zonas del departamento y en distintas épocas.

2. Descripción de la zona de estudio

El departamento del amazonas fue fundado en el año 1991 y cuenta con 2 municipios, Puerto Nariño y Leticia (su capital), y además, cuenta con 9 corregimientos. Este departamento se ha caracterizado por su multivariedad de culturas tanto en la época de la conquista como en las que se mantienen hoy en día. De igual modo, con el paso del tiempo el clima fue transformándose de sabana a uno mucho más humedo formando poco a poco la gran selva que hoy que existe actualmente. Por otro lado, las practicas que empleaban los humanos en el transcurso del tiempo fue evolucionando hasta la pesca y la agricultura desarrollando la cultura de la selva tropical. El amazonas es ampliamente reconocido por ser la zona forestal más grande del mundo que igualmente es compartida con los países de Venezuela, Brasil, Ecuador, Perú, Guyana, Suriname y Bolivia por esta razón es conocido por el nombre alterno del pulmón del mundo. El departamento del amazonas en Colombia es considerada la zona más forestal y, de igual modo, este terreno comprende las selvas tropicales de la llanura amazónica de relieve plano y la saliente del Vaupés, que posee colinas de poca altura y muy antiguas. El clima del departamento usualmente es cálido y húmedo con una temperatura media constante de 25.4°C y la precipitación varía entre los 2660 mm/año. El amazonas también es conocido ya que posee parte de los principales ríos de Colombia como Caquetá, Putumayo, Guaviare, Amazonas, Vichada, Apaporis, Inírida y Vaupés. Por la gran humedad que se presenta en este lugar no se permite la construcción de vías terrestres e igualmente por el temor al impacto ambiental. El departamento del amazonas es el más grande de Colombia ocupando 109665km2 de extensión territorial del país, además, su población cuenta con más de 76000 habitantes por estudios tomados en el 2018, y cuenta con países vecinos como Brasil y Perú brindando una gran riqueza cultural. Adicionalmente, también limita con los departamentos de Caquetá, y Vaupés. El amazonas está situado a 00° 07’ 08” de latitud norte, a 04° 13’ 19” latitud sur y a 74° 23’ 21” de longitud oeste y comprende una superficie plana desde los 80 msnm en cercanías de Leticia, hasta los 320 msnm hacia la zona norte cerca al Caquetá. 4 Según el IDEAM, los datos registrados de las estaciones meteorológicas, la Amazonía colombiana presenta precipitaciones en un régimen monomodal indicando los valores más bajos en los meses de diciembre y enero y los máximos en mayo y junio, mostrando una diferencia en los datos dependiendo de la zona sur o norte de departamento. 5

3. Descripción de datos y métodos

3.1. Datos

En este informe fueron empleados los datos Climate Hazards Group InfraRed Precipitation with Station data (CHIRPS) los cuales se basan en datos de precipitación infrarojo combinados con datos de estaciones, elaborados por un grupo llamado Amenazas climáticas. Este grupo de la Universidad de California, Santa Bárbara tienen un grupo de datos de precipitacion de todo el mundo de más de 35 años, es decir, se pueden adquirir datos desde el año 1981 hasta el año en curso 2020. La gran mayoría de los datos son adquiridos a una resolución de 0.05°, sabiendo que por cada grado hay una distancia de 111.11 km aproximadamente, entonces, 0.05° corresponderian a 5.55 km de distancia. Adicionalmente, a estas imágenes satelitales también se incorporan datos de estaciones climatológicas de todo el mundo gracias a convenios con la Universidad. También, debido al uso de un algoritmo y la union de estos datos se crea un raster de precipitacion, con el motivo de analizar sequías por medio de tendencias y monitoreos estacionales. Estos datos pueden ser adquiridos en diferentes periodos, como anuales, mensuales, cada cinco dias y diarios. Al descargar los datos hay tres opciones de formato raster: .bils, .netcdf y .tif. Los datos descargados en este informe fueron en formato .tif gracias a que se tiene más familiaridad con este tipo de formatos. 6 En este informe fueron usados los datos de precipitación de los últimos cinco días del mes de abril de este año, que fueron publicados el 18 de mayo. Al cargar los datos se obtuvo información del archivo como la siguiente:
class      : RasterLayer 
dimensions : 500, 1800, 9e+05  (nrow, ncol, ncell)
resolution : 0.2, 0.2  (x, y)
extent     : -180, 180, -50, 50  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
source     : memory
names      : chirps.v2.0.2020.04.6 
values     : -9999, 401.1604  (min, max)
Esto indica que la clase del archivo cargado es raster, y que tiene 9e+05 celdas, es decir que el número de celdas es de 900000, de igual forma, las filas son en total 500 y las columnas son 1800 y los datos se encuentran en coordenadas geográficas. En este caso, las celdas tienen una resolución de 0.2°, un poco menos de lo mencionado anteriormente (0.05°) debido a que fue realizado un proceso adicional en el ploteo de los mapas, ya que, el número de celdas que habia era muy alto, entonces, fue usada la función aggregate del paquete raster para realizar el cambio de tamaño. A continuación, se muestra el mapa del amazonas con las celdas de los datos de precipitación graficados en un mapa interactivo, pero con la resolución original de 0.05°:
En la obtención de los puntos para la interpolación en este informe, se pasaron los datos raster a puntos, lo cual permitió que se obtuvieran los puntos del centro de cada una de las celdas que corresponden a la precipitación del departamento del amazonas.En el siguiente mapa se puede observar la representación gráfica de los puntos en cada celda representados en color coral,

De igual forma, otro representación más de la precipitación en esta zona puede ser el siguiente mapa ya que se pueden ver directamente los datos de precipitación en mm en cada punto, asimismo, entre más azul es el punto representado, es mayor el nivel de precipitación:

3.2. Métodos

En este informe fueron usados tres métodos de interpolación, los cuales fueron IDW, polígonos de Thiessen y por último el método de Kriging.

  • IDW

Inverse Distance Weighted Interpolation o según sus siglas en inglés IDW, se refiere a la ponderación basada en el inverso de la distancia. Este método deterministico define una región cerca a la zona de interés donde se quieren tener valores interpolados por medio de un radio de busqueda, si lo datos están mucho más alejados de ese radio de busqueda se considera que la influencia de estos es menor, es decir, que la confiabilidad disminuye en relación con el aumento de la distancia. Para hallar la estimación de lo valores a interpolar se realizan promedios de los valores muestra en la las celdas vecinas a las celdas de procesamiento, esto, teniendo en cuenta la distancia del punto al centro de la celda. Para este tipo de interpolación es usado un algoritmo que es aplicado a datos que tienen una alta variabilidad, aunque, la superficie interpolada debe ser menor que el valor máximo local de la zona y mayor que el mínimo local. En otras palabras, este método se basa en el inverso de la distancia, y esta distancia es elevada a una potencia matemática; esto permitiendo fundamentarse en la distancia desde el punto de salida. Entre mayor sea el valor de la potencia, se tienen mayor énfasis en los puntos que estan a una distancia menor. Es decir, los datos más cercanos tienen más influencia y la superficie tendrá más detalles, aunque, el valor más común usado en la potencia es de 2. 7 8 La formula base que es empleada para el cálculo del valor del punto de interés es la siguiente:

\(z_{p}\): Valor del punto de interés

\(n\): Número de puntos que quedan dentro del radio de busqueda

\(z_i\): Valor de cada punto que es conocido y que están dentro del radio de busqueda

\(d_{i}^{p}\): Distancia entre los puntos y \(^{p}\) significa la potencia

A continuación, se muestra una ilustración del método de IDW tomado de la página esri 9

Donde, el circulo amarillo representa el radio de busqueda, el punto en el centro es el punto de interés, los puntos rojos representan los puntos dentro del radio de busqueda y los que son usados para determinar el valor del punto de interés, por último, los puntos negros indican los puntos que debido a su distancia desde el centro del radio de busqueda, no son incluidos en el cálculo.

  • Polígonos Thiessen

También llamados Diagramas de Voronoi, se basan en organizar en polígonos las zonas que contienen una mayor densidad de puntos que están más cerca que otros, es decir, en cada polígono hay un conjunto de puntos con menor distancia entre cada uno, a diferencia de otros puntos más lejanos. No todas las zonas con mayor densidad de puntos están en simetría con la superficie de estudio formando figuras rectangulares, debido a que, no todas las superficies son planas o no todos los datos son graficados de forma igual; con respecto a la altura se pueden presentar variaciones en la elevación como montañas o colinas mostrando los datos en polígonos de más de 4 lados y con diferentes longitudes. Después de tener estos polígonos se calcula el área de estos asignando un punto central a cada uno mediante interpolación. 10

  • Kriging

Es un método geoestadístico que asume los fenomenos que ocurren en la superficie terrestre y que tienen un componente aleatorio. En este método, se tiene en cuenta la relación directa que existe entre los puntos que son medidos, gracias a estos datos se pueden obtener superficies de predicción y también una mejor presición de las predicciones de los valores.En este método es usada la distancia o dirección de los puntos, para representar una correlación espacial que es usada para explicar la variación de la superficie según la variable empleada. El Kriging emplea varios pasos, como son, análisis estadístico exploratorio de los datos, modelado de variogramas, creación de la superficie y como alternativa opcional la exploración de la superficie de varianza. Este método es principalmente utilizado cuando se conoce que hay una influencia de la distancial correlacionada espacialmente de los datos. 11 12

El kriging tiene cierta similitud con el método de interpolación IDW, ya que, pondera los valores medidos circundantes para calcular una predicción de una zona sin mediciones. La formula empleada en kriging es:

\[\hat{Z}(s_0) = \sum_{i=1}^{n}\lambda_{i}Z(s_i)\]

\(Z(s_i)\): Valor medido en la ubicación \(i\)

\(\lambda_{i}\): Ponderación desconocida para el valor medido en la ubicación \(i\)

\(s_0\): Ubicación del punto de interés

\(n\): Cantidad de valores medidos

En idw \(\lambda_{i}\) depende de la distancia a la ubicación del punto de interés. Con este método de kriging, las ponderaciones se basan en la distancia entre otros puntos, en la ubicación del punto de estudio y también de la disposición en el espacio de los puntos medidos.

Para el modelado de variogramas se empieza con un gráfico del semivariograma empírico el cual representa la distancia entre pares de los puntos en función de la semivarianza, la cual, representa la medida de la diferencia que existe entre esas distancias. Los puntos que se representan en este gráfico de semivariograma se deben ajustar con el modelo de variograma el cual es esencial para realizar la interpolación kriging. Este modelo de variograma tiene diversas formas como exponencial, esférica, Gaussiana o Matern.13]

4. Presentación de resultados

A continuación, se muestran los resultados obtenidos al programar los mapas, gráficas y formulas de los tres métodos de interpolación mencionados anteriormente, usando los datos CHIRPS de precipitación en la zona del departamento del Amazonas.

4.1. Interpolación mediante el método IDW

En la siguiente imagen se puede observar el mapa del amazonas con el método de interpolación de IDW donde se observa en colores marrones las zonas interpoladas con menor precipitación en el departamento y en colores verdes oscuro las mayores precipitaciones de la zona. Cabe mencionar que para el siguiente mapa fue usada como potencia 2.

Adicionalmente, también se muestra el siguiente mapa interactivo indicando de igual forma la interpolación por el método IDW. A diferencia del anterior mapa, este muestra el número original de celdas raster que fueron obtenidas al descargar los datos de precipitación de CHIRPS, esto, con el fin de tener una mejor interpretación de los datos. Las zonas que presentan un color verde más claro indican menores precipitaciones y los colores verdes azulados un poco más oscuros indican mayor precipitación.

En el siguiente gráfico se quiso explicar de una manera distinta los resultados obtenidos con esta interpolación, dando como resultado el valor de precipitación observado (eje \(x\)) y los valores estimados mediante interpolación (eje \(y\)).

Conjunto con el gráfico, se obtuvo el siguiente valor de error medio cuadrático (RMSE) que corresponde a una medida de error absoluta que calcula el cuadrado de las desviaciones y mide la cantidad de error que existe entre dos variables con distintos datos, comparando un valor predicho y un valor observado o conocido. Este dato se calcula con la siguiente fórmula:

\(N\): Número de valores observados

\(y_i\): Valor estimado

\(\hat{y_i}\): Valor observado

Finalmente, en el siguiente mapa se puede observar el nivel de confianza que presentan los datos interpolados con el método de IDW, donde, los valores con color amarillo claro indican un menor intervalo de error, es decir, una mayor confianza de los datos, y los valores con colores más rojizos indican una menor confianza de los datos.

4.2. Interpolación mediante el método de polígonos Thiessen

A continuación, se muestra el mapa correspondiente a la interpretación de los datos de precipitación por medio de la interpolación con el método de los polígonos thiessen. Como se puede observar, los polígonos pueden ser visibles, adicionalmente, fue usado el número total de celdas raster del archivo original descargado de los datos CHIRPS de precipitación, para que la visualización de los polígonos fuera mucho más clara y más concluyente. De igual forma, como en el mapa anterior, los polígonos con colores marrones indican zonas con la menor precipitación y los polígonos con colores verde oscuro indican mayor precipitación en esa zona.

Este mapa adicional muestra de una forma interactiva la disposición de los polígonos y el número de celdas que se pueden encontrar en cada uno de ellos dependiendo de la cercanía a la que se quiera observar el mapa. En este caso, los colores de las celdas raster del mapa indican que los más rojizos presentan menores precipitaciones y los colores azul oscuro indica la zonas con mayor precipitación según la interpolación realizada. De igual forma, entre más cerca se esté de la zona el número de puntos automaticamente van acomodandose a la zona, y si también se pueden filtrar los datos por “Entrenamiento” y “Validación”.

4.3 Interpolación por el método de kriging

La siguiente gráfica indica el variograma, donde fue ajustado usando el modelo de variograma exponencial. Como se puede ver, los datos de distancia varían entre 0 y 600000 metros y la semivarianza va desde 0 hasta 120. El modelo exponencial fue el más adecuado para graficar los datos, ya que, con el modelo gaussiano solo era permitido un rango máximo de 200 datos.

Después de realizar el variograma, fue posible graficar el mapa del amazonas, que se muestra a continuación, con los datos de precipitacion por interpolación con el método de kriging. Al igual que algunis mapas anteriores, el color marrón indica menores precipitaciones y los colores verde oscuro indican mayor precipitación en esa zona. Para este mapa también fueron usadas la totalidad de celdas raster descargadas en CHIRPS con el propósito de que la visualización del gráfico fue mas ‘suave’ y más entendible.

En este mapa, se puede ver más claramente y de forma interactiva los datos obtenidos empleando este método de interpolación.

Una forma de visualización de los datos interpolados por el método de kriging según su varianza e incertidumbre se muestra en el siguiente mapa, donde se aprecia el nivel de variación de los datos de precipitación según la zona del departamento.

Por último, en el siguiente mapa se muestran los intervalos de confianza de los datos de precipitación obtenidos después de realizar kriging. Este nivel de confianza que se muestra se valora en un 95% de confianza total.

5. Análisis de resultados

Según los dos primeros mapas obtenidos para la interpolación IDW, se puede observar que los valores indicados de precipitación son congruentes con los valores que se indican en los datos originales de CHIRPS descargados, mostrando simetría con los mapas mostrados en la descripción de los datos. En los datos representados en la gráfica, se puede ver que los puntos tienen una alta variación con respecto a la línea guía que se muestra, indicando que los valores obtenidos por la interpolación con el método IDW fue efectiva en algunas zonas, pero se presentaron otras donde la variación a los datos esperados fue alta. Si el 100 % de los datos coincidieran, los puntos graficados estarían alineados con la línea punteada roja que se muestra. Adicionalmente, el valor del error medio cuadrático indica que el rango de error es muy alto, es decir que, la comparación entre los datos esperados y los datos obtenidos con la interpolación IDW tuvieron un rango de variación alto. Finalmente, con el gráfico realizado del nivel de confianza, se puede observar que la mayoría de los datos están en un intervalo de confianza muy alto, es decir, que el error es muy bajo, indicando que, aunque se presentaron algunos errores, en general los resultados de la interpolación fueron muy satisfactorios. Aunque en los dos primeros mapas parecieran no tener muchas variaciones con respecto al original, al ver los datos puestos en una tabla y comparados segun su nivel de error se puede comprobar que los datos varían bastante con respecto a los datos esperados.

En la interpolación mediante el método de polígonos Thiessen, se puede observar que se empiezan a presentar variaciones en los datos con respecto a la interpolación de IDW. Aunque, al comparar visualmente los datos que tiene cada uno de los polígonos del primer mapa y los datos de cada celda de los datos esperados, se puede ver cierta similitud, sin embargo, hay algunas pequeñas zonas que no coinciden del todo con los datos esperados. Se puede decir que es un método muy acertado pero, considerar algun otro método de comparación de los datos sería mucho más concluyente. No obstante, los datos del segundo gráfico son mucho más acertados si se observan los datos por cada celda, adicionalmente, los mapas interactivos al tener la opción de poder ver los datos más de cerca, se puede realizar una comparación más específica dependiendo de la zona del departamento. Sin embargo, al usar el método de interpolación con polígonos thiessen no es tan simple comparar los resultados gráficos con solo los mapas, sería muy gratificante poder tener otro método de comparación de los datos como gráficas para tener una conclusión certera de los datos.

Por último, en el variograma al usar el método exponencial, para la interpolación de kriging, se indicó al inicio de la gráfica que la función era creciente y simétrica con la línea exponencial, pero, después de una distancia de aproximadamente 150000 metros los puntos cambian su semivarianza constantemente aumentando y disminuyendo sin obtener datos concluyentes al método exponencial usado. Sin embargo, si se observa la continuidad de los puntos, se puede ver cierta homogeneidad de la gráfica donde se tiende a ver los puntos con ciertas formas parabólicas, indicando la relación de los datos segun la semivarianza. De igual forma, con respecto a los mapas se puede observar que los datos graficados fueron concluyentes y muy exactos en comparación con los datos de precipitación esperados, asimismo, el mapa de varianza mostró un intervalo bajo de variabilidad de los datos, es decir que efectivamente, los datos de la interpolación fueron congruentes. Por otro lado, el último mapa el cual indica el nivel de confianza de los datos obtenidos no mostró datos tan satisfactorios con un nivel de confianza en un rango medio en gran parte del mapa, y en los bordes del mapa se puede ver que los niveles de variación en los datos van de 6 a 8 mm. Dado esto, se puede decir que aunque los datos se acercaron a los esperados, este método no es totalmente certero en la aproximación de los datos.

6. Conclusiones

  • El amazonas es una zona con variación climática media de la precipitación, debido a sus niveles de humedad y a su gran zona boscosa, presentando alteraciones desde 20 mm hasta 70 mm de precipitación en solo 5 días.

  • En comparación con los tres métodos estudiados, el que tuvo más datos concluyentes, exactos y precisos fue el método de kriging. Aunque la variación de algunos datos fue de 6 a 8 mm los datos fueron más acertados y, adicionalmente, el variograma y los diferentes mapas realizados daban una mayor idea de qué tan similares fueron los datos en comparación con los originales.

  • Según lo anterior se concluye que las técnicas de interpolación geoestadísticas son mucho más precisas y certeras en comparación con las técnicas deterministas.

  • El método que brindó menor información en los datos fue el método de los polígonos de Thiessen debido a que el hecho de comparar la efectividad es muy subjetiva si no se tiene un gráfico adicional que brinde la información precisa acerca de cuáles son las variaciones en comparación con los datos reales.

  • Aunque en el método de IDW se observó que hubo alta variación en los datos al observar el gráfico y el resultado del error medio cuadrático fue alto, se puede decir que el nivel de confianza de los datos obtenidos fue bastante satisfactorio en gran parte del departamento.

  • La interpolación espacial es una técnica muy útil que brinda resultados en general muy precisos, evitando trabajos en campo de zonas muy grandes que cuestan mucho dinero y tiempo.

  • Con los resultados obtenidos al emplear los tres métodos, se pudo observar que en general los datos fueron muy precisos en especial en la zona central del departamento del amazonas presentando los menores niveles de variabilidad.

7. Referencias

1 Esri. ArcGIS Desktop. 2016. Understanding interpolation analysis.

2 Planet Botany UWC. What is a spatial interpolation?.

3 Planet Botany UWC. Why interpolate?.

4 Gobernación del amazonas. Nuestro departamento.

5 Instituto SINCHI. Sistema de Información Ambiental Territorial de la Amazonía Colombiana. Clima.

6 Climate Hazard Center. CHIRPS: Rainfall Estimates from Rain Gauge and Satellite Observations. University of California, Santa Bárbara.

7 Planet Botany UWC. Inverse Distance Weighting (IDW).

8 Esri. ArcGIS Desktop. 2016. IDW

9 Esri. ArcGIS Desktop. 2016. How IDW works

10 Planet Botany UWC.Spatial analysis of categorical data using Neigbourhood Analysis (e.g. generation of soil maps).

11 Planet Botany UWC.Statistical techniques using a semi-variogram for developing continuous surface models (Kriging).

12 Planet Botany UWC. How kriging works

13 R for Spatial Statistics. Colorado State University, Oregon State University, and Humboldt State University. R Variograms & Kriging.

Olaya, V,. 2014. Sistemas de información Geografica. Creative commons.Pp 311-336.

LS0tDQp0aXRsZTogIkludGVycG9sYWNpw7NuIGVzcGFjaWFsIGNvbiBkYXRvcyBkZSBwcmVjaXBpdGFjacOzbiBDSElSUFMgZW4gZWwgYW1hem9uYXMiDQphdXRob3I6ICJQYXVsYSBKdWxpYW5hIFZpcmfDvGV6IEfDs21leiINCmRhdGU6ICIyNC9KdW5pby8yMDIwIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQojIyAxLiBJbnRyb2R1Y2Npw7NuDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkVsIGFuw6FsaXNpcyBlc3BhY2lhbCBlcyB1bmEgdMOpY25pY2EgYW1wbGlhbWVudGUgdXNhZGEgZW4gdG9wb2dyYWbDrWEgeSBnZW9ncmFmw61hIGxhIGN1YWwgY29uc2lzdGUgZW4gbGEgcmVjb3BpbGFjacOzbiBkZSBpbmZvcm1hY2nDs24gZW4gdW4gcHVudG8gZGUgbXVlc3RyZW8gZXNwZWPDrWZpY28sIGVzdG8gcGVybWl0aWVuZG8gbGEgbW9kZWxhY2nDs24gbyBpbnRlcnBvbGFjacOzbiBkZSBkYXRvcyBwdW50dWFsZXMgcGFyYSB2b2x2ZXJsb3MgZGF0b3MgY29udGludW9zLCBhZGljaW9uYWxtZW50ZSwgcGFyYSBlc3RlIHByb2Nlc28gc2Ugc3VlbGUgdXNhciBlbCBTaXN0ZW1hIGRlIEluZm9ybWFjacOzbiBHZW9ncsOhZmljYSBTSUcgZWwgY3VhbCBwcm9wb3JjaW9uYSBoZXJyYW1pZW50YXMgZGUgYW7DoWxpc2lzIGVzcGFjaWFsIHBhcmEgY2FsY3VsYXIgZXN0YWTDrXN0aWNhcyBlbiBlbCBnZW9wcm9jZXNhbWllbnRvIGRlIGRhdG9zIHBvciBtZWRpbyBkZSBjZWxkYXMgZW4gdW4gcmFzdGVyLg0KTGEgaW50ZXJwb2xhY2nDs24gZXNwYWNpYWwgc2UgcmVmaWVyZSBwcmluY2lwYWxtZW50ZSBhbCB1c28gZGUgcHVudG9zIGNvbiB2YWxvcmVzIGN1YW50aXRhdGl2b3MgZGFkb3MsIGNvbiBsb3MgY3VhbGVzIHNlIGVzdGltYSBlbCB2YWxvciBkZSBvdHJvcyBkYXRvcyBxdWUgc29uIGRlc2Nvbm9jaWRvcy4gRXMgZGVjaXIsIGVzIGVsIHBhc28gZGUgbWVkaWNpb25lcyBwdW50dWFsZXMgYSByZXByZXNlbnRhY2lvbmVzIGNvbnRpbnVhcyBkZSB2YXJpYWJsZXMgcXVlIGV4cHJlc2FuIHByb3BpZWRhZGVzIGNvbnRpbnVhcyBkZSBsYSBuYXR1cmFsZXphLiBVc3VhbG1lbnRlLCBlcyB1c2FkYSBwYXJhIG1lZGljaW9uZXMgZGUgbGEgcHJlY2lwaXRhY2nDs24sIGVsIHBILCBodW1lZGFkIGRlIHN1ZWxvLCBjb25jZW50cmFjacOzbiBxdcOtbWljYSBlbiBlbCBzdWVsbywgZXRjLiBFc3RlIG3DqXRvZG8gIHRhbWJpw6luICBhYmFyY2EgIHZhcmlvcyAgdGlwb3MgIGRlICBpbnRlcnBvbGFjacOzbiAgY29tbyAgc29uOg0KPGRpdi8+DQoNCi0JRGlzdGFuY2lhIEludmVyc2EgUG9uZGVyYWRhIChJRFcpDQotCVJlZCBJcnJlZ3VsYXIgVHJpYW5ndWxhZGEgKFRJTikNCi0JS3JpZ2luZw0KLQlQb2zDrWdvbm9zIFRoaWVzc2VuDQotCU5hdHVyYWwgTmVpZ2hib3VyaG9vZCBJbnRlcnBvbGF0aW9uIChOTikNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQpMYSBpbnRlcnBvbGFjacOzbiBlc3BhY2lhbCB0YW1iacOpbiB0aWVuZSBjb21vIHByb3DDs3NpdG8gc2VyIHVuYSBvcGNpw7NuIHZpYWJsZSBwYXJhIGxvcyBvYmpldG9zIHF1ZSBlc3TDoW4gZGlzdHJpYnVpZG9zIGVuIGVsIGVzcGFjaW8geSBxdWUgdGllbmVuIHJlbGFjacOzbiBtdXR1YS5eWzFdKGh0dHBzOi8vZGVza3RvcC5hcmNnaXMuY29tL2VzL2FyY21hcC8xMC4zL3Rvb2xzL3NwYXRpYWwtYW5hbHlzdC10b29sYm94L3VuZGVyc3RhbmRpbmctaW50ZXJwb2xhdGlvbi1hbmFseXNpcy5odG0pXiBFcyBkZWNpciwgcXVlIGRlcGVuZGllbmRvIGRlIGxvcyBwdW50b3MgZGUgbG9zIGRhdG9zIG11ZXN0cmEgc2UgcHVlZGUgZGV0ZXJtaW5hciBlbCB2YWxvciBkZSBwdW50b3MgY2VyY2Fub3MgYSBlc3RlLiBFbiBvdHJhcyBwYWxhYnJhcywgbG8gcXVlIHNlIHJlYWxpemEgZXMgbGEgcHJlZGljY2nDs24gZGUgdmFsb3JlcyBwYXJhIGNlbGRhcyBlbiB1biByYXN0ZXIgYSBwYXJ0aXIgZGUgdmFsb3JlcyBkZSBwdW50b3MgbXVlc3RyYS4gDQpBdW5xdWUgZXN0ZSBtw6l0b2RvIG5vIGhhIHNpZG8gY29uc2lkZXJhZG8gMTAwJSBjb25maWFibGUsIHlhIHF1ZSwgbGEgaW5mb3JtYWNpw7NuIGRlIGxvcyBwdW50b3MgbXVlc3RyYSwgZXMgZGVjaXIsIGxvcyBkYXRvcyBvcmlnaW5hbGVzLCBwdWVkZW4gdGVuZGVyIGEgZGVncmFkYXJzZSBhbCBicmluZGFyIGRhdG9zIGEgb3RyYXMgY2VsZGFzIHBvciBlbCBuaXZlbCBkZSBwcm9iYWJpbGlkYWQgcXVlIGVzdGUgcHVlZGUgbGxlZ2FyIGEgYWx6YW56YXIsIGRlIGlndWFsIGZvcm1hLCBlc3RvIHRhbWJpw6luIGRlcGVuZGUgZGUgbGEgZGlzdGFuY2lhIGEgbGEgcXVlIHNlIHJlYWxpemEgZXNhIHByZWRpY2Npw7NuIGRlIGxvcyB2YWxvcmVzIHBhcmEgc2FiZXIgdW5hIGFwcm94aW1hY2nDs24gY29uIHVuYSBhbHRhIGNvbmZpYW56YSBkZWwgZGF0by5eWzJdKGh0dHA6Ly9wbGFuZXQuYm90YW55LnV3Yy5hYy56YS9uaXNsL0dJUy9zcGF0aWFsL2NoYXBfMV8xMS5odG0pXg0KVW5hIGRlIGxhcyBwcmluY2lwYWxlcyByYXpvbmVzIHBvciBsYXMgY3VhbGVzIGVsIG3DqXRvZG8gZGUgaW50ZXJwb2xhY2nDs24gZXNwYWNpYWwgaGEgc2lkbyB0YW4gdXNhZG8geSBwcsOhY3RpY28gZXMgcG9yIGxvcyBuaXZlbGVzIGRlIGRpZmljdWx0YWQgcXVlIHNlIHB1ZWRlbiBwcmVzZW50YXIgYWwgcmVhbGl6YXIgZXN0dWRpb3MgZGUgdmFyaWFibGVzIGNvbW8gZWwgcEggZGVsIHN1ZWxvLCB5YSBxdWUsIHNlIG5lY2VzaXRhcsOtYSBkZSBtdWNobyBkaW5lcm8geSB0YW1iacOpbiBkZSBwZXJzb25hcyBwYXJhIHJlYWxpemFyIHVuIGVzdHVkaW8gZGV0YWxsYWRvIGRlLCBwb3IgZWplbXBsbywgdG9kYSBsYSBzdXBlcmZpY2llIGRlbCBzdWVsbyBkZSB1biBwYcOtcy4gRW4gY2FtYmlvLCBjb24gZWwgdXNvIGRlIGxhIGludGVycG9sYWNpw7NuLCBubyBlcyBuZWNlc2FyaW8gdGVuZXIgdGFudG9zIGVzdHVkaW9zIGVuIHVuYSB6b25hIHBhcmEgaGFjZXIgdW5hIGRldGVybWluYWNpw7NuIGFwcm94aW1hZGEgZGUgbG9zIHZhbG9yZXMgcXVlIHB1ZWRlbiB0ZW5lciBwdW50b3Mgc2luIHByZXNlbmNpYSBkZSBkYXRvcy5Qb3Igw7psdGltbywgcGVybyBubyBtZW5vcyBpbXBvcnRhbnRlLCBwYXJhIGxhIGdlbmVyYWNpw7NuIGRlIHN1cGVyZmljaWVzIHJhc3RlciBleGlzdGVuIGRvcyBtw6l0b2RvcyBnZW5lcmFsZXM6IGVsIHVzbyBkZSB0w6ljbmljYXMgZGV0ZXJtaW5pc3RhcyB5IHTDqWNuaWNhcyBlc3RhZMOtc3RpY2FzIChnZW9lc3RhZMOtc3RpY2FzKS4gTGFzIHTDqWNuaWNhcyBkZXRlcm1pbmlzdGFzIHNlIGJhc2FuIGVuIGVsIHVzbyBkZSB1bmEgZnVuY2nDs24gbWF0ZW3DoXRpY2EgcGFyYSBwb2RlciBjb25vY2VyIHZhbG9yZXMgZGVzY29ub2NpZG9zIHkgYWRpY2lvbmFsbWVudGUgZGFyIGVsIHZhbG9yIGRlIGVzdGFzIGNhcmFjdGVyw61zdGljYXMuIFBvciBvdHJvIGxhZG8sIGxhcyB0w6ljbmljYXMgZXN0YWTDrXN0aWNhcyBvIGdlb2VzdGFkw61zdGljYXMsIHByb2R1Y2VuIGzDrW1pdGVzIGRlIGNvbmZpYW56YSBwYXJhIGxhIHByZWNpc2nDs24gZGUgdW5hIHByZWRpY2Npw7NuLCBhdW5xdWUgc29uIHVuIHBvY28gbcOhcyBkaWbDrWNpbGVzIGRlIGVqZWN1dGFyIGVzIG5lY2VzYXJpbyBwYXJhIHBvZGVyIG9idGVuZXIgdW4gbWF5b3IgbnVtZXJvIGRlIHBhcsOhbWV0cm9zLl5bM10oaHR0cDovL3BsYW5ldC5ib3RhbnkudXdjLmFjLnphL25pc2wvR0lTL3NwYXRpYWwvY2hhcF8xXzEyLmh0bSleDQoNCkVuIGVzdGUgaW5mb3JtZSwgc2UgbXVlc3RyYW4gdHJlcyBtw6l0b2RvcyBkZSBpbnRlcnBvbGFjacOzbiBlc3BhY2lhbCwgdXNhZG9zIGVuIGVsIGRlcGFydGFtZW50byBkZWwgQW1hem9uYXMgZW4gZWwgcGHDrXMgZGUgQ29sb21iaWEgY29uIGVsIHVzbyBkZSBkYXRvcyBkZSBwcmVjaXBpdGFjacOzbiBDSElSUFMgY29uIGVsIG9iamV0aXZvIGRlIGJyaW5kYXIgbGEgaW5mb3JtYWNpw7NuIG5lY2VzYXJpYSBwYXJhIGxhIGNvbXByZW5zacOzbiBkZSBsb3MgZGlmZXJlbnRlcyBjb25jZXB0b3MgZSBpbmZvcm1hY2nDs24gcXVlIGFiYXJjYSBlbCBhbsOhbGlzaXMgZXNwYWNpYWwgeSB1bm8gZGUgc3VzIHVzb3MuIEZ1ZXJvbiBlbGVnaWRvcyBsb3MgZGF0b3MgZGUgcHJlY2lwaXRhY2nDs24geWEgcXVlIGdyw6FmaWNhbWVudGUgcHJvcG9yY2lvbmFuIGluZm9ybWFjacOzbiDDunRpbCBhIGRpZmVyZW5jaWEgZGUgbGEgaHVtZWRhZCB5IGVsZXZhY2nDs24gZGVsIHN1ZWxvLCB5YSBxdWUsIGVsIGFtYXpvbmFzIGVzIHVuIGRlcGFydGFtZW50byBjb24gdW5hIGFsdGEgeSB1bmlmb3JtZSBodW1lZGFkIHkgbGEgZWxldmFjacOzbiBkZWwgdGVycmVubyBlcyBlbiBnZW5lcmFsICBtdXkgIGJhamEgIHkgIHNpbiAgbXVjaGFzICB2YXJpYWNpb25lcywgYSBkaWZlcmVuY2lhIGRlIGxhIHByZWNpcGl0YWNpw7NuIHlhIHF1ZSBwcmVzZW50YSB2YXJpYWNpb25lcyBlbiBkaWZlcmVudGVzIHpvbmFzIGRlbCBkZXBhcnRhbWVudG8geSBlbiBkaXN0aW50YXMgw6lwb2Nhcy4NCjxkaXYvPg0KDQojIyAyLiBEZXNjcmlwY2nDs24gZGUgbGEgem9uYSBkZSBlc3R1ZGlvDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkVsIGRlcGFydGFtZW50byBkZWwgYW1hem9uYXMgZnVlIGZ1bmRhZG8gZW4gZWwgYcOxbyAxOTkxIHkgY3VlbnRhIGNvbiAyIG11bmljaXBpb3MsIFB1ZXJ0byBOYXJpw7FvIHkgTGV0aWNpYSAoc3UgY2FwaXRhbCksIHkgYWRlbcOhcywgY3VlbnRhIGNvbiA5IGNvcnJlZ2ltaWVudG9zLiBFc3RlIGRlcGFydGFtZW50byBzZSBoYSBjYXJhY3Rlcml6YWRvIHBvciBzdSBtdWx0aXZhcmllZGFkIGRlIGN1bHR1cmFzIHRhbnRvIGVuIGxhIMOpcG9jYSBkZSBsYSBjb25xdWlzdGEgY29tbyBlbiBsYXMgcXVlIHNlIG1hbnRpZW5lbiBob3kgZW4gZMOtYS4gRGUgaWd1YWwgbW9kbywgY29uIGVsIHBhc28gZGVsIHRpZW1wbyBlbCBjbGltYSBmdWUgdHJhbnNmb3Jtw6FuZG9zZSBkZSBzYWJhbmEgYSB1bm8gbXVjaG8gbcOhcyBodW1lZG8gZm9ybWFuZG8gcG9jbyBhIHBvY28gbGEgZ3JhbiBzZWx2YSBxdWUgaG95IHF1ZSBleGlzdGUgYWN0dWFsbWVudGUuIFBvciBvdHJvIGxhZG8sIGxhcyBwcmFjdGljYXMgcXVlIGVtcGxlYWJhbiBsb3MgaHVtYW5vcyBlbiBlbCB0cmFuc2N1cnNvIGRlbCB0aWVtcG8gZnVlIGV2b2x1Y2lvbmFuZG8gaGFzdGEgbGEgcGVzY2EgeSBsYSBhZ3JpY3VsdHVyYSBkZXNhcnJvbGxhbmRvIGxhIGN1bHR1cmEgZGUgbGEgc2VsdmEgdHJvcGljYWwuIEVsIGFtYXpvbmFzIGVzIGFtcGxpYW1lbnRlIHJlY29ub2NpZG8gcG9yIHNlciBsYSB6b25hIGZvcmVzdGFsIG3DoXMgZ3JhbmRlIGRlbCBtdW5kbyBxdWUgaWd1YWxtZW50ZSBlcyBjb21wYXJ0aWRhIGNvbiBsb3MgcGHDrXNlcyBkZSBWZW5lenVlbGEsIEJyYXNpbCwgRWN1YWRvciwgUGVyw7osIEd1eWFuYSwgU3VyaW5hbWUgeSBCb2xpdmlhIHBvciBlc3RhIHJhesOzbiBlcyBjb25vY2lkbyBwb3IgZWwgbm9tYnJlIGFsdGVybm8gZGVsIHB1bG3Ds24gZGVsIG11bmRvLiBFbCBkZXBhcnRhbWVudG8gZGVsIGFtYXpvbmFzIGVuIENvbG9tYmlhIGVzIGNvbnNpZGVyYWRhIGxhIHpvbmEgbcOhcyBmb3Jlc3RhbCB5LCBkZSBpZ3VhbCBtb2RvLCBlc3RlIHRlcnJlbm8gY29tcHJlbmRlIGxhcyBzZWx2YXMgdHJvcGljYWxlcyBkZSBsYSBsbGFudXJhIGFtYXrDs25pY2EgZGUgcmVsaWV2ZSBwbGFubyB5IGxhIHNhbGllbnRlIGRlbCBWYXVww6lzLCBxdWUgcG9zZWUgY29saW5hcyBkZSBwb2NhIGFsdHVyYSB5IG11eSBhbnRpZ3Vhcy4gRWwgY2xpbWEgZGVsIGRlcGFydGFtZW50byB1c3VhbG1lbnRlIGVzIGPDoWxpZG8geSBow7ptZWRvIGNvbiB1bmEgdGVtcGVyYXR1cmEgbWVkaWEgY29uc3RhbnRlIGRlIDI1LjTCsEMgeSBsYSBwcmVjaXBpdGFjacOzbiB2YXLDrWEgZW50cmUgbG9zIDI2NjAgbW0vYcOxby4gRWwgYW1hem9uYXMgdGFtYmnDqW4gZXMgY29ub2NpZG8geWEgcXVlIHBvc2VlIHBhcnRlIGRlIGxvcyBwcmluY2lwYWxlcyByw61vcyBkZSBDb2xvbWJpYSBjb21vIENhcXVldMOhLCBQdXR1bWF5bywgR3VhdmlhcmUsIEFtYXpvbmFzLCBWaWNoYWRhLCBBcGFwb3JpcywgSW7DrXJpZGEgeSBWYXVww6lzLiBQb3IgbGEgZ3JhbiBodW1lZGFkIHF1ZSBzZSBwcmVzZW50YSBlbiBlc3RlIGx1Z2FyIG5vIHNlIHBlcm1pdGUgbGEgY29uc3RydWNjacOzbiBkZSB2w61hcyB0ZXJyZXN0cmVzIGUgaWd1YWxtZW50ZSBwb3IgZWwgdGVtb3IgYWwgaW1wYWN0byBhbWJpZW50YWwuIEVsIGRlcGFydGFtZW50byBkZWwgYW1hem9uYXMgZXMgZWwgbcOhcyBncmFuZGUgZGUgQ29sb21iaWEgb2N1cGFuZG8gMTA5NjY1a20yIGRlIGV4dGVuc2nDs24gdGVycml0b3JpYWwgZGVsIHBhw61zLCBhZGVtw6FzLCBzdSBwb2JsYWNpw7NuIGN1ZW50YSBjb24gbcOhcyBkZSA3NjAwMCBoYWJpdGFudGVzIHBvciBlc3R1ZGlvcyB0b21hZG9zIGVuIGVsIDIwMTgsIHkgY3VlbnRhIGNvbiBwYcOtc2VzIHZlY2lub3MgY29tbyBCcmFzaWwgeSBQZXLDuiBicmluZGFuZG8gdW5hIGdyYW4gcmlxdWV6YSBjdWx0dXJhbC4gQWRpY2lvbmFsbWVudGUsIHRhbWJpw6luIGxpbWl0YSBjb24gbG9zIGRlcGFydGFtZW50b3MgZGUgQ2FxdWV0w6EsIHkgVmF1cMOpcy4gRWwgYW1hem9uYXMgZXN0w6Egc2l0dWFkbyBhIDAwwrAgMDfigJkgMDjigJ0gZGUgbGF0aXR1ZCBub3J0ZSwgYSAwNMKwIDEz4oCZIDE54oCdIGxhdGl0dWQgc3VyIHkgYSA3NMKwIDIz4oCZIDIx4oCdIGRlIGxvbmdpdHVkIG9lc3RlIHkgY29tcHJlbmRlIHVuYSBzdXBlcmZpY2llIHBsYW5hIGRlc2RlIGxvcyA4MCBtc25tIGVuIGNlcmNhbsOtYXMgZGUgTGV0aWNpYSwgaGFzdGEgbG9zIDMyMCBtc25tIGhhY2lhIGxhIHpvbmEgbm9ydGUgY2VyY2EgYWwgQ2FxdWV0w6EuIF5bNF0oaHR0cDovL3d3dy5hbWF6b25hcy5nb3YuY28vZGVwYXJ0YW1lbnRvL251ZXN0cm8tZGVwYXJ0YW1lbnRvKV4NClNlZ8O6biBlbCBJREVBTSwgbG9zIGRhdG9zIHJlZ2lzdHJhZG9zIGRlIGxhcyBlc3RhY2lvbmVzIG1ldGVvcm9sw7NnaWNhcywgbGEgQW1hem9uw61hIGNvbG9tYmlhbmEgcHJlc2VudGEgcHJlY2lwaXRhY2lvbmVzIGVuIHVuIHLDqWdpbWVuIG1vbm9tb2RhbCBpbmRpY2FuZG8gbG9zIHZhbG9yZXMgbcOhcyBiYWpvcyBlbiBsb3MgbWVzZXMgZGUgZGljaWVtYnJlIHkgZW5lcm8geSBsb3MgbcOheGltb3MgZW4gbWF5byB5IGp1bmlvLCBtb3N0cmFuZG8gdW5hIGRpZmVyZW5jaWEgZW4gbG9zIGRhdG9zIGRlcGVuZGllbmRvIGRlIGxhIHpvbmEgc3VyIG8gbm9ydGUgZGUgZGVwYXJ0YW1lbnRvLiBeWzVdKGh0dHA6Ly9zaWF0YWMuY28vd2ViL2d1ZXN0L2NsaW1hIzp+OnRleHQ9Q29uZm9ybWUlMjBhJTIwbG9zJTIwcmVnaXN0cm9zJTIwZGUsYW5hbGl6YW5kbyUyMGxvcyUyMGRhdG9zJTIwZW4lMjBjYWRhKV4NCjxkaXYvPg0KDQoNCiMjIDMuIERlc2NyaXBjacOzbiAgZGUgIGRhdG9zICB5ICBtw6l0b2Rvcw0KDQojIyMgKjMuMS4gRGF0b3MqDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkVuIGVzdGUgaW5mb3JtZSBmdWVyb24gZW1wbGVhZG9zIGxvcyBkYXRvcyBDbGltYXRlIEhhemFyZHMgR3JvdXAgSW5mcmFSZWQgUHJlY2lwaXRhdGlvbiB3aXRoIFN0YXRpb24gZGF0YSAoQ0hJUlBTKSBsb3MgY3VhbGVzIHNlIGJhc2FuIGVuIGRhdG9zIGRlIHByZWNpcGl0YWNpw7NuIGluZnJhcm9qbyBjb21iaW5hZG9zIGNvbiBkYXRvcyBkZSBlc3RhY2lvbmVzLCBlbGFib3JhZG9zIHBvciB1biBncnVwbyBsbGFtYWRvIEFtZW5hemFzIGNsaW3DoXRpY2FzLiBFc3RlIGdydXBvIGRlIGxhIFVuaXZlcnNpZGFkIGRlIENhbGlmb3JuaWEsIFNhbnRhIELDoXJiYXJhIHRpZW5lbiB1biBncnVwbyBkZSBkYXRvcyBkZSBwcmVjaXBpdGFjaW9uIGRlIHRvZG8gZWwgbXVuZG8gZGUgbcOhcyBkZSAzNSBhw7FvcywgZXMgZGVjaXIsIHNlIHB1ZWRlbiBhZHF1aXJpciBkYXRvcyBkZXNkZSBlbCBhw7FvIDE5ODEgaGFzdGEgZWwgYcOxbyBlbiBjdXJzbyAyMDIwLiBMYSBncmFuIG1heW9yw61hIGRlIGxvcyBkYXRvcyBzb24gYWRxdWlyaWRvcyBhIHVuYSByZXNvbHVjacOzbiBkZSAwLjA1wrAsIHNhYmllbmRvIHF1ZSBwb3IgY2FkYSBncmFkbyBoYXkgdW5hIGRpc3RhbmNpYSBkZSAxMTEuMTEga20gYXByb3hpbWFkYW1lbnRlLCBlbnRvbmNlcywgMC4wNcKwIGNvcnJlc3BvbmRlcmlhbiBhIDUuNTUga20gZGUgZGlzdGFuY2lhLiBBZGljaW9uYWxtZW50ZSwgYSBlc3RhcyBpbcOhZ2VuZXMgc2F0ZWxpdGFsZXMgdGFtYmnDqW4gc2UgaW5jb3Jwb3JhbiBkYXRvcyBkZSBlc3RhY2lvbmVzIGNsaW1hdG9sw7NnaWNhcyBkZSB0b2RvIGVsIG11bmRvIGdyYWNpYXMgYSBjb252ZW5pb3MgY29uIGxhIFVuaXZlcnNpZGFkLiBUYW1iacOpbiwgZGViaWRvIGFsIHVzbyBkZSB1biBhbGdvcml0bW8geSBsYSB1bmlvbiBkZSBlc3RvcyBkYXRvcyBzZSBjcmVhIHVuIHJhc3RlciBkZSBwcmVjaXBpdGFjaW9uLCBjb24gZWwgbW90aXZvIGRlIGFuYWxpemFyIHNlcXXDrWFzIHBvciBtZWRpbyBkZSB0ZW5kZW5jaWFzIHkgbW9uaXRvcmVvcyBlc3RhY2lvbmFsZXMuIEVzdG9zIGRhdG9zIHB1ZWRlbiBzZXIgYWRxdWlyaWRvcyBlbiBkaWZlcmVudGVzIHBlcmlvZG9zLCBjb21vIGFudWFsZXMsIG1lbnN1YWxlcywgY2FkYSBjaW5jbyBkaWFzIHkgZGlhcmlvcy4gQWwgZGVzY2FyZ2FyIGxvcyBkYXRvcyBoYXkgdHJlcyBvcGNpb25lcyBkZSBmb3JtYXRvIHJhc3RlcjogLmJpbHMsIC5uZXRjZGYgeSAudGlmLiBMb3MgZGF0b3MgZGVzY2FyZ2Fkb3MgZW4gZXN0ZSBpbmZvcm1lIGZ1ZXJvbiBlbiBmb3JtYXRvIC50aWYgZ3JhY2lhcyBhIHF1ZSBzZSB0aWVuZSBtw6FzIGZhbWlsaWFyaWRhZCBjb24gZXN0ZSB0aXBvIGRlIGZvcm1hdG9zLiBeWzZdKGh0dHBzOi8vd3d3LmNoYy51Y3NiLmVkdS9kYXRhL2NoaXJwcyleDQpFbiBlc3RlIGluZm9ybWUgZnVlcm9uIHVzYWRvcyBsb3MgZGF0b3MgZGUgcHJlY2lwaXRhY2nDs24gZGUgbG9zIMO6bHRpbW9zIGNpbmNvIGTDrWFzIGRlbCBtZXMgZGUgYWJyaWwgZGUgZXN0ZSBhw7FvLCBxdWUgZnVlcm9uIHB1YmxpY2Fkb3MgZWwgMTggZGUgbWF5by4gQWwgY2FyZ2FyIGxvcyBkYXRvcyBzZSBvYnR1dm8gaW5mb3JtYWNpw7NuIGRlbCBhcmNoaXZvIGNvbW8gbGEgc2lndWllbnRlOg0KPGRpdi8+DQpgYGB7ciBlY2hvPUZBTFNFfQ0KcHJlY2lwaXRhY2lvbmZpbGUgPC0gcmFzdGVyKCJDOi9Vc2Vycy9wYXVsYS9EZXNrdG9wL0dlb21hdGljYS9JbmZvcm1lX2ZpbmFsL2NoaXJwcy12Mi4wLjIwMjAuMDQuNi50aWYiKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcHJlY2lwaXRhY2lvbg0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KRXN0byBpbmRpY2EgcXVlIGxhIGNsYXNlIGRlbCBhcmNoaXZvIGNhcmdhZG8gZXMgcmFzdGVyLCB5IHF1ZSB0aWVuZSA5ZSswNSBjZWxkYXMsIGVzIGRlY2lyIHF1ZSBlbCBuw7ptZXJvIGRlIGNlbGRhcyBlcyBkZSA5MDAwMDAsIGRlIGlndWFsIGZvcm1hLCBsYXMgZmlsYXMgc29uIGVuIHRvdGFsIDUwMCB5IGxhcyBjb2x1bW5hcyBzb24gMTgwMCB5IGxvcyBkYXRvcyBzZSBlbmN1ZW50cmFuIGVuIGNvb3JkZW5hZGFzIGdlb2dyw6FmaWNhcy4gRW4gZXN0ZSBjYXNvLCBsYXMgY2VsZGFzIHRpZW5lbiB1bmEgcmVzb2x1Y2nDs24gZGUgMC4ywrAsIHVuIHBvY28gbWVub3MgZGUgbG8gbWVuY2lvbmFkbyBhbnRlcmlvcm1lbnRlICgwLjA1wrApIGRlYmlkbyBhIHF1ZSBmdWUgcmVhbGl6YWRvIHVuIHByb2Nlc28gYWRpY2lvbmFsIGVuIGVsIHBsb3RlbyBkZSBsb3MgbWFwYXMsIHlhIHF1ZSwgZWwgbsO6bWVybyBkZSBjZWxkYXMgcXVlIGhhYmlhIGVyYSBtdXkgYWx0bywgZW50b25jZXMsIGZ1ZSB1c2FkYSBsYSBmdW5jacOzbiAqYWdncmVnYXRlKiBkZWwgcGFxdWV0ZSByYXN0ZXIgcGFyYSByZWFsaXphciBlbCBjYW1iaW8gZGUgdGFtYcOxby4gQSBjb250aW51YWNpw7NuLCBzZSBtdWVzdHJhIGVsIG1hcGEgZGVsIGFtYXpvbmFzIGNvbiBsYXMgY2VsZGFzIGRlIGxvcyBkYXRvcyBkZSBwcmVjaXBpdGFjacOzbiBncmFmaWNhZG9zIGVuIHVuIG1hcGEgaW50ZXJhY3Rpdm8sIHBlcm8gY29uIGxhIHJlc29sdWNpw7NuIG9yaWdpbmFsIGRlIDAuMDXCsDoNCjxkaXYvPg0KYGBge3IgZWNobz1GQUxTRX0NCihhbXogPC0gc2hhcGVmaWxlKCJDOi9Vc2Vycy9wYXVsYS9EZXNrdG9wL0dlb21hdGljYS9EYXRvc19kZSBfZWxldmFjaW9uX2VuX1IvQW1hem9uYXNfZGF0b3NfREFORS85MV9BTUFaT05BUy9BRE1JTklTVFJBVElWTy9NR05fTVBJT19QT0xJVElDTy5zaHAiKSkgDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpwcmVjaXBpdGFjaW9uIDwtYWdncmVnYXRlKHByZWNpcGl0YWNpb25maWxlLCBmYWN0PTQsIGZ1bj1tZWFuKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcHJlY2lwaXRhY2lvbg0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcHJlY2lwLmNyb3AgPC0gcmFzdGVyOjpjcm9wKHByZWNpcGl0YWNpb24sIGV4dGVudChhbXopKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcHJlY2lwLm1hc2sgPC0gbWFzayh4ID0gcHJlY2lwLmNyb3AsIG1hc2sgPSBhbXopDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpwcmVjaXAubWFzaw0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcGxvdChwcmVjaXAubWFzaywgbWFpbj0gIkRhdG9zIENISVJQUyBwcmVjaXBpdGFjacOzbiBlbiBhbWF6b25hcyBkZWwgMjYvYWJyaWwgYWwgMzAvYWJyaWwgMjAyMCIsIGNvbCA9IGJyZXdlci5wYWwobiA9IDksIG5hbWUgPSAiWWxHbkJ1IikpDQpwbG90KGFteiwgYWRkPVRSVUUpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpwYWwgPC0gY29sb3JOdW1lcmljKGMoImFsaWNlYmx1ZSIsICJkYXJrc2VhZ3JlZW4xIiwgInNlYWdyZWVuMyIsInR1cnF1b2lzZTQiLCAiY2FkZXRibHVlIiksIHZhbHVlcyhwcmVjaXAyLm1hc2spLA0KICAgICAgICAgICAgICAgICAgICAgbmEuY29sb3IgPSAidHJhbnNwYXJlbnQiKQ0KDQpsZWFmbGV0KCkgJT4lIGFkZFRpbGVzKCkgJT4lIA0KICBhZGRSYXN0ZXJJbWFnZShwcmVjaXAubWFzaywgY29sb3JzID0gcGFsLCBvcGFjaXR5ID0gMC42KSAlPiUgDQogIGFkZExlZ2VuZChwYWwgPSBwYWwsIHZhbHVlcyA9IHZhbHVlcyhwcmVjaXAubWFzayksDQogICAgICAgICAgICB0aXRsZSA9ICJDSElSUFMgcHJlY2lwaXRhY2nDs24gZW4gZWwgYW1hem9uYXMgMjAyMCBbbW1dIikNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkVuIGxhIG9idGVuY2nDs24gZGUgbG9zIHB1bnRvcyBwYXJhIGxhIGludGVycG9sYWNpw7NuIGVuIGVzdGUgaW5mb3JtZSwgc2UgcGFzYXJvbiBsb3MgZGF0b3MgcmFzdGVyIGEgcHVudG9zLCBsbyBjdWFsIHBlcm1pdGnDsyBxdWUgc2Ugb2J0dXZpZXJhbiBsb3MgcHVudG9zIGRlbCBjZW50cm8gZGUgY2FkYSB1bmEgZGUgbGFzIGNlbGRhcyBxdWUgY29ycmVzcG9uZGVuIGEgbGEgcHJlY2lwaXRhY2nDs24gZGVsIGRlcGFydGFtZW50byBkZWwgYW1hem9uYXMuRW4gZWwgc2lndWllbnRlIG1hcGEgc2UgcHVlZGUgb2JzZXJ2YXIgbGEgcmVwcmVzZW50YWNpw7NuIGdyw6FmaWNhIGRlIGxvcyBwdW50b3MgZW4gY2FkYSBjZWxkYSByZXByZXNlbnRhZG9zIGVuIGNvbG9yIGNvcmFsLA0KPGRpdi8+DQpgYGB7ciBlY2hvPUZBTFNFfQ0KcHJlY2lwLnBvaW50cyA8LSByYXN0ZXJUb1BvaW50cyhwcmVjaXAubWFzaywgc3BhdGlhbCA9IFRSVUUpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpwcmVjaXAucG9pbnRzDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpuYW1lcyhwcmVjaXAucG9pbnRzKSA8LSAicmFpbiINCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCnByZWNpcC5wb2ludHMNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCnN0cihwcmVjaXAucG9pbnRzKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcGxvdChwcmVjaXAubWFzaywgbWFpbj0gIlByZWNpcGl0YWNpw7NuIGFtYXpvbmFzIGRlc2RlIDI2LjAzIGFsIDMwLjA0IGVuIDIwMjAgKG1tKSIsIGNvbCA9IGJyZXdlci5wYWwobiA9IDksIG5hbWUgPSAiWWxHbkJ1IikpDQpwbG90KGFteiwgYWRkPVRSVUUpDQpwb2ludHMocHJlY2lwLnBvaW50cyR4LCBwcmVjaXAucG9pbnRzJHksIGNvbCA9ICJjb3JhbCIsIGNleCA9IC42KQ0KYGBgDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkRlIGlndWFsIGZvcm1hLCBvdHJvIHJlcHJlc2VudGFjacOzbiBtw6FzIGRlIGxhIHByZWNpcGl0YWNpw7NuIGVuIGVzdGEgem9uYSBwdWVkZSBzZXIgZWwgc2lndWllbnRlIG1hcGEgeWEgcXVlIHNlIHB1ZWRlbiB2ZXIgZGlyZWN0YW1lbnRlIGxvcyBkYXRvcyBkZSBwcmVjaXBpdGFjacOzbiBlbiBtbSBlbiBjYWRhIHB1bnRvLCBhc2ltaXNtbywgZW50cmUgbcOhcyBhenVsIGVzIGVsIHB1bnRvIHJlcHJlc2VudGFkbywgZXMgbWF5b3IgZWwgbml2ZWwgZGUgcHJlY2lwaXRhY2nDs246DQo8ZGl2Lz4NCmBgYHtyIGVjaG89RkFMU0V9DQpnZW9qc29uaW86Omdlb2pzb25fd3JpdGUocHJlY2lwLnBvaW50cywgZmlsZSA9ICJDOi9Vc2Vycy9wYXVsYS9EZXNrdG9wL0dlb21hdGljYS9JbmZvcm1lX2ZpbmFsL3Bwb2ludHMuZ2VvanNvbiIsIHdoYXQ9InNwIikNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCnByZWNpcC5wb2ludHMgPC0gZ2VvanNvbmlvOjpnZW9qc29uX3JlYWQoIkM6L1VzZXJzL3BhdWxhL0Rlc2t0b3AvR2VvbWF0aWNhL0luZm9ybWVfZmluYWwvcHBvaW50cy5nZW9qc29uIiwgd2hhdD0ic3AiKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcHJlY2lwLnBvaW50cw0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KKGFteiA8LSBzaGFwZWZpbGUoIkM6L1VzZXJzL3BhdWxhL0Rlc2t0b3AvR2VvbWF0aWNhL0RhdG9zX2RlIF9lbGV2YWNpb25fZW5fUi9BbWF6b25hc19kYXRvc19EQU5FLzkxX0FNQVpPTkFTL0FETUlOSVNUUkFUSVZPL01HTl9NUElPX1BPTElUSUNPLnNocCIpKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KYW1hem9uYXNfc2YgPC0gc2Y6OnN0X2FzX3NmKGFteikNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCihib3JkZXJfc2YgPC0gDQogICBhbWF6b25hc19zZiAlPiUgDQogICBzdW1tYXJpc2UoYXJlYSA9IHN1bShNUElPX05BUkVBKSkpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQooYm9yZGVyIDwtIGFzKGJvcmRlcl9zZiwgJ1NwYXRpYWwnKSkNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCihhbWF6b25hcy5zZiA8LSBzdF9hc19zZihhbXopICU+JSBtdXRhdGUoTVVOSUMgPSBNUElPX0NOTUJSLCBDT0RJR08gPSBNUElPX0NDREdPKSAlPiUgZHBseXI6OnNlbGVjdChNVU5JQywgQ09ESUdPKSkNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCnAuc2YgPC0gc3RfYXNfc2YocHJlY2lwLnBvaW50cykNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCihwcmVjaXAuc2YgPSBzdF9pbnRlcnNlY3Rpb24oYW1hem9uYXMuc2YsIHAuc2YpKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcC5zZi5tYWduYSA8LSBzdF90cmFuc2Zvcm0ocHJlY2lwLnNmLCBjcnMgPSAzMTE2KQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KYW1hem9uYXMuc2YubWFnbmEgPC0gc3RfdHJhbnNmb3JtKGFtYXpvbmFzLnNmLCBjcnMgPSAzMTE2KQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KKHByZWNpcDIgPC0gYXMocC5zZi5tYWduYSwgJ1NwYXRpYWwnKSkNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCnNoYXBlZmlsZShwcmVjaXAyLCBmaWxlbmFtZT0gJ0M6L1VzZXJzL3BhdWxhL0Rlc2t0b3AvR2VvbWF0aWNhL0luZm9ybWVfZmluYWwvcHJlY2lwMi5zaHAnLCBvdmVyd3JpdGUgPSBUUlVFKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcHJlY2lwMiRyYWluZmFsbCA8LSByb3VuZChwcmVjaXAyJHJhaW4sIDEpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpwcmVjaXAyDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQooYW1hem9uYXMyIDwtIGFzKGFtYXpvbmFzLnNmLm1hZ25hLCAnU3BhdGlhbCcpKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KKHNoYXBlZmlsZShhbWF6b25hczIsIGZpbGVuYW1lPSAnQzovVXNlcnMvcGF1bGEvRGVza3RvcC9HZW9tYXRpY2EvSW5mb3JtZV9maW5hbC9hbWF6b25hczIuc2hwJywgb3ZlcndyaXRlID0gVFJVRSkpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpwcmVjaXAyQGJib3ggPC0gYW1hem9uYXMyQGJib3gNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCnRtX3NoYXBlKGFtYXpvbmFzMikgKyB0bV9wb2x5Z29ucygpICsNCiAgdG1fc2hhcGUocHJlY2lwMikgKyANCiAgdG1fZG90cyhjb2wgPSAicmFpbmZhbGwiLCBwYWxldHRlID0gIlJkQnUiLCBtaWRwb2ludCA9IDIuMCwNCiAgICAgICAgICB0aXRsZSA9ICJQcmVjaXBpdGFjaW9uIGRlbCBhbWF6b25hc1xuKGVuIG1tKSIsIHNpemUgPSAwLjIpICsgDQogIHRtX3RleHQoInJhaW5mYWxsIiwganVzdCA9ICJjZW50ZXIiLCB4bW9kPSAuNCwgc2l6ZSA9IDAuNCkgKyANCiAgdG1fbGVnZW5kKGxlZ2VuZC5vdXRzaWRlPVRSVUUpDQpgYGANCg0KIyMjICozLjIuIE3DqXRvZG9zKg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQpFbiBlc3RlIGluZm9ybWUgZnVlcm9uIHVzYWRvcyB0cmVzIG3DqXRvZG9zIGRlIGludGVycG9sYWNpw7NuLCBsb3MgY3VhbGVzIGZ1ZXJvbiBJRFcsIHBvbMOtZ29ub3MgZGUgVGhpZXNzZW4geSBwb3Igw7psdGltbyBlbCBtw6l0b2RvIGRlIEtyaWdpbmcuDQoNCg0KLSBJRFcNCg0KSW52ZXJzZSBEaXN0YW5jZSBXZWlnaHRlZCBJbnRlcnBvbGF0aW9uIG8gc2Vnw7puIHN1cyBzaWdsYXMgZW4gaW5nbMOpcyBJRFcsIHNlIHJlZmllcmUgYSBsYSBwb25kZXJhY2nDs24gYmFzYWRhIGVuIGVsIGludmVyc28gZGUgbGEgZGlzdGFuY2lhLiBFc3RlIG3DqXRvZG8gZGV0ZXJtaW5pc3RpY28gZGVmaW5lIHVuYSByZWdpw7NuIGNlcmNhIGEgbGEgem9uYSBkZSBpbnRlcsOpcyBkb25kZSBzZSBxdWllcmVuIHRlbmVyIHZhbG9yZXMgaW50ZXJwb2xhZG9zIHBvciBtZWRpbyBkZSB1biByYWRpbyBkZSBidXNxdWVkYSwgc2kgbG8gZGF0b3MgZXN0w6FuIG11Y2hvIG3DoXMgYWxlamFkb3MgZGUgZXNlIHJhZGlvIGRlIGJ1c3F1ZWRhIHNlIGNvbnNpZGVyYSBxdWUgbGEgaW5mbHVlbmNpYSBkZSBlc3RvcyBlcyBtZW5vciwgZXMgZGVjaXIsIHF1ZSBsYSBjb25maWFiaWxpZGFkIGRpc21pbnV5ZSBlbiByZWxhY2nDs24gY29uIGVsIGF1bWVudG8gZGUgbGEgZGlzdGFuY2lhLiBQYXJhIGhhbGxhciBsYSBlc3RpbWFjacOzbiBkZSBsbyB2YWxvcmVzIGEgaW50ZXJwb2xhciBzZSByZWFsaXphbiBwcm9tZWRpb3MgZGUgbG9zIHZhbG9yZXMgbXVlc3RyYSBlbiBsYSBsYXMgY2VsZGFzIHZlY2luYXMgYSBsYXMgY2VsZGFzIGRlIHByb2Nlc2FtaWVudG8sIGVzdG8sIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBkaXN0YW5jaWEgZGVsIHB1bnRvIGFsIGNlbnRybyBkZSBsYSBjZWxkYS4gUGFyYSBlc3RlIHRpcG8gZGUgaW50ZXJwb2xhY2nDs24gZXMgdXNhZG8gdW4gYWxnb3JpdG1vIHF1ZSBlcyBhcGxpY2FkbyBhIGRhdG9zIHF1ZSB0aWVuZW4gdW5hIGFsdGEgdmFyaWFiaWxpZGFkLCBhdW5xdWUsIGxhIHN1cGVyZmljaWUgaW50ZXJwb2xhZGEgZGViZSBzZXIgbWVub3IgcXVlIGVsIHZhbG9yIG3DoXhpbW8gbG9jYWwgZGUgbGEgem9uYSB5IG1heW9yIHF1ZSBlbCBtw61uaW1vIGxvY2FsLiBFbiBvdHJhcyBwYWxhYnJhcywgZXN0ZSBtw6l0b2RvIHNlIGJhc2EgZW4gZWwgaW52ZXJzbyBkZSBsYSBkaXN0YW5jaWEsIHkgZXN0YSBkaXN0YW5jaWEgZXMgZWxldmFkYSBhIHVuYSBwb3RlbmNpYSBtYXRlbcOhdGljYTsgZXN0byBwZXJtaXRpZW5kbyBmdW5kYW1lbnRhcnNlIGVuIGxhIGRpc3RhbmNpYSBkZXNkZSBlbCBwdW50byBkZSBzYWxpZGEuIEVudHJlIG1heW9yIHNlYSBlbCB2YWxvciBkZSBsYSBwb3RlbmNpYSwgc2UgdGllbmVuIG1heW9yIMOpbmZhc2lzIGVuIGxvcyBwdW50b3MgcXVlIGVzdGFuIGEgdW5hIGRpc3RhbmNpYSBtZW5vci4gRXMgZGVjaXIsIGxvcyBkYXRvcyBtw6FzIGNlcmNhbm9zIHRpZW5lbiBtw6FzIGluZmx1ZW5jaWEgeSBsYSBzdXBlcmZpY2llIHRlbmRyw6EgbcOhcyBkZXRhbGxlcywgYXVucXVlLCBlbCB2YWxvciBtw6FzIGNvbcO6biB1c2FkbyBlbiBsYSBwb3RlbmNpYSBlcyBkZSAyLiBeWzddKGh0dHA6Ly9wbGFuZXQuYm90YW55LnV3Yy5hYy56YS9uaXNsL0dJUy9zcGF0aWFsL2NoYXBfMV8xNC5odG0pXiBeWzhdKGh0dHBzOi8vZGVza3RvcC5hcmNnaXMuY29tL2VuL2FyY21hcC8xMC4zL3Rvb2xzL3NwYXRpYWwtYW5hbHlzdC10b29sYm94L2lkdy5odG0pXg0KTGEgZm9ybXVsYSBiYXNlIHF1ZSBlcyBlbXBsZWFkYSBwYXJhIGVsIGPDoWxjdWxvIGRlbCB2YWxvciBkZWwgcHVudG8gZGUgaW50ZXLDqXMgZXMgbGEgc2lndWllbnRlOg0KDQoNCiFbXShDOi9Vc2Vycy9wYXVsYS9EZXNrdG9wL0dlb21hdGljYS9JbmZvcm1lX2ZpbmFsL2VjdWFjaW9uLnBuZykNCg0KJHpfe3B9JDogVmFsb3IgZGVsIHB1bnRvIGRlIGludGVyw6lzDQoNCiRuJDogTsO6bWVybyBkZSBwdW50b3MgcXVlIHF1ZWRhbiBkZW50cm8gZGVsIHJhZGlvIGRlIGJ1c3F1ZWRhDQoNCiR6X2kkOiBWYWxvciBkZSBjYWRhIHB1bnRvIHF1ZSBlcyBjb25vY2lkbyB5IHF1ZSBlc3TDoW4gZGVudHJvIGRlbCByYWRpbyBkZSBidXNxdWVkYQ0KDQokZF97aX1ee3B9JDogRGlzdGFuY2lhIGVudHJlIGxvcyBwdW50b3MgeSAqKiRee3B9JCoqIHNpZ25pZmljYQ0KbGENCnBvdGVuY2lhDQoNCg0KDQoNCkEgY29udGludWFjacOzbiwgc2UgbXVlc3RyYSB1bmEgaWx1c3RyYWNpw7NuIGRlbCBtw6l0b2RvIGRlIElEVyB0b21hZG8gZGUgbGEgcMOhZ2luYSAqZXNyaSogXls5XShodHRwczovL2Rlc2t0b3AuYXJjZ2lzLmNvbS9lcy9hcmNtYXAvMTAuMy90b29scy8zZC1hbmFseXN0LXRvb2xib3gvaG93LWlkdy13b3Jrcy5odG0pXg0KDQohW10oQzovVXNlcnMvcGF1bGEvRGVza3RvcC9HZW9tYXRpY2EvSW5mb3JtZV9maW5hbC9JRFcucG5nKQ0KDQoNCkRvbmRlLCBlbCBjaXJjdWxvIGFtYXJpbGxvIHJlcHJlc2VudGEgZWwgcmFkaW8gZGUgYnVzcXVlZGEsIGVsIHB1bnRvIGVuIGVsIGNlbnRybyBlcyBlbCBwdW50byBkZSBpbnRlcsOpcywgbG9zIHB1bnRvcyByb2pvcyByZXByZXNlbnRhbiBsb3MgcHVudG9zIGRlbnRybyBkZWwgcmFkaW8gZGUgYnVzcXVlZGEgeSBsb3MgcXVlIHNvbiB1c2Fkb3MgcGFyYSBkZXRlcm1pbmFyIGVsIHZhbG9yIGRlbCBwdW50byBkZSBpbnRlcsOpcywgcG9yIMO6bHRpbW8sIGxvcyBwdW50b3MgbmVncm9zIGluZGljYW4gbG9zIHB1bnRvcyBxdWUgZGViaWRvIGEgc3UgZGlzdGFuY2lhIGRlc2RlIGVsIGNlbnRybyBkZWwgcmFkaW8gZGUgYnVzcXVlZGEsICBubyAgc29uICBpbmNsdWlkb3MgIGVuICBlbCAgY8OhbGN1bG8uDQoNCg0KDQotIFBvbMOtZ29ub3MgVGhpZXNzZW4NCg0KVGFtYmnDqW4gbGxhbWFkb3MgKkRpYWdyYW1hcyBkZSBWb3Jvbm9pKiwgc2UgYmFzYW4gZW4gb3JnYW5pemFyIGVuIHBvbMOtZ29ub3MgbGFzIHpvbmFzIHF1ZSBjb250aWVuZW4gdW5hIG1heW9yIGRlbnNpZGFkIGRlIHB1bnRvcyBxdWUgZXN0w6FuIG3DoXMgY2VyY2EgcXVlIG90cm9zLCBlcyBkZWNpciwgZW4gY2FkYSBwb2zDrWdvbm8gaGF5IHVuIGNvbmp1bnRvIGRlIHB1bnRvcyBjb24gbWVub3IgZGlzdGFuY2lhIGVudHJlIGNhZGEgdW5vLCBhIGRpZmVyZW5jaWEgZGUgb3Ryb3MgcHVudG9zIG3DoXMgbGVqYW5vcy4gTm8gdG9kYXMgbGFzIHpvbmFzIGNvbiBtYXlvciBkZW5zaWRhZCBkZSBwdW50b3MgZXN0w6FuIGVuIHNpbWV0csOtYSBjb24gbGEgc3VwZXJmaWNpZSBkZSBlc3R1ZGlvIGZvcm1hbmRvIGZpZ3VyYXMgcmVjdGFuZ3VsYXJlcywgZGViaWRvIGEgcXVlLCBubyB0b2RhcyBsYXMgc3VwZXJmaWNpZXMgc29uIHBsYW5hcyBvIG5vIHRvZG9zIGxvcyBkYXRvcyBzb24gZ3JhZmljYWRvcyBkZSBmb3JtYSBpZ3VhbDsgY29uIHJlc3BlY3RvIGEgbGEgYWx0dXJhIHNlIHB1ZWRlbiBwcmVzZW50YXIgdmFyaWFjaW9uZXMgZW4gbGEgZWxldmFjacOzbiBjb21vIG1vbnRhw7FhcyBvIGNvbGluYXMgbW9zdHJhbmRvIGxvcyBkYXRvcyBlbiBwb2zDrWdvbm9zIGRlIG3DoXMgZGUgNCBsYWRvcyB5IGNvbiBkaWZlcmVudGVzIGxvbmdpdHVkZXMuIERlc3B1w6lzIGRlIHRlbmVyIGVzdG9zIHBvbMOtZ29ub3Mgc2UgY2FsY3VsYSBlbCDDoXJlYSBkZSBlc3RvcyBhc2lnbmFuZG8gdW4gcHVudG8gY2VudHJhbCBhIGNhZGEgdW5vIG1lZGlhbnRlIGludGVycG9sYWNpw7NuLiBeWzEwXShodHRwOi8vcGxhbmV0LmJvdGFueS51d2MuYWMuemEvbmlzbC9HSVMvc3BhdGlhbC9jaGFwXzFfNTMuaHRtKV4NCg0KDQotIEtyaWdpbmcNCg0KRXMgdW4gbcOpdG9kbyBnZW9lc3RhZMOtc3RpY28gcXVlIGFzdW1lIGxvcyBmZW5vbWVub3MgcXVlIG9jdXJyZW4gZW4gbGEgc3VwZXJmaWNpZSB0ZXJyZXN0cmUgeSBxdWUgdGllbmVuIHVuIGNvbXBvbmVudGUgYWxlYXRvcmlvLiBFbiBlc3RlIG3DqXRvZG8sIHNlIHRpZW5lIGVuIGN1ZW50YSBsYSByZWxhY2nDs24gZGlyZWN0YSBxdWUgZXhpc3RlIGVudHJlIGxvcyBwdW50b3MgcXVlIHNvbiBtZWRpZG9zLCBncmFjaWFzIGEgZXN0b3MgZGF0b3Mgc2UgcHVlZGVuIG9idGVuZXIgc3VwZXJmaWNpZXMgZGUgcHJlZGljY2nDs24geSB0YW1iacOpbiB1bmEgbWVqb3IgcHJlc2ljacOzbiBkZSBsYXMgcHJlZGljY2lvbmVzIGRlIGxvcyB2YWxvcmVzLkVuIGVzdGUgbcOpdG9kbyBlcyB1c2FkYSBsYSBkaXN0YW5jaWEgbyBkaXJlY2Npw7NuIGRlIGxvcyBwdW50b3MsIHBhcmEgcmVwcmVzZW50YXIgdW5hIGNvcnJlbGFjacOzbiBlc3BhY2lhbCBxdWUgZXMgdXNhZGEgcGFyYSBleHBsaWNhciBsYSB2YXJpYWNpw7NuIGRlIGxhIHN1cGVyZmljaWUgc2Vnw7puIGxhIHZhcmlhYmxlIGVtcGxlYWRhLiBFbCBLcmlnaW5nIGVtcGxlYSB2YXJpb3MgcGFzb3MsIGNvbW8gc29uLCBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGV4cGxvcmF0b3JpbyBkZSBsb3MgZGF0b3MsIG1vZGVsYWRvIGRlIHZhcmlvZ3JhbWFzLCBjcmVhY2nDs24gZGUgbGEgc3VwZXJmaWNpZSB5IGNvbW8gYWx0ZXJuYXRpdmEgb3BjaW9uYWwgbGEgZXhwbG9yYWNpw7NuIGRlIGxhIHN1cGVyZmljaWUgZGUgdmFyaWFuemEuIEVzdGUgbcOpdG9kbyBlcyBwcmluY2lwYWxtZW50ZSB1dGlsaXphZG8gY3VhbmRvIHNlIGNvbm9jZSBxdWUgaGF5IHVuYSBpbmZsdWVuY2lhIGRlIGxhIGRpc3RhbmNpYWwgY29ycmVsYWNpb25hZGEgZXNwYWNpYWxtZW50ZSBkZSBsb3MgZGF0b3MuIF5bMTFdKGh0dHA6Ly9wbGFuZXQuYm90YW55LnV3Yy5hYy56YS9uaXNsL0dJUy9zcGF0aWFsL2NoYXBfMV8zMC5odG0pXiBeWzEyXShodHRwczovL2Rlc2t0b3AuYXJjZ2lzLmNvbS9lbi9hcmNtYXAvMTAuMy90b29scy9zcGF0aWFsLWFuYWx5c3QtdG9vbGJveC9ob3cta3JpZ2luZy13b3Jrcy5odG0pXiANCg0KRWwga3JpZ2luZyB0aWVuZSBjaWVydGEgc2ltaWxpdHVkIGNvbiBlbCBtw6l0b2RvIGRlIGludGVycG9sYWNpw7NuIElEVywgeWEgcXVlLCBwb25kZXJhIGxvcyB2YWxvcmVzIG1lZGlkb3MgY2lyY3VuZGFudGVzIHBhcmEgY2FsY3VsYXIgdW5hIHByZWRpY2Npw7NuIGRlIHVuYSB6b25hIHNpbiBtZWRpY2lvbmVzLiBMYSBmb3JtdWxhIGVtcGxlYWRhIGVuIGtyaWdpbmcgZXM6DQoNCiQkXGhhdHtafShzXzApID0gXHN1bV97aT0xfV57bn1cbGFtYmRhX3tpfVooc19pKSQkDQoNCiRaKHNfaSkkOiBWYWxvciBtZWRpZG8gZW4gbGEgdWJpY2FjacOzbiAkaSQNCg0KJFxsYW1iZGFfe2l9JDogUG9uZGVyYWNpw7NuIGRlc2Nvbm9jaWRhIHBhcmEgZWwgdmFsb3IgbWVkaWRvIGVuIGxhIHViaWNhY2nDs24gJGkkDQoNCiRzXzAkOiBVYmljYWNpw7NuIGRlbCBwdW50byBkZSBpbnRlcsOpcw0KDQokbiQ6IENhbnRpZGFkIGRlIHZhbG9yZXMgbWVkaWRvcw0KDQoNCkVuIGlkdyAkXGxhbWJkYV97aX0kIGRlcGVuZGUgZGUgbGEgZGlzdGFuY2lhIGEgbGEgdWJpY2FjacOzbiBkZWwgcHVudG8gZGUgaW50ZXLDqXMuIENvbiBlc3RlIG3DqXRvZG8gZGUga3JpZ2luZywgbGFzIHBvbmRlcmFjaW9uZXMgc2UgYmFzYW4gZW4gbGEgZGlzdGFuY2lhIGVudHJlIG90cm9zIHB1bnRvcywgZW4gbGEgdWJpY2FjacOzbiBkZWwgcHVudG8gZGUgZXN0dWRpbyB5IHRhbWJpw6luIGRlIGxhIGRpc3Bvc2ljacOzbiBlbiBlbCBlc3BhY2lvIGRlIGxvcyBwdW50b3MgbWVkaWRvcy4NCg0KDQpQYXJhIGVsIG1vZGVsYWRvIGRlIHZhcmlvZ3JhbWFzIHNlIGVtcGllemEgY29uIHVuIGdyw6FmaWNvIGRlbCBzZW1pdmFyaW9ncmFtYSBlbXDDrXJpY28gZWwgY3VhbCByZXByZXNlbnRhIGxhIGRpc3RhbmNpYSBlbnRyZSBwYXJlcyBkZSBsb3MgcHVudG9zIGVuIGZ1bmNpw7NuIGRlIGxhIHNlbWl2YXJpYW56YSwgbGEgY3VhbCwgcmVwcmVzZW50YSBsYSBtZWRpZGEgZGUgbGEgZGlmZXJlbmNpYSBxdWUgZXhpc3RlIGVudHJlIGVzYXMgZGlzdGFuY2lhcy4gTG9zIHB1bnRvcyBxdWUgc2UgcmVwcmVzZW50YW4gZW4gZXN0ZSBncsOhZmljbyBkZSBzZW1pdmFyaW9ncmFtYSBzZSBkZWJlbiBhanVzdGFyIGNvbiBlbCBtb2RlbG8gZGUgdmFyaW9ncmFtYSBlbCBjdWFsIGVzIGVzZW5jaWFsIHBhcmEgcmVhbGl6YXIgbGEgaW50ZXJwb2xhY2nDs24ga3JpZ2luZy4gRXN0ZSBtb2RlbG8gZGUgdmFyaW9ncmFtYSB0aWVuZSBkaXZlcnNhcyBmb3JtYXMgY29tbyBleHBvbmVuY2lhbCwgZXNmw6lyaWNhLCBHYXVzc2lhbmEgbyBNYXRlcm4uXlsxM10oaHR0cDovL2dzcC5odW1ib2xkdC5lZHUvT0xNL1IvMDRfMDFfVmFyaW9ncmFtcy5odG1sKV1eDQoNCg0KIyMgNC4gUHJlc2VudGFjacOzbiBkZSByZXN1bHRhZG9zDQoNCkEgY29udGludWFjacOzbiwgc2UgbXVlc3RyYW4gbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIGFsIHByb2dyYW1hciBsb3MgbWFwYXMsIGdyw6FmaWNhcyB5IGZvcm11bGFzIGRlIGxvcyB0cmVzIG3DqXRvZG9zIGRlIGludGVycG9sYWNpw7NuIG1lbmNpb25hZG9zIGFudGVyaW9ybWVudGUsIHVzYW5kbyBsb3MgZGF0b3MgQ0hJUlBTIGRlIHByZWNpcGl0YWNpw7NuIGVuIGxhIHpvbmEgZGVsIGRlcGFydGFtZW50byBkZWwgQW1hem9uYXMuDQoNCg0KIyMjICo0LjEuIEludGVycG9sYWNpw7NuIG1lZGlhbnRlIGVsIG3DqXRvZG8gSURXKg0KDQpFbiBsYSBzaWd1aWVudGUgaW1hZ2VuIHNlIHB1ZWRlIG9ic2VydmFyIGVsIG1hcGEgZGVsIGFtYXpvbmFzIGNvbiBlbCBtw6l0b2RvIGRlIGludGVycG9sYWNpw7NuIGRlIElEVyBkb25kZSBzZSBvYnNlcnZhIGVuIGNvbG9yZXMgbWFycm9uZXMgbGFzIHpvbmFzIGludGVycG9sYWRhcyBjb24gbWVub3IgcHJlY2lwaXRhY2nDs24gZW4gZWwgZGVwYXJ0YW1lbnRvIHkgZW4gY29sb3JlcyB2ZXJkZXMgb3NjdXJvIGxhcyBtYXlvcmVzIHByZWNpcGl0YWNpb25lcyBkZSBsYSB6b25hLiBDYWJlIG1lbmNpb25hciBxdWUgcGFyYSBlbCBzaWd1aWVudGUgbWFwYSBmdWUgdXNhZGEgY29tbyBwb3RlbmNpYSAyLg0KDQo8ZGl2Lz4NCmBgYHtyIGVjaG89RkFMU0V9DQp0aCA8LSBhcyhzcGF0c3RhdDo6ZGlyaWNobGV0KGFzLnBwcChwcmVjaXAyKSksICJTcGF0aWFsUG9seWdvbnMiKQ0KDQoNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCmNycyh0aCkgPC0gY3JzKHByZWNpcDIpDQpjcnMoYW1hem9uYXMyKSA8LSBjcnMoYW1hem9uYXMyKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KY3JzKHRoKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KY3JzKHByZWNpcDIpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQp0aC56IDwtIG92ZXIodGgsIHByZWNpcDIsIGZuPW1lYW4pDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQp0aC5zcGRmIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUodGgsIHRoLnopDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQp0aC5jbHAgICA8LSByYXN0ZXI6OmludGVyc2VjdChhbWF6b25hczIsdGguc3BkZikNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCnRtX3NoYXBlKHRoLmNscCkgKyANCiAgdG1fcG9seWdvbnMoY29sPSJyYWluZmFsbCIsIHBhbGV0dGU9IllsR25CdSIsIG1pZHBvaW50PTMwLjAsDQogICAgICAgICAgICAgIHRpdGxlPSJUaGllc3NlbiBQb2x5Z29ucyBcblByZWRpY3RlZCBwcmVjaXBpdGF0aW9uIFxuKGluIG1tKSIpICsNCiAgdG1fbGVnZW5kKGxlZ2VuZC5vdXRzaWRlPVRSVUUpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpncmQgPC0gYXMuZGF0YS5mcmFtZShzcHNhbXBsZShwcmVjaXAyLCAicmVndWxhciIsIG49MTAwMDAwKSkNCm5hbWVzKGdyZCkgPC0gYygiWCIsICJZIikNCmNvb3JkaW5hdGVzKGdyZCkgPC0gYygiWCIsICJZIikNCmdyaWRkZWQoZ3JkKSA8LSBUUlVFDQpmdWxsZ3JpZChncmQpIDwtIFRSVUUNCg0KcHJvajRzdHJpbmcoZ3JkKSA8LSBwcm9qNHN0cmluZyhwcmVjaXAyKQ0KDQpQLmlkdyA8LSBnc3RhdDo6aWR3KHJhaW5mYWxsIH4gMSwgcHJlY2lwMiwgbmV3ZGF0YT1ncmQsIGlkcD0xLjApDQoNCnIgPC0gcmFzdGVyKFAuaWR3KQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0Kcg0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KYW1hem9uYXMyDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpyLm0gPC0gcmFzdGVyOjptYXNrKHIsIGFtYXpvbmFzMikNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCnIubQ0KYGBgDQoNCiFbXShDOi9Vc2Vycy9wYXVsYS9EZXNrdG9wL0dlb21hdGljYS9JbmZvcm1lX2ZpbmFsL2ludGVycF9JRFcxLnBuZykNCg0KQWRpY2lvbmFsbWVudGUsIHRhbWJpw6luIHNlIG11ZXN0cmEgZWwgc2lndWllbnRlIG1hcGEgaW50ZXJhY3Rpdm8gaW5kaWNhbmRvIGRlIGlndWFsIGZvcm1hIGxhIGludGVycG9sYWNpw7NuIHBvciBlbCBtw6l0b2RvIElEVy4gQSBkaWZlcmVuY2lhIGRlbCBhbnRlcmlvciBtYXBhLCBlc3RlIG11ZXN0cmEgZWwgbsO6bWVybyBvcmlnaW5hbCBkZSBjZWxkYXMgcmFzdGVyIHF1ZSBmdWVyb24gb2J0ZW5pZGFzIGFsIGRlc2NhcmdhciBsb3MgZGF0b3MgZGUgcHJlY2lwaXRhY2nDs24gZGUgQ0hJUlBTLCBlc3RvLCBjb24gZWwgZmluIGRlIHRlbmVyIHVuYSBtZWpvciBpbnRlcnByZXRhY2nDs24gZGUgbG9zIGRhdG9zLiBMYXMgem9uYXMgcXVlIHByZXNlbnRhbiB1biBjb2xvciB2ZXJkZSBtw6FzIGNsYXJvIGluZGljYW4gbWVub3JlcyBwcmVjaXBpdGFjaW9uZXMgeSBsb3MgY29sb3JlcyB2ZXJkZXMgYXp1bGFkb3MgdW4gcG9jbyBtw6FzIG9zY3Vyb3MgaW5kaWNhbiBtYXlvciBwcmVjaXBpdGFjacOzbi4NCmBgYHtyIGVjaG89RkFMU0V9DQpwYWwgPC0gY29sb3JOdW1lcmljKGMoImFsaWNlYmx1ZSIsICJkYXJrc2VhZ3JlZW4xIiwgInNlYWdyZWVuMyIsInR1cnF1b2lzZTQiLCAiY2FkZXRibHVlIiksIHZhbHVlcyhwcmVjaXAubWFzayksDQogICAgICAgICAgICAgICAgICAgIG5hLmNvbG9yID0gInRyYW5zcGFyZW50IikNCg0KbGVhZmxldCgpICU+JSBhZGRUaWxlcygpICU+JSANCiAgYWRkUmFzdGVySW1hZ2Uoci5tLCBjb2xvcnMgPSBwYWwsIG9wYWNpdHkgPSAwLjYpICU+JSANCiAgYWRkTGVnZW5kKHBhbCA9IHBhbCwgdmFsdWVzID0gdmFsdWVzKHIubSksDQogICAgICAgICAgICB0aXRsZSA9ICJJbnRlcnBvbGFjacOzbiBJRFcgZGUgcHJlY2lwaXRhY2nDs24gZW4gZWwgQW1hem9uYXNcbiBkZWwgMjYvYWJyaWwgYWwgMzAvYWJyaWwgMjAyMCAobW0pIikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcHJlY2lwMg0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KUCA8LSBwcmVjaXAyDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpJRFcub3V0IDwtIHZlY3RvcihsZW5ndGggPSBsZW5ndGgoUCkpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpmb3IgKGkgaW4gMTpsZW5ndGgoUCkpIHsNCiAgSURXLm91dFtpXSA8LSBnc3RhdDo6aWR3KHJhaW5mYWxsIH4gMSwgUFstaSxdLCBQW2ksXSwgaWRwPSAyLjApJHZhcjEucHJlZA0KfQ0KYGBgDQoNCkVuIGVsIHNpZ3VpZW50ZSBncsOhZmljbyBzZSBxdWlzbyBleHBsaWNhciBkZSB1bmEgbWFuZXJhIGRpc3RpbnRhIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBjb24gZXN0YSBpbnRlcnBvbGFjacOzbiwgZGFuZG8gY29tbyByZXN1bHRhZG8gZWwgdmFsb3IgZGUgcHJlY2lwaXRhY2nDs24gb2JzZXJ2YWRvIChlamUgJHgkKSB5IGxvcyB2YWxvcmVzIGVzdGltYWRvcyBtZWRpYW50ZSBpbnRlcnBvbGFjacOzbiAoZWplICR5JCkuDQpgYGB7ciBlY2hvPUZBTFNFfQ0KT1AgPC0gcGFyKHB0eT0icyIsIG1hcj1jKDQsMywwLDApKQ0KICBwbG90KElEVy5vdXQgfiBQJHJhaW5mYWxsLCBhc3A9MSwgeGxhYj0iT2JzZXJ2ZWQiLCB5bGFiPSJQcmVkaWN0ZWQiLCBwY2g9MTYsDQogICAgICAgY29sPXJnYigwLDAsMCwwLjUpKQ0KICBhYmxpbmUobG0oSURXLm91dCB+IFAkcmFpbmZhbGwpLCBjb2w9InJlZCIsIGx3PTIsbHR5PTIpDQogIGFibGluZSgwLDEpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpwYXIoT1ApDQpgYGANCkNvbmp1bnRvIGNvbiBlbCBncsOhZmljbywgc2Ugb2J0dXZvIGVsIHNpZ3VpZW50ZSB2YWxvciBkZSBlcnJvciBtZWRpbyBjdWFkcsOhdGljbyAoUk1TRSkgcXVlIGNvcnJlc3BvbmRlIGEgdW5hIG1lZGlkYSBkZSBlcnJvciBhYnNvbHV0YSBxdWUgY2FsY3VsYSBlbCBjdWFkcmFkbyBkZSBsYXMgZGVzdmlhY2lvbmVzIHkgbWlkZSBsYSBjYW50aWRhZCBkZSBlcnJvciBxdWUgZXhpc3RlIGVudHJlIGRvcyB2YXJpYWJsZXMgY29uIGRpc3RpbnRvcyBkYXRvcywgY29tcGFyYW5kbyB1biB2YWxvciBwcmVkaWNobyB5IHVuIHZhbG9yIG9ic2VydmFkbyBvIGNvbm9jaWRvLiBFc3RlIGRhdG8gc2UgY2FsY3VsYSBjb24gbGEgc2lndWllbnRlIGbDs3JtdWxhOg0KDQohW10oQzovVXNlcnNccGF1bGFcRGVza3RvcFxHZW9tYXRpY2FcSW5mb3JtZV9maW5hbC9lcnJvcl9jdWFfbWVkLnBuZykNCg0KJE4kOiBOw7ptZXJvIGRlIHZhbG9yZXMgb2JzZXJ2YWRvcw0KDQokeV9pJDogVmFsb3IgZXN0aW1hZG8NCg0KJFxoYXR7eV9pfSQ6IFZhbG9yIG9ic2VydmFkbw0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCnNxcnQoIHN1bSgoSURXLm91dCAtIFAkcmFpbmZhbGwpXjIpIC8gbGVuZ3RoKFApKQ0KYGBgDQoNCkZpbmFsbWVudGUsIGVuIGVsIHNpZ3VpZW50ZSBtYXBhIHNlIHB1ZWRlIG9ic2VydmFyIGVsIG5pdmVsIGRlIGNvbmZpYW56YSBxdWUgcHJlc2VudGFuIGxvcyBkYXRvcyBpbnRlcnBvbGFkb3MgY29uIGVsIG3DqXRvZG8gZGUgSURXLCBkb25kZSwgbG9zIHZhbG9yZXMgY29uIGNvbG9yIGFtYXJpbGxvIGNsYXJvIGluZGljYW4gdW4gbWVub3IgaW50ZXJ2YWxvIGRlIGVycm9yLCBlcyBkZWNpciwgdW5hIG1heW9yIGNvbmZpYW56YSBkZSBsb3MgZGF0b3MsIHkgbG9zIHZhbG9yZXMgY29uIGNvbG9yZXMgbcOhcyByb2ppem9zIGluZGljYW4gdW5hIG1lbm9yIGNvbmZpYW56YSBkZSBsb3MgZGF0b3MuDQpgYGB7ciBlY2hvPUZBTFNFfQ0KaW1nIDwtIGdzdGF0OjppZHcocmFpbmZhbGx+MSwgUCwgbmV3ZGF0YT1ncmQsIGlkcD0yLjApDQpuIDwtIGxlbmd0aChQKQ0KWmkgPC0gbWF0cml4KG5yb3cgPSBsZW5ndGgoaW1nJHZhcjEucHJlZCksIG5jb2wgPSBuKQ0KDQpzdCA8LSBzdGFjaygpDQpmb3IgKGkgaW4gMTpuKXsNCiAgWjEgPC0gZ3N0YXQ6OmlkdyhyYWluZmFsbH4xLCBQWy1pLF0sIG5ld2RhdGE9Z3JkLCBpZHA9Mi4wKQ0KICBzdCA8LSBhZGRMYXllcihzdCwgcmFzdGVyKFoxLCBsYXllciA9IDEpKQ0KICANCiAgWmlbLGldIDwtIG4gKiBpbWckdmFyMS5wcmVkIC0gKG4tMSkgKiBaMSR2YXIxLnByZWQNCn0NCg0KWmogPC0gYXMubWF0cml4KGFwcGx5KFppLCAxLCBzdW0sIG5hLnJtPVQpIC8gbikNCg0KYzEgPC0gYXBwbHkoWmksIDIsICctJywgWmopDQpjMSA8LSBhcHBseShjMV4yLCAxLCBzdW0sIG5hLnJtPVQpDQoNCkNJIDwtIHNxcnQoMS8obioobi0xKSkgKiBjMSkNCg0KaW1nLnNpZyA8LSBpbWcNCmltZy5zaWckdiA8LSBDSSAvaW1nJHZhcjEucHJlZA0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KWmogPC0gYXMubWF0cml4KGFwcGx5KFppLCAxLCBzdW0sIG5hLnJtPVQpIC8gbikNCg0KYzEgPC0gYXBwbHkoWmksIDIsICctJywgWmopDQpjMSA8LSBhcHBseShjMV4yLCAxLCBzdW0sIG5hLnJtPVQpDQoNCkNJIDwtIHNxcnQoMS8obioobi0xKSkgKiBjMSkNCg0KaW1nLnNpZyA8LSBpbWcNCmltZy5zaWckdiA8LSBDSSAvaW1nJHZhcjEucHJlZA0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KciA8LSByYXN0ZXIoaW1nLnNpZywgbGF5ZXI9InYiKQ0Kci5tIDwtIHJhc3Rlcjo6bWFzayhyLCBhbWF6b25hczIpDQoNCg0KdG1fc2hhcGUoci5tKSArIHRtX3Jhc3RlcihuPTcsdGl0bGU9IklEV1xuOTUlIGludGVydmFsbyBkZSBjb25maWFuemEgXG4oZW4gbW0pIikgKw0KICB0bV9zaGFwZShQKSArIHRtX2RvdHMoc2l6ZT0wLjIpICsNCiAgDQogIHRtX2xlZ2VuZChsZWdlbmQub3V0c2lkZT1UUlVFKQ0KYGBgDQoNCg0KDQoNCiMjIyAqNC4yLiBJbnRlcnBvbGFjacOzbiBtZWRpYW50ZSBlbCBtw6l0b2RvIGRlIHBvbMOtZ29ub3MgVGhpZXNzZW4qDQoNCkEgY29udGludWFjacOzbiwgc2UgbXVlc3RyYSBlbCBtYXBhIGNvcnJlc3BvbmRpZW50ZSBhIGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgZGF0b3MgZGUgcHJlY2lwaXRhY2nDs24gcG9yIG1lZGlvIGRlIGxhIGludGVycG9sYWNpw7NuIGNvbiBlbCBtw6l0b2RvIGRlIGxvcyBwb2zDrWdvbm9zIHRoaWVzc2VuLiBDb21vIHNlIHB1ZWRlIG9ic2VydmFyLCBsb3MgcG9sw61nb25vcyBwdWVkZW4gc2VyIHZpc2libGVzLCBhZGljaW9uYWxtZW50ZSwgZnVlIHVzYWRvIGVsIG7Dum1lcm8gdG90YWwgZGUgY2VsZGFzIHJhc3RlciBkZWwgYXJjaGl2byBvcmlnaW5hbCBkZXNjYXJnYWRvIGRlIGxvcyBkYXRvcyBDSElSUFMgZGUgcHJlY2lwaXRhY2nDs24sIHBhcmEgcXVlIGxhIHZpc3VhbGl6YWNpw7NuIGRlIGxvcyBwb2zDrWdvbm9zIGZ1ZXJhIG11Y2hvIG3DoXMgY2xhcmEgeSBtw6FzIGNvbmNsdXllbnRlLiBEZSBpZ3VhbCBmb3JtYSwgY29tbyBlbiBlbCBtYXBhIGFudGVyaW9yLCBsb3MgcG9sw61nb25vcyBjb24gY29sb3JlcyBtYXJyb25lcyBpbmRpY2FuIHpvbmFzIGNvbiBsYSBtZW5vciBwcmVjaXBpdGFjacOzbiB5IGxvcyBwb2zDrWdvbm9zIGNvbiBjb2xvcmVzIHZlcmRlIG9zY3VybyBpbmRpY2FuIG1heW9yIHByZWNpcGl0YWNpw7NuIGVuIGVzYSB6b25hLg0KDQohW10oQzovVXNlcnNccGF1bGFcRGVza3RvcFxHZW9tYXRpY2FcSW5mb3JtZV9maW5hbC9pbnRlcnBfdGhpZXNzZW4xLnBuZykNCg0KDQpFc3RlIG1hcGEgYWRpY2lvbmFsIG11ZXN0cmEgZGUgdW5hIGZvcm1hIGludGVyYWN0aXZhIGxhIGRpc3Bvc2ljacOzbiBkZSBsb3MgcG9sw61nb25vcyB5IGVsIG7Dum1lcm8gZGUgY2VsZGFzIHF1ZSBzZSBwdWVkZW4gZW5jb250cmFyIGVuIGNhZGEgdW5vIGRlIGVsbG9zIGRlcGVuZGllbmRvIGRlIGxhIGNlcmNhbsOtYSBhIGxhIHF1ZSBzZSBxdWllcmEgb2JzZXJ2YXIgZWwgbWFwYS4gRW4gZXN0ZSBjYXNvLCBsb3MgY29sb3JlcyBkZSBsYXMgY2VsZGFzIHJhc3RlciBkZWwgbWFwYSBpbmRpY2FuIHF1ZSBsb3MgbcOhcyByb2ppem9zIHByZXNlbnRhbiBtZW5vcmVzIHByZWNpcGl0YWNpb25lcyB5IGxvcyBjb2xvcmVzIGF6dWwgb3NjdXJvIGluZGljYSBsYSB6b25hcyBjb24gbWF5b3IgcHJlY2lwaXRhY2nDs24gc2Vnw7puIGxhIGludGVycG9sYWNpw7NuIHJlYWxpemFkYS4gRGUgaWd1YWwgZm9ybWEsIGVudHJlIG3DoXMgY2VyY2Egc2UgZXN0w6kgZGUgbGEgem9uYSBlbCBuw7ptZXJvIGRlIHB1bnRvcyBhdXRvbWF0aWNhbWVudGUgdmFuIGFjb21vZGFuZG9zZSBhIGxhIHpvbmEsIHkgc2kgdGFtYmnDqW4gc2UgcHVlZGVuIGZpbHRyYXIgbG9zIGRhdG9zIHBvciAiRW50cmVuYW1pZW50byIgeSAiVmFsaWRhY2nDs24iLg0KYGBge3IgZWNobz1GQUxTRX0NCmxwbG90DQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZi4xIDwtIGFzLmZvcm11bGEocmFpbmZhbGwgfiBYICsgWSkgDQogDQoNClAkWCA8LSBjb29yZGluYXRlcyhQKVssMV0NClAkWSA8LSBjb29yZGluYXRlcyhQKVssMl0NCg0KDQpsbS4xIDwtIGxtKCBmLjEsIGRhdGE9UCkNCg0KZGF0LjFzdCA8LSBTcGF0aWFsR3JpZERhdGFGcmFtZShncmQsIGRhdGEuZnJhbWUodmFyMS5wcmVkID0gcHJlZGljdChsbS4xLCBuZXdkYXRhPWdyZCkpKSANCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCnIgICA8LSByYXN0ZXIoZGF0LjFzdCkNCnIubSA8LSByYXN0ZXI6Om1hc2sociwgYW1hem9uYXMyKQ0KDQp0bV9zaGFwZShyLm0pICsgDQogIHRtX3Jhc3RlcihuPTcsIHBhbGV0dGU9IkJyQkciLCBhdXRvLnBhbGV0dGUubWFwcGluZz1GQUxTRSwgDQogICAgICAgICAgICB0aXRsZT0iMXN0IG9yZGVyIHBvbGlub21pYWwgZmlyIFxuUHJlZGljdGVkIHByZWNpcGl0YXRpb24gXG4oaW4gbW0pIikgKw0KICB0bV9zaGFwZShQKSArIHRtX2RvdHMoc2l6ZT0wLjIpICsNCiAgdG1fbGVnZW5kKGxlZ2VuZC5vdXRzaWRlPVRSVUUpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpmLjIgPC0gYXMuZm9ybXVsYShyYWluZmFsbCB+IFggKyBZICsgSShYKlgpK0koWSpZKSArIEkoWCpZKSkNCg0KDQpQJFggPC0gY29vcmRpbmF0ZXMoUClbLDFdDQpQJFkgPC0gY29vcmRpbmF0ZXMoUClbLDJdDQogDQoNCmxtLjIgPC0gbG0oIGYuMiwgZGF0YT1QKQ0KDQoNCmRhdC4ybmQgPC0gU3BhdGlhbEdyaWREYXRhRnJhbWUoZ3JkLCBkYXRhLmZyYW1lKHZhcjEucHJlZCA9IHByZWRpY3QobG0uMiwgbmV3ZGF0YT1ncmQpKSkgDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpyICAgPC0gcmFzdGVyKGRhdC4ybmQpDQpyLm0gPC0gcmFzdGVyOjptYXNrKHIsIGFtYXpvbmFzMikNCg0KdG1fc2hhcGUoci5tKSArIA0KICB0bV9yYXN0ZXIobj0xMCwgcGFsZXR0ZT0iQnJCRyIsIGF1dG8ucGFsZXR0ZS5tYXBwaW5nPUZBTFNFLG1pZHBvaW50ID0gTkEsDQogICAgICAgICAgICB0aXRsZT0iMm5kIG9yZGVyIHBvbGlub21pYWwgZml0XG5QcmVkaWN0ZWQgcHJlY2lwaXRhdGlvbiBcbihpbiBtbSkiKSArDQogIHRtX3NoYXBlKFApICsgdG1fZG90cyhzaXplPTAuMikgKw0KICB0bV9sZWdlbmQobGVnZW5kLm91dHNpZGU9VFJVRSkNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCmYuMSA8LSBhcy5mb3JtdWxhKHJhaW5mYWxsIH4gWCArIFkpIA0KDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQp2YXIuc21wbCA8LSBnc3RhdDo6dmFyaW9ncmFtKGYuMSwgUCwgY2xvdWQgPSBGQUxTRSwgY3V0b2ZmPTE5MDAwMDAsIHdpZHRoPTg5MDApDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpkYXQuZml0ICA8LSBmaXQudmFyaW9ncmFtKHZhci5zbXBsLCBmaXQucmFuZ2VzID0gVFJVRSwgZml0LnNpbGxzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmdtKHBzaWxsPTMsIG1vZGVsPSJFeHAiLCByYW5nZT0xNTAwMCwgbnVnZ2V0PTAuMCkpDQpgYGANCmBgYHtyIGVjaG89RkFMU0V9DQpkYXQuZml0ICMgQXF1w60gc2UgbXVlc3RyYW4gZGF0b3MgZGVsIHZhcmlvZ3JhbWENCmBgYA0KDQojIyMgKjQuMyBJbnRlcnBvbGFjacOzbiBwb3IgZWwgbcOpdG9kbyBkZSBrcmlnaW5nKg0KDQoNCkxhIHNpZ3VpZW50ZSBncsOhZmljYSBpbmRpY2EgZWwgdmFyaW9ncmFtYSwgZG9uZGUgZnVlIGFqdXN0YWRvIHVzYW5kbyBlbCBtb2RlbG8gZGUgdmFyaW9ncmFtYSBleHBvbmVuY2lhbC4gQ29tbyBzZSBwdWVkZSB2ZXIsIGxvcyBkYXRvcyBkZSBkaXN0YW5jaWEgdmFyw61hbiBlbnRyZSAwIHkgNjAwMDAwIG1ldHJvcyB5IGxhIHNlbWl2YXJpYW56YSB2YSBkZXNkZSAwIGhhc3RhIDEyMC4gRWwgbW9kZWxvIGV4cG9uZW5jaWFsIGZ1ZSBlbCBtw6FzIGFkZWN1YWRvIHBhcmEgZ3JhZmljYXIgbG9zIGRhdG9zLCB5YSBxdWUsIGNvbiBlbCBtb2RlbG8gZ2F1c3NpYW5vIHNvbG8gZXJhIHBlcm1pdGlkbyB1biByYW5nbyBtw6F4aW1vIGRlIDIwMCBkYXRvcy4NCmBgYHtyIGVjaG89RkFMU0V9DQpwbG90KHZhci5zbXBsLCBkYXQuZml0LCB4bGltPWMoMCw2MTQ1MDApKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmYuMSA8LSBhcy5mb3JtdWxhKHJhaW5mYWxsIH4gWCArIFkpDQoNCmRhdC5rcmcgPC0ga3JpZ2UoIGYuMSwgUCwgZ3JkLCBkYXQuZml0KQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0KciA8LSByYXN0ZXIoZGF0LmtyZykNCnIubSA8LSByYXN0ZXI6Om1hc2sociwgYW1hem9uYXMyKQ0KYGBgDQpgYGB7ciBlY2hvPUZBTFNFfQ0Kci5tDQpgYGANCg0KRGVzcHXDqXMgZGUgcmVhbGl6YXIgZWwgdmFyaW9ncmFtYSwgZnVlIHBvc2libGUgZ3JhZmljYXIgZWwgbWFwYSBkZWwgYW1hem9uYXMsIHF1ZSBzZSBtdWVzdHJhIGEgY29udGludWFjacOzbiwgY29uIGxvcyBkYXRvcyBkZSBwcmVjaXBpdGFjaW9uIHBvciBpbnRlcnBvbGFjacOzbiBjb24gZWwgbcOpdG9kbyBkZSBrcmlnaW5nLiBBbCBpZ3VhbCBxdWUgYWxndW5pcyBtYXBhcyBhbnRlcmlvcmVzLCBlbCBjb2xvciBtYXJyw7NuIGluZGljYSBtZW5vcmVzIHByZWNpcGl0YWNpb25lcyB5IGxvcyBjb2xvcmVzIHZlcmRlIG9zY3VybyBpbmRpY2FuIG1heW9yIHByZWNpcGl0YWNpw7NuIGVuIGVzYSB6b25hLiBQYXJhIGVzdGUgbWFwYSB0YW1iacOpbiBmdWVyb24gdXNhZGFzIGxhIHRvdGFsaWRhZCBkZSBjZWxkYXMgcmFzdGVyIGRlc2NhcmdhZGFzIGVuIENISVJQUyBjb24gZWwgcHJvcMOzc2l0byBkZSBxdWUgbGEgdmlzdWFsaXphY2nDs24gZGVsIGdyw6FmaWNvIGZ1ZSBtYXMgJ3N1YXZlJyB5IG3DoXMgZW50ZW5kaWJsZS4NCmBgYHtyIGVjaG89RkFMU0V9DQp0bV9zaGFwZShyLm0pICsgDQogIHRtX3Jhc3RlcihuPTEwLCBwYWxldHRlID0gIkJyQkciLCBhdXRvLnBhbGV0dGUubWFwcGluZyA9IEZBTFNFLA0KICAgICAgICAgICAgdGl0bGUgPSAiSW50ZXJwb2xhY2nDs24gY29uIGtyaWdpbmcgZGVcbnByZWNpcGl0YWNpw7NuIGVuIGVsIGFtYXpvbmFzXG4yNi9hYnJpbCBhbCAzMC9hYnJpbCAyMDIwIChlbiBtbSkiKSsNCiAgdG1fc2hhcGUoUCkgKyB0bV9kb3RzKHNpemUgPSAwLjIpICsgDQogIHRtX2xlZ2VuZChsZWdlbmQub3V0c2lkZSA9IFRSVUUpDQpgYGANCiFbXShDOi9Vc2Vyc1xwYXVsYVxEZXNrdG9wXEdlb21hdGljYVxJbmZvcm1lX2ZpbmFsL2ludGVycF9rcmlnaW5nMS5wbmcpDQoNCg0KRW4gZXN0ZSBtYXBhLCBzZSBwdWVkZSB2ZXIgbcOhcyBjbGFyYW1lbnRlIHkgZGUgZm9ybWEgaW50ZXJhY3RpdmEgbG9zIGRhdG9zIG9idGVuaWRvcyBlbXBsZWFuZG8gZXN0ZSBtw6l0b2RvIGRlIGludGVycG9sYWNpw7NuLg0KYGBge3IgZWNobz1GQUxTRX0NCnBhbCA8LSBjb2xvck51bWVyaWMoYygiYWxpY2VibHVlIiwgImRhcmtzZWFncmVlbjEiLCAic2VhZ3JlZW4zIiwidHVycXVvaXNlNCIsICJjYWRldGJsdWUiKSwgdmFsdWVzKHByZWNpcC5tYXNrKSwNCiAgICAgICAgICAgICAgICAgICAgbmEuY29sb3IgPSAidHJhbnNwYXJlbnQiKQ0KDQpsZWFmbGV0KCkgJT4lIGFkZFRpbGVzKCkgJT4lIA0KICBhZGRSYXN0ZXJJbWFnZShyLm0sIGNvbG9ycyA9IHBhbCwgb3BhY2l0eSA9IDAuNikgJT4lIA0KICBhZGRMZWdlbmQocGFsID0gcGFsLCB2YWx1ZXMgPSB2YWx1ZXMoci5tKSwNCiAgICAgICAgICAgIHRpdGxlID0gIkludGVycG9sYWNpw7NuIGtyaWdpbmcgZGUgcHJlY2lwaXRhY2nDs24gZW4gZWwgYW1hem9uYXNcbiBkZSAyNi9hYnJpbCBhbCAzMC9hYnJpbCAyMDIwIChtbSkiKQ0KYGBgDQoNCg0KDQoNClVuYSBmb3JtYSBkZSB2aXN1YWxpemFjacOzbiBkZSBsb3MgZGF0b3MgaW50ZXJwb2xhZG9zIHBvciBlbCBtw6l0b2RvIGRlIGtyaWdpbmcgc2Vnw7puIHN1IHZhcmlhbnphIGUgaW5jZXJ0aWR1bWJyZSBzZSBtdWVzdHJhIGVuIGVsIHNpZ3VpZW50ZSBtYXBhLCBkb25kZSBzZSBhcHJlY2lhIGVsIG5pdmVsIGRlIHZhcmlhY2nDs24gZGUgbG9zIGRhdG9zIGRlIHByZWNpcGl0YWNpw7NuIHNlZ8O6biBsYSB6b25hIGRlbCBkZXBhcnRhbWVudG8uDQpgYGB7ciBlY2hvPUZBTFNFfQ0KciA8LSByYXN0ZXIoZGF0LmtyZywgbGF5ZXIgPSAidmFyMS52YXIiKQ0Kci5tIDwtIHJhc3Rlcjo6bWFzayhyLCBhbWF6b25hczIpDQoNCnRtX3NoYXBlKHIubSkgKyANCiAgdG1fcmFzdGVyKG49NywgcGFsZXR0ZSA9ICJHbkJ1IiwNCiAgICAgICAgICAgIHRpdGxlID0gIkludGVycG9sYWNpw7NuIGtyaWdpbmdcbk1hcGEgZGUgdmFyaWFuemEgXG4oc3F1YXJlZCBtbSkiKSArIHRtX3NoYXBlKFApICsgdG1fZG90cyhzaXplID0gMC4yKSArIA0KICB0bV9sZWdlbmQobGVnZW5kLm91dHNpZGUgPSBUUlVFKQ0KYGBgDQoNCg0KUG9yIMO6bHRpbW8sIGVuIGVsIHNpZ3VpZW50ZSBtYXBhIHNlIG11ZXN0cmFuIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSBsb3MgZGF0b3MgZGUgcHJlY2lwaXRhY2nDs24gb2J0ZW5pZG9zIGRlc3B1w6lzIGRlIHJlYWxpemFyIGtyaWdpbmcuIEVzdGUgbml2ZWwgZGUgY29uZmlhbnphIHF1ZSBzZSBtdWVzdHJhIHNlIHZhbG9yYSBlbiB1biA5NSUgZGUgY29uZmlhbnphIHRvdGFsLg0KYGBge3IgZWNobz1GQUxTRX0NCnIgPC0gc3FydChyYXN0ZXIoZGF0LmtyZywgbGF5ZXIgPSAidmFyMS52YXIiKSkgKiAxLjk2DQpyLm0gPC0gcmFzdGVyOjptYXNrKHIsIGFtYXpvbmFzMikNCg0KdG1fc2hhcGUoci5tKSArIA0KICB0bV9yYXN0ZXIobj03LCBwYWxldHRlID0gIkduQnUiLA0KICAgICAgICAgICAgdGl0bGUgPSAiSW50ZXJwb2xhY2nDs24ga3JpZ2luZ1xuOTUlIGNvbmZpYW56YSBkZWwgbWFwYVxuKGVuIG1tKSIpICsgdG1fc2hhcGUoUCkgKyB0bV9kb3RzKHNpemU9MC4yKSArIA0KICB0bV9sZWdlbmQobGVnZW5kLm91dHNpZGUgPVRSVUUpDQpgYGANCg0KIyMgNS4gQW7DoWxpc2lzIGRlIHJlc3VsdGFkb3MNCg0KDQpTZWfDum4gbG9zIGRvcyBwcmltZXJvcyBtYXBhcyBvYnRlbmlkb3MgcGFyYSBsYSBpbnRlcnBvbGFjacOzbiBJRFcsIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBsb3MgdmFsb3JlcyBpbmRpY2Fkb3MgZGUgcHJlY2lwaXRhY2nDs24gc29uIGNvbmdydWVudGVzIGNvbiBsb3MgdmFsb3JlcyBxdWUgc2UgaW5kaWNhbiBlbiBsb3MgZGF0b3Mgb3JpZ2luYWxlcyBkZSBDSElSUFMgZGVzY2FyZ2Fkb3MsIG1vc3RyYW5kbyBzaW1ldHLDrWEgY29uIGxvcyBtYXBhcyBtb3N0cmFkb3MgZW4gbGEgZGVzY3JpcGNpw7NuIGRlIGxvcyBkYXRvcy4NCkVuIGxvcyBkYXRvcyByZXByZXNlbnRhZG9zIGVuIGxhIGdyw6FmaWNhLCBzZSBwdWVkZSB2ZXIgcXVlIGxvcyBwdW50b3MgdGllbmVuIHVuYSBhbHRhIHZhcmlhY2nDs24gY29uIHJlc3BlY3RvIGEgbGEgbMOtbmVhIGd1w61hIHF1ZSBzZSBtdWVzdHJhLCBpbmRpY2FuZG8gcXVlIGxvcyB2YWxvcmVzIG9idGVuaWRvcyBwb3IgbGEgaW50ZXJwb2xhY2nDs24gY29uIGVsIG3DqXRvZG8gSURXIGZ1ZSBlZmVjdGl2YSBlbiBhbGd1bmFzIHpvbmFzLCBwZXJvIHNlIHByZXNlbnRhcm9uIG90cmFzIGRvbmRlIGxhIHZhcmlhY2nDs24gYSBsb3MgZGF0b3MgZXNwZXJhZG9zIGZ1ZSBhbHRhLiBTaSBlbCAxMDAgJSBkZSBsb3MgZGF0b3MgY29pbmNpZGllcmFuLCBsb3MgcHVudG9zIGdyYWZpY2Fkb3MgZXN0YXLDrWFuIGFsaW5lYWRvcyBjb24gbGEgbMOtbmVhIHB1bnRlYWRhIHJvamEgcXVlIHNlIG11ZXN0cmEuIEFkaWNpb25hbG1lbnRlLCBlbCB2YWxvciBkZWwgZXJyb3IgbWVkaW8gY3VhZHLDoXRpY28gaW5kaWNhIHF1ZSBlbCByYW5nbyBkZSBlcnJvciBlcyBtdXkgYWx0bywgZXMgZGVjaXIgcXVlLCBsYSBjb21wYXJhY2nDs24gZW50cmUgbG9zIGRhdG9zIGVzcGVyYWRvcyB5IGxvcyBkYXRvcyBvYnRlbmlkb3MgY29uIGxhIGludGVycG9sYWNpw7NuIElEVyB0dXZpZXJvbiB1biByYW5nbyBkZSB2YXJpYWNpw7NuIGFsdG8uIEZpbmFsbWVudGUsIGNvbiBlbCBncsOhZmljbyByZWFsaXphZG8gZGVsIG5pdmVsIGRlIGNvbmZpYW56YSwgc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBkYXRvcyBlc3TDoW4gZW4gdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBtdXkgYWx0bywgZXMgZGVjaXIsIHF1ZSBlbCBlcnJvciBlcyBtdXkgYmFqbywgaW5kaWNhbmRvIHF1ZSwgYXVucXVlIHNlIHByZXNlbnRhcm9uIGFsZ3Vub3MgZXJyb3JlcywgZW4gZ2VuZXJhbCBsb3MgcmVzdWx0YWRvcyBkZSBsYSBpbnRlcnBvbGFjacOzbiBmdWVyb24gbXV5IHNhdGlzZmFjdG9yaW9zLiBBdW5xdWUgZW4gbG9zIGRvcyBwcmltZXJvcyBtYXBhcyBwYXJlY2llcmFuIG5vIHRlbmVyIG11Y2hhcyB2YXJpYWNpb25lcyBjb24gcmVzcGVjdG8gYWwgb3JpZ2luYWwsIGFsIHZlciBsb3MgZGF0b3MgcHVlc3RvcyBlbiB1bmEgdGFibGEgIHkgY29tcGFyYWRvcyBzZWd1biBzdSBuaXZlbCBkZSBlcnJvciBzZSBwdWVkZSBjb21wcm9iYXIgcXVlIGxvcyBkYXRvcyB2YXLDrWFuIGJhc3RhbnRlIGNvbiByZXNwZWN0byBhIGxvcyBkYXRvcyAgZXNwZXJhZG9zLiANCg0KDQpFbiBsYSBpbnRlcnBvbGFjacOzbiBtZWRpYW50ZSBlbCBtw6l0b2RvIGRlIHBvbMOtZ29ub3MgVGhpZXNzZW4sIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBzZSBlbXBpZXphbiBhIHByZXNlbnRhciB2YXJpYWNpb25lcyBlbiBsb3MgZGF0b3MgY29uIHJlc3BlY3RvIGEgbGEgaW50ZXJwb2xhY2nDs24gZGUgSURXLiBBdW5xdWUsIGFsIGNvbXBhcmFyIHZpc3VhbG1lbnRlIGxvcyBkYXRvcyBxdWUgdGllbmUgY2FkYSB1bm8gZGUgbG9zIHBvbMOtZ29ub3MgZGVsIHByaW1lciBtYXBhIHkgbG9zIGRhdG9zIGRlIGNhZGEgY2VsZGEgZGUgbG9zIGRhdG9zIGVzcGVyYWRvcywgc2UgcHVlZGUgdmVyIGNpZXJ0YSBzaW1pbGl0dWQsIHNpbiBlbWJhcmdvLCBoYXkgYWxndW5hcyBwZXF1ZcOxYXMgem9uYXMgcXVlIG5vIGNvaW5jaWRlbiBkZWwgdG9kbyBjb24gbG9zIGRhdG9zIGVzcGVyYWRvcy4gU2UgcHVlZGUgZGVjaXIgcXVlIGVzIHVuIG3DqXRvZG8gbXV5IGFjZXJ0YWRvIHBlcm8sIGNvbnNpZGVyYXIgYWxndW4gb3RybyBtw6l0b2RvIGRlIGNvbXBhcmFjacOzbiBkZSBsb3MgZGF0b3Mgc2Vyw61hIG11Y2hvIG3DoXMgY29uY2x1eWVudGUuIE5vIG9ic3RhbnRlLCBsb3MgZGF0b3MgZGVsIHNlZ3VuZG8gZ3LDoWZpY28gc29uIG11Y2hvIG3DoXMgYWNlcnRhZG9zIHNpIHNlIG9ic2VydmFuIGxvcyBkYXRvcyBwb3IgY2FkYSBjZWxkYSwgYWRpY2lvbmFsbWVudGUsIGxvcyBtYXBhcyBpbnRlcmFjdGl2b3MgYWwgdGVuZXIgbGEgb3BjacOzbiBkZSBwb2RlciB2ZXIgbG9zIGRhdG9zIG3DoXMgZGUgY2VyY2EsIHNlIHB1ZWRlIHJlYWxpemFyIHVuYSBjb21wYXJhY2nDs24gbcOhcyBlc3BlY8OtZmljYSBkZXBlbmRpZW5kbyBkZSBsYSB6b25hIGRlbCBkZXBhcnRhbWVudG8uIFNpbiBlbWJhcmdvLCBhbCB1c2FyIGVsIG3DqXRvZG8gZGUgaW50ZXJwb2xhY2nDs24gY29uIHBvbMOtZ29ub3MgdGhpZXNzZW4gbm8gZXMgdGFuIHNpbXBsZSBjb21wYXJhciBsb3MgcmVzdWx0YWRvcyBncsOhZmljb3MgY29uIHNvbG8gbG9zIG1hcGFzLCBzZXLDrWEgbXV5IGdyYXRpZmljYW50ZSBwb2RlciB0ZW5lciBvdHJvIG3DqXRvZG8gZGUgY29tcGFyYWNpw7NuIGRlIGxvcyAgZGF0b3MgIGNvbW8gIGdyw6FmaWNhcyAgcGFyYSAgdGVuZXIgIHVuYSAgY29uY2x1c2nDs24gIGNlcnRlcmEgIGRlICBsb3MgIGRhdG9zLg0KDQoNClBvciDDumx0aW1vLCBlbiBlbCB2YXJpb2dyYW1hIGFsIHVzYXIgZWwgbcOpdG9kbyBleHBvbmVuY2lhbCwgcGFyYSBsYSBpbnRlcnBvbGFjacOzbiBkZSBrcmlnaW5nLCBzZSBpbmRpY8OzIGFsIGluaWNpbyBkZSBsYSBncsOhZmljYSBxdWUgbGEgZnVuY2nDs24gZXJhIGNyZWNpZW50ZSB5IHNpbcOpdHJpY2EgY29uIGxhIGzDrW5lYSBleHBvbmVuY2lhbCwgcGVybywgZGVzcHXDqXMgZGUgdW5hIGRpc3RhbmNpYSBkZSBhcHJveGltYWRhbWVudGUgMTUwMDAwIG1ldHJvcyBsb3MgcHVudG9zIGNhbWJpYW4gc3Ugc2VtaXZhcmlhbnphIGNvbnN0YW50ZW1lbnRlIGF1bWVudGFuZG8geSBkaXNtaW51eWVuZG8gc2luIG9idGVuZXIgZGF0b3MgY29uY2x1eWVudGVzIGFsIG3DqXRvZG8gZXhwb25lbmNpYWwgdXNhZG8uIFNpbiBlbWJhcmdvLCBzaSBzZSBvYnNlcnZhIGxhIGNvbnRpbnVpZGFkIGRlIGxvcyBwdW50b3MsIHNlIHB1ZWRlIHZlciBjaWVydGEgaG9tb2dlbmVpZGFkIGRlIGxhIGdyw6FmaWNhIGRvbmRlIHNlIHRpZW5kZSBhIHZlciBsb3MgcHVudG9zIGNvbiBjaWVydGFzIGZvcm1hcyBwYXJhYsOzbGljYXMsIGluZGljYW5kbyBsYSByZWxhY2nDs24gZGUgbG9zIGRhdG9zIHNlZ3VuIGxhIHNlbWl2YXJpYW56YS4gRGUgaWd1YWwgZm9ybWEsIGNvbiByZXNwZWN0byBhIGxvcyBtYXBhcyBzZSBwdWVkZSBvYnNlcnZhciBxdWUgbG9zIGRhdG9zIGdyYWZpY2Fkb3MgZnVlcm9uIGNvbmNsdXllbnRlcyB5IG11eSBleGFjdG9zIGVuIGNvbXBhcmFjacOzbiBjb24gbG9zIGRhdG9zIGRlIHByZWNpcGl0YWNpw7NuIGVzcGVyYWRvcywgYXNpbWlzbW8sIGVsIG1hcGEgZGUgdmFyaWFuemEgbW9zdHLDsyB1biBpbnRlcnZhbG8gYmFqbyBkZSB2YXJpYWJpbGlkYWQgZGUgbG9zIGRhdG9zLCBlcyBkZWNpciBxdWUgZWZlY3RpdmFtZW50ZSwgbG9zIGRhdG9zIGRlIGxhIGludGVycG9sYWNpw7NuIGZ1ZXJvbiBjb25ncnVlbnRlcy4gUG9yIG90cm8gbGFkbywgZWwgw7psdGltbyBtYXBhIGVsIGN1YWwgaW5kaWNhIGVsIG5pdmVsIGRlIGNvbmZpYW56YSBkZSBsb3MgZGF0b3Mgb2J0ZW5pZG9zIG5vIG1vc3Ryw7MgZGF0b3MgdGFuIHNhdGlzZmFjdG9yaW9zIGNvbiB1biBuaXZlbCBkZSBjb25maWFuemEgZW4gdW4gcmFuZ28gbWVkaW8gZW4gZ3JhbiBwYXJ0ZSBkZWwgbWFwYSwgeSBlbiBsb3MgYm9yZGVzIGRlbCBtYXBhIHNlIHB1ZWRlIHZlciBxdWUgbG9zIG5pdmVsZXMgZGUgdmFyaWFjacOzbiBlbiBsb3MgZGF0b3MgdmFuIGRlIDYgYSA4IG1tLiBEYWRvIGVzdG8sIHNlIHB1ZWRlIGRlY2lyIHF1ZSBhdW5xdWUgbG9zIGRhdG9zIHNlIGFjZXJjYXJvbiBhIGxvcyBlc3BlcmFkb3MsIGVzdGUgbcOpdG9kbyAgbm8gIGVzICB0b3RhbG1lbnRlICBjZXJ0ZXJvICBlbiAgbGEgIGFwcm94aW1hY2nDs24gIGRlICBsb3MgZGF0b3MuDQoNCg0KIyMgNi4gQ29uY2x1c2lvbmVzDQoNCi0gRWwgYW1hem9uYXMgZXMgdW5hIHpvbmEgY29uIHZhcmlhY2nDs24gY2xpbcOhdGljYSBtZWRpYSBkZSBsYSBwcmVjaXBpdGFjacOzbiwgZGViaWRvIGEgc3VzIG5pdmVsZXMgZGUgaHVtZWRhZCB5IGEgc3UgZ3JhbiB6b25hIGJvc2Nvc2EsIHByZXNlbnRhbmRvIGFsdGVyYWNpb25lcyBkZXNkZSAyMCBtbSBoYXN0YSA3MCBtbSBkZSBwcmVjaXBpdGFjacOzbiBlbiBzb2xvIDUgZMOtYXMuDQoNCi0gRW4gY29tcGFyYWNpw7NuIGNvbiBsb3MgdHJlcyBtw6l0b2RvcyBlc3R1ZGlhZG9zLCBlbCBxdWUgdHV2byBtw6FzIGRhdG9zIGNvbmNsdXllbnRlcywgZXhhY3RvcyB5IHByZWNpc29zIGZ1ZSBlbCBtw6l0b2RvIGRlIGtyaWdpbmcuIEF1bnF1ZSBsYSB2YXJpYWNpw7NuIGRlIGFsZ3Vub3MgZGF0b3MgZnVlIGRlIDYgYSA4IG1tIGxvcyBkYXRvcyBmdWVyb24gbcOhcyBhY2VydGFkb3MgeSwgYWRpY2lvbmFsbWVudGUsIGVsIHZhcmlvZ3JhbWEgeSBsb3MgZGlmZXJlbnRlcyBtYXBhcyByZWFsaXphZG9zIGRhYmFuIHVuYSBtYXlvciBpZGVhIGRlIHF1w6kgdGFuIHNpbWlsYXJlcyBmdWVyb24gbG9zIGRhdG9zIGVuIGNvbXBhcmFjacOzbiBjb24gbG9zIG9yaWdpbmFsZXMuDQoNCi0gU2Vnw7puIGxvIGFudGVyaW9yIHNlIGNvbmNsdXllIHF1ZSBsYXMgdMOpY25pY2FzIGRlIGludGVycG9sYWNpw7NuIGdlb2VzdGFkw61zdGljYXMgc29uIG11Y2hvIG3DoXMgcHJlY2lzYXMgeSBjZXJ0ZXJhcyBlbiBjb21wYXJhY2nDs24gY29uIGxhcyB0w6ljbmljYXMgZGV0ZXJtaW5pc3Rhcy4NCg0KLSBFbCBtw6l0b2RvIHF1ZSBicmluZMOzIG1lbm9yIGluZm9ybWFjacOzbiBlbiBsb3MgZGF0b3MgZnVlIGVsIG3DqXRvZG8gZGUgbG9zIHBvbMOtZ29ub3MgZGUgVGhpZXNzZW4gZGViaWRvIGEgcXVlIGVsIGhlY2hvIGRlIGNvbXBhcmFyIGxhIGVmZWN0aXZpZGFkIGVzIG11eSBzdWJqZXRpdmEgc2kgbm8gc2UgdGllbmUgdW4gZ3LDoWZpY28gYWRpY2lvbmFsIHF1ZSBicmluZGUgbGEgaW5mb3JtYWNpw7NuIHByZWNpc2EgYWNlcmNhIGRlIGN1w6FsZXMgc29uIGxhcyB2YXJpYWNpb25lcyBlbiBjb21wYXJhY2nDs24gY29uIGxvcyBkYXRvcyByZWFsZXMuDQoNCi0gQXVucXVlIGVuIGVsIG3DqXRvZG8gZGUgSURXIHNlIG9ic2VydsOzIHF1ZSBodWJvIGFsdGEgdmFyaWFjacOzbiBlbiBsb3MgZGF0b3MgYWwgb2JzZXJ2YXIgZWwgZ3LDoWZpY28geSBlbCByZXN1bHRhZG8gZGVsIGVycm9yIG1lZGlvIGN1YWRyw6F0aWNvIGZ1ZSBhbHRvLCBzZSBwdWVkZSBkZWNpciBxdWUgZWwgbml2ZWwgZGUgY29uZmlhbnphIGRlIGxvcyBkYXRvcyBvYnRlbmlkb3MgZnVlIGJhc3RhbnRlIHNhdGlzZmFjdG9yaW8gZW4gZ3JhbiBwYXJ0ZSBkZWwgZGVwYXJ0YW1lbnRvLg0KDQotIExhIGludGVycG9sYWNpw7NuIGVzcGFjaWFsIGVzIHVuYSB0w6ljbmljYSBtdXkgw7p0aWwgcXVlIGJyaW5kYSByZXN1bHRhZG9zIGVuIGdlbmVyYWwgbXV5IHByZWNpc29zLCBldml0YW5kbyB0cmFiYWpvcyBlbiBjYW1wbyBkZSB6b25hcyBtdXkgZ3JhbmRlcyBxdWUgY3Vlc3RhbiBtdWNobyBkaW5lcm8geSB0aWVtcG8uDQoNCi0gQ29uIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBhbCBlbXBsZWFyIGxvcyB0cmVzIG3DqXRvZG9zLCBzZSBwdWRvIG9ic2VydmFyIHF1ZSBlbiBnZW5lcmFsIGxvcyBkYXRvcyBmdWVyb24gbXV5IHByZWNpc29zIGVuIGVzcGVjaWFsIGVuIGxhIHpvbmEgY2VudHJhbCBkZWwgZGVwYXJ0YW1lbnRvIGRlbCBhbWF6b25hcyBwcmVzZW50YW5kbyBsb3MgbWVub3JlcyBuaXZlbGVzIGRlIHZhcmlhYmlsaWRhZC4NCg0KDQoNCiMjIDcuICBSZWZlcmVuY2lhcw0KDQoNCl5bMV0oaHR0cHM6Ly9kZXNrdG9wLmFyY2dpcy5jb20vZXMvYXJjbWFwLzEwLjMvdG9vbHMvc3BhdGlhbC1hbmFseXN0LXRvb2xib3gvdW5kZXJzdGFuZGluZy1pbnRlcnBvbGF0aW9uLWFuYWx5c2lzLmh0bSleIEVzcmkuIEFyY0dJUyBEZXNrdG9wLiAyMDE2LiAqVW5kZXJzdGFuZGluZyBpbnRlcnBvbGF0aW9uIGFuYWx5c2lzKi4NCg0KXlsyXShodHRwOi8vcGxhbmV0LmJvdGFueS51d2MuYWMuemEvbmlzbC9HSVMvc3BhdGlhbC9jaGFwXzFfMTEuaHRtKV4gUGxhbmV0IEJvdGFueSBVV0MuICpXaGF0IGlzIGEgc3BhdGlhbCBpbnRlcnBvbGF0aW9uPyouDQoNCl5bM10oaHR0cDovL3BsYW5ldC5ib3RhbnkudXdjLmFjLnphL25pc2wvR0lTL3NwYXRpYWwvY2hhcF8xXzEyLmh0bSleIFBsYW5ldCBCb3RhbnkgVVdDLiAqV2h5IGludGVycG9sYXRlPyouDQoNCl5bNF0oaHR0cDovL3d3dy5hbWF6b25hcy5nb3YuY28vZGVwYXJ0YW1lbnRvL251ZXN0cm8tZGVwYXJ0YW1lbnRvKV4gR29iZXJuYWNpw7NuIGRlbCBhbWF6b25hcy4gKk51ZXN0cm8gZGVwYXJ0YW1lbnRvKi4NCg0KXls1XShodHRwOi8vc2lhdGFjLmNvL3dlYi9ndWVzdC9jbGltYSM6fjp0ZXh0PUNvbmZvcm1lJTIwYSUyMGxvcyUyMHJlZ2lzdHJvcyUyMGRlLGFuYWxpemFuZG8lMjBsb3MlMjBkYXRvcyUyMGVuJTIwY2FkYSleIEluc3RpdHV0byBTSU5DSEkuIFNpc3RlbWEgZGUgSW5mb3JtYWNpw7NuIEFtYmllbnRhbCBUZXJyaXRvcmlhbCBkZSBsYSBBbWF6b27DrWEgQ29sb21iaWFuYS4gKkNsaW1hKi4NCg0KXls2XShodHRwczovL3d3dy5jaGMudWNzYi5lZHUvZGF0YS9jaGlycHMpXiBDbGltYXRlIEhhemFyZCBDZW50ZXIuICpDSElSUFM6IFJhaW5mYWxsIEVzdGltYXRlcyBmcm9tIFJhaW4gR2F1Z2UgYW5kIFNhdGVsbGl0ZSBPYnNlcnZhdGlvbnMqLiBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIFNhbnRhIELDoXJiYXJhLg0KDQpeWzddKGh0dHA6Ly9wbGFuZXQuYm90YW55LnV3Yy5hYy56YS9uaXNsL0dJUy9zcGF0aWFsL2NoYXBfMV8xNC5odG0pXiBQbGFuZXQgQm90YW55IFVXQy4gKkludmVyc2UgRGlzdGFuY2UgV2VpZ2h0aW5nIChJRFcpKi4NCg0KXls4XShodHRwczovL2Rlc2t0b3AuYXJjZ2lzLmNvbS9lbi9hcmNtYXAvMTAuMy90b29scy9zcGF0aWFsLWFuYWx5c3QtdG9vbGJveC9pZHcuaHRtKV4gRXNyaS4gQXJjR0lTIERlc2t0b3AuIDIwMTYuICpJRFcqDQoNCl5bOV0oaHR0cHM6Ly9kZXNrdG9wLmFyY2dpcy5jb20vZXMvYXJjbWFwLzEwLjMvdG9vbHMvM2QtYW5hbHlzdC10b29sYm94L2hvdy1pZHctd29ya3MuaHRtKV4gRXNyaS4gQXJjR0lTIERlc2t0b3AuIDIwMTYuICpIb3cgSURXIHdvcmtzKg0KDQpeWzEwXShodHRwOi8vcGxhbmV0LmJvdGFueS51d2MuYWMuemEvbmlzbC9HSVMvc3BhdGlhbC9jaGFwXzFfNTMuaHRtKV4gUGxhbmV0IEJvdGFueSBVV0MuKlNwYXRpYWwgYW5hbHlzaXMgb2YgY2F0ZWdvcmljYWwgZGF0YSB1c2luZyBOZWlnYm91cmhvb2QgQW5hbHlzaXMgKGUuZy4gZ2VuZXJhdGlvbiBvZiBzb2lsIG1hcHMpKi4NCg0KXlsxMV0oaHR0cDovL3BsYW5ldC5ib3RhbnkudXdjLmFjLnphL25pc2wvR0lTL3NwYXRpYWwvY2hhcF8xXzMwLmh0bSleIFBsYW5ldCBCb3RhbnkgVVdDLipTdGF0aXN0aWNhbCB0ZWNobmlxdWVzIHVzaW5nIGEgc2VtaS12YXJpb2dyYW0gZm9yIGRldmVsb3BpbmcgY29udGludW91cyBzdXJmYWNlIG1vZGVscyAoS3JpZ2luZykqLg0KDQpeWzEyXShodHRwczovL2Rlc2t0b3AuYXJjZ2lzLmNvbS9lbi9hcmNtYXAvMTAuMy90b29scy9zcGF0aWFsLWFuYWx5c3QtdG9vbGJveC9ob3cta3JpZ2luZy13b3Jrcy5odG0pXiAgUGxhbmV0IEJvdGFueSBVV0MuICpIb3cga3JpZ2luZyB3b3JrcyoNCg0KXlsxM10oaHR0cDovL2dzcC5odW1ib2xkdC5lZHUvT0xNL1IvMDRfMDFfVmFyaW9ncmFtcy5odG1sKV4gUiBmb3IgU3BhdGlhbCBTdGF0aXN0aWNzLiBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LCBPcmVnb24gU3RhdGUgVW5pdmVyc2l0eSwgYW5kIEh1bWJvbGR0IFN0YXRlIFVuaXZlcnNpdHkuICpSIFZhcmlvZ3JhbXMgJiBLcmlnaW5nKi4NCg0KDQpPbGF5YSwgViwuIDIwMTQuICpTaXN0ZW1hcyBkZSBpbmZvcm1hY2nDs24gR2VvZ3JhZmljYSouIENyZWF0aXZlIGNvbW1vbnMuUHAgMzExLTMzNi4NCg0KDQoNCg0K