Preparación del
ambiente de trabajo
Antes de iniciar con la revisión del tema y los comandos para
realizar el análisis de los datos, es importante preparar el ambiente de
trabajo. Para ello recomiendo la configuración de 3 apartados básicos:
idioma, librerías y la carga de los datos.
Idioma
R y R Studio son plataformas que trabajan con el idioma inglés de
manera nativa, sin embargo en caso de desear que el software pueda
revisar y leer algunos signos de puntuación correspondientes a otros
idiomas, se debe realizar un ajuste a la configuración del lenguaje.
Aquí se propone modificarlo para que se puedan distinguir los signos del
idioma español, para ello se presentan dos opciones para lograrlo.
Primer opción:
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8"
Otra alternativa consiste en:
Sys.setenv(LANG = "esp")
Librerías
También es importante cargar las librerías que se utilizarán
posteriormente. Al hacerlo al inicio del proceso de trabajo se impedirá
que ocurran “bloqueos” posteriores durante el flujo de la escritura de
los comandos en R
. Por ello, aquí se recomienda activarlas
al momento de la preparación del ambiente de trabajo.
En este documento, el análisis de los datos se apoyará en dos
librerías: tidyverse
y PerformanceAnalytics
,
así como de varios comandos del sistema base de R
.
El primer paso para utilizar dichas librerías consiste en
descargarlas e instalarlas en el sistema operativo en que se esté
trabajando, para ello se utiliza el comando
install.packages()
de la siguiente manera:
```
install.packages("tidyverse)
install.packages("PerformanceAnalytics")
install.packages("EFAtools")
```
Una vez que las librerías se instalaron correctamente, el segundo
paso consiste en su “activación”. Para ello se utiliza el comando
library()
de la siguiente manera:
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5 ✓ purrr 0.3.4
## ✓ tibble 3.1.6 ✓ dplyr 1.0.8
## ✓ tidyr 1.2.0 ✓ stringr 1.4.0
## ✓ readr 2.1.2 ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(PerformanceAnalytics)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
##
## first, last
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
library(EFAtools)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
Carga de los
datos
El tercer paso recomendable al momento de preparar el ambiente de
trabajo consiste en la carga de los datos en la sección del “ambiente”
(environment).
Para ello, el primer paso consiste en contar con una copia de los
datos y que esté disponible en el disco duro del dispositivo en que se
esté realizando el trabajo analítico en R
.
En el presente documento se trabajará con la base de datos
(data.frame
) generado por el proyecto Varieties of Democracy
(V-DEM), y del que se extrae la matriz correspondiente
a los indicadores centrales para construir el índice de democracia
propuesto en dicho proyecto, para su versión 12 y disponible aquí.
Tras la descarga del paquete de datos, se debe tener presente la
extensión con la que fue guardado el archivo que contiene a la matriz de
datos (data.frame
), y que se encuentra en formato
.csv
(comma separated values).
Una vez que se cuenta con el archivo de datos guardado en el disco
duro y que se conoce la extensión con que ha sido guardado dicho
archivo, se puede proceder a “abrirlo” y “cargarlo” en el ambiente de
R Studio
. Para ello se utiliza el comando
read.csv()
, y este proceso se debe guardar como un
objeto nuevo.
datos <- read.csv("~/Dropbox/R/V-Dem-CY-Core-v12.csv", header = TRUE)
Hasta aquí se considera que se ha preparado el ambiente de trabajo de
manera básica.
Introducción al
Análisis de Componentes Principales (PCA)
El Análisis de Componentes Principales (o
Principal Component Analysis [PCA]
por sus siglas en inglés) es una técnica dentro del conjunto de métodos
agrupados en la categoría de Análisis Factorial.
Las técnicas agrupadas dentro de la categoría de análisis factoriales
son referidas como “técnicas sin variables dependiendientes” (Tacq, 1998, p. p267) , ya que no se basan en
modelos causales sino que trabajan con todas las variables contenidas en
un data.frame
de manera simultánea.
En estos modelos “se deja que sea el análisis estadístico el que
decida si existe una estructura”oculta” que se pueda reconocer en el
material (datos). A este formato básico, o tal vez se debería decir que
ante la ausencia de un formato básico (en los datos), se le denomina
estructura latente. El análisis factorial se puede considerar como una
técnica de análisis de la estructura latente.” (Tacq, 1998, p. 266)
Este tipo de análisis es muy útil si se desea examinar si un concepto
puede ser “partido” (split) en un número diverso de
características latentes (dimensiones), y de esa manera se puede
simplificar el trabajo del análisis de las variables.
En los análisis factoriales se requiere contar con el registro de
distintos casos, a la vez que se cuenta con sus valores u observaciones
para más de dos variables. Dichas observaciones (variables o
indicadores) deben ser medidos en escala intervalar. Y se asume
que cada caso en sí mismo es diferente del resto, a partir de las
variables que son de interés para el análisis.
Reducción de
dimensiones en PCA
La manera de simplificar el proceso de análisis de las variables
ocurre a través de la “reducción de dimensiones” (latentes),
esto se refiere a la creación de variables nuevas que servirán de
resúmenes de las variables originales incluidas en el análisis. Al final
se espera que estas últimas consistan en un número menor de “columnas”
en la matriz de datos respecto de las variables originales y, así,
trabajar posteriormente con las nuevas dimensiones o
“factores”.
Un factor se puede entender como “un concepto-madre
(mother-concept) que ofrece un resumen de un subgrupo de
indicadores, que miden lo mismo de manera más amplia. En otras palabras,
consideramos a los diagramas basados en el análisis factorial como
modelos de medición y no como modelos causales.” (Tacq, 1998, p 267)
Sin embargo, al integrar varias variables o ítems en otras
dimensiones (latentes), se pueden caer en alguna de las situaciones
extremas: la primera consiste en que todos los ítems estén muy
correlacionados entre sí en donde “en este caso el material de
investigación (datos) tendrá una estructura basada en una dimensión, y
para todos los indicadores (ítems o variables) mostrarán pesos
(loadings) elevados en una variable latente (factor).”
(Tacq, 1998, pp. 266–267).
El otro extremo consiste en que para cada uno de los indicadores
utilizados (ítems o variables), cada uno de ellos miden cosas
muy diferentes entre sí, y por ello se crean una nueva dimensión para
cada uno de los indicadores. “Para esta solución con un factor para cada
indicador no se aprenderá nada pues la estructura latente para los datos
será tan compleja como lo fue la estructura manifiesta original de los
datos.” (Tacq, 1998, p. 267)
En el análisis PCA no se refiere a las variables
latentes como “factores” sino como “componentes”, y en
esta técnica se generarán tantos componentes como
indicadores sean incluidos en el análisis. (Tacq,
1998, p. 267)
Combinación de las
variables en los Componentes
Si bien el método del PCA es una técnica que permite
reducir las dimensiones de una matriz de datos a partir de la
construcción de componentes \(C_i\), y
así simplificar el análisis de los datos a la par de identificar la
estructura latente de las variables incluidas en el análisis, también se
reconoce que los objetivos de investigación para los que se ha utilizado
el PCA se centran, de acuerdo con Tacq (1998, p.
270) en:
- Reducción de la multiplicidad a pocas unidades: desbrozar patrones
complejos de asociaciones entre variables para, así, encontrar su
esencia.
- Análisis de estructura latente: identificación de características
latentes las que ocultan una estructura oculta en los datos.
- Desarrollo de tipologías empíricas a partir de las variables
utilizadas.
- Reducción de dimensiones: reducción el espacio de \(n\) variables a otro espacio de \(p\) dimensiones, donde \(p\) menor a \(n\).
- Construcción de índices o escalamiento: examinación sobre la
posibilidad de reducir \(n\) variables
a una dimensión y, de ser posible, construir un índice de una sola
dimensión o escala (caso especial de reducción de dimensiones con \(p = 1\)).
- Ortogonalización de los predictores: transformación de la matriz de
variables independientes en un análisis de regresión múltiple con
multicolinealidad sustancial.
En el PCA, inicialmente, cada componente se presenta
como una combinación lineal de los indicadores incluidos, de tal manera
que esta mezcla maximice la variabilidad que se extrae de dichos
indicadores o variables. Por lo que cada componente es una combinación
lineal de los indicadores que, además, han sido estandarizados de la
manera siguiente para una situación con 3 componentes, de acuerdo con
Tacq (1998, p. 268).
\[C_i = u_{i1}z_1 + u_{i2}z_2 +
u_{i3}z_3\]
Donde:
- \(C_i\) = componente \(-i\),
- \(x_i\) = la variable \(-i\) utilizado en el análisis, y se incluye
en unidades estandarizadas, por lo que \(z_i\),
- \(u_i\) = consiste en valor para
cada coeficiente del factor o componente.
Pero para identificar estos componentes, que son mezclas de los
indicadores o variables incluidas en el análisis, primero se deben
cumplir 2 condiciones básicas, que restringen la búsqueda de
combinaciones lineales de las variables:
- Los componentes deben de ser perpendiculares entre sí (requisito de
ortogonalidad).
- El primer componente debe de extraer la mayor variabilidad posible
de las variables originales, el segundo componente debe extraer la mayor
variabilidad posible de la variabilidad restante, etc., así hasta que
toda la variabilidad sea extraída (método del eje principal
[principal axis method]). (Tacq, 1998,
p. 269)
En el proceso de construcción de los componentes, una característica
importante del PCA consiste en que se calcularán tantos
componentes como variables se hubieran incluido en el análisis, y entre
todos se abarca la totalidad de la variación contenida en todas las
variables de manera simultánea. (Tacq, 1998, p.
267)
El modelo PCA también puede ser visto de otra
manera, donde cada variable original se puede concebir como una
combinación lineal de los componentes generados en el análisis, de la
siguiente manera para una situación con 3 componentes: (269)
\[z_i = a_{i1}C_1 + a_{i2}C_2 +
a_{i3}C_3\]
Donde:
- \(a_i\) = peso de cada componente
(component loading).
Los pesos de cada componente (component loadings)
“son los pesos beta’s (beta weights) de una regresión
múltiple de la variable (estandarizada), que se presenta como una
función de los componentes calculados. Estos pesos beta’s son
iguales a las correlaciones calculadas entre cada variable y cada
componente.” (Tacq, 1998, p. 269)
Representación
geométrica de los datos en PCA
El PCA se apoya en la representación geométrica de los datos, donde
se trata de la rotación de un cubo que, originalmente, se ha
construido con las variables de la matriz de datos. (Tacq, 1998, p. 269)
De acuerdo con Tacq (1998, p. 270) cada
variable se representa en un espacio dimensional (una recta), y entre sí
todas éstas son perpendiculares, formando un cubo. Si las variables
están estandarizadas, entonces el origen del cubo se ubica en un
centroide; este es el punto dentro del cubo en donde se
concentran las medias de cada dimensión. Y sobre cada recta se
representa la posición de cada uno de los casos de los que se extrajo la
información.
En el PCA se busca delinear una recta a través del origen
(centroide), de manera que la proyección de los casos sobre la línea
permita contener a la mayor cantidad de dispersión (maximal
variance). Cada una de dichas líneas es una combinación lineal (o
componente).
Si llegase a ocurrir que todos los casos (representados por puntos
sobre la gráfica) se posicionan sobre una recta (situación de
multicolinealidad perfecta), entonces dicho componente
representaría exhaustivamente a toda la información de la matriz de
datos.
En caso de calcular más de un componente, los subsiguientes serán
siempre perpendiculares al anterior y partirán del origen o centroide, y
buscarán siempre maximizar la variación al cruzar a los casos.
A partir de dichas combinaciones lineales o componentes se forma un
nuevo cubo, distinto al que se formó a partir de las variables
originales, pero este se rota alrededor el origen del cubo hacia el
nuevo cubo (formado por los componentes), mientras que los puntos o
casos permanecen en su lugar. (Tacq, 1998, p.
270)
A partir de dicha representación geométrica, la técnica del
PCA se centra en los siguientes objetivos particulares
o procedimentales (Tacq, 1998, p.
271):
- Encontrar tantos componentes así como variables originales de tal
manera que los componentes sean mutuamente ortogonales y secuencialmente
extraigan la variación máxima de las variables. Para esto se debe
examinar la eigenestructura de la matriz de datos \(X\) o la correlación de la matriz \(R\). Los eigenvalores son
las variantes de las proyecciones de puntos sobre cada uno de los
componentes. Los eigenvectores son los cosenos de
dirección, los que indican qué tanto debe rotarse el espacio de la
variable original.
- Reducción del número de dimensiones mediante la examinación sobre
cuáles de las variables cuentan con un peso elevado (high
loading) sobre cada componente, buscando la “estructura
simple”. Esto se logra mediante la examinación de la matriz \(A\) de pesos de los componentes
(component loadings), así como mediante el cálculo de las
medidas de redundancia de cada componente.
- Rotación del espacio resultante de cada componente a un nuevo
espacio, el que puede ofrecer una estructura más simple así
como una mejor interpretación en términos del contenido.
Tomando estos supuestos y requisitos en consideración, es que se
puede avanzar en la realización del procedimiento del
PCA en R
y, posteriormente, analizar los
resultados arrojados por el software, como se verá en la sección
siguiente.
Realización y análisis
de los resultados del PCA
A continuación se muestran los comando que se utilizarán para la
realización del análisis de PCA, para ello se trabajará
con la versión 12 de la matriz de datos generada en el proyecto V-DEM
(como se refirió arriba).
Las variables seleccionadas para el análisis fueron:
- Índice de democracia deliberativa (v2x_delibdem).
- Índice de democracia igualitaria (v2x_egaldem).
- Índice de democracia electoral (v2x_polyarchy).
- Índice de democracia participativa(v2x_partipdem).
- Índice de democracia liberal (v2x_libdem).
Y se revisarán los valores registrados a partir de 1974 y hasta el último año
de registro, para lo que se filtraron los datos para, así, crear una
submuestra denominada datos_pca
de la siguiente manera:
datos_pca <- datos %>%
filter (year > 1973) %>%
select(v2x_polyarchy, v2x_libdem, v2x_partipdem, v2x_delibdem, v2x_egaldem)
Estas variables son utilizadas por el proyecto V-DEM para medir cinco
aspectos relevantes, las que -consideran- permiten estructurar al
régimen democrático. De manera que la democracia es entendida como la
combinación de estos cinco elementos.
Al retomarlos en el presente análisis, se puede considerar que el
PCA ayudará a identificar la estructura latente que
existe entre estas variables y, así, tener un acercamiento más “simple”
sobre el régimen democrático.
Exploración inicial
de la asociación entre las variables
Una primer manera para observar la asociación o variación existente
entre las variables es mediante una comparación de variables en pares,
para lo que se usa el comando chart.Correlation()
de la
librería PerformanceAnalytics
:
chart.Correlation(datos_pca)
Si bien se pueden identificar los niveles de asociación entre las
variables -que son muy altas-, ahora surge la interrogante por dilucidar
si esto ocurre porque, en el fondo, está midiendo el mismo fenómeno
aunque con indicadores diferentes.
Y, en caso de medir aspectos diferentes de un fenómeno, y que eso
valide los indicadores utilizados en el análisis, el método de las
correlaciones entre variables no permite identificar si alguna de ellas
permite “simplificar” la estructura de la matriz de datos y, así,
identificar una variable “resumen”, a la par de permita observar las
diferencias en el comportamiento de cada caso entre todas las variables
simultáneamente.
Ante esta situación, es recomendable avanzar en la realización del
análisis PCA, que permitirá construir un gráfico en el
que se podrá “reducir las dimensiones” para, así, facilitar el análisis
estadístico posterior. De esta manera, también, se podrá identificar una
“estructura más simple” para la matriz de datos.
Realización del
PCA
A continuación se revisará el comando básico para la realización del
análisis PCA en R
, con lo que se avanzará
en el proceso de reducción de dimensiones, y del que se generarán varios
componentes o dimensiones nuevas a partir de la matriz de datos
originales.
Sin embargo, previo a la realización de dicho análisis es importante
evaluar su la matriz de datos original (tanto los casos como sus
variables), son pertinentes para la realización del
PCA, para ello se utilizará la prueba estadística de
Bartlett, como se verá a continuación.
Prueba estadística de
las correlaciones en la matriz de datos
Un elemento a tener en consideración previo a la realización el
análisis PCA consiste en la evaluación de las
correlaciones existentes entre las variables originales, con el fin de
descartar que éstas son idénticas entre sí. Lo que implicaría la
imposibilidad de realizar un proceso de reducción de dimensiones.
Para ello es importante la realización de una prueba estadística que
ayuda a evaluar, inicialmente, si es pertinente avanzar en la
realización de un análisis factorial. Dicha prueba, propuesta por
Bartlett (1950) se realiza sobre la matriz
de correlaciones de las unidades de la población, que asume que se
distribuye como una \(\chi^2\), donde
la hipótesis nula plantea que las variables no están
correlacionadas entre sí.
Si dicha hipótesis nula no es rechazada, entonces no hace sentido
realizar un análisis factorial debido a que el espacio original no puede
ser reducido. Si la \(H0\) sí es
rechazada, entonces significa que sí tiene sentido realizar una
reducción del espacio definido por las variables incluidas. (Tacq, 1998, p. 280)
A continuación se realiza dicho test mediante el comando
BARTLETT()
, que es parte de la librería
EFAtools()
, de la siguiente manera:
EFAtools::BARTLETT(datos_pca, #objeto data frame con las variables de interés
N = NA, # si se requiere, se establece el tamaño de casos a retomar en el análisis
use = c("pairwise.complete.obs", #argumento para definir los tipos de casos a considerar en el análisis
"all.obs",
"complete.obs",
"everything",
"na.or.complete"),
cor_method = "pearson") # definición del método de evaluación de las correlaciones
## ℹ 'x' was not a correlation matrix. Correlations are found from entered raw data.
##
## ✓ The Bartlett's test of sphericity was significant at an alpha level of .05.
## These data are probably suitable for factor analysis.
##
## 𝜒²(10) = 102634.7, p < .001
A partir de los datos presentados por la prueba estadística de
Bartlett, se puede rechazar la \(H_0\)
y se acepta que los datos son pertinentes para avanzar en la realización
de un análisis factorial.
Implementación del
PCA en R Studio
La realización del análisis PCA se realiza a través
del comando pcomp()
, que es parte del sistema base de
R
. Los argumentos centrales a utilizar serán:
x
= consiste en la matriz numérica o
data.frame()
que contiene los datos o variables que se
incluirán en el análisis.
center
= valor lógico (TRUE / FALSE), que indica si las
variables deben centrarse en un valor “cero.”
scale
= valor lógico (TRUE / FALSE), que indica si los
valores originales de las variables de interés deberán estandarizarse
para, así, contar con una varianza igual a 1, y que esto se aplique
antes de la realización del análisis PCA.
na.action
= función que indica la manera en que se
deben procesar los casos en los que ocurren valores perdidos
(NA
).
Asimismo es importante que los resultados del análisis
PCA sean guardados como un objeto nuevo, en el ambiente
de R Studio
.
pca1 <- prcomp(~v2x_polyarchy + v2x_libdem + v2x_partipdem + v2x_delibdem + v2x_egaldem, # selección de las variables a incluir en el análisis.
data = datos_pca, #objeto fuente de los datos.
center = TRUE, # se acepta que el centro de las dimensiones tenga el valor de cero.
scale = TRUE, # se acepta que las variables originales sean estandarizadas.
na.action = na.omit) #se establece que los valores perdidos no sean incluidos en el análisis.
pca1
## Standard deviations (1, .., p=5):
## [1] 2.2058415 0.2468860 0.1849283 0.1582510 0.1186125
##
## Rotation (n x k) = (5 x 5):
## PC1 PC2 PC3 PC4 PC5
## v2x_polyarchy 0.4471347 0.45444321 -0.2654256 0.66404776 -0.286603765
## v2x_libdem 0.4505066 -0.09605931 -0.1978628 0.05596678 0.863443363
## v2x_partipdem 0.4463073 0.38787115 0.7634150 -0.25992100 0.002076133
## v2x_delibdem 0.4484520 0.04376036 -0.5105859 -0.66672971 -0.302901466
## v2x_egaldem 0.4436383 -0.79491822 0.2165618 0.20933433 -0.283848961
summary(pca1)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5
## Standard deviation 2.2058 0.24689 0.18493 0.15825 0.11861
## Proportion of Variance 0.9731 0.01219 0.00684 0.00501 0.00281
## Cumulative Proportion 0.9731 0.98534 0.99218 0.99719 1.00000
Este comando da como resultado un objeto tipo “lista” que está
integrado por 7 elementos (sdev
, rotation
,
center
, scale
, x
,
call
y na.action
), entre los más relevantes
para el análisis del PCA consisten en:
- $
X
: contiene a los componentes principales que se
utilizan para definir la gráfica PCA. Contiene tantas columnas como
variables. Usualmente se usan las dos columnas primeras.
- $
sdev
: se refiere a las distancias estandarizadas de
cada caso dentro de cada uno de los componentes principales.
- $
rotation
: se refiere al peso de cada variable sobre
cada componente principal.
Por su parte, en la consola se muestra una matriz de correlaciones
entre cada una de las variables incluidas en el análisis con respecto a
cada uno de los componentes calculados. Aquí se debe recordar
que se crean tantos componentes (columnas) como variables
(filas) se incluyeron en el análisis.
Esta matriz de correlaciones es mejor denominada como la “matriz
de pesos” por componente (component loadings
matrix).
De manera complementaria, con el comando summary()
que
integra al objeto en que se guardaron los resultados del análisis
PCA, se manda a llamar una tabla complementaria en la
que se presentan tres filas con información relevante para cada
componente, estas consisten en:
Standard deviation
: desviación estándar o
eigenvalor con que se mide la varianza al interior de
cada componente.
Proportion of Variance
: proporción de la varianza, con
la cantidad de varianza del universo de los casos que es captada por
cada componente \(C_i\).
Cumulative Proportion
: proporción acumulada de la
varianza, que consiste en la suma de las proporciones de varianza
explicada por cada compontente \(C_i\)
y los componentes antecedentes \(C_{i-1}\). La suma todal de las
proporciones dará como resultado el valor de 1.
Lectura de la matriz
de pesos de componentes
Esta matriz permite identificar las proporciones de varianza
explicada por cada componente, pues contiene las correlaciones entre
componentes y variables. Estos se encuentran en las celdas en que
converge cada variable con cada uno de los componentes. (Tacq, 1998, p. 279)
Los valores de dichos coeficientes de correlación permiten
identificar el peso (loading) de cada una de las variables
sobre cada uno de los componentes (\(C_i\)). De manera que, la variable que
tiene una mayor correlación también tiene un mayor peso
(loading) sobre el componente, y esto sirve para caracterizar
al eje nuevo creado a partir de este último.
Además, el cuadrado del coeficiente de correlación se puede
interpretar como la proporción de la varianza explicada. Por ej. el peso
(loading) de \(x_1\) en \(C_1\) es de 0.4471347. Su cuadrado \((0.4471347) ^ 2 = 0.1999294\) significa que
el 19.99% de la varianza de la variable \(x_1\) es explicada por el primer componente
\(C_1\); mientras que la proporción de
\(C_2\) que explica de la varianza de
\(x_1\) es de \((0.45444321) ^ 2 = 0.2065186\), o el
20.65%, y así sucecivamente. La suma horizontal o por fila será del 100%
para todas las variables en cada uno de los componentes, pues cada
componente explica un porcentaje de la variabilidad de cada una de las
variables \(x_i\).
La suma de los pesos cuadráticos en cada fila de la matriz es
denominada “comunalidad”. La comunalidad de una variable en
todos los componentes será igual a 1 en PCA. (Tacq, 1998, p. 279)
Al revisar las columnas de la matriz, la suma de los pesos
cuadráticos de una columna, por ej. \(C_i\), es la suma de las proporciones de
varianza de cada una de las variables incluidas que son explicadas por
el componente \(C_i\). Esta suma es
igual al eigenvalor (\(\lambda\)) del componente respectivo, por
ej. \((C_1 r x_1)^2 + (C_1 r x_2)^2 + (C_1 r
x_3)^2 = (\lambda)\). (Tacq, 1998, p.
279)
Donde:
- \((C_i r x_i)^2\) = cuadrado de la
correlación del componente \(-i\) con
la variable \(x_i\).
- \(\lambda\) = eigenvalor.
Los eigenvalores se pueden interpretar geométricamente como
la extensión o distancia de las proyecciones de cada caso sobre cada uno
de los componentes en los que están dispersos. En PCA,
la suma de los eigenvalores es igual a la suma de varianzas de
las variables estandarizadas (que es un número entero correspondiente a
la cantidad de variables incluidas).
A partir de esta propiedad, cada eigenvalor se puede
expresar como una proporción de esta suma. Para el primer
eigenvalor, esta proporción es \(\lambda_1 / \sigma_{\lambda_i}= *eigenvalor* / n_x
= prc_{x1}\) explicado del total de la varianza de las variables
incluidas, y así sucesivamente. (Tacq, 1998, p.
279)
Selección de los
componentes principales
El método de PCA -como se refirió arriba- es una
técnica que permite trabajar con una matriz en la que no se cuenta con
una variable dependiente, pues la meta analítica está puesta en
identificar la “estructura latente” que existe detrás de las variables
analizadas. Esto da paso a que los resultados arrojados por el análisis
PCA no necesariamente sean concluyentes en términos de
“causas-efectos”.
En este sentido, se considera que el análisis PCA es
una técnica que se apoya, en gran medida, en la subjetividad del
analisista, especialmente, al momento de seleccionar la cantidad de
componentes necesarios para simplificar la estructura de la matriz de
datos analizada.
Esto se traduce en que no existen criterios estadísticos concluyentes
para definir la cantidad componentes a seleccionar. Pero se pueden
identificar algunas pautas existentes -y recurrentes en los análisis-
para avanzar en la selección de la cantidad de componentes a recuperar
tras la reducción de dimensiones. Estos consiste en:
Criterio basado en el
eigenvalor
El primer criterio fue propuesto por Kaiser (Kaiser, 1960) y consiste en “mantener solo los
componentes cuyo eigenvalor es mayor a 1.” (Tacq, 1998, p. 280)
Este criterio suele se el default en los programas de
computación, pero se debe observar con detenimiento la matriz de pesos
(loadings) para evaluar si las correlaciones entre variables y
el resto de los componentes que no alcanzan a cubrir dicho criterio,
también es alto.
Esto supone que vale la pena re considerar incluir los componentes
que tiene correlaciones altas con variables, aún cuando su
eigenvalor esté por debajo del valor de 1, pues pueden aportar
elementos teóricos explicativos. (Tacq, 1998, p.
280)
Criterio gráfico
Otro criterio se apoya en la gráfica de los eigenvalores en
un scree plot y su prueba en un scree
test, desarrollado por Cattel (Cattell,
1966). Esta consiste en graficar la distribución de los
componentes, ordenados por sus eigenvalores y, allí,
identificar el “codo” de la distribución. Será en esa posición donde se
defina la cantidad de componentes a incluir. (Tacq, 1998, p. 280)
La manera de generar dicha gráfica es a partir de:
var_explicada = pca1 $ sdev ^ 2 / sum(pca1 $ sdev ^ 2) #vector con la varianza explicada por cada componente
qplot(c(1:5), var_explicada) +
geom_line() +
xlab("Componente Principal") +
ylab("Varianza Explicada") +
ggtitle("Scree Plot")
En esta gráfica se observa que en el eje X (horizontal) se encuentra
distribuidos cada uno de los componentes generados, mientras que en el
eje Y (vertizal) se mide la proporción de varianza explicada (del total
del universo de casos contenidos en la matriz de datos) que explica o
abarca cada uno de los componentes \(C_i\).
El objetivo en dicho gráfico consiste en identificar la ubicación del
“codo” en la curva que une a las proporciones de varianza explicada por
cada componente. Pues el lugar o componente en que se encuentre dicho
doblez en la curva, servirá para indicar la cantidad de nuevas
dimensiones a mantener para el análisis estadístico posterior.
Como se observa en la gráfica del “scree plot”, el codo se
ubica en la posición del segundo componente, por lo que la decisión del
analista tendría que partir de, primero, aceptar la inclusión del primer
componente, mientras que deberá examinar la matriz de “pesos”
(loadings) y los valores de las correlaciones existentes entre
las variables con el componente 2 \(C_2\) para, así, decidir si su inclusión es
pertinente teóricamente.
Graficación de los
Componentes Principales
Como se mencionó arriba, el método PCA se apoya -en
gran medida- en la representación geométrica de los componentes, en los
que se grafican la proyección de cada caso (fila) de la matriz de datos
sobre cada una de las nuevas dimensiones generadas y seleccionadas en el
análisis de reducción de dimensiones.
En este gráfico nuevo se toman en consideración las correlaciones
existentes entre todos los casos para todas sus variables y se mapean en
un plano de \(p\) dimensiones. En su
interior, los casos que registren correlaciones altas entre sí se
tienden a ubicar o agrupan juntos.
La manera de elaborar dicho gráfico, una vez que se definió que se
consideraría 2 componentes para la reducción de las dimensiones de la
matriz de datos, se puede realizar con el comando biplot()
del sistema base de R
, pero a continuación se realiza con
el comando fviz_pca_biplot()
de la libería
factoextra()
de la siguiente manera:
fviz_pca_biplot(pca1, #matriz de datos que contiene los resultados del análisis PCA
geom = "point", #representación gráfica o proyección de cada uno de los casos
col.var = "red", #definición del color para la representación de las variables
col.ind = "grey") #definición del color para la proyección de los casos
A partir de dicho gráfico se observa lo siguiente:
- Ambos ejes se encuentran es escalas estandarizadas.
- El eje X se corresponde con el \(C_1\) y el porcentaje de variabilidad que
explica de los casos.
- El eje Y se corresponde con el \(C_2\) y el porcentaje de variabilidad que
explica de los casos.
- Cada uno de los puntos representados dentro del plano cartesiano se
corresponde con la proyección de cada uno de los casos (filas)
contenidos en la matriz de datos original sobre cada uno de los
componentes.
- Se representan las variables originales incluidas en el análisis (en
color rojo).
A partir de esta representación se puede observar la proyección de
cada uno de los casos sobre cada una de las dimensiones o componentes
seleccionados. Y, gráficamente, se puede observar la posición de cada
una de las variables sobre los ejes que representa cada uno de los
componentes. A partir de ubicar la variable que se alinea sobre la línea
punteada (la representación de cada dimensión), esto ayuda a identificar
cuál de éstas es la que tiene más “peso” (loading) sobre dicho
componente.
Identificar el peso de la variable sobre cada dimensión ayuda a
interpretar el sentido teórico de cada componente.
En la gráfica anterior se puede observar que las variables de
“democracia liberal” (v2x_libdem) y de “democracia deliberativa”
(v2x_delibdem”) son las que ejercen mayor influencia sobre el primer
componente \(C_1\). En cambio, sobre la
segunda dimensión \(C_2\) no
necesariamente alguna de las variables ejerce un peso (loading)
decisivo sobre su comportamiento.
Referencias
Bartlett, M. S. (1950). Test of significance of factor analysis.
British Journal of Psychology, 3, 203–220.
Cattell, R. B. (1966). Handbook of multivariate experimental
psychology. Rand McNally.
Huntington, S. P. (1994). La tercera ola. La democratizacióna
finales del siglo XX. Paidós.
Kaiser, H. F. (1960). The application of electronic computers to factor
analysis. Educational and Psychological Measurement,
20(1), 141–151.
Tacq, J. (1998). Multivariate analysis techniques in social science
research. From problem to analysis. Sage.
LS0tCnRpdGxlOiAiSW50cm9kdWNjaW9uIGFsIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyAoUENBKSIKYXV0aG9yOiAiR3VzdGF2byBNYXJ0w61uZXogVmFsZGVzIgpkYXRlOiAnYHIgZm9ybWF0KFN5cy5EYXRlKCkpYCcKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgdGhlbWU6IGpvdXJuYWwKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiA1LjAKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQpiaWJsaW9ncmFwaHk6IG1ldG9kb2xvZ2lhLmJpYgpjc2w6IGFwYS5jc2wKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMgUHJlcGFyYWNpw7NuIGRlbCBhbWJpZW50ZSBkZSB0cmFiYWpvCgpBbnRlcyBkZSBpbmljaWFyIGNvbiBsYSByZXZpc2nDs24gZGVsIHRlbWEgeSBsb3MgY29tYW5kb3MgcGFyYSByZWFsaXphciBlbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zLCBlcyBpbXBvcnRhbnRlIHByZXBhcmFyIGVsIGFtYmllbnRlIGRlIHRyYWJham8uIFBhcmEgZWxsbyByZWNvbWllbmRvIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIDMgYXBhcnRhZG9zIGLDoXNpY29zOiBpZGlvbWEsIGxpYnJlcsOtYXMgeSBsYSBjYXJnYSBkZSBsb3MgZGF0b3MuCgojIyBJZGlvbWEKClIgeSBSIFN0dWRpbyBzb24gcGxhdGFmb3JtYXMgcXVlIHRyYWJhamFuIGNvbiBlbCBpZGlvbWEgaW5nbMOpcyBkZSBtYW5lcmEgbmF0aXZhLCBzaW4gZW1iYXJnbyBlbiBjYXNvIGRlIGRlc2VhciBxdWUgZWwgc29mdHdhcmUgcHVlZGEgcmV2aXNhciB5IGxlZXIgYWxndW5vcyBzaWdub3MgZGUgcHVudHVhY2nDs24gY29ycmVzcG9uZGllbnRlcyBhIG90cm9zIGlkaW9tYXMsIHNlIGRlYmUgcmVhbGl6YXIgdW4gYWp1c3RlIGEgbGEgY29uZmlndXJhY2nDs24gZGVsIGxlbmd1YWplLiBBcXXDrSBzZSBwcm9wb25lIG1vZGlmaWNhcmxvIHBhcmEgcXVlIHNlIHB1ZWRhbiBkaXN0aW5ndWlyIGxvcyBzaWdub3MgZGVsIGlkaW9tYSBlc3Bhw7FvbCwgcGFyYSBlbGxvIHNlIHByZXNlbnRhbiBkb3Mgb3BjaW9uZXMgcGFyYSBsb2dyYXJsby4KClByaW1lciBvcGNpw7NuOgoKYGBge3IgaWRpb21hMX0KU3lzLnNldGxvY2FsZSgiTENfQUxMIiwgImVuX1VTLlVURi04IikKYGBgCgpPdHJhIGFsdGVybmF0aXZhIGNvbnNpc3RlIGVuOgoKYGBge3IgaWRpb21hMn0KU3lzLnNldGVudihMQU5HID0gImVzcCIpCmBgYAoKIyMgTGlicmVyw61hcwoKVGFtYmnDqW4gZXMgaW1wb3J0YW50ZSBjYXJnYXIgbGFzIGxpYnJlcsOtYXMgcXVlIHNlIHV0aWxpemFyw6FuIHBvc3Rlcmlvcm1lbnRlLiBBbCBoYWNlcmxvIGFsIGluaWNpbyBkZWwgcHJvY2VzbyBkZSB0cmFiYWpvIHNlIGltcGVkaXLDoSBxdWUgb2N1cnJhbiAiYmxvcXVlb3MiIHBvc3RlcmlvcmVzIGR1cmFudGUgZWwgZmx1am8gZGUgbGEgZXNjcml0dXJhIGRlIGxvcyBjb21hbmRvcyBlbiBgUmAuIFBvciBlbGxvLCBhcXXDrSBzZSByZWNvbWllbmRhIGFjdGl2YXJsYXMgYWwgbW9tZW50byBkZSBsYSBwcmVwYXJhY2nDs24gZGVsIGFtYmllbnRlIGRlIHRyYWJham8uXAoKRW4gZXN0ZSBkb2N1bWVudG8sIGVsIGFuw6FsaXNpcyBkZSBsb3MgZGF0b3Mgc2UgYXBveWFyw6EgZW4gZG9zIGxpYnJlcsOtYXM6IGB0aWR5dmVyc2VgIHkgYFBlcmZvcm1hbmNlQW5hbHl0aWNzYCwgYXPDrSBjb21vIGRlIHZhcmlvcyBjb21hbmRvcyBkZWwgc2lzdGVtYSBiYXNlIGRlIGBSYC5cCgpFbCBwcmltZXIgcGFzbyBwYXJhIHV0aWxpemFyIGRpY2hhcyBsaWJyZXLDrWFzIGNvbnNpc3RlIGVuIGRlc2NhcmdhcmxhcyBlIGluc3RhbGFybGFzIGVuIGVsIHNpc3RlbWEgb3BlcmF0aXZvIGVuIHF1ZSBzZSBlc3TDqSB0cmFiYWphbmRvLCBwYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvIGBpbnN0YWxsLnBhY2thZ2VzKClgIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6XAoKICAgIGBgYAogICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlKQogICAgaW5zdGFsbC5wYWNrYWdlcygiUGVyZm9ybWFuY2VBbmFseXRpY3MiKQogICAgaW5zdGFsbC5wYWNrYWdlcygiRUZBdG9vbHMiKQogICAgYGBgCgpVbmEgdmV6IHF1ZSBsYXMgbGlicmVyw61hcyBzZSBpbnN0YWxhcm9uIGNvcnJlY3RhbWVudGUsIGVsIHNlZ3VuZG8gcGFzbyBjb25zaXN0ZSBlbiBzdSAiYWN0aXZhY2nDs24iLiBQYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvIGBsaWJyYXJ5KClgIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgpgYGB7ciBsaWJyZXJpYXMsIGNvbGxhcHNlID0gVFJVRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpCmxpYnJhcnkoRUZBdG9vbHMpCmxpYnJhcnkoZmFjdG9leHRyYSkKYGBgCgojIyBDYXJnYSBkZSBsb3MgZGF0b3MKCkVsIHRlcmNlciBwYXNvIHJlY29tZW5kYWJsZSBhbCBtb21lbnRvIGRlIHByZXBhcmFyIGVsIGFtYmllbnRlIGRlIHRyYWJham8gY29uc2lzdGUgZW4gbGEgY2FyZ2EgZGUgbG9zIGRhdG9zIGVuIGxhIHNlY2Npw7NuIGRlbCAiYW1iaWVudGUiIChlbnZpcm9ubWVudCkuXAoKUGFyYSBlbGxvLCBlbCBwcmltZXIgcGFzbyBjb25zaXN0ZSBlbiBjb250YXIgY29uIHVuYSBjb3BpYSBkZSBsb3MgZGF0b3MgeSBxdWUgZXN0w6kgZGlzcG9uaWJsZSBlbiBlbCBkaXNjbyBkdXJvIGRlbCBkaXNwb3NpdGl2byBlbiBxdWUgc2UgZXN0w6kgcmVhbGl6YW5kbyBlbCB0cmFiYWpvIGFuYWzDrXRpY28gZW4gYFJgLlwKCkVuIGVsIHByZXNlbnRlIGRvY3VtZW50byBzZSB0cmFiYWphcsOhIGNvbiBsYSBiYXNlIGRlIGRhdG9zIChgZGF0YS5mcmFtZWApIGdlbmVyYWRvIHBvciBlbCBwcm95ZWN0byBbKioqVmFyaWV0aWVzIG9mIERlbW9jcmFjeSAoVi1ERU0pKioqXShodHRwczovL3d3dy52LWRlbS5uZXQvKSwgeSBkZWwgcXVlIHNlIGV4dHJhZSBsYSBtYXRyaXogY29ycmVzcG9uZGllbnRlIGEgbG9zIGluZGljYWRvcmVzIGNlbnRyYWxlcyBwYXJhIGNvbnN0cnVpciBlbCDDrW5kaWNlIGRlIGRlbW9jcmFjaWEgcHJvcHVlc3RvIGVuIGRpY2hvIHByb3llY3RvLCBwYXJhIHN1IHZlcnNpw7NuIDEyIHkgZGlzcG9uaWJsZSBbYXF1w61dKGh0dHBzOi8vd3d3LnYtZGVtLm5ldC9kYXRhL3RoZS12LWRlbS1kYXRhc2V0L2NvdW50cnkteWVhci12LWRlbS1jb3JlLykuXAoKVHJhcyBsYSBkZXNjYXJnYSBkZWwgcGFxdWV0ZSBkZSBkYXRvcywgc2UgZGViZSB0ZW5lciBwcmVzZW50ZSBsYSBleHRlbnNpw7NuIGNvbiBsYSBxdWUgZnVlIGd1YXJkYWRvIGVsIGFyY2hpdm8gcXVlIGNvbnRpZW5lIGEgbGEgbWF0cml6IGRlIGRhdG9zIChgZGF0YS5mcmFtZWApLCB5IHF1ZSBzZSBlbmN1ZW50cmEgZW4gZm9ybWF0byBgLmNzdmAoY29tbWEgc2VwYXJhdGVkIHZhbHVlcykuXAoKVW5hIHZleiBxdWUgc2UgY3VlbnRhIGNvbiBlbCBhcmNoaXZvIGRlIGRhdG9zIGd1YXJkYWRvIGVuIGVsIGRpc2NvIGR1cm8geSBxdWUgc2UgY29ub2NlIGxhIGV4dGVuc2nDs24gY29uIHF1ZSBoYSBzaWRvIGd1YXJkYWRvIGRpY2hvIGFyY2hpdm8sIHNlIHB1ZWRlIHByb2NlZGVyIGEgImFicmlybG8iIHkgImNhcmdhcmxvIiBlbiBlbCBhbWJpZW50ZSBkZSBgUiBTdHVkaW9gLiBQYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvIGByZWFkLmNzdigpYCwgeSBlc3RlIHByb2Nlc28gc2UgZGViZSBndWFyZGFyIGNvbW8gdW4gKm9iamV0byogbnVldm8uCgpgYGB7ciBkYXRvc30KZGF0b3MgPC0gcmVhZC5jc3YoIn4vRHJvcGJveC9SL1YtRGVtLUNZLUNvcmUtdjEyLmNzdiIsIGhlYWRlciA9IFRSVUUpCmBgYAoKSGFzdGEgYXF1w60gc2UgY29uc2lkZXJhIHF1ZSBzZSBoYSBwcmVwYXJhZG8gZWwgYW1iaWVudGUgZGUgdHJhYmFqbyBkZSBtYW5lcmEgYsOhc2ljYS4KCiMgSW50cm9kdWNjacOzbiBhbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMgKFBDQSkKCkVsICoqKkFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBQcmluY2lwYWxlcyoqKiAobyAqUHJpbmNpcGFsIENvbXBvbmVudCBBbmFseXNpcyogWyoqKlBDQSoqKl0gcG9yIHN1cyBzaWdsYXMgZW4gaW5nbMOpcykgZXMgdW5hIHTDqWNuaWNhIGRlbnRybyBkZWwgY29uanVudG8gZGUgbcOpdG9kb3MgYWdydXBhZG9zIGVuIGxhIGNhdGVnb3LDrWEgZGUgKipBbsOhbGlzaXMgRmFjdG9yaWFsKipbXjFdLlwKClteMV06IE90cmEgZGUgbGFzIHTDqWNuaWNhcyBtw6FzIHV0aWxpemFkYXMgZGVudHJvIGRlIGVzdGUgY29uanVudG8gY29ycmVzcG9uZGUgYWwgQW7DoWxpc2lzIGRlIEZhY3RvcmVzIFByaW5jaXBhbGVzIChvICpQcmluY2lwYWwgRmFjdG9yIEFuYWx5c2lzKiBbUEZBXSksIHBlcm8gYW1iYXMgcGFydGVuIGRlIHN1cHVlc3RvcyB0ZcOzcmljb3MgZGlzdGludG9zIGFsIG1vbWVudG8gZGUgcHJvY2VzYXIgbG9zIGRhdG9zIHkgZW4gc3UgaW50ZXJwcmV0YWNpw7NuLgoKTGFzIHTDqWNuaWNhcyBhZ3J1cGFkYXMgZGVudHJvIGRlIGxhIGNhdGVnb3LDrWEgZGUgYW7DoWxpc2lzIGZhY3RvcmlhbGVzIHNvbiByZWZlcmlkYXMgY29tbyAidMOpY25pY2FzIHNpbiB2YXJpYWJsZXMgZGVwZW5kaWVuZGllbnRlcyIgW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwMjY3XSAsIHlhIHF1ZSBubyBzZSBiYXNhbiBlbiBtb2RlbG9zIGNhdXNhbGVzIHNpbm8gcXVlIHRyYWJhamFuIGNvbiB0b2RhcyBsYXMgdmFyaWFibGVzIGNvbnRlbmlkYXMgZW4gdW4gYGRhdGEuZnJhbWVgIGRlIG1hbmVyYSBzaW11bHTDoW5lYS5cCgpFbiBlc3RvcyBtb2RlbG9zICJzZSBkZWphIHF1ZSBzZWEgZWwgYW7DoWxpc2lzIGVzdGFkw61zdGljbyBlbCBxdWUgZGVjaWRhIHNpIGV4aXN0ZSB1bmEgZXN0cnVjdHVyYSAib2N1bHRhIiBxdWUgc2UgcHVlZGEgcmVjb25vY2VyIGVuIGVsIG1hdGVyaWFsIChkYXRvcykuIEEgZXN0ZSBmb3JtYXRvIGLDoXNpY28sIG8gdGFsIHZleiBzZSBkZWJlcsOtYSBkZWNpciBxdWUgYW50ZSBsYSBhdXNlbmNpYSBkZSB1biBmb3JtYXRvIGLDoXNpY28gKGVuIGxvcyBkYXRvcyksIHNlIGxlIGRlbm9taW5hIGVzdHJ1Y3R1cmEgbGF0ZW50ZS4gRWwgYW7DoWxpc2lzIGZhY3RvcmlhbCBzZSBwdWVkZSBjb25zaWRlcmFyIGNvbW8gdW5hIHTDqWNuaWNhIGRlIGFuw6FsaXNpcyBkZSBsYSBlc3RydWN0dXJhIGxhdGVudGUuIiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2Nl1cCgpFc3RlIHRpcG8gZGUgYW7DoWxpc2lzIGVzIG11eSDDunRpbCBzaSBzZSBkZXNlYSBleGFtaW5hciBzaSB1biBjb25jZXB0byBwdWVkZSBzZXIgInBhcnRpZG8iICgqc3BsaXQqKSBlbiB1biBuw7ptZXJvIGRpdmVyc28gZGUgY2FyYWN0ZXLDrXN0aWNhcyBsYXRlbnRlcyAoZGltZW5zaW9uZXMpLCB5IGRlIGVzYSBtYW5lcmEgc2UgcHVlZGUgc2ltcGxpZmljYXIgZWwgdHJhYmFqbyBkZWwgYW7DoWxpc2lzIGRlIGxhcyB2YXJpYWJsZXMuXAoKRW4gbG9zIGFuw6FsaXNpcyBmYWN0b3JpYWxlcyBzZSByZXF1aWVyZSBjb250YXIgY29uIGVsIHJlZ2lzdHJvIGRlIGRpc3RpbnRvcyBjYXNvcywgYSBsYSB2ZXogcXVlIHNlIGN1ZW50YSBjb24gc3VzIHZhbG9yZXMgdSBvYnNlcnZhY2lvbmVzIHBhcmEgbcOhcyBkZSBkb3MgdmFyaWFibGVzLiBEaWNoYXMgb2JzZXJ2YWNpb25lcyAodmFyaWFibGVzIG8gaW5kaWNhZG9yZXMpIGRlYmVuIHNlciBtZWRpZG9zIGVuIGVzY2FsYSAqaW50ZXJ2YWxhciouIFkgc2UgYXN1bWUgcXVlIGNhZGEgY2FzbyBlbiBzw60gbWlzbW8gZXMgZGlmZXJlbnRlIGRlbCByZXN0bywgYSBwYXJ0aXIgZGUgbGFzIHZhcmlhYmxlcyBxdWUgc29uIGRlIGludGVyw6lzIHBhcmEgZWwgYW7DoWxpc2lzLlwKCiMgUmVkdWNjacOzbiBkZSBkaW1lbnNpb25lcyBlbiAqKlBDQSoqCgpMYSBtYW5lcmEgZGUgc2ltcGxpZmljYXIgZWwgcHJvY2VzbyBkZSBhbsOhbGlzaXMgZGUgbGFzIHZhcmlhYmxlcyBvY3VycmUgYSB0cmF2w6lzIGRlIGxhICIqcmVkdWNjacOzbiBkZSBkaW1lbnNpb25lcyoiIChsYXRlbnRlcyksIGVzdG8gc2UgcmVmaWVyZSBhIGxhIGNyZWFjacOzbiBkZSB2YXJpYWJsZXMgbnVldmFzIHF1ZSBzZXJ2aXLDoW4gZGUgcmVzw7ptZW5lcyBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgaW5jbHVpZGFzIGVuIGVsIGFuw6FsaXNpcy4gQWwgZmluYWwgc2UgZXNwZXJhIHF1ZSBlc3RhcyDDumx0aW1hcyBjb25zaXN0YW4gZW4gdW4gbsO6bWVybyBtZW5vciBkZSAiY29sdW1uYXMiIGVuIGxhIG1hdHJpeiBkZSBkYXRvcyByZXNwZWN0byBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgeSwgYXPDrSwgdHJhYmFqYXIgcG9zdGVyaW9ybWVudGUgY29uIGxhcyBudWV2YXMgZGltZW5zaW9uZXMgbyAiKmZhY3RvcmVzKiIuXAoKVW4gKmZhY3Rvciogc2UgcHVlZGUgZW50ZW5kZXIgY29tbyAidW4gY29uY2VwdG8tbWFkcmUgKCptb3RoZXItY29uY2VwdCopIHF1ZSBvZnJlY2UgdW4gcmVzdW1lbiBkZSB1biBzdWJncnVwbyBkZSBpbmRpY2Fkb3JlcywgcXVlIG1pZGVuIGxvIG1pc21vIGRlIG1hbmVyYSBtw6FzIGFtcGxpYS4gRW4gb3RyYXMgcGFsYWJyYXMsIGNvbnNpZGVyYW1vcyBhIGxvcyBkaWFncmFtYXMgYmFzYWRvcyBlbiBlbCBhbsOhbGlzaXMgZmFjdG9yaWFsIGNvbW8gbW9kZWxvcyBkZSBtZWRpY2nDs24geSBubyBjb21vIG1vZGVsb3MgY2F1c2FsZXMuIiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAgMjY3XQoKU2luIGVtYmFyZ28sIGFsIGludGVncmFyIHZhcmlhcyB2YXJpYWJsZXMgbyAqw610ZW1zKiBlbiBvdHJhcyBkaW1lbnNpb25lcyAobGF0ZW50ZXMpLCBzZSBwdWVkZW4gY2FlciBlbiBhbGd1bmEgZGUgbGFzIHNpdHVhY2lvbmVzIGV4dHJlbWFzOiBsYSBwcmltZXJhIGNvbnNpc3RlIGVuIHF1ZSB0b2RvcyBsb3MgKsOtdGVtcyogZXN0w6luIG11eSBjb3JyZWxhY2lvbmFkb3MgZW50cmUgc8OtIGVuIGRvbmRlICJlbiBlc3RlIGNhc28gZWwgbWF0ZXJpYWwgZGUgaW52ZXN0aWdhY2nDs24gKGRhdG9zKSB0ZW5kcsOhIHVuYSBlc3RydWN0dXJhIGJhc2FkYSBlbiB1bmEgZGltZW5zacOzbiwgeSBwYXJhIHRvZG9zIGxvcyBpbmRpY2Fkb3JlcyAoKsOtdGVtcyogbyB2YXJpYWJsZXMpIG1vc3RyYXLDoW4gcGVzb3MgKCpsb2FkaW5ncyopIGVsZXZhZG9zIGVuIHVuYSB2YXJpYWJsZSBsYXRlbnRlICgqZmFjdG9yKikuIiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2Ni0yNjddLlwKCkVsIG90cm8gZXh0cmVtbyBjb25zaXN0ZSBlbiBxdWUgcGFyYSBjYWRhIHVubyBkZSBsb3MgaW5kaWNhZG9yZXMgdXRpbGl6YWRvcyAoKsOtdGVtcyogbyB2YXJpYWJsZXMpLCBjYWRhIHVubyBkZSBlbGxvcyBtaWRlbiBjb3NhcyBtdXkgZGlmZXJlbnRlcyBlbnRyZSBzw60sIHkgcG9yIGVsbG8gc2UgY3JlYW4gdW5hIG51ZXZhIGRpbWVuc2nDs24gcGFyYSBjYWRhIHVubyBkZSBsb3MgaW5kaWNhZG9yZXMuICJQYXJhIGVzdGEgc29sdWNpw7NuIGNvbiB1biBmYWN0b3IgcGFyYSBjYWRhIGluZGljYWRvciBubyBzZSBhcHJlbmRlcsOhIG5hZGEgcHVlcyBsYSBlc3RydWN0dXJhIGxhdGVudGUgcGFyYSBsb3MgZGF0b3Mgc2Vyw6EgdGFuIGNvbXBsZWphIGNvbW8gbG8gZnVlIGxhIGVzdHJ1Y3R1cmEgbWFuaWZpZXN0YSBvcmlnaW5hbCBkZSBsb3MgZGF0b3MuIiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2N11cCgpFbiBlbCBhbsOhbGlzaXMgKipQQ0EqKiBubyBzZSByZWZpZXJlIGEgbGFzIHZhcmlhYmxlcyBsYXRlbnRlcyBjb21vICJmYWN0b3JlcyIgc2lubyBjb21vICIqKmNvbXBvbmVudGVzKioiLCB5IGVuIGVzdGEgdMOpY25pY2Egc2UgZ2VuZXJhcsOhbiB0YW50b3MgKipjb21wb25lbnRlcyoqIGNvbW8gaW5kaWNhZG9yZXMgc2VhbiBpbmNsdWlkb3MgZW4gZWwgYW7DoWxpc2lzLiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2N11cCgojIENvbWJpbmFjacOzbiBkZSBsYXMgdmFyaWFibGVzIGVuIGxvcyBDb21wb25lbnRlcwoKU2kgYmllbiBlbCBtw6l0b2RvIGRlbCAqKlBDQSoqIGVzIHVuYSB0w6ljbmljYSBxdWUgcGVybWl0ZSByZWR1Y2lyIGxhcyBkaW1lbnNpb25lcyBkZSB1bmEgbWF0cml6IGRlIGRhdG9zIGEgcGFydGlyIGRlIGxhIGNvbnN0cnVjY2nDs24gZGUgY29tcG9uZW50ZXMgJENfaSQsIHkgYXPDrSBzaW1wbGlmaWNhciBlbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zIGEgbGEgcGFyIGRlIGlkZW50aWZpY2FyIGxhIGVzdHJ1Y3R1cmEgbGF0ZW50ZSBkZSBsYXMgdmFyaWFibGVzIGluY2x1aWRhcyBlbiBlbCBhbsOhbGlzaXMsIHRhbWJpw6luIHNlIHJlY29ub2NlIHF1ZSBsb3Mgb2JqZXRpdm9zIGRlIGludmVzdGlnYWNpw7NuIHBhcmEgbG9zIHF1ZSBzZSBoYSB1dGlsaXphZG8gZWwgUENBIHNlIGNlbnRyYW4sIGRlIGFjdWVyZG8gY29uIFRhY3EgWy1AdGFjcV9tdWx0aXZhcmlhdGVfMTk5OCwgcC4gMjcwXSBlbjoKCjEuICBSZWR1Y2Npw7NuIGRlIGxhIG11bHRpcGxpY2lkYWQgYSBwb2NhcyB1bmlkYWRlczogZGVzYnJvemFyIHBhdHJvbmVzIGNvbXBsZWpvcyBkZSBhc29jaWFjaW9uZXMgZW50cmUgdmFyaWFibGVzIHBhcmEsIGFzw60sIGVuY29udHJhciBzdSBlc2VuY2lhLgoyLiAgQW7DoWxpc2lzIGRlIGVzdHJ1Y3R1cmEgbGF0ZW50ZTogaWRlbnRpZmljYWNpw7NuIGRlIGNhcmFjdGVyw61zdGljYXMgbGF0ZW50ZXMgbGFzIHF1ZSBvY3VsdGFuIHVuYSBlc3RydWN0dXJhIG9jdWx0YSBlbiBsb3MgZGF0b3MuCjMuICBEZXNhcnJvbGxvIGRlIHRpcG9sb2fDrWFzIGVtcMOtcmljYXMgYSBwYXJ0aXIgZGUgbGFzIHZhcmlhYmxlcyB1dGlsaXphZGFzLgo0LiAgUmVkdWNjacOzbiBkZSBkaW1lbnNpb25lczogcmVkdWNjacOzbiBlbCBlc3BhY2lvIGRlICRuJCB2YXJpYWJsZXMgYSBvdHJvIGVzcGFjaW8gZGUgJHAkIGRpbWVuc2lvbmVzLCBkb25kZSAkcCQgbWVub3IgYSAkbiQuCjUuICBDb25zdHJ1Y2Npw7NuIGRlIMOtbmRpY2VzIG8gZXNjYWxhbWllbnRvOiBleGFtaW5hY2nDs24gc29icmUgbGEgcG9zaWJpbGlkYWQgZGUgcmVkdWNpciAkbiQgdmFyaWFibGVzIGEgdW5hIGRpbWVuc2nDs24geSwgZGUgc2VyIHBvc2libGUsIGNvbnN0cnVpciB1biDDrW5kaWNlIGRlIHVuYSBzb2xhIGRpbWVuc2nDs24gbyBlc2NhbGEgKGNhc28gZXNwZWNpYWwgZGUgcmVkdWNjacOzbiBkZSBkaW1lbnNpb25lcyBjb24gJHAgPSAxJCkuCjYuICBPcnRvZ29uYWxpemFjacOzbiBkZSBsb3MgcHJlZGljdG9yZXM6IHRyYW5zZm9ybWFjacOzbiBkZSBsYSBtYXRyaXogZGUgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGVuIHVuIGFuw6FsaXNpcyBkZSByZWdyZXNpw7NuIG3Dumx0aXBsZSBjb24gbXVsdGljb2xpbmVhbGlkYWQgc3VzdGFuY2lhbC4KCkVuIGVsICoqUENBKiosIGluaWNpYWxtZW50ZSwgY2FkYSBjb21wb25lbnRlIHNlIHByZXNlbnRhIGNvbW8gdW5hIGNvbWJpbmFjacOzbiBsaW5lYWwgZGUgbG9zIGluZGljYWRvcmVzIGluY2x1aWRvcywgZGUgdGFsIG1hbmVyYSBxdWUgZXN0YSBtZXpjbGEgbWF4aW1pY2UgbGEgdmFyaWFiaWxpZGFkIHF1ZSBzZSBleHRyYWUgZGUgZGljaG9zIGluZGljYWRvcmVzIG8gdmFyaWFibGVzLiBQb3IgbG8gcXVlIGNhZGEgY29tcG9uZW50ZSBlcyB1bmEgY29tYmluYWNpw7NuIGxpbmVhbCBkZSBsb3MgaW5kaWNhZG9yZXMgcXVlLCBhZGVtw6FzLCBoYW4gc2lkbyBlc3RhbmRhcml6YWRvcyBkZSBsYSBtYW5lcmEgc2lndWllbnRlIHBhcmEgdW5hIHNpdHVhY2nDs24gY29uIDMgY29tcG9uZW50ZXMsIGRlIGFjdWVyZG8gY29uIFRhY3EgWy1AdGFjcV9tdWx0aXZhcmlhdGVfMTk5OCwgcC4gMjY4XS4KCiQkQ19pID0gdV97aTF9el8xICsgdV97aTJ9el8yICsgdV97aTN9el8zJCQKCkRvbmRlOgoKLSAgICRDX2kkID0gY29tcG9uZW50ZSAkLWkkLAotICAgJHhfaSQgPSBsYSB2YXJpYWJsZSAkLWkkIHV0aWxpemFkbyBlbiBlbCBhbsOhbGlzaXMsIHkgc2UgaW5jbHV5ZSBlbiB1bmlkYWRlcyBlc3RhbmRhcml6YWRhcywgcG9yIGxvIHF1ZSAkel9pJCwKLSAgICR1X2kkID0gY29uc2lzdGUgZW4gdmFsb3IgcGFyYSBjYWRhIGNvZWZpY2llbnRlIGRlbCBmYWN0b3IgbyBjb21wb25lbnRlLgoKUGVybyBwYXJhIGlkZW50aWZpY2FyIGVzdG9zIGNvbXBvbmVudGVzLCBxdWUgc29uIG1lemNsYXMgZGUgbG9zIGluZGljYWRvcmVzIG8gdmFyaWFibGVzIGluY2x1aWRhcyBlbiBlbCBhbsOhbGlzaXMsIHByaW1lcm8gc2UgZGViZW4gY3VtcGxpciAyIGNvbmRpY2lvbmVzIGLDoXNpY2FzLCBxdWUgcmVzdHJpbmdlbiBsYSBiw7pzcXVlZGEgZGUgY29tYmluYWNpb25lcyBsaW5lYWxlcyBkZSBsYXMgdmFyaWFibGVzOgoKMS4gIExvcyBjb21wb25lbnRlcyBkZWJlbiBkZSBzZXIgcGVycGVuZGljdWxhcmVzIGVudHJlIHPDrSAocmVxdWlzaXRvIGRlICpvcnRvZ29uYWxpZGFkKikuCjIuICBFbCBwcmltZXIgY29tcG9uZW50ZSBkZWJlIGRlIGV4dHJhZXIgbGEgbWF5b3IgdmFyaWFiaWxpZGFkIHBvc2libGUgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzLCBlbCBzZWd1bmRvIGNvbXBvbmVudGUgZGViZSBleHRyYWVyIGxhIG1heW9yIHZhcmlhYmlsaWRhZCBwb3NpYmxlIGRlIGxhIHZhcmlhYmlsaWRhZCByZXN0YW50ZSwgZXRjLiwgYXPDrSBoYXN0YSBxdWUgdG9kYSBsYSB2YXJpYWJpbGlkYWQgc2VhIGV4dHJhw61kYSAobcOpdG9kbyBkZWwgZWplIHByaW5jaXBhbCBbKnByaW5jaXBhbCBheGlzIG1ldGhvZCpdKS4gW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLiAyNjldCgpFbiBlbCBwcm9jZXNvIGRlIGNvbnN0cnVjY2nDs24gZGUgbG9zIGNvbXBvbmVudGVzLCB1bmEgY2FyYWN0ZXLDrXN0aWNhIGltcG9ydGFudGUgZGVsICoqUENBKiogY29uc2lzdGUgZW4gcXVlIHNlIGNhbGN1bGFyw6FuIHRhbnRvcyBjb21wb25lbnRlcyBjb21vIHZhcmlhYmxlcyBzZSBodWJpZXJhbiBpbmNsdWlkbyBlbiBlbCBhbsOhbGlzaXMsIHkgZW50cmUgdG9kb3Mgc2UgYWJhcmNhIGxhIHRvdGFsaWRhZCBkZSBsYSB2YXJpYWNpw7NuIGNvbnRlbmlkYSBlbiB0b2RhcyBsYXMgdmFyaWFibGVzIGRlIG1hbmVyYSBzaW11bHTDoW5lYS4gW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLiAyNjddCgpFbCBtb2RlbG8gKipQQ0EqKiB0YW1iacOpbiBwdWVkZSBzZXIgdmlzdG8gZGUgb3RyYSBtYW5lcmEsIGRvbmRlIGNhZGEgdmFyaWFibGUgb3JpZ2luYWwgc2UgcHVlZGUgY29uY2ViaXIgY29tbyB1bmEgY29tYmluYWNpw7NuIGxpbmVhbCBkZSBsb3MgY29tcG9uZW50ZXMgZ2VuZXJhZG9zIGVuIGVsIGFuw6FsaXNpcywgZGUgbGEgc2lndWllbnRlIG1hbmVyYSBwYXJhIHVuYSBzaXR1YWNpw7NuIGNvbiAzIGNvbXBvbmVudGVzOiAoMjY5KQoKJCR6X2kgPSBhX3tpMX1DXzEgKyBhX3tpMn1DXzIgKyBhX3tpM31DXzMkJAoKRG9uZGU6CgotICAgJGFfaSQgPSBwZXNvIGRlIGNhZGEgY29tcG9uZW50ZSAoKmNvbXBvbmVudCBsb2FkaW5nKikuCgpMb3MgKnBlc29zIGRlIGNhZGEgY29tcG9uZW50ZSogKCpjb21wb25lbnQgbG9hZGluZ3MqKSAic29uIGxvcyBwZXNvcyAqYmV0YSoncyAoKmJldGEgd2VpZ2h0cyopIGRlIHVuYSByZWdyZXNpw7NuIG3Dumx0aXBsZSBkZSBsYSB2YXJpYWJsZSAoZXN0YW5kYXJpemFkYSksIHF1ZSBzZSBwcmVzZW50YSBjb21vIHVuYSBmdW5jacOzbiBkZSBsb3MgY29tcG9uZW50ZXMgY2FsY3VsYWRvcy4gRXN0b3MgcGVzb3MgKmJldGEqJ3Mgc29uIGlndWFsZXMgYSBsYXMgY29ycmVsYWNpb25lcyBjYWxjdWxhZGFzIGVudHJlIGNhZGEgdmFyaWFibGUgeSBjYWRhIGNvbXBvbmVudGUuIiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2OV0KCiMgUmVwcmVzZW50YWNpw7NuIGdlb23DqXRyaWNhIGRlIGxvcyBkYXRvcyBlbiAqKlBDQSoqCgpFbCBQQ0Egc2UgYXBveWEgZW4gbGEgcmVwcmVzZW50YWNpw7NuIGdlb23DqXRyaWNhIGRlIGxvcyBkYXRvcywgZG9uZGUgc2UgdHJhdGEgZGUgbGEgKnJvdGFjacOzbiogZGUgdW4gY3VibyBxdWUsIG9yaWdpbmFsbWVudGUsIHNlIGhhIGNvbnN0cnVpZG8gY29uIGxhcyB2YXJpYWJsZXMgZGUgbGEgbWF0cml6IGRlIGRhdG9zLiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2OV1cCgpEZSBhY3VlcmRvIGNvbiBUYWNxIFstQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI3MF0gY2FkYSB2YXJpYWJsZSBzZSByZXByZXNlbnRhIGVuIHVuIGVzcGFjaW8gZGltZW5zaW9uYWwgKHVuYSByZWN0YSksIHkgZW50cmUgc8OtIHRvZGFzIMOpc3RhcyBzb24gcGVycGVuZGljdWxhcmVzLCBmb3JtYW5kbyB1biBjdWJvLiBTaSBsYXMgdmFyaWFibGVzIGVzdMOhbiBlc3RhbmRhcml6YWRhcywgZW50b25jZXMgZWwgb3JpZ2VuIGRlbCBjdWJvIHNlIHViaWNhIGVuIHVuICpjZW50cm9pZGUqOyBlc3RlIGVzIGVsIHB1bnRvIGRlbnRybyBkZWwgY3VibyBlbiBkb25kZSBzZSBjb25jZW50cmFuIGxhcyBtZWRpYXMgZGUgY2FkYSBkaW1lbnNpw7NuLiBZIHNvYnJlIGNhZGEgcmVjdGEgc2UgcmVwcmVzZW50YSBsYSBwb3NpY2nDs24gZGUgY2FkYSB1bm8gZGUgbG9zIGNhc29zIGRlIGxvcyBxdWUgc2UgZXh0cmFqbyBsYSBpbmZvcm1hY2nDs24uXAoKRW4gZWwgUENBIHNlIGJ1c2NhIGRlbGluZWFyIHVuYSByZWN0YSBhIHRyYXbDqXMgZGVsIG9yaWdlbiAoY2VudHJvaWRlKSwgZGUgbWFuZXJhIHF1ZSBsYSBwcm95ZWNjacOzbiBkZSBsb3MgY2Fzb3Mgc29icmUgbGEgbMOtbmVhIHBlcm1pdGEgY29udGVuZXIgYSBsYSBtYXlvciBjYW50aWRhZCBkZSBkaXNwZXJzacOzbiAoKm1heGltYWwgdmFyaWFuY2UqKS4gQ2FkYSB1bmEgZGUgZGljaGFzIGzDrW5lYXMgZXMgdW5hIGNvbWJpbmFjacOzbiBsaW5lYWwgKG8gY29tcG9uZW50ZSkuXAoKU2kgbGxlZ2FzZSBhIG9jdXJyaXIgcXVlIHRvZG9zIGxvcyBjYXNvcyAocmVwcmVzZW50YWRvcyBwb3IgcHVudG9zIHNvYnJlIGxhIGdyw6FmaWNhKSBzZSBwb3NpY2lvbmFuIHNvYnJlIHVuYSByZWN0YSAoc2l0dWFjacOzbiBkZSAqbXVsdGljb2xpbmVhbGlkYWQgcGVyZmVjdGEqKSwgZW50b25jZXMgZGljaG8gY29tcG9uZW50ZSByZXByZXNlbnRhcsOtYSBleGhhdXN0aXZhbWVudGUgYSB0b2RhIGxhIGluZm9ybWFjacOzbiBkZSBsYSBtYXRyaXogZGUgZGF0b3MuXAoKRW4gY2FzbyBkZSBjYWxjdWxhciBtw6FzIGRlIHVuIGNvbXBvbmVudGUsIGxvcyBzdWJzaWd1aWVudGVzIHNlcsOhbiBzaWVtcHJlIHBlcnBlbmRpY3VsYXJlcyBhbCBhbnRlcmlvciB5IHBhcnRpcsOhbiBkZWwgb3JpZ2VuIG8gY2VudHJvaWRlLCB5IGJ1c2NhcsOhbiBzaWVtcHJlIG1heGltaXphciBsYSB2YXJpYWNpw7NuIGFsIGNydXphciBhIGxvcyBjYXNvcy5cCgpBIHBhcnRpciBkZSBkaWNoYXMgY29tYmluYWNpb25lcyBsaW5lYWxlcyBvIGNvbXBvbmVudGVzIHNlIGZvcm1hIHVuIG51ZXZvIGN1Ym8sIGRpc3RpbnRvIGFsIHF1ZSBzZSBmb3Jtw7MgYSBwYXJ0aXIgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzLCBwZXJvIGVzdGUgc2Ugcm90YSBhbHJlZGVkb3IgZWwgb3JpZ2VuIGRlbCBjdWJvIGhhY2lhIGVsIG51ZXZvIGN1Ym8gKGZvcm1hZG8gcG9yIGxvcyBjb21wb25lbnRlcyksIG1pZW50cmFzIHF1ZSBsb3MgcHVudG9zIG8gY2Fzb3MgcGVybWFuZWNlbiBlbiBzdSBsdWdhci4gW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLiAyNzBdCgpBIHBhcnRpciBkZSBkaWNoYSByZXByZXNlbnRhY2nDs24gZ2VvbcOpdHJpY2EsIGxhIHTDqWNuaWNhIGRlbCAqKlBDQSoqIHNlIGNlbnRyYSBlbiBsb3Mgc2lndWllbnRlcyBvYmpldGl2b3MgcGFydGljdWxhcmVzIG8gcHJvY2VkaW1lbnRhbGVzIFtAdGFjcV9tdWx0aXZhcmlhdGVfMTk5OCwgcC4gMjcxXToKCjEuICBFbmNvbnRyYXIgdGFudG9zIGNvbXBvbmVudGVzIGFzw60gY29tbyB2YXJpYWJsZXMgb3JpZ2luYWxlcyBkZSB0YWwgbWFuZXJhIHF1ZSBsb3MgY29tcG9uZW50ZXMgc2VhbiBtdXR1YW1lbnRlIG9ydG9nb25hbGVzIHkgc2VjdWVuY2lhbG1lbnRlIGV4dHJhaWdhbiBsYSB2YXJpYWNpw7NuIG3DoXhpbWEgZGUgbGFzIHZhcmlhYmxlcy4gUGFyYSBlc3RvIHNlIGRlYmUgZXhhbWluYXIgbGEgKiplaWdlbmVzdHJ1Y3R1cmEqKiBkZSBsYSBtYXRyaXogZGUgZGF0b3MgJFgkIG8gbGEgY29ycmVsYWNpw7NuIGRlIGxhIG1hdHJpeiAkUiQuIExvcyAqKmVpZ2VudmFsb3JlcyoqIHNvbiBsYXMgdmFyaWFudGVzIGRlIGxhcyBwcm95ZWNjaW9uZXMgZGUgcHVudG9zIHNvYnJlIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcy4gTG9zICoqZWlnZW52ZWN0b3JlcyoqIHNvbiBsb3MgY29zZW5vcyBkZSBkaXJlY2Npw7NuLCBsb3MgcXVlIGluZGljYW4gcXXDqSB0YW50byBkZWJlIHJvdGFyc2UgZWwgZXNwYWNpbyBkZSBsYSB2YXJpYWJsZSBvcmlnaW5hbC4KMi4gIFJlZHVjY2nDs24gZGVsIG7Dum1lcm8gZGUgZGltZW5zaW9uZXMgbWVkaWFudGUgbGEgZXhhbWluYWNpw7NuIHNvYnJlIGN1w6FsZXMgZGUgbGFzIHZhcmlhYmxlcyBjdWVudGFuIGNvbiB1biBwZXNvIGVsZXZhZG8gKCpoaWdoIGxvYWRpbmcqKSBzb2JyZSBjYWRhIGNvbXBvbmVudGUsIGJ1c2NhbmRvIGxhICIqZXN0cnVjdHVyYSBzaW1wbGUqIi4gRXN0byBzZSBsb2dyYSBtZWRpYW50ZSBsYSBleGFtaW5hY2nDs24gZGUgbGEgbWF0cml6ICRBJCBkZSBwZXNvcyBkZSBsb3MgY29tcG9uZW50ZXMgKCpjb21wb25lbnQgbG9hZGluZ3MqKSwgYXPDrSBjb21vIG1lZGlhbnRlIGVsIGPDoWxjdWxvIGRlIGxhcyBtZWRpZGFzIGRlIHJlZHVuZGFuY2lhIGRlIGNhZGEgY29tcG9uZW50ZS4KMy4gIFJvdGFjacOzbiBkZWwgZXNwYWNpbyByZXN1bHRhbnRlIGRlIGNhZGEgY29tcG9uZW50ZSBhIHVuIG51ZXZvIGVzcGFjaW8sIGVsIHF1ZSBwdWVkZSBvZnJlY2VyIHVuYSAqZXN0cnVjdHVyYSBtw6FzIHNpbXBsZSogYXPDrSBjb21vIHVuYSBtZWpvciBpbnRlcnByZXRhY2nDs24gZW4gdMOpcm1pbm9zIGRlbCBjb250ZW5pZG8uCgpUb21hbmRvIGVzdG9zIHN1cHVlc3RvcyB5IHJlcXVpc2l0b3MgZW4gY29uc2lkZXJhY2nDs24sIGVzIHF1ZSBzZSBwdWVkZSBhdmFuemFyIGVuIGxhIHJlYWxpemFjacOzbiBkZWwgcHJvY2VkaW1pZW50byBkZWwgKipQQ0EqKiBlbiBgUmAgeSwgcG9zdGVyaW9ybWVudGUsIGFuYWxpemFyIGxvcyByZXN1bHRhZG9zIGFycm9qYWRvcyBwb3IgZWwgc29mdHdhcmUsIGNvbW8gc2UgdmVyw6EgZW4gbGEgc2VjY2nDs24gc2lndWllbnRlLgoKIyBSZWFsaXphY2nDs24geSBhbsOhbGlzaXMgZGUgbG9zIHJlc3VsdGFkb3MgZGVsICoqUENBKioKCkEgY29udGludWFjacOzbiBzZSBtdWVzdHJhbiBsb3MgY29tYW5kbyBxdWUgc2UgdXRpbGl6YXLDoW4gcGFyYSBsYSByZWFsaXphY2nDs24gZGVsIGFuw6FsaXNpcyBkZSAqKlBDQSoqLCBwYXJhIGVsbG8gc2UgdHJhYmFqYXLDoSBjb24gbGEgdmVyc2nDs24gMTIgZGUgbGEgbWF0cml6IGRlIGRhdG9zIGdlbmVyYWRhIGVuIGVsIHByb3llY3RvIFtWLURFTV0oaHR0cHM6Ly93d3cudi1kZW0ubmV0L2RhdGEvdGhlLXYtZGVtLWRhdGFzZXQvY291bnRyeS15ZWFyLXYtZGVtLWNvcmUvKSAoY29tbyBzZSByZWZpcmnDsyBhcnJpYmEpLlwKCkxhcyB2YXJpYWJsZXMgc2VsZWNjaW9uYWRhcyBwYXJhIGVsIGFuw6FsaXNpcyBmdWVyb246CgoxLiAgw41uZGljZSBkZSBkZW1vY3JhY2lhIGRlbGliZXJhdGl2YSAodjJ4X2RlbGliZGVtKS4KMi4gIMONbmRpY2UgZGUgZGVtb2NyYWNpYSBpZ3VhbGl0YXJpYSAodjJ4X2VnYWxkZW0pLgozLiAgw41uZGljZSBkZSBkZW1vY3JhY2lhIGVsZWN0b3JhbCAodjJ4X3BvbHlhcmNoeSkuCjQuICDDjW5kaWNlIGRlIGRlbW9jcmFjaWEgcGFydGljaXBhdGl2YSh2MnhfcGFydGlwZGVtKS4KNS4gIMONbmRpY2UgZGUgZGVtb2NyYWNpYSBsaWJlcmFsICh2MnhfbGliZGVtKS4KClkgc2UgcmV2aXNhcsOhbiBsb3MgdmFsb3JlcyByZWdpc3RyYWRvcyBhIHBhcnRpciBkZSAxOTc0W14yXSB5IGhhc3RhIGVsIMO6bHRpbW8gYcOxbyBkZSByZWdpc3RybywgcGFyYSBsbyBxdWUgc2UgZmlsdHJhcm9uIGxvcyBkYXRvcyBwYXJhLCBhc8OtLCBjcmVhciB1bmEgc3VibXVlc3RyYSBkZW5vbWluYWRhIGBkYXRvc19wY2FgIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgpbXjJdOiBFbCBhw7FvIGRlIDE5NzQgZXMgY29uc2lkZXJhZG8gY29tbyBlbCBpbmljaW8gZGUgbGEgInRlcmNlcmEgb2xhIGRlIGxhIGRlbW9jcmFjaWEiIGEgcGFydGlyIGRlbCBwcm9jZXNvIGRlIGNhbWJpbyBwb2zDrXRpY28gZW4gUG9ydHVnYWwsIHF1ZSBmdWUgZGVub21pbmFkbyAibGEgcmV2b2x1Y2nDs24gZGUgbG9zIGNsYXZlbGVzLiIgW0BodW50aW5ndG9uMTk5NF0KCmBgYHtyIGZpbHRyYWRvXzE5NzR9CmRhdG9zX3BjYSA8LSBkYXRvcyAlPiUKICBmaWx0ZXIgKHllYXIgPiAxOTczKSAlPiUKICBzZWxlY3QodjJ4X3BvbHlhcmNoeSwgdjJ4X2xpYmRlbSwgdjJ4X3BhcnRpcGRlbSwgdjJ4X2RlbGliZGVtLCB2MnhfZWdhbGRlbSkKYGBgCgpFc3RhcyB2YXJpYWJsZXMgc29uIHV0aWxpemFkYXMgcG9yIGVsIHByb3llY3RvIFYtREVNIHBhcmEgbWVkaXIgY2luY28gYXNwZWN0b3MgcmVsZXZhbnRlcywgbGFzIHF1ZSAtY29uc2lkZXJhbi0gcGVybWl0ZW4gZXN0cnVjdHVyYXIgYWwgcsOpZ2ltZW4gZGVtb2Nyw6F0aWNvLiBEZSBtYW5lcmEgcXVlIGxhIGRlbW9jcmFjaWEgZXMgZW50ZW5kaWRhIGNvbW8gbGEgY29tYmluYWNpw7NuIGRlIGVzdG9zIGNpbmNvIGVsZW1lbnRvcy5cCgpBbCByZXRvbWFybG9zIGVuIGVsIHByZXNlbnRlIGFuw6FsaXNpcywgc2UgcHVlZGUgY29uc2lkZXJhciBxdWUgZWwgKipQQ0EqKiBheXVkYXLDoSBhIGlkZW50aWZpY2FyIGxhIGVzdHJ1Y3R1cmEgbGF0ZW50ZSBxdWUgZXhpc3RlIGVudHJlIGVzdGFzIHZhcmlhYmxlcyB5LCBhc8OtLCB0ZW5lciB1biBhY2VyY2FtaWVudG8gbcOhcyAic2ltcGxlIiBzb2JyZSBlbCByw6lnaW1lbiBkZW1vY3LDoXRpY28uCgojIyBFeHBsb3JhY2nDs24gaW5pY2lhbCBkZSBsYSBhc29jaWFjacOzbiBlbnRyZSBsYXMgdmFyaWFibGVzCgpVbmEgcHJpbWVyIG1hbmVyYSBwYXJhIG9ic2VydmFyIGxhIGFzb2NpYWNpw7NuIG8gdmFyaWFjacOzbiBleGlzdGVudGUgZW50cmUgbGFzIHZhcmlhYmxlcyBlcyBtZWRpYW50ZSB1bmEgY29tcGFyYWNpw7NuIGRlIHZhcmlhYmxlcyBlbiBwYXJlcywgcGFyYSBsbyBxdWUgc2UgdXNhIGVsIGNvbWFuZG8gYGNoYXJ0LkNvcnJlbGF0aW9uKClgIGRlIGxhIGxpYnJlcsOtYSBgUGVyZm9ybWFuY2VBbmFseXRpY3NgOlwKCmBgYHtyIGNvcnJlbGFjaW9uZXMsIGZpZy5jYXAgPSAiR3LDoWZpY2EgZGUgY29ycmVsYWNpb25lcyBlbiBwYXJlcyBkZSB2YXJpYWJsZXMuIn0KY2hhcnQuQ29ycmVsYXRpb24oZGF0b3NfcGNhKQpgYGAKClNpIGJpZW4gc2UgcHVlZGVuIGlkZW50aWZpY2FyIGxvcyBuaXZlbGVzIGRlIGFzb2NpYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgLXF1ZSBzb24gbXV5IGFsdGFzLSwgYWhvcmEgc3VyZ2UgbGEgaW50ZXJyb2dhbnRlIHBvciBkaWx1Y2lkYXIgc2kgZXN0byBvY3VycmUgcG9ycXVlLCBlbiBlbCBmb25kbywgZXN0w6EgbWlkaWVuZG8gZWwgbWlzbW8gZmVuw7NtZW5vIGF1bnF1ZSBjb24gaW5kaWNhZG9yZXMgZGlmZXJlbnRlcy5cCgpZLCBlbiBjYXNvIGRlIG1lZGlyIGFzcGVjdG9zIGRpZmVyZW50ZXMgZGUgdW4gZmVuw7NtZW5vLCB5IHF1ZSBlc28gdmFsaWRlIGxvcyBpbmRpY2Fkb3JlcyB1dGlsaXphZG9zIGVuIGVsIGFuw6FsaXNpcywgZWwgbcOpdG9kbyBkZSBsYXMgY29ycmVsYWNpb25lcyBlbnRyZSB2YXJpYWJsZXMgbm8gcGVybWl0ZSBpZGVudGlmaWNhciBzaSBhbGd1bmEgZGUgZWxsYXMgcGVybWl0ZSAic2ltcGxpZmljYXIiIGxhIGVzdHJ1Y3R1cmEgZGUgbGEgbWF0cml6IGRlIGRhdG9zIHksIGFzw60sIGlkZW50aWZpY2FyIHVuYSB2YXJpYWJsZSAicmVzdW1lbiIsIGEgbGEgcGFyIGRlIHBlcm1pdGEgb2JzZXJ2YXIgbGFzIGRpZmVyZW5jaWFzIGVuIGVsIGNvbXBvcnRhbWllbnRvIGRlIGNhZGEgY2FzbyBlbnRyZSB0b2RhcyBsYXMgdmFyaWFibGVzIHNpbXVsdMOhbmVhbWVudGUuXAoKQW50ZSBlc3RhIHNpdHVhY2nDs24sIGVzIHJlY29tZW5kYWJsZSBhdmFuemFyIGVuIGxhIHJlYWxpemFjacOzbiBkZWwgYW7DoWxpc2lzICoqUENBKiosIHF1ZSBwZXJtaXRpcsOhIGNvbnN0cnVpciB1biBncsOhZmljbyBlbiBlbCBxdWUgc2UgcG9kcsOhICJyZWR1Y2lyIGxhcyBkaW1lbnNpb25lcyIgcGFyYSwgYXPDrSwgZmFjaWxpdGFyIGVsIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gcG9zdGVyaW9yLiBEZSBlc3RhIG1hbmVyYSwgdGFtYmnDqW4sIHNlIHBvZHLDoSBpZGVudGlmaWNhciB1bmEgImVzdHJ1Y3R1cmEgbcOhcyBzaW1wbGUiIHBhcmEgbGEgbWF0cml6IGRlIGRhdG9zLlwKCiMgUmVhbGl6YWNpw7NuIGRlbCAqKlBDQSoqCgpBIGNvbnRpbnVhY2nDs24gc2UgcmV2aXNhcsOhIGVsIGNvbWFuZG8gYsOhc2ljbyBwYXJhIGxhIHJlYWxpemFjacOzbiBkZWwgYW7DoWxpc2lzICoqUENBKiogZW4gYFJgLCBjb24gbG8gcXVlIHNlIGF2YW56YXLDoSBlbiBlbCBwcm9jZXNvIGRlIHJlZHVjY2nDs24gZGUgZGltZW5zaW9uZXMsIHkgZGVsIHF1ZSBzZSBnZW5lcmFyw6FuIHZhcmlvcyBjb21wb25lbnRlcyBvIGRpbWVuc2lvbmVzIG51ZXZhcyBhIHBhcnRpciBkZSBsYSBtYXRyaXogZGUgZGF0b3Mgb3JpZ2luYWxlcy5cCgpTaW4gZW1iYXJnbywgcHJldmlvIGEgbGEgcmVhbGl6YWNpw7NuIGRlIGRpY2hvIGFuw6FsaXNpcyBlcyBpbXBvcnRhbnRlIGV2YWx1YXIgc3UgbGEgbWF0cml6IGRlIGRhdG9zIG9yaWdpbmFsICh0YW50byBsb3MgY2Fzb3MgY29tbyBzdXMgdmFyaWFibGVzKSwgc29uIHBlcnRpbmVudGVzIHBhcmEgbGEgcmVhbGl6YWNpw7NuIGRlbCAqKlBDQSoqLCBwYXJhIGVsbG8gc2UgdXRpbGl6YXLDoSBsYSBwcnVlYmEgZXN0YWTDrXN0aWNhIGRlIEJhcnRsZXR0LCBjb21vIHNlIHZlcsOhIGEgY29udGludWFjacOzbi5cCgojIyBQcnVlYmEgZXN0YWTDrXN0aWNhIGRlIGxhcyBjb3JyZWxhY2lvbmVzIGVuIGxhIG1hdHJpeiBkZSBkYXRvcwoKVW4gZWxlbWVudG8gYSB0ZW5lciBlbiBjb25zaWRlcmFjacOzbiBwcmV2aW8gYSBsYSByZWFsaXphY2nDs24gZWwgYW7DoWxpc2lzICoqUENBKiogY29uc2lzdGUgZW4gbGEgZXZhbHVhY2nDs24gZGUgbGFzIGNvcnJlbGFjaW9uZXMgZXhpc3RlbnRlcyBlbnRyZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMsIGNvbiBlbCBmaW4gZGUgZGVzY2FydGFyIHF1ZSDDqXN0YXMgc29uIGlkw6ludGljYXMgZW50cmUgc8OtLiBMbyBxdWUgaW1wbGljYXLDrWEgbGEgaW1wb3NpYmlsaWRhZCBkZSByZWFsaXphciB1biBwcm9jZXNvIGRlIHJlZHVjY2nDs24gZGUgZGltZW5zaW9uZXMuXAoKUGFyYSBlbGxvIGVzIGltcG9ydGFudGUgbGEgcmVhbGl6YWNpw7NuIGRlIHVuYSBwcnVlYmEgZXN0YWTDrXN0aWNhIHF1ZSBheXVkYSBhIGV2YWx1YXIsIGluaWNpYWxtZW50ZSwgc2kgZXMgcGVydGluZW50ZSBhdmFuemFyIGVuIGxhIHJlYWxpemFjacOzbiBkZSB1biBhbsOhbGlzaXMgZmFjdG9yaWFsLiBEaWNoYSBwcnVlYmEsIHByb3B1ZXN0YSBwb3IgQmFydGxldHQgWy1AYmFydGxldHRfdGVzdF8xOTUwXSBzZSByZWFsaXphIHNvYnJlIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzIGRlIGxhcyB1bmlkYWRlcyBkZSBsYSBwb2JsYWNpw7NuLCBxdWUgYXN1bWUgcXVlIHNlIGRpc3RyaWJ1eWUgY29tbyB1bmEgJFxjaGleMiQsIGRvbmRlIGxhICpoaXDDs3Rlc2lzIG51bGEqIHBsYW50ZWEgcXVlIGxhcyB2YXJpYWJsZXMgbm8gZXN0w6FuIGNvcnJlbGFjaW9uYWRhcyBlbnRyZSBzw60uwqAKClNpIGRpY2hhIGhpcMOzdGVzaXMgbnVsYSBubyBlcyByZWNoYXphZGEsIGVudG9uY2VzIG5vIGhhY2Ugc2VudGlkbyByZWFsaXphciB1biBhbsOhbGlzaXMgZmFjdG9yaWFsIGRlYmlkbyBhIHF1ZSBlbCBlc3BhY2lvIG9yaWdpbmFsIG5vIHB1ZWRlIHNlciByZWR1Y2lkby4gU2kgbGEgJEgwJCBzw60gZXMgcmVjaGF6YWRhLCBlbnRvbmNlcyBzaWduaWZpY2EgcXVlIHPDrSB0aWVuZSBzZW50aWRvIHJlYWxpemFyIHVuYSByZWR1Y2Npw7NuIGRlbCBlc3BhY2lvIGRlZmluaWRvIHBvciBsYXMgdmFyaWFibGVzIGluY2x1aWRhcy4gW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLiAyODBdXAoKQSBjb250aW51YWNpw7NuIHNlIHJlYWxpemEgZGljaG8gdGVzdCBtZWRpYW50ZSBlbCBjb21hbmRvIGBCQVJUTEVUVCgpYCwgcXVlIGVzIHBhcnRlIGRlIGxhIGxpYnJlcsOtYSBgRUZBdG9vbHMoKWAsIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgpgYGB7ciBiYXJ0bGV0dF90ZXN0LCBmaWcuY2FwPSJQcnVlYmEgZXN0YWTDrXN0aWNhIGRlIEJhcnRsZXR0In0KRUZBdG9vbHM6OkJBUlRMRVRUKGRhdG9zX3BjYSwgI29iamV0byBkYXRhIGZyYW1lIGNvbiBsYXMgdmFyaWFibGVzIGRlIGludGVyw6lzCiAgTiA9IE5BLCAjIHNpIHNlIHJlcXVpZXJlLCBzZSBlc3RhYmxlY2UgZWwgdGFtYcOxbyBkZSBjYXNvcyBhIHJldG9tYXIgZW4gZWwgYW7DoWxpc2lzCiAgdXNlID0gYygicGFpcndpc2UuY29tcGxldGUub2JzIiwgICNhcmd1bWVudG8gcGFyYSBkZWZpbmlyIGxvcyB0aXBvcyBkZSBjYXNvcyBhIGNvbnNpZGVyYXIgZW4gZWwgYW7DoWxpc2lzCiAgICAgICAgICAiYWxsLm9icyIsIAogICAgICAgICAgImNvbXBsZXRlLm9icyIsIAogICAgICAgICAgImV2ZXJ5dGhpbmciLAogICAgICAgICAgIm5hLm9yLmNvbXBsZXRlIiksCiAgY29yX21ldGhvZCA9ICJwZWFyc29uIikgIyBkZWZpbmljacOzbiBkZWwgbcOpdG9kbyBkZSBldmFsdWFjacOzbiBkZSBsYXMgY29ycmVsYWNpb25lcwpgYGAKCkEgcGFydGlyIGRlIGxvcyBkYXRvcyBwcmVzZW50YWRvcyBwb3IgbGEgcHJ1ZWJhIGVzdGFkw61zdGljYSBkZSBCYXJ0bGV0dCwgc2UgcHVlZGUgcmVjaGF6YXIgbGEgJEhfMCQgeSBzZSBhY2VwdGEgcXVlIGxvcyBkYXRvcyBzb24gcGVydGluZW50ZXMgcGFyYSBhdmFuemFyIGVuIGxhIHJlYWxpemFjacOzbiBkZSB1biBhbsOhbGlzaXMgZmFjdG9yaWFsLlwKCiMjIEltcGxlbWVudGFjacOzbiBkZWwgKipQQ0EqKiBlbiBSIFN0dWRpbwoKTGEgcmVhbGl6YWNpw7NuIGRlbCBhbsOhbGlzaXMgKipQQ0EqKiBzZSByZWFsaXphIGEgdHJhdsOpcyBkZWwgY29tYW5kbyBgcGNvbXAoKWAsIHF1ZSBlcyBwYXJ0ZSBkZWwgc2lzdGVtYSBiYXNlIGRlIGBSYC4gTG9zIGFyZ3VtZW50b3MgY2VudHJhbGVzIGEgdXRpbGl6YXIgc2Vyw6FuOgoKLSAgIGB4YCA9IGNvbnNpc3RlIGVuIGxhIG1hdHJpeiBudW3DqXJpY2EgbyBgZGF0YS5mcmFtZSgpYCBxdWUgY29udGllbmUgbG9zIGRhdG9zIG8gdmFyaWFibGVzIHF1ZSBzZSBpbmNsdWlyw6FuIGVuIGVsIGFuw6FsaXNpcy4KLSAgIGBjZW50ZXJgID0gdmFsb3IgbMOzZ2ljbyAoVFJVRSAvIEZBTFNFKSwgcXVlIGluZGljYSBzaSBsYXMgdmFyaWFibGVzIGRlYmVuIGNlbnRyYXJzZSBlbiB1biB2YWxvciAiY2Vyby4iCi0gICBgc2NhbGVgID0gdmFsb3IgbMOzZ2ljbyAoVFJVRSAvIEZBTFNFKSwgcXVlIGluZGljYSBzaSBsb3MgdmFsb3JlcyBvcmlnaW5hbGVzIGRlIGxhcyB2YXJpYWJsZXMgZGUgaW50ZXLDqXMgZGViZXLDoW4gZXN0YW5kYXJpemFyc2UgcGFyYSwgYXPDrSwgY29udGFyIGNvbiB1bmEgdmFyaWFuemEgaWd1YWwgYSAxLCB5IHF1ZSBlc3RvIHNlIGFwbGlxdWUgYW50ZXMgZGUgbGEgcmVhbGl6YWNpw7NuIGRlbCBhbsOhbGlzaXMgKipQQ0EqKi4KLSAgIGBuYS5hY3Rpb25gID0gZnVuY2nDs24gcXVlIGluZGljYSBsYSBtYW5lcmEgZW4gcXVlIHNlIGRlYmVuIHByb2Nlc2FyIGxvcyBjYXNvcyBlbiBsb3MgcXVlIG9jdXJyZW4gdmFsb3JlcyBwZXJkaWRvcyAoYE5BYCkuCgpBc2ltaXNtbyBlcyBpbXBvcnRhbnRlIHF1ZSBsb3MgcmVzdWx0YWRvcyBkZWwgYW7DoWxpc2lzICoqUENBKiogc2VhbiBndWFyZGFkb3MgY29tbyB1biBvYmpldG8gbnVldm8sIGVuIGVsIGFtYmllbnRlIGRlIGBSIFN0dWRpb2AuCgpgYGB7ciBQQ0EsIGNvbGxhcHNlID0gVFJVRX0KcGNhMSA8LSBwcmNvbXAofnYyeF9wb2x5YXJjaHkgKyB2MnhfbGliZGVtICsgdjJ4X3BhcnRpcGRlbSArIHYyeF9kZWxpYmRlbSArIHYyeF9lZ2FsZGVtLCAjIHNlbGVjY2nDs24gZGUgbGFzIHZhcmlhYmxlcyBhIGluY2x1aXIgZW4gZWwgYW7DoWxpc2lzLgogICAgICAgZGF0YSA9IGRhdG9zX3BjYSwgI29iamV0byBmdWVudGUgZGUgbG9zIGRhdG9zLgogICAgICAgY2VudGVyID0gVFJVRSwgIyBzZSBhY2VwdGEgcXVlIGVsIGNlbnRybyBkZSBsYXMgZGltZW5zaW9uZXMgdGVuZ2EgZWwgdmFsb3IgZGUgY2Vyby4KICAgICAgIHNjYWxlID0gVFJVRSwgICMgc2UgYWNlcHRhIHF1ZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgc2VhbiBlc3RhbmRhcml6YWRhcy4KICAgICAgIG5hLmFjdGlvbiA9IG5hLm9taXQpICNzZSBlc3RhYmxlY2UgcXVlIGxvcyB2YWxvcmVzIHBlcmRpZG9zIG5vIHNlYW4gaW5jbHVpZG9zIGVuIGVsIGFuw6FsaXNpcy4KcGNhMQpzdW1tYXJ5KHBjYTEpCmBgYAoKRXN0ZSBjb21hbmRvIGRhIGNvbW8gcmVzdWx0YWRvIHVuIG9iamV0byB0aXBvICJsaXN0YSIgcXVlIGVzdMOhIGludGVncmFkbyBwb3IgNyBlbGVtZW50b3MgKGBzZGV2YCwgYHJvdGF0aW9uYCwgYGNlbnRlcmAsIGBzY2FsZWAsIGB4YCwgYGNhbGxgIHkgYG5hLmFjdGlvbmApLCBlbnRyZSBsb3MgbcOhcyByZWxldmFudGVzIHBhcmEgZWwgYW7DoWxpc2lzIGRlbCAqKlBDQSoqIGNvbnNpc3RlbiBlbjoKCjEuICBcJCBgWGA6IGNvbnRpZW5lIGEgbG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHF1ZSBzZSB1dGlsaXphbiBwYXJhIGRlZmluaXIgbGEgZ3LDoWZpY2EgUENBLiBDb250aWVuZSB0YW50YXMgY29sdW1uYXMgY29tbyB2YXJpYWJsZXMuIFVzdWFsbWVudGUgc2UgdXNhbiBsYXMgZG9zIGNvbHVtbmFzIHByaW1lcmFzLgoyLiAgXCQgYHNkZXZgOiBzZSByZWZpZXJlIGEgbGFzIGRpc3RhbmNpYXMgZXN0YW5kYXJpemFkYXMgZGUgY2FkYSBjYXNvIGRlbnRybyBkZSBjYWRhIHVubyBkZSBsb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuCjMuICBcJCBgcm90YXRpb25gOiBzZSByZWZpZXJlIGFsIHBlc28gZGUgY2FkYSB2YXJpYWJsZSBzb2JyZSBjYWRhIGNvbXBvbmVudGUgcHJpbmNpcGFsLgoKUG9yIHN1IHBhcnRlLCBlbiBsYSBjb25zb2xhIHNlIG11ZXN0cmEgdW5hIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzIGVudHJlIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMgaW5jbHVpZGFzIGVuIGVsIGFuw6FsaXNpcyBjb24gcmVzcGVjdG8gYSBjYWRhIHVubyBkZSBsb3MgKmNvbXBvbmVudGVzKiBjYWxjdWxhZG9zLiBBcXXDrSBzZSBkZWJlIHJlY29yZGFyIHF1ZSBzZSBjcmVhbiB0YW50b3MgKmNvbXBvbmVudGVzKiAoY29sdW1uYXMpIGNvbW8gdmFyaWFibGVzIChmaWxhcykgc2UgaW5jbHV5ZXJvbiBlbiBlbCBhbsOhbGlzaXMuXAoKRXN0YSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyBlcyBtZWpvciBkZW5vbWluYWRhIGNvbW8gbGEgIiptYXRyaXogZGUgcGVzb3MqIiBwb3IgKmNvbXBvbmVudGUqICgqY29tcG9uZW50IGxvYWRpbmdzKiBtYXRyaXgpLlwKCkRlIG1hbmVyYSBjb21wbGVtZW50YXJpYSwgY29uIGVsIGNvbWFuZG8gYHN1bW1hcnkoKWAgcXVlIGludGVncmEgYWwgb2JqZXRvIGVuIHF1ZSBzZSBndWFyZGFyb24gbG9zIHJlc3VsdGFkb3MgZGVsIGFuw6FsaXNpcyAqKlBDQSoqLCBzZSBtYW5kYSBhIGxsYW1hciB1bmEgdGFibGEgY29tcGxlbWVudGFyaWEgZW4gbGEgcXVlIHNlIHByZXNlbnRhbiB0cmVzIGZpbGFzIGNvbiBpbmZvcm1hY2nDs24gcmVsZXZhbnRlIHBhcmEgY2FkYSBjb21wb25lbnRlLCBlc3RhcyBjb25zaXN0ZW4gZW46CgoxLiAgYFN0YW5kYXJkIGRldmlhdGlvbmA6IGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBvICoqZWlnZW52YWxvcioqIGNvbiBxdWUgc2UgbWlkZSBsYSB2YXJpYW56YSBhbCBpbnRlcmlvciBkZSBjYWRhIGNvbXBvbmVudGUuCjIuICBgUHJvcG9ydGlvbiBvZiBWYXJpYW5jZWA6IHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphLCBjb24gbGEgY2FudGlkYWQgZGUgdmFyaWFuemEgZGVsIHVuaXZlcnNvIGRlIGxvcyBjYXNvcyBxdWUgZXMgY2FwdGFkYSBwb3IgY2FkYSBjb21wb25lbnRlICRDX2kkLgozLiAgYEN1bXVsYXRpdmUgUHJvcG9ydGlvbmA6IHByb3BvcmNpw7NuIGFjdW11bGFkYSBkZSBsYSB2YXJpYW56YSwgcXVlIGNvbnNpc3RlIGVuIGxhIHN1bWEgZGUgbGFzIHByb3BvcmNpb25lcyBkZSB2YXJpYW56YSBleHBsaWNhZGEgcG9yIGNhZGEgY29tcG9udGVudGUgJENfaSQgeSBsb3MgY29tcG9uZW50ZXMgYW50ZWNlZGVudGVzICRDX3tpLTF9JC4gTGEgc3VtYSB0b2RhbCBkZSBsYXMgcHJvcG9yY2lvbmVzIGRhcsOhIGNvbW8gcmVzdWx0YWRvIGVsIHZhbG9yIGRlIDEuCgojIyBMZWN0dXJhIGRlIGxhIG1hdHJpeiBkZSBwZXNvcyBkZSBjb21wb25lbnRlcwoKRXN0YSBtYXRyaXogcGVybWl0ZSBpZGVudGlmaWNhciBsYXMgcHJvcG9yY2lvbmVzIGRlIHZhcmlhbnphIGV4cGxpY2FkYSBwb3IgY2FkYSBjb21wb25lbnRlLCBwdWVzIGNvbnRpZW5lIGxhcyBjb3JyZWxhY2lvbmVzIGVudHJlIGNvbXBvbmVudGVzIHkgdmFyaWFibGVzLiBFc3RvcyBzZSBlbmN1ZW50cmFuIGVuIGxhcyBjZWxkYXMgZW4gcXVlIGNvbnZlcmdlIGNhZGEgdmFyaWFibGUgY29uIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcy4gW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLiAyNzldXAoKTG9zIHZhbG9yZXMgZGUgZGljaG9zIGNvZWZpY2llbnRlcyBkZSBjb3JyZWxhY2nDs24gcGVybWl0ZW4gaWRlbnRpZmljYXIgZWwgcGVzbyAoKmxvYWRpbmcqKSBkZSBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzIHNvYnJlIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcyAoJENfaSQpLiBEZSBtYW5lcmEgcXVlLCBsYSB2YXJpYWJsZSBxdWUgdGllbmUgdW5hIG1heW9yIGNvcnJlbGFjacOzbiB0YW1iacOpbiB0aWVuZSB1biBtYXlvciBwZXNvICgqbG9hZGluZyopIHNvYnJlIGVsIGNvbXBvbmVudGUsIHkgZXN0byBzaXJ2ZSBwYXJhIGNhcmFjdGVyaXphciBhbCBlamUgbnVldm8gY3JlYWRvIGEgcGFydGlyIGRlIGVzdGUgw7psdGltby5cCgpBZGVtw6FzLCBlbCBjdWFkcmFkbyBkZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIHNlIHB1ZWRlIGludGVycHJldGFyIGNvbW8gbGEgcHJvcG9yY2nDs24gZGUgbGEgdmFyaWFuemEgZXhwbGljYWRhLiBQb3IgZWouIGVsIHBlc28gKCpsb2FkaW5nKikgZGUgJHhfMSQgZW4gJENfMSQgZXMgZGUgMC40NDcxMzQ3LiBTdSBjdWFkcmFkbyAkKDAuNDQ3MTM0NykgXiAyID0gMC4xOTk5Mjk0JCBzaWduaWZpY2EgcXVlIGVsIDE5Ljk5JSBkZSBsYSB2YXJpYW56YSBkZSBsYSB2YXJpYWJsZSAkeF8xJCBlcyBleHBsaWNhZGEgcG9yIGVsIHByaW1lciBjb21wb25lbnRlICRDXzEkOyBtaWVudHJhcyBxdWUgbGEgcHJvcG9yY2nDs24gZGUgJENfMiQgcXVlIGV4cGxpY2EgZGUgbGEgdmFyaWFuemEgZGUgJHhfMSQgZXMgZGUgJCgwLjQ1NDQ0MzIxKSBeIDIgPSAwLjIwNjUxODYkLCBvIGVsIDIwLjY1JSwgeSBhc8OtIHN1Y2VjaXZhbWVudGUuIExhIHN1bWEgaG9yaXpvbnRhbCBvIHBvciBmaWxhIHNlcsOhIGRlbCAxMDAlIHBhcmEgdG9kYXMgbGFzIHZhcmlhYmxlcyBlbiBjYWRhIHVubyBkZSBsb3MgY29tcG9uZW50ZXMsIHB1ZXMgY2FkYSBjb21wb25lbnRlIGV4cGxpY2EgdW4gcG9yY2VudGFqZSBkZSBsYSB2YXJpYWJpbGlkYWQgZGUgY2FkYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyAkeF9pJC5cCgpMYSBzdW1hIGRlIGxvcyBwZXNvcyBjdWFkcsOhdGljb3MgZW4gY2FkYSBmaWxhIGRlIGxhIG1hdHJpeiBlcyBkZW5vbWluYWRhICIqY29tdW5hbGlkYWQqIi4gTGEgY29tdW5hbGlkYWQgZGUgdW5hIHZhcmlhYmxlIGVuIHRvZG9zIGxvcyBjb21wb25lbnRlcyBzZXLDoSBpZ3VhbCBhIDEgZW4gUENBLiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI3OV1cCgpBbCByZXZpc2FyIGxhcyBjb2x1bW5hcyBkZSBsYSBtYXRyaXosIGxhIHN1bWEgZGUgbG9zIHBlc29zIGN1YWRyw6F0aWNvcyBkZSB1bmEgY29sdW1uYSwgcG9yIGVqLiAkQ19pJCwgZXMgbGEgc3VtYSBkZSBsYXMgcHJvcG9yY2lvbmVzIGRlIHZhcmlhbnphIGRlIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMgaW5jbHVpZGFzIHF1ZSBzb24gZXhwbGljYWRhcyBwb3IgZWwgY29tcG9uZW50ZSAkQ19pJC4gRXN0YSBzdW1hIGVzIGlndWFsIGFsICoqZWlnZW52YWxvcioqICgkXGxhbWJkYSQpIGRlbCBjb21wb25lbnRlIHJlc3BlY3Rpdm8sIHBvciBlai4gJChDXzEgciB4XzEpXjIgKyAoQ18xIHIgeF8yKV4yICsgKENfMSByIHhfMyleMiA9IChcbGFtYmRhKSQuIFtAdGFjcV9tdWx0aXZhcmlhdGVfMTk5OCwgcC4gMjc5XVwKCkRvbmRlOgoKMS4gICQoQ19pIHIgeF9pKV4yJCA9IGN1YWRyYWRvIGRlIGxhIGNvcnJlbGFjacOzbiBkZWwgY29tcG9uZW50ZSAkLWkkIGNvbiBsYSB2YXJpYWJsZSAkeF9pJC4KMi4gICRcbGFtYmRhJCA9IGVpZ2VudmFsb3IuCgpMb3MgKmVpZ2VudmFsb3Jlcyogc2UgcHVlZGVuIGludGVycHJldGFyIGdlb23DqXRyaWNhbWVudGUgY29tbyBsYSBleHRlbnNpw7NuIG8gZGlzdGFuY2lhIGRlIGxhcyBwcm95ZWNjaW9uZXMgZGUgY2FkYSBjYXNvIHNvYnJlIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcyBlbiBsb3MgcXVlIGVzdMOhbiBkaXNwZXJzb3MuIEVuICoqUENBKiosIGxhIHN1bWEgZGUgbG9zICplaWdlbnZhbG9yZXMqIGVzIGlndWFsIGEgbGEgc3VtYSBkZSB2YXJpYW56YXMgZGUgbGFzIHZhcmlhYmxlcyBlc3RhbmRhcml6YWRhcyAocXVlIGVzIHVuIG7Dum1lcm8gZW50ZXJvIGNvcnJlc3BvbmRpZW50ZSBhIGxhIGNhbnRpZGFkIGRlIHZhcmlhYmxlcyBpbmNsdWlkYXMpLsKgCgpBIHBhcnRpciBkZSBlc3RhIHByb3BpZWRhZCwgY2FkYSAqZWlnZW52YWxvciogc2UgcHVlZGUgZXhwcmVzYXIgY29tbyB1bmEgcHJvcG9yY2nDs24gZGUgZXN0YSBzdW1hLiBQYXJhIGVsIHByaW1lciAqZWlnZW52YWxvciosIGVzdGEgcHJvcG9yY2nDs24gZXMgJFxsYW1iZGFfMSAvIFxzaWdtYV97XGxhbWJkYV9pfT0gKmVpZ2VudmFsb3IqIC8gbl94ID0gcHJjX3t4MX0kIGV4cGxpY2FkbyBkZWwgdG90YWwgZGUgbGEgdmFyaWFuemEgZGUgbGFzIHZhcmlhYmxlcyBpbmNsdWlkYXMsIHkgYXPDrSBzdWNlc2l2YW1lbnRlLiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI3OV1cCgojIFNlbGVjY2nDs24gZGUgbG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzCgpFbCBtw6l0b2RvIGRlICoqUENBKiogLWNvbW8gc2UgcmVmaXJpw7MgYXJyaWJhLSBlcyB1bmEgdMOpY25pY2EgcXVlIHBlcm1pdGUgdHJhYmFqYXIgY29uIHVuYSBtYXRyaXogZW4gbGEgcXVlIG5vIHNlIGN1ZW50YSBjb24gdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlLCBwdWVzIGxhIG1ldGEgYW5hbMOtdGljYSBlc3TDoSBwdWVzdGEgZW4gaWRlbnRpZmljYXIgbGEgImVzdHJ1Y3R1cmEgbGF0ZW50ZSIgcXVlIGV4aXN0ZSBkZXRyw6FzIGRlIGxhcyB2YXJpYWJsZXMgYW5hbGl6YWRhcy4gRXN0byBkYSBwYXNvIGEgcXVlIGxvcyByZXN1bHRhZG9zIGFycm9qYWRvcyBwb3IgZWwgYW7DoWxpc2lzICoqUENBKiogbm8gbmVjZXNhcmlhbWVudGUgc2VhbiBjb25jbHV5ZW50ZXMgZW4gdMOpcm1pbm9zIGRlICIqY2F1c2FzLWVmZWN0b3MqIi5cCgpFbiBlc3RlIHNlbnRpZG8sIHNlIGNvbnNpZGVyYSBxdWUgZWwgYW7DoWxpc2lzICoqUENBKiogZXMgdW5hIHTDqWNuaWNhIHF1ZSBzZSBhcG95YSwgZW4gZ3JhbiBtZWRpZGEsIGVuIGxhIHN1YmpldGl2aWRhZCBkZWwgYW5hbGlzaXN0YSwgZXNwZWNpYWxtZW50ZSwgYWwgbW9tZW50byBkZSBzZWxlY2Npb25hciBsYSBjYW50aWRhZCBkZSBjb21wb25lbnRlcyBuZWNlc2FyaW9zIHBhcmEgc2ltcGxpZmljYXIgbGEgZXN0cnVjdHVyYSBkZSBsYSBtYXRyaXogZGUgZGF0b3MgYW5hbGl6YWRhLlwKCkVzdG8gc2UgdHJhZHVjZSBlbiBxdWUgbm8gZXhpc3RlbiBjcml0ZXJpb3MgZXN0YWTDrXN0aWNvcyBjb25jbHV5ZW50ZXMgcGFyYSBkZWZpbmlyIGxhIGNhbnRpZGFkIGNvbXBvbmVudGVzIGEgc2VsZWNjaW9uYXIuIFBlcm8gc2UgcHVlZGVuIGlkZW50aWZpY2FyIGFsZ3VuYXMgcGF1dGFzIGV4aXN0ZW50ZXMgLXkgcmVjdXJyZW50ZXMgZW4gbG9zIGFuw6FsaXNpcy0gcGFyYSBhdmFuemFyIGVuIGxhIHNlbGVjY2nDs24gZGUgbGEgY2FudGlkYWQgZGUgY29tcG9uZW50ZXMgYSByZWN1cGVyYXIgdHJhcyBsYSByZWR1Y2Npw7NuIGRlIGRpbWVuc2lvbmVzLiBFc3RvcyBjb25zaXN0ZSBlbjoKCiMjIENyaXRlcmlvIGJhc2FkbyBlbiBlbCAqZWlnZW52YWxvcioKCkVsIHByaW1lciBjcml0ZXJpbyBmdWUgcHJvcHVlc3RvIHBvciBLYWlzZXIgW0BrYWlzZXJfYXBwbGljYXRpb25fMTk2MF0geSBjb25zaXN0ZSBlbiAibWFudGVuZXIgc29sbyBsb3MgY29tcG9uZW50ZXMgY3V5byAqZWlnZW52YWxvciogZXMgbWF5b3IgYSAxLiIgW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLjI4MF1cCgpFc3RlIGNyaXRlcmlvIHN1ZWxlIHNlIGVsICpkZWZhdWx0KiBlbiBsb3MgcHJvZ3JhbWFzIGRlIGNvbXB1dGFjacOzbiwgcGVybyBzZSBkZWJlIG9ic2VydmFyIGNvbiBkZXRlbmltaWVudG8gbGEgbWF0cml6IGRlIHBlc29zICgqbG9hZGluZ3MqKSBwYXJhIGV2YWx1YXIgc2kgbGFzIGNvcnJlbGFjaW9uZXMgZW50cmUgdmFyaWFibGVzIHkgZWwgcmVzdG8gZGUgbG9zIGNvbXBvbmVudGVzIHF1ZSBubyBhbGNhbnphbiBhIGN1YnJpciBkaWNobyBjcml0ZXJpbywgdGFtYmnDqW4gZXMgYWx0by7CoAoKRXN0byBzdXBvbmUgcXVlIHZhbGUgbGEgcGVuYSByZSBjb25zaWRlcmFyIGluY2x1aXIgbG9zIGNvbXBvbmVudGVzIHF1ZSB0aWVuZSBjb3JyZWxhY2lvbmVzIGFsdGFzIGNvbiB2YXJpYWJsZXMsIGHDum4gY3VhbmRvIHN1ICplaWdlbnZhbG9yKiBlc3TDqSBwb3IgZGViYWpvIGRlbCB2YWxvciBkZSAxLCBwdWVzIHB1ZWRlbiBhcG9ydGFyIGVsZW1lbnRvcyB0ZcOzcmljb3MgZXhwbGljYXRpdm9zLiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI4MF1cCgojIyBDcml0ZXJpbyBncsOhZmljbwoKT3RybyBjcml0ZXJpbyBzZSBhcG95YSBlbiBsYSBncsOhZmljYSBkZSBsb3MgKmVpZ2VudmFsb3JlcyogZW4gdW4gKipzY3JlZSBwbG90KiogeSBzdSBwcnVlYmEgZW4gdW4gKipzY3JlZSB0ZXN0KiosIGRlc2Fycm9sbGFkbyBwb3IgQ2F0dGVsIFtAY2F0dGVsbF9oYW5kYm9va18xOTY2XS4gRXN0YSBjb25zaXN0ZSBlbiBncmFmaWNhciBsYSBkaXN0cmlidWNpw7NuIGRlIGxvcyBjb21wb25lbnRlcywgb3JkZW5hZG9zIHBvciBzdXMgKmVpZ2VudmFsb3JlcyogeSwgYWxsw60sIGlkZW50aWZpY2FyIGVsICJjb2RvIiBkZSBsYSBkaXN0cmlidWNpw7NuLiBTZXLDoSBlbiBlc2EgcG9zaWNpw7NuIGRvbmRlIHNlIGRlZmluYSBsYSBjYW50aWRhZCBkZSBjb21wb25lbnRlcyBhIGluY2x1aXIuIFtAdGFjcV9tdWx0aXZhcmlhdGVfMTk5OCwgcC4gMjgwXQoKTGEgbWFuZXJhIGRlIGdlbmVyYXIgZGljaGEgZ3LDoWZpY2EgZXMgYSBwYXJ0aXIgZGU6CgpgYGB7ciBzY3JlZV9wbG90LCBmaWcuY2FwPSAiU2NyZWUgcGxvdCJ9CnZhcl9leHBsaWNhZGEgPSBwY2ExICQgc2RldiBeIDIgLyBzdW0ocGNhMSAkIHNkZXYgXiAyKSAjdmVjdG9yIGNvbiBsYSB2YXJpYW56YSBleHBsaWNhZGEgcG9yIGNhZGEgY29tcG9uZW50ZQpxcGxvdChjKDE6NSksIHZhcl9leHBsaWNhZGEpICsgCiAgZ2VvbV9saW5lKCkgKyAKICB4bGFiKCJDb21wb25lbnRlIFByaW5jaXBhbCIpICsgCiAgeWxhYigiVmFyaWFuemEgRXhwbGljYWRhIikgKwogIGdndGl0bGUoIlNjcmVlIFBsb3QiKQpgYGAKCkVuIGVzdGEgZ3LDoWZpY2Egc2Ugb2JzZXJ2YSBxdWUgZW4gZWwgZWplIFggKGhvcml6b250YWwpIHNlIGVuY3VlbnRyYSBkaXN0cmlidWlkb3MgY2FkYSB1bm8gZGUgbG9zIGNvbXBvbmVudGVzIGdlbmVyYWRvcywgbWllbnRyYXMgcXVlIGVuIGVsIGVqZSBZICh2ZXJ0aXphbCkgc2UgbWlkZSBsYSBwcm9wb3JjacOzbiBkZSB2YXJpYW56YSBleHBsaWNhZGEgKGRlbCB0b3RhbCBkZWwgdW5pdmVyc28gZGUgY2Fzb3MgY29udGVuaWRvcyBlbiBsYSBtYXRyaXogZGUgZGF0b3MpIHF1ZSBleHBsaWNhIG8gYWJhcmNhIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcyAkQ19pJC5cCgpFbCBvYmpldGl2byBlbiBkaWNobyBncsOhZmljbyBjb25zaXN0ZSBlbiBpZGVudGlmaWNhciBsYSB1YmljYWNpw7NuIGRlbCAiY29kbyIgZW4gbGEgY3VydmEgcXVlIHVuZSBhIGxhcyBwcm9wb3JjaW9uZXMgZGUgdmFyaWFuemEgZXhwbGljYWRhIHBvciBjYWRhIGNvbXBvbmVudGUuIFB1ZXMgZWwgbHVnYXIgbyBjb21wb25lbnRlIGVuIHF1ZSBzZSBlbmN1ZW50cmUgZGljaG8gZG9ibGV6IGVuIGxhIGN1cnZhLCBzZXJ2aXLDoSBwYXJhIGluZGljYXIgbGEgY2FudGlkYWQgZGUgbnVldmFzIGRpbWVuc2lvbmVzIGEgbWFudGVuZXIgcGFyYSBlbCBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIHBvc3Rlcmlvci5cCgpDb21vIHNlIG9ic2VydmEgZW4gbGEgZ3LDoWZpY2EgZGVsICIqc2NyZWUgcGxvdCoiLCBlbCBjb2RvIHNlIHViaWNhIGVuIGxhIHBvc2ljacOzbiBkZWwgc2VndW5kbyBjb21wb25lbnRlLCBwb3IgbG8gcXVlIGxhIGRlY2lzacOzbiBkZWwgYW5hbGlzdGEgdGVuZHLDrWEgcXVlIHBhcnRpciBkZSwgcHJpbWVybywgYWNlcHRhciBsYSBpbmNsdXNpw7NuIGRlbCBwcmltZXIgY29tcG9uZW50ZSwgbWllbnRyYXMgcXVlIGRlYmVyw6EgZXhhbWluYXIgbGEgbWF0cml6IGRlICJwZXNvcyIgKCpsb2FkaW5ncyopIHkgbG9zIHZhbG9yZXMgZGUgbGFzIGNvcnJlbGFjaW9uZXMgZXhpc3RlbnRlcyBlbnRyZSBsYXMgdmFyaWFibGVzIGNvbiBlbCBjb21wb25lbnRlIDIgJENfMiQgcGFyYSwgYXPDrSwgZGVjaWRpciBzaSBzdSBpbmNsdXNpw7NuIGVzIHBlcnRpbmVudGUgdGXDs3JpY2FtZW50ZS5cCgojIEdyYWZpY2FjacOzbiBkZSBsb3MgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMKCkNvbW8gc2UgbWVuY2lvbsOzIGFycmliYSwgZWwgbcOpdG9kbyAqKlBDQSoqIHNlIGFwb3lhIC1lbiBncmFuIG1lZGlkYS0gZW4gbGEgcmVwcmVzZW50YWNpw7NuIGdlb23DqXRyaWNhIGRlIGxvcyBjb21wb25lbnRlcywgZW4gbG9zIHF1ZSBzZSBncmFmaWNhbiBsYSBwcm95ZWNjacOzbiBkZSBjYWRhIGNhc28gKGZpbGEpIGRlIGxhIG1hdHJpeiBkZSBkYXRvcyBzb2JyZSBjYWRhIHVuYSBkZSBsYXMgbnVldmFzIGRpbWVuc2lvbmVzIGdlbmVyYWRhcyB5IHNlbGVjY2lvbmFkYXMgZW4gZWwgYW7DoWxpc2lzIGRlIHJlZHVjY2nDs24gZGUgZGltZW5zaW9uZXMuXAoKRW4gZXN0ZSBncsOhZmljbyBudWV2byBzZSB0b21hbiBlbiBjb25zaWRlcmFjacOzbiBsYXMgY29ycmVsYWNpb25lcyBleGlzdGVudGVzIGVudHJlIHRvZG9zIGxvcyBjYXNvcyBwYXJhIHRvZGFzIHN1cyB2YXJpYWJsZXMgeSBzZSBtYXBlYW4gZW4gdW4gcGxhbm8gZGUgJHAkIGRpbWVuc2lvbmVzLiBFbiBzdSBpbnRlcmlvciwgbG9zIGNhc29zIHF1ZSByZWdpc3RyZW4gY29ycmVsYWNpb25lcyBhbHRhcyBlbnRyZSBzw60gc2UgdGllbmRlbiBhIHViaWNhciBvIGFncnVwYW4ganVudG9zLlwKCkxhIG1hbmVyYSBkZSBlbGFib3JhciBkaWNobyBncsOhZmljbywgdW5hIHZleiBxdWUgc2UgZGVmaW5pw7MgcXVlIHNlIGNvbnNpZGVyYXLDrWEgMiBjb21wb25lbnRlcyBwYXJhIGxhIHJlZHVjY2nDs24gZGUgbGFzIGRpbWVuc2lvbmVzIGRlIGxhIG1hdHJpeiBkZSBkYXRvcywgc2UgcHVlZGUgcmVhbGl6YXIgY29uIGVsIGNvbWFuZG8gYGJpcGxvdCgpYCBkZWwgc2lzdGVtYSBiYXNlIGRlIGBSYCwgcGVybyBhIGNvbnRpbnVhY2nDs24gc2UgcmVhbGl6YSBjb24gZWwgY29tYW5kbyBgZnZpel9wY2FfYmlwbG90KClgIGRlIGxhIGxpYmVyw61hIGBmYWN0b2V4dHJhKClgIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgpgYGB7ciBiaXBsb3QsIGZpZy5jYXA9ICJHcsOhZmljbyBkZSAyIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLiJ9CmZ2aXpfcGNhX2JpcGxvdChwY2ExLCAjbWF0cml6IGRlIGRhdG9zIHF1ZSBjb250aWVuZSBsb3MgcmVzdWx0YWRvcyBkZWwgYW7DoWxpc2lzIFBDQQogICAgICAgICAgICAgICAgZ2VvbSA9ICJwb2ludCIsICNyZXByZXNlbnRhY2nDs24gZ3LDoWZpY2EgbyBwcm95ZWNjacOzbiBkZSBjYWRhIHVubyBkZSBsb3MgY2Fzb3MgCiAgICAgICAgICAgICAgICBjb2wudmFyID0gInJlZCIsICNkZWZpbmljacOzbiBkZWwgY29sb3IgcGFyYSBsYSByZXByZXNlbnRhY2nDs24gZGUgbGFzIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgY29sLmluZCA9ICJncmV5IikgI2RlZmluaWNpw7NuIGRlbCBjb2xvciBwYXJhIGxhIHByb3llY2Npw7NuIGRlIGxvcyBjYXNvcwpgYGAKCkEgcGFydGlyIGRlIGRpY2hvIGdyw6FmaWNvIHNlIG9ic2VydmEgbG8gc2lndWllbnRlOgoKMS4gIEFtYm9zIGVqZXMgc2UgZW5jdWVudHJhbiBlcyBlc2NhbGFzIGVzdGFuZGFyaXphZGFzLgoyLiAgRWwgZWplIFggc2UgY29ycmVzcG9uZGUgY29uIGVsICRDXzEkIHkgZWwgcG9yY2VudGFqZSBkZSB2YXJpYWJpbGlkYWQgcXVlIGV4cGxpY2EgZGUgbG9zIGNhc29zLgozLiAgRWwgZWplIFkgc2UgY29ycmVzcG9uZGUgY29uIGVsICRDXzIkIHkgZWwgcG9yY2VudGFqZSBkZSB2YXJpYWJpbGlkYWQgcXVlIGV4cGxpY2EgZGUgbG9zIGNhc29zLgo0LiAgQ2FkYSB1bm8gZGUgbG9zIHB1bnRvcyByZXByZXNlbnRhZG9zIGRlbnRybyBkZWwgcGxhbm8gY2FydGVzaWFubyBzZSBjb3JyZXNwb25kZSBjb24gbGEgcHJveWVjY2nDs24gZGUgY2FkYSB1bm8gZGUgbG9zIGNhc29zIChmaWxhcykgY29udGVuaWRvcyBlbiBsYSBtYXRyaXogZGUgZGF0b3Mgb3JpZ2luYWwgc29icmUgY2FkYSB1bm8gZGUgbG9zIGNvbXBvbmVudGVzLgo1LiAgU2UgcmVwcmVzZW50YW4gbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIGluY2x1aWRhcyBlbiBlbCBhbsOhbGlzaXMgKGVuIGNvbG9yIHJvam8pLgoKQSBwYXJ0aXIgZGUgZXN0YSByZXByZXNlbnRhY2nDs24gc2UgcHVlZGUgb2JzZXJ2YXIgbGEgcHJveWVjY2nDs24gZGUgY2FkYSB1bm8gZGUgbG9zIGNhc29zIHNvYnJlIGNhZGEgdW5hIGRlIGxhcyBkaW1lbnNpb25lcyBvIGNvbXBvbmVudGVzIHNlbGVjY2lvbmFkb3MuIFksIGdyw6FmaWNhbWVudGUsIHNlIHB1ZWRlIG9ic2VydmFyIGxhIHBvc2ljacOzbiBkZSBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzIHNvYnJlIGxvcyBlamVzIHF1ZSByZXByZXNlbnRhIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcy4gQSBwYXJ0aXIgZGUgdWJpY2FyIGxhIHZhcmlhYmxlIHF1ZSBzZSBhbGluZWEgc29icmUgbGEgbMOtbmVhIHB1bnRlYWRhIChsYSByZXByZXNlbnRhY2nDs24gZGUgY2FkYSBkaW1lbnNpw7NuKSwgZXN0byBheXVkYSBhIGlkZW50aWZpY2FyIGN1w6FsIGRlIMOpc3RhcyBlcyBsYSBxdWUgdGllbmUgbcOhcyAicGVzbyIgKCpsb2FkaW5nKikgc29icmUgZGljaG8gY29tcG9uZW50ZS5cCgpJZGVudGlmaWNhciBlbCBwZXNvIGRlIGxhIHZhcmlhYmxlIHNvYnJlIGNhZGEgZGltZW5zacOzbiBheXVkYSBhIGludGVycHJldGFyIGVsIHNlbnRpZG8gdGXDs3JpY28gZGUgY2FkYSBjb21wb25lbnRlLlwKCkVuIGxhIGdyw6FmaWNhIGFudGVyaW9yIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBsYXMgdmFyaWFibGVzIGRlICJkZW1vY3JhY2lhIGxpYmVyYWwiICh2MnhfbGliZGVtKSB5IGRlICJkZW1vY3JhY2lhIGRlbGliZXJhdGl2YSIgKHYyeF9kZWxpYmRlbSIpIHNvbiBsYXMgcXVlIGVqZXJjZW4gbWF5b3IgaW5mbHVlbmNpYSBzb2JyZSBlbCBwcmltZXIgY29tcG9uZW50ZSAkQ18xJC4gRW4gY2FtYmlvLCBzb2JyZSBsYSBzZWd1bmRhIGRpbWVuc2nDs24gJENfMiQgbm8gbmVjZXNhcmlhbWVudGUgYWxndW5hIGRlIGxhcyB2YXJpYWJsZXMgZWplcmNlIHVuIHBlc28gKCpsb2FkaW5nKikgZGVjaXNpdm8gc29icmUgc3UgY29tcG9ydGFtaWVudG8uXAoKIyBSZWZlcmVuY2lhcwo=