Resumen


Las plantaciones dendroenergéticas como fuente de producción de biomasa suelen estar enfocadas a la siembra de arboles para su aprovechamiento como carbono después de taladas, por este motivo, requieren ser monitoreadas y estudiadas para así lograr el mayor rendimiento posible. El árbol Eucalyptus tereticornis tiene un rápido crecimiento y alta plasticidad ecológica lo que lo convierte en un individuo muy apto para este tipo de plantaciones. Según la literatura la inclinación en un terreno tiene un efecto negativo sobre el desarrollo de distintos árboles, por lo que en este estudio se buscó encontrar si existía este mismo tipo de efecto sobre los árboles de esta especie, comparando los diametros y alturas en dos tratamientos de suelos. Además de esto se desarrolló un modelo lineal de la relación de la altura en base al diametro de los arboles en ambos tratamientos.

Para realizar el estudio se seleccionaron los dos tipos de terrenos luego de analizar la pendiente que tenían, y se tomaron los datos de los árboles en terreno plano y en terreno en pendiente. Además de muestras de tierra de ambos terrenos para caracterizar el terreno por su humedad relativa. Con estos datos tras realizar pruebas estadísticas se comprobó que hay una clara diferencia entre los árboles que crecían en ambos terrenos y se comprobó que había una correlación positiva moderada entre el desarrollo de la altura y el diametro de los árboles. A su vez, se desarrolló el modelo de regresión lineal para poder hacer estimaciones de las alturas en base a los diametros de los árboles.


Palabras Clave: Eucalyptus tereticornis, dendrometría, plantación dendroenergética, DAP, correlación


Introducción


Las plantaciones forestales son zonas productivas de madera (biomasa como materia prima), que buscan seleccionar el mejor tipo de árbol y monitorear su desarrollo para así cumplir el objetivo de la plantación y obtener un mayor rendimiento, por este motivo, se busca obtener información sobre las variaciones de crecimiento básicas de los árboles en dichas plantaciones, así como la caracterización del terreno en el que se encuentra. Y con estos valores se puede llegar a comparaciones importantes dentro de los objetivos para los cuales fue instaurada la plantación (Detlefsen, G., Somarriba, E., 2012).

Una plantación dendroenergética, busca una mayor producción de biomasa de sus ejemplares para su aprovechamiento al generar energia electrica o termica, por lo tanto se desean generar individuos robustos, que demuestren un alto índice de captación de carbono (Detlefsen, G., Somarriba, E., 2012). La especie Eucalyptus tereticornis es un árbol muy apto para este uso, pues es de rápido crecimiento, con alta tolerancia a distintos climas, y al ser cortada una vez puede generar rebrotes desde el tronco base, lo que aumenta su capacidad de generación de biomasa. (Muñoz, F., Espinosa, M., Herrera, M., Cancino, J., 2005), Con la dendrometría, que se entiende como la medición y estimación de las dimensiones de árboles utilizando herramientas estadísticas se pueden monitorear las dimensiones básicas los árboles como diámetros y alturas y así tomar decisiones acerca de las condiciones más óptimas para el cultivo de estos individuos y su relación con los tipos de suelo o fertilizantes que se utilicen en su desarrollo (Wabo, E. 2002)

Principalmente la inclinación y la humedad del área de cultivo son de las variables más estudiadas en este tipo de plantaciones, pues la pendiente de un terreno suele implicar que los nutrientes se escurran o suele desarrollar resistencia al crecimiento de un determinado árbol, y en segundo lugar, el porcentaje de humedad en cada una de estas áreas se usa con el fin de obtener una idea del porqué hay un mejor o peor desarrollo de los árboles (Rubiano, D. J., 2010).

Estudios de este tipo se diseñan para maximizar rendimientos a escala industrial en donde los porcentajes de pérdida de captación de biomasa se deben de minimizar y junto a esto se puede llegar a métodos para la agilización de la toma de datos, mediante análisis estadísticos como los que se llevarán acabo.



Fig. 1: Árboles de Eucalipto



Hipótesis


Hipótesis nula:

No existe variación entre las medidas de los árboles de la especie Eucalyptus tereticornis ante las distintas condiciones de terreno

Hipótesis alternativa:

Existe variación entre las medidas de los árboles de la especie Eucalyptus tereticornis ante las distintas condiciones de terreno



Objetivos


Objetivo General:

1.Evaluar la variación en el crecimiento de los árboles de la especie Eucalyptus tereticornis en distintas condiciones de terreno.

Objetivos específicos:

1.Comparar el crecimiento (DAP y altura) de los árboles en distintas pendientes y relacionarlo con la humedad relativa del suelo.

2.Estimar mediante un modelo lineal la relación entre el crecimiento del diámetro y la altura de los árboles.



Materiales y Métodos


La toma de datos fue desarrollada en una plantación dendroenergética de Eucalyptus tereticornis, ubicada en el Instituto Tecnológico de Costa Rica, en Cartago, Costa Rica (9.8484826, -83.9100156), con individuos de 4 años de edad, donde se seleccionaron 30 árboles que estuvieran en terreno en plano y 30 en terreno de en pendiente. La toma se realizó el sábado 15 de setiembre de 2018 de 9:00 am a 3:00 pm.

Se seleccionaron los individuos a medir de manera aleatoria, tomados de las filas de árboles plantados que no estuvieran muy cercanas a los bordes de la plantación ni cercanas a la calle para evitar un efecto barrera en que los arboles de los bordes hubieran crecido con una distinta disponibilidad de Sol y nutrientes.

El equipo utilizado para realizar las mediciones fue: Clinometro (Fig. 2.a) para observar el porcentaje de elevación tanto a la base como a la copa del árbol para obtener la altura del árbol, y para obtener las pendientes de los terrenos, cinta diamétrica (Fig. 2.d) para obtener el diámetro de los troncos, cinta métrica (Fig 2.c) para medir la distancia horizontal entre el observador y el árbol, y por último se utilizaron cuatro cilindros (Fig 2.b) con la mismas dimensiones para obtener muestras de suelo tanto en pendiente como en plano.



Fig. 2: Instrumentos de medición utilizados durante la toma de datos: a) Clinometro, b)Cilindros metalicos, c) Cinta metrica, d) Cinta diamétrica.



Diseño del muestreo y selección de datos: Con el fin de conocer la variación en el crecimiento de la especie Eucalyptus tereticornis en terrenos con distintas pendientes, se procedió a medir el diámetro a la altura del pecho (DAP) en centímetros, así como su altura en metros. Para medir la altura de los árboles se utilizó un clinómetro el cual usa dos escalas una en grados y otra en porcentaje de elevación, se utilizó esta última escala y se procedió a obtener dos mediciones de porcentaje de elevación por árbol a una distancia horizontal constante determinada por una cinta métrica ,en donde, se toma una medición apuntando a la base y manteniendo el mismo punto de referencia, otra apuntando a la copa , la distancia horizontal y las dos mediciones de porcentajes se relacionan por la siguiente fórmula:

Altura (m) = ((% Base + % Copa)/100)*Dist.Horizontal (m)

Para el diámetro de los árboles, la medida se tomó aproximadamente a unos 1.30 metros de altura desde el nivel del suelo, manteniendo esta referencia de altura para todos los árboles de la plantación.

Se procedió a medir también la humedad relativa de los suelos de cada una de los terrenos estudiados (plano y pendiente), para ello se recolectaron 5 muestras en cada uno, haciendo uso de un cilindro metálico, posteriormente se pesarón en el laboratorio y se procede a secar en un horno las muestras a 60 grados por 92 horas, seguidamente se vuelven a pesar y la humedad relativa se obtiene al aplicar la fórmula:

Porcentaje de Humedad (%) = ((Peso húmedo (g) + Peso seco (g))/Peso humedo (g))*100

Los datos fueron ingresados a Office Excel como cuadros de datos para posteriormente ser analizados en R con la ayuda de RStudio.

A las muestras se les realizaron pruebas de Shapiro-Wilk para verificar la normalidad de los datos. Posterior a esto se realizó un análisis de varianzas para verificar la homogeneidad de las muestras.

Se aplicó una prueba de T-Student para saber si había diferencias significativas en los tratamientos bajo los cuales se encontraban los árboles (terreno en pendiente y en plano)

Para realizar una regresión lineal primero se analizó el coeficiente de determinación para saber que tan relacionadas están las variables entre sí y saber que tanto se puede explicar esta relación y después de eso se realizó un modelo de regresión lineal para conocer la dependencia entre estas variables



Resultados


Se obtuvieron 30 datos de la altura de los árboles y 30 datos de los diametros de los árboles, tanto en el terreno plano, como en el terreno con pendiente.

Los porcentajes de humedad relativa de la tierra son: Terreno plano: 31.55 % y Terreno en pendiente: 26.87 %



Pruebas de Shapiro en Plano y pendiente

shapiro.test(Plano$DAP)

    Shapiro-Wilk normality test

data:  Plano$DAP
W = 0.94531, p-value = 0.1265
shapiro.test(Plano$ALT)

    Shapiro-Wilk normality test

data:  Plano$ALT
W = 0.97873, p-value = 0.7909
shapiro.test(Pendiente2$ALT)

    Shapiro-Wilk normality test

data:  Pendiente2$ALT
W = 0.94569, p-value = 0.1413
shapiro.test(Pendiente2$DAP)

    Shapiro-Wilk normality test

data:  Pendiente2$DAP
W = 0.98177, p-value = 0.8806


Pruebas de homogeneidad de varianzas

var.test(Pendiente2$DAP,Plano$DAP)

    F test to compare two variances

data:  Pendiente2$DAP and Plano$DAP
F = 0.70809, num df = 28, denom df = 29, p-value =
0.3639
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.3355493 1.5016599
sample estimates:
ratio of variances 
         0.7080868 
var.test(Pendiente2$ALT,Plano$ALT)

    F test to compare two variances

data:  Pendiente2$ALT and Plano$ALT
F = 0.64588, num df = 28, denom df = 29, p-value =
0.2508
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.3060704 1.3697352
sample estimates:
ratio of variances 
         0.6458796 


Pruebas de T Student

t.test(Pendiente2$DAP,Plano$DAP, var.equal = T)

    Two Sample t-test

data:  Pendiente2$DAP and Plano$DAP
t = -4.8626, df = 57, p-value = 9.488e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.553858 -1.480625
sample estimates:
mean of x mean of y 
 9.182759 11.700000 
t.test(Pendiente2$ALT,Plano$ALT, var.equal = T)

    Two Sample t-test

data:  Pendiente2$ALT and Plano$ALT
t = -9.5165, df = 57, p-value = 2.239e-13
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -2.931664 -1.912382
sample estimates:
mean of x mean of y 
  7.71931  10.14133 


Correlación terreno plano

cor.test(Plano$ALT,Plano$DAP)

    Pearson's product-moment correlation

data:  Plano$ALT and Plano$DAP
t = 2.666, df = 28, p-value = 0.0126
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.1070261 0.6971984
sample estimates:
      cor 
0.4499462 
0.4499462^2
[1] 0.2024516


Correlación pendiente

cor.test(Pendiente2$ALT,Pendiente2$DAP)

    Pearson's product-moment correlation

data:  Pendiente2$ALT and Pendiente2$DAP
t = 2.7179, df = 27, p-value = 0.01133
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.1168331 0.7094771
sample estimates:
      cor 
0.4634921 
0.4634921^2
[1] 0.2148249


Regresión Lineal en Plano

summary(Regresion)

Call:
lm(formula = Plano$ALT ~ Plano$DAP, data = Plano)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.3533 -0.4786  0.0513  0.5547  1.6140 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   7.5057     1.0046   7.472 3.88e-08 ***
Plano$DAP     0.2253     0.0845   2.666   0.0126 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9773 on 28 degrees of freedom
Multiple R-squared:  0.2025,    Adjusted R-squared:  0.174 
F-statistic: 7.108 on 1 and 28 DF,  p-value: 0.0126


Regresión Lineal en Pendiente

summary(Regresion2)

Call:
lm(formula = Pendiente2$ALT ~ Pendiente2$DAP, data = Pendiente2)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.40097 -0.50097  0.09903  0.53363  1.08605 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     5.68423    0.76263   7.453 5.11e-08 ***
Pendiente2$DAP  0.22162    0.08154   2.718   0.0113 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7798 on 27 degrees of freedom
Multiple R-squared:  0.2148,    Adjusted R-squared:  0.1857 
F-statistic: 7.387 on 1 and 27 DF,  p-value: 0.01133






Discusión


Para todos los análisis y pruebas estadísticos se eliminó un dato de los recolectados con los arboles en pendiente, específicamente el dato #29, pués tras realizar las pruebas de normalidad, solo esa columna de datos estaba mostrando una distribución anormal, así que luego de una prueba para determinar si había datos outliers se llegó a la conclusión de que ese era el valor que estaba generando el problema y se optó por eliminarlo. El dato eliminado correspondía a un árbol que según la medición, poseía una altura muy elevada en comparación con su DAP.

El análisis de normalidad realizado en los los DAP y Alturas de ambos terrenos, indicó que todas las muestras obtenidad poseían una distribución normal (p>0.05), al conocer eso se analizaron las varianzas y se encontró que las poblaciones de arboles en los dos terrenos eran homogeneas (p>0.05). Por poseer muestras con una distribución normal, provenientes de poblaciones homogeneas y con una varianza desconocida, entonces se optó por realizar una prueba de T-Student, para saber si entre ambas poblaciones habían diferencias significativas y saber si descartar o aceptar mi H0. Según los resultados obtenidos de la prueba T-Student (p<0.05), se descarta la H0 y se comprueba que efectivamente existe una variación entre las medidas de los árboles de la especie Eucalyptus tereticornis ante las distintas condiciones de terreno (Fig. 3). Para intentar explicar estas diferencias se usó la humedad relativa que poseían las muestras de tierra analizadas, que una vez secadas, se encontró que las muestras tomadas de suelos planos, efectivamente tenían mayor porcentaje de humedad (31.55 %) en comparación con la humedad que poseía el suelo en pendiente (26.87 %) (Fig 4.), por lo tanto una mayor retención de liquidos y nutrientes que ayudan al mejor desarrollo de los árboles en terrenos sin pendientes.


par(mfrow=c(1,2))
boxplot(Pendiente2$DAP, Plano$DAP,
        main = "Diametros",
        ylab = "DAP(cm)",
        names = satán,
        col="#92C30E")
boxplot(Pendiente2$ALT, Plano$ALT,
        main = "Alturas",
        ylab = "Altura(m)",
        names = satán,
        outline = F,
        col="#0FD587")

Fig. 3: Diferencias entre los diametros y alturas de los árboles en los distintos tratamientos de terreno. Diametros (izquierda), Alturas (derecha).


Tierra2<-c(26.86803, 31.55415)
belcebu<-c("Pendiente", "Plano")
barplot(Tierra2, names = belcebu, space = 0.1, ylab = "Humedad relativa (%mL/g)", col = "#927C21", border = "#34220E", main = "Humedad de los suelos")

Fig. 4: Porcentajes de humedad en las tierras obtenidad en terrenos en pendiente y en plano.


Una vez descartada la Hipótesis alternativa propuesta en el planteamiento inicial del proyecto, se dió paso a la elaboración de un modelo de regresión lineal para explicar a futuros investigadores de una manera más sencilla en el campo, un aproximado de como podrían comportarse los árboles de la misma especie en condiciones similares. Para elaborar el modelo de regresión lineal primero se realizó una correlación por el metodo de Pearson para analizar la dependencia de la altura con respecto al DAP, en los terrenos planos, o en los terrenos con pendientes aproximadas a 18° de inclinación. Y en ambos casos el resultado fue una correlación positiva moderada (Coef. de Relación ~0.50, p<0.05) (Fig. 5), esta correlación explica en un ~21% la relación que hay entre el desarrollo del DAP y la altura del árbol en ambos tratamientos de terreno. Esto es porque hay muchos más factores que afectan el desarrollo de estos árboles y no estuvieron presentes en este estudio, como la temperatura y la precipitación (Binkley, D., 2017).


GrafCor1 <- data.frame(Plano$ALT,Plano$DAP)
chart.Correlation(GrafCor1)

GrafCor2 <- data.frame(Pendiente2$ALT,Pendiente2$DAP)
chart.Correlation(GrafCor2)

Fig. 5: Correlación Pearson para los terrenos en Plano (arriba) y en Pendiente (abajo)


Al saber que la correlación tanto en terrenos en pendiente como en terrenos planos, entre ambos factores es significativa, se procedió a realizar un modelo de regresión lineal para cada tratamiento de terreno, en el que se explicó la altura en base al DAP de los árboles, sin embargo, este modelo solo es funcional con árboles que tengan aproximadamente 4 años de edad o posean diemtros que estén entre los intervalos de (8.3 cm - 16.6) en el caso de los terrenos planos y diametros entre (5.9 - 13.1) para terrenos en pendiente. Éste tipo de modelos se podrían realizar a gran escala, analizando los árboles jovenes desde los inicios de su tejido maderoso, hasta la edad aproximada en que dejen de ser productivos dendroenergéticamente, para conocer si alguna plantación está creciendo de la manera optima, de su principio a su fin, simplemente con conocer el DAP de los árboles, que es una medida sencilla de tomar.

Los resultados de estas regresiones fueron graficados junto con la recta de mejor ajuste siguiendo las siguientes funciones (Fig. 6): Recta en plano: y = 7.5057 + 0.2253x. Recta en pendiente: y = 5.6842 + 0.2216x.


ggplot(Regresion, aes(x=Plano$DAP, y=Plano$ALT)) +
  geom_point(shape=16) +
  geom_smooth(method=lm) + labs(y="Altura (m)", x="DAP (cm)") + theme_classic(base_size = 16) + ggtitle("Regresión en Plano")

ggplot(Regresion2, aes(x=Pendiente2$DAP, y=Pendiente2$ALT)) +
  geom_point(shape=16) +
  geom_smooth(method=lm) + labs(y="Altura (m)", x="DAP (cm)") + theme_classic(base_size = 16) + ggtitle("Regresión en Pendiente")

Fig. 6: Recta de mejor ajuste para el modelo de regresión lineal de los terrenos en plano (arriba) y pendiente (abajo).

Recta en plano: y = 7.5057 + 0.2253x

Recta en pendiente: y = 5.6842 + 0.2216x



Conclusiones


- Se presentaron diferencias significativas entre la altura y diámetro de los individuos en ambos tratamientos de terreno (plano y pendiente), demostrando individuos más robustos en terreno en plano contra el terreno en pendiente

- La escorrentía del terreno en pendiente aumentan el almacenamiento de humedad del terreno plano, siempre y cuando éste se encuentre colindando con el punto más bajo de la pendiente, por tanto, la disposición de nutrientes es mayor en el terreno plano, lo que favorece el aumento en la tasa de crecimiento arbóreo y desarrollo de los árboles

- Se estableció un modelo de estimación de crecimiento entre diámetro y altura de la especie Eucalyptus tereticornis que explica la relación entre arboles en terrenos planos o pendientes que tengan edades de aproximadamente 4 años.



Agradecimientos


A la estudiante de Ingeniería Forestal del Instituto Tecnológico de Costa Rica, Priscila Monserrat Solano Solano quién desinteresadamente nos apoyó en el diseño experimental, la busqueda de bibliografía, y nos acompañó el día del muestreo desde el inicio hasta el final y ayudó en la recolección de los datos.




Bibliografía


Binkley, D., Campoe, O. C., Alvares, C., Carneiro, R. L., Cegatta, Í., Stape, J. L. (2017). The interactions of climate, spacing and genetics on clonal Eucalyptus plantations across Brazil and Uruguay. Forest Ecology and Management, 405, 271-283.

Cornelius, J. P., Corea, E. A., Mesén, J. F. (1995). Genetic variation in height growth and leaf colour of Eucalyptus deglupta Blume at ages up to 16 months in Costa Rica. Forest Ecology and Management, 75(1-3), 49-59.

Detlefsen, G., Somarriba, E. (2012). Producción de madera en sistemas agroforestales de Centroamérica. Ministry for Foreing Affairs of Finland y CATIE, Turrialba, Costa Rica.

Imana-Encinas, J. (1998). Dasometría práctica. Brasilia, Brasil. Universidad de Brasilia.

Muñoz, F., Espinosa, M., HERRERA, M. A., & Cancino, J. (2005). Características del crecimiento en diámetro, altura y volumen de una plantación de Eucalyptus nitens sometida a tratamientos silvícolas de poda y raleo. Bosque (Valdivia), 26(1), 93-99.

Rocha, J. E. (2017). Relación altura comercial-diámetro y abundancia-clase diamétrica en los árboles de un bosque de colina baja, Maynas, Loreto, Perú -2015. Universidad Nacional de la Amazonia Peruana, Iquito, Perú

Rubiano, D. J. (2010). Variabilidad espacial de las propiedades del suelo en relación con su producción, en plantaciones industriales de ceiba roja (Pachira quinata), Tesis de Maestría en Geomántica. Facultad de Agronomía. Universidad Nacional de Colombia. Bogotá, Colombia.

Schaller, M., Schroth, G., Beer, J., & Jiménez, F. (2003). Species and site characteristics that permit the association of fast-growing trees with crops: the case of Eucalyptus deglupta as coffee shade in Costa Rica. Forest Ecology and Management, 175(1-3), 205-215.

Suarez Díaz, J. (2009). Deslizamientos: Técnicas de Remediación, Volumen 2. Santander, Colombia. Universidad Industrial de Santander

Wabo, E. (2002). Medición de diametros, alturas y edad del árbol. Mimeografiado, La Plata, Argentina.

LS0tDQp0aXRsZTogIioqRGlmZXJlbmNpYXMgZGUgY3JlY2ltaWVudG8gZGUgw6FyYm9sZXMgZGUgKkV1Y2FseXB0dXMgdGVyZXRpY29ybmlzKiBlbiBwZW5kaWVudGUgeSBlbiB0ZXJyZW5vIHBsYW5vKioiDQpzdWJ0aXRsZTogIiMjTWFyY28gUG9ycmFzIEzDs3BleiwgSnVsacOhbiBHw7NtZXogQ2FzdHJvLCBKZXPDunMgSGVycmVyYSBNb3JhLCBKdWFuIE1pZ3VlbCBQw6lyZXogU290bywgUGFibG8gUm9qYXMgQ8OhcmRlbmFzIg0KYXV0aG9yOiAiIyMjRmFjdWx0YWQgZGUgQ2llbmNpYXMgRXhhY3RhcyB5IE5hdHVyYWxlcywgRXNjdWVsYSBkZSBDaWVuY2lhcyBCaW9sw7NnaWNhcywgVW5pdmVyc2lkYWQgTmFjaW9uYWwgZGUgQ29zdGEgUmljYSwgSGVyZWRpYSwgQ29zdGEgUmljYSINCmRhdGU6ICIjIyNWaWVybmVzIDIgZGUgTm92aWVtYnJlLCAyMDE4Ig0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgdG9jOiB0cnVlDQogIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogVFJVRQ0KLS0tDQo8ZGl2IGNsYXNzPXRleHQtanVzdGlmeT4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQpyZWFkLnRhYmxlKCJjbGlwYm9hcmQiLCBoPVQpIC0+UGxhbm8NCnJlYWQudGFibGUoImNsaXBib2FyZCIsIGg9VCkgLT5QZW5kaWVudGUNClBlbmRpZW50ZVstMjksIF0tPlBlbmRpZW50ZTINCnNhdMOhbjwtYygiUGVuZGllbnRlIiwiUGxhbm8iKQ0KYGBgDQoNCjxicj4NCg0KIyoqUmVzdW1lbioqDQoNCjxicj4NCg0KIyMjIyBMYXMgcGxhbnRhY2lvbmVzIGRlbmRyb2VuZXJnw6l0aWNhcyBjb21vIGZ1ZW50ZSBkZSBwcm9kdWNjacOzbiBkZSBiaW9tYXNhIHN1ZWxlbiBlc3RhciBlbmZvY2FkYXMgYSBsYSBzaWVtYnJhIGRlIGFyYm9sZXMgcGFyYSBzdSBhcHJvdmVjaGFtaWVudG8gY29tbyBjYXJib25vIGRlc3B1w6lzIGRlIHRhbGFkYXMsIHBvciBlc3RlIG1vdGl2bywgcmVxdWllcmVuIHNlciBtb25pdG9yZWFkYXMgeSBlc3R1ZGlhZGFzIHBhcmEgYXPDrSBsb2dyYXIgZWwgbWF5b3IgcmVuZGltaWVudG8gcG9zaWJsZS4gRWwgw6FyYm9sICpFdWNhbHlwdHVzIHRlcmV0aWNvcm5pcyogdGllbmUgdW4gcsOhcGlkbyBjcmVjaW1pZW50byB5IGFsdGEgcGxhc3RpY2lkYWQgZWNvbMOzZ2ljYSBsbyBxdWUgbG8gY29udmllcnRlIGVuIHVuIGluZGl2aWR1byBtdXkgYXB0byBwYXJhIGVzdGUgdGlwbyBkZSBwbGFudGFjaW9uZXMuIFNlZ8O6biBsYSBsaXRlcmF0dXJhIGxhIGluY2xpbmFjacOzbiBlbiB1biB0ZXJyZW5vIHRpZW5lIHVuIGVmZWN0byBuZWdhdGl2byBzb2JyZSBlbCBkZXNhcnJvbGxvIGRlIGRpc3RpbnRvcyDDoXJib2xlcywgcG9yIGxvIHF1ZSBlbiBlc3RlIGVzdHVkaW8gc2UgYnVzY8OzIGVuY29udHJhciBzaSBleGlzdMOtYSBlc3RlIG1pc21vIHRpcG8gZGUgZWZlY3RvIHNvYnJlIGxvcyDDoXJib2xlcyBkZSBlc3RhIGVzcGVjaWUsIGNvbXBhcmFuZG8gbG9zIGRpYW1ldHJvcyB5IGFsdHVyYXMgZW4gZG9zIHRyYXRhbWllbnRvcyBkZSBzdWVsb3MuIEFkZW3DoXMgZGUgZXN0byBzZSBkZXNhcnJvbGzDsyB1biBtb2RlbG8gbGluZWFsIGRlIGxhIHJlbGFjacOzbiBkZSBsYSBhbHR1cmEgZW4gYmFzZSBhbCBkaWFtZXRybyBkZSBsb3MgYXJib2xlcyBlbiBhbWJvcyB0cmF0YW1pZW50b3MuDQojIyMjIFBhcmEgcmVhbGl6YXIgZWwgZXN0dWRpbyBzZSBzZWxlY2Npb25hcm9uIGxvcyBkb3MgdGlwb3MgZGUgdGVycmVub3MgbHVlZ28gZGUgYW5hbGl6YXIgbGEgcGVuZGllbnRlIHF1ZSB0ZW7DrWFuLCB5IHNlIHRvbWFyb24gbG9zIGRhdG9zIGRlIGxvcyDDoXJib2xlcyBlbiB0ZXJyZW5vIHBsYW5vIHkgZW4gdGVycmVubyBlbiBwZW5kaWVudGUuIEFkZW3DoXMgZGUgbXVlc3RyYXMgZGUgdGllcnJhIGRlIGFtYm9zIHRlcnJlbm9zIHBhcmEgY2FyYWN0ZXJpemFyIGVsIHRlcnJlbm8gcG9yIHN1IGh1bWVkYWQgcmVsYXRpdmEuIENvbiBlc3RvcyBkYXRvcyB0cmFzIHJlYWxpemFyIHBydWViYXMgZXN0YWTDrXN0aWNhcyBzZSBjb21wcm9iw7MgcXVlIGhheSB1bmEgY2xhcmEgZGlmZXJlbmNpYSBlbnRyZSBsb3Mgw6FyYm9sZXMgcXVlIGNyZWPDrWFuIGVuIGFtYm9zIHRlcnJlbm9zIHkgc2UgY29tcHJvYsOzIHF1ZSBoYWLDrWEgdW5hIGNvcnJlbGFjacOzbiBwb3NpdGl2YSBtb2RlcmFkYSBlbnRyZSBlbCBkZXNhcnJvbGxvIGRlIGxhIGFsdHVyYSB5IGVsIGRpYW1ldHJvIGRlIGxvcyDDoXJib2xlcy4gQSBzdSB2ZXosIHNlIGRlc2Fycm9sbMOzIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBwYXJhIHBvZGVyIGhhY2VyIGVzdGltYWNpb25lcyBkZSBsYXMgYWx0dXJhcyBlbiBiYXNlIGEgbG9zIGRpYW1ldHJvcyBkZSBsb3Mgw6FyYm9sZXMuDQoNCjxicj4NCg0KIyMjIyoqUGFsYWJyYXMgQ2xhdmU6KiogKkV1Y2FseXB0dXMgdGVyZXRpY29ybmlzKiwgZGVuZHJvbWV0csOtYSwgcGxhbnRhY2nDs24gZGVuZHJvZW5lcmfDqXRpY2EsIERBUCwgY29ycmVsYWNpw7NuDQoNCjxicj4NCg0KIyoqSW50cm9kdWNjacOzbioqDQoNCjxicj4NCg0KIyMjIyBMYXMgcGxhbnRhY2lvbmVzIGZvcmVzdGFsZXMgc29uIHpvbmFzIHByb2R1Y3RpdmFzIGRlIG1hZGVyYSAoYmlvbWFzYSBjb21vIG1hdGVyaWEgcHJpbWEpLCBxdWUgYnVzY2FuIHNlbGVjY2lvbmFyIGVsIG1lam9yIHRpcG8gZGUgw6FyYm9sIHkgbW9uaXRvcmVhciBzdSBkZXNhcnJvbGxvIHBhcmEgYXPDrSBjdW1wbGlyIGVsIG9iamV0aXZvIGRlIGxhIHBsYW50YWNpw7NuIHkgb2J0ZW5lciB1biBtYXlvciByZW5kaW1pZW50bywgcG9yIGVzdGUgbW90aXZvLCBzZSBidXNjYSBvYnRlbmVyIGluZm9ybWFjacOzbiBzb2JyZSBsYXMgdmFyaWFjaW9uZXMgZGUgY3JlY2ltaWVudG8gYsOhc2ljYXMgZGUgbG9zIMOhcmJvbGVzIGVuIGRpY2hhcyBwbGFudGFjaW9uZXMsIGFzw60gY29tbyBsYSBjYXJhY3Rlcml6YWNpw7NuIGRlbCB0ZXJyZW5vIGVuIGVsIHF1ZSBzZSBlbmN1ZW50cmEuIFkgY29uIGVzdG9zIHZhbG9yZXMgc2UgcHVlZGUgbGxlZ2FyIGEgY29tcGFyYWNpb25lcyBpbXBvcnRhbnRlcyBkZW50cm8gZGUgbG9zIG9iamV0aXZvcyBwYXJhIGxvcyBjdWFsZXMgZnVlICBpbnN0YXVyYWRhIGxhIHBsYW50YWNpw7NuIChEZXRsZWZzZW4sIEcuLCBTb21hcnJpYmEsIEUuLCAyMDEyKS4NCiMjIyMgVW5hIHBsYW50YWNpw7NuIGRlbmRyb2VuZXJnw6l0aWNhLCBidXNjYSB1bmEgbWF5b3IgcHJvZHVjY2nDs24gZGUgYmlvbWFzYSBkZSBzdXMgZWplbXBsYXJlcyBwYXJhIHN1IGFwcm92ZWNoYW1pZW50byBhbCBnZW5lcmFyIGVuZXJnaWEgZWxlY3RyaWNhIG8gdGVybWljYSwgcG9yIGxvIHRhbnRvIHNlIGRlc2VhbiBnZW5lcmFyIGluZGl2aWR1b3Mgcm9idXN0b3MsIHF1ZSBkZW11ZXN0cmVuIHVuIGFsdG8gw61uZGljZSBkZSBjYXB0YWNpw7NuIGRlIGNhcmJvbm8gKERldGxlZnNlbiwgRy4sIFNvbWFycmliYSwgRS4sIDIwMTIpLiBMYSBlc3BlY2llICpFdWNhbHlwdHVzIHRlcmV0aWNvcm5pcyogZXMgdW4gw6FyYm9sIG11eSBhcHRvIHBhcmEgZXN0ZSB1c28sIHB1ZXMgZXMgZGUgcsOhcGlkbyBjcmVjaW1pZW50bywgY29uIGFsdGEgdG9sZXJhbmNpYSBhIGRpc3RpbnRvcyBjbGltYXMsIHkgYWwgc2VyIGNvcnRhZGEgdW5hIHZleiBwdWVkZSBnZW5lcmFyIHJlYnJvdGVzIGRlc2RlIGVsIHRyb25jbyBiYXNlLCBsbyBxdWUgYXVtZW50YSBzdSBjYXBhY2lkYWQgZGUgZ2VuZXJhY2nDs24gZGUgYmlvbWFzYS4gKE11w7FveiwgRi4sIEVzcGlub3NhLCBNLiwgSGVycmVyYSwgTS4sIENhbmNpbm8sIEouLCAyMDA1KSwgQ29uIGxhICBkZW5kcm9tZXRyw61hLCBxdWUgc2UgZW50aWVuZGUgY29tbyBsYSBtZWRpY2nDs24geSBlc3RpbWFjacOzbiBkZSBsYXMgZGltZW5zaW9uZXMgZGUgw6FyYm9sZXMgdXRpbGl6YW5kbyBoZXJyYW1pZW50YXMgZXN0YWTDrXN0aWNhcyBzZSBwdWVkZW4gbW9uaXRvcmVhciBsYXMgZGltZW5zaW9uZXMgYsOhc2ljYXMgbG9zIMOhcmJvbGVzIGNvbW8gZGnDoW1ldHJvcyB5IGFsdHVyYXMgeSBhc8OtIHRvbWFyIGRlY2lzaW9uZXMgYWNlcmNhIGRlIGxhcyBjb25kaWNpb25lcyBtw6FzIMOzcHRpbWFzIHBhcmEgZWwgY3VsdGl2byBkZSBlc3RvcyBpbmRpdmlkdW9zIHkgc3UgcmVsYWNpw7NuIGNvbiBsb3MgdGlwb3MgZGUgc3VlbG8gbyBmZXJ0aWxpemFudGVzIHF1ZSBzZSB1dGlsaWNlbiBlbiBzdSBkZXNhcnJvbGxvIChXYWJvLCBFLiAyMDAyKQ0KIyMjIyBQcmluY2lwYWxtZW50ZSBsYSBpbmNsaW5hY2nDs24geSBsYSBodW1lZGFkIGRlbCDDoXJlYSBkZSBjdWx0aXZvIHNvbiBkZSBsYXMgdmFyaWFibGVzIG3DoXMgZXN0dWRpYWRhcyBlbiBlc3RlIHRpcG8gZGUgcGxhbnRhY2lvbmVzLCBwdWVzIGxhIHBlbmRpZW50ZSBkZSB1biB0ZXJyZW5vIHN1ZWxlIGltcGxpY2FyIHF1ZSBsb3MgbnV0cmllbnRlcyBzZSBlc2N1cnJhbiBvIHN1ZWxlIGRlc2Fycm9sbGFyIHJlc2lzdGVuY2lhIGFsIGNyZWNpbWllbnRvIGRlIHVuIGRldGVybWluYWRvIMOhcmJvbCwgeSBlbiBzZWd1bmRvIGx1Z2FyLCBlbCBwb3JjZW50YWplIGRlIGh1bWVkYWQgZW4gY2FkYSB1bmEgZGUgZXN0YXMgw6FyZWFzIHNlIHVzYSBjb24gZWwgZmluIGRlIG9idGVuZXIgdW5hIGlkZWEgZGVsIHBvcnF1w6kgaGF5IHVuIG1lam9yIG8gcGVvciBkZXNhcnJvbGxvIGRlIGxvcyDDoXJib2xlcyAoUnViaWFubywgRC4gSi4sIDIwMTApLiANCiMjIyMgRXN0dWRpb3MgZGUgZXN0ZSB0aXBvIHNlIGRpc2XDsWFuIHBhcmEgbWF4aW1pemFyIHJlbmRpbWllbnRvcyBhIGVzY2FsYSBpbmR1c3RyaWFsIGVuIGRvbmRlIGxvcyBwb3JjZW50YWplcyBkZSBww6lyZGlkYSBkZSBjYXB0YWNpw7NuIGRlIGJpb21hc2Egc2UgZGViZW4gZGUgbWluaW1pemFyIHkganVudG8gYSBlc3RvIHNlIHB1ZWRlIGxsZWdhciBhIG3DqXRvZG9zIHBhcmEgbGEgYWdpbGl6YWNpw7NuIGRlIGxhIHRvbWEgZGUgZGF0b3MsIG1lZGlhbnRlIGFuw6FsaXNpcyBlc3RhZMOtc3RpY29zIGNvbW8gbG9zIHF1ZSBzZSBsbGV2YXLDoW4gYWNhYm8uDQoNCg0KPGJyPg0KPGJyPg0KDQohW10oRFNDXzk1MDAuanBnKTxjZW50ZXI+DQojIyMjRmlnLiAxOiDDgXJib2xlcyBkZSBFdWNhbGlwdG8NCg0KPGJyPg0KPGJyPg0KDQojKipIaXDDs3Rlc2lzKioNCg0KPGJyPg0KDQojIyMjKipIaXDDs3Rlc2lzIG51bGE6KioNCiMjIyMgIE5vIGV4aXN0ZSB2YXJpYWNpw7NuIGVudHJlIGxhcyAgIG1lZGlkYXMgZGUgbG9zIMOhcmJvbGVzIGRlIGxhICAgZXNwZWNpZSAqRXVjYWx5cHR1cyB0ZXJldGljb3JuaXMqICAgYW50ZSBsYXMgZGlzdGludGFzIGNvbmRpY2lvbmVzIGRlICAgdGVycmVubw0KIyMjIyoqSGlww7N0ZXNpcyBhbHRlcm5hdGl2YToqKg0KIyMjIyAgRXhpc3RlIHZhcmlhY2nDs24gZW50cmUgbGFzICAgbWVkaWRhcyBkZSBsb3Mgw6FyYm9sZXMgZGUgbGEgICBlc3BlY2llICpFdWNhbHlwdHVzIHRlcmV0aWNvcm5pcyogICBhbnRlIGxhcyBkaXN0aW50YXMgY29uZGljaW9uZXMgZGUgICB0ZXJyZW5vDQoNCjxicj4NCjxicj4NCg0KIyoqT2JqZXRpdm9zKioNCg0KPGJyPg0KDQojIyMjKipPYmpldGl2byBHZW5lcmFsOioqDQojIyMjICAxLkV2YWx1YXIgbGEgdmFyaWFjacOzbiBlbiBlbCBjcmVjaW1pZW50byBkZSBsb3Mgw6FyYm9sZXMgZGUgbGEgZXNwZWNpZSAqRXVjYWx5cHR1cyB0ZXJldGljb3JuaXMqIGVuIGRpc3RpbnRhcyBjb25kaWNpb25lcyBkZSB0ZXJyZW5vLg0KIyMjIyoqT2JqZXRpdm9zIGVzcGVjw61maWNvczoqKg0KIyMjIyAgMS5Db21wYXJhciBlbCBjcmVjaW1pZW50byAoREFQIHkgYWx0dXJhKSBkZSBsb3Mgw6FyYm9sZXMgZW4gZGlzdGludGFzIHBlbmRpZW50ZXMgeSByZWxhY2lvbmFybG8gY29uIGxhIGh1bWVkYWQgcmVsYXRpdmEgZGVsIHN1ZWxvLg0KIyMjIyAgMi5Fc3RpbWFyIG1lZGlhbnRlIHVuIG1vZGVsbyBsaW5lYWwgbGEgcmVsYWNpw7NuIGVudHJlIGVsIGNyZWNpbWllbnRvIGRlbCBkacOhbWV0cm8geSBsYSBhbHR1cmEgZGUgbG9zIMOhcmJvbGVzLg0KDQo8YnI+DQo8YnI+DQoNCiMqKk1hdGVyaWFsZXMgeSBNw6l0b2RvcyoqDQoNCjxicj4NCg0KIyMjIyBMYSB0b21hIGRlIGRhdG9zIGZ1ZSBkZXNhcnJvbGxhZGEgZW4gdW5hIHBsYW50YWNpw7NuIGRlbmRyb2VuZXJnw6l0aWNhIGRlICpFdWNhbHlwdHVzIHRlcmV0aWNvcm5pcyosIHViaWNhZGEgZW4gZWwgSW5zdGl0dXRvICBUZWNub2zDs2dpY28gZGUgQ29zdGEgUmljYSwgZW4gQ2FydGFnbywgQ29zdGEgUmljYSAoOS44NDg0ODI2LCAtODMuOTEwMDE1NiksIGNvbiBpbmRpdmlkdW9zIGRlIDQgYcOxb3MgZGUgZWRhZCwgZG9uZGUgc2Ugc2VsZWNjaW9uYXJvbiAzMCDDoXJib2xlcyBxdWUgZXN0dXZpZXJhbiBlbiB0ZXJyZW5vIGVuIHBsYW5vIHkgMzAgZW4gIHRlcnJlbm8gZGUgZW4gcGVuZGllbnRlLiBMYSB0b21hIHNlIHJlYWxpesOzIGVsIHPDoWJhZG8gMTUgZGUgc2V0aWVtYnJlIGRlIDIwMTggZGUgOTowMCBhbSBhIDM6MDAgcG0uDQojIyMjIFNlIHNlbGVjY2lvbmFyb24gbG9zIGluZGl2aWR1b3MgYSBtZWRpciBkZSBtYW5lcmEgYWxlYXRvcmlhLCB0b21hZG9zIGRlIGxhcyBmaWxhcyBkZSDDoXJib2xlcyBwbGFudGFkb3MgcXVlIG5vIGVzdHV2aWVyYW4gbXV5IGNlcmNhbmFzIGEgbG9zIGJvcmRlcyBkZSBsYSBwbGFudGFjacOzbiBuaSBjZXJjYW5hcyBhIGxhIGNhbGxlIHBhcmEgZXZpdGFyIHVuIGVmZWN0byBiYXJyZXJhIGVuIHF1ZSBsb3MgYXJib2xlcyBkZSBsb3MgYm9yZGVzIGh1YmllcmFuIGNyZWNpZG8gY29uIHVuYSBkaXN0aW50YSBkaXNwb25pYmlsaWRhZCBkZSBTb2wgeSBudXRyaWVudGVzLg0KIyMjIyBFbCBlcXVpcG8gdXRpbGl6YWRvIHBhcmEgcmVhbGl6YXIgbGFzIG1lZGljaW9uZXMgZnVlOiBDbGlub21ldHJvIChGaWcuIDIuYSkgcGFyYSBvYnNlcnZhciBlbCBwb3JjZW50YWplIGRlIGVsZXZhY2nDs24gdGFudG8gYSBsYSBiYXNlIGNvbW8gYSBsYSBjb3BhIGRlbCDDoXJib2wgcGFyYSBvYnRlbmVyIGxhIGFsdHVyYSBkZWwgw6FyYm9sLCB5IHBhcmEgb2J0ZW5lciBsYXMgcGVuZGllbnRlcyBkZSBsb3MgdGVycmVub3MsIGNpbnRhIGRpYW3DqXRyaWNhIChGaWcuIDIuZCkgcGFyYSAgb2J0ZW5lciBlbCBkacOhbWV0cm8gZGUgbG9zIHRyb25jb3MsIGNpbnRhIG3DqXRyaWNhIChGaWcgMi5jKSBwYXJhIG1lZGlyIGxhIGRpc3RhbmNpYSBob3Jpem9udGFsIGVudHJlIGVsIG9ic2VydmFkb3IgeSBlbCDDoXJib2wsIHkgcG9yIMO6bHRpbW8gc2UgdXRpbGl6YXJvbiBjdWF0cm8gY2lsaW5kcm9zIChGaWcgMi5iKSBjb24gbGEgbWlzbWFzIGRpbWVuc2lvbmVzIHBhcmEgb2J0ZW5lciBtdWVzdHJhcyBkZSBzdWVsbyB0YW50byBlbiBwZW5kaWVudGUgY29tbyBlbiBwbGFuby4NCg0KPGJyPg0KPGJyPg0KDQo8Y2VudGVyPiAhW10oRmlndXJhMi5qcGcpIDxjZW50ZXI+DQojIyMjRmlnLiAyOiBJbnN0cnVtZW50b3MgZGUgbWVkaWNpw7NuIHV0aWxpemFkb3MgZHVyYW50ZSBsYSB0b21hIGRlIGRhdG9zOiBhKSBDbGlub21ldHJvLCBiKUNpbGluZHJvcyBtZXRhbGljb3MsIGMpIENpbnRhIG1ldHJpY2EsIGQpIENpbnRhIGRpYW3DqXRyaWNhLg0KDQo8YnI+DQo8YnI+DQoNCiMjIyMqKkRpc2XDsW8gZGVsIG11ZXN0cmVvIHkgc2VsZWNjacOzbiBkZSBkYXRvczoqKiBDb24gZWwgZmluIGRlIGNvbm9jZXIgbGEgdmFyaWFjacOzbiBlbiBlbCBjcmVjaW1pZW50byBkZSBsYSBlc3BlY2llICpFdWNhbHlwdHVzIHRlcmV0aWNvcm5pcyogZW4gdGVycmVub3MgY29uIGRpc3RpbnRhcyBwZW5kaWVudGVzLCBzZSBwcm9jZWRpw7MgYSAgbWVkaXIgZWwgZGnDoW1ldHJvIGEgbGEgYWx0dXJhIGRlbCBwZWNobyAoREFQKSBlbiBjZW50w61tZXRyb3MsIGFzw60gY29tbyBzdSBhbHR1cmEgZW4gbWV0cm9zLiBQYXJhIG1lZGlyIGxhIGFsdHVyYSBkZSBsb3Mgw6FyYm9sZXMgc2UgdXRpbGl6w7MgdW4gY2xpbsOzbWV0cm8gZWwgY3VhbCB1c2EgZG9zIGVzY2FsYXMgdW5hIGVuIGdyYWRvcyB5IG90cmEgZW4gcG9yY2VudGFqZSBkZSBlbGV2YWNpw7NuLCBzZSB1dGlsaXrDsyBlc3RhIMO6bHRpbWEgZXNjYWxhIHkgc2UgcHJvY2VkacOzIGEgb2J0ZW5lciBkb3MgbWVkaWNpb25lcyBkZSBwb3JjZW50YWplIGRlIGVsZXZhY2nDs24gcG9yIMOhcmJvbCBhIHVuYSBkaXN0YW5jaWEgaG9yaXpvbnRhbCBjb25zdGFudGUgZGV0ZXJtaW5hZGEgcG9yIHVuYSBjaW50YSBtw6l0cmljYSAsZW4gZG9uZGUsIHNlIHRvbWEgdW5hIG1lZGljacOzbiBhcHVudGFuZG8gYSBsYSBiYXNlIHkgbWFudGVuaWVuZG8gZWwgbWlzbW8gcHVudG8gZGUgcmVmZXJlbmNpYSwgb3RyYSBhcHVudGFuZG8gYSBsYSBjb3BhICwgbGEgZGlzdGFuY2lhIGhvcml6b250YWwgeSBsYXMgZG9zIG1lZGljaW9uZXMgZGUgcG9yY2VudGFqZXMgc2UgcmVsYWNpb25hbiBwb3IgbGEgc2lndWllbnRlIGbDs3JtdWxhOg0KDQojIyMjIEFsdHVyYSAobSkgPSAoKCUgQmFzZSArICUgQ29wYSkvMTAwKSpEaXN0Lkhvcml6b250YWwgKG0pDQoNCiMjIyMgUGFyYSBlbCBkacOhbWV0cm8gZGUgbG9zIMOhcmJvbGVzLCBsYSBtZWRpZGEgc2UgdG9tw7MgYXByb3hpbWFkYW1lbnRlIGEgdW5vcyAxLjMwIG1ldHJvcyBkZSBhbHR1cmEgIGRlc2RlIGVsICBuaXZlbCBkZWwgc3VlbG8sIG1hbnRlbmllbmRvIGVzdGEgcmVmZXJlbmNpYSBkZSBhbHR1cmEgcGFyYSB0b2RvcyBsb3Mgw6FyYm9sZXMgZGUgbGEgcGxhbnRhY2nDs24uDQojIyMjIFNlIHByb2NlZGnDsyBhIG1lZGlyIHRhbWJpw6luIGxhIGh1bWVkYWQgcmVsYXRpdmEgZGUgbG9zIHN1ZWxvcyBkZSBjYWRhIHVuYSBkZSBsb3MgdGVycmVub3MgZXN0dWRpYWRvcyAocGxhbm8geSBwZW5kaWVudGUpLCBwYXJhIGVsbG8gc2UgcmVjb2xlY3Rhcm9uIDUgbXVlc3RyYXMgZW4gY2FkYSB1bm8sIGhhY2llbmRvIHVzbyBkZSB1biBjaWxpbmRybyBtZXTDoWxpY28sIHBvc3Rlcmlvcm1lbnRlIHNlIHBlc2Fyw7NuIGVuIGVsIGxhYm9yYXRvcmlvIHkgc2UgcHJvY2VkZSBhIHNlY2FyIGVuIHVuIGhvcm5vIGxhcyBtdWVzdHJhcyBhIDYwIGdyYWRvcyBwb3IgIDkyIGhvcmFzLCBzZWd1aWRhbWVudGUgc2UgdnVlbHZlbiBhIHBlc2FyIHkgbGEgaHVtZWRhZCByZWxhdGl2YSBzZSBvYnRpZW5lIGFsIGFwbGljYXIgbGEgZsOzcm11bGE6DQoNCiMjIyMgUG9yY2VudGFqZSBkZSBIdW1lZGFkICglKSA9ICgoUGVzbyBow7ptZWRvIChnKSArIFBlc28gc2VjbyAoZykpL1Blc28gaHVtZWRvIChnKSkqMTAwDQoNCiMjIyMgTG9zIGRhdG9zIGZ1ZXJvbiBpbmdyZXNhZG9zIGEgT2ZmaWNlIEV4Y2VsIGNvbW8gY3VhZHJvcyBkZSBkYXRvcyBwYXJhIHBvc3Rlcmlvcm1lbnRlIHNlciBhbmFsaXphZG9zIGVuIFIgY29uIGxhIGF5dWRhIGRlIFJTdHVkaW8uDQojIyMjIEEgbGFzIG11ZXN0cmFzIHNlIGxlcyByZWFsaXphcm9uIHBydWViYXMgZGUgU2hhcGlyby1XaWxrIHBhcmEgdmVyaWZpY2FyIGxhIG5vcm1hbGlkYWQgZGUgbG9zIGRhdG9zLiBQb3N0ZXJpb3IgYSBlc3RvIHNlIHJlYWxpesOzIHVuIGFuw6FsaXNpcyBkZSB2YXJpYW56YXMgcGFyYSB2ZXJpZmljYXIgbGEgaG9tb2dlbmVpZGFkIGRlIGxhcyBtdWVzdHJhcy4NCiMjIyMgU2UgYXBsaWPDsyB1bmEgcHJ1ZWJhIGRlIFQtU3R1ZGVudCBwYXJhIHNhYmVyIHNpIGhhYsOtYSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbiBsb3MgdHJhdGFtaWVudG9zIGJham8gbG9zIGN1YWxlcyBzZSBlbmNvbnRyYWJhbiBsb3Mgw6FyYm9sZXMgKHRlcnJlbm8gZW4gcGVuZGllbnRlIHkgZW4gcGxhbm8pDQojIyMjIFBhcmEgcmVhbGl6YXIgdW5hIHJlZ3Jlc2nDs24gbGluZWFsIHByaW1lcm8gc2UgYW5hbGl6w7MgZWwgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24gcGFyYSBzYWJlciBxdWUgdGFuIHJlbGFjaW9uYWRhcyBlc3TDoW4gbGFzIHZhcmlhYmxlcyBlbnRyZSBzw60geSBzYWJlciBxdWUgdGFudG8gc2UgcHVlZGUgZXhwbGljYXIgZXN0YSByZWxhY2nDs24geSBkZXNwdcOpcyBkZSBlc28gc2UgcmVhbGl6w7MgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHBhcmEgY29ub2NlciBsYSBkZXBlbmRlbmNpYSBlbnRyZSBlc3RhcyB2YXJpYWJsZXMNCg0KPGJyPg0KPGJyPg0KDQojKipSZXN1bHRhZG9zKioNCg0KPGJyPg0KDQojIyMjIFNlIG9idHV2aWVyb24gMzAgZGF0b3MgZGUgbGEgYWx0dXJhIGRlIGxvcyDDoXJib2xlcyB5IDMwIGRhdG9zIGRlIGxvcyBkaWFtZXRyb3MgZGUgbG9zIMOhcmJvbGVzLCB0YW50byBlbiBlbCB0ZXJyZW5vIHBsYW5vLCBjb21vIGVuIGVsIHRlcnJlbm8gY29uIHBlbmRpZW50ZS4NCiMjIyMgTG9zIHBvcmNlbnRhamVzIGRlIGh1bWVkYWQgcmVsYXRpdmEgZGUgbGEgdGllcnJhIHNvbjogVGVycmVubyBwbGFubzogMzEuNTUgJSB5IFRlcnJlbm8gZW4gcGVuZGllbnRlOiAyNi44NyAlDQoNCjxicj4NCg0KPGNlbnRlcj4NCg0KIVtdKEN1YWRybzEuanBnKQ0KDQo8Y2VudGVyPg0KDQo8YnI+DQoNCiMjIyNQcnVlYmFzIGRlIFNoYXBpcm8gZW4gUGxhbm8geSBwZW5kaWVudGUNCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoUGxhbm8kREFQKQ0Kc2hhcGlyby50ZXN0KFBsYW5vJEFMVCkNCnNoYXBpcm8udGVzdChQZW5kaWVudGUyJEFMVCkNCnNoYXBpcm8udGVzdChQZW5kaWVudGUyJERBUCkNCmBgYA0KDQo8YnI+DQoNCiMjIyNQcnVlYmFzIGRlIGhvbW9nZW5laWRhZCBkZSB2YXJpYW56YXMNCg0KYGBge3J9DQp2YXIudGVzdChQZW5kaWVudGUyJERBUCxQbGFubyREQVApDQp2YXIudGVzdChQZW5kaWVudGUyJEFMVCxQbGFubyRBTFQpDQpgYGANCg0KPGJyPg0KDQojIyMjUHJ1ZWJhcyBkZSBUIFN0dWRlbnQNCg0KYGBge3J9DQp0LnRlc3QoUGVuZGllbnRlMiREQVAsUGxhbm8kREFQLCB2YXIuZXF1YWwgPSBUKQ0KdC50ZXN0KFBlbmRpZW50ZTIkQUxULFBsYW5vJEFMVCwgdmFyLmVxdWFsID0gVCkNCmBgYA0KDQo8YnI+DQoNCiMjIyNDb3JyZWxhY2nDs24gdGVycmVubyBwbGFubw0KDQpgYGB7cn0NCmNvci50ZXN0KFBsYW5vJEFMVCxQbGFubyREQVApDQowLjQ0OTk0NjJeMg0KYGBgDQoNCjxicj4NCg0KIyMjI0NvcnJlbGFjacOzbiBwZW5kaWVudGUNCg0KYGBge3J9DQpjb3IudGVzdChQZW5kaWVudGUyJEFMVCxQZW5kaWVudGUyJERBUCkNCjAuNDYzNDkyMV4yDQpgYGANCg0KPGJyPg0KDQojIyMjUmVncmVzacOzbiBMaW5lYWwgZW4gUGxhbm8NCg0KYGBge3J9DQpSZWdyZXNpb248LWxtKFBsYW5vJEFMVCB+IFBsYW5vJERBUCwgZGF0YSA9IFBsYW5vKQ0Kc3VtbWFyeShSZWdyZXNpb24pDQpgYGANCg0KPGJyPg0KDQojIyMjUmVncmVzacOzbiBMaW5lYWwgZW4gUGVuZGllbnRlDQoNCmBgYHtyfQ0KUmVncmVzaW9uMjwtbG0oUGVuZGllbnRlMiRBTFQgfiBQZW5kaWVudGUyJERBUCwgZGF0YSA9IFBlbmRpZW50ZTIpDQpzdW1tYXJ5KFJlZ3Jlc2lvbjIpDQpgYGANCg0KPGJyPg0KPGJyPg0KDQo8Y2VudGVyPg0KDQohW10oQ3VhZHJvMi5qcGcpDQo8YnI+DQoNCiFbXShDdWFkcm8zLmpwZykNCg0KPGNlbnRlcj4NCg0KPGJyPg0KPGJyPg0KDQojKipEaXNjdXNpw7NuKioNCg0KPGJyPg0KDQojIyMjIFBhcmEgdG9kb3MgbG9zIGFuw6FsaXNpcyB5IHBydWViYXMgZXN0YWTDrXN0aWNvcyBzZSBlbGltaW7DsyB1biBkYXRvIGRlIGxvcyByZWNvbGVjdGFkb3MgY29uIGxvcyBhcmJvbGVzIGVuIHBlbmRpZW50ZSwgZXNwZWPDrWZpY2FtZW50ZSBlbCBkYXRvICMyOSwgcHXDqXMgdHJhcyByZWFsaXphciBsYXMgcHJ1ZWJhcyBkZSBub3JtYWxpZGFkLCBzb2xvIGVzYSBjb2x1bW5hIGRlIGRhdG9zIGVzdGFiYSBtb3N0cmFuZG8gdW5hIGRpc3RyaWJ1Y2nDs24gYW5vcm1hbCwgYXPDrSBxdWUgbHVlZ28gZGUgdW5hIHBydWViYSBwYXJhIGRldGVybWluYXIgc2kgaGFiw61hIGRhdG9zIG91dGxpZXJzIHNlIGxsZWfDsyBhIGxhIGNvbmNsdXNpw7NuIGRlIHF1ZSBlc2UgZXJhIGVsIHZhbG9yIHF1ZSBlc3RhYmEgZ2VuZXJhbmRvIGVsIHByb2JsZW1hIHkgc2Ugb3B0w7MgcG9yIGVsaW1pbmFybG8uIEVsIGRhdG8gZWxpbWluYWRvIGNvcnJlc3BvbmTDrWEgYSB1biDDoXJib2wgcXVlIHNlZ8O6biBsYSBtZWRpY2nDs24sIHBvc2XDrWEgdW5hIGFsdHVyYSBtdXkgZWxldmFkYSBlbiBjb21wYXJhY2nDs24gY29uIHN1IERBUC4NCiMjIyMgRWwgYW7DoWxpc2lzIGRlIG5vcm1hbGlkYWQgcmVhbGl6YWRvIGVuIGxvcyBsb3MgREFQIHkgQWx0dXJhcyBkZSBhbWJvcyB0ZXJyZW5vcywgaW5kaWPDsyBxdWUgdG9kYXMgbGFzIG11ZXN0cmFzIG9idGVuaWRhZCBwb3Nlw61hbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgKHA+MC4wNSksIGFsIGNvbm9jZXIgZXNvIHNlIGFuYWxpemFyb24gbGFzIHZhcmlhbnphcyB5IHNlIGVuY29udHLDsyBxdWUgbGFzIHBvYmxhY2lvbmVzIGRlIGFyYm9sZXMgZW4gbG9zIGRvcyB0ZXJyZW5vcyBlcmFuIGhvbW9nZW5lYXMgKHA+MC4wNSkuIFBvciBwb3NlZXIgbXVlc3RyYXMgY29uIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCwgcHJvdmVuaWVudGVzIGRlIHBvYmxhY2lvbmVzIGhvbW9nZW5lYXMgeSBjb24gdW5hIHZhcmlhbnphIGRlc2Nvbm9jaWRhLCBlbnRvbmNlcyBzZSBvcHTDsyBwb3IgcmVhbGl6YXIgdW5hIHBydWViYSBkZSBULVN0dWRlbnQsIHBhcmEgc2FiZXIgc2kgZW50cmUgYW1iYXMgcG9ibGFjaW9uZXMgaGFiw61hbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyB5IHNhYmVyIHNpIGRlc2NhcnRhciBvIGFjZXB0YXIgbWkgSDAuIFNlZ8O6biBsb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3MgZGUgbGEgcHJ1ZWJhIFQtU3R1ZGVudCAocDwwLjA1KSwgc2UgZGVzY2FydGEgbGEgSDAgeSBzZSBjb21wcnVlYmEgcXVlIGVmZWN0aXZhbWVudGUgZXhpc3RlIHVuYSB2YXJpYWNpw7NuIGVudHJlIGxhcyBtZWRpZGFzIGRlIGxvcyDDoXJib2xlcyBkZSBsYSBlc3BlY2llICpFdWNhbHlwdHVzIHRlcmV0aWNvcm5pcyogYW50ZSBsYXMgZGlzdGludGFzIGNvbmRpY2lvbmVzIGRlIHRlcnJlbm8gKEZpZy4gMykuIFBhcmEgaW50ZW50YXIgZXhwbGljYXIgZXN0YXMgZGlmZXJlbmNpYXMgc2UgdXPDsyBsYSBodW1lZGFkIHJlbGF0aXZhIHF1ZSBwb3Nlw61hbiBsYXMgbXVlc3RyYXMgZGUgdGllcnJhIGFuYWxpemFkYXMsIHF1ZSB1bmEgdmV6IHNlY2FkYXMsIHNlIGVuY29udHLDsyBxdWUgbGFzIG11ZXN0cmFzIHRvbWFkYXMgZGUgc3VlbG9zIHBsYW5vcywgZWZlY3RpdmFtZW50ZSB0ZW7DrWFuIG1heW9yIHBvcmNlbnRhamUgZGUgaHVtZWRhZCAoMzEuNTUgJSkgZW4gY29tcGFyYWNpw7NuIGNvbiBsYSBodW1lZGFkIHF1ZSBwb3Nlw61hIGVsIHN1ZWxvIGVuIHBlbmRpZW50ZSAoMjYuODcgJSkgKEZpZyA0LiksIHBvciBsbyB0YW50byB1bmEgbWF5b3IgcmV0ZW5jacOzbiBkZSBsaXF1aWRvcyB5IG51dHJpZW50ZXMgcXVlIGF5dWRhbiBhbCBtZWpvciBkZXNhcnJvbGxvIGRlIGxvcyDDoXJib2xlcyBlbiB0ZXJyZW5vcyBzaW4gcGVuZGllbnRlcy4NCg0KPGJyPg0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDEsMikpDQpib3hwbG90KFBlbmRpZW50ZTIkREFQLCBQbGFubyREQVAsDQogICAgICAgIG1haW4gPSAiRGlhbWV0cm9zIiwNCiAgICAgICAgeWxhYiA9ICJEQVAoY20pIiwNCiAgICAgICAgbmFtZXMgPSBzYXTDoW4sDQogICAgICAgIGNvbD0iIzkyQzMwRSIpDQoNCmJveHBsb3QoUGVuZGllbnRlMiRBTFQsIFBsYW5vJEFMVCwNCiAgICAgICAgbWFpbiA9ICJBbHR1cmFzIiwNCiAgICAgICAgeWxhYiA9ICJBbHR1cmEobSkiLA0KICAgICAgICBuYW1lcyA9IHNhdMOhbiwNCiAgICAgICAgb3V0bGluZSA9IEYsDQogICAgICAgIGNvbD0iIzBGRDU4NyIpDQoNCmBgYA0KIyMjI0ZpZy4gMzogRGlmZXJlbmNpYXMgZW50cmUgbG9zIGRpYW1ldHJvcyB5IGFsdHVyYXMgZGUgbG9zIMOhcmJvbGVzIGVuIGxvcyBkaXN0aW50b3MgdHJhdGFtaWVudG9zIGRlIHRlcnJlbm8uIERpYW1ldHJvcyAoaXpxdWllcmRhKSwgQWx0dXJhcyAoZGVyZWNoYSkuDQoNCjxicj4NCg0KYGBge3J9DQpUaWVycmEyPC1jKDI2Ljg2ODAzLCAzMS41NTQxNSkNCmJlbGNlYnU8LWMoIlBlbmRpZW50ZSIsICJQbGFubyIpDQpiYXJwbG90KFRpZXJyYTIsIG5hbWVzID0gYmVsY2VidSwgc3BhY2UgPSAwLjEsIHlsYWIgPSAiSHVtZWRhZCByZWxhdGl2YSAoJW1ML2cpIiwgY29sID0gIiM5MjdDMjEiLCBib3JkZXIgPSAiIzM0MjIwRSIsIG1haW4gPSAiSHVtZWRhZCBkZSBsb3Mgc3VlbG9zIikNCmBgYA0KIyMjI0ZpZy4gNDogUG9yY2VudGFqZXMgZGUgaHVtZWRhZCBlbiBsYXMgdGllcnJhcyBvYnRlbmlkYWQgZW4gdGVycmVub3MgZW4gcGVuZGllbnRlIHkgZW4gcGxhbm8uDQoNCjxicj4NCg0KIyMjIyBVbmEgdmV6IGRlc2NhcnRhZGEgbGEgSGlww7N0ZXNpcyBhbHRlcm5hdGl2YSBwcm9wdWVzdGEgZW4gZWwgcGxhbnRlYW1pZW50byBpbmljaWFsIGRlbCBwcm95ZWN0bywgc2UgZGnDsyBwYXNvIGEgbGEgZWxhYm9yYWNpw7NuIGRlIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBwYXJhIGV4cGxpY2FyIGEgZnV0dXJvcyBpbnZlc3RpZ2Fkb3JlcyBkZSB1bmEgbWFuZXJhIG3DoXMgc2VuY2lsbGEgZW4gZWwgY2FtcG8sIHVuIGFwcm94aW1hZG8gZGUgY29tbyBwb2Ryw61hbiBjb21wb3J0YXJzZSBsb3Mgw6FyYm9sZXMgZGUgbGEgbWlzbWEgZXNwZWNpZSBlbiBjb25kaWNpb25lcyBzaW1pbGFyZXMuIFBhcmEgZWxhYm9yYXIgZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHByaW1lcm8gc2UgcmVhbGl6w7MgdW5hIGNvcnJlbGFjacOzbiBwb3IgZWwgbWV0b2RvIGRlIFBlYXJzb24gcGFyYSBhbmFsaXphciBsYSBkZXBlbmRlbmNpYSBkZSBsYSBhbHR1cmEgY29uIHJlc3BlY3RvIGFsIERBUCwgZW4gbG9zIHRlcnJlbm9zIHBsYW5vcywgbyBlbiBsb3MgdGVycmVub3MgY29uIHBlbmRpZW50ZXMgYXByb3hpbWFkYXMgYSAxOMKwIGRlIGluY2xpbmFjacOzbi4gWSBlbiBhbWJvcyBjYXNvcyBlbCByZXN1bHRhZG8gZnVlIHVuYSBjb3JyZWxhY2nDs24gcG9zaXRpdmEgbW9kZXJhZGEgKENvZWYuIGRlIFJlbGFjacOzbiB+MC41MCwgcDwwLjA1KSAoRmlnLiA1KSwgZXN0YSBjb3JyZWxhY2nDs24gZXhwbGljYSBlbiB1biB+MjElIGxhIHJlbGFjacOzbiBxdWUgaGF5IGVudHJlIGVsIGRlc2Fycm9sbG8gZGVsIERBUCB5IGxhIGFsdHVyYSBkZWwgw6FyYm9sIGVuIGFtYm9zIHRyYXRhbWllbnRvcyBkZSB0ZXJyZW5vLiBFc3RvIGVzIHBvcnF1ZSBoYXkgbXVjaG9zIG3DoXMgZmFjdG9yZXMgcXVlIGFmZWN0YW4gZWwgZGVzYXJyb2xsbyBkZSBlc3RvcyDDoXJib2xlcyB5IG5vIGVzdHV2aWVyb24gcHJlc2VudGVzIGVuIGVzdGUgZXN0dWRpbywgY29tbyBsYSB0ZW1wZXJhdHVyYSB5IGxhIHByZWNpcGl0YWNpw7NuIChCaW5rbGV5LCBELiwgMjAxNykuDQoNCjxicj4NCg0KYGBge3J9DQpHcmFmQ29yMSA8LSBkYXRhLmZyYW1lKFBsYW5vJEFMVCxQbGFubyREQVApDQpjaGFydC5Db3JyZWxhdGlvbihHcmFmQ29yMSkNCg0KR3JhZkNvcjIgPC0gZGF0YS5mcmFtZShQZW5kaWVudGUyJEFMVCxQZW5kaWVudGUyJERBUCkNCmNoYXJ0LkNvcnJlbGF0aW9uKEdyYWZDb3IyKQ0KDQpgYGANCiMjIyNGaWcuIDU6IENvcnJlbGFjacOzbiBQZWFyc29uIHBhcmEgbG9zIHRlcnJlbm9zIGVuIFBsYW5vIChhcnJpYmEpIHkgZW4gUGVuZGllbnRlIChhYmFqbykNCg0KPGJyPg0KDQojIyMjIEFsIHNhYmVyIHF1ZSBsYSBjb3JyZWxhY2nDs24gdGFudG8gZW4gdGVycmVub3MgZW4gcGVuZGllbnRlIGNvbW8gZW4gdGVycmVub3MgcGxhbm9zLCBlbnRyZSBhbWJvcyBmYWN0b3JlcyBlcyBzaWduaWZpY2F0aXZhLCBzZSBwcm9jZWRpw7MgYSByZWFsaXphciB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgcGFyYSBjYWRhIHRyYXRhbWllbnRvIGRlIHRlcnJlbm8sIGVuIGVsIHF1ZSBzZSBleHBsaWPDsyBsYSBhbHR1cmEgZW4gYmFzZSBhbCBEQVAgZGUgbG9zIMOhcmJvbGVzLCBzaW4gZW1iYXJnbywgZXN0ZSBtb2RlbG8gc29sbyBlcyBmdW5jaW9uYWwgY29uIMOhcmJvbGVzIHF1ZSB0ZW5nYW4gYXByb3hpbWFkYW1lbnRlIDQgYcOxb3MgZGUgZWRhZCBvIHBvc2VhbiBkaWVtdHJvcyBxdWUgZXN0w6luIGVudHJlIGxvcyBpbnRlcnZhbG9zIGRlICg4LjMgY20gLSAxNi42KSBlbiBlbCBjYXNvIGRlIGxvcyB0ZXJyZW5vcyBwbGFub3MgeSBkaWFtZXRyb3MgZW50cmUgKDUuOSAtIDEzLjEpIHBhcmEgdGVycmVub3MgZW4gcGVuZGllbnRlLiDDiXN0ZSB0aXBvIGRlIG1vZGVsb3Mgc2UgcG9kcsOtYW4gcmVhbGl6YXIgYSBncmFuIGVzY2FsYSwgYW5hbGl6YW5kbyBsb3Mgw6FyYm9sZXMgam92ZW5lcyBkZXNkZSBsb3MgaW5pY2lvcyBkZSBzdSB0ZWppZG8gbWFkZXJvc28sIGhhc3RhIGxhIGVkYWQgYXByb3hpbWFkYSBlbiBxdWUgZGVqZW4gZGUgc2VyIHByb2R1Y3Rpdm9zIGRlbmRyb2VuZXJnw6l0aWNhbWVudGUsIHBhcmEgY29ub2NlciBzaSBhbGd1bmEgcGxhbnRhY2nDs24gZXN0w6EgY3JlY2llbmRvIGRlIGxhIG1hbmVyYSBvcHRpbWEsIGRlIHN1IHByaW5jaXBpbyBhIHN1IGZpbiwgc2ltcGxlbWVudGUgY29uIGNvbm9jZXIgZWwgREFQIGRlIGxvcyDDoXJib2xlcywgcXVlIGVzIHVuYSBtZWRpZGEgc2VuY2lsbGEgZGUgdG9tYXIuDQojIyMjIExvcyByZXN1bHRhZG9zIGRlIGVzdGFzIHJlZ3Jlc2lvbmVzIGZ1ZXJvbiBncmFmaWNhZG9zIGp1bnRvIGNvbiBsYSByZWN0YSBkZSBtZWpvciBhanVzdGUgc2lndWllbmRvIGxhcyBzaWd1aWVudGVzIGZ1bmNpb25lcyAoRmlnLiA2KTogUmVjdGEgZW4gcGxhbm86ICoqeSA9IDcuNTA1NyArIDAuMjI1M3gqKi4gUmVjdGEgZW4gcGVuZGllbnRlOiAqKnkgPSA1LjY4NDIgKyAwLjIyMTZ4KiouDQoNCjxicj4NCg0KYGBge3J9DQpnZ3Bsb3QoUmVncmVzaW9uLCBhZXMoeD1QbGFubyREQVAsIHk9UGxhbm8kQUxUKSkgKw0KICBnZW9tX3BvaW50KHNoYXBlPTE2KSArDQogIGdlb21fc21vb3RoKG1ldGhvZD1sbSkgKyBsYWJzKHk9IkFsdHVyYSAobSkiLCB4PSJEQVAgKGNtKSIpICsgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNikgKyBnZ3RpdGxlKCJSZWdyZXNpw7NuIGVuIFBsYW5vIikNCg0KZ2dwbG90KFJlZ3Jlc2lvbjIsIGFlcyh4PVBlbmRpZW50ZTIkREFQLCB5PVBlbmRpZW50ZTIkQUxUKSkgKw0KICBnZW9tX3BvaW50KHNoYXBlPTE2KSArDQogIGdlb21fc21vb3RoKG1ldGhvZD1sbSkgKyBsYWJzKHk9IkFsdHVyYSAobSkiLCB4PSJEQVAgKGNtKSIpICsgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNikgKyBnZ3RpdGxlKCJSZWdyZXNpw7NuIGVuIFBlbmRpZW50ZSIpDQoNCmBgYA0KIyMjI0ZpZy4gNjogUmVjdGEgZGUgbWVqb3IgYWp1c3RlIHBhcmEgZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIGRlIGxvcyB0ZXJyZW5vcyBlbiBwbGFubyAoYXJyaWJhKSB5IHBlbmRpZW50ZSAoYWJham8pLg0KIyMjIyBSZWN0YSBlbiBwbGFubzogKip5ID0gNy41MDU3ICsgMC4yMjUzeCoqDQojIyMjIFJlY3RhIGVuIHBlbmRpZW50ZTogKip5ID0gNS42ODQyICsgMC4yMjE2eCoqDQoNCjxicj4NCjxicj4NCg0KIyoqQ29uY2x1c2lvbmVzKioNCg0KPGJyPg0KDQojIyMjIC0gU2UgcHJlc2VudGFyb24gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgbGEgYWx0dXJhIHkgZGnDoW1ldHJvIGRlIGxvcyBpbmRpdmlkdW9zIGVuIGFtYm9zIHRyYXRhbWllbnRvcyBkZSB0ZXJyZW5vIChwbGFubyB5IHBlbmRpZW50ZSksIGRlbW9zdHJhbmRvIGluZGl2aWR1b3MgbcOhcyByb2J1c3RvcyBlbiB0ZXJyZW5vIGVuIHBsYW5vIGNvbnRyYSBlbCB0ZXJyZW5vIGVuIHBlbmRpZW50ZQ0KDQojIyMjIC0gTGEgZXNjb3JyZW50w61hICBkZWwgIHRlcnJlbm8gZW4gcGVuZGllbnRlIGF1bWVudGFuIGVsIGFsbWFjZW5hbWllbnRvIGRlIGh1bWVkYWQgZGVsIHRlcnJlbm8gcGxhbm8sIHNpZW1wcmUgeSBjdWFuZG8gw6lzdGUgc2UgZW5jdWVudHJlIGNvbGluZGFuZG8gY29uIGVsIHB1bnRvIG3DoXMgYmFqbyBkZSBsYSBwZW5kaWVudGUsIHBvciB0YW50bywgbGEgZGlzcG9zaWNpw7NuIGRlIG51dHJpZW50ZXMgZXMgbWF5b3IgZW4gZWwgdGVycmVubyBwbGFubywgbG8gcXVlIGZhdm9yZWNlIGVsIGF1bWVudG8gZW4gbGEgdGFzYSBkZSBjcmVjaW1pZW50byBhcmLDs3JlbyB5IGRlc2Fycm9sbG8gZGUgbG9zIMOhcmJvbGVzDQoNCiMjIyMgLSBTZSBlc3RhYmxlY2nDsyB1biBtb2RlbG8gZGUgZXN0aW1hY2nDs24gZGUgY3JlY2ltaWVudG8gZW50cmUgZGnDoW1ldHJvIHkgYWx0dXJhIGRlIGxhIGVzcGVjaWUgKkV1Y2FseXB0dXMgdGVyZXRpY29ybmlzKiBxdWUgZXhwbGljYSBsYSByZWxhY2nDs24gZW50cmUgYXJib2xlcyBlbiB0ZXJyZW5vcyBwbGFub3MgbyBwZW5kaWVudGVzIHF1ZSB0ZW5nYW4gZWRhZGVzIGRlIGFwcm94aW1hZGFtZW50ZSA0IGHDsW9zLg0KDQo8YnI+DQo8YnI+DQoNCiMqKkFncmFkZWNpbWllbnRvcyoqDQoNCjxicj4NCg0KIyMjIyBBIGxhIGVzdHVkaWFudGUgZGUgSW5nZW5pZXLDrWEgRm9yZXN0YWwgZGVsIEluc3RpdHV0byBUZWNub2zDs2dpY28gZGUgQ29zdGEgUmljYSwgUHJpc2NpbGEgTW9uc2VycmF0IFNvbGFubyBTb2xhbm8gcXVpw6luIGRlc2ludGVyZXNhZGFtZW50ZSBub3MgYXBvecOzIGVuIGVsIGRpc2XDsW8gZXhwZXJpbWVudGFsLCBsYSBidXNxdWVkYSBkZSBiaWJsaW9ncmFmw61hLCB5IG5vcyBhY29tcGHDscOzIGVsIGTDrWEgZGVsIG11ZXN0cmVvIGRlc2RlIGVsIGluaWNpbyBoYXN0YSBlbCBmaW5hbCB5IGF5dWTDsyBlbiBsYSByZWNvbGVjY2nDs24gZGUgbG9zIGRhdG9zLg0KDQo8YnI+DQoNCiFbXShEU0NfOTUxNy5qcGcpPGNlbnRlcj4NCg0KIyMjIw0KDQo8YnI+DQo8YnI+DQoNCiMqKkJpYmxpb2dyYWbDrWEqKg0KDQo8YnI+DQoNCiMjIyNCaW5rbGV5LCBELiwgQ2FtcG9lLCBPLiBDLiwgQWx2YXJlcywgQy4sIENhcm5laXJvLCBSLiBMLiwgQ2VnYXR0YSwgw40uLCBTdGFwZSwgSi4gTC4gKDIwMTcpLiBUaGUgaW50ZXJhY3Rpb25zIG9mIGNsaW1hdGUsIHNwYWNpbmcgYW5kIGdlbmV0aWNzIG9uIGNsb25hbCBFdWNhbHlwdHVzIHBsYW50YXRpb25zIGFjcm9zcyBCcmF6aWwgYW5kIFVydWd1YXkuIEZvcmVzdCBFY29sb2d5IGFuZCBNYW5hZ2VtZW50LCA0MDUsIDI3MS0yODMuDQoNCiMjIyNDb3JuZWxpdXMsIEouIFAuLCBDb3JlYSwgRS4gQS4sIE1lc8OpbiwgSi4gRi4gKDE5OTUpLiBHZW5ldGljIHZhcmlhdGlvbiBpbiBoZWlnaHQgZ3Jvd3RoIGFuZCBsZWFmIGNvbG91ciBvZiAgRXVjYWx5cHR1cyBkZWdsdXB0YSBCbHVtZSBhdCBhZ2VzIHVwIHRvIDE2IG1vbnRocyBpbiBDb3N0YSBSaWNhLiBGb3Jlc3QgRWNvbG9neSBhbmQgTWFuYWdlbWVudCwgNzUoMS0zKSwgNDktNTkuDQoNCiMjIyNEZXRsZWZzZW4sIEcuLCBTb21hcnJpYmEsIEUuICgyMDEyKS4gUHJvZHVjY2nDs24gZGUgbWFkZXJhIGVuIHNpc3RlbWFzIGFncm9mb3Jlc3RhbGVzIGRlIENlbnRyb2Ftw6lyaWNhLiBNaW5pc3RyeSBmb3IgRm9yZWluZyBBZmZhaXJzIG9mIEZpbmxhbmQgeSBDQVRJRSwgVHVycmlhbGJhLCBDb3N0YSBSaWNhLg0KDQojIyMjSW1hbmEtRW5jaW5hcywgSi4gKDE5OTgpLiBEYXNvbWV0csOtYSBwcsOhY3RpY2EuIEJyYXNpbGlhLCBCcmFzaWwuIFVuaXZlcnNpZGFkIGRlIEJyYXNpbGlhLg0KDQojIyMjTXXDsW96LCBGLiwgRXNwaW5vc2EsIE0uLCBIRVJSRVJBLCBNLiBBLiwgJiBDYW5jaW5vLCBKLiAoMjAwNSkuIENhcmFjdGVyw61zdGljYXMgZGVsIGNyZWNpbWllbnRvIGVuIGRpw6FtZXRybywgYWx0dXJhIHkgdm9sdW1lbiBkZSB1bmEgcGxhbnRhY2nDs24gZGUgRXVjYWx5cHR1cyBuaXRlbnMgc29tZXRpZGEgYSB0cmF0YW1pZW50b3Mgc2lsdsOtY29sYXMgZGUgcG9kYSB5IHJhbGVvLiBCb3NxdWUgKFZhbGRpdmlhKSwgMjYoMSksIDkzLTk5Lg0KDQojIyMjUm9jaGEsIEouIEUuICgyMDE3KS4gUmVsYWNpw7NuIGFsdHVyYSBjb21lcmNpYWwtZGnDoW1ldHJvIHkgYWJ1bmRhbmNpYS1jbGFzZSBkaWFtw6l0cmljYSBlbiBsb3Mgw6FyYm9sZXMgZGUgdW4gYm9zcXVlIGRlIGNvbGluYSBiYWphLCBNYXluYXMsIExvcmV0bywgUGVyw7ogLTIwMTUuIFVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlIGxhIEFtYXpvbmlhIFBlcnVhbmEsIElxdWl0bywgUGVyw7oNCg0KIyMjI1J1Ymlhbm8sIEQuIEouICgyMDEwKS4gVmFyaWFiaWxpZGFkIGVzcGFjaWFsIGRlIGxhcyBwcm9waWVkYWRlcyBkZWwgc3VlbG8gZW4gcmVsYWNpw7NuIGNvbiBzdSBwcm9kdWNjacOzbiwgZW4gcGxhbnRhY2lvbmVzIGluZHVzdHJpYWxlcyBkZSBjZWliYSByb2phIChQYWNoaXJhIHF1aW5hdGEpLCBUZXNpcyBkZSBNYWVzdHLDrWEgZW4gR2VvbcOhbnRpY2EuIEZhY3VsdGFkIGRlIEFncm9ub23DrWEuIFVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlIENvbG9tYmlhLiBCb2dvdMOhLCBDb2xvbWJpYS4NCg0KIyMjI1NjaGFsbGVyLCBNLiwgU2Nocm90aCwgRy4sIEJlZXIsIEouLCAmIEppbcOpbmV6LCBGLiAoMjAwMykuIFNwZWNpZXMgYW5kIHNpdGUgY2hhcmFjdGVyaXN0aWNzIHRoYXQgcGVybWl0IHRoZSBhc3NvY2lhdGlvbiBvZiBmYXN0LWdyb3dpbmcgdHJlZXMgd2l0aCBjcm9wczogdGhlIGNhc2Ugb2YgRXVjYWx5cHR1cyBkZWdsdXB0YSBhcyBjb2ZmZWUgc2hhZGUgaW4gQ29zdGEgUmljYS4gRm9yZXN0IEVjb2xvZ3kgYW5kIE1hbmFnZW1lbnQsIDE3NSgxLTMpLCAyMDUtMjE1Lg0KDQojIyMjU3VhcmV6IETDrWF6LCBKLiAoMjAwOSkuIERlc2xpemFtaWVudG9zOiBUw6ljbmljYXMgZGUgUmVtZWRpYWNpw7NuLCBWb2x1bWVuIDIuIFNhbnRhbmRlciwgQ29sb21iaWEuIFVuaXZlcnNpZGFkIEluZHVzdHJpYWwgZGUgU2FudGFuZGVyDQoNCiMjIyNXYWJvLCBFLiAoMjAwMikuIE1lZGljacOzbiBkZSBkaWFtZXRyb3MsIGFsdHVyYXMgeSBlZGFkIGRlbCDDoXJib2wuIE1pbWVvZ3JhZmlhZG8sIExhIFBsYXRhLCBBcmdlbnRpbmEu