Entregable 1

Antecedentes de la empresa

Visión: “En 2033 seremos 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.” (Form, 2023).

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.” (Form, 2023).

Contexto de la industria:

La industria de empaque y embalaje representa una parte esencial del sector automotriz y de autopartes, ya que esta industria es pieza clave para garantizar la protección y entrega eficiente de los componentes automotrices en sus diferentes fases dentro de la cadena de suministro del sector automotriz.

En el 2022, la producción de automóviles en el mundo mantiene a Estados Unidos como el segundo mayor productor de automóviles abarcando el 13.4% de la industria y México como 7mo mayor productor con el 4.6%. (VDA,2023)

Tomando ésto en cuenta sabemos que el rol de México en la industria automotriz es de suma relevancia para el mundo y por consiguiente para nuestro país, representando el 2.77% del Producto Interno Bruto (PIB) de México en el 2022. (INEGI,2023)

La pandemia tuvo un impacto fuerte en la inversión extranjera directa de la industria automotriz con una reducción de 2.17 mil millones de dólares del 2020 al 2021 y naturalmente se vio afectada la producción de vehículos con una disminución de producción de 3.8 millones de unidades a 2.9 millones de unidades al año 2020. Sin embargo, se estima que la recuperación de la producción de la industria automotriz será hasta el 2026 con 3.8 millones de unidades a producir, igualando la producción del 2019. (IHS Market, 2020)

Socio Formador Form

Introducción de la Empresa

FORM es una empresa con sede principal en Nuevo León, ésta se dedica al empaque y embalaje de autopartes específicamente de partes interiores y eléctricas de los vehículos, las cuales es de suma importancia que no reciban ningún tipo de daño estético en su proceso de transportación para su ensamblaje.

FORM se centra en abastecer las necesidades de los proveedores Tier 1 (planta automotriz) y Tier 2 (proveen partes a las plantas) de la industria automotriz, por lo que estos son sus principales clientes.

Productos/Servicios

La empresa no ofrece un portafolio de productos fijos o estandarizados para la industria automotriz. FORM busca generar soluciones a las necesidades y problemas de sus clientes dentro de la cadena de suministro, por medio de la innovación ingenieril en el empaque de las autopartes.

Además, FORM ofrece un servicio de acompañamiento el cual funciona como un soporte de comunicación en el que empleados de FORM, pueden asistir directamente en la planta de los clientes para la entrega de los empaques y ensamblaje hasta tener comunicación continua con la empresa en caso de cualquier situación.

Las cosas antes mencionadas forman parte de la propuesta de valor de la empresa, apalancando de la innovación y el servicio al cliente se busca asegurar la calidad la cual los clientes de FORM están buscando debido a la importancia y delicadeza que toman las autopartes interiores y eléctricas dentro de la industria automotriz.

Aunque los productos que ofrece FORM dentro de la industria automotriz fungen parecido a un commodity, el empaque se llega a producir en grandes cantidades, estos no entran como tal en la definición de commodity ya que en el caso de FORM entra una parte clave la cual es la personalización.

Perspectivas Futuras

Actualmente FORM busca equipar con tecnología para automatizar y desarrollar todo un ambiente de datos el cual les pueda ayudar a agilizar procesos y dar certeza a la toma de decisiones en base a datos. Con esto buscan poder realizar pronósticos para anticipar la demanda de sus clientes y diversificar dentro de EUA, esto por mencionar alguno de los ejemplos. En cuanto a temas de cultura organizacional se busca medir sistemáticamente diferentes KPI´s.

Además de esto, se busca crear un sentido de pertenencia y lealtad de los empleados hacia la empresa. Buscando continuar con la cultura organizacional actual, la cual está enfocada en la horizontalidad, la construcción de equipos y divisiones autónomas a niveles inferiores dentro de la empresa. Esto, con el fin de permitir una comunicación más efectiva y fluida entre departamentos.

Expansión

Actualmente FORM busca un crecimiento, desea continuar con la industria de autopartes, por lo que su principal enfoque se encuentra en crecer a lo largo de la línea de la industria automotriz que se encuentra ubicada en el territorio mexicano y estadounidense. Específicamente, busca crecer en el bajío mexicano y en San Antonio Texas en el extranjero. Por otra parte, busca explorar otras industrias las cuales se alineen a su misión, como lo puede ser la aeroespacial y de equipos médicos.

Además busca expandir sus inversiones en el extranjero tomando como opción principal a Estados Unidos. Buscando crecer a cualquier parte de Texas debido a el costo de oportunidad que se tiene, si se busca crecer más allá de Texas aumenta los costos de fletes y el negocio no sale con buen margen. FORM no busca ser la empresa mas grande, se concentra en negocios de PYME con grandes margenes de ganancia

Cultura organizacional y RH

Hoy en día cuentan con 130 colaboradores dentro de la empresa, sin embargo existe un tema de rotación de personal por diversas razones, uno de sus enfoques es crear una cultura organizacional la cual retenga al capital humano.

Actualmente ofrecen diversas compensaciones y beneficios para incitar la activa participación de sus colaboradores. Se cuentan con bases de datos enfocadas al tema de capital humano con las cuales se buscan identificar las razones de la rotación, sin embargo aún no han logrado ver un decremento en los porcentajes anuales de rotación.

FORM cuenta con 6 pilares principales, dentro de la empresa se vive una actitud de honestidad y transparencia dentro de todos los procesos, se busca cuidar detalladamente los espacios de trabajo con planes para implementar nuevos baños en el piso.

Análisis de las áreas de la empresa

Carga de librerias

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.3     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(stringr)
library(readr)
library(dplyr)
library(tidyr)
library(grid)
library(psych)
## 
## Attaching package: 'psych'
## 
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(gplots)
## 
## Attaching package: 'gplots'
## 
## The following object is masked from 'package:stats':
## 
##     lowess
library(knitr)

Carga de datos

#file.choose()
Ventas_1 <- read.csv("/Users/davidcavazos/Desktop/Analitica/R/Reto/Datos/EV1_ENTREGABLE 3/Ventas_1.csv")

#file.choose()
Bajas <-read.csv("/Users/davidcavazos/Desktop/Analitica/R/Reto/Datos/EV1_ENTREGABLE 3/Bajas.csv")

#file.choose()
FDI_df <- read.csv("/Users/davidcavazos/Desktop/Analitica/R/Reto/Datos/EV1_ENTREGABLE 3/FDI_Mexico.csv")

Bajas por Puesto y Genero (2021)

Los ayudantes generales son los que cuentan mayor baja por un margén altamente considerable, como se puede observar en la grafíca 1. Además de esto se puede observar que de igual forma la mayoría de personas de está posición a las que se les da de baja son mujeres.

Por lo que se podría plantear una primer hipótesis la cual es que esto se puede deber a que la gran parte de personas que se contratan son para el puesto de ayudante general y de sexo femenino, sin embargo todavía no se ha realizado el análisis para comprobar la hipótesis antes mencionada.

options(scipen = 999) 
Bajas$PUESTO <- as.factor(Bajas$PUESTO)

ggplot(Bajas, aes(PUESTO)) +
  geom_bar(aes(fill=GENERO)) +
  theme(axis.text.x = element_text(angle = 90)) +
  labs(x = "Puesto", y = "Cantidad", title = "Bajas por puesto ") +
  theme(panel.background = element_rect(fill = "gray98"))

Ventas por Línea de Negocio (2021)

Dentro de las ventas por linea de negocio, es decir retornable y cartón. Se puede observar como la linea de negocios que liderá es la del cartón, sin embargo se observa como las ventas de retornables y cartón en los primeros 2 quartiles del año son altamente superiores al resto del año.

Gráfico 2

as.Date(Ventas_1$Mes)
##  [1] "0028-01-21" "0028-01-21" "0028-02-21" "0028-02-21" "0028-03-21"
##  [6] "0028-03-21" "0028-04-21" "0028-04-21" "0028-05-21" "0028-05-21"
## [11] "0028-06-21" "0028-06-21" "0028-07-21" "0028-07-21" "0028-08-21"
## [16] "0028-08-21" "0028-09-21" "0028-09-21" "0028-10-21" "0028-10-21"
## [21] "0028-11-21" "0028-11-21" "0028-12-21" "0028-12-21"
col_per <- c("coral", "orange")

ggplot(Ventas_1, aes(x = Mes, y = Venta, fill = Producto)) +
  geom_bar(stat = "identity") +
  labs(x = "Mes", y = "Venta", title = "Ventas Mensuales por Producto") +
  scale_fill_manual(values = col_per) + 
  theme(panel.background = element_rect(fill = "gray98") )+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Inversión Extranjera por Año

La Inversión Extranjera Directa en el mismo año (2021), tuvo fuertes afectaciones debido al COVID-19, por lo que podría ser una de las razones por las cuales en la Grafíca 2 las ventas de los ultímos 2 cuartiles del año hayan caído de manera considerable a comparación del inicio del año.

Gráfico 3

df_FDI = FDI_df

#Separar Columnas
df_FDI <- separate(df_FDI, Quartil, into = c("Quartil", "Año"), sep = " ")

#FDI sumado por Año
año_sum <- df_FDI %>% group_by(Año) %>% summarize(suma=sum(Mil.Millones.de.Dolares))

año_sum$Año <- as.numeric(año_sum$Año)

grafico_año = ggplot(año_sum, aes(x = Año, y = suma)) +
  geom_line( color = "#F46C22") +
  geom_point(color = "#F46C22") +
  geom_text(aes(label = suma), hjust = -0.2, vjust = 0.5, color = "#505050", size = 4) +  
  labs(title = "Inversión Extranjera Directa por Año",subtitle = "Mil Millones de Dólares", x = "Año", y = "Inversión", caption = "Fuente: INEGI") + 
  theme_minimal() + 
  theme(plot.title = element_text(hjust = 0.5, face = "bold", color = "#505050"), panel.grid.major =      element_blank(), plot.subtitle = element_text(hjust = .5, size = 7)) 

grafico_año + scale_x_continuous(breaks = año_sum$Año)

FODA Cruzado

El objetivo del análisis FODA para FORM es evaluar de manera integral sus Fortalezas, Oportunidades, Debilidades y Amenazas con el fin de obtener una comprensión estratégica de su posición en el mercado y proporcionar una base sólida para la toma de decisiones que potencien su competitividad y crecimiento en la industria de empaques y embalajes.

PESTLE

El objetivo del análisis PESTLE para FORM es examinar los factores que impactan su operación y entorno empresarial. Esto permitirá a la empresa comprender mejor el contexto en el que opera, anticipar posibles cambios y ajustar su estrategia para maximizar oportunidades y mitigar riesgos.

Entregable 2

Pregunta 1

¿Cuál es el Estado Civil con Mayores Bajas?

Abrir base de datos
# file.choose()
BDD_FORM_BAJAS_2023 <- read_csv("/Users/davidcavazos/Desktop/Analitica/R/Reto/Datos/EV1_ENTREGABLE 3/BDD_FORM_BAJAS_2023.csv")
## Rows: 279 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (24): Apellidos, Nombre, Fecha de Nacimiento, Género, RFC, Fecha de Alta...
## dbl  (4): No., SD, CP, Número de Télefono
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
### Seleccionar las variables de Motivo de baja y Estado Civil en un nuevo data frame.

mbaja <- select(BDD_FORM_BAJAS_2023,`Motivo de Baja`,`Estado Civil`) %>% na.omit(mbaja)
Agrupar la categoría con diferentes nombres cambiando a el mismo nombre
mbaja$"Motivo de Baja"[mbaja$"Motivo de Baja" == "Inducida."] <- "Inducida"

mbaja$"Motivo de Baja"[mbaja$"Motivo de Baja" == "Inducida (Faltas)"] <- "Inducida por faltas"

mbaja$"Motivo de Baja"[mbaja$"Motivo de Baja" == "Inducida (Faltas no dio los tiempos)"] <- "Inducida"
Calcular los porcentajes por categoría y estado civil
porcentajes <- mbaja %>%
  group_by(`Estado Civil`, `Motivo de Baja`) %>%
  summarise(Frecuencia = n()) %>%
  group_by(`Estado Civil`) %>%
  mutate(Pct = scales::percent(Frecuencia / sum(Frecuencia)))
## `summarise()` has grouped output by 'Estado Civil'. You can override using the
## `.groups` argument.

Motivo de Baja y Estado Civil

plot <- ggplot(porcentajes, aes(x = `Estado Civil`, y = Frecuencia, fill = `Motivo de Baja`)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  theme(
    panel.grid.major = element_line(color = "grey", linewidth = 0.4, linetype = "dotted"),  # Líneas verticales
    panel.grid.minor = element_line(color = "grey", linewidth = 0.4, linetype = "dotted")  # Líneas horizontales
  )+
  ggtitle("Relación entre Motivo de Baja y Estado Civil")
Agregar etiquetas de porcentaje
plot + geom_text(aes(label = Pct), position = position_stack(vjust = 0.5),size=2)

Resultados

Por lo que podemos ver en la gráfica, la gran mayoría de las bajas en todas las categorías son por separación voluntaria y realmente no se logra ver una correlación entre el estado civil de la persona y el motivo de baja, lo que podría indicar una alta rotación de empleados en los trabajos de maquila en general o podría ser un indicador de que hay varias áreas de oportunidad en cuestión de amenidades, salarios, bonos, oportunidades de crecimiento en la empresa, traslado o prestaciones que la empresa ofrece además de las básicas dictadas por la ley.

Pregunta 2

¿Cuál es la relación entre la edad y las bajas?

Carga de datos
#file.choose()
bajas<-read_csv("/Users/davidcavazos/Desktop/Analitica/R/Reto/Datos/EV1_ENTREGABLE 3/form_bajas_22.csv")
## Rows: 238 Columns: 25
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (23): APELLIDOS, NOMBRE, FECHA DE NACIMIENTO, GENERO, RFC, FECHA DE ALTA...
## dbl  (2): DIAS LABORADOS, SALARIO DIARIO IMSS
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Modificación de base de datos
#Estoy creando un data frame nuevo con las columnas necesarias para hacer la gráfica

bajas1 <- select(bajas,"NOMBRE","APELLIDOS","FECHA DE NACIMIENTO","DIAS LABORADOS","SALARIO DIARIO IMSS") %>% na.omit(bajas1)
#view(bajas1)

Estadísiticos Descriptivos

Dias Laborados
summary(bajas1$`DIAS LABORADOS`)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    8.75   19.00   80.00   49.25 1966.00
Salario
summary(bajas1$`SALARIO DIARIO IMSS`)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   144.4   180.7   180.7   177.7   180.7   500.0
Edad de colaboradores
#Aquí reviso que formato tienen las columnas 

str(bajas1)
## tibble [212 × 5] (S3: tbl_df/tbl/data.frame)
##  $ NOMBRE             : chr [1:212] "MARIA FERNANDA" "EMANUEL" "TRINIDAD" "WILMAR" ...
##  $ APELLIDOS          : chr [1:212] "JIMENEZ ALANIS" "JAUREGUI SANCHEZ" "GARCIA CAZARES" "LOPEZ ROMERO" ...
##  $ FECHA DE NACIMIENTO: chr [1:212] "7/10/1998" "10/3/1998" "5/25/1997" "9/4/2001" ...
##  $ DIAS LABORADOS     : num [1:212] 423 35 102 63 34 23 30 6 0 141 ...
##  $ SALARIO DIARIO IMSS: num [1:212] 177 181 181 177 181 ...
##  - attr(*, "na.action")= 'omit' Named int [1:26] 8 27 28 58 67 110 135 136 137 141 ...
##   ..- attr(*, "names")= chr [1:26] "8" "27" "28" "58" ...
#Aquí estoy haciendo una extracción del año de nacimiento excluyendo los días y meses. 

#Decidí hacer esto porque hay filas en las que está escrito M/D/A y otras D/M/A


bajas1$ANIO<-str_sub(bajas1$`FECHA DE NACIMIENTO`,-4,-1)

#Convirtiendo la columna de "ANIO" en integer

bajas1$ANIO <- as.integer(bajas1$ANIO)

str(bajas1)
## tibble [212 × 6] (S3: tbl_df/tbl/data.frame)
##  $ NOMBRE             : chr [1:212] "MARIA FERNANDA" "EMANUEL" "TRINIDAD" "WILMAR" ...
##  $ APELLIDOS          : chr [1:212] "JIMENEZ ALANIS" "JAUREGUI SANCHEZ" "GARCIA CAZARES" "LOPEZ ROMERO" ...
##  $ FECHA DE NACIMIENTO: chr [1:212] "7/10/1998" "10/3/1998" "5/25/1997" "9/4/2001" ...
##  $ DIAS LABORADOS     : num [1:212] 423 35 102 63 34 23 30 6 0 141 ...
##  $ SALARIO DIARIO IMSS: num [1:212] 177 181 181 177 181 ...
##  $ ANIO               : int [1:212] 1998 1998 1997 2001 2002 2000 2000 1999 2002 1994 ...
##  - attr(*, "na.action")= 'omit' Named int [1:26] 8 27 28 58 67 110 135 136 137 141 ...
##   ..- attr(*, "names")= chr [1:26] "8" "27" "28" "58" ...
#Aquí creó una nueva columna llamada "EDAD" restando el año actual con el de "ANIO

bajas1$EDAD <- 2023-bajas1$ANIO

#Había un error en el cual existían tres filas que tenían edad de 1 por lo cual le pedí que solo mostrara los que son mayor a 18.

bajas1 <- bajas1[bajas1$EDAD >18,]

Bajas por Edad

hist(bajas1$EDAD,col = blues9,xlab = "Edad",ylab ="Frecuencia" ,main = "Bajas por Edad")

Resultados

Nos damos cuenta de que la rotación de personal se ve más alta en los colaboradores más jóvenes. Esto es información útil ya que nos permite tomar decisiones adecuadas para mejorar la satisfacción laboral en específico para estos rangos de edades. Con esta gráfica podemos entrar más a detalle en el área de oportunidad y así entender las razones de la alta rotación. Nos damos cuenta de que se tiene que hacer un esfuerzo por mejorar la relación con las nuevas generaciones o contratar a personas mayores.

Pregunta 3

¿De que edad frecuentan ingresar los empleados a FORM?

Carga de datos
rh <- read.csv("/Users/davidcavazos/Desktop/Analitica/R/Reto/Datos/EV1_ENTREGABLE 3/form_rh_datos.csv")

#View(rh)

edad <- select(rh,"FECHA.DE.ALTA", "FECHA.DE.NACIMIENTO") 

#str(rh)
Modificacion de Datos
rh$año_alta <- str_sub(rh$FECHA.DE.ALTA, -4, -1) 
rh$año_nac <- str_sub(rh$FECHA.DE.NACIMIENTO, -4, -1)
rh$año_alta <- as.integer(rh$año_alta)
rh$año_nac <- as.integer(rh$año_nac)

rh <- rh[rh$año_alta > 2013,]
rh <- rh[-30,]
Calcular la edad de ingreso y Medidas de Dispersion
rh$edad_ingreso <- rh$año_alta - rh$año_nac
rh <- rh[rh$edad_ingreso > 18,]

edad_de_ingreso_max <- max(rh$edad_ingreso)
print(edad_de_ingreso_max)
## [1] 60
edad_de_ingreso_min <- min(rh$edad_ingreso)
print(edad_de_ingreso_min)
## [1] 19
edad_de_ingreso_mean <- mean(rh$edad_ingreso)
print(edad_de_ingreso_mean)
## [1] 34.92308

Altas por Edad

hist(rh$edad_ingreso,col = "#009E73" ,xlab = "Edad",main = "Alta por Edad")

Altas de Mujeres/Hombres

## Cantidad de Hombres o Mujeres dados de Alta
ggplot(rh, aes(edad_ingreso, fill = GENERO)) + 
  geom_histogram(bins=10) + 
  labs(y="") 

Resultados

Relación Edad y genero en las Bajas de Empleados

Podemos analizar en las graficas que la edad más comun para ingresar a trabajar a FORM es entre los 25 - 30 lo que nos puede ayudar a crear campañas de reclutamiento enfocadas en el mercado de edad al que los empleados de FORM estan enfocados, FORM cuenta con un gran rango de edades comenzando desde los 19 y llegando hasta los 60. Este ultimo siendo el grupo mas pequeño dentro de la empresa mientras que los jovenes de 18 - 20 tienden a ser un porcentaje más alto de hombres. Nos damos cuenta con la grafica que FORM le abre las puertas a muchas personas y ofrece oportunidades de trabajo para nuevas generaciones y personas con experiencia

Pregunta 4

¿Existen tendencias de bajas?

Importar datasets

bajas = read.csv("/Users/davidcavazos/Desktop/Analitica/R/Reto/Datos/EV1_ENTREGABLE 3/form_bajas_22.csv")
dfbajas = bajas 

#Limpieza Dataset
bajas$ESTADO.CIVIL = gsub("MATRIOMONIO", "MATRIMONIO", bajas$ESTADO.CIVIL)

Frecuencia de Días Laborados

hist(bajas$DIAS.LABORADOS, col = blues9, xlab = "DIAS LABORADOS", ylab = "Frecuencia", main = "Días Laborados", xlim = c(0, 1000))

Separación de Fechas - Bajas

df_rotacion = bajas %>% select(GENERO, FECHA.DE.ALTA,BAJA, MOTIVO.DE.BAJA, DIAS.LABORADOS, PUESTO)
df_rotacion = df_rotacion %>% separate(BAJA, into = c("MONTH_BAJA", "DAY_BAJA", "YEAR_BAJA"), sep = "/")
## Warning: Expected 3 pieces. Missing pieces filled with `NA` in 15 rows [27, 28, 58, 135,
## 137, 141, 151, 178, 179, 198, 203, 205, 207, 212, 238].
Separación de Fechas - Altas
df_rotacion = df_rotacion %>% separate(FECHA.DE.ALTA, into = c("MONTH_ALTA", "DAY_ALTA", "YEAR_ALTA"), sep = "/")
## Warning: Expected 3 pieces. Missing pieces filled with `NA` in 1 rows [238].
Asignación Meses
df_months <- df_rotacion %>%
  mutate(NAME_MONTH = case_when(
    MONTH_BAJA == 1 ~ "Enero",
    MONTH_BAJA == 2 ~ "Febrero",
    MONTH_BAJA == 3 ~ "Marzo",
    MONTH_BAJA == 4 ~ "Abril",
    MONTH_BAJA == 5 ~ "Mayo",
    MONTH_BAJA == 6 ~ "Junio",
    MONTH_BAJA == 7 ~ "Julio",
    MONTH_BAJA == 8 ~ "Agosto",
    MONTH_BAJA == 9 ~ "Septiembre",
    MONTH_BAJA == 10 ~ "Octubre",
    MONTH_BAJA == 11 ~ "Noviembre",
    MONTH_BAJA == 12 ~ "Diciembre"
  )) %>%
  filter(NAME_MONTH %in% c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")) %>%
  select(GENERO, MONTH_BAJA, DAY_ALTA, YEAR_ALTA, MOTIVO.DE.BAJA, NAME_MONTH, PUESTO)

Cantidad de Bajas por Mes

barplot_subcategory <- ggplot(df_months, aes(x = NAME_MONTH)) +
  geom_bar(fill = "#F46C22", width = 0.5) +
  ggtitle("Bajas por Mes")

barplot_subcategory +
  labs(title = "Bajas por Mes") +
  theme(panel.grid = element_blank(),panel.background = element_blank(), plot.title = element_text(hjust = 0.5, face = "bold")) + xlab("Meses") +
  ylab("Cantidad de Bajas")

Cantidad de Bajas por Puesto

frequency_puesto = table(df_months$PUESTO)
df_frequency_puesto = as.data.frame(frequency_puesto)
colnames(df_frequency_puesto) <- c("Puesto", "Cantidad")

df_frequency_puesto <- df_frequency_puesto %>%
  arrange(desc(Cantidad))

kable(df_frequency_puesto, format = "html", escape = FALSE, 
      table.attr = 'style="font-family: Arial, sans-serif;"')
Puesto Cantidad
AYUDANTE GENERAL 170
SOLDADOR 12
COSTURA 10
AYUDANTE DE EMBARQUES 7
MONTACARGUISTA 5
INSPECTOR CALIDAD 3
RESIDENTE 3
MATERIALISTA 2
ANALISTA DE NOMINAS 1
CHOFER 1
CORTADOR 1
DISEÑO 1
FACTURACION 1
GUARDIA SEGURIDAD 1
JEFE DE SEGURIDAD E HIGIENE 1
LIMPIEZA 1
MANTENIMIENTO 1
MARCADORA 1
SERVICIO AL CLIENTE 1

Resultados

Tendencias de Baja de Empleados

Analizando directamente la cantidad de bajas por mes podemos ver que existe una alta inclinación de bajas de empleados en su en el mes de Enero y en su contraparte Noviembre es el mes con menor número de bajas, al excluir el mes de Diciembre que no cuenta con ninguna baja registrada. Por lo que se plantéa la hipótesis la cual FORM menciono durante las sesiones de información general de la empresa, “Los empleados se quedan para recibir su aguinaldo/bono y despúes se van”, por lo que se puede mencionar una asociación de los datos pero todavía no una causalidad de los mismos.

Hallzagos y Sugerencias

Hallazgos principales

Puesto de Ayudante General

Desde el contexto nosotros conocemos que uno de los problemas principales de FORM es su alta rotación de empleados en específico los empleados operativos. Un hallazgo importante que entendimos a través de esta investigación de datos fue que el puesto de ayudante general es el que más frecuentemente se da de baja. Este es un dato crítico ya que nos permite entrar más a detalle la raíz del problema y así hacer modificaciones necesarias para mejorar.

Relación con Jovenes

Podemos concluir que hay una gran cantidad de jóvenes entre 18-30 años que constantemente son bajas en FORM.De todos los empleados esta es la categoría más afectada. Es importante considerar esta información para el desarrollo de estrategias de satisfacción laboral. Es importante satisfacer las necesidades específicas de los jóvenes ya que estas pueden ser diferentes a las de los mayores.

Reclutamiento

Considerando que las edades más frecuentes de sus altas son jóvenes de 18 - 30 años es importante considerar esto para sus estrategias de reclutamiento.

Alta rotacion de Mujeres

Vemos como hay una alta rotación específicamente en mujeres, esto probablemente debido a que contratan más mujeres que hombres en ciertos puestos de trabajo específicos. Sin embargo considero que es un hallazgo importante ya que nos permite entender una área de oportunidad específica en la podemos diseñar una estrategia para mejorar la satisfacción laboral de las mujeres.

Satisfacción laboral

La mayor área de oportunidad que tiene FORM es mejorar su satisfacción laboral, desde los ángulos anteriores podemos interpretar que este es uno de los problemas que predominan en la empresa. El tener insatisfacción laboral baja la productividad, la eficiencia y sube la rotación aumentando los gastos de la empresa.

Necesidad de datos

A través de esta investigación podemos concluir que faltan más datos para poder continuar con una propuesta. Por el momento solo conocemos que colaboradores son los que tienen más frecuencia de bajas sin embargo para conocer el porqué necesitamos datos cualitativos de los empleados actuales.

Sugerencias de Profesionales

Fundamentación

Se busca siempre tener los fundamentos correctos al momento de analizar, es importante en todos los pasos desde la recopilación, hasta la visualización tener en mente que tu proyecto esté fundamentado, porque de esa manera es más fácil justificar una propuesta o posible solución.

Visualización e Interpretación

Se busca que la visualización de datos siempre sea fácil de entender e interpretar, en un ambiente laboral mientras más simples y directos sean los datos y sus diferentes tipos de gráficos/tablas es mejor para la persona que tiene que tomar decisiones usando esa información.

LS0tCnRpdGxlOiAiRXZpZGVuY2lhIDEiCmF1dGhvcjogIkRhdmlkIENhdmF6b3MgQTAxMTc3MjM4IgpkYXRlOiAiMjAyMy0wOC0yNSIKb3V0cHV0OiAKIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6ICJ5ZXRpIgotLS0KCiFbIF0oL1VzZXJzL2RhdmlkY2F2YXpvcy9EZXNrdG9wL0FuYWxpdGljYS9SL1JldG8vRGF0b3MvRVYxX0VOVFJFR0FCTEUgMy9TY3JlZW5zaG90IDIwMjMtMDktMTEgYXQgMTEuMTUuMjIgYS5tLi5wbmcpCgojIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqRW50cmVnYWJsZSAxKioKCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqQW50ZWNlZGVudGVzIGRlIGxhIGVtcHJlc2EqKgoKKipWaXNpw7NuOioqICDigJxFbiAyMDMzIHNlcmVtb3MgdW5hIGRlIGxhcyBjaW5jbyBtZWpvcmVzIGNvbXBhw7HDrWFzIGRlIE3DqXhpY28gcXVlIGdlbmVyYW4gdmFsb3IgZGVudHJvIGRlIGxhIGNhZGVuYSBkZSBzdW1pbmlzdHJvIGRlIGxhcyBpbmR1c3RyaWFzIHF1ZSBtw6FzIHZhbG9yYW4gbGEgZm9ybWEgZW4gbGEgcXVlIHNlIHByb3RlZ2VuIHkgdHJhc2xhZGFuIGxhcyBjb3Nhcy7igJ0gKEZvcm0sIDIwMjMpLgoKKipNaXNpw7NuOioqIOKAnFRyYW5zZm9ybWFyIG51ZXN0cm8gZW50b3JubyB5IHJlc29sdmVyIHJldG9zIGluZHVzdHJpYWxlcyBkZSBudWVzdHJvcyBjbGllbnRlcyBhIHRyYXbDqXMgZGUgbGEgY29sYWJvcmFjacOzbiwgcHJvdm9jYW5kbyBudWV2YXMgb3BvcnR1bmlkYWRlcyBxdWUgcG90ZW5jaWFuIG51ZXN0cm8gbW9kZWxvIGRlIG5lZ29jaW8sIHBhcmEgYWxjYW56YXIgbnVlc3Ryb3MgaWRlYWxlcy7igJ0gKEZvcm0sIDIwMjMpLiAKCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqQ29udGV4dG8gZGUgbGEgaW5kdXN0cmlhKio6CkxhIGluZHVzdHJpYSBkZSBlbXBhcXVlIHkgZW1iYWxhamUgcmVwcmVzZW50YSB1bmEgcGFydGUgZXNlbmNpYWwgZGVsIHNlY3RvciBhdXRvbW90cml6IHkgZGUgYXV0b3BhcnRlcywgeWEgcXVlIGVzdGEgaW5kdXN0cmlhIGVzIHBpZXphIGNsYXZlIHBhcmEgZ2FyYW50aXphciBsYSBwcm90ZWNjacOzbiB5IGVudHJlZ2EgZWZpY2llbnRlIGRlIGxvcyBjb21wb25lbnRlcyBhdXRvbW90cmljZXMgZW4gc3VzIGRpZmVyZW50ZXMgZmFzZXMgZGVudHJvIGRlIGxhIGNhZGVuYSBkZSBzdW1pbmlzdHJvIGRlbCBzZWN0b3IgYXV0b21vdHJpei4gCgpFbiBlbCAyMDIyLCBsYSBwcm9kdWNjacOzbiBkZSBhdXRvbcOzdmlsZXMgZW4gZWwgbXVuZG8gbWFudGllbmUgYSBFc3RhZG9zIFVuaWRvcyBjb21vIGVsIHNlZ3VuZG8gbWF5b3IgcHJvZHVjdG9yIGRlIGF1dG9tw7N2aWxlcyBhYmFyY2FuZG8gZWwgMTMuNCUgZGUgbGEgaW5kdXN0cmlhICB5IE3DqXhpY28gY29tbyA3bW8gbWF5b3IgcHJvZHVjdG9yIGNvbiBlbCA0LjYlLiAoVkRBLDIwMjMpIAoKVG9tYW5kbyDDqXN0byBlbiBjdWVudGEgc2FiZW1vcyBxdWUgZWwgcm9sIGRlIE3DqXhpY28gZW4gbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXogZXMgZGUgc3VtYSByZWxldmFuY2lhIHBhcmEgZWwgbXVuZG8geSBwb3IgY29uc2lndWllbnRlIHBhcmEgbnVlc3RybyBwYcOtcywgcmVwcmVzZW50YW5kbyBlbCAyLjc3JSBkZWwgUHJvZHVjdG8gSW50ZXJubyBCcnV0byAoUElCKSBkZSBNw6l4aWNvIGVuIGVsIDIwMjIuIChJTkVHSSwyMDIzKQoKTGEgcGFuZGVtaWEgdHV2byB1biBpbXBhY3RvIGZ1ZXJ0ZSBlbiBsYSBpbnZlcnNpw7NuIGV4dHJhbmplcmEgZGlyZWN0YSBkZSBsYSBpbmR1c3RyaWEgYXV0b21vdHJpeiBjb24gdW5hIHJlZHVjY2nDs24gZGUgMi4xNyBtaWwgbWlsbG9uZXMgZGUgZMOzbGFyZXMgZGVsIDIwMjAgYWwgMjAyMSB5IG5hdHVyYWxtZW50ZSBzZSB2aW8gYWZlY3RhZGEgbGEgcHJvZHVjY2nDs24gZGUgdmVow61jdWxvcyBjb24gdW5hIGRpc21pbnVjacOzbiBkZSBwcm9kdWNjacOzbiBkZSAgMy44IG1pbGxvbmVzIGRlIHVuaWRhZGVzIGEgMi45IG1pbGxvbmVzIGRlIHVuaWRhZGVzIGFsIGHDsW8gMjAyMC4gU2luIGVtYmFyZ28sIHNlIGVzdGltYSBxdWUgbGEgcmVjdXBlcmFjacOzbiBkZSBsYSBwcm9kdWNjacOzbiBkZSBsYSBpbmR1c3RyaWEgYXV0b21vdHJpeiBzZXLDoSBoYXN0YSBlbCAyMDI2IGNvbiAzLjggbWlsbG9uZXMgZGUgdW5pZGFkZXMgYSBwcm9kdWNpciwgaWd1YWxhbmRvIGxhIHByb2R1Y2Npw7NuIGRlbCAyMDE5LiAoSUhTIE1hcmtldCwgMjAyMCkgCgojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiAqKlNvY2lvIEZvcm1hZG9yIEZvcm0qKgoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEludHJvZHVjY2nDs24gZGUgbGEgRW1wcmVzYQoKRk9STSBlcyB1bmEgZW1wcmVzYSBjb24gc2VkZSBwcmluY2lwYWwgZW4gTnVldm8gTGXDs24sIMOpc3RhIHNlIGRlZGljYSBhbCBlbXBhcXVlIHkgZW1iYWxhamUgZGUgYXV0b3BhcnRlcyBlc3BlY8OtZmljYW1lbnRlIGRlIHBhcnRlcyBpbnRlcmlvcmVzIHkgZWzDqWN0cmljYXMgZGUgbG9zIHZlaMOtY3Vsb3MsIGxhcyBjdWFsZXMgZXMgZGUgc3VtYSBpbXBvcnRhbmNpYSBxdWUgbm8gcmVjaWJhbiBuaW5nw7puIHRpcG8gZGUgZGHDsW8gZXN0w6l0aWNvIGVuIHN1IHByb2Nlc28gZGUgdHJhbnNwb3J0YWNpw7NuIHBhcmEgc3UgZW5zYW1ibGFqZS4gCgpGT1JNIHNlIGNlbnRyYSBlbiBhYmFzdGVjZXIgbGFzIG5lY2VzaWRhZGVzIGRlIGxvcyBwcm92ZWVkb3JlcyBUaWVyIDEgKHBsYW50YSBhdXRvbW90cml6KSB5IFRpZXIgMiAocHJvdmVlbiBwYXJ0ZXMgYSBsYXMgcGxhbnRhcykgZGUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXosIHBvciBsbyBxdWUgZXN0b3Mgc29uIHN1cyBwcmluY2lwYWxlcyBjbGllbnRlcy4KCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBQcm9kdWN0b3MvU2VydmljaW9zCgpMYSBlbXByZXNhIG5vIG9mcmVjZSB1biBwb3J0YWZvbGlvIGRlIHByb2R1Y3RvcyBmaWpvcyBvIGVzdGFuZGFyaXphZG9zIHBhcmEgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXouIEZPUk0gYnVzY2EgZ2VuZXJhciBzb2x1Y2lvbmVzIGEgbGFzIG5lY2VzaWRhZGVzIHkgcHJvYmxlbWFzIGRlIHN1cyBjbGllbnRlcyBkZW50cm8gZGUgbGEgY2FkZW5hIGRlIHN1bWluaXN0cm8sIHBvciBtZWRpbyBkZSBsYSBpbm5vdmFjacOzbiBpbmdlbmllcmlsICBlbiBlbCBlbXBhcXVlIGRlIGxhcyBhdXRvcGFydGVzLiAKCkFkZW3DoXMsIEZPUk0gb2ZyZWNlIHVuIHNlcnZpY2lvIGRlIGFjb21wYcOxYW1pZW50byBlbCBjdWFsIGZ1bmNpb25hIGNvbW8gdW4gc29wb3J0ZSBkZSBjb211bmljYWNpw7NuIGVuIGVsIHF1ZSBlbXBsZWFkb3MgZGUgRk9STSwgIHB1ZWRlbiBhc2lzdGlyIGRpcmVjdGFtZW50ZSBlbiBsYSBwbGFudGEgZGUgbG9zIGNsaWVudGVzIHBhcmEgbGEgZW50cmVnYSBkZSBsb3MgZW1wYXF1ZXMgeSBlbnNhbWJsYWplIGhhc3RhIHRlbmVyIGNvbXVuaWNhY2nDs24gY29udGludWEgY29uIGxhIGVtcHJlc2EgZW4gY2FzbyBkZSBjdWFscXVpZXIgc2l0dWFjacOzbi4gCgpMYXMgY29zYXMgYW50ZXMgbWVuY2lvbmFkYXMgZm9ybWFuIHBhcnRlIGRlIGxhIHByb3B1ZXN0YSBkZSB2YWxvciBkZSBsYSBlbXByZXNhLCBhcGFsYW5jYW5kbyBkZSBsYSBpbm5vdmFjacOzbiB5IGVsIHNlcnZpY2lvIGFsIGNsaWVudGUgc2UgYnVzY2EgYXNlZ3VyYXIgbGEgY2FsaWRhZCBsYSBjdWFsIGxvcyBjbGllbnRlcyBkZSBGT1JNIGVzdMOhbiBidXNjYW5kbyBkZWJpZG8gYSBsYSBpbXBvcnRhbmNpYSB5IGRlbGljYWRlemEgcXVlIHRvbWFuIGxhcyBhdXRvcGFydGVzIGludGVyaW9yZXMgeSBlbMOpY3RyaWNhcyBkZW50cm8gZGUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXouCgpBdW5xdWUgbG9zIHByb2R1Y3RvcyBxdWUgb2ZyZWNlIEZPUk0gZGVudHJvIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IGZ1bmdlbiBwYXJlY2lkbyBhIHVuIGNvbW1vZGl0eSwgZWwgZW1wYXF1ZSBzZSBsbGVnYSBhIHByb2R1Y2lyIGVuIGdyYW5kZXMgY2FudGlkYWRlcywgZXN0b3Mgbm8gZW50cmFuIGNvbW8gdGFsIGVuIGxhIGRlZmluaWNpw7NuIGRlIGNvbW1vZGl0eSB5YSBxdWUgZW4gZWwgY2FzbyBkZSBGT1JNIGVudHJhIHVuYSBwYXJ0ZSBjbGF2ZSBsYSBjdWFsIGVzIGxhIHBlcnNvbmFsaXphY2nDs24uCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gUGVyc3BlY3RpdmFzIEZ1dHVyYXMKCkFjdHVhbG1lbnRlIEZPUk0gYnVzY2EgZXF1aXBhciBjb24gdGVjbm9sb2fDrWEgcGFyYSBhdXRvbWF0aXphciB5IGRlc2Fycm9sbGFyIHRvZG8gdW4gYW1iaWVudGUgZGUgZGF0b3MgZWwgY3VhbCBsZXMgcHVlZGEgYXl1ZGFyIGEgYWdpbGl6YXIgcHJvY2Vzb3MgeSBkYXIgY2VydGV6YSBhIGxhIHRvbWEgZGUgZGVjaXNpb25lcyBlbiBiYXNlIGEgZGF0b3MuIENvbiBlc3RvIGJ1c2NhbiBwb2RlciByZWFsaXphciBwcm9uw7NzdGljb3MgcGFyYSBhbnRpY2lwYXIgbGEgZGVtYW5kYSBkZSBzdXMgY2xpZW50ZXMgeSBkaXZlcnNpZmljYXIgZGVudHJvIGRlIEVVQSwgZXN0byBwb3IgbWVuY2lvbmFyIGFsZ3VubyBkZSBsb3MgZWplbXBsb3MuICBFbiBjdWFudG8gYSB0ZW1hcyBkZSBjdWx0dXJhIG9yZ2FuaXphY2lvbmFsIHNlIGJ1c2NhIG1lZGlyIHNpc3RlbcOhdGljYW1lbnRlIGRpZmVyZW50ZXMgS1BJwrRzLiAKCgpBZGVtw6FzIGRlIGVzdG8sIHNlIGJ1c2NhIGNyZWFyIHVuIHNlbnRpZG8gZGUgcGVydGVuZW5jaWEgeSBsZWFsdGFkIGRlIGxvcyBlbXBsZWFkb3MgaGFjaWEgbGEgZW1wcmVzYS4gQnVzY2FuZG8gY29udGludWFyIGNvbiBsYSBjdWx0dXJhIG9yZ2FuaXphY2lvbmFsIGFjdHVhbCwgbGEgY3VhbCBlc3TDoSBlbmZvY2FkYSBlbiBsYSBob3Jpem9udGFsaWRhZCwgbGEgY29uc3RydWNjacOzbiBkZSBlcXVpcG9zIHkgZGl2aXNpb25lcyBhdXTDs25vbWFzIGEgbml2ZWxlcyBpbmZlcmlvcmVzIGRlbnRybyBkZSBsYSBlbXByZXNhLiBFc3RvLCBjb24gZWwgZmluIGRlIHBlcm1pdGlyIHVuYSBjb211bmljYWNpw7NuIG3DoXMgZWZlY3RpdmEgeSBmbHVpZGEgZW50cmUgZGVwYXJ0YW1lbnRvcy4KIAojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gRXhwYW5zacOzbgoKQWN0dWFsbWVudGUgRk9STSBidXNjYSB1biBjcmVjaW1pZW50bywgZGVzZWEgY29udGludWFyIGNvbiBsYSBpbmR1c3RyaWEgZGUgYXV0b3BhcnRlcywgcG9yIGxvIHF1ZSBzdSBwcmluY2lwYWwgZW5mb3F1ZSBzZSBlbmN1ZW50cmEgZW4gY3JlY2VyIGEgbG8gbGFyZ28gZGUgbGEgbMOtbmVhIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IHF1ZSBzZSBlbmN1ZW50cmEgdWJpY2FkYSBlbiBlbCB0ZXJyaXRvcmlvIG1leGljYW5vIHkgZXN0YWRvdW5pZGVuc2UuIEVzcGVjw61maWNhbWVudGUsIGJ1c2NhIGNyZWNlciBlbiBlbCBiYWrDrW8gbWV4aWNhbm8geSBlbiBTYW4gQW50b25pbyBUZXhhcyBlbiBlbCBleHRyYW5qZXJvLiBQb3Igb3RyYSBwYXJ0ZSwgYnVzY2EgZXhwbG9yYXIgb3RyYXMgaW5kdXN0cmlhcyBsYXMgY3VhbGVzIHNlIGFsaW5lZW4gYSBzdSBtaXNpw7NuLCBjb21vIGxvIHB1ZWRlIHNlciAgbGEgYWVyb2VzcGFjaWFsIHkgZGUgZXF1aXBvcyBtw6lkaWNvcy4gCgpBZGVtw6FzIGJ1c2NhIGV4cGFuZGlyIHN1cyBpbnZlcnNpb25lcyBlbiBlbCBleHRyYW5qZXJvIHRvbWFuZG8gY29tbyBvcGNpw7NuIHByaW5jaXBhbCBhIEVzdGFkb3MgVW5pZG9zLiBCdXNjYW5kbyBjcmVjZXIgYSBjdWFscXVpZXIgcGFydGUgZGUgVGV4YXMgZGViaWRvIGEgZWwgY29zdG8gZGUgb3BvcnR1bmlkYWQgcXVlIHNlIHRpZW5lLCBzaSBzZSBidXNjYSBjcmVjZXIgbcOhcyBhbGzDoSBkZSBUZXhhcyBhdW1lbnRhIGxvcyBjb3N0b3MgZGUgZmxldGVzIHkgZWwgbmVnb2NpbyBubyBzYWxlIGNvbiBidWVuIG1hcmdlbi4gRk9STSBubyBidXNjYSBzZXIgbGEgZW1wcmVzYSBtYXMgZ3JhbmRlLCBzZSBjb25jZW50cmEgZW4gbmVnb2Npb3MgZGUgUFlNRSBjb24gZ3JhbmRlcyBtYXJnZW5lcyBkZSBnYW5hbmNpYQoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEN1bHR1cmEgb3JnYW5pemFjaW9uYWwgeSBSSAoKSG95IGVuIGTDrWEgY3VlbnRhbiBjb24gMTMwIGNvbGFib3JhZG9yZXMgZGVudHJvIGRlIGxhIGVtcHJlc2EsIHNpbiBlbWJhcmdvIGV4aXN0ZSB1biB0ZW1hIGRlIHJvdGFjacOzbiBkZSBwZXJzb25hbCBwb3IgZGl2ZXJzYXMgcmF6b25lcywgdW5vIGRlIHN1cyBlbmZvcXVlcyBlcyBjcmVhciB1bmEgY3VsdHVyYSBvcmdhbml6YWNpb25hbCBsYSBjdWFsIHJldGVuZ2EgYWwgY2FwaXRhbCBodW1hbm8uIAoKQWN0dWFsbWVudGUgb2ZyZWNlbiBkaXZlcnNhcyBjb21wZW5zYWNpb25lcyB5IGJlbmVmaWNpb3MgcGFyYSBpbmNpdGFyIGxhIGFjdGl2YSBwYXJ0aWNpcGFjacOzbiBkZSBzdXMgY29sYWJvcmFkb3Jlcy4gU2UgY3VlbnRhbiBjb24gYmFzZXMgZGUgZGF0b3MgZW5mb2NhZGFzIGFsIHRlbWEgZGUgY2FwaXRhbCBodW1hbm8gY29uIGxhcyBjdWFsZXMgc2UgYnVzY2FuIGlkZW50aWZpY2FyIGxhcyByYXpvbmVzIGRlIGxhIHJvdGFjacOzbiwgc2luIGVtYmFyZ28gYcO6biBubyBoYW4gbG9ncmFkbyB2ZXIgdW4gZGVjcmVtZW50byBlbiBsb3MgcG9yY2VudGFqZXMgYW51YWxlcyBkZSByb3RhY2nDs24uCgpGT1JNIGN1ZW50YSBjb24gNiBwaWxhcmVzIHByaW5jaXBhbGVzLCBkZW50cm8gZGUgbGEgZW1wcmVzYSBzZSB2aXZlIHVuYSBhY3RpdHVkIGRlIGhvbmVzdGlkYWQgeSB0cmFuc3BhcmVuY2lhIGRlbnRybyBkZSB0b2RvcyBsb3MgcHJvY2Vzb3MsIHNlIGJ1c2NhIGN1aWRhciBkZXRhbGxhZGFtZW50ZSBsb3MgZXNwYWNpb3MgZGUgdHJhYmFqbyBjb24gcGxhbmVzIHBhcmEgaW1wbGVtZW50YXIgbnVldm9zIGJhw7FvcyBlbiBlbCBwaXNvLgoKIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gKipBbsOhbGlzaXMgZGUgbGFzIMOhcmVhcyBkZSBsYSBlbXByZXNhKioKCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gQ2FyZ2EgZGUgbGlicmVyaWFzCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ3JpZCkKbGlicmFyeShwc3ljaCkKbGlicmFyeShncGxvdHMpCmxpYnJhcnkoa25pdHIpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IENhcmdhIGRlIGRhdG9zCmBgYHtyfQoKI2ZpbGUuY2hvb3NlKCkKVmVudGFzXzEgPC0gcmVhZC5jc3YoIi9Vc2Vycy9kYXZpZGNhdmF6b3MvRGVza3RvcC9BbmFsaXRpY2EvUi9SZXRvL0RhdG9zL0VWMV9FTlRSRUdBQkxFIDMvVmVudGFzXzEuY3N2IikKCiNmaWxlLmNob29zZSgpCkJhamFzIDwtcmVhZC5jc3YoIi9Vc2Vycy9kYXZpZGNhdmF6b3MvRGVza3RvcC9BbmFsaXRpY2EvUi9SZXRvL0RhdG9zL0VWMV9FTlRSRUdBQkxFIDMvQmFqYXMuY3N2IikKCiNmaWxlLmNob29zZSgpCkZESV9kZiA8LSByZWFkLmNzdigiL1VzZXJzL2RhdmlkY2F2YXpvcy9EZXNrdG9wL0FuYWxpdGljYS9SL1JldG8vRGF0b3MvRVYxX0VOVFJFR0FCTEUgMy9GRElfTWV4aWNvLmNzdiIpCgpgYGAKCgoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEJhamFzIHBvciBQdWVzdG8geSBHZW5lcm8gKDIwMjEpCgpMb3MgYXl1ZGFudGVzIGdlbmVyYWxlcyBzb24gbG9zIHF1ZSBjdWVudGFuIG1heW9yIGJhamEgcG9yIHVuIG1hcmfDqW4gYWx0YW1lbnRlIGNvbnNpZGVyYWJsZSwgY29tbyBzZSBwdWVkZSBvYnNlcnZhciBlbiBsYSBncmFmw61jYSAxLiBBZGVtw6FzIGRlIGVzdG8gc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGRlIGlndWFsIGZvcm1hIGxhIG1heW9yw61hIGRlIHBlcnNvbmFzIGRlIGVzdMOhIHBvc2ljacOzbiBhIGxhcyBxdWUgc2UgbGVzIGRhIGRlIGJhamEgc29uIG11amVyZXMuIAoKUG9yIGxvIHF1ZSBzZSBwb2Ryw61hIHBsYW50ZWFyIHVuYSBwcmltZXIgaGlww7N0ZXNpcyBsYSBjdWFsIGVzIHF1ZSBlc3RvIHNlIHB1ZWRlIGRlYmVyIGEgcXVlIGxhIGdyYW4gcGFydGUgZGUgcGVyc29uYXMgcXVlIHNlIGNvbnRyYXRhbiBzb24gcGFyYSBlbCBwdWVzdG8gZGUgYXl1ZGFudGUgZ2VuZXJhbCB5IGRlIHNleG8gZmVtZW5pbm8sIHNpbiBlbWJhcmdvIHRvZGF2w61hIG5vIHNlIGhhIHJlYWxpemFkbyBlbCBhbsOhbGlzaXMgcGFyYSBjb21wcm9iYXIgbGEgaGlww7N0ZXNpcyBhbnRlcyBtZW5jaW9uYWRhLiAKCgoKYGBge3J9Cm9wdGlvbnMoc2NpcGVuID0gOTk5KSAKQmFqYXMkUFVFU1RPIDwtIGFzLmZhY3RvcihCYWphcyRQVUVTVE8pCgpnZ3Bsb3QoQmFqYXMsIGFlcyhQVUVTVE8pKSArCiAgZ2VvbV9iYXIoYWVzKGZpbGw9R0VORVJPKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgbGFicyh4ID0gIlB1ZXN0byIsIHkgPSAiQ2FudGlkYWQiLCB0aXRsZSA9ICJCYWphcyBwb3IgcHVlc3RvICIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTk4IikpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IFZlbnRhcyBwb3IgTMOtbmVhIGRlIE5lZ29jaW8gKDIwMjEpIApEZW50cm8gZGUgbGFzIHZlbnRhcyBwb3IgbGluZWEgZGUgbmVnb2NpbywgZXMgZGVjaXIgcmV0b3JuYWJsZSB5IGNhcnTDs24uIFNlIHB1ZWRlIG9ic2VydmFyIGNvbW8gbGEgbGluZWEgZGUgbmVnb2Npb3MgcXVlIGxpZGVyw6EgZXMgbGEgZGVsIGNhcnTDs24sIHNpbiBlbWJhcmdvIHNlIG9ic2VydmEgY29tbyBsYXMgdmVudGFzIGRlIHJldG9ybmFibGVzIHkgY2FydMOzbiBlbiBsb3MgcHJpbWVyb3MgMiBxdWFydGlsZXMgZGVsIGHDsW8gc29uIGFsdGFtZW50ZSBzdXBlcmlvcmVzIGFsIHJlc3RvIGRlbCBhw7FvLiAKCioqR3LDoWZpY28gMioqCgpgYGB7cn0KYXMuRGF0ZShWZW50YXNfMSRNZXMpCgpjb2xfcGVyIDwtIGMoImNvcmFsIiwgIm9yYW5nZSIpCgpnZ3Bsb3QoVmVudGFzXzEsIGFlcyh4ID0gTWVzLCB5ID0gVmVudGEsIGZpbGwgPSBQcm9kdWN0bykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGxhYnMoeCA9ICJNZXMiLCB5ID0gIlZlbnRhIiwgdGl0bGUgPSAiVmVudGFzIE1lbnN1YWxlcyBwb3IgUHJvZHVjdG8iKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sX3BlcikgKyAKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTk4IikgKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBJbnZlcnNpw7NuIEV4dHJhbmplcmEgcG9yIEHDsW8KCkxhIEludmVyc2nDs24gRXh0cmFuamVyYSAgRGlyZWN0YSBlbiBlbCBtaXNtbyBhw7FvICgyMDIxKSwgdHV2byBmdWVydGVzIGFmZWN0YWNpb25lcyBkZWJpZG8gYWwgQ09WSUQtMTksIHBvciBsbyBxdWUgcG9kcsOtYSBzZXIgdW5hIGRlIGxhcyByYXpvbmVzIHBvciBsYXMgY3VhbGVzIGVuIGxhIEdyYWbDrWNhIDIgbGFzIHZlbnRhcyBkZSBsb3MgdWx0w61tb3MgMiBjdWFydGlsZXMgZGVsIGHDsW8gaGF5YW4gY2HDrWRvIGRlIG1hbmVyYSBjb25zaWRlcmFibGUgYSBjb21wYXJhY2nDs24gZGVsIGluaWNpbyBkZWwgYcOxby4gCgoqKkdyw6FmaWNvIDMqKgoKYGBge3J9CmRmX0ZESSA9IEZESV9kZgoKI1NlcGFyYXIgQ29sdW1uYXMKZGZfRkRJIDwtIHNlcGFyYXRlKGRmX0ZESSwgUXVhcnRpbCwgaW50byA9IGMoIlF1YXJ0aWwiLCAiQcOxbyIpLCBzZXAgPSAiICIpCgojRkRJIHN1bWFkbyBwb3IgQcOxbwphw7FvX3N1bSA8LSBkZl9GREkgJT4lIGdyb3VwX2J5KEHDsW8pICU+JSBzdW1tYXJpemUoc3VtYT1zdW0oTWlsLk1pbGxvbmVzLmRlLkRvbGFyZXMpKQoKYcOxb19zdW0kQcOxbyA8LSBhcy5udW1lcmljKGHDsW9fc3VtJEHDsW8pCgpncmFmaWNvX2HDsW8gPSBnZ3Bsb3QoYcOxb19zdW0sIGFlcyh4ID0gQcOxbywgeSA9IHN1bWEpKSArCiAgZ2VvbV9saW5lKCBjb2xvciA9ICIjRjQ2QzIyIikgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiI0Y0NkMyMiIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3VtYSksIGhqdXN0ID0gLTAuMiwgdmp1c3QgPSAwLjUsIGNvbG9yID0gIiM1MDUwNTAiLCBzaXplID0gNCkgKyAgCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpw7NuIEV4dHJhbmplcmEgRGlyZWN0YSBwb3IgQcOxbyIsc3VidGl0bGUgPSAiTWlsIE1pbGxvbmVzIGRlIETDs2xhcmVzIiwgeCA9ICJBw7FvIiwgeSA9ICJJbnZlcnNpw7NuIiwgY2FwdGlvbiA9ICJGdWVudGU6IElORUdJIikgKyAKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjNTA1MDUwIiksIHBhbmVsLmdyaWQubWFqb3IgPSAgICAgIGVsZW1lbnRfYmxhbmsoKSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41LCBzaXplID0gNykpIAoKZ3JhZmljb19hw7FvICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGHDsW9fc3VtJEHDsW8pCmBgYAoKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBGT0RBIENydXphZG8KRWwgb2JqZXRpdm8gZGVsIGFuw6FsaXNpcyBGT0RBIHBhcmEgRk9STSBlcyBldmFsdWFyIGRlIG1hbmVyYSBpbnRlZ3JhbCBzdXMgRm9ydGFsZXphcywgT3BvcnR1bmlkYWRlcywgRGViaWxpZGFkZXMgeSBBbWVuYXphcyBjb24gZWwgZmluIGRlIG9idGVuZXIgdW5hIGNvbXByZW5zacOzbiBlc3RyYXTDqWdpY2EgZGUgc3UgcG9zaWNpw7NuIGVuIGVsIG1lcmNhZG8geSBwcm9wb3JjaW9uYXIgdW5hIGJhc2Ugc8OzbGlkYSBwYXJhIGxhIHRvbWEgZGUgZGVjaXNpb25lcyBxdWUgcG90ZW5jaWVuIHN1IGNvbXBldGl0aXZpZGFkIHkgY3JlY2ltaWVudG8gZW4gbGEgaW5kdXN0cmlhIGRlIGVtcGFxdWVzIHkgZW1iYWxhamVzLgoKIVtdKC9Vc2Vycy9kYXZpZGNhdmF6b3MvRGVza3RvcC9BbmFsaXRpY2EvUi9SZXRvL0RhdG9zL0VWMV9FTlRSRUdBQkxFIDMvRk9EQSBDcnV6YWRvIEUxLnBuZykKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBQRVNUTEUKRWwgb2JqZXRpdm8gZGVsIGFuw6FsaXNpcyBQRVNUTEUgcGFyYSBGT1JNIGVzIGV4YW1pbmFyIGxvcyBmYWN0b3JlcyBxdWUgaW1wYWN0YW4gc3Ugb3BlcmFjacOzbiB5IGVudG9ybm8gZW1wcmVzYXJpYWwuIEVzdG8gcGVybWl0aXLDoSBhIGxhIGVtcHJlc2EgY29tcHJlbmRlciBtZWpvciBlbCBjb250ZXh0byBlbiBlbCBxdWUgb3BlcmEsIGFudGljaXBhciBwb3NpYmxlcyBjYW1iaW9zIHkgYWp1c3RhciBzdSBlc3RyYXRlZ2lhIHBhcmEgbWF4aW1pemFyIG9wb3J0dW5pZGFkZXMgeSBtaXRpZ2FyIHJpZXNnb3MuCgohWyBdKC9Vc2Vycy9kYXZpZGNhdmF6b3MvRGVza3RvcC9BbmFsaXRpY2EvUi9SZXRvL0RhdG9zL0VWMV9FTlRSRUdBQkxFIDMvUEVTVEVMIEUxLnBuZykKIVsgXSgvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvQW5hbGl0aWNhL1IvUmV0by9EYXRvcy9FVjFfRU5UUkVHQUJMRSAzL1BFU1RFTDIgRTEgLnBuZykKCgojIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqRW50cmVnYWJsZSAyKioKCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqUHJlZ3VudGEgMSoqCgoqKsK/Q3XDoWwgZXMgZWwgRXN0YWRvIENpdmlsIGNvbiBNYXlvcmVzIEJhamFzPyoqIAoKIyMjIyMgQWJyaXIgYmFzZSBkZSBkYXRvcwoKYGBge3J9CiMgZmlsZS5jaG9vc2UoKQpCRERfRk9STV9CQUpBU18yMDIzIDwtIHJlYWRfY3N2KCIvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvQW5hbGl0aWNhL1IvUmV0by9EYXRvcy9FVjFfRU5UUkVHQUJMRSAzL0JERF9GT1JNX0JBSkFTXzIwMjMuY3N2IikKCiMjIyBTZWxlY2Npb25hciBsYXMgdmFyaWFibGVzIGRlIE1vdGl2byBkZSBiYWphIHkgRXN0YWRvIENpdmlsIGVuIHVuIG51ZXZvIGRhdGEgZnJhbWUuCgptYmFqYSA8LSBzZWxlY3QoQkREX0ZPUk1fQkFKQVNfMjAyMyxgTW90aXZvIGRlIEJhamFgLGBFc3RhZG8gQ2l2aWxgKSAlPiUgbmEub21pdChtYmFqYSkKYGBgCgojIyMjIyBBZ3J1cGFyIGxhIGNhdGVnb3LDrWEgY29uIGRpZmVyZW50ZXMgbm9tYnJlcyBjYW1iaWFuZG8gYSBlbCBtaXNtbyBub21icmUKYGBge3J9CgptYmFqYSQiTW90aXZvIGRlIEJhamEiW21iYWphJCJNb3Rpdm8gZGUgQmFqYSIgPT0gIkluZHVjaWRhLiJdIDwtICJJbmR1Y2lkYSIKCm1iYWphJCJNb3Rpdm8gZGUgQmFqYSJbbWJhamEkIk1vdGl2byBkZSBCYWphIiA9PSAiSW5kdWNpZGEgKEZhbHRhcykiXSA8LSAiSW5kdWNpZGEgcG9yIGZhbHRhcyIKCm1iYWphJCJNb3Rpdm8gZGUgQmFqYSJbbWJhamEkIk1vdGl2byBkZSBCYWphIiA9PSAiSW5kdWNpZGEgKEZhbHRhcyBubyBkaW8gbG9zIHRpZW1wb3MpIl0gPC0gIkluZHVjaWRhIgpgYGAKCiMjIyMjIENhbGN1bGFyIGxvcyBwb3JjZW50YWplcyBwb3IgY2F0ZWdvcsOtYSB5IGVzdGFkbyBjaXZpbApgYGB7cn0KcG9yY2VudGFqZXMgPC0gbWJhamEgJT4lCiAgZ3JvdXBfYnkoYEVzdGFkbyBDaXZpbGAsIGBNb3Rpdm8gZGUgQmFqYWApICU+JQogIHN1bW1hcmlzZShGcmVjdWVuY2lhID0gbigpKSAlPiUKICBncm91cF9ieShgRXN0YWRvIENpdmlsYCkgJT4lCiAgbXV0YXRlKFBjdCA9IHNjYWxlczo6cGVyY2VudChGcmVjdWVuY2lhIC8gc3VtKEZyZWN1ZW5jaWEpKSkKYGBgCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gTW90aXZvIGRlIEJhamEgeSBFc3RhZG8gQ2l2aWwKCmBgYHtyfQpwbG90IDwtIGdncGxvdChwb3JjZW50YWplcywgYWVzKHggPSBgRXN0YWRvIENpdmlsYCwgeSA9IEZyZWN1ZW5jaWEsIGZpbGwgPSBgTW90aXZvIGRlIEJhamFgKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleSIsIGxpbmV3aWR0aCA9IDAuNCwgbGluZXR5cGUgPSAiZG90dGVkIiksICAjIEzDrW5lYXMgdmVydGljYWxlcwogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC40LCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSAgIyBMw61uZWFzIGhvcml6b250YWxlcwogICkrCiAgZ2d0aXRsZSgiUmVsYWNpw7NuIGVudHJlIE1vdGl2byBkZSBCYWphIHkgRXN0YWRvIENpdmlsIikKCmBgYAoKIyMjIyMgQWdyZWdhciBldGlxdWV0YXMgZGUgcG9yY2VudGFqZQpgYGB7cn0KcGxvdCArIGdlb21fdGV4dChhZXMobGFiZWwgPSBQY3QpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSxzaXplPTIpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IFJlc3VsdGFkb3MKClBvciBsbyBxdWUgcG9kZW1vcyB2ZXIgZW4gbGEgZ3LDoWZpY2EsIGxhIGdyYW4gbWF5b3LDrWEgZGUgbGFzIGJhamFzIGVuIHRvZGFzIGxhcyBjYXRlZ29yw61hcyBzb24gcG9yIHNlcGFyYWNpw7NuIHZvbHVudGFyaWEgeSByZWFsbWVudGUgbm8gc2UgbG9ncmEgdmVyIHVuYSBjb3JyZWxhY2nDs24gZW50cmUgZWwgZXN0YWRvIGNpdmlsIGRlIGxhIHBlcnNvbmEgeSBlbCBtb3Rpdm8gZGUgYmFqYSwgbG8gcXVlIHBvZHLDrWEgaW5kaWNhciB1bmEgYWx0YSByb3RhY2nDs24gZGUgZW1wbGVhZG9zIGVuIGxvcyB0cmFiYWpvcyBkZSBtYXF1aWxhIGVuIGdlbmVyYWwgbyBwb2Ryw61hIHNlciB1biBpbmRpY2Fkb3IgZGUgcXVlIGhheSB2YXJpYXMgw6FyZWFzIGRlIG9wb3J0dW5pZGFkIGVuIGN1ZXN0acOzbiBkZSBhbWVuaWRhZGVzLCBzYWxhcmlvcywgYm9ub3MsIG9wb3J0dW5pZGFkZXMgZGUgY3JlY2ltaWVudG8gZW4gbGEgZW1wcmVzYSwgdHJhc2xhZG8gbyBwcmVzdGFjaW9uZXMgcXVlIGxhIGVtcHJlc2Egb2ZyZWNlIGFkZW3DoXMgZGUgbGFzIGLDoXNpY2FzIGRpY3RhZGFzIHBvciBsYSBsZXkuCgojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiAqKlByZWd1bnRhIDIqKgoKKirCv0N1w6FsIGVzIGxhIHJlbGFjacOzbiBlbnRyZSBsYSBlZGFkIHkgbGFzIGJhamFzPyoqCgoKIyMjIyMgQ2FyZ2EgZGUgZGF0b3MKCmBgYHtyfQojZmlsZS5jaG9vc2UoKQpiYWphczwtcmVhZF9jc3YoIi9Vc2Vycy9kYXZpZGNhdmF6b3MvRGVza3RvcC9BbmFsaXRpY2EvUi9SZXRvL0RhdG9zL0VWMV9FTlRSRUdBQkxFIDMvZm9ybV9iYWphc18yMi5jc3YiKQpgYGAKCgojIyMjIyAqKk1vZGlmaWNhY2nDs24gZGUgYmFzZSBkZSBkYXRvcyoqICAgICAKCmBgYHtyfQoKI0VzdG95IGNyZWFuZG8gdW4gZGF0YSBmcmFtZSBudWV2byBjb24gbGFzIGNvbHVtbmFzIG5lY2VzYXJpYXMgcGFyYSBoYWNlciBsYSBncsOhZmljYQoKYmFqYXMxIDwtIHNlbGVjdChiYWphcywiTk9NQlJFIiwiQVBFTExJRE9TIiwiRkVDSEEgREUgTkFDSU1JRU5UTyIsIkRJQVMgTEFCT1JBRE9TIiwiU0FMQVJJTyBESUFSSU8gSU1TUyIpICU+JSBuYS5vbWl0KGJhamFzMSkKI3ZpZXcoYmFqYXMxKQpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBFc3RhZMOtc2l0aWNvcyBEZXNjcmlwdGl2b3MKCiMjIyMjIERpYXMgTGFib3JhZG9zCmBgYHtyfQpzdW1tYXJ5KGJhamFzMSRgRElBUyBMQUJPUkFET1NgKQpgYGAKIyMjIyMgU2FsYXJpbwpgYGB7cn0Kc3VtbWFyeShiYWphczEkYFNBTEFSSU8gRElBUklPIElNU1NgKQpgYGAKCiMjIyMjIEVkYWQgZGUgY29sYWJvcmFkb3JlcwoKYGBge3J9CgojQXF1w60gcmV2aXNvIHF1ZSBmb3JtYXRvIHRpZW5lbiBsYXMgY29sdW1uYXMgCgpzdHIoYmFqYXMxKQpgYGAKYGBge3J9CgojQXF1w60gZXN0b3kgaGFjaWVuZG8gdW5hIGV4dHJhY2Npw7NuIGRlbCBhw7FvIGRlIG5hY2ltaWVudG8gZXhjbHV5ZW5kbyBsb3MgZMOtYXMgeSBtZXNlcy4gCgojRGVjaWTDrSBoYWNlciBlc3RvIHBvcnF1ZSBoYXkgZmlsYXMgZW4gbGFzIHF1ZSBlc3TDoSBlc2NyaXRvIE0vRC9BIHkgb3RyYXMgRC9NL0EKCgpiYWphczEkQU5JTzwtc3RyX3N1YihiYWphczEkYEZFQ0hBIERFIE5BQ0lNSUVOVE9gLC00LC0xKQoKI0NvbnZpcnRpZW5kbyBsYSBjb2x1bW5hIGRlICJBTklPIiBlbiBpbnRlZ2VyCgpiYWphczEkQU5JTyA8LSBhcy5pbnRlZ2VyKGJhamFzMSRBTklPKQoKc3RyKGJhamFzMSkKYGBgCmBgYHtyfQoKCiNBcXXDrSBjcmXDsyB1bmEgbnVldmEgY29sdW1uYSBsbGFtYWRhICJFREFEIiByZXN0YW5kbyBlbCBhw7FvIGFjdHVhbCBjb24gZWwgZGUgIkFOSU8KCmJhamFzMSRFREFEIDwtIDIwMjMtYmFqYXMxJEFOSU8KCiNIYWLDrWEgdW4gZXJyb3IgZW4gZWwgY3VhbCBleGlzdMOtYW4gdHJlcyBmaWxhcyBxdWUgdGVuw61hbiBlZGFkIGRlIDEgcG9yIGxvIGN1YWwgbGUgcGVkw60gcXVlIHNvbG8gbW9zdHJhcmEgbG9zIHF1ZSBzb24gbWF5b3IgYSAxOC4KCmJhamFzMSA8LSBiYWphczFbYmFqYXMxJEVEQUQgPjE4LF0KYGBgCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gQmFqYXMgcG9yIEVkYWQKCmBgYHtyfQpoaXN0KGJhamFzMSRFREFELGNvbCA9IGJsdWVzOSx4bGFiID0gIkVkYWQiLHlsYWIgPSJGcmVjdWVuY2lhIiAsbWFpbiA9ICJCYWphcyBwb3IgRWRhZCIpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IFJlc3VsdGFkb3MKCk5vcyBkYW1vcyBjdWVudGEgZGUgcXVlIGxhIHJvdGFjacOzbiBkZSBwZXJzb25hbCBzZSB2ZSBtw6FzIGFsdGEgZW4gbG9zIGNvbGFib3JhZG9yZXMgbcOhcyBqw7N2ZW5lcy4gRXN0byBlcyBpbmZvcm1hY2nDs24gw7p0aWwgeWEgcXVlIG5vcyBwZXJtaXRlIHRvbWFyIGRlY2lzaW9uZXMgYWRlY3VhZGFzIHBhcmEgbWVqb3JhciBsYSBzYXRpc2ZhY2Npw7NuIGxhYm9yYWwgZW4gZXNwZWPDrWZpY28gcGFyYSBlc3RvcyByYW5nb3MgZGUgZWRhZGVzLiBDb24gZXN0YSBncsOhZmljYSBwb2RlbW9zIGVudHJhciBtw6FzIGEgZGV0YWxsZSBlbiBlbCDDoXJlYSBkZSBvcG9ydHVuaWRhZCB5IGFzw60gZW50ZW5kZXIgbGFzIHJhem9uZXMgZGUgbGEgYWx0YSByb3RhY2nDs24uIE5vcyBkYW1vcyBjdWVudGEgZGUgcXVlIHNlIHRpZW5lIHF1ZSBoYWNlciB1biBlc2Z1ZXJ6byBwb3IgbWVqb3JhciBsYSByZWxhY2nDs24gY29uIGxhcyBudWV2YXMgZ2VuZXJhY2lvbmVzIG8gY29udHJhdGFyIGEgcGVyc29uYXMgbWF5b3Jlcy4gCgojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiAqKlByZWd1bnRhIDMqKgoKKirCv0RlIHF1ZSBlZGFkIGZyZWN1ZW50YW4gaW5ncmVzYXIgbG9zIGVtcGxlYWRvcyBhIEZPUk0/KioKCgojIyMjIyBDYXJnYSBkZSBkYXRvcwpgYGB7cn0KCnJoIDwtIHJlYWQuY3N2KCIvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvQW5hbGl0aWNhL1IvUmV0by9EYXRvcy9FVjFfRU5UUkVHQUJMRSAzL2Zvcm1fcmhfZGF0b3MuY3N2IikKCiNWaWV3KHJoKQoKZWRhZCA8LSBzZWxlY3QocmgsIkZFQ0hBLkRFLkFMVEEiLCAiRkVDSEEuREUuTkFDSU1JRU5UTyIpIAoKI3N0cihyaCkKYGBgCgojIyMjIyBNb2RpZmljYWNpb24gZGUgRGF0b3MKCmBgYHtyfQpyaCRhw7FvX2FsdGEgPC0gc3RyX3N1YihyaCRGRUNIQS5ERS5BTFRBLCAtNCwgLTEpIApyaCRhw7FvX25hYyA8LSBzdHJfc3ViKHJoJEZFQ0hBLkRFLk5BQ0lNSUVOVE8sIC00LCAtMSkKcmgkYcOxb19hbHRhIDwtIGFzLmludGVnZXIocmgkYcOxb19hbHRhKQpyaCRhw7FvX25hYyA8LSBhcy5pbnRlZ2VyKHJoJGHDsW9fbmFjKQoKcmggPC0gcmhbcmgkYcOxb19hbHRhID4gMjAxMyxdCnJoIDwtIHJoWy0zMCxdCgpgYGAKCiMjIyMjIENhbGN1bGFyIGxhIGVkYWQgZGUgaW5ncmVzbyB5IE1lZGlkYXMgZGUgRGlzcGVyc2lvbgoKYGBge3J9CnJoJGVkYWRfaW5ncmVzbyA8LSByaCRhw7FvX2FsdGEgLSByaCRhw7FvX25hYwpyaCA8LSByaFtyaCRlZGFkX2luZ3Jlc28gPiAxOCxdCgplZGFkX2RlX2luZ3Jlc29fbWF4IDwtIG1heChyaCRlZGFkX2luZ3Jlc28pCnByaW50KGVkYWRfZGVfaW5ncmVzb19tYXgpCgplZGFkX2RlX2luZ3Jlc29fbWluIDwtIG1pbihyaCRlZGFkX2luZ3Jlc28pCnByaW50KGVkYWRfZGVfaW5ncmVzb19taW4pCgplZGFkX2RlX2luZ3Jlc29fbWVhbiA8LSBtZWFuKHJoJGVkYWRfaW5ncmVzbykKcHJpbnQoZWRhZF9kZV9pbmdyZXNvX21lYW4pCgpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBBbHRhcyBwb3IgRWRhZApgYGB7cn0KaGlzdChyaCRlZGFkX2luZ3Jlc28sY29sID0gIiMwMDlFNzMiICx4bGFiID0gIkVkYWQiLG1haW4gPSAiQWx0YSBwb3IgRWRhZCIpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEFsdGFzIGRlIE11amVyZXMvSG9tYnJlcwpgYGB7cn0KCiMjIENhbnRpZGFkIGRlIEhvbWJyZXMgbyBNdWplcmVzIGRhZG9zIGRlIEFsdGEKZ2dwbG90KHJoLCBhZXMoZWRhZF9pbmdyZXNvLCBmaWxsID0gR0VORVJPKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zPTEwKSArIAogIGxhYnMoeT0iIikgCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IFJlc3VsdGFkb3MgCgoqKlJlbGFjacOzbiBFZGFkIHkgZ2VuZXJvIGVuIGxhcyBCYWphcyBkZSBFbXBsZWFkb3MqKgoKUG9kZW1vcyBhbmFsaXphciBlbiBsYXMgZ3JhZmljYXMgcXVlIGxhIGVkYWQgbcOhcyBjb211biBwYXJhIGluZ3Jlc2FyIGEgdHJhYmFqYXIgYSBGT1JNIGVzIGVudHJlIGxvcyAyNSAtIDMwIGxvIHF1ZSBub3MgcHVlZGUgYXl1ZGFyIGEgY3JlYXIgY2FtcGHDsWFzIGRlIHJlY2x1dGFtaWVudG8gZW5mb2NhZGFzIGVuIGVsIG1lcmNhZG8gZGUgZWRhZCBhbCBxdWUgbG9zIGVtcGxlYWRvcyBkZSBGT1JNIGVzdGFuIGVuZm9jYWRvcywgRk9STSBjdWVudGEgY29uIHVuIGdyYW4gcmFuZ28gZGUgZWRhZGVzIGNvbWVuemFuZG8gZGVzZGUgbG9zIDE5IHkgbGxlZ2FuZG8gaGFzdGEgbG9zIDYwLiBFc3RlIHVsdGltbyBzaWVuZG8gZWwgZ3J1cG8gbWFzIHBlcXVlw7FvIGRlbnRybyBkZSBsYSBlbXByZXNhIG1pZW50cmFzIHF1ZSBsb3Mgam92ZW5lcyBkZSAxOCAtIDIwIHRpZW5kZW4gYSBzZXIgdW4gcG9yY2VudGFqZSBtw6FzIGFsdG8gZGUgaG9tYnJlcy4gTm9zIGRhbW9zIGN1ZW50YSBjb24gbGEgZ3JhZmljYSBxdWUgRk9STSBsZSBhYnJlIGxhcyBwdWVydGFzIGEgbXVjaGFzIHBlcnNvbmFzIHkgb2ZyZWNlIG9wb3J0dW5pZGFkZXMgZGUgdHJhYmFqbyBwYXJhIG51ZXZhcyBnZW5lcmFjaW9uZXMgeSBwZXJzb25hcyBjb24gZXhwZXJpZW5jaWEgIAoKIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gKipQcmVndW50YSA0KioKCioqwr9FeGlzdGVuIHRlbmRlbmNpYXMgZGUgYmFqYXM/KioKCgojIyMjIEltcG9ydGFyIGRhdGFzZXRzCmBgYHtyfQpiYWphcyA9IHJlYWQuY3N2KCIvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvQW5hbGl0aWNhL1IvUmV0by9EYXRvcy9FVjFfRU5UUkVHQUJMRSAzL2Zvcm1fYmFqYXNfMjIuY3N2IikKZGZiYWphcyA9IGJhamFzIAoKI0xpbXBpZXphIERhdGFzZXQKYmFqYXMkRVNUQURPLkNJVklMID0gZ3N1YigiTUFUUklPTU9OSU8iLCAiTUFUUklNT05JTyIsIGJhamFzJEVTVEFETy5DSVZJTCkKYGBgCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gKkZyZWN1ZW5jaWEgZGUgRMOtYXMgTGFib3JhZG9zKgpgYGB7cn0KaGlzdChiYWphcyRESUFTLkxBQk9SQURPUywgY29sID0gYmx1ZXM5LCB4bGFiID0gIkRJQVMgTEFCT1JBRE9TIiwgeWxhYiA9ICJGcmVjdWVuY2lhIiwgbWFpbiA9ICJEw61hcyBMYWJvcmFkb3MiLCB4bGltID0gYygwLCAxMDAwKSkKYGBgCgojIyMjIFNlcGFyYWNpw7NuIGRlIEZlY2hhcyAtIEJhamFzCmBgYHtyfQpkZl9yb3RhY2lvbiA9IGJhamFzICU+JSBzZWxlY3QoR0VORVJPLCBGRUNIQS5ERS5BTFRBLEJBSkEsIE1PVElWTy5ERS5CQUpBLCBESUFTLkxBQk9SQURPUywgUFVFU1RPKQpkZl9yb3RhY2lvbiA9IGRmX3JvdGFjaW9uICU+JSBzZXBhcmF0ZShCQUpBLCBpbnRvID0gYygiTU9OVEhfQkFKQSIsICJEQVlfQkFKQSIsICJZRUFSX0JBSkEiKSwgc2VwID0gIi8iKQpgYGAKCiMjIyMjIFNlcGFyYWNpw7NuIGRlIEZlY2hhcyAtIEFsdGFzCmBgYHtyfQpkZl9yb3RhY2lvbiA9IGRmX3JvdGFjaW9uICU+JSBzZXBhcmF0ZShGRUNIQS5ERS5BTFRBLCBpbnRvID0gYygiTU9OVEhfQUxUQSIsICJEQVlfQUxUQSIsICJZRUFSX0FMVEEiKSwgc2VwID0gIi8iKQpgYGAKCiMjIyMjIEFzaWduYWNpw7NuIE1lc2VzCmBgYHtyfQpkZl9tb250aHMgPC0gZGZfcm90YWNpb24gJT4lCiAgbXV0YXRlKE5BTUVfTU9OVEggPSBjYXNlX3doZW4oCiAgICBNT05USF9CQUpBID09IDEgfiAiRW5lcm8iLAogICAgTU9OVEhfQkFKQSA9PSAyIH4gIkZlYnJlcm8iLAogICAgTU9OVEhfQkFKQSA9PSAzIH4gIk1hcnpvIiwKICAgIE1PTlRIX0JBSkEgPT0gNCB+ICJBYnJpbCIsCiAgICBNT05USF9CQUpBID09IDUgfiAiTWF5byIsCiAgICBNT05USF9CQUpBID09IDYgfiAiSnVuaW8iLAogICAgTU9OVEhfQkFKQSA9PSA3IH4gIkp1bGlvIiwKICAgIE1PTlRIX0JBSkEgPT0gOCB+ICJBZ29zdG8iLAogICAgTU9OVEhfQkFKQSA9PSA5IH4gIlNlcHRpZW1icmUiLAogICAgTU9OVEhfQkFKQSA9PSAxMCB+ICJPY3R1YnJlIiwKICAgIE1PTlRIX0JBSkEgPT0gMTEgfiAiTm92aWVtYnJlIiwKICAgIE1PTlRIX0JBSkEgPT0gMTIgfiAiRGljaWVtYnJlIgogICkpICU+JQogIGZpbHRlcihOQU1FX01PTlRIICVpbiUgYygiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSIpKSAlPiUKICBzZWxlY3QoR0VORVJPLCBNT05USF9CQUpBLCBEQVlfQUxUQSwgWUVBUl9BTFRBLCBNT1RJVk8uREUuQkFKQSwgTkFNRV9NT05USCwgUFVFU1RPKQpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBDYW50aWRhZCBkZSBCYWphcyBwb3IgTWVzCmBgYHtyfQpiYXJwbG90X3N1YmNhdGVnb3J5IDwtIGdncGxvdChkZl9tb250aHMsIGFlcyh4ID0gTkFNRV9NT05USCkpICsKICBnZW9tX2JhcihmaWxsID0gIiNGNDZDMjIiLCB3aWR0aCA9IDAuNSkgKwogIGdndGl0bGUoIkJhamFzIHBvciBNZXMiKQoKYmFycGxvdF9zdWJjYXRlZ29yeSArCiAgbGFicyh0aXRsZSA9ICJCYWphcyBwb3IgTWVzIikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkscGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIikpICsgeGxhYigiTWVzZXMiKSArCiAgeWxhYigiQ2FudGlkYWQgZGUgQmFqYXMiKQoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IENhbnRpZGFkIGRlIEJhamFzIHBvciBQdWVzdG8KYGBge3J9CmZyZXF1ZW5jeV9wdWVzdG8gPSB0YWJsZShkZl9tb250aHMkUFVFU1RPKQpkZl9mcmVxdWVuY3lfcHVlc3RvID0gYXMuZGF0YS5mcmFtZShmcmVxdWVuY3lfcHVlc3RvKQpjb2xuYW1lcyhkZl9mcmVxdWVuY3lfcHVlc3RvKSA8LSBjKCJQdWVzdG8iLCAiQ2FudGlkYWQiKQoKZGZfZnJlcXVlbmN5X3B1ZXN0byA8LSBkZl9mcmVxdWVuY3lfcHVlc3RvICU+JQogIGFycmFuZ2UoZGVzYyhDYW50aWRhZCkpCgprYWJsZShkZl9mcmVxdWVuY3lfcHVlc3RvLCBmb3JtYXQgPSAiaHRtbCIsIGVzY2FwZSA9IEZBTFNFLCAKICAgICAgdGFibGUuYXR0ciA9ICdzdHlsZT0iZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyInKQoKYGBgCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gUmVzdWx0YWRvcwoKICoqVGVuZGVuY2lhcyBkZSBCYWphIGRlIEVtcGxlYWRvcyoqCiAKQW5hbGl6YW5kbyBkaXJlY3RhbWVudGUgbGEgY2FudGlkYWQgZGUgYmFqYXMgcG9yIG1lcyBwb2RlbW9zIHZlciBxdWUgZXhpc3RlIHVuYSBhbHRhIGluY2xpbmFjacOzbiBkZSBiYWphcyBkZSBlbXBsZWFkb3MgZW4gc3UgZW4gZWwgbWVzIGRlIEVuZXJvIHkgZW4gc3UgY29udHJhcGFydGUgTm92aWVtYnJlIGVzIGVsIG1lcyBjb24gbWVub3IgbsO6bWVybyBkZSBiYWphcywgYWwgZXhjbHVpciBlbCBtZXMgZGUgRGljaWVtYnJlIHF1ZSBubyBjdWVudGEgY29uIG5pbmd1bmEgYmFqYSByZWdpc3RyYWRhLiBQb3IgbG8gcXVlIHNlIHBsYW50w6lhIGxhIGhpcMOzdGVzaXMgbGEgY3VhbCBGT1JNIG1lbmNpb25vIGR1cmFudGUgbGFzIHNlc2lvbmVzIGRlIGluZm9ybWFjacOzbiBnZW5lcmFsIGRlIGxhIGVtcHJlc2EsICJMb3MgZW1wbGVhZG9zIHNlIHF1ZWRhbiBwYXJhIHJlY2liaXIgc3UgYWd1aW5hbGRvL2Jvbm8geSBkZXNww7plcyBzZSB2YW4iLCBwb3IgbG8gcXVlIHNlIHB1ZWRlIG1lbmNpb25hciB1bmEgYXNvY2lhY2nDs24gZGUgbG9zIGRhdG9zIHBlcm8gdG9kYXbDrWEgbm8gdW5hIGNhdXNhbGlkYWQgZGUgbG9zIG1pc21vcy4gCgoKIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiAqKkhhbGx6YWdvcyB5IFN1Z2VyZW5jaWFzKioKCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqSGFsbGF6Z29zIHByaW5jaXBhbGVzKioKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBQdWVzdG8gZGUgQXl1ZGFudGUgR2VuZXJhbCAKCiBEZXNkZSBlbCBjb250ZXh0byBub3NvdHJvcyBjb25vY2Vtb3MgcXVlIHVubyBkZSBsb3MgcHJvYmxlbWFzIHByaW5jaXBhbGVzIGRlIEZPUk0gZXMgc3UgYWx0YSByb3RhY2nDs24gZGUgZW1wbGVhZG9zIGVuIGVzcGVjw61maWNvIGxvcyBlbXBsZWFkb3Mgb3BlcmF0aXZvcy4gVW4gaGFsbGF6Z28gaW1wb3J0YW50ZSBxdWUgZW50ZW5kaW1vcyBhIHRyYXbDqXMgZGUgZXN0YSBpbnZlc3RpZ2FjacOzbiBkZSBkYXRvcyBmdWUgcXVlIGVsIHB1ZXN0byBkZSBheXVkYW50ZSBnZW5lcmFsIGVzIGVsIHF1ZSBtw6FzIGZyZWN1ZW50ZW1lbnRlIHNlIGRhIGRlIGJhamEuIEVzdGUgZXMgdW4gZGF0byBjcsOtdGljbyB5YSBxdWUgbm9zIHBlcm1pdGUgZW50cmFyIG3DoXMgYSBkZXRhbGxlIGxhIHJhw616IGRlbCBwcm9ibGVtYSB5IGFzw60gaGFjZXIgbW9kaWZpY2FjaW9uZXMgbmVjZXNhcmlhcyBwYXJhIG1lam9yYXIuIAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IFJlbGFjacOzbiBjb24gSm92ZW5lcwoKUG9kZW1vcyBjb25jbHVpciBxdWUgaGF5IHVuYSBncmFuIGNhbnRpZGFkIGRlIGrDs3ZlbmVzIGVudHJlIDE4LTMwIGHDsW9zIHF1ZSBjb25zdGFudGVtZW50ZSBzb24gYmFqYXMgZW4gRk9STS5EZSB0b2RvcyBsb3MgZW1wbGVhZG9zIGVzdGEgZXMgbGEgY2F0ZWdvcsOtYSBtw6FzIGFmZWN0YWRhLiAgRXMgaW1wb3J0YW50ZSBjb25zaWRlcmFyIGVzdGEgaW5mb3JtYWNpw7NuIHBhcmEgZWwgZGVzYXJyb2xsbyBkZSBlc3RyYXRlZ2lhcyBkZSBzYXRpc2ZhY2Npw7NuIGxhYm9yYWwuIEVzIGltcG9ydGFudGUgc2F0aXNmYWNlciBsYXMgbmVjZXNpZGFkZXMgZXNwZWPDrWZpY2FzIGRlIGxvcyBqw7N2ZW5lcyB5YSBxdWUgZXN0YXMgcHVlZGVuIHNlciBkaWZlcmVudGVzIGEgbGFzIGRlIGxvcyBtYXlvcmVzLiAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBSZWNsdXRhbWllbnRvCgpDb25zaWRlcmFuZG8gcXVlIGxhcyBlZGFkZXMgbcOhcyBmcmVjdWVudGVzIGRlIHN1cyBhbHRhcyBzb24gasOzdmVuZXMgZGUgMTggLSAzMCBhw7FvcyBlcyBpbXBvcnRhbnRlIGNvbnNpZGVyYXIgZXN0byBwYXJhIHN1cyBlc3RyYXRlZ2lhcyBkZSByZWNsdXRhbWllbnRvLgoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEFsdGEgcm90YWNpb24gZGUgTXVqZXJlcwoKVmVtb3MgY29tbyBoYXkgdW5hIGFsdGEgcm90YWNpw7NuIGVzcGVjw61maWNhbWVudGUgZW4gbXVqZXJlcywgZXN0byBwcm9iYWJsZW1lbnRlIGRlYmlkbyBhIHF1ZSBjb250cmF0YW4gbcOhcyBtdWplcmVzIHF1ZSBob21icmVzIGVuIGNpZXJ0b3MgcHVlc3RvcyBkZSB0cmFiYWpvIGVzcGVjw61maWNvcy4gU2luIGVtYmFyZ28gY29uc2lkZXJvIHF1ZSBlcyB1biBoYWxsYXpnbyBpbXBvcnRhbnRlIHlhIHF1ZSBub3MgcGVybWl0ZSBlbnRlbmRlciB1bmEgw6FyZWEgZGUgb3BvcnR1bmlkYWQgZXNwZWPDrWZpY2EgZW4gbGEgcG9kZW1vcyBkaXNlw7FhciB1bmEgZXN0cmF0ZWdpYSBwYXJhIG1lam9yYXIgbGEgc2F0aXNmYWNjacOzbiBsYWJvcmFsIGRlIGxhcyBtdWplcmVzLiAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBTYXRpc2ZhY2Npw7NuIGxhYm9yYWwgCgpMYSBtYXlvciDDoXJlYSBkZSBvcG9ydHVuaWRhZCBxdWUgdGllbmUgRk9STSBlcyBtZWpvcmFyIHN1IHNhdGlzZmFjY2nDs24gbGFib3JhbCwgZGVzZGUgbG9zIMOhbmd1bG9zIGFudGVyaW9yZXMgcG9kZW1vcyBpbnRlcnByZXRhciBxdWUgZXN0ZSBlcyB1bm8gZGUgbG9zIHByb2JsZW1hcyBxdWUgcHJlZG9taW5hbiBlbiBsYSBlbXByZXNhLiBFbCB0ZW5lciBpbnNhdGlzZmFjY2nDs24gbGFib3JhbCBiYWphIGxhIHByb2R1Y3RpdmlkYWQsIGxhIGVmaWNpZW5jaWEgeSBzdWJlIGxhIHJvdGFjacOzbiBhdW1lbnRhbmRvIGxvcyBnYXN0b3MgZGUgbGEgZW1wcmVzYS4gCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gTmVjZXNpZGFkIGRlIGRhdG9zCgpBIHRyYXbDqXMgZGUgZXN0YSBpbnZlc3RpZ2FjacOzbiBwb2RlbW9zIGNvbmNsdWlyIHF1ZSBmYWx0YW4gbcOhcyBkYXRvcyBwYXJhIHBvZGVyIGNvbnRpbnVhciBjb24gdW5hIHByb3B1ZXN0YS4gUG9yIGVsIG1vbWVudG8gc29sbyBjb25vY2Vtb3MgcXVlIGNvbGFib3JhZG9yZXMgc29uIGxvcyBxdWUgdGllbmVuIG3DoXMgZnJlY3VlbmNpYSBkZSBiYWphcyBzaW4gZW1iYXJnbyBwYXJhIGNvbm9jZXIgZWwgcG9ycXXDqSBuZWNlc2l0YW1vcyBkYXRvcyBjdWFsaXRhdGl2b3MgZGUgbG9zIGVtcGxlYWRvcyBhY3R1YWxlcy4gCgojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiAqKlN1Z2VyZW5jaWFzIGRlIFByb2Zlc2lvbmFsZXMqKgoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEZ1bmRhbWVudGFjacOzbiAKClNlIGJ1c2NhIHNpZW1wcmUgdGVuZXIgbG9zIGZ1bmRhbWVudG9zIGNvcnJlY3RvcyBhbCBtb21lbnRvIGRlIGFuYWxpemFyLCBlcyBpbXBvcnRhbnRlIGVuIHRvZG9zIGxvcyBwYXNvcyBkZXNkZSBsYSByZWNvcGlsYWNpw7NuLCBoYXN0YSBsYSB2aXN1YWxpemFjacOzbiB0ZW5lciBlbiBtZW50ZSBxdWUgdHUgcHJveWVjdG8gZXN0w6kgZnVuZGFtZW50YWRvLCBwb3JxdWUgZGUgZXNhIG1hbmVyYSBlcyBtw6FzIGbDoWNpbCBqdXN0aWZpY2FyIHVuYSBwcm9wdWVzdGEgbyBwb3NpYmxlIHNvbHVjacOzbi4gCgohWyBdKC9Vc2Vycy9kYXZpZGNhdmF6b3MvRGVza3RvcC9BbmFsaXRpY2EvUi9SZXRvL0RhdG9zL0VWMV9FTlRSRUdBQkxFIDMvaW52LnBuZykKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBWaXN1YWxpemFjacOzbiBlIEludGVycHJldGFjacOzbgoKU2UgYnVzY2EgcXVlIGxhIHZpc3VhbGl6YWNpw7NuIGRlIGRhdG9zIHNpZW1wcmUgc2VhIGbDoWNpbCBkZSBlbnRlbmRlciBlIGludGVycHJldGFyLCBlbiB1biBhbWJpZW50ZSBsYWJvcmFsIG1pZW50cmFzIG3DoXMgc2ltcGxlcyB5IGRpcmVjdG9zIHNlYW4gbG9zIGRhdG9zIHkgc3VzIGRpZmVyZW50ZXMgdGlwb3MgZGUgZ3LDoWZpY29zL3RhYmxhcyBlcyAgbWVqb3IgcGFyYSBsYSBwZXJzb25hIHF1ZSB0aWVuZSBxdWUgdG9tYXIgZGVjaXNpb25lcyB1c2FuZG8gZXNhIGluZm9ybWFjacOzbi4KCiFbIF0oL1VzZXJzL2RhdmlkY2F2YXpvcy9EZXNrdG9wL0FuYWxpdGljYS9SL1JldG8vRGF0b3MvRVYxX0VOVFJFR0FCTEUgMy92aXN1YWxpemFjaW9uLnBuZykKIAoKIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiAqKlJlZmVyZW5jaWFzKioKCi0gaHR0cHM6Ly93d3cuZWNvbm9taWEuZ29iLm14L2RhdGFtZXhpY28vZXMvcHJvZmlsZS9pbmR1c3RyeS9jb252ZXJ0ZWQtcGFwZXItcHJvZHVjdC1tYW51ZmFjdHVyaW5nCgotIGh0dHBzOi8vd3d3LmVsZWNvbm9taXN0YS5jb20ubXgvZXN0YWRvcy9JbmR1c3RyaWEtZGUtYXV0b3BhcnRlcy1wcmV2ZS1jcmVjaW1pZW50by1kZS1lbi0yMDIzLTIwMjMwNTMxLTAwODEuaHRtbCAKCi0gaHR0cHM6Ly8wLXd3dy1zdGF0aXN0YS1jb20uYmlibGlvdGVjYS1pbHMudGVjLm14L3N0YXRpc3RpY3MvMjc3MDU1L2dsb2JhbC1tYXJrZXQtc2hhcmVvZi1yZWdpb25zLW9uLWF1dG8tcHJvZHVjdGlvbi8KCi0gaHR0cHM6Ly93d3cuc3RhdGlzdGEuY29tL3N0YXRpc3RpY3MvODk4OTU1L21leGljby1tb3Rvci12ZWhpY2xlLXByb2R1Y3Rpb24tYnJhbmQvCgotIGh0dHBzOi8vd3d3LnZkYS5kZS9lbi9uZXdzL2ZhY3RzLWFuZC1maWd1cmVzL2FubnVhbC1maWd1cmVzL2F1dG9tb2JpbGUtcHJvZHVjdGlvbikKCi0gaHR0cHM6Ly93d3cuZWNvbm9taWEuZ29iLm14L2RhdGFtZXhpY28vZXMvcHJvZmlsZS9wcm9kdWN0L2JveGVzLWNvcnJ1Z2F0ZWQtcGFwZXJib2FyZAoKCgoKCg==