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:
- Cantidad de ganado vacuno en las provincias de la Mesopotamia
Argentina: Cuantitativa.
- Religión de los padres de familia de la comunidad educativa de una
escuela: Cualitativa.
- Ingresos de los trabajadores de la construcción: Cuantitativa.
- Cantidad de alumnos de las diferentes carreras de la Facultad de
Filosofía y Letras: Cuantitativa.
- Género femenino o masculino de los socios de un club:
Cualitativa.
- Estado civil de los habitantes de la ciudad de Rosario:
Cualitativa.
- Cantidad de películas nacionales estrenadas durante un año:
Cuantitativa.
- Color de cabello de los trabajadores de una empresa:
Cualitativa.
- 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:
Cantidad de hermanos: 0 hermanos (15), 1 hermano (18), 2 hermanos
(10), más de 2 hermanos (7).
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).
Precio promedio mensual del dólar: Año 2021 (167.875), Año 2022
(254.625), Año 2023 (446.714).
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).
Programa de televisión preferido entre las 20 hs y las 22 hs:
Programa A (20), Programa B (15), Programa C (10), Otro (5).
Marca de automóviles más vendidos en Argentina: Fiat Cronos
(4.183), Peugeot 208 (3.814), Toyota Hilux (2.957).
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
- ¿Cuál es la variable considerada en esta situación?
Clasificarla.
- Respuesta: Variable Cuantitativa Discreta
- Realiza una tabla de frecuencias.
Vacaciones_en_Exterior
0 1 2 3
15 8 14 3
- ¿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
- ¿Cuál es la variable considerada en esta situación?
Clasificarla.
- Realiza una tabla de frecuencias.
Elecciones_Barrio_Amanecer
A B C E L
25 15 5 2 2
- ¿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
- El presidente segun esta encuesta Sera Aníbal con el 51% de los
votos
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

- 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.
- Respuesta de Actividad 9 diagrama de barras de la actividad 4

- Respuesta de Actividad 9 diagrama de barras de la actividad 5

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.

Realiza un gráfico de barras.
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 
- ¿Cuál es el porcentaje de empleados que va en bicicleta?
- el porcentaje de empleado que va en bicicleta es del 12%
- ¿Cuál es el medio de transporte más utilizado? ¿y el menos
utilizado?
- El medio de transporte mas utilizado es el Auto y el menos utilizado
es el colectivo
- ¿Qué porcentaje de empleados usa moto o bicicleta? -El porcentaje de
empleados que usa moto o bicicleta es del 37%
- ¿Qué porcentaje no va en auto?
- el porcentaje de empleados que no va en auto es del 60%
- 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
- 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
- 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
- ¿Cuál fue la distancia que más se repitió en esta semana?
- La distancia que mas se repitio fue de 15km
- 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.
- Cantidad de horas extras mensuales trabajadas por 9 obreros. 40 25
36 12 40 25 40 32 38
- La moda de estos Datos es 25 y 40 por lo que es bimodal, A
continuación, se realizará el cálculo del promedio y la mediana
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
- Años de antigüedad en el trabajo de 8 profesores. 7 2 20 12 9 3 18
6
- Estos Valores no tiene un valor repetido, A continuación, se
realizará el cálculo del promedio y la mediana
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
- 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.

- ¿Cuántos alumnos estudian batería?
- 20 Alumnos Estudian Bateria.
- ¿Cuántos de los alumnos que estudian bateria tienen como mínimo 16
años?
- 11 Alumnos que estudian Bateria tiene al menos 16 años
- ¿Cuál es el porcentaje de los alumnos que estudian batería que
tienen entre 14 y 16 años?
- El porcentaje de alumnos que estudian bateria y tiene entre 14 y 16
años es del 55% del total
- 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?
- 36 alumnos de 17 vienen aprender Bajo.
¿Cuál es el promedio de edades de los estudiantes de bajo?
¿Coincide el promedio con la moda?
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")

El numero de Usencias mas frecuente de ese mes es de 2
Ausencias.
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.
- ¿Qué número salió más veces? ¿y menos?
- El numero dos salio mas veces(8) y el tres el que menos (4).
- ¿Qué número salió las mismas veces que su valor?
- ¿Cuántas veces salió un número menor que 5? ¿Y cuántas un número
mayor que 3?
- Salio 22 veces un numero menor a 5 y 18 veces mayor al numero
3.
- Calcula el promedio.
- 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 |
- Completa la siguiente tabla.

- ¿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.
- 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.
| [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
- Completa la siguiente tabla

- 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:

- ¿Cuántos empleados tiene la empresa?
- La emepresa Tiene un Total de 40 Empleados
- ¿Cuántos ganan menos de $3500? ¿Y más de $4000?
- 17 Empleados Ganan Menos de $3500 y 16 Empleados mas de $4000
- Trazar sobre el histograma el poligono de frecuencias.

- Completa la siguiente tabla.

- 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.
- 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.

Organiza los datos en una tabla de frecuencias con intervalos de
20 km/h de ancho.
Traza un histograma.
Calcula la velocidad promedio, la moda y la mediana.
Escribe una interpretación del significado de los parámetros
calculados.
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
- 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")

- 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
- 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