Tema 4. T de students

valores <- c(107,92,97,95,105,101,91,99,95,104)
t.test(valores, y=NULL, alternativa="two.sided",mu=100, paired = FALSE, var.equal = FALSE, conf.level = 0.9)
## 
##  One Sample t-test
## 
## data:  valores
## t = -0.79888, df = 9, p-value = 0.4449
## alternative hypothesis: true mean is not equal to 100
## 90 percent confidence interval:
##   95.38755 101.81245
## sample estimates:
## mean of x 
##      98.6
# si es de una cola, alternativa puede ser: "less" or "greater". 


#8-70
#Drive-a-Lemon, renta automóviles en buenas condiciones mecánicas, pero más antiguos que aquellos que rentan las grandes cadenas 
#nacionales de renta de coches. Como resultado, anuncia que sus tarifas son considerablemente más bajas que las de sus grandes 
#competidores. Una encuesta en la industria estableció que el cargo total promedio por renta en una de las mayores compañías es de $77.38 dólares. 
#Una muestra aleatoria de 18 transacciones realizadas por Drive-a-
#Lemon mostró un cargo total promedio de $87.61, con una desviación estándar de la muestra de
#$19.48. Verifique que, con un nivel de significancia de 0.025, el cargo total promedio de Drive-a-
#Lemon es más alto que el de las grandes compañías. ¿Indica este resultado que las tarifas de Drive-
#a-Lemon, no son más bajas que las de las grandes cadenas nacionales? Justifique su respuesta.

# Respuesta: 

# Paso 1. Plantear Hipótesis
# H0: µ = x bar
# H1: µ < x bar

# Paso 2. Nivel de Significancia y Grados de Libertad
# σ= 0.025
# GL = 17

# Paso 3. Zona de Aceptación / Rechazo
# t de tablas = 2.110

# Paso 4. Función
t = (87.61-77.38) / (19.84/sqrt(18))
t
## [1] 2.187612
#Paso 5. Conclusión
# Se rechaza H0

# t = 2.229 (xbar = 87.61), tU= 2.11 (xbarU = 87.07), de modo que se rechaza la hipotesis nula. Sin embargo,
# si Drice-a-Lemon no tiene la misma presencia a nivel nacional que las principales cadenas del país,
# entonces una comparación de sus tasas promedio con el promedio nacional de las grandes cadenas puede 
# conducir a una conclusión errónea

Tema 5. Anova

#### Análisis de Varianza (ANOVA) * Se utiliza para determinar si existen diferencias estadísticamente sifnificativas entre las medias de 3 o más grupos. * Factores: Característica que diferencia las poblaciones / tratamientos * niveles: Distintas poblaciones / tratamientos * Observaciones Partes en cada población/tratamientos

Ejercicios

  • Ejercicio 1: Una empresa comparo diferentes tipos de cajas con respecto a la resistencia a la compresión (lb).

  • A continuación se incluye una lista de valores de resistencia a la compresión (lb) para cada tipo de cajas

caja_tipo_1 <- c(655.5,788.3,734.3,721.4,679.1,699.4)
caja_tipo_2 <- c(789.2,772.5,786.9,686.1,732.1,774.8)
caja_tipo_3 <- c(737.1,639.0,696.3,671.7,717.2,727.1)
caja_tipo_4 <- c(535.1,628.7,542.4,559.0,586.9,520.0)
Análisis:
  • En este ejemplo el factor sería “tipo de caja”. Dado que solo existe un factor este tipo de análisis se llama unifactorial.
  • En este ejemplo la cantidad de niveles sería 4.
  • En este ejemplo existen 6 observaciones.

Pasos para llevar a cabo un análisis de varianza (ANOVA)

  • Paso 1: Plantear hipótesis:
    • H0: µ1 = µ2 = µ3 = µ4
    • H1: Por lo menos dos de las µi son diferentes.
  • Paso 2: Determinar el valor para los siguientes campos.
    • nivel de significancia = 0.05
    • niveles = I = 4
    • número de observaciones = J = 6
    • Grado de libertad de los tratamientos = GLTR = I-1 = 4-1 = 3
    • Grado de libertad del error = GLE = I(J-2) = 4(6-1) = 20
  • Paso 3. Zona Aceptación / Rechazo
    • Para obtener la zona de aceptación de una base F se necesita esta tabla: http://dcb.fi-c.unam.mx/profesores/irene/Notas/tablas/Fisher.pdf
    • El grado de libertad es la parte izquierda.
    • El grado de libertad de los tratamietnos es la parte superior.
    • El nivel se significancia es lo que se necestiará en el lado superior izquierdo.
  • Paso 4. Formula:
    • Suma de cuadros total = SCT
suma1 <- sum(caja_tipo_1*caja_tipo_1)
suma2 <- sum(caja_tipo_2*caja_tipo_2)
suma3 <- sum(caja_tipo_3*caja_tipo_3)
suma4 <- sum(caja_tipo_4*caja_tipo_4)
suma_total <-  suma1+suma2+suma3+suma4
suma_total
## [1] 11340700
conteo1 <- sum(caja_tipo_1)
conteo2 <- sum(caja_tipo_2)
conteo3 <- sum(caja_tipo_3)
conteo4 <- sum(caja_tipo_4)
conteo_total <-  conteo1+conteo2+conteo3+conteo4
conteo_total
## [1] 16380.1
factor_de_correcion <- ((conteo_total*conteo_total)) /24
factor_de_correcion
## [1] 11179487
SCT <- suma_total - factor_de_correcion
SCT
## [1] 161213.7
  • Suma de cuadros de los tratamietnos = SCTR
conteo1_cuadrado <- (conteo1*conteo1)
conteo2_cuadrado <- (conteo2*conteo2)
conteo3_cuadrado <- (conteo3*conteo3)
conteo4_cuadrado <- (conteo4*conteo4)
conteo_tota_cuadrado <- conteo1_cuadrado+conteo2_cuadrado+conteo3_cuadrado+conteo4_cuadrado
conteo_tota_cuadrado
## [1] 67841168
SCTr <- ((1/6)*(conteo_tota_cuadrado))-factor_de_correcion
SCTr
## [1] 127374.8
  • Suma de cuadrados del error = SCe
    • SCT = SCTr + SCE
    • SCE = SCT - SCTR
SCE <- SCT - SCTr
SCE
## [1] 33838.98
  • Cuadrados medios de los tratamientos = CMTr = (SCTr/GLTr)
CMTr <- SCTr/3
CMTr
## [1] 42458.25
  • Cuadrados medios del error = CMe = (SCE/GLe)
CMe <- SCE /20
CMe
## [1] 1691.949
  • F = CMTr / CMe
valor_f <-  CMTr / CMe
valor_f
## [1] 25.09429
  • Paso 5. Conclusión
    • se rechaza H0:
    • La resistencia promedio si es diferente con respecto al tipo de caja, con una confiabilidad del 95%
  • Paso 6. Presentar resultados TABLA de ANOVA
    • Foto al pizaaron

Ejercicio 2

  • Paso 1: Plantear hipótesis:

    • H0: µ1 = µ2 = µ3 = µ4
    • H1: Por lo menos dos de las µi son diferentes.
  • Paso 2: Determinar el valor para los siguientes campos.

  • En este ejemplo el factor sería “mezcla”. Dado que solo existe un factor este tipo de análisis se llama unifactorial.

  • Niveles = 3.

  • Observaciones = 5

  • Grados de libertad de tratamietnos = 2

  • Grados de error = 8

  • Zona de aceptación = 8.65

  • Paso 3. Zona Aceptación / Rechazo

    • Para obtener la zona de aceptación de una base F se necesita esta tabla: http://dcb.fi-c.unam.mx/profesores/irene/Notas/tablas/Fisher.pdf
    • El grado de libertad es la parte izquierda.
    • El grado de libertad de los tratamietnos es la parte superior.
    • El nivel se significancia es lo que se necestiará en el lado superior izquierdo.
  • Paso 4. Formula:

mezcla_1 <- c(0.56,1.12,0.90,1.07,0.94)
mezcla_2 <- c(0.72,0.69,0.87,0.78,0.91)
mezcla_3 <- c(0.62,1.08,1.07,0.99,0.93)
  • Suma de cuadros total = SCT
suma1_mezcla <- sum(mezcla_1*mezcla_1)
suma2_mezcla <- sum(mezcla_2*mezcla_2)
suma3_mezcla <- sum(mezcla_3*mezcla_3)
suma_total_mezcla <-  suma1_mezcla+suma2_mezcla+suma3_mezcla
suma_total_mezcla
## [1] 12.1351
conteo1_mezcla <- sum(mezcla_1)
conteo2_mezcla <- sum(mezcla_2)
conteo3_mezcla <- sum(mezcla_3)
conteo_total_mezcla <-conteo1_mezcla+conteo2_mezcla+conteo3_mezcla
conteo_total_mezcla
## [1] 13.25
factor_de_correcion_mezcla <- ((conteo_total_mezcla*conteo_total_mezcla)) /15
factor_de_correcion_mezcla
## [1] 11.70417
SCT_mezcla <- suma_total_mezcla - factor_de_correcion_mezcla
SCT_mezcla
## [1] 0.4309333
  • Suma de cuadros de los tratamietnos = SCTR
conteo1_cuadrado_mezcla <- (conteo1_mezcla*conteo1_mezcla)
conteo2_cuadrado_mezcla <- (conteo2_mezcla*conteo2_mezcla)
conteo3_cuadrado_mezcla <- (conteo3_mezcla*conteo3_mezcla)
conteo_tota_cuadrado_mezcla <- conteo1_cuadrado_mezcla+conteo2_cuadrado_mezcla+conteo3_cuadrado_mezcla
conteo_tota_cuadrado_mezcla
## [1] 58.8251
SCTr_mezcla <- ((1/5)*(conteo_tota_cuadrado_mezcla))-factor_de_correcion_mezcla
SCTr_mezcla
## [1] 0.06085333
  • Suma de cuadrados del error = SCe
    • SCT = SCTr + SCE
    • SCE = SCT - SCTR
SCE_mezcla <- SCT_mezcla - SCTr_mezcla
SCE_mezcla
## [1] 0.37008
  • Cuadrados medios de los tratamientos = CMTr = (SCTr/GLTr)
CMTr_mezcla <- SCTr_mezcla/2
CMTr_mezcla
## [1] 0.03042667
  • Cuadrados medios del error = CMe = (SCE/GLe)
CMe_mezcla <- SCE_mezcla /8
CMe_mezcla
## [1] 0.04626
  • F = CMTr / CMe
valor_f_mezcla <-  CMTr_mezcla / CMe_mezcla
valor_f_mezcla
## [1] 0.6577317
  • Paso 5. Conclusión
    • se acepta H0:
    • La mezcla promedio es igual a la que menciona la empresa con una confiabilidad del 90%.
  • Paso 6. Presentar resultados TABLA de ANOVA
    • Foto al pizarron

```r
# install.packages("stats")
#library(stats)

# Ejercicio 1
#resistencia <- read.csv("/Users/pedrovillanueva/Desktop/Lineas de Tendecnia/ANOVA Mezclas.csv")
#resistencia$Mezcla <- as.factor(resistencia$Mezcla)
#qf(.95,dfl=3,df=20)
#annova1 <- aov(valor me, data= resistencia)
#summary(annova1)
# <span style="color:green;"> Tema 6. Regresion Lineal Simple </span>
![](/Users/pedrovillanueva/Desktop/Lineas de Tendecnia/regresionlineal.gif)

```r
# Ejercicio 1
x<-c(0.2,0.5,1,2,3)
y<-c(8,10,18,35,60)
regresion<-lm(y~x)
summary(regresion)
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##       1       2       3       4       5 
##  3.0591 -0.5354 -1.8596 -3.5079  2.8437 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    1.211      2.451   0.494  0.65510   
## x             18.648      1.450  12.863  0.00101 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.341 on 3 degrees of freedom
## Multiple R-squared:  0.9822, Adjusted R-squared:  0.9763 
## F-statistic: 165.5 on 1 and 3 DF,  p-value: 0.001014
plot(regresion)

# Ejercicio 2
a<-c(-6,-3,0,3,6,9,12,15,20,25)
b<-c(2,2.8,3.9,4.2,5.8,6.2,7.5,8.2,9.3,10.9)
regresion2<-lm(y~x)
summary(regresion2)
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##       1       2       3       4       5 
##  3.0591 -0.5354 -1.8596 -3.5079  2.8437 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    1.211      2.451   0.494  0.65510   
## x             18.648      1.450  12.863  0.00101 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.341 on 3 degrees of freedom
## Multiple R-squared:  0.9822, Adjusted R-squared:  0.9763 
## F-statistic: 165.5 on 1 and 3 DF,  p-value: 0.001014
plot(regresion2)

Ejercicios del mundo real

11.26: Un estudio compara el número de horas de alivio que proporcionan cinco marcas de antiácidos administrados a 25 persnas diferentes, cada una con acidez estomacal considera fuerte. Los resutlados son los siguientes:

A B C D E
4.4 5.8 4.8 2.9 4.6
4.6 5.2 5.9 2.7 4.3
4.5 4.9 4.9 2.9 3.8
4.1 4.7 4.6 3.9 5.2
3.8 4.6 4.3 4.3 4.4
# A) Calcule el coeficiente f. Para un nivel de significancia de 0.05, ¿Las marcas producen cantidades significativamente diferentes de alivio a las personas con acidez estomacal fuerte?


```r
antiacidos <- read.csv("/Users/pedrovillanueva/Desktop/Lineas de Tendecnia/antiacidos.csv")
antiacidos$marca <- as.factor(antiacidos$marca)
qf(.95,df1=4,df2=20)
## [1] 2.866081
anova3 <- aov(horas ~ marca, data=antiacidos)
summary(anova3)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## marca        4  9.006  2.2514   7.653 0.000655 ***
## Residuals   20  5.884  0.2942                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

F 7.65, Fu 2.87, de forma que rechazamos H0.

Las marcas producen una cantidad de alivio significativamente diferente.


# **11-38**

En la ciudad de Bigville, una cadena de comida rápida está adquiriendo una mala reputación debido a que
tardan mucho en servir a los clientes. Como la cadena tiene cuatro restaurantes en esa ciudad, quiere saber si los cuatro restaurantes tienen el mismo tiempo promedio de servicio. Uno de los dueños de la cadena ha decidido visitar cada local y registrar el tiempo de servicio para 5 clientes escogidos al azar. En
sus cuatro visitas al medio día registró los siguientes tiempos de servicio en minutos:

Restaurante 1 | Restaurante 2 | Restaurante 3 | Restaurante 4 
:-------------: | :-------------: | :-------------: | :-------------: 
1 | 2 | 3 | 4 
2 | 3 | 2 | 3 
4 | 3.5 | 3.5 | 4 
5.5 | 4.5 | 5 | 5.5
3.5 | 4 | 6.5 | 2.5
4 | 5.5 | 6 | 3


a) Utilice un nivel de significancia de 0.05, ¿todos los restaurantes tienen el mismo tiempo medio de servicio?
b) Según sus resultados, ¿deberá el dueño hacer algunas recomendaciones a cualquiera de los administradores de los restaurantes?


```r
restaurante <- read.csv("/Users/pedrovillanueva/Desktop/Lineas de Tendecnia/restaurante.csv")
restaurante$restaurante <- as.factor(restaurante$restaurante)
qf(.95,df1=3, df2=16)
## [1] 3.238872
anova4 <- aov(tiempo ~ restaurante, data=restaurante)
summary(anova4)
##             Df Sum Sq Mean Sq F value Pr(>F)
## restaurante  3  2.538  0.8458   0.509  0.682
## Residuals   16 26.600  1.6625
# No rechazamos H0
# Los tiempos medios de servicio no son significativamente diferentes

## b)
# Debido a que ningun restaurante es peor que los otros, cualquier recomendacion tendria que hacerse a todos los administradores.

12-64

Un arrendador está interesado en ver si las rentas de sus departamentos son las comunes. Para esto tomó una muestra aleatoria de 11 rentas y tamaños de departamentos en complejos de departamentos similares.

Los datos son los siguientes:

Renta Número de recámaras
230 2
190 1
450 3
310 2
218 2
185 2
340 2
245 1
125 1
350 2
280 2
  1. Desarrolle la ecuación de estimación que mejor describa estos datos.
  2. Calcule el coeficiente de determinación.
  3. Pronostique la renta para un departamento de dos recámaras.
renta <- c(230,190,450,310,218,185,340,245,125,350,280)
recamaras <- c(2,1,3,2,2,2,2,1,1,2,2)
regresion3 <- lm(renta ~ recamaras)
summary(regresion3)
## 
## Call:
## lm(formula = renta ~ recamaras)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -101.80  -51.35   19.10   50.25   74.10 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    55.00      63.19   0.870  0.40667   
## recamaras     115.90      33.13   3.498  0.00675 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 63.19 on 9 degrees of freedom
## Multiple R-squared:  0.5762, Adjusted R-squared:  0.5291 
## F-statistic: 12.23 on 1 and 9 DF,  p-value: 0.006746
# a)
# Renta = 55.00 + 115.90*Recamaras

# b) 
# r2 = 0.5762

# c) 
recamaras1 <- 2
renta1 <- 55+115.9*recamaras1
renta1
## [1] 286.8
# 286.80
LS0tCnRpdGxlOiAiV29ya3Nob3AyIgphdXRob3I6ICJQZWRybyBWaWxsYW51ZXZhIgpkYXRlOiAiMjAyMy0wNS0yNSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwotLS0KIyA8c3BhbiBzdHlsZT0iY29sb3I6cHVycGxlOyI+IFRlbWEgNC4gVCBkZSBzdHVkZW50cyA8L3NwYW4+CiFbXSgvVXNlcnMvcGVkcm92aWxsYW51ZXZhL0Rlc2t0b3AvTGluZWFzIGRlIFRlbmRlY25pYS9naWZzX2VzdGFkaXN0aWNhLmdpZikKYGBge3J9CnZhbG9yZXMgPC0gYygxMDcsOTIsOTcsOTUsMTA1LDEwMSw5MSw5OSw5NSwxMDQpCnQudGVzdCh2YWxvcmVzLCB5PU5VTEwsIGFsdGVybmF0aXZhPSJ0d28uc2lkZWQiLG11PTEwMCwgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLCBjb25mLmxldmVsID0gMC45KQoKIyBzaSBlcyBkZSB1bmEgY29sYSwgYWx0ZXJuYXRpdmEgcHVlZGUgc2VyOiAibGVzcyIgb3IgImdyZWF0ZXIiLiAKCgojOC03MAojRHJpdmUtYS1MZW1vbiwgcmVudGEgYXV0b23Ds3ZpbGVzIGVuIGJ1ZW5hcyBjb25kaWNpb25lcyBtZWPDoW5pY2FzLCBwZXJvIG3DoXMgYW50aWd1b3MgcXVlIGFxdWVsbG9zIHF1ZSByZW50YW4gbGFzIGdyYW5kZXMgY2FkZW5hcyAKI25hY2lvbmFsZXMgZGUgcmVudGEgZGUgY29jaGVzLiBDb21vIHJlc3VsdGFkbywgYW51bmNpYSBxdWUgc3VzIHRhcmlmYXMgc29uIGNvbnNpZGVyYWJsZW1lbnRlIG3DoXMgYmFqYXMgcXVlIGxhcyBkZSBzdXMgZ3JhbmRlcyAKI2NvbXBldGlkb3Jlcy4gVW5hIGVuY3Vlc3RhIGVuIGxhIGluZHVzdHJpYSBlc3RhYmxlY2nDsyBxdWUgZWwgY2FyZ28gdG90YWwgcHJvbWVkaW8gcG9yIHJlbnRhIGVuIHVuYSBkZSBsYXMgbWF5b3JlcyBjb21wYcOxw61hcyBlcyBkZSAkNzcuMzggZMOzbGFyZXMuIAojVW5hIG11ZXN0cmEgYWxlYXRvcmlhIGRlIDE4IHRyYW5zYWNjaW9uZXMgcmVhbGl6YWRhcyBwb3IgRHJpdmUtYS0KI0xlbW9uIG1vc3Ryw7MgdW4gY2FyZ28gdG90YWwgcHJvbWVkaW8gZGUgJDg3LjYxLCBjb24gdW5hIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBkZSBsYSBtdWVzdHJhIGRlCiMkMTkuNDguIFZlcmlmaXF1ZSBxdWUsIGNvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlIDAuMDI1LCBlbCBjYXJnbyB0b3RhbCBwcm9tZWRpbyBkZSBEcml2ZS1hLQojTGVtb24gZXMgbcOhcyBhbHRvIHF1ZSBlbCBkZSBsYXMgZ3JhbmRlcyBjb21wYcOxw61hcy4gwr9JbmRpY2EgZXN0ZSByZXN1bHRhZG8gcXVlIGxhcyB0YXJpZmFzIGRlIERyaXZlLQojYS1MZW1vbiwgbm8gc29uIG3DoXMgYmFqYXMgcXVlIGxhcyBkZSBsYXMgZ3JhbmRlcyBjYWRlbmFzIG5hY2lvbmFsZXM/IEp1c3RpZmlxdWUgc3UgcmVzcHVlc3RhLgoKIyBSZXNwdWVzdGE6IAoKIyBQYXNvIDEuIFBsYW50ZWFyIEhpcMOzdGVzaXMKIyBIMDogwrUgPSB4IGJhcgojIEgxOiDCtSA8IHggYmFyCgojIFBhc28gMi4gTml2ZWwgZGUgU2lnbmlmaWNhbmNpYSB5IEdyYWRvcyBkZSBMaWJlcnRhZAojIM+DPSAwLjAyNQojIEdMID0gMTcKCiMgUGFzbyAzLiBab25hIGRlIEFjZXB0YWNpw7NuIC8gUmVjaGF6bwojIHQgZGUgdGFibGFzID0gMi4xMTAKCiMgUGFzbyA0LiBGdW5jacOzbgp0ID0gKDg3LjYxLTc3LjM4KSAvICgxOS44NC9zcXJ0KDE4KSkKdAoKI1Bhc28gNS4gQ29uY2x1c2nDs24KIyBTZSByZWNoYXphIEgwCgojIHQgPSAyLjIyOSAoeGJhciA9IDg3LjYxKSwgdFU9IDIuMTEgKHhiYXJVID0gODcuMDcpLCBkZSBtb2RvIHF1ZSBzZSByZWNoYXphIGxhIGhpcG90ZXNpcyBudWxhLiBTaW4gZW1iYXJnbywKIyBzaSBEcmljZS1hLUxlbW9uIG5vIHRpZW5lIGxhIG1pc21hIHByZXNlbmNpYSBhIG5pdmVsIG5hY2lvbmFsIHF1ZSBsYXMgcHJpbmNpcGFsZXMgY2FkZW5hcyBkZWwgcGHDrXMsCiMgZW50b25jZXMgdW5hIGNvbXBhcmFjacOzbiBkZSBzdXMgdGFzYXMgcHJvbWVkaW8gY29uIGVsIHByb21lZGlvIG5hY2lvbmFsIGRlIGxhcyBncmFuZGVzIGNhZGVuYXMgcHVlZGUgCiMgY29uZHVjaXIgYSB1bmEgY29uY2x1c2nDs24gZXJyw7NuZWEKCmBgYAojIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij4gVGVtYSA1LiBBbm92YTwvc3Bhbj4KIVtdKC9Vc2Vycy9wZWRyb3ZpbGxhbnVldmEvRGVza3RvcC9MaW5lYXMgZGUgVGVuZGVjbmlhL2dpZi5wdWxwby5naWYpCiMjIyMgQW7DoWxpc2lzIGRlIFZhcmlhbnphIChBTk9WQSkKKiBTZSB1dGlsaXphIHBhcmEgZGV0ZXJtaW5hciBzaSBleGlzdGVuIGRpZmVyZW5jaWFzIGVzdGFkw61zdGljYW1lbnRlIHNpZm5pZmljYXRpdmFzIGVudHJlIGxhcyBtZWRpYXMgZGUgMyBvIG3DoXMgZ3J1cG9zLiAKKiAqKkZhY3RvcmVzOioqIENhcmFjdGVyw61zdGljYSBxdWUgZGlmZXJlbmNpYSBsYXMgcG9ibGFjaW9uZXMgLyB0cmF0YW1pZW50b3MgCiogKipuaXZlbGVzOioqIERpc3RpbnRhcyBwb2JsYWNpb25lcyAvIHRyYXRhbWllbnRvcwoqICoqT2JzZXJ2YWNpb25lcyoqIFBhcnRlcyBlbiBjYWRhIHBvYmxhY2nDs24vdHJhdGFtaWVudG9zCgojIyMjIEVqZXJjaWNpb3MgCiogRWplcmNpY2lvIDE6IFVuYSBlbXByZXNhIGNvbXBhcm8gZGlmZXJlbnRlcyB0aXBvcyBkZSBjYWphcyBjb24gcmVzcGVjdG8gYSBsYSByZXNpc3RlbmNpYSBhIGxhIGNvbXByZXNpw7NuIChsYikuIAoKKiBBIGNvbnRpbnVhY2nDs24gc2UgaW5jbHV5ZSB1bmEgbGlzdGEgZGUgdmFsb3JlcyBkZSByZXNpc3RlbmNpYSBhIGxhIGNvbXByZXNpw7NuIChsYikgcGFyYSBjYWRhIHRpcG8gZGUgY2FqYXMKYGBge3J9CmNhamFfdGlwb18xIDwtIGMoNjU1LjUsNzg4LjMsNzM0LjMsNzIxLjQsNjc5LjEsNjk5LjQpCmNhamFfdGlwb18yIDwtIGMoNzg5LjIsNzcyLjUsNzg2LjksNjg2LjEsNzMyLjEsNzc0LjgpCmNhamFfdGlwb18zIDwtIGMoNzM3LjEsNjM5LjAsNjk2LjMsNjcxLjcsNzE3LjIsNzI3LjEpCmNhamFfdGlwb180IDwtIGMoNTM1LjEsNjI4LjcsNTQyLjQsNTU5LjAsNTg2LjksNTIwLjApCmBgYAojIyMjIyMgQW7DoWxpc2lzOgoqIEVuIGVzdGUgZWplbXBsbyBlbCBmYWN0b3Igc2Vyw61hICJ0aXBvIGRlIGNhamEiLiBEYWRvIHF1ZSBzb2xvIGV4aXN0ZSB1biBmYWN0b3IgZXN0ZSB0aXBvIGRlIGFuw6FsaXNpcyBzZSBsbGFtYSB1bmlmYWN0b3JpYWwuIAoqIEVuIGVzdGUgZWplbXBsbyBsYSBjYW50aWRhZCBkZSBuaXZlbGVzIHNlcsOtYSA0LgoqIEVuIGVzdGUgZWplbXBsbyBleGlzdGVuIDYgb2JzZXJ2YWNpb25lcy4gCgojIyMjIFBhc29zIHBhcmEgbGxldmFyIGEgY2FibyB1biBhbsOhbGlzaXMgZGUgdmFyaWFuemEgKEFOT1ZBKQoqICoqUGFzbyAxOiBQbGFudGVhciBoaXDDs3Rlc2lzOioqCiAgICAqIEgwOiDCtTEgPSDCtTIgPSDCtTMgPSDCtTQKICAgICogSDE6IFBvciBsbyBtZW5vcyBkb3MgZGUgbGFzIMK1aSBzb24gZGlmZXJlbnRlcy4gCiogKipQYXNvIDI6IERldGVybWluYXIgZWwgdmFsb3IgcGFyYSBsb3Mgc2lndWllbnRlcyBjYW1wb3MuKiogCiAgKiBuaXZlbCBkZSBzaWduaWZpY2FuY2lhID0gKiowLjA1KioKICAqIG5pdmVsZXMgPSBJID0gKio0KioKICAqIG7Dum1lcm8gZGUgb2JzZXJ2YWNpb25lcyA9IEogPSAqKjYqKgogICogR3JhZG8gZGUgbGliZXJ0YWQgZGUgbG9zIHRyYXRhbWllbnRvcyA9IEdMVFIgPSBJLTEgPSA0LTEgPSAqKjMqKgogICogR3JhZG8gZGUgbGliZXJ0YWQgZGVsIGVycm9yID0gR0xFID0gSShKLTIpID0gNCg2LTEpID0gKioyMCoqCiogKipQYXNvIDMuIFpvbmEgQWNlcHRhY2nDs24gLyBSZWNoYXpvKioKICAqIFBhcmEgb2J0ZW5lciBsYSB6b25hIGRlIGFjZXB0YWNpw7NuIGRlIHVuYSBiYXNlIEYgc2UgbmVjZXNpdGEgZXN0YSB0YWJsYTogaHR0cDovL2RjYi5maS1jLnVuYW0ubXgvcHJvZmVzb3Jlcy9pcmVuZS9Ob3Rhcy90YWJsYXMvRmlzaGVyLnBkZgogICogRWwgZ3JhZG8gZGUgbGliZXJ0YWQgZXMgbGEgcGFydGUgaXpxdWllcmRhLiAKICAqIEVsIGdyYWRvIGRlIGxpYmVydGFkIGRlIGxvcyB0cmF0YW1pZXRub3MgZXMgbGEgcGFydGUgc3VwZXJpb3IuIAogICogRWwgbml2ZWwgc2Ugc2lnbmlmaWNhbmNpYSBlcyBsbyBxdWUgc2UgbmVjZXN0aWFyw6EgZW4gZWwgbGFkbyBzdXBlcmlvciBpenF1aWVyZG8uIAoqICoqUGFzbyA0LiBGb3JtdWxhOioqIAogICogU3VtYSBkZSBjdWFkcm9zIHRvdGFsID0gU0NUIApgYGB7cn0Kc3VtYTEgPC0gc3VtKGNhamFfdGlwb18xKmNhamFfdGlwb18xKQpzdW1hMiA8LSBzdW0oY2FqYV90aXBvXzIqY2FqYV90aXBvXzIpCnN1bWEzIDwtIHN1bShjYWphX3RpcG9fMypjYWphX3RpcG9fMykKc3VtYTQgPC0gc3VtKGNhamFfdGlwb180KmNhamFfdGlwb180KQpzdW1hX3RvdGFsIDwtICBzdW1hMStzdW1hMitzdW1hMytzdW1hNApzdW1hX3RvdGFsCmBgYAoKYGBge3J9CmNvbnRlbzEgPC0gc3VtKGNhamFfdGlwb18xKQpjb250ZW8yIDwtIHN1bShjYWphX3RpcG9fMikKY29udGVvMyA8LSBzdW0oY2FqYV90aXBvXzMpCmNvbnRlbzQgPC0gc3VtKGNhamFfdGlwb180KQpjb250ZW9fdG90YWwgPC0gIGNvbnRlbzErY29udGVvMitjb250ZW8zK2NvbnRlbzQKY29udGVvX3RvdGFsCmBgYAoKYGBge3J9CmZhY3Rvcl9kZV9jb3JyZWNpb24gPC0gKChjb250ZW9fdG90YWwqY29udGVvX3RvdGFsKSkgLzI0CmZhY3Rvcl9kZV9jb3JyZWNpb24KYGBgCgpgYGB7cn0KU0NUIDwtIHN1bWFfdG90YWwgLSBmYWN0b3JfZGVfY29ycmVjaW9uClNDVApgYGAKICAqIFN1bWEgZGUgY3VhZHJvcyBkZSBsb3MgdHJhdGFtaWV0bm9zID0gU0NUUgpgYGB7cn0KY29udGVvMV9jdWFkcmFkbyA8LSAoY29udGVvMSpjb250ZW8xKQpjb250ZW8yX2N1YWRyYWRvIDwtIChjb250ZW8yKmNvbnRlbzIpCmNvbnRlbzNfY3VhZHJhZG8gPC0gKGNvbnRlbzMqY29udGVvMykKY29udGVvNF9jdWFkcmFkbyA8LSAoY29udGVvNCpjb250ZW80KQpjb250ZW9fdG90YV9jdWFkcmFkbyA8LSBjb250ZW8xX2N1YWRyYWRvK2NvbnRlbzJfY3VhZHJhZG8rY29udGVvM19jdWFkcmFkbytjb250ZW80X2N1YWRyYWRvCmNvbnRlb190b3RhX2N1YWRyYWRvCmBgYAoKYGBge3J9ClNDVHIgPC0gKCgxLzYpKihjb250ZW9fdG90YV9jdWFkcmFkbykpLWZhY3Rvcl9kZV9jb3JyZWNpb24KU0NUcgpgYGAKICAqIFN1bWEgZGUgY3VhZHJhZG9zIGRlbCBlcnJvciA9IFNDZQogICAgKiBTQ1QgPSBTQ1RyICsgU0NFCiAgICAqIFNDRSA9IFNDVCAtIFNDVFIKYGBge3J9ClNDRSA8LSBTQ1QgLSBTQ1RyClNDRQpgYGAKICAqIEN1YWRyYWRvcyBtZWRpb3MgZGUgbG9zIHRyYXRhbWllbnRvcyA9IENNVHIgPSAoU0NUci9HTFRyKQpgYGB7cn0KQ01UciA8LSBTQ1RyLzMKQ01UcgpgYGAKICAqIEN1YWRyYWRvcyBtZWRpb3MgZGVsIGVycm9yID0gQ01lID0gKFNDRS9HTGUpCmBgYHtyfQpDTWUgPC0gU0NFIC8yMApDTWUKYGBgCiAgKiBGID0gQ01UciAvIENNZSAKYGBge3J9CnZhbG9yX2YgPC0gIENNVHIgLyBDTWUKdmFsb3JfZgpgYGAKCiogKipQYXNvIDUuIENvbmNsdXNpw7NuKioKICAqIHNlIHJlY2hhemEgSDA6CiAgKiBMYSByZXNpc3RlbmNpYSBwcm9tZWRpbyBzaSBlcyBkaWZlcmVudGUgY29uIHJlc3BlY3RvIGFsIHRpcG8gZGUgY2FqYSwgY29uIHVuYSBjb25maWFiaWxpZGFkIGRlbCA5NSUgCiAgCiogKipQYXNvIDYuIFByZXNlbnRhciByZXN1bHRhZG9zIFRBQkxBIGRlIEFOT1ZBKioKICAqIEZvdG8gYWwgcGl6YWFyb24gCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIAojIyMjIEVqZXJjaWNpbyAyIAogCiogKipQYXNvIDE6IFBsYW50ZWFyIGhpcMOzdGVzaXM6KioKICAgICogSDA6IMK1MSA9IMK1MiA9IMK1MyA9IMK1NAogICAgKiBIMTogUG9yIGxvIG1lbm9zIGRvcyBkZSBsYXMgwrVpIHNvbiBkaWZlcmVudGVzLiAKKiAqKlBhc28gMjogRGV0ZXJtaW5hciBlbCB2YWxvciBwYXJhIGxvcyBzaWd1aWVudGVzIGNhbXBvcy4qKiAKICogRW4gZXN0ZSBlamVtcGxvIGVsIGZhY3RvciBzZXLDrWEgIm1lemNsYSIuIERhZG8gcXVlIHNvbG8gZXhpc3RlIHVuIGZhY3RvciBlc3RlIHRpcG8gZGUgYW7DoWxpc2lzIHNlIGxsYW1hIHVuaWZhY3RvcmlhbC4gCiAgKiBOaXZlbGVzID0gMy4KICAqIE9ic2VydmFjaW9uZXMgPSA1IAogICogR3JhZG9zIGRlIGxpYmVydGFkIGRlIHRyYXRhbWlldG5vcyA9IDIKICAqIEdyYWRvcyBkZSBlcnJvciA9IDggCiAgKiBab25hIGRlIGFjZXB0YWNpw7NuID0gOC42NSAKICAKKiAqKlBhc28gMy4gWm9uYSBBY2VwdGFjacOzbiAvIFJlY2hhem8qKgogICogUGFyYSBvYnRlbmVyIGxhIHpvbmEgZGUgYWNlcHRhY2nDs24gZGUgdW5hIGJhc2UgRiBzZSBuZWNlc2l0YSBlc3RhIHRhYmxhOiBodHRwOi8vZGNiLmZpLWMudW5hbS5teC9wcm9mZXNvcmVzL2lyZW5lL05vdGFzL3RhYmxhcy9GaXNoZXIucGRmCiAgKiBFbCBncmFkbyBkZSBsaWJlcnRhZCBlcyBsYSBwYXJ0ZSBpenF1aWVyZGEuIAogICogRWwgZ3JhZG8gZGUgbGliZXJ0YWQgZGUgbG9zIHRyYXRhbWlldG5vcyBlcyBsYSBwYXJ0ZSBzdXBlcmlvci4gCiAgKiBFbCBuaXZlbCBzZSBzaWduaWZpY2FuY2lhIGVzIGxvIHF1ZSBzZSBuZWNlc3RpYXLDoSBlbiBlbCBsYWRvIHN1cGVyaW9yIGl6cXVpZXJkby4gCiogKipQYXNvIDQuIEZvcm11bGE6KiogCmBgYHtyfQptZXpjbGFfMSA8LSBjKDAuNTYsMS4xMiwwLjkwLDEuMDcsMC45NCkKbWV6Y2xhXzIgPC0gYygwLjcyLDAuNjksMC44NywwLjc4LDAuOTEpCm1lemNsYV8zIDwtIGMoMC42MiwxLjA4LDEuMDcsMC45OSwwLjkzKQoKYGBgCgogICogU3VtYSBkZSBjdWFkcm9zIHRvdGFsID0gU0NUIApgYGB7cn0Kc3VtYTFfbWV6Y2xhIDwtIHN1bShtZXpjbGFfMSptZXpjbGFfMSkKc3VtYTJfbWV6Y2xhIDwtIHN1bShtZXpjbGFfMiptZXpjbGFfMikKc3VtYTNfbWV6Y2xhIDwtIHN1bShtZXpjbGFfMyptZXpjbGFfMykKc3VtYV90b3RhbF9tZXpjbGEgPC0gIHN1bWExX21lemNsYStzdW1hMl9tZXpjbGErc3VtYTNfbWV6Y2xhCnN1bWFfdG90YWxfbWV6Y2xhCmBgYAoKYGBge3J9CmNvbnRlbzFfbWV6Y2xhIDwtIHN1bShtZXpjbGFfMSkKY29udGVvMl9tZXpjbGEgPC0gc3VtKG1lemNsYV8yKQpjb250ZW8zX21lemNsYSA8LSBzdW0obWV6Y2xhXzMpCmNvbnRlb190b3RhbF9tZXpjbGEgPC1jb250ZW8xX21lemNsYStjb250ZW8yX21lemNsYStjb250ZW8zX21lemNsYQpjb250ZW9fdG90YWxfbWV6Y2xhCmBgYAoKYGBge3J9CmZhY3Rvcl9kZV9jb3JyZWNpb25fbWV6Y2xhIDwtICgoY29udGVvX3RvdGFsX21lemNsYSpjb250ZW9fdG90YWxfbWV6Y2xhKSkgLzE1CmZhY3Rvcl9kZV9jb3JyZWNpb25fbWV6Y2xhCmBgYAoKYGBge3J9ClNDVF9tZXpjbGEgPC0gc3VtYV90b3RhbF9tZXpjbGEgLSBmYWN0b3JfZGVfY29ycmVjaW9uX21lemNsYQpTQ1RfbWV6Y2xhCmBgYAogICogU3VtYSBkZSBjdWFkcm9zIGRlIGxvcyB0cmF0YW1pZXRub3MgPSBTQ1RSCmBgYHtyfQpjb250ZW8xX2N1YWRyYWRvX21lemNsYSA8LSAoY29udGVvMV9tZXpjbGEqY29udGVvMV9tZXpjbGEpCmNvbnRlbzJfY3VhZHJhZG9fbWV6Y2xhIDwtIChjb250ZW8yX21lemNsYSpjb250ZW8yX21lemNsYSkKY29udGVvM19jdWFkcmFkb19tZXpjbGEgPC0gKGNvbnRlbzNfbWV6Y2xhKmNvbnRlbzNfbWV6Y2xhKQpjb250ZW9fdG90YV9jdWFkcmFkb19tZXpjbGEgPC0gY29udGVvMV9jdWFkcmFkb19tZXpjbGErY29udGVvMl9jdWFkcmFkb19tZXpjbGErY29udGVvM19jdWFkcmFkb19tZXpjbGEKY29udGVvX3RvdGFfY3VhZHJhZG9fbWV6Y2xhCmBgYAoKYGBge3J9ClNDVHJfbWV6Y2xhIDwtICgoMS81KSooY29udGVvX3RvdGFfY3VhZHJhZG9fbWV6Y2xhKSktZmFjdG9yX2RlX2NvcnJlY2lvbl9tZXpjbGEKU0NUcl9tZXpjbGEKYGBgCiAgKiBTdW1hIGRlIGN1YWRyYWRvcyBkZWwgZXJyb3IgPSBTQ2UKICAgICogU0NUID0gU0NUciArIFNDRQogICAgKiBTQ0UgPSBTQ1QgLSBTQ1RSCmBgYHtyfQpTQ0VfbWV6Y2xhIDwtIFNDVF9tZXpjbGEgLSBTQ1RyX21lemNsYQpTQ0VfbWV6Y2xhCmBgYAogICogQ3VhZHJhZG9zIG1lZGlvcyBkZSBsb3MgdHJhdGFtaWVudG9zID0gQ01UciA9IChTQ1RyL0dMVHIpCmBgYHtyfQpDTVRyX21lemNsYSA8LSBTQ1RyX21lemNsYS8yCkNNVHJfbWV6Y2xhCmBgYAogICogQ3VhZHJhZG9zIG1lZGlvcyBkZWwgZXJyb3IgPSBDTWUgPSAoU0NFL0dMZSkKYGBge3J9CkNNZV9tZXpjbGEgPC0gU0NFX21lemNsYSAvOApDTWVfbWV6Y2xhCmBgYAogICogRiA9IENNVHIgLyBDTWUgCmBgYHtyfQp2YWxvcl9mX21lemNsYSA8LSAgQ01Ucl9tZXpjbGEgLyBDTWVfbWV6Y2xhCnZhbG9yX2ZfbWV6Y2xhCmBgYAoKKiAqKlBhc28gNS4gQ29uY2x1c2nDs24qKgogICogc2UgYWNlcHRhIEgwOgogICogTGEgbWV6Y2xhIHByb21lZGlvIGVzIGlndWFsIGEgbGEgcXVlIG1lbmNpb25hIGxhIGVtcHJlc2EgY29uIHVuYSBjb25maWFiaWxpZGFkIGRlbCA5MCUuCiAgCiogKipQYXNvIDYuIFByZXNlbnRhciByZXN1bHRhZG9zIFRBQkxBIGRlIEFOT1ZBKioKICAqIEZvdG8gYWwgcGl6YXJyb24gCgoKYGBgCmBgYHtyfQojIGluc3RhbGwucGFja2FnZXMoInN0YXRzIikKI2xpYnJhcnkoc3RhdHMpCgojIEVqZXJjaWNpbyAxCiNyZXNpc3RlbmNpYSA8LSByZWFkLmNzdigiL1VzZXJzL3BlZHJvdmlsbGFudWV2YS9EZXNrdG9wL0xpbmVhcyBkZSBUZW5kZWNuaWEvQU5PVkEgTWV6Y2xhcy5jc3YiKQojcmVzaXN0ZW5jaWEkTWV6Y2xhIDwtIGFzLmZhY3RvcihyZXNpc3RlbmNpYSRNZXpjbGEpCiNxZiguOTUsZGZsPTMsZGY9MjApCiNhbm5vdmExIDwtIGFvdih2YWxvciBtZSwgZGF0YT0gcmVzaXN0ZW5jaWEpCiNzdW1tYXJ5KGFubm92YTEpCgpgYGAKYGBgCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+IFRlbWEgNi4gUmVncmVzaW9uIExpbmVhbCBTaW1wbGUgPC9zcGFuPgohW10oL1VzZXJzL3BlZHJvdmlsbGFudWV2YS9EZXNrdG9wL0xpbmVhcyBkZSBUZW5kZWNuaWEvcmVncmVzaW9ubGluZWFsLmdpZikKYGBge3J9CiMgRWplcmNpY2lvIDEKeDwtYygwLjIsMC41LDEsMiwzKQp5PC1jKDgsMTAsMTgsMzUsNjApCnJlZ3Jlc2lvbjwtbG0oeX54KQpzdW1tYXJ5KHJlZ3Jlc2lvbikKcGxvdChyZWdyZXNpb24pCgojIEVqZXJjaWNpbyAyCmE8LWMoLTYsLTMsMCwzLDYsOSwxMiwxNSwyMCwyNSkKYjwtYygyLDIuOCwzLjksNC4yLDUuOCw2LjIsNy41LDguMiw5LjMsMTAuOSkKcmVncmVzaW9uMjwtbG0oeX54KQpzdW1tYXJ5KHJlZ3Jlc2lvbjIpCnBsb3QocmVncmVzaW9uMikKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IEVqZXJjaWNpb3MgZGVsIG11bmRvIHJlYWwgPC9zcGFuPgoxMS4yNjogVW4gZXN0dWRpbyBjb21wYXJhIGVsIG7Dum1lcm8gZGUgaG9yYXMgZGUgYWxpdmlvIHF1ZSBwcm9wb3JjaW9uYW4gY2luY28gbWFyY2FzIGRlIGFudGnDoWNpZG9zIGFkbWluaXN0cmFkb3MgYSAyNSBwZXJzbmFzIGRpZmVyZW50ZXMsIGNhZGEgdW5hIGNvbiBhY2lkZXogZXN0b21hY2FsIGNvbnNpZGVyYSBmdWVydGUuIExvcyByZXN1dGxhZG9zIHNvbiBsb3Mgc2lndWllbnRlczoKCkEgfCBCIHwgQyB8IEQgfCBFCjotLS0tLS0tLS0tLS0tOiB8IDotLS0tLS0tLS0tLS0tOiB8IDotLS0tLS0tLS0tLS0tOiB8IDotLS0tLS0tLS0tLS0tOiB8IDotLS0tLS0tLS0tLS0tOgo0LjQgfCA1LjggfCA0LjggfCAyLjkgfCA0LjYKNC42IHwgNS4yIHwgNS45IHwgMi43IHwgNC4zCjQuNSB8IDQuOSB8IDQuOSB8IDIuOSB8IDMuOAo0LjEgfCA0LjcgfCA0LjYgfCAzLjkgfCA1LjIKMy44IHwgNC42IHwgNC4zIHwgNC4zIHwgNC40CmBgYAojIEEpIENhbGN1bGUgZWwgY29lZmljaWVudGUgZi4gUGFyYSB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlIDAuMDUsIMK/TGFzIG1hcmNhcyBwcm9kdWNlbiBjYW50aWRhZGVzIHNpZ25pZmljYXRpdmFtZW50ZSBkaWZlcmVudGVzIGRlIGFsaXZpbyBhIGxhcyBwZXJzb25hcyBjb24gYWNpZGV6IGVzdG9tYWNhbCBmdWVydGU/CgpgYGB7cn0KYW50aWFjaWRvcyA8LSByZWFkLmNzdigiL1VzZXJzL3BlZHJvdmlsbGFudWV2YS9EZXNrdG9wL0xpbmVhcyBkZSBUZW5kZWNuaWEvYW50aWFjaWRvcy5jc3YiKQphbnRpYWNpZG9zJG1hcmNhIDwtIGFzLmZhY3RvcihhbnRpYWNpZG9zJG1hcmNhKQpxZiguOTUsZGYxPTQsZGYyPTIwKQphbm92YTMgPC0gYW92KGhvcmFzIH4gbWFyY2EsIGRhdGE9YW50aWFjaWRvcykKc3VtbWFyeShhbm92YTMpCmBgYAoKIyMgRiAgNy42NSwgRnUgIDIuODcsIGRlIGZvcm1hIHF1ZSByZWNoYXphbW9zIEgwLiAKIyMgTGFzIG1hcmNhcyBwcm9kdWNlbiB1bmEgY2FudGlkYWQgZGUgYWxpdmlvIHNpZ25pZmljYXRpdmFtZW50ZSBkaWZlcmVudGUuCmBgYAoKIyAqKjExLTM4KioKCkVuIGxhIGNpdWRhZCBkZSBCaWd2aWxsZSwgdW5hIGNhZGVuYSBkZSBjb21pZGEgcsOhcGlkYSBlc3TDoSBhZHF1aXJpZW5kbyB1bmEgbWFsYSByZXB1dGFjacOzbiBkZWJpZG8gYSBxdWUKdGFyZGFuIG11Y2hvIGVuIHNlcnZpciBhIGxvcyBjbGllbnRlcy4gQ29tbyBsYSBjYWRlbmEgdGllbmUgY3VhdHJvIHJlc3RhdXJhbnRlcyBlbiBlc2EgY2l1ZGFkLCBxdWllcmUgc2FiZXIgc2kgbG9zIGN1YXRybyByZXN0YXVyYW50ZXMgdGllbmVuIGVsIG1pc21vIHRpZW1wbyBwcm9tZWRpbyBkZSBzZXJ2aWNpby4gVW5vIGRlIGxvcyBkdWXDsW9zIGRlIGxhIGNhZGVuYSBoYSBkZWNpZGlkbyB2aXNpdGFyIGNhZGEgbG9jYWwgeSByZWdpc3RyYXIgZWwgdGllbXBvIGRlIHNlcnZpY2lvIHBhcmEgNSBjbGllbnRlcyBlc2NvZ2lkb3MgYWwgYXphci4gRW4Kc3VzIGN1YXRybyB2aXNpdGFzIGFsIG1lZGlvIGTDrWEgcmVnaXN0csOzIGxvcyBzaWd1aWVudGVzIHRpZW1wb3MgZGUgc2VydmljaW8gZW4gbWludXRvczoKClJlc3RhdXJhbnRlIDEgfCBSZXN0YXVyYW50ZSAyIHwgUmVzdGF1cmFudGUgMyB8IFJlc3RhdXJhbnRlIDQgCjotLS0tLS0tLS0tLS0tOiB8IDotLS0tLS0tLS0tLS0tOiB8IDotLS0tLS0tLS0tLS0tOiB8IDotLS0tLS0tLS0tLS0tOiAKMSB8IDIgfCAzIHwgNCAKMiB8IDMgfCAyIHwgMyAKNCB8IDMuNSB8IDMuNSB8IDQgCjUuNSB8IDQuNSB8IDUgfCA1LjUKMy41IHwgNCB8IDYuNSB8IDIuNQo0IHwgNS41IHwgNiB8IDMKCgphKSBVdGlsaWNlIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZGUgMC4wNSwgwr90b2RvcyBsb3MgcmVzdGF1cmFudGVzIHRpZW5lbiBlbCBtaXNtbyB0aWVtcG8gbWVkaW8gZGUgc2VydmljaW8/CmIpIFNlZ8O6biBzdXMgcmVzdWx0YWRvcywgwr9kZWJlcsOhIGVsIGR1ZcOxbyBoYWNlciBhbGd1bmFzIHJlY29tZW5kYWNpb25lcyBhIGN1YWxxdWllcmEgZGUgbG9zIGFkbWluaXN0cmFkb3JlcyBkZSBsb3MgcmVzdGF1cmFudGVzPwoKYGBge3J9CgpyZXN0YXVyYW50ZSA8LSByZWFkLmNzdigiL1VzZXJzL3BlZHJvdmlsbGFudWV2YS9EZXNrdG9wL0xpbmVhcyBkZSBUZW5kZWNuaWEvcmVzdGF1cmFudGUuY3N2IikKcmVzdGF1cmFudGUkcmVzdGF1cmFudGUgPC0gYXMuZmFjdG9yKHJlc3RhdXJhbnRlJHJlc3RhdXJhbnRlKQpxZiguOTUsZGYxPTMsIGRmMj0xNikKYW5vdmE0IDwtIGFvdih0aWVtcG8gfiByZXN0YXVyYW50ZSwgZGF0YT1yZXN0YXVyYW50ZSkKc3VtbWFyeShhbm92YTQpCiMgTm8gcmVjaGF6YW1vcyBIMAojIExvcyB0aWVtcG9zIG1lZGlvcyBkZSBzZXJ2aWNpbyBubyBzb24gc2lnbmlmaWNhdGl2YW1lbnRlIGRpZmVyZW50ZXMKCiMjIGIpCiMgRGViaWRvIGEgcXVlIG5pbmd1biByZXN0YXVyYW50ZSBlcyBwZW9yIHF1ZSBsb3Mgb3Ryb3MsIGN1YWxxdWllciByZWNvbWVuZGFjaW9uIHRlbmRyaWEgcXVlIGhhY2Vyc2UgYSB0b2RvcyBsb3MgYWRtaW5pc3RyYWRvcmVzLgpgYGAKCiMgKioxMi02NCoqCgpVbiBhcnJlbmRhZG9yIGVzdMOhIGludGVyZXNhZG8gZW4gdmVyIHNpIGxhcyByZW50YXMgZGUgc3VzIGRlcGFydGFtZW50b3Mgc29uIGxhcyBjb211bmVzLiBQYXJhIGVzdG8gdG9tw7MKdW5hIG11ZXN0cmEgYWxlYXRvcmlhIGRlIDExIHJlbnRhcyB5IHRhbWHDsW9zIGRlIGRlcGFydGFtZW50b3MgZW4gY29tcGxlam9zIGRlIGRlcGFydGFtZW50b3Mgc2ltaWxhcmVzLgoKTG9zIGRhdG9zIHNvbiBsb3Mgc2lndWllbnRlczoKClJlbnRhIHwgTsO6bWVybyBkZSByZWPDoW1hcmFzCjotLS0tLS0tLS0tLS0tOiB8IDotLS0tLS0tLS0tLS0tOgoyMzAgfCAyICAKMTkwIHwgMQo0NTAgfCAzIAozMTAgfCAyIAoyMTggfCAyIAoxODUgfCAyIAozNDAgfCAyIAoyNDUgfCAxIAoxMjUgfCAxIAozNTAgfCAyIAoyODAgfCAyCgphKSBEZXNhcnJvbGxlIGxhIGVjdWFjacOzbiBkZSBlc3RpbWFjacOzbiBxdWUgbWVqb3IgZGVzY3JpYmEgZXN0b3MgZGF0b3MuCmIpIENhbGN1bGUgZWwgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24uCmMpIFByb25vc3RpcXVlIGxhIHJlbnRhIHBhcmEgdW4gZGVwYXJ0YW1lbnRvIGRlIGRvcyByZWPDoW1hcmFzLgpgYGB7cn0KcmVudGEgPC0gYygyMzAsMTkwLDQ1MCwzMTAsMjE4LDE4NSwzNDAsMjQ1LDEyNSwzNTAsMjgwKQpyZWNhbWFyYXMgPC0gYygyLDEsMywyLDIsMiwyLDEsMSwyLDIpCnJlZ3Jlc2lvbjMgPC0gbG0ocmVudGEgfiByZWNhbWFyYXMpCnN1bW1hcnkocmVncmVzaW9uMykKIyBhKQojIFJlbnRhID0gNTUuMDAgKyAxMTUuOTAqUmVjYW1hcmFzCgojIGIpIAojIHIyID0gMC41NzYyCgojIGMpIApyZWNhbWFyYXMxIDwtIDIKcmVudGExIDwtIDU1KzExNS45KnJlY2FtYXJhczEKcmVudGExCiMgMjg2LjgwCmBgYAo=