Estadistica

Para Realizar Este trabajo de Matemática a modo de practica he usado Rstudio Ya que es mi herramienta de trabajo diaria Como científico de datos. Ademasen las imágenes Insertadas estarán en Color Azul los valores respuestas.

Actividad 1:

  1. Cantidad de ganado vacuno en las provincias de la Mesopotamia Argentina: Cuantitativa.
  2. Religión de los padres de familia de la comunidad educativa de una escuela: Cualitativa.
  3. Ingresos de los trabajadores de la construcción: Cuantitativa.
  4. Cantidad de alumnos de las diferentes carreras de la Facultad de Filosofía y Letras: Cuantitativa.
  5. Género femenino o masculino de los socios de un club: Cualitativa.
  6. Estado civil de los habitantes de la ciudad de Rosario: Cualitativa.
  7. Cantidad de películas nacionales estrenadas durante un año: Cuantitativa.
  8. Color de cabello de los trabajadores de una empresa: Cualitativa.
  9. Puntaje obtenido por los alumnos ingresantes a la carrera de Medicina: Cuantitativa.

Actividad 2:

Ejemplos de variables cuantitativas: 1. Edad de los estudiantes de una universidad. 2. Temperatura en grados Celsius registrada durante un día.

Ejemplos de variables cualitativas: 1. Marcas de automóviles preferidas por los consumidores. 2. Tipos de alimentos favoritos de un grupo de personas.

Actividad 3:

  1. Cantidad de hermanos: 0 hermanos (15), 1 hermano (18), 2 hermanos (10), más de 2 hermanos (7).

  2. Equipo de fútbol con el que simpatizan o son hinchas: Equipo: Boca (35), Talleres (25), River (20), Otro (10), No sigue el fútbol (10).

  3. Precio promedio mensual del dólar: Año 2021 (167.875), Año 2022 (254.625), Año 2023 (446.714).

  4. Consumo de energía eléctrica:

    • Obtener información de las facturas de electricidad de los últimos dos años. Por ejemplo, el consumo promedio mensual de energía eléctrica en los últimos dos años podría ser: Año 1 (250 kWh), Año 2 (280 kWh).
  5. Programa de televisión preferido entre las 20 hs y las 22 hs: Programa A (20), Programa B (15), Programa C (10), Otro (5).

  6. Marca de automóviles más vendidos en Argentina: Fiat Cronos (4.183), Peugeot 208 (3.814), Toyota Hilux (2.957).

  7. Precio promedio mensual de la soja en Argentina: ser: Año 1 ($300), Año 2 ($320), Año 3 ($310).

Organizacion de Datos:

Tabla De Frecuencias:

Actividad 4

En el hall de un aeropuerto internacional se entrevistó a los turistas que partían para preguntarles cuántas veces antes de ésta habían tomado vacaciones en el exterior. Las respuestas de una muestra de 40 entrevistados fueron las siguientes:

2 0 1 2 1 0 2 0 2 0 2 0 2 1 2 2 0 0 2 2 1 3 0 1 0 2 1 0 0 2 0 0 0 1 2 3 0 3 2 1

  1. ¿Cuál es la variable considerada en esta situación? Clasificarla.
  1. Realiza una tabla de frecuencias.
Vacaciones_en_Exterior
 0  1  2  3 
15  8 14  3 
  1. ¿Qué fracción de los turistas salía al exterior por primera vez?
Vacaciones_en_Exterior
   0    1    2    3 
37.5 20.0 35.0  7.5 

La Proporcion de encuestados que sale al exterior por primera vez es el 20.0% de encuestados

Actividad 5. La siguiente tabla de frecuencias corresponde a los resultados obtenidos en una encuesta

realizada a los 180 trabajadores de una fábrica de baterías, en la que se pretendía saber si los empleados eran fumadores o no

Actividad 6

En las últimas elecciones del centro vecinal del barrio Amanecer los candidatos a presidente eran: Aníbal (A), Bernardo (B), Clara (C), Esteban (E) y Lucía (L). Se realizó una encuesta a boca de urna a 50 personas obteniendo los siguientes resultados: A A B A B A B A B A A C B C E L A B A A A A A B A E A B A A A B B A B A C B C L B A A B C A B A A A

  1. ¿Cuál es la variable considerada en esta situación? Clasificarla.
  1. Realiza una tabla de frecuencias.
Elecciones_Barrio_Amanecer
 A  B  C  E  L 
25 15  5  2  2 
  1. ¿Quién será el presidente según esta encuesta? El presidente segun esta encuesta Sera Abel con el 51% de los votos
porcentajes2 <- prop.table(tabla_frecuencias2) * 100
print(porcentajes2)
Elecciones_Barrio_Amanecer
        A         B         C         E         L 
51.020408 30.612245 10.204082  4.081633  4.081633 

Actividad 7

Realiza una tabla de frecuencias para organizar los datos recopilados en la actividad 3 para cada una de las dos variables elegidas

Actividad 8

. La siguiente tabla de frecuencias corresponde a los resultados de una encuesta realizada a 40 personas sobre el medio de transporte que utilizarán este año para sus vacaciones. Completa los datos faltantes.

Gráficos estadísticos

Los gráficos estadísticos permiten una interpretación simple y rápida de la información, y pueden conducir a extraer conclusiones sobre el tema de estudio. Al comienzo de esta sección analizamos algunos gráficos, publicados por el INDEC, que nos mostraban información obtenida del censo realizado en 2010. A continuación, estudiaremos algunos gráficos estadísticos que permiten representar gráficamente variables cuantitativas y cualitativas. Para ello comenzaremos resolviendo una actividad

  1. Gráfico o Diagrama de barras El diagrama de barras es utilizado para representar gráficamente variables tanto cualitativas como cuantitativas.

Para confeccionar un diagrama de barras se ubican en el eje horizontal los diferentes valores de la variable (respetando un orden si existiese) y en el eje vertical se ubican los valores de la frecuencia absoluta, relativa o porcentual respetando una escala conveniente. Luego se trazan las barras para cada valor de la variable. Éstas deben tener el mismo ancho y su altura la determina la frecuencia elegida en el eje vertical.

Actividad 9

Considera nuevamente las situaciones propuestas en las actividades 4 y 5 y realiza, para cada una de ellas, un diagrama de barras.

Actividad 10

La familia Gonzalez es dueña del supermercado del pueblo por varias generaciones. Al finalizar cada mes, realiza un análisis de las ventas realizadas por rubro. La siguiente tabla corresponde a las ventas realizadas el mes pasado.

  1. Realiza un gráfico de barras.

  2. Si las ventas de ese mes sumaron aproximadamente $25 000, ¿cuánto dinero facturaron por artículos de limpieza?

Respuesta a:

Respuesta b:

Si las ventas de ese mes sumaron aproximadamente $25 000

La fórmula para calcular el porcentaje de un número es:

\[ Porcentaje = 25,000 \times 0.15 = 3,750 \]

Entonces, el 15% de 25,000 es igual a 3,750.

Gráfico circular

Este tipo de gráfico resulta útil cuando se pretende comparar datos entre sí y es posible utilizarlo para todo tipo de variables. Mediante los distintos sectores se representa la proporción entre los valores de la variable. Es conveniente que el número de sectores sea pequeño y sus áreas estén bien diferenciadas para interpretar mejor la información que representa.

Para confeccionar un gráfico circular, se traza un círculo y uno de sus radios. A partir de dicho radio, se traza un ángulo cuya amplitud se obtiene con la fórmula 100 fp ⋅360º , donde fp es la frecuencia porcentual del primer valor de la variable. Así se obtiene el primer sector, y repitiendo este procedimiento para los restantes valores de las variables, se divide al círculo original en tantos sectores como valores posee la variable que se desea representar.

Veamos un ejemplo. Si consideramos la información presente en la siguiente tabla, debemos realizar la siguiente construcción

Actividad 11

Une con flechas cada gráfico circular con la información que representa

Actividad 12

En la fábrica Rielescor planean modificar su playa de estacionamiento para empleados con la intención de mejorar la circulación en el horario de salida. Para ello comenzaron con una encuesta a todos los empleados sobre el medio de transporte que utilizan para concurrir al trabajo. Los resultados se muestran en el gráfico circular

  1. ¿Cuál es el porcentaje de empleados que va en bicicleta?
  1. ¿Cuál es el medio de transporte más utilizado? ¿y el menos utilizado?
  1. ¿Qué porcentaje de empleados usa moto o bicicleta? -El porcentaje de empleados que usa moto o bicicleta es del 37%
  2. ¿Qué porcentaje no va en auto?
  1. Si hay un total de 200 empleados, ¿cuántos utilizan cada medio de transporte

3% de 200: \(200 \times 0.03 = 6\) Empleados usa colectivo

25% de 200: \(200 \times 0.25 = 50\) Empleados usa Moto

12% de 200: \(200 \times 0.12 = 24\) Empleados usa Bicicleta

60% de 200: \(200 \times 0.60 = 120\) Empleados usa Auto

Actividad 13

Con el objetivo de decidir sobre el color del envase de un nuevo producto, se hizo una encuesta a 150 personas. A cada una se le pidió que eligiera el color preferido entre azul, verde, rojo y blanco. Los resultados fueron:

Confecciona un gráfico circular y un diagrama de barras que muestre los resultados de la encuesta.

Color <- c("green", "blue", "red", "white")
Preferencias <- c(30, 15, 75, 30)

# Crear un marco de datos con los datos
data_barras <- data.frame(Color = Color, Preferencias = Preferencias)

# Calcular los porcentajes
total_preferencias <- sum(Preferencias)
porcentajes <- (Preferencias / total_preferencias) * 100

# Crear el gráfico de barras con porcentajes y borde negro
grafico_barras <- ggplot(data = data_barras, aes(x = Color, y = Preferencias, fill = Color)) +
  geom_bar(stat = "identity", color = "black") +  # Barras con borde negro
  geom_text(aes(label = paste0(porcentajes, "%")), position = position_stack(vjust = 0.5)) +  # Agregar porcentajes
  labs(title = "Gráfico de Barras - Preferencias de Color", x = "Color", y = "Preferencias") +
  scale_fill_manual(values = Color) + theme_minimal()

# Crear el gráfico circular con borde negro
grafico_circular <- ggplot(data = data_barras, aes(x = "", y = Preferencias, fill = Color)) +
  geom_bar(stat = "identity", width = 1, color = "black") +  # Barras con borde negro
  geom_bar(stat = "identity", width = 1) +  # Barras rellenas
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(porcentajes, "%")), position = position_stack(vjust = 0.5)) +
  scale_fill_manual(values = Color) +
  labs(title = "Gráfico Circular - Preferencias de Color", fill = "Color") +
  theme_minimal()

# Mostrar los gráficos
print(grafico_circular)

print(grafico_barras)

Actividad 14

A la salida de un cine se realizó una encuesta a 40 personas para conocer el género que prefería. Las respuestas fueron las siguientes:

Arma una tabla de frecuencias y realiza un gráfico circular que represente esta información:

# Vector con los géneros preferidos
genero_preferido <- c(
  "Acción", "Romántica", "Acción", "Acción", "Romántica",
  "Comedia", "Comedia", "Comedia", "Acción", "Terror",
  "Terror", "Romántica", "Comedia", "Acción", "Romántica",
  "Acción", "Acción", "Acción", "Acción", "Acción",
  "Romántica", "Comedia", "Comedia", "Comedia", "Comedia",
  "Comedia", "Acción", "Comedia", "Romántica", "Comedia",
  "Romántica", "Comedia", "Acción", "Terror", "Acción", "Terror", "Acción"
)

# Crear la tabla de frecuencias
tabla_frecuencia <- table(genero_preferido)

# Convertir la tabla de frecuencias a un marco de datos
data_tabla <- as.data.frame(tabla_frecuencia)
colnames(data_tabla) <- c("Genero", "Frecuencia")

# Calcular los porcentajes
total_frecuencia <- sum(data_tabla$Frecuencia)
data_tabla$Porcentaje <- (data_tabla$Frecuencia / total_frecuencia) * 100



# Crear el gráfico de torta con porcentajes y borde negro
grafico_torta <- ggplot(data_tabla, aes(x = "", y = Frecuencia, fill = Genero)) +
  geom_bar(stat = "identity", color = "black") +
  coord_polar("y") +
  labs(title = "Gráfico de Torta - Géneros Preferidos") +
  theme_void() +
  scale_fill_brewer(palette = "Set3") +
  geom_text(aes(label = paste0(round(Porcentaje, 1), "%")), position = position_stack(vjust = 0.5))

# Mostrar el gráfico de torta
print(grafico_torta)

NA
NA
  1. Pictograma Los pictogramas son gráficos estadísticos en los que las frecuencias se representan por medio de dibujos relacionados con la variable de estudio

Para confeccionar un pictograma se dibujan dos ejes perpendiculares y en uno de ellos, se ubican los valores de la variable. Luego, se debe elegir una imagen que represente la variable de estudio y se debe hallar el máximo común divisor entre las frecuencias de todos los valores de la variable, para que cada imagen represente esa cantidad. Por último, se alinean sobre el valor de la variable tantas imágenes como le correspondan a su frecuencia.

Por ejemplo, si consideramos la situación presente en la actividad 13 y calculamos sus frecuencias absolutas, obtenemos los siguientes resultados:

Viendo los valores de las frecuencias, su mcd es 4, por lo que al elegir una imagen conveniente, cada una de ellas representará 4 personas encuestadas. Debido a esto, para el valor de la variable comedia deberemos usar 3 imágenes para representar las 12 personas encuestadas

## Actividad 15

El siguiente pictograma representa la cantidad de viajes realizados por una empresa de camiones en el primer cuatrimestre de este año:

Completa la siguiente tabla:

MEDICIÓN DE DATOS:

La interpretación de los datos de una población se facilita cuando se realiza y analiza de un gráfico estadístico. Pero cuando se trata de una población muy grande, se observa además que los datos tienden a distribuirse alrededor de ciertos valores. Estos valores se llaman parámetros de posición central y permiten resumir o sintetizar los datos correspondientes a toda una población en un solo número que representa al conjunto total. Los parámetros más comunes son la media, la moda y la mediana, y pueden obtenerse cuando la variable de estudio es cuantitativa. Para las variables cualitativas solo se calcula su moda. Para obtener sus definiciones comenzaremos resolviendo la siguiente actividad.

Mario se entrena a diario para participar en una maratón. Esta semana realizó los siguientes recorridos: Lunes Martes Miércoles Jueves Viernes Sábado Domingo 9 km 7 km 15 km 15 km 13 km 11 km 3 km

  1. Calcula la distancia promedio que recorrió esta semana, para lo cual se deben sumar todas las distancias recorridas y dividir dicha suma por 7.
Kilometros<-c(9,7,15,15,13,11,3)
mean(Kilometros)
[1] 10.42857
  1. ¿Cuál fue la distancia que más se repitió en esta semana?
  1. Ordena las distancias de menor a mayor e identificar la distancia que se encuentra en la ubicación central.
# Ordenar los números de menor a mayor
Valores_ordenados <- sort(Kilometros)

# Calcular el valor central (mediana)
valor_central <- median(Valores_ordenados)
print(Valores_ordenados)
[1]  3  7  9 11 13 15 15
print(valor_central)
[1] 11

Actividad 16

Halla la media, la moda y la mediana de cada una de las siguientes muestras y realizar un análisis del significado de los valores obtenidos.

  1. Cantidad de horas extras mensuales trabajadas por 9 obreros. 40 25 36 12 40 25 40 32 38
horas_Extra9_obreros <- c(40, 25, 36, 12, 40, 25, 40, 32, 38)
Promedio<-mean(horas_Extra9_obreros)
Mediana<-median(horas_Extra9_obreros)

print(Promedio)
[1] 32
print(Mediana)
[1] 36
  1. Años de antigüedad en el trabajo de 8 profesores. 7 2 20 12 9 3 18 6
años_de_antiguedad_8_Profesionales <- c(7, 2, 20, 12, 9, 3, 18, 6)
Promedio<- mean(años_de_antiguedad_8_Profesionales)
Mediana<-median(años_de_antiguedad_8_Profesionales)

print(Promedio)
[1] 9.625
print(Mediana)
[1] 8
  1. Precio, en pesos, de un chicle en 6 kioscos. 0,42 0,47 0,44 0,49 0,47 0,42 -La moda de esos valores es 0,42. A continuación, se realizará el cálculo del promedio y la mediana
Precio <- c(0.42, 0.47, 0.44, 0.49, 0.47, 0.42)
Promedio<-mean(Precio)
Mediana<-median(Precio)

print(Promedio)
[1] 0.4516667
print(Mediana)
[1] 0.455

Actividad 17

En la siguiente tabla se detalla la cantidad de colectivos que toman los empleados de una fábrica para asistir a su trabajo. Halla la moda de la cantidad de colectivos que toman los trabajadores e interpretar el significado de dicho número.

Vemos que el valor 0 se repite con mayor frecuencia (15 veces), seguido por el valor 1 (10 veces) y luego el valor 2 (5 veces). Por lo tanto, la moda en este caso es 0. Esto significa que la cantidad de trabajadores que no toman ningún colectivo es el valor más común en esta fábrica. Es decir, hay más trabajadores que no toman colectivos que los que toman 1 o 2 colectivos para ir al trabajo.

Actividad 18

En un instituto de música enseñan bajo y batería. Observa los gráficos y luego responde las preguntas.

  1. ¿Cuántos alumnos estudian batería?
  1. ¿Cuántos de los alumnos que estudian bateria tienen como mínimo 16 años?
  1. ¿Cuál es el porcentaje de los alumnos que estudian batería que tienen entre 14 y 16 años?
  1. Si 6 alumnos que tienen 15 años representan el 10% de los alumnos que estudian bajo, ¿cuántos alumnos de 17 años concurren al instituto a aprender este instrumento?
  1. ¿Cuál es el promedio de edades de los estudiantes de bajo? ¿Coincide el promedio con la moda?

  2. Calcular el promedio de edades:

\[ \begin{align*} \text{Promedio} &= (18 \times 0.25) + (15 \times 0.10) + (16 \times 0.05) + (17 \times 0.60) \end{align*} \] c. Comparar el promedio con la moda:

\[ \begin{align*} \text{Promedio} &= 16.95 \\ \text{Moda} &= 17 \\ \\ \text{Promedio es igual a Moda} &: \text{ } \text{Promedio} = \text{Moda} \end{align*} \]

La moda es el valor más común en un conjunto de datos. Según el gráfico de torta, la edad más común es 17 años (60% de los alumnos). El promedio calculado anteriormente es cercano a 17 años. Por lo tanto, el promedio y la moda no coinciden exactamente, pero son bastante similares.

Actividad 19

Para realizar un análisis sobre las ausencias de sus estudiantes, un CENMA observó un grupo de 20 alumnos durante un mes y registró los siguientes valores.

a. Ordena los datos en una tabla de frecuencias. b. Realiza un gráfico circular. c. Indica el número de ausencias más frecuentes ese mes. d. Halla el promedio y la mediana

ausencias <- c(1, 3, 2, 5, 1, 0, 0, 1, 1, 2, 2, 1, 2, 2, 2, 4)
Frecuencia_Ausencia <-table(ausencias)
porcentajes_Ausencias <- prop.table(Frecuencia_Ausencia) * 100
print(Frecuencia_Ausencia)
ausencias
0 1 2 3 4 5 
2 5 6 1 1 1 
print(porcentajes_Ausencias)
ausencias
    0     1     2     3     4     5 
12.50 31.25 37.50  6.25  6.25  6.25 
# Etiquetas con porcentajes formateados
etiquetas_con_porcentaje <- paste0(names(Frecuencia_Ausencia), "\n", round(porcentajes_Ausencias, 1), "%")

# Crear el gráfico de torta con etiquetas de porcentajes
pie(porcentajes_Ausencias, labels = etiquetas_con_porcentaje, main = "Gráfico de Torta - Ausencias")

  1. El numero de Usencias mas frecuente de ese mes es de 2 Ausencias.

  2. Acontinuacion se realizara el calculo del promedio y la mediana.

Promedio<-mean(ausencias)
Mediana<-median(ausencias)
print(Promedio)
[1] 1.8125
print(Mediana)
[1] 2

Actividad 20

Una casa de deportes vendió, durante los tres últimos años, 4500 pares de zapatillas para adulto. La siguiente tabla muestra la distribución de las ventas según el número de calzado

El administrador decidió comprar para este año 1200 pares, de los cuales 700 son número 38. ¿Es acertada la decisión?

# Valores de ventas históricas
ventas_historicas <- c(10, 60, 200, 910, 1720, 1170, 350, 70, 10)
numero_calzado <- 35:43

# Calcular el total de ventas históricas
total_ventas_historicas <- sum(ventas_historicas)

# Calcular la proporción de ventas históricas para cada número de calzado
proporcion_ventas_historicas <- ventas_historicas / total_ventas_historicas

# Crear un marco de datos con la distribución de ventas históricas
data_ventas_historicas <- data.frame(Numero_Calzado = numero_calzado, Proporcion = proporcion_ventas_historicas)

# Cantidad de pares de zapatillas a comprar este año
total_compras_planificadas <- 1200
compras_numero_38 <- 700

# Calcular la proporción de compras de número 38 respecto al total de compras
proporcion_compras_numero_38 <- compras_numero_38 / total_compras_planificadas

# Calcular la proporción de compras para otros números de calzado
proporcion_compras_otros_numeros <- 1 - proporcion_compras_numero_38

# Crear un marco de datos con la distribución de compras planificadas
data_compras_planificadas <- data.frame(
  Numero_Calzado = c("38", "Otros"),
  Proporcion = c(proporcion_compras_numero_38, proporcion_compras_otros_numeros)
)
print(data_ventas_historicas)
NA
print(data_compras_planificadas)

Comparando las proporciones de ventas históricas y compras planificadas, podemos ver lo siguiente:

Para las ventas históricas:

La proporción de ventas del número 38 es aproximadamente 0.202 (20.2%). Para las compras planificadas:

La proporción de compras del número 38 es 0.583 (58.3%). La proporción de ventas históricas del número 38 es significativamente más baja que la proporción de compras planificadas. Esto podría indicar que se están comprando más zapatillas número 38 de lo que se ha vendido históricamente en comparación con otros números.

Dado que la proporción de compras planificadas para el número 38 es mucho mayor que la proporción de ventas históricas, podría haber un exceso en la cantidad de zapatillas número 38 que se está planeando comprar. Sería recomendable revisar las cifras y considerar ajustar las compras planificadas para asegurarse de que estén alineadas con las tendencias históricas de ventas.

Actividad 21

Una empresa textil compra rollos de tela que presentan cierto número de defectos por rollo. En su última operación, la empresa compró 100 rollos de tela con las cantidades de defectos por rollo que se muestran en la tabla. El gerente de compras analiza la partida y rechaza la compra si el promedio de defectos por rollo es mayor a 2. ¿Rechazará esta compra?

# Definir los datos
defectos <- c(0, 1, 2, 3, 4, 5)
cantidades <- c(15, 18, 25, 15, 12, 15)
total_rollos <- sum(cantidades)

# Calcular el promedio de defectos por rollo
promedio_defectos <- sum(defectos * cantidades) / total_rollos

# Umbral para el rechazo
umbral_rechazo <- 2

# Ver si la compra será rechazada o no
if (promedio_defectos > umbral_rechazo) {
  decision <- "Rechazada"
} else {
  decision <- "Aceptada"
}

# Imprimir resultados
cat("Promedio de defectos por rollo:", promedio_defectos, "\n")
Promedio de defectos por rollo: 2.36 
cat("Decisión:", decision)
Decisión: Rechazada

Actividad 22

Una empresa de transporte interurbano quiere informar a sus usuarios el tiempo de viaje entre dos ciudades que ofrece el servicio. Para ello, eligieron 55 de sus unidades, evaluaron cuánto tardaron en llegar a destino y volcaron los registros en una tabla como la siguiente. ¿Cuál es el tiempo promedio de viaje que la empresa usará para informar a sus usuarios

# Definir los datos
tiempo <- c(42, 45, 46, 47, 48, 50, 52)
frecuencia <- c(6, 7, 8, 8, 10, 8, 8)
total_unidades <- sum(frecuencia)

# Calcular el tiempo promedio de viaje
tiempo_promedio <- sum(tiempo * frecuencia) / total_unidades

# Imprimir el tiempo promedio de viaje
cat("El tiempo promedio de viaje es:", tiempo_promedio, "minutos")
El tiempo promedio de viaje es: 47.4 minutos

Actividad 23

Se arrojó un dado una cierta cantidad de veces y los resultados se registraron en el siguiente gráfico. Observa y luego responde:

a. ¿Cuántas veces se arrojó el dado? - El dado se arrojo 35 veces.

  1. ¿Qué número salió más veces? ¿y menos?
  1. ¿Qué número salió las mismas veces que su valor?
  1. ¿Cuántas veces salió un número menor que 5? ¿Y cuántas un número mayor que 3?
  1. Calcula el promedio.
  2. Encuentra la moda y la mediana
# Definir los datos
resultados <- c(rep(1, 5), rep(2, 8), rep(3, 4), rep(4, 5), rep(5, 7), rep(6, 6))

# Calcular el promedio
promedio <- mean(resultados)

# Calcular la mediana
mediana <- median(resultados)

# Calcular la moda
moda <- as.numeric(names(sort(table(resultados), decreasing = TRUE)[1]))

# Imprimir los resultados
cat("Promedio:", promedio, "\n")
Promedio: 3.542857 
cat("Mediana:", mediana, "\n")
Mediana: 4 
cat("Moda:", moda, "\n")
Moda: 2 

OTRA AGRUPACIÓN DE DATOS:

Cuando una muestra posee numerosos o variados datos cuantitativos es posible agruparlos para facilitar su manipulación. Esos agrupamientos, llamados intervalos de clase, deben incluir a todos los individuos de la muestra y deben tener la misma extensión. La cantidad de agrupamientos que se toman no debe ser excesiva para que su manipulación no sea dificultosa, ni escasa para que no se pierda precisión. Para comprender esta nueva organización de los datos, realizaremos la siguiente actividad

En la tabla anterior se agruparon las estaturas imponiendo la condición de ser mayor o igual a un número y menor a otro. A dicha agrupación se la llama intervalo de clase.

Un intervalo de clase, representado por [m ; n), agrupa todos los datos comprendidos ente m y n, incluyendo a m pero no a n. La amplitud de un intervalo se obtiene con la diferencia m - n

En el caso de agrupar los datos en intervalos de clase, la tabla de frecuencias es muy similar a las usadas previamente, solo difiere la primer columna, en la cual, en lugar de enumerar todos los valores posibles de la variable aparecen los intervalos de clase.

Para armar los intervalos de clase, se debe considerar el menor y el mayor dato, y establecer primero el número de intervalos que se desean obtener teniendo en cuenta que:  todos los intervalos deben tener la misma amplitud.  cada dato debe pertenecer a un solo intervalo

Las frecuencias absolutas, relativas y porcentuales se calculan de la misma manera que definimos anteriormente y su total, es la suma de todos los valores de esa columna. Teniendo en cuenta esto, completa la siguiente tabla de frecuencias:

La amplitud de todos los intervalos usados en la tabla anterior es 0,05. Para el cálculo de los parámetros de posición es necesario agregar a la tabla de frecuencias dos columnas más, una para la llamada frecuencia acumulada y otra para el punto medio de cada intervalo

Se llama frecuencia acumulada, representada por F, a la cantidad de veces que se repite un valor de la variable o cualquier otro que sea menor y se obtiene sumando la frecuencia absoluta de ese intervalo con la de frecuencia absoluta de todos los intervalos anteriores.

El punto medio de un intervalo es el valor central del mismo, se representa por c y se obtiene calculando el promedio entre sus extremos. Para un intervalo [m ; n), su punto medio es

\[ c = \frac{m + n}{2} \]

Actividad 24

Un médico está investigando una enfermedad cardíaca y su relación con el colesterol. Para ello registró las mediciones de colesterol (en mg por dl de sangre) de los análisis clínicos de 30 de sus pacientes. Los datos fueron los siguientes:

 1 | 185 | 225 | 198 | 214 | 195 | 237 |
 2 | 190 | 230 | 215 | 215 | 197 | 215 |
 3 | 187 | 238 | 195 | 213 | 205 | 203 |
 4 | 210 | 234 | 254 | 186 | 203 | 225 |
 5 | 233 | 224 | 235 | 216 | 240 | 239 |
  1. Completa la siguiente tabla.

  1. ¿Cuántos pacientes tienen una medición de colesterol por debajo de 220?

En la tabla de frecuencias, observamos que la frecuencia acumulada para el intervalo [200 ; 220) es 13. Por lo tanto, hay 13 pacientes cuyas mediciones de colesterol están por debajo de 220 mg/dl.

  1. Si se consideran valores normales aquellos que están entre 180 y 200, ¿qué porcentaje de los pacientes está fuera de esos parámetros?

Basado en la tabla de frecuencias corregida, la frecuencia acumulada para el intervalo [180 ; 200) es 4. Dado que el total de pacientes es 30 (suma de todas las frecuencias), el número de pacientes fuera del rango de valores normales es 30 - 4 = 26.

El porcentaje de pacientes fuera del rango de valores normales es:

= 100%

%

%

En resumen, aproximadamente el 86.67% de los pacientes tienen mediciones de colesterol fuera del rango considerado como valores normales (180-200 mg/dl).

Actividad 25

Los siguientes datos corresponden a las temperaturas máximas durante el mes de junio.

Confecciona una tabla de frecuencias y para ello, se sugiere considerar intervalos a partir de 7ºC con una amplitud de 3ºC.

Intervalo Frecuencia
[7, 10) 7
[10, 13) 6
[13, 16) 7
[16, 19) 5
[19, 22) 3

Actividad 26

. En una empresa, se recabó información sobre la antigüedad que tenían sus empleados en el trabajo. Los valores obtenidos en una muestra de 30 empleados fueron los siguientes:

5 4 11 3 16 0 3 9 21 13 10 2 6 6 8 4 15 2 25 7 14 3 8 15 9 15 10 19 24 4

  1. Completa la siguiente tabla

  1. Indicar cuál es el porcentaje de empleados que tienen una antigüedad inferior a 14 años.

Frecuencia de [0, 7): 6 empleados Frecuencia de [7, 14): 10 empleados

Total de empleados con antigüedad inferior a 14 años: 6 + 10 = 16 empleados.

Porcentaje de empleados con antigüedad inferior a 14 años: \[ \frac{16}{30} \times 100 = 53.33\% \]

El 53.33% de los empleados tienen una antigüedad inferior a 14 años.

GRAFICOS ESTADISTICOS:

Para las variables cuantitativas que se agrupan sus valores en intervalos de clase, también se pueden representar gráficamente usando gráficos estadísticos. A continuación, estudiaremos nuevamente los gráficos circulares y definiremos dos tipos de gráficos nuevos: el histograma y el polígono de frecuencia. 1. Histograma Cuando la variable en estudio está agrupada en intervalos de clase un gráfico apropiado es un histograma, el cual consiste en una serie de rectángulos consecutivos.

Para confeccionar un histograma se trazan dos ejes perpendiculares y luego se trazan rectángulos consecutivos, cuya base en el eje horizontal, está determinada por los intervalos de clase, y su altura, en el eje vertical, por la frecuencia absoluta o relativa correspondiente a ese intervalo.

Si consideramos nuevamente la actividad inicial, en la que se estudiaron las estaturas de los jugadores de básquet, se podría representar por medio de un histograma de la siguiente manera:

POLIGONO DE FRECUENCIAS:

El polígono de frecuencia se obtiene a partir del histograma, uniendo los puntos medios de los lados opuestos a las bases de cada rectángulo, incluyendo el anterior al primero y el posterior al último. Considerando nuevamente el ejemplo inicial, su polígono de frecuencias es:

GRAFICO CIRCULAR:

El gráfico circular, como mencionamos anteriormente, permite visualizar claramente la proporción que ocupa cada intervalo respecto a los restantes y su construcción se realiza de la misma manera que aprendimos en la primera sección. El gráfico circular correspondiente a las estaturas de los jugadores de básquet será el siguiente:

## Actividad 27

El histograma muestra la distribución de los sueldos de los empleados de una empresa. Observa y luego resuelve:

  1. ¿Cuántos empleados tiene la empresa?
  1. ¿Cuántos ganan menos de $3500? ¿Y más de $4000?
  1. Trazar sobre el histograma el poligono de frecuencias.

  1. Completa la siguiente tabla.

  1. Realiza un gráfico circular
# Vector de porcentajes
porcentajes <- c(22, 20, 17, 15, 25)

# Etiquetas para cada porcentaje
etiquetas <- c("[2.500;3.000)", "[3.000;3.500)", "[3.500;4.000)", "[4.000;4.500)", "[4.500;5.000]")

# Crear las etiquetas con porcentajes
etiquetas_con_porcentajes <- paste(etiquetas, "(", porcentajes, "%)", sep = " ")

# Crear el gráfico circular
pie(porcentajes, labels = etiquetas_con_porcentajes, main = "Gráfico Circular De Sueldos")

Actividad 28

Realizar un histograma y un polígono de frecuencias para representar cada una de las situaciones estudiadas en las actividades 1, 2 y 3 de esta sección.

# Crear un gráfico circular (gráfico de pastel)
# Crear un gráfico circular (gráfico de pastel)
porcentajes <- c(13.33, 30.00, 26.67, 30.00)  # Valores en porcentaje
nombres_intervalos <- c("[180 ; 200)", "[200 ; 220)", "[220 ; 240)", "[240 ; 260)")

pie_data <- data.frame(intervalos = nombres_intervalos, porcentaje = porcentajes)
pie_plot <- ggplot(pie_data, aes(x = "", y = porcentaje, fill = intervalos)) +
  geom_bar(stat = "identity") +
  coord_polar("y", start = 0) +
  labs(title = "Gráfico Circular de Frecuencias") +
  theme_void()

# Agregar porcentajes como etiquetas en el gráfico circular
labels <- paste(nombres_intervalos, "\n", porcentajes, "%")
pie_plot <- pie_plot + geom_text(aes(label = labels), position = position_stack(vjust = 0.5))

print(pie_plot)


# Crear un gráfico de barras
barras_data <- data.frame(intervalos = nombres_intervalos, frecuencia = c(4, 9, 8, 9))
bar_plot <- ggplot(barras_data, aes(x = intervalos, y = frecuencia, fill = intervalos)) +
  geom_bar(stat = "identity") +
  labs(title = "Gráfico de Barras de Frecuencias", x = "Intervalos", y = "Frecuencia") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

print(bar_plot)

# Datos de temperaturas máximas
temperaturas <- c(7.3, 12, 14, 16, 16.3, 9.3,
                  16.4, 14.7, 10, 8, 9, 7.4,
                  10.4, 21, 13.7, 15, 8, 15.7,
                  12, 12.4, 12.5, 8.6, 7, 10.1,
                  18, 15, 14.5, 8.3, 10, 7)

# Crear la tabla de frecuencias
frecuencia_temperaturas <- table(cut(temperaturas, seq(7, 25, by = 3), right = FALSE))

# Crear el gráfico circular
etiquetas <- paste(names(frecuencia_temperaturas), " (", frecuencia_temperaturas, ")", sep = "")
pie(frecuencia_temperaturas, labels = etiquetas, main = "Gráfico Circular - Temperaturas Máximas")


# Calcular el punto medio de cada intervalo
puntos_medios <- seq(8, 23, by = 3)

# Crear el polígono de frecuencias
plot(puntos_medios, frecuencia_temperaturas, type = "n", main = "Polígono de Frecuencias - Temperaturas Máximas", 
     xlab = "Temperatura Máxima (ºC)", ylab = "Frecuencia", ylim = c(0, max(frecuencia_temperaturas) + 2))
polygon(c(7, puntos_medios, 25), c(0, frecuencia_temperaturas, 0), col = "lightblue")
lines(puntos_medios, frecuencia_temperaturas, col = "blue", lwd = 2)


# Crear el histograma
hist(temperaturas, breaks = seq(7, 25, by = 3), freq = FALSE, 
     main = "Histograma - Temperaturas Máximas", xlab = "Temperatura Máxima (ºC)", ylab = "Densidad", col = "lightgreen")
lines(density(temperaturas), col = "blue", lwd = 2)

NA
NA

MEDIDAS PARA DATOS AGRUPADOS: Cuando los datos aparecen en las tablas de frecuencias agrupados en intervalos de clase, también es posible calcular sus parámetros de posición. Si bien éstos se obtienen de una manera diferente, su interpretación es la misma que definimos anteriormente.

La media aritmética o promedio se obtiene dividiendo por el total de observaciones a la suma de los productos de los puntos medios con las frecuencias absolutas de cada intervalo

El intervalo que contiene a la mediana es el que tiene su frecuencia acumulada igual o mayor a la mitad de las observaciones. La mediana será el punto medio de dicho intervalo

La moda se aproxima como el punto medio del intervalo de mayor frecuencia absoluta.

Veamos cómo se calculan la media, la moda y la mediana a partir de un ejemplo. La siguiente tabla de frecuencias muestra la cantidad de dinero que invierte una familia en abono de telefonía celular para todos sus integrantes. Los datos se obtuvieron de una encuesta realizada a 100 familias.

Que Me = 700 significa que la mitad de las familias encuestadas destinan menos de $700 al pago de abono en telefonía celular y que la otra mitad, gasta más de $700 en ese servicio. Para la interpretación de la media, podemos decir que las familias encuestadas invierten aproximadamente $718 en promedio para el servicio de telefonía celular. Por último, que Mo = 500 significa que ese monto es, aproximadamente, el que más veces se repite, por lo que es la cantidad de dinero que más familias destinan al pago del servicio de telefonía.

Actividad 29

La siguiente tabla muestra los datos obtenidos del peso en kg de 400 personas.

  1. Completa.

Promedio (Media):

Para calcular el promedio, necesitamos utilizar el producto de la frecuencia y el punto medio (\(c \cdot f\)) para cada intervalo, y luego sumar todos estos productos y dividir entre el total de la frecuencia total.

\[ \text{Promedio} = \frac{\sum (c \cdot f)}{\text{Total de la frecuencia}} \]

En este caso, usando los valores que proporcionaste en la tabla, el cálculo sería:

\[ \text{Promedio} = \frac{2107 + 2907 + 4940 + 5256 + 8910 + 4450}{400} \approx 68.825 \]

Moda:

La moda es el valor o intervalo que más frecuentemente se repite. En este caso, el intervalo con la mayor frecuencia es [77 ; 85), con una frecuencia de 108. Por lo tanto, la moda es el intervalo [77 ; 85).

Mediana:

La mediana es el valor que se encuentra en el medio cuando los datos se ordenan de menor a mayor. En este caso, como tenemos intervalos, primero necesitamos encontrar el intervalo que contiene la mediana.

Para encontrar el intervalo mediano, calculamos la frecuencia acumulada y encontramos el intervalo donde la frecuencia acumulada es igual o superior a la mitad del total de frecuencias. En este caso, el intervalo mediano es [69 ; 77).

Luego, usamos la fórmula de la mediana para intervalos:

\[ \text{Mediana} = L + \frac{\frac{n}{2} - F}{f} \cdot w \]

Donde:

\(L\) es el límite inferior del intervalo mediano (69 en este caso) \(n\) es el total de frecuencias (400) \(F\) es la frecuencia acumulada del intervalo anterior (170 en este caso) \(f\) es la frecuencia del intervalo mediano (72 en este caso) \(w\) es el ancho del intervalo (8 en este caso)

Sustituyendo estos valores en la fórmula:

\[ \text{Mediana} = 69 + \frac{\frac{400}{2} - 170}{72} \cdot 8 \approx 76.5 \]

Por lo tanto, el promedio es aproximadamente 68.825, la moda es el intervalo [77 ; 85) y la mediana es aproximadamente 76.5.

Actividad 30

Los siguientes datos son las velocidades, en km/h, que registró el radar policial de 40 automóviles que circulaban frente un puesto de control en una ruta nacional.

  1. Organiza los datos en una tabla de frecuencias con intervalos de 20 km/h de ancho.

  2. Traza un histograma.

  3. Calcula la velocidad promedio, la moda y la mediana.

  4. Escribe una interpretación del significado de los parámetros calculados.

  5. Organizar los datos en una tabla de frecuencias con intervalos de 20 km/h de ancho:

Intervalo Frecuencia [50 ; 70) 4 [70 ; 90) 8 [90 ; 110) 10 [110 ; 130) 10 [130 ; 150) 8

  1. Trazar un histograma:
# Datos de velocidades
velocidades <- c(45, 115, 100, 95, 70, 110, 80, 100,
                 85, 130, 105, 120, 65, 105, 90, 60,
                 105, 100, 90, 75, 115, 55, 110, 50,
                 65, 135, 115, 70, 80, 95, 100, 95,
                 95, 100, 85, 100, 90, 105, 80, 120)

# Crear un histograma
hist(velocidades, breaks = seq(45, 155, by = 20), col = "skyblue",
     main = "Histograma de Velocidades", xlab = "Velocidad (km/h)", ylab = "Frecuencia")

  1. Calcular la velocidad promedio, la moda y la mediana:
# Calcular el promedio
promedio <- mean(velocidades)

# Calcular la moda
moda <- as.numeric(names(sort(table(velocidades), decreasing = TRUE)[1]))

# Calcular la mediana
mediana <- median(velocidades)
promedio  # Imprimir el promedio
[1] 92.625
moda      # Imprimir la moda
[1] 100
mediana   # Imprimir la mediana
[1] 95
  1. Interpretación del significado de los parámetros calculados:

Promedio: La velocidad promedio de los automóviles en la muestra es aproximadamente 92.625 km/h. Moda: La velocidad más común entre los automóviles en la muestra es de 100 km/h. Mediana: La velocidad mediana entre los automóviles en la muestra es de 95 km/h, lo que significa que la mitad de los automóviles están por debajo de esta velocidad y la otra mitad están por encima. Ademas se puede ver que la distrubucion de la variable Velocidad tiene una distrubicion normal es decir una distribucion de Gauss

Actividad 31

Los siguientes datos corresponden al tiempo aproximado, en minutos, transcurridos desde que fue solicitado un taxi hasta que hizo contacto con el pasajero:

Realiza una tabla de frecuencia utilizando 5 intervalos de clase y calcular sus parámetros de posición indicando cuál es su interpretación.

# Datos de tiempo
tiempo <- c(7, 8, 4, 3, 2, 5, 15, 6, 4, 4, 5, 3, 7, 11,
            7, 9, 13, 10, 9, 8, 12, 7, 4, 3, 16, 8, 5, 14)

# Calcular las modas
tabla_frecuencias <- table(tiempo)
modas <- as.numeric(names(tabla_frecuencias)[tabla_frecuencias == max(tabla_frecuencias)])

# Calcular promedio (media)
promedio <- mean(tiempo)

# Calcular mediana
mediana <- median(tiempo)
Promedio (Media):
El tiempo promedio en minutos desde que se solicitó un taxi hasta que hizo contacto con el pasajero es de aproximadamente 7.46 minutos.
El tiempo mediano en minutos desde que se solicitó un taxi hasta que hizo contacto con el pasajero es de aproximadamente 7 minutos, lo que significa que la mitad de los tiempos son menores a este valor y la otra mitad son mayores.
Moda:
El tiempo más común en minutos desde que se solicitó un taxi hasta que hizo contacto con el pasajero son los siguientes valores: 4 y 7 minutos.

Actividad 32

Completa la siguiente tabla correspondiente a al tiempo, en minutos, que demoran 60 trabajadores en llegar a su casa

# Datos de tiempo y frecuencias
tiempo <- c(3.5, 10.5, 17.5, 24.5, 31.5)
frecuencias <- c(20, 13, 18, 5, 4)

# Calcular el tiempo promedio
promedio <- sum(tiempo * frecuencias) / sum(frecuencias)

# Calcular la moda (los valores con mayor frecuencia)
moda <- tiempo[frecuencias == max(frecuencias)]

# Calcular la mediana
mediana <- median(rep(tiempo, frecuencias))
# Imprimir resultados
cat("a. Resultados:\n")
a. Resultados:
cat("Tiempo promedio en minutos:", round(promedio, 2), "minutos\n")
Tiempo promedio en minutos: 12.83 minutos
cat("Moda (tiempo más común):", moda, "minutos\n")
Moda (tiempo más común): 3.5 minutos
cat("Mediana (tiempo en el medio):", mediana, "minutos\n\n")
Mediana (tiempo en el medio): 10.5 minutos
# Crear gráfico de barras
barplot(frecuencias, names.arg = tiempo, main = "Gráfico de Barras de Frecuencias", xlab = "Tiempo (minutos)", ylab = "Frecuencia", col = "skyblue")

# Porcentaje de trabajadores que tardan más de 21 minutos
porcentaje_mas_21 <- sum(frecuencias[tiempo > 21]) / sum(frecuencias) * 100
cat("c. Porcentaje de trabajadores que tardan más de 21 minutos:", round(porcentaje_mas_21, 2), "%\n")
c. Porcentaje de trabajadores que tardan más de 21 minutos: 15 %
LS0tDQp0aXRsZTogIk1hdGVtw6F0aWNhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMgRXN0YWRpc3RpY2ENClBhcmEgUmVhbGl6YXIgRXN0ZSB0cmFiYWpvIGRlIE1hdGVtw6F0aWNhIGEgbW9kbyBkZSBwcmFjdGljYSBoZSB1c2FkbyBSc3R1ZGlvIFlhIHF1ZSBlcyBtaSBoZXJyYW1pZW50YSBkZSB0cmFiYWpvIGRpYXJpYSBDb21vIGNpZW50w61maWNvIGRlIGRhdG9zLiBBZGVtYXNlbiBsYXMgaW3DoWdlbmVzIEluc2VydGFkYXMgZXN0YXLDoW4gZW4gQ29sb3IgQXp1bCBsb3MgdmFsb3JlcyByZXNwdWVzdGFzLg0KDQojIyBBY3RpdmlkYWQgMToNCg0KYS4gQ2FudGlkYWQgZGUgZ2FuYWRvIHZhY3VubyBlbiBsYXMgcHJvdmluY2lhcyBkZSBsYSBNZXNvcG90YW1pYSBBcmdlbnRpbmE6IEN1YW50aXRhdGl2YS4NCmIuIFJlbGlnacOzbiBkZSBsb3MgcGFkcmVzIGRlIGZhbWlsaWEgZGUgbGEgY29tdW5pZGFkIGVkdWNhdGl2YSBkZSB1bmEgZXNjdWVsYTogQ3VhbGl0YXRpdmEuDQpjLiBJbmdyZXNvcyBkZSBsb3MgdHJhYmFqYWRvcmVzIGRlIGxhIGNvbnN0cnVjY2nDs246IEN1YW50aXRhdGl2YS4NCmQuIENhbnRpZGFkIGRlIGFsdW1ub3MgZGUgbGFzIGRpZmVyZW50ZXMgY2FycmVyYXMgZGUgbGEgRmFjdWx0YWQgZGUgRmlsb3NvZsOtYSB5IExldHJhczogQ3VhbnRpdGF0aXZhLg0KZS4gR8OpbmVybyBmZW1lbmlubyBvIG1hc2N1bGlubyBkZSBsb3Mgc29jaW9zIGRlIHVuIGNsdWI6IEN1YWxpdGF0aXZhLg0KZi4gRXN0YWRvIGNpdmlsIGRlIGxvcyBoYWJpdGFudGVzIGRlIGxhIGNpdWRhZCBkZSBSb3NhcmlvOiBDdWFsaXRhdGl2YS4NCmcuIENhbnRpZGFkIGRlIHBlbMOtY3VsYXMgbmFjaW9uYWxlcyBlc3RyZW5hZGFzIGR1cmFudGUgdW4gYcOxbzogQ3VhbnRpdGF0aXZhLg0KaC4gQ29sb3IgZGUgY2FiZWxsbyBkZSBsb3MgdHJhYmFqYWRvcmVzIGRlIHVuYSBlbXByZXNhOiBDdWFsaXRhdGl2YS4NCmkuIFB1bnRhamUgb2J0ZW5pZG8gcG9yIGxvcyBhbHVtbm9zIGluZ3Jlc2FudGVzIGEgbGEgY2FycmVyYSBkZSBNZWRpY2luYTogQ3VhbnRpdGF0aXZhLg0KDQojIyBBY3RpdmlkYWQgMjoNCg0KRWplbXBsb3MgZGUgdmFyaWFibGVzIGN1YW50aXRhdGl2YXM6DQoxLiBFZGFkIGRlIGxvcyBlc3R1ZGlhbnRlcyBkZSB1bmEgdW5pdmVyc2lkYWQuDQoyLiBUZW1wZXJhdHVyYSBlbiBncmFkb3MgQ2Vsc2l1cyByZWdpc3RyYWRhIGR1cmFudGUgdW4gZMOtYS4NCg0KRWplbXBsb3MgZGUgdmFyaWFibGVzIGN1YWxpdGF0aXZhczoNCjEuIE1hcmNhcyBkZSBhdXRvbcOzdmlsZXMgcHJlZmVyaWRhcyBwb3IgbG9zIGNvbnN1bWlkb3Jlcy4NCjIuIFRpcG9zIGRlIGFsaW1lbnRvcyBmYXZvcml0b3MgZGUgdW4gZ3J1cG8gZGUgcGVyc29uYXMuDQoNCiMjIEFjdGl2aWRhZCAzOg0KDQphLiBDYW50aWRhZCBkZSBoZXJtYW5vczoNCiAgICAwIGhlcm1hbm9zICgxNSksIDEgaGVybWFubyAoMTgpLCAyIGhlcm1hbm9zICgxMCksIG3DoXMgZGUgMiBoZXJtYW5vcyAoNykuDQoNCmIuIEVxdWlwbyBkZSBmw7p0Ym9sIGNvbiBlbCBxdWUgc2ltcGF0aXphbiBvIHNvbiBoaW5jaGFzOg0KICAgRXF1aXBvOiBCb2NhICgzNSksIFRhbGxlcmVzICgyNSksIFJpdmVyICgyMCksIE90cm8gKDEwKSwgTm8gc2lndWUgZWwgZsO6dGJvbCAoMTApLg0KDQpjLiBQcmVjaW8gcHJvbWVkaW8gbWVuc3VhbCBkZWwgZMOzbGFyOg0KICBBw7FvIDIwMjEgKDE2Ny44NzUpLCBBw7FvIDIwMjIgKDI1NC42MjUpLCBBw7FvIDIwMjMgKDQ0Ni43MTQpLg0KDQpkLiBDb25zdW1vIGRlIGVuZXJnw61hIGVsw6ljdHJpY2E6DQogICAtIE9idGVuZXIgaW5mb3JtYWNpw7NuIGRlIGxhcyBmYWN0dXJhcyBkZSBlbGVjdHJpY2lkYWQgZGUgbG9zIMO6bHRpbW9zIGRvcyBhw7Fvcy4gUG9yIGVqZW1wbG8sIGVsIGNvbnN1bW8gcHJvbWVkaW8gbWVuc3VhbCBkZSBlbmVyZ8OtYSBlbMOpY3RyaWNhIGVuIGxvcyDDumx0aW1vcyBkb3MgYcOxb3MgcG9kcsOtYSBzZXI6IEHDsW8gMSAoMjUwIGtXaCksIEHDsW8gMiAoMjgwIGtXaCkuDQoNCmUuIFByb2dyYW1hIGRlIHRlbGV2aXNpw7NuIHByZWZlcmlkbyBlbnRyZSBsYXMgMjAgaHMgeSBsYXMgMjIgaHM6DQogICAgUHJvZ3JhbWEgQSAoMjApLCBQcm9ncmFtYSBCICgxNSksIFByb2dyYW1hIEMgKDEwKSwgT3RybyAoNSkuDQoNCmYuIE1hcmNhIGRlIGF1dG9tw7N2aWxlcyBtw6FzIHZlbmRpZG9zIGVuIEFyZ2VudGluYToNCiAgICBGaWF0IENyb25vcyAoNC4xODMpLCBQZXVnZW90IDIwOCAoMy44MTQpLCBUb3lvdGEgSGlsdXggKDIuOTU3KS4NCg0KZy4gUHJlY2lvIHByb21lZGlvIG1lbnN1YWwgZGUgbGEgc29qYSBlbiBBcmdlbnRpbmE6DQogICAgc2VyOiBBw7FvIDEgKCQzMDApLCBBw7FvIDIgKCQzMjApLCBBw7FvIDMgKCQzMTApLg0KICAgIA0KT3JnYW5pemFjaW9uIGRlIERhdG9zOg0KDQohW10oQ29sZWdpby5qcGcpDQoNClRhYmxhIERlIEZyZWN1ZW5jaWFzOg0KIVtdKENvbGVnaW8gMi5qcGcpDQogICAgDQojIyBBY3RpdmlkYWQgNA0KDQogRW4gZWwgaGFsbCBkZSB1biBhZXJvcHVlcnRvIGludGVybmFjaW9uYWwgc2UgZW50cmV2aXN0w7MgYSBsb3MgdHVyaXN0YXMgcXVlIHBhcnTDrWFuIHBhcmEgDQpwcmVndW50YXJsZXMgY3XDoW50YXMgdmVjZXMgYW50ZXMgZGUgw6lzdGEgaGFiw61hbiB0b21hZG8gdmFjYWNpb25lcyBlbiBlbCBleHRlcmlvci4gTGFzIHJlc3B1ZXN0YXMgZGUgDQp1bmEgbXVlc3RyYSBkZSA0MCBlbnRyZXZpc3RhZG9zIGZ1ZXJvbiBsYXMgc2lndWllbnRlczoNCg0KMiAwIDEgMiAxIDAgMiAwIDIgMCAyIDAgMiAxIDIgMiAwIDAgMiAyIA0KMSAzIDAgMSAwIDIgMSAwIDAgMiAwIDAgMCAxIDIgMyAwIDMgMiAxIA0KDQphLiDCv0N1w6FsIGVzIGxhIHZhcmlhYmxlIGNvbnNpZGVyYWRhIGVuIGVzdGEgc2l0dWFjacOzbj8gQ2xhc2lmaWNhcmxhLg0KKyBSZXNwdWVzdGE6IFZhcmlhYmxlIEN1YW50aXRhdGl2YSBEaXNjcmV0YQ0KDQpiLiBSZWFsaXphIHVuYSB0YWJsYSBkZSBmcmVjdWVuY2lhcy4NCmBgYHtyLGVjaG89RkFMU0V9DQpWYWNhY2lvbmVzX2VuX0V4dGVyaW9yIDwtIGMoDQogIDIsIDAsIDEsIDIsIDEsIDAsIDIsIDAsIDIsIDAsIDIsIDAsIDIsIDEsIDIsIDIsIDAsIDAsIDIsIDIsDQogIDEsIDMsIDAsIDEsIDAsIDIsIDEsIDAsIDAsIDIsIDAsIDAsIDAsIDEsIDIsIDMsIDAsIDMsIDIsIDEpDQoNCiMgQ3JlYXIgbGEgdGFibGEgZGUgZnJlY3VlbmNpYXMNCnRhYmxhX2ZyZWN1ZW5jaWFzIDwtIHRhYmxlKFZhY2FjaW9uZXNfZW5fRXh0ZXJpb3IpDQoNCiMgTW9zdHJhciBsYSB0YWJsYSBkZSBmcmVjdWVuY2lhcw0KcHJpbnQodGFibGFfZnJlY3VlbmNpYXMpDQoNCmBgYA0KDQpjLiDCv1F1w6kgZnJhY2Npw7NuIGRlIGxvcyB0dXJpc3RhcyBzYWzDrWEgYWwgZXh0ZXJpb3IgcG9yIHByaW1lcmEgdmV6Pw0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KcG9yY2VudGFqZXMgPC0gcHJvcC50YWJsZSh0YWJsYV9mcmVjdWVuY2lhcykgKiAxMDANCnByaW50KHBvcmNlbnRhamVzKQ0KDQpgYGANCkxhIFByb3BvcmNpb24gZGUgZW5jdWVzdGFkb3MgcXVlIHNhbGUgYWwgZXh0ZXJpb3IgcG9yIHByaW1lcmEgdmV6IGVzIGVsIDIwLjAlIGRlIGVuY3Vlc3RhZG9zDQoNCiMjIEFjdGl2aWRhZCA1LiBMYSBzaWd1aWVudGUgdGFibGEgZGUgZnJlY3VlbmNpYXMgY29ycmVzcG9uZGUgYSBsb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3MgZW4gdW5hIGVuY3Vlc3RhIA0KcmVhbGl6YWRhIGEgbG9zIDE4MCB0cmFiYWphZG9yZXMgZGUgdW5hIGbDoWJyaWNhIGRlIGJhdGVyw61hcywgZW4gbGEgcXVlIHNlIHByZXRlbmTDrWEgc2FiZXIgc2kgbG9zIA0KZW1wbGVhZG9zIGVyYW4gZnVtYWRvcmVzIG8gbm8NCg0KIVtdKENvbGVnaW8zLmpwZykNCg0KDQoNCg0KDQoNCg0KDQoNCg0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KIyMgQWN0aXZpZGFkIDYNCg0KRW4gbGFzIMO6bHRpbWFzIGVsZWNjaW9uZXMgZGVsIGNlbnRybyB2ZWNpbmFsIGRlbCBiYXJyaW8gQW1hbmVjZXIgbG9zIGNhbmRpZGF0b3MgYQ0KcHJlc2lkZW50ZSBlcmFuOiBBbsOtYmFsIChBKSwgQmVybmFyZG8gKEIpLCBDbGFyYSAoQyksIEVzdGViYW4gKEUpIHkgTHVjw61hIChMKS4gU2UgcmVhbGl6w7MgdW5hIGVuY3Vlc3RhIGEgDQpib2NhIGRlIHVybmEgYSA1MCBwZXJzb25hcyBvYnRlbmllbmRvIGxvcyBzaWd1aWVudGVzIHJlc3VsdGFkb3M6DQpBIEEgQiBBIEIgQSBCIEEgQiBBIEEgQyBCIEMgRSBMIEEgQiBBIEEgQSBBIEEgQiBBIA0KRSBBIEIgQSBBIEEgQiBCIEEgQiBBIEMgQiBDIEwgQiBBIEEgQiBDIEEgQiBBIEEgQSANCg0KYS4gwr9DdcOhbCBlcyBsYSB2YXJpYWJsZSBjb25zaWRlcmFkYSBlbiBlc3RhIHNpdHVhY2nDs24/IENsYXNpZmljYXJsYS4NCi0gVmFyaWFibGUgQ3VhbGl0YXRpdmENCmIuIFJlYWxpemEgdW5hIHRhYmxhIGRlIGZyZWN1ZW5jaWFzLg0KYGBge3IsZWNobz1GQUxTRX0NCkVsZWNjaW9uZXNfQmFycmlvX0FtYW5lY2VyIDwtIGMoDQogICAiQSIsICJBIiwgIkIiLCAiQSIsICJCIiwgIkEiLCAiQiIsICJBIiwgIkIiLCAiQSIsICJBIiwgIkMiLCAiQiIsICJDIiwgIkUiLCAiTCIsICJBIiwNCiAgICJCIiwgIkEiLCAiQSIsICJBIiwgIkEiLCAiQiIsICJBIiwgIkUiLCAiQSIsICJCIiwgIkEiLCAiQSIsICJBIiwgIkIiLCAiQiIsICJBIiwgIkIiLCAiQSIsDQogICAiQyIsICJCIiwgIkMiLCAiTCIsICJCIiwgIkEiLCAiQSIsICJCIiwgIkMiLCAiQSIsICJCIiwgIkEiLCAiQSIsICJBIikNCnRhYmxhX2ZyZWN1ZW5jaWFzMjwtdGFibGUoRWxlY2Npb25lc19CYXJyaW9fQW1hbmVjZXIpIA0KcHJpbnQodGFibGFfZnJlY3VlbmNpYXMyKQ0KYGBgDQoNCmMuIMK/UXVpw6luIHNlcsOhIGVsIHByZXNpZGVudGUgc2Vnw7puIGVzdGEgZW5jdWVzdGE/DQpFbCBwcmVzaWRlbnRlIHNlZ3VuIGVzdGEgZW5jdWVzdGEgU2VyYSBBYmVsIGNvbiBlbCA1MSUgZGUgbG9zIHZvdG9zDQpgYGB7cn0NCnBvcmNlbnRhamVzMiA8LSBwcm9wLnRhYmxlKHRhYmxhX2ZyZWN1ZW5jaWFzMikgKiAxMDANCnByaW50KHBvcmNlbnRhamVzMikNCmBgYA0KLSBFbCBwcmVzaWRlbnRlIHNlZ3VuIGVzdGEgZW5jdWVzdGEgU2VyYSBBbsOtYmFsIGNvbiBlbCA1MSUgZGUgbG9zIHZvdG9zICAgIA0KICAgIA0KICAgIA0KIyMgQWN0aXZpZGFkIDcNClJlYWxpemEgdW5hIHRhYmxhIGRlIGZyZWN1ZW5jaWFzIHBhcmEgb3JnYW5pemFyIGxvcyBkYXRvcyByZWNvcGlsYWRvcyBlbiBsYSBhY3RpdmlkYWQgMyANCnBhcmEgY2FkYSB1bmEgZGUgbGFzIGRvcyB2YXJpYWJsZXMgZWxlZ2lkYXMNCmBgYHtyfQ0KcHJpbnQoQ290aXphY2lvbl9Eb2xhcikNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCiMjIEFjdGl2aWRhZCA4DQouIExhIHNpZ3VpZW50ZSB0YWJsYSBkZSBmcmVjdWVuY2lhcyBjb3JyZXNwb25kZSBhIGxvcyByZXN1bHRhZG9zIGRlIHVuYSBlbmN1ZXN0YSByZWFsaXphZGEgYSANCjQwIHBlcnNvbmFzIHNvYnJlIGVsIG1lZGlvIGRlIHRyYW5zcG9ydGUgcXVlIHV0aWxpemFyw6FuIGVzdGUgYcOxbyBwYXJhIHN1cyB2YWNhY2lvbmVzLiBDb21wbGV0YSBsb3MgDQpkYXRvcyBmYWx0YW50ZXMuDQoNCiFbXShDb2xlZ2lvNC5qcGcpDQoNCiMjIEdyw6FmaWNvcyBlc3RhZMOtc3RpY29zDQoNCkxvcyBncsOhZmljb3MgZXN0YWTDrXN0aWNvcyBwZXJtaXRlbiB1bmEgaW50ZXJwcmV0YWNpw7NuIA0Kc2ltcGxlIHkgcsOhcGlkYSBkZSBsYSBpbmZvcm1hY2nDs24sIHkgcHVlZGVuIGNvbmR1Y2lyIGEgDQpleHRyYWVyIGNvbmNsdXNpb25lcyBzb2JyZSBlbCB0ZW1hIGRlIGVzdHVkaW8uIA0KQWwgY29taWVuem8gZGUgZXN0YSBzZWNjacOzbiBhbmFsaXphbW9zIGFsZ3Vub3MgDQpncsOhZmljb3MsIHB1YmxpY2Fkb3MgcG9yIGVsIElOREVDLCBxdWUgbm9zIG1vc3RyYWJhbiANCmluZm9ybWFjacOzbiBvYnRlbmlkYSBkZWwgY2Vuc28gcmVhbGl6YWRvIGVuIDIwMTAuIA0KQSBjb250aW51YWNpw7NuLCBlc3R1ZGlhcmVtb3MgYWxndW5vcyBncsOhZmljb3MgDQplc3RhZMOtc3RpY29zIHF1ZSBwZXJtaXRlbiByZXByZXNlbnRhciBncsOhZmljYW1lbnRlIHZhcmlhYmxlcyANCmN1YW50aXRhdGl2YXMgeSBjdWFsaXRhdGl2YXMuIFBhcmEgZWxsbyBjb21lbnphcmVtb3MgDQpyZXNvbHZpZW5kbyB1bmEgYWN0aXZpZGFkDQoNCiFbXShDb2xlZ2lvNS5qcGcpDQoNCg0KDQoxLiBHcsOhZmljbyBvIERpYWdyYW1hIGRlIGJhcnJhcw0KRWwgZGlhZ3JhbWEgZGUgYmFycmFzIGVzIHV0aWxpemFkbyBwYXJhIHJlcHJlc2VudGFyIGdyw6FmaWNhbWVudGUgdmFyaWFibGVzIHRhbnRvIGN1YWxpdGF0aXZhcyANCmNvbW8gY3VhbnRpdGF0aXZhcy4gDQoNClBhcmEgY29uZmVjY2lvbmFyIHVuIGRpYWdyYW1hIGRlIGJhcnJhcyBzZSB1YmljYW4gZW4gZWwgZWplIGhvcml6b250YWwgbG9zIGRpZmVyZW50ZXMgDQp2YWxvcmVzIGRlIGxhIHZhcmlhYmxlIChyZXNwZXRhbmRvIHVuIG9yZGVuIHNpIGV4aXN0aWVzZSkgeSBlbiBlbCBlamUgdmVydGljYWwgc2UgdWJpY2FuIGxvcyB2YWxvcmVzIA0KZGUgbGEgZnJlY3VlbmNpYSBhYnNvbHV0YSwgcmVsYXRpdmEgbyBwb3JjZW50dWFsIHJlc3BldGFuZG8gdW5hIGVzY2FsYSBjb252ZW5pZW50ZS4gTHVlZ28gc2UgDQp0cmF6YW4gbGFzIGJhcnJhcyBwYXJhIGNhZGEgdmFsb3IgZGUgbGEgdmFyaWFibGUuIMOJc3RhcyBkZWJlbiB0ZW5lciBlbCBtaXNtbyBhbmNobyB5IHN1IGFsdHVyYSANCmxhIGRldGVybWluYSBsYSBmcmVjdWVuY2lhIGVsZWdpZGEgZW4gZWwgZWplIHZlcnRpY2FsLg0KDQojIyBBY3RpdmlkYWQgOQ0KDQpDb25zaWRlcmEgbnVldmFtZW50ZSBsYXMgc2l0dWFjaW9uZXMgcHJvcHVlc3RhcyBlbiBsYXMgYWN0aXZpZGFkZXMgNCB5IDUgeSByZWFsaXphLCBwYXJhIA0KY2FkYSB1bmEgZGUgZWxsYXMsIHVuIGRpYWdyYW1hIGRlIGJhcnJhcy4NCg0KLSBSZXNwdWVzdGEgZGUgQWN0aXZpZGFkIDkgZGlhZ3JhbWEgZGUgYmFycmFzIGRlIGxhIGFjdGl2aWRhZCA0IA0KYGBge3IsZWNobz1GQUxTRX0NCiNHZW5lcmFtb3MgdW4gRGF0YSBGcmFtZQ0KZGZfZnJlY3VlbmNpYXMgPC0gYXMuZGF0YS5mcmFtZSh0YWJsYV9mcmVjdWVuY2lhcykNCg0KIyBSZW5vbWJyYXIgbGFzIGNvbHVtbmFzIHBhcmEgbWF5b3IgY2xhcmlkYWQNCmNvbG5hbWVzKGRmX2ZyZWN1ZW5jaWFzKSA8LSBjKCJWYWxvcmVzIiwgIkZyZWN1ZW5jaWEiKQ0KDQojIENyZWFyIGVsIGdyw6FmaWNvIGRlIGJhcnJhcw0KIGdncGxvdChkYXRhID0gZGZfZnJlY3VlbmNpYXMsIGFlcyh4ID0gVmFsb3JlcywgeSA9IEZyZWN1ZW5jaWEsZmlsbD1WYWxvcmVzKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIGRlIEJhcnJhcyAtIFZhY2FjaW9uZXMgZW4gZWwgRXh0ZXJpb3IiLCB4ID0gIkNhbnRpZGFkIERlIFZpYWplcyIsIHkgPSAiRnJlY3VlbmNpYSIpICsgDQogICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQotIFJlc3B1ZXN0YSBkZSBBY3RpdmlkYWQgOSBkaWFncmFtYSBkZSBiYXJyYXMgZGUgbGEgYWN0aXZpZGFkIDUgIA0KYGBge3IsZWNobz1GQUxTRX0NCg0KZ2dwbG90KGRmX2JhcnJpb19BbWFuZWNlcixhZXMoeCA9IFZvdG9zLCB5ID0gQ2FuZGlkYXRvcyxmaWxsID0gQ2FuZGlkYXRvcykpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArICBjb29yZF9mbGlwKCkgKyB0aGVtZV9taW5pbWFsKCkgKyANCiAgbGFicyh0aXRsZSA9ICJWb3RhY2lvbmVzIEJhcnJpbyBBbWFuZWNlciIpDQpgYGANCg0KDQojIyBBY3RpdmlkYWQgMTANCg0KTGEgZmFtaWxpYSBHb256YWxleiBlcyBkdWXDsWEgZGVsIHN1cGVybWVyY2FkbyBkZWwgcHVlYmxvIHBvciB2YXJpYXMgZ2VuZXJhY2lvbmVzLiBBbCANCmZpbmFsaXphciBjYWRhIG1lcywgcmVhbGl6YSB1biBhbsOhbGlzaXMgZGUgbGFzIHZlbnRhcyByZWFsaXphZGFzIHBvciBydWJyby4gTGEgc2lndWllbnRlIHRhYmxhIGNvcnJlc3BvbmRlIA0KYSBsYXMgdmVudGFzIHJlYWxpemFkYXMgZWwgbWVzIHBhc2Fkby4NCg0KIVtdKENvbGVnaW82LmpwZykNCg0KYS4gUmVhbGl6YSB1biBncsOhZmljbyBkZSBiYXJyYXMuDQoNCmIuIFNpIGxhcyB2ZW50YXMgZGUgZXNlIG1lcyBzdW1hcm9uIGFwcm94aW1hZGFtZW50ZQ0KJDI1IDAwMCwgwr9jdcOhbnRvIGRpbmVybyBmYWN0dXJhcm9uIHBvciBhcnTDrWN1bG9zIGRlIA0KbGltcGllemE/DQoNClJlc3B1ZXN0YSBhOg0KYGBge3IsZWNobz1GQUxTRX0NCmdncGxvdChhcnRpY3Vsb3MsIGFlcyh4ID0gUnVicm8sIHkgPSBQb3JjZW50YWplLCBmaWxsID0gUnVicm8pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoUG9yY2VudGFqZSwgIiUiKSksIHZqdXN0ID0gLTAuNSkgKyAgIyBBZ3JlZ2FyIGV0aXF1ZXRhcyBkZSBwb3JjZW50YWplDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQpSZXNwdWVzdGEgYjoNCg0KU2kgbGFzIHZlbnRhcyBkZSBlc2UgbWVzIHN1bWFyb24gYXByb3hpbWFkYW1lbnRlDQokMjUgMDAwDQoNCkxhIGbDs3JtdWxhIHBhcmEgY2FsY3VsYXIgZWwgcG9yY2VudGFqZSBkZSB1biBuw7ptZXJvIGVzOg0KDQoNClxbIFBvcmNlbnRhamUgPSAyNSwwMDAgXHRpbWVzIDAuMTUgPSAzLDc1MCBcXQ0KDQpFbnRvbmNlcywgZWwgMTVcJSBkZSAyNSwwMDAgZXMgaWd1YWwgYSAzLDc1MC4NCg0KDQoNCg0KDQojIyBHcsOhZmljbyBjaXJjdWxhcg0KDQpFc3RlIHRpcG8gZGUgZ3LDoWZpY28gcmVzdWx0YSDDunRpbCBjdWFuZG8gc2UgcHJldGVuZGUgY29tcGFyYXIgDQpkYXRvcyBlbnRyZSBzw60geSBlcyBwb3NpYmxlIHV0aWxpemFybG8gcGFyYSB0b2RvIHRpcG8gZGUgdmFyaWFibGVzLiANCk1lZGlhbnRlIGxvcyBkaXN0aW50b3Mgc2VjdG9yZXMgc2UgcmVwcmVzZW50YSBsYSBwcm9wb3JjacOzbiBlbnRyZSANCmxvcyB2YWxvcmVzIGRlIGxhIHZhcmlhYmxlLiANCkVzIGNvbnZlbmllbnRlIHF1ZSBlbCBuw7ptZXJvIGRlIHNlY3RvcmVzIHNlYSBwZXF1ZcOxbyB5IHN1cyANCsOhcmVhcyBlc3TDqW4gYmllbiBkaWZlcmVuY2lhZGFzIHBhcmEgaW50ZXJwcmV0YXIgbWVqb3IgbGEgaW5mb3JtYWNpw7NuIA0KcXVlIHJlcHJlc2VudGEuDQoNClBhcmEgY29uZmVjY2lvbmFyIHVuIGdyw6FmaWNvIGNpcmN1bGFyLCBzZSB0cmF6YSB1biBjw61yY3VsbyB5IHVubyBkZSBzdXMgcmFkaW9zLiBBIHBhcnRpciBkZSANCmRpY2hvIHJhZGlvLCBzZSB0cmF6YSB1biDDoW5ndWxvIGN1eWEgYW1wbGl0dWQgc2Ugb2J0aWVuZSBjb24gbGEgZsOzcm11bGEgMTAwDQpmcCDii4UzNjDCug0KLCBkb25kZSBmcA0KZXMgbGEgZnJlY3VlbmNpYSBwb3JjZW50dWFsIGRlbCBwcmltZXIgdmFsb3IgZGUgbGEgdmFyaWFibGUuIEFzw60gc2Ugb2J0aWVuZSBlbCBwcmltZXIgc2VjdG9yLCB5IA0KcmVwaXRpZW5kbyBlc3RlIHByb2NlZGltaWVudG8gcGFyYSBsb3MgcmVzdGFudGVzIHZhbG9yZXMgZGUgbGFzIHZhcmlhYmxlcywgc2UgZGl2aWRlIGFsIGPDrXJjdWxvIA0Kb3JpZ2luYWwgZW4gdGFudG9zIHNlY3RvcmVzIGNvbW8gdmFsb3JlcyBwb3NlZSBsYSB2YXJpYWJsZSBxdWUgc2UgZGVzZWEgcmVwcmVzZW50YXIuDQoNClZlYW1vcyB1biBlamVtcGxvLiBTaSBjb25zaWRlcmFtb3MgbGEgaW5mb3JtYWNpw7NuIHByZXNlbnRlIGVuIGxhIHNpZ3VpZW50ZSB0YWJsYSwgZGViZW1vcyANCnJlYWxpemFyIGxhIHNpZ3VpZW50ZSBjb25zdHJ1Y2Npw7NuDQoNCiFbXShjb2xlZ2lvNy5qcGcpDQoNCiMjIEFjdGl2aWRhZCAxMQ0KVW5lIGNvbiBmbGVjaGFzIGNhZGEgZ3LDoWZpY28gY2lyY3VsYXIgY29uIGxhIGluZm9ybWFjacOzbiBxdWUgcmVwcmVzZW50YQ0KIVtdKENvbGVnaW84LmpwZykNCg0KDQoNCg0KDQojIyBBY3RpdmlkYWQgMTINCg0KRW4gbGEgZsOhYnJpY2EgUmllbGVzY29yIHBsYW5lYW4gbW9kaWZpY2FyIHN1IHBsYXlhIGRlIGVzdGFjaW9uYW1pZW50byBwYXJhIGVtcGxlYWRvcyANCmNvbiBsYSBpbnRlbmNpw7NuIGRlIG1lam9yYXIgbGEgY2lyY3VsYWNpw7NuIGVuIGVsIGhvcmFyaW8gZGUgc2FsaWRhLiBQYXJhIGVsbG8gY29tZW56YXJvbiBjb24gdW5hIA0KZW5jdWVzdGEgYSB0b2RvcyBsb3MgZW1wbGVhZG9zIHNvYnJlIGVsIG1lZGlvIGRlIHRyYW5zcG9ydGUgcXVlIHV0aWxpemFuIHBhcmEgY29uY3VycmlyIGFsIHRyYWJham8uIA0KTG9zIHJlc3VsdGFkb3Mgc2UgbXVlc3RyYW4gZW4gZWwgZ3LDoWZpY28gY2lyY3VsYXINCiFbXShDb2xlZ2lvOS5qcGcpDQoNCmEuIMK/Q3XDoWwgZXMgZWwgcG9yY2VudGFqZSBkZSBlbXBsZWFkb3MgcXVlIHZhIGVuIGJpY2ljbGV0YT8NCi0gZWwgcG9yY2VudGFqZSBkZSBlbXBsZWFkbyBxdWUgdmEgZW4gYmljaWNsZXRhIGVzIGRlbCAxMiUNCmIuIMK/Q3XDoWwgZXMgZWwgbWVkaW8gZGUgdHJhbnNwb3J0ZSBtw6FzIHV0aWxpemFkbz8gwr95IGVsIG1lbm9zIHV0aWxpemFkbz8NCi0gRWwgbWVkaW8gZGUgdHJhbnNwb3J0ZSBtYXMgdXRpbGl6YWRvIGVzIGVsIEF1dG8geSBlbCBtZW5vcyB1dGlsaXphZG8gZXMgZWwgY29sZWN0aXZvDQpjLiDCv1F1w6kgcG9yY2VudGFqZSBkZSBlbXBsZWFkb3MgdXNhIG1vdG8gbyBiaWNpY2xldGE/DQotRWwgcG9yY2VudGFqZSBkZSBlbXBsZWFkb3MgcXVlIHVzYSBtb3RvIG8gYmljaWNsZXRhIGVzIGRlbCAzNyUNCmQuIMK/UXXDqSBwb3JjZW50YWplIG5vIHZhIGVuIGF1dG8/DQotIGVsIHBvcmNlbnRhamUgZGUgZW1wbGVhZG9zIHF1ZSBubyB2YSBlbiBhdXRvIGVzIGRlbCA2MCUNCmUuIFNpIGhheSB1biB0b3RhbCBkZSAyMDAgZW1wbGVhZG9zLCDCv2N1w6FudG9zIHV0aWxpemFuIGNhZGEgbWVkaW8gZGUgdHJhbnNwb3J0ZQ0KDQozJSBkZSAyMDA6IFwoIDIwMCBcdGltZXMgMC4wMyA9IDYgXCkgIEVtcGxlYWRvcyB1c2EgY29sZWN0aXZvDQoNCjI1JSBkZSAyMDA6IFwoIDIwMCBcdGltZXMgMC4yNSA9IDUwIFwpIEVtcGxlYWRvcyB1c2EgTW90bw0KDQoxMiUgZGUgMjAwOiBcKCAyMDAgXHRpbWVzIDAuMTIgPSAyNCBcKSBFbXBsZWFkb3MgdXNhIEJpY2ljbGV0YQ0KDQo2MCUgZGUgMjAwOiBcKCAyMDAgXHRpbWVzIDAuNjAgPSAxMjAgXCkgRW1wbGVhZG9zIHVzYSBBdXRvDQoNCg0KIyMgQWN0aXZpZGFkIDEzDQoNCkNvbiBlbCBvYmpldGl2byBkZSBkZWNpZGlyIHNvYnJlIGVsIGNvbG9yIGRlbCBlbnZhc2UgZGUgdW4gbnVldm8gcHJvZHVjdG8sIHNlIGhpem8gdW5hIA0KZW5jdWVzdGEgYSAxNTAgcGVyc29uYXMuIEEgY2FkYSB1bmEgc2UgbGUgcGlkacOzIHF1ZSBlbGlnaWVyYSBlbCBjb2xvciBwcmVmZXJpZG8gZW50cmUgYXp1bCwgdmVyZGUsIHJvam8geSANCmJsYW5jby4NCkxvcyByZXN1bHRhZG9zIGZ1ZXJvbjoNCg0KIVtdKENvbGVnaW8xMC5qcGcpDQpDb25mZWNjaW9uYSB1biBncsOhZmljbyBjaXJjdWxhciB5IHVuIGRpYWdyYW1hIGRlIGJhcnJhcyBxdWUgbXVlc3RyZSBsb3MgcmVzdWx0YWRvcyBkZSBsYSBlbmN1ZXN0YS4NCg0KYGBge3J9DQpDb2xvciA8LSBjKCJncmVlbiIsICJibHVlIiwgInJlZCIsICJ3aGl0ZSIpDQpQcmVmZXJlbmNpYXMgPC0gYygzMCwgMTUsIDc1LCAzMCkNCg0KIyBDcmVhciB1biBtYXJjbyBkZSBkYXRvcyBjb24gbG9zIGRhdG9zDQpkYXRhX2JhcnJhcyA8LSBkYXRhLmZyYW1lKENvbG9yID0gQ29sb3IsIFByZWZlcmVuY2lhcyA9IFByZWZlcmVuY2lhcykNCg0KIyBDYWxjdWxhciBsb3MgcG9yY2VudGFqZXMNCnRvdGFsX3ByZWZlcmVuY2lhcyA8LSBzdW0oUHJlZmVyZW5jaWFzKQ0KcG9yY2VudGFqZXMgPC0gKFByZWZlcmVuY2lhcyAvIHRvdGFsX3ByZWZlcmVuY2lhcykgKiAxMDANCg0KIyBDcmVhciBlbCBncsOhZmljbyBkZSBiYXJyYXMgY29uIHBvcmNlbnRhamVzIHkgYm9yZGUgbmVncm8NCmdyYWZpY29fYmFycmFzIDwtIGdncGxvdChkYXRhID0gZGF0YV9iYXJyYXMsIGFlcyh4ID0gQ29sb3IsIHkgPSBQcmVmZXJlbmNpYXMsIGZpbGwgPSBDb2xvcikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gImJsYWNrIikgKyAgIyBCYXJyYXMgY29uIGJvcmRlIG5lZ3JvDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocG9yY2VudGFqZXMsICIlIikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkgKyAgIyBBZ3JlZ2FyIHBvcmNlbnRhamVzDQogIGxhYnModGl0bGUgPSAiR3LDoWZpY28gZGUgQmFycmFzIC0gUHJlZmVyZW5jaWFzIGRlIENvbG9yIiwgeCA9ICJDb2xvciIsIHkgPSAiUHJlZmVyZW5jaWFzIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBDb2xvcikgKyB0aGVtZV9taW5pbWFsKCkNCg0KIyBDcmVhciBlbCBncsOhZmljbyBjaXJjdWxhciBjb24gYm9yZGUgbmVncm8NCmdyYWZpY29fY2lyY3VsYXIgPC0gZ2dwbG90KGRhdGEgPSBkYXRhX2JhcnJhcywgYWVzKHggPSAiIiwgeSA9IFByZWZlcmVuY2lhcywgZmlsbCA9IENvbG9yKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAxLCBjb2xvciA9ICJibGFjayIpICsgICMgQmFycmFzIGNvbiBib3JkZSBuZWdybw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAxKSArICAjIEJhcnJhcyByZWxsZW5hcw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHBvcmNlbnRhamVzLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gQ29sb3IpICsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyBDaXJjdWxhciAtIFByZWZlcmVuY2lhcyBkZSBDb2xvciIsIGZpbGwgPSAiQ29sb3IiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIE1vc3RyYXIgbG9zIGdyw6FmaWNvcw0KcHJpbnQoZ3JhZmljb19jaXJjdWxhcikNCnByaW50KGdyYWZpY29fYmFycmFzKQ0KDQpgYGANCg0KDQojIyBBY3RpdmlkYWQgMTQNCg0KQSBsYSBzYWxpZGEgZGUgdW4gY2luZSBzZSByZWFsaXrDsyB1bmEgZW5jdWVzdGEgYSA0MCBwZXJzb25hcyBwYXJhIGNvbm9jZXIgZWwgZ8OpbmVybyBxdWUgDQpwcmVmZXLDrWEuIExhcyByZXNwdWVzdGFzIGZ1ZXJvbiBsYXMgc2lndWllbnRlczoNCg0KIVtdKENvbGVnaW8xMS5qcGcpDQpBcm1hIHVuYSB0YWJsYSBkZSBmcmVjdWVuY2lhcyB5IHJlYWxpemEgdW4gZ3LDoWZpY28gY2lyY3VsYXIgcXVlIHJlcHJlc2VudGUgZXN0YSBpbmZvcm1hY2nDs246DQoNCmBgYHtyfQ0KIyBWZWN0b3IgY29uIGxvcyBnw6luZXJvcyBwcmVmZXJpZG9zDQpnZW5lcm9fcHJlZmVyaWRvIDwtIGMoDQogICJBY2Npw7NuIiwgIlJvbcOhbnRpY2EiLCAiQWNjacOzbiIsICJBY2Npw7NuIiwgIlJvbcOhbnRpY2EiLA0KICAiQ29tZWRpYSIsICJDb21lZGlhIiwgIkNvbWVkaWEiLCAiQWNjacOzbiIsICJUZXJyb3IiLA0KICAiVGVycm9yIiwgIlJvbcOhbnRpY2EiLCAiQ29tZWRpYSIsICJBY2Npw7NuIiwgIlJvbcOhbnRpY2EiLA0KICAiQWNjacOzbiIsICJBY2Npw7NuIiwgIkFjY2nDs24iLCAiQWNjacOzbiIsICJBY2Npw7NuIiwNCiAgIlJvbcOhbnRpY2EiLCAiQ29tZWRpYSIsICJDb21lZGlhIiwgIkNvbWVkaWEiLCAiQ29tZWRpYSIsDQogICJDb21lZGlhIiwgIkFjY2nDs24iLCAiQ29tZWRpYSIsICJSb23DoW50aWNhIiwgIkNvbWVkaWEiLA0KICAiUm9tw6FudGljYSIsICJDb21lZGlhIiwgIkFjY2nDs24iLCAiVGVycm9yIiwgIkFjY2nDs24iLCAiVGVycm9yIiwgIkFjY2nDs24iDQopDQoNCiMgQ3JlYXIgbGEgdGFibGEgZGUgZnJlY3VlbmNpYXMNCnRhYmxhX2ZyZWN1ZW5jaWEgPC0gdGFibGUoZ2VuZXJvX3ByZWZlcmlkbykNCg0KIyBDb252ZXJ0aXIgbGEgdGFibGEgZGUgZnJlY3VlbmNpYXMgYSB1biBtYXJjbyBkZSBkYXRvcw0KZGF0YV90YWJsYSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxhX2ZyZWN1ZW5jaWEpDQpjb2xuYW1lcyhkYXRhX3RhYmxhKSA8LSBjKCJHZW5lcm8iLCAiRnJlY3VlbmNpYSIpDQoNCiMgQ2FsY3VsYXIgbG9zIHBvcmNlbnRhamVzDQp0b3RhbF9mcmVjdWVuY2lhIDwtIHN1bShkYXRhX3RhYmxhJEZyZWN1ZW5jaWEpDQpkYXRhX3RhYmxhJFBvcmNlbnRhamUgPC0gKGRhdGFfdGFibGEkRnJlY3VlbmNpYSAvIHRvdGFsX2ZyZWN1ZW5jaWEpICogMTAwDQoNCg0KDQojIENyZWFyIGVsIGdyw6FmaWNvIGRlIHRvcnRhIGNvbiBwb3JjZW50YWplcyB5IGJvcmRlIG5lZ3JvDQpncmFmaWNvX3RvcnRhIDwtIGdncGxvdChkYXRhX3RhYmxhLCBhZXMoeCA9ICIiLCB5ID0gRnJlY3VlbmNpYSwgZmlsbCA9IEdlbmVybykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBjb29yZF9wb2xhcigieSIpICsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyBkZSBUb3J0YSAtIEfDqW5lcm9zIFByZWZlcmlkb3MiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChQb3JjZW50YWplLCAxKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKQ0KDQojIE1vc3RyYXIgZWwgZ3LDoWZpY28gZGUgdG9ydGENCnByaW50KGdyYWZpY29fdG9ydGEpDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCjMuIFBpY3RvZ3JhbWENCkxvcyBwaWN0b2dyYW1hcyBzb24gZ3LDoWZpY29zIGVzdGFkw61zdGljb3MgZW4gbG9zIHF1ZSBsYXMgZnJlY3VlbmNpYXMgc2UgcmVwcmVzZW50YW4gcG9yIG1lZGlvIGRlIA0KZGlidWpvcyByZWxhY2lvbmFkb3MgY29uIGxhIHZhcmlhYmxlIGRlIGVzdHVkaW8NCg0KUGFyYSBjb25mZWNjaW9uYXIgdW4gcGljdG9ncmFtYSBzZSBkaWJ1amFuIGRvcyBlamVzIHBlcnBlbmRpY3VsYXJlcyB5IGVuIHVubyBkZSANCmVsbG9zLCBzZSB1YmljYW4gbG9zIHZhbG9yZXMgZGUgbGEgdmFyaWFibGUuIEx1ZWdvLCBzZSBkZWJlIGVsZWdpciB1bmEgaW1hZ2VuIHF1ZSByZXByZXNlbnRlIA0KbGEgdmFyaWFibGUgZGUgZXN0dWRpbyB5IHNlIGRlYmUgaGFsbGFyIGVsIG3DoXhpbW8gY29tw7puIGRpdmlzb3IgZW50cmUgbGFzIGZyZWN1ZW5jaWFzIGRlIA0KdG9kb3MgbG9zIHZhbG9yZXMgZGUgbGEgdmFyaWFibGUsIHBhcmEgcXVlIGNhZGEgaW1hZ2VuIHJlcHJlc2VudGUgZXNhIGNhbnRpZGFkLiBQb3Igw7psdGltbywgDQpzZSBhbGluZWFuIHNvYnJlIGVsIHZhbG9yIGRlIGxhIHZhcmlhYmxlIHRhbnRhcyBpbcOhZ2VuZXMgY29tbyBsZSBjb3JyZXNwb25kYW4gYSBzdSANCmZyZWN1ZW5jaWEuDQoNClBvciBlamVtcGxvLCBzaSBjb25zaWRlcmFtb3MgbGEgc2l0dWFjacOzbiBwcmVzZW50ZSBlbiBsYSBhY3RpdmlkYWQgMTMgeSBjYWxjdWxhbW9zIHN1cyANCmZyZWN1ZW5jaWFzIGFic29sdXRhcywgb2J0ZW5lbW9zIGxvcyBzaWd1aWVudGVzIHJlc3VsdGFkb3M6DQoNCiFbXShDb2xlZ2lvMTIuanBnKQ0KDQpWaWVuZG8gbG9zIHZhbG9yZXMgZGUgbGFzIGZyZWN1ZW5jaWFzLCBzdSBtY2QNCmVzIDQsIHBvciBsbyBxdWUgYWwgZWxlZ2lyIHVuYSBpbWFnZW4gY29udmVuaWVudGUsIA0KY2FkYSB1bmEgZGUgZWxsYXMgcmVwcmVzZW50YXLDoSA0IHBlcnNvbmFzIA0KZW5jdWVzdGFkYXMuIERlYmlkbyBhIGVzdG8sIHBhcmEgZWwgdmFsb3IgZGUgbGEgDQp2YXJpYWJsZSBjb21lZGlhIGRlYmVyZW1vcyB1c2FyIDMgaW3DoWdlbmVzIHBhcmEgDQpyZXByZXNlbnRhciBsYXMgMTIgcGVyc29uYXMgZW5jdWVzdGFkYXMNCg0KIVtdKENvbGVnaW8xNC5qcGcpDQojIyBBY3RpdmlkYWQgMTUNCg0KRWwgc2lndWllbnRlIHBpY3RvZ3JhbWEgcmVwcmVzZW50YSBsYSBjYW50aWRhZCBkZSB2aWFqZXMgcmVhbGl6YWRvcyBwb3IgdW5hIA0KZW1wcmVzYSBkZSBjYW1pb25lcyBlbiBlbCBwcmltZXIgY3VhdHJpbWVzdHJlIGRlIGVzdGUgYcOxbzoNCg0KIVtdKENvbGVnaW8xNS5qcGcpDQpDb21wbGV0YSBsYSBzaWd1aWVudGUgdGFibGE6DQoNCiFbXShDb2xlZ2lvMTYuanBnKQ0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KTUVESUNJw5NOIERFIERBVE9TOiANCg0KTGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxvcyBkYXRvcyBkZSB1bmEgcG9ibGFjacOzbiBzZSANCmZhY2lsaXRhIGN1YW5kbyBzZSByZWFsaXphIHkgYW5hbGl6YSBkZSB1biBncsOhZmljbyANCmVzdGFkw61zdGljby4gUGVybyBjdWFuZG8gc2UgdHJhdGEgZGUgdW5hIHBvYmxhY2nDs24gbXV5IA0KZ3JhbmRlLCBzZSBvYnNlcnZhIGFkZW3DoXMgcXVlIGxvcyBkYXRvcyB0aWVuZGVuIGEgDQpkaXN0cmlidWlyc2UgYWxyZWRlZG9yIGRlIGNpZXJ0b3MgdmFsb3Jlcy4gRXN0b3MgdmFsb3JlcyBzZSANCmxsYW1hbiBwYXLDoW1ldHJvcyBkZSBwb3NpY2nDs24gY2VudHJhbCB5IHBlcm1pdGVuIHJlc3VtaXIgDQpvIHNpbnRldGl6YXIgbG9zIGRhdG9zIGNvcnJlc3BvbmRpZW50ZXMgYSB0b2RhIHVuYQ0KcG9ibGFjacOzbiBlbiB1biBzb2xvIG7Dum1lcm8gcXVlIHJlcHJlc2VudGEgYWwgY29uanVudG8gDQp0b3RhbC4gDQpMb3MgcGFyw6FtZXRyb3MgbcOhcyBjb211bmVzIHNvbiBsYSBtZWRpYSwgbGEgbW9kYSB5IGxhIG1lZGlhbmEsIHkgcHVlZGVuIG9idGVuZXJzZSBjdWFuZG8gDQpsYSB2YXJpYWJsZSBkZSBlc3R1ZGlvIGVzIGN1YW50aXRhdGl2YS4gUGFyYSBsYXMgdmFyaWFibGVzIGN1YWxpdGF0aXZhcyBzb2xvIHNlIGNhbGN1bGEgc3UgbW9kYS4NClBhcmEgb2J0ZW5lciBzdXMgZGVmaW5pY2lvbmVzIGNvbWVuemFyZW1vcyByZXNvbHZpZW5kbyBsYSBzaWd1aWVudGUgYWN0aXZpZGFkLg0KDQpNYXJpbyBzZSBlbnRyZW5hIGEgZGlhcmlvIHBhcmEgcGFydGljaXBhciBlbiB1bmEgbWFyYXTDs24uIEVzdGEgc2VtYW5hIHJlYWxpesOzIGxvcyANCnNpZ3VpZW50ZXMgcmVjb3JyaWRvczoNCkx1bmVzIE1hcnRlcyBNacOpcmNvbGVzIEp1ZXZlcyBWaWVybmVzIFPDoWJhZG8gRG9taW5nbw0KOSBrbSA3IGttIDE1IGttIDE1IGttIDEzIGttIDExIGttIDMga20NCg0KYS4gQ2FsY3VsYSBsYSBkaXN0YW5jaWEgcHJvbWVkaW8gcXVlIHJlY29ycmnDsyBlc3RhIHNlbWFuYSwgcGFyYSBsbw0KY3VhbCBzZSBkZWJlbiBzdW1hciB0b2RhcyBsYXMgZGlzdGFuY2lhcyByZWNvcnJpZGFzIHkgZGl2aWRpciBkaWNoYSBzdW1hIA0KcG9yIDcuDQpgYGB7cn0NCktpbG9tZXRyb3M8LWMoOSw3LDE1LDE1LDEzLDExLDMpDQptZWFuKEtpbG9tZXRyb3MpDQpgYGANCg0KYi4gwr9DdcOhbCBmdWUgbGEgZGlzdGFuY2lhIHF1ZSBtw6FzIHNlIHJlcGl0acOzIGVuIGVzdGEgc2VtYW5hPw0KDQotIExhIGRpc3RhbmNpYSBxdWUgbWFzIHNlIHJlcGl0aW8gZnVlIGRlIDE1a20gDQoNCmMuIE9yZGVuYSBsYXMgZGlzdGFuY2lhcyBkZSBtZW5vciBhIG1heW9yIGUgaWRlbnRpZmljYXIgbGEgZGlzdGFuY2lhDQpxdWUgc2UgZW5jdWVudHJhIGVuIGxhIHViaWNhY2nDs24gY2VudHJhbC4NCmBgYHtyfQ0KIyBPcmRlbmFyIGxvcyBuw7ptZXJvcyBkZSBtZW5vciBhIG1heW9yDQpWYWxvcmVzX29yZGVuYWRvcyA8LSBzb3J0KEtpbG9tZXRyb3MpDQoNCiMgQ2FsY3VsYXIgZWwgdmFsb3IgY2VudHJhbCAobWVkaWFuYSkNCnZhbG9yX2NlbnRyYWwgPC0gbWVkaWFuKFZhbG9yZXNfb3JkZW5hZG9zKQ0KcHJpbnQoVmFsb3Jlc19vcmRlbmFkb3MpDQpwcmludCh2YWxvcl9jZW50cmFsKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCiMjIEFjdGl2aWRhZCAxNg0KDQpIYWxsYSBsYSBtZWRpYSwgbGEgbW9kYSB5IGxhIG1lZGlhbmEgZGUgY2FkYSB1bmEgZGUgbGFzIHNpZ3VpZW50ZXMgbXVlc3RyYXMgeSByZWFsaXphciB1biANCmFuw6FsaXNpcyBkZWwgc2lnbmlmaWNhZG8gZGUgbG9zIHZhbG9yZXMgb2J0ZW5pZG9zLg0KDQphLiBDYW50aWRhZCBkZSBob3JhcyBleHRyYXMgbWVuc3VhbGVzIHRyYWJhamFkYXMgcG9yIDkgb2JyZXJvcy4NCjQwIDI1IDM2IDEyIDQwIDI1IDQwIDMyIDM4DQotIExhIG1vZGEgZGUgZXN0b3MgRGF0b3MgZXMgMjUgeSA0MCBwb3IgbG8gcXVlIGVzIGJpbW9kYWwsIEEgY29udGludWFjacOzbiwgc2UgcmVhbGl6YXLDoSBlbCBjw6FsY3VsbyBkZWwgcHJvbWVkaW8geSBsYSBtZWRpYW5hIA0KYGBge3J9DQpob3Jhc19FeHRyYTlfb2JyZXJvcyA8LSBjKDQwLCAyNSwgMzYsIDEyLCA0MCwgMjUsIDQwLCAzMiwgMzgpDQpQcm9tZWRpbzwtbWVhbihob3Jhc19FeHRyYTlfb2JyZXJvcykNCk1lZGlhbmE8LW1lZGlhbihob3Jhc19FeHRyYTlfb2JyZXJvcykNCg0KcHJpbnQoUHJvbWVkaW8pDQpwcmludChNZWRpYW5hKQ0KYGBgDQoNCmIuIEHDsW9zIGRlIGFudGlnw7xlZGFkIGVuIGVsIHRyYWJham8gZGUgOCBwcm9mZXNvcmVzLg0KNyAyIDIwIDEyIDkgMyAxOCA2IA0KLSBFc3RvcyBWYWxvcmVzIG5vIHRpZW5lIHVuIHZhbG9yIHJlcGV0aWRvLCBBIGNvbnRpbnVhY2nDs24sIHNlIHJlYWxpemFyw6EgZWwgY8OhbGN1bG8gZGVsIHByb21lZGlvIHkgbGEgbWVkaWFuYSANCmBgYHtyfQ0KYcOxb3NfZGVfYW50aWd1ZWRhZF84X1Byb2Zlc2lvbmFsZXMgPC0gYyg3LCAyLCAyMCwgMTIsIDksIDMsIDE4LCA2KQ0KUHJvbWVkaW88LSBtZWFuKGHDsW9zX2RlX2FudGlndWVkYWRfOF9Qcm9mZXNpb25hbGVzKQ0KTWVkaWFuYTwtbWVkaWFuKGHDsW9zX2RlX2FudGlndWVkYWRfOF9Qcm9mZXNpb25hbGVzKQ0KDQpwcmludChQcm9tZWRpbykNCnByaW50KE1lZGlhbmEpDQpgYGANCg0KYy4gUHJlY2lvLCBlbiBwZXNvcywgZGUgdW4gY2hpY2xlIGVuIDYga2lvc2Nvcy4NCjAsNDIgMCw0NyAwLDQ0IDAsNDkgMCw0NyAwLDQyIA0KLUxhIG1vZGEgZGUgZXNvcyB2YWxvcmVzIGVzIDAsNDIuIEEgY29udGludWFjacOzbiwgc2UgcmVhbGl6YXLDoSBlbCBjw6FsY3VsbyBkZWwgcHJvbWVkaW8geSBsYSBtZWRpYW5hIA0KYGBge3J9DQpQcmVjaW8gPC0gYygwLjQyLCAwLjQ3LCAwLjQ0LCAwLjQ5LCAwLjQ3LCAwLjQyKQ0KUHJvbWVkaW88LW1lYW4oUHJlY2lvKQ0KTWVkaWFuYTwtbWVkaWFuKFByZWNpbykNCg0KcHJpbnQoUHJvbWVkaW8pDQpwcmludChNZWRpYW5hKQ0KYGBgDQoNCg0KDQoNCiMjIEFjdGl2aWRhZCAxNw0KDQpFbiBsYSBzaWd1aWVudGUgdGFibGEgc2UgZGV0YWxsYSBsYSBjYW50aWRhZCBkZSBjb2xlY3Rpdm9zIA0KcXVlIHRvbWFuIGxvcyBlbXBsZWFkb3MgZGUgdW5hIGbDoWJyaWNhIHBhcmEgYXNpc3RpciBhIHN1IHRyYWJham8uIA0KSGFsbGEgbGEgbW9kYSBkZSBsYSBjYW50aWRhZCBkZSBjb2xlY3Rpdm9zIHF1ZSB0b21hbiBsb3MgdHJhYmFqYWRvcmVzIA0KZSBpbnRlcnByZXRhciBlbCBzaWduaWZpY2FkbyBkZSBkaWNobyBuw7ptZXJvLg0KDQohW10oQ29sZWdpbzE3LmpwZykNClZlbW9zIHF1ZSBlbCB2YWxvciAwIHNlIHJlcGl0ZSBjb24gbWF5b3IgZnJlY3VlbmNpYSAoMTUgdmVjZXMpLCBzZWd1aWRvIHBvciBlbCB2YWxvciAxICgxMCB2ZWNlcykgeSBsdWVnbyBlbCB2YWxvciAyICg1IHZlY2VzKS4gUG9yIGxvIHRhbnRvLCBsYSBtb2RhIGVuIGVzdGUgY2FzbyBlcyAwLiBFc3RvIHNpZ25pZmljYSBxdWUgbGEgY2FudGlkYWQgZGUgdHJhYmFqYWRvcmVzIHF1ZSBubyB0b21hbiBuaW5nw7puIGNvbGVjdGl2byBlcyBlbCB2YWxvciBtw6FzIGNvbcO6biBlbiBlc3RhIGbDoWJyaWNhLiBFcyBkZWNpciwgaGF5IG3DoXMgdHJhYmFqYWRvcmVzIHF1ZSBubyB0b21hbiBjb2xlY3Rpdm9zIHF1ZSBsb3MgcXVlIHRvbWFuIDEgbyAyIGNvbGVjdGl2b3MgcGFyYSBpciBhbCB0cmFiYWpvLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQojIyBBY3RpdmlkYWQgMTgNCg0KRW4gdW4gaW5zdGl0dXRvIGRlIG3DunNpY2EgZW5zZcOxYW4gYmFqbyB5IGJhdGVyw61hLiBPYnNlcnZhIGxvcyBncsOhZmljb3MgeSBsdWVnbyByZXNwb25kZSANCmxhcyBwcmVndW50YXMuDQoNCiFbXShDb2xlZ2lvMTguanBnKQ0KDQphLiDCv0N1w6FudG9zIGFsdW1ub3MgZXN0dWRpYW4gYmF0ZXLDrWE/DQotIDIwIEFsdW1ub3MgRXN0dWRpYW4gQmF0ZXJpYS4NCg0KYi4gwr9DdcOhbnRvcyBkZSBsb3MgYWx1bW5vcyBxdWUNCmVzdHVkaWFuIGJhdGVyaWEgdGllbmVuIGNvbW8NCm3DrW5pbW8gMTYgYcOxb3M/DQotIDExIEFsdW1ub3MgcXVlIGVzdHVkaWFuIEJhdGVyaWEgdGllbmUgYWwgbWVub3MgMTYgYcOxb3MNCg0KYy4gwr9DdcOhbCBlcyBlbCBwb3JjZW50YWplIGRlIGxvcw0KYWx1bW5vcyBxdWUgZXN0dWRpYW4gYmF0ZXLDrWEgcXVlDQp0aWVuZW4gZW50cmUgMTQgeSAxNiBhw7Fvcz8NCi0gRWwgcG9yY2VudGFqZSBkZSBhbHVtbm9zIHF1ZSBlc3R1ZGlhbiBiYXRlcmlhIHkgdGllbmUgZW50cmUgMTQgeSAxNiBhw7FvcyBlcyBkZWwgNTUlIGRlbCB0b3RhbA0KDQpkLiBTaSA2IGFsdW1ub3MgcXVlIHRpZW5lbiAxNSBhw7Fvcw0KcmVwcmVzZW50YW4gZWwgMTAlIGRlIGxvcyBhbHVtbm9zDQpxdWUgZXN0dWRpYW4gYmFqbywgwr9jdcOhbnRvcw0KYWx1bW5vcyBkZSAxNyBhw7FvcyBjb25jdXJyZW4gYWwNCmluc3RpdHV0byBhIGFwcmVuZGVyIGVzdGUNCmluc3RydW1lbnRvPw0KLSAzNiBhbHVtbm9zIGRlIDE3IHZpZW5lbiBhcHJlbmRlciBCYWpvLg0KDQplLiDCv0N1w6FsIGVzIGVsIHByb21lZGlvIGRlIGVkYWRlcyBkZQ0KbG9zIGVzdHVkaWFudGVzIGRlIGJham8/IMK/Q29pbmNpZGUgZWwNCnByb21lZGlvIGNvbiBsYSBtb2RhPw0KDQoNCmIuIENhbGN1bGFyIGVsIHByb21lZGlvIGRlIGVkYWRlczoNCg0KJCQNClxiZWdpbnthbGlnbip9DQpcdGV4dHtQcm9tZWRpb30gJj0gKDE4IFx0aW1lcyAwLjI1KSArICgxNSBcdGltZXMgMC4xMCkgKyAoMTYgXHRpbWVzIDAuMDUpICsgKDE3IFx0aW1lcyAwLjYwKQ0KXGVuZHthbGlnbip9DQokJA0KYy4gQ29tcGFyYXIgZWwgcHJvbWVkaW8gY29uIGxhIG1vZGE6DQoNCiQkDQpcYmVnaW57YWxpZ24qfQ0KXHRleHR7UHJvbWVkaW99ICY9IDE2Ljk1IFxcDQpcdGV4dHtNb2RhfSAmPSAxNyBcXA0KXFwNClx0ZXh0e1Byb21lZGlvIGVzIGlndWFsIGEgTW9kYX0gJjogXHRleHR7IH0gXHRleHR7UHJvbWVkaW99ID0gXHRleHR7TW9kYX0NClxlbmR7YWxpZ24qfQ0KJCQNCg0KDQpMYSBtb2RhIGVzIGVsIHZhbG9yIG3DoXMgY29tw7puIGVuIHVuIGNvbmp1bnRvIGRlIGRhdG9zLiBTZWfDum4gZWwgZ3LDoWZpY28gZGUgdG9ydGEsIGxhIGVkYWQgbcOhcyBjb23Dum4gZXMgMTcgYcOxb3MgKDYwJSBkZSBsb3MgYWx1bW5vcykuIEVsIHByb21lZGlvIGNhbGN1bGFkbyBhbnRlcmlvcm1lbnRlIGVzIGNlcmNhbm8gYSAxNyBhw7Fvcy4gUG9yIGxvIHRhbnRvLCBlbCBwcm9tZWRpbyB5IGxhIG1vZGEgbm8gY29pbmNpZGVuIGV4YWN0YW1lbnRlLCBwZXJvIHNvbiBiYXN0YW50ZSBzaW1pbGFyZXMuDQoNCiMjIEFjdGl2aWRhZCAxOQ0KDQpQYXJhIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBzb2JyZSBsYXMgYXVzZW5jaWFzIGRlIHN1cyBlc3R1ZGlhbnRlcywgdW4gQ0VOTUEgb2JzZXJ2w7MgdW4gDQpncnVwbyBkZSAyMCBhbHVtbm9zIGR1cmFudGUgdW4gbWVzIHkgcmVnaXN0csOzIGxvcyBzaWd1aWVudGVzIHZhbG9yZXMuDQoNCiFbXShDb2xlZ2lvMTkuanBnKQ0KYS4gT3JkZW5hIGxvcyBkYXRvcyBlbiB1bmEgdGFibGEgZGUgZnJlY3VlbmNpYXMuDQpiLiBSZWFsaXphIHVuIGdyw6FmaWNvIGNpcmN1bGFyLg0KYy4gSW5kaWNhIGVsIG7Dum1lcm8gZGUgYXVzZW5jaWFzIG3DoXMgZnJlY3VlbnRlcyBlc2UgbWVzLg0KZC4gSGFsbGEgZWwgcHJvbWVkaW8geSBsYSBtZWRpYW5hDQoNCmEuDQpgYGB7cn0NCmF1c2VuY2lhcyA8LSBjKDEsIDMsIDIsIDUsIDEsIDAsIDAsIDEsIDEsIDIsIDIsIDEsIDIsIDIsIDIsIDQpDQpGcmVjdWVuY2lhX0F1c2VuY2lhIDwtdGFibGUoYXVzZW5jaWFzKQ0KcG9yY2VudGFqZXNfQXVzZW5jaWFzIDwtIHByb3AudGFibGUoRnJlY3VlbmNpYV9BdXNlbmNpYSkgKiAxMDANCnByaW50KEZyZWN1ZW5jaWFfQXVzZW5jaWEpDQpwcmludChwb3JjZW50YWplc19BdXNlbmNpYXMpDQpgYGANCmIuDQpgYGB7cn0NCiMgRXRpcXVldGFzIGNvbiBwb3JjZW50YWplcyBmb3JtYXRlYWRvcw0KZXRpcXVldGFzX2Nvbl9wb3JjZW50YWplIDwtIHBhc3RlMChuYW1lcyhGcmVjdWVuY2lhX0F1c2VuY2lhKSwgIlxuIiwgcm91bmQocG9yY2VudGFqZXNfQXVzZW5jaWFzLCAxKSwgIiUiKQ0KDQojIENyZWFyIGVsIGdyw6FmaWNvIGRlIHRvcnRhIGNvbiBldGlxdWV0YXMgZGUgcG9yY2VudGFqZXMNCnBpZShwb3JjZW50YWplc19BdXNlbmNpYXMsIGxhYmVscyA9IGV0aXF1ZXRhc19jb25fcG9yY2VudGFqZSwgbWFpbiA9ICJHcsOhZmljbyBkZSBUb3J0YSAtIEF1c2VuY2lhcyIpDQpgYGANCg0KYy4NCkVsIG51bWVybyBkZSBVc2VuY2lhcyBtYXMgZnJlY3VlbnRlIGRlIGVzZSBtZXMgZXMgZGUgMiBBdXNlbmNpYXMuDQoNCmQuIEFjb250aW51YWNpb24gc2UgcmVhbGl6YXJhIGVsIGNhbGN1bG8gZGVsIHByb21lZGlvIHkgbGEgbWVkaWFuYS4NCmBgYHtyfQ0KUHJvbWVkaW88LW1lYW4oYXVzZW5jaWFzKQ0KTWVkaWFuYTwtbWVkaWFuKGF1c2VuY2lhcykNCnByaW50KFByb21lZGlvKQ0KcHJpbnQoTWVkaWFuYSkNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KIyMgQWN0aXZpZGFkIDIwDQoNClVuYSBjYXNhIGRlIGRlcG9ydGVzIHZlbmRpw7MsIGR1cmFudGUgbG9zIHRyZXMgw7psdGltb3MgYcOxb3MsIDQ1MDAgDQpwYXJlcyBkZSB6YXBhdGlsbGFzIHBhcmEgYWR1bHRvLiBMYSBzaWd1aWVudGUgdGFibGEgbXVlc3RyYSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhcyANCnZlbnRhcyBzZWfDum4gZWwgbsO6bWVybyBkZSBjYWx6YWRvDQoNCiFbXShDb2xlZ2lvMjAuanBnKQ0KRWwgYWRtaW5pc3RyYWRvciBkZWNpZGnDsyBjb21wcmFyIHBhcmEgZXN0ZSBhw7FvIDEyMDAgcGFyZXMsIGRlIGxvcyBjdWFsZXMgNzAwIHNvbiBuw7ptZXJvIDM4LiDCv0VzIA0KYWNlcnRhZGEgbGEgZGVjaXNpw7NuPw0KDQpgYGB7cn0NCiMgVmFsb3JlcyBkZSB2ZW50YXMgaGlzdMOzcmljYXMNCnZlbnRhc19oaXN0b3JpY2FzIDwtIGMoMTAsIDYwLCAyMDAsIDkxMCwgMTcyMCwgMTE3MCwgMzUwLCA3MCwgMTApDQpudW1lcm9fY2FsemFkbyA8LSAzNTo0Mw0KDQojIENhbGN1bGFyIGVsIHRvdGFsIGRlIHZlbnRhcyBoaXN0w7NyaWNhcw0KdG90YWxfdmVudGFzX2hpc3RvcmljYXMgPC0gc3VtKHZlbnRhc19oaXN0b3JpY2FzKQ0KDQojIENhbGN1bGFyIGxhIHByb3BvcmNpw7NuIGRlIHZlbnRhcyBoaXN0w7NyaWNhcyBwYXJhIGNhZGEgbsO6bWVybyBkZSBjYWx6YWRvDQpwcm9wb3JjaW9uX3ZlbnRhc19oaXN0b3JpY2FzIDwtIHZlbnRhc19oaXN0b3JpY2FzIC8gdG90YWxfdmVudGFzX2hpc3RvcmljYXMNCg0KIyBDcmVhciB1biBtYXJjbyBkZSBkYXRvcyBjb24gbGEgZGlzdHJpYnVjacOzbiBkZSB2ZW50YXMgaGlzdMOzcmljYXMNCmRhdGFfdmVudGFzX2hpc3RvcmljYXMgPC0gZGF0YS5mcmFtZShOdW1lcm9fQ2FsemFkbyA9IG51bWVyb19jYWx6YWRvLCBQcm9wb3JjaW9uID0gcHJvcG9yY2lvbl92ZW50YXNfaGlzdG9yaWNhcykNCg0KIyBDYW50aWRhZCBkZSBwYXJlcyBkZSB6YXBhdGlsbGFzIGEgY29tcHJhciBlc3RlIGHDsW8NCnRvdGFsX2NvbXByYXNfcGxhbmlmaWNhZGFzIDwtIDEyMDANCmNvbXByYXNfbnVtZXJvXzM4IDwtIDcwMA0KDQojIENhbGN1bGFyIGxhIHByb3BvcmNpw7NuIGRlIGNvbXByYXMgZGUgbsO6bWVybyAzOCByZXNwZWN0byBhbCB0b3RhbCBkZSBjb21wcmFzDQpwcm9wb3JjaW9uX2NvbXByYXNfbnVtZXJvXzM4IDwtIGNvbXByYXNfbnVtZXJvXzM4IC8gdG90YWxfY29tcHJhc19wbGFuaWZpY2FkYXMNCg0KIyBDYWxjdWxhciBsYSBwcm9wb3JjacOzbiBkZSBjb21wcmFzIHBhcmEgb3Ryb3MgbsO6bWVyb3MgZGUgY2FsemFkbw0KcHJvcG9yY2lvbl9jb21wcmFzX290cm9zX251bWVyb3MgPC0gMSAtIHByb3BvcmNpb25fY29tcHJhc19udW1lcm9fMzgNCg0KIyBDcmVhciB1biBtYXJjbyBkZSBkYXRvcyBjb24gbGEgZGlzdHJpYnVjacOzbiBkZSBjb21wcmFzIHBsYW5pZmljYWRhcw0KZGF0YV9jb21wcmFzX3BsYW5pZmljYWRhcyA8LSBkYXRhLmZyYW1lKA0KICBOdW1lcm9fQ2FsemFkbyA9IGMoIjM4IiwgIk90cm9zIiksDQogIFByb3BvcmNpb24gPSBjKHByb3BvcmNpb25fY29tcHJhc19udW1lcm9fMzgsIHByb3BvcmNpb25fY29tcHJhc19vdHJvc19udW1lcm9zKQ0KKQ0KDQoNCg0KYGBgDQoNCmBgYHtyfQ0KcHJpbnQoZGF0YV92ZW50YXNfaGlzdG9yaWNhcykNCg0KYGBgDQpgYGB7cn0NCnByaW50KGRhdGFfY29tcHJhc19wbGFuaWZpY2FkYXMpDQpgYGANCg0KDQoNCkNvbXBhcmFuZG8gbGFzIHByb3BvcmNpb25lcyBkZSB2ZW50YXMgaGlzdMOzcmljYXMgeSBjb21wcmFzIHBsYW5pZmljYWRhcywgcG9kZW1vcyB2ZXIgbG8gc2lndWllbnRlOg0KDQpQYXJhIGxhcyB2ZW50YXMgaGlzdMOzcmljYXM6DQoNCkxhIHByb3BvcmNpw7NuIGRlIHZlbnRhcyBkZWwgbsO6bWVybyAzOCBlcyBhcHJveGltYWRhbWVudGUgMC4yMDIgKDIwLjIlKS4NClBhcmEgbGFzIGNvbXByYXMgcGxhbmlmaWNhZGFzOg0KDQpMYSBwcm9wb3JjacOzbiBkZSBjb21wcmFzIGRlbCBuw7ptZXJvIDM4IGVzIDAuNTgzICg1OC4zJSkuDQpMYSBwcm9wb3JjacOzbiBkZSB2ZW50YXMgaGlzdMOzcmljYXMgZGVsIG7Dum1lcm8gMzggZXMgc2lnbmlmaWNhdGl2YW1lbnRlIG3DoXMgYmFqYSBxdWUgbGEgcHJvcG9yY2nDs24gZGUgY29tcHJhcyBwbGFuaWZpY2FkYXMuIEVzdG8gcG9kcsOtYSBpbmRpY2FyIHF1ZSBzZSBlc3TDoW4gY29tcHJhbmRvIG3DoXMgemFwYXRpbGxhcyBuw7ptZXJvIDM4IGRlIGxvIHF1ZSBzZSBoYSB2ZW5kaWRvIGhpc3TDs3JpY2FtZW50ZSBlbiBjb21wYXJhY2nDs24gY29uIG90cm9zIG7Dum1lcm9zLg0KDQpEYWRvIHF1ZSBsYSBwcm9wb3JjacOzbiBkZSBjb21wcmFzIHBsYW5pZmljYWRhcyBwYXJhIGVsIG7Dum1lcm8gMzggZXMgbXVjaG8gbWF5b3IgcXVlIGxhIHByb3BvcmNpw7NuIGRlIHZlbnRhcyBoaXN0w7NyaWNhcywgcG9kcsOtYSBoYWJlciB1biBleGNlc28gZW4gbGEgY2FudGlkYWQgZGUgemFwYXRpbGxhcyBuw7ptZXJvIDM4IHF1ZSBzZSBlc3TDoSBwbGFuZWFuZG8gY29tcHJhci4gU2Vyw61hIHJlY29tZW5kYWJsZSByZXZpc2FyIGxhcyBjaWZyYXMgeSBjb25zaWRlcmFyIGFqdXN0YXIgbGFzIGNvbXByYXMgcGxhbmlmaWNhZGFzIHBhcmEgYXNlZ3VyYXJzZSBkZSBxdWUgZXN0w6luIGFsaW5lYWRhcyBjb24gbGFzIHRlbmRlbmNpYXMgaGlzdMOzcmljYXMgZGUgdmVudGFzLg0KDQoNCg0KDQoNCg0KIyMgQWN0aXZpZGFkIDIxDQoNClVuYSBlbXByZXNhIHRleHRpbCBjb21wcmEgcm9sbG9zIGRlIHRlbGEgcXVlIA0KcHJlc2VudGFuIGNpZXJ0byBuw7ptZXJvIGRlIGRlZmVjdG9zIHBvciByb2xsby4gRW4gc3Ugw7psdGltYSANCm9wZXJhY2nDs24sIGxhIGVtcHJlc2EgY29tcHLDsyAxMDAgcm9sbG9zIGRlIHRlbGEgY29uIGxhcyANCmNhbnRpZGFkZXMgZGUgZGVmZWN0b3MgcG9yIHJvbGxvIHF1ZSBzZSBtdWVzdHJhbiBlbiBsYSB0YWJsYS4gDQpFbCBnZXJlbnRlIGRlIGNvbXByYXMgYW5hbGl6YSBsYSBwYXJ0aWRhIHkgcmVjaGF6YSBsYSBjb21wcmEgc2kgZWwgDQpwcm9tZWRpbyBkZSBkZWZlY3RvcyBwb3Igcm9sbG8gZXMgbWF5b3IgYSAyLiDCv1JlY2hhemFyw6EgZXN0YSANCmNvbXByYT8NCg0KIVtdKENvbGVnaW8yMS5qcGcpDQpgYGB7cn0NCiMgRGVmaW5pciBsb3MgZGF0b3MNCmRlZmVjdG9zIDwtIGMoMCwgMSwgMiwgMywgNCwgNSkNCmNhbnRpZGFkZXMgPC0gYygxNSwgMTgsIDI1LCAxNSwgMTIsIDE1KQ0KdG90YWxfcm9sbG9zIDwtIHN1bShjYW50aWRhZGVzKQ0KDQojIENhbGN1bGFyIGVsIHByb21lZGlvIGRlIGRlZmVjdG9zIHBvciByb2xsbw0KcHJvbWVkaW9fZGVmZWN0b3MgPC0gc3VtKGRlZmVjdG9zICogY2FudGlkYWRlcykgLyB0b3RhbF9yb2xsb3MNCg0KIyBVbWJyYWwgcGFyYSBlbCByZWNoYXpvDQp1bWJyYWxfcmVjaGF6byA8LSAyDQoNCiMgVmVyIHNpIGxhIGNvbXByYSBzZXLDoSByZWNoYXphZGEgbyBubw0KaWYgKHByb21lZGlvX2RlZmVjdG9zID4gdW1icmFsX3JlY2hhem8pIHsNCiAgZGVjaXNpb24gPC0gIlJlY2hhemFkYSINCn0gZWxzZSB7DQogIGRlY2lzaW9uIDwtICJBY2VwdGFkYSINCn0NCg0KIyBJbXByaW1pciByZXN1bHRhZG9zDQpjYXQoIlByb21lZGlvIGRlIGRlZmVjdG9zIHBvciByb2xsbzoiLCBwcm9tZWRpb19kZWZlY3RvcywgIlxuIikNCmNhdCgiRGVjaXNpw7NuOiIsIGRlY2lzaW9uKQ0KDQpgYGANCg0KDQojIyBBY3RpdmlkYWQgMjINCg0KVW5hIGVtcHJlc2EgZGUgdHJhbnNwb3J0ZSBpbnRlcnVyYmFubyBxdWllcmUgaW5mb3JtYXIgYSBzdXMgdXN1YXJpb3MgZWwgdGllbXBvIGRlIHZpYWplIA0KZW50cmUgZG9zIGNpdWRhZGVzIHF1ZSBvZnJlY2UgZWwgc2VydmljaW8uIFBhcmEgZWxsbywgZWxpZ2llcm9uIDU1IGRlIHN1cyB1bmlkYWRlcywgZXZhbHVhcm9uIGN1w6FudG8gDQp0YXJkYXJvbiBlbiBsbGVnYXIgYSBkZXN0aW5vIHkgdm9sY2Fyb24gbG9zIHJlZ2lzdHJvcyANCmVuIHVuYSB0YWJsYSBjb21vIGxhIHNpZ3VpZW50ZS4gwr9DdcOhbCBlcyBlbCB0aWVtcG8gDQpwcm9tZWRpbyBkZSB2aWFqZSBxdWUgbGEgZW1wcmVzYSB1c2Fyw6EgcGFyYSANCmluZm9ybWFyIGEgc3VzIHVzdWFyaW9zDQoNCiFbXShDb2xlZ2lvMjIuanBnKQ0KYGBge3J9DQojIERlZmluaXIgbG9zIGRhdG9zDQp0aWVtcG8gPC0gYyg0MiwgNDUsIDQ2LCA0NywgNDgsIDUwLCA1MikNCmZyZWN1ZW5jaWEgPC0gYyg2LCA3LCA4LCA4LCAxMCwgOCwgOCkNCnRvdGFsX3VuaWRhZGVzIDwtIHN1bShmcmVjdWVuY2lhKQ0KDQojIENhbGN1bGFyIGVsIHRpZW1wbyBwcm9tZWRpbyBkZSB2aWFqZQ0KdGllbXBvX3Byb21lZGlvIDwtIHN1bSh0aWVtcG8gKiBmcmVjdWVuY2lhKSAvIHRvdGFsX3VuaWRhZGVzDQoNCiMgSW1wcmltaXIgZWwgdGllbXBvIHByb21lZGlvIGRlIHZpYWplDQpjYXQoIkVsIHRpZW1wbyBwcm9tZWRpbyBkZSB2aWFqZSBlczoiLCB0aWVtcG9fcHJvbWVkaW8sICJtaW51dG9zIikNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KIyMgQWN0aXZpZGFkIDIzDQoNClNlIGFycm9qw7MgdW4gZGFkbyB1bmEgY2llcnRhIGNhbnRpZGFkIGRlIHZlY2VzIHkgbG9zIHJlc3VsdGFkb3Mgc2UgcmVnaXN0cmFyb24gZW4gZWwgDQpzaWd1aWVudGUgZ3LDoWZpY28uIE9ic2VydmEgeSBsdWVnbyByZXNwb25kZToNCg0KIVtdKENvbGVnaW8yMy5qcGcpDQphLiDCv0N1w6FudGFzIHZlY2VzIHNlIGFycm9qw7MgZWwgZGFkbz8NCi0gRWwgZGFkbyBzZSBhcnJvam8gMzUgdmVjZXMuDQoNCmIuIMK/UXXDqSBuw7ptZXJvIHNhbGnDsyBtw6FzIHZlY2VzPyDCv3kgbWVub3M/DQotIEVsIG51bWVybyBkb3Mgc2FsaW8gbWFzIHZlY2VzKDgpIHkgZWwgdHJlcyBlbCBxdWUgbWVub3MgKDQpLg0KDQpjLiDCv1F1w6kgbsO6bWVybyBzYWxpw7MgbGFzIG1pc21hcyB2ZWNlcyBxdWUgc3UgdmFsb3I/DQotIEVsIHNlaXMgc2FsaW8gNiB2ZWNlcy4NCg0KZC4gwr9DdcOhbnRhcyB2ZWNlcyBzYWxpw7MgdW4gbsO6bWVybyBtZW5vciBxdWUgNT8gwr9ZIGN1w6FudGFzIHVuIG7Dum1lcm8gbWF5b3IgcXVlIDM/DQotIFNhbGlvIDIyIHZlY2VzIHVuIG51bWVybyBtZW5vciBhIDUgeSAxOCB2ZWNlcyBtYXlvciBhbCBudW1lcm8gMy4NCg0KZS4gQ2FsY3VsYSBlbCBwcm9tZWRpby4NCmYuIEVuY3VlbnRyYSBsYSBtb2RhIHkgbGEgbWVkaWFuYQ0KDQpgYGB7cn0NCiMgRGVmaW5pciBsb3MgZGF0b3MNCnJlc3VsdGFkb3MgPC0gYyhyZXAoMSwgNSksIHJlcCgyLCA4KSwgcmVwKDMsIDQpLCByZXAoNCwgNSksIHJlcCg1LCA3KSwgcmVwKDYsIDYpKQ0KDQojIENhbGN1bGFyIGVsIHByb21lZGlvDQpwcm9tZWRpbyA8LSBtZWFuKHJlc3VsdGFkb3MpDQoNCiMgQ2FsY3VsYXIgbGEgbWVkaWFuYQ0KbWVkaWFuYSA8LSBtZWRpYW4ocmVzdWx0YWRvcykNCg0KIyBDYWxjdWxhciBsYSBtb2RhDQptb2RhIDwtIGFzLm51bWVyaWMobmFtZXMoc29ydCh0YWJsZShyZXN1bHRhZG9zKSwgZGVjcmVhc2luZyA9IFRSVUUpWzFdKSkNCg0KIyBJbXByaW1pciBsb3MgcmVzdWx0YWRvcw0KY2F0KCJQcm9tZWRpbzoiLCBwcm9tZWRpbywgIlxuIikNCmNhdCgiTWVkaWFuYToiLCBtZWRpYW5hLCAiXG4iKQ0KY2F0KCJNb2RhOiIsIG1vZGEsICJcbiIpDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoqKk9UUkEgQUdSVVBBQ0nDk04gREUgREFUT1M6KioNCg0KQ3VhbmRvIHVuYSBtdWVzdHJhIHBvc2VlIG51bWVyb3NvcyBvIHZhcmlhZG9zIGRhdG9zIA0KY3VhbnRpdGF0aXZvcyBlcyBwb3NpYmxlIGFncnVwYXJsb3MgcGFyYSBmYWNpbGl0YXIgc3UgbWFuaXB1bGFjacOzbi4gRXNvcyANCmFncnVwYW1pZW50b3MsIGxsYW1hZG9zIGludGVydmFsb3MgZGUgY2xhc2UsIGRlYmVuIGluY2x1aXIgYSB0b2RvcyBsb3MgDQppbmRpdmlkdW9zIGRlIGxhIG11ZXN0cmEgeSBkZWJlbiB0ZW5lciBsYSBtaXNtYSBleHRlbnNpw7NuLg0KTGEgY2FudGlkYWQgZGUgYWdydXBhbWllbnRvcyBxdWUgc2UgdG9tYW4gbm8gZGViZSBzZXIgZXhjZXNpdmEgDQpwYXJhIHF1ZSBzdSBtYW5pcHVsYWNpw7NuIG5vIHNlYSBkaWZpY3VsdG9zYSwgbmkgZXNjYXNhIHBhcmEgcXVlIG5vIHNlIA0KcGllcmRhIHByZWNpc2nDs24uDQpQYXJhIGNvbXByZW5kZXIgZXN0YSBudWV2YSBvcmdhbml6YWNpw7NuIGRlIGxvcyBkYXRvcywgcmVhbGl6YXJlbW9zIGxhIHNpZ3VpZW50ZSBhY3RpdmlkYWQNCg0KIVtdKENvbGVnaW8yNC5qcGcpDQpFbiBsYSB0YWJsYSBhbnRlcmlvciBzZSBhZ3J1cGFyb24gbGFzIGVzdGF0dXJhcyBpbXBvbmllbmRvIGxhIGNvbmRpY2nDs24gZGUgc2VyIG1heW9yIG8gaWd1YWwgYSB1biANCm7Dum1lcm8geSBtZW5vciBhIG90cm8uIEEgZGljaGEgYWdydXBhY2nDs24gc2UgbGEgbGxhbWEgaW50ZXJ2YWxvIGRlIGNsYXNlLiANCg0KVW4gaW50ZXJ2YWxvIGRlIGNsYXNlLCByZXByZXNlbnRhZG8gcG9yIFttIDsgbiksIGFncnVwYSB0b2RvcyBsb3MgZGF0b3MgDQpjb21wcmVuZGlkb3MgZW50ZSBtIHkgbiwgaW5jbHV5ZW5kbyBhIG0gcGVybyBubyBhIG4uIExhIGFtcGxpdHVkIGRlIHVuIGludGVydmFsbyANCnNlIG9idGllbmUgY29uIGxhIGRpZmVyZW5jaWEgbSAtIG4NCg0KRW4gZWwgY2FzbyBkZSBhZ3J1cGFyIGxvcyBkYXRvcyANCmVuIGludGVydmFsb3MgZGUgY2xhc2UsIGxhIHRhYmxhIGRlIA0KZnJlY3VlbmNpYXMgZXMgbXV5IHNpbWlsYXIgYSBsYXMgdXNhZGFzIA0KcHJldmlhbWVudGUsIHNvbG8gZGlmaWVyZSBsYSBwcmltZXIgDQpjb2x1bW5hLCBlbiBsYSBjdWFsLCBlbiBsdWdhciBkZSANCmVudW1lcmFyIHRvZG9zIGxvcyB2YWxvcmVzIHBvc2libGVzIGRlIA0KbGEgdmFyaWFibGUgYXBhcmVjZW4gbG9zIGludGVydmFsb3MgZGUgDQpjbGFzZS4NCg0KUGFyYSBhcm1hciBsb3MgaW50ZXJ2YWxvcyBkZSBjbGFzZSwgc2UgZGViZSBjb25zaWRlcmFyIGVsIA0KbWVub3IgeSBlbCBtYXlvciBkYXRvLCB5IGVzdGFibGVjZXIgcHJpbWVybyBlbCBuw7ptZXJvIGRlIA0KaW50ZXJ2YWxvcyBxdWUgc2UgZGVzZWFuIG9idGVuZXIgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZTogDQrvg7wgdG9kb3MgbG9zIGludGVydmFsb3MgZGViZW4gdGVuZXIgbGEgbWlzbWEgYW1wbGl0dWQuDQrvg7wgY2FkYSBkYXRvIGRlYmUgcGVydGVuZWNlciBhIHVuIHNvbG8gaW50ZXJ2YWxvDQoNCkxhcyBmcmVjdWVuY2lhcyBhYnNvbHV0YXMsIHJlbGF0aXZhcyB5IHBvcmNlbnR1YWxlcyBzZSBjYWxjdWxhbiBkZSBsYSBtaXNtYSBtYW5lcmEgcXVlIA0KZGVmaW5pbW9zIGFudGVyaW9ybWVudGUgeSBzdSB0b3RhbCwgZXMgbGEgc3VtYSBkZSB0b2RvcyBsb3MgdmFsb3JlcyBkZSBlc2EgY29sdW1uYS4gVGVuaWVuZG8gZW4gDQpjdWVudGEgZXN0bywgY29tcGxldGEgbGEgc2lndWllbnRlIHRhYmxhIGRlIGZyZWN1ZW5jaWFzOg0KDQohW10oQ29sZWdpbzI1LmpwZykNCkxhIGFtcGxpdHVkIGRlIHRvZG9zIGxvcyBpbnRlcnZhbG9zIHVzYWRvcyBlbiBsYSB0YWJsYSBhbnRlcmlvciBlcyAwLDA1Lg0KUGFyYSBlbCBjw6FsY3VsbyBkZSBsb3MgcGFyw6FtZXRyb3MgZGUgcG9zaWNpw7NuIGVzIG5lY2VzYXJpbyBhZ3JlZ2FyIGEgbGEgdGFibGEgZGUgZnJlY3VlbmNpYXMgZG9zIA0KY29sdW1uYXMgbcOhcywgdW5hIHBhcmEgbGEgbGxhbWFkYSBmcmVjdWVuY2lhIGFjdW11bGFkYSB5IG90cmEgcGFyYSBlbCBwdW50byBtZWRpbyBkZSBjYWRhIA0KaW50ZXJ2YWxvDQoNClNlIGxsYW1hIGZyZWN1ZW5jaWEgYWN1bXVsYWRhLCByZXByZXNlbnRhZGEgcG9yIEYsIGEgbGEgY2FudGlkYWQgZGUgdmVjZXMgcXVlIHNlIHJlcGl0ZSB1biANCnZhbG9yIGRlIGxhIHZhcmlhYmxlIG8gY3VhbHF1aWVyIG90cm8gcXVlIHNlYSBtZW5vciB5IHNlIG9idGllbmUgc3VtYW5kbyBsYSBmcmVjdWVuY2lhDQphYnNvbHV0YSBkZSBlc2UgaW50ZXJ2YWxvIGNvbiBsYSBkZSBmcmVjdWVuY2lhIGFic29sdXRhIGRlIHRvZG9zIGxvcyBpbnRlcnZhbG9zIGFudGVyaW9yZXMuDQoNCkVsIHB1bnRvIG1lZGlvIGRlIHVuIGludGVydmFsbyBlcyBlbCB2YWxvciBjZW50cmFsIGRlbCANCm1pc21vLCBzZSByZXByZXNlbnRhIHBvciBjIHkgc2Ugb2J0aWVuZSBjYWxjdWxhbmRvIGVsIA0KcHJvbWVkaW8gZW50cmUgc3VzIGV4dHJlbW9zLiBQYXJhIHVuIGludGVydmFsbyBbbSA7IG4pLCANCnN1IHB1bnRvIG1lZGlvIGVzDQoNClxbIGMgPSBcZnJhY3ttICsgbn17Mn0gXF0NCg0KIyMgQWN0aXZpZGFkIDI0DQoNClVuIG3DqWRpY28gZXN0w6EgaW52ZXN0aWdhbmRvIHVuYSBlbmZlcm1lZGFkIGNhcmTDrWFjYSB5IHN1IHJlbGFjacOzbiBjb24gZWwgY29sZXN0ZXJvbC4gDQpQYXJhIGVsbG8gcmVnaXN0csOzIGxhcyBtZWRpY2lvbmVzIGRlIGNvbGVzdGVyb2wgKGVuIG1nIHBvciBkbCBkZSBzYW5ncmUpIGRlIGxvcyBhbsOhbGlzaXMgY2zDrW5pY29zIGRlIDMwIGRlIA0Kc3VzIHBhY2llbnRlcy4gTG9zIGRhdG9zIGZ1ZXJvbiBsb3Mgc2lndWllbnRlczoNCg0KfCAgMSAgfCAgICAgICAxODUgfCAgICAgICAyMjUgfCAgICAgICAxOTggfCAgICAgICAyMTQgfCAgICAgICAxOTUgfCAgICAgICAyMzcgfA0KfCAgMiAgfCAgICAgICAxOTAgfCAgICAgICAyMzAgfCAgICAgICAyMTUgfCAgICAgICAyMTUgfCAgICAgICAxOTcgfCAgICAgICAyMTUgfA0KfCAgMyAgfCAgICAgICAxODcgfCAgICAgICAyMzggfCAgICAgICAxOTUgfCAgICAgICAyMTMgfCAgICAgICAyMDUgfCAgICAgICAyMDMgfA0KfCAgNCAgfCAgICAgICAyMTAgfCAgICAgICAyMzQgfCAgICAgICAyNTQgfCAgICAgICAxODYgfCAgICAgICAyMDMgfCAgICAgICAyMjUgfA0KfCAgNSAgfCAgICAgICAyMzMgfCAgICAgICAyMjQgfCAgICAgICAyMzUgfCAgICAgICAyMTYgfCAgICAgICAyNDAgfCAgICAgICAyMzkgfA0KDQoNCmEuIENvbXBsZXRhIGxhIHNpZ3VpZW50ZSB0YWJsYS4NCg0KDQohW10oQ29sZWdpbzI2LmpwZykNCg0KYi4gwr9DdcOhbnRvcyBwYWNpZW50ZXMgdGllbmVuIHVuYSBtZWRpY2nDs24gZGUgY29sZXN0ZXJvbCBwb3IgZGViYWpvIGRlIDIyMD8NCg0KRW4gbGEgdGFibGEgZGUgZnJlY3VlbmNpYXMsIG9ic2VydmFtb3MgcXVlIGxhIGZyZWN1ZW5jaWEgYWN1bXVsYWRhIHBhcmEgZWwgaW50ZXJ2YWxvIFsyMDAgOyAyMjApIGVzIDEzLiBQb3IgbG8gdGFudG8sIGhheSAxMyBwYWNpZW50ZXMgY3V5YXMgbWVkaWNpb25lcyBkZSBjb2xlc3Rlcm9sIGVzdMOhbiBwb3IgZGViYWpvIGRlIDIyMCBtZy9kbC4NCg0KYy4gU2kgc2UgY29uc2lkZXJhbiB2YWxvcmVzIG5vcm1hbGVzIGFxdWVsbG9zIHF1ZSBlc3TDoW4gZW50cmUgMTgwIHkgMjAwLCDCv3F1w6kgcG9yY2VudGFqZSBkZSBsb3MgcGFjaWVudGVzIGVzdMOhIGZ1ZXJhIGRlIGVzb3MgcGFyw6FtZXRyb3M/DQoNCkJhc2FkbyBlbiBsYSB0YWJsYSBkZSBmcmVjdWVuY2lhcyBjb3JyZWdpZGEsIGxhIGZyZWN1ZW5jaWEgYWN1bXVsYWRhIHBhcmEgZWwgaW50ZXJ2YWxvIFsxODAgOyAyMDApIGVzIDQuIERhZG8gcXVlIGVsIHRvdGFsIGRlIHBhY2llbnRlcyBlcyAzMCAoc3VtYSBkZSB0b2RhcyBsYXMgZnJlY3VlbmNpYXMpLCBlbCBuw7ptZXJvIGRlIHBhY2llbnRlcyBmdWVyYSBkZWwgcmFuZ28gZGUgdmFsb3JlcyBub3JtYWxlcyBlcyAzMCAtIDQgPSAyNi4NCg0KRWwgcG9yY2VudGFqZSBkZSBwYWNpZW50ZXMgZnVlcmEgZGVsIHJhbmdvIGRlIHZhbG9yZXMgbm9ybWFsZXMgZXM6DQoNClxmcmFjezMwfXszMH0gXHRpbWVzIDEwMCA9IDEwMFwlDQoNClxmcmFjezI2fXszMH0gXHRpbWVzIDEwMCBcYXBwcm94IDg2LjY3XCUNCg0KXGZyYWN7MTN9ezE1fSBcdGltZXMgMTAwIFxhcHByb3ggODYuNjdcJQ0KDQpFbiByZXN1bWVuLCBhcHJveGltYWRhbWVudGUgZWwgODYuNjclIGRlIGxvcyBwYWNpZW50ZXMgdGllbmVuIG1lZGljaW9uZXMgZGUgY29sZXN0ZXJvbCBmdWVyYSBkZWwgcmFuZ28gY29uc2lkZXJhZG8gY29tbyB2YWxvcmVzIG5vcm1hbGVzICgxODAtMjAwIG1nL2RsKS4NCg0KDQoNCiMjIEFjdGl2aWRhZCAyNQ0KDQpMb3Mgc2lndWllbnRlcyBkYXRvcyBjb3JyZXNwb25kZW4gYSBsYXMgdGVtcGVyYXR1cmFzIG3DoXhpbWFzIGR1cmFudGUgZWwgbWVzIGRlIGp1bmlvLg0KDQohW10oQ29sZWdpbzI3LmpwZykNCg0KQ29uZmVjY2lvbmEgdW5hIHRhYmxhIGRlIGZyZWN1ZW5jaWFzIHkgcGFyYSBlbGxvLCBzZSBzdWdpZXJlIGNvbnNpZGVyYXIgaW50ZXJ2YWxvcyBhIHBhcnRpciBkZSA3wrpDIGNvbiANCnVuYSBhbXBsaXR1ZCBkZSAzwrpDLg0KDQp8IEludGVydmFsbyB8IEZyZWN1ZW5jaWEgfA0KfDotLS0tLS0tLS06fDotLS0tLS0tLS0tOnwNCnwgICBbNywgMTApIHwgICAgIDcgICAgICB8DQp8ICBbMTAsIDEzKSB8ICAgICA2ICAgICAgfA0KfCAgWzEzLCAxNikgfCAgICAgNyAgICAgIHwNCnwgIFsxNiwgMTkpIHwgICAgIDUgICAgICB8DQp8ICBbMTksIDIyKSB8ICAgICAzICAgICAgfA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQojIyBBY3RpdmlkYWQgMjYNCg0KLiBFbiB1bmEgZW1wcmVzYSwgc2UgcmVjYWLDsyBpbmZvcm1hY2nDs24gc29icmUgbGEgYW50aWfDvGVkYWQgcXVlIHRlbsOtYW4gc3VzIGVtcGxlYWRvcyBlbiANCmVsIHRyYWJham8uIExvcyB2YWxvcmVzIG9idGVuaWRvcyBlbiB1bmEgbXVlc3RyYSBkZSAzMCBlbXBsZWFkb3MgZnVlcm9uIGxvcyBzaWd1aWVudGVzOg0KDQo1IDQgMTEgMyAxNiAwIDMgOSAyMSAxMyAxMCAyIDYgNiA4IA0KNCAxNSAyIDI1IDcgMTQgMyA4IDE1IDkgMTUgMTAgMTkgMjQgNA0KDQphLiBDb21wbGV0YSBsYSBzaWd1aWVudGUgdGFibGENCg0KIVtdKENvbGVnaW8yOC5qcGcpDQoNCg0KYi4gSW5kaWNhciBjdcOhbCBlcyBlbCBwb3JjZW50YWplIGRlIGVtcGxlYWRvcyBxdWUgdGllbmVuIHVuYSBhbnRpZ8O8ZWRhZCBpbmZlcmlvciBhIDE0IGHDsW9zLg0KIA0KRnJlY3VlbmNpYSBkZSBbMCwgNyk6IDYgZW1wbGVhZG9zDQpGcmVjdWVuY2lhIGRlIFs3LCAxNCk6IDEwIGVtcGxlYWRvcw0KDQpUb3RhbCBkZSBlbXBsZWFkb3MgY29uIGFudGlnw7xlZGFkIGluZmVyaW9yIGEgMTQgYcOxb3M6IDYgKyAxMCA9IDE2IGVtcGxlYWRvcy4NCg0KUG9yY2VudGFqZSBkZSBlbXBsZWFkb3MgY29uIGFudGlnw7xlZGFkIGluZmVyaW9yIGEgMTQgYcOxb3M6DQpcWyBcZnJhY3sxNn17MzB9IFx0aW1lcyAxMDAgPSA1My4zM1wlIFxdDQoNCkVsIDUzLjMzJSBkZSBsb3MgZW1wbGVhZG9zIHRpZW5lbiB1bmEgYW50aWfDvGVkYWQgaW5mZXJpb3IgYSAxNCBhw7Fvcy4NCg0KDQoqKkdSQUZJQ09TIEVTVEFESVNUSUNPUzoqKg0KDQpQYXJhIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBxdWUgc2UgYWdydXBhbiBzdXMgdmFsb3JlcyBlbiBpbnRlcnZhbG9zIGRlIGNsYXNlLCB0YW1iacOpbiBzZSANCnB1ZWRlbiByZXByZXNlbnRhciBncsOhZmljYW1lbnRlIHVzYW5kbyBncsOhZmljb3MgZXN0YWTDrXN0aWNvcy4gQSBjb250aW51YWNpw7NuLCBlc3R1ZGlhcmVtb3MgDQpudWV2YW1lbnRlIGxvcyBncsOhZmljb3MgY2lyY3VsYXJlcyB5IGRlZmluaXJlbW9zIGRvcyB0aXBvcyBkZSBncsOhZmljb3MgbnVldm9zOiBlbCBoaXN0b2dyYW1hIHkgZWwgDQpwb2zDrWdvbm8gZGUgZnJlY3VlbmNpYS4NCjEuIEhpc3RvZ3JhbWENCkN1YW5kbyBsYSB2YXJpYWJsZSBlbiBlc3R1ZGlvIGVzdMOhIGFncnVwYWRhIGVuIGludGVydmFsb3MgZGUgY2xhc2UgdW4gZ3LDoWZpY28gYXByb3BpYWRvIGVzIHVuIA0KaGlzdG9ncmFtYSwgZWwgY3VhbCBjb25zaXN0ZSBlbiB1bmEgc2VyaWUgZGUgcmVjdMOhbmd1bG9zIGNvbnNlY3V0aXZvcy4NCg0KDQpQYXJhIGNvbmZlY2Npb25hciB1biBoaXN0b2dyYW1hIHNlIHRyYXphbiBkb3MgZWplcyBwZXJwZW5kaWN1bGFyZXMgeSBsdWVnbyBzZSB0cmF6YW4gcmVjdMOhbmd1bG9zIA0KY29uc2VjdXRpdm9zLCBjdXlhIGJhc2UgZW4gZWwgZWplIGhvcml6b250YWwsIGVzdMOhIGRldGVybWluYWRhIHBvciBsb3MgaW50ZXJ2YWxvcyBkZSBjbGFzZSwgeSBzdSBhbHR1cmEsIGVuIGVsIA0KZWplIHZlcnRpY2FsLCBwb3IgbGEgZnJlY3VlbmNpYSBhYnNvbHV0YSBvIHJlbGF0aXZhIGNvcnJlc3BvbmRpZW50ZSBhIGVzZSBpbnRlcnZhbG8uDQoNClNpIGNvbnNpZGVyYW1vcyBudWV2YW1lbnRlIGxhIGFjdGl2aWRhZCBpbmljaWFsLCBlbiBsYSBxdWUgc2UgZXN0dWRpYXJvbiBsYXMgZXN0YXR1cmFzIGRlIGxvcyANCmp1Z2Fkb3JlcyBkZSBiw6FzcXVldCwgc2UgcG9kcsOtYSByZXByZXNlbnRhciBwb3IgbWVkaW8gZGUgdW4gaGlzdG9ncmFtYSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOg0KDQohW10oQ29sZWdpbzI5LmpwZykNCg0KKipQT0xJR09OTyBERSBGUkVDVUVOQ0lBUzoqKg0KDQpFbCBwb2zDrWdvbm8gZGUgZnJlY3VlbmNpYSBzZSBvYnRpZW5lIGEgcGFydGlyIGRlbCBoaXN0b2dyYW1hLCB1bmllbmRvIGxvcyBwdW50b3MgbWVkaW9zIGRlIGxvcyANCmxhZG9zIG9wdWVzdG9zIGEgbGFzIGJhc2VzIGRlIGNhZGEgcmVjdMOhbmd1bG8sIGluY2x1eWVuZG8gZWwgYW50ZXJpb3IgYWwgcHJpbWVybyB5IGVsIHBvc3RlcmlvciBhbCANCsO6bHRpbW8uDQpDb25zaWRlcmFuZG8gbnVldmFtZW50ZSBlbCBlamVtcGxvIGluaWNpYWwsIHN1IHBvbMOtZ29ubyBkZSBmcmVjdWVuY2lhcyBlczoNCg0KIVtdKENvbGVnaW8zMC5qcGcpDQoNCioqR1JBRklDTyBDSVJDVUxBUjoqKiANCg0KDQpFbCBncsOhZmljbyBjaXJjdWxhciwgY29tbyBtZW5jaW9uYW1vcyBhbnRlcmlvcm1lbnRlLCBwZXJtaXRlIHZpc3VhbGl6YXIgY2xhcmFtZW50ZSBsYSANCnByb3BvcmNpw7NuIHF1ZSBvY3VwYSBjYWRhIGludGVydmFsbyByZXNwZWN0byBhIGxvcyByZXN0YW50ZXMgeSBzdSBjb25zdHJ1Y2Npw7NuIHNlIHJlYWxpemEgZGUgbGEgbWlzbWEgDQptYW5lcmEgcXVlIGFwcmVuZGltb3MgZW4gbGEgcHJpbWVyYSBzZWNjacOzbi4NCkVsIGdyw6FmaWNvIGNpcmN1bGFyIGNvcnJlc3BvbmRpZW50ZSBhIGxhcyBlc3RhdHVyYXMgZGUgbG9zIGp1Z2Fkb3JlcyBkZSBiw6FzcXVldCBzZXLDoSBlbCBzaWd1aWVudGU6DQoNCiFbXShDb2xlZ2lvMzEuanBnKQ0KIyMgQWN0aXZpZGFkIDI3DQoNCkVsIGhpc3RvZ3JhbWEgbXVlc3RyYSBsYSBkaXN0cmlidWNpw7NuIGRlIGxvcyBzdWVsZG9zIGRlIGxvcyBlbXBsZWFkb3MgZGUgdW5hIGVtcHJlc2EuIA0KT2JzZXJ2YSB5IGx1ZWdvIHJlc3VlbHZlOg0KDQohW10oQ29sZWdpbzMyLmpwZykNCg0KYS4gwr9DdcOhbnRvcyBlbXBsZWFkb3MgdGllbmUgbGEgZW1wcmVzYT8NCi0gTGEgZW1lcHJlc2EgVGllbmUgdW4gVG90YWwgZGUgNDAgRW1wbGVhZG9zDQpiLiDCv0N1w6FudG9zIGdhbmFuIG1lbm9zIGRlICQzNTAwPyDCv1kgbcOhcyBkZSAkNDAwMD8NCi0gMTcgRW1wbGVhZG9zIEdhbmFuIE1lbm9zIGRlICQzNTAwIHkgMTYgRW1wbGVhZG9zIG1hcyBkZSAkNDAwMA0KDQpjLiBUcmF6YXIgc29icmUgZWwgaGlzdG9ncmFtYSBlbCBwb2xpZ29ubyBkZSBmcmVjdWVuY2lhcy4NCg0KICFbXShDb2xlZ2lvMzMuanBnKQ0KDQpkLiBDb21wbGV0YSBsYSBzaWd1aWVudGUgdGFibGEuDQoNCiFbXShDb2xlZ2lvMzQuanBnKQ0KDQoNCmUuIFJlYWxpemEgdW4gZ3LDoWZpY28gY2lyY3VsYXINCg0KYGBge3J9DQojIFZlY3RvciBkZSBwb3JjZW50YWplcw0KcG9yY2VudGFqZXMgPC0gYygyMiwgMjAsIDE3LCAxNSwgMjUpDQoNCiMgRXRpcXVldGFzIHBhcmEgY2FkYSBwb3JjZW50YWplDQpldGlxdWV0YXMgPC0gYygiWzIuNTAwOzMuMDAwKSIsICJbMy4wMDA7My41MDApIiwgIlszLjUwMDs0LjAwMCkiLCAiWzQuMDAwOzQuNTAwKSIsICJbNC41MDA7NS4wMDBdIikNCg0KIyBDcmVhciBsYXMgZXRpcXVldGFzIGNvbiBwb3JjZW50YWplcw0KZXRpcXVldGFzX2Nvbl9wb3JjZW50YWplcyA8LSBwYXN0ZShldGlxdWV0YXMsICIoIiwgcG9yY2VudGFqZXMsICIlKSIsIHNlcCA9ICIgIikNCg0KIyBDcmVhciBlbCBncsOhZmljbyBjaXJjdWxhcg0KcGllKHBvcmNlbnRhamVzLCBsYWJlbHMgPSBldGlxdWV0YXNfY29uX3BvcmNlbnRhamVzLCBtYWluID0gIkdyw6FmaWNvIENpcmN1bGFyIERlIFN1ZWxkb3MiKQ0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCiMjIEFjdGl2aWRhZCAyOA0KDQpSZWFsaXphciB1biBoaXN0b2dyYW1hIHkgdW4gcG9sw61nb25vIGRlIGZyZWN1ZW5jaWFzIHBhcmEgcmVwcmVzZW50YXIgY2FkYSB1bmEgZGUgbGFzIA0Kc2l0dWFjaW9uZXMgZXN0dWRpYWRhcyBlbiBsYXMgYWN0aXZpZGFkZXMgMSwgMiB5IDMgZGUgZXN0YSBzZWNjacOzbi4NCg0KDQpgYGB7cn0NCiMgQ3JlYXIgdW4gZ3LDoWZpY28gY2lyY3VsYXIgKGdyw6FmaWNvIGRlIHBhc3RlbCkNCiMgQ3JlYXIgdW4gZ3LDoWZpY28gY2lyY3VsYXIgKGdyw6FmaWNvIGRlIHBhc3RlbCkNCnBvcmNlbnRhamVzIDwtIGMoMTMuMzMsIDMwLjAwLCAyNi42NywgMzAuMDApICAjIFZhbG9yZXMgZW4gcG9yY2VudGFqZQ0Kbm9tYnJlc19pbnRlcnZhbG9zIDwtIGMoIlsxODAgOyAyMDApIiwgIlsyMDAgOyAyMjApIiwgIlsyMjAgOyAyNDApIiwgIlsyNDAgOyAyNjApIikNCg0KcGllX2RhdGEgPC0gZGF0YS5mcmFtZShpbnRlcnZhbG9zID0gbm9tYnJlc19pbnRlcnZhbG9zLCBwb3JjZW50YWplID0gcG9yY2VudGFqZXMpDQpwaWVfcGxvdCA8LSBnZ3Bsb3QocGllX2RhdGEsIGFlcyh4ID0gIiIsIHkgPSBwb3JjZW50YWplLCBmaWxsID0gaW50ZXJ2YWxvcykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDApICsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyBDaXJjdWxhciBkZSBGcmVjdWVuY2lhcyIpICsNCiAgdGhlbWVfdm9pZCgpDQoNCiMgQWdyZWdhciBwb3JjZW50YWplcyBjb21vIGV0aXF1ZXRhcyBlbiBlbCBncsOhZmljbyBjaXJjdWxhcg0KbGFiZWxzIDwtIHBhc3RlKG5vbWJyZXNfaW50ZXJ2YWxvcywgIlxuIiwgcG9yY2VudGFqZXMsICIlIikNCnBpZV9wbG90IDwtIHBpZV9wbG90ICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGxhYmVscyksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKQ0KDQpwcmludChwaWVfcGxvdCkNCg0KIyBDcmVhciB1biBncsOhZmljbyBkZSBiYXJyYXMNCmJhcnJhc19kYXRhIDwtIGRhdGEuZnJhbWUoaW50ZXJ2YWxvcyA9IG5vbWJyZXNfaW50ZXJ2YWxvcywgZnJlY3VlbmNpYSA9IGMoNCwgOSwgOCwgOSkpDQpiYXJfcGxvdCA8LSBnZ3Bsb3QoYmFycmFzX2RhdGEsIGFlcyh4ID0gaW50ZXJ2YWxvcywgeSA9IGZyZWN1ZW5jaWEsIGZpbGwgPSBpbnRlcnZhbG9zKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIGRlIEJhcnJhcyBkZSBGcmVjdWVuY2lhcyIsIHggPSAiSW50ZXJ2YWxvcyIsIHkgPSAiRnJlY3VlbmNpYSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KcHJpbnQoYmFyX3Bsb3QpDQoNCmBgYA0KDQpgYGB7cn0NCiMgRGF0b3MgZGUgdGVtcGVyYXR1cmFzIG3DoXhpbWFzDQp0ZW1wZXJhdHVyYXMgPC0gYyg3LjMsIDEyLCAxNCwgMTYsIDE2LjMsIDkuMywNCiAgICAgICAgICAgICAgICAgIDE2LjQsIDE0LjcsIDEwLCA4LCA5LCA3LjQsDQogICAgICAgICAgICAgICAgICAxMC40LCAyMSwgMTMuNywgMTUsIDgsIDE1LjcsDQogICAgICAgICAgICAgICAgICAxMiwgMTIuNCwgMTIuNSwgOC42LCA3LCAxMC4xLA0KICAgICAgICAgICAgICAgICAgMTgsIDE1LCAxNC41LCA4LjMsIDEwLCA3KQ0KDQojIENyZWFyIGxhIHRhYmxhIGRlIGZyZWN1ZW5jaWFzDQpmcmVjdWVuY2lhX3RlbXBlcmF0dXJhcyA8LSB0YWJsZShjdXQodGVtcGVyYXR1cmFzLCBzZXEoNywgMjUsIGJ5ID0gMyksIHJpZ2h0ID0gRkFMU0UpKQ0KDQojIENyZWFyIGVsIGdyw6FmaWNvIGNpcmN1bGFyDQpldGlxdWV0YXMgPC0gcGFzdGUobmFtZXMoZnJlY3VlbmNpYV90ZW1wZXJhdHVyYXMpLCAiICgiLCBmcmVjdWVuY2lhX3RlbXBlcmF0dXJhcywgIikiLCBzZXAgPSAiIikNCnBpZShmcmVjdWVuY2lhX3RlbXBlcmF0dXJhcywgbGFiZWxzID0gZXRpcXVldGFzLCBtYWluID0gIkdyw6FmaWNvIENpcmN1bGFyIC0gVGVtcGVyYXR1cmFzIE3DoXhpbWFzIikNCg0KIyBDYWxjdWxhciBlbCBwdW50byBtZWRpbyBkZSBjYWRhIGludGVydmFsbw0KcHVudG9zX21lZGlvcyA8LSBzZXEoOCwgMjMsIGJ5ID0gMykNCg0KIyBDcmVhciBlbCBwb2zDrWdvbm8gZGUgZnJlY3VlbmNpYXMNCnBsb3QocHVudG9zX21lZGlvcywgZnJlY3VlbmNpYV90ZW1wZXJhdHVyYXMsIHR5cGUgPSAibiIsIG1haW4gPSAiUG9sw61nb25vIGRlIEZyZWN1ZW5jaWFzIC0gVGVtcGVyYXR1cmFzIE3DoXhpbWFzIiwgDQogICAgIHhsYWIgPSAiVGVtcGVyYXR1cmEgTcOheGltYSAowrpDKSIsIHlsYWIgPSAiRnJlY3VlbmNpYSIsIHlsaW0gPSBjKDAsIG1heChmcmVjdWVuY2lhX3RlbXBlcmF0dXJhcykgKyAyKSkNCnBvbHlnb24oYyg3LCBwdW50b3NfbWVkaW9zLCAyNSksIGMoMCwgZnJlY3VlbmNpYV90ZW1wZXJhdHVyYXMsIDApLCBjb2wgPSAibGlnaHRibHVlIikNCmxpbmVzKHB1bnRvc19tZWRpb3MsIGZyZWN1ZW5jaWFfdGVtcGVyYXR1cmFzLCBjb2wgPSAiYmx1ZSIsIGx3ZCA9IDIpDQoNCiMgQ3JlYXIgZWwgaGlzdG9ncmFtYQ0KaGlzdCh0ZW1wZXJhdHVyYXMsIGJyZWFrcyA9IHNlcSg3LCAyNSwgYnkgPSAzKSwgZnJlcSA9IEZBTFNFLCANCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIC0gVGVtcGVyYXR1cmFzIE3DoXhpbWFzIiwgeGxhYiA9ICJUZW1wZXJhdHVyYSBNw6F4aW1hICjCukMpIiwgeWxhYiA9ICJEZW5zaWRhZCIsIGNvbCA9ICJsaWdodGdyZWVuIikNCmxpbmVzKGRlbnNpdHkodGVtcGVyYXR1cmFzKSwgY29sID0gImJsdWUiLCBsd2QgPSAyKQ0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCioqTUVESURBUyBQQVJBIERBVE9TIEFHUlVQQURPUzoqKg0KQ3VhbmRvIGxvcyBkYXRvcyBhcGFyZWNlbiBlbiBsYXMgdGFibGFzIGRlIGZyZWN1ZW5jaWFzIGFncnVwYWRvcyBlbiBpbnRlcnZhbG9zIGRlIGNsYXNlLCANCnRhbWJpw6luIGVzIHBvc2libGUgY2FsY3VsYXIgc3VzIHBhcsOhbWV0cm9zIGRlIHBvc2ljacOzbi4gU2kgYmllbiDDqXN0b3Mgc2Ugb2J0aWVuZW4gZGUgdW5hIG1hbmVyYSANCmRpZmVyZW50ZSwgc3UgaW50ZXJwcmV0YWNpw7NuIGVzIGxhIG1pc21hIHF1ZSBkZWZpbmltb3MgYW50ZXJpb3JtZW50ZS4NCg0KTGEgbWVkaWEgYXJpdG3DqXRpY2EgbyBwcm9tZWRpbyBzZSBvYnRpZW5lIGRpdmlkaWVuZG8gcG9yIGVsIA0KdG90YWwgZGUgb2JzZXJ2YWNpb25lcyBhIGxhIHN1bWEgZGUgbG9zIHByb2R1Y3RvcyBkZSBsb3MgcHVudG9zIA0KbWVkaW9zIGNvbiBsYXMgZnJlY3VlbmNpYXMgYWJzb2x1dGFzIGRlIGNhZGEgaW50ZXJ2YWxvDQoNCkVsIGludGVydmFsbyBxdWUgY29udGllbmUgYSBsYSBtZWRpYW5hIGVzIGVsIA0KcXVlIHRpZW5lIHN1IGZyZWN1ZW5jaWEgYWN1bXVsYWRhIGlndWFsIG8gDQptYXlvciBhIGxhIG1pdGFkIGRlIGxhcyBvYnNlcnZhY2lvbmVzLiBMYSANCm1lZGlhbmEgc2Vyw6EgZWwgcHVudG8gbWVkaW8gZGUgZGljaG8gDQppbnRlcnZhbG8NCg0KTGEgbW9kYSBzZSBhcHJveGltYSBjb21vIGVsIA0KcHVudG8gbWVkaW8gZGVsIGludGVydmFsbyBkZSANCm1heW9yIGZyZWN1ZW5jaWEgYWJzb2x1dGEuDQoNClZlYW1vcyBjw7NtbyBzZSBjYWxjdWxhbiBsYSBtZWRpYSwgbGEgbW9kYSB5IGxhIG1lZGlhbmEgYSBwYXJ0aXIgZGUgdW4gDQplamVtcGxvLiBMYSBzaWd1aWVudGUgdGFibGEgZGUgZnJlY3VlbmNpYXMgbXVlc3RyYSBsYSBjYW50aWRhZCBkZSBkaW5lcm8gcXVlIA0KaW52aWVydGUgdW5hIGZhbWlsaWEgZW4gYWJvbm8gZGUgdGVsZWZvbsOtYSBjZWx1bGFyIHBhcmEgdG9kb3Mgc3VzIGludGVncmFudGVzLiANCkxvcyBkYXRvcyBzZSBvYnR1dmllcm9uIGRlIHVuYSBlbmN1ZXN0YSByZWFsaXphZGEgYSAxMDAgZmFtaWxpYXMuDQoNCiFbXShDb2xlZ2lvMzUuanBnKQ0KUXVlIE1lID0gNzAwIHNpZ25pZmljYSBxdWUgbGEgbWl0YWQgZGUgbGFzIGZhbWlsaWFzIGVuY3Vlc3RhZGFzIGRlc3RpbmFuIG1lbm9zIGRlICQ3MDAgYWwgcGFnbyANCmRlIGFib25vIGVuIHRlbGVmb27DrWEgY2VsdWxhciB5IHF1ZSBsYSBvdHJhIG1pdGFkLCBnYXN0YSBtw6FzIGRlICQ3MDAgZW4gZXNlIHNlcnZpY2lvLg0KUGFyYSBsYSBpbnRlcnByZXRhY2nDs24gZGUgbGEgbWVkaWEsIHBvZGVtb3MgZGVjaXIgcXVlIGxhcyBmYW1pbGlhcyBlbmN1ZXN0YWRhcyBpbnZpZXJ0ZW4gDQphcHJveGltYWRhbWVudGUgJDcxOCBlbiBwcm9tZWRpbyBwYXJhIGVsIHNlcnZpY2lvIGRlIHRlbGVmb27DrWEgY2VsdWxhci4NClBvciDDumx0aW1vLCBxdWUgTW8gPSA1MDAgc2lnbmlmaWNhIHF1ZSBlc2UgbW9udG8gZXMsIGFwcm94aW1hZGFtZW50ZSwgZWwgcXVlIG3DoXMgdmVjZXMgc2UgDQpyZXBpdGUsIHBvciBsbyBxdWUgZXMgbGEgY2FudGlkYWQgZGUgZGluZXJvIHF1ZSBtw6FzIGZhbWlsaWFzIGRlc3RpbmFuIGFsIHBhZ28gZGVsIHNlcnZpY2lvIGRlIHRlbGVmb27DrWEuDQoNCg0KIyMgQWN0aXZpZGFkIDI5DQoNCkxhIHNpZ3VpZW50ZSB0YWJsYSBtdWVzdHJhIGxvcyBkYXRvcyBvYnRlbmlkb3MgZGVsIHBlc28gZW4ga2cgZGUgNDAwIHBlcnNvbmFzLg0KDQphLiBDb21wbGV0YS4NCg0KIVtdKENvbGVnaW8zNi5qcGcpDQoNClByb21lZGlvIChNZWRpYSk6DQoNClBhcmEgY2FsY3VsYXIgZWwgcHJvbWVkaW8sIG5lY2VzaXRhbW9zIHV0aWxpemFyIGVsIHByb2R1Y3RvIGRlIGxhIGZyZWN1ZW5jaWEgeSBlbCBwdW50byBtZWRpbyAoXChjIFxjZG90IGZcKSkgcGFyYSBjYWRhIGludGVydmFsbywgeSBsdWVnbyBzdW1hciB0b2RvcyBlc3RvcyBwcm9kdWN0b3MgeSBkaXZpZGlyIGVudHJlIGVsIHRvdGFsIGRlIGxhIGZyZWN1ZW5jaWEgdG90YWwuDQoNClxbDQpcdGV4dHtQcm9tZWRpb30gPSBcZnJhY3tcc3VtIChjIFxjZG90IGYpfXtcdGV4dHtUb3RhbCBkZSBsYSBmcmVjdWVuY2lhfX0NClxdDQoNCkVuIGVzdGUgY2FzbywgdXNhbmRvIGxvcyB2YWxvcmVzIHF1ZSBwcm9wb3JjaW9uYXN0ZSBlbiBsYSB0YWJsYSwgZWwgY8OhbGN1bG8gc2Vyw61hOg0KDQpcWw0KXHRleHR7UHJvbWVkaW99ID0gXGZyYWN7MjEwNyArIDI5MDcgKyA0OTQwICsgNTI1NiArIDg5MTAgKyA0NDUwfXs0MDB9IFxhcHByb3ggNjguODI1DQpcXQ0KDQpNb2RhOg0KDQpMYSBtb2RhIGVzIGVsIHZhbG9yIG8gaW50ZXJ2YWxvIHF1ZSBtw6FzIGZyZWN1ZW50ZW1lbnRlIHNlIHJlcGl0ZS4gRW4gZXN0ZSBjYXNvLCBlbCBpbnRlcnZhbG8gY29uIGxhIG1heW9yIGZyZWN1ZW5jaWEgZXMgWzc3IDsgODUpLCBjb24gdW5hIGZyZWN1ZW5jaWEgZGUgMTA4LiBQb3IgbG8gdGFudG8sIGxhIG1vZGEgZXMgZWwgaW50ZXJ2YWxvIFs3NyA7IDg1KS4NCg0KTWVkaWFuYToNCg0KTGEgbWVkaWFuYSBlcyBlbCB2YWxvciBxdWUgc2UgZW5jdWVudHJhIGVuIGVsIG1lZGlvIGN1YW5kbyBsb3MgZGF0b3Mgc2Ugb3JkZW5hbiBkZSBtZW5vciBhIG1heW9yLiBFbiBlc3RlIGNhc28sIGNvbW8gdGVuZW1vcyBpbnRlcnZhbG9zLCBwcmltZXJvIG5lY2VzaXRhbW9zIGVuY29udHJhciBlbCBpbnRlcnZhbG8gcXVlIGNvbnRpZW5lIGxhIG1lZGlhbmEuDQoNClBhcmEgZW5jb250cmFyIGVsIGludGVydmFsbyBtZWRpYW5vLCBjYWxjdWxhbW9zIGxhIGZyZWN1ZW5jaWEgYWN1bXVsYWRhIHkgZW5jb250cmFtb3MgZWwgaW50ZXJ2YWxvIGRvbmRlIGxhIGZyZWN1ZW5jaWEgYWN1bXVsYWRhIGVzIGlndWFsIG8gc3VwZXJpb3IgYSBsYSBtaXRhZCBkZWwgdG90YWwgZGUgZnJlY3VlbmNpYXMuIEVuIGVzdGUgY2FzbywgZWwgaW50ZXJ2YWxvIG1lZGlhbm8gZXMgWzY5IDsgNzcpLg0KDQpMdWVnbywgdXNhbW9zIGxhIGbDs3JtdWxhIGRlIGxhIG1lZGlhbmEgcGFyYSBpbnRlcnZhbG9zOg0KDQpcWw0KXHRleHR7TWVkaWFuYX0gPSBMICsgXGZyYWN7XGZyYWN7bn17Mn0gLSBGfXtmfSBcY2RvdCB3DQpcXQ0KDQpEb25kZToNCg0KXChMXCkgZXMgZWwgbMOtbWl0ZSBpbmZlcmlvciBkZWwgaW50ZXJ2YWxvIG1lZGlhbm8gKDY5IGVuIGVzdGUgY2FzbykNClwoblwpIGVzIGVsIHRvdGFsIGRlIGZyZWN1ZW5jaWFzICg0MDApDQpcKEZcKSBlcyBsYSBmcmVjdWVuY2lhIGFjdW11bGFkYSBkZWwgaW50ZXJ2YWxvIGFudGVyaW9yICgxNzAgZW4gZXN0ZSBjYXNvKQ0KXChmXCkgZXMgbGEgZnJlY3VlbmNpYSBkZWwgaW50ZXJ2YWxvIG1lZGlhbm8gKDcyIGVuIGVzdGUgY2FzbykNClwod1wpIGVzIGVsIGFuY2hvIGRlbCBpbnRlcnZhbG8gKDggZW4gZXN0ZSBjYXNvKQ0KDQpTdXN0aXR1eWVuZG8gZXN0b3MgdmFsb3JlcyBlbiBsYSBmw7NybXVsYToNCg0KXFsNClx0ZXh0e01lZGlhbmF9ID0gNjkgKyBcZnJhY3tcZnJhY3s0MDB9ezJ9IC0gMTcwfXs3Mn0gXGNkb3QgOCBcYXBwcm94IDc2LjUNClxdDQoNClBvciBsbyB0YW50bywgZWwgcHJvbWVkaW8gZXMgYXByb3hpbWFkYW1lbnRlIDY4LjgyNSwgbGEgbW9kYSBlcyBlbCBpbnRlcnZhbG8gWzc3IDsgODUpIHkgbGEgbWVkaWFuYSBlcyBhcHJveGltYWRhbWVudGUgNzYuNS4NCg0KDQoNCg0KDQoNCg0KDQoNCiMjIEFjdGl2aWRhZCAzMA0KDQpMb3Mgc2lndWllbnRlcyBkYXRvcyBzb24gbGFzIHZlbG9jaWRhZGVzLCBlbiBrbS9oLCBxdWUgcmVnaXN0csOzIGVsIHJhZGFyIHBvbGljaWFsIGRlIDQwIA0KYXV0b23Ds3ZpbGVzIHF1ZSBjaXJjdWxhYmFuIGZyZW50ZSB1biBwdWVzdG8gZGUgY29udHJvbCBlbiB1bmEgcnV0YSBuYWNpb25hbC4NCg0KIVtdKENvbGVnaW8zNy5qcGcpDQoNCmEuIE9yZ2FuaXphIGxvcyBkYXRvcyBlbiB1bmEgdGFibGEgZGUgZnJlY3VlbmNpYXMgY29uIGludGVydmFsb3MgZGUgMjAga20vaCBkZSBhbmNoby4NCmIuIFRyYXphIHVuIGhpc3RvZ3JhbWEuDQpjLiBDYWxjdWxhIGxhIHZlbG9jaWRhZCBwcm9tZWRpbywgbGEgbW9kYSB5IGxhIG1lZGlhbmEuDQpkLiBFc2NyaWJlIHVuYSBpbnRlcnByZXRhY2nDs24gZGVsIHNpZ25pZmljYWRvIGRlIGxvcyBwYXLDoW1ldHJvcyBjYWxjdWxhZG9zLg0KDQphLiBPcmdhbml6YXIgbG9zIGRhdG9zIGVuIHVuYSB0YWJsYSBkZSBmcmVjdWVuY2lhcyBjb24gaW50ZXJ2YWxvcyBkZSAyMCBrbS9oIGRlIGFuY2hvOg0KDQpJbnRlcnZhbG8gICAgRnJlY3VlbmNpYQ0KWzUwIDsgNzApICAgIDQNCls3MCA7IDkwKSAgICA4DQpbOTAgOyAxMTApICAgMTANClsxMTAgOyAxMzApICAxMA0KWzEzMCA7IDE1MCkgIDgNCg0KYi4gVHJhemFyIHVuIGhpc3RvZ3JhbWE6DQoNCmBgYHtyfQ0KIyBEYXRvcyBkZSB2ZWxvY2lkYWRlcw0KdmVsb2NpZGFkZXMgPC0gYyg0NSwgMTE1LCAxMDAsIDk1LCA3MCwgMTEwLCA4MCwgMTAwLA0KICAgICAgICAgICAgICAgICA4NSwgMTMwLCAxMDUsIDEyMCwgNjUsIDEwNSwgOTAsIDYwLA0KICAgICAgICAgICAgICAgICAxMDUsIDEwMCwgOTAsIDc1LCAxMTUsIDU1LCAxMTAsIDUwLA0KICAgICAgICAgICAgICAgICA2NSwgMTM1LCAxMTUsIDcwLCA4MCwgOTUsIDEwMCwgOTUsDQogICAgICAgICAgICAgICAgIDk1LCAxMDAsIDg1LCAxMDAsIDkwLCAxMDUsIDgwLCAxMjApDQoNCiMgQ3JlYXIgdW4gaGlzdG9ncmFtYQ0KaGlzdCh2ZWxvY2lkYWRlcywgYnJlYWtzID0gc2VxKDQ1LCAxNTUsIGJ5ID0gMjApLCBjb2wgPSAic2t5Ymx1ZSIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBWZWxvY2lkYWRlcyIsIHhsYWIgPSAiVmVsb2NpZGFkIChrbS9oKSIsIHlsYWIgPSAiRnJlY3VlbmNpYSIpDQoNCmBgYA0KDQpjLiBDYWxjdWxhciBsYSB2ZWxvY2lkYWQgcHJvbWVkaW8sIGxhIG1vZGEgeSBsYSBtZWRpYW5hOg0KDQpgYGB7cn0NCiMgQ2FsY3VsYXIgZWwgcHJvbWVkaW8NCnByb21lZGlvIDwtIG1lYW4odmVsb2NpZGFkZXMpDQoNCiMgQ2FsY3VsYXIgbGEgbW9kYQ0KbW9kYSA8LSBhcy5udW1lcmljKG5hbWVzKHNvcnQodGFibGUodmVsb2NpZGFkZXMpLCBkZWNyZWFzaW5nID0gVFJVRSlbMV0pKQ0KDQojIENhbGN1bGFyIGxhIG1lZGlhbmENCm1lZGlhbmEgPC0gbWVkaWFuKHZlbG9jaWRhZGVzKQ0KDQoNCg0KYGBgDQoNCmBgYHtyfQ0KcHJvbWVkaW8gICMgSW1wcmltaXIgZWwgcHJvbWVkaW8NCmBgYA0KDQoNCmBgYHtyfQ0KbW9kYSAgICAgICMgSW1wcmltaXIgbGEgbW9kYQ0KDQpgYGANCg0KYGBge3J9DQptZWRpYW5hICAgIyBJbXByaW1pciBsYSBtZWRpYW5hDQpgYGANCg0KZC4gSW50ZXJwcmV0YWNpw7NuIGRlbCBzaWduaWZpY2FkbyBkZSBsb3MgcGFyw6FtZXRyb3MgY2FsY3VsYWRvczoNCg0KUHJvbWVkaW86IExhIHZlbG9jaWRhZCBwcm9tZWRpbyBkZSBsb3MgYXV0b23Ds3ZpbGVzIGVuIGxhIG11ZXN0cmEgZXMgYXByb3hpbWFkYW1lbnRlIDkyLjYyNSBrbS9oLg0KTW9kYTogTGEgdmVsb2NpZGFkIG3DoXMgY29tw7puIGVudHJlIGxvcyBhdXRvbcOzdmlsZXMgZW4gbGEgbXVlc3RyYSBlcyBkZSAxMDAga20vaC4NCk1lZGlhbmE6IExhIHZlbG9jaWRhZCBtZWRpYW5hIGVudHJlIGxvcyBhdXRvbcOzdmlsZXMgZW4gbGEgbXVlc3RyYSBlcyBkZSA5NSBrbS9oLCBsbyBxdWUgc2lnbmlmaWNhIHF1ZSBsYSBtaXRhZCBkZSBsb3MgYXV0b23Ds3ZpbGVzIGVzdMOhbiBwb3IgZGViYWpvIGRlIGVzdGEgdmVsb2NpZGFkIHkgbGEgb3RyYSBtaXRhZCBlc3TDoW4gcG9yIGVuY2ltYS4gQWRlbWFzIHNlIHB1ZWRlIHZlciBxdWUgbGEgZGlzdHJ1YnVjaW9uIGRlIGxhIHZhcmlhYmxlIFZlbG9jaWRhZCB0aWVuZSB1bmEgZGlzdHJ1YmljaW9uIG5vcm1hbCBlcyBkZWNpciB1bmEgZGlzdHJpYnVjaW9uIGRlIEdhdXNzDQoNCg0KDQoNCg0KDQojIyBBY3RpdmlkYWQgMzENCg0KTG9zIHNpZ3VpZW50ZXMgZGF0b3MgY29ycmVzcG9uZGVuIGFsIHRpZW1wbyBhcHJveGltYWRvLCBlbiBtaW51dG9zLCB0cmFuc2N1cnJpZG9zIA0KZGVzZGUgcXVlIGZ1ZSBzb2xpY2l0YWRvIHVuIHRheGkgaGFzdGEgcXVlIGhpem8gY29udGFjdG8gY29uIGVsIHBhc2FqZXJvOg0KDQohW10oQ29sZWdpbzM4LmpwZykNCg0KUmVhbGl6YSB1bmEgdGFibGEgZGUgZnJlY3VlbmNpYSB1dGlsaXphbmRvIDUgaW50ZXJ2YWxvcyBkZSBjbGFzZSB5IGNhbGN1bGFyIHN1cyBwYXLDoW1ldHJvcyBkZSBwb3NpY2nDs24gDQppbmRpY2FuZG8gY3XDoWwgZXMgc3UgaW50ZXJwcmV0YWNpw7NuLg0KDQoNCg0KYGBge3J9DQojIERhdG9zIGRlIHRpZW1wbw0KdGllbXBvIDwtIGMoNywgOCwgNCwgMywgMiwgNSwgMTUsIDYsIDQsIDQsIDUsIDMsIDcsIDExLA0KICAgICAgICAgICAgNywgOSwgMTMsIDEwLCA5LCA4LCAxMiwgNywgNCwgMywgMTYsIDgsIDUsIDE0KQ0KDQojIENhbGN1bGFyIGxhcyBtb2Rhcw0KdGFibGFfZnJlY3VlbmNpYXMgPC0gdGFibGUodGllbXBvKQ0KbW9kYXMgPC0gYXMubnVtZXJpYyhuYW1lcyh0YWJsYV9mcmVjdWVuY2lhcylbdGFibGFfZnJlY3VlbmNpYXMgPT0gbWF4KHRhYmxhX2ZyZWN1ZW5jaWFzKV0pDQoNCiMgQ2FsY3VsYXIgcHJvbWVkaW8gKG1lZGlhKQ0KcHJvbWVkaW8gPC0gbWVhbih0aWVtcG8pDQoNCiMgQ2FsY3VsYXIgbWVkaWFuYQ0KbWVkaWFuYSA8LSBtZWRpYW4odGllbXBvKQ0KDQoNCmBgYA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyBJbXByaW1pciBsb3MgcmVzdWx0YWRvcyB5IHN1cyBpbnRlcnByZXRhY2lvbmVzDQpjYXQoIlByb21lZGlvIChNZWRpYSk6XG4iKQ0KY2F0KCJFbCB0aWVtcG8gcHJvbWVkaW8gZW4gbWludXRvcyBkZXNkZSBxdWUgc2Ugc29saWNpdMOzIHVuIHRheGkgaGFzdGEgcXVlIGhpem8gY29udGFjdG8gY29uIGVsIHBhc2FqZXJvIGVzIGRlIGFwcm94aW1hZGFtZW50ZSIsIHJvdW5kKHByb21lZGlvLCAyKSwgIm1pbnV0b3MuXG5cbiIpDQoNCg0KDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCmNhdCgiRWwgdGllbXBvIG1lZGlhbm8gZW4gbWludXRvcyBkZXNkZSBxdWUgc2Ugc29saWNpdMOzIHVuIHRheGkgaGFzdGEgcXVlIGhpem8gY29udGFjdG8gY29uIGVsIHBhc2FqZXJvIGVzIGRlIGFwcm94aW1hZGFtZW50ZSIsIG1lZGlhbmEsICJtaW51dG9zLCBsbyBxdWUgc2lnbmlmaWNhIHF1ZSBsYSBtaXRhZCBkZSBsb3MgdGllbXBvcyBzb24gbWVub3JlcyBhIGVzdGUgdmFsb3IgeSBsYSBvdHJhIG1pdGFkIHNvbiBtYXlvcmVzLlxuXG4iKQ0KDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCg0KaWYgKGxlbmd0aChtb2RhcykgPiAxKSB7DQogIGNhdCgiTW9kYTpcbiIpDQogIGNhdCgiRWwgdGllbXBvIG3DoXMgY29tw7puIGVuIG1pbnV0b3MgZGVzZGUgcXVlIHNlIHNvbGljaXTDsyB1biB0YXhpIGhhc3RhIHF1ZSBoaXpvIGNvbnRhY3RvIGNvbiBlbCBwYXNhamVybyBzb24gbG9zIHNpZ3VpZW50ZXMgdmFsb3JlczoiLCBwYXN0ZShtb2RhcywgY29sbGFwc2UgPSAiIHkgIiksICJtaW51dG9zLlxuIikNCn0gZWxzZSB7DQogIGNhdCgiTW9kYTpcbiIpDQogIGNhdCgiRWwgdGllbXBvIG3DoXMgY29tw7puIGVuIG1pbnV0b3MgZGVzZGUgcXVlIHNlIHNvbGljaXTDsyB1biB0YXhpIGhhc3RhIHF1ZSBoaXpvIGNvbnRhY3RvIGNvbiBlbCBwYXNhamVybyBlcyBkZSBhcHJveGltYWRhbWVudGUiLCBtb2RhcywgIm1pbnV0b3MuXG4iKQ0KfQ0KYGBgDQoNCg0KDQoNCiMjIEFjdGl2aWRhZCAzMg0KDQpDb21wbGV0YSBsYSBzaWd1aWVudGUgdGFibGEgY29ycmVzcG9uZGllbnRlIGEgYWwgdGllbXBvLCBlbiBtaW51dG9zLCBxdWUgZGVtb3JhbiA2MCANCnRyYWJhamFkb3JlcyBlbiBsbGVnYXIgYSBzdSBjYXNhDQoNCiFbXShDb2xlZ2lvMzkuanBnKQ0KDQpgYGB7cn0NCiMgRGF0b3MgZGUgdGllbXBvIHkgZnJlY3VlbmNpYXMNCnRpZW1wbyA8LSBjKDMuNSwgMTAuNSwgMTcuNSwgMjQuNSwgMzEuNSkNCmZyZWN1ZW5jaWFzIDwtIGMoMjAsIDEzLCAxOCwgNSwgNCkNCg0KIyBDYWxjdWxhciBlbCB0aWVtcG8gcHJvbWVkaW8NCnByb21lZGlvIDwtIHN1bSh0aWVtcG8gKiBmcmVjdWVuY2lhcykgLyBzdW0oZnJlY3VlbmNpYXMpDQoNCiMgQ2FsY3VsYXIgbGEgbW9kYSAobG9zIHZhbG9yZXMgY29uIG1heW9yIGZyZWN1ZW5jaWEpDQptb2RhIDwtIHRpZW1wb1tmcmVjdWVuY2lhcyA9PSBtYXgoZnJlY3VlbmNpYXMpXQ0KDQojIENhbGN1bGFyIGxhIG1lZGlhbmENCm1lZGlhbmEgPC0gbWVkaWFuKHJlcCh0aWVtcG8sIGZyZWN1ZW5jaWFzKSkNCg0KYGBgDQoNCg0KYGBge3J9DQojIEltcHJpbWlyIHJlc3VsdGFkb3MNCmNhdCgiYS4gUmVzdWx0YWRvczpcbiIpDQpjYXQoIlRpZW1wbyBwcm9tZWRpbyBlbiBtaW51dG9zOiIsIHJvdW5kKHByb21lZGlvLCAyKSwgIm1pbnV0b3NcbiIpDQpjYXQoIk1vZGEgKHRpZW1wbyBtw6FzIGNvbcO6bik6IiwgbW9kYSwgIm1pbnV0b3NcbiIpDQpjYXQoIk1lZGlhbmEgKHRpZW1wbyBlbiBlbCBtZWRpbyk6IiwgbWVkaWFuYSwgIm1pbnV0b3NcblxuIikNCmBgYA0KDQpgYGB7cn0NCiMgQ3JlYXIgZ3LDoWZpY28gZGUgYmFycmFzDQpiYXJwbG90KGZyZWN1ZW5jaWFzLCBuYW1lcy5hcmcgPSB0aWVtcG8sIG1haW4gPSAiR3LDoWZpY28gZGUgQmFycmFzIGRlIEZyZWN1ZW5jaWFzIiwgeGxhYiA9ICJUaWVtcG8gKG1pbnV0b3MpIiwgeWxhYiA9ICJGcmVjdWVuY2lhIiwgY29sID0gInNreWJsdWUiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBQb3JjZW50YWplIGRlIHRyYWJhamFkb3JlcyBxdWUgdGFyZGFuIG3DoXMgZGUgMjEgbWludXRvcw0KcG9yY2VudGFqZV9tYXNfMjEgPC0gc3VtKGZyZWN1ZW5jaWFzW3RpZW1wbyA+IDIxXSkgLyBzdW0oZnJlY3VlbmNpYXMpICogMTAwDQpjYXQoImMuIFBvcmNlbnRhamUgZGUgdHJhYmFqYWRvcmVzIHF1ZSB0YXJkYW4gbcOhcyBkZSAyMSBtaW51dG9zOiIsIHJvdW5kKHBvcmNlbnRhamVfbWFzXzIxLCAyKSwgIiVcbiIpDQpgYGANCg0K