Carga y Limpieza de Datos

Cargando librerias

library(foreign)
library(ggplot2)
library(psych)
library(dplyr)
library(TSstudio)
library(forecast)
library(readr)
library(readxl)
library(ggmap)
library(lubridate)
library(xtable)
library(parallel)
library(stringr)

Cargando bases de datos

#Entregable 1
Carton_industry <- read.csv("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/Exporters of Carton boxes cases of corrugated paper or board 2020-2021.csv")
MX_automotive <- read_xlsx("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/mx_automotive_industry.xlsx")
Forecast_NorthAmerica_Prod<- read_xlsx("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/Forecast_IHS Automotive Light Vehicle Production.xlsx")
Exchange_rate<- read.csv("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/mx_exchange_rate.csv")
FORM_Ventas <- read_xlsx("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/FORM - Ventas.xlsx")
FORM_Rh_Datos <- read.csv("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/form_rh_datos.csv")
ventas <- read_xlsx("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/ventasok.xlsx") 

#Entregable 2
FORM <- read.csv("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/BDD_FORM_BAJAS_2023.xlsx - Base 2023.csv")
FORM_Integrado <- read.csv("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/FORM RH Tuneado.xlsx - RH All.csv")
FORM_2223 <- read_xlsx("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/FORM_2223.xlsx")
Bdatos<-read.csv("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/FORM_2223.csv")
FORMFlujo <- read.csv("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/RotacionBase.csv")
Bajas2223 <- read.csv("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/Base 22 23.csv")
p6_2022 <- read.csv("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/form_bajas_2022.csv")
p6_2023 <- read.csv("/Users/estefanyvillalobos/Desktop/RPortfolio/Evidencia 1/form_bajas_2023.csv")

  #Creando Dataframes propios
form_bajas_integradas <- FORM_Integrado
form_bajas_23 <- FORM

Limpieza de datos

form_bajas_23

#Rename de variables que pueden causar problemas (Correr solo una vez)
form_bajas_23 <- rename(form_bajas_23, Genero="Género")
form_bajas_23 <- rename(form_bajas_23, Numero="Número")
form_bajas_23 <- rename(form_bajas_23, Estado_Civil="Estado.Civil")
form_bajas_23 <- rename(form_bajas_23, Motivo.de.Baja="Motivo.de.Baja")

# Transformando valores chr a num
form_bajas_23$SD <- as.numeric(form_bajas_23$SD)

# Cambiando valores como "Soltero" y "Soltera" a uno solo siendo "Solteria" en 2023
form_bajas_23 <- form_bajas_23 %>%
  mutate(
    Estado_Civil = ifelse(Estado_Civil %in% c("Soltero", "Soltera"), "Solteria", Estado_Civil)
  )
# Cambiando valores como "Casado" y "Casada" a uno solo siendo "Matrimonio" en 2023
form_bajas_23 <- form_bajas_23 %>%
  mutate(
    Estado_Civil = ifelse(Estado_Civil %in% c("Casado", "casado", "Casada"), "Matrimonio", Estado_Civil)
  )

# Cambiando valores como "Ramos Arizpe" y "Ramoz Arizpe" a uno solo siendo "Ramos Arizpe" en municipio de 2023
form_bajas_23 <- form_bajas_23 %>%
  mutate(
    Municipio = ifelse(Municipio %in% c("Ramos Arizpe", "Ramoz Arizpe" ), "Ramos Arizpe", Municipio)
  )

form_bajas_integradas

# Rename
form_bajas_integradas <- rename(form_bajas_integradas, Motivo_de_Baja="MOTIVO.DE.BAJA")
form_bajas_integradas <- rename(form_bajas_integradas, Estado_Civil="ESTADO.CIVIL")
form_bajas_integradas <- rename(form_bajas_integradas, Salario="SALARIO.DIARIO.IMSS")
form_bajas_integradas <- rename(form_bajas_integradas, Dias_Laborados="DIAS.LABORADOS")

#Agrupando datos repetidos en varias variables
form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Costurero", "Costurera", "COSTURERA", "COSTURA"), "Costura", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Ayud. De Embarques", "Ayudante de Embarques", "Ayudante de embarques", "Auxiliar de Embarques"), "Ayudante de Embarques", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Ayudante de soldador", "Ayudante de Soldador"), "Ayudante de Soldador", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Ayudante general", "Ayudante General", "Ay. General", "AYUDANTE GENERAL"), "Ayudante General", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("CHOFER", "Chofer"), "Chofer", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Inspector de calidad", "Inspectora De Calidad", "INSPECTOR CALIDAD"), "Inspección de Calidad", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Gestor", "GESTOR"), "Gestor", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Guardia de Seguridad", "GUARDIA DE SEGURIDAD", "GUARDIA SEGURIDAD"), "Guardia de Seguridad", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Limpieza", "LIMPIEZA"), "Limpieza", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Montacarguista", "MONTACARGUISTA"), "Montacarguista", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Pintor", "PINTOR"), "Pintor", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Residente", "RESIDENTE"), "Residente", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("CUSTOMER SERVICE INF", "SERVICIO AL CLIENTE"), "Servicio al Cliente", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Soldador", "SOLDADOR"), "Soldador", PUESTO)
  )

form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    PUESTO = ifelse(PUESTO %in% c("Materialista", "MATERIALISTA"), "Materialista", PUESTO)
  )

# Cambiando valores como "Soltero" y "Soltera" a uno solo siendo "Solteria en 2022 y 2023
form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    Estado_Civil = ifelse(Estado_Civil %in% c("Soltero", "Soltera", "SOLTERIA"), "Solteria", Estado_Civil)
  )

# Cambiando valores como "Casado" y "Casada" a uno solo siendo "Matrimonio" en 2022 y 2023 
form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    Estado_Civil = ifelse(Estado_Civil %in% c("Casado", "casado", "Casada","MATRIMONIO", "MATRIOMONIO" ), "Matrimonio", Estado_Civil)
  )

# Cambiando valores como "UNION LIBRE" y "Union Libre" a uno solo siendo "Union Libre" en 2022 y 2023 
form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    Estado_Civil = ifelse(Estado_Civil %in% c("UNION LIBRE", "Union Libre" ), "Union Libre", Estado_Civil)
  )

# Cambiando valores como "FEMENINO" y "Femenino" a uno solo siendo "Union Libre" en 2022 y 2023 
form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    GENERO = ifelse(GENERO %in% c("FEMENINO", "Femenino" ), "Femenino", GENERO)
  )


# Cambiando valores como "MASCULINO" y "Masculino" a uno solo siendo "Union Libre" en 2022 y 2023 
form_bajas_integradas <- form_bajas_integradas %>%
  mutate(
    GENERO = ifelse(GENERO %in% c("MASCULINO", "Masculino" ), "Masculino", GENERO)
  )

FORMFlujo

#Quitar columna
FORMFlujo <- subset(FORMFlujo, select = -X)

#Quitar/eliminar NAs
FORMFlujo <- na.omit(FORMFlujo)

#Renombrar variables por practicidad
FORMFlujo <- FORMFlujo %>% rename(Fecha = YYYYMMM, A=ALTAS, B=BAJAS, EmpI=INICIAL, EmpF=FINAL)

#NuevaFecha
FORMFlujo <- FORMFlujo

Bajas2223

Bajas2223 <- Bajas2223[-238, ]

Bajas2223[39,3] <- "FEMENINO"

  
# Capitalizar correctamente las variables
Bajas2223$NombreCompleto <- str_to_title(Bajas2223$NombreCompleto)
Bajas2223$GENERO <- str_to_title(Bajas2223$GENERO)


# Unificar clasificaciones de Estado Civil
Bajas2223$ESTADO.CIVIL[Bajas2223$ESTADO.CIVIL %in% c("Casada","Casado","casado","MATRIMONIO","MATRIOMONIO")] <- "Matrimonio"
Bajas2223$ESTADO.CIVIL[Bajas2223$ESTADO.CIVIL == "DIVORCIO"] <- "Divorcio"
Bajas2223$ESTADO.CIVIL[Bajas2223$ESTADO.CIVIL %in% c("Soltera","SOLTERIA","Soltero")] <- "Solteria"
Bajas2223$ESTADO.CIVIL[Bajas2223$ESTADO.CIVIL == "UNION LIBRE"] <- "Union Libre"

#rellenar espacios en blanco 
Bajas2223$ESTADO.CIVIL <- ifelse(Bajas2223$ESTADO.CIVIL == "", "No Especificado", Bajas2223$ESTADO.CIVIL)

FORM

f_bajas <- FORM %>% 
  select("Nombre", Motivo="Motivo.de.Baja", "CausaBaja", "CausaBajaSub")
bajas_especifico <- f_bajas %>%
  filter_all(all_vars(. != "No especificado"))

FORM 2223

baja_años <- FORM_2223 %>% 
  select(motivo = "MOTIVO DE BAJA", año = "MonMesB") %>%
  arrange(año) %>%
  filter(grepl("22$|23$", año)) %>%
  mutate(año = sub(".*-(\\d{4})", "\\1", año)) %>%
  group_by(motivo)
bajas_categorias <- group_by(f_bajas, Motivo)
bajas_categorias2 <- group_by(f_bajas, CausaBaja)

Bdatos

dep_bajas <- Bdatos %>% 
  select("DEPARTAMENTO", "MonMesB")
bajas_departamento <- dep_bajas %>%
  filter_all(all_vars(. != "No especificado"))

p6_2022 y p6_2023

p6_2022_2 <- p6_2022%>%
  select(APELLIDOS,NOMBRE,FECHA.DE.ALTA,FECHA.DE.BAJA,MOTIVO.DE.BAJA,PUESTO)
p6_2023_2 <- p6_2023%>%
  select(Apellidos,Nombre,Fecha.de.Alta,Fecha.de.Baja,Motivo.de.Baja,Puesto)
p6_2022_2<- p6_2022_2%>%
  rename(Apellidos= APELLIDOS,
         Nombre= NOMBRE,
         Fecha.de.Alta= FECHA.DE.ALTA,
         Fecha.de.Baja=FECHA.DE.BAJA,
         Motivo.de.Baja=MOTIVO.DE.BAJA,
         Puesto=PUESTO)

p6_mal<- bind_rows(p6_2022_2, p6_2023_2)

p6_mal[p6_mal == ""] <- NA
filas_sin_valores_en_blanco <- complete.cases(p6_mal)

p6 <- p6_mal[filas_sin_valores_en_blanco, ]

Análisis de Cualitativo de FORM

Antecedentes de FORM

Misión

Transformar nuestro entorno y resolver retos industriales de nuestros clientes a través de la colaboración, provocando nuevas oportunidades que potencian nuestro modelo de negocio, para alcanzar nuestros ideales.

Visión

Ser una de las cinco mejores compañías de México que generan valor dentro de la cadena de suministro de las industrias que más valoran la forma en la que se protegen y trasladan las cosas.

Objetivos Estrategicos

  • Automatización de la producción para disminuir el impacto de la rotación y mitigar costos.

  • Tomar más decisiones con datos, implementar el nuevo RP y aprovechar sus ventajas para la programación de producción y la anticipación de la demanda.

  • Disminuir la rotación en el área de recursos humanos al implementar acciones para incrementar el sentido de pertenencia y diseñar un perfil estratégico por puesto con la finalidad de aumentar la retención del personal de piso de producción.

  • Incrementar la presencia de negocios en Estados Unidos para posicionarse de manera financieramente rentable en la zona de San Antonio. Para un crecimiento exponencial, desarrollar maquiladores con los cuales FORM pueda suplir la alta demanda de soluciones de empaque.

  • Incrementar la presencia de negocios en Estados Unidos para posicionarse de manera financieramente rentable en la zona de San Antonio.

  • Para un crecimiento exponencial, desarrollar maquiladores con los cuales FORM pueda suplir la alta demanda de soluciones de empaque.

  • Distinguirse en la industria por el valor competitivo que proveen sus soluciones de ingeniería diferenciadas.

  • Tecnificar producción: quieren triplicar producción con lo que tienen.

  • Tomar decisiones con datos: uso de materiales, anticipación de la demanda, compra de materiales

  • Recursos humanos: generar sentido de pertenencia (gente en piso)

Analisis de la empresa

En base a la reunión con el socio formador se pudo diagnosticar el estado de las áreas de la empresa así como sus principales funciones:

Recursos humanos

  • Cultura horizontal, no ofrecen crecimiento hacia arriba, manejan una construcción de negocio hacia abajo lo cual permitirá crecimiento a sus empleados a medida que la empresa crece.

  • Están trabajando en mejorar los perfiles de puestos. Si sabe cuales son sus 20 mejores empleados, quiere identificar lo común para generar el perfil ideal para el reclutamiento.

  • Forma de reclutamiento: Facebook y lona en el parque industrial

  • 2 crisis de clima organizacional

  • Cuentan con un fondo de ahorro para sus empleados.

  • Prestaciones adicionales suelen ser personalizadas dependiendo de las necesidades del empleado y el interés en el prospecto.

  • Hoy en día Forms tiene buen clima organizacional, pero se busca lo mismo en piso

  • Actualmente, la empresa cuenta con 130 empleados activos: 30 administrativos y 100 operativos.

Comercialización

  • Su portafolio de comercialización se basa en clientes internacionales con filiales en México.

  • No venden a clientes coreanos (choque cultural) ni mexicanos (mala paga).

  • Buscan ser la empresa más rentable, por eso buscan proyectos donde el cliente valore el empaque y el servicio.

  • Su propuesta de valor es con base en la flexibilidad, cortos tiempos de respuesta y excelente servicio al cliente.

  • Su servicio se enfoca fuertemente en la calidad, comunicación y anticipación de las necesidades del cliente para proteger la confianza.

  • Trabajan con órdenes de compra abierta lo cual permite flexibilidad.

  • Canal de venta en redes sociales: LinkedIn. Este medio es utilizado para la promoción de los proyectos de la empresa y para la atracción de nuevos clientes.

  • Su ciclo de conversión de efectivo a partir de la entrega del producto varía dependiendo del cliente entre 25, 30, 45 y 50 días. Los ciclos arriba de estos no son clientes convenientes para la empresa.

  • Área de oportunidad en comercial: Crear un sistema de Inteligencia Comercial (San Antonio, Bajío, Monterrey-Saltillo) y diversificación (¿qué otras industrias?)

  • Sus principales clientes son Tesla, DENSO, FORVIA, Draexlmaier, Stabilus, y Plastic Omnium.

Manufactura

  • Se enfoca en la ideación y manufactura de empaque para autopartes interiores (vistas cromadas, pantallas, acabados, decoración en puertas, consolas, tableros)

  • Cuenta con centros de distribución en Apodaca (producen y almacenan), Saltillo y San Antonio, Texas.

  • En la planta de Apodaca se acopia, almacena y desde allí salen los productos.

  • Diseñan, producen, entregan, cuidan, pero no arman el empaque de cartón con la finalidad de aprovechar el espacio del flete.

  • Cuentan con una fuerza de transporte de 3 camiones que transportan a plantas del cliente y Saltillo.

  • Empaque retornable (por ocasiones): máx 25%-10% muy fluctuante.

  • Empaque no retornable (constante): 90%

  • Muy bajas mermas, no es un tema insignificante. Los sobrantes del cartón los compactan y venden para su reciclaje (cartón virgen). Aparte del cartón, utilizan textiles, plástico corrugado, racks metálicos, dunnages, foams, recubrimientos especializados y antiestáticos para sus empaques retornables.

  • Sus líneas de producción manejan un modelo de bloques productivos aumentando la flexibilidad e independencia de los diferentes procesos y servicios al cliente.

Consultoría en Ingeniería de Empaque

  • Equipo de ingenieros que se enfocan en el desarrollo de proyectos de eficientización.

  • Se encarga de desarrollar e implementar tecnologías y procesos que permitan la mejora continua del servicio al cliente.

Ventas anuales

ggplot(FORM_Ventas, aes(x= Year, y= Sales, fill= Year)) + geom_bar(stat="identity", width=-.5) + ggtitle("Ventas anuales de FORM") + xlab("Año") + ylab("Pesos") + theme_minimal()

Ventas anuales
Con esta gráfica podemos ver que FORM ha disfrutado un crecimiento en sus ventas desde el 2019, que es el año cuando deciden hacer un cambio de enfoque hacia la solución de empaques, en el año 2022 se esperó llegar a $110,000,000 en ventas y en septiembre del mismo año tenían aproximadamente $82,000,000.

División de genero de los empleados de FORM y sus puestos

genero <- group_by(FORM_Rh_Datos, GENERO, PUESTO) #Group_by para hacer una gráfica con genero y puestos de FORM
genero <- summarize(genero, conteo=n()) #Sacando un conteo para visualizar los datos

ggplot(genero, aes(x= GENERO, y=conteo, fill= PUESTO)) + geom_bar(stat="identity", width=-.5) + ggtitle("División de genero de los empleados de FORM") + xlab("Genero") + ylab("# de empleados") + theme_minimal()

#Creaciónd e gráfica de barras con el fin de comparar la cantidad de empleados por genero y sus respectivos puestos.

División de genero de los empleados de FORM y sus puestos
Se puede observar como las mujeres forman la mayoría del personal de FORM, el puesto con más personal en general es “Ayudante General”.

División de genero de los empleados de FORM y su estado civil

estado_civil <- rename(FORM_Rh_Datos, EstadoCivil="ESTADO.CIVIL") #Rename de la variable "ESTADO CIVIL", ya que causaba problemas
estado_civil <- group_by(estado_civil, GENERO, EstadoCivil) #Group_by para hacer una gráfica con genero y estado civil de FORM
estado_civil <- summarize(estado_civil, conteo=n()) #Sacando un conteo para visualizar los datos

ggplot(estado_civil, aes(x= GENERO, y=conteo, fill= EstadoCivil)) + geom_bar(stat="identity", width=-.5) + ggtitle("División de genero de los empleados de FORM") + xlab("Genero") + ylab("# de empleados") + theme_minimal()

#Creaciónd e gráfica de barras con el fin de comparar la cantidad de empleados por genero y sus estados civiles.

División de genero de los empleados de FORM y su estado civil
En el caso del personal de FORM, podemos ver que en los hombres el grupo de estado civil más común es el matrimonio, mientras que en el caso de las mujeres el grupo de estado civil más común es soltería.

Desempeño Reciente

FORM es una empresa líder en soluciones innovadoras y sustentables para el empaque especializado de autopartes en el sector industrial. Desde su creación en 2009, la empresa ha sido reconocida numerosas veces a nivel internacional y nacional ganando 7 veces el Premio Nacional de Envase en los años 2010, 2014, 2015, 2016, 2017, 2019 y 2022, reporta El Economista (2022). FORM lleva años siendo tema de conversación en noticieros debido a su gran disruptividad en la industria del empaque, el economista comenta “en los últimos cinco años la empresa llegó a crecer hasta el doble… y lograron mantener sus niveles de venta” (2022)

El Economista
  • El periodico El Economista (2022) reconoció en su reportaje diversos logros de FORM como su reconocimiento al Premio Nacional de Envase en diversas ocasiones y la certificación de la empresa en estándares de calidad con el ISO 9000-2015. A su vez, el periodico también reconoció el compromiso de la PyMe con el servicio al cliente a través de sus proyectos de inversión en logística para el control de entregas al cliente.
Cluster Industrial
  • La sección de noticias del Cluster Industrial de Nuevo León realizó a finales de 2022 una entrevista con el CEO de FORM y reconoció la capacidad de respuesta de la empresa como uno de los factores de su rápido éxito. El artículo tiene como finalidad difundir las actividades de FORM ante su relevancia internacional como proveedor mexicano de TESLA.
El Financiero
  • Este importante periodíco digital dedicó un artículo para reconocer el plan de expansión de FORM a Estados Unidos para crecer como una empresa internacional para satisfacer la demanda de sus clientes. (Cepeda, 2023)

En general, FORM es percibida como una empresa mexicana de rápido crecimiento y alta innovación en los medios de comunicación evaluados. La empresa es retratada de forma positiva como un ejemplo a seguir en el nicho de los empaques de cartón mexicanos para el sector automotriz.

Contexto de la Industria

Industria de Cartón

En México la industria de cartón corrugado es una que cuenta con 1,091 millones de dólares en intercambio comercial, que se compone por 295 millones de dólares en ventas internacionales y $796 millones de dólares en compras internacionales. (Data México, 2023)

El estado de Nuevo León se encarga del 10.8% de las ventas internacionales, donde un 95.5% de la exportación es hacia Estados Unidos, a la vez el 89.2% de las compras de cartón son de Estados Unidos y un 8.65% siendo a China. (Data México, 2023)

En cuanto el uso del cartón en el empaque de autopartes es necesario recalcar que se utilizan diversos materiales para reforzar la calidad del empaque en consideración a la especificación del cliente, siendo con plástico corrugado, foams, termoformados, entre otros textiles.

Trade Value del Cartón en Norteamérica

NorthAmerica_Carton <- filter(Carton_industry,Continent=="North America") #Filtro para aislar los datos de Norteamérica
NorthAmerica_Carton <- rename(NorthAmerica_Carton, Trade_Value="Trade.Value") #Renombrando una columna que causa dificultades
NorthAmerica_Carton <- filter(NorthAmerica_Carton, Country %in% c("United States", "Mexico", "Canada", "Guatemala", "El Salvador")) #Filtro para aislar los datos de los top 5 paises de Norteamérica en Trade Value

ggplot(NorthAmerica_Carton, aes(x= reorder(Country, Trade_Value), y= Trade_Value, fill= Country)) + geom_bar(stat="identity", width=-.5) + ggtitle("Tradue Value de la industria del Cartón 2021 en Norteamérica") + xlab("País") + ylab("Trade Value") + theme_minimal()

# Creación de gráfico para representar los datos de Norteamérica en la industria del cartón.

Trade Value del cartón en Norteamérica
Se puede observar que la industria del cartón en Norteamérica es una en donde Estados Unidos es el líder en cuanto a trade value, refiriéndose a una cantidad en dólares igual al precio por acción multiplicado por el número de acciones ejecutadas.

Ventas del cartón 21/22

ventas$Mes <- months(as.Date(ventas$Mes), abbreviate=TRUE)

ggplot(data = ventas, aes(x = factor(Mes, level= c("Jan", "Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")), y = Carton, group = Año, colour=Año)) + geom_line() + geom_point() + ggtitle("Venta de cartón entre 2021 y 2022") + xlab("Mes") + ylab("Ventas")

# Creación de gráfico para representar los datos y comportamiento de las ventas de cartón entre 2021 y 2022.

Las ventas del cartón muestran un comportamiento similar en dos meses, siendo febrero y julio, mientras que en meses como agosto y septiembre se nota un cambio muy tangible en las ventas.

Industria de Autopartes

México

La industria de autopartes proyecta un crecimiento anual de 5% en 2023 en México. Esto es casi ocho puntos porcentuales debajo de la estimación del 2022, que era de 13%. Esto está relacionado con el impacto que podrían generar las condiciones económicas que enfrenta Estados Unidos. (El Economista, 2023)

Durante 2022 la industria tuvo una producción total de 107,329 millones de dólares, lo que representó un incremento de 13.35 % en relación con 2021. La Industria Nacional de Autopartes (INA), menciona que esta tendencia de crecimiento se mantuvo en el primer trimestre de 2023 (4.73%) y proyectando así un cierre de 112,702 millones de dólares para finales de diciembre. (Pineda, 2023)

Las principales regiones productoras de autopartes en México son la zona Norte, zona Bajío y la zona Centro. La Fabricación de Partes para Vehículos Automotores recibió 1,375.6 millones de dólares. (Pineda, 2023)

En relación con el fenómeno de nearshoring, se estima que el 37% de la inversión recibida corresponde a la Fabricación de Autopartes. Acerca del nearshoring en México, el 40% proviene de China, el 20% de Estados Unidos, el 11% de Japón y el 9% de Alemania. (Pineda, 2023)

Es importante mencionar que Nuevo León se ha consolidado como el tercer mayor productor de autopartes en México, y se está acercando a la segunda posición que es el estado de Chihuahua.

Amenazas
  • Dependencia económica de Estados Unidos
  • Variabilidad en la demanda internacional
  • Competencia internacional
Oportunidades
  • Crecimiento constante
  • Nearshoring
  • Diversificación de mercados
  • Posición en la región

US

México es el proveedor más importante de autopartes para Estados Unidos, supera a China, Canadá, Japón y Alemania. (MexicoIndustry, 2021)

Lo importante es analizar la economía estadounidense, porque mientras siga siendo un gran consumidor de automóviles y su economía se mantenga, la industria automotriz mexicana se mantendrá. (MexicoIndustry, 2021)

Amenazas
  • Cambios en políticas
Oportunidades
  • Crecimiento continuo de la industria automotriz
  • Diversificación de mercados

Industria Automotriz

México

Datos del Instituto Nacional de Estadística y Geografía (INEGI) refieren que en 2022 se produjeron 3,308,346 unidades en México, reflejando un incremento de 9.2 % en relación al 2021. Al momento de hablar de ventas, en el 2022 se comercializaron 1,086,058 vehículos ligeros en el mercado interno, lo que representó un aumento de 7.03% en relación con 2021, cuando se comercializaron 1,014,735 unidades.

Hasta el primer trimestre de 2023, en México se produjeron 922,177 vehículos ligeros, un aumento de 8.61% en relación con el año 2022. En exportaciones, durante el periodo enero-marzo de 2023 México envió al extranjero 741,306 unidades, lo que representó un incremento de 8.86% en relación con el mismo periodo de 2022, cuando se exportaron 680,992 unidades.

Alberto Bustamante, director general de INA, mencionó que el pronóstico de producción de vehículos ligeros para 2023 rondará los 3.5 millones de vehículos, es decir, un incremento de 5.6 % en comparación con 2022.

Así mismo, se mencionó que en el 2024 se espera un incremento importante y mayor a los últimos años. Se espera que sea más de 8% para cerrar con una producción de 3.78 millones de vehículos ligeros, y al cierre de 2025 llegar a los 4,000,000 de vehículos producidos en México.

Con relación a la inversión en el sector automotriz, en el 2022, la Fabricación de Automóviles y Camiones recibió una inversión extranjera directa de 2,705.4 millones de dólares.

Producción de autos
Top10Forecast <- rename(Forecast_NorthAmerica_Prod, Total_Vehicles ="total Vehicles", Production_Name="Production Nameplate", Brand="Production Brand") #Rename de la variables, ya que causan problemas
Top10Forecast <- arrange(Top10Forecast, desc(Total_Vehicles)) #Cambiando orden del dataframe para mostrar los valores más altos
Top10Forecast <- slice_head(Top10Forecast, n=10) #Aislando solo los 10 resultados más altos

ggplot(Top10Forecast, aes(x= reorder(Production_Name, Total_Vehicles), y= Total_Vehicles, fill = interaction(Brand, Country))) + 
    geom_bar(stat="identity", width=-.5) + 
    ggtitle("Cantidad total de los modelos de autos más producidos en Norteamérica") + 
    xlab("Modelo") + ylab("Cantidad") + theme(axis.text.x = element_text(angle = 90, hjust = 1))

# Creación de grafico para representar los datos de Norteamérica en la producción de modelos de autos.

Se puede ver que existen modelos de auto con una gran demanda de producción en Norteamérica, dos de ellos siendo producido en México, siendo el Volkswagen Jetta en Puebla y el Jeep Compass en Toluca. En Estados Unidos podemos ver que se producen ambos de los carros con mayor cantidad de unidades, siendo el Honda Accord en Marysville y el Toyota Camry en sus 2 plantas de Georgetown.

Amenazas
  • Dependencia de la exportación
  • Competencia global
  • Vulnerabilidad a cambios en políticas comerciales
Oportunidades
  • Crecimiento de la producción y exportaciones
  • Inversión extranjera directa
  • Diversificación de productos
  • Colaboración en investigación y desarrollo
  • Crecimiento económico

US

Es una de las principales industrias automotrices del mundo, contribuye con al menos el 3% del Producto Interno Bruto (PIB) general del país. El país ha fabricado cerca de 8,82 millones de vehículos en 2020, cerca de un 19% menos que el año anterior. (Informe Del Mercado Automotriz de América Del Norte | Tamaño, Participación, Crecimiento Y Tendencias (2022-27), 2022)

El gobierno, de igual forma se encuentra apoyando la investigación y el desarrollo de vehículos eléctricos en forma de asignaciones anuales a la Oficina de Eficiencia Energética y Energía Renovable (EERE). (Informe Del Mercado Automotriz de América Del Norte | Tamaño, Participación, Crecimiento Y Tendencias (2022-27), 2022)

Ford, General Motors, Fiat-Chrysler son algunos de los actores importantes en la industria automotriz de América del Norte. Esta industria estuvo dominada anteriormente por los tres grandes, General Motors, Chrysler y Ford. Hoy en día Ford, General Motors, Fiat-Chrysler son algunos de los actores importantes. (Informe Del Mercado Automotriz de América Del Norte | Tamaño, Participación, Crecimiento Y Tendencias (2022-27), 2022)

Amenazas
  • Disminución en la producción
  • Competencia global
Oportunidades
  • Innovación tecnológica
  • Diversificación de la cartera
  • Exportaciones

Precio del dolar

mx_exchange_rate <- ts(Exchange_rate$mx_exchange_rate, frequency=12, start=c(2017,1)) #Adaptación del dataframe para hacer una serie de tiempo
plot.ts(mx_exchange_rate, main="MX - USA Exchange Rate", xlab = "Years", ylab = "Exchange Rate")

# Creación de serie de tiempo para representar la variación del peso y dólar por los años.

Podemos ver que en años recientes el valor del peso mexicano contra el dólar ha sido muy volátil, esto se debe a que el gobierno de Estados Unidos ha continuado elevando las tasas de intereses, haciendo su economía menos segura y la de México más segura en comparación para los inversionistas en comparación.

En la visualización se muestra como el peso mexicano se ha ido apreciando paulatinamente de 2022 a 2023, esto si bien puede resultar favorable para la economía mexicana, para empresas con operaciones en Mexico (producción) y Estados Unidos (comercialización) como FORM, esto resulta en un incremento en los costos de producción y un valor menor percibido de ventas, lo cual ocacionará que los margenes de la compañía se reduzcan o bien, sus precios al cliente incrementen.

FODA Cruzado

Fortalezas

Departamento de ingeniería para la innovación continua en el empaque de auto partes internas

  • FORM ha sido reconocido en diversas ocasiones como acreedor del Premio Nacional de Envase (El Economista, 2022)

Buena reputación con sus clientes

  • La estrategia de FORM consiste en un destacado servicio al cliente; la empresa se diferencia al tener excelentes tiempos de respuesta y soluciones innovadoras para las necesidades de sus clientes fomentando una comunicación directa y anticipando la demanda.

Empresa con alta rentabilidad debido a su selectividad de clientes

  • FORM hace negocios solo con clientes que prioricen calidad y relaciones duraderas sobre precio.

Flexibilidad de producción

  • La empresa trabaja con bloques de producción en lugar de líneas debido a que permite mayor independencia de los procesos, resulta más sencillo de capacitar personal y disminuye probabilidades de incumplimiento con el cliente.

Flotilla de camiones propia

  • FORM da el extra con el servicio a sus clientes y se encarga del transporte del producto hasta las plantas del cliente. La empresa cuenta actualmente con una flotilla de 3 camiones los cuales le permiten una eficiencia en costos.

Debilidades

Falta de una estrategia de Inteligencia Comercial

  • En comparativa a sus competidores, FORM al ser una empresa mediana con pocos años en la industria no cuenta con una estrategia de inteligencia comercial. La empresa no tiene sistemas de manejo y procesamiento de datos para la toma de decisiones. Su ERP software será cambiado a partir de Enero 2023 para dar un paso a la transformación digital del registro de la información.

Alta dependencia del CEO

  • FORM a diferencia de sus competidores es altamente dependiente de las ideas, imagen y esfuerzos de negociación de Felipe Flores (CEO) para su funcionamiento. FORM tiene en LinkedIn menos de 300 seguidores mientras que su CEO cuenta con arriba de 2000 (LinkedIn, 2023). A futuro la empresa requiere crear departamentos encargados de estos procesos, construir una imagen independiente y transmitir la visión y valores del Empresario.

Limitaciones en alcance de distribución en Estados Unidos

  • Debido a los altos costos de los fletes en EE.UU. actualmente FORM solo realiza entregas locales en los alrededores de su centro de distribución en San Antonio.

Alta rotación del personal en piso

  • FORM cuenta con una altísima rotación en piso, un gran porcentaje de sus empleados solo duran un corto periodo de tiempo antes de irse y no dar explicaciones.

Oportunidades

Oportunidades en otras industrias con alto valor del cartón

  • El cartón es un material de empaque muy valorado en las industrias correctas, no solo por su versatilidad pero también por su sustentabilidad. Industrias como la médica y aeroespacial son algunas de las cuales valoran y requieren empaques de cartón o retornables con alto nivel de ingeniería para la protección al traslado de componentes.

Necesidad de agilización de la cadena de suministros del sector automotriz

  • Las cadenas de suministro del sector automotriz aún no están 100% recuperadas del impacto que tuvo el colapso de esta en el año 2021 (Escudero, 2022). Las amenazas de futuras disrupciones siguen latentes, es por ello que el sector automotriz le pone énfasis a la eficientización de la cadena de diferentes formas, una de estas es el empaque de calidad para el traslado de autopartes. En términos del nearshoring, las empresas buscan soluciones de empaque convenientes en tiempos, costos y ubicación.

Incremento en la demanda de autos híbridos y eléctricos

  • De acuerdo con cifras oficiales del Inegi, en 2021 la venta de vehículos híbridos presentó un incremento del 126% en comparación al año anterior. La demanda de estos, aumentó en 50% en el mismo periodo (González, 2022). En Estados Unidos, la consultora EY estima que para 2023, el 43% de las transacciones en el país serán representadas por este tipo de vehículos (2023). Estas cifras denotan la alta demanda de autos eléctricos y por consiguiente, empaques especializados para el transporte de las autopartes.

Nearshoring en México

  • El nearshoring es la tendencia del movimiento de partes de la cadena de suministro a ubicaciones estratégicas con la finalidad de reducción de costos e incrementar la eficiencia. México es un país altamente beneficiado por esta tendencia debido a su ubicación estratégica, tratados de libre comercio, mano de obra calificada y costos laborales competitivos (Prysmex, 2023). Sin embargo, el mayor beneficiado es Nuevo León, Forbes reporta que el estado ha captado “el 72% de las empresas atraídas a México por el nearshoring” (Hernández, 2023).

Amenazas

Interrupciones en el suministro de petróleo afecta los costos de la logística y la inflación

  • Las fuertes interrupciones en la cadena de suministro del petróleo ruso por el actual conflicto político y social de la nación ha afectado los precios del combustible significativamente en Estados Unidos y Europa. EE.UU. importa alrededor del 21% de su petróleo refinado de Rusia (OEC, 2023) impactando fuertemente en la inflación de los precios del combustible y la logística. The Logistics World, mencionó que este aumento ocasionó un declive en el consumo regional de gasolina del 1%, aproximadamente 1 millón de barriles al día (Juarez, 2022).

Competidores internacionales con mayor capacidad productiva

  • FORM, de acuerdo con el CEO, se enfrenta en la industria internacional de soluciones de empaque de cartón para el sector automotriz con competidores bien establecidos, más antiguos y de renombre como lo son Río Grande, Bradford, ORBIS, HELSA, Versatech, conTeyor, Victory Packaging (2023). Estos a su vez debido a la implementación de economías de escala y automatización logran ofrecer al cliente precios más bajos.

Volatilidad en la tasa de cambio (USD - MXN)

  • Debido a las decisiones tomadas por la Reserva Federal de Estados Unidos en subir las tasas de interés para desacelerar la economía, muchos inversionistas están buscando economías con condiciones bancarias más favorables como México (Rivera, 2023). El MXN desde el primer trimestre del año se ha estado apreciando en comparación al USD, sin embargo las fluctuaciones de la tasa de cambio son un factor que afecta a las empresas como FORM con ventas en USD y producción(costos) en MXN.

Elecciones dobles en EE.UU. y México

  • En 2024 se llevarán a cabo elecciones tanto en Estados Unidos como en México, este es un suceso el cual representa un riesgo para la estabilidad de ambos países tanto económica como social. Las elecciones pueden traer consigo diferentes paradigmas de los líderes en las relaciones comerciales entre México y EE.UU. así como inestabilidad en la tasa de cambio.

Escasez de mano de obra en Nuevo León

  • La Cámara de la Industria de la Transformación (CAINTRA) reportó que el 43.8% de las empresas del estado están siendo afectadas por la falta de personal capacitado y especializado (Hernández, 2023). Con las tendencias del Nearshoring, la demanda por profesionales especializados está en aumento en Nuevo León. De acuerdo con Forbes, “en ese momento 13.4% de las compañías reportaron afectaciones por no encontrar trabajadores para las fábricas y líneas de producción” (Hernández, 2023).

FODA Cruzado - Imagen

Estrategias FODA

Estrategias Mini - Maxi

  • Ante la amenaza de competidores internacionales con precios más competitivos, FORM debe de acentuar su diferenciación a través del servicio al cliente. La empresa actualmente se desarrolla por su rápida responsividad y anticipación a la demanda del cliente logrando adquirir un portafolio reducido de clientes leales. Si esto se replica a mayor escala la empresa no tendrá problema al competir con empresas internacionales.

  • FORM puede evitar afecciones en su producción por la falta de mano de obra especializada en Nuevo León debido a su modelo de producción. Gracias a su producción en bloques, FORM puede capacitar empleados rápidamente para qué desempeñen diferentes tipos de funciones.

Estrategias Mini - Mini

  • Llevar a cabo un proyecto de Inteligencia Comercial para el registro de datos claves que mejoren los esfuerzas de ventas de la empresa y a su vez permitan independizar las estrategias del CEO. A través del uso de la analítica de datos, la empresa podrá reducir sus costos logísticos y mitigar el efecto de los altos costos de fletes en Estados Unidos al vender a clientes estratégicos.

Estrategias Maxi - Maxi

  • Aprovechar las oportunidades que trae el Nearshoring para explorar en otras industrias como el sector aeroespacial y componentes médicos a través de su departamento de innovación en procesos de ingeniería. Si FORM utiliza su equipo de ingenieros de forma eficiente, puede desarrollar soluciones de empaque innovadoras y valoradas por estas industrias y distribuirlas a las filiales de las empresas en México.

Estrategias Maxi - Mini

  • FORM puede aprovechar la gran tendencia del Nearshoring para aumentar su portafolio de clientes y expandir sus operaciones a través de maquiladoras que se encarguen de la producción de los empaques en base a los estándares y patentes de FORM. De esta forma la empresa no es tan dependiente de su rotación de personal para el cumplimiento con el cliente, y puede distribuir a más empresas estratégicamente posicionadas por las tendencias del Nearshoring y enfocarse en construir relaciones duraderas con estos.

PESTLE

Factores políticos

Acuerdos Internacionales

  • El TMEC incluye medidas para reducir las barreras arancelarias y no arancelarias, fomentar la libre circulación de bienes, servicios e inversiones, proteger los derechos de propiedad intelectual y fortalecer los derechos laborales y la protección del medio ambiente.

Eficacia gubernamental (-2,5 débil; 2,5 fuerte)

  • México: -0.31
  • EUA: 1.34

Corrupción

  • México: Ahora ocupa la posición 124 de 180 países evaluados.
  • EUA: Ahora ocupa la posición 27 de 180 países evaluados.

Protección a la inversión

  • México: México ha suscrito 32 Acuerdos para la Promoción y Protección Recíproca de las Inversiones (APPRIs)
  • EUA: En la Encuesta Coordinada sobre la Inversión Directa más reciente se observa que la posición de Estados Unidos aumentó USD 506.000 millones, u 11,3% , el año pasado.

Factores económicos

Tasa de desempleo

  • México: La tasa de desempleo de México alcanza 2.9% en mayo: Inegi.
  • EUA: La tasa de paro se situó en el 3,6%, también cerca de los mínimos en medio siglo, que se alcanzaron en abril con un 3,4%

Inflación

  • México: La inflación acumulada en 2023 es del 1,9%.
  • EUA: La inflación acumulada en 2023 es del 3%.

Tasa de cambio

  • 1 dólar = 17.02 pesos

Impuestos

  • México: En el caso de las personas naturales, la tasa va desde el 8% hasta el 30%, mientras que para las empresas la tasa es del 29.5%.
  • EUA: 24% para ingresos superiores a $95,375. 22% para ingresos superiores a $44,725. 12% para ingresos superiores a 1,000. 10% para ingresos inferiores a 1,000.

Factores sociales

Calidad de vida

  • México: México ocupa la posición número 4 en el ranking de países con mayor calidad de vida en América Latina
  • EUA: Estados Unidos se encuentra en buen lugar, ya que ocupa el puesto número 21 del ranking de desarrollo humano(IDH).

Nivel de ingresos

  • México: El ingreso laboral real per cápita tuvo un incremento anual de 1.4%, al pasar de $2,769.23 a $2,807.49
  • EUA: El ingreso medio por hogar en Estados Unidos fue de 70.784 dólares en 2021.

Número de habitantes

  • México: 129 millones
  • EUA: 335 millones

% de población con vehículos

  • México: 27%
  • EUA: 67%

Factores tecnológicos

Acceso a internet

  • México: 75%
  • EUA: 92%

Nivel de innovación

  • México: México desciende tres posiciones en el ranking global y se queda en el número 58.
  • EUA: Los Estados Unidos ascienden a la 2. posición

Infraestructura

  • México: México ocupa el lugar 65 en calidad de infraestructura
  • EUA: Los Estados Unidos ascienden a la 2.

Uso de energías renovables

  • México: México generó el 31.2% de electricidad a partir de fuentes renovables, un incremento de 1.7 puntos porcentuales respecto al 29.5% del año previo.
  • EUA: La eólica y la solar proporcionaron el 16,1% de la generación eléctrica de EE. UU. en los dos primeros meses de 2023

Factores legales

Propiedad intelectual

  • México: En 2022, se han registrado un total de 463 modelos industriales, siendo el país con más registros realizados en todo el mundo
  • EUA: En 2019, el total estimado de patentes en vigor ascendía a 14,9 millones. Las cifras más altas se registraron en los Estados Unidos de América (3,1 millones)

Salario mínimo

  • México: 207.44 pesos diarios
  • EUA: 17 dolares la hora

Sindicatos

México
  • Sindicatos de empresa.
  • Sindicatos nacionales de industria.
  • Sindicatos industriales estatales.
  • Sindicatos gremiales.
  • Sindicatos de oficios varios.
EUA
  • Trabajadores de oficios
  • Trabajadores industriales
  • Sector público
  • Profesionales

Contratos laborales

México
  • Contrato laboral por tiempo determinado.
  • Contrato laboral por tiempo indeterminado.
  • Contrato laboral temporal.
  • Contrato para capacitación inicial.
  • Contrato de periodo de prueba.
EUA
  • Contrato de trabajo por escrito.
  • Contrato de trabajo verbal.
  • Contrato de trabajo implícito.
  • Contrato indefinido.
  • Contrato de duración determinada.
  • Contrato temporal.

Factores ecológicos:

Consumo de recursos renovables

  • México: Al cierre de 2021, la capacidad eólica, solar, geotérmica, e hidroeléctrica sumaba 26,8 gigavatios, un 31% de la capacidad instalada total.
  • EUA: De los 4.12 billones de kWh de electricidad generada en EU, 38% fue de gas natural, el carbón representó cerca de 23% y la nuclear sumando otro 20%.

Políticas ambientales

  • México: La Ley de Equilibrio Ecológico y Protección al Ambiente (LGEEPA), la Ley General de Cambio Climático, la Ley General de Vida Silvestre y la Ley de Desarrollo Rural Sustentable, entre otros.
  • EUA: Estados Unidos no cuenta con una ley ambiental única que constituya un marco de referencia general.

Reciclaje

  • México: sólo se reciclaba el 6,1% de todos los residuos valorizables: latas, cartón, papel y plástico.
  • EUA: en 2021, solo se recicló entre el 5% y el 6% de los residuos de plásticos.

Cambio climático

  • México: Las temperaturas promedio a nivel nacional aumentaron 0.85º C y las temperaturas invernales 1.3ºC.
  • EUA: Algunos lugares experimentando un aumento de las precipitaciones e inundaciones, mientras que otros experimentan sequías

Estrategias PESTLE

Estrategia de Innovación y Sostenibilidad

  • Dado el aumento en el uso de energías renovables en México y Estados Unidos, así como la creciente preocupación por las políticas ambientales y el cambio climático, la empresa podría centrarse en desarrollar empaques especializados que sean más sostenibles y respetuosos con el medio ambiente como lo son con empaques retornables que se pueden utilizar muchas veces.

Estrategia de comercio basada en tipo de cambio y tratados de libre comercio

  • Segmentación de mercado en Estados Unidos con el perfil de clientes de FORM, encontrando de empresas automotrices en San Antonio, alcanzando posibles clientes nuevos en los estados y ciudades cerca a la frontera al utilizar rutas de envío estratégicas con el fin de reducir el impacto del tipo de cambio, haciendo uso de los tratados de libre comercio establecidos entre México y distintos países.

Análisis Descriptivo de FORM

Situación Problema: Recursos Humanos

  • La problemática seleccionada es la del clima organizacional en FORM. El equipo “Datum Group” se enfocará en buscar soluciones viables para el problema de la rotación en piso de FORM y su cultura organizacional.

  • Objetivo: Explorar, definir, y describir cuáles son los principales factores del clima organizacional de FORM que propician la satisfacción y/o no satisfacción de trabajar en dicha empresa.

Análisis Exploratorio de Datos

Primeros 6 renglones de las bases de datos

head(form_bajas_integradas)
##                   NombreCompleto FECHA.DE.NACIMIENTO    GENERO           RFC
## 1  MARIA FERNANDA JIMENEZ ALANIS           7/10/1998  Femenino JIAF980710CZ0
## 2       EMANUEL JAUREGUI SANCHEZ           10/3/1998 Masculino JASE981003M35
## 3        TRINIDAD GARCIA CAZARES           5/25/1997 Masculino GACT970525KG7
## 4            WILMAR LOPEZ ROMERO            9/4/2001 Masculino LORW0109044E2
## 5   JOSE MIGUEL DOMINGUEZ GARCIA           20/5/2002 Masculino DOGM020520QF2
## 6 CRISTIAN OMAR HERNANDEZ GARCIA           2/29/2000 Masculino HEGC0002295D8
##   FECHA.DE.ALTA  MonMesA        Motivo_de_Baja CausaBaja CausaBajaSub
## 1     9/12/2020 Dec-2020   Termino de contrato                       
## 2     4/12/2022 Dec-2022       Baja por Faltas                       
## 3      2/4/2022 Apr-2022 Separacion voluntaria                       
## 4    12/11/2021 Nov-2021   Termino de contrato                       
## 5     1/25/2022 Jan-2022       Baja por Faltas                       
## 6     3/19/2022 Mar-2022       Baja por Faltas                       
##   Dias_Laborados      BAJA  MonMesB                PUESTO   DEPARTAMENTO
## 1            423  2/5/2022 May-2022   ANALISTA DE NOMINAS ADMINISTRATIVO
## 2             35 17/5/2022 May-2022 Ayudante de Embarques          CEDIS
## 3            102 17/5/2022 May-2022 Ayudante de Embarques      EMBARQUES
## 4             63 2/12/2022 Dec-2022 Ayudante de Embarques               
## 5             34 2/28/2022 Feb-2022 Ayudante de Embarques          Cedis
## 6             23 4/11/2022 Nov-2022 Ayudante de Embarques          Cedis
##   NO.SEGURO.SOCIAL Salario FACTOR.CRED.INFONAVIT N..CREDITO.INFONAVIT
## 1      17139840197  176.72                   N/A                  N/A
## 2      21139849786  180.68                   N/A                  N/A
## 3      17259713491  180.68                   N/A                  N/A
## 4     0 2150142475  176.72                   N/A                  N/A
## 5      70170223260  180.68                   N/A                  N/A
## 6      35170037705  180.68                   N/A                  N/A
##          LUGAR.DE.NACIMIENTO               CURP           CALLE NUMERO.INTERNO
## 1   SAN NICOLAS DE LOS GARZA JIAF980710MNLMLR09        RIO AZUL            703
## 2       MINATITLAN, VERACRUZ JASE981003HVZRNM01        PALENQUE            515
## 3       MINATITLAN, VERACRUZ GACT970525HVZRZR09         SABINAS           1614
## 4 VILLA COMALTITLAN, CHIAPAS LORW010904HCSPMLA1    RIO SANTIAGO            730
## 5         SAN PEDRO,COAHUILA  DOGM20520HCLMRGA8 C SIN NOMBRE SN               
## 6         SALTILLO, COAHUILA HEGC000229HCLRRRA5      OSO BLANCO            143
##                  COLONIA CODIGO.POSTAL  MUNICIPIO     ESTADO Estado_Civil
## 1             SAN ISIDRO       APODACA Nuevo León NUEVO LEON     Solteria
## 2        ANALCO PONIENTE  RAMOS ARIZPE   COAHUILA   COAHUILA     Solteria
## 3 COLINAS DEL AEROPUERTO     PESQUERIA NUEVO LEON NUEVO LEON     Solteria
## 4           PUEBLO NUEVO       APODACA NUEVO LEON NUEVO LEON     Solteria
## 5              EJ MAYRAN SAN PDRO COAH   COAHUILA NUEVO LEON  Union Libre
## 6             LA TENERIA  RAMOS ARIZPE   COAHUILA NUEVO LEON     Solteria

Preguntas de Análisis

Pregunta 1: Rotación FORM

¿Es la rotación de FORM por arriba del promedio en la industria?

El objetivo de esta pregunta es identificar si la rotación histórica de FORM desde 2022 hasta 2023 sigue patrones de movimientos similares a los promedios de empresas productivas del estado y el promedio de rotación nacional. Se pretende analizar y buscar patrones entre los meses con mayores y menores bajas.

\[ \frac{\frac{Altas + Bajas}{2}}{\frac{EmpInicio + EmpFinal}{2}} \times 100 \]

  • Altas = Número de empleados que se dieron de alta en el periodo

  • Bajas = Altas = Número de empleados que se dieron de alta en el periodo

  • EmpInicio = personal al inicio del periodo

  • EmpFinal = personal al final del periodo

FORMFlujo <- FORMFlujo %>% mutate(Rotacion = ((((A+B)/2)/((EmpI+EmpF)/2))*100)) 
FORMFlujo$Rotacion <- round(FORMFlujo$Rotacion,2)

FORMFlujo$Fecha <- as.Date(FORMFlujo$Fecha, format = "%d/%m/%y")

# Valores estadísticos de la Rotación
summary(FORMFlujo) 
##      Fecha                  B               A              EmpI      
##  Min.   :2022-01-01   Min.   : 3.00   Min.   :11.00   Min.   :108.0  
##  1st Qu.:2022-05-24   1st Qu.:13.00   1st Qu.:18.50   1st Qu.:126.8  
##  Median :2022-10-16   Median :24.00   Median :24.50   Median :170.5  
##  Mean   :2022-10-16   Mean   :25.05   Mean   :26.10   Mean   :160.3  
##  3rd Qu.:2023-03-08   3rd Qu.:35.25   3rd Qu.:29.25   3rd Qu.:183.5  
##  Max.   :2023-08-01   Max.   :59.00   Max.   :66.00   Max.   :207.0  
##       EmpF          Rotacion    
##  Min.   :108.0   Min.   : 4.89  
##  1st Qu.:129.2   1st Qu.:10.15  
##  Median :170.5   Median :16.25  
##  Mean   :161.3   Mean   :16.64  
##  3rd Qu.:183.5   3rd Qu.:20.39  
##  Max.   :207.0   Max.   :38.35

Gráfica de rotación histórica

ggplot(FORMFlujo,aes(x=Fecha, y=Rotacion))+
  geom_line()+
  geom_hline(yintercept = c(10), linetype = "dashed", color = "green", size = 0.5) +
  geom_hline(yintercept = c(20), linetype = "dashed", color = "orange", size = 0.5) +
  geom_hline(yintercept = c(30), linetype = "dashed", color = "red", size = 0.5) +
  labs(x="Fecha",y="Rotación en %", color="Legend")+
  #geom_ribbon("rect", aes(x = c("2022-01-01"), xend = ("2023-12-01")), ymin = -Inf, ymax = Inf, fill = "gray", alpha = 0.5)
  ggtitle("Rotacion en FORM Histórico 2022-2023")

Análisis de Resultado

Analizando el comportamiento de la rotación por mes, se puede observar que la rotación de FORM aumenta a principio de año y en junio para los dos años, con cifras más altas para el año 2022. Se pueden también observar mejoras en la rotación debido a que en 2022 la rotación sobrepasó niveles alarmantes arriba de la línea roja en dos ocasiones para 2022, mientras que en 2023 se quedó en niveles altos pero no repitió cifras similares a las del 2023.

En comparación a la industria en Nuevo León, el estado para 2023 reportó la tercera rotación más alta de México con niveles entre 12 y 15% de acuerdo con una encuesta realizada por ERIAC Capital Humano (Flores, 2023). El promedio histórico de rotación de FORM se establece en 16.64%, posicionándose arriba del promedio del estado, demostrando que la empresa enfrenta un grave problema de pérdida de talento humano.

Una rotación sana para una empresa manufacturera es considerada por debajo del 15%, de 15% a 30% ya se vuelve un problema considerable al cual prestar atención y arriba del 40% es indicador de que la empresa necesita reformar su modelo de negocios (Ana, 2023). Actualmente, FORM solo ha superado la rotación del 30% en dos ocasiones, ambas en 2022, alcanzando una rotación máxima del 38.35%. Con estos datos, se puede concluir que FORM tiene un problema de pérdida de personal al cual se le debe prestar atención.

Pregunta 2: Comportamiento género, edad y estado civil

¿Existe alguna relación entre el comportamiento de las bajas en base a variables de género, edad y edoCivil?

Para el análisis de esta pregunta con las bases de datos unificadas de las bajas de FORM del 2022 y el 2023 se llevará a cabo una organización de datos por rangos de edades, género y estado civil con el fin de identificar cuáles grupos de personas son más propensas a darse de baja considerando solo estas variables.

Bajas2223 <- rename(Bajas2223, fechaN = FECHA.DE.NACIMIENTO, Genero = GENERO, edoCivil = ESTADO.CIVIL, salarioD = SALARIO.DIARIO.IMSS, Puesto = PUESTO)
Bajas2223 <- Bajas2223 %>% select(fechaN,Genero,Puesto,salarioD,edoCivil)
Bajas2223$fechaN <- as.Date(Bajas2223$fechaN, format = "%d/%m/%y") 
Bajas2223 <- Bajas2223 %>% mutate(Fecha = dmy(fechaN), Edad = year(Sys.Date()) - year(fechaN) - ifelse(today() < fechaN, 1, 0))


Bajas2223 <- subset(Bajas2223, select = -Fecha) #Quitar columna Fecha
Bajas2223$Edad <- as.numeric(Bajas2223$Edad)
Bajas2223 <- mutate(Bajas2223,GrupoEdad = ifelse(Bajas2223$Edad > 11 & Bajas2223$Edad <=25, "16-25",
                       ifelse(Bajas2223$Edad >25 & Bajas2223$Edad <= 35 , "26-35",
                              ifelse(Bajas2223$Edad > 35 & Bajas2223$Edad <= 45, "36-45", 
                                     ifelse(Bajas2223$Edad > 45 & Bajas2223$Edad <= 55, "46-55",
                                            ifelse(Bajas2223$Edad > 55 & Bajas2223$Edad <= 65, "56-65",
                                                   ifelse(Bajas2223$Edad > 65 & Bajas2223$Edad <= 75, "66-75", "0")))))))


# Use mutate to create the Combined column
Bajas2223 <- Bajas2223 %>%
  mutate(Combined = paste(substr(Genero, 1, 2), substr(edoCivil, 1, 2), substr(GrupoEdad, 1,5), sep = ""))

Bajas2223 <- Bajas2223 %>% filter(Edad >= 16)

ggplot(Bajas2223,aes(GrupoEdad, fill = Combined)) + 
  geom_bar(position = position_dodge(width=0.8)) +
  xlab("Rangos de Edades") +
  ylab("Número de Bajas por Categoría")

  labs(title = "Frecuencia de bajas en base a Género, Estado Civil y Edad",subtitle = "Bajas agrupadas por categorías para FROM") + 
  theme_minimal()
## NULL
BajasCombined <- table(Bajas2223$Combined) # Create a frequency table
BajasCombined <- data.frame(Category = names(BajasCombined), Frequency = as.vector(BajasCombined)) # Coverting to data
colnames(BajasCombined) <- c("Category", "Frequency") # Add titles to the columns

Tabla de Contingencia

#### Tabla de Contingencia
contingencia <- table(Bajas2223$Genero, Bajas2223$edoCivil)
contingencia
##            
##             Divorcio Matrimonio Solteria Union Libre
##   Femenino         2         75      132          73
##   Masculino        1         59      108          53

Análisis de Resultado

La gráfica desarrollada muestra el comportamiento de las bajas por categorías considerando Género(Fe o Ma), Estado Civil(Ma, Di, Un), y el rango de edad en el que se encuentra. En la gráfica se puede observar que la mayoría de las bajas se concentran en los rangos de edades de 16 a 25 años, especialmente en mujeres y hombres solteros. Añadido a esto, se puede ver que en el rango de 26 a 35 años de edad se concentran mayormente bajas de mujeres de unión libre, mujeres y hombres solteros.

En ambos de estos rangos se comparten características comunes, las personas entre las edades de 16 a 25 años tienden a tener menos responsabilidades por las cuales mantener un trabajo y están en una edad con curva de aprendizaje rápida lo cual resulta atractivo para las empresas. De acuerdo con Bankinter, en rango de edad con mayor acceso laboral en México se enfoca entre los 31 y 35 años con un 28% de las vacantes de empleo, seguido de los de 25 a 30 con el 25.1% (2015); sumando a esto, Business Insider México reporta que para las empresas desarrollar a un empleado mayor a los 35 años ya no resulta rentable (Ferrer, 2022). Estos datos, hacen que para una persona menor a 35 sea más sencillo cambiar de trabajo y conseguir mejores ofertas laborales.

Por el otro lado, arriba de los 36, si bien se concentran gran catidad de bajas, en comparativa a los grupos anteriores, estan van a la baja debido a que las ofertas de trabajo se reducen y las responsabilidades financieras a estas edades aumenta.

Pregunta 3: Departamentos con bajas

¿Qué departamento tiene más bajas durante el año?

La importancia de poder tener bien identificado cuáles son los departamentos que tienen más bajas en la empresa, hará que FORM pueda llevar a cabo una decisión estratégica para poder reducir el número de rotación y generar una cultura de pertenencia más importante en cada uno de sus colaboradores.

Análisis de los departamentos de FORM

# Filtrando top departamentos con más bajas
puestoFil <- group_by(bajas_departamento, DEPARTAMENTO)
puestoFil <- summarize(puestoFil, Count = n())
puestoFil <- arrange(puestoFil, desc(Count))
puestoFil <- head(puestoFil,11)
puestoFil <- puestoFil[-1, ]
  
# Grafica de bajas por departamento por periodo anual
ggplot(puestoFil, aes(x = reorder(DEPARTAMENTO, -Count), y = Count, fill = DEPARTAMENTO)) +
  geom_bar(stat = "identity", width = 0.5) +
  xlab("Departamento") +
  ggtitle("Departamento con más bajas 2022 y 2023") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  geom_text(aes(label = Count), vjust = -0.5) + ylim(0,320)

En el gráfico se representa la cantidad de colaboradores que fueron bajas en sus respectivos departamentos en el año 2022 y 2023. Podemos destacar que en el departamento de Stabilus es donde más bajas se han registrado a partir del año pasado. Sin embargo, lo que resalta en la gráfica es que la mayoría de los colaboradores que son bajas en FORM no tienen un departamento en específico. En base a esto, se puede inferir que la incertidumbre de no estar a un área asignada se traduce a un ambiente laboral poco certero y sin dirección a crecimiento.

Pregunta 4: Factores relevantes a bajas

¿Cuáles son los factores más relevantes que contribuyen a la disminución de colaboradores en FORM en el año 2023?, y cómo se comparan estos factores con el contexto nacional actual

Análisis de los motivos de baja de empleados

# Graficando - tomando en cuenta "No especificado"
ggplot(bajas_categorias,aes(Motivo))+geom_bar(aes(fill=CausaBaja), width=0.5) +
xlab("Motivo") +
  ggtitle("Motivo de la baja por su causa - Año 2023")+ 
  theme(axis.text.x = element_text(angle = 25, hjust = 1))+ 
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5) + ylim(0,275)

En esta gráfica se presenta una representación de las causas detrás del motivo de las bajas en el contexto analizado del año 2023. El hallazgo más significativo es la prevalencia de las separaciones voluntarias como motivo principal. Dentro de esta categoría, llama la atención que la causa ‘No especificado’ se destaca como la más predominante, lo que sugiere que las personas tienden a no revelar explícitamente las razones detrás de su renuncia.

Tabla de frecuencias sobre Causas de bajas en FORM en 2023

# Datos sin tomar en cuenta "No especificado"
table(bajas_especifico$CausaBaja) %>%
  as.data.frame() %>%
  arrange(desc(Freq)) %>%
 setNames(c("Causa", "Frecuencia")) 
##                  Causa Frecuencia
## 1  Oportunidad Laboral         24
## 2             Mudanza          13
## 3        No asistencia          6
## 4         Prestaciones          6
## 5             Familiar          5
## 6            Familiar           5
## 7       Carga Laboral           2
## 8          Suspensión           2
## 9           Accidente           1
## 10       Inconformidad          1
table(bajas_especifico$CausaBajaSub) %>%
  as.data.frame() %>%
  arrange(desc(Freq)) %>%
   setNames(c("Desición final más específica", "Frecuencia")) 
##    Desición final más específica Frecuencia
## 1               Cambio Ocupación         14
## 2                 Cambio Empresa         10
## 3                         Faltas          8
## 4                          Hijos          8
## 5                  Internacional          8
## 6                          Bonos          3
## 7                         Mexico          3
## 8              Servicios Médicos          3
## 9                Trabajo pesado           2
## 10        Daño Equipo de Trabajo          1
## 11                     Dirección          1
## 12                         Local          1
## 13                      Nacional          1
## 14                        Padres          1
## 15                       Pareja           1

Cuando analizamos las causas de la baja excluyendo la respuesta “No especificado”, se destaca claramente que la razón principal es la aparición de nuevas oportunidades laborales para los empleados. Sin embargo, al profundizar en las causas, podemos observar que muchas de estas personas se dan de baja porque están cambiando de ocupación, y optan por describirlo como una nueva oportunidad laboral.

# Graficando las bajas comparando años
ggplot(baja_años, aes(año)) +
  geom_bar(aes(fill = motivo), width = 0.5) +
  xlab("Año de la baja") +
  ggtitle("Comparación entre año 2022 y 2023 de la baja por motivo en FORM") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5) 

En el siguiente gráfico se presenta una comparativa entre las cifras de bajas laborales en el año 2022 y 2023 en la empresa FORM, incluyendo un análisis de los motivos que han llevado a dichas bajas. Es relevante destacar que en el año 2022, el motivo de “Separación voluntaria” representaba una proporción significativamente menor en comparación con el año 2023.

En el 2022, el principal motivo de las bajas estaba relacionado con “Baja por faltas”, mientras que en lo que va del año 2023, la “Separación voluntaria” ha emergido como el motivo predominante, demostrando un aumento en las renuncias por parte de los colaboradores en los últimos meses.

Lo que se vive en México con relación a las renuncias Según el economísta, el 2022 inicia con un reporte de 773,252 renuncias en su primer trimestre a nivel nacional. De acuerdo con la Encuesta Nacional de Ocupación y Empleo (ENOE), las principales razones están vinculadas con la continuidad de los estudios, la mejoría salarial, la precarización del trabajo y la demanda de cuidados.Las personas toman la decisión de dejar su trabajo dependiendo estrictamente del contexto en el que se encuentran. (Hernández, 2022). Según el estudio “El Gran Desgaste: renuncia en México” divulgado en el último trimestre del 2022, 4 de cada 10 trabajadores mexicanos estarían dispuestos a renunciar a su actual puesto laboral en los próximos seis meses. Las principales causas de renuncia están relacionadas con el nivel de desgaste de los trabajadores. Aunque la renuncia sea consecuencia de la insatisfacción, la satisfacción no es garantía de retención, ya que 32% de los colaboradores satisfechos o muy satisfechos están dispuestos a renunciar, según el estudio. (Staff & Staff, 2022)

Lo que se vive en México con relación a las renuncias en las empresas de manufactura

Randstad, firma especialista en recursos humanos, reveló que dos de cada cinco empresas manufactureras tienen una rotación de personal anual de al menos de 20%. (MexicoIndustry, 2021). El aumento de la tasa de rotación de personal en la industria es una tendencia y se estimío que a finales del año 2022, la tasa llegó a un 80% anual acumulada en el sector manufactura. El costo de rotación va desde un rango de 10 mil a 30 mil pesos por empleado, lo que es pérdida de valor económico en las empresas. (INCOMEX, 2022)

Pregunta 5: Problema interno o externo

¿Cuáles son las principales razones de las bajas? ¿Es un problema interno o externo a FORM?

Saber la razón por las bajas dentro de FORM nos permite diagnosticar el área de oportunidad de la empresa en cuanto a retención de talento, con el análisis de datos se pueden encontrar tendencias, áreas de oportunidad y posibles soluciones a problemas que tiende a tener la empresa, para esto es necesario saber si las bajas son ocasionadas por problemas internos o externos a FORM, con esto podemos identificar un buen punto de partida para cualquier investigación dentro de la empresa.

Dirección de empleados concatenada

#Agregando dirección completa a base de datos
form_bajas_23 <- form_bajas_23 %>% mutate(Direccion1 = paste(Calle, Numero, sep = " "))
form_bajas_23 <- form_bajas_23 %>% mutate(Direccion = paste(Direccion1, Colonia, Municipio, Estado, CP, sep = ", "))
form_bajas_23$Direccion1 <- NULL

Distancias aproximadas recorridas por empleados hacia FORM

# Creando un ifelse para asignar distancias aproximadas del municipio hacia FORM
form_bajas_23 <- mutate(form_bajas_23, Distancia_km=ifelse(Municipio %in% "Apodaca", 3.5, ifelse(Municipio %in% "Cienega de Flores", 34, ifelse(Municipio %in% "Guadalupe", 13, ifelse(Municipio %in% "Juarez", 18, ifelse(Municipio %in% "Monterrey", 21, ifelse(Municipio %in% "Pesqueria", 20, ifelse(Municipio %in% "Ramos Arizpe", 100,ifelse(Municipio %in% "Saltillo", 112, 15)))))))))

# Identficando los municipios en donde viven los empleados de baja para determinar si la distancia es un factor
ggplot(form_bajas_23,aes(Municipio)) + geom_bar(aes(fill=Distancia_km),width=0.5) + xlab("Municipio") +ylab("Cantidad de bajas") + ggtitle("Distancias y municipios de residencia de bajas en 2023") + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

La mayoría de las bajas de FORM que se han dado en 2023 vienen del mismo municipio, siendo Apodaca, este es el municipio más cerca de la fábrica de FORM a 3.5 km, esto nos ayuda a concluir que la distancia no es la principal razón por la cual la mayoría de las bajas se dan en FORM, aunque es importante mencionar que en los casos de Ramos Arizpe y Saltillo si es probable que la distancia fuera parte de la baja del empleado.

Motivos de bajas en FORM entre 2022 y 2023

# Hacer un conteo de los motivos de baja
tipos_baja_int <- group_by(form_bajas_integradas,Motivo_de_Baja)
tipos_baja_int <- summarize(tipos_baja_int, conteo=n())
tipos_baja_int <- tipos_baja_int[tipos_baja_int$conteo != "113", ]

#Gráfica de pie mostrando el motivo de bajas de empleados entre 2022 y 2023
ggplot(tipos_baja_int, aes(x = "", y = conteo, fill = Motivo_de_Baja)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar(theta = "y") + ggtitle("Motivo de bajas de empleados entre 2022 y 2023") + 
  theme_void() + geom_text(
  aes(x = 1.5, label = scales::percent(conteo / sum(tipos_baja_int$conteo))),
  position = position_stack(vjust = .5), 
  size = 4)

El 55% de las bajas de empleados de FORM en 2023 han sido voluntarias, significando que son muy pocas las ocasiones en donde despiden a un empleado, siendo más una decisión propia del mismo dejar de trabajar en FORM, igualmente donde la mayoría de las personas no mencionan la razón por la cual decidieron salir de la empresa. Con esta información podemos ver que la retención de talento es una área de oportunidad, mientras que a la vez los empleados tienen un mayor control y libertad de sus decisiones laborales. Otro aspecto importante es que un 22% de las bajas son a causas de faltas acumuladas por los empleados, siendo la segunda causa más frecuente de bajas de empleados.

Analísis de puestos y sus bajas en FORM

# Filtrando top departamentos con más bajas
puestoFil <- group_by(form_bajas_integradas, PUESTO)
puestoFil <- summarize(puestoFil, Count = n())
puestoFil <- arrange(puestoFil, desc(Count))
puestoFil <- head(puestoFil)
  
# Creación de gráfica que demuestra la cantidad de empleados que se dieron de baja en cada puesto entre 2022 y 2023
ggplot(puestoFil, aes(x = reorder(PUESTO, -Count), y = Count, fill = PUESTO)) + geom_bar(stat = "identity", width = 0.5) + xlab("Puesto") + ylab("Cantidad de bajas") + ggtitle(" Bajas de empleados y sus puestos entre 2022 y 2023") + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

Como podemos observar en la gráfica anterior, el puesto con mayor rotación de empleados por una gran diferencia es ayudante general, siendo uno de los puestos de producción de la empresa que más empleados necesitan y su labor básicamente es apoyar en cualquier área que necesite más personal atendiendo. Algo que puede estar ocasionando esta gran cantidad de bajas en el puesto es la falta de pertenencia o sentido hacia el trabajo que hace el empleado, causando que no tenga interés y salga del puesto, es necesario tener una mejor idea de lo que está pasando en este puesto que causa tanta rotación y ubicar las áreas de oportunidad que presentan con el fin de reducir la cantidad de bajas.

Analisis de sueldos

ggplot(form_bajas_integradas, aes(x = Dias_Laborados, y = Salario)) +
  geom_point(size = 3, color = "orange", alpha = 0.7) +  # Cambiando colores de gráfica
  geom_smooth(method = "lm", color = "blue", se = FALSE) +  # Agregando linea de regresión
  xlab("Días Laborados") + ylab("Salario Diario") + ggtitle("Scatterplot de Dias Laborados vs. Salario Diario 2022 y 2023") + theme_minimal() + theme(plot.title = element_text(hjust = 0.5)) + xlim(0,1500) 

En cuanto a los sueldos diarios que recibían antes de salir de la empresa, podemos ver que la mayoría de las bajas se hacen en los primeros 150 días de labor, con un sueldo de entre 180 o 220 aproximadamente, el sueldo puede variar dependiendo del puesto o perfil del empleado. Las salidas que son después de los primeros 150 días tienden a llevar un sueldo por alrededor de 180 pesos al día, mostrado por la línea de regresión que muestra una tendencia ligera de disminución de sueldo diario en los empleados que duran más en la empresa.

Pregunta 6: Relación de bajas con tiempo

De los colaboradores que se dan de baja, ¿Cuál ha sido la duración en FORM? ¿Tienen relación con temporada o mes?

Conocer si la época del año tiene alguna relación con que los empleados se den de baja, y cuales son estas fechas es fundamental para la empresa, con el objetivo de poder implementar estrategias para disminuir la rotación. Con este código se podra concluir si existe una relación entre la temporada del año, y ademas detectar cual es la duración promedio de los empleados que se han dado de baja, para posteriormente relacionarlo a otros factores.

Creación de dataframe con los años 2022 y 2023 combinados, sin embargo tiene NA’s y espacios vacios

p6_mal<- bind_rows(p6_2022_2, p6_2023_2)

Lectura de las fechas con el formato de Año-Mes-Día

p6$Fecha.de.Alta <- as.Date(p6$Fecha.de.Alta, format = "%Y-%m-%d")
p6$Fecha.de.Baja<- as.Date(p6$Fecha.de.Baja, format = "%Y-%m-%d")

p6$Duracion_Dias <- abs(as.numeric(p6$Fecha.de.Baja - p6$Fecha.de.Alta))

Gráfica de Barras (Duración de Empleados)

limites <- seq(0, 500, by = 500)  
ggplot(p6, aes(x = Duracion_Dias)) +
  geom_histogram(binwidth = 50, fill = "orange", color = "black", boundary = 0) +
  scale_x_continuous(limits = limites) +
  labs(
    title = "Top Duraciones de Empleados",
    x = "Duración (días)",
    y = "Cantidad de Empleados"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5)
  )

Cálculo de Medidas de Tendencia Central

promedio_duracion <- mean(p6$Duracion_Dias)
mediana_duracion <- median(p6$Duracion_Dias)
moda_duracion <- as.numeric(names(sort(table(p6$Duracion_Dias), decreasing = TRUE)[1])) 

Tabla de Tendencia Central (Duración de Empleados)

tabla_tendencia <- data.frame(
  Medida = c("Media", "Mediana", "Moda"),
  Valor = c(promedio_duracion, mediana_duracion, moda_duracion)
)
print(tabla_tendencia)
##    Medida    Valor
## 1   Media 112.1414
## 2 Mediana  30.0000
## 3    Moda   5.0000

El promedio es un valor que resulta poco útil en este caso, ya que indica que en promedio un empleado presenta su baja a los 112 dias, sin embargo al analizar la tabla se puede concluir que la mayoria de los datos se encuentran entre 0-100 dias.

La moda es el valor mas util ya que nos dice que el periodo de tiempo más común entre los que renuncian es 5 dias, de hecho los periodos de tiempo mas comunes son entre 0-30 dias. Por lo que un mes es el mas riesgoso para que un empleado renuncie. Pasando de este mes la probabilidad de que se presente un empleado de baja es mucho menor.

Creación de Data Frame, de bajas por mes

p6 <- p6 %>%
  mutate(Mes = format(Fecha.de.Baja, "%Y-%m"))

p6_mes <- p6 %>%
  count(Mes, name = "Cantidad") %>%
  mutate(year = as.integer(substr(Mes, 1, 4)),
         Mes = factor(substr(Mes, 6, 7), levels = sprintf("%02d", 1:12),
                      labels = c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
                                   "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")))

Gráfico de Barras Acumulativo (Bajas por Mes)

ggplot(p6_mes, aes(x = Mes, y = Cantidad, fill = factor(year))) +
  geom_bar(stat = "identity", position = position_stack(reverse = FALSE)) +
  labs(x = "Mes", y = "Número de empleados de baja", fill = "Año") +
  scale_fill_manual(values = c("#FF5733", "#FFA633", "#FFD133")) +  # Tres tonos de naranja
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Como se pudo comprobar, los meses con mas bajas en el año destacan entre Enero, Junio y Agosto. Siendo Agosto el mas común, los ultimos meses esta rotación bajo de gran manera a excepción del mes de Noviembre del 2022. En Marzo hubo un incremento en relación al año pasado lo que puede ser útil para detectr que sucedio durante este tiempo. Se debe hacer una investigación de lo que ocurre entre los meses que tienen una baja rotación y compararlo con los meses de alta rotación para detectar oportunidades para futuras estrategias.

Busqueda de información de datos

¿Qué tipo de información / datos solicitarías al socio formador para mejorar EDA?

  • Resultados de encuestas de satisfacción a los colaboradores realizadas en años anteriores.
  • Situación de la empresa en términos de satisfacción del personal en 2022.
  • Acceso a reportes de la industria o industrias potenciales que se hayan adquerido recientemente.

Datos de reclutamiento y selección:

  • Fuentes de reclutamiento utilizadas.
  • Proceso de selección y tiempo promedio de contratación.
  • Perfil de habilidades y experiencia de los nuevos colaboradores.
  • Perfil de empleados modelo actuales.

¿Qué tipo de información / datos de fuentes secundarias buscarías para mejorar EDA?

  • Informes de consultoras y analistas especializados en Recursos Humanos.
  • Informes de tendencias laborales.
  • Información sobre herramientas y tecnología de Recursos Humanos.
  • Formatos de examenes psicométricos con la finalidad de generar perfiles de empleados por puesto.
  • Reportes sobre el panorama comercial para 2024 en EE.UU. y México para contemplar necesidades de recursos humanos si la demanda aumenta o disminuye.

Reflexión

Resumen de los 5-7 principales hallazgos del análisis cualitativo, cuantitativo y estadísitico descriptivo

  1. FORM es una empresa muy fuerte y bien posicionada en lo que respecta a la percepción y confianza con sus clientes, la empresa ha logrado posicionarse rápidamente en el mercado sin sacrificar su rentabilidad y esto se traduce a su selectividad y calidad de producto. Esta dirección definida por parte de la empresa hace que una de sus mayores fortalezas sea la innovación e inversiones estratégicas en ingeniería de empaque y transporte propio. Sin embargo, hay una debilidad que ha estado reteniendo a FORM fuertemente en temas de productividad y esta es la cultura organizacional traducida a una alta fuga de talento humano en piso.

    Analizando los resultados del análisis estadístico descriptivo y cualitativo, se puede establecer que FORM no tiene buenos perfiles de puestos. La falta de perfiles de puesto indica la falta de objetivos y dirección, estos puestos tienen a tener mayores bajas, esto puede indicar que una de las causas por las cuales los empleados de FORM se dan de baja es la falta de dirección, crecimiento y objetivos profesionales impuestos por la compañía. Estos hallazgos son sustentados por las causas de las bajas indicadas sin embargo la cantidad “no especificado” afecta la veracidad de las conclusiones.

  2. Respecto al crecimiento de las industrias evaluadas (autopartes, automóviles y el cartón) se pueden observar patrones similares en lo que respecta a sus crecimientos en el periodo de 2021 a 2023. 2021 a 2022 fue un periodo de recuperación y estabilización de los niveles de producción y crecimiento de la industria post pandemia enfrentándose el sector automotriz a desafíos en la cadena de suministro lo cual afectó los indicadores de 2023 con incrementos porcentuales mucho más reducidos a los de 2021 y 2022. En lo que respecta a la industria del cartón, las ventas han aumentado positivamente desde el 2021 recuperando fuerza post pandemia y tras la reactivación de la economía mundial y las cadenas de suministro, el crecimiento de la industria sigue siendo muy estable. Con las tendencias del nearshoring y la dependencia comercial existente ente México y Estados Unidos, FORM podrá esperar en un mediano plazo un incremento tangible en la demanda de soluciones de empaque y el reto se convertirá en tener la capacidad productiva, capital y humana para poder satisfacer el mercado.

  3. El tipo de cambio es un factor de alta relevancia para las operaciones de FORM. FORM es una empresa que aprovecha las oportunidades comerciales del sector automotriz y de autopartes al comercializar sus soluciones de empaque en Estados Unidos, y mantiene sus costos de producción y mano de obra al mínimo al tener su planta de producción en Apodaca y centros de distribución en lugares estratégicos. Todo esto significa que la empresa maneja sus costos de producción en pesos y sus ventas en dólares estadounidenses, el problema al que se enfrentará FORM es que con la apreciación del peso los márgenes de venta se reducen y los costos de producción aumentan en comparación debido a que lo que antes se obtenía por un dólar en mxn ha estado en caída desde finales de 2021 con las decisiones ante inflacionarias de la Federal Reserve Board de Estados Unidos. Actualmente, y de acuerdo con el CEO, el tipo de cambio no es de gran preocupación, pero si la tendencia sigue a la baja, especialmente con las elecciones de 2024 aproximándose, FORM tendrá de expandir sus ventas a pesos mexicanos con la finalidad de amortizar el impacto.

  4. En base al análisis estadístico descriptivo se puede observar que FORM tiene un gran problema en lo que respecta a la rotación de personal. En Nuevo León la rotación promedio en empresas de manufactura fue de 12 a 15% en 2023, mientras que en el último mes registrado de este año FORM alcanzó niveles de 25%. Una rotación sana es por debajo del 15%, FORM tiene una rotación promedio de 16.64%, alcanzando su alarmante máximo de 38.35% de rotación en junio 2022. Este alarmante comportamiento en la retención de talento indica que FORM debe hacer cambios inmediatos para prevenir que la empresa se vea afectada y afecte a sus clientes debido a falta de personal capacitado. Combinado con la alta demanda de mano de obra debido al desarrollo industrial acelerado que está trayendo a Nuevo León la inversión extranjera, si ese problema continúa cada vez será más difícil conseguir mano de obra especializada y más costoso también puesto que la oferta de trabajos será mayor que la demanda del personal. FORM tiene un grave problema de rotación y retención del personal, y esta es una de las razones por las cuales el foco de nuestro proyecto es Recursos Humanos.

  5. Aunque los estereotipos no son siempre verídicos, con el análisis descriptivo realizado por grupo de edad, género y estado civil se pudieron observar qué grupo de personas cuentan con una mayor tendencia a darse de baja. Se demostró que mientras más joven es el colaborador mayor es la probabilidad que renuncie al trabajo o que se cambie de trabajo por mejores oportunidades laborales. Las bajas entre el rango de edad por grupo género-estado civil fueron las más altas de todos los rangos establecidos seguido del rango de 26 a 35 años, esto se le atribuye a la basta cantidad de ofertas laborales en estos segmentos de edad debido a su facilidad de adaptación y capacitación rápida para diversos puestos. Para reducir las bajas de personal, le recomendaría a FORM en, a discreción de la empresa, buscar las características establecidas para los puestos en segmentos de edad más maduros como de 36 a 45 años donde existe mayor responsabilidad y necesidad de un trabajo estable.

  6. Históricamente, las bajas de FORM tienden a comportarse de manera temporal, dependiendo del mes del año las bajas disminuyen o aumentan. Meses como enero, junio y agosto cuentan con los mayores niveles de fuga de personal, mientras que de septiembre a diciembre a las bajas se mantienen en niveles mínimos. Esto indica que, debido a las necesidades de los empleados, en periodos después del pago de utilidades, aguinaldo y/o bonos las bajas tienden a aumentar. Para FORM será importante implementas diferentes incentivos y crear una relación más cercana y fuerte con sus colaboradores para reducir tanto las bajas con su temporalidad.

  7. Como conclusión del análisis estadístico descriptivo se concluye que FORM tiene un problema significativo con la recolección de datos. Muchas de las conclusiones alcanzadas en el área de RH en base a la información proporcionada por la compañía están afectadas por la falta de registro de información en las bajas de motivos, tipos de puesto, departamento, incongruencias en formato para el registro de fechas, etc. lo que dificulta llegar a conclusiones accionables sin la necesidad de llevar a cabo investigación primaria a través de cuestionarios y solicitud de datos a los empleados actuales y pasados. El manejo, limpieza y registro de datos será un reto al que FORM se tendrá que enfrentar si quiere continuar por el camino del uso de la analítica de datos para la toma de decisiones, esto requerirá de inversión para capacitar al personal que maneja y registra datos ya en la empresa o bien contratar a un profesional en la analítica de datos.

De acuerdo a su experiencia profesional, describir cómo 2-3 sugerencias compartidas por los analistas de datos invitados pudieran contribuir a desarrollar posible(s) solución(es) a la situación problema seleccionada.

En la sesión con los invitados, tuvimos la oportunidad de escucharlos hablar de como la analítica de datos ha transformado sus trayectorias profesionales, dos de ellos justo con solo la experiencia de la concentración. En la sesión se habló de la importancia de la analítica de datos en la actualidad para la toma de decisiones, el alta demando por profesionistas en el tema, los futuros problemas que irán surgiendo en el ambiente laboral, etc. En conjunto con sus experiencias profesionales individuales.

  • Personalmente, me llamó mucho la atención el tema de gobernanza de datos mencionado por uno de los ponentes. Considero que implementar la gobernanza de datos en la solución para la situación problema puede hacer la diferencia en el manejo y transformación de la información en FORM. Actualmente, FORM no tiene un buen manejo, registro, transformación y/o interpretación de los datos que recolectan de sus colaboradores. Implementando la gobernanza de datos permitiría no solo mejorar todas estas tareas, pero a la vez establecer la infraestructura y tecnologías necesitadas para esto y el diseñar una estructura de quienes tendrán acceso al registro, limpieza y transformación de datos para evitar que tareas específicas se hagan en desorden y mejore la eficiencia de la empresa en el manejo de la información.

  • Otra sugerencia esencial de los ponentes fue el tomar la concentración con la seriedad y generar portafolios de trabajo de valor ya que esto nos servirán como carta de presentación a la hora de buscar trabajo no solo en el área de la analítica de datos. A mi parecer esta sugerencia combinada con las experiencias relatadas nos impulsará a mí y a mi equipo a buscar soluciones más elaboradas e investigar modelos de analíticas de datos más efectivos que permitan a la empresa alcanzar sus objetivos en el manejo del personal pero que a la vez sean evidencias de las habilidades adquiridas en el curso.

  • “Problema de conceptos no de datos”. Esta frase fue mencionada por uno de los ponentes junto con uno de los profesores de los módulos en la discusión, esto entra precisamente en la situación problema seleccionada porque conceptos como cuál es el perfil adecuado o qué tipos de datos se necesitan para realizar exámenes psicométricos son preguntas de conceptos de las cuales dependen la recolección efectiva de datos. En FORM existen datos, sin embargo, no se tienen profesionales especializados para definir qué hacer con estos datos, cómo transformarlos, qué conceptos crear que añadan valor para la organización. Si bien también se mencionó la escasez que existe de profesionales en la analítica de datos, para FORM valdría la pena añadir a su equipo de RH alguien especializado en el tema, quien pueda formular las preguntas para generar data y conceptos para la toma de decisiones en la empresa con la finalidad de mejorar la relación con sus colaboradores y disminuir la fuga de personal.

Glosario de variables

Pregunta 1

  • FORMFlujo: DataFrame descriptivo de las bajas y altas de FORM en el periodo de 2022 a 2023.
  • Variable “A”: número de altas
  • Variable “B”: número de bajas
  • Variable “EmpI”: número de empleados al inicio del periodo
  • Variable “EmpF”: número de empleados al final del periodo
  • Variable “Rotacion”: columna calculada de la rotación por mes
  • Variable “Fecha”: fecha del periodo

Pregunta 2

  • Bajas 2223: DataFrame de las bases de datos Bajas 2023 y Bajas 2022 de FORM.
  • Variable “fechaN”: fechas de nacimiento de los empleados
  • Variable “Genero”: género femenino a masculino por empleado
  • Variable “edoCivil”: estado civil por empleado.
  • Variable “Edad”: columna calculada con la fecha de nacimiento de los empleados con su edad.
  • Variable “GrupoEdad”: Edades clasificadas con condicionales para identificar rangos por edad.
  • Variable “Combined”: nomenclatura con los primeros dos dígitos/caracteres de género y estado civil más el Grupo Edad.

Pregunta 3

  • dep_bajas: DataFrame de las bajas de FORM
  • Variable “Nombre completo”: Colaborador que se dió de baja
  • Variable “DEPARTAMENTO”: Departamento el cual pertenecía el colaborador
  • Variable “MonMesB”: Mes y año en el que se dieron de baja

Pregunta 4

  • f_bajas = DataFrame donde se encuentras las bajas de FORM
  • Variable “Nombre”: es el nombre de la persona que se dio de baja
  • Variable “Motivo”: el motivo en general por el cual la persona se da de baja
  • Variable “CausaBaja”: es la causa del motivo por el cual la persona se da de baja
  • Variable “CausaBajaSub”: es la razón específica por la cual la persona se da de baja
  • bajas_especifico = DataFrame donde está descartado la respuesta No especificado”
  • baja_años = DataFrame donde se puede observar el motivo de las bajas para el año 2022 y 2023

Pregunta 5

  • form_bajas_23: Dataframe con los datos de bajas de empleados de FORM durante 2023
  • form_bajas_integradas: Dataframe con los datos de bajas de empleados durante 2022 y 2023
  • Variable “Direccion”: Concatenación de las variables de calle, número, colonia, municipio, estado y cp., con el fin de tener una variable con la dirección completa del empleado.
  • Variable “Motivo de Baja”: Muestra la naturaleza de la baja de los empleados, donde las opciones Separación voluntaria, Inducida, Inducida (faltas), Inducida (faltas no dio el tiempo)
  • Variable “Puesto”: Variable que indica el puesto que ocupa en la empresa el empleado, siendo su función en la empresa.
  • Variable “Dias_Laborados”: Número de días en cuales el empleado trabajo en FORM.
  • Variable “Salario”: Variable que indica el salario diario de cada empleado al momento en que se dio de baja.
  • Variable “Municipio”: Variable que indica el municipio de residencia del empleado que se ha dado de baja.
  • Variable “Distancia_km”: Mide la distancia aproximada entre el municipio y la fabrica de FORM.

Pregunta 6

  • p6_“año”: Es la carga del archivo csv dentro del programa por año
  • p6: Dataframe a utilizar con los años y columnas combinados
  • limites: Secuencia de la gráfica de barras donde se establecen los limites para esta
  • p6_mes: Dataframe nuevo donde se separan las bajas por meses

Anexos

Resumen en equipo

Información de FORM

  • Industria: Automotriz (dinámica, valoración del empaque, diversificación).

  • Enfoque: Ingeniería, logística, materiales, project manager.

  • Empleados: 130 (alta rotación)

  • Centros de distribución: Saltillo, Apodaca, Bajío, San Antonio.

  • Productos destacados: Cajas de empaque para autopartes delicadas y específicas como piezas electrónicas, lámparas, pieles, acabados black piano. Dos modalidades, cartón y retornables.

  • Materiales utilizados: cartón y plástico corrugado, foams, termoformados y diversos textiles, estructuras metálicas

Comercialización

  • FORM Vende su producto normalmente a la industria automotriz. Su enfoque de ventas es a clientes internacionales como Japón, Alemania, Estados Unidos, China, etc. Su producción está basada en México (pesos), y se acaban de expandir a San Antonio, Estados Unidos con un centro de distribución para cubrir la demanda de soluciones de empaque para las autopartes de interior.

  • Form no vende a empresas coreanas por el choque cultural, ni mexicanas porque no pagan.

Objetivos a futuro

  • Buscan la creación de un modelo de inteligencia comercial con el fin de poder operar sin el dueño en un futuro y seguir contando con un ambiente estable de comercio.

  • Diversificación de clientes con el fin de no crear una dependencia a los mismos.

  • Encontrar prospectos o negocios de manera automatizada, red neuronal inteligente que calcule márgenes ya establecidos.

Sectores de su producción

  • Producto no-retornable: menos ganancia por producto, más seguro, compras constantes

  • Producto retornable: más ganancia por producto, menos constantes, más específico.

Competidores

  • México: Empaques Figueroa, Rio Grande, Bradford, ORBIS, HELSA, Versatech, conTeyor, Victory Packaging. US: puro retornable de venta

Operaciones

  • Enfoque en autopartes interiores.

  • Diseño, producción, entrega, empaque (los empaque de cartón se entregan no ensamblados).

  • Empaque retornable: fluctuante 10-25%.

  • Empaque no retornable: constante 90%.

  • No tienen mermas ni material desperdiciado considerable

  • Alto porcentaje de trabajo a mano en fabricación

  • Inspecciones en cuanto a la calidad de la materia prima en un principio

  • Crisis en 2016 y durante la pandemia.

  • Ventas en dólares, costos de producción en pesos (susceptibles a la volatilidad de la tasa de cambio).

  • Sus operaciones se rigen por el Incoterm DDP, lo cual significa que la empresa absorbe todos los costos de exportación e importación desde su centro de distribución en México hasta su centro de distribución en San Antonio y añadido a esto, FORM entrega la mercancía a las plantas del cliente.

Gestión y Finanzas

  • Fusionando recursos humanos y contabilidad.

  • Cultura horizontal, enfoque en construcción de negocio.

  • Cotizaciones en pesos.

  • Egreso principal: cartón.

  • Riesgos: crisis de materia prima, volatilidad de precios.

  • Buscan proyectos rentables, fidelización con prospectos.

  • Buscan proyectos de inversión en Estados Unidos, debido a la volatilidad del dólar

Tecnología y Mejoras

  • Cambio de rp de Odoo a otro sistema local.

  • Metas: Triplicar producción con tecnificación.

  • Decisión basada en datos (materiales, demanda).

  • Mejora de perfiles de puestos.

Competencia y Crecimiento

  • Competidores en México y desconocidos en EE. UU.

  • Diferenciación: software para empaque retornable, y la ingeniería de sus empaques.

  • Ideas de crecimiento: Maquiladores, pymes sin ingenieros.

  • Participación en asociaciones industriales.

  • Área objetiva de comercialización: San Antonio, Texas

Recursos Humanos y Mercado Comercial

  • Enfoque en sentido de pertenencia, retención.

  • Objetivo: Ser una empresa con una excelente cultura organizacional y mejorar la retención de empleados.

  • Desarrollo de perfiles de puesto en base al top 20 empleados de la compañía.

  • Modelo de inteligencia comercial.

  • Cartera de clientes (activos 10).

  • Métodos de reclutamiento: Facebook, parque industrial, LinkedIn.

  • Desarrollo de cuentas: 50%-60%.

  • Exposiciones, ferias, LinkedIn para estrategia comercial.

Retiro y Riesgos a Futuro

  • Retiro del CEO planeado en 5 años.

  • Dependencia en clientes, inestabilidad política/económica.

  • Vulnerabilidad y seguridad en México, volatilidad del dólar.

  • Falta de mano de obra combinado con la alta rotación.

Referencias

LS0tCnRpdGxlOiAiRXZpZGVuY2lhIDEiCmF1dGhvcjogIkVzdGVmYW55IFZpbGxhbG9ib3MiCmRhdGU6ICIyMDIzLTA5LTEzIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6ICJzYW5kc3RvbmUiCi0tLQoKIVtdKC9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL0V2aWRlbmNpYSAxL2xvZ28tZm9ybS0yMDIxLnBuZykKCjxzdHlsZT4KICBoMSB7CiAgICBjb2xvcjogb3JhbmdlOwogIH0KICBoMiB7CiAgICBjb2xvcjogREFSS09SQU5HRTsKICB9CiAgaDMgewogICAgY29sb3I6ICNFRTc2MDA7CiAgfQogIGg0IHsKICAgIGNvbG9yOiAjODM4QjhCOwogIH0KPC9zdHlsZT4KCgojIENhcmdhIHkgTGltcGllemEgZGUgRGF0b3MKIyMjICoqQ2FyZ2FuZG8gbGlicmVyaWFzKiogCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89IFRSVUV9CmxpYnJhcnkoZm9yZWlnbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFRTc3R1ZGlvKQpsaWJyYXJ5KGZvcmVjYXN0KQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShnZ21hcCkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoeHRhYmxlKQpsaWJyYXJ5KHBhcmFsbGVsKQpsaWJyYXJ5KHN0cmluZ3IpCmBgYAoKCiMjIyAqKkNhcmdhbmRvIGJhc2VzIGRlIGRhdG9zKioKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz0gVFJVRX0KI0VudHJlZ2FibGUgMQpDYXJ0b25faW5kdXN0cnkgPC0gcmVhZC5jc3YoIi9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL0V2aWRlbmNpYSAxL0V4cG9ydGVycyBvZiBDYXJ0b24gYm94ZXMgY2FzZXMgb2YgY29ycnVnYXRlZCBwYXBlciBvciBib2FyZCAyMDIwLTIwMjEuY3N2IikKTVhfYXV0b21vdGl2ZSA8LSByZWFkX3hsc3goIi9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL0V2aWRlbmNpYSAxL214X2F1dG9tb3RpdmVfaW5kdXN0cnkueGxzeCIpCkZvcmVjYXN0X05vcnRoQW1lcmljYV9Qcm9kPC0gcmVhZF94bHN4KCIvVXNlcnMvZXN0ZWZhbnl2aWxsYWxvYm9zL0Rlc2t0b3AvUlBvcnRmb2xpby9FdmlkZW5jaWEgMS9Gb3JlY2FzdF9JSFMgQXV0b21vdGl2ZSBMaWdodCBWZWhpY2xlIFByb2R1Y3Rpb24ueGxzeCIpCkV4Y2hhbmdlX3JhdGU8LSByZWFkLmNzdigiL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1JQb3J0Zm9saW8vRXZpZGVuY2lhIDEvbXhfZXhjaGFuZ2VfcmF0ZS5jc3YiKQpGT1JNX1ZlbnRhcyA8LSByZWFkX3hsc3goIi9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL0V2aWRlbmNpYSAxL0ZPUk0gLSBWZW50YXMueGxzeCIpCkZPUk1fUmhfRGF0b3MgPC0gcmVhZC5jc3YoIi9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL0V2aWRlbmNpYSAxL2Zvcm1fcmhfZGF0b3MuY3N2IikKdmVudGFzIDwtIHJlYWRfeGxzeCgiL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1JQb3J0Zm9saW8vRXZpZGVuY2lhIDEvdmVudGFzb2sueGxzeCIpIAoKI0VudHJlZ2FibGUgMgpGT1JNIDwtIHJlYWQuY3N2KCIvVXNlcnMvZXN0ZWZhbnl2aWxsYWxvYm9zL0Rlc2t0b3AvUlBvcnRmb2xpby9FdmlkZW5jaWEgMS9CRERfRk9STV9CQUpBU18yMDIzLnhsc3ggLSBCYXNlIDIwMjMuY3N2IikKRk9STV9JbnRlZ3JhZG8gPC0gcmVhZC5jc3YoIi9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL0V2aWRlbmNpYSAxL0ZPUk0gUkggVHVuZWFkby54bHN4IC0gUkggQWxsLmNzdiIpCkZPUk1fMjIyMyA8LSByZWFkX3hsc3goIi9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL0V2aWRlbmNpYSAxL0ZPUk1fMjIyMy54bHN4IikKQmRhdG9zPC1yZWFkLmNzdigiL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1JQb3J0Zm9saW8vRXZpZGVuY2lhIDEvRk9STV8yMjIzLmNzdiIpCkZPUk1GbHVqbyA8LSByZWFkLmNzdigiL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1JQb3J0Zm9saW8vRXZpZGVuY2lhIDEvUm90YWNpb25CYXNlLmNzdiIpCkJhamFzMjIyMyA8LSByZWFkLmNzdigiL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1JQb3J0Zm9saW8vRXZpZGVuY2lhIDEvQmFzZSAyMiAyMy5jc3YiKQpwNl8yMDIyIDwtIHJlYWQuY3N2KCIvVXNlcnMvZXN0ZWZhbnl2aWxsYWxvYm9zL0Rlc2t0b3AvUlBvcnRmb2xpby9FdmlkZW5jaWEgMS9mb3JtX2JhamFzXzIwMjIuY3N2IikKcDZfMjAyMyA8LSByZWFkLmNzdigiL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1JQb3J0Zm9saW8vRXZpZGVuY2lhIDEvZm9ybV9iYWphc18yMDIzLmNzdiIpCgogICNDcmVhbmRvIERhdGFmcmFtZXMgcHJvcGlvcwpmb3JtX2JhamFzX2ludGVncmFkYXMgPC0gRk9STV9JbnRlZ3JhZG8KZm9ybV9iYWphc18yMyA8LSBGT1JNCmBgYAoKIyMjICoqTGltcGllemEgZGUgZGF0b3MqKgoqKmZvcm1fYmFqYXNfMjMqKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPSBUUlVFfQojUmVuYW1lIGRlIHZhcmlhYmxlcyBxdWUgcHVlZGVuIGNhdXNhciBwcm9ibGVtYXMgKENvcnJlciBzb2xvIHVuYSB2ZXopCmZvcm1fYmFqYXNfMjMgPC0gcmVuYW1lKGZvcm1fYmFqYXNfMjMsIEdlbmVybz0iR8OpbmVybyIpCmZvcm1fYmFqYXNfMjMgPC0gcmVuYW1lKGZvcm1fYmFqYXNfMjMsIE51bWVybz0iTsO6bWVybyIpCmZvcm1fYmFqYXNfMjMgPC0gcmVuYW1lKGZvcm1fYmFqYXNfMjMsIEVzdGFkb19DaXZpbD0iRXN0YWRvLkNpdmlsIikKZm9ybV9iYWphc18yMyA8LSByZW5hbWUoZm9ybV9iYWphc18yMywgTW90aXZvLmRlLkJhamE9Ik1vdGl2by5kZS5CYWphIikKCiMgVHJhbnNmb3JtYW5kbyB2YWxvcmVzIGNociBhIG51bQpmb3JtX2JhamFzXzIzJFNEIDwtIGFzLm51bWVyaWMoZm9ybV9iYWphc18yMyRTRCkKCiMgQ2FtYmlhbmRvIHZhbG9yZXMgY29tbyAiU29sdGVybyIgeSAiU29sdGVyYSIgYSB1bm8gc29sbyBzaWVuZG8gIlNvbHRlcmlhIiBlbiAyMDIzCmZvcm1fYmFqYXNfMjMgPC0gZm9ybV9iYWphc18yMyAlPiUKICBtdXRhdGUoCiAgICBFc3RhZG9fQ2l2aWwgPSBpZmVsc2UoRXN0YWRvX0NpdmlsICVpbiUgYygiU29sdGVybyIsICJTb2x0ZXJhIiksICJTb2x0ZXJpYSIsIEVzdGFkb19DaXZpbCkKICApCiMgQ2FtYmlhbmRvIHZhbG9yZXMgY29tbyAiQ2FzYWRvIiB5ICJDYXNhZGEiIGEgdW5vIHNvbG8gc2llbmRvICJNYXRyaW1vbmlvIiBlbiAyMDIzCmZvcm1fYmFqYXNfMjMgPC0gZm9ybV9iYWphc18yMyAlPiUKICBtdXRhdGUoCiAgICBFc3RhZG9fQ2l2aWwgPSBpZmVsc2UoRXN0YWRvX0NpdmlsICVpbiUgYygiQ2FzYWRvIiwgImNhc2FkbyIsICJDYXNhZGEiKSwgIk1hdHJpbW9uaW8iLCBFc3RhZG9fQ2l2aWwpCiAgKQoKIyBDYW1iaWFuZG8gdmFsb3JlcyBjb21vICJSYW1vcyBBcml6cGUiIHkgIlJhbW96IEFyaXpwZSIgYSB1bm8gc29sbyBzaWVuZG8gIlJhbW9zIEFyaXpwZSIgZW4gbXVuaWNpcGlvIGRlIDIwMjMKZm9ybV9iYWphc18yMyA8LSBmb3JtX2JhamFzXzIzICU+JQogIG11dGF0ZSgKICAgIE11bmljaXBpbyA9IGlmZWxzZShNdW5pY2lwaW8gJWluJSBjKCJSYW1vcyBBcml6cGUiLCAiUmFtb3ogQXJpenBlIiApLCAiUmFtb3MgQXJpenBlIiwgTXVuaWNpcGlvKQogICkKYGBgCgoqKmZvcm1fYmFqYXNfaW50ZWdyYWRhcyoqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89IFRSVUV9CiMgUmVuYW1lCmZvcm1fYmFqYXNfaW50ZWdyYWRhcyA8LSByZW5hbWUoZm9ybV9iYWphc19pbnRlZ3JhZGFzLCBNb3Rpdm9fZGVfQmFqYT0iTU9USVZPLkRFLkJBSkEiKQpmb3JtX2JhamFzX2ludGVncmFkYXMgPC0gcmVuYW1lKGZvcm1fYmFqYXNfaW50ZWdyYWRhcywgRXN0YWRvX0NpdmlsPSJFU1RBRE8uQ0lWSUwiKQpmb3JtX2JhamFzX2ludGVncmFkYXMgPC0gcmVuYW1lKGZvcm1fYmFqYXNfaW50ZWdyYWRhcywgU2FsYXJpbz0iU0FMQVJJTy5ESUFSSU8uSU1TUyIpCmZvcm1fYmFqYXNfaW50ZWdyYWRhcyA8LSByZW5hbWUoZm9ybV9iYWphc19pbnRlZ3JhZGFzLCBEaWFzX0xhYm9yYWRvcz0iRElBUy5MQUJPUkFET1MiKQoKI0FncnVwYW5kbyBkYXRvcyByZXBldGlkb3MgZW4gdmFyaWFzIHZhcmlhYmxlcwpmb3JtX2JhamFzX2ludGVncmFkYXMgPC0gZm9ybV9iYWphc19pbnRlZ3JhZGFzICU+JQogIG11dGF0ZSgKICAgIFBVRVNUTyA9IGlmZWxzZShQVUVTVE8gJWluJSBjKCJDb3N0dXJlcm8iLCAiQ29zdHVyZXJhIiwgIkNPU1RVUkVSQSIsICJDT1NUVVJBIiksICJDb3N0dXJhIiwgUFVFU1RPKQogICkKCmZvcm1fYmFqYXNfaW50ZWdyYWRhcyA8LSBmb3JtX2JhamFzX2ludGVncmFkYXMgJT4lCiAgbXV0YXRlKAogICAgUFVFU1RPID0gaWZlbHNlKFBVRVNUTyAlaW4lIGMoIkF5dWQuIERlIEVtYmFycXVlcyIsICJBeXVkYW50ZSBkZSBFbWJhcnF1ZXMiLCAiQXl1ZGFudGUgZGUgZW1iYXJxdWVzIiwgIkF1eGlsaWFyIGRlIEVtYmFycXVlcyIpLCAiQXl1ZGFudGUgZGUgRW1iYXJxdWVzIiwgUFVFU1RPKQogICkKCmZvcm1fYmFqYXNfaW50ZWdyYWRhcyA8LSBmb3JtX2JhamFzX2ludGVncmFkYXMgJT4lCiAgbXV0YXRlKAogICAgUFVFU1RPID0gaWZlbHNlKFBVRVNUTyAlaW4lIGMoIkF5dWRhbnRlIGRlIHNvbGRhZG9yIiwgIkF5dWRhbnRlIGRlIFNvbGRhZG9yIiksICJBeXVkYW50ZSBkZSBTb2xkYWRvciIsIFBVRVNUTykKICApCgpmb3JtX2JhamFzX2ludGVncmFkYXMgPC0gZm9ybV9iYWphc19pbnRlZ3JhZGFzICU+JQogIG11dGF0ZSgKICAgIFBVRVNUTyA9IGlmZWxzZShQVUVTVE8gJWluJSBjKCJBeXVkYW50ZSBnZW5lcmFsIiwgIkF5dWRhbnRlIEdlbmVyYWwiLCAiQXkuIEdlbmVyYWwiLCAiQVlVREFOVEUgR0VORVJBTCIpLCAiQXl1ZGFudGUgR2VuZXJhbCIsIFBVRVNUTykKICApCgpmb3JtX2JhamFzX2ludGVncmFkYXMgPC0gZm9ybV9iYWphc19pbnRlZ3JhZGFzICU+JQogIG11dGF0ZSgKICAgIFBVRVNUTyA9IGlmZWxzZShQVUVTVE8gJWluJSBjKCJDSE9GRVIiLCAiQ2hvZmVyIiksICJDaG9mZXIiLCBQVUVTVE8pCiAgKQoKZm9ybV9iYWphc19pbnRlZ3JhZGFzIDwtIGZvcm1fYmFqYXNfaW50ZWdyYWRhcyAlPiUKICBtdXRhdGUoCiAgICBQVUVTVE8gPSBpZmVsc2UoUFVFU1RPICVpbiUgYygiSW5zcGVjdG9yIGRlIGNhbGlkYWQiLCAiSW5zcGVjdG9yYSBEZSBDYWxpZGFkIiwgIklOU1BFQ1RPUiBDQUxJREFEIiksICJJbnNwZWNjacOzbiBkZSBDYWxpZGFkIiwgUFVFU1RPKQogICkKCmZvcm1fYmFqYXNfaW50ZWdyYWRhcyA8LSBmb3JtX2JhamFzX2ludGVncmFkYXMgJT4lCiAgbXV0YXRlKAogICAgUFVFU1RPID0gaWZlbHNlKFBVRVNUTyAlaW4lIGMoIkdlc3RvciIsICJHRVNUT1IiKSwgIkdlc3RvciIsIFBVRVNUTykKICApCgpmb3JtX2JhamFzX2ludGVncmFkYXMgPC0gZm9ybV9iYWphc19pbnRlZ3JhZGFzICU+JQogIG11dGF0ZSgKICAgIFBVRVNUTyA9IGlmZWxzZShQVUVTVE8gJWluJSBjKCJHdWFyZGlhIGRlIFNlZ3VyaWRhZCIsICJHVUFSRElBIERFIFNFR1VSSURBRCIsICJHVUFSRElBIFNFR1VSSURBRCIpLCAiR3VhcmRpYSBkZSBTZWd1cmlkYWQiLCBQVUVTVE8pCiAgKQoKZm9ybV9iYWphc19pbnRlZ3JhZGFzIDwtIGZvcm1fYmFqYXNfaW50ZWdyYWRhcyAlPiUKICBtdXRhdGUoCiAgICBQVUVTVE8gPSBpZmVsc2UoUFVFU1RPICVpbiUgYygiTGltcGllemEiLCAiTElNUElFWkEiKSwgIkxpbXBpZXphIiwgUFVFU1RPKQogICkKCmZvcm1fYmFqYXNfaW50ZWdyYWRhcyA8LSBmb3JtX2JhamFzX2ludGVncmFkYXMgJT4lCiAgbXV0YXRlKAogICAgUFVFU1RPID0gaWZlbHNlKFBVRVNUTyAlaW4lIGMoIk1vbnRhY2FyZ3Vpc3RhIiwgIk1PTlRBQ0FSR1VJU1RBIiksICJNb250YWNhcmd1aXN0YSIsIFBVRVNUTykKICApCgpmb3JtX2JhamFzX2ludGVncmFkYXMgPC0gZm9ybV9iYWphc19pbnRlZ3JhZGFzICU+JQogIG11dGF0ZSgKICAgIFBVRVNUTyA9IGlmZWxzZShQVUVTVE8gJWluJSBjKCJQaW50b3IiLCAiUElOVE9SIiksICJQaW50b3IiLCBQVUVTVE8pCiAgKQoKZm9ybV9iYWphc19pbnRlZ3JhZGFzIDwtIGZvcm1fYmFqYXNfaW50ZWdyYWRhcyAlPiUKICBtdXRhdGUoCiAgICBQVUVTVE8gPSBpZmVsc2UoUFVFU1RPICVpbiUgYygiUmVzaWRlbnRlIiwgIlJFU0lERU5URSIpLCAiUmVzaWRlbnRlIiwgUFVFU1RPKQogICkKCmZvcm1fYmFqYXNfaW50ZWdyYWRhcyA8LSBmb3JtX2JhamFzX2ludGVncmFkYXMgJT4lCiAgbXV0YXRlKAogICAgUFVFU1RPID0gaWZlbHNlKFBVRVNUTyAlaW4lIGMoIkNVU1RPTUVSIFNFUlZJQ0UgSU5GIiwgIlNFUlZJQ0lPIEFMIENMSUVOVEUiKSwgIlNlcnZpY2lvIGFsIENsaWVudGUiLCBQVUVTVE8pCiAgKQoKZm9ybV9iYWphc19pbnRlZ3JhZGFzIDwtIGZvcm1fYmFqYXNfaW50ZWdyYWRhcyAlPiUKICBtdXRhdGUoCiAgICBQVUVTVE8gPSBpZmVsc2UoUFVFU1RPICVpbiUgYygiU29sZGFkb3IiLCAiU09MREFET1IiKSwgIlNvbGRhZG9yIiwgUFVFU1RPKQogICkKCmZvcm1fYmFqYXNfaW50ZWdyYWRhcyA8LSBmb3JtX2JhamFzX2ludGVncmFkYXMgJT4lCiAgbXV0YXRlKAogICAgUFVFU1RPID0gaWZlbHNlKFBVRVNUTyAlaW4lIGMoIk1hdGVyaWFsaXN0YSIsICJNQVRFUklBTElTVEEiKSwgIk1hdGVyaWFsaXN0YSIsIFBVRVNUTykKICApCgojIENhbWJpYW5kbyB2YWxvcmVzIGNvbW8gIlNvbHRlcm8iIHkgIlNvbHRlcmEiIGEgdW5vIHNvbG8gc2llbmRvICJTb2x0ZXJpYSBlbiAyMDIyIHkgMjAyMwpmb3JtX2JhamFzX2ludGVncmFkYXMgPC0gZm9ybV9iYWphc19pbnRlZ3JhZGFzICU+JQogIG11dGF0ZSgKICAgIEVzdGFkb19DaXZpbCA9IGlmZWxzZShFc3RhZG9fQ2l2aWwgJWluJSBjKCJTb2x0ZXJvIiwgIlNvbHRlcmEiLCAiU09MVEVSSUEiKSwgIlNvbHRlcmlhIiwgRXN0YWRvX0NpdmlsKQogICkKCiMgQ2FtYmlhbmRvIHZhbG9yZXMgY29tbyAiQ2FzYWRvIiB5ICJDYXNhZGEiIGEgdW5vIHNvbG8gc2llbmRvICJNYXRyaW1vbmlvIiBlbiAyMDIyIHkgMjAyMyAKZm9ybV9iYWphc19pbnRlZ3JhZGFzIDwtIGZvcm1fYmFqYXNfaW50ZWdyYWRhcyAlPiUKICBtdXRhdGUoCiAgICBFc3RhZG9fQ2l2aWwgPSBpZmVsc2UoRXN0YWRvX0NpdmlsICVpbiUgYygiQ2FzYWRvIiwgImNhc2FkbyIsICJDYXNhZGEiLCJNQVRSSU1PTklPIiwgIk1BVFJJT01PTklPIiApLCAiTWF0cmltb25pbyIsIEVzdGFkb19DaXZpbCkKICApCgojIENhbWJpYW5kbyB2YWxvcmVzIGNvbW8gIlVOSU9OIExJQlJFIiB5ICJVbmlvbiBMaWJyZSIgYSB1bm8gc29sbyBzaWVuZG8gIlVuaW9uIExpYnJlIiBlbiAyMDIyIHkgMjAyMyAKZm9ybV9iYWphc19pbnRlZ3JhZGFzIDwtIGZvcm1fYmFqYXNfaW50ZWdyYWRhcyAlPiUKICBtdXRhdGUoCiAgICBFc3RhZG9fQ2l2aWwgPSBpZmVsc2UoRXN0YWRvX0NpdmlsICVpbiUgYygiVU5JT04gTElCUkUiLCAiVW5pb24gTGlicmUiICksICJVbmlvbiBMaWJyZSIsIEVzdGFkb19DaXZpbCkKICApCgojIENhbWJpYW5kbyB2YWxvcmVzIGNvbW8gIkZFTUVOSU5PIiB5ICJGZW1lbmlubyIgYSB1bm8gc29sbyBzaWVuZG8gIlVuaW9uIExpYnJlIiBlbiAyMDIyIHkgMjAyMyAKZm9ybV9iYWphc19pbnRlZ3JhZGFzIDwtIGZvcm1fYmFqYXNfaW50ZWdyYWRhcyAlPiUKICBtdXRhdGUoCiAgICBHRU5FUk8gPSBpZmVsc2UoR0VORVJPICVpbiUgYygiRkVNRU5JTk8iLCAiRmVtZW5pbm8iICksICJGZW1lbmlubyIsIEdFTkVSTykKICApCgoKIyBDYW1iaWFuZG8gdmFsb3JlcyBjb21vICJNQVNDVUxJTk8iIHkgIk1hc2N1bGlubyIgYSB1bm8gc29sbyBzaWVuZG8gIlVuaW9uIExpYnJlIiBlbiAyMDIyIHkgMjAyMyAKZm9ybV9iYWphc19pbnRlZ3JhZGFzIDwtIGZvcm1fYmFqYXNfaW50ZWdyYWRhcyAlPiUKICBtdXRhdGUoCiAgICBHRU5FUk8gPSBpZmVsc2UoR0VORVJPICVpbiUgYygiTUFTQ1VMSU5PIiwgIk1hc2N1bGlubyIgKSwgIk1hc2N1bGlubyIsIEdFTkVSTykKICApCmBgYAoKKipGT1JNRmx1am8qKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPSBUUlVFfQojUXVpdGFyIGNvbHVtbmEKRk9STUZsdWpvIDwtIHN1YnNldChGT1JNRmx1am8sIHNlbGVjdCA9IC1YKQoKI1F1aXRhci9lbGltaW5hciBOQXMKRk9STUZsdWpvIDwtIG5hLm9taXQoRk9STUZsdWpvKQoKI1Jlbm9tYnJhciB2YXJpYWJsZXMgcG9yIHByYWN0aWNpZGFkCkZPUk1GbHVqbyA8LSBGT1JNRmx1am8gJT4lIHJlbmFtZShGZWNoYSA9IFlZWVlNTU0sIEE9QUxUQVMsIEI9QkFKQVMsIEVtcEk9SU5JQ0lBTCwgRW1wRj1GSU5BTCkKCiNOdWV2YUZlY2hhCkZPUk1GbHVqbyA8LSBGT1JNRmx1am8KYGBgCgoqKkJhamFzMjIyMyoqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89IFRSVUV9CkJhamFzMjIyMyA8LSBCYWphczIyMjNbLTIzOCwgXQoKQmFqYXMyMjIzWzM5LDNdIDwtICJGRU1FTklOTyIKCiAgCiMgQ2FwaXRhbGl6YXIgY29ycmVjdGFtZW50ZSBsYXMgdmFyaWFibGVzCkJhamFzMjIyMyROb21icmVDb21wbGV0byA8LSBzdHJfdG9fdGl0bGUoQmFqYXMyMjIzJE5vbWJyZUNvbXBsZXRvKQpCYWphczIyMjMkR0VORVJPIDwtIHN0cl90b190aXRsZShCYWphczIyMjMkR0VORVJPKQoKCiMgVW5pZmljYXIgY2xhc2lmaWNhY2lvbmVzIGRlIEVzdGFkbyBDaXZpbApCYWphczIyMjMkRVNUQURPLkNJVklMW0JhamFzMjIyMyRFU1RBRE8uQ0lWSUwgJWluJSBjKCJDYXNhZGEiLCJDYXNhZG8iLCJjYXNhZG8iLCJNQVRSSU1PTklPIiwiTUFUUklPTU9OSU8iKV0gPC0gIk1hdHJpbW9uaW8iCkJhamFzMjIyMyRFU1RBRE8uQ0lWSUxbQmFqYXMyMjIzJEVTVEFETy5DSVZJTCA9PSAiRElWT1JDSU8iXSA8LSAiRGl2b3JjaW8iCkJhamFzMjIyMyRFU1RBRE8uQ0lWSUxbQmFqYXMyMjIzJEVTVEFETy5DSVZJTCAlaW4lIGMoIlNvbHRlcmEiLCJTT0xURVJJQSIsIlNvbHRlcm8iKV0gPC0gIlNvbHRlcmlhIgpCYWphczIyMjMkRVNUQURPLkNJVklMW0JhamFzMjIyMyRFU1RBRE8uQ0lWSUwgPT0gIlVOSU9OIExJQlJFIl0gPC0gIlVuaW9uIExpYnJlIgoKI3JlbGxlbmFyIGVzcGFjaW9zIGVuIGJsYW5jbyAKQmFqYXMyMjIzJEVTVEFETy5DSVZJTCA8LSBpZmVsc2UoQmFqYXMyMjIzJEVTVEFETy5DSVZJTCA9PSAiIiwgIk5vIEVzcGVjaWZpY2FkbyIsIEJhamFzMjIyMyRFU1RBRE8uQ0lWSUwpCmBgYAoKKipGT1JNKioKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz0gVFJVRX0KZl9iYWphcyA8LSBGT1JNICU+JSAKICBzZWxlY3QoIk5vbWJyZSIsIE1vdGl2bz0iTW90aXZvLmRlLkJhamEiLCAiQ2F1c2FCYWphIiwgIkNhdXNhQmFqYVN1YiIpCmJhamFzX2VzcGVjaWZpY28gPC0gZl9iYWphcyAlPiUKICBmaWx0ZXJfYWxsKGFsbF92YXJzKC4gIT0gIk5vIGVzcGVjaWZpY2FkbyIpKQpgYGAKCioqRk9STSAyMjIzKioKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz0gVFJVRX0KYmFqYV9hw7FvcyA8LSBGT1JNXzIyMjMgJT4lIAogIHNlbGVjdChtb3Rpdm8gPSAiTU9USVZPIERFIEJBSkEiLCBhw7FvID0gIk1vbk1lc0IiKSAlPiUKICBhcnJhbmdlKGHDsW8pICU+JQogIGZpbHRlcihncmVwbCgiMjIkfDIzJCIsIGHDsW8pKSAlPiUKICBtdXRhdGUoYcOxbyA9IHN1YigiLiotKFxcZHs0fSkiLCAiXFwxIiwgYcOxbykpICU+JQogIGdyb3VwX2J5KG1vdGl2bykKYmFqYXNfY2F0ZWdvcmlhcyA8LSBncm91cF9ieShmX2JhamFzLCBNb3Rpdm8pCmJhamFzX2NhdGVnb3JpYXMyIDwtIGdyb3VwX2J5KGZfYmFqYXMsIENhdXNhQmFqYSkKYGBgCgoqKkJkYXRvcyoqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89IFRSVUV9CmRlcF9iYWphcyA8LSBCZGF0b3MgJT4lIAogIHNlbGVjdCgiREVQQVJUQU1FTlRPIiwgIk1vbk1lc0IiKQpiYWphc19kZXBhcnRhbWVudG8gPC0gZGVwX2JhamFzICU+JQogIGZpbHRlcl9hbGwoYWxsX3ZhcnMoLiAhPSAiTm8gZXNwZWNpZmljYWRvIikpCmBgYAoKKipwNl8yMDIyIHkgcDZfMjAyMyoqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89IFRSVUV9CnA2XzIwMjJfMiA8LSBwNl8yMDIyJT4lCiAgc2VsZWN0KEFQRUxMSURPUyxOT01CUkUsRkVDSEEuREUuQUxUQSxGRUNIQS5ERS5CQUpBLE1PVElWTy5ERS5CQUpBLFBVRVNUTykKcDZfMjAyM18yIDwtIHA2XzIwMjMlPiUKICBzZWxlY3QoQXBlbGxpZG9zLE5vbWJyZSxGZWNoYS5kZS5BbHRhLEZlY2hhLmRlLkJhamEsTW90aXZvLmRlLkJhamEsUHVlc3RvKQpwNl8yMDIyXzI8LSBwNl8yMDIyXzIlPiUKICByZW5hbWUoQXBlbGxpZG9zPSBBUEVMTElET1MsCiAgICAgICAgIE5vbWJyZT0gTk9NQlJFLAogICAgICAgICBGZWNoYS5kZS5BbHRhPSBGRUNIQS5ERS5BTFRBLAogICAgICAgICBGZWNoYS5kZS5CYWphPUZFQ0hBLkRFLkJBSkEsCiAgICAgICAgIE1vdGl2by5kZS5CYWphPU1PVElWTy5ERS5CQUpBLAogICAgICAgICBQdWVzdG89UFVFU1RPKQoKcDZfbWFsPC0gYmluZF9yb3dzKHA2XzIwMjJfMiwgcDZfMjAyM18yKQoKcDZfbWFsW3A2X21hbCA9PSAiIl0gPC0gTkEKZmlsYXNfc2luX3ZhbG9yZXNfZW5fYmxhbmNvIDwtIGNvbXBsZXRlLmNhc2VzKHA2X21hbCkKCnA2IDwtIHA2X21hbFtmaWxhc19zaW5fdmFsb3Jlc19lbl9ibGFuY28sIF0KYGBgCgojIEFuw6FsaXNpcyBkZSBDdWFsaXRhdGl2byBkZSBGT1JNCgojIyBBbnRlY2VkZW50ZXMgZGUgRk9STQojIyMgKipNaXNpw7NuKioKVHJhbnNmb3JtYXIgbnVlc3RybyBlbnRvcm5vIHkgcmVzb2x2ZXIgcmV0b3MgaW5kdXN0cmlhbGVzIGRlIG51ZXN0cm9zIGNsaWVudGVzIGEgdHJhdsOpcyBkZSBsYSBjb2xhYm9yYWNpw7NuLCBwcm92b2NhbmRvIG51ZXZhcyBvcG9ydHVuaWRhZGVzIHF1ZSBwb3RlbmNpYW4gbnVlc3RybyBtb2RlbG8gZGUgbmVnb2NpbywgcGFyYSBhbGNhbnphciBudWVzdHJvcyBpZGVhbGVzLiA8YnI+CgoKIyMjICoqVmlzacOzbioqClNlciB1bmEgZGUgbGFzIGNpbmNvIG1lam9yZXMgY29tcGHDscOtYXMgZGUgTcOpeGljbyBxdWUgZ2VuZXJhbiB2YWxvciBkZW50cm8gZGUgbGEgY2FkZW5hIGRlIHN1bWluaXN0cm8gZGUgbGFzIGluZHVzdHJpYXMgcXVlIG3DoXMgdmFsb3JhbiBsYSBmb3JtYSBlbiBsYSBxdWUgc2UgcHJvdGVnZW4geSB0cmFzbGFkYW4gbGFzIGNvc2FzLiAgPGJyPgoKIyMjICoqT2JqZXRpdm9zIEVzdHJhdGVnaWNvcyoqCisgQXV0b21hdGl6YWNpw7NuIGRlIGxhIHByb2R1Y2Npw7NuIHBhcmEgZGlzbWludWlyIGVsIGltcGFjdG8gZGUgbGEgcm90YWNpw7NuIHkgbWl0aWdhciBjb3N0b3MuICAKCisgVG9tYXIgbcOhcyBkZWNpc2lvbmVzIGNvbiBkYXRvcywgaW1wbGVtZW50YXIgZWwgbnVldm8gUlAgeSBhcHJvdmVjaGFyIHN1cyB2ZW50YWphcyBwYXJhIGxhIHByb2dyYW1hY2nDs24gZGUgcHJvZHVjY2nDs24geSBsYSBhbnRpY2lwYWNpw7NuIGRlIGxhIGRlbWFuZGEuCgorIERpc21pbnVpciBsYSByb3RhY2nDs24gZW4gZWwgw6FyZWEgZGUgcmVjdXJzb3MgaHVtYW5vcyBhbCBpbXBsZW1lbnRhciBhY2Npb25lcyBwYXJhIGluY3JlbWVudGFyIGVsIHNlbnRpZG8gZGUgcGVydGVuZW5jaWEgeSBkaXNlw7FhciB1biBwZXJmaWwgZXN0cmF0w6lnaWNvIHBvciBwdWVzdG8gY29uIGxhIGZpbmFsaWRhZCBkZSBhdW1lbnRhciBsYSByZXRlbmNpw7NuIGRlbCBwZXJzb25hbCBkZSBwaXNvIGRlIHByb2R1Y2Npw7NuLgoKKyBJbmNyZW1lbnRhciBsYSBwcmVzZW5jaWEgZGUgbmVnb2Npb3MgZW4gRXN0YWRvcyBVbmlkb3MgcGFyYSBwb3NpY2lvbmFyc2UgZGUgbWFuZXJhIGZpbmFuY2llcmFtZW50ZSByZW50YWJsZSBlbiBsYSB6b25hIGRlIFNhbiBBbnRvbmlvLgpQYXJhIHVuIGNyZWNpbWllbnRvIGV4cG9uZW5jaWFsLCBkZXNhcnJvbGxhciBtYXF1aWxhZG9yZXMgY29uIGxvcyBjdWFsZXMgRk9STSBwdWVkYSBzdXBsaXIgbGEgYWx0YSBkZW1hbmRhIGRlIHNvbHVjaW9uZXMgZGUgZW1wYXF1ZS4KCisgSW5jcmVtZW50YXIgbGEgcHJlc2VuY2lhIGRlIG5lZ29jaW9zIGVuIEVzdGFkb3MgVW5pZG9zIHBhcmEgcG9zaWNpb25hcnNlIGRlIG1hbmVyYSBmaW5hbmNpZXJhbWVudGUgcmVudGFibGUgZW4gbGEgem9uYSBkZSBTYW4gQW50b25pby4KCisgUGFyYSB1biBjcmVjaW1pZW50byBleHBvbmVuY2lhbCwgZGVzYXJyb2xsYXIgbWFxdWlsYWRvcmVzIGNvbiBsb3MgY3VhbGVzIEZPUk0gcHVlZGEgc3VwbGlyIGxhIGFsdGEgZGVtYW5kYSBkZSBzb2x1Y2lvbmVzIGRlIGVtcGFxdWUuCgorIERpc3Rpbmd1aXJzZSBlbiBsYSBpbmR1c3RyaWEgcG9yIGVsIHZhbG9yIGNvbXBldGl0aXZvIHF1ZSBwcm92ZWVuIHN1cyBzb2x1Y2lvbmVzIGRlIGluZ2VuaWVyw61hIGRpZmVyZW5jaWFkYXMuIAoKKyBUZWNuaWZpY2FyIHByb2R1Y2Npw7NuOiBxdWllcmVuIHRyaXBsaWNhciBwcm9kdWNjacOzbiBjb24gbG8gcXVlIHRpZW5lbi4KCisgVG9tYXIgZGVjaXNpb25lcyBjb24gZGF0b3M6IHVzbyBkZSBtYXRlcmlhbGVzLCBhbnRpY2lwYWNpw7NuIGRlIGxhIGRlbWFuZGEsIGNvbXByYSBkZSBtYXRlcmlhbGVzCgorIFJlY3Vyc29zIGh1bWFub3M6IGdlbmVyYXIgc2VudGlkbyBkZSBwZXJ0ZW5lbmNpYSAoZ2VudGUgZW4gcGlzbykKCiMjIyAqKkFuYWxpc2lzIGRlIGxhIGVtcHJlc2EqKgpFbiBiYXNlIGEgbGEgcmV1bmnDs24gY29uIGVsIHNvY2lvIGZvcm1hZG9yIHNlIHB1ZG8gZGlhZ25vc3RpY2FyIGVsIGVzdGFkbyBkZSBsYXMgw6FyZWFzIGRlIGxhIGVtcHJlc2EgYXPDrSBjb21vIHN1cyBwcmluY2lwYWxlcyBmdW5jaW9uZXM6CgojIyMjICoqUmVjdXJzb3MgaHVtYW5vcyoqCisgQ3VsdHVyYSBob3Jpem9udGFsLCBubyBvZnJlY2VuIGNyZWNpbWllbnRvIGhhY2lhIGFycmliYSwgbWFuZWphbiB1bmEgY29uc3RydWNjacOzbiBkZSBuZWdvY2lvIGhhY2lhIGFiYWpvIGxvIGN1YWwgcGVybWl0aXLDoSBjcmVjaW1pZW50byBhIHN1cyBlbXBsZWFkb3MgYSBtZWRpZGEgcXVlIGxhIGVtcHJlc2EgY3JlY2UuIAoKKyBFc3TDoW4gdHJhYmFqYW5kbyBlbiBtZWpvcmFyIGxvcyBwZXJmaWxlcyBkZSBwdWVzdG9zLiBTaSBzYWJlIGN1YWxlcyBzb24gc3VzIDIwIG1lam9yZXMgZW1wbGVhZG9zLCBxdWllcmUgaWRlbnRpZmljYXIgbG8gY29tw7puIHBhcmEgZ2VuZXJhciBlbCBwZXJmaWwgaWRlYWwgcGFyYSBlbCByZWNsdXRhbWllbnRvLiAKCisgRm9ybWEgZGUgcmVjbHV0YW1pZW50bzogRmFjZWJvb2sgeSBsb25hIGVuIGVsIHBhcnF1ZSBpbmR1c3RyaWFsIAoKKyAyIGNyaXNpcyBkZSBjbGltYSBvcmdhbml6YWNpb25hbAoKKyBDdWVudGFuIGNvbiB1biBmb25kbyBkZSBhaG9ycm8gcGFyYSBzdXMgZW1wbGVhZG9zLgoKKyBQcmVzdGFjaW9uZXMgYWRpY2lvbmFsZXMgc3VlbGVuIHNlciBwZXJzb25hbGl6YWRhcyBkZXBlbmRpZW5kbyBkZSBsYXMgbmVjZXNpZGFkZXMgZGVsIGVtcGxlYWRvIHkgZWwgaW50ZXLDqXMgZW4gZWwgcHJvc3BlY3RvLgoKKyBIb3kgZW4gZMOtYSBGb3JtcyB0aWVuZSBidWVuIGNsaW1hIG9yZ2FuaXphY2lvbmFsLCBwZXJvIHNlIGJ1c2NhIGxvIG1pc21vIGVuIHBpc28gCgorIEFjdHVhbG1lbnRlLCBsYSBlbXByZXNhIGN1ZW50YSBjb24gMTMwIGVtcGxlYWRvcyBhY3Rpdm9zOiAzMCBhZG1pbmlzdHJhdGl2b3MgeSAxMDAgb3BlcmF0aXZvcy4gCgojIyMjICoqQ29tZXJjaWFsaXphY2nDs24qKgorIFN1IHBvcnRhZm9saW8gZGUgY29tZXJjaWFsaXphY2nDs24gc2UgYmFzYSBlbiBjbGllbnRlcyBpbnRlcm5hY2lvbmFsZXMgY29uIGZpbGlhbGVzIGVuIE3DqXhpY28uIAoKKyBObyB2ZW5kZW4gYSBjbGllbnRlcyBjb3JlYW5vcyAoY2hvcXVlIGN1bHR1cmFsKSBuaSBtZXhpY2Fub3MgKG1hbGEgcGFnYSkuIAoKKyBCdXNjYW4gc2VyIGxhIGVtcHJlc2EgbcOhcyByZW50YWJsZSwgcG9yIGVzbyBidXNjYW4gcHJveWVjdG9zIGRvbmRlIGVsIGNsaWVudGUgdmFsb3JlIGVsIGVtcGFxdWUgeSBlbCBzZXJ2aWNpby4KCisgU3UgcHJvcHVlc3RhIGRlIHZhbG9yIGVzIGNvbiBiYXNlIGVuIGxhIGZsZXhpYmlsaWRhZCwgY29ydG9zIHRpZW1wb3MgZGUgcmVzcHVlc3RhIHkgZXhjZWxlbnRlIHNlcnZpY2lvIGFsIGNsaWVudGUuIAoKKyBTdSBzZXJ2aWNpbyBzZSBlbmZvY2EgZnVlcnRlbWVudGUgZW4gbGEgY2FsaWRhZCwgY29tdW5pY2FjacOzbiB5IGFudGljaXBhY2nDs24gZGUgbGFzIG5lY2VzaWRhZGVzIGRlbCBjbGllbnRlIHBhcmEgcHJvdGVnZXIgbGEgY29uZmlhbnphLiAKCisgVHJhYmFqYW4gY29uIMOzcmRlbmVzIGRlIGNvbXByYSBhYmllcnRhIGxvIGN1YWwgcGVybWl0ZSBmbGV4aWJpbGlkYWQuCgorIENhbmFsIGRlIHZlbnRhIGVuIHJlZGVzIHNvY2lhbGVzOiBMaW5rZWRJbi4gRXN0ZSBtZWRpbyBlcyB1dGlsaXphZG8gcGFyYSBsYSBwcm9tb2Npw7NuIGRlIGxvcyBwcm95ZWN0b3MgZGUgbGEgZW1wcmVzYSB5IHBhcmEgbGEgYXRyYWNjacOzbiBkZSBudWV2b3MgY2xpZW50ZXMuCgorIFN1IGNpY2xvIGRlIGNvbnZlcnNpw7NuIGRlIGVmZWN0aXZvIGEgcGFydGlyIGRlIGxhIGVudHJlZ2EgZGVsIHByb2R1Y3RvIHZhcsOtYSBkZXBlbmRpZW5kbyBkZWwgY2xpZW50ZSBlbnRyZSAyNSwgMzAsIDQ1IHkgNTAgZMOtYXMuIExvcyBjaWNsb3MgYXJyaWJhIGRlIGVzdG9zIG5vIHNvbiBjbGllbnRlcyBjb252ZW5pZW50ZXMgcGFyYSBsYSBlbXByZXNhLgoKKyDDgXJlYSBkZSBvcG9ydHVuaWRhZCBlbiBjb21lcmNpYWw6IENyZWFyIHVuIHNpc3RlbWEgZGUgSW50ZWxpZ2VuY2lhIENvbWVyY2lhbCAoU2FuIEFudG9uaW8sIEJhasOtbywgTW9udGVycmV5LVNhbHRpbGxvKSB5IGRpdmVyc2lmaWNhY2nDs24gKMK/cXXDqSBvdHJhcyBpbmR1c3RyaWFzPykgCgorIFN1cyBwcmluY2lwYWxlcyBjbGllbnRlcyBzb24gVGVzbGEsIERFTlNPLCBGT1JWSUEsIERyYWV4bG1haWVyLCBTdGFiaWx1cywgeSBQbGFzdGljIE9tbml1bS4KCiMjIyMgKipNYW51ZmFjdHVyYSoqCisgU2UgZW5mb2NhIGVuIGxhIGlkZWFjacOzbiB5IG1hbnVmYWN0dXJhIGRlIGVtcGFxdWUgcGFyYSBhdXRvcGFydGVzIGludGVyaW9yZXMgKHZpc3RhcyBjcm9tYWRhcywgcGFudGFsbGFzLCBhY2FiYWRvcywgZGVjb3JhY2nDs24gZW4gcHVlcnRhcywgY29uc29sYXMsIHRhYmxlcm9zKSAKCisgQ3VlbnRhIGNvbiBjZW50cm9zIGRlIGRpc3RyaWJ1Y2nDs24gZW4gQXBvZGFjYSAocHJvZHVjZW4geSBhbG1hY2VuYW4pLCBTYWx0aWxsbyB5IFNhbiBBbnRvbmlvLCBUZXhhcy4gIAoKKyBFbiBsYSBwbGFudGEgZGUgQXBvZGFjYSBzZSBhY29waWEsIGFsbWFjZW5hIHkgZGVzZGUgYWxsw60gc2FsZW4gbG9zIHByb2R1Y3Rvcy4gCgorIERpc2XDsWFuLCBwcm9kdWNlbiwgZW50cmVnYW4sIGN1aWRhbiwgcGVybyBubyBhcm1hbiBlbCBlbXBhcXVlIGRlIGNhcnTDs24gY29uIGxhIGZpbmFsaWRhZCBkZSBhcHJvdmVjaGFyIGVsIGVzcGFjaW8gZGVsIGZsZXRlLgoKKyBDdWVudGFuIGNvbiB1bmEgZnVlcnphIGRlIHRyYW5zcG9ydGUgZGUgMyBjYW1pb25lcyBxdWUgdHJhbnNwb3J0YW4gYSBwbGFudGFzIGRlbCBjbGllbnRlIHkgU2FsdGlsbG8uCgorIEVtcGFxdWUgcmV0b3JuYWJsZSAocG9yIG9jYXNpb25lcyk6IG3DoXggMjUlLTEwJSBtdXkgZmx1Y3R1YW50ZS4KCisgRW1wYXF1ZSBubyByZXRvcm5hYmxlIChjb25zdGFudGUpOiA5MCUKCisgTXV5IGJhamFzIG1lcm1hcywgbm8gZXMgdW4gdGVtYSBpbnNpZ25pZmljYW50ZS4gTG9zIHNvYnJhbnRlcyBkZWwgY2FydMOzbiBsb3MgY29tcGFjdGFuIHkgdmVuZGVuIHBhcmEgc3UgcmVjaWNsYWplIChjYXJ0w7NuIHZpcmdlbikuIApBcGFydGUgZGVsIGNhcnTDs24sIHV0aWxpemFuIHRleHRpbGVzLCBwbMOhc3RpY28gY29ycnVnYWRvLCByYWNrcyBtZXTDoWxpY29zLCBkdW5uYWdlcywgZm9hbXMsIHJlY3VicmltaWVudG9zIGVzcGVjaWFsaXphZG9zIHkgYW50aWVzdMOhdGljb3MgcGFyYSBzdXMgZW1wYXF1ZXMgcmV0b3JuYWJsZXMuIAoKKyBTdXMgbMOtbmVhcyBkZSBwcm9kdWNjacOzbiBtYW5lamFuIHVuIG1vZGVsbyBkZSBibG9xdWVzIHByb2R1Y3Rpdm9zIGF1bWVudGFuZG8gbGEgZmxleGliaWxpZGFkIGUgaW5kZXBlbmRlbmNpYSBkZSBsb3MgZGlmZXJlbnRlcyBwcm9jZXNvcyB5IHNlcnZpY2lvcyBhbCBjbGllbnRlLgoKIyMjIyAqKkNvbnN1bHRvcsOtYSBlbiBJbmdlbmllcsOtYSBkZSBFbXBhcXVlKioKCisgRXF1aXBvIGRlIGluZ2VuaWVyb3MgcXVlIHNlIGVuZm9jYW4gZW4gZWwgZGVzYXJyb2xsbyBkZSBwcm95ZWN0b3MgZGUgZWZpY2llbnRpemFjacOzbi4KCisgU2UgZW5jYXJnYSBkZSBkZXNhcnJvbGxhciBlIGltcGxlbWVudGFyIHRlY25vbG9nw61hcyB5IHByb2Nlc29zIHF1ZSBwZXJtaXRhbiBsYSBtZWpvcmEgY29udGludWEgZGVsIHNlcnZpY2lvIGFsIGNsaWVudGUuCgoKIyMjIyAqKlZlbnRhcyBhbnVhbGVzKioKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2dwbG90KEZPUk1fVmVudGFzLCBhZXMoeD0gWWVhciwgeT0gU2FsZXMsIGZpbGw9IFllYXIpKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LS41KSArIGdndGl0bGUoIlZlbnRhcyBhbnVhbGVzIGRlIEZPUk0iKSArIHhsYWIoIkHDsW8iKSArIHlsYWIoIlBlc29zIikgKyB0aGVtZV9taW5pbWFsKCkKCmBgYAoKKipWZW50YXMgYW51YWxlcyoqICA8YnI+CkNvbiBlc3RhIGdyw6FmaWNhIHBvZGVtb3MgdmVyIHF1ZSBGT1JNIGhhIGRpc2ZydXRhZG8gdW4gY3JlY2ltaWVudG8gZW4gc3VzIHZlbnRhcyBkZXNkZSBlbCAyMDE5LCBxdWUgZXMgZWwgYcOxbyBjdWFuZG8gZGVjaWRlbiBoYWNlciB1biBjYW1iaW8gZGUgZW5mb3F1ZSBoYWNpYSBsYSBzb2x1Y2nDs24gZGUgZW1wYXF1ZXMsIGVuIGVsIGHDsW8gMjAyMiBzZSBlc3BlcsOzIGxsZWdhciBhICQxMTAsMDAwLDAwMCBlbiB2ZW50YXMgeSBlbiBzZXB0aWVtYnJlIGRlbCBtaXNtbyBhw7FvIHRlbsOtYW4gYXByb3hpbWFkYW1lbnRlICQ4MiwwMDAsMDAwLiAgPGJyPgoKIyMjIyAqKkRpdmlzacOzbiBkZSBnZW5lcm8gZGUgbG9zIGVtcGxlYWRvcyBkZSBGT1JNIHkgc3VzIHB1ZXN0b3MqKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZW5lcm8gPC0gZ3JvdXBfYnkoRk9STV9SaF9EYXRvcywgR0VORVJPLCBQVUVTVE8pICNHcm91cF9ieSBwYXJhIGhhY2VyIHVuYSBncsOhZmljYSBjb24gZ2VuZXJvIHkgcHVlc3RvcyBkZSBGT1JNCmdlbmVybyA8LSBzdW1tYXJpemUoZ2VuZXJvLCBjb250ZW89bigpKSAjU2FjYW5kbyB1biBjb250ZW8gcGFyYSB2aXN1YWxpemFyIGxvcyBkYXRvcwoKZ2dwbG90KGdlbmVybywgYWVzKHg9IEdFTkVSTywgeT1jb250ZW8sIGZpbGw9IFBVRVNUTykpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0tLjUpICsgZ2d0aXRsZSgiRGl2aXNpw7NuIGRlIGdlbmVybyBkZSBsb3MgZW1wbGVhZG9zIGRlIEZPUk0iKSArIHhsYWIoIkdlbmVybyIpICsgeWxhYigiIyBkZSBlbXBsZWFkb3MiKSArIHRoZW1lX21pbmltYWwoKQojQ3JlYWNpw7NuZCBlIGdyw6FmaWNhIGRlIGJhcnJhcyBjb24gZWwgZmluIGRlIGNvbXBhcmFyIGxhIGNhbnRpZGFkIGRlIGVtcGxlYWRvcyBwb3IgZ2VuZXJvIHkgc3VzIHJlc3BlY3Rpdm9zIHB1ZXN0b3MuCmBgYAoKKipEaXZpc2nDs24gZGUgZ2VuZXJvIGRlIGxvcyBlbXBsZWFkb3MgZGUgRk9STSB5IHN1cyBwdWVzdG9zKiogIDxicj4KU2UgcHVlZGUgb2JzZXJ2YXIgY29tbyBsYXMgbXVqZXJlcyBmb3JtYW4gbGEgbWF5b3LDrWEgZGVsIHBlcnNvbmFsIGRlIEZPUk0sIGVsIHB1ZXN0byBjb24gbcOhcyBwZXJzb25hbCBlbiBnZW5lcmFsIGVzIOKAnEF5dWRhbnRlIEdlbmVyYWzigJ0uICA8YnI+CgojIyMjICoqRGl2aXNpw7NuIGRlIGdlbmVybyBkZSBsb3MgZW1wbGVhZG9zIGRlIEZPUk0geSBzdSBlc3RhZG8gY2l2aWwqKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQplc3RhZG9fY2l2aWwgPC0gcmVuYW1lKEZPUk1fUmhfRGF0b3MsIEVzdGFkb0NpdmlsPSJFU1RBRE8uQ0lWSUwiKSAjUmVuYW1lIGRlIGxhIHZhcmlhYmxlICJFU1RBRE8gQ0lWSUwiLCB5YSBxdWUgY2F1c2FiYSBwcm9ibGVtYXMKZXN0YWRvX2NpdmlsIDwtIGdyb3VwX2J5KGVzdGFkb19jaXZpbCwgR0VORVJPLCBFc3RhZG9DaXZpbCkgI0dyb3VwX2J5IHBhcmEgaGFjZXIgdW5hIGdyw6FmaWNhIGNvbiBnZW5lcm8geSBlc3RhZG8gY2l2aWwgZGUgRk9STQplc3RhZG9fY2l2aWwgPC0gc3VtbWFyaXplKGVzdGFkb19jaXZpbCwgY29udGVvPW4oKSkgI1NhY2FuZG8gdW4gY29udGVvIHBhcmEgdmlzdWFsaXphciBsb3MgZGF0b3MKCmdncGxvdChlc3RhZG9fY2l2aWwsIGFlcyh4PSBHRU5FUk8sIHk9Y29udGVvLCBmaWxsPSBFc3RhZG9DaXZpbCkpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0tLjUpICsgZ2d0aXRsZSgiRGl2aXNpw7NuIGRlIGdlbmVybyBkZSBsb3MgZW1wbGVhZG9zIGRlIEZPUk0iKSArIHhsYWIoIkdlbmVybyIpICsgeWxhYigiIyBkZSBlbXBsZWFkb3MiKSArIHRoZW1lX21pbmltYWwoKQojQ3JlYWNpw7NuZCBlIGdyw6FmaWNhIGRlIGJhcnJhcyBjb24gZWwgZmluIGRlIGNvbXBhcmFyIGxhIGNhbnRpZGFkIGRlIGVtcGxlYWRvcyBwb3IgZ2VuZXJvIHkgc3VzIGVzdGFkb3MgY2l2aWxlcy4KYGBgCgoqKkRpdmlzacOzbiBkZSBnZW5lcm8gZGUgbG9zIGVtcGxlYWRvcyBkZSBGT1JNIHkgc3UgZXN0YWRvIGNpdmlsKiogIDxicj4KRW4gZWwgY2FzbyBkZWwgcGVyc29uYWwgZGUgRk9STSwgcG9kZW1vcyB2ZXIgcXVlIGVuIGxvcyBob21icmVzIGVsIGdydXBvIGRlIGVzdGFkbyBjaXZpbCBtw6FzIGNvbcO6biBlcyBlbCBtYXRyaW1vbmlvLCBtaWVudHJhcyBxdWUgZW4gZWwgY2FzbyBkZSBsYXMgbXVqZXJlcyBlbCBncnVwbyBkZSBlc3RhZG8gY2l2aWwgbcOhcyBjb23Dum4gZXMgc29sdGVyw61hLiAgPGJyPgoKIyMjICoqRGVzZW1wZcOxbyBSZWNpZW50ZSoqCkZPUk0gZXMgdW5hIGVtcHJlc2EgbMOtZGVyIGVuIHNvbHVjaW9uZXMgaW5ub3ZhZG9yYXMgeSBzdXN0ZW50YWJsZXMgcGFyYSBlbCBlbXBhcXVlIGVzcGVjaWFsaXphZG8gZGUgYXV0b3BhcnRlcyBlbiBlbCBzZWN0b3IgaW5kdXN0cmlhbC4gRGVzZGUgc3UgY3JlYWNpw7NuIGVuIDIwMDksIGxhIGVtcHJlc2EgaGEgc2lkbyByZWNvbm9jaWRhIG51bWVyb3NhcyB2ZWNlcyBhIG5pdmVsIGludGVybmFjaW9uYWwgeSBuYWNpb25hbCBnYW5hbmRvIDcgdmVjZXMgZWwgUHJlbWlvIE5hY2lvbmFsIGRlIEVudmFzZSBlbiBsb3MgYcOxb3MgMjAxMCwgMjAxNCwgMjAxNSwgMjAxNiwgMjAxNywgMjAxOSB5IDIwMjIsIHJlcG9ydGEgRWwgRWNvbm9taXN0YSAoMjAyMikuIEZPUk0gbGxldmEgYcOxb3Mgc2llbmRvIHRlbWEgZGUgY29udmVyc2FjacOzbiBlbiBub3RpY2llcm9zIGRlYmlkbyBhIHN1IGdyYW4gZGlzcnVwdGl2aWRhZCBlbiBsYSBpbmR1c3RyaWEgZGVsIGVtcGFxdWUsIGVsIGVjb25vbWlzdGEgY29tZW50YSDigJxlbiBsb3Mgw7psdGltb3MgY2luY28gYcOxb3MgbGEgZW1wcmVzYSBsbGVnw7MgYSBjcmVjZXIgaGFzdGEgZWwgZG9ibGXigKYgeSBsb2dyYXJvbiBtYW50ZW5lciBzdXMgbml2ZWxlcyBkZSB2ZW50YeKAnSAoMjAyMikgICA8YnI+CgojIyMjIyAqKkVsIEVjb25vbWlzdGEqKgorIEVsIHBlcmlvZGljbyBFbCBFY29ub21pc3RhICgyMDIyKSByZWNvbm9jacOzIGVuIHN1IHJlcG9ydGFqZSBkaXZlcnNvcyBsb2dyb3MgZGUgRk9STSBjb21vIHN1IHJlY29ub2NpbWllbnRvIGFsIFByZW1pbyBOYWNpb25hbCBkZSBFbnZhc2UgZW4gZGl2ZXJzYXMgb2Nhc2lvbmVzIHkgbGEgY2VydGlmaWNhY2nDs24gZGUgbGEgZW1wcmVzYSBlbiBlc3TDoW5kYXJlcyBkZSBjYWxpZGFkIGNvbiBlbCBJU08gOTAwMC0yMDE1LiBBIHN1IHZleiwgZWwgcGVyaW9kaWNvIHRhbWJpw6luIHJlY29ub2Npw7MgZWwgY29tcHJvbWlzbyBkZSBsYSBQeU1lIGNvbiBlbCBzZXJ2aWNpbyBhbCBjbGllbnRlIGEgdHJhdsOpcyBkZSBzdXMgcHJveWVjdG9zIGRlIGludmVyc2nDs24gZW4gbG9nw61zdGljYSBwYXJhIGVsIGNvbnRyb2wgZGUgZW50cmVnYXMgYWwgY2xpZW50ZS4gIDxicj4KCiMjIyMjICoqQ2x1c3RlciBJbmR1c3RyaWFsKioKKyBMYSBzZWNjacOzbiBkZSBub3RpY2lhcyBkZWwgQ2x1c3RlciBJbmR1c3RyaWFsIGRlIE51ZXZvIExlw7NuIHJlYWxpesOzIGEgZmluYWxlcyBkZSAyMDIyIHVuYSBlbnRyZXZpc3RhIGNvbiBlbCBDRU8gZGUgRk9STSB5IHJlY29ub2Npw7MgbGEgY2FwYWNpZGFkIGRlIHJlc3B1ZXN0YSBkZSBsYSBlbXByZXNhIGNvbW8gdW5vIGRlIGxvcyBmYWN0b3JlcyBkZSBzdSByw6FwaWRvIMOpeGl0by4gRWwgYXJ0w61jdWxvIHRpZW5lIGNvbW8gZmluYWxpZGFkIGRpZnVuZGlyIGxhcyBhY3RpdmlkYWRlcyBkZSBGT1JNIGFudGUgc3UgcmVsZXZhbmNpYSBpbnRlcm5hY2lvbmFsIGNvbW8gcHJvdmVlZG9yIG1leGljYW5vIGRlIFRFU0xBLiAgPGJyPgoKIyMjIyMgKipFbCBGaW5hbmNpZXJvKioKKyBFc3RlIGltcG9ydGFudGUgcGVyaW9kw61jbyBkaWdpdGFsIGRlZGljw7MgdW4gYXJ0w61jdWxvIHBhcmEgcmVjb25vY2VyIGVsIHBsYW4gZGUgZXhwYW5zacOzbiBkZSBGT1JNIGEgRXN0YWRvcyBVbmlkb3MgcGFyYSBjcmVjZXIgY29tbyB1bmEgZW1wcmVzYSBpbnRlcm5hY2lvbmFsIHBhcmEgc2F0aXNmYWNlciBsYSBkZW1hbmRhIGRlIHN1cyBjbGllbnRlcy4gKENlcGVkYSwgMjAyMykgIDxicj4KCkVuIGdlbmVyYWwsIEZPUk0gZXMgcGVyY2liaWRhIGNvbW8gdW5hIGVtcHJlc2EgbWV4aWNhbmEgZGUgcsOhcGlkbyBjcmVjaW1pZW50byB5IGFsdGEgaW5ub3ZhY2nDs24gZW4gbG9zIG1lZGlvcyBkZSBjb211bmljYWNpw7NuIGV2YWx1YWRvcy4gTGEgZW1wcmVzYSBlcyByZXRyYXRhZGEgZGUgZm9ybWEgcG9zaXRpdmEgY29tbyB1biBlamVtcGxvIGEgc2VndWlyIGVuIGVsIG5pY2hvIGRlIGxvcyBlbXBhcXVlcyBkZSBjYXJ0w7NuIG1leGljYW5vcyBwYXJhIGVsIHNlY3RvciBhdXRvbW90cml6LiAgPGJyPgoKCiMjICoqQ29udGV4dG8gZGUgbGEgSW5kdXN0cmlhKioKCiMjIyAqKkluZHVzdHJpYSBkZSBDYXJ0w7NuKioKRW4gTcOpeGljbyBsYSBpbmR1c3RyaWEgZGUgY2FydMOzbiBjb3JydWdhZG8gZXMgdW5hIHF1ZSBjdWVudGEgY29uIDEsMDkxIG1pbGxvbmVzIGRlIGTDs2xhcmVzIGVuIGludGVyY2FtYmlvIGNvbWVyY2lhbCwgcXVlIHNlIGNvbXBvbmUgcG9yIDI5NSBtaWxsb25lcyBkZSBkw7NsYXJlcyBlbiB2ZW50YXMgaW50ZXJuYWNpb25hbGVzIHkgJDc5NiBtaWxsb25lcyBkZSBkw7NsYXJlcyBlbiBjb21wcmFzIGludGVybmFjaW9uYWxlcy4gKERhdGEgTcOpeGljbywgMjAyMykgIDxicj4KCkVsIGVzdGFkbyBkZSBOdWV2byBMZcOzbiBzZSBlbmNhcmdhIGRlbCAxMC44JSBkZSBsYXMgdmVudGFzIGludGVybmFjaW9uYWxlcywgZG9uZGUgdW4gOTUuNSUgZGUgbGEgZXhwb3J0YWNpw7NuIGVzIGhhY2lhIEVzdGFkb3MgVW5pZG9zLCBhIGxhIHZleiBlbCA4OS4yJSBkZSBsYXMgY29tcHJhcyBkZSBjYXJ0w7NuIHNvbiBkZSBFc3RhZG9zIFVuaWRvcyB5IHVuIDguNjUlIHNpZW5kbyBhIENoaW5hLiAoRGF0YSBNw6l4aWNvLCAyMDIzKSAgPGJyPgoKRW4gY3VhbnRvIGVsIHVzbyBkZWwgY2FydMOzbiBlbiBlbCBlbXBhcXVlIGRlIGF1dG9wYXJ0ZXMgZXMgbmVjZXNhcmlvIHJlY2FsY2FyIHF1ZSBzZSB1dGlsaXphbiBkaXZlcnNvcyBtYXRlcmlhbGVzIHBhcmEgcmVmb3J6YXIgbGEgY2FsaWRhZCBkZWwgZW1wYXF1ZSBlbiBjb25zaWRlcmFjacOzbiBhIGxhIGVzcGVjaWZpY2FjacOzbiBkZWwgY2xpZW50ZSwgc2llbmRvIGNvbiBwbMOhc3RpY28gY29ycnVnYWRvLCBmb2FtcywgdGVybW9mb3JtYWRvcywgZW50cmUgb3Ryb3MgdGV4dGlsZXMuICA8YnI+CgojIyMjICoqVHJhZGUgVmFsdWUgZGVsIENhcnTDs24gZW4gTm9ydGVhbcOpcmljYSoqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Ck5vcnRoQW1lcmljYV9DYXJ0b24gPC0gZmlsdGVyKENhcnRvbl9pbmR1c3RyeSxDb250aW5lbnQ9PSJOb3J0aCBBbWVyaWNhIikgI0ZpbHRybyBwYXJhIGFpc2xhciBsb3MgZGF0b3MgZGUgTm9ydGVhbcOpcmljYQpOb3J0aEFtZXJpY2FfQ2FydG9uIDwtIHJlbmFtZShOb3J0aEFtZXJpY2FfQ2FydG9uLCBUcmFkZV9WYWx1ZT0iVHJhZGUuVmFsdWUiKSAjUmVub21icmFuZG8gdW5hIGNvbHVtbmEgcXVlIGNhdXNhIGRpZmljdWx0YWRlcwpOb3J0aEFtZXJpY2FfQ2FydG9uIDwtIGZpbHRlcihOb3J0aEFtZXJpY2FfQ2FydG9uLCBDb3VudHJ5ICVpbiUgYygiVW5pdGVkIFN0YXRlcyIsICJNZXhpY28iLCAiQ2FuYWRhIiwgIkd1YXRlbWFsYSIsICJFbCBTYWx2YWRvciIpKSAjRmlsdHJvIHBhcmEgYWlzbGFyIGxvcyBkYXRvcyBkZSBsb3MgdG9wIDUgcGFpc2VzIGRlIE5vcnRlYW3DqXJpY2EgZW4gVHJhZGUgVmFsdWUKCmdncGxvdChOb3J0aEFtZXJpY2FfQ2FydG9uLCBhZXMoeD0gcmVvcmRlcihDb3VudHJ5LCBUcmFkZV9WYWx1ZSksIHk9IFRyYWRlX1ZhbHVlLCBmaWxsPSBDb3VudHJ5KSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS0uNSkgKyBnZ3RpdGxlKCJUcmFkdWUgVmFsdWUgZGUgbGEgaW5kdXN0cmlhIGRlbCBDYXJ0w7NuIDIwMjEgZW4gTm9ydGVhbcOpcmljYSIpICsgeGxhYigiUGHDrXMiKSArIHlsYWIoIlRyYWRlIFZhbHVlIikgKyB0aGVtZV9taW5pbWFsKCkKIyBDcmVhY2nDs24gZGUgZ3LDoWZpY28gcGFyYSByZXByZXNlbnRhciBsb3MgZGF0b3MgZGUgTm9ydGVhbcOpcmljYSBlbiBsYSBpbmR1c3RyaWEgZGVsIGNhcnTDs24uCmBgYAoKKipUcmFkZSBWYWx1ZSBkZWwgY2FydMOzbiBlbiBOb3J0ZWFtw6lyaWNhKiogIDxicj4KU2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGxhIGluZHVzdHJpYSBkZWwgY2FydMOzbiBlbiBOb3J0ZWFtw6lyaWNhIGVzIHVuYSBlbiBkb25kZSBFc3RhZG9zIFVuaWRvcyBlcyBlbCBsw61kZXIgZW4gY3VhbnRvIGEgdHJhZGUgdmFsdWUsIHJlZmlyacOpbmRvc2UgYSB1bmEgY2FudGlkYWQgZW4gZMOzbGFyZXMgaWd1YWwgYWwgcHJlY2lvIHBvciBhY2Npw7NuIG11bHRpcGxpY2FkbyBwb3IgZWwgbsO6bWVybyBkZSBhY2Npb25lcyBlamVjdXRhZGFzLiAgPGJyPgoKIyMjIyAqKlZlbnRhcyBkZWwgY2FydMOzbiAyMS8yMioqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnZlbnRhcyRNZXMgPC0gbW9udGhzKGFzLkRhdGUodmVudGFzJE1lcyksIGFiYnJldmlhdGU9VFJVRSkKCmdncGxvdChkYXRhID0gdmVudGFzLCBhZXMoeCA9IGZhY3RvcihNZXMsIGxldmVsPSBjKCJKYW4iLCAiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIikpLCB5ID0gQ2FydG9uLCBncm91cCA9IEHDsW8sIGNvbG91cj1Bw7FvKSkgKyBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKSArIGdndGl0bGUoIlZlbnRhIGRlIGNhcnTDs24gZW50cmUgMjAyMSB5IDIwMjIiKSArIHhsYWIoIk1lcyIpICsgeWxhYigiVmVudGFzIikKIyBDcmVhY2nDs24gZGUgZ3LDoWZpY28gcGFyYSByZXByZXNlbnRhciBsb3MgZGF0b3MgeSBjb21wb3J0YW1pZW50byBkZSBsYXMgdmVudGFzIGRlIGNhcnTDs24gZW50cmUgMjAyMSB5IDIwMjIuCmBgYAoKTGFzIHZlbnRhcyBkZWwgY2FydMOzbiBtdWVzdHJhbiB1biBjb21wb3J0YW1pZW50byBzaW1pbGFyIGVuIGRvcyBtZXNlcywgc2llbmRvIGZlYnJlcm8geSBqdWxpbywgbWllbnRyYXMgcXVlIGVuIG1lc2VzIGNvbW8gYWdvc3RvIHkgc2VwdGllbWJyZSBzZSBub3RhIHVuIGNhbWJpbyBtdXkgdGFuZ2libGUgZW4gbGFzIHZlbnRhcy4gIDxicj4KCiMjIyAqKkluZHVzdHJpYSBkZSBBdXRvcGFydGVzKioKCiMjIyMgKipNw6l4aWNvKioKTGEgaW5kdXN0cmlhIGRlIGF1dG9wYXJ0ZXMgcHJveWVjdGEgdW4gY3JlY2ltaWVudG8gYW51YWwgZGUgNSUgZW4gMjAyMyBlbiBNw6l4aWNvLiBFc3RvIGVzIGNhc2kgb2NobyBwdW50b3MgcG9yY2VudHVhbGVzIGRlYmFqbyBkZSBsYSBlc3RpbWFjacOzbiBkZWwgMjAyMiwgcXVlIGVyYSBkZSAxMyUuIEVzdG8gZXN0w6EgcmVsYWNpb25hZG8gY29uIGVsIGltcGFjdG8gcXVlIHBvZHLDrWFuIGdlbmVyYXIgbGFzIGNvbmRpY2lvbmVzIGVjb27Ds21pY2FzIHF1ZSBlbmZyZW50YSBFc3RhZG9zIFVuaWRvcy4gIChFbCBFY29ub21pc3RhLCAyMDIzKSAgPGJyPgoKRHVyYW50ZSAyMDIyIGxhIGluZHVzdHJpYSB0dXZvIHVuYSBwcm9kdWNjacOzbiB0b3RhbCBkZSAxMDcsMzI5IG1pbGxvbmVzIGRlIGTDs2xhcmVzLCBsbyBxdWUgcmVwcmVzZW50w7MgdW4gaW5jcmVtZW50byBkZSAxMy4zNSAlIGVuIHJlbGFjacOzbiBjb24gMjAyMS4gTGEgSW5kdXN0cmlhIE5hY2lvbmFsIGRlIEF1dG9wYXJ0ZXMgKElOQSksIG1lbmNpb25hIHF1ZSBlc3RhIHRlbmRlbmNpYSBkZSBjcmVjaW1pZW50byBzZSBtYW50dXZvIGVuIGVsIHByaW1lciB0cmltZXN0cmUgZGUgMjAyMyAoNC43MyUpIHkgcHJveWVjdGFuZG8gYXPDrSB1biBjaWVycmUgZGUgMTEyLDcwMiBtaWxsb25lcyBkZSBkw7NsYXJlcyBwYXJhIGZpbmFsZXMgZGUgZGljaWVtYnJlLiAoUGluZWRhLCAyMDIzKSAgPGJyPgoKTGFzIHByaW5jaXBhbGVzIHJlZ2lvbmVzIHByb2R1Y3RvcmFzIGRlIGF1dG9wYXJ0ZXMgZW4gTcOpeGljbyBzb24gbGEgem9uYSBOb3J0ZSwgem9uYSBCYWrDrW8geSBsYSB6b25hIENlbnRyby4gTGEgRmFicmljYWNpw7NuIGRlIFBhcnRlcyBwYXJhIFZlaMOtY3Vsb3MgQXV0b21vdG9yZXMgcmVjaWJpw7MgMSwzNzUuNiBtaWxsb25lcyBkZSBkw7NsYXJlcy4gKFBpbmVkYSwgMjAyMykgIDxicj4KCkVuIHJlbGFjacOzbiBjb24gZWwgZmVuw7NtZW5vIGRlIG5lYXJzaG9yaW5nLCBzZSBlc3RpbWEgcXVlIGVsIDM3JSBkZSBsYSBpbnZlcnNpw7NuIHJlY2liaWRhIGNvcnJlc3BvbmRlIGEgbGEgRmFicmljYWNpw7NuIGRlIEF1dG9wYXJ0ZXMuIEFjZXJjYSBkZWwgbmVhcnNob3JpbmcgZW4gTcOpeGljbywgZWwgNDAlIHByb3ZpZW5lIGRlIENoaW5hLCBlbCAyMCUgZGUgRXN0YWRvcyBVbmlkb3MsIGVsIDExJSBkZSBKYXDDs24geSBlbCA5JSBkZSBBbGVtYW5pYS4gKFBpbmVkYSwgMjAyMykgIDxicj4KCkVzIGltcG9ydGFudGUgbWVuY2lvbmFyIHF1ZSBOdWV2byBMZcOzbiBzZSBoYSBjb25zb2xpZGFkbyBjb21vIGVsIHRlcmNlciBtYXlvciBwcm9kdWN0b3IgZGUgYXV0b3BhcnRlcyBlbiBNw6l4aWNvLCB5IHNlIGVzdMOhIGFjZXJjYW5kbyBhIGxhIHNlZ3VuZGEgcG9zaWNpw7NuIHF1ZSBlcyBlbCBlc3RhZG8gZGUgQ2hpaHVhaHVhLiAgIDxicj4KCiMjIyMjICoqQW1lbmF6YXMqKiAKKyBEZXBlbmRlbmNpYSBlY29uw7NtaWNhIGRlIEVzdGFkb3MgVW5pZG9zICA8YnI+CisgVmFyaWFiaWxpZGFkIGVuIGxhIGRlbWFuZGEgaW50ZXJuYWNpb25hbCAgPGJyPgorIENvbXBldGVuY2lhIGludGVybmFjaW9uYWwgIDxicj4KCiMjIyMjICoqT3BvcnR1bmlkYWRlcyoqIAorIENyZWNpbWllbnRvIGNvbnN0YW50ZSAgPGJyPgorIE5lYXJzaG9yaW5nICA8YnI+CisgRGl2ZXJzaWZpY2FjacOzbiBkZSBtZXJjYWRvcyAgPGJyPgorIFBvc2ljacOzbiBlbiBsYSByZWdpw7NuICA8YnI+CgoKIyMjIyAqKlVTKioKTcOpeGljbyBlcyBlbCBwcm92ZWVkb3IgbcOhcyBpbXBvcnRhbnRlIGRlIGF1dG9wYXJ0ZXMgcGFyYSBFc3RhZG9zIFVuaWRvcywgc3VwZXJhIGEgQ2hpbmEsIENhbmFkw6EsIEphcMOzbiB5IEFsZW1hbmlhLiAoTWV4aWNvSW5kdXN0cnksIDIwMjEpICA8YnI+CgpMbyBpbXBvcnRhbnRlIGVzIGFuYWxpemFyIGxhIGVjb25vbcOtYSBlc3RhZG91bmlkZW5zZSwgcG9ycXVlIG1pZW50cmFzIHNpZ2Egc2llbmRvIHVuIGdyYW4gY29uc3VtaWRvciBkZSBhdXRvbcOzdmlsZXMgeSBzdSBlY29ub23DrWEgc2UgbWFudGVuZ2EsIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IG1leGljYW5hIHNlIG1hbnRlbmRyw6EuIChNZXhpY29JbmR1c3RyeSwgMjAyMSkgIDxicj4KCgojIyMjIyAqKkFtZW5hemFzKiogCisgQ2FtYmlvcyBlbiBwb2zDrXRpY2FzIDxicj4KCgojIyMjIyAqKk9wb3J0dW5pZGFkZXMqKgorIENyZWNpbWllbnRvIGNvbnRpbnVvIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IDxicj4KKyBEaXZlcnNpZmljYWNpw7NuIGRlIG1lcmNhZG9zIDxicj4KCiMjIyAqKkluZHVzdHJpYSBBdXRvbW90cml6KioKIyMjIyAqKk3DqXhpY28qKgoKRGF0b3MgZGVsIEluc3RpdHV0byBOYWNpb25hbCBkZSBFc3RhZMOtc3RpY2EgeSBHZW9ncmFmw61hIChJTkVHSSkgcmVmaWVyZW4gcXVlIGVuIDIwMjIgc2UgcHJvZHVqZXJvbiAzLDMwOCwzNDYgdW5pZGFkZXMgZW4gTcOpeGljbywgcmVmbGVqYW5kbyB1biBpbmNyZW1lbnRvIGRlIDkuMiAlIGVuIHJlbGFjacOzbiBhbCAyMDIxLiBBbCBtb21lbnRvIGRlIGhhYmxhciBkZSB2ZW50YXMsIGVuIGVsIDIwMjIgc2UgY29tZXJjaWFsaXphcm9uIDEsMDg2LDA1OCB2ZWjDrWN1bG9zIGxpZ2Vyb3MgZW4gZWwgbWVyY2FkbyBpbnRlcm5vLCBsbyBxdWUgcmVwcmVzZW50w7MgdW4gYXVtZW50byBkZSA3LjAzJSBlbiByZWxhY2nDs24gY29uIDIwMjEsIGN1YW5kbyBzZSBjb21lcmNpYWxpemFyb24gMSwwMTQsNzM1IHVuaWRhZGVzLiAgPGJyPgoKSGFzdGEgZWwgcHJpbWVyIHRyaW1lc3RyZSBkZSAyMDIzLCBlbiBNw6l4aWNvIHNlIHByb2R1amVyb24gOTIyLDE3NyB2ZWjDrWN1bG9zIGxpZ2Vyb3MsIHVuIGF1bWVudG8gZGUgOC42MSUgZW4gcmVsYWNpw7NuIGNvbiBlbCBhw7FvIDIwMjIuIEVuIGV4cG9ydGFjaW9uZXMsIGR1cmFudGUgZWwgcGVyaW9kbyBlbmVyby1tYXJ6byBkZSAyMDIzIE3DqXhpY28gZW52acOzIGFsIGV4dHJhbmplcm8gNzQxLDMwNiB1bmlkYWRlcywgbG8gcXVlIHJlcHJlc2VudMOzIHVuIGluY3JlbWVudG8gZGUgOC44NiUgZW4gcmVsYWNpw7NuIGNvbiBlbCBtaXNtbyBwZXJpb2RvIGRlIDIwMjIsIGN1YW5kbyBzZSBleHBvcnRhcm9uIDY4MCw5OTIgdW5pZGFkZXMuICA8YnI+CgpBbGJlcnRvIEJ1c3RhbWFudGUsIGRpcmVjdG9yIGdlbmVyYWwgZGUgSU5BLCBtZW5jaW9uw7MgcXVlIGVsIHByb27Ds3N0aWNvIGRlIHByb2R1Y2Npw7NuIGRlIHZlaMOtY3Vsb3MgbGlnZXJvcyBwYXJhIDIwMjMgcm9uZGFyw6EgbG9zIDMuNSBtaWxsb25lcyBkZSB2ZWjDrWN1bG9zLCBlcyBkZWNpciwgdW4gaW5jcmVtZW50byBkZSA1LjYgJSBlbiBjb21wYXJhY2nDs24gY29uIDIwMjIuICA8YnI+CgpBc8OtIG1pc21vLCBzZSBtZW5jaW9uw7MgcXVlIGVuIGVsIDIwMjQgc2UgZXNwZXJhIHVuIGluY3JlbWVudG8gaW1wb3J0YW50ZSB5IG1heW9yIGEgbG9zIMO6bHRpbW9zIGHDsW9zLiBTZSBlc3BlcmEgcXVlIHNlYSBtw6FzIGRlIDglIHBhcmEgY2VycmFyIGNvbiB1bmEgcHJvZHVjY2nDs24gZGUgMy43OCBtaWxsb25lcyBkZSB2ZWjDrWN1bG9zIGxpZ2Vyb3MsIHkgYWwgY2llcnJlIGRlIDIwMjUgbGxlZ2FyIGEgbG9zIDQsMDAwLDAwMCBkZSB2ZWjDrWN1bG9zIHByb2R1Y2lkb3MgZW4gTcOpeGljby4gIDxicj4KCkNvbiByZWxhY2nDs24gYSBsYSBpbnZlcnNpw7NuIGVuIGVsIHNlY3RvciBhdXRvbW90cml6LCBlbiBlbCAyMDIyLCBsYSBGYWJyaWNhY2nDs24gZGUgQXV0b23Ds3ZpbGVzIHkgQ2FtaW9uZXMgcmVjaWJpw7MgdW5hIGludmVyc2nDs24gZXh0cmFuamVyYSBkaXJlY3RhIGRlIDIsNzA1LjQgbWlsbG9uZXMgZGUgZMOzbGFyZXMuICA8YnI+CgojIyMjIyAqKlByb2R1Y2Npw7NuIGRlIGF1dG9zKioKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KVG9wMTBGb3JlY2FzdCA8LSByZW5hbWUoRm9yZWNhc3RfTm9ydGhBbWVyaWNhX1Byb2QsIFRvdGFsX1ZlaGljbGVzID0idG90YWwgVmVoaWNsZXMiLCBQcm9kdWN0aW9uX05hbWU9IlByb2R1Y3Rpb24gTmFtZXBsYXRlIiwgQnJhbmQ9IlByb2R1Y3Rpb24gQnJhbmQiKSAjUmVuYW1lIGRlIGxhIHZhcmlhYmxlcywgeWEgcXVlIGNhdXNhbiBwcm9ibGVtYXMKVG9wMTBGb3JlY2FzdCA8LSBhcnJhbmdlKFRvcDEwRm9yZWNhc3QsIGRlc2MoVG90YWxfVmVoaWNsZXMpKSAjQ2FtYmlhbmRvIG9yZGVuIGRlbCBkYXRhZnJhbWUgcGFyYSBtb3N0cmFyIGxvcyB2YWxvcmVzIG3DoXMgYWx0b3MKVG9wMTBGb3JlY2FzdCA8LSBzbGljZV9oZWFkKFRvcDEwRm9yZWNhc3QsIG49MTApICNBaXNsYW5kbyBzb2xvIGxvcyAxMCByZXN1bHRhZG9zIG3DoXMgYWx0b3MKCmdncGxvdChUb3AxMEZvcmVjYXN0LCBhZXMoeD0gcmVvcmRlcihQcm9kdWN0aW9uX05hbWUsIFRvdGFsX1ZlaGljbGVzKSwgeT0gVG90YWxfVmVoaWNsZXMsIGZpbGwgPSBpbnRlcmFjdGlvbihCcmFuZCwgQ291bnRyeSkpKSArIAogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0tLjUpICsgCiAgICBnZ3RpdGxlKCJDYW50aWRhZCB0b3RhbCBkZSBsb3MgbW9kZWxvcyBkZSBhdXRvcyBtw6FzIHByb2R1Y2lkb3MgZW4gTm9ydGVhbcOpcmljYSIpICsgCiAgICB4bGFiKCJNb2RlbG8iKSArIHlsYWIoIkNhbnRpZGFkIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQoKIyBDcmVhY2nDs24gZGUgZ3JhZmljbyBwYXJhIHJlcHJlc2VudGFyIGxvcyBkYXRvcyBkZSBOb3J0ZWFtw6lyaWNhIGVuIGxhIHByb2R1Y2Npw7NuIGRlIG1vZGVsb3MgZGUgYXV0b3MuCmBgYAoKU2UgcHVlZGUgdmVyIHF1ZSBleGlzdGVuIG1vZGVsb3MgZGUgYXV0byBjb24gdW5hIGdyYW4gZGVtYW5kYSBkZSBwcm9kdWNjacOzbiBlbiBOb3J0ZWFtw6lyaWNhLCBkb3MgZGUgZWxsb3Mgc2llbmRvIHByb2R1Y2lkbyBlbiBNw6l4aWNvLCBzaWVuZG8gZWwgVm9sa3N3YWdlbiBKZXR0YSBlbiBQdWVibGEgeSBlbCBKZWVwIENvbXBhc3MgZW4gVG9sdWNhLiBFbiBFc3RhZG9zIFVuaWRvcyBwb2RlbW9zIHZlciBxdWUgc2UgcHJvZHVjZW4gYW1ib3MgZGUgbG9zIGNhcnJvcyBjb24gbWF5b3IgY2FudGlkYWQgZGUgdW5pZGFkZXMsIHNpZW5kbyBlbCBIb25kYSBBY2NvcmQgZW4gTWFyeXN2aWxsZSB5IGVsIFRveW90YSBDYW1yeSBlbiBzdXMgMiBwbGFudGFzIGRlIEdlb3JnZXRvd24uICA8YnI+CgojIyMjIyAqKkFtZW5hemFzKiogCisgRGVwZW5kZW5jaWEgZGUgbGEgZXhwb3J0YWNpw7NuIDxicj4KKyBDb21wZXRlbmNpYSBnbG9iYWwgPGJyPgorIFZ1bG5lcmFiaWxpZGFkIGEgY2FtYmlvcyBlbiBwb2zDrXRpY2FzIGNvbWVyY2lhbGVzIDxicj4KCiMjIyMjICoqT3BvcnR1bmlkYWRlcyoqIAorIENyZWNpbWllbnRvIGRlIGxhIHByb2R1Y2Npw7NuIHkgZXhwb3J0YWNpb25lcyA8YnI+CisgSW52ZXJzacOzbiBleHRyYW5qZXJhIGRpcmVjdGEgPGJyPgorIERpdmVyc2lmaWNhY2nDs24gZGUgcHJvZHVjdG9zIDxicj4KKyBDb2xhYm9yYWNpw7NuIGVuIGludmVzdGlnYWNpw7NuIHkgZGVzYXJyb2xsbyA8YnI+CisgQ3JlY2ltaWVudG8gZWNvbsOzbWljbyA8YnI+CgojIyMjICoqVVMqKgpFcyB1bmEgZGUgbGFzIHByaW5jaXBhbGVzIGluZHVzdHJpYXMgYXV0b21vdHJpY2VzIGRlbCBtdW5kbywgY29udHJpYnV5ZSBjb24gYWwgbWVub3MgZWwgMyUgZGVsIFByb2R1Y3RvIEludGVybm8gQnJ1dG8gKFBJQikgZ2VuZXJhbCBkZWwgcGHDrXMuIEVsIHBhw61zIGhhIGZhYnJpY2FkbyBjZXJjYSBkZSA4LDgyIG1pbGxvbmVzIGRlIHZlaMOtY3Vsb3MgZW4gMjAyMCwgY2VyY2EgZGUgdW4gMTklIG1lbm9zIHF1ZSBlbCBhw7FvIGFudGVyaW9yLiAoSW5mb3JtZSBEZWwgTWVyY2FkbyBBdXRvbW90cml6IGRlIEFtw6lyaWNhIERlbCBOb3J0ZSB8IFRhbWHDsW8sIFBhcnRpY2lwYWNpw7NuLCBDcmVjaW1pZW50byBZIFRlbmRlbmNpYXMgKDIwMjItMjcpLCAyMDIyKSAgPGJyPgoKRWwgZ29iaWVybm8sIGRlIGlndWFsIGZvcm1hIHNlIGVuY3VlbnRyYSBhcG95YW5kbyBsYSBpbnZlc3RpZ2FjacOzbiB5IGVsIGRlc2Fycm9sbG8gZGUgdmVow61jdWxvcyBlbMOpY3RyaWNvcyBlbiBmb3JtYSBkZSBhc2lnbmFjaW9uZXMgYW51YWxlcyBhIGxhIE9maWNpbmEgZGUgRWZpY2llbmNpYSBFbmVyZ8OpdGljYSB5IEVuZXJnw61hIFJlbm92YWJsZSAoRUVSRSkuIChJbmZvcm1lIERlbCBNZXJjYWRvIEF1dG9tb3RyaXogZGUgQW3DqXJpY2EgRGVsIE5vcnRlIHwgVGFtYcOxbywgUGFydGljaXBhY2nDs24sIENyZWNpbWllbnRvIFkgVGVuZGVuY2lhcyAoMjAyMi0yNyksIDIwMjIpICA8YnI+CgpGb3JkLCBHZW5lcmFsIE1vdG9ycywgRmlhdC1DaHJ5c2xlciBzb24gYWxndW5vcyBkZSBsb3MgYWN0b3JlcyBpbXBvcnRhbnRlcyBlbiBsYSBpbmR1c3RyaWEgYXV0b21vdHJpeiBkZSBBbcOpcmljYSBkZWwgTm9ydGUuIEVzdGEgaW5kdXN0cmlhIGVzdHV2byBkb21pbmFkYSBhbnRlcmlvcm1lbnRlIHBvciBsb3MgdHJlcyBncmFuZGVzLCBHZW5lcmFsIE1vdG9ycywgQ2hyeXNsZXIgeSBGb3JkLiBIb3kgZW4gZMOtYSBGb3JkLCBHZW5lcmFsIE1vdG9ycywgRmlhdC1DaHJ5c2xlciBzb24gYWxndW5vcyBkZSBsb3MgYWN0b3JlcyBpbXBvcnRhbnRlcy4gKEluZm9ybWUgRGVsIE1lcmNhZG8gQXV0b21vdHJpeiBkZSBBbcOpcmljYSBEZWwgTm9ydGUgfCBUYW1hw7FvLCBQYXJ0aWNpcGFjacOzbiwgQ3JlY2ltaWVudG8gWSBUZW5kZW5jaWFzICgyMDIyLTI3KSwgMjAyMikgIDxicj4KCiMjIyMjICoqQW1lbmF6YXMqKiAKKyBEaXNtaW51Y2nDs24gZW4gbGEgcHJvZHVjY2nDs24gPGJyPgorIENvbXBldGVuY2lhIGdsb2JhbCA8YnI+CgojIyMjIyAqKk9wb3J0dW5pZGFkZXMqKiAKKyBJbm5vdmFjacOzbiB0ZWNub2zDs2dpY2EgPGJyPgorIERpdmVyc2lmaWNhY2nDs24gZGUgbGEgY2FydGVyYSA8YnI+CisgRXhwb3J0YWNpb25lcyA8YnI+CgoKIyMjICoqUHJlY2lvIGRlbCBkb2xhcioqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm14X2V4Y2hhbmdlX3JhdGUgPC0gdHMoRXhjaGFuZ2VfcmF0ZSRteF9leGNoYW5nZV9yYXRlLCBmcmVxdWVuY3k9MTIsIHN0YXJ0PWMoMjAxNywxKSkgI0FkYXB0YWNpw7NuIGRlbCBkYXRhZnJhbWUgcGFyYSBoYWNlciB1bmEgc2VyaWUgZGUgdGllbXBvCnBsb3QudHMobXhfZXhjaGFuZ2VfcmF0ZSwgbWFpbj0iTVggLSBVU0EgRXhjaGFuZ2UgUmF0ZSIsIHhsYWIgPSAiWWVhcnMiLCB5bGFiID0gIkV4Y2hhbmdlIFJhdGUiKQojIENyZWFjacOzbiBkZSBzZXJpZSBkZSB0aWVtcG8gcGFyYSByZXByZXNlbnRhciBsYSB2YXJpYWNpw7NuIGRlbCBwZXNvIHkgZMOzbGFyIHBvciBsb3MgYcOxb3MuCmBgYAoKUG9kZW1vcyB2ZXIgcXVlIGVuIGHDsW9zIHJlY2llbnRlcyBlbCB2YWxvciBkZWwgcGVzbyBtZXhpY2FubyBjb250cmEgZWwgZMOzbGFyIGhhIHNpZG8gbXV5IHZvbMOhdGlsLCBlc3RvIHNlIGRlYmUgYSBxdWUgZWwgZ29iaWVybm8gZGUgRXN0YWRvcyBVbmlkb3MgaGEgY29udGludWFkbyBlbGV2YW5kbyBsYXMgdGFzYXMgZGUgaW50ZXJlc2VzLCBoYWNpZW5kbyBzdSBlY29ub23DrWEgbWVub3Mgc2VndXJhIHkgbGEgZGUgTcOpeGljbyBtw6FzIHNlZ3VyYSBlbiBjb21wYXJhY2nDs24gcGFyYSBsb3MgaW52ZXJzaW9uaXN0YXMgZW4gY29tcGFyYWNpw7NuLiAgPGJyPgoKRW4gbGEgdmlzdWFsaXphY2nDs24gc2UgbXVlc3RyYSBjb21vIGVsIHBlc28gbWV4aWNhbm8gc2UgaGEgaWRvIGFwcmVjaWFuZG8gcGF1bGF0aW5hbWVudGUgZGUgMjAyMiBhIDIwMjMsIGVzdG8gc2kgYmllbiBwdWVkZSByZXN1bHRhciBmYXZvcmFibGUgcGFyYSBsYSBlY29ub23DrWEgbWV4aWNhbmEsIHBhcmEgZW1wcmVzYXMgY29uIG9wZXJhY2lvbmVzIGVuIE1leGljbyAocHJvZHVjY2nDs24pIHkgRXN0YWRvcyBVbmlkb3MgKGNvbWVyY2lhbGl6YWNpw7NuKSBjb21vIEZPUk0sIGVzdG8gcmVzdWx0YSBlbiB1biBpbmNyZW1lbnRvIGVuIGxvcyBjb3N0b3MgZGUgcHJvZHVjY2nDs24geSB1biB2YWxvciBtZW5vciBwZXJjaWJpZG8gZGUgdmVudGFzLCBsbyBjdWFsIG9jYWNpb25hcsOhIHF1ZSBsb3MgbWFyZ2VuZXMgZGUgbGEgY29tcGHDscOtYSBzZSByZWR1emNhbiBvIGJpZW4sIHN1cyBwcmVjaW9zIGFsIGNsaWVudGUgaW5jcmVtZW50ZW4uICA8YnI+CgoKIyMgKipGT0RBIENydXphZG8qKgojIyMgKipGb3J0YWxlemFzKioKCiMjIyMgKipEZXBhcnRhbWVudG8gZGUgaW5nZW5pZXLDrWEgcGFyYSBsYSBpbm5vdmFjacOzbiBjb250aW51YSBlbiBlbCBlbXBhcXVlIGRlIGF1dG8gcGFydGVzIGludGVybmFzKiogCgorIEZPUk0gaGEgc2lkbyByZWNvbm9jaWRvIGVuIGRpdmVyc2FzIG9jYXNpb25lcyBjb21vIGFjcmVlZG9yIGRlbCBQcmVtaW8gTmFjaW9uYWwgZGUgRW52YXNlIChFbCBFY29ub21pc3RhLCAyMDIyKSA8YnI+CgojIyMjICoqQnVlbmEgcmVwdXRhY2nDs24gY29uIHN1cyBjbGllbnRlcyoqIAorIExhIGVzdHJhdGVnaWEgZGUgRk9STSBjb25zaXN0ZSBlbiB1biBkZXN0YWNhZG8gc2VydmljaW8gYWwgY2xpZW50ZTsgbGEgZW1wcmVzYSBzZSBkaWZlcmVuY2lhIGFsIHRlbmVyIGV4Y2VsZW50ZXMgdGllbXBvcyBkZSByZXNwdWVzdGEgeSBzb2x1Y2lvbmVzIGlubm92YWRvcmFzIHBhcmEgbGFzIG5lY2VzaWRhZGVzIGRlIHN1cyBjbGllbnRlcyBmb21lbnRhbmRvIHVuYSBjb211bmljYWNpw7NuIGRpcmVjdGEgeSBhbnRpY2lwYW5kbyBsYSBkZW1hbmRhLiAgPGJyPgoKIyMjIyAqKkVtcHJlc2EgY29uIGFsdGEgcmVudGFiaWxpZGFkIGRlYmlkbyBhIHN1IHNlbGVjdGl2aWRhZCBkZSBjbGllbnRlcyoqCisgRk9STSBoYWNlIG5lZ29jaW9zIHNvbG8gY29uIGNsaWVudGVzIHF1ZSBwcmlvcmljZW4gY2FsaWRhZCB5IHJlbGFjaW9uZXMgZHVyYWRlcmFzIHNvYnJlIHByZWNpby4gPGJyPgoKIyMjIyAqKkZsZXhpYmlsaWRhZCBkZSBwcm9kdWNjacOzbioqIAorIExhIGVtcHJlc2EgdHJhYmFqYSBjb24gYmxvcXVlcyBkZSBwcm9kdWNjacOzbiBlbiBsdWdhciBkZSBsw61uZWFzIGRlYmlkbyBhIHF1ZSBwZXJtaXRlIG1heW9yIGluZGVwZW5kZW5jaWEgZGUgbG9zIHByb2Nlc29zLCByZXN1bHRhIG3DoXMgc2VuY2lsbG8gZGUgY2FwYWNpdGFyIHBlcnNvbmFsIHkgZGlzbWludXllIHByb2JhYmlsaWRhZGVzIGRlIGluY3VtcGxpbWllbnRvIGNvbiBlbCBjbGllbnRlLiAgPGJyPgoKIyMjIyAqKkZsb3RpbGxhIGRlIGNhbWlvbmVzIHByb3BpYSoqCisgRk9STSBkYSBlbCBleHRyYSBjb24gZWwgc2VydmljaW8gYSBzdXMgY2xpZW50ZXMgeSBzZSBlbmNhcmdhIGRlbCB0cmFuc3BvcnRlIGRlbCBwcm9kdWN0byBoYXN0YSBsYXMgcGxhbnRhcyBkZWwgY2xpZW50ZS4gTGEgZW1wcmVzYSBjdWVudGEgYWN0dWFsbWVudGUgY29uIHVuYSBmbG90aWxsYSBkZSAzIGNhbWlvbmVzIGxvcyBjdWFsZXMgbGUgcGVybWl0ZW4gdW5hIGVmaWNpZW5jaWEgZW4gY29zdG9zLiA8YnI+CgojIyMgKipEZWJpbGlkYWRlcyoqCiMjIyMgKipGYWx0YSBkZSB1bmEgZXN0cmF0ZWdpYSBkZSBJbnRlbGlnZW5jaWEgQ29tZXJjaWFsKioKKyBFbiBjb21wYXJhdGl2YSBhIHN1cyBjb21wZXRpZG9yZXMsIEZPUk0gYWwgc2VyIHVuYSBlbXByZXNhIG1lZGlhbmEgY29uIHBvY29zIGHDsW9zIGVuIGxhIGluZHVzdHJpYSAqKm5vIGN1ZW50YSBjb24gdW5hIGVzdHJhdGVnaWEgZGUgaW50ZWxpZ2VuY2lhIGNvbWVyY2lhbCoqLiBMYSBlbXByZXNhIG5vIHRpZW5lIHNpc3RlbWFzIGRlIG1hbmVqbyB5IHByb2Nlc2FtaWVudG8gZGUgZGF0b3MgcGFyYSBsYSB0b21hIGRlIGRlY2lzaW9uZXMuIFN1IEVSUCBzb2Z0d2FyZSBzZXLDoSBjYW1iaWFkbyBhIHBhcnRpciBkZSBFbmVybyAyMDIzIHBhcmEgZGFyIHVuIHBhc28gYSBsYSB0cmFuc2Zvcm1hY2nDs24gZGlnaXRhbCBkZWwgcmVnaXN0cm8gZGUgbGEgaW5mb3JtYWNpw7NuLiA8YnI+CgojIyMjICoqQWx0YSBkZXBlbmRlbmNpYSBkZWwgQ0VPKiogCisgRk9STSBhIGRpZmVyZW5jaWEgZGUgc3VzIGNvbXBldGlkb3JlcyBlcyBhbHRhbWVudGUgZGVwZW5kaWVudGUgZGUgbGFzIGlkZWFzLCBpbWFnZW4geSBlc2Z1ZXJ6b3MgZGUgbmVnb2NpYWNpw7NuIGRlIEZlbGlwZSBGbG9yZXMgKENFTykgcGFyYSBzdSBmdW5jaW9uYW1pZW50by4gRk9STSB0aWVuZSBlbiBMaW5rZWRJbiBtZW5vcyBkZSAzMDAgc2VndWlkb3JlcyBtaWVudHJhcyBxdWUgc3UgQ0VPIGN1ZW50YSBjb24gYXJyaWJhIGRlIDIwMDAgKExpbmtlZEluLCAyMDIzKS4gQSBmdXR1cm8gbGEgZW1wcmVzYSByZXF1aWVyZSBjcmVhciBkZXBhcnRhbWVudG9zIGVuY2FyZ2Fkb3MgZGUgZXN0b3MgcHJvY2Vzb3MsIGNvbnN0cnVpciB1bmEgaW1hZ2VuIGluZGVwZW5kaWVudGUgeSB0cmFuc21pdGlyIGxhIHZpc2nDs24geSB2YWxvcmVzIGRlbCBFbXByZXNhcmlvLiA8YnI+CgojIyMjICoqTGltaXRhY2lvbmVzIGVuIGFsY2FuY2UgZGUgZGlzdHJpYnVjacOzbiBlbiBFc3RhZG9zIFVuaWRvcyoqCisgRGViaWRvIGEgbG9zIGFsdG9zIGNvc3RvcyBkZSBsb3MgZmxldGVzIGVuIEVFLlVVLiBhY3R1YWxtZW50ZSBGT1JNIHNvbG8gcmVhbGl6YSBlbnRyZWdhcyBsb2NhbGVzIGVuIGxvcyBhbHJlZGVkb3JlcyBkZSBzdSBjZW50cm8gZGUgZGlzdHJpYnVjacOzbiBlbiBTYW4gQW50b25pby4gPGJyPgoKIyMjIyAqKkFsdGEgcm90YWNpw7NuIGRlbCBwZXJzb25hbCBlbiBwaXNvKiogCisgRk9STSBjdWVudGEgY29uIHVuYSBhbHTDrXNpbWEgcm90YWNpw7NuIGVuIHBpc28sIHVuIGdyYW4gcG9yY2VudGFqZSBkZSBzdXMgZW1wbGVhZG9zIHNvbG8gZHVyYW4gdW4gY29ydG8gcGVyaW9kbyBkZSB0aWVtcG8gYW50ZXMgZGUgaXJzZSB5IG5vIGRhciBleHBsaWNhY2lvbmVzLiA8YnI+CgojIyMgKipPcG9ydHVuaWRhZGVzKioKIyMjIyAqKk9wb3J0dW5pZGFkZXMgZW4gb3RyYXMgaW5kdXN0cmlhcyBjb24gYWx0byB2YWxvciBkZWwgY2FydMOzbioqIAorIEVsIGNhcnTDs24gZXMgdW4gbWF0ZXJpYWwgZGUgZW1wYXF1ZSBtdXkgdmFsb3JhZG8gZW4gbGFzIGluZHVzdHJpYXMgY29ycmVjdGFzLCBubyBzb2xvIHBvciBzdSB2ZXJzYXRpbGlkYWQgcGVybyB0YW1iacOpbiBwb3Igc3Ugc3VzdGVudGFiaWxpZGFkLiBJbmR1c3RyaWFzIGNvbW8gbGEgbcOpZGljYSB5IGFlcm9lc3BhY2lhbCBzb24gYWxndW5hcyBkZSBsYXMgY3VhbGVzIHZhbG9yYW4geSByZXF1aWVyZW4gZW1wYXF1ZXMgZGUgY2FydMOzbiBvIHJldG9ybmFibGVzIGNvbiBhbHRvIG5pdmVsIGRlIGluZ2VuaWVyw61hIHBhcmEgbGEgcHJvdGVjY2nDs24gYWwgdHJhc2xhZG8gZGUgY29tcG9uZW50ZXMuICA8YnI+CgojIyMjICoqTmVjZXNpZGFkIGRlIGFnaWxpemFjacOzbiBkZSBsYSBjYWRlbmEgZGUgc3VtaW5pc3Ryb3MgZGVsIHNlY3RvciBhdXRvbW90cml6KioKKyBMYXMgY2FkZW5hcyBkZSBzdW1pbmlzdHJvIGRlbCBzZWN0b3IgYXV0b21vdHJpeiBhw7puIG5vIGVzdMOhbiAxMDAlIHJlY3VwZXJhZGFzIGRlbCBpbXBhY3RvIHF1ZSB0dXZvIGVsIGNvbGFwc28gZGUgZXN0YSBlbiBlbCBhw7FvIDIwMjEgKEVzY3VkZXJvLCAyMDIyKS4gTGFzIGFtZW5hemFzIGRlIGZ1dHVyYXMgZGlzcnVwY2lvbmVzIHNpZ3VlbiBsYXRlbnRlcywgZXMgcG9yIGVsbG8gcXVlIGVsIHNlY3RvciBhdXRvbW90cml6IGxlIHBvbmUgw6luZmFzaXMgYSBsYSBlZmljaWVudGl6YWNpw7NuIGRlIGxhIGNhZGVuYSBkZSBkaWZlcmVudGVzIGZvcm1hcywgdW5hIGRlIGVzdGFzIGVzIGVsIGVtcGFxdWUgZGUgY2FsaWRhZCBwYXJhIGVsIHRyYXNsYWRvIGRlIGF1dG9wYXJ0ZXMuIEVuIHTDqXJtaW5vcyBkZWwgbmVhcnNob3JpbmcsIGxhcyBlbXByZXNhcyBidXNjYW4gc29sdWNpb25lcyBkZSBlbXBhcXVlIGNvbnZlbmllbnRlcyBlbiB0aWVtcG9zLCBjb3N0b3MgeSB1YmljYWNpw7NuLiAgIDxicj4KCiMjIyMgKipJbmNyZW1lbnRvIGVuIGxhIGRlbWFuZGEgZGUgYXV0b3MgaMOtYnJpZG9zIHkgZWzDqWN0cmljb3MqKgorIERlIGFjdWVyZG8gY29uIGNpZnJhcyBvZmljaWFsZXMgZGVsIEluZWdpLCBlbiAyMDIxIGxhIHZlbnRhIGRlIHZlaMOtY3Vsb3MgaMOtYnJpZG9zIHByZXNlbnTDsyB1biBpbmNyZW1lbnRvIGRlbCAxMjYlIGVuIGNvbXBhcmFjacOzbiBhbCBhw7FvIGFudGVyaW9yLiBMYSBkZW1hbmRhIGRlIGVzdG9zLCBhdW1lbnTDsyBlbiA1MCUgZW4gZWwgbWlzbW8gcGVyaW9kbyAoR29uesOhbGV6LCAyMDIyKS4gRW4gRXN0YWRvcyBVbmlkb3MsIGxhIGNvbnN1bHRvcmEgRVkgZXN0aW1hIHF1ZSBwYXJhIDIwMjMsIGVsIDQzJSBkZSBsYXMgdHJhbnNhY2Npb25lcyBlbiBlbCBwYcOtcyBzZXLDoW4gcmVwcmVzZW50YWRhcyBwb3IgZXN0ZSB0aXBvIGRlIHZlaMOtY3Vsb3MgKDIwMjMpLiBFc3RhcyBjaWZyYXMgZGVub3RhbiBsYSBhbHRhIGRlbWFuZGEgZGUgYXV0b3MgZWzDqWN0cmljb3MgeSBwb3IgY29uc2lndWllbnRlLCBlbXBhcXVlcyBlc3BlY2lhbGl6YWRvcyBwYXJhIGVsIHRyYW5zcG9ydGUgZGUgbGFzIGF1dG9wYXJ0ZXMuIDxicj4KCiMjIyMgKipOZWFyc2hvcmluZyBlbiBNw6l4aWNvKioKKyBFbCBuZWFyc2hvcmluZyBlcyBsYSB0ZW5kZW5jaWEgZGVsIG1vdmltaWVudG8gZGUgcGFydGVzIGRlIGxhIGNhZGVuYSBkZSBzdW1pbmlzdHJvIGEgdWJpY2FjaW9uZXMgZXN0cmF0w6lnaWNhcyBjb24gbGEgZmluYWxpZGFkIGRlIHJlZHVjY2nDs24gZGUgY29zdG9zIGUgaW5jcmVtZW50YXIgbGEgZWZpY2llbmNpYS4gTcOpeGljbyBlcyB1biBwYcOtcyBhbHRhbWVudGUgYmVuZWZpY2lhZG8gcG9yIGVzdGEgdGVuZGVuY2lhIGRlYmlkbyBhIHN1IHViaWNhY2nDs24gZXN0cmF0w6lnaWNhLCB0cmF0YWRvcyBkZSBsaWJyZSBjb21lcmNpbywgbWFubyBkZSBvYnJhIGNhbGlmaWNhZGEgeSBjb3N0b3MgbGFib3JhbGVzIGNvbXBldGl0aXZvcyAoUHJ5c21leCwgMjAyMykuIFNpbiBlbWJhcmdvLCBlbCBtYXlvciBiZW5lZmljaWFkbyBlcyBOdWV2byBMZcOzbiwgRm9yYmVzIHJlcG9ydGEgcXVlIGVsIGVzdGFkbyBoYSBjYXB0YWRvIOKAnGVsIDcyJSBkZSBsYXMgZW1wcmVzYXMgYXRyYcOtZGFzIGEgTcOpeGljbyBwb3IgZWwgbmVhcnNob3JpbmfigJ0gKEhlcm7DoW5kZXosIDIwMjMpLiA8YnI+CgoKIyMjICoqQW1lbmF6YXMqKgojIyMjICoqSW50ZXJydXBjaW9uZXMgZW4gZWwgc3VtaW5pc3RybyBkZSBwZXRyw7NsZW8gYWZlY3RhIGxvcyBjb3N0b3MgZGUgbGEgbG9nw61zdGljYSB5IGxhIGluZmxhY2nDs24qKiAKKyBMYXMgZnVlcnRlcyBpbnRlcnJ1cGNpb25lcyBlbiBsYSBjYWRlbmEgZGUgc3VtaW5pc3RybyBkZWwgcGV0csOzbGVvIHJ1c28gcG9yIGVsIGFjdHVhbCBjb25mbGljdG8gcG9sw610aWNvIHkgc29jaWFsIGRlIGxhIG5hY2nDs24gaGEgYWZlY3RhZG8gbG9zIHByZWNpb3MgZGVsIGNvbWJ1c3RpYmxlIHNpZ25pZmljYXRpdmFtZW50ZSBlbiBFc3RhZG9zIFVuaWRvcyB5IEV1cm9wYS4gRUUuVVUuIGltcG9ydGEgYWxyZWRlZG9yIGRlbCAyMSUgZGUgc3UgcGV0csOzbGVvIHJlZmluYWRvIGRlIFJ1c2lhIChPRUMsIDIwMjMpIGltcGFjdGFuZG8gZnVlcnRlbWVudGUgZW4gbGEgaW5mbGFjacOzbiBkZSBsb3MgcHJlY2lvcyBkZWwgY29tYnVzdGlibGUgeSBsYSBsb2fDrXN0aWNhLiBUaGUgTG9naXN0aWNzIFdvcmxkLCBtZW5jaW9uw7MgcXVlIGVzdGUgYXVtZW50byBvY2FzaW9uw7MgdW4gZGVjbGl2ZSBlbiBlbCBjb25zdW1vIHJlZ2lvbmFsIGRlIGdhc29saW5hIGRlbCAxJSwgYXByb3hpbWFkYW1lbnRlIDEgbWlsbMOzbiBkZSBiYXJyaWxlcyBhbCBkw61hIChKdWFyZXosIDIwMjIpLiA8YnI+CgojIyMjICoqQ29tcGV0aWRvcmVzIGludGVybmFjaW9uYWxlcyBjb24gbWF5b3IgY2FwYWNpZGFkIHByb2R1Y3RpdmEqKgorIEZPUk0sIGRlIGFjdWVyZG8gY29uIGVsIENFTywgc2UgZW5mcmVudGEgZW4gbGEgaW5kdXN0cmlhIGludGVybmFjaW9uYWwgZGUgc29sdWNpb25lcyBkZSBlbXBhcXVlIGRlIGNhcnTDs24gcGFyYSBlbCBzZWN0b3IgYXV0b21vdHJpeiBjb24gY29tcGV0aWRvcmVzIGJpZW4gZXN0YWJsZWNpZG9zLCBtw6FzIGFudGlndW9zIHkgZGUgcmVub21icmUgY29tbyBsbyBzb24gUsOtbyBHcmFuZGUsICBCcmFkZm9yZCwgT1JCSVMsIEhFTFNBLCBWZXJzYXRlY2gsICBjb25UZXlvciwgVmljdG9yeSBQYWNrYWdpbmcgKDIwMjMpLiBFc3RvcyBhIHN1IHZleiBkZWJpZG8gYSBsYSBpbXBsZW1lbnRhY2nDs24gZGUgZWNvbm9tw61hcyBkZSBlc2NhbGEgeSBhdXRvbWF0aXphY2nDs24gbG9ncmFuIG9mcmVjZXIgYWwgY2xpZW50ZSBwcmVjaW9zIG3DoXMgYmFqb3MuIDxicj4KCiMjIyMgKipWb2xhdGlsaWRhZCBlbiBsYSB0YXNhIGRlIGNhbWJpbyAoVVNEIC0gTVhOKSoqCisgRGViaWRvIGEgbGFzIGRlY2lzaW9uZXMgdG9tYWRhcyBwb3IgbGEgUmVzZXJ2YSBGZWRlcmFsIGRlIEVzdGFkb3MgVW5pZG9zIGVuIHN1YmlyIGxhcyB0YXNhcyBkZSBpbnRlcsOpcyBwYXJhIGRlc2FjZWxlcmFyIGxhIGVjb25vbcOtYSwgbXVjaG9zIGludmVyc2lvbmlzdGFzIGVzdMOhbiBidXNjYW5kbyBlY29ub23DrWFzIGNvbiBjb25kaWNpb25lcyBiYW5jYXJpYXMgbcOhcyBmYXZvcmFibGVzIGNvbW8gTcOpeGljbyAoUml2ZXJhLCAyMDIzKS4gRWwgTVhOIGRlc2RlIGVsIHByaW1lciB0cmltZXN0cmUgZGVsIGHDsW8gc2UgaGEgZXN0YWRvIGFwcmVjaWFuZG8gZW4gY29tcGFyYWNpw7NuIGFsIFVTRCwgc2luIGVtYmFyZ28gbGFzIGZsdWN0dWFjaW9uZXMgZGUgbGEgdGFzYSBkZSBjYW1iaW8gc29uIHVuIGZhY3RvciBxdWUgYWZlY3RhIGEgbGFzIGVtcHJlc2FzIGNvbW8gRk9STSBjb24gdmVudGFzIGVuIFVTRCB5IHByb2R1Y2Npw7NuKGNvc3RvcykgZW4gTVhOLiAgPGJyPgoKIyMjIyAqKkVsZWNjaW9uZXMgZG9ibGVzIGVuIEVFLlVVLiB5IE3DqXhpY28qKgorIEVuIDIwMjQgc2UgbGxldmFyw6FuIGEgY2FibyBlbGVjY2lvbmVzIHRhbnRvIGVuIEVzdGFkb3MgVW5pZG9zIGNvbW8gZW4gTcOpeGljbywgZXN0ZSBlcyB1biBzdWNlc28gZWwgY3VhbCByZXByZXNlbnRhIHVuIHJpZXNnbyBwYXJhIGxhIGVzdGFiaWxpZGFkIGRlIGFtYm9zIHBhw61zZXMgdGFudG8gZWNvbsOzbWljYSBjb21vIHNvY2lhbC4gTGFzIGVsZWNjaW9uZXMgcHVlZGVuIHRyYWVyIGNvbnNpZ28gZGlmZXJlbnRlcyBwYXJhZGlnbWFzIGRlIGxvcyBsw61kZXJlcyBlbiBsYXMgcmVsYWNpb25lcyBjb21lcmNpYWxlcyBlbnRyZSBNw6l4aWNvIHkgRUUuVVUuIGFzw60gY29tbyBpbmVzdGFiaWxpZGFkIGVuIGxhIHRhc2EgZGUgY2FtYmlvLiAgIAoKIyMjIyAqKkVzY2FzZXogZGUgbWFubyBkZSBvYnJhIGVuIE51ZXZvIExlw7NuKioKKyBMYSBDw6FtYXJhIGRlIGxhIEluZHVzdHJpYSBkZSBsYSBUcmFuc2Zvcm1hY2nDs24gKENBSU5UUkEpIHJlcG9ydMOzIHF1ZSBlbCA0My44JSBkZSBsYXMgZW1wcmVzYXMgZGVsIGVzdGFkbyBlc3TDoW4gc2llbmRvIGFmZWN0YWRhcyBwb3IgbGEgZmFsdGEgZGUgcGVyc29uYWwgY2FwYWNpdGFkbyB5IGVzcGVjaWFsaXphZG8gKEhlcm7DoW5kZXosIDIwMjMpLiBDb24gbGFzIHRlbmRlbmNpYXMgZGVsIE5lYXJzaG9yaW5nLCBsYSBkZW1hbmRhIHBvciBwcm9mZXNpb25hbGVzIGVzcGVjaWFsaXphZG9zIGVzdMOhIGVuIGF1bWVudG8gZW4gTnVldm8gTGXDs24uIERlIGFjdWVyZG8gY29uIEZvcmJlcywg4oCcZW4gZXNlIG1vbWVudG8gMTMuNCUgZGUgbGFzIGNvbXBhw7HDrWFzIHJlcG9ydGFyb24gYWZlY3RhY2lvbmVzIHBvciBubyBlbmNvbnRyYXIgdHJhYmFqYWRvcmVzIHBhcmEgbGFzIGbDoWJyaWNhcyB5IGzDrW5lYXMgZGUgcHJvZHVjY2nDs27igJ0gKEhlcm7DoW5kZXosIDIwMjMpLgoKIyMjICoqRk9EQSBDcnV6YWRvIC0gSW1hZ2VuKioKIVtdKC9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL0V2aWRlbmNpYSAxL0ltcGFjdEVmZm9ydCBNYXRyaXggQnJhaW5zdG9ybS0yLnBuZykKCiMjIyAqKkVzdHJhdGVnaWFzIEZPREEqKgojIyMjICoqRXN0cmF0ZWdpYXMgTWluaSAtIE1heGkqKgorIEFudGUgbGEgYW1lbmF6YSBkZSBjb21wZXRpZG9yZXMgaW50ZXJuYWNpb25hbGVzIGNvbiBwcmVjaW9zIG3DoXMgY29tcGV0aXRpdm9zLCBGT1JNIGRlYmUgZGUgYWNlbnR1YXIgc3UgZGlmZXJlbmNpYWNpw7NuIGEgdHJhdsOpcyBkZWwgc2VydmljaW8gYWwgY2xpZW50ZS4gTGEgZW1wcmVzYSBhY3R1YWxtZW50ZSBzZSBkZXNhcnJvbGxhIHBvciBzdSByw6FwaWRhIHJlc3BvbnNpdmlkYWQgeSBhbnRpY2lwYWNpw7NuIGEgbGEgZGVtYW5kYSBkZWwgY2xpZW50ZSBsb2dyYW5kbyBhZHF1aXJpciB1biBwb3J0YWZvbGlvIHJlZHVjaWRvIGRlIGNsaWVudGVzIGxlYWxlcy4gU2kgZXN0byBzZSByZXBsaWNhIGEgbWF5b3IgZXNjYWxhIGxhIGVtcHJlc2Egbm8gdGVuZHLDoSBwcm9ibGVtYSBhbCBjb21wZXRpciBjb24gZW1wcmVzYXMgaW50ZXJuYWNpb25hbGVzLgoKKyBGT1JNIHB1ZWRlIGV2aXRhciBhZmVjY2lvbmVzIGVuIHN1IHByb2R1Y2Npw7NuIHBvciBsYSBmYWx0YSBkZSBtYW5vIGRlIG9icmEgZXNwZWNpYWxpemFkYSBlbiBOdWV2byBMZcOzbiBkZWJpZG8gYSBzdSBtb2RlbG8gZGUgcHJvZHVjY2nDs24uIEdyYWNpYXMgYSBzdSBwcm9kdWNjacOzbiBlbiBibG9xdWVzLCBGT1JNIHB1ZWRlIGNhcGFjaXRhciBlbXBsZWFkb3MgcsOhcGlkYW1lbnRlIHBhcmEgcXXDqSBkZXNlbXBlw7FlbiBkaWZlcmVudGVzIHRpcG9zIGRlIGZ1bmNpb25lcy4KCiMjIyMgKipFc3RyYXRlZ2lhcyBNaW5pIC0gTWluaSoqCisgTGxldmFyIGEgY2FibyB1biBwcm95ZWN0byBkZSBJbnRlbGlnZW5jaWEgQ29tZXJjaWFsIHBhcmEgZWwgcmVnaXN0cm8gZGUgZGF0b3MgY2xhdmVzIHF1ZSBtZWpvcmVuIGxvcyBlc2Z1ZXJ6YXMgZGUgdmVudGFzIGRlIGxhIGVtcHJlc2EgeSBhIHN1IHZleiBwZXJtaXRhbiBpbmRlcGVuZGl6YXIgbGFzIGVzdHJhdGVnaWFzIGRlbCBDRU8uIEEgdHJhdsOpcyBkZWwgdXNvIGRlIGxhIGFuYWzDrXRpY2EgZGUgZGF0b3MsIGxhIGVtcHJlc2EgcG9kcsOhIHJlZHVjaXIgc3VzIGNvc3RvcyBsb2fDrXN0aWNvcyB5IG1pdGlnYXIgZWwgZWZlY3RvIGRlIGxvcyBhbHRvcyBjb3N0b3MgZGUgZmxldGVzIGVuIEVzdGFkb3MgVW5pZG9zIGFsIHZlbmRlciBhIGNsaWVudGVzIGVzdHJhdMOpZ2ljb3MuCgojIyMjICoqRXN0cmF0ZWdpYXMgTWF4aSAtIE1heGkqKgorIEFwcm92ZWNoYXIgbGFzIG9wb3J0dW5pZGFkZXMgcXVlIHRyYWUgZWwgTmVhcnNob3JpbmcgcGFyYSBleHBsb3JhciBlbiBvdHJhcyBpbmR1c3RyaWFzIGNvbW8gZWwgc2VjdG9yIGFlcm9lc3BhY2lhbCB5IGNvbXBvbmVudGVzIG3DqWRpY29zIGEgdHJhdsOpcyBkZSBzdSBkZXBhcnRhbWVudG8gZGUgaW5ub3ZhY2nDs24gZW4gcHJvY2Vzb3MgZGUgaW5nZW5pZXLDrWEuIFNpIEZPUk0gdXRpbGl6YSBzdSBlcXVpcG8gZGUgaW5nZW5pZXJvcyBkZSBmb3JtYSBlZmljaWVudGUsIHB1ZWRlIGRlc2Fycm9sbGFyIHNvbHVjaW9uZXMgZGUgZW1wYXF1ZSBpbm5vdmFkb3JhcyB5IHZhbG9yYWRhcyBwb3IgZXN0YXMgaW5kdXN0cmlhcyB5IGRpc3RyaWJ1aXJsYXMgYSBsYXMgZmlsaWFsZXMgZGUgbGFzIGVtcHJlc2FzIGVuIE3DqXhpY28uIAoKIyMjIyAqKkVzdHJhdGVnaWFzIE1heGkgLSBNaW5pKioKKyBGT1JNIHB1ZWRlIGFwcm92ZWNoYXIgbGEgZ3JhbiB0ZW5kZW5jaWEgZGVsIE5lYXJzaG9yaW5nIHBhcmEgYXVtZW50YXIgc3UgcG9ydGFmb2xpbyBkZSBjbGllbnRlcyB5IGV4cGFuZGlyIHN1cyBvcGVyYWNpb25lcyBhIHRyYXbDqXMgZGUgbWFxdWlsYWRvcmFzIHF1ZSBzZSBlbmNhcmd1ZW4gZGUgbGEgcHJvZHVjY2nDs24gZGUgbG9zIGVtcGFxdWVzIGVuIGJhc2UgYSBsb3MgZXN0w6FuZGFyZXMgeSBwYXRlbnRlcyBkZSBGT1JNLiBEZSBlc3RhIGZvcm1hIGxhIGVtcHJlc2Egbm8gZXMgdGFuIGRlcGVuZGllbnRlIGRlIHN1IHJvdGFjacOzbiBkZSBwZXJzb25hbCBwYXJhIGVsIGN1bXBsaW1pZW50byBjb24gZWwgY2xpZW50ZSwgeSBwdWVkZSBkaXN0cmlidWlyIGEgbcOhcyBlbXByZXNhcyBlc3RyYXTDqWdpY2FtZW50ZSBwb3NpY2lvbmFkYXMgcG9yIGxhcyB0ZW5kZW5jaWFzIGRlbCBOZWFyc2hvcmluZyB5IGVuZm9jYXJzZSBlbiBjb25zdHJ1aXIgcmVsYWNpb25lcyBkdXJhZGVyYXMgY29uIGVzdG9zLgoKCiMjICoqUEVTVExFKioKIyMjICoqRmFjdG9yZXMgcG9sw610aWNvcyAqKgojIyMjICoqQWN1ZXJkb3MgSW50ZXJuYWNpb25hbGVzKiogCgorIEVsIFRNRUMgaW5jbHV5ZSBtZWRpZGFzIHBhcmEgcmVkdWNpciBsYXMgYmFycmVyYXMgYXJhbmNlbGFyaWFzIHkgbm8gYXJhbmNlbGFyaWFzLCBmb21lbnRhciBsYSBsaWJyZSBjaXJjdWxhY2nDs24gZGUgYmllbmVzLCBzZXJ2aWNpb3MgZSBpbnZlcnNpb25lcywgcHJvdGVnZXIgbG9zIGRlcmVjaG9zIGRlIHByb3BpZWRhZCBpbnRlbGVjdHVhbCB5IGZvcnRhbGVjZXIgbG9zIGRlcmVjaG9zIGxhYm9yYWxlcyB5IGxhIHByb3RlY2Npw7NuIGRlbCBtZWRpbyBhbWJpZW50ZS4KCiMjIyMgKipFZmljYWNpYSBndWJlcm5hbWVudGFsICgtMiw1IGTDqWJpbDsgMiw1IGZ1ZXJ0ZSkqKgorIE3DqXhpY286IC0wLjMxCisgRVVBOiAxLjM0CgojIyMjICoqQ29ycnVwY2nDs24qKgorIE3DqXhpY286IEFob3JhIG9jdXBhIGxhIHBvc2ljacOzbiAxMjQgZGUgMTgwIHBhw61zZXMgZXZhbHVhZG9zLgorIEVVQTogQWhvcmEgb2N1cGEgbGEgcG9zaWNpw7NuIDI3IGRlIDE4MCBwYcOtc2VzIGV2YWx1YWRvcy4KCiMjIyMgKipQcm90ZWNjacOzbiBhIGxhIGludmVyc2nDs24qKgorIE3DqXhpY286IE3DqXhpY28gaGEgc3VzY3JpdG8gMzIgQWN1ZXJkb3MgcGFyYSBsYSBQcm9tb2Npw7NuIHkgUHJvdGVjY2nDs24gUmVjw61wcm9jYSBkZSBsYXMgSW52ZXJzaW9uZXMgKEFQUFJJcykKKyBFVUE6IEVuIGxhIEVuY3Vlc3RhIENvb3JkaW5hZGEgc29icmUgbGEgSW52ZXJzacOzbiBEaXJlY3RhIG3DoXMgcmVjaWVudGUgc2Ugb2JzZXJ2YSBxdWUgbGEgcG9zaWNpw7NuIGRlIEVzdGFkb3MgVW5pZG9zIGF1bWVudMOzIFVTRCA1MDYuMDAwIG1pbGxvbmVzLCB1IDExLDMlICwgZWwgYcOxbyBwYXNhZG8uCgojIyMgKipGYWN0b3JlcyBlY29uw7NtaWNvcyoqCiMjIyMgKipUYXNhIGRlIGRlc2VtcGxlbyoqCisgTcOpeGljbzogTGEgdGFzYSBkZSBkZXNlbXBsZW8gZGUgTcOpeGljbyBhbGNhbnphIDIuOSUgZW4gbWF5bzogSW5lZ2kuCisgRVVBOiBMYSB0YXNhIGRlIHBhcm8gc2Ugc2l0dcOzIGVuIGVsIDMsNiUsIHRhbWJpw6luIGNlcmNhIGRlIGxvcyBtw61uaW1vcyBlbiBtZWRpbyBzaWdsbywgcXVlIHNlIGFsY2FuemFyb24gZW4gYWJyaWwgY29uIHVuIDMsNCUKCiMjIyMgKipJbmZsYWNpw7NuKioKKyBNw6l4aWNvOiBMYSBpbmZsYWNpw7NuIGFjdW11bGFkYSBlbiAyMDIzIGVzIGRlbCAxLDklLgorIEVVQTogTGEgaW5mbGFjacOzbiBhY3VtdWxhZGEgZW4gMjAyMyBlcyBkZWwgMyUuCgojIyMjICoqVGFzYSBkZSBjYW1iaW8qKgorIDEgZMOzbGFyID0gMTcuMDIgcGVzb3MKCiMjIyMgKipJbXB1ZXN0b3MqKgorIE3DqXhpY286IEVuIGVsIGNhc28gZGUgbGFzIHBlcnNvbmFzIG5hdHVyYWxlcywgbGEgdGFzYSB2YSBkZXNkZSBlbCA4JSBoYXN0YSBlbCAzMCUsIG1pZW50cmFzIHF1ZSBwYXJhIGxhcyBlbXByZXNhcyBsYSB0YXNhIGVzIGRlbCAyOS41JS4KKyBFVUE6IDI0JSBwYXJhIGluZ3Jlc29zIHN1cGVyaW9yZXMgYSAkOTUsMzc1LiAyMiUgcGFyYSBpbmdyZXNvcyBzdXBlcmlvcmVzIGEgJDQ0LDcyNS4gMTIlIHBhcmEgaW5ncmVzb3Mgc3VwZXJpb3JlcyBhIDEsMDAwLiAxMCUgcGFyYSBpbmdyZXNvcyBpbmZlcmlvcmVzIGEgMSwwMDAuCgojIyMgKipGYWN0b3JlcyBzb2NpYWxlcyoqCiMjIyMgKipDYWxpZGFkIGRlIHZpZGEqKgorIE3DqXhpY286IE3DqXhpY28gb2N1cGEgbGEgcG9zaWNpw7NuIG7Dum1lcm8gNCBlbiBlbCByYW5raW5nIGRlIHBhw61zZXMgY29uIG1heW9yIGNhbGlkYWQgZGUgdmlkYSBlbiBBbcOpcmljYSBMYXRpbmEKKyBFVUE6IEVzdGFkb3MgVW5pZG9zIHNlIGVuY3VlbnRyYSBlbiBidWVuIGx1Z2FyLCB5YSBxdWUgb2N1cGEgZWwgcHVlc3RvIG7Dum1lcm8gMjEgZGVsIHJhbmtpbmcgZGUgZGVzYXJyb2xsbyBodW1hbm8oSURIKS4KCiMjIyMgKipOaXZlbCBkZSBpbmdyZXNvcyoqCisgTcOpeGljbzogRWwgaW5ncmVzbyBsYWJvcmFsIHJlYWwgcGVyIGPDoXBpdGEgdHV2byB1biBpbmNyZW1lbnRvIGFudWFsIGRlIDEuNCUsIGFsIHBhc2FyIGRlICQyLDc2OS4yMyBhICQyLDgwNy40OQorIEVVQTogRWwgaW5ncmVzbyBtZWRpbyBwb3IgaG9nYXIgZW4gRXN0YWRvcyBVbmlkb3MgZnVlIGRlIDcwLjc4NCBkw7NsYXJlcyBlbiAyMDIxLiAKCiMjIyMgKipOw7ptZXJvIGRlIGhhYml0YW50ZXMqKgorIE3DqXhpY286IDEyOSBtaWxsb25lcworIEVVQTogMzM1IG1pbGxvbmVzCgojIyMjICoqJSBkZSBwb2JsYWNpw7NuIGNvbiB2ZWjDrWN1bG9zKioKKyBNw6l4aWNvOiAyNyUKKyBFVUE6IDY3JQoKIyMjICoqRmFjdG9yZXMgdGVjbm9sw7NnaWNvcyoqCiMjIyMgKipBY2Nlc28gYSBpbnRlcm5ldCoqCisgTcOpeGljbzogNzUlCisgRVVBOiA5MiUKCiMjIyMgKipOaXZlbCBkZSBpbm5vdmFjacOzbioqCisgTcOpeGljbzogIE3DqXhpY28gZGVzY2llbmRlIHRyZXMgcG9zaWNpb25lcyBlbiBlbCByYW5raW5nIGdsb2JhbCB5IHNlIHF1ZWRhIGVuIGVsIG7Dum1lcm8gNTguCisgRVVBOiBMb3MgRXN0YWRvcyBVbmlkb3MgYXNjaWVuZGVuIGEgbGEgMi4gcG9zaWNpw7NuCgojIyMjICoqSW5mcmFlc3RydWN0dXJhKioKKyBNw6l4aWNvOiBNw6l4aWNvIG9jdXBhIGVsIGx1Z2FyIDY1IGVuIGNhbGlkYWQgZGUgaW5mcmFlc3RydWN0dXJhCisgRVVBOiBMb3MgRXN0YWRvcyBVbmlkb3MgYXNjaWVuZGVuIGEgbGEgMi4KCiMjIyMgKipVc28gZGUgZW5lcmfDrWFzIHJlbm92YWJsZXMqKgorIE3DqXhpY286IE3DqXhpY28gZ2VuZXLDsyBlbCAzMS4yJSBkZSBlbGVjdHJpY2lkYWQgYSBwYXJ0aXIgZGUgZnVlbnRlcyByZW5vdmFibGVzLCB1biBpbmNyZW1lbnRvIGRlIDEuNyBwdW50b3MgcG9yY2VudHVhbGVzIHJlc3BlY3RvIGFsIDI5LjUlIGRlbCBhw7FvIHByZXZpby4KKyBFVUE6IExhIGXDs2xpY2EgeSBsYSBzb2xhciBwcm9wb3JjaW9uYXJvbiBlbCAxNiwxJSBkZSBsYSBnZW5lcmFjacOzbiBlbMOpY3RyaWNhIGRlIEVFLiBVVS4gZW4gbG9zIGRvcyBwcmltZXJvcyBtZXNlcyBkZSAyMDIzCgojIyMgKipGYWN0b3JlcyBsZWdhbGVzKioKIyMjIyAqKlByb3BpZWRhZCBpbnRlbGVjdHVhbCoqCisgTcOpeGljbzogRW4gMjAyMiwgc2UgaGFuIHJlZ2lzdHJhZG8gdW4gdG90YWwgZGUgNDYzIG1vZGVsb3MgaW5kdXN0cmlhbGVzLCBzaWVuZG8gZWwgcGHDrXMgY29uIG3DoXMgcmVnaXN0cm9zIHJlYWxpemFkb3MgZW4gdG9kbyBlbCBtdW5kbworIEVVQTogRW4gMjAxOSwgZWwgdG90YWwgZXN0aW1hZG8gZGUgcGF0ZW50ZXMgZW4gdmlnb3IgYXNjZW5kw61hIGEgMTQsOSBtaWxsb25lcy4gTGFzIGNpZnJhcyBtw6FzIGFsdGFzIHNlIHJlZ2lzdHJhcm9uIGVuIGxvcyBFc3RhZG9zIFVuaWRvcyBkZSBBbcOpcmljYSAoMywxIG1pbGxvbmVzKQoKIyMjIyAqKlNhbGFyaW8gbcOtbmltbyoqCisgTcOpeGljbzogMjA3LjQ0IHBlc29zIGRpYXJpb3MKKyBFVUE6IDE3IGRvbGFyZXMgbGEgaG9yYQoKIyMjIyAqKlNpbmRpY2F0b3MqKgojIyMjIyAqKk3DqXhpY28qKiAKKyBTaW5kaWNhdG9zIGRlIGVtcHJlc2EuIAorIFNpbmRpY2F0b3MgbmFjaW9uYWxlcyBkZSBpbmR1c3RyaWEuIAorIFNpbmRpY2F0b3MgaW5kdXN0cmlhbGVzIGVzdGF0YWxlcy4KKyBTaW5kaWNhdG9zIGdyZW1pYWxlcy4KKyBTaW5kaWNhdG9zIGRlIG9maWNpb3MgdmFyaW9zLgoKIyMjIyMgKipFVUEqKiAKKyBUcmFiYWphZG9yZXMgZGUgb2ZpY2lvcyAKKyBUcmFiYWphZG9yZXMgaW5kdXN0cmlhbGVzIAorIFNlY3RvciBww7pibGljbyAKKyBQcm9mZXNpb25hbGVzCgojIyMjICoqQ29udHJhdG9zIGxhYm9yYWxlcyoqCiMjIyMjICoqTcOpeGljbyoqCisgQ29udHJhdG8gbGFib3JhbCBwb3IgdGllbXBvIGRldGVybWluYWRvLgorIENvbnRyYXRvIGxhYm9yYWwgcG9yIHRpZW1wbyBpbmRldGVybWluYWRvLgorIENvbnRyYXRvIGxhYm9yYWwgdGVtcG9yYWwuCisgQ29udHJhdG8gcGFyYSBjYXBhY2l0YWNpw7NuIGluaWNpYWwuIAorIENvbnRyYXRvIGRlIHBlcmlvZG8gZGUgcHJ1ZWJhLgoKIyMjIyMgKipFVUEqKgorIENvbnRyYXRvIGRlIHRyYWJham8gcG9yIGVzY3JpdG8uCisgQ29udHJhdG8gZGUgdHJhYmFqbyB2ZXJiYWwuCisgQ29udHJhdG8gZGUgdHJhYmFqbyBpbXBsw61jaXRvLgorIENvbnRyYXRvIGluZGVmaW5pZG8uCisgQ29udHJhdG8gZGUgZHVyYWNpw7NuIGRldGVybWluYWRhLgorIENvbnRyYXRvIHRlbXBvcmFsLgoKIyMjICoqRmFjdG9yZXMgZWNvbMOzZ2ljb3M6KioKIyMjIyAqKkNvbnN1bW8gZGUgcmVjdXJzb3MgcmVub3ZhYmxlcyoqCisgTcOpeGljbzogQWwgY2llcnJlIGRlIDIwMjEsIGxhIGNhcGFjaWRhZCBlw7NsaWNhLCBzb2xhciwgZ2VvdMOpcm1pY2EsIGUgaGlkcm9lbMOpY3RyaWNhIHN1bWFiYSAyNiw4IGdpZ2F2YXRpb3MsIHVuIDMxJSBkZSBsYSBjYXBhY2lkYWQgaW5zdGFsYWRhIHRvdGFsLgorIEVVQTogIERlIGxvcyA0LjEyIGJpbGxvbmVzIGRlIGtXaCBkZSBlbGVjdHJpY2lkYWQgZ2VuZXJhZGEgZW4gRVUsIDM4JSBmdWUgZGUgZ2FzIG5hdHVyYWwsIGVsIGNhcmLDs24gcmVwcmVzZW50w7MgY2VyY2EgZGUgMjMlIHkgbGEgbnVjbGVhciBzdW1hbmRvIG90cm8gMjAlLgoKIyMjIyAqKlBvbMOtdGljYXMgYW1iaWVudGFsZXMqKgorIE3DqXhpY286IExhIExleSBkZSBFcXVpbGlicmlvIEVjb2zDs2dpY28geSBQcm90ZWNjacOzbiBhbCBBbWJpZW50ZSAoTEdFRVBBKSwgbGEgTGV5IEdlbmVyYWwgZGUgQ2FtYmlvIENsaW3DoXRpY28sIGxhIExleSBHZW5lcmFsIGRlIFZpZGEgU2lsdmVzdHJlIHkgbGEgTGV5IGRlIERlc2Fycm9sbG8gUnVyYWwgU3VzdGVudGFibGUsIGVudHJlIG90cm9zLgorIEVVQTogRXN0YWRvcyBVbmlkb3Mgbm8gY3VlbnRhIGNvbiB1bmEgbGV5IGFtYmllbnRhbCDDum5pY2EgcXVlIGNvbnN0aXR1eWEgdW4gbWFyY28gZGUgcmVmZXJlbmNpYSBnZW5lcmFsLgoKIyMjIyAqKlJlY2ljbGFqZSoqCisgTcOpeGljbzogc8OzbG8gc2UgcmVjaWNsYWJhIGVsIDYsMSUgZGUgdG9kb3MgbG9zIHJlc2lkdW9zIHZhbG9yaXphYmxlczogbGF0YXMsIGNhcnTDs24sIHBhcGVsIHkgcGzDoXN0aWNvLgorIEVVQTogZW4gMjAyMSwgc29sbyBzZSByZWNpY2zDsyBlbnRyZSBlbCA1JSB5IGVsIDYlIGRlIGxvcyByZXNpZHVvcyBkZSBwbMOhc3RpY29zLgoKIyMjIyAqKkNhbWJpbyBjbGltw6F0aWNvKioKKyBNw6l4aWNvOiBMYXMgdGVtcGVyYXR1cmFzIHByb21lZGlvIGEgbml2ZWwgbmFjaW9uYWwgYXVtZW50YXJvbiAwLjg1wrogQyB5IGxhcyB0ZW1wZXJhdHVyYXMgaW52ZXJuYWxlcyAxLjPCukMuIAorIEVVQTogQWxndW5vcyBsdWdhcmVzIGV4cGVyaW1lbnRhbmRvIHVuIGF1bWVudG8gZGUgbGFzIHByZWNpcGl0YWNpb25lcyBlIGludW5kYWNpb25lcywgbWllbnRyYXMgcXVlIG90cm9zIGV4cGVyaW1lbnRhbiBzZXF1w61hcwoKIyMjICoqRXN0cmF0ZWdpYXMgUEVTVExFKioKIyMjIyAqKkVzdHJhdGVnaWEgZGUgSW5ub3ZhY2nDs24geSBTb3N0ZW5pYmlsaWRhZCoqCisgRGFkbyBlbCBhdW1lbnRvIGVuIGVsIHVzbyBkZSBlbmVyZ8OtYXMgcmVub3ZhYmxlcyBlbiBNw6l4aWNvIHkgRXN0YWRvcyBVbmlkb3MsIGFzw60gY29tbyBsYSBjcmVjaWVudGUgcHJlb2N1cGFjacOzbiBwb3IgbGFzIHBvbMOtdGljYXMgYW1iaWVudGFsZXMgeSBlbCBjYW1iaW8gY2xpbcOhdGljbywgbGEgZW1wcmVzYSBwb2Ryw61hIGNlbnRyYXJzZSBlbiBkZXNhcnJvbGxhciBlbXBhcXVlcyBlc3BlY2lhbGl6YWRvcyBxdWUgc2VhbiBtw6FzIHNvc3RlbmlibGVzIHkgcmVzcGV0dW9zb3MgY29uIGVsIG1lZGlvIGFtYmllbnRlIGNvbW8gbG8gc29uIGNvbiBlbXBhcXVlcyByZXRvcm5hYmxlcyBxdWUgc2UgcHVlZGVuIHV0aWxpemFyIG11Y2hhcyB2ZWNlcy4KCiMjIyMgKipFc3RyYXRlZ2lhIGRlIGNvbWVyY2lvIGJhc2FkYSBlbiB0aXBvIGRlIGNhbWJpbyB5IHRyYXRhZG9zIGRlIGxpYnJlIGNvbWVyY2lvKioKKyBTZWdtZW50YWNpw7NuIGRlIG1lcmNhZG8gZW4gRXN0YWRvcyBVbmlkb3MgY29uIGVsIHBlcmZpbCBkZSBjbGllbnRlcyBkZSBGT1JNLCBlbmNvbnRyYW5kbyAgIGRlIGVtcHJlc2FzIGF1dG9tb3RyaWNlcyBlbiBTYW4gQW50b25pbywgYWxjYW56YW5kbyBwb3NpYmxlcyBjbGllbnRlcyBudWV2b3MgZW4gbG9zIGVzdGFkb3MgeSBjaXVkYWRlcyBjZXJjYSBhIGxhIGZyb250ZXJhIGFsIHV0aWxpemFyIHJ1dGFzIGRlIGVudsOtbyBlc3RyYXTDqWdpY2FzIGNvbiBlbCBmaW4gZGUgcmVkdWNpciBlbCBpbXBhY3RvIGRlbCB0aXBvIGRlIGNhbWJpbywgaGFjaWVuZG8gdXNvIGRlIGxvcyB0cmF0YWRvcyBkZSBsaWJyZSBjb21lcmNpbyBlc3RhYmxlY2lkb3MgZW50cmUgTcOpeGljbyB5IGRpc3RpbnRvcyBwYcOtc2VzLgoKIyBBbsOhbGlzaXMgRGVzY3JpcHRpdm8gZGUgRk9STSAKCiMgKipTaXR1YWNpw7NuIFByb2JsZW1hOiBSZWN1cnNvcyBIdW1hbm9zKioKCisgTGEgcHJvYmxlbcOhdGljYSBzZWxlY2Npb25hZGEgZXMgbGEgZGVsIGNsaW1hIG9yZ2FuaXphY2lvbmFsIGVuIEZPUk0uIEVsIGVxdWlwbyDigJxEYXR1bSBHcm91cOKAnSBzZSBlbmZvY2Fyw6EgZW4gYnVzY2FyIHNvbHVjaW9uZXMgdmlhYmxlcyBwYXJhIGVsIHByb2JsZW1hIGRlIGxhIHJvdGFjacOzbiBlbiBwaXNvIGRlIEZPUk0geSBzdSBjdWx0dXJhIG9yZ2FuaXphY2lvbmFsLiAgCgorICoqT2JqZXRpdm86KiogRXhwbG9yYXIsIGRlZmluaXIsIHkgZGVzY3JpYmlyIGN1w6FsZXMgc29uIGxvcyBwcmluY2lwYWxlcyBmYWN0b3JlcyBkZWwgY2xpbWEgb3JnYW5pemFjaW9uYWwgZGUgRk9STSBxdWUgcHJvcGljaWFuIGxhIHNhdGlzZmFjY2nDs24geS9vIG5vIHNhdGlzZmFjY2nDs24gZGUgdHJhYmFqYXIgZW4gZGljaGEgZW1wcmVzYS4KCiMgKipBbsOhbGlzaXMgRXhwbG9yYXRvcmlvIGRlIERhdG9zKioKCiMjIyMgKipQcmltZXJvcyA2IHJlbmdsb25lcyBkZSBsYXMgYmFzZXMgZGUgZGF0b3MqKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPSBUUlVFfQpoZWFkKGZvcm1fYmFqYXNfaW50ZWdyYWRhcykKYGBgCiMgKipQcmVndW50YXMgZGUgQW7DoWxpc2lzKioKIyMgKipQcmVndW50YSAxOiBSb3RhY2nDs24gRk9STSoqCiMjIyAqKsK/RXMgbGEgcm90YWNpw7NuIGRlIEZPUk0gcG9yIGFycmliYSBkZWwgcHJvbWVkaW8gZW4gbGEgaW5kdXN0cmlhPyoqCgpFbCBvYmpldGl2byBkZSBlc3RhIHByZWd1bnRhIGVzIGlkZW50aWZpY2FyIHNpIGxhIHJvdGFjacOzbiBoaXN0w7NyaWNhIGRlIEZPUk0gZGVzZGUgMjAyMiBoYXN0YSAyMDIzIHNpZ3VlIHBhdHJvbmVzIGRlIG1vdmltaWVudG9zIHNpbWlsYXJlcyBhIGxvcyBwcm9tZWRpb3MgZGUgZW1wcmVzYXMgcHJvZHVjdGl2YXMgZGVsIGVzdGFkbyB5IGVsIHByb21lZGlvIGRlIHJvdGFjacOzbiBuYWNpb25hbC4gU2UgcHJldGVuZGUgYW5hbGl6YXIgeSBidXNjYXIgcGF0cm9uZXMgZW50cmUgbG9zIG1lc2VzIGNvbiBtYXlvcmVzIHkgbWVub3JlcyBiYWphcy4gPGJyPiAKCgokJApcZnJhY3tcZnJhY3tBbHRhcyArIEJhamFzfXsyfX17XGZyYWN7RW1wSW5pY2lvICsgRW1wRmluYWx9ezJ9fSBcdGltZXMgMTAwCiQkCgorIEFsdGFzID0gTsO6bWVybyBkZSBlbXBsZWFkb3MgcXVlIHNlIGRpZXJvbiBkZSBhbHRhIGVuIGVsIHBlcmlvZG8KCisgQmFqYXMgPSBBbHRhcyA9IE7Dum1lcm8gZGUgZW1wbGVhZG9zIHF1ZSBzZSBkaWVyb24gZGUgYWx0YSBlbiBlbCBwZXJpb2RvCgorIEVtcEluaWNpbyA9IHBlcnNvbmFsIGFsIGluaWNpbyBkZWwgcGVyaW9kbwoKKyBFbXBGaW5hbCA9IHBlcnNvbmFsIGFsIGZpbmFsIGRlbCBwZXJpb2RvCgpgYGB7cn0KRk9STUZsdWpvIDwtIEZPUk1GbHVqbyAlPiUgbXV0YXRlKFJvdGFjaW9uID0gKCgoKEErQikvMikvKChFbXBJK0VtcEYpLzIpKSoxMDApKSAKRk9STUZsdWpvJFJvdGFjaW9uIDwtIHJvdW5kKEZPUk1GbHVqbyRSb3RhY2lvbiwyKQoKRk9STUZsdWpvJEZlY2hhIDwtIGFzLkRhdGUoRk9STUZsdWpvJEZlY2hhLCBmb3JtYXQgPSAiJWQvJW0vJXkiKQoKIyBWYWxvcmVzIGVzdGFkw61zdGljb3MgZGUgbGEgUm90YWNpw7NuCnN1bW1hcnkoRk9STUZsdWpvKSAKYGBgCgojIyMgKipHcsOhZmljYSBkZSByb3RhY2nDs24gaGlzdMOzcmljYSoqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChGT1JNRmx1am8sYWVzKHg9RmVjaGEsIHk9Um90YWNpb24pKSsKICBnZW9tX2xpbmUoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjKDEwKSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiZ3JlZW4iLCBzaXplID0gMC41KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYygyMCksIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gIm9yYW5nZSIsIHNpemUgPSAwLjUpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjKDMwKSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDAuNSkgKwogIGxhYnMoeD0iRmVjaGEiLHk9IlJvdGFjacOzbiBlbiAlIiwgY29sb3I9IkxlZ2VuZCIpKwogICNnZW9tX3JpYmJvbigicmVjdCIsIGFlcyh4ID0gYygiMjAyMi0wMS0wMSIpLCB4ZW5kID0gKCIyMDIzLTEyLTAxIikpLCB5bWluID0gLUluZiwgeW1heCA9IEluZiwgZmlsbCA9ICJncmF5IiwgYWxwaGEgPSAwLjUpCiAgZ2d0aXRsZSgiUm90YWNpb24gZW4gRk9STSBIaXN0w7NyaWNvIDIwMjItMjAyMyIpCmBgYAoKIyMjICoqQW7DoWxpc2lzIGRlIFJlc3VsdGFkbyoqCgpBbmFsaXphbmRvIGVsIGNvbXBvcnRhbWllbnRvIGRlIGxhIHJvdGFjacOzbiBwb3IgbWVzLCBzZSBwdWVkZSBvYnNlcnZhciBxdWUgbGEgcm90YWNpw7NuIGRlIEZPUk0gYXVtZW50YSBhIHByaW5jaXBpbyBkZSBhw7FvIHkgZW4ganVuaW8gcGFyYSBsb3MgZG9zIGHDsW9zLCBjb24gY2lmcmFzIG3DoXMgYWx0YXMgcGFyYSBlbCBhw7FvIDIwMjIuIFNlIHB1ZWRlbiB0YW1iacOpbiBvYnNlcnZhciBtZWpvcmFzIGVuIGxhIHJvdGFjacOzbiBkZWJpZG8gYSBxdWUgZW4gMjAyMiBsYSByb3RhY2nDs24gc29icmVwYXPDsyBuaXZlbGVzIGFsYXJtYW50ZXMgYXJyaWJhIGRlIGxhIGzDrW5lYSByb2phIGVuIGRvcyBvY2FzaW9uZXMgcGFyYSAyMDIyLCBtaWVudHJhcyBxdWUgZW4gMjAyMyBzZSBxdWVkw7MgZW4gbml2ZWxlcyBhbHRvcyBwZXJvIG5vIHJlcGl0acOzIGNpZnJhcyBzaW1pbGFyZXMgYSBsYXMgZGVsIDIwMjMuPGJyPiAKCkVuIGNvbXBhcmFjacOzbiBhIGxhIGluZHVzdHJpYSBlbiBOdWV2byBMZcOzbiwgZWwgZXN0YWRvIHBhcmEgMjAyMyByZXBvcnTDsyBsYSB0ZXJjZXJhIHJvdGFjacOzbiBtw6FzIGFsdGEgZGUgTcOpeGljbyBjb24gbml2ZWxlcyBlbnRyZSAxMiB5IDE1JSBkZSBhY3VlcmRvIGNvbiB1bmEgZW5jdWVzdGEgcmVhbGl6YWRhIHBvciBFUklBQyBDYXBpdGFsIEh1bWFubyAoRmxvcmVzLCAyMDIzKS4gRWwgcHJvbWVkaW8gaGlzdMOzcmljbyBkZSByb3RhY2nDs24gZGUgRk9STSBzZSBlc3RhYmxlY2UgZW4gMTYuNjQlLCBwb3NpY2lvbsOhbmRvc2UgYXJyaWJhIGRlbCBwcm9tZWRpbyBkZWwgZXN0YWRvLCBkZW1vc3RyYW5kbyBxdWUgbGEgZW1wcmVzYSBlbmZyZW50YSB1biBncmF2ZSBwcm9ibGVtYSBkZSBww6lyZGlkYSBkZSB0YWxlbnRvIGh1bWFuby48YnI+ICAKClVuYSByb3RhY2nDs24gc2FuYSBwYXJhIHVuYSBlbXByZXNhIG1hbnVmYWN0dXJlcmEgZXMgY29uc2lkZXJhZGEgcG9yIGRlYmFqbyBkZWwgMTUlLCBkZSAxNSUgYSAzMCUgeWEgc2UgdnVlbHZlIHVuIHByb2JsZW1hIGNvbnNpZGVyYWJsZSBhbCBjdWFsIHByZXN0YXIgYXRlbmNpw7NuIHkgYXJyaWJhIGRlbCA0MCUgZXMgaW5kaWNhZG9yIGRlIHF1ZSBsYSBlbXByZXNhIG5lY2VzaXRhIHJlZm9ybWFyIHN1IG1vZGVsbyBkZSBuZWdvY2lvcyAoQW5hLCAyMDIzKS4gQWN0dWFsbWVudGUsIEZPUk0gc29sbyBoYSBzdXBlcmFkbyBsYSByb3RhY2nDs24gZGVsIDMwJSBlbiBkb3Mgb2Nhc2lvbmVzLCBhbWJhcyBlbiAyMDIyLCBhbGNhbnphbmRvIHVuYSByb3RhY2nDs24gbcOheGltYSBkZWwgMzguMzUlLiBDb24gZXN0b3MgZGF0b3MsIHNlIHB1ZWRlIGNvbmNsdWlyIHF1ZSBGT1JNIHRpZW5lIHVuIHByb2JsZW1hIGRlIHDDqXJkaWRhIGRlIHBlcnNvbmFsIGFsIGN1YWwgc2UgbGUgZGViZSBwcmVzdGFyIGF0ZW5jacOzbi48YnI+IAoKCiMjICoqUHJlZ3VudGEgMjogQ29tcG9ydGFtaWVudG8gZ8OpbmVybywgZWRhZCB5IGVzdGFkbyBjaXZpbCoqCiMjIyAqKsK/RXhpc3RlIGFsZ3VuYSByZWxhY2nDs24gZW50cmUgZWwgY29tcG9ydGFtaWVudG8gZGUgbGFzIGJhamFzIGVuIGJhc2UgYSB2YXJpYWJsZXMgZGUgZ8OpbmVybywgZWRhZCB5IGVkb0NpdmlsPyoqCgpQYXJhIGVsIGFuw6FsaXNpcyBkZSBlc3RhIHByZWd1bnRhIGNvbiBsYXMgYmFzZXMgZGUgZGF0b3MgdW5pZmljYWRhcyBkZSBsYXMgYmFqYXMgZGUgRk9STSBkZWwgMjAyMiB5IGVsIDIwMjMgc2UgbGxldmFyw6EgYSBjYWJvIHVuYSBvcmdhbml6YWNpw7NuIGRlIGRhdG9zIHBvciByYW5nb3MgZGUgZWRhZGVzLCBnw6luZXJvIHkgZXN0YWRvIGNpdmlsIGNvbiBlbCBmaW4gZGUgaWRlbnRpZmljYXIgY3XDoWxlcyBncnVwb3MgZGUgcGVyc29uYXMgc29uIG3DoXMgcHJvcGVuc2FzIGEgZGFyc2UgZGUgYmFqYSBjb25zaWRlcmFuZG8gc29sbyBlc3RhcyB2YXJpYWJsZXMuIDxicj4KCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpCYWphczIyMjMgPC0gcmVuYW1lKEJhamFzMjIyMywgZmVjaGFOID0gRkVDSEEuREUuTkFDSU1JRU5UTywgR2VuZXJvID0gR0VORVJPLCBlZG9DaXZpbCA9IEVTVEFETy5DSVZJTCwgc2FsYXJpb0QgPSBTQUxBUklPLkRJQVJJTy5JTVNTLCBQdWVzdG8gPSBQVUVTVE8pCkJhamFzMjIyMyA8LSBCYWphczIyMjMgJT4lIHNlbGVjdChmZWNoYU4sR2VuZXJvLFB1ZXN0byxzYWxhcmlvRCxlZG9DaXZpbCkKQmFqYXMyMjIzJGZlY2hhTiA8LSBhcy5EYXRlKEJhamFzMjIyMyRmZWNoYU4sIGZvcm1hdCA9ICIlZC8lbS8leSIpIApCYWphczIyMjMgPC0gQmFqYXMyMjIzICU+JSBtdXRhdGUoRmVjaGEgPSBkbXkoZmVjaGFOKSwgRWRhZCA9IHllYXIoU3lzLkRhdGUoKSkgLSB5ZWFyKGZlY2hhTikgLSBpZmVsc2UodG9kYXkoKSA8IGZlY2hhTiwgMSwgMCkpCgoKQmFqYXMyMjIzIDwtIHN1YnNldChCYWphczIyMjMsIHNlbGVjdCA9IC1GZWNoYSkgI1F1aXRhciBjb2x1bW5hIEZlY2hhCkJhamFzMjIyMyRFZGFkIDwtIGFzLm51bWVyaWMoQmFqYXMyMjIzJEVkYWQpCkJhamFzMjIyMyA8LSBtdXRhdGUoQmFqYXMyMjIzLEdydXBvRWRhZCA9IGlmZWxzZShCYWphczIyMjMkRWRhZCA+IDExICYgQmFqYXMyMjIzJEVkYWQgPD0yNSwgIjE2LTI1IiwKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoQmFqYXMyMjIzJEVkYWQgPjI1ICYgQmFqYXMyMjIzJEVkYWQgPD0gMzUgLCAiMjYtMzUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoQmFqYXMyMjIzJEVkYWQgPiAzNSAmIEJhamFzMjIyMyRFZGFkIDw9IDQ1LCAiMzYtNDUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShCYWphczIyMjMkRWRhZCA+IDQ1ICYgQmFqYXMyMjIzJEVkYWQgPD0gNTUsICI0Ni01NSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEJhamFzMjIyMyRFZGFkID4gNTUgJiBCYWphczIyMjMkRWRhZCA8PSA2NSwgIjU2LTY1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEJhamFzMjIyMyRFZGFkID4gNjUgJiBCYWphczIyMjMkRWRhZCA8PSA3NSwgIjY2LTc1IiwgIjAiKSkpKSkpKQoKCiMgVXNlIG11dGF0ZSB0byBjcmVhdGUgdGhlIENvbWJpbmVkIGNvbHVtbgpCYWphczIyMjMgPC0gQmFqYXMyMjIzICU+JQogIG11dGF0ZShDb21iaW5lZCA9IHBhc3RlKHN1YnN0cihHZW5lcm8sIDEsIDIpLCBzdWJzdHIoZWRvQ2l2aWwsIDEsIDIpLCBzdWJzdHIoR3J1cG9FZGFkLCAxLDUpLCBzZXAgPSAiIikpCgpCYWphczIyMjMgPC0gQmFqYXMyMjIzICU+JSBmaWx0ZXIoRWRhZCA+PSAxNikKCmdncGxvdChCYWphczIyMjMsYWVzKEdydXBvRWRhZCwgZmlsbCA9IENvbWJpbmVkKSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOCkpICsKICB4bGFiKCJSYW5nb3MgZGUgRWRhZGVzIikgKwogIHlsYWIoIk7Dum1lcm8gZGUgQmFqYXMgcG9yIENhdGVnb3LDrWEiKQogIGxhYnModGl0bGUgPSAiRnJlY3VlbmNpYSBkZSBiYWphcyBlbiBiYXNlIGEgR8OpbmVybywgRXN0YWRvIENpdmlsIHkgRWRhZCIsc3VidGl0bGUgPSAiQmFqYXMgYWdydXBhZGFzIHBvciBjYXRlZ29yw61hcyBwYXJhIEZST00iKSArIAogIHRoZW1lX21pbmltYWwoKQogIApCYWphc0NvbWJpbmVkIDwtIHRhYmxlKEJhamFzMjIyMyRDb21iaW5lZCkgIyBDcmVhdGUgYSBmcmVxdWVuY3kgdGFibGUKQmFqYXNDb21iaW5lZCA8LSBkYXRhLmZyYW1lKENhdGVnb3J5ID0gbmFtZXMoQmFqYXNDb21iaW5lZCksIEZyZXF1ZW5jeSA9IGFzLnZlY3RvcihCYWphc0NvbWJpbmVkKSkgIyBDb3ZlcnRpbmcgdG8gZGF0YQpjb2xuYW1lcyhCYWphc0NvbWJpbmVkKSA8LSBjKCJDYXRlZ29yeSIsICJGcmVxdWVuY3kiKSAjIEFkZCB0aXRsZXMgdG8gdGhlIGNvbHVtbnMKYGBgCiMjIyMgVGFibGEgZGUgQ29udGluZ2VuY2lhCmBgYHtyfQojIyMjIFRhYmxhIGRlIENvbnRpbmdlbmNpYQpjb250aW5nZW5jaWEgPC0gdGFibGUoQmFqYXMyMjIzJEdlbmVybywgQmFqYXMyMjIzJGVkb0NpdmlsKQpjb250aW5nZW5jaWEKYGBgCgoKIyMjICoqQW7DoWxpc2lzIGRlIFJlc3VsdGFkbyoqCgpMYSBncsOhZmljYSBkZXNhcnJvbGxhZGEgbXVlc3RyYSBlbCBjb21wb3J0YW1pZW50byBkZSBsYXMgYmFqYXMgcG9yIGNhdGVnb3LDrWFzIGNvbnNpZGVyYW5kbyBHw6luZXJvKEZlIG8gTWEpLCBFc3RhZG8gQ2l2aWwoTWEsIERpLCBVbiksIHkgZWwgcmFuZ28gZGUgZWRhZCBlbiBlbCBxdWUgc2UgZW5jdWVudHJhLiBFbiBsYSBncsOhZmljYSBzZSBwdWVkZSBvYnNlcnZhciBxdWUgbGEgbWF5b3LDrWEgZGUgbGFzIGJhamFzIHNlIGNvbmNlbnRyYW4gZW4gbG9zIHJhbmdvcyBkZSBlZGFkZXMgZGUgMTYgYSAyNSBhw7FvcywgZXNwZWNpYWxtZW50ZSBlbiBtdWplcmVzIHkgaG9tYnJlcyBzb2x0ZXJvcy4gQcOxYWRpZG8gYSBlc3RvLCBzZSBwdWVkZSB2ZXIgcXVlIGVuIGVsIHJhbmdvIGRlIDI2IGEgMzUgYcOxb3MgZGUgZWRhZCBzZSBjb25jZW50cmFuIG1heW9ybWVudGUgYmFqYXMgZGUgbXVqZXJlcyBkZSB1bmnDs24gbGlicmUsIG11amVyZXMgeSBob21icmVzIHNvbHRlcm9zLiA8YnI+CgpFbiBhbWJvcyBkZSBlc3RvcyByYW5nb3Mgc2UgY29tcGFydGVuIGNhcmFjdGVyw61zdGljYXMgY29tdW5lcywgbGFzIHBlcnNvbmFzIGVudHJlIGxhcyBlZGFkZXMgZGUgMTYgYSAyNSBhw7FvcyB0aWVuZGVuIGEgdGVuZXIgbWVub3MgcmVzcG9uc2FiaWxpZGFkZXMgcG9yIGxhcyBjdWFsZXMgbWFudGVuZXIgdW4gdHJhYmFqbyB5IGVzdMOhbiBlbiB1bmEgZWRhZCBjb24gY3VydmEgZGUgYXByZW5kaXphamUgcsOhcGlkYSBsbyBjdWFsIHJlc3VsdGEgYXRyYWN0aXZvIHBhcmEgbGFzIGVtcHJlc2FzLiBEZSBhY3VlcmRvIGNvbiBCYW5raW50ZXIsIGVuIHJhbmdvIGRlIGVkYWQgY29uIG1heW9yIGFjY2VzbyBsYWJvcmFsIGVuIE3DqXhpY28gc2UgZW5mb2NhIGVudHJlIGxvcyAzMSB5IDM1IGHDsW9zIGNvbiB1biAyOCUgZGUgbGFzIHZhY2FudGVzIGRlIGVtcGxlbywgc2VndWlkbyBkZSBsb3MgZGUgMjUgYSAzMCBjb24gZWwgMjUuMSUgKDIwMTUpOyBzdW1hbmRvIGEgZXN0bywgQnVzaW5lc3MgSW5zaWRlciBNw6l4aWNvIHJlcG9ydGEgcXVlIHBhcmEgbGFzIGVtcHJlc2FzIGRlc2Fycm9sbGFyIGEgdW4gZW1wbGVhZG8gbWF5b3IgYSBsb3MgMzUgYcOxb3MgeWEgbm8gcmVzdWx0YSByZW50YWJsZSAoRmVycmVyLCAyMDIyKS4gRXN0b3MgZGF0b3MsIGhhY2VuIHF1ZSBwYXJhIHVuYSBwZXJzb25hIG1lbm9yIGEgMzUgc2VhIG3DoXMgc2VuY2lsbG8gY2FtYmlhciBkZSB0cmFiYWpvIHkgY29uc2VndWlyIG1lam9yZXMgb2ZlcnRhcyBsYWJvcmFsZXMuIDxicj4KClBvciBlbCBvdHJvIGxhZG8sIGFycmliYSBkZSBsb3MgMzYsIHNpIGJpZW4gc2UgY29uY2VudHJhbiBncmFuIGNhdGlkYWQgZGUgYmFqYXMsIGVuIGNvbXBhcmF0aXZhIGEgbG9zIGdydXBvcyBhbnRlcmlvcmVzLCBlc3RhbiB2YW4gYSBsYSBiYWphIGRlYmlkbyBhIHF1ZSBsYXMgb2ZlcnRhcyBkZSB0cmFiYWpvIHNlIHJlZHVjZW4geSBsYXMgcmVzcG9uc2FiaWxpZGFkZXMgZmluYW5jaWVyYXMgYSBlc3RhcyBlZGFkZXMgYXVtZW50YS4gPGJyPgoKCiMjICoqUHJlZ3VudGEgMzogRGVwYXJ0YW1lbnRvcyBjb24gYmFqYXMqKgojIyMgKirCv1F1w6kgZGVwYXJ0YW1lbnRvIHRpZW5lIG3DoXMgYmFqYXMgZHVyYW50ZSBlbCBhw7FvPyoqCgpMYSBpbXBvcnRhbmNpYSBkZSBwb2RlciB0ZW5lciBiaWVuIGlkZW50aWZpY2FkbyBjdcOhbGVzIHNvbiBsb3MgZGVwYXJ0YW1lbnRvcyBxdWUgdGllbmVuIG3DoXMgYmFqYXMgZW4gbGEgZW1wcmVzYSwgaGFyw6EgcXVlIEZPUk0gcHVlZGEgbGxldmFyIGEgY2FibyB1bmEgZGVjaXNpw7NuIGVzdHJhdMOpZ2ljYSBwYXJhIHBvZGVyIHJlZHVjaXIgZWwgbsO6bWVybyBkZSByb3RhY2nDs24geSBnZW5lcmFyIHVuYSBjdWx0dXJhIGRlIHBlcnRlbmVuY2lhIG3DoXMgaW1wb3J0YW50ZSBlbiBjYWRhIHVubyBkZSBzdXMgY29sYWJvcmFkb3Jlcy48YnI+CgojIyMgKipBbsOhbGlzaXMgZGUgbG9zIGRlcGFydGFtZW50b3MgZGUgRk9STSoqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRmlsdHJhbmRvIHRvcCBkZXBhcnRhbWVudG9zIGNvbiBtw6FzIGJhamFzCnB1ZXN0b0ZpbCA8LSBncm91cF9ieShiYWphc19kZXBhcnRhbWVudG8sIERFUEFSVEFNRU5UTykKcHVlc3RvRmlsIDwtIHN1bW1hcml6ZShwdWVzdG9GaWwsIENvdW50ID0gbigpKQpwdWVzdG9GaWwgPC0gYXJyYW5nZShwdWVzdG9GaWwsIGRlc2MoQ291bnQpKQpwdWVzdG9GaWwgPC0gaGVhZChwdWVzdG9GaWwsMTEpCnB1ZXN0b0ZpbCA8LSBwdWVzdG9GaWxbLTEsIF0KICAKIyBHcmFmaWNhIGRlIGJhamFzIHBvciBkZXBhcnRhbWVudG8gcG9yIHBlcmlvZG8gYW51YWwKZ2dwbG90KHB1ZXN0b0ZpbCwgYWVzKHggPSByZW9yZGVyKERFUEFSVEFNRU5UTywgLUNvdW50KSwgeSA9IENvdW50LCBmaWxsID0gREVQQVJUQU1FTlRPKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuNSkgKwogIHhsYWIoIkRlcGFydGFtZW50byIpICsKICBnZ3RpdGxlKCJEZXBhcnRhbWVudG8gY29uIG3DoXMgYmFqYXMgMjAyMiB5IDIwMjMiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSkgKyB5bGltKDAsMzIwKQogICAgIApgYGAKCkVuIGVsIGdyw6FmaWNvIHNlIHJlcHJlc2VudGEgbGEgY2FudGlkYWQgZGUgY29sYWJvcmFkb3JlcyBxdWUgZnVlcm9uIGJhamFzIGVuIHN1cyByZXNwZWN0aXZvcyBkZXBhcnRhbWVudG9zIGVuIGVsIGHDsW8gMjAyMiB5IDIwMjMuIFBvZGVtb3MgZGVzdGFjYXIgcXVlIGVuIGVsIGRlcGFydGFtZW50byBkZSBTdGFiaWx1cyBlcyBkb25kZSBtw6FzIGJhamFzIHNlIGhhbiByZWdpc3RyYWRvIGEgcGFydGlyIGRlbCBhw7FvIHBhc2Fkby4gU2luIGVtYmFyZ28sIGxvIHF1ZSByZXNhbHRhIGVuIGxhIGdyw6FmaWNhIGVzIHF1ZSBsYSBtYXlvcsOtYSBkZSBsb3MgY29sYWJvcmFkb3JlcyBxdWUgc29uIGJhamFzIGVuIEZPUk0gbm8gdGllbmVuIHVuIGRlcGFydGFtZW50byBlbiBlc3BlY8OtZmljby4gRW4gYmFzZSBhIGVzdG8sIHNlIHB1ZWRlIGluZmVyaXIgcXVlIGxhIGluY2VydGlkdW1icmUgZGUgbm8gZXN0YXIgYSB1biDDoXJlYSBhc2lnbmFkYSBzZSB0cmFkdWNlIGEgdW4gYW1iaWVudGUgbGFib3JhbCBwb2NvIGNlcnRlcm8geSBzaW4gZGlyZWNjacOzbiBhIGNyZWNpbWllbnRvLiA8YnI+CgojIyAqKlByZWd1bnRhIDQ6IEZhY3RvcmVzIHJlbGV2YW50ZXMgYSBiYWphcyoqCiMjIyAqKsK/Q3XDoWxlcyBzb24gbG9zIGZhY3RvcmVzIG3DoXMgcmVsZXZhbnRlcyBxdWUgY29udHJpYnV5ZW4gYSBsYSBkaXNtaW51Y2nDs24gZGUgY29sYWJvcmFkb3JlcyBlbiBGT1JNIGVuIGVsIGHDsW8gMjAyMz8sIHkgY8OzbW8gc2UgY29tcGFyYW4gZXN0b3MgZmFjdG9yZXMgY29uIGVsIGNvbnRleHRvIG5hY2lvbmFsIGFjdHVhbCoqCgojIyMgKipBbsOhbGlzaXMgZGUgbG9zIG1vdGl2b3MgZGUgYmFqYSBkZSBlbXBsZWFkb3MqKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBHcmFmaWNhbmRvIC0gdG9tYW5kbyBlbiBjdWVudGEgIk5vIGVzcGVjaWZpY2FkbyIKZ2dwbG90KGJhamFzX2NhdGVnb3JpYXMsYWVzKE1vdGl2bykpK2dlb21fYmFyKGFlcyhmaWxsPUNhdXNhQmFqYSksIHdpZHRoPTAuNSkgKwp4bGFiKCJNb3Rpdm8iKSArCiAgZ2d0aXRsZSgiTW90aXZvIGRlIGxhIGJhamEgcG9yIHN1IGNhdXNhIC0gQcOxbyAyMDIzIikrIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMjUsIGhqdXN0ID0gMSkpKyAKICBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoY291bnQpKSwgdmp1c3QgPSAtMC41KSArIHlsaW0oMCwyNzUpCmBgYAoKRW4gZXN0YSBncsOhZmljYSBzZSBwcmVzZW50YSB1bmEgcmVwcmVzZW50YWNpw7NuIGRlIGxhcyBjYXVzYXMgZGV0csOhcyBkZWwgbW90aXZvIGRlIGxhcyBiYWphcyBlbiBlbCBjb250ZXh0byBhbmFsaXphZG8gZGVsIGHDsW8gMjAyMy4gRWwgaGFsbGF6Z28gbcOhcyBzaWduaWZpY2F0aXZvIGVzIGxhIHByZXZhbGVuY2lhIGRlIGxhcyBzZXBhcmFjaW9uZXMgdm9sdW50YXJpYXMgY29tbyBtb3Rpdm8gcHJpbmNpcGFsLiBEZW50cm8gZGUgZXN0YSBjYXRlZ29yw61hLCBsbGFtYSBsYSBhdGVuY2nDs24gcXVlIGxhIGNhdXNhICdObyBlc3BlY2lmaWNhZG8nIHNlIGRlc3RhY2EgY29tbyBsYSBtw6FzIHByZWRvbWluYW50ZSwgbG8gcXVlIHN1Z2llcmUgcXVlIGxhcyBwZXJzb25hcyB0aWVuZGVuIGEgbm8gcmV2ZWxhciBleHBsw61jaXRhbWVudGUgbGFzIHJhem9uZXMgZGV0csOhcyBkZSBzdSByZW51bmNpYS48YnI+CiAKIyMjICoqVGFibGEgZGUgZnJlY3VlbmNpYXMgc29icmUgQ2F1c2FzIGRlIGJhamFzIGVuIEZPUk0gZW4gMjAyMyoqCmBgYHtyfQojIERhdG9zIHNpbiB0b21hciBlbiBjdWVudGEgIk5vIGVzcGVjaWZpY2FkbyIKdGFibGUoYmFqYXNfZXNwZWNpZmljbyRDYXVzYUJhamEpICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBhcnJhbmdlKGRlc2MoRnJlcSkpICU+JQogc2V0TmFtZXMoYygiQ2F1c2EiLCAiRnJlY3VlbmNpYSIpKSAKCnRhYmxlKGJhamFzX2VzcGVjaWZpY28kQ2F1c2FCYWphU3ViKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgYXJyYW5nZShkZXNjKEZyZXEpKSAlPiUKICAgc2V0TmFtZXMoYygiRGVzaWNpw7NuIGZpbmFsIG3DoXMgZXNwZWPDrWZpY2EiLCAiRnJlY3VlbmNpYSIpKSAKYGBgCiBDdWFuZG8gYW5hbGl6YW1vcyBsYXMgY2F1c2FzIGRlIGxhIGJhamEgZXhjbHV5ZW5kbyBsYSByZXNwdWVzdGEgIk5vIGVzcGVjaWZpY2FkbyIsIHNlIGRlc3RhY2EgY2xhcmFtZW50ZSBxdWUgbGEgcmF6w7NuIHByaW5jaXBhbCBlcyBsYSBhcGFyaWNpw7NuIGRlIG51ZXZhcyBvcG9ydHVuaWRhZGVzIGxhYm9yYWxlcyBwYXJhIGxvcyBlbXBsZWFkb3MuIFNpbiBlbWJhcmdvLCBhbCBwcm9mdW5kaXphciBlbiBsYXMgY2F1c2FzLCBwb2RlbW9zIG9ic2VydmFyIHF1ZSBtdWNoYXMgZGUgZXN0YXMgcGVyc29uYXMgc2UgZGFuIGRlIGJhamEgcG9ycXVlIGVzdMOhbiBjYW1iaWFuZG8gZGUgb2N1cGFjacOzbiwgeSBvcHRhbiBwb3IgZGVzY3JpYmlybG8gY29tbyB1bmEgbnVldmEgb3BvcnR1bmlkYWQgbGFib3JhbC48YnI+CgoKCmBgYHtyfQojIEdyYWZpY2FuZG8gbGFzIGJhamFzIGNvbXBhcmFuZG8gYcOxb3MKZ2dwbG90KGJhamFfYcOxb3MsIGFlcyhhw7FvKSkgKwogIGdlb21fYmFyKGFlcyhmaWxsID0gbW90aXZvKSwgd2lkdGggPSAwLjUpICsKICB4bGFiKCJBw7FvIGRlIGxhIGJhamEiKSArCiAgZ2d0aXRsZSgiQ29tcGFyYWNpw7NuIGVudHJlIGHDsW8gMjAyMiB5IDIwMjMgZGUgbGEgYmFqYSBwb3IgbW90aXZvIGVuIEZPUk0iKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkgKwogIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChjb3VudCkpLCB2anVzdCA9IC0wLjUpIAoKYGBgCgpFbiBlbCBzaWd1aWVudGUgZ3LDoWZpY28gc2UgcHJlc2VudGEgdW5hIGNvbXBhcmF0aXZhIGVudHJlIGxhcyBjaWZyYXMgZGUgYmFqYXMgbGFib3JhbGVzIGVuIGVsIGHDsW8gMjAyMiB5IDIwMjMgZW4gbGEgZW1wcmVzYSBGT1JNLCBpbmNsdXllbmRvIHVuIGFuw6FsaXNpcyBkZSBsb3MgbW90aXZvcyBxdWUgaGFuIGxsZXZhZG8gYSBkaWNoYXMgYmFqYXMuIEVzIHJlbGV2YW50ZSBkZXN0YWNhciBxdWUgZW4gZWwgYcOxbyAyMDIyLCBlbCBtb3Rpdm8gZGUgIlNlcGFyYWNpw7NuIHZvbHVudGFyaWEiIHJlcHJlc2VudGFiYSB1bmEgcHJvcG9yY2nDs24gc2lnbmlmaWNhdGl2YW1lbnRlIG1lbm9yIGVuIGNvbXBhcmFjacOzbiBjb24gZWwgYcOxbyAyMDIzLjxicj4KCkVuIGVsIDIwMjIsIGVsIHByaW5jaXBhbCBtb3Rpdm8gZGUgbGFzIGJhamFzIGVzdGFiYSByZWxhY2lvbmFkbyBjb24gIkJhamEgcG9yIGZhbHRhcyIsIG1pZW50cmFzIHF1ZSBlbiBsbyBxdWUgdmEgZGVsIGHDsW8gMjAyMywgbGEgIlNlcGFyYWNpw7NuIHZvbHVudGFyaWEiIGhhIGVtZXJnaWRvIGNvbW8gZWwgbW90aXZvIHByZWRvbWluYW50ZSwgZGVtb3N0cmFuZG8gdW4gYXVtZW50byBlbiBsYXMgcmVudW5jaWFzIHBvciBwYXJ0ZSBkZSBsb3MgY29sYWJvcmFkb3JlcyBlbiBsb3Mgw7psdGltb3MgbWVzZXMuPGJyPgoKIExvIHF1ZSBzZSB2aXZlIGVuIE3DqXhpY28gY29uIHJlbGFjacOzbiBhIGxhcyByZW51bmNpYXMKIFNlZ8O6biBlbCBlY29ub23DrXN0YSwgZWwgMjAyMiBpbmljaWEgY29uIHVuIHJlcG9ydGUgZGUgNzczLDI1MiByZW51bmNpYXMgZW4gc3UgcHJpbWVyIHRyaW1lc3RyZSBhIG5pdmVsIG5hY2lvbmFsLiBEZSBhY3VlcmRvIGNvbiBsYSBFbmN1ZXN0YSBOYWNpb25hbCBkZSBPY3VwYWNpw7NuIHkgRW1wbGVvIChFTk9FKSwgbGFzIHByaW5jaXBhbGVzIHJhem9uZXMgZXN0w6FuIHZpbmN1bGFkYXMgY29uIGxhIGNvbnRpbnVpZGFkIGRlIGxvcyBlc3R1ZGlvcywgbGEgbWVqb3LDrWEgc2FsYXJpYWwsIGxhIHByZWNhcml6YWNpw7NuIGRlbCB0cmFiYWpvIHkgbGEgZGVtYW5kYSBkZSBjdWlkYWRvcy5MYXMgcGVyc29uYXMgdG9tYW4gbGEgZGVjaXNpw7NuIGRlIGRlamFyIHN1IHRyYWJham8gZGVwZW5kaWVuZG8gZXN0cmljdGFtZW50ZSBkZWwgY29udGV4dG8gZW4gZWwgcXVlIHNlIGVuY3VlbnRyYW4uIChIZXJuw6FuZGV6LCAyMDIyKS4gU2Vnw7puIGVsIGVzdHVkaW8g4oCcRWwgR3JhbiBEZXNnYXN0ZTogcmVudW5jaWEgZW4gTcOpeGljb+KAnSBkaXZ1bGdhZG8gZW4gZWwgw7psdGltbyB0cmltZXN0cmUgZGVsIDIwMjIsIDQgZGUgY2FkYSAxMCB0cmFiYWphZG9yZXMgbWV4aWNhbm9zIGVzdGFyw61hbiBkaXNwdWVzdG9zIGEgcmVudW5jaWFyIGEgc3UgYWN0dWFsIHB1ZXN0byBsYWJvcmFsIGVuIGxvcyBwcsOzeGltb3Mgc2VpcyBtZXNlcy4gTGFzIHByaW5jaXBhbGVzIGNhdXNhcyBkZSByZW51bmNpYSBlc3TDoW4gcmVsYWNpb25hZGFzIGNvbiBlbCBuaXZlbCBkZSBkZXNnYXN0ZSBkZSBsb3MgdHJhYmFqYWRvcmVzLiBBdW5xdWUgbGEgcmVudW5jaWEgc2VhIGNvbnNlY3VlbmNpYSBkZSBsYSBpbnNhdGlzZmFjY2nDs24sIGxhIHNhdGlzZmFjY2nDs24gbm8gZXMgZ2FyYW50w61hIGRlIHJldGVuY2nDs24sIHlhIHF1ZSAzMiUgZGUgbG9zIGNvbGFib3JhZG9yZXMgc2F0aXNmZWNob3MgbyBtdXkgc2F0aXNmZWNob3MgZXN0w6FuIGRpc3B1ZXN0b3MgYSByZW51bmNpYXIsIHNlZ8O6biBlbCBlc3R1ZGlvLiAoU3RhZmYgJiBTdGFmZiwgMjAyMik8YnI+CgogTG8gcXVlIHNlIHZpdmUgZW4gTcOpeGljbyBjb24gcmVsYWNpw7NuIGEgbGFzIHJlbnVuY2lhcyBlbiBsYXMgZW1wcmVzYXMgZGUgbWFudWZhY3R1cmEKIApSYW5kc3RhZCwgZmlybWEgZXNwZWNpYWxpc3RhIGVuIHJlY3Vyc29zIGh1bWFub3MsIHJldmVsw7MgcXVlIGRvcyBkZSBjYWRhIGNpbmNvIGVtcHJlc2FzIG1hbnVmYWN0dXJlcmFzIHRpZW5lbiB1bmEgcm90YWNpw7NuIGRlIHBlcnNvbmFsIGFudWFsIGRlIGFsIG1lbm9zIGRlIDIwJS4gKE1leGljb0luZHVzdHJ5LCAyMDIxKS4gRWwgYXVtZW50byBkZSBsYSB0YXNhIGRlIHJvdGFjacOzbiBkZSBwZXJzb25hbCBlbiBsYSBpbmR1c3RyaWEgZXMgdW5hIHRlbmRlbmNpYSB5IHNlIGVzdGltw61vIHF1ZSBhIGZpbmFsZXMgZGVsIGHDsW8gMjAyMiwgbGEgdGFzYSBsbGVnw7MgYSB1biA4MCUgYW51YWwgYWN1bXVsYWRhIGVuIGVsIHNlY3RvciBtYW51ZmFjdHVyYS4gIEVsIGNvc3RvIGRlIHJvdGFjacOzbiB2YSBkZXNkZSB1biByYW5nbyBkZSAxMCBtaWwgYSAzMCBtaWwgcGVzb3MgcG9yIGVtcGxlYWRvLCBsbyBxdWUgZXMgcMOpcmRpZGEgZGUgdmFsb3IgZWNvbsOzbWljbyBlbiBsYXMgZW1wcmVzYXMuIChJTkNPTUVYLCAyMDIyKSA8YnI+CgojIyAqKlByZWd1bnRhIDU6IFByb2JsZW1hIGludGVybm8gbyBleHRlcm5vKioKIyMjICoqwr9DdcOhbGVzIHNvbiBsYXMgcHJpbmNpcGFsZXMgcmF6b25lcyBkZSBsYXMgYmFqYXM/IMK/RXMgdW4gcHJvYmxlbWEgaW50ZXJubyBvIGV4dGVybm8gYSBGT1JNPyoqClNhYmVyIGxhIHJhesOzbiBwb3IgbGFzIGJhamFzIGRlbnRybyBkZSBGT1JNIG5vcyBwZXJtaXRlIGRpYWdub3N0aWNhciBlbCDDoXJlYSBkZSBvcG9ydHVuaWRhZCBkZSBsYSBlbXByZXNhIGVuIGN1YW50byBhIHJldGVuY2nDs24gZGUgdGFsZW50bywgY29uIGVsIGFuw6FsaXNpcyBkZSBkYXRvcyBzZSBwdWVkZW4gZW5jb250cmFyIHRlbmRlbmNpYXMsIMOhcmVhcyBkZSBvcG9ydHVuaWRhZCB5IHBvc2libGVzIHNvbHVjaW9uZXMgYSBwcm9ibGVtYXMgcXVlIHRpZW5kZSBhIHRlbmVyIGxhIGVtcHJlc2EsIHBhcmEgZXN0byBlcyBuZWNlc2FyaW8gc2FiZXIgc2kgbGFzIGJhamFzIHNvbiBvY2FzaW9uYWRhcyBwb3IgcHJvYmxlbWFzIGludGVybm9zIG8gZXh0ZXJub3MgYSBGT1JNLCBjb24gZXN0byBwb2RlbW9zIGlkZW50aWZpY2FyIHVuIGJ1ZW4gcHVudG8gZGUgcGFydGlkYSBwYXJhIGN1YWxxdWllciBpbnZlc3RpZ2FjacOzbiBkZW50cm8gZGUgbGEgZW1wcmVzYS4gPGJyPgoKIyMjICoqRGlyZWNjacOzbiBkZSBlbXBsZWFkb3MgY29uY2F0ZW5hZGEqKiAKYGBge3J9CiNBZ3JlZ2FuZG8gZGlyZWNjacOzbiBjb21wbGV0YSBhIGJhc2UgZGUgZGF0b3MKZm9ybV9iYWphc18yMyA8LSBmb3JtX2JhamFzXzIzICU+JSBtdXRhdGUoRGlyZWNjaW9uMSA9IHBhc3RlKENhbGxlLCBOdW1lcm8sIHNlcCA9ICIgIikpCmZvcm1fYmFqYXNfMjMgPC0gZm9ybV9iYWphc18yMyAlPiUgbXV0YXRlKERpcmVjY2lvbiA9IHBhc3RlKERpcmVjY2lvbjEsIENvbG9uaWEsIE11bmljaXBpbywgRXN0YWRvLCBDUCwgc2VwID0gIiwgIikpCmZvcm1fYmFqYXNfMjMkRGlyZWNjaW9uMSA8LSBOVUxMCmBgYAoKIyMjICoqRGlzdGFuY2lhcyBhcHJveGltYWRhcyByZWNvcnJpZGFzIHBvciBlbXBsZWFkb3MgaGFjaWEgRk9STSoqCmBgYHtyfQojIENyZWFuZG8gdW4gaWZlbHNlIHBhcmEgYXNpZ25hciBkaXN0YW5jaWFzIGFwcm94aW1hZGFzIGRlbCBtdW5pY2lwaW8gaGFjaWEgRk9STQpmb3JtX2JhamFzXzIzIDwtIG11dGF0ZShmb3JtX2JhamFzXzIzLCBEaXN0YW5jaWFfa209aWZlbHNlKE11bmljaXBpbyAlaW4lICJBcG9kYWNhIiwgMy41LCBpZmVsc2UoTXVuaWNpcGlvICVpbiUgIkNpZW5lZ2EgZGUgRmxvcmVzIiwgMzQsIGlmZWxzZShNdW5pY2lwaW8gJWluJSAiR3VhZGFsdXBlIiwgMTMsIGlmZWxzZShNdW5pY2lwaW8gJWluJSAiSnVhcmV6IiwgMTgsIGlmZWxzZShNdW5pY2lwaW8gJWluJSAiTW9udGVycmV5IiwgMjEsIGlmZWxzZShNdW5pY2lwaW8gJWluJSAiUGVzcXVlcmlhIiwgMjAsIGlmZWxzZShNdW5pY2lwaW8gJWluJSAiUmFtb3MgQXJpenBlIiwgMTAwLGlmZWxzZShNdW5pY2lwaW8gJWluJSAiU2FsdGlsbG8iLCAxMTIsIDE1KSkpKSkpKSkpCgojIElkZW50ZmljYW5kbyBsb3MgbXVuaWNpcGlvcyBlbiBkb25kZSB2aXZlbiBsb3MgZW1wbGVhZG9zIGRlIGJhamEgcGFyYSBkZXRlcm1pbmFyIHNpIGxhIGRpc3RhbmNpYSBlcyB1biBmYWN0b3IKZ2dwbG90KGZvcm1fYmFqYXNfMjMsYWVzKE11bmljaXBpbykpICsgZ2VvbV9iYXIoYWVzKGZpbGw9RGlzdGFuY2lhX2ttKSx3aWR0aD0wLjUpICsgeGxhYigiTXVuaWNpcGlvIikgK3lsYWIoIkNhbnRpZGFkIGRlIGJhamFzIikgKyBnZ3RpdGxlKCJEaXN0YW5jaWFzIHkgbXVuaWNpcGlvcyBkZSByZXNpZGVuY2lhIGRlIGJhamFzIGVuIDIwMjMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCmBgYAoKTGEgbWF5b3LDrWEgZGUgbGFzIGJhamFzIGRlIEZPUk0gcXVlIHNlIGhhbiBkYWRvIGVuIDIwMjMgdmllbmVuIGRlbCBtaXNtbyBtdW5pY2lwaW8sIHNpZW5kbyBBcG9kYWNhLCBlc3RlIGVzIGVsIG11bmljaXBpbyBtw6FzIGNlcmNhIGRlIGxhIGbDoWJyaWNhIGRlIEZPUk0gYSAzLjUga20sIGVzdG8gbm9zIGF5dWRhIGEgY29uY2x1aXIgcXVlIGxhIGRpc3RhbmNpYSBubyBlcyBsYSBwcmluY2lwYWwgcmF6w7NuIHBvciBsYSBjdWFsIGxhIG1heW9yw61hIGRlIGxhcyBiYWphcyBzZSBkYW4gZW4gRk9STSwgYXVucXVlIGVzIGltcG9ydGFudGUgbWVuY2lvbmFyIHF1ZSBlbiBsb3MgY2Fzb3MgZGUgUmFtb3MgQXJpenBlIHkgU2FsdGlsbG8gc2kgZXMgcHJvYmFibGUgcXVlIGxhIGRpc3RhbmNpYSBmdWVyYSBwYXJ0ZSBkZSBsYSBiYWphIGRlbCBlbXBsZWFkby48YnI+CgojIyMgKipNb3Rpdm9zIGRlIGJhamFzIGVuIEZPUk0gZW50cmUgMjAyMiB5IDIwMjMqKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEhhY2VyIHVuIGNvbnRlbyBkZSBsb3MgbW90aXZvcyBkZSBiYWphCnRpcG9zX2JhamFfaW50IDwtIGdyb3VwX2J5KGZvcm1fYmFqYXNfaW50ZWdyYWRhcyxNb3Rpdm9fZGVfQmFqYSkKdGlwb3NfYmFqYV9pbnQgPC0gc3VtbWFyaXplKHRpcG9zX2JhamFfaW50LCBjb250ZW89bigpKQp0aXBvc19iYWphX2ludCA8LSB0aXBvc19iYWphX2ludFt0aXBvc19iYWphX2ludCRjb250ZW8gIT0gIjExMyIsIF0KCiNHcsOhZmljYSBkZSBwaWUgbW9zdHJhbmRvIGVsIG1vdGl2byBkZSBiYWphcyBkZSBlbXBsZWFkb3MgZW50cmUgMjAyMiB5IDIwMjMKZ2dwbG90KHRpcG9zX2JhamFfaW50LCBhZXMoeCA9ICIiLCB5ID0gY29udGVvLCBmaWxsID0gTW90aXZvX2RlX0JhamEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSkgKwogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArIGdndGl0bGUoIk1vdGl2byBkZSBiYWphcyBkZSBlbXBsZWFkb3MgZW50cmUgMjAyMiB5IDIwMjMiKSArIAogIHRoZW1lX3ZvaWQoKSArIGdlb21fdGV4dCgKICBhZXMoeCA9IDEuNSwgbGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoY29udGVvIC8gc3VtKHRpcG9zX2JhamFfaW50JGNvbnRlbykpKSwKICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpLCAKICBzaXplID0gNCkKCmBgYAoKRWwgNTUlIGRlIGxhcyBiYWphcyBkZSBlbXBsZWFkb3MgZGUgRk9STSBlbiAyMDIzIGhhbiBzaWRvIHZvbHVudGFyaWFzLCBzaWduaWZpY2FuZG8gcXVlIHNvbiBtdXkgcG9jYXMgbGFzIG9jYXNpb25lcyBlbiBkb25kZSBkZXNwaWRlbiBhIHVuIGVtcGxlYWRvLCBzaWVuZG8gbcOhcyB1bmEgZGVjaXNpw7NuIHByb3BpYSBkZWwgbWlzbW8gZGVqYXIgZGUgdHJhYmFqYXIgZW4gRk9STSwgaWd1YWxtZW50ZSBkb25kZSBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgbm8gbWVuY2lvbmFuIGxhIHJhesOzbiBwb3IgbGEgY3VhbCBkZWNpZGllcm9uIHNhbGlyIGRlIGxhIGVtcHJlc2EuIENvbiBlc3RhIGluZm9ybWFjacOzbiBwb2RlbW9zIHZlciBxdWUgbGEgcmV0ZW5jacOzbiBkZSB0YWxlbnRvIGVzIHVuYSDDoXJlYSBkZSBvcG9ydHVuaWRhZCwgbWllbnRyYXMgcXVlIGEgbGEgdmV6IGxvcyBlbXBsZWFkb3MgdGllbmVuIHVuIG1heW9yIGNvbnRyb2wgeSBsaWJlcnRhZCBkZSBzdXMgZGVjaXNpb25lcyBsYWJvcmFsZXMuIE90cm8gYXNwZWN0byBpbXBvcnRhbnRlIGVzIHF1ZSB1biAyMiUgZGUgbGFzIGJhamFzIHNvbiBhIGNhdXNhcyBkZSBmYWx0YXMgYWN1bXVsYWRhcyBwb3IgbG9zIGVtcGxlYWRvcywgc2llbmRvIGxhIHNlZ3VuZGEgY2F1c2EgbcOhcyBmcmVjdWVudGUgZGUgYmFqYXMgZGUgZW1wbGVhZG9zLjxicj4KCiMjIyAqKkFuYWzDrXNpcyBkZSBwdWVzdG9zIHkgc3VzIGJhamFzIGVuIEZPUk0qKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEZpbHRyYW5kbyB0b3AgZGVwYXJ0YW1lbnRvcyBjb24gbcOhcyBiYWphcwpwdWVzdG9GaWwgPC0gZ3JvdXBfYnkoZm9ybV9iYWphc19pbnRlZ3JhZGFzLCBQVUVTVE8pCnB1ZXN0b0ZpbCA8LSBzdW1tYXJpemUocHVlc3RvRmlsLCBDb3VudCA9IG4oKSkKcHVlc3RvRmlsIDwtIGFycmFuZ2UocHVlc3RvRmlsLCBkZXNjKENvdW50KSkKcHVlc3RvRmlsIDwtIGhlYWQocHVlc3RvRmlsKQogIAojIENyZWFjacOzbiBkZSBncsOhZmljYSBxdWUgZGVtdWVzdHJhIGxhIGNhbnRpZGFkIGRlIGVtcGxlYWRvcyBxdWUgc2UgZGllcm9uIGRlIGJhamEgZW4gY2FkYSBwdWVzdG8gZW50cmUgMjAyMiB5IDIwMjMKZ2dwbG90KHB1ZXN0b0ZpbCwgYWVzKHggPSByZW9yZGVyKFBVRVNUTywgLUNvdW50KSwgeSA9IENvdW50LCBmaWxsID0gUFVFU1RPKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjUpICsgeGxhYigiUHVlc3RvIikgKyB5bGFiKCJDYW50aWRhZCBkZSBiYWphcyIpICsgZ2d0aXRsZSgiIEJhamFzIGRlIGVtcGxlYWRvcyB5IHN1cyBwdWVzdG9zIGVudHJlIDIwMjIgeSAyMDIzIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCiAgICAgCmBgYAoKQ29tbyBwb2RlbW9zIG9ic2VydmFyIGVuIGxhIGdyw6FmaWNhIGFudGVyaW9yLCBlbCBwdWVzdG8gY29uIG1heW9yIHJvdGFjacOzbiBkZSBlbXBsZWFkb3MgcG9yIHVuYSBncmFuIGRpZmVyZW5jaWEgZXMgYXl1ZGFudGUgZ2VuZXJhbCwgc2llbmRvIHVubyBkZSBsb3MgcHVlc3RvcyBkZSBwcm9kdWNjacOzbiBkZSBsYSBlbXByZXNhIHF1ZSBtw6FzIGVtcGxlYWRvcyBuZWNlc2l0YW4geSBzdSBsYWJvciBiw6FzaWNhbWVudGUgZXMgYXBveWFyIGVuIGN1YWxxdWllciDDoXJlYSBxdWUgbmVjZXNpdGUgbcOhcyBwZXJzb25hbCBhdGVuZGllbmRvLiBBbGdvIHF1ZSBwdWVkZSBlc3RhciBvY2FzaW9uYW5kbyBlc3RhIGdyYW4gY2FudGlkYWQgZGUgYmFqYXMgZW4gZWwgcHVlc3RvIGVzIGxhIGZhbHRhIGRlIHBlcnRlbmVuY2lhIG8gc2VudGlkbyBoYWNpYSBlbCB0cmFiYWpvIHF1ZSBoYWNlIGVsIGVtcGxlYWRvLCBjYXVzYW5kbyBxdWUgbm8gdGVuZ2EgaW50ZXLDqXMgeSBzYWxnYSBkZWwgcHVlc3RvLCBlcyBuZWNlc2FyaW8gdGVuZXIgdW5hIG1lam9yIGlkZWEgZGUgbG8gcXVlIGVzdMOhIHBhc2FuZG8gZW4gZXN0ZSBwdWVzdG8gcXVlIGNhdXNhIHRhbnRhIHJvdGFjacOzbiB5IHViaWNhciBsYXMgw6FyZWFzIGRlIG9wb3J0dW5pZGFkIHF1ZSBwcmVzZW50YW4gY29uIGVsIGZpbiBkZSByZWR1Y2lyIGxhIGNhbnRpZGFkIGRlIGJhamFzLjxicj4KCiMjIyAqKkFuYWxpc2lzIGRlIHN1ZWxkb3MqKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QoZm9ybV9iYWphc19pbnRlZ3JhZGFzLCBhZXMoeCA9IERpYXNfTGFib3JhZG9zLCB5ID0gU2FsYXJpbykpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuNykgKyAgIyBDYW1iaWFuZG8gY29sb3JlcyBkZSBncsOhZmljYQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsdWUiLCBzZSA9IEZBTFNFKSArICAjIEFncmVnYW5kbyBsaW5lYSBkZSByZWdyZXNpw7NuCiAgeGxhYigiRMOtYXMgTGFib3JhZG9zIikgKyB5bGFiKCJTYWxhcmlvIERpYXJpbyIpICsgZ2d0aXRsZSgiU2NhdHRlcnBsb3QgZGUgRGlhcyBMYWJvcmFkb3MgdnMuIFNhbGFyaW8gRGlhcmlvIDIwMjIgeSAyMDIzIikgKyB0aGVtZV9taW5pbWFsKCkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyB4bGltKDAsMTUwMCkgCmBgYAoKRW4gY3VhbnRvIGEgbG9zIHN1ZWxkb3MgZGlhcmlvcyBxdWUgcmVjaWLDrWFuIGFudGVzIGRlIHNhbGlyIGRlIGxhIGVtcHJlc2EsIHBvZGVtb3MgdmVyIHF1ZSBsYSBtYXlvcsOtYSBkZSBsYXMgYmFqYXMgc2UgaGFjZW4gZW4gbG9zIHByaW1lcm9zIDE1MCBkw61hcyBkZSBsYWJvciwgY29uIHVuIHN1ZWxkbyBkZSBlbnRyZSAxODAgbyAyMjAgYXByb3hpbWFkYW1lbnRlLCBlbCBzdWVsZG8gcHVlZGUgdmFyaWFyIGRlcGVuZGllbmRvIGRlbCBwdWVzdG8gbyBwZXJmaWwgZGVsIGVtcGxlYWRvLiBMYXMgc2FsaWRhcyBxdWUgc29uIGRlc3B1w6lzIGRlIGxvcyBwcmltZXJvcyAxNTAgZMOtYXMgdGllbmRlbiBhIGxsZXZhciB1biBzdWVsZG8gcG9yIGFscmVkZWRvciBkZSAxODAgcGVzb3MgYWwgZMOtYSwgbW9zdHJhZG8gcG9yIGxhIGzDrW5lYSBkZSByZWdyZXNpw7NuIHF1ZSBtdWVzdHJhIHVuYSB0ZW5kZW5jaWEgbGlnZXJhIGRlIGRpc21pbnVjacOzbiBkZSBzdWVsZG8gZGlhcmlvIGVuIGxvcyBlbXBsZWFkb3MgcXVlIGR1cmFuIG3DoXMgZW4gbGEgZW1wcmVzYS48YnI+CgoKIyMgKipQcmVndW50YSA2OiBSZWxhY2nDs24gZGUgYmFqYXMgY29uIHRpZW1wbyoqCiMjIyAqKkRlIGxvcyBjb2xhYm9yYWRvcmVzIHF1ZSBzZSBkYW4gZGUgYmFqYSwgwr9DdcOhbCBoYSBzaWRvIGxhIGR1cmFjacOzbiBlbiBGT1JNPyDCv1RpZW5lbiByZWxhY2nDs24gY29uIHRlbXBvcmFkYSBvIG1lcz8qKgpDb25vY2VyIHNpIGxhIMOpcG9jYSBkZWwgYcOxbyB0aWVuZSBhbGd1bmEgcmVsYWNpw7NuIGNvbiBxdWUgbG9zIGVtcGxlYWRvcyBzZSBkZW4gZGUgYmFqYSwgeSBjdWFsZXMgc29uIGVzdGFzIGZlY2hhcyBlcyBmdW5kYW1lbnRhbCBwYXJhIGxhIGVtcHJlc2EsIGNvbiBlbCBvYmpldGl2byBkZSBwb2RlciBpbXBsZW1lbnRhciBlc3RyYXRlZ2lhcyBwYXJhIGRpc21pbnVpciBsYSByb3RhY2nDs24uIENvbiBlc3RlIGPDs2RpZ28gc2UgcG9kcmEgY29uY2x1aXIgc2kgZXhpc3RlIHVuYSByZWxhY2nDs24gZW50cmUgbGEgdGVtcG9yYWRhIGRlbCBhw7FvLCB5IGFkZW1hcyBkZXRlY3RhciBjdWFsIGVzIGxhIGR1cmFjacOzbiBwcm9tZWRpbyBkZSBsb3MgZW1wbGVhZG9zIHF1ZSBzZSBoYW4gZGFkbyBkZSBiYWphLCBwYXJhIHBvc3Rlcmlvcm1lbnRlIHJlbGFjaW9uYXJsbyBhIG90cm9zIGZhY3RvcmVzLgoKIyMjIyAqKkNyZWFjacOzbiBkZSBkYXRhZnJhbWUgY29uIGxvcyBhw7FvcyAyMDIyIHkgMjAyMyBjb21iaW5hZG9zLCBzaW4gZW1iYXJnbyB0aWVuZSBOQSdzIHkgZXNwYWNpb3MgdmFjaW9zKioKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcDZfbWFsPC0gYmluZF9yb3dzKHA2XzIwMjJfMiwgcDZfMjAyM18yKQpgYGAKCiMjIyMgKipMZWN0dXJhIGRlIGxhcyBmZWNoYXMgY29uIGVsIGZvcm1hdG8gZGUgQcOxby1NZXMtRMOtYSoqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnA2JEZlY2hhLmRlLkFsdGEgPC0gYXMuRGF0ZShwNiRGZWNoYS5kZS5BbHRhLCBmb3JtYXQgPSAiJVktJW0tJWQiKQpwNiRGZWNoYS5kZS5CYWphPC0gYXMuRGF0ZShwNiRGZWNoYS5kZS5CYWphLCBmb3JtYXQgPSAiJVktJW0tJWQiKQoKcDYkRHVyYWNpb25fRGlhcyA8LSBhYnMoYXMubnVtZXJpYyhwNiRGZWNoYS5kZS5CYWphIC0gcDYkRmVjaGEuZGUuQWx0YSkpCmBgYAoKIyMjIyAqKkdyw6FmaWNhIGRlIEJhcnJhcyAoRHVyYWNpw7NuIGRlIEVtcGxlYWRvcykqKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaW1pdGVzIDwtIHNlcSgwLCA1MDAsIGJ5ID0gNTAwKSAgCmdncGxvdChwNiwgYWVzKHggPSBEdXJhY2lvbl9EaWFzKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAsIGZpbGwgPSAib3JhbmdlIiwgY29sb3IgPSAiYmxhY2siLCBib3VuZGFyeSA9IDApICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gbGltaXRlcykgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJUb3AgRHVyYWNpb25lcyBkZSBFbXBsZWFkb3MiLAogICAgeCA9ICJEdXJhY2nDs24gKGTDrWFzKSIsCiAgICB5ID0gIkNhbnRpZGFkIGRlIEVtcGxlYWRvcyIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkKICApCiAKYGBgCgojIyMgKipDw6FsY3VsbyBkZSBNZWRpZGFzIGRlIFRlbmRlbmNpYSBDZW50cmFsKioKYGBge3J9CnByb21lZGlvX2R1cmFjaW9uIDwtIG1lYW4ocDYkRHVyYWNpb25fRGlhcykKbWVkaWFuYV9kdXJhY2lvbiA8LSBtZWRpYW4ocDYkRHVyYWNpb25fRGlhcykKbW9kYV9kdXJhY2lvbiA8LSBhcy5udW1lcmljKG5hbWVzKHNvcnQodGFibGUocDYkRHVyYWNpb25fRGlhcyksIGRlY3JlYXNpbmcgPSBUUlVFKVsxXSkpIApgYGAKCiMjIyAqKlRhYmxhIGRlIFRlbmRlbmNpYSBDZW50cmFsIChEdXJhY2nDs24gZGUgRW1wbGVhZG9zKSoqCmBgYHtyfQp0YWJsYV90ZW5kZW5jaWEgPC0gZGF0YS5mcmFtZSgKICBNZWRpZGEgPSBjKCJNZWRpYSIsICJNZWRpYW5hIiwgIk1vZGEiKSwKICBWYWxvciA9IGMocHJvbWVkaW9fZHVyYWNpb24sIG1lZGlhbmFfZHVyYWNpb24sIG1vZGFfZHVyYWNpb24pCikKcHJpbnQodGFibGFfdGVuZGVuY2lhKQpgYGAKRWwgcHJvbWVkaW8gZXMgdW4gdmFsb3IgcXVlIHJlc3VsdGEgcG9jbyDDunRpbCBlbiBlc3RlIGNhc28sIHlhIHF1ZSBpbmRpY2EgcXVlIGVuIHByb21lZGlvIHVuIGVtcGxlYWRvIHByZXNlbnRhIHN1IGJhamEgYSBsb3MgMTEyIGRpYXMsIHNpbiBlbWJhcmdvIGFsIGFuYWxpemFyIGxhIHRhYmxhIHNlIHB1ZWRlIGNvbmNsdWlyIHF1ZSBsYSBtYXlvcmlhIGRlIGxvcyBkYXRvcyBzZSBlbmN1ZW50cmFuIGVudHJlIDAtMTAwIGRpYXMuPGJyPgoKTGEgbW9kYSBlcyBlbCB2YWxvciBtYXMgdXRpbCB5YSBxdWUgbm9zIGRpY2UgcXVlIGVsIHBlcmlvZG8gZGUgdGllbXBvIG3DoXMgY29tw7puIGVudHJlIGxvcyBxdWUgcmVudW5jaWFuIGVzIDUgZGlhcywgZGUgaGVjaG8gbG9zIHBlcmlvZG9zIGRlIHRpZW1wbyBtYXMgY29tdW5lcyBzb24gZW50cmUgMC0zMCBkaWFzLiBQb3IgbG8gcXVlIHVuIG1lcyBlcyBlbCBtYXMgcmllc2dvc28gcGFyYSBxdWUgdW4gZW1wbGVhZG8gcmVudW5jaWUuIFBhc2FuZG8gZGUgZXN0ZSBtZXMgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBzZSBwcmVzZW50ZSB1biBlbXBsZWFkbyBkZSBiYWphIGVzIG11Y2hvIG1lbm9yLjxicj4KCiMjIyAqKkNyZWFjacOzbiBkZSBEYXRhIEZyYW1lLCBkZSBiYWphcyBwb3IgbWVzKioKYGBge3J9CnA2IDwtIHA2ICU+JQogIG11dGF0ZShNZXMgPSBmb3JtYXQoRmVjaGEuZGUuQmFqYSwgIiVZLSVtIikpCgpwNl9tZXMgPC0gcDYgJT4lCiAgY291bnQoTWVzLCBuYW1lID0gIkNhbnRpZGFkIikgJT4lCiAgbXV0YXRlKHllYXIgPSBhcy5pbnRlZ2VyKHN1YnN0cihNZXMsIDEsIDQpKSwKICAgICAgICAgTWVzID0gZmFjdG9yKHN1YnN0cihNZXMsIDYsIDcpLCBsZXZlbHMgPSBzcHJpbnRmKCIlMDJkIiwgMToxMiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJFbmVybyIsICJGZWJyZXJvIiwgIk1hcnpvIiwgIkFicmlsIiwgIk1heW8iLCAiSnVuaW8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWxpbyIsICJBZ29zdG8iLCAiU2VwdGllbWJyZSIsICJPY3R1YnJlIiwgIk5vdmllbWJyZSIsICJEaWNpZW1icmUiKSkpCmBgYAoKIyMjICoqR3LDoWZpY28gZGUgQmFycmFzIEFjdW11bGF0aXZvIChCYWphcyBwb3IgTWVzKSoqCmBgYHtyfQpnZ3Bsb3QocDZfbWVzLCBhZXMoeCA9IE1lcywgeSA9IENhbnRpZGFkLCBmaWxsID0gZmFjdG9yKHllYXIpKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHJldmVyc2UgPSBGQUxTRSkpICsKICBsYWJzKHggPSAiTWVzIiwgeSA9ICJOw7ptZXJvIGRlIGVtcGxlYWRvcyBkZSBiYWphIiwgZmlsbCA9ICJBw7FvIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNGRjU3MzMiLCAiI0ZGQTYzMyIsICIjRkZEMTMzIikpICsgICMgVHJlcyB0b25vcyBkZSBuYXJhbmphCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpgYGAKCkNvbW8gc2UgcHVkbyBjb21wcm9iYXIsIGxvcyBtZXNlcyBjb24gbWFzIGJhamFzIGVuIGVsIGHDsW8gZGVzdGFjYW4gZW50cmUgRW5lcm8sIEp1bmlvIHkgQWdvc3RvLiBTaWVuZG8gQWdvc3RvIGVsIG1hcyBjb23Dum4sIGxvcyB1bHRpbW9zIG1lc2VzIGVzdGEgcm90YWNpw7NuIGJham8gZGUgZ3JhbiBtYW5lcmEgYSBleGNlcGNpw7NuIGRlbCBtZXMgZGUgTm92aWVtYnJlIGRlbCAyMDIyLiBFbiBNYXJ6byBodWJvIHVuIGluY3JlbWVudG8gZW4gcmVsYWNpw7NuIGFsIGHDsW8gcGFzYWRvIGxvIHF1ZSBwdWVkZSBzZXIgw7p0aWwgcGFyYSBkZXRlY3RyIHF1ZSBzdWNlZGlvIGR1cmFudGUgZXN0ZSB0aWVtcG8uIFNlIGRlYmUgaGFjZXIgdW5hIGludmVzdGlnYWNpw7NuIGRlIGxvIHF1ZSBvY3VycmUgZW50cmUgbG9zIG1lc2VzIHF1ZSB0aWVuZW4gdW5hIGJhamEgcm90YWNpw7NuIHkgY29tcGFyYXJsbyBjb24gbG9zIG1lc2VzIGRlIGFsdGEgcm90YWNpw7NuIHBhcmEgZGV0ZWN0YXIgb3BvcnR1bmlkYWRlcyBwYXJhIGZ1dHVyYXMgZXN0cmF0ZWdpYXMuIDxicj4KIAojICoqQnVzcXVlZGEgZGUgaW5mb3JtYWNpw7NuIGRlIGRhdG9zKioKIyMjICoqwr9RdcOpIHRpcG8gZGUgaW5mb3JtYWNpw7NuIC8gZGF0b3Mgc29saWNpdGFyw61hcyBhbCBzb2NpbyBmb3JtYWRvciBwYXJhIG1lam9yYXIgRURBPyoqCisgUmVzdWx0YWRvcyBkZSBlbmN1ZXN0YXMgZGUgc2F0aXNmYWNjacOzbiBhIGxvcyBjb2xhYm9yYWRvcmVzIHJlYWxpemFkYXMgZW4gYcOxb3MgYW50ZXJpb3Jlcy4KKyBTaXR1YWNpw7NuIGRlIGxhIGVtcHJlc2EgZW4gdMOpcm1pbm9zIGRlIHNhdGlzZmFjY2nDs24gZGVsIHBlcnNvbmFsIGVuIDIwMjIuCisgQWNjZXNvIGEgcmVwb3J0ZXMgZGUgbGEgaW5kdXN0cmlhIG8gaW5kdXN0cmlhcyBwb3RlbmNpYWxlcyBxdWUgc2UgaGF5YW4gYWRxdWVyaWRvIHJlY2llbnRlbWVudGUuCgojIyMgKipEYXRvcyBkZSByZWNsdXRhbWllbnRvIHkgc2VsZWNjacOzbjoqKgorIEZ1ZW50ZXMgZGUgcmVjbHV0YW1pZW50byB1dGlsaXphZGFzLgorIFByb2Nlc28gZGUgc2VsZWNjacOzbiB5IHRpZW1wbyBwcm9tZWRpbyBkZSBjb250cmF0YWNpw7NuLgorIFBlcmZpbCBkZSBoYWJpbGlkYWRlcyB5IGV4cGVyaWVuY2lhIGRlIGxvcyBudWV2b3MgY29sYWJvcmFkb3Jlcy4KKyBQZXJmaWwgZGUgZW1wbGVhZG9zIG1vZGVsbyBhY3R1YWxlcy4KCgojIyMgKirCv1F1w6kgdGlwbyBkZSBpbmZvcm1hY2nDs24gLyBkYXRvcyBkZSBmdWVudGVzIHNlY3VuZGFyaWFzIGJ1c2NhcsOtYXMgcGFyYSBtZWpvcmFyIEVEQT8qKgorIEluZm9ybWVzIGRlIGNvbnN1bHRvcmFzIHkgYW5hbGlzdGFzIGVzcGVjaWFsaXphZG9zIGVuIFJlY3Vyc29zIEh1bWFub3MuCisgSW5mb3JtZXMgZGUgdGVuZGVuY2lhcyBsYWJvcmFsZXMuCisgSW5mb3JtYWNpw7NuIHNvYnJlIGhlcnJhbWllbnRhcyB5IHRlY25vbG9nw61hIGRlIFJlY3Vyc29zIEh1bWFub3MuCisgRm9ybWF0b3MgZGUgZXhhbWVuZXMgcHNpY29tw6l0cmljb3MgY29uIGxhIGZpbmFsaWRhZCBkZSBnZW5lcmFyIHBlcmZpbGVzIGRlIGVtcGxlYWRvcyBwb3IgcHVlc3RvLgorIFJlcG9ydGVzIHNvYnJlIGVsIHBhbm9yYW1hIGNvbWVyY2lhbCBwYXJhIDIwMjQgZW4gRUUuVVUuIHkgTcOpeGljbyBwYXJhIGNvbnRlbXBsYXIgbmVjZXNpZGFkZXMgZGUgcmVjdXJzb3MgaHVtYW5vcyBzaSBsYSBkZW1hbmRhIGF1bWVudGEgbyBkaXNtaW51eWUuCgojICoqUmVmbGV4acOzbioqCgojIyMgUmVzdW1lbiBkZSBsb3MgNS03IHByaW5jaXBhbGVzIGhhbGxhemdvcyBkZWwgYW7DoWxpc2lzIGN1YWxpdGF0aXZvLCBjdWFudGl0YXRpdm8geSBlc3RhZMOtc2l0aWNvIGRlc2NyaXB0aXZvCjEuCUZPUk0gZXMgdW5hIGVtcHJlc2EgbXV5IGZ1ZXJ0ZSB5IGJpZW4gcG9zaWNpb25hZGEgZW4gbG8gcXVlIHJlc3BlY3RhIGEgbGEgcGVyY2VwY2nDs24geSBjb25maWFuemEgY29uIHN1cyBjbGllbnRlcywgbGEgZW1wcmVzYSBoYSBsb2dyYWRvIHBvc2ljaW9uYXJzZSByw6FwaWRhbWVudGUgZW4gZWwgbWVyY2FkbyBzaW4gc2FjcmlmaWNhciBzdSByZW50YWJpbGlkYWQgeSBlc3RvIHNlIHRyYWR1Y2UgYSBzdSBzZWxlY3RpdmlkYWQgeSBjYWxpZGFkIGRlIHByb2R1Y3RvLiBFc3RhIGRpcmVjY2nDs24gZGVmaW5pZGEgcG9yIHBhcnRlIGRlIGxhIGVtcHJlc2EgaGFjZSBxdWUgdW5hIGRlIHN1cyBtYXlvcmVzIGZvcnRhbGV6YXMgc2VhIGxhIGlubm92YWNpw7NuIGUgaW52ZXJzaW9uZXMgZXN0cmF0w6lnaWNhcyBlbiBpbmdlbmllcsOtYSBkZSBlbXBhcXVlIHkgdHJhbnNwb3J0ZSBwcm9waW8uIFNpbiBlbWJhcmdvLCBoYXkgdW5hIGRlYmlsaWRhZCBxdWUgaGEgZXN0YWRvIHJldGVuaWVuZG8gYSBGT1JNIGZ1ZXJ0ZW1lbnRlIGVuIHRlbWFzIGRlIHByb2R1Y3RpdmlkYWQgeSBlc3RhIGVzIGxhIGN1bHR1cmEgb3JnYW5pemFjaW9uYWwgdHJhZHVjaWRhIGEgdW5hIGFsdGEgZnVnYSBkZSB0YWxlbnRvIGh1bWFubyBlbiBwaXNvLiA8YnI+IAoKICAgIEFuYWxpemFuZG8gbG9zIHJlc3VsdGFkb3MgZGVsIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gZGVzY3JpcHRpdm8geSBjdWFsaXRhdGl2bywgc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgRk9STSBubyB0aWVuZSBidWVub3MgcGVyZmlsZXMgZGUgcHVlc3Rvcy4gTGEgZmFsdGEgZGUgcGVyZmlsZXMgZGUgcHVlc3RvIGluZGljYSBsYSBmYWx0YSBkZSBvYmpldGl2b3MgeSBkaXJlY2Npw7NuLCBlc3RvcyBwdWVzdG9zIHRpZW5lbiBhIHRlbmVyIG1heW9yZXMgYmFqYXMsIGVzdG8gcHVlZGUgaW5kaWNhciBxdWUgdW5hIGRlIGxhcyBjYXVzYXMgcG9yIGxhcyBjdWFsZXMgbG9zIGVtcGxlYWRvcyBkZSBGT1JNIHNlIGRhbiBkZSBiYWphIGVzIGxhIGZhbHRhIGRlIGRpcmVjY2nDs24sIGNyZWNpbWllbnRvIHkgb2JqZXRpdm9zIHByb2Zlc2lvbmFsZXMgaW1wdWVzdG9zIHBvciBsYSBjb21wYcOxw61hLiBFc3RvcyBoYWxsYXpnb3Mgc29uIHN1c3RlbnRhZG9zIHBvciBsYXMgY2F1c2FzIGRlIGxhcyBiYWphcyBpbmRpY2FkYXMgc2luIGVtYmFyZ28gbGEgY2FudGlkYWQg4oCcbm8gZXNwZWNpZmljYWRv4oCdIGFmZWN0YSBsYSB2ZXJhY2lkYWQgZGUgbGFzIGNvbmNsdXNpb25lcy4gPGJyPgoKMi4JUmVzcGVjdG8gYWwgY3JlY2ltaWVudG8gZGUgbGFzIGluZHVzdHJpYXMgZXZhbHVhZGFzIChhdXRvcGFydGVzLCBhdXRvbcOzdmlsZXMgeSBlbCBjYXJ0w7NuKSBzZSBwdWVkZW4gb2JzZXJ2YXIgcGF0cm9uZXMgc2ltaWxhcmVzIGVuIGxvIHF1ZSByZXNwZWN0YSBhIHN1cyBjcmVjaW1pZW50b3MgZW4gZWwgcGVyaW9kbyBkZSAyMDIxIGEgMjAyMy4gMjAyMSBhIDIwMjIgZnVlIHVuIHBlcmlvZG8gZGUgcmVjdXBlcmFjacOzbiB5IGVzdGFiaWxpemFjacOzbiBkZSBsb3Mgbml2ZWxlcyBkZSBwcm9kdWNjacOzbiB5IGNyZWNpbWllbnRvIGRlIGxhIGluZHVzdHJpYSBwb3N0IHBhbmRlbWlhIGVuZnJlbnTDoW5kb3NlIGVsIHNlY3RvciBhdXRvbW90cml6IGEgZGVzYWbDrW9zIGVuIGxhIGNhZGVuYSBkZSBzdW1pbmlzdHJvIGxvIGN1YWwgYWZlY3TDsyBsb3MgaW5kaWNhZG9yZXMgZGUgMjAyMyBjb24gaW5jcmVtZW50b3MgcG9yY2VudHVhbGVzIG11Y2hvIG3DoXMgcmVkdWNpZG9zIGEgbG9zIGRlIDIwMjEgeSAyMDIyLiBFbiBsbyBxdWUgcmVzcGVjdGEgYSBsYSBpbmR1c3RyaWEgZGVsIGNhcnTDs24sIGxhcyB2ZW50YXMgaGFuIGF1bWVudGFkbyBwb3NpdGl2YW1lbnRlIGRlc2RlIGVsIDIwMjEgcmVjdXBlcmFuZG8gZnVlcnphIHBvc3QgcGFuZGVtaWEgeSB0cmFzIGxhIHJlYWN0aXZhY2nDs24gZGUgbGEgZWNvbm9tw61hIG11bmRpYWwgeSBsYXMgY2FkZW5hcyBkZSBzdW1pbmlzdHJvLCBlbCBjcmVjaW1pZW50byBkZSBsYSBpbmR1c3RyaWEgc2lndWUgc2llbmRvIG11eSBlc3RhYmxlLiBDb24gbGFzIHRlbmRlbmNpYXMgZGVsIG5lYXJzaG9yaW5nIHkgbGEgZGVwZW5kZW5jaWEgY29tZXJjaWFsIGV4aXN0ZW50ZSBlbnRlIE3DqXhpY28geSBFc3RhZG9zIFVuaWRvcywgRk9STSBwb2Ryw6EgZXNwZXJhciBlbiB1biBtZWRpYW5vIHBsYXpvIHVuIGluY3JlbWVudG8gdGFuZ2libGUgZW4gbGEgZGVtYW5kYSBkZSBzb2x1Y2lvbmVzIGRlIGVtcGFxdWUgeSBlbCByZXRvIHNlIGNvbnZlcnRpcsOhIGVuIHRlbmVyIGxhIGNhcGFjaWRhZCBwcm9kdWN0aXZhLCBjYXBpdGFsIHkgaHVtYW5hIHBhcmEgcG9kZXIgc2F0aXNmYWNlciBlbCBtZXJjYWRvLiA8YnI+CgozLglFbCB0aXBvIGRlIGNhbWJpbyBlcyB1biBmYWN0b3IgZGUgYWx0YSByZWxldmFuY2lhIHBhcmEgbGFzIG9wZXJhY2lvbmVzIGRlIEZPUk0uIEZPUk0gZXMgdW5hIGVtcHJlc2EgcXVlIGFwcm92ZWNoYSBsYXMgb3BvcnR1bmlkYWRlcyBjb21lcmNpYWxlcyBkZWwgc2VjdG9yIGF1dG9tb3RyaXogeSBkZSBhdXRvcGFydGVzIGFsIGNvbWVyY2lhbGl6YXIgc3VzIHNvbHVjaW9uZXMgZGUgZW1wYXF1ZSBlbiBFc3RhZG9zIFVuaWRvcywgeSBtYW50aWVuZSBzdXMgY29zdG9zIGRlIHByb2R1Y2Npw7NuIHkgbWFubyBkZSBvYnJhIGFsIG3DrW5pbW8gYWwgdGVuZXIgc3UgcGxhbnRhIGRlIHByb2R1Y2Npw7NuIGVuIEFwb2RhY2EgeSBjZW50cm9zIGRlIGRpc3RyaWJ1Y2nDs24gZW4gbHVnYXJlcyBlc3RyYXTDqWdpY29zLiBUb2RvIGVzdG8gc2lnbmlmaWNhIHF1ZSBsYSBlbXByZXNhIG1hbmVqYSBzdXMgY29zdG9zIGRlIHByb2R1Y2Npw7NuIGVuIHBlc29zIHkgc3VzIHZlbnRhcyBlbiBkw7NsYXJlcyBlc3RhZG91bmlkZW5zZXMsIGVsIHByb2JsZW1hIGFsIHF1ZSBzZSBlbmZyZW50YXLDoSBGT1JNIGVzIHF1ZSBjb24gbGEgYXByZWNpYWNpw7NuIGRlbCBwZXNvIGxvcyBtw6FyZ2VuZXMgZGUgdmVudGEgc2UgcmVkdWNlbiB5IGxvcyBjb3N0b3MgZGUgcHJvZHVjY2nDs24gYXVtZW50YW4gZW4gY29tcGFyYWNpw7NuIGRlYmlkbyBhIHF1ZSBsbyBxdWUgYW50ZXMgc2Ugb2J0ZW7DrWEgcG9yIHVuIGTDs2xhciBlbiBteG4gaGEgZXN0YWRvIGVuIGNhw61kYSBkZXNkZSBmaW5hbGVzIGRlIDIwMjEgY29uIGxhcyBkZWNpc2lvbmVzIGFudGUgaW5mbGFjaW9uYXJpYXMgZGUgbGEgRmVkZXJhbCBSZXNlcnZlIEJvYXJkIGRlIEVzdGFkb3MgVW5pZG9zLiBBY3R1YWxtZW50ZSwgeSBkZSBhY3VlcmRvIGNvbiBlbCBDRU8sIGVsIHRpcG8gZGUgY2FtYmlvIG5vIGVzIGRlIGdyYW4gcHJlb2N1cGFjacOzbiwgcGVybyBzaSBsYSB0ZW5kZW5jaWEgc2lndWUgYSBsYSBiYWphLCBlc3BlY2lhbG1lbnRlIGNvbiBsYXMgZWxlY2Npb25lcyBkZSAyMDI0IGFwcm94aW3DoW5kb3NlLCBGT1JNIHRlbmRyw6EgZGUgZXhwYW5kaXIgc3VzIHZlbnRhcyBhIHBlc29zIG1leGljYW5vcyBjb24gbGEgZmluYWxpZGFkIGRlIGFtb3J0aXphciBlbCBpbXBhY3RvLiAgPGJyPgoKNC4JRW4gYmFzZSBhbCBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlc2NyaXB0aXZvIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBGT1JNIHRpZW5lIHVuIGdyYW4gcHJvYmxlbWEgZW4gbG8gcXVlIHJlc3BlY3RhIGEgbGEgcm90YWNpw7NuIGRlIHBlcnNvbmFsLiBFbiBOdWV2byBMZcOzbiBsYSByb3RhY2nDs24gcHJvbWVkaW8gZW4gZW1wcmVzYXMgZGUgbWFudWZhY3R1cmEgZnVlIGRlIDEyIGEgMTUlIGVuIDIwMjMsIG1pZW50cmFzIHF1ZSBlbiBlbCDDumx0aW1vIG1lcyByZWdpc3RyYWRvIGRlIGVzdGUgYcOxbyBGT1JNIGFsY2FuesOzIG5pdmVsZXMgZGUgMjUlLiBVbmEgcm90YWNpw7NuIHNhbmEgZXMgcG9yIGRlYmFqbyBkZWwgMTUlLCBGT1JNIHRpZW5lIHVuYSByb3RhY2nDs24gcHJvbWVkaW8gZGUgMTYuNjQlLCBhbGNhbnphbmRvIHN1IGFsYXJtYW50ZSBtw6F4aW1vIGRlIDM4LjM1JSBkZSByb3RhY2nDs24gZW4ganVuaW8gMjAyMi4gRXN0ZSBhbGFybWFudGUgY29tcG9ydGFtaWVudG8gZW4gbGEgcmV0ZW5jacOzbiBkZSB0YWxlbnRvIGluZGljYSBxdWUgRk9STSBkZWJlIGhhY2VyIGNhbWJpb3MgaW5tZWRpYXRvcyBwYXJhIHByZXZlbmlyIHF1ZSBsYSBlbXByZXNhIHNlIHZlYSBhZmVjdGFkYSB5IGFmZWN0ZSBhIHN1cyBjbGllbnRlcyBkZWJpZG8gYSBmYWx0YSBkZSBwZXJzb25hbCBjYXBhY2l0YWRvLiBDb21iaW5hZG8gY29uIGxhIGFsdGEgZGVtYW5kYSBkZSBtYW5vIGRlIG9icmEgZGViaWRvIGFsIGRlc2Fycm9sbG8gaW5kdXN0cmlhbCBhY2VsZXJhZG8gcXVlIGVzdMOhIHRyYXllbmRvIGEgTnVldm8gTGXDs24gbGEgaW52ZXJzacOzbiBleHRyYW5qZXJhLCBzaSBlc2UgcHJvYmxlbWEgY29udGluw7phIGNhZGEgdmV6IHNlcsOhIG3DoXMgZGlmw61jaWwgY29uc2VndWlyIG1hbm8gZGUgb2JyYSBlc3BlY2lhbGl6YWRhIHkgbcOhcyBjb3N0b3NvIHRhbWJpw6luIHB1ZXN0byBxdWUgbGEgb2ZlcnRhIGRlIHRyYWJham9zIHNlcsOhIG1heW9yIHF1ZSBsYSBkZW1hbmRhIGRlbCBwZXJzb25hbC4gRk9STSB0aWVuZSB1biBncmF2ZSBwcm9ibGVtYSBkZSByb3RhY2nDs24geSByZXRlbmNpw7NuIGRlbCBwZXJzb25hbCwgeSBlc3RhIGVzIHVuYSBkZSBsYXMgcmF6b25lcyBwb3IgbGFzIGN1YWxlcyBlbCBmb2NvIGRlIG51ZXN0cm8gcHJveWVjdG8gZXMgUmVjdXJzb3MgSHVtYW5vcy4gPGJyPgoKNS4JQXVucXVlIGxvcyBlc3RlcmVvdGlwb3Mgbm8gc29uIHNpZW1wcmUgdmVyw61kaWNvcywgY29uIGVsIGFuw6FsaXNpcyBkZXNjcmlwdGl2byByZWFsaXphZG8gcG9yIGdydXBvIGRlIGVkYWQsIGfDqW5lcm8geSBlc3RhZG8gY2l2aWwgc2UgcHVkaWVyb24gb2JzZXJ2YXIgcXXDqSBncnVwbyBkZSBwZXJzb25hcyBjdWVudGFuIGNvbiB1bmEgbWF5b3IgdGVuZGVuY2lhIGEgZGFyc2UgZGUgYmFqYS4gU2UgZGVtb3N0csOzIHF1ZSBtaWVudHJhcyBtw6FzIGpvdmVuIGVzIGVsIGNvbGFib3JhZG9yIG1heW9yIGVzIGxhIHByb2JhYmlsaWRhZCBxdWUgcmVudW5jaWUgYWwgdHJhYmFqbyBvIHF1ZSBzZSBjYW1iaWUgZGUgdHJhYmFqbyBwb3IgbWVqb3JlcyBvcG9ydHVuaWRhZGVzIGxhYm9yYWxlcy4gTGFzIGJhamFzIGVudHJlIGVsIHJhbmdvIGRlIGVkYWQgcG9yIGdydXBvIGfDqW5lcm8tZXN0YWRvIGNpdmlsIGZ1ZXJvbiBsYXMgbcOhcyBhbHRhcyBkZSB0b2RvcyBsb3MgcmFuZ29zIGVzdGFibGVjaWRvcyBzZWd1aWRvIGRlbCByYW5nbyBkZSAyNiBhIDM1IGHDsW9zLCBlc3RvIHNlIGxlIGF0cmlidXllIGEgbGEgYmFzdGEgY2FudGlkYWQgZGUgb2ZlcnRhcyBsYWJvcmFsZXMgZW4gZXN0b3Mgc2VnbWVudG9zIGRlIGVkYWQgZGViaWRvIGEgc3UgZmFjaWxpZGFkIGRlIGFkYXB0YWNpw7NuIHkgY2FwYWNpdGFjacOzbiByw6FwaWRhIHBhcmEgZGl2ZXJzb3MgcHVlc3Rvcy4gUGFyYSByZWR1Y2lyIGxhcyBiYWphcyBkZSBwZXJzb25hbCwgbGUgcmVjb21lbmRhcsOtYSBhIEZPUk0gZW4sIGEgZGlzY3JlY2nDs24gZGUgbGEgZW1wcmVzYSwgYnVzY2FyIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGVzdGFibGVjaWRhcyBwYXJhIGxvcyBwdWVzdG9zIGVuIHNlZ21lbnRvcyBkZSBlZGFkIG3DoXMgbWFkdXJvcyBjb21vIGRlIDM2IGEgNDUgYcOxb3MgZG9uZGUgZXhpc3RlIG1heW9yIHJlc3BvbnNhYmlsaWRhZCB5IG5lY2VzaWRhZCBkZSB1biB0cmFiYWpvIGVzdGFibGUuIDxicj4KCjYuCUhpc3TDs3JpY2FtZW50ZSwgbGFzIGJhamFzIGRlIEZPUk0gdGllbmRlbiBhIGNvbXBvcnRhcnNlIGRlIG1hbmVyYSB0ZW1wb3JhbCwgZGVwZW5kaWVuZG8gZGVsIG1lcyBkZWwgYcOxbyBsYXMgYmFqYXMgZGlzbWludXllbiBvIGF1bWVudGFuLiBNZXNlcyBjb21vIGVuZXJvLCBqdW5pbyB5IGFnb3N0byBjdWVudGFuIGNvbiBsb3MgbWF5b3JlcyBuaXZlbGVzIGRlIGZ1Z2EgZGUgcGVyc29uYWwsIG1pZW50cmFzIHF1ZSBkZSBzZXB0aWVtYnJlIGEgZGljaWVtYnJlIGEgbGFzIGJhamFzIHNlIG1hbnRpZW5lbiBlbiBuaXZlbGVzIG3DrW5pbW9zLiBFc3RvIGluZGljYSBxdWUsIGRlYmlkbyBhIGxhcyBuZWNlc2lkYWRlcyBkZSBsb3MgZW1wbGVhZG9zLCBlbiBwZXJpb2RvcyBkZXNwdcOpcyBkZWwgcGFnbyBkZSB1dGlsaWRhZGVzLCBhZ3VpbmFsZG8geS9vIGJvbm9zIGxhcyBiYWphcyB0aWVuZGVuIGEgYXVtZW50YXIuIFBhcmEgRk9STSBzZXLDoSBpbXBvcnRhbnRlIGltcGxlbWVudGFzIGRpZmVyZW50ZXMgaW5jZW50aXZvcyB5IGNyZWFyIHVuYSByZWxhY2nDs24gbcOhcyBjZXJjYW5hIHkgZnVlcnRlIGNvbiBzdXMgY29sYWJvcmFkb3JlcyBwYXJhIHJlZHVjaXIgdGFudG8gbGFzIGJhamFzIGNvbiBzdSB0ZW1wb3JhbGlkYWQuIDxicj4gCgo3LglDb21vIGNvbmNsdXNpw7NuIGRlbCBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlc2NyaXB0aXZvIHNlIGNvbmNsdXllIHF1ZSBGT1JNIHRpZW5lIHVuIHByb2JsZW1hIHNpZ25pZmljYXRpdm8gY29uIGxhIHJlY29sZWNjacOzbiBkZSBkYXRvcy4gTXVjaGFzIGRlIGxhcyBjb25jbHVzaW9uZXMgYWxjYW56YWRhcyBlbiBlbCDDoXJlYSBkZSBSSCBlbiBiYXNlIGEgbGEgaW5mb3JtYWNpw7NuIHByb3BvcmNpb25hZGEgcG9yIGxhIGNvbXBhw7HDrWEgZXN0w6FuIGFmZWN0YWRhcyBwb3IgbGEgZmFsdGEgZGUgcmVnaXN0cm8gZGUgaW5mb3JtYWNpw7NuIGVuIGxhcyBiYWphcyBkZSBtb3Rpdm9zLCB0aXBvcyBkZSBwdWVzdG8sIGRlcGFydGFtZW50bywgaW5jb25ncnVlbmNpYXMgZW4gZm9ybWF0byBwYXJhIGVsIHJlZ2lzdHJvIGRlIGZlY2hhcywgZXRjLiBsbyBxdWUgZGlmaWN1bHRhIGxsZWdhciBhIGNvbmNsdXNpb25lcyBhY2Npb25hYmxlcyBzaW4gbGEgbmVjZXNpZGFkIGRlIGxsZXZhciBhIGNhYm8gaW52ZXN0aWdhY2nDs24gcHJpbWFyaWEgYSB0cmF2w6lzIGRlIGN1ZXN0aW9uYXJpb3MgeSBzb2xpY2l0dWQgZGUgZGF0b3MgYSBsb3MgZW1wbGVhZG9zIGFjdHVhbGVzIHkgcGFzYWRvcy4gRWwgbWFuZWpvLCBsaW1waWV6YSB5IHJlZ2lzdHJvIGRlIGRhdG9zIHNlcsOhIHVuIHJldG8gYWwgcXVlIEZPUk0gc2UgdGVuZHLDoSBxdWUgZW5mcmVudGFyIHNpIHF1aWVyZSBjb250aW51YXIgcG9yIGVsIGNhbWlubyBkZWwgdXNvIGRlIGxhIGFuYWzDrXRpY2EgZGUgZGF0b3MgcGFyYSBsYSB0b21hIGRlIGRlY2lzaW9uZXMsIGVzdG8gcmVxdWVyaXLDoSBkZSBpbnZlcnNpw7NuIHBhcmEgY2FwYWNpdGFyIGFsIHBlcnNvbmFsIHF1ZSBtYW5lamEgeSByZWdpc3RyYSBkYXRvcyB5YSBlbiBsYSBlbXByZXNhIG8gYmllbiBjb250cmF0YXIgYSB1biBwcm9mZXNpb25hbCBlbiBsYSBhbmFsw610aWNhIGRlIGRhdG9zLiA8YnI+CgoKIyMjIERlIGFjdWVyZG8gYSBzdSBleHBlcmllbmNpYSBwcm9mZXNpb25hbCwgZGVzY3JpYmlyIGPDs21vIDItMyBzdWdlcmVuY2lhcyBjb21wYXJ0aWRhcyBwb3IgbG9zIGFuYWxpc3RhcyBkZSBkYXRvcyBpbnZpdGFkb3MgcHVkaWVyYW4gY29udHJpYnVpciBhIGRlc2Fycm9sbGFyIHBvc2libGUocykgc29sdWNpw7NuKGVzKSBhIGxhIHNpdHVhY2nDs24gcHJvYmxlbWEgc2VsZWNjaW9uYWRhLgpFbiBsYSBzZXNpw7NuIGNvbiBsb3MgaW52aXRhZG9zLCB0dXZpbW9zIGxhIG9wb3J0dW5pZGFkIGRlIGVzY3VjaGFybG9zIGhhYmxhciBkZSBjb21vIGxhIGFuYWzDrXRpY2EgZGUgZGF0b3MgaGEgdHJhbnNmb3JtYWRvIHN1cyB0cmF5ZWN0b3JpYXMgcHJvZmVzaW9uYWxlcywgZG9zIGRlIGVsbG9zIGp1c3RvIGNvbiBzb2xvIGxhIGV4cGVyaWVuY2lhIGRlIGxhIGNvbmNlbnRyYWNpw7NuLiBFbiBsYSBzZXNpw7NuIHNlIGhhYmzDsyBkZSBsYSBpbXBvcnRhbmNpYSBkZSBsYSBhbmFsw610aWNhIGRlIGRhdG9zIGVuIGxhIGFjdHVhbGlkYWQgcGFyYSBsYSB0b21hIGRlIGRlY2lzaW9uZXMsIGVsIGFsdGEgZGVtYW5kbyBwb3IgcHJvZmVzaW9uaXN0YXMgZW4gZWwgdGVtYSwgbG9zIGZ1dHVyb3MgcHJvYmxlbWFzIHF1ZSBpcsOhbiBzdXJnaWVuZG8gZW4gZWwgYW1iaWVudGUgbGFib3JhbCwgZXRjLiBFbiBjb25qdW50byBjb24gc3VzIGV4cGVyaWVuY2lhcyBwcm9mZXNpb25hbGVzIGluZGl2aWR1YWxlcy4gPGJyPgoKKyBQZXJzb25hbG1lbnRlLCBtZSBsbGFtw7MgbXVjaG8gbGEgYXRlbmNpw7NuIGVsIHRlbWEgZGUgZ29iZXJuYW56YSBkZSBkYXRvcyBtZW5jaW9uYWRvIHBvciB1bm8gZGUgbG9zIHBvbmVudGVzLiBDb25zaWRlcm8gcXVlIGltcGxlbWVudGFyIGxhIGdvYmVybmFuemEgZGUgZGF0b3MgZW4gbGEgc29sdWNpw7NuIHBhcmEgbGEgc2l0dWFjacOzbiBwcm9ibGVtYSBwdWVkZSBoYWNlciBsYSBkaWZlcmVuY2lhIGVuIGVsIG1hbmVqbyB5IHRyYW5zZm9ybWFjacOzbiBkZSBsYSBpbmZvcm1hY2nDs24gZW4gRk9STS4gQWN0dWFsbWVudGUsIEZPUk0gbm8gdGllbmUgdW4gYnVlbiBtYW5lam8sIHJlZ2lzdHJvLCB0cmFuc2Zvcm1hY2nDs24geS9vIGludGVycHJldGFjacOzbiBkZSBsb3MgZGF0b3MgcXVlIHJlY29sZWN0YW4gZGUgc3VzIGNvbGFib3JhZG9yZXMuIEltcGxlbWVudGFuZG8gbGEgZ29iZXJuYW56YSBkZSBkYXRvcyBwZXJtaXRpcsOtYSBubyBzb2xvIG1lam9yYXIgdG9kYXMgZXN0YXMgdGFyZWFzLCBwZXJvIGEgbGEgdmV6IGVzdGFibGVjZXIgbGEgaW5mcmFlc3RydWN0dXJhIHkgdGVjbm9sb2fDrWFzIG5lY2VzaXRhZGFzIHBhcmEgZXN0byB5IGVsIGRpc2XDsWFyIHVuYSBlc3RydWN0dXJhIGRlIHF1aWVuZXMgdGVuZHLDoW4gYWNjZXNvIGFsIHJlZ2lzdHJvLCBsaW1waWV6YSB5IHRyYW5zZm9ybWFjacOzbiBkZSBkYXRvcyBwYXJhIGV2aXRhciBxdWUgdGFyZWFzIGVzcGVjw61maWNhcyBzZSBoYWdhbiBlbiBkZXNvcmRlbiB5IG1lam9yZSBsYSBlZmljaWVuY2lhIGRlIGxhIGVtcHJlc2EgZW4gZWwgbWFuZWpvIGRlIGxhIGluZm9ybWFjacOzbi4gPGJyPgoKKwlPdHJhIHN1Z2VyZW5jaWEgZXNlbmNpYWwgZGUgbG9zIHBvbmVudGVzIGZ1ZSBlbCB0b21hciBsYSBjb25jZW50cmFjacOzbiBjb24gbGEgc2VyaWVkYWQgeSBnZW5lcmFyIHBvcnRhZm9saW9zIGRlIHRyYWJham8gZGUgdmFsb3IgeWEgcXVlIGVzdG8gbm9zIHNlcnZpcsOhbiBjb21vIGNhcnRhIGRlIHByZXNlbnRhY2nDs24gYSBsYSBob3JhIGRlIGJ1c2NhciB0cmFiYWpvIG5vIHNvbG8gZW4gZWwgw6FyZWEgZGUgbGEgYW5hbMOtdGljYSBkZSBkYXRvcy4gQSBtaSBwYXJlY2VyIGVzdGEgc3VnZXJlbmNpYSBjb21iaW5hZGEgY29uIGxhcyBleHBlcmllbmNpYXMgcmVsYXRhZGFzIG5vcyBpbXB1bHNhcsOhIGEgbcOtIHkgYSBtaSBlcXVpcG8gYSBidXNjYXIgc29sdWNpb25lcyBtw6FzIGVsYWJvcmFkYXMgZSBpbnZlc3RpZ2FyIG1vZGVsb3MgZGUgYW5hbMOtdGljYXMgZGUgZGF0b3MgbcOhcyBlZmVjdGl2b3MgcXVlIHBlcm1pdGFuIGEgbGEgZW1wcmVzYSBhbGNhbnphciBzdXMgb2JqZXRpdm9zIGVuIGVsIG1hbmVqbyBkZWwgcGVyc29uYWwgcGVybyBxdWUgYSBsYSB2ZXogc2VhbiBldmlkZW5jaWFzIGRlIGxhcyBoYWJpbGlkYWRlcyBhZHF1aXJpZGFzIGVuIGVsIGN1cnNvLiA8YnI+ICAKCisJ4oCcUHJvYmxlbWEgZGUgY29uY2VwdG9zIG5vIGRlIGRhdG9z4oCdLiBFc3RhIGZyYXNlIGZ1ZSBtZW5jaW9uYWRhIHBvciB1bm8gZGUgbG9zIHBvbmVudGVzIGp1bnRvIGNvbiB1bm8gZGUgbG9zIHByb2Zlc29yZXMgZGUgbG9zIG3Ds2R1bG9zIGVuIGxhIGRpc2N1c2nDs24sIGVzdG8gZW50cmEgcHJlY2lzYW1lbnRlIGVuIGxhIHNpdHVhY2nDs24gcHJvYmxlbWEgc2VsZWNjaW9uYWRhIHBvcnF1ZSBjb25jZXB0b3MgY29tbyBjdcOhbCBlcyBlbCBwZXJmaWwgYWRlY3VhZG8gbyBxdcOpIHRpcG9zIGRlIGRhdG9zIHNlIG5lY2VzaXRhbiBwYXJhIHJlYWxpemFyIGV4w6FtZW5lcyBwc2ljb23DqXRyaWNvcyBzb24gcHJlZ3VudGFzIGRlIGNvbmNlcHRvcyBkZSBsYXMgY3VhbGVzIGRlcGVuZGVuIGxhIHJlY29sZWNjacOzbiBlZmVjdGl2YSBkZSBkYXRvcy4gRW4gRk9STSBleGlzdGVuIGRhdG9zLCBzaW4gZW1iYXJnbywgbm8gc2UgdGllbmVuIHByb2Zlc2lvbmFsZXMgZXNwZWNpYWxpemFkb3MgcGFyYSBkZWZpbmlyIHF1w6kgaGFjZXIgY29uIGVzdG9zIGRhdG9zLCBjw7NtbyB0cmFuc2Zvcm1hcmxvcywgcXXDqSBjb25jZXB0b3MgY3JlYXIgcXVlIGHDsWFkYW4gdmFsb3IgcGFyYSBsYSBvcmdhbml6YWNpw7NuLiBTaSBiaWVuIHRhbWJpw6luIHNlIG1lbmNpb27DsyBsYSBlc2Nhc2V6IHF1ZSBleGlzdGUgZGUgcHJvZmVzaW9uYWxlcyBlbiBsYSBhbmFsw610aWNhIGRlIGRhdG9zLCBwYXJhIEZPUk0gdmFsZHLDrWEgbGEgcGVuYSBhw7FhZGlyIGEgc3UgZXF1aXBvIGRlIFJIIGFsZ3VpZW4gZXNwZWNpYWxpemFkbyBlbiBlbCB0ZW1hLCBxdWllbiBwdWVkYSBmb3JtdWxhciBsYXMgcHJlZ3VudGFzIHBhcmEgZ2VuZXJhciBkYXRhIHkgY29uY2VwdG9zIHBhcmEgbGEgdG9tYSBkZSBkZWNpc2lvbmVzIGVuIGxhIGVtcHJlc2EgY29uIGxhIGZpbmFsaWRhZCBkZSBtZWpvcmFyIGxhIHJlbGFjacOzbiBjb24gc3VzIGNvbGFib3JhZG9yZXMgeSBkaXNtaW51aXIgbGEgZnVnYSBkZSBwZXJzb25hbC4gPGJyPiAKCiAKIyAqKkdsb3NhcmlvIGRlIHZhcmlhYmxlcyoqCiMjIyAqKlByZWd1bnRhIDEqKgorIEZPUk1GbHVqbzogRGF0YUZyYW1lIGRlc2NyaXB0aXZvIGRlIGxhcyBiYWphcyB5IGFsdGFzIGRlIEZPUk0gZW4gZWwgcGVyaW9kbyBkZSAyMDIyIGEgMjAyMy4KKyBWYXJpYWJsZSDigJxB4oCdOiAgbsO6bWVybyBkZSBhbHRhcworIFZhcmlhYmxlIOKAnELigJ06IG7Dum1lcm8gZGUgYmFqYXMKKyBWYXJpYWJsZSDigJxFbXBJ4oCdOiBuw7ptZXJvIGRlIGVtcGxlYWRvcyBhbCBpbmljaW8gZGVsIHBlcmlvZG8KKyBWYXJpYWJsZSDigJxFbXBG4oCdOiBuw7ptZXJvIGRlIGVtcGxlYWRvcyBhbCBmaW5hbCBkZWwgcGVyaW9kbworIFZhcmlhYmxlIOKAnFJvdGFjaW9u4oCdOiBjb2x1bW5hIGNhbGN1bGFkYSBkZSBsYSByb3RhY2nDs24gcG9yIG1lcworIFZhcmlhYmxlIOKAnEZlY2hh4oCdOiBmZWNoYSBkZWwgcGVyaW9kbyAKCiMjIyAqKlByZWd1bnRhIDIqKgorIEJhamFzIDIyMjM6IERhdGFGcmFtZSBkZSBsYXMgYmFzZXMgZGUgZGF0b3MgQmFqYXMgMjAyMyB5IEJhamFzIDIwMjIgZGUgRk9STS4KKyBWYXJpYWJsZSDigJxmZWNoYU7igJ06IGZlY2hhcyBkZSBuYWNpbWllbnRvIGRlIGxvcyBlbXBsZWFkb3MKKyBWYXJpYWJsZSDigJxHZW5lcm/igJ06IGfDqW5lcm8gZmVtZW5pbm8gYSBtYXNjdWxpbm8gcG9yIGVtcGxlYWRvCisgVmFyaWFibGUg4oCcZWRvQ2l2aWzigJ06IGVzdGFkbyBjaXZpbCBwb3IgZW1wbGVhZG8uCisgVmFyaWFibGUg4oCcRWRhZOKAnTogY29sdW1uYSBjYWxjdWxhZGEgY29uIGxhIGZlY2hhIGRlIG5hY2ltaWVudG8gZGUgbG9zIGVtcGxlYWRvcyBjb24gc3UgZWRhZC4KKyBWYXJpYWJsZSDigJxHcnVwb0VkYWTigJ06IEVkYWRlcyBjbGFzaWZpY2FkYXMgY29uIGNvbmRpY2lvbmFsZXMgcGFyYSBpZGVudGlmaWNhciByYW5nb3MgcG9yIGVkYWQuCisgVmFyaWFibGUg4oCcQ29tYmluZWTigJ06IG5vbWVuY2xhdHVyYSBjb24gbG9zIHByaW1lcm9zIGRvcyBkw61naXRvcy9jYXJhY3RlcmVzIGRlIGfDqW5lcm8geSAgZXN0YWRvIGNpdmlsIG3DoXMgZWwgR3J1cG8gRWRhZC4gCgojIyMgKipQcmVndW50YSAzKioKKyBkZXBfYmFqYXM6IERhdGFGcmFtZSBkZSBsYXMgYmFqYXMgZGUgRk9STQorIFZhcmlhYmxlIOKAnE5vbWJyZSBjb21wbGV0b+KAnTogQ29sYWJvcmFkb3IgcXVlIHNlIGRpw7MgZGUgYmFqYSAKKyBWYXJpYWJsZSDigJxERVBBUlRBTUVOVE/igJ06IERlcGFydGFtZW50byBlbCBjdWFsIHBlcnRlbmVjw61hIGVsIGNvbGFib3JhZG9yCisgVmFyaWFibGUg4oCcTW9uTWVzQuKAnTogTWVzIHkgYcOxbyBlbiBlbCBxdWUgc2UgZGllcm9uIGRlIGJhamEKCiMjIyAqKlByZWd1bnRhIDQqKgorIGZfYmFqYXMgPSBEYXRhRnJhbWUgZG9uZGUgc2UgZW5jdWVudHJhcyBsYXMgYmFqYXMgZGUgRk9STQorIFZhcmlhYmxlICJOb21icmUiOiBlcyBlbCBub21icmUgZGUgbGEgcGVyc29uYSBxdWUgc2UgZGlvIGRlIGJhamEgCisgVmFyaWFibGUgIk1vdGl2byI6IGVsIG1vdGl2byBlbiBnZW5lcmFsIHBvciBlbCBjdWFsIGxhIHBlcnNvbmEgc2UgZGEgZGUgYmFqYSAKKyBWYXJpYWJsZSAiQ2F1c2FCYWphIjogZXMgbGEgY2F1c2EgZGVsIG1vdGl2byBwb3IgZWwgY3VhbCBsYSBwZXJzb25hIHNlIGRhIGRlIGJhamEgCisgVmFyaWFibGUgIkNhdXNhQmFqYVN1YiI6IGVzIGxhIHJhesOzbiBlc3BlY8OtZmljYSBwb3IgbGEgY3VhbCBsYSBwZXJzb25hIHNlIGRhIGRlIGJhamEgCisgYmFqYXNfZXNwZWNpZmljbyA9IERhdGFGcmFtZSBkb25kZSBlc3TDoSBkZXNjYXJ0YWRvIGxhIHJlc3B1ZXN0YSBObyBlc3BlY2lmaWNhZG8iCisgYmFqYV9hw7FvcyA9IERhdGFGcmFtZSBkb25kZSBzZSBwdWVkZSBvYnNlcnZhciBlbCBtb3Rpdm8gZGUgbGFzIGJhamFzIHBhcmEgZWwgYcOxbyAyMDIyIHkgMjAyMwoKIyMjICoqUHJlZ3VudGEgNSoqCisgZm9ybV9iYWphc18yMzogRGF0YWZyYW1lIGNvbiBsb3MgZGF0b3MgZGUgYmFqYXMgZGUgZW1wbGVhZG9zIGRlIEZPUk0gZHVyYW50ZSAyMDIzCisgZm9ybV9iYWphc19pbnRlZ3JhZGFzOiBEYXRhZnJhbWUgY29uIGxvcyBkYXRvcyBkZSBiYWphcyBkZSBlbXBsZWFkb3MgZHVyYW50ZSAyMDIyIHkgMjAyMworIFZhcmlhYmxlICJEaXJlY2Npb24iOiBDb25jYXRlbmFjacOzbiBkZSBsYXMgdmFyaWFibGVzIGRlIGNhbGxlLCBuw7ptZXJvLCBjb2xvbmlhLCBtdW5pY2lwaW8sIGVzdGFkbyB5IGNwLiwgY29uIGVsIGZpbiBkZSB0ZW5lciB1bmEgdmFyaWFibGUgY29uIGxhIGRpcmVjY2nDs24gY29tcGxldGEgZGVsIGVtcGxlYWRvLgorIFZhcmlhYmxlICJNb3Rpdm8gZGUgQmFqYSI6IE11ZXN0cmEgbGEgbmF0dXJhbGV6YSBkZSBsYSBiYWphIGRlIGxvcyBlbXBsZWFkb3MsIGRvbmRlIGxhcyBvcGNpb25lcyBTZXBhcmFjacOzbiB2b2x1bnRhcmlhLCBJbmR1Y2lkYSwgSW5kdWNpZGEgKGZhbHRhcyksIEluZHVjaWRhIChmYWx0YXMgbm8gZGlvIGVsIHRpZW1wbykKKyBWYXJpYWJsZSAiUHVlc3RvIjogVmFyaWFibGUgcXVlIGluZGljYSBlbCBwdWVzdG8gcXVlIG9jdXBhIGVuIGxhIGVtcHJlc2EgZWwgZW1wbGVhZG8sIHNpZW5kbyBzdSBmdW5jacOzbiBlbiBsYSBlbXByZXNhLgorIFZhcmlhYmxlICJEaWFzX0xhYm9yYWRvcyI6IE7Dum1lcm8gZGUgZMOtYXMgZW4gY3VhbGVzIGVsIGVtcGxlYWRvIHRyYWJham8gZW4gRk9STS4KKyBWYXJpYWJsZSAiU2FsYXJpbyI6IFZhcmlhYmxlIHF1ZSBpbmRpY2EgZWwgc2FsYXJpbyBkaWFyaW8gZGUgY2FkYSBlbXBsZWFkbyBhbCBtb21lbnRvIGVuIHF1ZSBzZSBkaW8gZGUgYmFqYS4KKyBWYXJpYWJsZSAiTXVuaWNpcGlvIjogVmFyaWFibGUgcXVlIGluZGljYSBlbCBtdW5pY2lwaW8gZGUgcmVzaWRlbmNpYSBkZWwgZW1wbGVhZG8gcXVlIHNlIGhhIGRhZG8gZGUgYmFqYS4KKyBWYXJpYWJsZSAiRGlzdGFuY2lhX2ttIjogTWlkZSBsYSBkaXN0YW5jaWEgYXByb3hpbWFkYSBlbnRyZSBlbCBtdW5pY2lwaW8geSBsYSBmYWJyaWNhIGRlIEZPUk0uCgojIyMgKipQcmVndW50YSA2KioKKyBwNl8iYcOxbyI6IEVzIGxhIGNhcmdhIGRlbCBhcmNoaXZvIGNzdiBkZW50cm8gZGVsIHByb2dyYW1hIHBvciBhw7FvCisgcDY6IERhdGFmcmFtZSBhIHV0aWxpemFyIGNvbiBsb3MgYcOxb3MgeSBjb2x1bW5hcyBjb21iaW5hZG9zCisgbGltaXRlczogU2VjdWVuY2lhIGRlIGxhIGdyw6FmaWNhIGRlIGJhcnJhcyBkb25kZSBzZSBlc3RhYmxlY2VuIGxvcyBsaW1pdGVzIHBhcmEgZXN0YQorIHA2X21lczogRGF0YWZyYW1lIG51ZXZvIGRvbmRlIHNlIHNlcGFyYW4gbGFzIGJhamFzIHBvciBtZXNlcwoKCiMgKipBbmV4b3MqKgojICoqUmVzdW1lbiBlbiBlcXVpcG8qKgojIyAqKkluZm9ybWFjacOzbiBkZSBGT1JNKioKCisgSW5kdXN0cmlhOiBBdXRvbW90cml6IChkaW7DoW1pY2EsIHZhbG9yYWNpw7NuIGRlbCBlbXBhcXVlLCBkaXZlcnNpZmljYWNpw7NuKS4KCisgRW5mb3F1ZTogSW5nZW5pZXLDrWEsIGxvZ8Otc3RpY2EsIG1hdGVyaWFsZXMsIHByb2plY3QgbWFuYWdlci4KCisgRW1wbGVhZG9zOiAxMzAgKGFsdGEgcm90YWNpw7NuKQoKKyBDZW50cm9zIGRlIGRpc3RyaWJ1Y2nDs246IFNhbHRpbGxvLCBBcG9kYWNhLCBCYWrDrW8sIFNhbiBBbnRvbmlvLgoKKyBQcm9kdWN0b3MgZGVzdGFjYWRvczogQ2FqYXMgZGUgZW1wYXF1ZSBwYXJhIGF1dG9wYXJ0ZXMgZGVsaWNhZGFzIHkgZXNwZWPDrWZpY2FzIGNvbW8gcGllemFzIGVsZWN0csOzbmljYXMsIGzDoW1wYXJhcywgcGllbGVzLCBhY2FiYWRvcyBibGFjayBwaWFuby4gRG9zIG1vZGFsaWRhZGVzLCBjYXJ0w7NuIHkgcmV0b3JuYWJsZXMuCgorIE1hdGVyaWFsZXMgdXRpbGl6YWRvczogY2FydMOzbiB5IHBsw6FzdGljbyBjb3JydWdhZG8sIGZvYW1zLCB0ZXJtb2Zvcm1hZG9zIHkgZGl2ZXJzb3MgdGV4dGlsZXMsIGVzdHJ1Y3R1cmFzIG1ldMOhbGljYXMKCiMjICoqQ29tZXJjaWFsaXphY2nDs24qKgorIEZPUk0gVmVuZGUgc3UgcHJvZHVjdG8gbm9ybWFsbWVudGUgYSBsYSBpbmR1c3RyaWEgYXV0b21vdHJpei4gU3UgZW5mb3F1ZSBkZSB2ZW50YXMgZXMgYSBjbGllbnRlcyBpbnRlcm5hY2lvbmFsZXMgY29tbyBKYXDDs24sIEFsZW1hbmlhLCBFc3RhZG9zIFVuaWRvcywgQ2hpbmEsIGV0Yy4gU3UgcHJvZHVjY2nDs24gZXN0w6EgYmFzYWRhIGVuIE3DqXhpY28gKHBlc29zKSwgeSBzZSBhY2FiYW4gZGUgZXhwYW5kaXIgYSAgU2FuIEFudG9uaW8sIEVzdGFkb3MgVW5pZG9zIGNvbiB1biBjZW50cm8gZGUgZGlzdHJpYnVjacOzbiBwYXJhIGN1YnJpciBsYSBkZW1hbmRhIGRlIHNvbHVjaW9uZXMgZGUgZW1wYXF1ZSBwYXJhIGxhcyBhdXRvcGFydGVzIGRlIGludGVyaW9yLgoKKyBGb3JtIG5vIHZlbmRlIGEgZW1wcmVzYXMgY29yZWFuYXMgcG9yIGVsIGNob3F1ZSBjdWx0dXJhbCwgbmkgbWV4aWNhbmFzIHBvcnF1ZSBubyBwYWdhbi4KCiMjICoqT2JqZXRpdm9zIGEgZnV0dXJvKioKKyBCdXNjYW4gbGEgY3JlYWNpw7NuIGRlIHVuIG1vZGVsbyBkZSBpbnRlbGlnZW5jaWEgY29tZXJjaWFsIGNvbiBlbCBmaW4gZGUgcG9kZXIgb3BlcmFyIHNpbiBlbCBkdWXDsW8gZW4gdW4gZnV0dXJvIHkgc2VndWlyIGNvbnRhbmRvIGNvbiB1biBhbWJpZW50ZSBlc3RhYmxlIGRlIGNvbWVyY2lvLgoKKyBEaXZlcnNpZmljYWNpw7NuIGRlIGNsaWVudGVzIGNvbiBlbCBmaW4gZGUgbm8gY3JlYXIgdW5hIGRlcGVuZGVuY2lhIGEgbG9zIG1pc21vcy4KCisgRW5jb250cmFyIHByb3NwZWN0b3MgbyBuZWdvY2lvcyBkZSBtYW5lcmEgYXV0b21hdGl6YWRhLCByZWQgbmV1cm9uYWwgaW50ZWxpZ2VudGUgcXVlIGNhbGN1bGUgbcOhcmdlbmVzIHlhIGVzdGFibGVjaWRvcy4KCiMjICoqU2VjdG9yZXMgZGUgc3UgcHJvZHVjY2nDs24qKgorIFByb2R1Y3RvIG5vLXJldG9ybmFibGU6IG1lbm9zIGdhbmFuY2lhIHBvciBwcm9kdWN0bywgbcOhcyBzZWd1cm8sIGNvbXByYXMgY29uc3RhbnRlcwoKKyBQcm9kdWN0byByZXRvcm5hYmxlOiBtw6FzIGdhbmFuY2lhIHBvciBwcm9kdWN0bywgbWVub3MgY29uc3RhbnRlcywgbcOhcyBlc3BlY8OtZmljby4KCiMjICoqQ29tcGV0aWRvcmVzKioKKyBNw6l4aWNvOiBFbXBhcXVlcyBGaWd1ZXJvYSwgUmlvIEdyYW5kZSwgIEJyYWRmb3JkLCBPUkJJUywgSEVMU0EsIFZlcnNhdGVjaCwgIGNvblRleW9yLCBWaWN0b3J5IFBhY2thZ2luZy4KVVM6IHB1cm8gcmV0b3JuYWJsZSBkZSB2ZW50YQoKIyMgKipPcGVyYWNpb25lcyoqCisgRW5mb3F1ZSBlbiBhdXRvcGFydGVzIGludGVyaW9yZXMuCgorIERpc2XDsW8sIHByb2R1Y2Npw7NuLCBlbnRyZWdhLCBlbXBhcXVlIChsb3MgZW1wYXF1ZSBkZSBjYXJ0w7NuIHNlIGVudHJlZ2FuIG5vIGVuc2FtYmxhZG9zKS4KCisgRW1wYXF1ZSByZXRvcm5hYmxlOiBmbHVjdHVhbnRlIDEwLTI1JS4KCisgRW1wYXF1ZSBubyByZXRvcm5hYmxlOiBjb25zdGFudGUgOTAlLgoKKyBObyB0aWVuZW4gbWVybWFzIG5pIG1hdGVyaWFsIGRlc3BlcmRpY2lhZG8gY29uc2lkZXJhYmxlCgorIEFsdG8gcG9yY2VudGFqZSBkZSB0cmFiYWpvIGEgbWFubyBlbiBmYWJyaWNhY2nDs24KCisgSW5zcGVjY2lvbmVzIGVuIGN1YW50byBhIGxhIGNhbGlkYWQgZGUgbGEgbWF0ZXJpYSBwcmltYSBlbiB1biBwcmluY2lwaW8KCisgQ3Jpc2lzIGVuIDIwMTYgeSBkdXJhbnRlIGxhIHBhbmRlbWlhLgoKKyBWZW50YXMgZW4gZMOzbGFyZXMsIGNvc3RvcyBkZSBwcm9kdWNjacOzbiBlbiBwZXNvcyAoc3VzY2VwdGlibGVzIGEgbGEgdm9sYXRpbGlkYWQgZGUgbGEgdGFzYSBkZSBjYW1iaW8pLgoKKyBTdXMgb3BlcmFjaW9uZXMgc2UgcmlnZW4gcG9yIGVsIEluY290ZXJtIEREUCwgbG8gY3VhbCBzaWduaWZpY2EgcXVlIGxhIGVtcHJlc2EgYWJzb3JiZSB0b2RvcyBsb3MgY29zdG9zIGRlIGV4cG9ydGFjacOzbiBlIGltcG9ydGFjacOzbiBkZXNkZSBzdSBjZW50cm8gZGUgZGlzdHJpYnVjacOzbiBlbiBNw6l4aWNvIGhhc3RhIHN1IGNlbnRybyBkZSBkaXN0cmlidWNpw7NuIGVuIFNhbiBBbnRvbmlvIHkgYcOxYWRpZG8gYSBlc3RvLCBGT1JNIGVudHJlZ2EgbGEgbWVyY2FuY8OtYSBhIGxhcyBwbGFudGFzIGRlbCBjbGllbnRlLgoKIyMgKipHZXN0acOzbiB5IEZpbmFuemFzKioKKyBGdXNpb25hbmRvIHJlY3Vyc29zIGh1bWFub3MgeSBjb250YWJpbGlkYWQuCgorIEN1bHR1cmEgaG9yaXpvbnRhbCwgZW5mb3F1ZSBlbiBjb25zdHJ1Y2Npw7NuIGRlIG5lZ29jaW8uCgorIENvdGl6YWNpb25lcyBlbiBwZXNvcy4KCisgRWdyZXNvIHByaW5jaXBhbDogY2FydMOzbi4KCisgUmllc2dvczogY3Jpc2lzIGRlIG1hdGVyaWEgcHJpbWEsIHZvbGF0aWxpZGFkIGRlIHByZWNpb3MuCgorIEJ1c2NhbiBwcm95ZWN0b3MgcmVudGFibGVzLCBmaWRlbGl6YWNpw7NuIGNvbiBwcm9zcGVjdG9zLgoKKyBCdXNjYW4gcHJveWVjdG9zIGRlIGludmVyc2nDs24gZW4gRXN0YWRvcyBVbmlkb3MsIGRlYmlkbyBhIGxhIHZvbGF0aWxpZGFkIGRlbCBkw7NsYXIKCiMjICoqVGVjbm9sb2fDrWEgeSBNZWpvcmFzKioKKyBDYW1iaW8gZGUgcnAgZGUgT2RvbyBhIG90cm8gc2lzdGVtYSBsb2NhbC4KCisgTWV0YXM6IFRyaXBsaWNhciBwcm9kdWNjacOzbiBjb24gdGVjbmlmaWNhY2nDs24uCgorIERlY2lzacOzbiBiYXNhZGEgZW4gZGF0b3MgKG1hdGVyaWFsZXMsIGRlbWFuZGEpLgoKKyBNZWpvcmEgZGUgcGVyZmlsZXMgZGUgcHVlc3Rvcy4KCiMjICoqQ29tcGV0ZW5jaWEgeSBDcmVjaW1pZW50byoqCisgQ29tcGV0aWRvcmVzIGVuIE3DqXhpY28geSBkZXNjb25vY2lkb3MgZW4gRUUuIFVVLgoKKyBEaWZlcmVuY2lhY2nDs246IHNvZnR3YXJlIHBhcmEgZW1wYXF1ZSByZXRvcm5hYmxlLCB5IGxhIGluZ2VuaWVyw61hIGRlIHN1cyBlbXBhcXVlcy4KCisgSWRlYXMgZGUgY3JlY2ltaWVudG86IE1hcXVpbGFkb3JlcywgcHltZXMgc2luIGluZ2VuaWVyb3MuCgorIFBhcnRpY2lwYWNpw7NuIGVuIGFzb2NpYWNpb25lcyBpbmR1c3RyaWFsZXMuCgorIMOBcmVhIG9iamV0aXZhIGRlIGNvbWVyY2lhbGl6YWNpw7NuOiBTYW4gQW50b25pbywgVGV4YXMKCiMjICoqUmVjdXJzb3MgSHVtYW5vcyB5IE1lcmNhZG8gQ29tZXJjaWFsKioKKyBFbmZvcXVlIGVuIHNlbnRpZG8gZGUgcGVydGVuZW5jaWEsIHJldGVuY2nDs24uCgorIE9iamV0aXZvOiBTZXIgdW5hIGVtcHJlc2EgY29uIHVuYSBleGNlbGVudGUgY3VsdHVyYSBvcmdhbml6YWNpb25hbCB5IG1lam9yYXIgbGEgcmV0ZW5jacOzbiBkZSBlbXBsZWFkb3MuCgorIERlc2Fycm9sbG8gZGUgcGVyZmlsZXMgZGUgcHVlc3RvIGVuIGJhc2UgYWwgdG9wIDIwIGVtcGxlYWRvcyBkZSBsYSBjb21wYcOxw61hLgoKKyBNb2RlbG8gZGUgaW50ZWxpZ2VuY2lhIGNvbWVyY2lhbC4KCisgQ2FydGVyYSBkZSBjbGllbnRlcyAoYWN0aXZvcyAxMCkuCgorIE3DqXRvZG9zIGRlIHJlY2x1dGFtaWVudG86IEZhY2Vib29rLCBwYXJxdWUgaW5kdXN0cmlhbCwgTGlua2VkSW4uCgorIERlc2Fycm9sbG8gZGUgY3VlbnRhczogNTAlLTYwJS4KCisgRXhwb3NpY2lvbmVzLCBmZXJpYXMsIExpbmtlZEluIHBhcmEgZXN0cmF0ZWdpYSBjb21lcmNpYWwuCgojIyAqKlJldGlybyB5IFJpZXNnb3MgYSBGdXR1cm8qKgorIFJldGlybyBkZWwgQ0VPIHBsYW5lYWRvIGVuIDUgYcOxb3MuCgorIERlcGVuZGVuY2lhIGVuIGNsaWVudGVzLCBpbmVzdGFiaWxpZGFkIHBvbMOtdGljYS9lY29uw7NtaWNhLgoKKyBWdWxuZXJhYmlsaWRhZCB5IHNlZ3VyaWRhZCBlbiBNw6l4aWNvLCB2b2xhdGlsaWRhZCBkZWwgZMOzbGFyLgoKKyBGYWx0YSBkZSBtYW5vIGRlIG9icmEgY29tYmluYWRvIGNvbiBsYSBhbHRhIHJvdGFjacOzbi4KCiMgKipSZWZlcmVuY2lhcyoqCisgRGF0YSBNw6l4aWNvLiAoMjAyMikuIENhamFzIGRlIFBhcGVsIG8gQ2FydMOzbiBDb3JydWdhZG86IEludGVyY2FtYmlvIGNvbWVyY2lhbCwgY29tcHJhcyB5IHZlbnRhcyBpbnRlcm5hY2lvbmFsZXMsIG1lcmNhZG8geSBlc3BlY2lhbGl6YWNpw7NuIHwgRGF0YSBNw6l4aWNvLiBodHRwczovL3d3dy5lY29ub21pYS5nb2IubXgvZGF0YW1leGljby9lcy9wcm9maWxlL3Byb2R1Y3QvYm94ZXMtY29ycnVnYXRlZC1wYXBlcmJvYXJkCgorIFBpbmVkYSwgTS4gKDIwMjMsIEp1bmUgMjIpLiBJbmR1c3RyaWEgYXV0b21vdHJpeiBlbiBNw6l4aWNvOiBiYWxhbmNlIDIwMjIgeSBwcm95ZWNjaW9uZXMgMjAyMy4gTW1zLU1leGljby5jb207IE1vZGVybiBNYWNoaW5lIFNob3AgTcOpeGljby4gaHR0cHM6Ly93d3cubW1zLW1leGljby5jb20vYXJ0aWN1bG9zL2luZHVzdHJpYS1hdXRvbW90cml6LWVuLW1leGljby1iYWxhbmNlLTIwMjIteS1wcm95ZWNjaW9uZXMtMjAyMwoKKyBJbmZvcm1lIGRlbCBtZXJjYWRvIGF1dG9tb3RyaXogZGUgQW3DqXJpY2EgZGVsIE5vcnRlIHwgVGFtYcOxbywgcGFydGljaXBhY2nDs24sIGNyZWNpbWllbnRvIHkgdGVuZGVuY2lhcyAoMjAyMi0yNykuICgyMDIyKS4gTW9yZG9yaW50ZWxsaWdlbmNlLmNvbS4gaHR0cHM6Ly93d3cubW9yZG9yaW50ZWxsaWdlbmNlLmNvbS9lcy9pbmR1c3RyeS1yZXBvcnRzL25vcnRoLWFtZXJpY2EtYXV0b21vdGl2ZS1tYXJrZXQjOn46dGV4dD1Fc3RhZG9zJTIwVW5pZG9zJTIwZXMlMjB1bmElMjBkZSxxdWUlMjBlbCUyMGElQzMlQjFvJTIwYW50ZXJpb3IlMkMlMjAyMDE5LgoKKyBDZXBlZGEsIEYuICgyMDIzLCBKYW51YXJ5IDEyKS4gUHJlcGFyYSBGT1JNIHBsYW4gcGFyYSBjb21wZXRpciBlbiBFVS4gRWwgRmluYW5jaWVybzsgRWwgRmluYW5jaWVyby4gaHR0cHM6Ly93d3cuZWxmaW5hbmNpZXJvLmNvbS5teC9tb250ZXJyZXkvMjAyMy8wMS8xMi9wcmVwYXJhLWZvcm0tcGxhbi1wYXJhLWNvbXBldGlyLWVuLWV1LwoKKyBGT1JNOiB0cmFuc2Zvcm1hbmRvIGVsIG11bmRvIGRlbCBlbXBhcXVlIHBhcmEgZWwgc2VjdG9yIGF1dG9tb3RyaXouICgyMDIyKS4gQ2x1c3RlciBJbmR1dHJpYWwuIGh0dHBzOi8vd3d3LmNsdXN0ZXJpbmR1c3RyaWFsLmNvbS5teC9ub3RpY2lhLzU2NDAvZm9ybS10cmFuc2Zvcm1hbmRvLWVsLW11bmRvLWRlbC1lbXBhcXVlLXBhcmEtZWwtc2VjdG9yLWF1dG9tb3RyaXoKCisgRWwgRWNvbm9taXN0YS4gKDIwMjIsIFNlcHRlbWJlciAxOSkuIFByb3ZlZWRvcmEgbWV4aWNhbmEgZGUgZW1wYXF1ZXMgZWNvbMOzZ2ljb3MgYXB1ZXN0YSBwb3Igc2VjdG9yIGF1dG9tb3RyaXogZGUgRXN0YWRvcyBVbmlkb3MuIEVsIEVjb25vbWlzdGE7IEVsIEVjb25vbWlzdGEuIGh0dHBzOi8vd3d3LmVsZWNvbm9taXN0YS5jb20ubXgvZXN0YWRvcy9Qcm92ZWVkb3JhLW1leGljYW5hLWRlLWVtcGFxdWVzLWVjb2xvZ2ljb3MtYXB1ZXN0YS1wb3Itc2VjdG9yLWF1dG9tb3RyaXotZGUtRXN0YWRvcy1Vbmlkb3MtMjAyMjA5MTktMDA4Ny5odG1sCgorIEFycmF0aWJlbCwgQS4gSi4gKDIwMjMsIEphbnVhcnkgMjApLiBFbCBkaWxlbWEgZGUgTcOpeGljbyB5IHN1cyBzaWV0ZSBtaWxsb25lcyBkZSB0b25lbGFkYXMgZGUgYmFzdXJhIHBsw6FzdGljYS4gRWwgUGHDrXMgQW3DqXJpY2EuIGh0dHBzOi8vZWxwYWlzLmNvbS9hbWVyaWNhLWZ1dHVyYS8yMDIzLTAxLTIwL2VsLWRpbGVtYS1kZS1tZXhpY28teS1sYXMtc2lldGUtbWlsbG9uZXMtZGUtdG9uZWxhZGFzLWRlLXBsYXN0aWNvLXF1ZS1hY2FiYW4tZW4tbGEtYmFzdXJhLW8tZW4tZWwtbWFyLmh0bWwKCisgSm9hcXVpbSBFbGNhY2hvLiAoMjAyMiwgT2N0b2JlciAyNSkuIEVzdGFkb3MgVW5pZG9zIGdlbmVyYSA1MSBtaWxsb25lcyBkZSB0b25lbGFkYXMgZGUgcmVzaWR1b3MgZGUgcGzDoXN0aWNvcyBhbCBhw7FvIHkgc29sbyByZWNpY2xhIDIsNC4gTGEgVmFuZ3VhcmRpYTsgTGEgVmFuZ3VhcmRpYS4gaHR0cHM6Ly93d3cubGF2YW5ndWFyZGlhLmNvbS9uYXR1cmFsLzIwMjIxMDI1Lzg1ODA2ODMvZXN0YWRvcy11bmlkb3MtZ2VuZXJhLTUxLW1pbGxvbmVzLXRvbmVsYWRhcy1yZXNpZHVvcy1wbGFzdGljb3MtYW5vLXJlY2ljbGEtMi00Lmh0bWwjOn46dGV4dD1FbiUyMGFtYm9zJTIwY2Fzb3MlMkMlMjB1bmElMjBkZSxkZSUyMGxvcyUyMHJlc2lkdW9zJTIwZGUlMjBwbCVDMyVBMXN0aWNvcy4KCisgdmVyZGVzLiAoMjAyMiwgSnVseSA4KS4gUG9sw610aWNhIGFtYmllbnRhbCBtZXhpY2FuYTogbWl0b3MgeSByZWFsaWRhZGVzLiBMYXMgRW1wcmVzYXMgVmVyZGVzLiBodHRwczovL2xhc2VtcHJlc2FzdmVyZGVzLmNvbS9wb2xpdGljYS1hbWJpZW50YWwtbWV4aWNhbmEtbWl0b3MteS1yZWFsaWRhZGVzLyM6fjp0ZXh0PUVuJTIwTSVDMyVBOXhpY28lMjBjb250YW1vcyUyMGNvbiUyMHVuLERlc2Fycm9sbG8lMjBSdXJhbCUyMFN1c3RlbnRhYmxlJTJDJTIwZW50cmUlMjBvdHJvcy4KCisgSm9uIE1hcnTDrW4gQ3VsbGVsbC4gKDIwMjIsIE5vdmVtYmVyIDE2KS4gTcOpeGljbyBidXNjYSBkdXBsaWNhciBsYSBnZW5lcmFjacOzbiByZW5vdmFibGUgZGVzcHXDqXMgZGUgZW50b3JwZWNlciBzdSBjcmVjaW1pZW50by4gRWwgUGHDrXMgTcOpeGljby4gaHR0cHM6Ly9lbHBhaXMuY29tL21leGljby8yMDIyLTExLTE2L21leGljby1idXNjYS1kdXBsaWNhci1sYS1nZW5lcmFjaW9uLXJlbm92YWJsZS1kZXNwdWVzLWRlLWVudG9ycGVjZXItc3UtY3JlY2ltaWVudG8uaHRtbAoKKyBTdGFmZiwgRi4sICYgU3RhZmYsIEYuICgyMDIzLCBKdW5lIDMwKS4gTGEgdGFzYSBkZSBkZXNlbXBsZW8gZGUgTcOpeGljbyBhbGNhbnphIDIuOSUgZW4gbWF5bzogSW5lZ2kuIEZvcmJlcyBNw6l4aWNvLiBodHRwczovL3d3dy5mb3JiZXMuY29tLm14L2xhLXRhc2EtZGUtZGVzZW1wbGVvLWRlLW1leGljby1hbGNhbnphLTItOS1lbi1tYXlvLWluZWdpLyM6fjp0ZXh0PUxhJTIwdGFzYSUyMGRlJTIwZGVzZW1wbGVvJTIwZGUlMjBNJUMzJUE5eGljbyUyMGFsY2FuemElMjAyLjklMjUlMjBlbiUyMG1heW8lM0ElMjBJbmVnaQoKKyBBbmEgS2FyZW4gR2FyY8OtYS4gKDIwMjEsIEp1bHkgMTkpLiBNw6l4aWNvLCBlbiBlbCB0b3AgNSBkZSBtYXlvciBjYWxpZGFkIGRlIHZpZGEgZW4gQW3DqXJpY2EgTGF0aW5hLCBzZWfDum4gbG9zIGRhdG9zIGRlIE51bWJlby4gRWwgRWNvbm9taXN0YTsgRWwgRWNvbm9taXN0YS4gaHR0cHM6Ly93d3cuZWxlY29ub21pc3RhLmNvbS5teC9lY29ub21pYS9NZXhpY28tZW4tZWwtdG9wLTUtZGUtbWF5b3ItY2FsaWRhZC1kZS12aWRhLWVuLUFtZXJpY2EtTGF0aW5hLXNlZ3VuLWxvcy1kYXRvcy1kZS1OdW1iZW8tMjAyMTA3MTgtMDAxMC5odG1sCgorIGRlLCBOLiAoMjAyMykuIEluZ3Jlc29zIHkgR2FzdG9zIGRlIGxvcyBIb2dhcmVzLiBJbmVnaS5vcmcubXguIGh0dHBzOi8vd3d3LmluZWdpLm9yZy5teC90ZW1hcy9pbmdyZXNvc2hvZy8KCisgVGVuZGVuY2lhcywgcmV0b3MgeSBvcG9ydHVuaWRhZGVzIGVuIHByb3llY3RvcyBkZSBpbmZyYWVzdHJ1Y3R1cmEgfCBEZWxvaXR0ZSBNw6l4aWNvLiAoMjAxNywgSnVuZSA4KS4gRGVsb2l0dGUgTcOpeGljby4gaHR0cHM6Ly93d3cyLmRlbG9pdHRlLmNvbS9teC9lcy9wYWdlcy9pbmZyYWVzdHJ1Y3R1cmEteS1wcm95ZWN0b3MtZGUtY2FwaXRhbC9hcnRpY2xlcy90ZW5kZW5jaWFzLXktb3BvcnR1bmlkYWRlcy1lbi1pbmZyYWVzdHJ1Y3R1cmEuaHRtbAoKKyBUcmFiYWpvLCBkZWwuICgyMDIzKS4gRW50cmFuIGVuIHZpZ29yIHNhbGFyaW9zIG3DrW5pbW9zIDIwMjMgZW4gdG9kbyBlbCBwYcOtcy4gR29iLm14LiBodHRwczovL3d3dy5nb2IubXgvc3Rwcy9wcmVuc2EvZW50cmFuLWVuLXZpZ29yLXNhbGFyaW9zLW1pbmltb3MtMjAyMy1lbi10b2RvLWVsLXBhaXM/aWRpb209ZXMjOn46dGV4dD1CT0xFVCVDMyU4RE4lMjBOJUMzJUJBbWVybyUyMDAwMSUyRjIwMjMmdGV4dD1BJTIwcGFydGlyJTIwZGUlMjBlc3RlJTIwZCVDMyVBRGEscG9kZXIlMjBhZHF1aXNpdGl2byUyMGRlJTIwZXN0b3MlMjBzYWxhcmlvcy4KCisgV29ybGQgRW5lcmd5IFRyYWRlLiAoMjAyMywgTWF5KS4gTGEgZcOzbGljYSB5IGxhIHNvbGFyIGRlIEVzdGFkb3MgVW5pZG9zIGdlbmVyYXJvbiBtw6FzIGVsZWN0cmljaWRhZCBxdWUgZWwgY2FyYsOzbiBlbiBsb3MgZG9zIHByaW1lcm9zIG1lc2VzIGRlIDIuIFdvcmxkZW5lcmd5dHJhZGUuY29tOyBXb3JsZCBFbmVyZ3kgVHJhZGUuIGh0dHBzOi8vd3d3LndvcmxkZW5lcmd5dHJhZGUuY29tL2VuZXJnaWFzLWFsdGVybmF0aXZhcy9lbGVjdHJpY2lkYWQvZW9saWNhLXNvbGFyLWVzdGFkb3MtdW5pZG9zLWVsZWN0cmljaWRhZC1jYXJib24tMjAyMwoKKyBNw6l4aWNvIEVmaWNhY2lhIGd1YmVybmFtZW50YWwgLSBkYXRvcywgdGFibGEgfCBUaGVHbG9iYWxFY29ub215LmNvbS4gKDIwMjEpLiBUaGVHbG9iYWxFY29ub215LmNvbS4gaHR0cHM6Ly9lcy50aGVnbG9iYWxlY29ub215LmNvbS9NZXhpY28vd2JfZ292ZXJubWVudF9lZmZlY3RpdmVuZXNzLwoKKyBFc2N1ZGVybywgRS4gKDIwMjIsIERlY2VtYmVyIDE0KS4gwr9QdWVkZSB0cmFuc2Zvcm1hcnNlIGxhIGNhZGVuYSBkZSBzdW1pbmlzdHJvIGRlbCBzZWN0b3IgYXV0b21vdHJpej8gVEhFIExPR0lTVElDUyBXT1JMRCB8IENvbsOpY3RhdGUgRSBJbnNww61yYXRlLiBodHRwczovL3RoZWxvZ2lzdGljc3dvcmxkLmNvbS9tYW51ZmFjdHVyYS9wdWVkZS10cmFuc2Zvcm1hcnNlLWxhLWNhZGVuYS1kZS1zdW1pbmlzdHJvLWRlbC1zZWN0b3ItYXV0b21vdHJpei8KCisgTmVhcnNob3JpbmcgZW4gTcOpeGljbzogwr9xdcOpIGVzIHkgY8OzbW8gYWZlY3RhcsOhIGxhIGVjb25vbcOtYSBkZWwgcGHDrXM/ICgyMDIzKS4gUHJ5c21leC5jb20uIGh0dHBzOi8vd3d3LnByeXNtZXguY29tL2Jsb2cvbmVhcnNob3JpbmctZW4tbWV4aWNvIzp+OnRleHQ9TGElMjBhZG9wY2klQzMlQjNuJTIwZGVsJTIwbmVhcnNob3JpbmclMjBubyxhbCUyMGNyZWNpbWllbnRvJTIwc29zdGVuaWJsZSUyMGRlbCUyMHBhJUMzJUFEcwoKKyBIZXJuw6FuZGV6LCBFLiwgJiBIZXJuw6FuZGV6LCBFLiAoMjAyMywgQXByaWwgMjUpLiBGYWx0YSBkZSBtYW5vIGRlIG9icmEgb2JzdGFjdWxpemEgZGVzZW1wZcOxbyBkZSA0IGRlIGNhZGEgMTAgZW1wcmVzYXMgZW4gTnVldm8gTGXDs24uIEZvcmJlcyBNw6l4aWNvLiBodHRwczovL3d3dy5mb3JiZXMuY29tLm14L2ZhbHRhLWRlLW1hbm8tZGUtb2JyYS1vYnN0YWN1bGl6YS1kZXNlbXBlbm8tZGUtNC1kZS1jYWRhLTEwLWVtcHJlc2FzLWVuLW51ZXZvLWxlb24vCgorIEZPUk0gQXV0b21vdGl2ZSBQYWNrYWdpbmcgU3BlY2lhbGlzdHMgfCBMaW5rZWRJbi4uIE14LmxpbmtlZGluLmNvbS4gUmV0cmlldmVkIEF1Z3VzdCAyNiwgMjAyMywgZnJvbSBodHRwczovL3d3dy5saW5rZWRpbi5jb20vY29tcGFueS9mb3JtcGFja2luZy8KCisgRmxvcmVzLCBGLiB8IExpbmtlZEluLi4gTXgubGlua2VkaW4uY29tLiBSZXRyaWV2ZWQgQXVndXN0IDI2LCAyMDIzLCBmcm9tIGh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9mZWxpcGUtZmxvcmVzLWdhcmMlQzMlQURhLWFhMWE1MjkzLz9vcmlnaW5hbFN1YmRvbWFpbj1teAoKKyBKdcOhcmV6LCBDLiAoMjAyMiwgSnVuZSAyNCkuIEVsIGF1bWVudG8gZW4gZWwgcHJlY2lvIGRlIGNvbWJ1c3RpYmxlcyBhZmVjdGEgYSBsYSBwcm9kdWNjacOzbiBtdW5kaWFsLiBUSEUgTE9HSVNUSUNTIFdPUkxEIHwgQ29uw6ljdGF0ZSBlIEluc3DDrXJhdGUuIGh0dHBzOi8vdGhlbG9naXN0aWNzd29ybGQuY29tL3RyYW5zcG9ydGUvYXVtZW50by1lbi1lbC1wcmVjaW8tZGUtbGFzLWdhc29saW5hcy1hZmVjdGEtYS1sYS1wcm9kdWNjaW9uLW11bmRpYWwvCgorIFBldHLDs2xlbyBjcnVkbyBlbiBFc3RhZG9zIFVuaWRvcyB8IE9FQy4gKDIwMjEpLiBPRUMgLSB0aGUgT2JzZXJ2YXRvcnkgb2YgRWNvbm9taWMgQ29tcGxleGl0eS4gaHR0cHM6Ly9vZWMud29ybGQvZXMvcHJvZmlsZS9iaWxhdGVyYWwtcHJvZHVjdC9jcnVkZS1wZXRyb2xldW0vcmVwb3J0ZXIvdXNhCgorIEpvc8OpIEFudG9uaW8gUml2ZXJhLiAoMjAyMywgTWF5IDMwKS4gUGVzbyBtZXhpY2FubyBzZSBhcHJlY2lhIGVuIHVuYSBqb3JuYWRhIG1hcmNhZGEgcG9yIGxhIHZvbGF0aWxpZGFkLiBFbCBFY29ub21pc3RhOyBFbCBFY29ub21pc3RhLiBodHRwczovL3d3dy5lbGVjb25vbWlzdGEuY29tLm14L21lcmNhZG9zL0RvbGFyLWhveS1wcmVjaW8tZGVsLTE2LWRlLWZlYnJlcm8tZGUtMjAyMy0yMDIzMDIxNi0wMDYyLmh0bWwKCisgSGlzdG9yaWFsIGRlIEVsZWNjaW9uZXMgfCBJRUNNLiAoMjAxOSwgU2VwdGVtYmVyIDE0KS4gSUVDTS4gaHR0cHM6Ly93d3cuaWVjbS5teC9lbGVjY2lvbmVzL2hpc3RvcmlhbC1kZS1lbGVjY2lvbmVzLwoKKyBIZXJuw6FuZGV6LCBHLiAoMjAyMiwgSnVuZSAyKS4gTG9zIDUgbW90aXZvcyBwcmluY2lwYWxlcyBwb3IgbG9zIHF1ZSBsYXMgcGVyc29uYXMgcmVudW5jaWFuIGEgdW4gZW1wbGVvIGVuIE3DqXhpY28uIEVsIEVjb25vbWlzdGE7IEVsIEVjb25vbWlzdGEuIApodHRwczovL3d3dy5lbGVjb25vbWlzdGEuY29tLm14L2NhcGl0YWxodW1hbm8vTG9zLTUtbW90aXZvcy1wcmluY2lwYWxlcy1wb3ItbG9zLXF1ZS1sYXMtcGVyc29uYXMtcmVudW5jaWFuLWEtdW4tZW1wbGVvLWVuLU1leGljby0yMDIyMDYwMS0wMDgyLmh0bWwKCisgTWV4aWNvSW5kdXN0cnkuICgyMDIxKS4gRXZpdGFyIGxhIHJvdGFjacOzbiBkZSBwZXJzb25hbCBtYW51ZmFjdHVyZXJvLiBNZXhpY29JbmR1c3RyeS4gaHR0cHM6Ly9tZXhpY29pbmR1c3RyeS5jb20vbm90aWNpYS8tZXZpdGFyLWxhLXJvdGFjaW9uLWRlLXBlcnNvbmFsLW1hbnVmYWN0dXJlcm8KCisgU3RhZmYsIEYuLCAmIFN0YWZmLCBGLiAoMjAyMiwgT2N0b2JlciAxMykuIExhIOKAnGdyYW4gcmVudW5jaWHigJ06IDQgZGUgY2FkYSAxMCBtZXhpY2Fub3MgZGVqYXLDrWEgc3UgdHJhYmFqbywgc2Vnw7puIGVzdHVkaW8uIEZvcmJlcyBNw6l4aWNvLiBodHRwczovL3d3dy5mb3JiZXMuY29tLm14L2xhLWdyYW4tcmVudW5jaWEtNC1kZS1jYWRhLTEwLW1leGljYW5vcy1kZWphcmlhLXN1LXRyYWJham8tc2VndW4tZXN0dWRpby8KCisgSU5DT01FWC4gKDIwMjIsIEF1Z3VzdCA1KS4gUHJldsOpbiBhdW1lbnRvIGRlIGhhc3RhIDgwJSBlbiByb3RhY2nDs24gZW4gbWFudWZhY3R1cmFzIC0gSU5DT01FWC4gSU5DT01FWC4gaHR0cHM6Ly9pbmNvbWV4Lm9yZy5teC9pbmRleC5waHAvMjAyMi8wOC8wNS9wcmV2ZW4tYXVtZW50by1kZS1oYXN0YS04MC1lbi1yb3RhY2lvbi1lbi1tYW51ZmFjdHVyYXMvCgorIEZlcnJlciwgQS4gKDIwMjIsIEZlYnJ1YXJ5IDE3KS4gwr9UZSBoYW4gbmVnYWRvIHVuIHRyYWJham8gcG9yIHR1IGVkYWQ/IEVzdGUgZXMgZWwgcGFub3JhbWEgZW4gTcOpeGljby4gQnVzaW5lc3MgSW5zaWRlciBNw6l4aWNvIHwgTm90aWNpYXMgUGVuc2FkYXMgUGFyYSBUaS4gaHR0cHM6Ly9idXNpbmVzc2luc2lkZXIubXgvdmFjYW50ZXMtbGltaXRlLWVkYWQtbWV4aWNvLXBhbm9yYW1hLXRyYWJham9fZXN0cmF0ZWdpYS8gCgorIFJlZGFjY2nDs24uICgyMDE1KS4gwr9DdcOhbCBlcyBsYSBtZWpvciBlZGFkIHBhcmEgY29uc2VndWlyIHRyYWJham8/IChpbmZvcm1lKS4gQmFua2ludGVyLgpodHRwczovL3d3dy5iYW5raW50ZXIuY29tL2Jsb2cvZmluYW56YXMtcGVyc29uYWxlcy9tZWpvci1lZGFkLXBhcmEtZW5jb250cmFyLXRyYWJham8jOn46dCB4dD1MYSUyMGZyYW5qYSUyMGRlJTIwZWRhZCUyMHF1ZSxkZSUyMGxhcyUyMHZhY2FudGVzJTIwZGUlMjBlbXBsZW8uIAoKKyBFbCBFY29ub21pc3RhLiAoMjAyMywgSnVseSAyMCkuIEVtcHJlc2FzIGRlIE51ZXZvIExlw7NuIGVuZnJlbnRhbiBhbHRhIHJvdGFjacOzbiBkZSBwZXJzb25hbDogQ29wYXJtZXguIEVsIEVjb25vbWlzdGEuIGh0dHBzOi8vd3d3LmVsZWNvbm9taXN0YS5jb20ubXgvZXN0YWRvcy9FbXByZXNhcy1kZS1OdWV2by1MZW9uLWVuZnJlbnRhbi1hbHRhLXJvdGFjaW9uLWRlLXBlcnNvbmFsLUNvcGFybWV4LTIwMjMwNzIwLTAwMjUuaHRtbCAKCisgU29mw61hLCBBLiAoMjAyMykuIFRhc2EgZGUgcm90YWNpw7NuIGRlIHBlcnNvbmFsIGVuIE3DqXhpY28sIMK/Y8OzbW8gbWVqb3JhcmxhPyBGYWN0b3JpYWwgQmxvZy4gaHR0cHM6Ly9mYWN0b3JpYWwubXgvYmxvZy90YXNhLXJvdGFjaW9uLXBlcnNvbmFsLW1leGljby8jOn46dGV4dD1VbiUyMCVDMyVBRG5kaWNlJTIwbWVub3IlMjBhbCUyMDE1LHklMjBzYWxpZGFzJTIwZW4lMjBsYSUyMG9yZ2FuaXphY2klQzMlQjNuLiA=