hllinas2023

1 Introducción

1.0.1 Tipo de relación

El análisis factorial establece una conexión directa entre las variables o los encuestados.

1.0.2 ¿Qué busca identificar?

El análisis factorial busca identificar los factores y determinar la contribución de cada variable a cada factor.

1.0.3 Propósito/objetivo

  1. Resumir la información contenida en una serie de variables o entre los encuestados (las observaciones).

  2. Identificar un conjunto reducido de variables latentes que pueden reemplazar un conjunto más amplio de variables observadas si están correlacionadas. Estas variables (latentes o no observadas) se utilizan en análisis multivariados posteriores, creando así un conjunto de variables nuevas, de menor número, para sustituir parcial o totalmente a las variables originales en técnicas subsiguientes.

1.0.4 ¿En qué se apoya?

Se basa en la diferenciación de la variabilidad de las variables observadas y, por ende, de la varianza, descomponiéndola en dos tipos:

  1. Una parte común, explicada por un conjunto de factores comunes que influyen en todas las variables.

  2. Una parte específica, que no está relacionada con esa variabilidad común y es única para cada variable. Esta parte específica es explicada por factores específicos o únicos que reflejan la singularidad de cada variable. Estos factores suelen ser independientes y ortogonales entre sí en su mayoría.

1.0.5 ¿Qué se necesita estimar primero?

El número apropiado de factores necesitados para modelar los datos.

2 Modelo con factores ortogonales

2.0.1 Definición del modelo

Consideremos un vector \(X = (X_1, X_2, \ldots, X_K)^T\) de variables aleatorias observables, en una población normal con vector de medias \(E(X) = \mu\) y matriz de varianza-covarianza \(V(X)=\Sigma\), dadas por \[\mu\; = \;\left( \begin{array}{c} \mu_{1} \\ \mu_{2} \\ \vdots \\ \mu_{K} \\ \end{array}\right) \; =\; \left( \begin{array}{c} E(X_1) \\ E(X_2) \\ \vdots \\ E(X_K) \\ \end{array}\right), \qquad \Sigma \;=\; \left(\begin{array}{lllll} {\sigma}^2_{11} & {\sigma}^2_{12} & \cdots & {\sigma}_{1K} \\ {\sigma}_{21} & {\sigma}^2_{22} & \cdots & {\sigma}_{2K} \\ \vdots & \vdots & \ddots & \vdots \\ {\sigma}_{K1} & {\sigma}_{K2} & \cdots & {\sigma}^2_{KK} \\ \end{array}\right) \]

Además, supongamos que cada \(X_k\), se pueden escribir como combinación lineal de las coordenadas de los vectores \(F = (F_1, F_2, \ldots, F_J)^T\) y \(\varepsilon = (\varepsilon_1, \varepsilon_2,\ldots, \varepsilon_K)^T\), de la siguiente forma:

\[\begin{eqnarray} X_1 &=& \mu_1 + \lambda_{11} F_1 + \cdots + \lambda_{1J} F_J + \varepsilon_1, \tag{2.1}\\ X_2 &=& \mu_2 + \lambda_{21} F_1 + \cdots + \lambda_{2J} F_J + \varepsilon_2,\nonumber\\ \hspace{-0.5cm}\vdots &=& \hspace{3cm} \vdots\nonumber\\ \hspace{-0.5cm}\vdots &=& \hspace{3cm} \vdots\nonumber\\ X_K &=& \mu_K + \lambda_{K1} F_1 + \cdots + \lambda_{KJ} F_J + \varepsilon_K,\nonumber \end{eqnarray}\]

donde:

  • \(\mu_k = E(X_k)\),

  • \(\lambda_{k1} F_1 + \cdots + \lambda_{km} F_J\), es el efecto de las \(J\) coordenadas \(F_1, \ldots , F_J\),

  • \(\varepsilon_k\) es la \(k\)-ésima coordenada del vector \(\varepsilon\) sobre la variable aleatoria \(X_k\), \(k=1,\ldots, K\),

  • \(\lambda_{kj}\), es la carga o contribución que la coordenada \(F_j\), tiene sobre la variable \(X_k\).

Es decir, para cada \(k=1,2, \ldots, K\), se tiene que

\[X_k \;= \; \mu_k \; +\; \sum\limits_{j=1}^J \lambda_{kj} \, F_j \;+\; \varepsilon_k\]

A manera de ejemplo, la situación se puede visualizar en la Figura 2.1 (para el caso \(K=7\) y \(J=3\)).

**Análisis factorial para el caso $K=7$ y $J=3$**

Figure 2.1: Análisis factorial para el caso \(K=7\) y \(J=3\)

Vectorialmente el sistema de ecuaciones (2.1), se puede expresar así:

\[\left( \begin{array}{c} X_{1} \\ X_{2} \\ \vdots \\ X_{K} \\ \end{array}\right) \;=\; \left( \begin{array}{c} \mu_{1} \\ \mu_{2} \\ \vdots \\ \mu_{K} \\ \end{array}\right) \;+\; \left(\begin{array}{lllll} \lambda_{11} & \lambda_{12} & \cdots & \lambda_{1J} \\ \lambda_{21} & \lambda_{22} & \cdots & \lambda_{2J} \\ \vdots & \vdots & \ddots & \vdots \\ \lambda_{K1} & \lambda_{K2} & \cdots & \lambda_{KJ} \\ \end{array}\right) \left( \begin{array}{c} F_{1} \\ F_{2} \\ \vdots \\ F_{J} \\ \end{array}\right) \;+\; \left( \begin{array}{c} \varepsilon_{1} \\ \varepsilon_{2} \\ \vdots \\ \varepsilon_{K} \\ \end{array}\right) \]

o, de la siguiente forma:

\[X \;=\; \mu \;+\; \Lambda \, F \;+\; \varepsilon,\]

donde \(\Lambda = (\Lambda_{kj})_ {K\times J}\) es la matriz de coeficiente del vector \(F\).

El análisis factorial indica que el vector \(X\) se crea a través de la ecuación vectorial previamente definida, donde \(F\) representa un vector de variables latentes de tamaño \(J \times 1\), o factores no observados, que son compartidos entre las \(K\) coordenadas del vector aleatorio \(X\).

2.0.2 Supuestos: general

Supondremos que:

  1. \(F\) se distribuye según una distribución normal multivariada de media cero y matriz de covarianza identidad \(I_J\), es decir, los factores son variables aleatorias con media cero, varianza uno e independientes entre sí.

  2. \(\Lambda\) es una matriz de dimensiones \(K \times J\), donde \(J \leq K\), y contiene constantes desconocidas llamadas cargas factoriales, que representan cómo los factores \(F\) afectan a las variables observadas en el vector \(X\).

  3. \(\varepsilon\) es un vector de dimensiones \(K\times 1\) que representa las perturbaciones no observadas, incluyendo el efecto de todas las variables distintas a los factores comunes que influyen en \(X\).

  4. Es importante destacar que las coordenadas del vector \(\varepsilon\) y las del vector \(F\) son incorreladas.

2.0.3 Supuestos: resumen

En resumen, los supuestos del modelo factorial ortogonal son los siguientes:

Supuesto 1:

Si \(I_J\) es la matriz idéntica de tamaño \(J\), entonces, \(F \sim {\cal N}_{J}(0,\; I_J)\). Es decir,

\[E(F_j) =0, \qquad V(F_j)=1, \qquad Cov(F_i, F_j) =0, \quad i\ne j\] O, escrito vectorialmente,

\[E(F) \;=\; 0, \qquad Cov(F) \;=\; E(F F^T) \;=\; I_J\]

Supuesto 2:

\(\varepsilon \sim {\cal N}_{K}(0,\; \Psi)\), donde \(\Psi\), es la matriz de varianza del vector aleatorio de las perturbaciones \(\varepsilon\). Es decir,

\[E(\varepsilon) \;=\; 0, \qquad Cov(\varepsilon) \;=\;E(\varepsilon \, \varepsilon^T) \;=\;\Psi\]

Supuesto 3:

\(Cov (F,\;\varepsilon) = 0\). Es decir,

\[Cov(F_j, \,\varepsilon_i) =0, \quad i\ne j, \quad i=1,\ldots, K, \quad j=1,\ldots, J\]

Si \(0_J\) es la matriz de ceros y es de tamaño \(J\times J\), lo anterior se puede escribir vectorialmente, de la siguiente manera:

\[Cov(F,\varepsilon) \;=\; 0_J\]

2.0.4 Propiedades de \(X\)

Con estas tres condiciones, se cumplen:

Propiedad 1:

\(X \sim {\cal N}_{K} (\mu , \Sigma)\), donde \(\mu\) es el vector de meduias y \(\Sigma\) es la matriz de varianza-covarianza. Es decir,

\[E(X) \;=\; \mu \;=\; \left( \begin{array}{c} \mu_{1} \\ \mu_{2} \\ \vdots \\ \mu_{K} \\ \end{array}\right), \qquad Cov(X) \;=\; \Sigma \;=\; \left(\begin{array}{lllll} {\sigma}^2_{11} & {\sigma}^2_{12} & \cdots & {\sigma}_{1K} \\ {\sigma}_{21} & {\sigma}^2_{22} & \cdots & {\sigma}_{2K} \\ \vdots & \vdots & \ddots & \vdots \\ {\sigma}_{K1} & {\sigma}_{K2} & \cdots & {\sigma}^2_{KK} \\ \end{array}\right) \]

Propiedad 2:

Se cumple que la covarianza entre \(X_i\) y \(X_j\), para \(i\ne k\), viene dada por:

\[\sigma_{ik} \;:=\; Cov(Xi,\; X_k) \;= \; \sum\limits_{r=1}^K \lambda_{ir} \, \lambda_{kr}, \quad i\ne k\] Por esta razón, podemos afirmar que las covarianzas no dependen en absoluto de las variables específicas, de hecho, basta con los factores comunes.

2.0.5 Comunalidad y especificidad

Propiedad 3:

Dado que los factores no son observables, se puede fijar arbitrariamente su media en 0my su varianza en 1, esto es, se consideran variables estandarizadas que están incorreladas entre sí, de modo que los pesos factoriales resultan ser las correlaciones entre las variables y los factores. Así, con las suposiciones previas, la varianza de la variable \(X_k\) es

\[V(X_k) \;= \; h_k^2 \;+\; \psi_k\]

En lo anterior, se encuentran las llamadas comunalidad y especificidad de \(X_k\).

Comunalidad:

\(h_k^2\) es la comunalidad de la variable \(X_k\) y representa la varianza compartida con las otras variables por medio de los factores comunes \(F\). Es la contribución del factor \(F_j\) a la varianza total. Está dada por:

\[h_k^2 \;=\; V\left(\sum\limits_{j=1}^J \lambda_{kj}\, F_j\right)\;=\; \sum\limits_{j=1}^J \lambda^2_{kj} \;=\; \lambda_k^T \, \lambda_k\]

donde \(\lambda_k\) es la \(k\)-ésima columna de \(\Lambda^T\):

\[\Lambda \;= \; \left(\begin{array}{cccccc} \lambda_{11} & \lambda_{12} & \cdots &{\color{DarkGreen} \lambda_{1j}} & \cdots & \lambda_{1J} \\ \lambda_{21} & \lambda_{22} & \cdots &{\color{DarkGreen} \lambda_{2j}} & \cdots & \lambda_{2J} \\ \vdots & \vdots & \cdots & {\color{DarkGreen} \vdots} &\ddots & \vdots \\ {\color{Red}\lambda_{k1} } & {\color{Red}\lambda_{k2}} & {\color{Red}\cdots} &{\color{Red} \lambda_{kj}} & {\color{Red}\cdots} & {\color{Red}\lambda_{kJ} } \\ \vdots & \vdots & \cdots & {\color{DarkGreen} \vdots} &\ddots & \vdots \\ \lambda_{K1} & \lambda_{K2} & \cdots & {\color{DarkGreen} \lambda_{Kj}} & \cdots & \lambda_{KJ} \\ \end{array}\right), \qquad \Lambda^T \;= \; \left(\begin{array}{cccccc} \lambda_{11} & \lambda_{21} & \cdots &{\color{Red} \lambda_{k1}} & \cdots & \lambda_{K1} \\ \lambda_{12} & \lambda_{22} & \cdots &{\color{Red} \lambda_{k2}} & \cdots & \lambda_{K2} \\ \vdots & \vdots & \cdots & {\color{Red} \vdots} &\ddots & \vdots \\ {\color{DarkGreen}\lambda_{1j} } & {\color{DarkGreen} \lambda_{2j}} & {\color{DarkGreen}\cdots} &{\color{Red} \lambda_{kj}} & {\color{DarkGreen}\cdots} & {\color{DarkGreen}\lambda_{KJ} } \\ \vdots & \vdots & \cdots & {\color{Red} \vdots} &\ddots & \vdots \\ \lambda_{1J} & \lambda_{2J} & \cdots & {\color{Red} \lambda_{kJ}} & \cdots & \lambda_{KJ} \\ \end{array}\right), \qquad {\color{Red} \lambda_k} \;= \; \left(\begin{array}{c} {\color{Red} \lambda_{k1}} \\ {\color{Red} \lambda_{k2}} \\ {\color{Red} \vdots} \\ {\color{Red} \lambda_{kj}} \\ {\color{Red} \vdots} \\ {\color{Red} \lambda_{kJ}} \\ \end{array}\right)\]

Especificidad:

La especificidad (o varianza única) y recoge la variabilidad no compartida con las otras variables. Es decir, es la varibailidad exclusiva de \(X_k\), o sea, la varianza que no es compartida por \(X_k\) con las otras variables. Está dada por:

\[\psi_k = V(\varepsilon_k)\]

2.0.6 Ejemplo gráfico

Consideremos la situación que se muetra en la Figura 2.2. En ella, para cada variable, la región sombreada se asocia con la comunalidad y la no sombreada con la especificidad.

**Comunalidad y especificidad**

Figure 2.2: Comunalidad y especificidad

2.0.7 Varianza retenida

La varianza retenida por todos los factores comunes o la vrianza explicada por todos los factores es:

\[H \;= \; \sum\limits_{k=1}^K h^2_k \]

2.0.8 Proporción de la participación de un factor

La proporción de la participación de un factor \(F_j\) en la comunalidad total es

\[\tilde{h}_k \; = \; \frac{h_k}{H}\]

2.0.9 Propiedades de la matriz de carga

Propiedad 4:

La matriz de carga \(\Lambda\) representa las covarianzas entre los factores y las variables observadas. Es decir, \[Cov (X, F^T) \;=\; \Lambda\]

Demostración de la propiedad 4:

Para demostrar esto, multipliquemos \(F^T\) por la derecha de la ecuación:

\[\tilde{X} \; := \; X \; - \; \mu \; = \; \Lambda F \; + \; \varepsilon ,\]

Y queda así:

\[\tilde{X} \, F^T \; = \; \Lambda F \, F^T \; + \; \varepsilon\, F^T\]

Al aplicar esperanza a ambos lados de la igualdad, se obtiene:

\[Cov (\tilde{X}, F^T) \;=\; E[\tilde{X}\, F^T] \; = \; \Lambda \, \underbrace{E(F\, F^T)}_{\;=\; 1} \; + \; \underbrace{ E(\varepsilon\, F^T)}_{\;=\; 0} \; = \; \Lambda\]

Propiedad 5:

En el resultado anterior, se tuvo en cuenta que las \(F_j\) están incorreladas entre sí y con las \(\varepsilon_k\), para todo \(j,k+1,\ldots,K\). Por otro lado, sabiendo que la varianza de \(X\) es \(\Sigma_X = \Sigma\), se puede demostrar que:

\[\begin{eqnarray} \Sigma &=& \Lambda \Lambda^T \; +\; \Psi \tag{2.2} \end{eqnarray}\]

donde \(\Psi\), es la matriz de varianza del vector aleatorio de las perturbaciones \(\varepsilon\).

Propiedad 6:

Si las variables originales se han estadarizados (media = 0, varianza=1), entonces, \(\Sigma = R\) (la matriz de correlaciones). Con ello, la ecuación (2.2) quedaría así:

\[\begin{eqnarray} R &=& \Lambda \Lambda^T \; +\; \Psi \tag{2.3} \end{eqnarray}\]

2.0.10 Soluciones factoriales

En el Análisis Factorial no existe una solución única para determinar la matriz de pesos. Es fácil ver que la ecuación (2.2) tiene infinita soluciones para \(\Lambda\), ya que, por ejemplo si \(M\) es una matriz ortogonal de orden \(J\), entonces

\[\begin{eqnarray*} X &=& \mu \;+\; \Lambda F \;+\; \varepsilon \\ &=& \mu \;+\; (\Lambda \,M)\, (M^T \, F) \; +\; \Omega \\ &=& \mu \;+\; \tilde{\Lambda} \, \big(\tilde{\Lambda} F\big) \; + \;\Omega \end{eqnarray*}\]

es también solución de (2.2). Observe que este nuevo modelo verifica las mismas propiedades que el anterior: tiene como factores \(\tilde{F} = \tilde{\Lambda} F\) y como matriz de pesos a \(\tilde{\Lambda} =\Lambda \,M\). En este caso, la matriz de covarianzas de las variables originales es

\[\Sigma \;=\; (\Lambda \,M)\, (\Lambda \, M)^T + \Psi \]

Ya que como \(MM^T = I\), la expresión anterior se reduce a \(\Sigma =; \Lambda \, \Lambda^T + \Psi\) como antes. De este modo se explica, de manera equivalente,la matriz de covarianzas de las variables originales.

Se trata entonces de seleccionar matrices ortogonales de manera que las variables originales exhiban un gran contraste en un factor y no en otros, lo que proporcionaría interpretación a los factores en términos de estas variables con carga máxima sobre ellos. En resumen, puede ser que la solución sea más interpretable mediante el uso de alguna matriz ortogonal, lo que lleva al concepto de rotación de los factores.

2.0.11 Rotación de los ejes factoriales

Una estrategia para lograr esto es elegir una matriz ortogonal \(P\) que maximice la varianza por filas de los cuadrados de los elementos de la matriz \(\Lambda\). La elección de los cuadrados se justifica por el interés en los elementos pequeños y grandes de \(\Lambda\). En términos generales, el propósito primordial al llevar a cabo una rotación es buscar una estructura más simple. Las condiciones que se deben satisfacer son:

  1. Cada fila de la matriz factorial de pesos debe incluir al menos un elemento nulo.

  2. Cada columna de la matriz factorial de pesos debe contener al menos \(j\) elementos nulos.

  3. Cada par de columnas de la matriz factorial de pesos debe contener múltiples variables con pesos nulos en una columna pero no en la otra.

  4. Si hay más de cuatro factores, cada par de columnas de la matriz factorial de pesos debe contener un número considerable de variables con pesos nulos en ambas columnas.

  5. Por el contrario, si hay más de cuatro factores, en cada par de columnas de la matriz factorial de pesos solo un número reducido de variables debe tener pesos distintos de cero.

Cuando se logra una configuración sencilla, las variables observadas están agrupadas en conjuntos mutuamente excluyentes, de manera que las ponderaciones son elevadas en algunos factores y reducidas en los demás.

2.0.12 Tipos de rotaciones

Hay dos tipos posibles de rotaciones: ortogonales y oblicuas. La principal ventaja de las rotaciones ortogonales es su simplicidad, ya que los pesos representan las correlaciones entre los factores y las variables, sin embargo esto no se cumple en el caso de las rotaciones oblicuas.

2.0.13 Rotaciones ortogonales

En este caso, los ejes de rotación forman un ángulo de 90 grados (véase la figura 2.3).

**Rotación ortogonal**

Figure 2.3: Rotación ortogonal

Entre las rotaciones ortogonales se encuentran dos tipos principales:

Rotación Varimax.

Fue propuesta por Kaiser (1958), y trata de que los factores tengan unas pocas saturaciones altas y muchas casi nulas en las variables. Esto hace que haya factores con correlaciones altas con un número pequeño de variables y correlaciones nulas en el resto, quedando así redistribuida la varianza de los factores. En este caso, se maximizan las varianzas de las columnas de \(\Lambda\), es decir la expresión (llamado criterio varimax):

\[V \;= \; \frac{1}{K^2} \sum_{j=1}^J \left[K \sum_{i=1}^K (\lambda_{ij})^4 - \left(\sum_{i=1}^K (\lambda_{ij})^2 \right)^2 \right]\]

En resumen, en el método de rotación varimax se busca maximizar las ponderaciones a nivel del factor; es decir, se espera que cada ítem o variable sea representativo en solo uno de ellos, con el fin de minimizar al máximo el número de variables dentro de cada factor.

Rotación Quartimax.

Trata que una variable dada esté muy correlacionada con un factor y muy poco correlacionada con el resto de factores. Se usa menos frecuentemente que la anterior. Para este caso, en vez de maximizar la varianza de las columnas, se maximiza la de las columnas. Es decir, la expresión (llamado criterio quartimax)::

\[Q \;= \; \frac{1}{J^2}\sum_{i=1}^K \left[J \sum_{j=1}^J (\lambda_{ij})^4 - \left(\sum_{j=1}^J (\lambda_{ij})^2 \right)^2 \right]\]

En resumen, en el caso de la rotación quartimax, la maximización de las ponderaciones se realiza a nivel de la variable, lo que busca minimizar el número de factores que ayude a explicar cada una de ellas.

Rotación orthomax

Se ha demostrado el hecho de que quartimax y varimax son en realidad una fórmula como se muestra a través del criterio ortomax: \[V \;= \; K\, Q \;-\; cW\] donde:

  • \(W\) es la suma de los cuadrados de las varianzas de los factores (después de la rotación).

  • \(c=0\) para quartimax (por lo general, \(K\) se remuesve de la fórmula).

  • \(c=1\) para varimax.

Se investigó con datos de análisis factorial en busca de un valor mayor para el coeficiente \(c\) con el fin de resaltar el lado varimaxiano y no quartimaxiano del criterio.

En general, el coeficiente \(c\) puede tomar cualquier valor. Cuando se acerca a \(+\infty\), produce factores de varianzas completamente iguales (así que se puede usar si ese es el objetivo). Cuando se acerca a \(-\infty\), se obtiene cargas iguales a las que obtendríamos si rotáramos nuestra matriz de cargas a sus componentes principales mediante PCA (sin centrar las columnas). Por lo tanto, el valor de \(c\) es el parámetro que estira la dimensión “gran factor general vs. todos los factores con igual fuerza”.

Rotación equamax.

Con la rotación equamax se hace una combinación de las dos técnicas anteriores; por consiguiente, la maximización de las ponderaciones se hace tanto a nivel del factor como a nivel de la variable. En este caso, se encontró que \(c=\frac{m}{2}\) a menudo produce factores más interpretables que después de rotaciones varimax o quartimax. El método equamax está definido por \[E \;= \; K\, Q \;-\; \frac{J}{2}\,W\]

La justificación para hacer que \(c\) dependa de \(J\) fue que, a medida que el número de factores aumenta mientras que \(K\) no, la proporción esperada a priori de variables que serán cargadas por cualquier factor disminuye; y para compensarlo, deberíamos aumentar \(c\).

Rotación parsimax.

Un enfoque adicional, similar a equamax pero aún más audaz en su búsqueda de simplicidad, se denomina parsimax (maximizando la parsimonia). En una búsqueda similar para “mejorar” aún más el criterio genérico, se llegó a proponerse el llamado criterio parsimax. Aquí, el valor del coeficiente \(c\) depende tanto de \(J\) como de \(K\) y está definido como:

\[c = \frac{K\, (J\;-\; 1)}{K\; +\; J\; -\; 2}\]

Rotación facpars (factor parsimony).

Cuando se hace \(c=K\).

2.0.14 Rotaciones oblicuas

En este caso, los ejes de rotación no forman un ángulo de 90 grados (véase la figura 2.4).

**Rotación oblicua**

Figure 2.4: Rotación oblicua

Entre las rotaciones oblicuas, la más empleada son: oblimín y promax.

Rotación Oblimín.

Con esta rotación se trata de hallar una estructura básica sin importar que las rotaciones sean ortogonales, lo cual implica que las saturaciones ya no indican las correlaciones entre los factores y las variables. La rotación oblimin permite establecer relaciones jerárquicas entre los factores. Por esta razón, se introduce un parámetro para regular el grado de correlación (es decir, el grado de inclinación) \(\delta\) entre los factores, con valores preferentemente entre \(-0.5\) y \(0.5\). Un valor de \(\delta\) de cero da las rotaciones más oblicuas. En cualquier caso, la rotación de los factores siempre es objeto de debate, ya que se pueden seleccionar los ejes que resulten más convenientes. No obstante, se puede concebir que una rotación es simplemente un medio para obtener ejes que faciliten la descripción de los puntos de la muestra de manera más sencilla.

Rotación promax.

En cuanto a la rotación promax, modifica los resultados de una rotación ortogonal hasta crear una solución con cargas factoriales lo más próximas posible a la estructura ideal. Para ello, eleva las cargas factoriales obtenidas en una rotación ortogonal a una determinada potencia (conocida como \(\kappa\)). En general, los valores de \(\kappa\) se encuentran entre 2 y 4, pero, a mayor potencia, mayor oblicuidad en la solución (el valor de \(\kappa\) más común es de 4).

2.0.15 Número máximo de factores

El máximo número de factores en esta técnica está restringido por el tamaño de la matriz de correlación derivada de las coordenadas del vector aleatorio \(X\). Si la matriz de correlación \(\Sigma_X\) tiene dimensiones \(K \times K\), entonces el número máximo de factores es \(\frac{K(K-1)}{2}\). Es importante tener en cuenta que la matriz \(\Sigma\) es simétrica.

2.0.16 Estimación del modelo

Dos objetivos importantes en el procedimiento son los siguientes:

  • Determinar el número de factores deseado.

  • Obtener una estimación de \(\Lambda\).

Para lograrlo, los métodos más utilizados son:

  1. Método de componentes principales. Es el procedimiento a través del cual se determinan las variables latentes ortogonales que capturan la mayor cantidad de variabilidad de las variables observadas, de manera similar a como se realiza en el método de componentes principales, pero aplicado a la matriz de coeficientes de correlación. La varianza explicada por el factor latente \(j\)-ésimo se define como:

\[V(F_j) = \sum_{k=1}^K \lambda_{kj}^2,\]

donde \(\lambda_{1j} , \ldots, \lambda_{Kj}\), es la j-ésima columna de la matriz de carga \(\Lambda\). La Varianza explicada por el primer factor debe ser mayor o igual a la explicada por el segundo, y así sucesivamente, hasta llegar al \(J\)-ésimo factor.

  1. Método del factor principal (Análisis factorial clásico).

  2. Método de máxima verosimilitud. Supondremos que un estimador para el modelo poblacional es:

    \[\widehat{\Sigma} \;= \;\widehat{\Lambda}\,\widehat{\Lambda}^T \; +\; \widehat{\Psi},\] con:

  • \(\widehat{\Sigma}\), como estimador de la matriz de covarianza \(\Sigma\).

  • \(\widehat{\Lambda}\) estimador de la matriz \(\Lambda\).

  • \(\widehat{\Psi}\) un estimador de la matriz \(\Psi\).

2.0.17 Prueba de independencia

Uno de los propósitos del análisis factorial consiste en obtener un conjunto reducido de factores que sean capaces de replicar y proporcionar información adecuada sobre las variables originales. Para que el empleo de este método sea justificado, es fundamental que exista una correlación significativa entre las variables originales. De lo contrario, carecería de sentido llevar a cabo el análisis factorial. Por lo tanto, antes de aplicar dicho análisis a un conjunto de variables, es imprescindible verificar la presencia de una correlación elevada entre las variables originales. A continuación se describen algunas estrategias para realizar esta verificación.

Estrategia 1.

Determinar si el número de correlaciones en la matriz que exceden 0.3 es alto. Algunos consideran correlaciones de 0.5 o más como significativas.

Estrategia 21.

La prueba de esfericidad de Bartlett asume normalidad multivariada. Verificar si la matriz de correlación es la matriz identidad o no lo es, o equivalentemente, si el determinante de esta matriz es igual a 1. Si la matriz de correlación es la matriz identidad o si su determinante es uno, no tiene sentido realizar el análisis factorial.

Estrategia 3.

El coeficiente de correlación parcial entre variables originales debe ser bajo si comparten factores comunes. Estos coeficientes son estimaciones de correlaciones entre factores únicos, por lo tanto, si las variables están correlacionadas, se esperan valores pequeños. Los coeficientes de correlación parcial miden la dependencia entre variables, controlando el efecto de otras.

Si denotamos con \(a_{i\, k}\) el coeficiente de correlación parcial entre las variables \(X_i\) y \(X_k\), entonces se puede calcular como:

\[a_{i\,k} \;=\; -\frac{D_{ik}}{\sqrt{D_{ii}\, D_{kk}}} \;=\; -\frac{\tilde{S}_{ik}}{\sqrt{\tilde{S}_{ii}\, \tilde{S}_{kk}}},\] donde \(D\) es el determinante de la matriz de correlaciones simples entre las variables originales, \(D_{ik}\) es el determinante de la submatriz obtenida al eliminar el elemento de la fila \(i\) y columna \(k\) en la matriz de correlaciones simples, y \(\tilde{S}_{ik}\) es el elemento en la posición \((i, k)\) en la inversa de la matriz de varianza-covarianza \(S=\widehat{\Sigma}\).

Estrategia 4.

El coeficiente de correlación múltiple al cuadrado entre una variable y todas las demás indica una estructura de correlación si es alto. Si esto ocurre para todas las variables (o para un alto porcentaje de ellas), es apropiado realizar el análisis factorial. Este coeficiente mide la proporción de la varianza de la variable dependiente explicada por un conjunto de variables independientes.

Si denotamos la variable dependiente como \(X_i\) y las variables independientes como \(X_k\), para \(k = 1,\ldots, K\) y \(i \ne j\), \(i = 1, \ldots, K\), entonces este coeficiente, \(R_{i\, \bullet}\), se puede calcular como:

\[R_{i\, \bullet} \;=\; 1-\frac{R}{R_{ii}} \;=\; 1 \;-\; \frac{1}{S_{ii}\, \tilde{S}_{ii}},\] donde \(S_{ii}\) y \(\tilde{S}_{ii}\) son los elementos en la posición \((i, i)\) de las matrices de varianza-covarianza y su inversa, respectivamente.

Estrategia 5.

El índice Kaiser-Meyer-Olkin (KMO) se utiliza para determinar si las variables están lo suficientemente correlacionadas como para realizar un análisis factorial.

En general, es una medida de la comparación de los coeficientes de correlación observados con los coeficientes de correlación parciales de las variables originales. Más específico, es un cociente entre las correlaciones observadas y las correlaciones parciales.La fórmula es la siguiente:

\[KMO \;=\; \frac{\sum\limits_{i=1}^K \, \sum\limits_{j=1}^K r_{ij}^2}{\sum\limits_{i=1}^K \sum\limits_{j=1}^K r_{ij}^2 \; + \; \sum\limits_{i=1}^K \sum\limits_{j=1}^K a_{ij}^2}\]

donde:

  • \(r_{ik}\) es el coeficiente de correlación observado entre las variables \(X_i\) y \(X_k\).

  • \(a_{ik}\) es el coeficiente de correlación parcial entre las variables \(X_i\) y \(X_k\), controlando el efecto de otras variables.

  • \(K\) es el número total de variables en el análisis factorial.

El índice KMO varía entre 0 y 1. La medida puede ser interpretada con las siguientes directrices:

  • Si \(KMO \geq 0.8\): perfecto para realizar un análisis factorial (AF).

  • Si \(KMO\) está entre 0.6 a 0.7: adecuado. Hay correlación y, por lo tanto, el AF es apropiado.

  • Si \(KMO\) está entre 0.4 a 0.5: aceptable. Se puede implementar un AF. Sin embargo se sugiere verificar el estado de las variables.

  • \(KMO\) menores a 0.4: no se recomienda un AF.

Es decir, un valor más cercano a 1 indica que las variables están bien correlacionadas y que el análisis factorial es apropiado. Un valor menor que 0.5 sugiere que las variables no están lo suficientemente correlacionadas y que el análisis factorial puede no ser apropiado.

Estrategia 6.

El índice MSA (Minimum Sample of Adequacy) es similar al anterior, pero el análisis se hace por variables. Se utiliza para determinar si una variable debe ser excluida del análisis factorial. El índice MSA se calcula como la proporción de la varianza explicada por las correlaciones entre las variables originales en comparación con la varianza total, teniendo en cuenta las correlaciones parciales. La fórmula es la siguiente:

\[MSA_k \;=\; \frac{\sum\limits_{i=1}^K r_{ik}^2}{\sum\limits_{i=1}^K r_{ik}^2 \;+\; \sum\limits_{i=1}^K a_{ik}^2} \]

También toma valores entre 0 y 1. Un valor alto de MSA indica que la variable i está bien relacionada con las otras variables y es adecuada para el análisis factorial. Por otro lado, un valor bajo sugiere que la variable i no está bien relacionada y podría considerarse para ser excluida del análisis factoria. En la práctica se sugiere que, si \(MSA_k < 0.5\), la variable debe ser excluida.

Observaciones.

El MSA o KMO aumenta conforme:

  • Aumenta el tamaño muestral.

  • Aumenta las correlaciones.

  • Aumenta el número de variables.

  • Desciende el número de factores.

2.0.18 Test de esfericidad

Si los datos siguen una distribución normal, esto permite formular una hipótesis sobre la estructura de la matriz \(\Sigma_X\) y determinar cuántos factores comunes deben retenerse. En este caso, las hipótesis nula y alternativa serían respectivamente:

\[H_0 :\Sigma = \Lambda \Lambda^T \;+\; \Psi\qquad \mbox{versus} \qquad H_1 : \Sigma \;\mbox{es semidefinida positiva}\]

Aquí: \(\Lambda\) es una matriz de \(K \times J\). Por lo tanto, si no se rechaza la hipótesis nula, el número de factores a retener sería \(J\). No es complicado demostrar que bajo el supuesto de normalidad multivariada, al tomar una muestra aleatoria de tamaño \(n\) de esta población, el estadístico

\[F \;= \; n\left[ln|\Sigma| \;- \; ln|S| \;+ \; tr(\Sigma^{-1} S) \;- \; K\right],\]

tiene una distribución aproximadamente chi-cuadrado con \(v = \frac{1}{2}(K-J)(K-J-1)\) grados de libertad.

3 Modelo con variables latentes oblicuas

Cuando hay correlación entre los factores comunes, el modelo factorial se denomina modelo factorial oblicuo. Por esta razón, la correlación entre dos factores \(F_i\) y \(F_j\) es distinto de cero, para algún \(i \ne j\), \(i, j = 1, \ldots, J\). Por consiguiente, el modelo factorial para el vector aleatorio \(X\) sería: \[ X \;= \; \Lambda F \;+\; \Psi, \]

Observe que el modelo tiene una escritura similar al modelo factorial ortogonal (recordemos que los factores ahora están asociados), pero hay una diferencia significativa en la estructura del modelo para la matriz de varianza del vector aleatorio \(X\). En este caso, viene dado por \[ \Sigma_X \;= \; \Lambda \Theta \Lambda^T \;+ \; \Psi, \]

donde $ $ es la matriz de coeficientes de correlación del vector aleatorio \(F\). Es importante destacar que si, en la ecuación anterior, $ = I_K $ , se obtiene la ecuación correspondiente en el modelo factorial ortogonal.

4 Ejercicios

Pendiente

Bibliografía

Consultar el documento RPubs :: Análisis multivariado (bibliografía).

 

 
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.  
LS0tDQp0aXRsZTogIkFOw4FMSVNJUyBGQUNUT1JJQUwiDQpzdWJ0aXRsZTogPGgxPioqVGVvcsOtYSoqPC9oMT4NCg0KYXV0aG9yOiANCiAgLSBuYW1lICAgICAgICAgIDogIkRyLiByZXIuIG5hdC4gSHVtYmVydG8gTExpbsOhcyBTb2xhbm8iDQogICAgYWZmaWxpYXRpb24gICA6ICJEZXBhcnRhbWVudG8gZGUgTWF0ZW3DoXRpY2FzIHkgRXN0YWTDrXN0aWNhLCBVbml2ZXJzaWRhZCBkZWwgTm9ydGUgKEJhcnJhbnF1aWxsYSwgQ29sb21iaWEpIg0KICAgICAjY29ycmVzcG9uZGluZyA6IHllcyAgICAjIERlZmluZSBvbmx5IG9uZSBjb3JyZXNwb25kaW5nIGF1dGhvcg0KICAgICAjYWRkcmVzcyAgICAgICA6ICJEZXBhcnRhbWVudG8gZGUgTWF0ZW3DoXRpY2FzIHkgRXN0YWTDrXN0aWNhIg0KICAgIGVtYWlsICAgICAgICAgOiB8DQogICAgICBobGxpbmFzQHVuaW5vcnRlLmVkdS5jbw0KICAgICAgDQogICAgICBbQmlvZ3JhcGhpY2FsIHNrZXRjaF0oaHR0cHM6Ly9ycHVicy5jb20vaGxsaW5hcy9CaW9fU2tldGNoKQ0KICAgICAgDQogICAgICBgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVkLyVtLyV5IilgIA0KICAgICAgDQogICAgICNyb2xlOiAgICAgICAgICMgQ29udHJpYnV0b3JzaGlwIHJvbGVzIChlLmcuLCBDUmVkaVQsIGh0dHBzOi8vY2FzcmFpLm9yZy9jcmVkaXQvKQ0KICAjICAgIC0gQ29uY2VwdHVhbGl6YXRpb24NCiAgIyAgICAtIFdyaXRpbmcgLSBPcmlnaW5hbCBEcmFmdCBQcmVwYXJhdGlvbg0KICAjICAgIC0gV3JpdGluZyAtIFJldmlldyAmIEVkaXRpbmcNCiAjIC0gbmFtZSAgICAgICAgICA6ICJBdXRvciBudW1lcm8gMiINCiAjICAgYWZmaWxpYXRpb24gICA6ICIxLDIiDQogIyAgIHJvbGU6DQogIyAgICAgLSBXcml0aW5nIC0gUmV2aWV3ICYgRWRpdGluZw0KICAgICAjYWZmaWxpYXRpb246DQogICMtIGlkICAgICAgICAgICAgOiAiMSINCiAgIyAgaW5zdGl0dXRpb24gICA6ICJVbml2ZXJzaWRhZCBkZWwgTm9ydGUgKEJhcnJhbnF1aWxsYSwgQ29sb21iaWEpIg0KICAjIVtdKGhsbGluYXMuanBnKXt3aWR0aD0xaW59IA0KICANCiNkYXRlOiAnYHIgZm9ybWF0KFN5cy50aW1lKCksICIlZC8lbS8leSIpYCcgICMgdmVyIGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay91cGRhdGUtZGF0ZS5odG1sDQpvdXRwdXQ6IA0KICAgIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjogDQogICAgICAgICAgI09KTyBTYWxlbiBjYXBpdHVsb3MsIHNlY2Npb25lcyB5IFRlb3JlbWFzDQogICAgI2Jvb2tkb3duOjpodG1sX2Jvb2s6DQogICAgICAgICAgI09KTyBFUlJPUiBTYWxlbiB0ZW9yZW1hcywgcGVybyBubyBzYWxlbiBsb3MgY2FwaXR1bG9zIA0KICAgICNodG1sX2RvY3VtZW50Og0KICAgICAgICAgIHRvYzogdHJ1ZSAgICAgICMgdGFibGUgb2YgY29udGVudCB0cnVlDQogICAgICAgICAgdG9jX2RlcHRoOiA0ICAgIyB1cHRvIHRocmVlIGRlcHRocyBvZiBoZWFkaW5ncyAoc3BlY2lmaWVkIGJ5ICMsICMjIGFuZCAjIyMpDQogICAgICAgICAgdG9jX2Zsb2F0OiB0cnVlICNDb24gdHJ1ZSwgdG9jIHNhbGUgYWwgbWFyZ2VuIGl6cXVpZXJkbyBkZSBsYSBww6FnaW5hOyBkZSBsbyBjb250cmFyaW8sIGFycmliYQ0KICAgICAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KICAgICAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICMgaWYgeW91IHdhbnQgbnVtYmVyIHNlY3Rpb25zIGF0IGVhY2ggdGFibGUgaGVhZGVyDQogICAgICAgICAgI3RoZW1lOiBzYW5kc3RvbmUNCiAgICAgICAgICAjdGhlbWU6IHVuaXRlZCAgIyBtYW55IG9wdGlvbnMgZm9yIHRoZW1lLCB0aGlzIG9uZSBpcyBteSBmYXZvcml0ZS4NCiAgICAgICAgICAjdGhlbWU6IGZsYXRseSAgIyANCiAgICAgICAgICAjdGhlbWU6IGNlcnVsZWFuICAjIA0KICAgICAgICAgICNoaWdobGlnaHQ6IHRhbmdvICAjIHNwZWNpZmllcyB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyBzdHlsZQ0KICAgICAgICAgICNjc3M6IFNjcmlwdHMgYWNjZXNvcmlvcy9lc3RpbG9ib3Rvbi5jc3MNCiAgICAgICAgICAjY3NzOiBteS5jc3MgICAjIHlvdSBjYW4gYWRkIHlvdXIgY3VzdG9tIGNzcywgc2hvdWxkIGJlIGluIHNhbWUgZm9sZGVyDQogICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICAgICAgICNoaWdobGlnaHQ6IHRhbmdvICAjIGNhbWJpYXIgY29sb3IgZGUgbGlicmFyeSBlbiBhenVsDQogICAgIyBib29rZG93bjo6Z2l0Ym9vazoNCiAgICAjICAgICAgaW5jbHVkZXM6DQogICAgIyAgICAgICAgaW5faGVhZGVyOiBoZWFkZXIuaHRtbA0KICAgICMgYm9va2Rvd246OnBkZl9ib29rOg0KICAgICMgICAgICAga2VlcF90ZXg6IHllcw0KICAgICMgYm9va2Rvd246Omh0bWxfYm9vazoNCiAgICAjICAgICAgIGNzczogdG9jLmNzcw0KICAgICMgYm9va2Rvd246Omh0bWxfYm9vazoNCiAgICAjICAgICAgICAgaW5jbHVkZXM6DQogICAgIyAgICAgICAgICAgaW5faGVhZGVyOiBzdHlsZS5jc3MNCiAgICAjYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOiBkZWZhdWx0DQogICAgIyBib29rZG93bjo6cGRmX2RvY3VtZW50MjoNCiAgICAjICAgICAga2VlcF90ZXg6IHRydWUNCiAgICAjYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYg0KICAgIG1hdGhqYXg6ICJodHRwOi8vZXhhbXBsZS5jb20vbWF0aGpheC9NYXRoSmF4LmpzP2NvbmZpZz1UZVgtQU1TLU1NTF9IVE1Mb3JNTUwiDQpoZWFkZXItaW5jbHVkZXM6DQogICAgXHVzZXBhY2thZ2VbeDExbmFtZXNde3hjb2xvcn0gDQogICAgDQpjc2w6IHNjaWVuY2UuY3NsDQojT2pvOiBTZSB1dGlsaXphIGxlbmd1YWplIFlBTUwNCg0KYWJzdHJhY3Q6IHwNCiAqKkVuIFtScHViczo6IHRvY10oaHR0cHM6Ly9ycHVicy5jb20vaGxsaW5hcy90b2MpIHNlIHB1ZWRlbiB2ZXIgb3Ryb3MgZG9jdW1lbnRvcyBkZSBwb3NpYmxlIGludGVyw6lzLioqDQogIA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBmaWcuYWxpZ249ImNlbnRlciIsICBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFIywNCiAgICAgICAgICAgICAgICAgICAgICAjc3R5bGUgPSAiY29sb3I6ZGFya2JsdWUiDQogICAgICAgICAgICAgICAgICAgICMgY2xhc3Muc291cmNlPSJiZy1kYW5nZXIiLCBjbGFzcy5vdXRwdXQ9ImJnLXdhcm5pbmciICAgI0NvbG9yZXMgZGVudHJvIGRlbCBjaHVuaw0KICAgICAgICAgICAgICAgICAgICAgKQ0KbGlicmFyeShyZ2wpDQprbml0cjo6a25pdF9ob29rcyRzZXQod2ViZ2wgPSBob29rX3dlYmdsKQ0KYGBgDQoNCg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQ0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duL2xhbmd1YWdlLWVuZ2luZXMuaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9tYXJrZG93bi1zeW50YXguaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9hLXNpbmdsZS1kb2N1bWVudC5odG1sDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL21hcmtkb3duLWV4dGVuc2lvbnMtYnktYm9va2Rvd24uaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vYm9va2Rvd24tbWFya2Rvd24uaHRtbCAgIyBUZW9yZW1zIGFuZCBwcm9vZnMNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vbWFya2Rvd24tZXh0ZW5zaW9ucy1ieS1ib29rZG93bi5odG1sI3RoZW9yZW1zDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL2h0bWwuaHRtbA0KDQpodHRwczovL3d3dy5kYXRhLXRvLXZpei5jb20vDQogIA0KW1JwdWJzXShsaW5rKQ0KICANCihcI2VxOmVjLSksICBFY3VhY2lvbiBcQHJlZihlcTplYy0pLCBGaWd1cmEgXEByZWYoZmlnOkZpZy0pLCBUYWJsZSBcQHJlZih0YWI6bXRjYXJzKSwgVGhlb3JlbSBcQHJlZih0aG06Ym9yaW5nKQ0KDQoNCiMgVGl0dWxvIHsjVGl0dWxvU2VjY2lvbn0gICBcQHJlZihUaXR1bG9TZWNjaW9uKQ0KICANCiMgRm9yIEhUTUwsIHdlIGNhbiBzZXQgY29sb3Igd2l0aCBDU1MsIGUuZy4sIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGV4dDwvc3Bhbj4NCiAgDQojIGh0dHBzOi8vcmFkaWFudC1yc3RhdHMuZ2l0aHViLmlvL2RvY3MvbW9kZWwvbG9naXN0aWMuaHRtbCBTaGlubnkgTG9naXQgIA0KICANCmBgYA0KDQoNCmBgYHtyLCBldmFsPUZBTFNFLCBlY2hvPUZBTFNFfQ0KI0xhIGZvdG8gdGFtYcOxbyBjw6lkdWxhDQoNCmh0bWx0b29sczo6aW1nKHNyYyA9IGtuaXRyOjppbWFnZV91cmkoZmlsZS5wYXRoKFIuaG9tZSgiZG9jIiksICJodG1sIiwgImxvZ28uanBnIikpLCANCiAgICAgICAgICAgICAgIGFsdCA9ICdobGxpbmFzJywgDQogICAgICAgICAgICAgICBzdHlsZSA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IHJpZ2h0OjA7IHBhZGRpbmc6MTBweDsnICMsDQogICAgICAgICAgICAgICB3aWR0aCA9ICIyMDBweCIpICAjIEFxdcOtIGVzcGVjaWZpY2FzIGVsIGFuY2hvIGRlc2VhZG8gZW4gcMOteGVsZXMgbyBwb3JjZW50YWplDQpgYGANCg0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIH0NCiMgTGEgZm90byBncmFuZGUNCg0KaHRtbHRvb2xzOjppbWcoc3JjID0ga25pdHI6OmltYWdlX3VyaSgiaGxsaW5hczIwMjMuanBnIiksIA0KICAgICAgICAgICAgICAgYWx0ID0gJ2hsbGluYXMyMDIzJywgDQogICAgICAgICAgICAgICBzdHlsZSA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IHJpZ2h0OjA7IHBhZGRpbmc6MXB4OycsDQogICAgICAgICAgICAgICB3aWR0aD0iMTUlIikNCmBgYA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yICAtLT4NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCi5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30NCmgxIHtjb2xvcjogZGFya2JsdWU7fQ0KaDMge2NvbG9yOiBkYXJrZ3JlZW47fQ0KaDQge2NvbG9yOiBncmVlbjt9DQpgYGANCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIENhcMOtdHVsbyAgLS0+DQoNCg0KYGBge2NzcywgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCiNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTAzMDQ3Ny9jaGFuZ2luZy1jaHVuay1iYWNrZ3JvdW5kLWNvbG9yLWluLXJtYXJrZG93bg0KDQouYmFkQ29kZSB7DQpiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7DQp9DQpgYGANCg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yICAtLT4NCg0KDQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEludHJvZHVjY2nDs24NCg0KIyMjIFRpcG8gZGUgcmVsYWNpw7NuDQoNCkVsIGFuw6FsaXNpcyBmYWN0b3JpYWwgZXN0YWJsZWNlIHVuYSBjb25leGnDs24gZGlyZWN0YSBlbnRyZSBsYXMgdmFyaWFibGVzICBvIGxvcyBlbmN1ZXN0YWRvcy4gDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgwr9RdcOpIGJ1c2NhIGlkZW50aWZpY2FyPw0KDQpFbCBhbsOhbGlzaXMgZmFjdG9yaWFsIGJ1c2NhIGlkZW50aWZpY2FyIGxvcyBmYWN0b3JlcyB5IGRldGVybWluYXIgbGEgY29udHJpYnVjacOzbiBkZSBjYWRhIHZhcmlhYmxlIGEgY2FkYSBmYWN0b3IuIA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgUHJvcMOzc2l0by9vYmpldGl2bw0KDQoxLiBSZXN1bWlyIGxhIGluZm9ybWFjacOzbiBjb250ZW5pZGEgZW4gdW5hIHNlcmllIGRlIHZhcmlhYmxlcyBvIGVudHJlIGxvcyBlbmN1ZXN0YWRvcyAobGFzIG9ic2VydmFjaW9uZXMpLg0KDQoyLiBJZGVudGlmaWNhciB1biBjb25qdW50byByZWR1Y2lkbyBkZSB2YXJpYWJsZXMgbGF0ZW50ZXMgcXVlIHB1ZWRlbiByZWVtcGxhemFyIHVuIGNvbmp1bnRvIG3DoXMgYW1wbGlvIGRlIHZhcmlhYmxlcyBvYnNlcnZhZGFzIHNpIGVzdMOhbiBjb3JyZWxhY2lvbmFkYXMuIEVzdGFzIHZhcmlhYmxlcyAobGF0ZW50ZXMgbyBubyBvYnNlcnZhZGFzKSBzZSB1dGlsaXphbiBlbiBhbsOhbGlzaXMgbXVsdGl2YXJpYWRvcyBwb3N0ZXJpb3JlcywgY3JlYW5kbyBhc8OtIHVuIGNvbmp1bnRvIGRlIHZhcmlhYmxlcyBudWV2YXMsIGRlIG1lbm9yIG7Dum1lcm8sIHBhcmEgc3VzdGl0dWlyIHBhcmNpYWwgbyB0b3RhbG1lbnRlIGEgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIGVuIHTDqWNuaWNhcyBzdWJzaWd1aWVudGVzLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgwr9FbiBxdcOpIHNlIGFwb3lhPw0KDQpTZSBiYXNhIGVuIGxhIGRpZmVyZW5jaWFjacOzbiBkZSBsYSB2YXJpYWJpbGlkYWQgZGUgbGFzIHZhcmlhYmxlcyBvYnNlcnZhZGFzIHksIHBvciBlbmRlLCBkZSBsYSB2YXJpYW56YSwgZGVzY29tcG9uacOpbmRvbGEgZW4gZG9zIHRpcG9zOg0KDQogIDEuICpVbmEgcGFydGUgY29tw7puKiwgZXhwbGljYWRhIHBvciB1biBjb25qdW50byBkZSBmYWN0b3JlcyBjb211bmVzIHF1ZSBpbmZsdXllbiBlbiB0b2RhcyBsYXMgdmFyaWFibGVzLg0KICANCiAgMi4gKlVuYSBwYXJ0ZSBlc3BlY8OtZmljYSosIHF1ZSBubyBlc3TDoSByZWxhY2lvbmFkYSBjb24gZXNhIHZhcmlhYmlsaWRhZCBjb23Dum4geSBlcyDDum5pY2EgcGFyYSBjYWRhIHZhcmlhYmxlLiBFc3RhIHBhcnRlIGVzcGVjw61maWNhIGVzIGV4cGxpY2FkYSBwb3IgZmFjdG9yZXMgZXNwZWPDrWZpY29zIG8gw7puaWNvcyBxdWUgcmVmbGVqYW4gbGEgc2luZ3VsYXJpZGFkIGRlIGNhZGEgdmFyaWFibGUuIEVzdG9zIGZhY3RvcmVzIHN1ZWxlbiBzZXIgaW5kZXBlbmRpZW50ZXMgeSBvcnRvZ29uYWxlcyBlbnRyZSBzw60gZW4gc3UgbWF5b3LDrWEuIA0KICANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyDCv1F1w6kgc2UgbmVjZXNpdGEgZXN0aW1hciBwcmltZXJvPw0KDQpFbCBuw7ptZXJvIGFwcm9waWFkbyBkZSBmYWN0b3JlcyBuZWNlc2l0YWRvcyBwYXJhIG1vZGVsYXIgbG9zIGRhdG9zLiANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgTW9kZWxvIGNvbiBmYWN0b3JlcyBvcnRvZ29uYWxlcw0KDQojIyMgRGVmaW5pY2nDs24gZGVsIG1vZGVsbw0KDQpDb25zaWRlcmVtb3MgdW4gdmVjdG9yICAkWCA9IChYXzEsIFhfMiwgXGxkb3RzLCBYX0spXlQkIGRlIHZhcmlhYmxlcyBhbGVhdG9yaWFzIG9ic2VydmFibGVzLCBlbiB1bmEgcG9ibGFjacOzbiBub3JtYWwgY29uIHZlY3RvciBkZSBtZWRpYXMgJEUoWCkgPSBcbXUkIHkgbWF0cml6IGRlIHZhcmlhbnphLWNvdmFyaWFuemEgJFYoWCk9XFNpZ21hJCwgZGFkYXMgcG9yIA0KJCRcbXVcOyA9IFw7XGxlZnQoDQpcYmVnaW57YXJyYXl9e2N9DQogIFxtdV97MX0gICAgICAgXFwNCiAgXG11X3syfSAgICAgIFxcDQogIFx2ZG90cyAgICAgXFwNCiBcbXVfe0t9ICAgIFxcICAgIA0KXGVuZHthcnJheX1ccmlnaHQpIFw7ID1cOyBcbGVmdCgNClxiZWdpbnthcnJheX17Y30NCiAgRShYXzEpICAgICAgIFxcDQogIEUoWF8yKSAgICAgICBcXA0KICBcdmRvdHMgICAgIFxcDQogRShYX0spICAgICBcXCAgICANClxlbmR7YXJyYXl9XHJpZ2h0KSwgXHFxdWFkIFxTaWdtYSBcOz1cOyBcbGVmdChcYmVnaW57YXJyYXl9e2xsbGxsfQ0KICB7XHNpZ21hfV4yX3sxMX0gICAgICYge1xzaWdtYX1eMl97MTJ9ICAmICBcY2RvdHMgJiB7XHNpZ21hfV97MUt9ICBcXA0KICB7XHNpZ21hfV97MjF9ICAgICAmIHtcc2lnbWF9XjJfezIyfSAgJiAgXGNkb3RzICYge1xzaWdtYX1fezJLfSAgXFwNCiAgIFx2ZG90cyAgICAgJiBcdmRvdHMgICAgJiBcZGRvdHMgJiBcdmRvdHMgIFxcDQoge1xzaWdtYX1fe0sxfSAgJiB7XHNpZ21hfV97SzJ9ICAgICAmIFxjZG90cyAmIHtcc2lnbWF9XjJfe0tLfSAgIFxcICAgIA0KXGVuZHthcnJheX1ccmlnaHQpICAkJA0KDQoNCkFkZW3DoXMsIHN1cG9uZ2Ftb3MgcXVlIGNhZGEgJFhfayQsIHNlIHB1ZWRlbiBlc2NyaWJpciBjb21vIGNvbWJpbmFjacOzbiBsaW5lYWwgZGUgbGFzIGNvb3JkZW5hZGFzIGRlIGxvcyB2ZWN0b3JlcyAkRiA9IChGXzEsIEZfMiwgXGxkb3RzLCBGX0opXlQkIHkgJFx2YXJlcHNpbG9uID0gKFx2YXJlcHNpbG9uXzEsIFx2YXJlcHNpbG9uXzIsXGxkb3RzLCBcdmFyZXBzaWxvbl9LKV5UJCwgZGUgbGEgc2lndWllbnRlIGZvcm1hOg0KDQpcYmVnaW57ZXFuYXJyYXl9DQpYXzEgJj0mIFxtdV8xICsgXGxhbWJkYV97MTF9IEZfMSArIFxjZG90cyArIFxsYW1iZGFfezFKfSBGX0ogKyBcdmFyZXBzaWxvbl8xLCAoXCNlcTplYy0zLTEpXFwgDQpYXzIgJj0mIFxtdV8yICsgXGxhbWJkYV97MjF9IEZfMSArIFxjZG90cyArIFxsYW1iZGFfezJKfSBGX0ogKyBcdmFyZXBzaWxvbl8yLFxub251bWJlclxcIA0KXGhzcGFjZXstMC41Y219XHZkb3RzICY9JiBcaHNwYWNlezNjbX0gXHZkb3RzXG5vbnVtYmVyXFwgDQpcaHNwYWNley0wLjVjbX1cdmRvdHMgJj0mIFxoc3BhY2V7M2NtfSBcdmRvdHNcbm9udW1iZXJcXCANCiBYX0sgJj0mIFxtdV9LICsgXGxhbWJkYV97SzF9IEZfMSArIFxjZG90cyArIFxsYW1iZGFfe0tKfSBGX0ogKyBcdmFyZXBzaWxvbl9LLFxub251bWJlcg0KXGVuZHtlcW5hcnJheX0NCg0KXG5vaW5kZW50IGRvbmRlOg0KDQorICRcbXVfayA9IEUoWF9rKSQsIA0KDQorICRcbGFtYmRhX3trMX0gRl8xICsgXGNkb3RzICsgXGxhbWJkYV97a219IEZfSiQsIGVzIGVsIGVmZWN0byBkZSBsYXMgJEokIGNvb3JkZW5hZGFzICRGXzEsIFxsZG90cyAsIEZfSiQsIA0KDQorICRcdmFyZXBzaWxvbl9rJCBlcyBsYSAkayQtw6lzaW1hIGNvb3JkZW5hZGEgZGVsIHZlY3RvciAkXHZhcmVwc2lsb24kIHNvYnJlIGxhIHZhcmlhYmxlIGFsZWF0b3JpYSAkWF9rJCwgJGs9MSxcbGRvdHMsIEskLCANCg0KKyAkXGxhbWJkYV97a2p9JCwgZXMgbGEgY2FyZ2EgbyBjb250cmlidWNpw7NuIHF1ZSBsYSBjb29yZGVuYWRhICRGX2okLCB0aWVuZSBzb2JyZSBsYSB2YXJpYWJsZSAkWF9rJC4NCg0KRXMgZGVjaXIsIHBhcmEgY2FkYSAkaz0xLDIsIFxsZG90cywgSyQsIHNlIHRpZW5lIHF1ZQ0KDQokJFhfayBcOz0gXDsgXG11X2sgXDsgK1w7IFxzdW1cbGltaXRzX3tqPTF9XkogXGxhbWJkYV97a2p9IFwsIEZfaiBcOytcOyBcdmFyZXBzaWxvbl9rJCQNCg0KQSBtYW5lcmEgZGUgZWplbXBsbywgbGEgc2l0dWFjacOzbiBzZSBwdWVkZSB2aXN1YWxpemFyIGVuIGxhIEZpZ3VyYSBcQHJlZihmaWc6RmFjdG9yaWFsMSkgKHBhcmEgZWwgY2FzbyAkSz03JCB5ICRKPTMkKS4NCg0KPGNlbnRlcj4NCg0KYGBge3IgRmFjdG9yaWFsMSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkFuw6FsaXNpcyBmYWN0b3JpYWwgcGFyYSBlbCBjYXNvICRLPTckIHkgJEo9MyQqKiIsIG91dC53aWR0aCA9ICIxMDAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkZhY3RvcmlhbDEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQpWZWN0b3JpYWxtZW50ZSBlbCBzaXN0ZW1hIGRlIGVjdWFjaW9uZXMgXEByZWYoZXE6ZWMtMy0xKSwgc2UgcHVlZGUgZXhwcmVzYXIgYXPDrToNCg0KJCRcbGVmdCgNClxiZWdpbnthcnJheX17Y30NCiAgWF97MX0gICAgICAgXFwNCiAgWF97Mn0gICAgICBcXA0KICBcdmRvdHMgICAgIFxcDQogWF97S30gICAgXFwgICAgDQpcZW5ke2FycmF5fVxyaWdodCkgXDs9XDsgXGxlZnQoDQpcYmVnaW57YXJyYXl9e2N9DQogIFxtdV97MX0gICAgICAgXFwNCiAgXG11X3syfSAgICAgIFxcDQogIFx2ZG90cyAgICAgXFwNCiBcbXVfe0t9ICAgIFxcICAgIA0KXGVuZHthcnJheX1ccmlnaHQpIFw7K1w7ICANClxsZWZ0KFxiZWdpbnthcnJheX17bGxsbGx9DQogIFxsYW1iZGFfezExfSAgICAgJiBcbGFtYmRhX3sxMn0gICYgXGNkb3RzICAmIFxsYW1iZGFfezFKfSAgICBcXA0KICBcbGFtYmRhX3syMX0gICAgICYgXGxhbWJkYV97MjJ9ICAmIFxjZG90cyAgJiBcbGFtYmRhX3sySn0gICBcXA0KICBcdmRvdHMgICAgICYgXHZkb3RzICAmIFxkZG90cyAgJiBcdmRvdHMgICAgXFwNCiAgXGxhbWJkYV97SzF9ICAmIFxsYW1iZGFfe0syfSAgJiBcY2RvdHMgICYgXGxhbWJkYV97S0p9ICAgIFxcICAgIA0KXGVuZHthcnJheX1ccmlnaHQpDQpcbGVmdCgNClxiZWdpbnthcnJheX17Y30NCiAgRl97MX0gICAgICAgXFwNCiAgRl97Mn0gICAgICBcXA0KICBcdmRvdHMgICAgIFxcDQogRl97Sn0gICAgXFwgICAgDQpcZW5ke2FycmF5fVxyaWdodCkgXDsrXDsgDQpcbGVmdCgNClxiZWdpbnthcnJheX17Y30NCiAgXHZhcmVwc2lsb25fezF9ICAgICAgIFxcDQogIFx2YXJlcHNpbG9uX3syfSAgICAgIFxcDQogIFx2ZG90cyAgICAgXFwNCiBcdmFyZXBzaWxvbl97S30gICAgXFwgICAgDQpcZW5ke2FycmF5fVxyaWdodCkgIA0KJCQNCg0KDQpvLCBkZSBsYSBzaWd1aWVudGUgZm9ybWE6IA0KDQokJFggXDs9XDsgXG11IFw7K1w7IFxMYW1iZGEgXCwgRiBcOytcOyBcdmFyZXBzaWxvbiwkJCANCg0KZG9uZGUgJFxMYW1iZGEgPSAoXExhbWJkYV97a2p9KV8ge0tcdGltZXMgSn0kIGVzIGxhIG1hdHJpeiBkZSBjb2VmaWNpZW50ZSBkZWwgdmVjdG9yICRGJC4gDQoNCiBFbCBhbsOhbGlzaXMgZmFjdG9yaWFsIGluZGljYSBxdWUgZWwgdmVjdG9yICRYJCBzZSBjcmVhIGEgdHJhdsOpcyBkZSBsYSBlY3VhY2nDs24gdmVjdG9yaWFsIHByZXZpYW1lbnRlIGRlZmluaWRhLCBkb25kZSAkRiQgcmVwcmVzZW50YSB1biB2ZWN0b3IgZGUgdmFyaWFibGVzIGxhdGVudGVzIGRlIHRhbWHDsW8gJEogXHRpbWVzIDEkLCBvIGZhY3RvcmVzIG5vIG9ic2VydmFkb3MsIHF1ZSBzb24gY29tcGFydGlkb3MgZW50cmUgbGFzICRLJCBjb29yZGVuYWRhcyBkZWwgdmVjdG9yIGFsZWF0b3JpbyAkWCQuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBTdXB1ZXN0b3M6IGdlbmVyYWwNCg0KU3Vwb25kcmVtb3MgcXVlOg0KDQoxLiAkRiQgc2UgZGlzdHJpYnV5ZSBzZWfDum4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYSBkZSBtZWRpYSBjZXJvIHkgbWF0cml6IGRlIGNvdmFyaWFuemEgaWRlbnRpZGFkICRJX0okLCBlcyBkZWNpciwgbG9zIGZhY3RvcmVzIHNvbiB2YXJpYWJsZXMgYWxlYXRvcmlhcyBjb24gbWVkaWEgY2VybywgdmFyaWFuemEgdW5vIGUgaW5kZXBlbmRpZW50ZXMgZW50cmUgc8OtLg0KDQoyLiAkXExhbWJkYSQgZXMgdW5hIG1hdHJpeiBkZSBkaW1lbnNpb25lcyAkSyBcdGltZXMgSiQsIGRvbmRlICRKIFxsZXEgSyQsIHkgY29udGllbmUgY29uc3RhbnRlcyBkZXNjb25vY2lkYXMgbGxhbWFkYXMgKmNhcmdhcyBmYWN0b3JpYWxlcyosIHF1ZSByZXByZXNlbnRhbiBjw7NtbyBsb3MgZmFjdG9yZXMgJEYkIGFmZWN0YW4gYSBsYXMgdmFyaWFibGVzIG9ic2VydmFkYXMgZW4gZWwgdmVjdG9yICRYJC4gDQoNCjMuICRcdmFyZXBzaWxvbiQgZXMgdW4gdmVjdG9yIGRlIGRpbWVuc2lvbmVzICRLXHRpbWVzIDEkIHF1ZSByZXByZXNlbnRhIGxhcyBwZXJ0dXJiYWNpb25lcyBubyBvYnNlcnZhZGFzLCBpbmNsdXllbmRvIGVsIGVmZWN0byBkZSB0b2RhcyBsYXMgdmFyaWFibGVzIGRpc3RpbnRhcyBhIGxvcyBmYWN0b3JlcyBjb211bmVzIHF1ZSBpbmZsdXllbiBlbiAkWCQuIA0KDQo0LiBFcyBpbXBvcnRhbnRlIGRlc3RhY2FyIHF1ZSBsYXMgY29vcmRlbmFkYXMgZGVsIHZlY3RvciAkXHZhcmVwc2lsb24kIHkgbGFzIGRlbCB2ZWN0b3IgJEYkIHNvbiBpbmNvcnJlbGFkYXMuIA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgU3VwdWVzdG9zOiByZXN1bWVuDQoNCkVuIHJlc3VtZW4sIGxvcyBzdXB1ZXN0b3MgZGVsIG1vZGVsbyBmYWN0b3JpYWwgb3J0b2dvbmFsIHNvbiBsb3Mgc2lndWllbnRlczoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQoNCioqU3VwdWVzdG8gMToqKg0KDQpTaSAkSV9KJCBlcyBsYSBtYXRyaXogaWTDqW50aWNhIGRlIHRhbWHDsW8gJEokLCBlbnRvbmNlcywgJEYgXHNpbSB7XGNhbCBOfV97Sn0oMCxcOyBJX0opJC4gRXMgZGVjaXIsIA0KDQokJEUoRl9qKSA9MCwgXHFxdWFkIFYoRl9qKT0xLCBccXF1YWQgQ292KEZfaSwgRl9qKSA9MCwgXHF1YWQgaVxuZSBqJCQNCiBPLCBlc2NyaXRvIHZlY3RvcmlhbG1lbnRlLCANCiANCiQkRShGKSBcOz1cOyAwLCBccXF1YWQgQ292KEYpIFw7PVw7IEUoRiBGXlQpIFw7PVw7IElfSiQkIA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCioqU3VwdWVzdG8gMjoqKg0KICAgDQokXHZhcmVwc2lsb24gXHNpbSAge1xjYWwgTn1fe0t9KDAsXDsgXFBzaSkkLCBkb25kZSAkXFBzaSQsIGVzIGxhIG1hdHJpeiBkZSB2YXJpYW56YSBkZWwgdmVjdG9yIGFsZWF0b3JpbyBkZSBsYXMgcGVydHVyYmFjaW9uZXMgJFx2YXJlcHNpbG9uJC4gRXMgZGVjaXIsIA0KDQokJEUoXHZhcmVwc2lsb24pIFw7PVw7IDAsIFxxcXVhZCBDb3YoXHZhcmVwc2lsb24pICBcOz1cO0UoXHZhcmVwc2lsb24gXCwgXHZhcmVwc2lsb25eVCkgIFw7PVw7XFBzaSQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCg0KKipTdXB1ZXN0byAzOioqDQoNCiAkQ292IChGLFw7XHZhcmVwc2lsb24pID0gMCQuIEVzIGRlY2lyLCANCg0KJCRDb3YoRl9qLCBcLFx2YXJlcHNpbG9uX2kpID0wLCBccXVhZCBpXG5lIGosIFxxdWFkIGk9MSxcbGRvdHMsIEssIFxxdWFkIGo9MSxcbGRvdHMsIEokJA0KDQpTaSAkMF9KJCBlcyBsYSBtYXRyaXogZGUgY2Vyb3MgeSBlcyBkZSB0YW1hw7FvICRKXHRpbWVzIEokLCBsbyBhbnRlcmlvciBzZSBwdWVkZSBlc2NyaWJpciB2ZWN0b3JpYWxtZW50ZSwgZGUgbGEgc2lndWllbnRlIG1hbmVyYTogIA0KIA0KJCRDb3YoRixcdmFyZXBzaWxvbikgXDs9XDsgMF9KJCQgDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBQcm9waWVkYWRlcyBkZSAkWCQNCg0KQ29uIGVzdGFzIHRyZXMgY29uZGljaW9uZXMsIHNlIGN1bXBsZW46IA0KDQoqKlByb3BpZWRhZCAxOioqDQoNCiRYIFxzaW0ge1xjYWwgTn1fe0t9IChcbXUgLCBcU2lnbWEpJCwgZG9uZGUgJFxtdSQgZXMgZWwgdmVjdG9yIGRlIG1lZHVpYXMgeSAgJFxTaWdtYSQgZXMgbGEgbWF0cml6IGRlIHZhcmlhbnphLWNvdmFyaWFuemEuIEVzIGRlY2lyLCANCg0KJCRFKFgpIFw7PVw7IFxtdSBcOz1cOyBcbGVmdCgNClxiZWdpbnthcnJheX17Y30NCiAgXG11X3sxfSAgICAgICBcXA0KICBcbXVfezJ9ICAgICAgXFwNCiAgXHZkb3RzICAgICBcXA0KIFxtdV97S30gICAgXFwgICAgDQpcZW5ke2FycmF5fVxyaWdodCksIFxxcXVhZCAgQ292KFgpICBcOz1cOyBcU2lnbWEgXDs9XDsgXGxlZnQoXGJlZ2lue2FycmF5fXtsbGxsbH0NCiAge1xzaWdtYX1eMl97MTF9ICAgICAmIHtcc2lnbWF9XjJfezEyfSAgJiAgXGNkb3RzICYge1xzaWdtYX1fezFLfSAgXFwNCiAge1xzaWdtYX1fezIxfSAgICAgJiB7XHNpZ21hfV4yX3syMn0gICYgIFxjZG90cyAmIHtcc2lnbWF9X3syS30gIFxcDQogICBcdmRvdHMgICAgICYgXHZkb3RzICAgICYgXGRkb3RzICYgXHZkb3RzICBcXA0KIHtcc2lnbWF9X3tLMX0gICYge1xzaWdtYX1fe0syfSAgICAgJiBcY2RvdHMgJiB7XHNpZ21hfV4yX3tLS30gICBcXCAgICANClxlbmR7YXJyYXl9XHJpZ2h0KSAgDQokJA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KKipQcm9waWVkYWQgMjoqKg0KDQpTZSBjdW1wbGUgcXVlIGxhIGNvdmFyaWFuemEgZW50cmUgJFhfaSQgeSAkWF9qJCwgcGFyYSAkaVxuZSBrJCwgdmllbmUgZGFkYSBwb3I6IA0KDQokJFxzaWdtYV97aWt9IFw7Oj1cOyBDb3YoWGksXDsgWF9rKSBcOz0gXDsgXHN1bVxsaW1pdHNfe3I9MX1eSyBcbGFtYmRhX3tpcn0gXCwgXGxhbWJkYV97a3J9LCBccXVhZCBpXG5lIGskJA0KUG9yIGVzdGEgcmF6w7NuLCBwb2RlbW9zIGFmaXJtYXIgcXVlIGxhcyBjb3ZhcmlhbnphcyBubyBkZXBlbmRlbiBlbiBhYnNvbHV0byBkZSBsYXMgdmFyaWFibGVzIGVzcGVjw61maWNhcywgZGUgaGVjaG8sIGJhc3RhIGNvbg0KbG9zIGZhY3RvcmVzIGNvbXVuZXMuIA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIENvbXVuYWxpZGFkIHkgZXNwZWNpZmljaWRhZA0KDQoqKlByb3BpZWRhZCAzOioqDQoNCkRhZG8gcXVlIGxvcyBmYWN0b3JlcyBubyBzb24gb2JzZXJ2YWJsZXMsIHNlIHB1ZWRlIGZpamFyIGFyYml0cmFyaWFtZW50ZSBzdSBtZWRpYSBlbiAwbXkgc3UgdmFyaWFuemEgZW4gMSwgZXN0byBlcywgc2UgY29uc2lkZXJhbiB2YXJpYWJsZXMgZXN0YW5kYXJpemFkYXMgcXVlIGVzdMOhbiBpbmNvcnJlbGFkYXMgZW50cmUgc8OtLCBkZSBtb2RvIHF1ZSBsb3MgcGVzb3MgZmFjdG9yaWFsZXMgcmVzdWx0YW4gc2VyIGxhcyBjb3JyZWxhY2lvbmVzIGVudHJlIGxhcyB2YXJpYWJsZXMgeSBsb3MgZmFjdG9yZXMuIEFzw60sIGNvbiBsYXMgc3Vwb3NpY2lvbmVzIHByZXZpYXMsIGxhIHZhcmlhbnphIGRlIGxhIHZhcmlhYmxlICRYX2skIGVzDQoNCiQkVihYX2spIFw7PSBcOyBoX2teMiBcOytcOyBccHNpX2skJA0KDQpFbiBsbyBhbnRlcmlvciwgc2UgZW5jdWVudHJhbiBsYXMgbGxhbWFkYXMgKmNvbXVuYWxpZGFkKiB5ICplc3BlY2lmaWNpZGFkKiBkZSAkWF9rJC4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQoNCioqQ29tdW5hbGlkYWQ6KiogDQoNCiRoX2teMiQgZXMgbGEgKmNvbXVuYWxpZGFkKiBkZSBsYSB2YXJpYWJsZSAkWF9rJCB5IHJlcHJlc2VudGEgbGEgdmFyaWFuemEgY29tcGFydGlkYSBjb24gbGFzIG90cmFzIHZhcmlhYmxlcyBwb3IgbWVkaW8gZGUgbG9zIGZhY3RvcmVzIGNvbXVuZXMgJEYkLiBFcyBsYSBjb250cmlidWNpw7NuIGRlbCBmYWN0b3IgJEZfaiQgYSBsYSB2YXJpYW56YSB0b3RhbC4gIEVzdMOhIGRhZGEgcG9yOiANCg0KJCRoX2teMiBcOz1cOyBWXGxlZnQoXHN1bVxsaW1pdHNfe2o9MX1eSiBcbGFtYmRhX3tran1cLCBGX2pccmlnaHQpXDs9XDsgXHN1bVxsaW1pdHNfe2o9MX1eSiBcbGFtYmRhXjJfe2tqfSBcOz1cOyBcbGFtYmRhX2teVCBcLCBcbGFtYmRhX2skJCANCg0KZG9uZGUgJFxsYW1iZGFfayQgZXMgbGEgJGskLcOpc2ltYSBjb2x1bW5hIGRlICRcTGFtYmRhXlQkOiANCg0KJCRcTGFtYmRhIFw7PSBcOyBcbGVmdChcYmVnaW57YXJyYXl9e2NjY2NjY30NCiAgXGxhbWJkYV97MTF9ICAgICAmIFxsYW1iZGFfezEyfSAmIFxjZG90cyAme1xjb2xvcntEYXJrR3JlZW59IFxsYW1iZGFfezFqfX0gICYgXGNkb3RzICAmIFxsYW1iZGFfezFKfSAgICBcXA0KICBcbGFtYmRhX3syMX0gICAgICYgXGxhbWJkYV97MjJ9ICYgXGNkb3RzICZ7XGNvbG9ye0RhcmtHcmVlbn0gXGxhbWJkYV97Mmp9fSAmIFxjZG90cyAgJiBcbGFtYmRhX3sySn0gICBcXA0KICBcdmRvdHMgICAgICYgXHZkb3RzICAmIFxjZG90cyAmIHtcY29sb3J7RGFya0dyZWVufSBcdmRvdHN9ICAmXGRkb3RzICAmIFx2ZG90cyAgICBcXA0KIHtcY29sb3J7UmVkfVxsYW1iZGFfe2sxfSB9ICAgICYge1xjb2xvcntSZWR9XGxhbWJkYV97azJ9fSAmIHtcY29sb3J7UmVkfVxjZG90c30gJntcY29sb3J7UmVkfSBcbGFtYmRhX3tran19ICYge1xjb2xvcntSZWR9XGNkb3RzfSAgJiB7XGNvbG9ye1JlZH1cbGFtYmRhX3trSn0gfSAgXFwgIA0KICAgIFx2ZG90cyAgICAgJiBcdmRvdHMgICYgXGNkb3RzICYge1xjb2xvcntEYXJrR3JlZW59IFx2ZG90c30gICZcZGRvdHMgICYgXHZkb3RzICAgIFxcDQogIFxsYW1iZGFfe0sxfSAgJiBcbGFtYmRhX3tLMn0gJiBcY2RvdHMgJiB7XGNvbG9ye0RhcmtHcmVlbn0gXGxhbWJkYV97S2p9fSAmIFxjZG90cyAgJiBcbGFtYmRhX3tLSn0gICAgXFwgICAgDQpcZW5ke2FycmF5fVxyaWdodCksIFxxcXVhZCANClxMYW1iZGFeVCBcOz0gXDsgXGxlZnQoXGJlZ2lue2FycmF5fXtjY2NjY2N9DQogIFxsYW1iZGFfezExfSAgICAgJiBcbGFtYmRhX3syMX0gJiBcY2RvdHMgJntcY29sb3J7UmVkfSBcbGFtYmRhX3trMX19ICAmIFxjZG90cyAgJiBcbGFtYmRhX3tLMX0gICAgXFwNCiAgXGxhbWJkYV97MTJ9ICAgICAmIFxsYW1iZGFfezIyfSAmIFxjZG90cyAme1xjb2xvcntSZWR9IFxsYW1iZGFfe2syfX0gJiBcY2RvdHMgICYgXGxhbWJkYV97SzJ9ICAgXFwNCiAgXHZkb3RzICAgICAmIFx2ZG90cyAgJiBcY2RvdHMgJiB7XGNvbG9ye1JlZH0gXHZkb3RzfSAgJlxkZG90cyAgJiBcdmRvdHMgICAgXFwNCiB7XGNvbG9ye0RhcmtHcmVlbn1cbGFtYmRhX3sxan0gfSAgICAmIHtcY29sb3J7RGFya0dyZWVufSBcbGFtYmRhX3syan19ICYge1xjb2xvcntEYXJrR3JlZW59XGNkb3RzfSAme1xjb2xvcntSZWR9IFxsYW1iZGFfe2tqfX0gJiB7XGNvbG9ye0RhcmtHcmVlbn1cY2RvdHN9ICAmIHtcY29sb3J7RGFya0dyZWVufVxsYW1iZGFfe0tKfSB9ICBcXCAgDQogICAgXHZkb3RzICAgICAmIFx2ZG90cyAgJiBcY2RvdHMgJiB7XGNvbG9ye1JlZH0gXHZkb3RzfSAgJlxkZG90cyAgJiBcdmRvdHMgICAgXFwNCiAgXGxhbWJkYV97MUp9ICAmIFxsYW1iZGFfezJKfSAmIFxjZG90cyAmIHtcY29sb3J7UmVkfSBcbGFtYmRhX3trSn19ICYgXGNkb3RzICAmIFxsYW1iZGFfe0tKfSAgICBcXCAgICANClxlbmR7YXJyYXl9XHJpZ2h0KSwgXHFxdWFkIA0Ke1xjb2xvcntSZWR9IFxsYW1iZGFfa30gXDs9IFw7IFxsZWZ0KFxiZWdpbnthcnJheX17Y30NCiAge1xjb2xvcntSZWR9IFxsYW1iZGFfe2sxfX0gICAgXFwNCiB7XGNvbG9ye1JlZH0gXGxhbWJkYV97azJ9fSAgIFxcDQoge1xjb2xvcntSZWR9IFx2ZG90c30gIFxcDQoge1xjb2xvcntSZWR9IFxsYW1iZGFfe2tqfX0gICBcXA0KICB7XGNvbG9ye1JlZH0gXHZkb3RzfSAgXFwNCiB7XGNvbG9ye1JlZH0gXGxhbWJkYV97a0p9fSAgIFxcICAgIA0KXGVuZHthcnJheX1ccmlnaHQpJCQNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCg0KKipFc3BlY2lmaWNpZGFkOioqIA0KDQpMYSAqZXNwZWNpZmljaWRhZCogKG8gdmFyaWFuemEgw7puaWNhKSB5IHJlY29nZSBsYSB2YXJpYWJpbGlkYWQgbm8gY29tcGFydGlkYSBjb24gbGFzIG90cmFzIHZhcmlhYmxlcy4gRXMgZGVjaXIsIGVzIGxhIHZhcmliYWlsaWRhZCBleGNsdXNpdmEgZGUgJFhfayQsIG8gc2VhLCBsYSB2YXJpYW56YSBxdWUgbm8gZXMgY29tcGFydGlkYSBwb3IgJFhfayQgY29uIGxhcyBvdHJhcyB2YXJpYWJsZXMuIEVzdMOhIGRhZGEgcG9yOiAgDQoNCiQkXHBzaV9rID0gVihcdmFyZXBzaWxvbl9rKSQkIA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBFamVtcGxvIGdyw6FmaWNvDQoNCkNvbnNpZGVyZW1vcyBsYSBzaXR1YWNpw7NuIHF1ZSBzZSBtdWV0cmEgZW4gbGEgRmlndXJhIFxAcmVmKGZpZzpGYWN0b3JpYWwyKS4gRW4gZWxsYSwgcGFyYSBjYWRhIHZhcmlhYmxlLCBsYSByZWdpw7NuIHNvbWJyZWFkYSBzZSBhc29jaWEgY29uIGxhIGNvbXVuYWxpZGFkIHkgbGEgbm8gc29tYnJlYWRhIGNvbiBsYSBlc3BlY2lmaWNpZGFkLiANCg0KDQo8Y2VudGVyPg0KDQpgYGB7ciBGYWN0b3JpYWwyLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqQ29tdW5hbGlkYWQgeSBlc3BlY2lmaWNpZGFkKioiLCBvdXQud2lkdGggPSAiNzAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkZhY3RvcmlhbDIucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgVmFyaWFuemEgcmV0ZW5pZGENCg0KTGEgdmFyaWFuemEgcmV0ZW5pZGEgcG9yIHRvZG9zIGxvcyBmYWN0b3JlcyBjb211bmVzIG8gbGEgdnJpYW56YSBleHBsaWNhZGEgcG9yIHRvZG9zIGxvcyBmYWN0b3JlcyBlczogDQoNCiQkSCBcOz0gXDsgXHN1bVxsaW1pdHNfe2s9MX1eSyBoXjJfayAkJA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFByb3BvcmNpw7NuIGRlIGxhIHBhcnRpY2lwYWNpw7NuIGRlIHVuIGZhY3Rvcg0KDQpMYSBwcm9wb3JjacOzbiBkZSBsYSBwYXJ0aWNpcGFjacOzbiBkZSB1biBmYWN0b3IgJEZfaiQgZW4gbGEgY29tdW5hbGlkYWQgdG90YWwgZXMNCg0KJCRcdGlsZGV7aH1fayBcOyA9IFw7IFxmcmFje2hfa317SH0kJA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIENhcMOtdHVsbyBFamVyY2ljaW9zIC0tPg0KDQojIyMgUHJvcGllZGFkZXMgZGUgbGEgbWF0cml6IGRlIGNhcmdhDQoNCioqUHJvcGllZGFkIDQ6KioNCg0KTGEgbWF0cml6IGRlIGNhcmdhICRcTGFtYmRhJCByZXByZXNlbnRhIGxhcyBjb3ZhcmlhbnphcyBlbnRyZSBsb3MgZmFjdG9yZXMgeSBsYXMgdmFyaWFibGVzIG9ic2VydmFkYXMuIEVzIGRlY2lyLCANCiQkQ292IChYLCBGXlQpIFw7PVw7ICAgXExhbWJkYSQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCioqRGVtb3N0cmFjacOzbiBkZSBsYSBwcm9waWVkYWQgNDoqKg0KDQpQYXJhIGRlbW9zdHJhciBlc3RvLCBtdWx0aXBsaXF1ZW1vcyAkRl5UJCBwb3IgbGEgZGVyZWNoYSBkZSBsYSBlY3VhY2nDs246DQoNCg0KJCRcdGlsZGV7WH0gXDsgOj0gXDsgWCBcOyAtIFw7IFxtdSBcOyA9IFw7IFxMYW1iZGEgRiBcOyArIFw7IFx2YXJlcHNpbG9uICwkJA0KDQpZIHF1ZWRhIGFzw606ICANCg0KJCRcdGlsZGV7WH0gXCwgRl5UIFw7ID0gXDsgXExhbWJkYSBGIFwsIEZeVCBcOyArIFw7IFx2YXJlcHNpbG9uXCwgRl5UJCQNCg0KDQpBbCBhcGxpY2FyIGVzcGVyYW56YSBhIGFtYm9zIGxhZG9zIGRlIGxhIGlndWFsZGFkLCBzZSBvYnRpZW5lOg0KDQokJENvdiAoXHRpbGRle1h9LCBGXlQpIFw7PVw7ICBFW1x0aWxkZXtYfVwsIEZeVF0gXDsgPSBcOyBcTGFtYmRhIFwsIFx1bmRlcmJyYWNle0UoRlwsIEZeVCl9X3tcOz1cOyAxfSBcOyArIFw7IFx1bmRlcmJyYWNlew0KRShcdmFyZXBzaWxvblwsIEZeVCl9X3tcOz1cOyAgMH0gXDsgPSBcOyBcTGFtYmRhJCQNCg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KKipQcm9waWVkYWQgNToqKg0KDQpFbiBlbCByZXN1bHRhZG8gYW50ZXJpb3IsIHNlIHR1dm8gZW4gY3VlbnRhIHF1ZSBsYXMgJEZfaiQgZXN0w6FuIGluY29ycmVsYWRhcyBlbnRyZSBzw60geSBjb24gbGFzICRcdmFyZXBzaWxvbl9rJCwgcGFyYSB0b2RvICRqLGsrMSxcbGRvdHMsSyQuIFBvciBvdHJvIGxhZG8sIHNhYmllbmRvIHF1ZSBsYSB2YXJpYW56YSBkZSAkWCQgZXMgJFxTaWdtYV9YID0gXFNpZ21hJCwgc2UgcHVlZGUgZGVtb3N0cmFyIHF1ZToNCg0KXGJlZ2lue2VxbmFycmF5fQ0KICAgXFNpZ21hICY9JiBcTGFtYmRhIFxMYW1iZGFeVCBcOyArXDsgIFxQc2kgKFwjZXE6ZWMtMy0yKQ0KXGVuZHtlcW5hcnJheX0NCg0KDQpkb25kZSAkXFBzaSQsIGVzIGxhIG1hdHJpeiBkZSB2YXJpYW56YSBkZWwgdmVjdG9yIGFsZWF0b3JpbyBkZSBsYXMgcGVydHVyYmFjaW9uZXMgJFx2YXJlcHNpbG9uJC4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQoqKlByb3BpZWRhZCA2OioqDQoNClNpIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyBzZSBoYW4gZXN0YWRhcml6YWRvcyAobWVkaWEgPSAwLCB2YXJpYW56YT0xKSwgZW50b25jZXMsICRcU2lnbWEgPSBSJCAobGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMpLiBDb24gZWxsbywgbGEgZWN1YWNpw7NuIFxAcmVmKGVxOmVjLTMtMikgcXVlZGFyw61hIGFzw606IA0KDQoNClxiZWdpbntlcW5hcnJheX0NCiAgIFIgJj0mIFxMYW1iZGEgXExhbWJkYV5UIFw7ICtcOyAgXFBzaSAoXCNlcTplYy0zLTJiKQ0KXGVuZHtlcW5hcnJheX0NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIFNvbHVjaW9uZXMgZmFjdG9yaWFsZXMNCg0KRW4gZWwgQW7DoWxpc2lzIEZhY3RvcmlhbCBubyBleGlzdGUgdW5hIHNvbHVjacOzbiDDum5pY2EgcGFyYSBkZXRlcm1pbmFyIGxhIG1hdHJpeiBkZQ0KcGVzb3MuIEVzIGbDoWNpbCB2ZXIgcXVlIGxhIGVjdWFjacOzbiBcQHJlZihlcTplYy0zLTIpIHRpZW5lIGluZmluaXRhIHNvbHVjaW9uZXMgcGFyYSAkXExhbWJkYSQsIHlhIHF1ZSwgcG9yIGVqZW1wbG8gc2kgJE0kIGVzIHVuYSBtYXRyaXogb3J0b2dvbmFsIGRlIG9yZGVuICRKJCwgZW50b25jZXMNCg0KXGJlZ2lue2VxbmFycmF5Kn0NClggJj0mIFxtdSBcOytcOyBcTGFtYmRhIEYgXDsrXDsgXHZhcmVwc2lsb24gXFwNCiY9JiBcbXUgXDsrXDsgKFxMYW1iZGEgXCxNKVwsIChNXlQgXCwgRikgXDsgK1w7IFxPbWVnYSBcXA0KJj0mIFxtdSBcOytcOyBcdGlsZGV7XExhbWJkYX0gXCwgXGJpZyhcdGlsZGV7XExhbWJkYX0gRlxiaWcpICBcOyArIFw7XE9tZWdhDQpcZW5ke2VxbmFycmF5Kn0NCg0KZXMgdGFtYmnDqW4gc29sdWNpw7NuIGRlIFxAcmVmKGVxOmVjLTMtMikuIE9ic2VydmUgcXVlIGVzdGUgbnVldm8gbW9kZWxvIHZlcmlmaWNhIGxhcyBtaXNtYXMgcHJvcGllZGFkZXMgcXVlIGVsIGFudGVyaW9yOiB0aWVuZSBjb21vIGZhY3RvcmVzICRcdGlsZGV7Rn0gPSBcdGlsZGV7XExhbWJkYX0gRiQgeSBjb21vIG1hdHJpeiBkZSBwZXNvcyBhICRcdGlsZGV7XExhbWJkYX0gPVxMYW1iZGEgXCxNJC4gRW4gZXN0ZSBjYXNvLCAgbGEgbWF0cml6IGRlIGNvdmFyaWFuemFzIGRlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyBlcw0KDQokJFxTaWdtYSBcOz1cOyAoXExhbWJkYSBcLE0pXCwgKFxMYW1iZGEgXCwgTSleVCArIFxQc2kgJCQNCg0KWWEgcXVlIGNvbW8gJE1NXlQgPSBJJCwgbGEgZXhwcmVzacOzbiBhbnRlcmlvciBzZSByZWR1Y2UgYSAkXFNpZ21hID07IFxMYW1iZGEgXCwgXExhbWJkYV5UICsgXFBzaSQgY29tbyBhbnRlcy4gIERlIGVzdGUgbW9kbyBzZSBleHBsaWNhLA0KZGUgbWFuZXJhIGVxdWl2YWxlbnRlLGxhIG1hdHJpeiBkZSBjb3ZhcmlhbnphcyBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMuDQoNClNlIHRyYXRhIGVudG9uY2VzIGRlIHNlbGVjY2lvbmFyIG1hdHJpY2VzIG9ydG9nb25hbGVzIGRlIG1hbmVyYSBxdWUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIGV4aGliYW4gdW4gZ3JhbiBjb250cmFzdGUgZW4gdW4gZmFjdG9yIHkgbm8gZW4gb3Ryb3MsIGxvIHF1ZSBwcm9wb3JjaW9uYXLDrWEgaW50ZXJwcmV0YWNpw7NuIGEgbG9zIGZhY3RvcmVzIGVuIHTDqXJtaW5vcyBkZSBlc3RhcyB2YXJpYWJsZXMgY29uIGNhcmdhIG3DoXhpbWEgc29icmUgZWxsb3MuIEVuIHJlc3VtZW4sIHB1ZWRlIHNlciBxdWUgbGEgc29sdWNpw7NuIHNlYSBtw6FzIGludGVycHJldGFibGUgbWVkaWFudGUgZWwgdXNvIGRlIGFsZ3VuYSBtYXRyaXogb3J0b2dvbmFsLCBsbyBxdWUgbGxldmEgYWwgY29uY2VwdG8gZGUgcm90YWNpw7NuIGRlIGxvcyBmYWN0b3Jlcy4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgUm90YWNpw7NuIGRlIGxvcyBlamVzIGZhY3RvcmlhbGVzIA0KDQpVbmEgZXN0cmF0ZWdpYSBwYXJhIGxvZ3JhciBlc3RvIGVzIGVsZWdpciB1bmEgbWF0cml6IG9ydG9nb25hbCAkUCQgcXVlIG1heGltaWNlIGxhIHZhcmlhbnphIHBvciBmaWxhcyBkZSBsb3MgY3VhZHJhZG9zIGRlIGxvcyBlbGVtZW50b3MgZGUgbGEgbWF0cml6ICRcTGFtYmRhJC4gTGEgZWxlY2Npw7NuIGRlIGxvcyBjdWFkcmFkb3Mgc2UganVzdGlmaWNhIHBvciBlbCBpbnRlcsOpcyBlbiBsb3MgZWxlbWVudG9zIHBlcXVlw7FvcyB5IGdyYW5kZXMgZGUgJFxMYW1iZGEkLiBFbiB0w6lybWlub3MgZ2VuZXJhbGVzLCBlbCBwcm9ww7NzaXRvIHByaW1vcmRpYWwgYWwgbGxldmFyIGEgY2FibyB1bmEgcm90YWNpw7NuIGVzIGJ1c2NhciB1bmEgKmVzdHJ1Y3R1cmEgbcOhcyBzaW1wbGUqLiBMYXMgY29uZGljaW9uZXMgcXVlIHNlIGRlYmVuIHNhdGlzZmFjZXIgc29uOg0KDQoxLiBDYWRhIGZpbGEgZGUgbGEgbWF0cml6IGZhY3RvcmlhbCBkZSBwZXNvcyBkZWJlIGluY2x1aXIgYWwgbWVub3MgdW4gZWxlbWVudG8gbnVsby4NCg0KMi4gQ2FkYSBjb2x1bW5hIGRlIGxhIG1hdHJpeiBmYWN0b3JpYWwgZGUgcGVzb3MgZGViZSBjb250ZW5lciBhbCBtZW5vcyAkaiQgZWxlbWVudG9zIG51bG9zLg0KDQozLiBDYWRhIHBhciBkZSBjb2x1bW5hcyBkZSBsYSBtYXRyaXogZmFjdG9yaWFsIGRlIHBlc29zIGRlYmUgY29udGVuZXIgbcO6bHRpcGxlcyB2YXJpYWJsZXMgY29uIHBlc29zIG51bG9zIGVuIHVuYSBjb2x1bW5hIHBlcm8gbm8gZW4gbGEgb3RyYS4NCg0KNC4gU2kgaGF5IG3DoXMgZGUgY3VhdHJvIGZhY3RvcmVzLCBjYWRhIHBhciBkZSBjb2x1bW5hcyBkZSBsYSBtYXRyaXogZmFjdG9yaWFsIGRlIHBlc29zIGRlYmUgY29udGVuZXIgdW4gbsO6bWVybyBjb25zaWRlcmFibGUgZGUgdmFyaWFibGVzIGNvbiBwZXNvcyBudWxvcyBlbiBhbWJhcyBjb2x1bW5hcy4NCg0KNS4gUG9yIGVsIGNvbnRyYXJpbywgc2kgaGF5IG3DoXMgZGUgY3VhdHJvIGZhY3RvcmVzLCBlbiBjYWRhIHBhciBkZSBjb2x1bW5hcyBkZSBsYSBtYXRyaXogZmFjdG9yaWFsIGRlIHBlc29zIHNvbG8gdW4gbsO6bWVybyByZWR1Y2lkbyBkZSB2YXJpYWJsZXMgZGViZSB0ZW5lciBwZXNvcyBkaXN0aW50b3MgZGUgY2Vyby4NCg0KDQpDdWFuZG8gc2UgbG9ncmEgdW5hIGNvbmZpZ3VyYWNpw7NuIHNlbmNpbGxhLCBsYXMgdmFyaWFibGVzIG9ic2VydmFkYXMgZXN0w6FuIGFncnVwYWRhcyBlbiBjb25qdW50b3MgbXV0dWFtZW50ZSBleGNsdXllbnRlcywgZGUgbWFuZXJhIHF1ZSBsYXMgcG9uZGVyYWNpb25lcyBzb24gZWxldmFkYXMgZW4gYWxndW5vcyBmYWN0b3JlcyB5IHJlZHVjaWRhcyBlbiBsb3MgZGVtw6FzLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBUaXBvcyBkZSByb3RhY2lvbmVzDQoNCmBgYHtyLCBldmFsPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyBWZXIgZGlidWpvYXMgcGFyYSBjb25zaWRlcmFyDQojaHR0cHM6Ly9ycHVicy5jb20vbWFyY2Vsby1jaGF2ZXovbXVsdGl2YXJpYWRvXzENCmBgYA0KDQoNCkhheSBkb3MgdGlwb3MgcG9zaWJsZXMgZGUgcm90YWNpb25lczogKm9ydG9nb25hbGVzKiB5ICpvYmxpY3VhcyouIExhIHByaW5jaXBhbCB2ZW50YWphIGRlIGxhcyByb3RhY2lvbmVzIG9ydG9nb25hbGVzIGVzIHN1IHNpbXBsaWNpZGFkLCB5YSBxdWUgbG9zIHBlc29zIHJlcHJlc2VudGFuIGxhcyBjb3JyZWxhY2lvbmVzIGVudHJlIGxvcyBmYWN0b3JlcyB5IGxhcyB2YXJpYWJsZXMsIHNpbiBlbWJhcmdvIGVzdG8gbm8gc2UgY3VtcGxlIGVuIGVsIGNhc28gZGUgbGFzIHJvdGFjaW9uZXMgb2JsaWN1YXMuIA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBSb3RhY2lvbmVzIG9ydG9nb25hbGVzDQoNCkVuIGVzdGUgY2FzbywgbG9zIGVqZXMgZGUgcm90YWNpw7NuIGZvcm1hbiB1biDDoW5ndWxvIGRlIDkwIGdyYWRvcyAodsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6Um90YWNpb24xKSkuIA0KDQoNCjxjZW50ZXI+DQpgYGB7ciBSb3RhY2lvbjEsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipSb3RhY2nDs24gb3J0b2dvbmFsKioiLCBvdXQud2lkdGggPSAiNjAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJvdGFjaW9uMS5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCg0KRW50cmUgbGFzIHJvdGFjaW9uZXMgb3J0b2dvbmFsZXMgc2UgZW5jdWVudHJhbiBkb3MgdGlwb3MgcHJpbmNpcGFsZXM6DQoNCg0KDQoqKlJvdGFjacOzbiBWYXJpbWF4LioqDQoNCkZ1ZSBwcm9wdWVzdGEgcG9yIEthaXNlciAoMTk1OCksIHkgdHJhdGEgZGUgcXVlIGxvcyBmYWN0b3JlcyB0ZW5nYW4gdW5hcyBwb2NhcyBzYXR1cmFjaW9uZXMgYWx0YXMgeSBtdWNoYXMgY2FzaSBudWxhcyBlbiBsYXMgdmFyaWFibGVzLiBFc3RvIGhhY2UgcXVlIGhheWEgZmFjdG9yZXMgY29uIGNvcnJlbGFjaW9uZXMgYWx0YXMgY29uIHVuIG7Dum1lcm8gcGVxdWXDsW8gZGUgdmFyaWFibGVzIHkgY29ycmVsYWNpb25lcyBudWxhcyBlbiBlbCByZXN0bywgcXVlZGFuZG8gYXPDrSByZWRpc3RyaWJ1aWRhIGxhIHZhcmlhbnphIGRlIGxvcyBmYWN0b3Jlcy4gRW4gZXN0ZSBjYXNvLCBzZSBtYXhpbWl6YW4gbGFzIHZhcmlhbnphcyBkZSBsYXMgY29sdW1uYXMgZGUgJFxMYW1iZGEkLCBlcyBkZWNpciBsYSBleHByZXNpw7NuIChsbGFtYWRvICpjcml0ZXJpbyB2YXJpbWF4Kik6DQoNCiQkViBcOz0gXDsgXGZyYWN7MX17S14yfSBcc3VtX3tqPTF9XkogXGxlZnRbSyBcc3VtX3tpPTF9XksgKFxsYW1iZGFfe2lqfSleNCAtIFxsZWZ0KFxzdW1fe2k9MX1eSyAoXGxhbWJkYV97aWp9KV4yICBccmlnaHQpXjIgXHJpZ2h0XSQkDQoNCkVuIHJlc3VtZW4sIGVuIGVsIG3DqXRvZG8gZGUgcm90YWNpw7NuIHZhcmltYXggc2UgYnVzY2EgbWF4aW1pemFyIGxhcyBwb25kZXJhY2lvbmVzIGEgbml2ZWwgZGVsIGZhY3RvcjsgZXMgZGVjaXIsIHNlIGVzcGVyYSBxdWUgY2FkYSDDrXRlbSBvIHZhcmlhYmxlIHNlYSByZXByZXNlbnRhdGl2byBlbiBzb2xvIHVubyBkZSBlbGxvcywgY29uIGVsIGZpbiBkZSBtaW5pbWl6YXIgYWwgbcOheGltbyBlbCBuw7ptZXJvIGRlIHZhcmlhYmxlcyBkZW50cm8gZGUgY2FkYSBmYWN0b3IuIA0KDQoqKlJvdGFjacOzbiBRdWFydGltYXguKioNCg0KVHJhdGEgcXVlIHVuYSB2YXJpYWJsZSBkYWRhIGVzdMOpIG11eSBjb3JyZWxhY2lvbmFkYSBjb24gdW4gZmFjdG9yIHkgbXV5IHBvY28gY29ycmVsYWNpb25hZGEgY29uIGVsIHJlc3RvIGRlIGZhY3RvcmVzLiBTZSB1c2EgbWVub3MgZnJlY3VlbnRlbWVudGUgcXVlIGxhIGFudGVyaW9yLiBQYXJhIGVzdGUgY2FzbywgZW4gdmV6IGRlIG1heGltaXphciBsYSB2YXJpYW56YSBkZSBsYXMgY29sdW1uYXMsIHNlIG1heGltaXphIGxhIGRlIGxhcyBjb2x1bW5hcy4gRXMgZGVjaXIsIGxhIGV4cHJlc2nDs24gKGxsYW1hZG8gKmNyaXRlcmlvIHF1YXJ0aW1heCopOjogDQoNCg0KJCRRIFw7PSBcOyBcZnJhY3sxfXtKXjJ9XHN1bV97aT0xfV5LIFxsZWZ0W0ogXHN1bV97aj0xfV5KIChcbGFtYmRhX3tpan0pXjQgLSBcbGVmdChcc3VtX3tqPTF9XkogKFxsYW1iZGFfe2lqfSleMiAgXHJpZ2h0KV4yIFxyaWdodF0kJA0KDQpFbiByZXN1bWVuLCBlbiBlbCBjYXNvIGRlIGxhIHJvdGFjacOzbiBxdWFydGltYXgsIGxhIG1heGltaXphY2nDs24gZGUgbGFzIHBvbmRlcmFjaW9uZXMgc2UgcmVhbGl6YSBhIG5pdmVsIGRlIGxhIHZhcmlhYmxlLCBsbyBxdWUgYnVzY2EgbWluaW1pemFyIGVsIG7Dum1lcm8gZGUgZmFjdG9yZXMgcXVlIGF5dWRlIGEgZXhwbGljYXIgY2FkYSB1bmEgZGUgZWxsYXMuIA0KDQoNCioqUm90YWNpw7NuIG9ydGhvbWF4KioNCg0KU2UgaGEgZGVtb3N0cmFkbyAgZWwgaGVjaG8gZGUgcXVlIHF1YXJ0aW1heCB5IHZhcmltYXggc29uIGVuIHJlYWxpZGFkIHVuYSBmw7NybXVsYSBjb21vIHNlIG11ZXN0cmEgYSB0cmF2w6lzIGRlbCBjcml0ZXJpbyBvcnRvbWF4OiANCiQkViBcOz0gXDsgS1wsIFEgXDstXDsgY1ckJA0KZG9uZGU6IA0KDQorICRXJCBlcyBsYSBzdW1hIGRlIGxvcyBjdWFkcmFkb3MgZGUgbGFzIHZhcmlhbnphcyBkZSBsb3MgZmFjdG9yZXMgKGRlc3B1w6lzIGRlIGxhIHJvdGFjacOzbikuDQoNCisgJGM9MCQgcGFyYSBxdWFydGltYXggKHBvciBsbyBnZW5lcmFsLCAkSyQgc2UgcmVtdWVzdmUgZGUgbGEgZsOzcm11bGEpLg0KDQorICRjPTEkIHBhcmEgdmFyaW1heC4NCg0KU2UgaW52ZXN0aWfDsyBjb24gZGF0b3MgZGUgYW7DoWxpc2lzIGZhY3RvcmlhbCBlbiBidXNjYSBkZSB1biB2YWxvciBtYXlvciBwYXJhIGVsIGNvZWZpY2llbnRlICRjJCBjb24gZWwgZmluIGRlIHJlc2FsdGFyIGVsIGxhZG8gdmFyaW1heGlhbm8geSBubyBxdWFydGltYXhpYW5vIGRlbCBjcml0ZXJpby4gDQoNCg0KRW4gZ2VuZXJhbCwgZWwgY29lZmljaWVudGUgJGMkIHB1ZWRlIHRvbWFyIGN1YWxxdWllciB2YWxvci4gQ3VhbmRvIHNlIGFjZXJjYSBhICQrXGluZnR5JCwgcHJvZHVjZSBmYWN0b3JlcyBkZSB2YXJpYW56YXMgY29tcGxldGFtZW50ZSBpZ3VhbGVzIChhc8OtIHF1ZSBzZSBwdWVkZSB1c2FyIHNpIGVzZSBlcyBlbCBvYmpldGl2bykuIEN1YW5kbyBzZSBhY2VyY2EgYSAkLVxpbmZ0eSQsIHNlIG9idGllbmUgY2FyZ2FzIGlndWFsZXMgYSBsYXMgcXVlIG9idGVuZHLDrWFtb3Mgc2kgcm90w6FyYW1vcyBudWVzdHJhIG1hdHJpeiBkZSBjYXJnYXMgYSBzdXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgbWVkaWFudGUgUENBIChzaW4gY2VudHJhciBsYXMgY29sdW1uYXMpLiBQb3IgbG8gdGFudG8sIGVsIHZhbG9yIGRlICRjJCBlcyBlbCBwYXLDoW1ldHJvIHF1ZSBlc3RpcmEgbGEgZGltZW5zacOzbiAiZ3JhbiBmYWN0b3IgZ2VuZXJhbCB2cy4gdG9kb3MgbG9zIGZhY3RvcmVzIGNvbiBpZ3VhbCBmdWVyemEiLg0KDQoNCioqUm90YWNpw7NuIGVxdWFtYXguKioNCg0KQ29uIGxhIHJvdGFjacOzbiBlcXVhbWF4IHNlIGhhY2UgdW5hIGNvbWJpbmFjacOzbiBkZSBsYXMgZG9zIHTDqWNuaWNhcyBhbnRlcmlvcmVzOyBwb3IgY29uc2lndWllbnRlLCBsYSBtYXhpbWl6YWNpw7NuIGRlIGxhcyBwb25kZXJhY2lvbmVzIHNlIGhhY2UgdGFudG8gYSBuaXZlbCBkZWwgZmFjdG9yIGNvbW8gYSBuaXZlbCBkZSBsYSB2YXJpYWJsZS4gRW4gZXN0ZSBjYXNvLCBzZSBlbmNvbnRyw7MgcXVlICRjPVxmcmFje219ezJ9JCBhIG1lbnVkbyBwcm9kdWNlIGZhY3RvcmVzIG3DoXMgaW50ZXJwcmV0YWJsZXMgcXVlIGRlc3B1w6lzIGRlIHJvdGFjaW9uZXMgdmFyaW1heCBvIHF1YXJ0aW1heC4gRWwgbcOpdG9kbyBlcXVhbWF4IGVzdMOhIGRlZmluaWRvIHBvciANCiQkRSBcOz0gXDsgS1wsIFEgXDstXDsgXGZyYWN7Sn17Mn1cLFckJA0KDQoNCg0KTGEganVzdGlmaWNhY2nDs24gcGFyYSBoYWNlciBxdWUgJGMkIGRlcGVuZGEgZGUgJEokIGZ1ZSBxdWUsIGEgbWVkaWRhIHF1ZSBlbCBuw7ptZXJvIGRlIGZhY3RvcmVzIGF1bWVudGEgbWllbnRyYXMgcXVlICRLJCBubywgbGEgcHJvcG9yY2nDs24gZXNwZXJhZGEgYSBwcmlvcmkgZGUgdmFyaWFibGVzIHF1ZSBzZXLDoW4gY2FyZ2FkYXMgcG9yIGN1YWxxdWllciBmYWN0b3IgZGlzbWludXllOyB5IHBhcmEgY29tcGVuc2FybG8sIGRlYmVyw61hbW9zIGF1bWVudGFyICRjJC4NCg0KDQoNCioqUm90YWNpw7NuIHBhcnNpbWF4LioqDQoNClVuIGVuZm9xdWUgYWRpY2lvbmFsLCBzaW1pbGFyIGEgZXF1YW1heCBwZXJvIGHDum4gbcOhcyBhdWRheiBlbiBzdSBiw7pzcXVlZGEgZGUgc2ltcGxpY2lkYWQsIHNlIGRlbm9taW5hIHBhcnNpbWF4IChtYXhpbWl6YW5kbyBsYSBwYXJzaW1vbmlhKS4gRW4gdW5hIGLDunNxdWVkYSBzaW1pbGFyIHBhcmEgIm1lam9yYXIiIGHDum4gbcOhcyBlbCBjcml0ZXJpbyBnZW7DqXJpY28sIHNlIGxsZWfDsyBhIHByb3BvbmVyc2UgZWwgbGxhbWFkbyBjcml0ZXJpbyAgcGFyc2ltYXguIEFxdcOtLCBlbCB2YWxvciBkZWwgY29lZmljaWVudGUgJGMkIGRlcGVuZGUgdGFudG8gZGUgJEokIGNvbW8gZGUgJEskIHkgZXN0w6EgZGVmaW5pZG8gY29tbzoNCg0KJCRjID0gXGZyYWN7S1wsIChKXDstXDsgMSl9e0tcOyArXDsgSlw7IC1cOyAyfSQkDQoNCioqUm90YWNpw7NuIGZhY3BhcnMgKGZhY3RvciBwYXJzaW1vbnkpLioqDQoNCkN1YW5kbyBzZSBoYWNlICRjPUskLiANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIFJvdGFjaW9uZXMgb2JsaWN1YXMNCg0KDQpFbiBlc3RlIGNhc28sIGxvcyBlamVzIGRlIHJvdGFjacOzbiBubyBmb3JtYW4gdW4gw6FuZ3VsbyBkZSA5MCBncmFkb3MgKHbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJvdGFjaW9uMikpLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUm90YWNpb24yLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqUm90YWNpw7NuIG9ibGljdWEqKiIsIG91dC53aWR0aCA9ICI2MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUm90YWNpb24yLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KRW50cmUgbGFzIHJvdGFjaW9uZXMgb2JsaWN1YXMsIGxhIG3DoXMgZW1wbGVhZGEgc29uOiAqb2JsaW3DrW4qIHkgKnByb21heCouDQoNCioqUm90YWNpw7NuIE9ibGltw61uLioqDQoNCkNvbiBlc3RhIHJvdGFjacOzbiBzZSB0cmF0YSBkZSBoYWxsYXIgdW5hIGVzdHJ1Y3R1cmEgYsOhc2ljYSBzaW4gaW1wb3J0YXIgcXVlIGxhcyByb3RhY2lvbmVzIHNlYW4gb3J0b2dvbmFsZXMsIGxvIGN1YWwgaW1wbGljYSBxdWUgbGFzIHNhdHVyYWNpb25lcyB5YSBubyBpbmRpY2FuIGxhcyBjb3JyZWxhY2lvbmVzIGVudHJlIGxvcyBmYWN0b3JlcyB5IGxhcyB2YXJpYWJsZXMuIExhIHJvdGFjacOzbiBvYmxpbWluIHBlcm1pdGUgZXN0YWJsZWNlciByZWxhY2lvbmVzIGplcsOhcnF1aWNhcyBlbnRyZSBsb3MgZmFjdG9yZXMuIFBvciBlc3RhIHJhesOzbiwgc2UgaW50cm9kdWNlIHVuIHBhcsOhbWV0cm8gcGFyYSByZWd1bGFyIGVsIGdyYWRvIGRlIGNvcnJlbGFjacOzbiAoZXMgZGVjaXIsIGVsIGdyYWRvIGRlIGluY2xpbmFjacOzbikgJFxkZWx0YSQgZW50cmUgbG9zIGZhY3RvcmVzLCBjb24gdmFsb3JlcyBwcmVmZXJlbnRlbWVudGUgZW50cmUgJC0wLjUkIHkgJDAuNSQuIFVuIHZhbG9yIGRlICRcZGVsdGEkIGRlIGNlcm8gZGEgbGFzIHJvdGFjaW9uZXMgbcOhcyBvYmxpY3Vhcy4gRW4gY3VhbHF1aWVyIGNhc28sIGxhIHJvdGFjacOzbiBkZSBsb3MgZmFjdG9yZXMgc2llbXByZSBlcyBvYmpldG8gZGUgZGViYXRlLCB5YSBxdWUgc2UgcHVlZGVuIHNlbGVjY2lvbmFyIGxvcyBlamVzIHF1ZSByZXN1bHRlbiBtw6FzIGNvbnZlbmllbnRlcy4gTm8gb2JzdGFudGUsIHNlIHB1ZWRlIGNvbmNlYmlyIHF1ZSB1bmEgcm90YWNpw7NuIGVzIHNpbXBsZW1lbnRlIHVuIG1lZGlvIHBhcmEgb2J0ZW5lciBlamVzIHF1ZSBmYWNpbGl0ZW4gbGEgZGVzY3JpcGNpw7NuIGRlIGxvcyBwdW50b3MgZGUgbGEgbXVlc3RyYSBkZSBtYW5lcmEgbcOhcyBzZW5jaWxsYS4NCg0KDQoqKlJvdGFjacOzbiBwcm9tYXguKioNCg0KRW4gY3VhbnRvIGEgbGEgcm90YWNpw7NuIHByb21heCwgbW9kaWZpY2EgbG9zIHJlc3VsdGFkb3MgZGUgdW5hIHJvdGFjacOzbiBvcnRvZ29uYWwgaGFzdGEgY3JlYXIgdW5hIHNvbHVjacOzbiBjb24gY2FyZ2FzIGZhY3RvcmlhbGVzIGxvIG3DoXMgcHLDs3hpbWFzIHBvc2libGUgYSBsYSAqZXN0cnVjdHVyYSBpZGVhbCouIFBhcmEgZWxsbywgZWxldmEgbGFzIGNhcmdhcyBmYWN0b3JpYWxlcyBvYnRlbmlkYXMgZW4gdW5hIHJvdGFjacOzbiBvcnRvZ29uYWwgYSB1bmEgZGV0ZXJtaW5hZGEgcG90ZW5jaWEgKGNvbm9jaWRhIGNvbW8gJFxrYXBwYSQpLiBFbiBnZW5lcmFsLCBsb3MgdmFsb3JlcyBkZSAkXGthcHBhJCBzZSBlbmN1ZW50cmFuIGVudHJlIDIgeSA0LCBwZXJvLCBhIG1heW9yIHBvdGVuY2lhLCBtYXlvciBvYmxpY3VpZGFkIGVuIGxhIHNvbHVjacOzbiAoZWwgdmFsb3IgZGUgJFxrYXBwYSQgbcOhcyBjb23Dum4gZXMgZGUgNCkuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KDQojIyMgTsO6bWVybyBtw6F4aW1vIGRlIGZhY3RvcmVzDQoNCkVsIG3DoXhpbW8gbsO6bWVybyBkZSBmYWN0b3JlcyBlbiBlc3RhIHTDqWNuaWNhIGVzdMOhIHJlc3RyaW5naWRvIHBvciBlbCB0YW1hw7FvIGRlIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2nDs24gZGVyaXZhZGEgZGUgbGFzIGNvb3JkZW5hZGFzIGRlbCB2ZWN0b3IgYWxlYXRvcmlvICRYJC4gU2kgbGEgbWF0cml6IGRlIGNvcnJlbGFjacOzbiAkXFNpZ21hX1gkIHRpZW5lIGRpbWVuc2lvbmVzICRLIFx0aW1lcyBLJCwgZW50b25jZXMgZWwgbsO6bWVybyBtw6F4aW1vIGRlIGZhY3RvcmVzIGVzICRcZnJhY3tLKEstMSl9ezJ9JC4gRXMgaW1wb3J0YW50ZSB0ZW5lciBlbiBjdWVudGEgcXVlIGxhIG1hdHJpeiAkXFNpZ21hJCBlcyBzaW3DqXRyaWNhLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KDQojIyMgRXN0aW1hY2nDs24gZGVsIG1vZGVsbw0KDQoNCkRvcyBvYmpldGl2b3MgaW1wb3J0YW50ZXMgZW4gZWwgcHJvY2VkaW1pZW50byBzb24gbG9zIHNpZ3VpZW50ZXM6DQogIA0KICArIERldGVybWluYXIgZWwgbsO6bWVybyBkZSBmYWN0b3JlcyBkZXNlYWRvLg0KICAgICAgDQogICsgT2J0ZW5lciB1bmEgZXN0aW1hY2nDs24gZGUgJFxMYW1iZGEkLg0KDQogDQpQYXJhIGxvZ3JhcmxvLCBsb3MgbcOpdG9kb3MgbcOhcyB1dGlsaXphZG9zIHNvbjoNCg0KMS4gKipNw6l0b2RvIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzKiouIEVzIGVsIHByb2NlZGltaWVudG8gYSB0cmF2w6lzIGRlbCBjdWFsIHNlIGRldGVybWluYW4gbGFzIHZhcmlhYmxlcyBsYXRlbnRlcyBvcnRvZ29uYWxlcyBxdWUgY2FwdHVyYW4gbGEgbWF5b3IgY2FudGlkYWQgZGUgdmFyaWFiaWxpZGFkIGRlIGxhcyB2YXJpYWJsZXMgb2JzZXJ2YWRhcywgZGUgbWFuZXJhIHNpbWlsYXIgYSBjb21vIHNlIHJlYWxpemEgZW4gZWwgbcOpdG9kbyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcywgcGVybyBhcGxpY2FkbyBhIGxhIG1hdHJpeiBkZSBjb2VmaWNpZW50ZXMgZGUgY29ycmVsYWNpw7NuLiBMYSB2YXJpYW56YSBleHBsaWNhZGEgcG9yIGVsIGZhY3RvciBsYXRlbnRlICRqJC3DqXNpbW8gc2UgZGVmaW5lIGNvbW86DQoNCg0KJCRWKEZfaikgPSBcc3VtX3trPTF9XksgXGxhbWJkYV97a2p9XjIsJCQNCg0KICAgIA0KZG9uZGUgJFxsYW1iZGFfezFqfSAsIFxsZG90cywgXGxhbWJkYV97S2p9JCwgZXMgbGEgai3DqXNpbWEgY29sdW1uYSBkZSBsYSBtYXRyaXogZGUgY2FyZ2EgJFxMYW1iZGEkLiBMYSBWYXJpYW56YSBleHBsaWNhZGEgcG9yIGVsIHByaW1lciBmYWN0b3IgZGViZSBzZXIgbWF5b3IgbyBpZ3VhbCBhIGxhIGV4cGxpY2FkYSBwb3IgZWwgc2VndW5kbywgeSBhc8OtIHN1Y2VzaXZhbWVudGUsIGhhc3RhIGxsZWdhciBhbCAkSiQtw6lzaW1vIGZhY3Rvci4NCiAgICANCjIuICoqTcOpdG9kbyBkZWwgZmFjdG9yIHByaW5jaXBhbCoqIChBbsOhbGlzaXMgZmFjdG9yaWFsIGNsw6FzaWNvKS4NCiAgICANCjMuICoqTcOpdG9kbyBkZSBtw6F4aW1hIHZlcm9zaW1pbGl0dWQqKi4gU3Vwb25kcmVtb3MgcXVlIHVuIGVzdGltYWRvciBwYXJhIGVsIG1vZGVsbyBwb2JsYWNpb25hbCBlczoNCg0KICAgJCRcd2lkZWhhdHtcU2lnbWF9IFw7PSBcO1x3aWRlaGF0e1xMYW1iZGF9XCxcd2lkZWhhdHtcTGFtYmRhfV5UIFw7ICtcOyBcd2lkZWhhdHtcUHNpfSwkJA0KICAgICBcbm9pbmRlbnQgY29uOiANCiAgICAgDQogICsgJFx3aWRlaGF0e1xTaWdtYX0kLCBjb21vIGVzdGltYWRvciBkZSBsYSBtYXRyaXogZGUgY292YXJpYW56YSAkXFNpZ21hJC4NCiAgDQogICsgJFx3aWRlaGF0e1xMYW1iZGF9JCBlc3RpbWFkb3IgZGUgbGEgbWF0cml6ICRcTGFtYmRhJC4gDQogIA0KICArICRcd2lkZWhhdHtcUHNpfSQgdW4gZXN0aW1hZG9yIGRlIGxhIG1hdHJpeiAkXFBzaSQuDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQoNCiMjIyBQcnVlYmEgZGUgaW5kZXBlbmRlbmNpYSANCg0KVW5vIGRlIGxvcyBwcm9ww7NzaXRvcyBkZWwgYW7DoWxpc2lzIGZhY3RvcmlhbCBjb25zaXN0ZSBlbiBvYnRlbmVyIHVuIGNvbmp1bnRvIHJlZHVjaWRvIGRlIGZhY3RvcmVzIHF1ZSBzZWFuIGNhcGFjZXMgZGUgcmVwbGljYXIgeSBwcm9wb3JjaW9uYXIgaW5mb3JtYWNpw7NuIGFkZWN1YWRhIHNvYnJlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcy4gUGFyYSBxdWUgZWwgZW1wbGVvIGRlIGVzdGUgbcOpdG9kbyBzZWEganVzdGlmaWNhZG8sIGVzIGZ1bmRhbWVudGFsIHF1ZSBleGlzdGEgdW5hIGNvcnJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcy4gRGUgbG8gY29udHJhcmlvLCBjYXJlY2Vyw61hIGRlIHNlbnRpZG8gbGxldmFyIGEgY2FibyBlbCBhbsOhbGlzaXMgZmFjdG9yaWFsLiBQb3IgbG8gdGFudG8sIGFudGVzIGRlIGFwbGljYXIgZGljaG8gYW7DoWxpc2lzIGEgdW4gY29uanVudG8gZGUgdmFyaWFibGVzLCBlcyBpbXByZXNjaW5kaWJsZSB2ZXJpZmljYXIgbGEgcHJlc2VuY2lhIGRlIHVuYSBjb3JyZWxhY2nDs24gZWxldmFkYSBlbnRyZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMuIEEgY29udGludWFjacOzbiBzZSBkZXNjcmliZW4gYWxndW5hcyBlc3RyYXRlZ2lhcyBwYXJhIHJlYWxpemFyIGVzdGEgdmVyaWZpY2FjacOzbi4NCg0KKipFc3RyYXRlZ2lhIDEuKioNCg0KRGV0ZXJtaW5hciBzaSBlbCBuw7ptZXJvIGRlIGNvcnJlbGFjaW9uZXMgZW4gbGEgbWF0cml6IHF1ZSBleGNlZGVuIDAuMyBlcyBhbHRvLiBBbGd1bm9zIGNvbnNpZGVyYW4gY29ycmVsYWNpb25lcyBkZSAwLjUgbyBtw6FzIGNvbW8gc2lnbmlmaWNhdGl2YXMuDQoNCioqRXN0cmF0ZWdpYSAyMS4qKg0KDQpMYSBwcnVlYmEgZGUgZXNmZXJpY2lkYWQgZGUgQmFydGxldHQgYXN1bWUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEuIFZlcmlmaWNhciBzaSBsYSBtYXRyaXogZGUgY29ycmVsYWNpw7NuIGVzIGxhIG1hdHJpeiBpZGVudGlkYWQgbyBubyBsbyBlcywgbyBlcXVpdmFsZW50ZW1lbnRlLCBzaSBlbCBkZXRlcm1pbmFudGUgZGUgZXN0YSBtYXRyaXogZXMgaWd1YWwgYSAxLiBTaSBsYSBtYXRyaXogZGUgY29ycmVsYWNpw7NuIGVzIGxhIG1hdHJpeiBpZGVudGlkYWQgbyBzaSBzdSBkZXRlcm1pbmFudGUgZXMgdW5vLCBubyB0aWVuZSBzZW50aWRvIHJlYWxpemFyIGVsIGFuw6FsaXNpcyBmYWN0b3JpYWwuDQoNCioqRXN0cmF0ZWdpYSAzLioqDQoNCkVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBwYXJjaWFsIGVudHJlIHZhcmlhYmxlcyBvcmlnaW5hbGVzIGRlYmUgc2VyIGJham8gc2kgY29tcGFydGVuIGZhY3RvcmVzIGNvbXVuZXMuIEVzdG9zIGNvZWZpY2llbnRlcyBzb24gZXN0aW1hY2lvbmVzIGRlIGNvcnJlbGFjaW9uZXMgZW50cmUgZmFjdG9yZXMgw7puaWNvcywgcG9yIGxvIHRhbnRvLCBzaSBsYXMgdmFyaWFibGVzIGVzdMOhbiBjb3JyZWxhY2lvbmFkYXMsIHNlIGVzcGVyYW4gdmFsb3JlcyBwZXF1ZcOxb3MuIExvcyBjb2VmaWNpZW50ZXMgZGUgY29ycmVsYWNpw7NuIHBhcmNpYWwgbWlkZW4gbGEgZGVwZW5kZW5jaWEgZW50cmUgdmFyaWFibGVzLCBjb250cm9sYW5kbyBlbCBlZmVjdG8gZGUgb3RyYXMuIA0KDQpTaSBkZW5vdGFtb3MgY29uICRhX3tpXCwga30kIGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBwYXJjaWFsIGVudHJlIGxhcyB2YXJpYWJsZXMgJFhfaSQgeSAkWF9rJCwgZW50b25jZXMgc2UgcHVlZGUgY2FsY3VsYXIgY29tbzoNCg0KJCRhX3tpXCxrfSBcOz1cOyAtXGZyYWN7RF97aWt9fXtcc3FydHtEX3tpaX1cLCBEX3tra319fSBcOz1cOyAtXGZyYWN7XHRpbGRle1N9X3tpa319e1xzcXJ0e1x0aWxkZXtTfV97aWl9XCwgXHRpbGRle1N9X3tra319fSwkJA0KZG9uZGUgJEQkIGVzIGVsIGRldGVybWluYW50ZSBkZSBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyBzaW1wbGVzIGVudHJlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcywgJERfe2lrfSQgZXMgZWwgZGV0ZXJtaW5hbnRlIGRlIGxhIHN1Ym1hdHJpeiBvYnRlbmlkYSBhbCBlbGltaW5hciBlbCBlbGVtZW50byBkZSBsYSBmaWxhICRpJCB5IGNvbHVtbmEgJGskIGVuIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzIHNpbXBsZXMsIHkgJFx0aWxkZXtTfV97aWt9JCBlcyBlbCBlbGVtZW50byBlbiBsYSBwb3NpY2nDs24gJChpLCBrKSQgZW4gbGEgaW52ZXJzYSBkZSBsYSBtYXRyaXogZGUgdmFyaWFuemEtY292YXJpYW56YSAkUz1cd2lkZWhhdHtcU2lnbWF9JC4NCg0KDQoqKkVzdHJhdGVnaWEgNC4qKg0KDQpFbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gbcO6bHRpcGxlIGFsIGN1YWRyYWRvIGVudHJlIHVuYSB2YXJpYWJsZSB5IHRvZGFzIGxhcyBkZW3DoXMgaW5kaWNhIHVuYSBlc3RydWN0dXJhIGRlIGNvcnJlbGFjacOzbiBzaSBlcyBhbHRvLiBTaSBlc3RvIG9jdXJyZSBwYXJhIHRvZGFzIGxhcyB2YXJpYWJsZXMgKG8gcGFyYSB1biBhbHRvIHBvcmNlbnRhamUgZGUgZWxsYXMpLCBlcyBhcHJvcGlhZG8gcmVhbGl6YXIgZWwgYW7DoWxpc2lzIGZhY3RvcmlhbC4gRXN0ZSBjb2VmaWNpZW50ZSBtaWRlIGxhIHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphIGRlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGV4cGxpY2FkYSBwb3IgdW4gY29uanVudG8gZGUgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLiANCg0KU2kgZGVub3RhbW9zIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGNvbW8gJFhfaSQgeSBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGNvbW8gJFhfayQsIHBhcmEgJGsgPSAxLFxsZG90cywgSyQgIHkgJGkgXG5lIGokLCAkaSA9IDEsIFxsZG90cywgSyQsIGVudG9uY2VzIGVzdGUgY29lZmljaWVudGUsICRSX3tpXCwgXGJ1bGxldH0kLCBzZSBwdWVkZSBjYWxjdWxhciBjb21vOg0KDQokJFJfe2lcLCBcYnVsbGV0fSBcOz1cOyAgMS1cZnJhY3tSfXtSX3tpaX19IFw7PVw7IDEgXDstXDsgXGZyYWN7MX17U197aWl9XCwgXHRpbGRle1N9X3tpaX19LCQkDQpkb25kZSAkU197aWl9JCB5ICRcdGlsZGV7U31fe2lpfSQgc29uIGxvcyBlbGVtZW50b3MgZW4gbGEgcG9zaWNpw7NuICQoaSwgaSkkIGRlIGxhcyBtYXRyaWNlcyBkZSB2YXJpYW56YS1jb3ZhcmlhbnphIHkgc3UgaW52ZXJzYSwgcmVzcGVjdGl2YW1lbnRlLg0KDQoqKkVzdHJhdGVnaWEgNS4qKg0KDQoNCkVsIMOtbmRpY2UgS2Fpc2VyLU1leWVyLU9sa2luIChLTU8pIHNlIHV0aWxpemEgcGFyYSBkZXRlcm1pbmFyIHNpIGxhcyB2YXJpYWJsZXMgZXN0w6FuIGxvIHN1ZmljaWVudGVtZW50ZSBjb3JyZWxhY2lvbmFkYXMgY29tbyBwYXJhIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBmYWN0b3JpYWwuIA0KDQpFbiBnZW5lcmFsLCBlcyB1bmEgbWVkaWRhIGRlIGxhIGNvbXBhcmFjacOzbiBkZSBsb3MgY29lZmljaWVudGVzIGRlIGNvcnJlbGFjacOzbiBvYnNlcnZhZG9zIGNvbiBsb3MgY29lZmljaWVudGVzIGRlIGNvcnJlbGFjacOzbiBwYXJjaWFsZXMgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzLiBNw6FzIGVzcGVjw61maWNvLCBlcyB1biBjb2NpZW50ZSBlbnRyZSBsYXMgY29ycmVsYWNpb25lcyBvYnNlcnZhZGFzIHkgbGFzIGNvcnJlbGFjaW9uZXMgcGFyY2lhbGVzLkxhIGbDs3JtdWxhIGVzIGxhIHNpZ3VpZW50ZTogIA0KDQokJEtNTyBcOz1cOyBcZnJhY3tcc3VtXGxpbWl0c197aT0xfV5LIFwsIFxzdW1cbGltaXRzX3tqPTF9Xksgcl97aWp9XjJ9e1xzdW1cbGltaXRzX3tpPTF9XksgXHN1bVxsaW1pdHNfe2o9MX1eSyByX3tpan1eMiBcOyArIFw7IFxzdW1cbGltaXRzX3tpPTF9XksgXHN1bVxsaW1pdHNfe2o9MX1eSyBhX3tpan1eMn0kJA0KDQpkb25kZToNCiAgDQogICsgJHJfe2lrfSQgZXMgZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIG9ic2VydmFkbyBlbnRyZSBsYXMgdmFyaWFibGVzICRYX2kkIHkgJFhfayQuDQogIA0KICArICRhX3tpa30kIGVzIGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBwYXJjaWFsIGVudHJlIGxhcyB2YXJpYWJsZXMgJFhfaSQgeSAkWF9rJCwgY29udHJvbGFuZG8gZWwgZWZlY3RvIGRlIG90cmFzIHZhcmlhYmxlcy4NCiAgDQogICsgJEskIGVzIGVsIG7Dum1lcm8gdG90YWwgZGUgdmFyaWFibGVzIGVuIGVsIGFuw6FsaXNpcyBmYWN0b3JpYWwuDQogIA0KDQpFbCDDrW5kaWNlIEtNTyB2YXLDrWEgZW50cmUgMCB5IDEuIExhIG1lZGlkYSBwdWVkZSBzZXIgaW50ZXJwcmV0YWRhIGNvbiBsYXMgc2lndWllbnRlcyBkaXJlY3RyaWNlczoNCiAgDQogICsgU2kgJEtNTyBcZ2VxIDAuOCQ6ICBwZXJmZWN0byBwYXJhIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBmYWN0b3JpYWwgKEFGKS4NCiAgDQogICsgU2kgJEtNTyQgZXN0w6EgZW50cmUgMC42IGEgMC43OiAgYWRlY3VhZG8uIEhheSBjb3JyZWxhY2nDs24geSwgcG9yIGxvIHRhbnRvLCBlbCBBRiBlcyBhcHJvcGlhZG8uDQogIA0KICArIFNpICRLTU8kIGVzdMOhIGVudHJlIDAuNCBhIDAuNTogIGFjZXB0YWJsZS4gU2UgcHVlZGUgaW1wbGVtZW50YXIgdW4gQUYuIFNpbiBlbWJhcmdvIHNlIHN1Z2llcmUgdmVyaWZpY2FyIGVsIGVzdGFkbyBkZSBsYXMgdmFyaWFibGVzLg0KICANCiAgKyAkS01PJCBtZW5vcmVzIGEgMC40OiAgbm8gc2UgcmVjb21pZW5kYSB1biBBRi4NCg0KDQpFcyBkZWNpciwgdW4gdmFsb3IgbcOhcyBjZXJjYW5vIGEgMSBpbmRpY2EgcXVlIGxhcyB2YXJpYWJsZXMgZXN0w6FuIGJpZW4gY29ycmVsYWNpb25hZGFzIHkgcXVlIGVsIGFuw6FsaXNpcyBmYWN0b3JpYWwgZXMgYXByb3BpYWRvLiBVbiB2YWxvciBtZW5vciBxdWUgMC41IHN1Z2llcmUgcXVlIGxhcyB2YXJpYWJsZXMgbm8gZXN0w6FuIGxvIHN1ZmljaWVudGVtZW50ZSBjb3JyZWxhY2lvbmFkYXMgeSBxdWUgZWwgYW7DoWxpc2lzIGZhY3RvcmlhbCBwdWVkZSBubyBzZXIgYXByb3BpYWRvLiANCg0KDQoqKkVzdHJhdGVnaWEgNi4qKg0KDQpFbCDDrW5kaWNlIE1TQSAoTWluaW11bSBTYW1wbGUgb2YgQWRlcXVhY3kpIGVzIHNpbWlsYXIgYWwgYW50ZXJpb3IsIHBlcm8gZWwgYW7DoWxpc2lzIHNlIGhhY2UgcG9yIHZhcmlhYmxlcy4gIFNlIHV0aWxpemEgcGFyYSBkZXRlcm1pbmFyIHNpIHVuYSB2YXJpYWJsZSBkZWJlIHNlciBleGNsdWlkYSBkZWwgYW7DoWxpc2lzIGZhY3RvcmlhbC4gRWwgw61uZGljZSBNU0Egc2UgY2FsY3VsYSBjb21vIGxhIHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphIGV4cGxpY2FkYSBwb3IgbGFzIGNvcnJlbGFjaW9uZXMgZW50cmUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIGVuIGNvbXBhcmFjacOzbiBjb24gbGEgdmFyaWFuemEgdG90YWwsIHRlbmllbmRvIGVuIGN1ZW50YSBsYXMgY29ycmVsYWNpb25lcyBwYXJjaWFsZXMuIExhIGbDs3JtdWxhIGVzIGxhIHNpZ3VpZW50ZTogDQoNCiQkTVNBX2sgXDs9XDsgXGZyYWN7XHN1bVxsaW1pdHNfe2k9MX1eSyByX3tpa31eMn17XHN1bVxsaW1pdHNfe2k9MX1eSyByX3tpa31eMiBcOytcOyBcc3VtXGxpbWl0c197aT0xfV5LIGFfe2lrfV4yfSAkJA0KDQpUYW1iacOpbiB0b21hIHZhbG9yZXMgZW50cmUgMCB5IDEuIFVuIHZhbG9yIGFsdG8gZGUgTVNBIGluZGljYSBxdWUgbGEgdmFyaWFibGUgaSBlc3TDoSBiaWVuIHJlbGFjaW9uYWRhIGNvbiBsYXMgb3RyYXMgdmFyaWFibGVzIHkgZXMgYWRlY3VhZGEgcGFyYSBlbCBhbsOhbGlzaXMgZmFjdG9yaWFsLiBQb3Igb3RybyBsYWRvLCB1biB2YWxvciBiYWpvIHN1Z2llcmUgcXVlIGxhIHZhcmlhYmxlIGkgbm8gZXN0w6EgYmllbiByZWxhY2lvbmFkYSB5IHBvZHLDrWEgY29uc2lkZXJhcnNlIHBhcmEgc2VyIGV4Y2x1aWRhIGRlbCBhbsOhbGlzaXMgZmFjdG9yaWEuIEVuIGxhIHByw6FjdGljYSBzZSBzdWdpZXJlIHF1ZSwgc2kgJE1TQV9rIDwgMC41JCwgbGEgdmFyaWFibGUgZGViZSBzZXIgZXhjbHVpZGEuDQoNCg0KDQoqKk9ic2VydmFjaW9uZXMuKiogDQoNCkVsIE1TQSBvIEtNTyBhdW1lbnRhIGNvbmZvcm1lOg0KICANCiAgKyBBdW1lbnRhIGVsIHRhbWHDsW8gbXVlc3RyYWwuDQogIA0KICArIEF1bWVudGEgbGFzIGNvcnJlbGFjaW9uZXMuDQogIA0KICArIEF1bWVudGEgZWwgbsO6bWVybyBkZSB2YXJpYWJsZXMuDQogIA0KICArIERlc2NpZW5kZSBlbCBuw7ptZXJvIGRlIGZhY3RvcmVzLg0KICANCg0KIA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgVGVzdCBkZSBlc2ZlcmljaWRhZCANCg0KU2kgbG9zIGRhdG9zIHNpZ3VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwsIGVzdG8gcGVybWl0ZSBmb3JtdWxhciB1bmEgaGlww7N0ZXNpcyBzb2JyZSBsYSBlc3RydWN0dXJhIGRlIGxhIG1hdHJpeiAkXFNpZ21hX1gkIHkgZGV0ZXJtaW5hciBjdcOhbnRvcyBmYWN0b3JlcyBjb211bmVzIGRlYmVuIHJldGVuZXJzZS4gRW4gZXN0ZSBjYXNvLCBsYXMgaGlww7N0ZXNpcyBudWxhIHkgYWx0ZXJuYXRpdmEgc2Vyw61hbiByZXNwZWN0aXZhbWVudGU6DQoNCiQkSF8wIDpcU2lnbWEgPSBcTGFtYmRhIFxMYW1iZGFeVCBcOytcOyBcUHNpXHFxdWFkICBcbWJveHt2ZXJzdXN9IFxxcXVhZCBIXzEgOiBcU2lnbWEgXDtcbWJveHtlcyBzZW1pZGVmaW5pZGEgcG9zaXRpdmF9JCQNCg0KQXF1w606ICAkXExhbWJkYSQgZXMgdW5hIG1hdHJpeiBkZSAkSyBcdGltZXMgSiQuIFBvciBsbyB0YW50bywgc2kgbm8gc2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEsIGVsIG7Dum1lcm8gZGUgZmFjdG9yZXMgYSByZXRlbmVyIHNlcsOtYSAkSiQuIE5vIGVzIGNvbXBsaWNhZG8gZGVtb3N0cmFyIHF1ZSBiYWpvIGVsIHN1cHVlc3RvIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLCBhbCB0b21hciB1bmEgbXVlc3RyYSBhbGVhdG9yaWEgZGUgdGFtYcOxbyAkbiQgZGUgZXN0YSBwb2JsYWNpw7NuLCBlbCBlc3RhZMOtc3RpY28NCg0KJCRGIFw7PSBcOyBuXGxlZnRbbG58XFNpZ21hfCBcOy0gXDsgbG58U3wgXDsrIFw7IHRyKFxTaWdtYV57LTF9IFMpIFw7LSBcOyBLXHJpZ2h0XSwkJA0KDQp0aWVuZSB1bmEgZGlzdHJpYnVjacOzbiBhcHJveGltYWRhbWVudGUgY2hpLWN1YWRyYWRvIGNvbiAkdiA9IFxmcmFjezF9ezJ9KEstSikoSy1KLTEpJCBncmFkb3MgZGUgbGliZXJ0YWQuDQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCg0KIyBNb2RlbG8gY29uIHZhcmlhYmxlcyBsYXRlbnRlcyBvYmxpY3Vhcw0KDQoNCg0KQ3VhbmRvIGhheSBjb3JyZWxhY2nDs24gZW50cmUgbG9zIGZhY3RvcmVzIGNvbXVuZXMsIGVsIG1vZGVsbyBmYWN0b3JpYWwgc2UgZGVub21pbmEgKm1vZGVsbyBmYWN0b3JpYWwgb2JsaWN1byouIFBvciBlc3RhIHJhesOzbiwgbGEgY29ycmVsYWNpw7NuIGVudHJlIGRvcyBmYWN0b3JlcyAkRl9pJCB5ICRGX2okIGVzIGRpc3RpbnRvIGRlIGNlcm8sIHBhcmEgYWxnw7puICRpIFxuZSBqJCwgJGksIGogPSAxLCBcbGRvdHMsIEokLiAgUG9yIGNvbnNpZ3VpZW50ZSwgIGVsIG1vZGVsbyBmYWN0b3JpYWwgcGFyYSBlbCB2ZWN0b3IgYWxlYXRvcmlvICRYJCBzZXLDrWE6DQokJCBYIFw7PSBcOyBcTGFtYmRhIEYgXDsrXDsgXFBzaSwgJCQgDQoNClxub2luZGVudCBPYnNlcnZlIHF1ZSBlbCBtb2RlbG8gdGllbmUgdW5hIGVzY3JpdHVyYSBzaW1pbGFyIGFsIG1vZGVsbyBmYWN0b3JpYWwgb3J0b2dvbmFsIChyZWNvcmRlbW9zIHF1ZSBsb3MgZmFjdG9yZXMgYWhvcmEgZXN0w6FuIGFzb2NpYWRvcyksIHBlcm8gaGF5IHVuYSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW4gbGEgZXN0cnVjdHVyYSBkZWwgbW9kZWxvIHBhcmEgbGEgbWF0cml6IGRlIHZhcmlhbnphIGRlbCB2ZWN0b3IgYWxlYXRvcmlvICRYJC4gRW4gZXN0ZSBjYXNvLCB2aWVuZSBkYWRvIHBvcg0KJCQgXFNpZ21hX1ggXDs9IFw7IFxMYW1iZGEgXFRoZXRhIFxMYW1iZGFeVCBcOysgXDsgXFBzaSwgJCQNCg0KXG5vaW5kZW50IGRvbmRlICQgXFRoZXRhICQgZXMgbGEgbWF0cml6IGRlIGNvZWZpY2llbnRlcyBkZSBjb3JyZWxhY2nDs24gZGVsIHZlY3RvciBhbGVhdG9yaW8gJEYkLiBFcyBpbXBvcnRhbnRlIGRlc3RhY2FyIHF1ZSBzaSwgZW4gbGEgZWN1YWNpw7NuIGFudGVyaW9yLCAkIFxUaGV0YSA9IElfSyAkICwgc2Ugb2J0aWVuZSBsYSBlY3VhY2nDs24gY29ycmVzcG9uZGllbnRlIGVuIGVsIG1vZGVsbyBmYWN0b3JpYWwgb3J0b2dvbmFsLg0KDQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gQ2Fww610dWxvIEVqZXJjaWNpb3MgLS0+DQoNCiMgRWplcmNpY2lvcw0KDQpQZW5kaWVudGUNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCg0KPCEtLSBDYXDDrXR1bG8gQmlibGlvZ3JhZsOtYS0tPg0KDQoNCiMgQmlibGlvZ3JhZsOtYSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KICANCkNvbnN1bHRhciBlbCBkb2N1bWVudG8gW1JQdWJzIDo6IEFuw6FsaXNpcyBtdWx0aXZhcmlhZG8gKGJpYmxpb2dyYWbDrWEpXShodHRwczovL3JwdWJzLmNvbS9obGxpbmFzL1JfTXVsdGl2YXJpYWRvX0JpYmxpb2dyYWZpYSkuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQoNCiZuYnNwOw0KDQoNCiZuYnNwOw0KPGNlbnRlcj4NCn5+fg0KSWYgeW91IGZvdW5kIGFueSBFUlJPUlMgb3IgaGF2ZSBTVUdHRVNUSU9OUywgcGxlYXNlIHJlcG9ydCB0aGVtIHRvIG15IGVtYWlsLiBUaGFua3MuICANCn5+fg0KPC9jZW50ZXI+DQoNCg0K