REPORTE TRABAJO 2: APLICACIONES DE REDES NEURONALES A DATOS TABULARES

REDES NEURONALES Y ALGORITMOS BIOINSPIRADOS




Presentado por:

Leonardo Federico Corona Torres
David Escobar Ruiz
Johan Sebastian Robles Rincón
Sebastián Soto Arcila



Profesor: Juan David Ospina Arango

Monitor: Andrés Mauricio Zapata Rincón


University Logo

Universidad Nacional de Colombia
Facultad de Minas
Ingeniería de Sistemas e Informática

12 de junio de 2025

Contenidos

Introducción

Las redes neuronales son un tipo de modelo computacional inspirado en el funcionamiento del cerebro humano, compuesto por capas de unidades llamadas neuronas artificiales (Wikipedia, s.f., Artificial Neural Networks). Estas redes son capaces de aprender patrones complejos a partir de grandes volúmenes de datos mediante un proceso conocido como entrenamiento. A través de este proceso, ajustan internamente sus parámetros para minimizar el error en la tarea que se les asigna.

Se utilizan ampliamente en tareas de clasificación, regresión, detección de anomalías, procesamiento de imágenes, procesamiento de lenguaje natural, entre muchas otras aplicaciones. Su capacidad para capturar relaciones no lineales y complejas entre variables las convierte en una herramienta poderosa dentro del campo del aprendizaje automático.

Uno de los problemas clásicos en los que se aplican técnicas de aprendizaje supervisado es la clasificación de riesgo de crédito , que consiste en predecir la probabilidad de que un solicitante de crédito cumpla o no con sus obligaciones financieras (Synapse Analytics, s.f., Credit Scoring Explained - The Problem Statement). Este tipo de modelos es crucial para las instituciones financieras, ya que les permite tomar decisiones más informadas, reducir riesgos y mejorar la asignación de recursos.

En este contexto, las redes neuronales ofrecen una alternativa eficaz frente a modelos más tradicionales, ya que pueden modelar relaciones no evidentes entre los atributos financieros y demográficos de los solicitantes y su comportamiento crediticio futuro. A pesar de que requieren más datos y mayor capacidad de cómputo, su rendimiento suele ser superior cuando se dispone de información suficiente y bien estructurada.

Para facilitar el uso del modelo desarrollado, se construyó una aplicación web que permite ingresar los datos relevantes del solicitante y obtener, en tiempo real, la predicción del nivel de riesgo de crédito. Esta interfaz busca demostrar cómo una solución basada en inteligencia artificial puede integrarse fácilmente en entornos reales, brindando accesibilidad, automatización y soporte a la toma de decisiones.

Metodología

El desarrollo del proyecto se dividió en tres etapas principales: limpieza de datos y análisis exploratorio (EDA), ingeniería de features y modelado. Cada una de estas fases fue abordada de manera modular para facilitar la comprensión y el desarrollo iterativo del modelo.

Para el procesamiento y análisis, se utilizaron Jupyter Notebooks, lo cual permitió una exploración interactiva del dataset. No obstante, se reconoce que para entornos de producción y mejor escalabilidad, sería recomendable implementar estos procesos como pipelines orquestados con herramientas como Apache Airflow.

El dataset utilizado proviene de Kaggle y está disponible en su respectivo enlace (Kaggle, s.f., Credit Risk Analysis).

Durante la etapa de análisis exploratorio y visualización, se hizo uso de librerías como Seaborn y Matplotlib, mientras que para la manipulación y transformación de los datos se emplearon NumPy y Pandas. El preprocesamiento y el modelado inicial se realizaron con herramientas de Scikit-learn, y para la construcción del modelo de red neuronal se utilizó PyTorch, lo que permitió una mayor flexibilidad en la implementación del modelo de deep learning.

Definición del problema

El riesgo crediticio se puede abordar como un problema de clasificación binaria, en el que se busca predecir si un solicitante de crédito representa un riesgo alto o bajo de incumplimiento. Esta tarea es fundamental para instituciones financieras, ya que les permite tomar decisiones más seguras y eficientes al momento de otorgar préstamos.

El objetivo principal de la solución a este problema es entrenar un modelo basado en redes neuronales que sea capaz de aprender patrones a partir de los datos históricos y realizar predicciones precisas sobre el riesgo crediticio de nuevos solicitantes.

Para lograrlo, es necesario identificar y seleccionar las variables más relevantes del conjunto de datos, de manera que el modelo pueda capturar la información crítica que influye en el comportamiento financiero de los individuos.

El qué tan bueno sea el modelo estará definido por las siguientes métricas (Geeks for Geeks, 2025):

Parte 1. Limpieza de Datos y Análisis Exploratorio de Datos

A continuación se presenta una síntesis de lo realizado en el proceso de limpieza de datos y análisis exploratorio de datos. Todo el código con los detalles de implementación se puede encontrar en el archivo poc_EDA.ipynb en el repositorio del proyecto.

1.1 Objetivos

Antes de comenzar a modelar, es necesario asegurarse de que los datos están lo suficientemente procesados y preparados para poder entrenar el modelo, de tal forma que este pueda alcanzar los niveles deseados en las métricas previamente definidas.

Adicionalmente, se debe entender primero el conjunto de datos junto con sus propiedades estadísticas tanto univariadas como multivariadas, con el objetivo de encontrar patrones o relaciones que den pistas de qué factores podrían estar más relacionados con la probabilidad de cumplimiento o incumplimiento del pago del préstamo.

A manera de síntesis, se tienen los siguientes objetivos para la limpieza de datos y el análisis exploratorio de datos:

  • Entender la estructura general del dataset y sus columnas, recogiendo información como las dimensiones del dataset, sus tipos de datos y cómo se ven las primeras y últimas filas del dataset.

  • Definir un conjunto de criterios de limpieza de datos previo al análisis exploratorio de datos que permita evitar desvíos de los patrones realmente relevantes del conjunto de datos.

  • Realizar una adecuada limpieza de los datos a partir de los criterios anteriormente definidos.

  • Realizar un análisis univariado y multivariado de las columnas tanto numéricas como no numéricas del dataset para poder entender de mejor manera las propiedades estadísticas del mismo.

  • Derivar conclusiones relevantes a partir de cada análisis realizado.

  • Contar con un dataset lo suficientemente limpio como para poder seguir con un proceso de ingeniería de features.

1.2 Estructura del dataset

Antes de comenzar con la limpieza de los datos, se debe estar familiarizado con el propio dataset. Es por esto que se parte de una visión general, revisando la estructura del dataset, para después ir a lo particular, revisando cada columna.

1.2.1 Origen del dataset

El dataset a utilizar se puede encontrar en (Kaggle, s.f., Credit Risk Analysis).

1.2.2 Dimensiones del dataset

Las dimensiones del dataset, calculadas a partir de la lectura del mismo como un DataFrame de pandas (ver código en repositorio), son las siguientes:

Columnas 74 columnas
Filas 887379 filas

Tabla 1. Dimensiones del dataset crudo.

De la Tabla 1 se puede evidenciar que se está lidiando con un dataset de tamaño relativamente grande, lo cual hay que considerar a la hora de realizar la limpieza y el modelado.

Algo bueno a resaltar es que se cuenta con una buena abundancia de datos para poder entrenar el modelo, y por lo tanto con una buena limpieza y preprocesamiento, se cree que se pueden alcanzar valores ideales para las métricas del modelo una vez entrenado.

1.2.3 Primeras y últimas 5 filas del dataset

Debido al gran tamaño del dataset, se complica la exploración del mismo por el uso de herramientas de ofimática básicas como Excel o Google Sheets. Es por esto que se optó por revisar las primeras y últimas 5 filas del dataset por medio del uso de los métodos head() y tail() de pandas.

Debido al gran tamaño del dataset no es posible adjuntar las filas y columnas en este reporte. Sin embargo, se puede revisar el archivo poc_EDA.ipynb en el repositorio del proyecto para revisarlas.

1.2.4 Información estructural general del dataset

Nombre de columna Número de valores no nulos Tipo de dato
id 887379 int64
member_id 887379 int64
loan_amnt 887379 float64
funded_amnt 887379 float64
funded_amnt_inv 887379 float64
term 887379 object
int_rate 887379 float64
installment 887379 float64
grade 887379 object
sub_grade 887379 object
emp_title 835917 object
emp_length 842554 object
home_ownership 887379 object
annual_inc 887375 float64
verification_status 887379 object
issue_d 887379 object
loan_status 887379 object
pymnt_plan 887379 object
url 887379 object
desc 126026 object
purpose 887379 object
title 887226 object
zip_code 887379 object
addr_state 887379 object
dti 887379 float64
delinq_2yrs 887350 float64
earliest_cr_line 887350 object
inq_last_6mths 887350 float64
mths_since_last_delinq 433067 float64
mths_since_last_record 137053 float64
open_acc 887350 float64
pub_rec 887350 float64
revol_bal 887379 float64
revol_util 886877 float64
total_acc 887350 float64
initial_list_status 887379 object
out_prncp 887379 float64
out_prncp_inv 887379 float64
total_pymnt 887379 float64
total_pymnt_inv 887379 float64
total_rec_prncp 887379 float64
total_rec_int 887379 float64
total_rec_late_fee 887379 float64
recoveries 887379 float64
collection_recovery_fee 887379 float64
last_pymnt_d 869720 object
last_pymnt_amnt 887379 float64
next_pymnt_d 634408 object
last_credit_pull_d 887326 object
collections_12_mths_ex_med 887234 float64
mths_since_last_major_derog 221703 float64
policy_code 887379 float64
application_type 887379 object
annual_inc_joint 511 float64
dti_joint 509 float64
verification_status_joint 511 object
acc_now_delinq 887350 float64
tot_coll_amt 817103 float64
tot_cur_bal 817103 float64
open_acc_6m 21372 float64
open_il_6m 21372 float64
open_il_12m 21372 float64
open_il_24m 21372 float64
mths_since_rcnt_il 20810 float64
total_bal_il 21372 float64
il_util 18617 float64
open_rv_12m 21372 float64
open_rv_24m 21372 float64
max_bal_bc 21372 float64
all_util 21372 float64
total_rev_hi_lim 817103 float64
inq_fi 21372 float64
total_cu_tl 21372 float64
inq_last_12m 21372 float64

Tabla 2. Información estructural básica del dataset crudo.

Utilizando el método info() de la libería pandas, se puede generar la información de la información estructural general del dataset que contiene información como el número de columnas y entradas, valores no nulos por cada columna y el tipo de dato de cada una.

1.2.5 Conclusiones

A partir de lo anterior, se derivaron las siguientes conclusiones:

  • Se cuenta con un dataset relativamente grande, con aproximadamente 887K filas y 74 columnas. Se tendrá que hacer un análisis riguroso para poder limpiar los datos apropiadamente.

  • Se cuenta con datos tanto de tipo numérico (float64 e int64) como no numérico (object). Probablemente los de tipo no numérico pertenecen a columnas de texto plano, categóricas y ordinales, que se tendrán que tratar más adelante.

  • Puede que algunos valores de columnas object pertenezcan a fechas, los cuales se analizarán más adelante.

  • Las columnas de identificación se podrán eliminar (id y member_id) debido a que son de identificación de cada fila y no impactarán en la probabilidad de pago.

1.3 Limpieza de datos inicial

Una vez más familiarizados con los datos, se procederá a definir ciertos criterios de limpieza generales para implementar antes del análisis exploratorio de datos.

1.3.1 Criterios de limpieza

Se definen los siguientes criterios de limpieza previo al análisis con el objetivo de mitigar la cantidad de “pistas falsas” con las que se podría estropear el entendimiento del dataset.

  • Criterio 1: El porcentaje de valores nulls no debe superar el 80%:

    Columnas que tengan más del 80% de sus valores nulos serán difíciles de imputar mas adelante, y por lo tanto se optará por eliminarlas.

  • Criterio 2: No se dejarán columnas de texto plano. Se aceptarán columnas categóricas y ordinales que luego se codificarán:

    Columnas que sean de texto plano y no sigan ninguna estructura definida que permitan tratarlas serán eliminadas debido a la dificultad que podrían traer al momento de codificarlos a valores numéricos.

  • Criterio 3: No se dejarán columnas de identificación, ya que son para identificar filas y entidades y no están relacionados con ningún patrón relevante para el análisis:

    Columnas que correspondan a formas de identificación de filas serán eliminadas ya que no contribuirán al análisis.

  • Criterio 4: Se descartarán columnas que tengan solamente un valor único:

    Se descartarán columnas que consten de solamente un valor único para evitar redundancias entre los datos.

1.3.2 Cumplimiento de criterio 1

Nombre de Columna Número de valores nulos Porcentaje de valores nulos
desc 761353 85.797951
mths_since_last_record 750326 84.555303
mths_since_last_major_derog 665676 75.015974
annual_inc_joint 886868 99.942415
dti_joint 886870 99.942640
verification_status_joint 886868 99.942415
open_acc_6m 866007 97.591559
open_il_6m 866007 97.591559
open_il_12m 866007 97.591559
open_il_24m 866007 97.591559
mths_since_rcnt_il 866569 97.654892
total_bal_il 866007 97.591559
il_util 868762 97.902024
open_rv_12m 866007 97.591559
open_rv_24m 866007 97.591559
max_bal_bc 866007 97.591559
all_util 866007 97.591559
inq_fi 866007 97.591559
total_cu_tl 866007 97.591559
inq_last_12m 866007 97.591559

Tabla 3. Columnas que tienen más del 80% de sus valores como nulos.

Para cumplir el criterio del porcentaje de valores nulls se identificaron las columnas que se muestran en la Tabla 3 que tienen un porcentaje de valores nulls mayor al 80%.

Se procedió a eliminarlos, pasando de tener un dataset de 74 columnas a uno de 55 columnas.

Se filtraron las columnas utilizando las herramientas y los métodos de tratamiendo de datos de pandas.

1.3.3 Cumplimiento de criterio 2

Para el cumplimiento de este criterio se tuvieron que separar las columnas numéricas de las no numéricas.

Nombre de Columna Algunos Valores Únicos
term [’ 36 months’ ’ 60 months’]
grade [‘B’ ‘C’ ‘A’ ‘E’ ‘F’ ‘D’ ‘G’]
sub_grade [‘B2’ ‘C4’ ‘C5’ ‘C1’ ‘B5’ ‘A4’ ‘E1’ ‘F2’ ‘C3’ ‘B1’ ‘D1’ ‘A1’ ‘B3’ ‘B4’ ‘C2’ ‘D2’ ‘A3’ ‘A5’ ‘D5’ ‘A2’]
emp_title [nan ‘Ryder’ ‘AIR RESOURCES BOARD’ ‘University Medical Group’ ‘Veolia Transportaton’ ‘Southern Star Photography’ ‘MKC Accounting’ ‘Starbucks’ ‘Southwest Rural metro’ ‘UCLA’ ‘Va. Dept of Conservation/Recreation’ ‘Target’ ‘SFMTA’ ‘Internal revenue Service’ “Chin’s Restaurant” ‘Duracell’ ‘Connection Inspection’ ‘Network Interpreting Service’ ‘Archdiocese of Galveston Houston’ ‘Osram Sylvania’]
emp_length [‘10+ years’ ‘< 1 year’ ‘1 year’ ‘3 years’ ‘8 years’ ‘9 years’ ‘4 years’ ‘5 years’ ‘6 years’ ‘2 years’ ‘7 years’ nan]
home_ownership [‘RENT’ ‘OWN’ ‘MORTGAGE’ ‘OTHER’ ‘NONE’ ‘ANY’]
verification_status [‘Verified’ ‘Source Verified’ ‘Not Verified’]
issue_d [‘Dec-2011’ ‘Nov-2011’ ‘Oct-2011’ ‘Sep-2011’ ‘Aug-2011’ ‘Jul-2011’ ‘Jun-2011’ ‘May-2011’ ‘Apr-2011’ ‘Mar-2011’ ‘Feb-2011’ ‘Jan-2011’ ‘Dec-2010’ ‘Nov-2010’ ‘Oct-2010’ ‘Sep-2010’ ‘Aug-2010’ ‘Jul-2010’ ‘Jun-2010’ ‘May-2010’]
loan_status [‘Fully Paid’ ‘Charged Off’ ‘Current’ ‘Default’ ‘Late (31-120 days)’ ‘In Grace Period’ ‘Late (16-30 days)’ ‘Does not meet the credit policy. Status:Fully Paid’ ‘Does not meet the credit policy. Status:Charged Off’ ‘Issued’]
pymnt_plan [‘n’ ‘y’]
url [‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1077501’ ‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1077430’ ‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1077175’ ‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1065775’ ‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1069971’ ‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1062474’ ‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1069742’]
purpose [‘credit_card’ ‘car’ ‘small_business’ ‘other’ ‘wedding’ ‘debt_consolidation’ ‘home_improvement’ ‘major_purchase’ ‘medical’ ‘moving’ ‘vacation’ ‘house’ ‘renewable_energy’ ‘educational’]
title [‘Computer’ ‘bike’ ‘real estate business’ ‘personel’ ‘Personal’ ‘My wedding loan I promise to pay back’ ‘Loan’ ‘Car Downpayment’ ‘Expand Business & Buy Debt Portfolio’ ‘Building my credit history.’ ‘High intrest Consolidation’ ‘Consolidation’ ‘freedom’ ‘citicard fund’ ‘Other Loan’ ‘Debt Consolidation Loan’ ‘Home’ ‘Holiday’ ‘Medical’ ‘lowerratemeanseasiertogetoutofdebt!’]
zip_code [‘860xx’ ‘309xx’ ‘606xx’ ‘917xx’ ‘972xx’ ‘852xx’ ‘280xx’ ‘900xx’ ‘958xx’ ‘774xx’ ‘853xx’ ‘913xx’ ‘245xx’ ‘951xx’ ‘641xx’ ‘921xx’ ‘067xx’ ‘890xx’ ‘770xx’ ‘335xx’]
addr_state [‘AZ’ ‘GA’ ‘IL’ ‘CA’ ‘OR’ ‘NC’ ‘TX’ ‘VA’ ‘MO’ ‘CT’ ‘UT’ ‘FL’ ‘NY’ ‘PA’ ‘MN’ ‘NJ’ ‘KY’ ‘OH’ ‘SC’ ‘RI’]
earliest_cr_line [‘Jan-1985’ ‘Apr-1999’ ‘Nov-2001’ ‘Feb-1996’ ‘Jan-1996’ ‘Nov-2004’ ‘Jul-2005’ ‘Jan-2007’ ‘Apr-2004’ ‘Sep-2004’ ‘Jan-1998’ ‘Oct-1989’ ‘Jul-2003’ ‘May-1991’ ‘Sep-2007’ ‘Oct-1998’ ‘Aug-1993’ ‘Oct-2003’ ‘Jan-2001’ ‘Nov-1997’]
initial_list_status [‘f’ ‘w’]
last_pymnt_d [‘Jan-2015’ ‘Apr-2013’ ‘Jun-2014’ ‘Jan-2016’ ‘Apr-2012’ ‘Nov-2012’ ‘Jun-2013’ ‘Sep-2013’ ‘Jul-2012’ ‘Oct-2013’ ‘May-2013’ ‘Feb-2015’ ‘Aug-2015’ ‘Oct-2012’ ‘Sep-2012’ nan ‘Dec-2012’ ‘Dec-2014’ ‘Aug-2013’ ‘Nov-2013’]
next_pymnt_d [nan ‘Feb-2016’ ‘Jan-2016’ ‘Sep-2013’ ‘Feb-2014’ ‘May-2014’ ‘Jun-2013’ ‘Mar-2012’ ‘Apr-2012’ ‘May-2013’ ‘Aug-2012’ ‘Aug-2013’ ‘Jun-2012’ ‘Nov-2013’ ‘Feb-2012’ ‘Oct-2011’ ‘Jan-2013’ ‘Jan-2014’ ‘Jul-2013’ ‘Jul-2015’]
last_credit_pull_d [‘Jan-2016’ ‘Sep-2013’ ‘Jan-2015’ ‘Sep-2015’ ‘Dec-2014’ ‘Aug-2012’ ‘Mar-2013’ ‘Dec-2015’ ‘Aug-2013’ ‘Nov-2012’ ‘Mar-2014’ ‘Apr-2015’ ‘May-2014’ ‘Jul-2015’ ‘Jul-2012’ ‘Sep-2012’ ‘May-2013’ ‘Oct-2015’ ‘Jun-2012’ ‘Mar-2015’]
application_type [‘INDIVIDUAL’ ‘JOINT’]

Tabla 4. Columnas no numéricas junto con algunos de sus valores únicos

Se revisaron las columnas de tipo object (mostradas en la Tabla 4 y se revisaron sus valores únicos para verificar cuáles eran de texto plano para poder eliminarlas.

De lo anterior, se concluyó que las columnas de texto plano eran las siguientes: emp_title, title y url. Se procedió con su eliminación, pasando de tener 55 columnas a tener 52.

1.3.4 Cumplimiento de criterio 3

Del propio nombre de las columnas id y member_id y del diccionario de datos que vino con el dataset, se concluye que estas dos columnas son de identificación y se procede a eliminarlas para cumplir el criterio 3.

Tras la eliminación, se pasa de 52 columnas a 50 columnas.

1.3.5 Cumplimiento de criterio 4

Tras examinar los valores únicos de las columnas numéricas, se identificó que la columna policy_code solamente tenía 1 solo valor para cada fila de las columnas, y por eso se procedió con su eliminación, pasando de tener 50 columnas a 49 columnas.

1.3.6 Conclusiones

A partir de lo anterior, se derivaron las siguientes conclusiones:

  • Se eliminaron columnas con más del 80% de valores nulos, lo que permitió reducir significativamente la cantidad de ruido y valores faltantes difíciles de imputar.

  • Se descartaron columnas de texto plano que no aportaban estructura útil para el modelado, lo que facilitó la futura codificación de variables categóricas.

  • Se eliminaron columnas de identificación y aquellas con un único valor, ya que no aportaban información relevante al análisis.

  • Tras aplicar todos los criterios de limpieza definidos, se pasó de un total de 74 columnas a 49, dejando un conjunto de datos más limpio, manejable y adecuado para el análisis y modelado posterior.

1.4 Análisis exploratorio univariado de columnas numéricas

Utilizando este nuevo dataset procesado, se permite proceder con el análisis exploratorio de los datos. Se comenzó por el análisis univariado de las columnas numéricas.

1.4.1 Estadísticas descriptivas

Nombre col Media Std Min 25% 50% 75% Max Skewness Kurtosis
loan_amnt 14755.264605 8435.455601 500.000000 8000.000000 13000.000000 20000.000000 35000.000000 0.681683 -0.256715
funded_amnt 14741.877625 8429.897657 500.000000 8000.000000 13000.000000 20000.000000 35000.000000 0.683745 -0.251638
funded_amnt_inv 14702.464383 8442.106732 0.000000 8000.000000 13000.000000 20000.000000 35000.000000 0.680983 -0.251765
int_rate 13.246740 4.381867 5.320000 9.990000 12.990000 16.200000 28.990000 0.429481 -0.155362
installment 436.717127 244.186593 15.670000 260.705000 382.550000 572.600000 1445.460000 0.936952 0.685970
annual_inc 7.502759e+04 6.469830e+04 0.000000e+00 4.500000e+04 6.500000e+04 9.000000e+04 9.500000e+06 4.447849e+01 4.808192e+03
dti 18.157039 17.190626 0.000000 11.910000 17.650000 23.950000 9999.000000 441.486775 256126.862941
delinq_2yrs 0.314442 0.862244 0.000000 0.000000 0.000000 0.000000 39.000000 5.473796 57.309081
inq_last_6mths 0.694623 0.998448 0.000000 0.000000 0.000000 1.000000 33.000000 2.108411 11.925103
mths_since_last_delinq 34.063798 21.884940 0.000000 15.000000 31.000000 50.000000 188.000000 0.455520 -0.767314
open_acc 11.548469 5.317313 0.000000 8.000000 11.000000 14.000000 90.000000 1.249380 3.103994
pub_rec 0.195307 0.582091 0.000000 0.000000 0.000000 0.000000 86.000000 13.261941 993.199008
revol_bal 1.692079e+04 2.242679e+04 0.000000 6.443000e+03 1.187500e+04 2.082900e+04 2.904836e+06 1.594930e+01 9.858908e+02
revol_util 55.067693 23.834344 0.000000 37.700000 56.000000 73.600000 892.300000 -0.123869 1.027269
total_acc 25.268026 11.840561 0.000000 17.000000 24.000000 32.000000 169.000000 0.892539 1.377589
out_prncp 8403.124852 8493.450269 0.000000 0.000000 6458.290000 13659.055000 49372.860000 0.932018 0.122621
out_prncp_inv 8399.713242 8489.997617 0.000000 0.000000 6455.810000 13654.050000 49372.860000 0.931868 0.121827
total_pymnt 7558.826684 7871.243336 0.000000 1914.590000 4894.999117 10616.814231 57777.579870 1.788894 3.620120
total_pymnt_inv 7521.160306 7846.108604 0.000000 1899.700000 4862.010000 10565.690000 57777.580000 1.793832 3.641981
total_rec_prncp 5757.706424 6625.441046 0.000000 1200.570000 3215.320000 8000.000000 35000.030000 1.935036 3.989046
total_rec_int 1754.804327 2095.356099 0.000000 441.460000 1073.280000 2238.265000 24205.620000 2.826100 11.543598
total_rec_late_fee 0.396692 4.087825 0.000000 0.000000 0.000000 0.000000 358.680000 17.404085 515.724165
recoveries 45.919243 409.693874 0.000000 0.000000 0.000000 0.000000 33520.270000 18.061839 617.211417
collection_recovery_fee 4.880757 63.125281 0.000000 0.000000 0.000000 0.000000 7002.190000 29.655693 1684.165364
last_pymnt_amnt 2164.145585 4794.783233 0.000000 280.170000 462.780000 831.245000 36475.590000 3.475852 13.355772
collections_12_mths_ex_med 0.014380 0.134191 0.000000 0.000000 0.000000 0.000000 20.000000 17.410400 1097.854795
mths_since_last_major_derog 44.104838 22.179841 0.000000 27.000000 44.000000 61.000000 188.000000 0.264932 -0.031362
acc_now_delinq 0.004991 0.077625 0.000000 0.000000 0.000000 0.000000 14.000000 24.066357 1630.866453
tot_coll_amt 2.257026e+02 1.031137e+04 0.000000 0.000000e+00 0.000000e+00 0.000000e+00 9.152545e+06 8.561805e+02 7.596112e+05
tot_cur_bal 1.394582e+05 1.537500e+05 0.000000 2.985300e+04 8.055900e+04 2.082050e+05 8.000078e+06 2.918174e+00 2.940881e+01
total_rev_hi_lim 3.206862e+04 3.749826e+04 0.000000 1.390000e+04 2.370000e+04 3.980000e+04 9.999999e+06 7.304552e+01 1.840039e+04

Tabla 5. Resumen de estadísticas descriptivas para cada columna numérica.

De esta tabla se pueden realizar las siguientes observaciones:

  • annual_inc, dti, pub_rec, recoveries, collection_recovery_fee, tot_coll_amt, total_rev_hi_lim, entre otras, presentan fuerte asimetría a la derecha (valores extremos altos). Esto podría llegar a afectar el modelo de redes neuronales.

  • dti, annual_inc, tot_coll_amt, pub_rec, collections_12_mths_ex_med, total_rev_hi_lim, etc., tienen colas pesadas con outliers extremos.

  • delinq_2yrs, inq_last_6mths, pub_rec, collections_12_mths_ex_med, acc_now_delinq, etc., tienen mayoría de valores en 0.

  • Variables financieras como loan_amnt, funded_amnt, installment, total_pymnt, etc., probablemente están altamente correlacionadas.

  • Montos como total_rec_late_fee, recoveries, collection_recovery_fee tienen valores extremos que pueden distorsionar análisis

1.4.2 Valores vacíos y conteo de valores por columna

Nombre de Columna Número de valores null Porcentaje de valores null Número de valores únicos en columna (Si tiene menos de 300, se muestran los primeros 20 valores)
annual_inc 4 0.000451 49385
delinq_2yrs 29 0.003268

30

[ 0. 2. 3. 1. 4. 6. 5. 8. 7. 9. 11. nan 13. 15. 10. 12. 17. 18. 29. 24.]

inq_last_6mths 29 0.003268

29

[ 1. 5. 2. 0. 3. 4. 6. 7. 8. 9. 10. 11. 12. 15. 14. 33. 17. 32. 24. 13.]

mths_since_last_delinq 454312 51.197065

156

[nan 35. 38. 61. 8. 20. 18. 68. 45. 48. 41. 40. 74. 25. 53. 39. 10. 26. 56. 77.]

open_acc 29 0.003268

78

[ 3. 2. 10. 15. 9. 7. 4. 11. 14. 12. 20. 8. 6. 17. 5. 13. 16. 30. 21. 18.]

pub_rec 29 0.003268

33

[ 0. 1. 2. 3. 4. 5. nan 6. 9. 8. 7. 11. 49. 10. 54. 12. 18. 19. 16. 15.]

revol_util 502 0.056571 1357
total_acc 29 0.003268 136
collections_12_mths_ex_med 145 0.016340

13

[ 0. nan 1. 2. 4. 3. 6. 16. 20. 5. 7. 10. 14.]

mths_since_last_major_derog 665676 75.015974

169

[nan 53. 34. 54. 69. 7. 16. 71. 33. 59. 45. 8. 56. 11. 50. 47. 64. 32. 62. 39.]

acc_now_delinq 29 0.003268

9

[ 0. 1. nan 2. 3. 5. 4. 6. 14.]

tot_coll_amt 70276 7.919502 10326
tot_cur_bal 70276 7.919502 327343
total_rev_hi_lim 70276 7.919502 21252

Tabla 6. Valores vacíos y conteo de valores únicos para cada columna numérica.

Los valores null de las columnas categóricas se resumen en la Tabla 6. A partir de esto se pudo notar lo siguiente:

  • Las columnas con mayor número de nulos son mths_since_last_major_derog y mths_since_last_delinq. Se deberán imputar con precaución.

  • La mayoría de valores tienen una cantidad de nulos relativamente baja, así que se podrá realizar una imputación sencilla para llenar estos valores.

  • Hay varias columnas que tienen nans, así que se tendrán que imputar con precaución también.

1.4.3 Distribución e identificación de datos atípicos (outliers)

Figura 1. Violin plots y box plots de cada variable numérica en el dataset.

En la Figura 1 se muestran plots de violin y caja para poder identificar tanto la distribución de los datos como para identificar los valores anómalos por cada columna. Se puede apreciar lo siguiente:

  • loan_amnt, funded_amnt, funded_amnt_inv tienen distribuciones simétricas y estables, sin valores extremos notables.

  • installment presenta un leve sesgo a la derecha.

  • out_prncp y out_prncp_inv están centradas en cero, indicando muchos préstamos pagados.

  • total_rec_prncp se concentra cerca de cero pero con un rango amplio.

  • annual_inc tiene un fuerte sesgo a la derecha, con outliers significativos.

  • revol_bal, tot_cur_bal, total_rev_hi_lim, total_rec_int, total_rec_late_fee, tot_coll_amt están sesgadas a la derecha con colas largas.

  • collection_recovery_fee, recoveries, last_pymnt_amnt, avg_cur_bal también muestran colas largas hacia la derecha.

  • delinq_2yrs, inq_last_6mths, open_acc, pub_rec, acc_now_delinq, collections_12_mths_ex_med tienen distribuciones discretas, centradas en pocos valores.

  • mths_since_last_delinq y mths_since_last_major_derog presentan huecos grandes debido a muchos valores nulos.

  • collections_12_mths_ex_med, acc_now_delinq, total_rec_late_fee, recoveries, collection_recovery_fee están dominadas por ceros.

  • funded_amnt, loan_amnt, funded_amnt_inv tienen patrones similares y pueden ser redundantes.

  • out_prncp y out_prncp_inv también son similares entre sí.

  • total_rec_prncp, total_rec_int, total_rec_late_fee, recoveries podrían agruparse como montos recuperados.

  • Variables fuertemente sesgadas podrían beneficiarse de transformaciones.

  • Variables con muchos ceros podrían eliminarse.

  • Variables redundantes podrían eliminarse o consolidarse.

  • Variables discretas con pocos valores pueden tratarse como categorías ordinales.

1.4.4. Conclusiones

A partir de lo anterior, se derivaron las siguientes conclusiones:

  • Entre los datos se encuentran varias columnas que están muy o poco sesgadas, además de contar con muchos o pocos outliers. Se tendrá que tener esto en cuenta a la hora de preprocesar los datos.

  • Existen varias columnas con valores nulos pero imputables, y por lo tanto se podrá realizar la debida imputación al momento de hacer el preprocesado.

1.5 Análisis exploratorio univariado de columnas no numéricas

1.5.1 Distribución de frecuencias y cardinalidad

A partir del análisis de la estructura del proyecto, se pudieron identificar las columnas no numéricas que se muestran en la Tabla 4. Se procedió a analizar la frecuencia y cardinalidad de estas columnas.

De esto, se pudo identificar lo siguiente:

  • term solo tiene dos valores posibles, y por lo tanto podrá ser codificada fácilmente.

  • grade y sub_grade están relacionadas, pero sub_grade tiene más granularidad, y por lo tanto se decide eliminar la columna grade.

  • emp_length es ordinal, y por lo tanto deberá ser codificada según corresponde.

  • home_ownership tiene algunas clases similares, como OTHER, NONE y ANY, por lo que dependiendo de su frecuencia se podrían agrupar.

  • verification_status también será fácil de codificar debido a que cuenta solamente con 2 valores.

  • Debido a la antiguedad de los datos, se optará luego por descartar las columnas que contengan fechas.

  • loan_status será nuestro target, el cual más adelante se codificará siguiendo las recomendaciones dadas por el enunciado del problema.

  • purpose es una versión más estructurada y constante de title, y por lo tanto se conservará.

  • zip_code y addr_state están relacionadas, pero addr_state tiene menos cardinalidad, y por lo tanto se optará por eliminar la columna zip_code.

  • initial_list_status será fácil de codificar al contar con pocos valores.

1.5.2 Conteo de valores por columna

Figura 2. Gráficos de barras para las variables categóricas.

En la Figura 2 se muestran los gráficos de barras generados para ver la frecuencia de los valores de cada variable categórica. De esta, se puede identificar lo siguiente:

  • Muchas variables categóricas (como term, grade, pymnt_plan, application_type) tienen categorías dominantes, lo que sugiere un fuerte desbalance que se tendría que tratar, por ejemplo, eliminando las filas que contienen valores que no son comunes.

  • Se puede ver que la mayoría de los préstamos son a 36 meses y los principales motivos de préstamo son deb_consolidation y credit_card.

  • La mayoría de los datos tienen a MORTGAGE como su estado de home_ownership.

  • Columnas como application_type, last_credit_pull_d, next_pymnt, last_pymnt_d, pymnt_plan y home_ownership tienen muy poca variabilidad o tienen valores que son muy raros. Para tratarlos, se optará por eliminar las filas que contengan valores extremadamente raros, y se eliminarán columnas que tengan más del 80% de los valores iguales.

1.5.3 Limpieza adicional de columnas con poca varianza

A partir de lo anteriormente mencionado, se decidió por realizar las siguientes acciones de limpieza para las columnas categóricas:

  • Se eliminarán las columnas grade y zip_code debido a que ya tienen otras columnas que encapsulan sus significados.

  • Por el momento, debido a que los datos van hasta el 2016, se eliminarán las siguientes columnas que representan fechas: last_pymnt_d, next_pymnt_d, issue_d, earliest_cr_line, last_credit_pull_d.

  • Se eliminarán las filas que no cumplan con los siguientes criterios:

    • El valor de home_ownership deberá ser RENT, MORTGAGE o OWN.

    • El valor de pymnt_plan deberá ser “n”.

    • El valor de application_type deberá ser INDIVIDUAL.

Una vez aplicada la limpieza de acuerdo a los anteriores criterios, se pasó de tener 887379 filas a tener 886623 filas, es decir, que hubo una reducción de menos del 0.01% del dataset.

1.6 Análisis multivariado

1.6.1 Transformación de target a valores numéricos

Según el enunciado, los valores del target deberán ser codificados de la siguiente manera:

  • Positive (0): Si el target es “Fully Paid” o “Does not meet the credit policy. Status:Fully Paid”.

  • Negative (1): Si el target es “Charged Off”, “Late (31-120 days)”, “Default” o “Does not meet the credit policy. Status:Charged off”.

  • Null (indefinido): Si el target es “Current”, “Issued”, “In Grace Period” o “Late (16-30 days)”.

La codificación se realizó utilizando la siguiente función de mapeo:

positive = {
    "Fully Paid", 
    "Does not meet the credit policy. Status:Fully Paid"
}
negative = {
    "Charged Off",
    "Late (31-120 days)",
    "Default",
    "Does not meet the credit policy. Status:Charged Off"
}
null = {
    "Current",
    "Issued",
    "In Grace Period",
    "Late (16-30 days)",
}


def custom_target_transformer(value):
    if value in positive:
        return 0
    elif value in negative:
        return 1
    else:
        return np.nan

Con el target debidamente codificado como una variable binaria, ya se podrá realizar un análisis de correlación respectivo.

1.6.2 Matriz de correlación

Figura 3. Matriz de correlación.

De esta matriz de correlación, considerando que loan_status es el target del problema de aprendizaje supervisado, se observa lo siguiente:

  • Las columnas loan_amnt, funded_amnt y funded_amnt_inv están fuertemente correlacionadas, lo cual tiene sentido al tratarse de representaciones del monto del préstamo.

  • La mayoría de las variables presentan correlaciones moderadas o bajas, lo cual es positivo para evitar redundancia en modelos lineales como regresión logística.

  • loan_status no tiene correlaciones muy fuertes, lo que sugiere que no hay ningún predictor lineal dominante y que el modelo podría beneficiarse de enfoques no lineales o combinaciones de múltiples variables.

1.6.3 Análisis de target

Tras hacer la conversión de loan_status a valores binarios, se procedió a realizar el análisis de la frecuencia de las clases.

loan_status Conteo Frecuencia de valor
NaN 618330 69.7%
0 209526 23.6%
1 58767 6.6%

Tabla 7. Balance de target antes de eliminar valores NaN.

En la Tabla 7 se muestran los valores en la columna del target loan_status. Como se busca realizar el entrenamiento del modelo, aquellos valores NaN que están en la columna no nos servirán, y por lo tanto esas filas se eliminarán.

loan_status Conteo Frecuencia de valor
0 209526 78.1%
1 58767 21.9%

Tabla 8. Balance de target después de eliminar valores NaN.

En la Tabla 8 se muestra el nuevo balance de los valores de las clases después de eliminar las filas con NaNs en el target.

Ya se cuenta con un total de 268293 de 887379 que se tenían inicialmente, lo cual representa una disminución considerable del 70% de los datos. Sin embargo, debido a cómo se recomendó codificar el target, se considera apropiado.

1.6.4 Conclusiones

A partir de lo anterior, se derivaron las siguientes conclusiones:

  • La transformación del target loan_status a una variable binaria permitió definir con claridad las clases positivas y negativas, eliminando aquellos casos con estado incierto.
  • La matriz de correlación reveló que no existe una variable numérica con correlación fuerte directa con el target, lo que sugiere que se requerirán modelos no lineales o técnicas de combinación de variables para una predicción efectiva.
  • La eliminación de registros con valores nulos en el target redujo el dataset en aproximadamente un 70%, lo cual representa una pérdida significativa de datos, pero es necesaria para garantizar la calidad del aprendizaje supervisado.
  • Tras la depuración, se identificó un leve desbalance de clases (78.1% positivas vs 21.9% negativas), lo cual se deberá tener en cuenta en el diseño del modelo y en la selección de métricas de evaluación.

1.7 Conclusiones parte 1

  • Se realizó una limpieza estructurada del dataset, eliminando columnas irrelevantes, redundantes o con valores excesivos nulos, lo que permitió reducir la dimensionalidad y facilitar futuros análisis.
  • A través del análisis de variables categóricas, se identificaron patrones de frecuencia esperables en atributos como term, grade, home_ownership y purpose, lo cual aporta contexto relevante para la posterior construcción del modelo.
  • El análisis de correlación evidenció que muchas variables numéricas tienen baja correlación entre sí y con el target, lo que reduce el riesgo de multicolinealidad pero también sugiere que el problema no será fácilmente resuelto por modelos lineales simples.
  • La transformación del target loan_status a una variable binaria (0: positivo, 1: negativo) permitió estructurar el problema como una clasificación supervisada binaria, eliminando casos con estatus indefinido.
  • La depuración del target implicó una pérdida significativa de datos (70%), pero se consideró necesaria para asegurar la coherencia y confiabilidad del modelo predictivo.
  • El conjunto final presenta un leve desbalance de clases, lo que debe ser tratado adecuadamente en la etapa de modelado mediante técnicas como el uso de métricas apropiadas o balanceo de datos.

Ya con el dataset limpio, se procede a la sección dedicada a la ingeniería de features.

Parte 2. Ingeniería de Features

A continuación se presenta una síntesis de lo realizado en el proceso de ingeniería de features. Todo el código con los detalles de implementación se puede encontrar en el archivo poc_FeatureEngineering.ipynb en el repositorio del proyecto.

2.1 Objetivos

Una vez con el dataset lo suficientemente limpio, se procederá a preprocesar estos datos para poder realizar el entrenamiento de los modelos. Se tendrán los siguientes objetivos:

  • Codificar las columnas no numéricas de acuerdo a su naturaleza categórica u ordinal, y de acuerdo a la cardinalidad de cada una.

  • Imputar valores nulls para variables numéricas que lo permitan.

  • Escalar los datos numéricos para mitigar el efecto de las anomalías en el modelo.

2.2 Tratamiento de columnas numéricas

2.2.1 Imputación de nulls

Para la imputación de nulls, se optó por utilizar un SimpleImputer de la herramienta sklearn, el cual permite realizar imputación de nulls sencilla utilizando la media, mediana o el valor más frecuente. Para este caso, se optó por imputar utilizando el valor de la media para cada columna numérica.

Esto se hizo para poder verificar cómo se comportaba el modelo con este tipo de imputación. Si se notaba que las métricas no eran las deseadas a la hora de evaluar el modelo, se volvería aquí a cambiar la técnica de imputación. Sin embargo, de los resultados del modelado se concluyó que esto era suficiente.

2.2.2 Escalado de datos

Para el escalado de datos, se optó por utilizar el escalador RobustScaler de sklearn, ya que aplica un escalado que es más robusto a los valores atípicos. Según (Interactive Chaos,s.f., Robust Scaler), realiza dos pasos principales:

  1. Calcula la mediana y el rango intercuartil (IQR) de cada característica en el conjunto de datos (el IQR es la diferencia entre el percentil 75 y el percentil 25 de los datos).
  2. Utiliza la mediana y el IQR de cada característica para escalar los datos.

En caso de ver que el modelo no tiene métricas favorables, se cambiaría. Sin embargo, a partir de los resultados del modelado se concluyó que esta opción era suficiente.

2.3 Tratamiento de columnas no numéricas

2.3.1 Transformación de variables ordinales

A partir de la Tabla 4, se pudieron identificar que las variables ordinales a codificar eran sub_grade y emp_length respectivamente.

Para codificar a sub_grade, dado que se trataba de una “nota” similar a una nota académica, se optó por intentar codificarla de una forma similar a como se califica del 1 al 5 en los sistemas educativos colombianos. Sin embargo, al tratarse de 7 notas mayores (A, B, C, D, E, F y G), la calificación ahora sería del 1 al 7. Por otro lado, cada valor estaba acompañado de un número del 1 al 5, por lo que se optó porque estos valores representaran cierta fracción dentro de la nota mayor.

Se codificó utilizando la siguiente función:

def sub_grade_mapper(val):
    val = str(val)
    grade_mapping = {
        "A": 7,
        "B": 6,
        "C": 5,
        "D": 4,
        "E": 3,
        "F": 2,
        "G": 1
    }
    num_mapping = {
        "1": 0.8,
        "2": 0.6,
        "3": 0.4,
        "4": 0.2,
        "5": 0.0
    }
    num_val = grade_mapping[val[0]] + num_mapping[val[1]]
    return num_val

Para la columna emp_length, se optó por utilizar la clase OrdinalEncoder y sus métodos para codificarla de acuerdo al siguiente orden:

  1. “Unknown”: Estos son los valores que estaban como NaN en esta columna.
  2. “< 1 year”
  3. “1 year”
  4. “2 years”
  5. “3 years”
  6. “4 years”
  7. “5 years”
  8. “6 years”
  9. “7 years”
  10. “8 years”
  11. “9 years”
  12. “10+ years”

Se utilizó la siguiente porción de código para hacerlo:

ordered_vals = [
    "Unknown", 
    "< 1 year", 
    "1 year", 
    "2 years", 
    "3 years", 
    "4 years", 
    "5 years", 
    "6 years", 
    "7 years", 
    "8 years", 
    "9 years", 
    "10+ years"
]
ordinal_encoder = OrdinalEncoder(categories=[ordered_vals])
df["emp_length"] = ordinal_encoder.fit_transform(df[["emp_length"]])

2.3.2 Transformación de variables categóricas con baja cardinalidad

En cuanto a las variables categóricas que contaban con baja cardinalidad, es decir, con pocos valores únicos, se optó por codificarlos utilizando la técnica One-Hot, usando las herramientas de pandas para esto.

Las columnas identificadas como aptas para la implementación de esta técnica de acuerdo a la revisión de la Tabla 4 fueron: term, home_ownership, verification_status, initial_list_status y purpose.

Se codificaron utilizando la siguiente porción de código:

categ_cols_onehot = [
    "term",
    "home_ownership",
    "verification_status",
    "initial_list_status",
    "purpose"
]

df = pd.get_dummies(df, columns=categ_cols_onehot)

2.3.3 Transformación de variables categóricas con alta cardinalidad

Para el caso de la variable addr_state, la cual se consideró que tenía una alta cardinalidad al contar con 51 valores únicos, se optó por utilizar el método de Hashing encoding, el cual es recomendado para variables con alta cardinalidad (Swayam, 2023).

Se utilizó la siguiente porción de código para esto:

hashing_encoder = HashingEncoder(cols=["addr_state"], n_components=8)
    
hashed = hashing_encoder.fit_transform(df[["addr_state"]])
    
hashed.columns = [f"addr_state_hash_{i}" for i in range(hashed.shape[1])]
    
df = df.drop(columns=["addr_state"]).join(hashed)

2.4 Conclusiones parte 2

Tras haber realizado todo el preprocesamiento adecuado de los datos y haber generado un nuevo dataset con todos estos datos tratados, se sacaron las siguientes conclusiones y aprendizajes:

  • Se implementaron técnicas adecuadas de preprocesamiento para preparar los datos para el siguiente proceso de modelado, implementando técnicas de imputación, escalado y codificación de variables no numéricas.

  • Una variable ordinal puede ser codificada tanto manualmente (si se ve un paralelo claro y una forma de implementación concisa) como apoyándose en herramientas especializadas en codificación, como lo son las herramientas que brinda SKlearn.

  • Se logró una transformación del dataset que se considera lo suficientemente coherente, escalada y completamente numérica como para pasar a la siguiente fase de modelado.

Parte 3. Modelado

A continuación se presenta una síntesis de lo realizado en el proceso de modelado. Todo el código con los detalles de implementación se puede encontrar en el archivo poc_Modeling.ipynb en el repositorio del proyecto.

3.1 Objetivos

Ya contando con un dataset listo para el entrenamiento de modelos de deep learning y clasificación binaria, se espera cumplir con los siguientes objetivos:

  • Realizar una división apropiada del dataset para entrenar y validar el modelo, concretamente un 70% para entrenamiento y un 30% para la evaluación.

  • Entrenar un modelo simple de XGBoost para tenerlo como punto de comparación vs los modelos multiperceptron a definir.

  • Entrenar dos modelos multiperceptron con varias variaciones de arquitectura para comparar cómo es el impacto de estos cambios en los valores objetivos para las métricas del modelado.

3.2 Train-Test split

Para hacer el split de los datos, se optó por utilizar una proporción del 70% para el entrenamiento y un 30% para el testeo, el cual es una proporción estándar en machine learning (Stojiljkovic, 2025).

Se hizo el split utilizando la siguiente porción de código:

y = df["loan_status"].astype(int)
X = df.drop(columns=["loan_status"])
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size = 0.3,
    random_state = 35,
    stratify = y,
    shuffle=True
)

3.3. Modelo 1: XGBoost

XGBoost es una librería de código abierto que emplea árboles de decisiones potenciados por gradiente. (IBM, 2024). Suele ser muy veloz y eficiente con conjuntos grandes de datos. Suele ser muy utilizado en problemas de clasificación y regresión.

3.3.1 Definición del modelo

El modelo utilizado se definió de la siguiente manera:

xgb_classifier = XGBClassifier(
    objective='multi:softmax', # 
    num_class=2,       
    n_estimators=500,          
    learning_rate=0.1,         
    max_depth=3,               
    subsample=0.8,             
    colsample_bytree=0.8,      
    gamma=0,                   
    reg_lambda=1,              
    use_label_encoder=False,   
    eval_metric='mlogloss',    
    random_state=35,
    n_jobs=-1                 
)

A continuación algunas observaciones recogidas para definir el modelo:

  • Se optó por utilizar un objetivo multiclase para poder ver cómo afectaba esto a la calidad del modelo, sabiendo que la tarea en cuestión es de clasificación binaria.

  • Se optó por utilizar un número relativamente alto de estimadores para garantizar tener un desempeño descente del modelo, considerando que se tiene un alto número de features.

  • Se optó por un valor bajo de la tasa de aprendizaje para tener un modelo más robusto.

  • Se optó por una profundización de 3 para evitar sobreajuste y ayudar al modelo con la generalización.

  • Se introduce una proporción de muestras aleatorias de 80% para reducir el sobreajuste.

  • Se introduce una proporción de features para la construcción de los árboles de 0.8 para reducir el sobre ajuste.

  • Se le pasa un gamma igual a 0 para darle algo de flexibilidad al modelo.

  • Se optó por utilizar multi log loss para la función de pérdida, la cual es válida tanto para problemas multiclase como de clasificación binaria.

3.3.2 Evaluación

Los resultados obtenidos en el conjunto de entrenamiento se resumen en la siguiente tabla generada por el código encargado de realizar la evaluación:

Figura 4. Tabla de resultados de XGBoost en el conjunto de entrenamiento

De igual forma, a continuación se tiene la tabla respectiva para el conjunto de testing.

Figura 5. Tabla de resultados de XGBoost en el conjunto de testing

3.3.3. Conclusiones modelado XGBoost

De los anteriores resultados se obtuvieron las siguientes conclusiones y aprendizajes:

  • Sorprendentemente, el modelo tuvo resultados excelentes en ambos conjuntos de datos. Esto es algo sospechoso, debido a que puede haber una alta probabilidad de data leakage debido a la falta de revisión en algún punto durante la limpieza de los datos.

3.4. Modelo 2: XGBoost tras resolver problema de data leakage

Debido a lo anterior, hizo falta revisar nuevamente las columnas utilizadas para verificar que no hubiera ninguna fuga de datos, es decir, que no hubiera ninguna columna que no debiera aparecer al momento de entrenar y evaluar el modelo.

Después de una revisión del diccionario de datos, se confirmó que había un problema de fuga de datos, específicamente con las siguientes columnas que se estaban utilizando:

  • total_rec_prncp: Pagos principales recibidos hasta la fecha.
  • total_rec_int: Intereses recibidos hasta la fecha.
  • total_rec_late_fee: Intereses tardíos recibidos hasta la fecha.
  • recoveries: Monto total recuperado por el acreedor después de considerar la deuda como incobrable.
  • total_pymnt: Pagos recibidos hasta la fecha de la totalidad de lo prestado.
  • total_pymnt_inv: Pagos recibidos hasta la fecha en proporción a lo pagado por inversores.
  • collection_recovery_fee: Monto de tarifas cobradas por recuperar la deuda después de haber sido cobrada.
  • last_pymnt_amnt: Monto total del último pago recibido.

3.4.2 Evaluación

Los resultados obtenidos en el conjunto de entrenamiento se resumen en la siguiente tabla generada por el código encargado de realizar la evaluación:

Figura 4. Tabla de resultados de XGBoost en el conjunto de entrenamiento corregido

De igual forma, a continuación se tiene la tabla respectiva para el conjunto de testing.

Figura 5. Tabla de resultados de XGBoost en el conjunto de testing corregido

3.4.3. Conclusiones modelado XGBoost

De los anteriores resultados se obtuvieron las siguientes conclusiones y aprendizajes:

  • Ahora sí, se cuentan con valores de las métricas más razonables, y por lo tanto se puede concluir que se ha resuelto el problema del data leakage.
  • Debido al desbalance de clases, se puede notar que el modelo tiene un buen rendimiento general identificando a las personas que pagan sus deudas (f1 score 0.9), pero no lo es a la hora de identificar los casos de personas que no pagan (f1 score 0.4). Esto es crítico, ya que el interés principal está en identificar a estos últimos para mitigar el riesgo de dar préstamos que no se van a pagar después.

3.5 Modelo 3: MultiLayer Perceptron

3.5.1 Definición del modelo

Para crear el modelo, se optó por utilizar la herramienta PyTorch para crear un modelo multiperceptron. El modelo como tal está definido en la siguiente clase:

class MLP(nn.Module):
    def __init__(self, input_dim, n_classes):
        super(MLP, self).__init__()
        
        self.model = nn.Sequential(
            nn.Linear(input_dim, 128),
            nn.ReLU(),
            nn.BatchNorm1d(128),
            nn.Dropout(0.3),
            nn.Linear(128, 64),
            nn.ReLU(),
            nn.BatchNorm1d(64),
            nn.Dropout(0.3),
            nn.Linear(64, n_classes)
        )
    
    def forward(self, x):
        return self.model(x)

Para el entrenamiento, se utilizó como función de pérdida la función CrossEntropyLoss, y como optimzador, se optó por usar el optimizador ADAM. Se utilizaron 10 épocas para entrenar el respectivo modelo

3.5.2 Evaluación

Los resultados obtenidos en el conjunto de entrenamiento se resumen en la siguiente tabla generada por el código encargado de realizar la evaluación:

Figura 6. Tabla de resultados de Multilayer Perceptronen el conjunto de entrenamiento corregido

De igual forma, a continuación se tiene la tabla respectiva para el conjunto de testing.

Figura 7. Tabla de resultados de Multilayer Perceptron en el conjunto de testing corregido

3.5.3 Conclusiones multilayer perceptron

  • Se tiene una situación similar a con el anterior modelo, pero esta vez el modelo pudo clasificar los verdaderos positivos a la perfección.

  • Sin embargo, debido al desbalance sigue estando la dificultad con la segunda categoría, lo cual sigue siendo muy crítico.

  • Talvez con cambios breves en la red neuronal creada pueda mejorar un poco, pero si no se trata el desbalance se tendrá el mismo problema.

3.6 Conclusiones parte 3

  • La división 70/30 de entrenamiento y prueba permitió garantizar que ambas particiones tuvieran una representación balanceada de las clases, lo cual es crucial para problemas de clasificación binaria y especialmente útil en presencia de desbalance.
  • El modelo inicial de XGBoost ofreció resultados prometedores, aunque inicialmente demasiado buenos, lo cual llevó a sospechar de un posible problema de data leakage. Esto demuestra la utilidad de este modelo como un baseline fuerte para evaluar comparativamente otros enfoques más complejos como las redes neuronales.
  • La detección de variables relacionadas directamente con el resultado a predecir (como pagos realizados, intereses recibidos, etc.) confirmó la existencia de una fuga de información. Su exclusión fue fundamental para obtener resultados realistas y fiables, evidenciando la importancia de una limpieza rigurosa de los datos basada en un buen entendimiento del negocio.
  • A pesar de corregir el leakage, ambos modelos (XGBoost y MLP) evidenciaron dificultades para identificar correctamente a los deudores (la clase minoritaria), logrando un F1 score bajo (cercano a 0.4) en esa clase, mientras que el desempeño en la clase mayoritaria fue mucho mejor. Esto es problemático desde el punto de vista de negocio, ya que el foco está en identificar correctamente los casos de alto riesgo.
  • El modelo de red neuronal mostró un rendimiento comparable al de XGBoost, con incluso mejor precisión para verdaderos positivos. Sin embargo, el problema de desbalance persistió, lo que indica que ajustes en la arquitectura por sí solos no serán suficientes.
  • El modelado no solo sirve para ajustar hiperparámetros y arquitecturas, sino también para validar supuestos, detectar problemas en los datos y comprender las limitaciones de los modelos ante características del dataset como el desbalance o la calidad de las features.

Casos de uso alternativos

El análisis y la detección de personas con alto riesgo de impago crediticio no solo son fundamentales para la gestión financiera de las entidades prestamistas, sino que también pueden extrapolarse a otros dominios mediante el desarrollo de modelos predictivos similares.

Este tipo de enfoque basado en datos permite identificar patrones de comportamiento y factores de riesgo que, una vez comprendidos, pueden aplicarse a problemas como la detección temprana de fraudes financieros, la evaluación de riesgo en la suscripción de seguros o la predicción de enfermedades crónicas en el ámbito de la salud.

Conclusiones finales

A lo largo del desarrollo del proyecto, se evidenció que la calidad del preprocesamiento es determinante para el éxito del modelado, ya que las decisiones tomadas durante la ingeniería de features —como la imputación de valores faltantes, el escalado de variables numéricas y la codificación adecuada de variables categóricas— permitieron construir un conjunto de datos sólido y apto para el entrenamiento de modelos. No obstante, la experiencia con el primer modelo XGBoost también demostró que el data leakage puede invalidar completamente los resultados, resaltando la necesidad de comprender a profundidad el significado y la temporalidad de cada variable para evitar fugas de información.

Una vez corregido este problema, los modelos entrenados dejaron en evidencia otro gran desafío: el desbalance de clases. A pesar de obtener buenos resultados generales, tanto XGBoost como el modelo MultiLayer Perceptron mostraron ser ineficientes para detectar correctamente a los usuarios que no pagan sus deudas, lo cual es crítico dado el objetivo del problema.

Finalmente, se concluye que utilizar modelos más complejos no garantiza mejores resultados si no se aborda de forma adecuada la estructura del problema; por ello, el foco debe estar tanto en la calidad de los datos como en estrategias específicas que respondan a los retos particulares del dominio, como el balanceo de clases o el ajuste fino de métricas.

Reporte de contribución individual

- Leonardo Federico Corona Torres

  • Definición y escritura de estructura del reporte.
  • Colaboración en creación de video promocional.
  • Aportes entregable escrito.

- David Escobar Ruiz

  • Realización de limpieza de datos.

  • Realización de EDA.

  • Realización de ingeniería de features.

  • Realización de proceso de modelado.

  • Colaboración en creación de video promocional.

- Johan Sebastián Robles Rincón

  • Desarrollo del backend de la aplicación web.

  • Apoyo en despliegue de la aplicación.

  • Apoyo en desarrollo frontend.

  • Apoyo en conexión de API del modelo con vistas de Django.

- Sebastian Soto Arcila

  • Desarrollo frontend de la aplicación web.

  • Apoyo en conexión de API del modelo con vistas de Django.

  • Apoyo en despliegue de la aplicación.

  • Aportes entregable escrito.

Repositorio de GitHub del proyecto

https://github.com/druiz35/RNABI2025-1-Equipo3/

Bibliografía

Geeks for Geeks. (2025). Evaluation Metrics in Machine Learning. Geeks for Geeks. Recuperado el 12 de junio de 2025 de https://www.geeksforgeeks.org/metrics-for-machine-learning-model/

IBM. (2024). ¿Qué es XGBoost? IBM. https://www.ibm.com/mx-es/think/topics/xgboost

Interactive Chaos. (s.f.). Robust Scaler. Interactive Chaos. Recuperado el 12 de junio de 2025 de https://interactivechaos.com/es/manual/tutorial-de-machine-learning/robustscaler

Kaggle. (s.f.). Credit Risk Analysis. Kaggle. Recuperado el 12 de junio de 2025 de https://www.kaggle.com/datasets/ranadeep/credit-risk-dataset/data

Stojiljkovic. (2025). Split Your Dataset With scikit-learn’s train_test_split(). Real Python. https://realpython.com/train-test-split-python-data

Swayam. (2023). Exploring Different Encoding Techniques for Machine Learning Models. Medium. https://medium.com/@swayampatil7918/exploring-different-encoding-techniques-for-machine-learning-models-b762e3b546db

Synapse-Analytics. (s.f.). Credit Scoring Explained - The Problem Statement. Synapse Analytics. Recuperado el 12 de junio de 2025 de https://synapse-analytics.io/blog/guide-to-credit-scoring-part-1-the-problem-statement

Wikipedia. (s.f.). Artificial Neural Networks. Wikipedia. Recuperado el 12 de junio de 2025 de https://es.wikipedia.org/wiki/Red_neuronal_artificial

LS0tDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQotLS0NCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IGZhbHNlDQogICAgY3NzOiBhcGFfc3R5bGUuY3NzDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IGZhbHNlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KOjo6IHtzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDYwcHg7In0NCjxoMT5SRVBPUlRFIFRSQUJBSk8gMjogQVBMSUNBQ0lPTkVTIERFIFJFREVTIE5FVVJPTkFMRVMgQSBEQVRPUyBUQUJVTEFSRVM8L2gxPg0KDQo8aDI+UkVERVMgTkVVUk9OQUxFUyBZIEFMR09SSVRNT1MgQklPSU5TUElSQURPUzwvaDI+DQoNCjxicj48YnI+PGJyPg0KDQo8cD48c3Ryb25nPlByZXNlbnRhZG8gcG9yOjwvc3Ryb25nPjwvcD4NCg0KPHA+TGVvbmFyZG8gRmVkZXJpY28gQ29yb25hIFRvcnJlczxicj4gRGF2aWQgRXNjb2JhciBSdWl6PGJyPiBgSm9oYW4gU2ViYXN0aWFuIFJvYmxlcyBSaW5jw7NuPGJyPmB7PWh0bWx9U2ViYXN0acOhbiBTb3RvIEFyY2lsYTwvcD4NCg0KPGJyPjxicj4NCg0KPHA+PHN0cm9uZz5Qcm9mZXNvcjo8L3N0cm9uZz4gSnVhbiBEYXZpZCBPc3BpbmEgQXJhbmdvPC9wPg0KDQo8cD48c3Ryb25nPk1vbml0b3I6PC9zdHJvbmc+IEFuZHLDqXMgTWF1cmljaW8gWmFwYXRhIFJpbmPDs248L3A+DQoNCjxicj4gIVtVbml2ZXJzaXR5IExvZ29dKGxvZ29fdW5hbC5wbmcpe2FsdD0iVW5pdmVyc2l0eSBMb2dvIiB3aWR0aD0iMTAwIn0gPGJyPjxicj4NCg0KPHA+VW5pdmVyc2lkYWQgTmFjaW9uYWwgZGUgQ29sb21iaWE8YnI+IEZhY3VsdGFkIGRlIE1pbmFzPGJyPiBJbmdlbmllcsOtYSBkZSBTaXN0ZW1hcyBlIEluZm9ybcOhdGljYTwvcD4NCg0KPHA+PHN0cm9uZz5gciBmb3JtYXQoU3lzLkRhdGUoKSwgIiVkIGRlICVCIGRlICVZIilgPC9zdHJvbmc+PC9wPg0KOjo6DQoNCmBgYHs9aHRtbH0NCjwhLS0NCiAgTk9URTogTG9zIHRpcG9zIGRlIHNlbGVjdG9yZXMgc29uOg0KICAgIC0gQ29tZW56YWRvcyBlbiAiaXUiIHBhcmEgaXRlbXMgZGUgbGlzdGFzIG5vIG9yZGVuYWRhcw0KICAgIC0gQ29tZW56YWRvcyBlbiAiaW8iIHBhcmEgaXRlbXMgZGUgbGlzdGFzIG9yZGVuYWRhcw0KLS0+DQpgYGANCiMgQ29udGVuaWRvcw0KDQotICAgW0ludHJvZHVjY2nDs25dKCNpdTEuKQ0KLSAgIFtNZXRvZG9sb2fDrWFdKCNpdTIuKQ0KLSAgIFtEZWZpbmljacOzbiBkZWwgcHJvYmxlbWFdKCNpdTMuKQ0KLSAgIFsxLiBMaW1waWV6YSBkZSBkYXRvc10oI2l1NC4pDQotICAgWzEuMSBPYmpldGl2b3NdKCNpdTUuKQ0KLSAgIFsxLjIgRXN0cnVjdHVyYSBkZWwgZGF0YXNldF0oI2l1Ni4pDQotICAgWzEuMyBMaW1waWV6YSBkZSBkYXRvcyBpbmljaWFsXSgjaXU3LikNCi0gICBbMS40IEFuw6FsaXNpcyBleHBsb3JhdG9yaW8gdW5pdmFyaWFkbyBkZSBjb2x1bW5hcyBudW3DqXJpY2FzXSgjaXU4LikNCi0gICBbMS41IEFuw6FsaXNpcyBleHBsb3JhdG9yaW8gdW5pdmFyaWFkbyBkZSBjb2x1bW5hcyBubyBudW3DqXJpY2FzXSgjaXU5LikNCi0gICBbMS42IEFuw6FsaXNpcyBtdWx0aXZhcmlhZG9dKCNpdTEwLikNCi0gICBbMS43IENvbmNsdXNpb25lcyBwYXJ0ZSAxXSgjaXUxMS4pDQotICAgWzIuIEluZ2VuaWVyw61hIGRlIGZlYXR1cmVzXSgjaXUxMi4pDQotICAgWzIuMSBPYmpldGl2b3NdKCNpdTEzLikNCi0gICBbMi4yIFRyYXRhbWllbnRvIGRlIGNvbHVtbmFzIG51bcOpcmljYXNdKCNpdTE0LikNCi0gICBbMi4zIFRyYXRhbWllbnRvIGRlIGNvbHVtbmFzIG5vIG51bcOpcmljYXNdKCNpdTE1LikNCi0gICBbMi40IENvbmNsdXNpb25lcyBwYXJ0ZSAyXSgjaXUxNi4pDQotICAgWzMuIE1vZGVsYWRvXSgjaXUxNy4pDQotICAgWzMuMSBPYmpldGl2b3NdKCNpdTE4LikNCi0gICBbMy4yIFRyYWluLVRlc3Qgc3BsaXRdKCNpdTE5LikNCi0gICBbMy4zIE1vZGVsbyAxOiBYR0Jvb3N0XSgjaXUyMC4pDQotICAgWzMuNCBNb2RlbG8gMjogWEdCb29zdCB0cmFzIHJlc29sdmVyIHByb2JsZW1hIGRlIGRhdGEgbGVha2FnZV0oI2l1MjEuKQ0KLSAgIFszLjUgTW9kZWxvIDM6IE11bHRpbGF5ZXIgUGVyY2VwdHJvbl0oI2l1MjIuKQ0KLSAgIFszLjYgQ29uY2x1c2lvbmVzIHBhcnRlIDNdKCNpdTIzLikNCi0gICBbQ2Fzb3MgZGUgdXNvIGFsdGVybmF0aXZvc10oI2l1MjQuKQ0KLSAgIFtDb25jbHVzaW9uZXMgZmluYWxlc10oI2l1MjUuKQ0KLSAgIFtSZXBvcnRlIGRlIGNvbnRyaWJ1Y2nDs24gaW5kaXZpZHVhbF0oI2l1MjYuKQ0KLSAgIFtSZXBvc2l0b3JpbyBkZSBHaXRIdWIgZGVsIHByb3llY3RvXSgjaXUyNy4pDQotICAgW0xpbmsgaGFjaWEgYXBwIHdlYiBkZWwgcHJveWVjdG8uXSgjaXUyOC4pDQotICAgW0JpYmxpb2dyYWbDrWFdKCNpdTI5LikNCg0KPGEgbmFtZT0iaXUxLiI+PC9hPg0KDQojIEludHJvZHVjY2nDs24NCg0KTGFzIHJlZGVzIG5ldXJvbmFsZXMgc29uIHVuIHRpcG8gZGUgbW9kZWxvIGNvbXB1dGFjaW9uYWwgaW5zcGlyYWRvIGVuIGVsIGZ1bmNpb25hbWllbnRvIGRlbCBjZXJlYnJvIGh1bWFubywgY29tcHVlc3RvIHBvciBjYXBhcyBkZSB1bmlkYWRlcyBsbGFtYWRhcyBuZXVyb25hcyBhcnRpZmljaWFsZXMgKFdpa2lwZWRpYSwgcy5mLiwgQXJ0aWZpY2lhbCBOZXVyYWwgTmV0d29ya3MpLiBFc3RhcyByZWRlcyBzb24gY2FwYWNlcyBkZSBhcHJlbmRlciBwYXRyb25lcyBjb21wbGVqb3MgYSBwYXJ0aXIgZGUgZ3JhbmRlcyB2b2zDum1lbmVzIGRlIGRhdG9zIG1lZGlhbnRlIHVuIHByb2Nlc28gY29ub2NpZG8gY29tbyBlbnRyZW5hbWllbnRvLiBBIHRyYXbDqXMgZGUgZXN0ZSBwcm9jZXNvLCBhanVzdGFuIGludGVybmFtZW50ZSBzdXMgcGFyw6FtZXRyb3MgcGFyYSBtaW5pbWl6YXIgZWwgZXJyb3IgZW4gbGEgdGFyZWEgcXVlIHNlIGxlcyBhc2lnbmEuDQoNClNlIHV0aWxpemFuIGFtcGxpYW1lbnRlIGVuIHRhcmVhcyBkZSBjbGFzaWZpY2FjacOzbiwgcmVncmVzacOzbiwgZGV0ZWNjacOzbiBkZSBhbm9tYWzDrWFzLCBwcm9jZXNhbWllbnRvIGRlIGltw6FnZW5lcywgcHJvY2VzYW1pZW50byBkZSBsZW5ndWFqZSBuYXR1cmFsLCBlbnRyZSBtdWNoYXMgb3RyYXMgYXBsaWNhY2lvbmVzLiBTdSBjYXBhY2lkYWQgcGFyYSBjYXB0dXJhciByZWxhY2lvbmVzIG5vIGxpbmVhbGVzIHkgY29tcGxlamFzIGVudHJlIHZhcmlhYmxlcyBsYXMgY29udmllcnRlIGVuIHVuYSBoZXJyYW1pZW50YSBwb2Rlcm9zYSBkZW50cm8gZGVsIGNhbXBvIGRlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljby4NCg0KVW5vIGRlIGxvcyBwcm9ibGVtYXMgY2zDoXNpY29zIGVuIGxvcyBxdWUgc2UgYXBsaWNhbiB0w6ljbmljYXMgZGUgYXByZW5kaXphamUgc3VwZXJ2aXNhZG8gZXMgbGEgY2xhc2lmaWNhY2nDs24gZGUgcmllc2dvIGRlIGNyw6lkaXRvICwgcXVlIGNvbnNpc3RlIGVuIHByZWRlY2lyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gc29saWNpdGFudGUgZGUgY3LDqWRpdG8gY3VtcGxhIG8gbm8gY29uIHN1cyBvYmxpZ2FjaW9uZXMgZmluYW5jaWVyYXMgKFN5bmFwc2UgQW5hbHl0aWNzLCBzLmYuLCBDcmVkaXQgU2NvcmluZyBFeHBsYWluZWQgLSBUaGUgUHJvYmxlbSBTdGF0ZW1lbnQpLiBFc3RlIHRpcG8gZGUgbW9kZWxvcyBlcyBjcnVjaWFsIHBhcmEgbGFzIGluc3RpdHVjaW9uZXMgZmluYW5jaWVyYXMsIHlhIHF1ZSBsZXMgcGVybWl0ZSB0b21hciBkZWNpc2lvbmVzIG3DoXMgaW5mb3JtYWRhcywgcmVkdWNpciByaWVzZ29zIHkgbWVqb3JhciBsYSBhc2lnbmFjacOzbiBkZSByZWN1cnNvcy4NCg0KRW4gZXN0ZSBjb250ZXh0bywgbGFzIHJlZGVzIG5ldXJvbmFsZXMgb2ZyZWNlbiB1bmEgYWx0ZXJuYXRpdmEgZWZpY2F6IGZyZW50ZSBhIG1vZGVsb3MgbcOhcyB0cmFkaWNpb25hbGVzLCB5YSBxdWUgcHVlZGVuIG1vZGVsYXIgcmVsYWNpb25lcyBubyBldmlkZW50ZXMgZW50cmUgbG9zIGF0cmlidXRvcyBmaW5hbmNpZXJvcyB5IGRlbW9ncsOhZmljb3MgZGUgbG9zIHNvbGljaXRhbnRlcyB5IHN1IGNvbXBvcnRhbWllbnRvIGNyZWRpdGljaW8gZnV0dXJvLiBBIHBlc2FyIGRlIHF1ZSByZXF1aWVyZW4gbcOhcyBkYXRvcyB5IG1heW9yIGNhcGFjaWRhZCBkZSBjw7NtcHV0bywgc3UgcmVuZGltaWVudG8gc3VlbGUgc2VyIHN1cGVyaW9yIGN1YW5kbyBzZSBkaXNwb25lIGRlIGluZm9ybWFjacOzbiBzdWZpY2llbnRlIHkgYmllbiBlc3RydWN0dXJhZGEuDQoNClBhcmEgZmFjaWxpdGFyIGVsIHVzbyBkZWwgbW9kZWxvIGRlc2Fycm9sbGFkbywgc2UgY29uc3RydXnDsyB1bmEgYXBsaWNhY2nDs24gd2ViIHF1ZSBwZXJtaXRlIGluZ3Jlc2FyIGxvcyBkYXRvcyByZWxldmFudGVzIGRlbCBzb2xpY2l0YW50ZSB5IG9idGVuZXIsIGVuIHRpZW1wbyByZWFsLCBsYSBwcmVkaWNjacOzbiBkZWwgbml2ZWwgZGUgcmllc2dvIGRlIGNyw6lkaXRvLiBFc3RhIGludGVyZmF6IGJ1c2NhIGRlbW9zdHJhciBjw7NtbyB1bmEgc29sdWNpw7NuIGJhc2FkYSBlbiBpbnRlbGlnZW5jaWEgYXJ0aWZpY2lhbCBwdWVkZSBpbnRlZ3JhcnNlIGbDoWNpbG1lbnRlIGVuIGVudG9ybm9zIHJlYWxlcywgYnJpbmRhbmRvIGFjY2VzaWJpbGlkYWQsIGF1dG9tYXRpemFjacOzbiB5IHNvcG9ydGUgYSBsYSB0b21hIGRlIGRlY2lzaW9uZXMuDQoNCjxhIG5hbWU9Iml1Mi4iPjwvYT4NCg0KIyBNZXRvZG9sb2fDrWENCg0KRWwgZGVzYXJyb2xsbyBkZWwgcHJveWVjdG8gc2UgZGl2aWRpw7MgZW4gdHJlcyBldGFwYXMgcHJpbmNpcGFsZXM6IGxpbXBpZXphIGRlIGRhdG9zIHkgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyAoRURBKSwgaW5nZW5pZXLDrWEgZGUgZmVhdHVyZXMgeSBtb2RlbGFkby4gQ2FkYSB1bmEgZGUgZXN0YXMgZmFzZXMgZnVlIGFib3JkYWRhIGRlIG1hbmVyYSBtb2R1bGFyIHBhcmEgZmFjaWxpdGFyIGxhIGNvbXByZW5zacOzbiB5IGVsIGRlc2Fycm9sbG8gaXRlcmF0aXZvIGRlbCBtb2RlbG8uDQoNClBhcmEgZWwgcHJvY2VzYW1pZW50byB5IGFuw6FsaXNpcywgc2UgdXRpbGl6YXJvbiBKdXB5dGVyIE5vdGVib29rcywgbG8gY3VhbCBwZXJtaXRpw7MgdW5hIGV4cGxvcmFjacOzbiBpbnRlcmFjdGl2YSBkZWwgZGF0YXNldC4gTm8gb2JzdGFudGUsIHNlIHJlY29ub2NlIHF1ZSBwYXJhIGVudG9ybm9zIGRlIHByb2R1Y2Npw7NuIHkgbWVqb3IgZXNjYWxhYmlsaWRhZCwgc2Vyw61hIHJlY29tZW5kYWJsZSBpbXBsZW1lbnRhciBlc3RvcyBwcm9jZXNvcyBjb21vIHBpcGVsaW5lcyBvcnF1ZXN0YWRvcyBjb24gaGVycmFtaWVudGFzIGNvbW8gQXBhY2hlIEFpcmZsb3cuDQoNCkVsIGRhdGFzZXQgdXRpbGl6YWRvIHByb3ZpZW5lIGRlIEthZ2dsZSB5IGVzdMOhIGRpc3BvbmlibGUgZW4gc3UgcmVzcGVjdGl2byBlbmxhY2UgKEthZ2dsZSwgcy5mLiwgQ3JlZGl0IFJpc2sgQW5hbHlzaXMpLg0KDQpEdXJhbnRlIGxhIGV0YXBhIGRlIGFuw6FsaXNpcyBleHBsb3JhdG9yaW8geSB2aXN1YWxpemFjacOzbiwgc2UgaGl6byB1c28gZGUgbGlicmVyw61hcyBjb21vIFNlYWJvcm4geSBNYXRwbG90bGliLCBtaWVudHJhcyBxdWUgcGFyYSBsYSBtYW5pcHVsYWNpw7NuIHkgdHJhbnNmb3JtYWNpw7NuIGRlIGxvcyBkYXRvcyBzZSBlbXBsZWFyb24gTnVtUHkgeSBQYW5kYXMuIEVsIHByZXByb2Nlc2FtaWVudG8geSBlbCBtb2RlbGFkbyBpbmljaWFsIHNlIHJlYWxpemFyb24gY29uIGhlcnJhbWllbnRhcyBkZSBTY2lraXQtbGVhcm4sIHkgcGFyYSBsYSBjb25zdHJ1Y2Npw7NuIGRlbCBtb2RlbG8gZGUgcmVkIG5ldXJvbmFsIHNlIHV0aWxpesOzIFB5VG9yY2gsIGxvIHF1ZSBwZXJtaXRpw7MgdW5hIG1heW9yIGZsZXhpYmlsaWRhZCBlbiBsYSBpbXBsZW1lbnRhY2nDs24gZGVsIG1vZGVsbyBkZSBkZWVwIGxlYXJuaW5nLg0KDQo8YSBuYW1lPSJpdTMuIj48L2E+DQoNCiMgRGVmaW5pY2nDs24gZGVsIHByb2JsZW1hDQoNCkVsIHJpZXNnbyBjcmVkaXRpY2lvIHNlIHB1ZWRlIGFib3JkYXIgY29tbyB1biBwcm9ibGVtYSBkZSBjbGFzaWZpY2FjacOzbiBiaW5hcmlhLCBlbiBlbCBxdWUgc2UgYnVzY2EgcHJlZGVjaXIgc2kgdW4gc29saWNpdGFudGUgZGUgY3LDqWRpdG8gcmVwcmVzZW50YSB1biByaWVzZ28gYWx0byBvIGJham8gZGUgaW5jdW1wbGltaWVudG8uIEVzdGEgdGFyZWEgZXMgZnVuZGFtZW50YWwgcGFyYSBpbnN0aXR1Y2lvbmVzIGZpbmFuY2llcmFzLCB5YSBxdWUgbGVzIHBlcm1pdGUgdG9tYXIgZGVjaXNpb25lcyBtw6FzIHNlZ3VyYXMgeSBlZmljaWVudGVzIGFsIG1vbWVudG8gZGUgb3RvcmdhciBwcsOpc3RhbW9zLg0KDQpFbCBvYmpldGl2byBwcmluY2lwYWwgZGUgbGEgc29sdWNpw7NuIGEgZXN0ZSBwcm9ibGVtYSBlcyBlbnRyZW5hciB1biBtb2RlbG8gYmFzYWRvIGVuIHJlZGVzIG5ldXJvbmFsZXMgcXVlIHNlYSBjYXBheiBkZSBhcHJlbmRlciBwYXRyb25lcyBhIHBhcnRpciBkZSBsb3MgZGF0b3MgaGlzdMOzcmljb3MgeSByZWFsaXphciBwcmVkaWNjaW9uZXMgcHJlY2lzYXMgc29icmUgZWwgcmllc2dvIGNyZWRpdGljaW8gZGUgbnVldm9zIHNvbGljaXRhbnRlcy4NCg0KUGFyYSBsb2dyYXJsbywgZXMgbmVjZXNhcmlvIGlkZW50aWZpY2FyIHkgc2VsZWNjaW9uYXIgbGFzIHZhcmlhYmxlcyBtw6FzIHJlbGV2YW50ZXMgZGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBkZSBtYW5lcmEgcXVlIGVsIG1vZGVsbyBwdWVkYSBjYXB0dXJhciBsYSBpbmZvcm1hY2nDs24gY3LDrXRpY2EgcXVlIGluZmx1eWUgZW4gZWwgY29tcG9ydGFtaWVudG8gZmluYW5jaWVybyBkZSBsb3MgaW5kaXZpZHVvcy4NCg0KRWwgcXXDqSB0YW4gYnVlbm8gc2VhIGVsIG1vZGVsbyBlc3RhcsOhIGRlZmluaWRvIHBvciBsYXMgc2lndWllbnRlcyBtw6l0cmljYXMgKEdlZWtzIGZvciBHZWVrcywgMjAyNSk6DQoNCi0gICAqKkFjY3VyYWN5OioqIFByb3BvcmNpw7NuIGRlIHByZWRpY2Npb25lcyBjb3JyZWN0YXMgc29icmUgZWwgdG90YWwgZGUgY2Fzb3MuDQoNCi0gICAqKlByZWNpc2lvbjoqKiBDYXNvcyBxdWUgZWwgbW9kZWxvIHByZWRpam8gY29tbyBhbHRvIHJpZXNnbyB5IHPDrSBsbyBlcmFuIHJlYWxtZW50ZSAodmVyZGFkZXJvcyBwb3NpdGl2b3MpLg0KDQotICAgKipSZWNhbGw6KiogVGFzYSBkZSB2ZXJkYWRlcm9zIHBvc2l0aXZvcywgZXMgZGVjaXIsIGxvcyBjYXNvcyBxdWUgZWwgbW9kZWxvIGRldGVjdMOzIGNvcnJlY3RhbWVudGUgZGUgdG9kb3MgbG9zIGNhc29zIGRlIGFsdG8gcmllc2dvLg0KDQotICAgKipGMS1zY29yZToqKiBNZWRpYSBhcm3Ds25pY2EgZW50cmUgcHJlY2lzaW9uIHkgcmVjYWxsLg0KDQotICAgKipBVUMtUk9DOioqIMOBcmVhIGJham8gbGEgY3VydmEgUk9DLiBFdmFsw7phIGxhIGNhcGFjaWRhZCBkZWwgbW9kZWxvIHBhcmEgZGlzdGluZ3VpciBlbnRyZSBjbGFzZXMuIE1pZW50cmFzIG3DoXMgY2VyY2FubyBhIDEgZXN0w6kgZXN0YSBtw6l0cmljYSwgbcOhcyBkaXNjcmltaW5hdGl2byBzZXLDoSBlbCBtb2RlbG8sIGxvIGN1YWwgZXMgbG8gaWRlYWwuDQoNCjxhIG5hbWU9Iml1NC4iPjwvYT4NCg0KIyBQYXJ0ZSAxLiBMaW1waWV6YSBkZSBEYXRvcyB5IEFuw6FsaXNpcyBFeHBsb3JhdG9yaW8gZGUgRGF0b3MNCg0KQSBjb250aW51YWNpw7NuIHNlIHByZXNlbnRhIHVuYSBzw61udGVzaXMgZGUgbG8gcmVhbGl6YWRvIGVuIGVsIHByb2Nlc28gZGUgbGltcGllemEgZGUgZGF0b3MgeSBhbsOhbGlzaXMgZXhwbG9yYXRvcmlvIGRlIGRhdG9zLiBUb2RvIGVsIGPDs2RpZ28gY29uIGxvcyBkZXRhbGxlcyBkZSBpbXBsZW1lbnRhY2nDs24gc2UgcHVlZGUgZW5jb250cmFyIGVuIGVsIGFyY2hpdm8gcG9jX0VEQS5pcHluYiBlbiBlbCByZXBvc2l0b3JpbyBkZWwgcHJveWVjdG8uDQoNCjxhIG5hbWU9Iml1NS4iPjwvYT4NCg0KIyMgMS4xIE9iamV0aXZvcw0KDQpBbnRlcyBkZSBjb21lbnphciBhIG1vZGVsYXIsIGVzIG5lY2VzYXJpbyBhc2VndXJhcnNlIGRlIHF1ZSBsb3MgZGF0b3MgZXN0w6FuIGxvIHN1ZmljaWVudGVtZW50ZSBwcm9jZXNhZG9zIHkgcHJlcGFyYWRvcyBwYXJhIHBvZGVyIGVudHJlbmFyIGVsIG1vZGVsbywgZGUgdGFsIGZvcm1hIHF1ZSBlc3RlIHB1ZWRhIGFsY2FuemFyIGxvcyBuaXZlbGVzIGRlc2VhZG9zIGVuIGxhcyBtw6l0cmljYXMgcHJldmlhbWVudGUgZGVmaW5pZGFzLg0KDQpBZGljaW9uYWxtZW50ZSwgc2UgZGViZSBlbnRlbmRlciBwcmltZXJvIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGp1bnRvIGNvbiBzdXMgcHJvcGllZGFkZXMgZXN0YWTDrXN0aWNhcyB0YW50byB1bml2YXJpYWRhcyBjb21vIG11bHRpdmFyaWFkYXMsIGNvbiBlbCBvYmpldGl2byBkZSBlbmNvbnRyYXIgcGF0cm9uZXMgbyByZWxhY2lvbmVzIHF1ZSBkZW4gcGlzdGFzIGRlIHF1w6kgZmFjdG9yZXMgcG9kcsOtYW4gZXN0YXIgbcOhcyByZWxhY2lvbmFkb3MgY29uIGxhIHByb2JhYmlsaWRhZCBkZSBjdW1wbGltaWVudG8gbyBpbmN1bXBsaW1pZW50byBkZWwgcGFnbyBkZWwgcHLDqXN0YW1vLg0KDQpBIG1hbmVyYSBkZSBzw61udGVzaXMsIHNlIHRpZW5lbiBsb3Mgc2lndWllbnRlcyBvYmpldGl2b3MgcGFyYSBsYSBsaW1waWV6YSBkZSBkYXRvcyB5IGVsIGFuw6FsaXNpcyBleHBsb3JhdG9yaW8gZGUgZGF0b3M6DQoNCi0gICBFbnRlbmRlciBsYSBlc3RydWN0dXJhIGdlbmVyYWwgZGVsIGRhdGFzZXQgeSBzdXMgY29sdW1uYXMsIHJlY29naWVuZG8gaW5mb3JtYWNpw7NuIGNvbW8gbGFzIGRpbWVuc2lvbmVzIGRlbCBkYXRhc2V0LCBzdXMgdGlwb3MgZGUgZGF0b3MgeSBjw7NtbyBzZSB2ZW4gbGFzIHByaW1lcmFzIHkgw7psdGltYXMgZmlsYXMgZGVsIGRhdGFzZXQuDQoNCi0gICBEZWZpbmlyIHVuIGNvbmp1bnRvIGRlIGNyaXRlcmlvcyBkZSBsaW1waWV6YSBkZSBkYXRvcyBwcmV2aW8gYWwgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZSBkYXRvcyBxdWUgcGVybWl0YSBldml0YXIgZGVzdsOtb3MgZGUgbG9zIHBhdHJvbmVzIHJlYWxtZW50ZSByZWxldmFudGVzIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KLSAgIFJlYWxpemFyIHVuYSBhZGVjdWFkYSBsaW1waWV6YSBkZSBsb3MgZGF0b3MgYSBwYXJ0aXIgZGUgbG9zIGNyaXRlcmlvcyBhbnRlcmlvcm1lbnRlIGRlZmluaWRvcy4NCg0KLSAgIFJlYWxpemFyIHVuIGFuw6FsaXNpcyB1bml2YXJpYWRvIHkgbXVsdGl2YXJpYWRvIGRlIGxhcyBjb2x1bW5hcyB0YW50byBudW3DqXJpY2FzIGNvbW8gbm8gbnVtw6lyaWNhcyBkZWwgZGF0YXNldCBwYXJhIHBvZGVyIGVudGVuZGVyIGRlIG1lam9yIG1hbmVyYSBsYXMgcHJvcGllZGFkZXMgZXN0YWTDrXN0aWNhcyBkZWwgbWlzbW8uDQoNCi0gICBEZXJpdmFyIGNvbmNsdXNpb25lcyByZWxldmFudGVzIGEgcGFydGlyIGRlIGNhZGEgYW7DoWxpc2lzIHJlYWxpemFkby4NCg0KLSAgIENvbnRhciBjb24gdW4gZGF0YXNldCBsbyBzdWZpY2llbnRlbWVudGUgbGltcGlvIGNvbW8gcGFyYSBwb2RlciBzZWd1aXIgY29uIHVuIHByb2Nlc28gZGUgaW5nZW5pZXLDrWEgZGUgZmVhdHVyZXMuDQoNCjxhIG5hbWU9Iml1Ni4iPjwvYT4NCg0KIyMgMS4yIEVzdHJ1Y3R1cmEgZGVsIGRhdGFzZXQNCg0KQW50ZXMgZGUgY29tZW56YXIgY29uIGxhIGxpbXBpZXphIGRlIGxvcyBkYXRvcywgc2UgZGViZSBlc3RhciBmYW1pbGlhcml6YWRvIGNvbiBlbCBwcm9waW8gZGF0YXNldC4gRXMgcG9yIGVzdG8gcXVlIHNlIHBhcnRlIGRlIHVuYSB2aXNpw7NuIGdlbmVyYWwsIHJldmlzYW5kbyBsYSBlc3RydWN0dXJhIGRlbCBkYXRhc2V0LCBwYXJhIGRlc3B1w6lzIGlyIGEgbG8gcGFydGljdWxhciwgcmV2aXNhbmRvIGNhZGEgY29sdW1uYS4NCg0KIyMjIDEuMi4xIE9yaWdlbiBkZWwgZGF0YXNldA0KDQpFbCBkYXRhc2V0IGEgdXRpbGl6YXIgc2UgcHVlZGUgZW5jb250cmFyIGVuIChLYWdnbGUsIHMuZi4sIENyZWRpdCBSaXNrIEFuYWx5c2lzKS4NCg0KIyMjIDEuMi4yIERpbWVuc2lvbmVzIGRlbCBkYXRhc2V0DQoNCkxhcyBkaW1lbnNpb25lcyBkZWwgZGF0YXNldCwgY2FsY3VsYWRhcyBhIHBhcnRpciBkZSBsYSBsZWN0dXJhIGRlbCBtaXNtbyBjb21vIHVuIERhdGFGcmFtZSBkZSBwYW5kYXMgKHZlciBjw7NkaWdvIGVuIHJlcG9zaXRvcmlvKSwgc29uIGxhcyBzaWd1aWVudGVzOg0KDQp8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18DQp8ICoqQ29sdW1uYXMqKiB8IDc0IGNvbHVtbmFzICB8DQp8ICoqRmlsYXMqKiAgICB8IDg4NzM3OSBmaWxhcyB8DQoNCioqVGFibGEgMS4qKiBEaW1lbnNpb25lcyBkZWwgZGF0YXNldCBjcnVkby4NCg0KRGUgbGEgVGFibGEgMSBzZSBwdWVkZSBldmlkZW5jaWFyIHF1ZSBzZSBlc3TDoSBsaWRpYW5kbyBjb24gdW4gZGF0YXNldCBkZSB0YW1hw7FvIHJlbGF0aXZhbWVudGUgZ3JhbmRlLCBsbyBjdWFsIGhheSBxdWUgY29uc2lkZXJhciBhIGxhIGhvcmEgZGUgcmVhbGl6YXIgbGEgbGltcGllemEgeSBlbCBtb2RlbGFkby4NCg0KQWxnbyBidWVubyBhIHJlc2FsdGFyIGVzIHF1ZSBzZSBjdWVudGEgY29uIHVuYSBidWVuYSBhYnVuZGFuY2lhIGRlIGRhdG9zIHBhcmEgcG9kZXIgZW50cmVuYXIgZWwgbW9kZWxvLCB5IHBvciBsbyB0YW50byBjb24gdW5hIGJ1ZW5hIGxpbXBpZXphIHkgcHJlcHJvY2VzYW1pZW50bywgc2UgY3JlZSBxdWUgc2UgcHVlZGVuIGFsY2FuemFyIHZhbG9yZXMgaWRlYWxlcyBwYXJhIGxhcyBtw6l0cmljYXMgZGVsIG1vZGVsbyB1bmEgdmV6IGVudHJlbmFkby4NCg0KIyMjIDEuMi4zIFByaW1lcmFzIHkgw7psdGltYXMgNSBmaWxhcyBkZWwgZGF0YXNldA0KDQpEZWJpZG8gYWwgZ3JhbiB0YW1hw7FvIGRlbCBkYXRhc2V0LCBzZSBjb21wbGljYSBsYSBleHBsb3JhY2nDs24gZGVsIG1pc21vIHBvciBlbCB1c28gZGUgaGVycmFtaWVudGFzIGRlIG9maW3DoXRpY2EgYsOhc2ljYXMgY29tbyBFeGNlbCBvIEdvb2dsZSBTaGVldHMuIEVzIHBvciBlc3RvIHF1ZSBzZSBvcHTDsyBwb3IgcmV2aXNhciBsYXMgcHJpbWVyYXMgeSDDumx0aW1hcyA1IGZpbGFzIGRlbCBkYXRhc2V0IHBvciBtZWRpbyBkZWwgdXNvIGRlIGxvcyBtw6l0b2RvcyBoZWFkKCkgeSB0YWlsKCkgZGUgcGFuZGFzLg0KDQpEZWJpZG8gYWwgZ3JhbiB0YW1hw7FvIGRlbCBkYXRhc2V0IG5vIGVzIHBvc2libGUgYWRqdW50YXIgbGFzIGZpbGFzIHkgY29sdW1uYXMgZW4gZXN0ZSByZXBvcnRlLiBTaW4gZW1iYXJnbywgc2UgcHVlZGUgcmV2aXNhciBlbCBhcmNoaXZvIHBvY19FREEuaXB5bmIgZW4gZWwgcmVwb3NpdG9yaW8gZGVsIHByb3llY3RvIHBhcmEgcmV2aXNhcmxhcy4NCg0KIyMjIDEuMi40IEluZm9ybWFjacOzbiBlc3RydWN0dXJhbCBnZW5lcmFsIGRlbCBkYXRhc2V0DQoNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IE5vbWJyZSBkZSBjb2x1bW5hICAgICAgICAgICB8IE7Dum1lcm8gZGUgdmFsb3JlcyBubyBudWxvcyB8IFRpcG8gZGUgZGF0byAgIHwNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT0rDQp8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgaW50NjQgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgbWVtYmVyX2lkICAgICAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBpbnQ2NCAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBsb2FuX2FtbnQgICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGZ1bmRlZF9hbW50ICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgZnVuZGVkX2FtbnRfaW52ICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCB0ZXJtICAgICAgICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGludF9yYXRlICAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgaW5zdGFsbG1lbnQgICAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBncmFkZSAgICAgICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHN1Yl9ncmFkZSAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgZW1wX3RpdGxlICAgICAgICAgICAgICAgICAgIHwgODM1OTE3ICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBlbXBfbGVuZ3RoICAgICAgICAgICAgICAgICAgfCA4NDI1NTQgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGhvbWVfb3duZXJzaGlwICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgYW5udWFsX2luYyAgICAgICAgICAgICAgICAgIHwgODg3Mzc1ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCB2ZXJpZmljYXRpb25fc3RhdHVzICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGlzc3VlX2QgICAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgbG9hbl9zdGF0dXMgICAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBweW1udF9wbGFuICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHVybCAgICAgICAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgZGVzYyAgICAgICAgICAgICAgICAgICAgICAgIHwgMTI2MDI2ICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBwdXJwb3NlICAgICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHRpdGxlICAgICAgICAgICAgICAgICAgICAgICB8IDg4NzIyNiAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgemlwX2NvZGUgICAgICAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBhZGRyX3N0YXRlICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGR0aSAgICAgICAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgZGVsaW5xXzJ5cnMgICAgICAgICAgICAgICAgIHwgODg3MzUwICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBlYXJsaWVzdF9jcl9saW5lICAgICAgICAgICAgfCA4ODczNTAgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGlucV9sYXN0XzZtdGhzICAgICAgICAgICAgICB8IDg4NzM1MCAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgbXRoc19zaW5jZV9sYXN0X2RlbGlucSAgICAgIHwgNDMzMDY3ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBtdGhzX3NpbmNlX2xhc3RfcmVjb3JkICAgICAgfCAxMzcwNTMgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IG9wZW5fYWNjICAgICAgICAgICAgICAgICAgICB8IDg4NzM1MCAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgcHViX3JlYyAgICAgICAgICAgICAgICAgICAgIHwgODg3MzUwICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCByZXZvbF9iYWwgICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHJldm9sX3V0aWwgICAgICAgICAgICAgICAgICB8IDg4Njg3NyAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90YWxfYWNjICAgICAgICAgICAgICAgICAgIHwgODg3MzUwICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBpbml0aWFsX2xpc3Rfc3RhdHVzICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IG91dF9wcm5jcCAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgb3V0X3BybmNwX2ludiAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RhbF9weW1udCAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHRvdGFsX3B5bW50X2ludiAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90YWxfcmVjX3BybmNwICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RhbF9yZWNfaW50ICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHRvdGFsX3JlY19sYXRlX2ZlZSAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgcmVjb3ZlcmllcyAgICAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBjb2xsZWN0aW9uX3JlY292ZXJ5X2ZlZSAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGxhc3RfcHltbnRfZCAgICAgICAgICAgICAgICB8IDg2OTcyMCAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgbGFzdF9weW1udF9hbW50ICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBuZXh0X3B5bW50X2QgICAgICAgICAgICAgICAgfCA2MzQ0MDggICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGxhc3RfY3JlZGl0X3B1bGxfZCAgICAgICAgICB8IDg4NzMyNiAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgY29sbGVjdGlvbnNfMTJfbXRoc19leF9tZWQgIHwgODg3MjM0ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBtdGhzX3NpbmNlX2xhc3RfbWFqb3JfZGVyb2cgfCAyMjE3MDMgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHBvbGljeV9jb2RlICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgYXBwbGljYXRpb25fdHlwZSAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBhbm51YWxfaW5jX2pvaW50ICAgICAgICAgICAgfCA1MTEgICAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGR0aV9qb2ludCAgICAgICAgICAgICAgICAgICB8IDUwOSAgICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdmVyaWZpY2F0aW9uX3N0YXR1c19qb2ludCAgIHwgNTExICAgICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBhY2Nfbm93X2RlbGlucSAgICAgICAgICAgICAgfCA4ODczNTAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHRvdF9jb2xsX2FtdCAgICAgICAgICAgICAgICB8IDgxNzEwMyAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90X2N1cl9iYWwgICAgICAgICAgICAgICAgIHwgODE3MTAzICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBvcGVuX2FjY182bSAgICAgICAgICAgICAgICAgfCAyMTM3MiAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IG9wZW5faWxfNm0gICAgICAgICAgICAgICAgICB8IDIxMzcyICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgb3Blbl9pbF8xMm0gICAgICAgICAgICAgICAgIHwgMjEzNzIgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBvcGVuX2lsXzI0bSAgICAgICAgICAgICAgICAgfCAyMTM3MiAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IG10aHNfc2luY2VfcmNudF9pbCAgICAgICAgICB8IDIwODEwICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90YWxfYmFsX2lsICAgICAgICAgICAgICAgIHwgMjEzNzIgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBpbF91dGlsICAgICAgICAgICAgICAgICAgICAgfCAxODYxNyAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IG9wZW5fcnZfMTJtICAgICAgICAgICAgICAgICB8IDIxMzcyICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgb3Blbl9ydl8yNG0gICAgICAgICAgICAgICAgIHwgMjEzNzIgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBtYXhfYmFsX2JjICAgICAgICAgICAgICAgICAgfCAyMTM3MiAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGFsbF91dGlsICAgICAgICAgICAgICAgICAgICB8IDIxMzcyICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90YWxfcmV2X2hpX2xpbSAgICAgICAgICAgIHwgODE3MTAzICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBpbnFfZmkgICAgICAgICAgICAgICAgICAgICAgfCAyMTM3MiAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHRvdGFsX2N1X3RsICAgICAgICAgICAgICAgICB8IDIxMzcyICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgaW5xX2xhc3RfMTJtICAgICAgICAgICAgICAgIHwgMjEzNzIgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KDQoqKlRhYmxhIDIuKiogSW5mb3JtYWNpw7NuIGVzdHJ1Y3R1cmFsIGLDoXNpY2EgZGVsIGRhdGFzZXQgY3J1ZG8uDQoNClV0aWxpemFuZG8gZWwgbcOpdG9kbyBpbmZvKCkgZGUgbGEgbGliZXLDrWEgcGFuZGFzLCBzZSBwdWVkZSBnZW5lcmFyIGxhIGluZm9ybWFjacOzbiBkZSBsYSBpbmZvcm1hY2nDs24gZXN0cnVjdHVyYWwgZ2VuZXJhbCBkZWwgZGF0YXNldCBxdWUgY29udGllbmUgaW5mb3JtYWNpw7NuIGNvbW8gZWwgbsO6bWVybyBkZSBjb2x1bW5hcyB5IGVudHJhZGFzLCB2YWxvcmVzIG5vIG51bG9zIHBvciBjYWRhIGNvbHVtbmEgeSBlbCB0aXBvIGRlIGRhdG8gZGUgY2FkYSB1bmEuDQoNCiMjIyAxLjIuNSBDb25jbHVzaW9uZXMNCg0KQSBwYXJ0aXIgZGUgbG8gYW50ZXJpb3IsIHNlIGRlcml2YXJvbiBsYXMgc2lndWllbnRlcyBjb25jbHVzaW9uZXM6DQoNCi0gICBTZSBjdWVudGEgY29uIHVuIGRhdGFzZXQgcmVsYXRpdmFtZW50ZSBncmFuZGUsIGNvbiBhcHJveGltYWRhbWVudGUgODg3SyBmaWxhcyB5IDc0IGNvbHVtbmFzLiBTZSB0ZW5kcsOhIHF1ZSBoYWNlciB1biBhbsOhbGlzaXMgcmlndXJvc28gcGFyYSBwb2RlciBsaW1waWFyIGxvcyBkYXRvcyBhcHJvcGlhZGFtZW50ZS4NCg0KLSAgIFNlIGN1ZW50YSBjb24gZGF0b3MgdGFudG8gZGUgdGlwbyBudW3DqXJpY28gKGZsb2F0NjQgZSBpbnQ2NCkgY29tbyBubyBudW3DqXJpY28gKG9iamVjdCkuIFByb2JhYmxlbWVudGUgbG9zIGRlIHRpcG8gbm8gbnVtw6lyaWNvIHBlcnRlbmVjZW4gYSBjb2x1bW5hcyBkZSB0ZXh0byBwbGFubywgY2F0ZWfDs3JpY2FzIHkgb3JkaW5hbGVzLCBxdWUgc2UgdGVuZHLDoW4gcXVlIHRyYXRhciBtw6FzIGFkZWxhbnRlLg0KDQotICAgUHVlZGUgcXVlIGFsZ3Vub3MgdmFsb3JlcyBkZSBjb2x1bW5hcyBvYmplY3QgcGVydGVuZXpjYW4gYSBmZWNoYXMsIGxvcyBjdWFsZXMgc2UgYW5hbGl6YXLDoW4gbcOhcyBhZGVsYW50ZS4NCg0KLSAgIExhcyBjb2x1bW5hcyBkZSBpZGVudGlmaWNhY2nDs24gc2UgcG9kcsOhbiBlbGltaW5hciAoaWQgeSBtZW1iZXJfaWQpIGRlYmlkbyBhIHF1ZSBzb24gZGUgaWRlbnRpZmljYWNpw7NuIGRlIGNhZGEgZmlsYSB5IG5vIGltcGFjdGFyw6FuIGVuIGxhIHByb2JhYmlsaWRhZCBkZSBwYWdvLg0KDQo8YSBuYW1lPSJpdTcuIj48L2E+DQoNCiMjIDEuMyBMaW1waWV6YSBkZSBkYXRvcyBpbmljaWFsDQoNClVuYSB2ZXogbcOhcyBmYW1pbGlhcml6YWRvcyBjb24gbG9zIGRhdG9zLCBzZSBwcm9jZWRlcsOhIGEgZGVmaW5pciBjaWVydG9zIGNyaXRlcmlvcyBkZSBsaW1waWV6YSBnZW5lcmFsZXMgcGFyYSBpbXBsZW1lbnRhciBhbnRlcyBkZWwgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZSBkYXRvcy4NCg0KIyMjIDEuMy4xIENyaXRlcmlvcyBkZSBsaW1waWV6YQ0KDQpTZSBkZWZpbmVuIGxvcyBzaWd1aWVudGVzIGNyaXRlcmlvcyBkZSBsaW1waWV6YSBwcmV2aW8gYWwgYW7DoWxpc2lzIGNvbiBlbCBvYmpldGl2byBkZSBtaXRpZ2FyIGxhIGNhbnRpZGFkIGRlICJwaXN0YXMgZmFsc2FzIiBjb24gbGFzIHF1ZSBzZSBwb2Ryw61hIGVzdHJvcGVhciBlbCBlbnRlbmRpbWllbnRvIGRlbCBkYXRhc2V0Lg0KDQotICAgKipDcml0ZXJpbyAxOiBFbCBwb3JjZW50YWplIGRlIHZhbG9yZXMgbnVsbHMgbm8gZGViZSBzdXBlcmFyIGVsIDgwJToqKg0KDQogICAgQ29sdW1uYXMgcXVlIHRlbmdhbiBtw6FzIGRlbCA4MCUgZGUgc3VzIHZhbG9yZXMgbnVsb3Mgc2Vyw6FuIGRpZsOtY2lsZXMgZGUgaW1wdXRhciBtYXMgYWRlbGFudGUsIHkgcG9yIGxvIHRhbnRvIHNlIG9wdGFyw6EgcG9yIGVsaW1pbmFybGFzLg0KDQotICAgKipDcml0ZXJpbyAyOiBObyBzZSBkZWphcsOhbiBjb2x1bW5hcyBkZSB0ZXh0byBwbGFuby4gU2UgYWNlcHRhcsOhbiBjb2x1bW5hcyBjYXRlZ8OzcmljYXMgeSBvcmRpbmFsZXMgcXVlIGx1ZWdvIHNlIGNvZGlmaWNhcsOhbjoqKg0KDQogICAgQ29sdW1uYXMgcXVlIHNlYW4gZGUgdGV4dG8gcGxhbm8geSBubyBzaWdhbiBuaW5ndW5hIGVzdHJ1Y3R1cmEgZGVmaW5pZGEgcXVlIHBlcm1pdGFuIHRyYXRhcmxhcyBzZXLDoW4gZWxpbWluYWRhcyBkZWJpZG8gYSBsYSBkaWZpY3VsdGFkIHF1ZSBwb2Ryw61hbiB0cmFlciBhbCBtb21lbnRvIGRlIGNvZGlmaWNhcmxvcyBhIHZhbG9yZXMgbnVtw6lyaWNvcy4NCg0KLSAgICoqQ3JpdGVyaW8gMzogTm8gc2UgZGVqYXLDoW4gY29sdW1uYXMgZGUgaWRlbnRpZmljYWNpw7NuLCB5YSBxdWUgc29uIHBhcmEgaWRlbnRpZmljYXIgZmlsYXMgeSBlbnRpZGFkZXMgeSBubyBlc3TDoW4gcmVsYWNpb25hZG9zIGNvbiBuaW5nw7puIHBhdHLDs24gcmVsZXZhbnRlIHBhcmEgZWwgYW7DoWxpc2lzOioqDQoNCiAgICBDb2x1bW5hcyBxdWUgY29ycmVzcG9uZGFuIGEgZm9ybWFzIGRlIGlkZW50aWZpY2FjacOzbiBkZSBmaWxhcyBzZXLDoW4gZWxpbWluYWRhcyB5YSBxdWUgbm8gY29udHJpYnVpcsOhbiBhbCBhbsOhbGlzaXMuDQoNCi0gICAqKkNyaXRlcmlvIDQ6IFNlIGRlc2NhcnRhcsOhbiBjb2x1bW5hcyBxdWUgdGVuZ2FuIHNvbGFtZW50ZSB1biB2YWxvciDDum5pY286KioNCg0KICAgIFNlIGRlc2NhcnRhcsOhbiBjb2x1bW5hcyBxdWUgY29uc3RlbiBkZSBzb2xhbWVudGUgdW4gdmFsb3Igw7puaWNvIHBhcmEgZXZpdGFyIHJlZHVuZGFuY2lhcyBlbnRyZSBsb3MgZGF0b3MuDQoNCiMjIyAxLjMuMiBDdW1wbGltaWVudG8gZGUgY3JpdGVyaW8gMQ0KDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKk5vbWJyZSBkZSBDb2x1bW5hKiogICAgICAgfCAqKk7Dum1lcm8gZGUgdmFsb3JlcyBudWxvcyoqIHwgKipQb3JjZW50YWplIGRlIHZhbG9yZXMgbnVsb3MqKiB8DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PTorPT09PT09PT09PT09PT09PT09PT09PT09PT09PTorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT06Kw0KfCBkZXNjICAgICAgICAgICAgICAgICAgICAgICAgfCA3NjEzNTMgICAgICAgICAgICAgICAgICAgICAgfCA4NS43OTc5NTEgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IG10aHNfc2luY2VfbGFzdF9yZWNvcmQgICAgICB8IDc1MDMyNiAgICAgICAgICAgICAgICAgICAgICB8IDg0LjU1NTMwMyAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgbXRoc19zaW5jZV9sYXN0X21ham9yX2Rlcm9nIHwgNjY1Njc2ICAgICAgICAgICAgICAgICAgICAgIHwgNzUuMDE1OTc0ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBhbm51YWxfaW5jX2pvaW50ICAgICAgICAgICAgfCA4ODY4NjggICAgICAgICAgICAgICAgICAgICAgfCA5OS45NDI0MTUgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IGR0aV9qb2ludCAgICAgICAgICAgICAgICAgICB8IDg4Njg3MCAgICAgICAgICAgICAgICAgICAgICB8IDk5Ljk0MjY0MCAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgdmVyaWZpY2F0aW9uX3N0YXR1c19qb2ludCAgIHwgODg2ODY4ICAgICAgICAgICAgICAgICAgICAgIHwgOTkuOTQyNDE1ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBvcGVuX2FjY182bSAgICAgICAgICAgICAgICAgfCA4NjYwMDcgICAgICAgICAgICAgICAgICAgICAgfCA5Ny41OTE1NTkgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IG9wZW5faWxfNm0gICAgICAgICAgICAgICAgICB8IDg2NjAwNyAgICAgICAgICAgICAgICAgICAgICB8IDk3LjU5MTU1OSAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgb3Blbl9pbF8xMm0gICAgICAgICAgICAgICAgIHwgODY2MDA3ICAgICAgICAgICAgICAgICAgICAgIHwgOTcuNTkxNTU5ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBvcGVuX2lsXzI0bSAgICAgICAgICAgICAgICAgfCA4NjYwMDcgICAgICAgICAgICAgICAgICAgICAgfCA5Ny41OTE1NTkgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IG10aHNfc2luY2VfcmNudF9pbCAgICAgICAgICB8IDg2NjU2OSAgICAgICAgICAgICAgICAgICAgICB8IDk3LjY1NDg5MiAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90YWxfYmFsX2lsICAgICAgICAgICAgICAgIHwgODY2MDA3ICAgICAgICAgICAgICAgICAgICAgIHwgOTcuNTkxNTU5ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBpbF91dGlsICAgICAgICAgICAgICAgICAgICAgfCA4Njg3NjIgICAgICAgICAgICAgICAgICAgICAgfCA5Ny45MDIwMjQgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IG9wZW5fcnZfMTJtICAgICAgICAgICAgICAgICB8IDg2NjAwNyAgICAgICAgICAgICAgICAgICAgICB8IDk3LjU5MTU1OSAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgb3Blbl9ydl8yNG0gICAgICAgICAgICAgICAgIHwgODY2MDA3ICAgICAgICAgICAgICAgICAgICAgIHwgOTcuNTkxNTU5ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBtYXhfYmFsX2JjICAgICAgICAgICAgICAgICAgfCA4NjYwMDcgICAgICAgICAgICAgICAgICAgICAgfCA5Ny41OTE1NTkgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IGFsbF91dGlsICAgICAgICAgICAgICAgICAgICB8IDg2NjAwNyAgICAgICAgICAgICAgICAgICAgICB8IDk3LjU5MTU1OSAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgaW5xX2ZpICAgICAgICAgICAgICAgICAgICAgIHwgODY2MDA3ICAgICAgICAgICAgICAgICAgICAgIHwgOTcuNTkxNTU5ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RhbF9jdV90bCAgICAgICAgICAgICAgICAgfCA4NjYwMDcgICAgICAgICAgICAgICAgICAgICAgfCA5Ny41OTE1NTkgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IGlucV9sYXN0XzEybSAgICAgICAgICAgICAgICB8IDg2NjAwNyAgICAgICAgICAgICAgICAgICAgICB8IDk3LjU5MTU1OSAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCg0KKipUYWJsYSAzLioqIENvbHVtbmFzIHF1ZSB0aWVuZW4gbcOhcyBkZWwgODAlIGRlIHN1cyB2YWxvcmVzIGNvbW8gbnVsb3MuDQoNClBhcmEgY3VtcGxpciBlbCBjcml0ZXJpbyBkZWwgcG9yY2VudGFqZSBkZSB2YWxvcmVzIG51bGxzIHNlIGlkZW50aWZpY2Fyb24gbGFzIGNvbHVtbmFzIHF1ZSBzZSBtdWVzdHJhbiBlbiBsYSBUYWJsYSAzIHF1ZSB0aWVuZW4gdW4gcG9yY2VudGFqZSBkZSB2YWxvcmVzIG51bGxzIG1heW9yIGFsIDgwJS4NCg0KU2UgcHJvY2VkacOzIGEgZWxpbWluYXJsb3MsIHBhc2FuZG8gZGUgdGVuZXIgdW4gZGF0YXNldCBkZSA3NCBjb2x1bW5hcyBhIHVubyBkZSA1NSBjb2x1bW5hcy4NCg0KU2UgZmlsdHJhcm9uIGxhcyBjb2x1bW5hcyB1dGlsaXphbmRvIGxhcyBoZXJyYW1pZW50YXMgeSBsb3MgbcOpdG9kb3MgZGUgdHJhdGFtaWVuZG8gZGUgZGF0b3MgZGUgcGFuZGFzLg0KDQojIyMgMS4zLjMgQ3VtcGxpbWllbnRvIGRlIGNyaXRlcmlvIDINCg0KUGFyYSBlbCBjdW1wbGltaWVudG8gZGUgZXN0ZSBjcml0ZXJpbyBzZSB0dXZpZXJvbiBxdWUgc2VwYXJhciBsYXMgY29sdW1uYXMgbnVtw6lyaWNhcyBkZSBsYXMgbm8gbnVtw6lyaWNhcy4NCg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBOb21icmUgZGUgQ29sdW1uYSAgIHwgQWxndW5vcyBWYWxvcmVzIMOabmljb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCis9PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsNCnwgdGVybSAgICAgICAgICAgICAgICB8IFsnIDM2IG1vbnRocycgJyA2MCBtb250aHMnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgZ3JhZGUgICAgICAgICAgICAgICB8IFsnQicgJ0MnICdBJyAnRScgJ0YnICdEJyAnRyddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgc3ViX2dyYWRlICAgICAgICAgICB8IFsnQjInICdDNCcgJ0M1JyAnQzEnICdCNScgJ0E0JyAnRTEnICdGMicgJ0MzJyAnQjEnICdEMScgJ0ExJyAnQjMnICdCNCcgJ0MyJyAnRDInICdBMycgJ0E1JyAnRDUnICdBMiddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgZW1wX3RpdGxlICAgICAgICAgICB8IFtuYW4gJ1J5ZGVyJyAnQUlSIFJFU09VUkNFUyBCT0FSRCcgJ1VuaXZlcnNpdHkgTWVkaWNhbCBHcm91cCcgJ1Zlb2xpYSBUcmFuc3BvcnRhdG9uJyAnU291dGhlcm4gU3RhciBQaG90b2dyYXBoeScgJ01LQyBBY2NvdW50aW5nICcgJ1N0YXJidWNrcycgJ1NvdXRod2VzdCBSdXJhbCBtZXRybycgJ1VDTEEnICdWYS4gRGVwdCBvZiBDb25zZXJ2YXRpb24vUmVjcmVhdGlvbicgJ1RhcmdldCcgJ1NGTVRBJyAnSW50ZXJuYWwgcmV2ZW51ZSBTZXJ2aWNlJyAiQ2hpbidzIFJlc3RhdXJhbnQiICdEdXJhY2VsbCcgJ0Nvbm5lY3Rpb24gSW5zcGVjdGlvbicgJ05ldHdvcmsgSW50ZXJwcmV0aW5nIFNlcnZpY2UnICdBcmNoZGlvY2VzZSBvZiBHYWx2ZXN0b24gSG91c3RvbicgJ09zcmFtIFN5bHZhbmlhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgZW1wX2xlbmd0aCAgICAgICAgICB8IFsnMTArIHllYXJzJyAnXDwgMSB5ZWFyJyAnMSB5ZWFyJyAnMyB5ZWFycycgJzggeWVhcnMnICc5IHllYXJzJyAnNCB5ZWFycycgJzUgeWVhcnMnICc2IHllYXJzJyAnMiB5ZWFycycgJzcgeWVhcnMnIG5hbl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgaG9tZV9vd25lcnNoaXAgICAgICB8IFsnUkVOVCcgJ09XTicgJ01PUlRHQUdFJyAnT1RIRVInICdOT05FJyAnQU5ZJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgdmVyaWZpY2F0aW9uX3N0YXR1cyB8IFsnVmVyaWZpZWQnICdTb3VyY2UgVmVyaWZpZWQnICdOb3QgVmVyaWZpZWQnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgaXNzdWVfZCAgICAgICAgICAgICB8IFsnRGVjLTIwMTEnICdOb3YtMjAxMScgJ09jdC0yMDExJyAnU2VwLTIwMTEnICdBdWctMjAxMScgJ0p1bC0yMDExJyAnSnVuLTIwMTEnICdNYXktMjAxMScgJ0Fwci0yMDExJyAnTWFyLTIwMTEnICdGZWItMjAxMScgJ0phbi0yMDExJyAnRGVjLTIwMTAnICdOb3YtMjAxMCcgJ09jdC0yMDEwJyAnU2VwLTIwMTAnICdBdWctMjAxMCcgJ0p1bC0yMDEwJyAnSnVuLTIwMTAnICdNYXktMjAxMCddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgbG9hbl9zdGF0dXMgICAgICAgICB8IFsnRnVsbHkgUGFpZCcgJ0NoYXJnZWQgT2ZmJyAnQ3VycmVudCcgJ0RlZmF1bHQnICdMYXRlICgzMS0xMjAgZGF5cyknICdJbiBHcmFjZSBQZXJpb2QnICdMYXRlICgxNi0zMCBkYXlzKScgJ0RvZXMgbm90IG1lZXQgdGhlIGNyZWRpdCBwb2xpY3kuIFN0YXR1czpGdWxseSBQYWlkJyAnRG9lcyBub3QgbWVldCB0aGUgY3JlZGl0IHBvbGljeS4gU3RhdHVzOkNoYXJnZWQgT2ZmJyAnSXNzdWVkJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgcHltbnRfcGxhbiAgICAgICAgICB8IFsnbicgJ3knXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgdXJsICAgICAgICAgICAgICAgICB8IFsnPGh0dHBzOi8vd3d3LmxlbmRpbmdjbHViLmNvbS9icm93c2UvbG9hbkRldGFpbC5hY3Rpb24/bG9hbl9pZD0xMDc3NTAxPicgJzxodHRwczovL3d3dy5sZW5kaW5nY2x1Yi5jb20vYnJvd3NlL2xvYW5EZXRhaWwuYWN0aW9uP2xvYW5faWQ9MTA3NzQzMD4nICc8aHR0cHM6Ly93d3cubGVuZGluZ2NsdWIuY29tL2Jyb3dzZS9sb2FuRGV0YWlsLmFjdGlvbj9sb2FuX2lkPTEwNzcxNzU+JyAnPGh0dHBzOi8vd3d3LmxlbmRpbmdjbHViLmNvbS9icm93c2UvbG9hbkRldGFpbC5hY3Rpb24/bG9hbl9pZD0xMDY1Nzc1PicgJzxodHRwczovL3d3dy5sZW5kaW5nY2x1Yi5jb20vYnJvd3NlL2xvYW5EZXRhaWwuYWN0aW9uP2xvYW5faWQ9MTA2OTk3MT4nICc8aHR0cHM6Ly93d3cubGVuZGluZ2NsdWIuY29tL2Jyb3dzZS9sb2FuRGV0YWlsLmFjdGlvbj9sb2FuX2lkPTEwNjI0NzQ+JyAnPGh0dHBzOi8vd3d3LmxlbmRpbmdjbHViLmNvbS9icm93c2UvbG9hbkRldGFpbC5hY3Rpb24/bG9hbl9pZD0xMDY5NzQyPiddIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgcHVycG9zZSAgICAgICAgICAgICB8IFsnY3JlZGl0X2NhcmQnICdjYXInICdzbWFsbF9idXNpbmVzcycgJ290aGVyJyAnd2VkZGluZycgJ2RlYnRfY29uc29saWRhdGlvbicgJ2hvbWVfaW1wcm92ZW1lbnQnICdtYWpvcl9wdXJjaGFzZScgJ21lZGljYWwnICdtb3ZpbmcnICd2YWNhdGlvbicgJ2hvdXNlJyAncmVuZXdhYmxlX2VuZXJneScgJ2VkdWNhdGlvbmFsJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgdGl0bGUgICAgICAgICAgICAgICB8IFsnQ29tcHV0ZXInICdiaWtlJyAncmVhbCBlc3RhdGUgYnVzaW5lc3MnICdwZXJzb25lbCcgJ1BlcnNvbmFsJyAnTXkgd2VkZGluZyBsb2FuIEkgcHJvbWlzZSB0byBwYXkgYmFjaycgJ0xvYW4nICdDYXIgRG93bnBheW1lbnQnICdFeHBhbmQgQnVzaW5lc3MgJiBCdXkgRGVidCBQb3J0Zm9saW8nICdCdWlsZGluZyBteSBjcmVkaXQgaGlzdG9yeS4nICdIaWdoIGludHJlc3QgQ29uc29saWRhdGlvbicgJ0NvbnNvbGlkYXRpb24nICdmcmVlZG9tJyAnY2l0aWNhcmQgZnVuZCcgJ090aGVyIExvYW4nICdEZWJ0IENvbnNvbGlkYXRpb24gTG9hbicgJ0hvbWUnICdIb2xpZGF5JyAnTWVkaWNhbCcgJ2xvd2VycmF0ZW1lYW5zZWFzaWVydG9nZXRvdXRvZmRlYnQhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgemlwX2NvZGUgICAgICAgICAgICB8IFsnODYweHgnICczMDl4eCcgJzYwNnh4JyAnOTE3eHgnICc5NzJ4eCcgJzg1Mnh4JyAnMjgweHgnICc5MDB4eCcgJzk1OHh4JyAnNzc0eHgnICc4NTN4eCcgJzkxM3h4JyAnMjQ1eHgnICc5NTF4eCcgJzY0MXh4JyAnOTIxeHgnICcwNjd4eCcgJzg5MHh4JyAnNzcweHgnICczMzV4eCddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgYWRkcl9zdGF0ZSAgICAgICAgICB8IFsnQVonICdHQScgJ0lMJyAnQ0EnICdPUicgJ05DJyAnVFgnICdWQScgJ01PJyAnQ1QnICdVVCcgJ0ZMJyAnTlknICdQQScgJ01OJyAnTkonICdLWScgJ09IJyAnU0MnICdSSSddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgZWFybGllc3RfY3JfbGluZSAgICB8IFsnSmFuLTE5ODUnICdBcHItMTk5OScgJ05vdi0yMDAxJyAnRmViLTE5OTYnICdKYW4tMTk5NicgJ05vdi0yMDA0JyAnSnVsLTIwMDUnICdKYW4tMjAwNycgJ0Fwci0yMDA0JyAnU2VwLTIwMDQnICdKYW4tMTk5OCcgJ09jdC0xOTg5JyAnSnVsLTIwMDMnICdNYXktMTk5MScgJ1NlcC0yMDA3JyAnT2N0LTE5OTgnICdBdWctMTk5MycgJ09jdC0yMDAzJyAnSmFuLTIwMDEnICdOb3YtMTk5NyddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgaW5pdGlhbF9saXN0X3N0YXR1cyB8IFsnZicgJ3cnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgbGFzdF9weW1udF9kICAgICAgICB8IFsnSmFuLTIwMTUnICdBcHItMjAxMycgJ0p1bi0yMDE0JyAnSmFuLTIwMTYnICdBcHItMjAxMicgJ05vdi0yMDEyJyAnSnVuLTIwMTMnICdTZXAtMjAxMycgJ0p1bC0yMDEyJyAnT2N0LTIwMTMnICdNYXktMjAxMycgJ0ZlYi0yMDE1JyAnQXVnLTIwMTUnICdPY3QtMjAxMicgJ1NlcC0yMDEyJyBuYW4gJ0RlYy0yMDEyJyAnRGVjLTIwMTQnICdBdWctMjAxMycgJ05vdi0yMDEzJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgbmV4dF9weW1udF9kICAgICAgICB8IFtuYW4gJ0ZlYi0yMDE2JyAnSmFuLTIwMTYnICdTZXAtMjAxMycgJ0ZlYi0yMDE0JyAnTWF5LTIwMTQnICdKdW4tMjAxMycgJ01hci0yMDEyJyAnQXByLTIwMTInICdNYXktMjAxMycgJ0F1Zy0yMDEyJyAnQXVnLTIwMTMnICdKdW4tMjAxMicgJ05vdi0yMDEzJyAnRmViLTIwMTInICdPY3QtMjAxMScgJ0phbi0yMDEzJyAnSmFuLTIwMTQnICdKdWwtMjAxMycgJ0p1bC0yMDE1J10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgbGFzdF9jcmVkaXRfcHVsbF9kICB8IFsnSmFuLTIwMTYnICdTZXAtMjAxMycgJ0phbi0yMDE1JyAnU2VwLTIwMTUnICdEZWMtMjAxNCcgJ0F1Zy0yMDEyJyAnTWFyLTIwMTMnICdEZWMtMjAxNScgJ0F1Zy0yMDEzJyAnTm92LTIwMTInICdNYXItMjAxNCcgJ0Fwci0yMDE1JyAnTWF5LTIwMTQnICdKdWwtMjAxNScgJ0p1bC0yMDEyJyAnU2VwLTIwMTInICdNYXktMjAxMycgJ09jdC0yMDE1JyAnSnVuLTIwMTInICdNYXItMjAxNSddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgYXBwbGljYXRpb25fdHlwZSAgICB8IFsnSU5ESVZJRFVBTCcgJ0pPSU5UJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCg0KKipUYWJsYSA0LioqIENvbHVtbmFzIG5vIG51bcOpcmljYXMganVudG8gY29uIGFsZ3Vub3MgZGUgc3VzIHZhbG9yZXMgw7puaWNvcw0KDQpTZSByZXZpc2Fyb24gbGFzIGNvbHVtbmFzIGRlIHRpcG8gb2JqZWN0IChtb3N0cmFkYXMgZW4gbGEgVGFibGEgNCB5IHNlIHJldmlzYXJvbiBzdXMgdmFsb3JlcyDDum5pY29zIHBhcmEgdmVyaWZpY2FyIGN1w6FsZXMgZXJhbiBkZSB0ZXh0byBwbGFubyBwYXJhIHBvZGVyIGVsaW1pbmFybGFzLg0KDQpEZSBsbyBhbnRlcmlvciwgc2UgY29uY2x1ecOzIHF1ZSBsYXMgY29sdW1uYXMgZGUgdGV4dG8gcGxhbm8gZXJhbiBsYXMgc2lndWllbnRlczogZW1wX3RpdGxlLCB0aXRsZSB5IHVybC4gU2UgcHJvY2VkacOzIGNvbiBzdSBlbGltaW5hY2nDs24sIHBhc2FuZG8gZGUgdGVuZXIgNTUgY29sdW1uYXMgYSB0ZW5lciA1Mi4NCg0KIyMjIDEuMy40IEN1bXBsaW1pZW50byBkZSBjcml0ZXJpbyAzDQoNCkRlbCBwcm9waW8gbm9tYnJlIGRlIGxhcyBjb2x1bW5hcyBpZCB5IG1lbWJlcl9pZCB5IGRlbCBkaWNjaW9uYXJpbyBkZSBkYXRvcyBxdWUgdmlubyBjb24gZWwgZGF0YXNldCwgc2UgY29uY2x1eWUgcXVlIGVzdGFzIGRvcyBjb2x1bW5hcyBzb24gZGUgaWRlbnRpZmljYWNpw7NuIHkgc2UgcHJvY2VkZSBhIGVsaW1pbmFybGFzIHBhcmEgY3VtcGxpciBlbCBjcml0ZXJpbyAzLg0KDQpUcmFzIGxhIGVsaW1pbmFjacOzbiwgc2UgcGFzYSBkZSA1MiBjb2x1bW5hcyBhIDUwIGNvbHVtbmFzLg0KDQojIyMgMS4zLjUgQ3VtcGxpbWllbnRvIGRlIGNyaXRlcmlvIDQNCg0KVHJhcyBleGFtaW5hciBsb3MgdmFsb3JlcyDDum5pY29zIGRlIGxhcyBjb2x1bW5hcyBudW3DqXJpY2FzLCBzZSBpZGVudGlmaWPDsyBxdWUgbGEgY29sdW1uYSBwb2xpY3lfY29kZSBzb2xhbWVudGUgdGVuw61hIDEgc29sbyB2YWxvciBwYXJhIGNhZGEgZmlsYSBkZSBsYXMgY29sdW1uYXMsIHkgcG9yIGVzbyBzZSBwcm9jZWRpw7MgY29uIHN1IGVsaW1pbmFjacOzbiwgcGFzYW5kbyBkZSB0ZW5lciA1MCBjb2x1bW5hcyBhIDQ5IGNvbHVtbmFzLg0KDQojIyMgMS4zLjYgQ29uY2x1c2lvbmVzDQoNCkEgcGFydGlyIGRlIGxvIGFudGVyaW9yLCBzZSBkZXJpdmFyb24gbGFzIHNpZ3VpZW50ZXMgY29uY2x1c2lvbmVzOg0KDQotICAgU2UgZWxpbWluYXJvbiBjb2x1bW5hcyBjb24gbcOhcyBkZWwgODAlIGRlIHZhbG9yZXMgbnVsb3MsIGxvIHF1ZSBwZXJtaXRpw7MgcmVkdWNpciBzaWduaWZpY2F0aXZhbWVudGUgbGEgY2FudGlkYWQgZGUgcnVpZG8geSB2YWxvcmVzIGZhbHRhbnRlcyBkaWbDrWNpbGVzIGRlIGltcHV0YXIuDQoNCi0gICBTZSBkZXNjYXJ0YXJvbiBjb2x1bW5hcyBkZSB0ZXh0byBwbGFubyBxdWUgbm8gYXBvcnRhYmFuIGVzdHJ1Y3R1cmEgw7p0aWwgcGFyYSBlbCBtb2RlbGFkbywgbG8gcXVlIGZhY2lsaXTDsyBsYSBmdXR1cmEgY29kaWZpY2FjacOzbiBkZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzLg0KDQotICAgU2UgZWxpbWluYXJvbiBjb2x1bW5hcyBkZSBpZGVudGlmaWNhY2nDs24geSBhcXVlbGxhcyBjb24gdW4gw7puaWNvIHZhbG9yLCB5YSBxdWUgbm8gYXBvcnRhYmFuIGluZm9ybWFjacOzbiByZWxldmFudGUgYWwgYW7DoWxpc2lzLg0KDQotICAgVHJhcyBhcGxpY2FyIHRvZG9zIGxvcyBjcml0ZXJpb3MgZGUgbGltcGllemEgZGVmaW5pZG9zLCBzZSBwYXPDsyBkZSB1biB0b3RhbCBkZSA3NCBjb2x1bW5hcyBhIDQ5LCBkZWphbmRvIHVuIGNvbmp1bnRvIGRlIGRhdG9zIG3DoXMgbGltcGlvLCBtYW5lamFibGUgeSBhZGVjdWFkbyBwYXJhIGVsIGFuw6FsaXNpcyB5IG1vZGVsYWRvIHBvc3Rlcmlvci4NCg0KPGEgbmFtZT0iaXU4LiI+PC9hPg0KDQojIyAxLjQgQW7DoWxpc2lzIGV4cGxvcmF0b3JpbyB1bml2YXJpYWRvIGRlIGNvbHVtbmFzIG51bcOpcmljYXMNCg0KVXRpbGl6YW5kbyBlc3RlIG51ZXZvIGRhdGFzZXQgcHJvY2VzYWRvLCBzZSBwZXJtaXRlIHByb2NlZGVyIGNvbiBlbCBhbsOhbGlzaXMgZXhwbG9yYXRvcmlvIGRlIGxvcyBkYXRvcy4gU2UgY29tZW56w7MgcG9yIGVsIGFuw6FsaXNpcyB1bml2YXJpYWRvIGRlIGxhcyBjb2x1bW5hcyBudW3DqXJpY2FzLg0KDQojIyMgMS40LjEgRXN0YWTDrXN0aWNhcyBkZXNjcmlwdGl2YXMNCg0KfCBOb21icmUgY29sICAgICAgICAgICAgICAgICAgfCBNZWRpYSAgICAgICAgfCBTdGQgICAgICAgICAgfCBNaW4gICAgICAgICAgfCAyNSUgICAgICAgICAgfCA1MCUgICAgICAgICAgfCA3NSUgICAgICAgICAgfCBNYXggICAgICAgICAgfCBTa2V3bmVzcyAgICAgfCBLdXJ0b3NpcyAgICAgIHwNCnwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwNCnwgbG9hbl9hbW50ICAgICAgICAgICAgICAgICAgIHwgMTQ3NTUuMjY0NjA1IHwgODQzNS40NTU2MDEgIHwgNTAwLjAwMDAwMCAgIHwgODAwMC4wMDAwMDAgIHwgMTMwMDAuMDAwMDAwIHwgMjAwMDAuMDAwMDAwIHwgMzUwMDAuMDAwMDAwIHwgMC42ODE2ODMgICAgIHwgLTAuMjU2NzE1ICAgICB8DQp8IGZ1bmRlZF9hbW50ICAgICAgICAgICAgICAgICB8IDE0NzQxLjg3NzYyNSB8IDg0MjkuODk3NjU3ICB8IDUwMC4wMDAwMDAgICB8IDgwMDAuMDAwMDAwICB8IDEzMDAwLjAwMDAwMCB8IDIwMDAwLjAwMDAwMCB8IDM1MDAwLjAwMDAwMCB8IDAuNjgzNzQ1ICAgICB8IC0wLjI1MTYzOCAgICAgfA0KfCBmdW5kZWRfYW1udF9pbnYgICAgICAgICAgICAgfCAxNDcwMi40NjQzODMgfCA4NDQyLjEwNjczMiAgfCAwLjAwMDAwMCAgICAgfCA4MDAwLjAwMDAwMCAgfCAxMzAwMC4wMDAwMDAgfCAyMDAwMC4wMDAwMDAgfCAzNTAwMC4wMDAwMDAgfCAwLjY4MDk4MyAgICAgfCAtMC4yNTE3NjUgICAgIHwNCnwgaW50X3JhdGUgICAgICAgICAgICAgICAgICAgIHwgMTMuMjQ2NzQwICAgIHwgNC4zODE4NjcgICAgIHwgNS4zMjAwMDAgICAgIHwgOS45OTAwMDAgICAgIHwgMTIuOTkwMDAwICAgIHwgMTYuMjAwMDAwICAgIHwgMjguOTkwMDAwICAgIHwgMC40Mjk0ODEgICAgIHwgLTAuMTU1MzYyICAgICB8DQp8IGluc3RhbGxtZW50ICAgICAgICAgICAgICAgICB8IDQzNi43MTcxMjcgICB8IDI0NC4xODY1OTMgICB8IDE1LjY3MDAwMCAgICB8IDI2MC43MDUwMDAgICB8IDM4Mi41NTAwMDAgICB8IDU3Mi42MDAwMDAgICB8IDE0NDUuNDYwMDAwICB8IDAuOTM2OTUyICAgICB8IDAuNjg1OTcwICAgICAgfA0KfCBhbm51YWxfaW5jICAgICAgICAgICAgICAgICAgfCA3LjUwMjc1OWUrMDQgfCA2LjQ2OTgzMGUrMDQgfCAwLjAwMDAwMGUrMDAgfCA0LjUwMDAwMGUrMDQgfCA2LjUwMDAwMGUrMDQgfCA5LjAwMDAwMGUrMDQgfCA5LjUwMDAwMGUrMDYgfCA0LjQ0Nzg0OWUrMDEgfCA0LjgwODE5MmUrMDMgIHwNCnwgZHRpICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTguMTU3MDM5ICAgIHwgMTcuMTkwNjI2ICAgIHwgMC4wMDAwMDAgICAgIHwgMTEuOTEwMDAwICAgIHwgMTcuNjUwMDAwICAgIHwgMjMuOTUwMDAwICAgIHwgOTk5OS4wMDAwMDAgIHwgNDQxLjQ4Njc3NSAgIHwgMjU2MTI2Ljg2Mjk0MSB8DQp8IGRlbGlucV8yeXJzICAgICAgICAgICAgICAgICB8IDAuMzE0NDQyICAgICB8IDAuODYyMjQ0ICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDM5LjAwMDAwMCAgICB8IDUuNDczNzk2ICAgICB8IDU3LjMwOTA4MSAgICAgfA0KfCBpbnFfbGFzdF82bXRocyAgICAgICAgICAgICAgfCAwLjY5NDYyMyAgICAgfCAwLjk5ODQ0OCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAxLjAwMDAwMCAgICAgfCAzMy4wMDAwMDAgICAgfCAyLjEwODQxMSAgICAgfCAxMS45MjUxMDMgICAgIHwNCnwgbXRoc19zaW5jZV9sYXN0X2RlbGlucSAgICAgIHwgMzQuMDYzNzk4ICAgIHwgMjEuODg0OTQwICAgIHwgMC4wMDAwMDAgICAgIHwgMTUuMDAwMDAwICAgIHwgMzEuMDAwMDAwICAgIHwgNTAuMDAwMDAwICAgIHwgMTg4LjAwMDAwMCAgIHwgMC40NTU1MjAgICAgIHwgLTAuNzY3MzE0ICAgICB8DQp8IG9wZW5fYWNjICAgICAgICAgICAgICAgICAgICB8IDExLjU0ODQ2OSAgICB8IDUuMzE3MzEzICAgICB8IDAuMDAwMDAwICAgICB8IDguMDAwMDAwICAgICB8IDExLjAwMDAwMCAgICB8IDE0LjAwMDAwMCAgICB8IDkwLjAwMDAwMCAgICB8IDEuMjQ5MzgwICAgICB8IDMuMTAzOTk0ICAgICAgfA0KfCBwdWJfcmVjICAgICAgICAgICAgICAgICAgICAgfCAwLjE5NTMwNyAgICAgfCAwLjU4MjA5MSAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCA4Ni4wMDAwMDAgICAgfCAxMy4yNjE5NDEgICAgfCA5OTMuMTk5MDA4ICAgIHwNCnwgcmV2b2xfYmFsICAgICAgICAgICAgICAgICAgIHwgMS42OTIwNzllKzA0IHwgMi4yNDI2NzllKzA0IHwgMC4wMDAwMDAgICAgIHwgNi40NDMwMDBlKzAzIHwgMS4xODc1MDBlKzA0IHwgMi4wODI5MDBlKzA0IHwgMi45MDQ4MzZlKzA2IHwgMS41OTQ5MzBlKzAxIHwgOS44NTg5MDhlKzAyICB8DQp8IHJldm9sX3V0aWwgICAgICAgICAgICAgICAgICB8IDU1LjA2NzY5MyAgICB8IDIzLjgzNDM0NCAgICB8IDAuMDAwMDAwICAgICB8IDM3LjcwMDAwMCAgICB8IDU2LjAwMDAwMCAgICB8IDczLjYwMDAwMCAgICB8IDg5Mi4zMDAwMDAgICB8IC0wLjEyMzg2OSAgICB8IDEuMDI3MjY5ICAgICAgfA0KfCB0b3RhbF9hY2MgICAgICAgICAgICAgICAgICAgfCAyNS4yNjgwMjYgICAgfCAxMS44NDA1NjEgICAgfCAwLjAwMDAwMCAgICAgfCAxNy4wMDAwMDAgICAgfCAyNC4wMDAwMDAgICAgfCAzMi4wMDAwMDAgICAgfCAxNjkuMDAwMDAwICAgfCAwLjg5MjUzOSAgICAgfCAxLjM3NzU4OSAgICAgIHwNCnwgb3V0X3BybmNwICAgICAgICAgICAgICAgICAgIHwgODQwMy4xMjQ4NTIgIHwgODQ5My40NTAyNjkgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgNjQ1OC4yOTAwMDAgIHwgMTM2NTkuMDU1MDAwIHwgNDkzNzIuODYwMDAwIHwgMC45MzIwMTggICAgIHwgMC4xMjI2MjEgICAgICB8DQp8IG91dF9wcm5jcF9pbnYgICAgICAgICAgICAgICB8IDgzOTkuNzEzMjQyICB8IDg0ODkuOTk3NjE3ICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDY0NTUuODEwMDAwICB8IDEzNjU0LjA1MDAwMCB8IDQ5MzcyLjg2MDAwMCB8IDAuOTMxODY4ICAgICB8IDAuMTIxODI3ICAgICAgfA0KfCB0b3RhbF9weW1udCAgICAgICAgICAgICAgICAgfCA3NTU4LjgyNjY4NCAgfCA3ODcxLjI0MzMzNiAgfCAwLjAwMDAwMCAgICAgfCAxOTE0LjU5MDAwMCAgfCA0ODk0Ljk5OTExNyAgfCAxMDYxNi44MTQyMzEgfCA1Nzc3Ny41Nzk4NzAgfCAxLjc4ODg5NCAgICAgfCAzLjYyMDEyMCAgICAgIHwNCnwgdG90YWxfcHltbnRfaW52ICAgICAgICAgICAgIHwgNzUyMS4xNjAzMDYgIHwgNzg0Ni4xMDg2MDQgIHwgMC4wMDAwMDAgICAgIHwgMTg5OS43MDAwMDAgIHwgNDg2Mi4wMTAwMDAgIHwgMTA1NjUuNjkwMDAwIHwgNTc3NzcuNTgwMDAwIHwgMS43OTM4MzIgICAgIHwgMy42NDE5ODEgICAgICB8DQp8IHRvdGFsX3JlY19wcm5jcCAgICAgICAgICAgICB8IDU3NTcuNzA2NDI0ICB8IDY2MjUuNDQxMDQ2ICB8IDAuMDAwMDAwICAgICB8IDEyMDAuNTcwMDAwICB8IDMyMTUuMzIwMDAwICB8IDgwMDAuMDAwMDAwICB8IDM1MDAwLjAzMDAwMCB8IDEuOTM1MDM2ICAgICB8IDMuOTg5MDQ2ICAgICAgfA0KfCB0b3RhbF9yZWNfaW50ICAgICAgICAgICAgICAgfCAxNzU0LjgwNDMyNyAgfCAyMDk1LjM1NjA5OSAgfCAwLjAwMDAwMCAgICAgfCA0NDEuNDYwMDAwICAgfCAxMDczLjI4MDAwMCAgfCAyMjM4LjI2NTAwMCAgfCAyNDIwNS42MjAwMDAgfCAyLjgyNjEwMCAgICAgfCAxMS41NDM1OTggICAgIHwNCnwgdG90YWxfcmVjX2xhdGVfZmVlICAgICAgICAgIHwgMC4zOTY2OTIgICAgIHwgNC4wODc4MjUgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMzU4LjY4MDAwMCAgIHwgMTcuNDA0MDg1ICAgIHwgNTE1LjcyNDE2NSAgICB8DQp8IHJlY292ZXJpZXMgICAgICAgICAgICAgICAgICB8IDQ1LjkxOTI0MyAgICB8IDQwOS42OTM4NzQgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDMzNTIwLjI3MDAwMCB8IDE4LjA2MTgzOSAgICB8IDYxNy4yMTE0MTcgICAgfA0KfCBjb2xsZWN0aW9uX3JlY292ZXJ5X2ZlZSAgICAgfCA0Ljg4MDc1NyAgICAgfCA2My4xMjUyODEgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCA3MDAyLjE5MDAwMCAgfCAyOS42NTU2OTMgICAgfCAxNjg0LjE2NTM2NCAgIHwNCnwgbGFzdF9weW1udF9hbW50ICAgICAgICAgICAgIHwgMjE2NC4xNDU1ODUgIHwgNDc5NC43ODMyMzMgIHwgMC4wMDAwMDAgICAgIHwgMjgwLjE3MDAwMCAgIHwgNDYyLjc4MDAwMCAgIHwgODMxLjI0NTAwMCAgIHwgMzY0NzUuNTkwMDAwIHwgMy40NzU4NTIgICAgIHwgMTMuMzU1NzcyICAgICB8DQp8IGNvbGxlY3Rpb25zXzEyX210aHNfZXhfbWVkICB8IDAuMDE0MzgwICAgICB8IDAuMTM0MTkxICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDIwLjAwMDAwMCAgICB8IDE3LjQxMDQwMCAgICB8IDEwOTcuODU0Nzk1ICAgfA0KfCBtdGhzX3NpbmNlX2xhc3RfbWFqb3JfZGVyb2cgfCA0NC4xMDQ4MzggICAgfCAyMi4xNzk4NDEgICAgfCAwLjAwMDAwMCAgICAgfCAyNy4wMDAwMDAgICAgfCA0NC4wMDAwMDAgICAgfCA2MS4wMDAwMDAgICAgfCAxODguMDAwMDAwICAgfCAwLjI2NDkzMiAgICAgfCAtMC4wMzEzNjIgICAgIHwNCnwgYWNjX25vd19kZWxpbnEgICAgICAgICAgICAgIHwgMC4wMDQ5OTEgICAgIHwgMC4wNzc2MjUgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMTQuMDAwMDAwICAgIHwgMjQuMDY2MzU3ICAgIHwgMTYzMC44NjY0NTMgICB8DQp8IHRvdF9jb2xsX2FtdCAgICAgICAgICAgICAgICB8IDIuMjU3MDI2ZSswMiB8IDEuMDMxMTM3ZSswNCB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwZSswMCB8IDAuMDAwMDAwZSswMCB8IDAuMDAwMDAwZSswMCB8IDkuMTUyNTQ1ZSswNiB8IDguNTYxODA1ZSswMiB8IDcuNTk2MTEyZSswNSAgfA0KfCB0b3RfY3VyX2JhbCAgICAgICAgICAgICAgICAgfCAxLjM5NDU4MmUrMDUgfCAxLjUzNzUwMGUrMDUgfCAwLjAwMDAwMCAgICAgfCAyLjk4NTMwMGUrMDQgfCA4LjA1NTkwMGUrMDQgfCAyLjA4MjA1MGUrMDUgfCA4LjAwMDA3OGUrMDYgfCAyLjkxODE3NGUrMDAgfCAyLjk0MDg4MWUrMDEgIHwNCnwgdG90YWxfcmV2X2hpX2xpbSAgICAgICAgICAgIHwgMy4yMDY4NjJlKzA0IHwgMy43NDk4MjZlKzA0IHwgMC4wMDAwMDAgICAgIHwgMS4zOTAwMDBlKzA0IHwgMi4zNzAwMDBlKzA0IHwgMy45ODAwMDBlKzA0IHwgOS45OTk5OTllKzA2IHwgNy4zMDQ1NTJlKzAxIHwgMS44NDAwMzllKzA0ICB8DQoNCioqVGFibGEgNS4qKiBSZXN1bWVuIGRlIGVzdGFkw61zdGljYXMgZGVzY3JpcHRpdmFzIHBhcmEgY2FkYSBjb2x1bW5hIG51bcOpcmljYS4NCg0KRGUgZXN0YSB0YWJsYSBzZSBwdWVkZW4gcmVhbGl6YXIgbGFzIHNpZ3VpZW50ZXMgb2JzZXJ2YWNpb25lczoNCg0KLSAgIGFubnVhbF9pbmMsIGR0aSwgcHViX3JlYywgcmVjb3ZlcmllcywgY29sbGVjdGlvbl9yZWNvdmVyeV9mZWUsIHRvdF9jb2xsX2FtdCwgdG90YWxfcmV2X2hpX2xpbSwgZW50cmUgb3RyYXMsIHByZXNlbnRhbiBmdWVydGUgYXNpbWV0csOtYSBhIGxhIGRlcmVjaGEgKHZhbG9yZXMgZXh0cmVtb3MgYWx0b3MpLiBFc3RvIHBvZHLDrWEgbGxlZ2FyIGEgYWZlY3RhciBlbCBtb2RlbG8gZGUgcmVkZXMgbmV1cm9uYWxlcy4NCg0KLSAgIGR0aSwgYW5udWFsX2luYywgdG90X2NvbGxfYW10LCBwdWJfcmVjLCBjb2xsZWN0aW9uc18xMl9tdGhzX2V4X21lZCwgdG90YWxfcmV2X2hpX2xpbSwgZXRjLiwgdGllbmVuIGNvbGFzIHBlc2FkYXMgY29uIG91dGxpZXJzIGV4dHJlbW9zLg0KDQotICAgZGVsaW5xXzJ5cnMsIGlucV9sYXN0XzZtdGhzLCBwdWJfcmVjLCBjb2xsZWN0aW9uc18xMl9tdGhzX2V4X21lZCwgYWNjX25vd19kZWxpbnEsIGV0Yy4sIHRpZW5lbiBtYXlvcsOtYSBkZSB2YWxvcmVzIGVuIDAuDQoNCi0gICBWYXJpYWJsZXMgZmluYW5jaWVyYXMgY29tbyBsb2FuX2FtbnQsIGZ1bmRlZF9hbW50LCBpbnN0YWxsbWVudCwgdG90YWxfcHltbnQsIGV0Yy4sIHByb2JhYmxlbWVudGUgZXN0w6FuIGFsdGFtZW50ZSBjb3JyZWxhY2lvbmFkYXMuDQoNCi0gICBNb250b3MgY29tbyB0b3RhbF9yZWNfbGF0ZV9mZWUsIHJlY292ZXJpZXMsIGNvbGxlY3Rpb25fcmVjb3ZlcnlfZmVlIHRpZW5lbiB2YWxvcmVzIGV4dHJlbW9zIHF1ZSBwdWVkZW4gZGlzdG9yc2lvbmFyIGFuw6FsaXNpcw0KDQojIyMgMS40LjIgVmFsb3JlcyB2YWPDrW9zIHkgY29udGVvIGRlIHZhbG9yZXMgcG9yIGNvbHVtbmENCg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKk5vbWJyZSBkZSBDb2x1bW5hKiogICAgICAgfCAqKk7Dum1lcm8gZGUgdmFsb3JlcyBudWxsKiogfCAqKlBvcmNlbnRhamUgZGUgdmFsb3JlcyBudWxsKiogfCAqKk7Dum1lcm8gZGUgdmFsb3JlcyDDum5pY29zIGVuIGNvbHVtbmEgKFNpIHRpZW5lIG1lbm9zIGRlIDMwMCwgc2UgbXVlc3RyYW4gbG9zIHByaW1lcm9zIDIwIHZhbG9yZXMpKiogfA0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kw0KfCBhbm51YWxfaW5jICAgICAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAwNDUxICAgICAgICAgICAgICAgICAgICAgICB8IDQ5Mzg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBkZWxpbnFfMnlycyAgICAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMC4gMi4gMy4gMS4gNC4gNi4gNS4gOC4gNy4gOS4gMTEuIG5hbiAxMy4gMTUuIDEwLiAxMi4gMTcuIDE4LiAyOS4gMjQuXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBpbnFfbGFzdF82bXRocyAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMS4gNS4gMi4gMC4gMy4gNC4gNi4gNy4gOC4gOS4gMTAuIDExLiAxMi4gMTUuIDE0LiAzMy4gMTcuIDMyLiAyNC4gMTMuXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBtdGhzX3NpbmNlX2xhc3RfZGVsaW5xICAgICAgfCA0NTQzMTIgICAgICAgICAgICAgICAgICAgICB8IDUxLjE5NzA2NSAgICAgICAgICAgICAgICAgICAgICB8IDE1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtuYW4gMzUuIDM4LiA2MS4gOC4gMjAuIDE4LiA2OC4gNDUuIDQ4LiA0MS4gNDAuIDc0LiAyNS4gNTMuIDM5LiAxMC4gMjYuIDU2LiA3Ny5dICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBvcGVuX2FjYyAgICAgICAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMy4gMi4gMTAuIDE1LiA5LiA3LiA0LiAxMS4gMTQuIDEyLiAyMC4gOC4gNi4gMTcuIDUuIDEzLiAxNi4gMzAuIDIxLiAxOC5dICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBwdWJfcmVjICAgICAgICAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMC4gMS4gMi4gMy4gNC4gNS4gbmFuIDYuIDkuIDguIDcuIDExLiA0OS4gMTAuIDU0LiAxMi4gMTguIDE5LiAxNi4gMTUuXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCByZXZvbF91dGlsICAgICAgICAgICAgICAgICAgfCA1MDIgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDU2NTcxICAgICAgICAgICAgICAgICAgICAgICB8IDEzNTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RhbF9hY2MgICAgICAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDEzNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBjb2xsZWN0aW9uc18xMl9tdGhzX2V4X21lZCAgfCAxNDUgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDE2MzQwICAgICAgICAgICAgICAgICAgICAgICB8IDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMC4gbmFuIDEuIDIuIDQuIDMuIDYuIDE2LiAyMC4gNS4gNy4gMTAuIDE0Ll0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBtdGhzX3NpbmNlX2xhc3RfbWFqb3JfZGVyb2cgfCA2NjU2NzYgICAgICAgICAgICAgICAgICAgICB8IDc1LjAxNTk3NCAgICAgICAgICAgICAgICAgICAgICB8IDE2OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtuYW4gNTMuIDM0LiA1NC4gNjkuIDcuIDE2LiA3MS4gMzMuIDU5LiA0NS4gOC4gNTYuIDExLiA1MC4gNDcuIDY0LiAzMi4gNjIuIDM5Ll0gICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBhY2Nfbm93X2RlbGlucSAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMC4gMS4gbmFuIDIuIDMuIDUuIDQuIDYuIDE0Ll0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RfY29sbF9hbXQgICAgICAgICAgICAgICAgfCA3MDI3NiAgICAgICAgICAgICAgICAgICAgICB8IDcuOTE5NTAyICAgICAgICAgICAgICAgICAgICAgICB8IDEwMzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RfY3VyX2JhbCAgICAgICAgICAgICAgICAgfCA3MDI3NiAgICAgICAgICAgICAgICAgICAgICB8IDcuOTE5NTAyICAgICAgICAgICAgICAgICAgICAgICB8IDMyNzM0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RhbF9yZXZfaGlfbGltICAgICAgICAgICAgfCA3MDI3NiAgICAgICAgICAgICAgICAgICAgICB8IDcuOTE5NTAyICAgICAgICAgICAgICAgICAgICAgICB8IDIxMjUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KDQoqKlRhYmxhIDYuKiogVmFsb3JlcyB2YWPDrW9zIHkgY29udGVvIGRlIHZhbG9yZXMgw7puaWNvcyBwYXJhIGNhZGEgY29sdW1uYSBudW3DqXJpY2EuDQoNCkxvcyB2YWxvcmVzIG51bGwgZGUgbGFzIGNvbHVtbmFzIGNhdGVnw7NyaWNhcyBzZSByZXN1bWVuIGVuIGxhIFRhYmxhIDYuIEEgcGFydGlyIGRlIGVzdG8gc2UgcHVkbyBub3RhciBsbyBzaWd1aWVudGU6DQoNCi0gICBMYXMgY29sdW1uYXMgY29uIG1heW9yIG7Dum1lcm8gZGUgbnVsb3Mgc29uIG10aHNfc2luY2VfbGFzdF9tYWpvcl9kZXJvZyB5IG10aHNfc2luY2VfbGFzdF9kZWxpbnEuIFNlIGRlYmVyw6FuIGltcHV0YXIgY29uIHByZWNhdWNpw7NuLg0KDQotICAgTGEgbWF5b3LDrWEgZGUgdmFsb3JlcyB0aWVuZW4gdW5hIGNhbnRpZGFkIGRlIG51bG9zIHJlbGF0aXZhbWVudGUgYmFqYSwgYXPDrSBxdWUgc2UgcG9kcsOhIHJlYWxpemFyIHVuYSBpbXB1dGFjacOzbiBzZW5jaWxsYSBwYXJhIGxsZW5hciBlc3RvcyB2YWxvcmVzLg0KDQotICAgSGF5IHZhcmlhcyBjb2x1bW5hcyBxdWUgdGllbmVuIG5hbnMsIGFzw60gcXVlIHNlIHRlbmRyw6FuIHF1ZSBpbXB1dGFyIGNvbiBwcmVjYXVjacOzbiB0YW1iacOpbi4NCg0KIyMjIDEuNC4zIERpc3RyaWJ1Y2nDs24gZSBpZGVudGlmaWNhY2nDs24gZGUgZGF0b3MgYXTDrXBpY29zIChvdXRsaWVycykNCg0KIVtdKFZpb2xpbkFuZEJveHBsb3RzLnBuZykNCg0KKipGaWd1cmEgMS4qKiBWaW9saW4gcGxvdHMgeSBib3ggcGxvdHMgZGUgY2FkYSB2YXJpYWJsZSBudW3DqXJpY2EgZW4gZWwgZGF0YXNldC4NCg0KRW4gbGEgRmlndXJhIDEgc2UgbXVlc3RyYW4gcGxvdHMgZGUgdmlvbGluIHkgY2FqYSBwYXJhIHBvZGVyIGlkZW50aWZpY2FyIHRhbnRvIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGRhdG9zIGNvbW8gcGFyYSBpZGVudGlmaWNhciBsb3MgdmFsb3JlcyBhbsOzbWFsb3MgcG9yIGNhZGEgY29sdW1uYS4gU2UgcHVlZGUgYXByZWNpYXIgbG8gc2lndWllbnRlOg0KDQotICAgbG9hbl9hbW50LCBmdW5kZWRfYW1udCwgZnVuZGVkX2FtbnRfaW52IHRpZW5lbiBkaXN0cmlidWNpb25lcyBzaW3DqXRyaWNhcyB5IGVzdGFibGVzLCBzaW4gdmFsb3JlcyBleHRyZW1vcyBub3RhYmxlcy4NCg0KLSAgIGluc3RhbGxtZW50IHByZXNlbnRhIHVuIGxldmUgc2VzZ28gYSBsYSBkZXJlY2hhLg0KDQotICAgb3V0X3BybmNwIHkgb3V0X3BybmNwX2ludiBlc3TDoW4gY2VudHJhZGFzIGVuIGNlcm8sIGluZGljYW5kbyBtdWNob3MgcHLDqXN0YW1vcyBwYWdhZG9zLg0KDQotICAgdG90YWxfcmVjX3BybmNwIHNlIGNvbmNlbnRyYSBjZXJjYSBkZSBjZXJvIHBlcm8gY29uIHVuIHJhbmdvIGFtcGxpby4NCg0KLSAgIGFubnVhbF9pbmMgdGllbmUgdW4gZnVlcnRlIHNlc2dvIGEgbGEgZGVyZWNoYSwgY29uIG91dGxpZXJzIHNpZ25pZmljYXRpdm9zLg0KDQotICAgcmV2b2xfYmFsLCB0b3RfY3VyX2JhbCwgdG90YWxfcmV2X2hpX2xpbSwgdG90YWxfcmVjX2ludCwgdG90YWxfcmVjX2xhdGVfZmVlLCB0b3RfY29sbF9hbXQgZXN0w6FuIHNlc2dhZGFzIGEgbGEgZGVyZWNoYSBjb24gY29sYXMgbGFyZ2FzLg0KDQotICAgY29sbGVjdGlvbl9yZWNvdmVyeV9mZWUsIHJlY292ZXJpZXMsIGxhc3RfcHltbnRfYW1udCwgYXZnX2N1cl9iYWwgdGFtYmnDqW4gbXVlc3RyYW4gY29sYXMgbGFyZ2FzIGhhY2lhIGxhIGRlcmVjaGEuDQoNCi0gICBkZWxpbnFfMnlycywgaW5xX2xhc3RfNm10aHMsIG9wZW5fYWNjLCBwdWJfcmVjLCBhY2Nfbm93X2RlbGlucSwgY29sbGVjdGlvbnNfMTJfbXRoc19leF9tZWQgdGllbmVuIGRpc3RyaWJ1Y2lvbmVzIGRpc2NyZXRhcywgY2VudHJhZGFzIGVuIHBvY29zIHZhbG9yZXMuDQoNCi0gICBtdGhzX3NpbmNlX2xhc3RfZGVsaW5xIHkgbXRoc19zaW5jZV9sYXN0X21ham9yX2Rlcm9nIHByZXNlbnRhbiBodWVjb3MgZ3JhbmRlcyBkZWJpZG8gYSBtdWNob3MgdmFsb3JlcyBudWxvcy4NCg0KLSAgIGNvbGxlY3Rpb25zXzEyX210aHNfZXhfbWVkLCBhY2Nfbm93X2RlbGlucSwgdG90YWxfcmVjX2xhdGVfZmVlLCByZWNvdmVyaWVzLCBjb2xsZWN0aW9uX3JlY292ZXJ5X2ZlZSBlc3TDoW4gZG9taW5hZGFzIHBvciBjZXJvcy4NCg0KLSAgIGZ1bmRlZF9hbW50LCBsb2FuX2FtbnQsIGZ1bmRlZF9hbW50X2ludiB0aWVuZW4gcGF0cm9uZXMgc2ltaWxhcmVzIHkgcHVlZGVuIHNlciByZWR1bmRhbnRlcy4NCg0KLSAgIG91dF9wcm5jcCB5IG91dF9wcm5jcF9pbnYgdGFtYmnDqW4gc29uIHNpbWlsYXJlcyBlbnRyZSBzw60uDQoNCi0gICB0b3RhbF9yZWNfcHJuY3AsIHRvdGFsX3JlY19pbnQsIHRvdGFsX3JlY19sYXRlX2ZlZSwgcmVjb3ZlcmllcyBwb2Ryw61hbiBhZ3J1cGFyc2UgY29tbyBtb250b3MgcmVjdXBlcmFkb3MuDQoNCi0gICBWYXJpYWJsZXMgZnVlcnRlbWVudGUgc2VzZ2FkYXMgcG9kcsOtYW4gYmVuZWZpY2lhcnNlIGRlIHRyYW5zZm9ybWFjaW9uZXMuDQoNCi0gICBWYXJpYWJsZXMgY29uIG11Y2hvcyBjZXJvcyBwb2Ryw61hbiBlbGltaW5hcnNlLg0KDQotICAgVmFyaWFibGVzIHJlZHVuZGFudGVzIHBvZHLDrWFuIGVsaW1pbmFyc2UgbyBjb25zb2xpZGFyc2UuDQoNCi0gICBWYXJpYWJsZXMgZGlzY3JldGFzIGNvbiBwb2NvcyB2YWxvcmVzIHB1ZWRlbiB0cmF0YXJzZSBjb21vIGNhdGVnb3LDrWFzIG9yZGluYWxlcy4NCg0KIyMjIDEuNC40LiBDb25jbHVzaW9uZXMNCg0KQSBwYXJ0aXIgZGUgbG8gYW50ZXJpb3IsIHNlIGRlcml2YXJvbiBsYXMgc2lndWllbnRlcyBjb25jbHVzaW9uZXM6DQoNCi0gICBFbnRyZSBsb3MgZGF0b3Mgc2UgZW5jdWVudHJhbiB2YXJpYXMgY29sdW1uYXMgcXVlIGVzdMOhbiBtdXkgbyBwb2NvIHNlc2dhZGFzLCBhZGVtw6FzIGRlIGNvbnRhciBjb24gbXVjaG9zIG8gcG9jb3Mgb3V0bGllcnMuIFNlIHRlbmRyw6EgcXVlIHRlbmVyIGVzdG8gZW4gY3VlbnRhIGEgbGEgaG9yYSBkZSBwcmVwcm9jZXNhciBsb3MgZGF0b3MuDQoNCi0gICBFeGlzdGVuIHZhcmlhcyBjb2x1bW5hcyBjb24gdmFsb3JlcyBudWxvcyBwZXJvIGltcHV0YWJsZXMsIHkgcG9yIGxvIHRhbnRvIHNlIHBvZHLDoSByZWFsaXphciBsYSBkZWJpZGEgaW1wdXRhY2nDs24gYWwgbW9tZW50byBkZSBoYWNlciBlbCBwcmVwcm9jZXNhZG8uDQoNCjxhIG5hbWU9Iml1OS4iPjwvYT4NCg0KIyMgMS41IEFuw6FsaXNpcyBleHBsb3JhdG9yaW8gdW5pdmFyaWFkbyBkZSBjb2x1bW5hcyBubyBudW3DqXJpY2FzDQoNCiMjIyAxLjUuMSBEaXN0cmlidWNpw7NuIGRlIGZyZWN1ZW5jaWFzIHkgY2FyZGluYWxpZGFkDQoNCkEgcGFydGlyIGRlbCBhbsOhbGlzaXMgZGUgbGEgZXN0cnVjdHVyYSBkZWwgcHJveWVjdG8sIHNlIHB1ZGllcm9uIGlkZW50aWZpY2FyIGxhcyBjb2x1bW5hcyBubyBudW3DqXJpY2FzIHF1ZSBzZSBtdWVzdHJhbiBlbiBsYSBUYWJsYSA0LiBTZSBwcm9jZWRpw7MgYSBhbmFsaXphciBsYSBmcmVjdWVuY2lhIHkgY2FyZGluYWxpZGFkIGRlIGVzdGFzIGNvbHVtbmFzLg0KDQpEZSBlc3RvLCBzZSBwdWRvIGlkZW50aWZpY2FyIGxvIHNpZ3VpZW50ZToNCg0KLSAgIHRlcm0gc29sbyB0aWVuZSBkb3MgdmFsb3JlcyBwb3NpYmxlcywgeSBwb3IgbG8gdGFudG8gcG9kcsOhIHNlciBjb2RpZmljYWRhIGbDoWNpbG1lbnRlLg0KDQotICAgZ3JhZGUgeSBzdWJfZ3JhZGUgZXN0w6FuIHJlbGFjaW9uYWRhcywgcGVybyBzdWJfZ3JhZGUgdGllbmUgbcOhcyBncmFudWxhcmlkYWQsIHkgcG9yIGxvIHRhbnRvIHNlIGRlY2lkZSBlbGltaW5hciBsYSBjb2x1bW5hIGdyYWRlLg0KDQotICAgZW1wX2xlbmd0aCBlcyBvcmRpbmFsLCB5IHBvciBsbyB0YW50byBkZWJlcsOhIHNlciBjb2RpZmljYWRhIHNlZ8O6biBjb3JyZXNwb25kZS4NCg0KLSAgIGhvbWVfb3duZXJzaGlwIHRpZW5lIGFsZ3VuYXMgY2xhc2VzIHNpbWlsYXJlcywgY29tbyBPVEhFUiwgTk9ORSB5IEFOWSwgcG9yIGxvIHF1ZSBkZXBlbmRpZW5kbyBkZSBzdSBmcmVjdWVuY2lhIHNlIHBvZHLDrWFuIGFncnVwYXIuDQoNCi0gICB2ZXJpZmljYXRpb25fc3RhdHVzIHRhbWJpw6luIHNlcsOhIGbDoWNpbCBkZSBjb2RpZmljYXIgZGViaWRvIGEgcXVlIGN1ZW50YSBzb2xhbWVudGUgY29uIDIgdmFsb3Jlcy4NCg0KLSAgIERlYmlkbyBhIGxhIGFudGlndWVkYWQgZGUgbG9zIGRhdG9zLCBzZSBvcHRhcsOhIGx1ZWdvIHBvciBkZXNjYXJ0YXIgbGFzIGNvbHVtbmFzIHF1ZSBjb250ZW5nYW4gZmVjaGFzLg0KDQotICAgbG9hbl9zdGF0dXMgc2Vyw6EgbnVlc3RybyB0YXJnZXQsIGVsIGN1YWwgbcOhcyBhZGVsYW50ZSBzZSBjb2RpZmljYXLDoSBzaWd1aWVuZG8gbGFzIHJlY29tZW5kYWNpb25lcyBkYWRhcyBwb3IgZWwgZW51bmNpYWRvIGRlbCBwcm9ibGVtYS4NCg0KLSAgIHB1cnBvc2UgZXMgdW5hIHZlcnNpw7NuIG3DoXMgZXN0cnVjdHVyYWRhIHkgY29uc3RhbnRlIGRlIHRpdGxlLCB5IHBvciBsbyB0YW50byBzZSBjb25zZXJ2YXLDoS4NCg0KLSAgIHppcF9jb2RlIHkgYWRkcl9zdGF0ZSBlc3TDoW4gcmVsYWNpb25hZGFzLCBwZXJvIGFkZHJfc3RhdGUgdGllbmUgbWVub3MgY2FyZGluYWxpZGFkLCB5IHBvciBsbyB0YW50byBzZSBvcHRhcsOhIHBvciBlbGltaW5hciBsYSBjb2x1bW5hIHppcF9jb2RlLg0KDQotICAgaW5pdGlhbF9saXN0X3N0YXR1cyBzZXLDoSBmw6FjaWwgZGUgY29kaWZpY2FyIGFsIGNvbnRhciBjb24gcG9jb3MgdmFsb3Jlcy4NCg0KIyMjIDEuNS4yIENvbnRlbyBkZSB2YWxvcmVzIHBvciBjb2x1bW5hDQoNCiFbXShpbWFnZXMvQ2F0ZWdEaXN0cmlidXRpb25zLnBuZykNCg0KKipGaWd1cmEgMi4qKiBHcsOhZmljb3MgZGUgYmFycmFzIHBhcmEgbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMuDQoNCkVuIGxhIEZpZ3VyYSAyIHNlIG11ZXN0cmFuIGxvcyBncsOhZmljb3MgZGUgYmFycmFzIGdlbmVyYWRvcyBwYXJhIHZlciBsYSBmcmVjdWVuY2lhIGRlIGxvcyB2YWxvcmVzIGRlIGNhZGEgdmFyaWFibGUgY2F0ZWfDs3JpY2EuIERlIGVzdGEsIHNlIHB1ZWRlIGlkZW50aWZpY2FyIGxvIHNpZ3VpZW50ZToNCg0KLSAgIE11Y2hhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIChjb21vIGB0ZXJtYCwgYGdyYWRlYCwgYHB5bW50X3BsYW5gLCBgYXBwbGljYXRpb25fdHlwZWApIHRpZW5lbiBjYXRlZ29yw61hcyBkb21pbmFudGVzLCBsbyBxdWUgc3VnaWVyZSB1biBmdWVydGUgZGVzYmFsYW5jZSBxdWUgc2UgdGVuZHLDrWEgcXVlIHRyYXRhciwgcG9yIGVqZW1wbG8sIGVsaW1pbmFuZG8gbGFzIGZpbGFzIHF1ZSBjb250aWVuZW4gdmFsb3JlcyBxdWUgbm8gc29uIGNvbXVuZXMuDQoNCi0gICBTZSBwdWVkZSB2ZXIgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBwcsOpc3RhbW9zIHNvbiBhIDM2IG1lc2VzIHkgbG9zIHByaW5jaXBhbGVzIG1vdGl2b3MgZGUgcHLDqXN0YW1vIHNvbiBkZWJfY29uc29saWRhdGlvbiB5IGNyZWRpdF9jYXJkLg0KDQotICAgTGEgbWF5b3LDrWEgZGUgbG9zIGRhdG9zIHRpZW5lbiBhIE1PUlRHQUdFIGNvbW8gc3UgZXN0YWRvIGRlIGhvbWVfb3duZXJzaGlwLg0KDQotICAgQ29sdW1uYXMgY29tbyBhcHBsaWNhdGlvbl90eXBlLCBsYXN0X2NyZWRpdF9wdWxsX2QsIG5leHRfcHltbnQsIGxhc3RfcHltbnRfZCwgcHltbnRfcGxhbiB5IGhvbWVfb3duZXJzaGlwIHRpZW5lbiBtdXkgcG9jYSB2YXJpYWJpbGlkYWQgbyB0aWVuZW4gdmFsb3JlcyBxdWUgc29uIG11eSByYXJvcy4gUGFyYSB0cmF0YXJsb3MsIHNlIG9wdGFyw6EgcG9yIGVsaW1pbmFyIGxhcyBmaWxhcyBxdWUgY29udGVuZ2FuIHZhbG9yZXMgZXh0cmVtYWRhbWVudGUgcmFyb3MsIHkgc2UgZWxpbWluYXLDoW4gY29sdW1uYXMgcXVlIHRlbmdhbiBtw6FzIGRlbCA4MCUgZGUgbG9zIHZhbG9yZXMgaWd1YWxlcy4NCg0KIyMjIDEuNS4zIExpbXBpZXphIGFkaWNpb25hbCBkZSBjb2x1bW5hcyBjb24gcG9jYSB2YXJpYW56YQ0KDQpBIHBhcnRpciBkZSBsbyBhbnRlcmlvcm1lbnRlIG1lbmNpb25hZG8sIHNlIGRlY2lkacOzIHBvciByZWFsaXphciBsYXMgc2lndWllbnRlcyBhY2Npb25lcyBkZSBsaW1waWV6YSBwYXJhIGxhcyBjb2x1bW5hcyBjYXRlZ8OzcmljYXM6DQoNCi0gICBTZSBlbGltaW5hcsOhbiBsYXMgY29sdW1uYXMgZ3JhZGUgeSB6aXBfY29kZSBkZWJpZG8gYSBxdWUgeWEgdGllbmVuIG90cmFzIGNvbHVtbmFzIHF1ZSBlbmNhcHN1bGFuIHN1cyBzaWduaWZpY2Fkb3MuDQoNCi0gICBQb3IgZWwgbW9tZW50bywgZGViaWRvIGEgcXVlIGxvcyBkYXRvcyB2YW4gaGFzdGEgZWwgMjAxNiwgc2UgZWxpbWluYXLDoW4gbGFzIHNpZ3VpZW50ZXMgY29sdW1uYXMgcXVlIHJlcHJlc2VudGFuIGZlY2hhczogbGFzdF9weW1udF9kLCBuZXh0X3B5bW50X2QsIGlzc3VlX2QsIGVhcmxpZXN0X2NyX2xpbmUsIGxhc3RfY3JlZGl0X3B1bGxfZC4NCg0KLSAgIFNlIGVsaW1pbmFyw6FuIGxhcyBmaWxhcyBxdWUgbm8gY3VtcGxhbiBjb24gbG9zIHNpZ3VpZW50ZXMgY3JpdGVyaW9zOg0KDQogICAgLSAgIEVsIHZhbG9yIGRlIGhvbWVfb3duZXJzaGlwIGRlYmVyw6Egc2VyIFJFTlQsIE1PUlRHQUdFIG8gT1dOLg0KDQogICAgLSAgIEVsIHZhbG9yIGRlIHB5bW50X3BsYW4gZGViZXLDoSBzZXIgIm4iLg0KDQogICAgLSAgIEVsIHZhbG9yIGRlIGFwcGxpY2F0aW9uX3R5cGUgZGViZXLDoSBzZXIgSU5ESVZJRFVBTC4NCg0KVW5hIHZleiBhcGxpY2FkYSBsYSBsaW1waWV6YSBkZSBhY3VlcmRvIGEgbG9zIGFudGVyaW9yZXMgY3JpdGVyaW9zLCBzZSBwYXPDsyBkZSB0ZW5lciA4ODczNzkgZmlsYXMgYSB0ZW5lciA4ODY2MjMgZmlsYXMsIGVzIGRlY2lyLCBxdWUgaHVibyB1bmEgcmVkdWNjacOzbiBkZSBtZW5vcyBkZWwgMC4wMSUgZGVsIGRhdGFzZXQuDQoNCjxhIG5hbWU9Iml1MTAuIj48L2E+DQoNCiMjIDEuNiBBbsOhbGlzaXMgbXVsdGl2YXJpYWRvDQoNCiMjIyAxLjYuMSBUcmFuc2Zvcm1hY2nDs24gZGUgdGFyZ2V0IGEgdmFsb3JlcyBudW3DqXJpY29zDQoNClNlZ8O6biBlbCBlbnVuY2lhZG8sIGxvcyB2YWxvcmVzIGRlbCB0YXJnZXQgZGViZXLDoW4gc2VyIGNvZGlmaWNhZG9zIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNCi0gICBQb3NpdGl2ZSAoMCk6IFNpIGVsIHRhcmdldCBlcyAiRnVsbHkgUGFpZCIgbyAiRG9lcyBub3QgbWVldCB0aGUgY3JlZGl0IHBvbGljeS4gU3RhdHVzOkZ1bGx5IFBhaWQiLg0KDQotICAgTmVnYXRpdmUgKDEpOiBTaSBlbCB0YXJnZXQgZXMgIkNoYXJnZWQgT2ZmIiwgIkxhdGUgKDMxLTEyMCBkYXlzKSIsICJEZWZhdWx0IiBvICJEb2VzIG5vdCBtZWV0IHRoZSBjcmVkaXQgcG9saWN5LiBTdGF0dXM6Q2hhcmdlZCBvZmYiLg0KDQotICAgTnVsbCAoaW5kZWZpbmlkbyk6IFNpIGVsIHRhcmdldCBlcyAiQ3VycmVudCIsICJJc3N1ZWQiLCAiSW4gR3JhY2UgUGVyaW9kIiBvICJMYXRlICgxNi0zMCBkYXlzKSIuDQoNCkxhIGNvZGlmaWNhY2nDs24gc2UgcmVhbGl6w7MgdXRpbGl6YW5kbyBsYSBzaWd1aWVudGUgZnVuY2nDs24gZGUgbWFwZW86DQoNCmBgYHtweXRob259DQpwb3NpdGl2ZSA9IHsNCiAgICAiRnVsbHkgUGFpZCIsIA0KICAgICJEb2VzIG5vdCBtZWV0IHRoZSBjcmVkaXQgcG9saWN5LiBTdGF0dXM6RnVsbHkgUGFpZCINCn0NCm5lZ2F0aXZlID0gew0KICAgICJDaGFyZ2VkIE9mZiIsDQogICAgIkxhdGUgKDMxLTEyMCBkYXlzKSIsDQogICAgIkRlZmF1bHQiLA0KICAgICJEb2VzIG5vdCBtZWV0IHRoZSBjcmVkaXQgcG9saWN5LiBTdGF0dXM6Q2hhcmdlZCBPZmYiDQp9DQpudWxsID0gew0KICAgICJDdXJyZW50IiwNCiAgICAiSXNzdWVkIiwNCiAgICAiSW4gR3JhY2UgUGVyaW9kIiwNCiAgICAiTGF0ZSAoMTYtMzAgZGF5cykiLA0KfQ0KDQoNCmRlZiBjdXN0b21fdGFyZ2V0X3RyYW5zZm9ybWVyKHZhbHVlKToNCiAgICBpZiB2YWx1ZSBpbiBwb3NpdGl2ZToNCiAgICAgICAgcmV0dXJuIDANCiAgICBlbGlmIHZhbHVlIGluIG5lZ2F0aXZlOg0KICAgICAgICByZXR1cm4gMQ0KICAgIGVsc2U6DQogICAgICAgIHJldHVybiBucC5uYW4NCmBgYA0KDQpDb24gZWwgdGFyZ2V0IGRlYmlkYW1lbnRlIGNvZGlmaWNhZG8gY29tbyB1bmEgdmFyaWFibGUgYmluYXJpYSwgeWEgc2UgcG9kcsOhIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBkZSBjb3JyZWxhY2nDs24gcmVzcGVjdGl2by4NCg0KIyMjIDEuNi4yIE1hdHJpeiBkZSBjb3JyZWxhY2nDs24NCg0KIVtdKGltYWdlcy9Db3JyZWxhdGlvbkhlYXRtYXAtMDEucG5nKQ0KDQoqKkZpZ3VyYSAzLioqIE1hdHJpeiBkZSBjb3JyZWxhY2nDs24uDQoNCkRlIGVzdGEgbWF0cml6IGRlIGNvcnJlbGFjacOzbiwgY29uc2lkZXJhbmRvIHF1ZSBsb2FuX3N0YXR1cyBlcyBlbCB0YXJnZXQgZGVsIHByb2JsZW1hIGRlIGFwcmVuZGl6YWplIHN1cGVydmlzYWRvLCBzZSBvYnNlcnZhIGxvIHNpZ3VpZW50ZToNCg0KLSAgIExhcyBjb2x1bW5hcyBsb2FuX2FtbnQsIGZ1bmRlZF9hbW50IHkgZnVuZGVkX2FtbnRfaW52IGVzdMOhbiBmdWVydGVtZW50ZSBjb3JyZWxhY2lvbmFkYXMsIGxvIGN1YWwgdGllbmUgc2VudGlkbyBhbCB0cmF0YXJzZSBkZSByZXByZXNlbnRhY2lvbmVzIGRlbCBtb250byBkZWwgcHLDqXN0YW1vLg0KDQotICAgTGEgbWF5b3LDrWEgZGUgbGFzIHZhcmlhYmxlcyBwcmVzZW50YW4gY29ycmVsYWNpb25lcyBtb2RlcmFkYXMgbyBiYWphcywgbG8gY3VhbCBlcyBwb3NpdGl2byBwYXJhIGV2aXRhciByZWR1bmRhbmNpYSBlbiBtb2RlbG9zIGxpbmVhbGVzIGNvbW8gcmVncmVzacOzbiBsb2fDrXN0aWNhLg0KDQotICAgbG9hbl9zdGF0dXMgbm8gdGllbmUgY29ycmVsYWNpb25lcyBtdXkgZnVlcnRlcywgbG8gcXVlIHN1Z2llcmUgcXVlIG5vIGhheSBuaW5nw7puIHByZWRpY3RvciBsaW5lYWwgZG9taW5hbnRlIHkgcXVlIGVsIG1vZGVsbyBwb2Ryw61hIGJlbmVmaWNpYXJzZSBkZSBlbmZvcXVlcyBubyBsaW5lYWxlcyBvIGNvbWJpbmFjaW9uZXMgZGUgbcO6bHRpcGxlcyB2YXJpYWJsZXMuDQoNCiMjIyAxLjYuMyBBbsOhbGlzaXMgZGUgdGFyZ2V0DQoNClRyYXMgaGFjZXIgbGEgY29udmVyc2nDs24gZGUgbG9hbl9zdGF0dXMgYSB2YWxvcmVzIGJpbmFyaW9zLCBzZSBwcm9jZWRpw7MgYSByZWFsaXphciBlbCBhbsOhbGlzaXMgZGUgbGEgZnJlY3VlbmNpYSBkZSBsYXMgY2xhc2VzLg0KDQp8IGxvYW5fc3RhdHVzIHwgQ29udGVvIHwgRnJlY3VlbmNpYSBkZSB2YWxvciB8DQp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IE5hTiAgICAgICAgIHwgNjE4MzMwIHwgNjkuNyUgICAgICAgICAgICAgICB8DQp8IDAgICAgICAgICAgIHwgMjA5NTI2IHwgMjMuNiUgICAgICAgICAgICAgICB8DQp8IDEgICAgICAgICAgIHwgNTg3NjcgIHwgNi42JSAgICAgICAgICAgICAgICB8DQoNCioqVGFibGEgNy4qKiBCYWxhbmNlIGRlIHRhcmdldCBhbnRlcyBkZSBlbGltaW5hciB2YWxvcmVzIE5hTi4NCg0KRW4gbGEgVGFibGEgNyBzZSBtdWVzdHJhbiBsb3MgdmFsb3JlcyBlbiBsYSBjb2x1bW5hIGRlbCB0YXJnZXQgbG9hbl9zdGF0dXMuIENvbW8gc2UgYnVzY2EgcmVhbGl6YXIgZWwgZW50cmVuYW1pZW50byBkZWwgbW9kZWxvLCBhcXVlbGxvcyB2YWxvcmVzIE5hTiBxdWUgZXN0w6FuIGVuIGxhIGNvbHVtbmEgbm8gbm9zIHNlcnZpcsOhbiwgeSBwb3IgbG8gdGFudG8gZXNhcyBmaWxhcyBzZSBlbGltaW5hcsOhbi4NCg0KfCBsb2FuX3N0YXR1cyB8IENvbnRlbyB8IEZyZWN1ZW5jaWEgZGUgdmFsb3IgfA0KfC0tLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAwICAgICAgICAgICB8IDIwOTUyNiB8IDc4LjElICAgICAgICAgICAgICAgfA0KfCAxICAgICAgICAgICB8IDU4NzY3ICB8IDIxLjklICAgICAgICAgICAgICAgfA0KDQoqKlRhYmxhIDguKiogQmFsYW5jZSBkZSB0YXJnZXQgZGVzcHXDqXMgZGUgZWxpbWluYXIgdmFsb3JlcyBOYU4uDQoNCkVuIGxhIFRhYmxhIDggc2UgbXVlc3RyYSBlbCBudWV2byBiYWxhbmNlIGRlIGxvcyB2YWxvcmVzIGRlIGxhcyBjbGFzZXMgZGVzcHXDqXMgZGUgZWxpbWluYXIgbGFzIGZpbGFzIGNvbiBOYU5zIGVuIGVsIHRhcmdldC4NCg0KWWEgc2UgY3VlbnRhIGNvbiB1biB0b3RhbCBkZSAyNjgyOTMgZGUgODg3Mzc5IHF1ZSBzZSB0ZW7DrWFuIGluaWNpYWxtZW50ZSwgbG8gY3VhbCByZXByZXNlbnRhIHVuYSBkaXNtaW51Y2nDs24gY29uc2lkZXJhYmxlIGRlbCA3MCUgZGUgbG9zIGRhdG9zLiBTaW4gZW1iYXJnbywgZGViaWRvIGEgY8OzbW8gc2UgcmVjb21lbmTDsyBjb2RpZmljYXIgZWwgdGFyZ2V0LCBzZSBjb25zaWRlcmEgYXByb3BpYWRvLg0KDQojIyMgMS42LjQgQ29uY2x1c2lvbmVzDQoNCkEgcGFydGlyIGRlIGxvIGFudGVyaW9yLCBzZSBkZXJpdmFyb24gbGFzIHNpZ3VpZW50ZXMgY29uY2x1c2lvbmVzOg0KDQotICAgTGEgdHJhbnNmb3JtYWNpw7NuIGRlbCB0YXJnZXQgYGxvYW5fc3RhdHVzYCBhIHVuYSB2YXJpYWJsZSBiaW5hcmlhIHBlcm1pdGnDsyBkZWZpbmlyIGNvbiBjbGFyaWRhZCBsYXMgY2xhc2VzIHBvc2l0aXZhcyB5IG5lZ2F0aXZhcywgZWxpbWluYW5kbyBhcXVlbGxvcyBjYXNvcyBjb24gZXN0YWRvIGluY2llcnRvLg0KLSAgIExhIG1hdHJpeiBkZSBjb3JyZWxhY2nDs24gcmV2ZWzDsyBxdWUgbm8gZXhpc3RlIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EgY29uIGNvcnJlbGFjacOzbiBmdWVydGUgZGlyZWN0YSBjb24gZWwgdGFyZ2V0LCBsbyBxdWUgc3VnaWVyZSBxdWUgc2UgcmVxdWVyaXLDoW4gbW9kZWxvcyBubyBsaW5lYWxlcyBvIHTDqWNuaWNhcyBkZSBjb21iaW5hY2nDs24gZGUgdmFyaWFibGVzIHBhcmEgdW5hIHByZWRpY2Npw7NuIGVmZWN0aXZhLg0KLSAgIExhIGVsaW1pbmFjacOzbiBkZSByZWdpc3Ryb3MgY29uIHZhbG9yZXMgbnVsb3MgZW4gZWwgdGFyZ2V0IHJlZHVqbyBlbCBkYXRhc2V0IGVuIGFwcm94aW1hZGFtZW50ZSB1biA3MCUsIGxvIGN1YWwgcmVwcmVzZW50YSB1bmEgcMOpcmRpZGEgc2lnbmlmaWNhdGl2YSBkZSBkYXRvcywgcGVybyBlcyBuZWNlc2FyaWEgcGFyYSBnYXJhbnRpemFyIGxhIGNhbGlkYWQgZGVsIGFwcmVuZGl6YWplIHN1cGVydmlzYWRvLg0KLSAgIFRyYXMgbGEgZGVwdXJhY2nDs24sIHNlIGlkZW50aWZpY8OzIHVuIGxldmUgZGVzYmFsYW5jZSBkZSBjbGFzZXMgKDc4LjElIHBvc2l0aXZhcyB2cyAyMS45JSBuZWdhdGl2YXMpLCBsbyBjdWFsIHNlIGRlYmVyw6EgdGVuZXIgZW4gY3VlbnRhIGVuIGVsIGRpc2XDsW8gZGVsIG1vZGVsbyB5IGVuIGxhIHNlbGVjY2nDs24gZGUgbcOpdHJpY2FzIGRlIGV2YWx1YWNpw7NuLg0KDQo8YSBuYW1lPSJpdTExLiI+PC9hPg0KDQojIyAxLjcgQ29uY2x1c2lvbmVzIHBhcnRlIDENCg0KLSAgIFNlIHJlYWxpesOzIHVuYSBsaW1waWV6YSBlc3RydWN0dXJhZGEgZGVsIGRhdGFzZXQsIGVsaW1pbmFuZG8gY29sdW1uYXMgaXJyZWxldmFudGVzLCByZWR1bmRhbnRlcyBvIGNvbiB2YWxvcmVzIGV4Y2VzaXZvcyBudWxvcywgbG8gcXVlIHBlcm1pdGnDsyByZWR1Y2lyIGxhIGRpbWVuc2lvbmFsaWRhZCB5IGZhY2lsaXRhciBmdXR1cm9zIGFuw6FsaXNpcy4NCi0gICBBIHRyYXbDqXMgZGVsIGFuw6FsaXNpcyBkZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzLCBzZSBpZGVudGlmaWNhcm9uIHBhdHJvbmVzIGRlIGZyZWN1ZW5jaWEgZXNwZXJhYmxlcyBlbiBhdHJpYnV0b3MgY29tbyB0ZXJtLCBncmFkZSwgaG9tZV9vd25lcnNoaXAgeSBwdXJwb3NlLCBsbyBjdWFsIGFwb3J0YSBjb250ZXh0byByZWxldmFudGUgcGFyYSBsYSBwb3N0ZXJpb3IgY29uc3RydWNjacOzbiBkZWwgbW9kZWxvLg0KLSAgIEVsIGFuw6FsaXNpcyBkZSBjb3JyZWxhY2nDs24gZXZpZGVuY2nDsyBxdWUgbXVjaGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIHRpZW5lbiBiYWphIGNvcnJlbGFjacOzbiBlbnRyZSBzw60geSBjb24gZWwgdGFyZ2V0LCBsbyBxdWUgcmVkdWNlIGVsIHJpZXNnbyBkZSBtdWx0aWNvbGluZWFsaWRhZCBwZXJvIHRhbWJpw6luIHN1Z2llcmUgcXVlIGVsIHByb2JsZW1hIG5vIHNlcsOhIGbDoWNpbG1lbnRlIHJlc3VlbHRvIHBvciBtb2RlbG9zIGxpbmVhbGVzIHNpbXBsZXMuDQotICAgTGEgdHJhbnNmb3JtYWNpw7NuIGRlbCB0YXJnZXQgbG9hbl9zdGF0dXMgYSB1bmEgdmFyaWFibGUgYmluYXJpYSAoMDogcG9zaXRpdm8sIDE6IG5lZ2F0aXZvKSBwZXJtaXRpw7MgZXN0cnVjdHVyYXIgZWwgcHJvYmxlbWEgY29tbyB1bmEgY2xhc2lmaWNhY2nDs24gc3VwZXJ2aXNhZGEgYmluYXJpYSwgZWxpbWluYW5kbyBjYXNvcyBjb24gZXN0YXR1cyBpbmRlZmluaWRvLg0KLSAgIExhIGRlcHVyYWNpw7NuIGRlbCB0YXJnZXQgaW1wbGljw7MgdW5hIHDDqXJkaWRhIHNpZ25pZmljYXRpdmEgZGUgZGF0b3MgKDcwJSksIHBlcm8gc2UgY29uc2lkZXLDsyBuZWNlc2FyaWEgcGFyYSBhc2VndXJhciBsYSBjb2hlcmVuY2lhIHkgY29uZmlhYmlsaWRhZCBkZWwgbW9kZWxvIHByZWRpY3Rpdm8uDQotICAgRWwgY29uanVudG8gZmluYWwgcHJlc2VudGEgdW4gbGV2ZSBkZXNiYWxhbmNlIGRlIGNsYXNlcywgbG8gcXVlIGRlYmUgc2VyIHRyYXRhZG8gYWRlY3VhZGFtZW50ZSBlbiBsYSBldGFwYSBkZSBtb2RlbGFkbyBtZWRpYW50ZSB0w6ljbmljYXMgY29tbyBlbCB1c28gZGUgbcOpdHJpY2FzIGFwcm9waWFkYXMgbyBiYWxhbmNlbyBkZSBkYXRvcy4NCg0KWWEgY29uIGVsIGRhdGFzZXQgbGltcGlvLCBzZSBwcm9jZWRlIGEgbGEgc2VjY2nDs24gZGVkaWNhZGEgYSBsYSBpbmdlbmllcsOtYSBkZSBmZWF0dXJlcy4NCg0KPGEgbmFtZT0iaXUxMi4iPjwvYT4NCg0KIyBQYXJ0ZSAyLiBJbmdlbmllcsOtYSBkZSBGZWF0dXJlcw0KDQpBIGNvbnRpbnVhY2nDs24gc2UgcHJlc2VudGEgdW5hIHPDrW50ZXNpcyBkZSBsbyByZWFsaXphZG8gZW4gZWwgcHJvY2VzbyBkZSBpbmdlbmllcsOtYSBkZSBmZWF0dXJlcy4gVG9kbyBlbCBjw7NkaWdvIGNvbiBsb3MgZGV0YWxsZXMgZGUgaW1wbGVtZW50YWNpw7NuIHNlIHB1ZWRlIGVuY29udHJhciBlbiBlbCBhcmNoaXZvIHBvY19GZWF0dXJlRW5naW5lZXJpbmcuaXB5bmIgZW4gZWwgcmVwb3NpdG9yaW8gZGVsIHByb3llY3RvLg0KDQo8YSBuYW1lPSJpdTEzLiI+PC9hPg0KDQojIyAyLjEgT2JqZXRpdm9zDQoNClVuYSB2ZXogY29uIGVsIGRhdGFzZXQgbG8gc3VmaWNpZW50ZW1lbnRlIGxpbXBpbywgc2UgcHJvY2VkZXLDoSBhIHByZXByb2Nlc2FyIGVzdG9zIGRhdG9zIHBhcmEgcG9kZXIgcmVhbGl6YXIgZWwgZW50cmVuYW1pZW50byBkZSBsb3MgbW9kZWxvcy4gU2UgdGVuZHLDoW4gbG9zIHNpZ3VpZW50ZXMgb2JqZXRpdm9zOg0KDQotICAgQ29kaWZpY2FyIGxhcyBjb2x1bW5hcyBubyBudW3DqXJpY2FzIGRlIGFjdWVyZG8gYSBzdSBuYXR1cmFsZXphIGNhdGVnw7NyaWNhIHUgb3JkaW5hbCwgeSBkZSBhY3VlcmRvIGEgbGEgY2FyZGluYWxpZGFkIGRlIGNhZGEgdW5hLg0KDQotICAgSW1wdXRhciB2YWxvcmVzIG51bGxzIHBhcmEgdmFyaWFibGVzIG51bcOpcmljYXMgcXVlIGxvIHBlcm1pdGFuLg0KDQotICAgRXNjYWxhciBsb3MgZGF0b3MgbnVtw6lyaWNvcyBwYXJhIG1pdGlnYXIgZWwgZWZlY3RvIGRlIGxhcyBhbm9tYWzDrWFzIGVuIGVsIG1vZGVsby4NCg0KPGEgbmFtZT0iaXUxNC4iPjwvYT4NCg0KIyMgMi4yIFRyYXRhbWllbnRvIGRlIGNvbHVtbmFzIG51bcOpcmljYXMNCg0KIyMjIDIuMi4xIEltcHV0YWNpw7NuIGRlIG51bGxzDQoNClBhcmEgbGEgaW1wdXRhY2nDs24gZGUgbnVsbHMsIHNlIG9wdMOzIHBvciB1dGlsaXphciB1biBTaW1wbGVJbXB1dGVyIGRlIGxhIGhlcnJhbWllbnRhIHNrbGVhcm4sIGVsIGN1YWwgcGVybWl0ZSByZWFsaXphciBpbXB1dGFjacOzbiBkZSBudWxscyBzZW5jaWxsYSB1dGlsaXphbmRvIGxhIG1lZGlhLCBtZWRpYW5hIG8gZWwgdmFsb3IgbcOhcyBmcmVjdWVudGUuIFBhcmEgZXN0ZSBjYXNvLCBzZSBvcHTDsyBwb3IgaW1wdXRhciB1dGlsaXphbmRvIGVsIHZhbG9yIGRlIGxhIG1lZGlhIHBhcmEgY2FkYSBjb2x1bW5hIG51bcOpcmljYS4NCg0KRXN0byBzZSBoaXpvIHBhcmEgcG9kZXIgdmVyaWZpY2FyIGPDs21vIHNlIGNvbXBvcnRhYmEgZWwgbW9kZWxvIGNvbiBlc3RlIHRpcG8gZGUgaW1wdXRhY2nDs24uIFNpIHNlIG5vdGFiYSBxdWUgbGFzIG3DqXRyaWNhcyBubyBlcmFuIGxhcyBkZXNlYWRhcyBhIGxhIGhvcmEgZGUgZXZhbHVhciBlbCBtb2RlbG8sIHNlIHZvbHZlcsOtYSBhcXXDrSBhIGNhbWJpYXIgbGEgdMOpY25pY2EgZGUgaW1wdXRhY2nDs24uIFNpbiBlbWJhcmdvLCBkZSBsb3MgcmVzdWx0YWRvcyBkZWwgbW9kZWxhZG8gc2UgY29uY2x1ecOzIHF1ZSBlc3RvIGVyYSBzdWZpY2llbnRlLg0KDQojIyMgMi4yLjIgRXNjYWxhZG8gZGUgZGF0b3MNCg0KUGFyYSBlbCBlc2NhbGFkbyBkZSBkYXRvcywgc2Ugb3B0w7MgcG9yIHV0aWxpemFyIGVsIGVzY2FsYWRvciBSb2J1c3RTY2FsZXIgZGUgc2tsZWFybiwgeWEgcXVlIGFwbGljYSB1biBlc2NhbGFkbyBxdWUgZXMgbcOhcyByb2J1c3RvIGEgbG9zIHZhbG9yZXMgYXTDrXBpY29zLiBTZWfDum4gKEludGVyYWN0aXZlIENoYW9zLHMuZi4sIFJvYnVzdCBTY2FsZXIpLCByZWFsaXphIGRvcyBwYXNvcyBwcmluY2lwYWxlczoNCg0KMS4gIENhbGN1bGEgbGEgbWVkaWFuYSB5IGVsIHJhbmdvIGludGVyY3VhcnRpbCAoSVFSKSBkZSBjYWRhIGNhcmFjdGVyw61zdGljYSBlbiBlbCBjb25qdW50byBkZSBkYXRvcyAoZWwgSVFSIGVzIGxhIGRpZmVyZW5jaWEgZW50cmUgZWwgcGVyY2VudGlsIDc1IHkgZWwgcGVyY2VudGlsIDI1IGRlIGxvcyBkYXRvcykuDQoyLiAgVXRpbGl6YSBsYSBtZWRpYW5hIHkgZWwgSVFSIGRlIGNhZGEgY2FyYWN0ZXLDrXN0aWNhIHBhcmEgZXNjYWxhciBsb3MgZGF0b3MuDQoNCkVuIGNhc28gZGUgdmVyIHF1ZSBlbCBtb2RlbG8gbm8gdGllbmUgbcOpdHJpY2FzIGZhdm9yYWJsZXMsIHNlIGNhbWJpYXLDrWEuIFNpbiBlbWJhcmdvLCBhIHBhcnRpciBkZSBsb3MgcmVzdWx0YWRvcyBkZWwgbW9kZWxhZG8gc2UgY29uY2x1ecOzIHF1ZSBlc3RhIG9wY2nDs24gZXJhIHN1ZmljaWVudGUuDQoNCjxhIG5hbWU9Iml1MTUuIj48L2E+DQoNCiMjIDIuMyBUcmF0YW1pZW50byBkZSBjb2x1bW5hcyBubyBudW3DqXJpY2FzDQoNCiMjIyAyLjMuMSBUcmFuc2Zvcm1hY2nDs24gZGUgdmFyaWFibGVzIG9yZGluYWxlcw0KDQpBIHBhcnRpciBkZSBsYSBUYWJsYSA0LCBzZSBwdWRpZXJvbiBpZGVudGlmaWNhciBxdWUgbGFzIHZhcmlhYmxlcyBvcmRpbmFsZXMgYSBjb2RpZmljYXIgZXJhbiBzdWJfZ3JhZGUgeSBlbXBfbGVuZ3RoIHJlc3BlY3RpdmFtZW50ZS4NCg0KUGFyYSBjb2RpZmljYXIgYSBzdWJfZ3JhZGUsIGRhZG8gcXVlIHNlIHRyYXRhYmEgZGUgdW5hICJub3RhIiBzaW1pbGFyIGEgdW5hIG5vdGEgYWNhZMOpbWljYSwgc2Ugb3B0w7MgcG9yIGludGVudGFyIGNvZGlmaWNhcmxhIGRlIHVuYSBmb3JtYSBzaW1pbGFyIGEgY29tbyBzZSBjYWxpZmljYSBkZWwgMSBhbCA1IGVuIGxvcyBzaXN0ZW1hcyBlZHVjYXRpdm9zIGNvbG9tYmlhbm9zLiBTaW4gZW1iYXJnbywgYWwgdHJhdGFyc2UgZGUgNyBub3RhcyBtYXlvcmVzIChBLCBCLCBDLCBELCBFLCBGIHkgRyksIGxhIGNhbGlmaWNhY2nDs24gYWhvcmEgc2Vyw61hIGRlbCAxIGFsIDcuIFBvciBvdHJvIGxhZG8sIGNhZGEgdmFsb3IgZXN0YWJhIGFjb21wYcOxYWRvIGRlIHVuIG7Dum1lcm8gZGVsIDEgYWwgNSwgcG9yIGxvIHF1ZSBzZSBvcHTDsyBwb3JxdWUgZXN0b3MgdmFsb3JlcyByZXByZXNlbnRhcmFuIGNpZXJ0YSBmcmFjY2nDs24gZGVudHJvIGRlIGxhIG5vdGEgbWF5b3IuDQoNClNlIGNvZGlmaWPDsyB1dGlsaXphbmRvIGxhIHNpZ3VpZW50ZSBmdW5jacOzbjoNCg0KYGBge3B5dGhvbn0NCmRlZiBzdWJfZ3JhZGVfbWFwcGVyKHZhbCk6DQogICAgdmFsID0gc3RyKHZhbCkNCiAgICBncmFkZV9tYXBwaW5nID0gew0KICAgICAgICAiQSI6IDcsDQogICAgICAgICJCIjogNiwNCiAgICAgICAgIkMiOiA1LA0KICAgICAgICAiRCI6IDQsDQogICAgICAgICJFIjogMywNCiAgICAgICAgIkYiOiAyLA0KICAgICAgICAiRyI6IDENCiAgICB9DQogICAgbnVtX21hcHBpbmcgPSB7DQogICAgICAgICIxIjogMC44LA0KICAgICAgICAiMiI6IDAuNiwNCiAgICAgICAgIjMiOiAwLjQsDQogICAgICAgICI0IjogMC4yLA0KICAgICAgICAiNSI6IDAuMA0KICAgIH0NCiAgICBudW1fdmFsID0gZ3JhZGVfbWFwcGluZ1t2YWxbMF1dICsgbnVtX21hcHBpbmdbdmFsWzFdXQ0KICAgIHJldHVybiBudW1fdmFsDQpgYGANCg0KUGFyYSBsYSBjb2x1bW5hIGVtcF9sZW5ndGgsIHNlIG9wdMOzIHBvciB1dGlsaXphciBsYSBjbGFzZSBPcmRpbmFsRW5jb2RlciB5IHN1cyBtw6l0b2RvcyBwYXJhIGNvZGlmaWNhcmxhIGRlIGFjdWVyZG8gYWwgc2lndWllbnRlIG9yZGVuOg0KDQoxLiAgIlVua25vd24iOiBFc3RvcyBzb24gbG9zIHZhbG9yZXMgcXVlIGVzdGFiYW4gY29tbyBOYU4gZW4gZXN0YSBjb2x1bW5hLg0KMi4gICJcPCAxIHllYXIiDQozLiAgIjEgeWVhciINCjQuICAiMiB5ZWFycyINCjUuICAiMyB5ZWFycyINCjYuICAiNCB5ZWFycyINCjcuICAiNSB5ZWFycyINCjguICAiNiB5ZWFycyINCjkuICAiNyB5ZWFycyINCjEwLiAiOCB5ZWFycyINCjExLiAiOSB5ZWFycyINCjEyLiAiMTArIHllYXJzIg0KDQpTZSB1dGlsaXrDsyBsYSBzaWd1aWVudGUgcG9yY2nDs24gZGUgY8OzZGlnbyBwYXJhIGhhY2VybG86DQoNCmBgYHtweXRob259DQpvcmRlcmVkX3ZhbHMgPSBbDQogICAgIlVua25vd24iLCANCiAgICAiPCAxIHllYXIiLCANCiAgICAiMSB5ZWFyIiwgDQogICAgIjIgeWVhcnMiLCANCiAgICAiMyB5ZWFycyIsIA0KICAgICI0IHllYXJzIiwgDQogICAgIjUgeWVhcnMiLCANCiAgICAiNiB5ZWFycyIsIA0KICAgICI3IHllYXJzIiwgDQogICAgIjggeWVhcnMiLCANCiAgICAiOSB5ZWFycyIsIA0KICAgICIxMCsgeWVhcnMiDQpdDQpvcmRpbmFsX2VuY29kZXIgPSBPcmRpbmFsRW5jb2RlcihjYXRlZ29yaWVzPVtvcmRlcmVkX3ZhbHNdKQ0KZGZbImVtcF9sZW5ndGgiXSA9IG9yZGluYWxfZW5jb2Rlci5maXRfdHJhbnNmb3JtKGRmW1siZW1wX2xlbmd0aCJdXSkNCmBgYA0KDQojIyMgMi4zLjIgVHJhbnNmb3JtYWNpw7NuIGRlIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgY29uIGJhamEgY2FyZGluYWxpZGFkDQoNCkVuIGN1YW50byBhIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIHF1ZSBjb250YWJhbiBjb24gYmFqYSBjYXJkaW5hbGlkYWQsIGVzIGRlY2lyLCBjb24gcG9jb3MgdmFsb3JlcyDDum5pY29zLCBzZSBvcHTDsyBwb3IgY29kaWZpY2FybG9zIHV0aWxpemFuZG8gbGEgdMOpY25pY2EgT25lLUhvdCwgdXNhbmRvIGxhcyBoZXJyYW1pZW50YXMgZGUgcGFuZGFzIHBhcmEgZXN0by4NCg0KTGFzIGNvbHVtbmFzIGlkZW50aWZpY2FkYXMgY29tbyBhcHRhcyBwYXJhIGxhIGltcGxlbWVudGFjacOzbiBkZSBlc3RhIHTDqWNuaWNhIGRlIGFjdWVyZG8gYSBsYSByZXZpc2nDs24gZGUgbGEgVGFibGEgNCBmdWVyb246IHRlcm0sIGhvbWVfb3duZXJzaGlwLCB2ZXJpZmljYXRpb25fc3RhdHVzLCBpbml0aWFsX2xpc3Rfc3RhdHVzIHkgcHVycG9zZS4NCg0KU2UgY29kaWZpY2Fyb24gdXRpbGl6YW5kbyBsYSBzaWd1aWVudGUgcG9yY2nDs24gZGUgY8OzZGlnbzoNCg0KYGBge3B5dGhvbn0NCmNhdGVnX2NvbHNfb25laG90ID0gWw0KICAgICJ0ZXJtIiwNCiAgICAiaG9tZV9vd25lcnNoaXAiLA0KICAgICJ2ZXJpZmljYXRpb25fc3RhdHVzIiwNCiAgICAiaW5pdGlhbF9saXN0X3N0YXR1cyIsDQogICAgInB1cnBvc2UiDQpdDQoNCmRmID0gcGQuZ2V0X2R1bW1pZXMoZGYsIGNvbHVtbnM9Y2F0ZWdfY29sc19vbmVob3QpDQpgYGANCg0KIyMjIDIuMy4zIFRyYW5zZm9ybWFjacOzbiBkZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGNvbiBhbHRhIGNhcmRpbmFsaWRhZA0KDQpQYXJhIGVsIGNhc28gZGUgbGEgdmFyaWFibGUgYWRkcl9zdGF0ZSwgbGEgY3VhbCBzZSBjb25zaWRlcsOzIHF1ZSB0ZW7DrWEgdW5hIGFsdGEgY2FyZGluYWxpZGFkIGFsIGNvbnRhciBjb24gNTEgdmFsb3JlcyDDum5pY29zLCBzZSBvcHTDsyBwb3IgdXRpbGl6YXIgZWwgbcOpdG9kbyBkZSBIYXNoaW5nIGVuY29kaW5nLCBlbCBjdWFsIGVzIHJlY29tZW5kYWRvIHBhcmEgdmFyaWFibGVzIGNvbiBhbHRhIGNhcmRpbmFsaWRhZCAoU3dheWFtLCAyMDIzKS4NCg0KU2UgdXRpbGl6w7MgbGEgc2lndWllbnRlIHBvcmNpw7NuIGRlIGPDs2RpZ28gcGFyYSBlc3RvOg0KDQpgYGB7cHl0aG9ufQ0KaGFzaGluZ19lbmNvZGVyID0gSGFzaGluZ0VuY29kZXIoY29scz1bImFkZHJfc3RhdGUiXSwgbl9jb21wb25lbnRzPTgpDQogICAgDQpoYXNoZWQgPSBoYXNoaW5nX2VuY29kZXIuZml0X3RyYW5zZm9ybShkZltbImFkZHJfc3RhdGUiXV0pDQogICAgDQpoYXNoZWQuY29sdW1ucyA9IFtmImFkZHJfc3RhdGVfaGFzaF97aX0iIGZvciBpIGluIHJhbmdlKGhhc2hlZC5zaGFwZVsxXSldDQogICAgDQpkZiA9IGRmLmRyb3AoY29sdW1ucz1bImFkZHJfc3RhdGUiXSkuam9pbihoYXNoZWQpDQpgYGANCg0KPGEgbmFtZT0iaXUxNi4iPjwvYT4NCg0KIyMgMi40IENvbmNsdXNpb25lcyBwYXJ0ZSAyDQoNClRyYXMgaGFiZXIgcmVhbGl6YWRvIHRvZG8gZWwgcHJlcHJvY2VzYW1pZW50byBhZGVjdWFkbyBkZSBsb3MgZGF0b3MgeSBoYWJlciBnZW5lcmFkbyB1biBudWV2byBkYXRhc2V0IGNvbiB0b2RvcyBlc3RvcyBkYXRvcyB0cmF0YWRvcywgc2Ugc2FjYXJvbiBsYXMgc2lndWllbnRlcyBjb25jbHVzaW9uZXMgeSBhcHJlbmRpemFqZXM6DQoNCi0gICBTZSBpbXBsZW1lbnRhcm9uIHTDqWNuaWNhcyBhZGVjdWFkYXMgZGUgcHJlcHJvY2VzYW1pZW50byBwYXJhIHByZXBhcmFyIGxvcyBkYXRvcyBwYXJhIGVsIHNpZ3VpZW50ZSBwcm9jZXNvIGRlIG1vZGVsYWRvLCBpbXBsZW1lbnRhbmRvIHTDqWNuaWNhcyBkZSBpbXB1dGFjacOzbiwgZXNjYWxhZG8geSBjb2RpZmljYWNpw7NuIGRlIHZhcmlhYmxlcyBubyBudW3DqXJpY2FzLg0KDQotICAgVW5hIHZhcmlhYmxlIG9yZGluYWwgcHVlZGUgc2VyIGNvZGlmaWNhZGEgdGFudG8gbWFudWFsbWVudGUgKHNpIHNlIHZlIHVuIHBhcmFsZWxvIGNsYXJvIHkgdW5hIGZvcm1hIGRlIGltcGxlbWVudGFjacOzbiBjb25jaXNhKSBjb21vIGFwb3nDoW5kb3NlIGVuIGhlcnJhbWllbnRhcyBlc3BlY2lhbGl6YWRhcyBlbiBjb2RpZmljYWNpw7NuLCBjb21vIGxvIHNvbiBsYXMgaGVycmFtaWVudGFzIHF1ZSBicmluZGEgU0tsZWFybi4NCg0KLSAgIFNlIGxvZ3LDsyB1bmEgdHJhbnNmb3JtYWNpw7NuIGRlbCBkYXRhc2V0IHF1ZSBzZSBjb25zaWRlcmEgbG8gc3VmaWNpZW50ZW1lbnRlIGNvaGVyZW50ZSwgZXNjYWxhZGEgeSBjb21wbGV0YW1lbnRlIG51bcOpcmljYSBjb21vIHBhcmEgcGFzYXIgYSBsYSBzaWd1aWVudGUgZmFzZSBkZSBtb2RlbGFkby4NCg0KPGEgbmFtZT0iaXUxNy4iPjwvYT4NCg0KIyBQYXJ0ZSAzLiBNb2RlbGFkbw0KDQpBIGNvbnRpbnVhY2nDs24gc2UgcHJlc2VudGEgdW5hIHPDrW50ZXNpcyBkZSBsbyByZWFsaXphZG8gZW4gZWwgcHJvY2VzbyBkZSBtb2RlbGFkby4gVG9kbyBlbCBjw7NkaWdvIGNvbiBsb3MgZGV0YWxsZXMgZGUgaW1wbGVtZW50YWNpw7NuIHNlIHB1ZWRlIGVuY29udHJhciBlbiBlbCBhcmNoaXZvIHBvY19Nb2RlbGluZy5pcHluYiBlbiBlbCByZXBvc2l0b3JpbyBkZWwgcHJveWVjdG8uDQoNCjxhIG5hbWU9Iml1MTguIj48L2E+DQoNCiMjIDMuMSBPYmpldGl2b3MNCg0KWWEgY29udGFuZG8gY29uIHVuIGRhdGFzZXQgbGlzdG8gcGFyYSBlbCBlbnRyZW5hbWllbnRvIGRlIG1vZGVsb3MgZGUgZGVlcCBsZWFybmluZyB5IGNsYXNpZmljYWNpw7NuIGJpbmFyaWEsIHNlIGVzcGVyYSBjdW1wbGlyIGNvbiBsb3Mgc2lndWllbnRlcyBvYmpldGl2b3M6DQoNCi0gICBSZWFsaXphciB1bmEgZGl2aXNpw7NuIGFwcm9waWFkYSBkZWwgZGF0YXNldCBwYXJhIGVudHJlbmFyIHkgdmFsaWRhciBlbCBtb2RlbG8sIGNvbmNyZXRhbWVudGUgdW4gNzAlIHBhcmEgZW50cmVuYW1pZW50byB5IHVuIDMwJSBwYXJhIGxhIGV2YWx1YWNpw7NuLg0KDQotICAgRW50cmVuYXIgdW4gbW9kZWxvIHNpbXBsZSBkZSBYR0Jvb3N0IHBhcmEgdGVuZXJsbyBjb21vIHB1bnRvIGRlIGNvbXBhcmFjacOzbiB2cyBsb3MgbW9kZWxvcyBtdWx0aXBlcmNlcHRyb24gYSBkZWZpbmlyLg0KDQotICAgRW50cmVuYXIgZG9zIG1vZGVsb3MgbXVsdGlwZXJjZXB0cm9uIGNvbiB2YXJpYXMgdmFyaWFjaW9uZXMgZGUgYXJxdWl0ZWN0dXJhIHBhcmEgY29tcGFyYXIgY8OzbW8gZXMgZWwgaW1wYWN0byBkZSBlc3RvcyBjYW1iaW9zIGVuIGxvcyB2YWxvcmVzIG9iamV0aXZvcyBwYXJhIGxhcyBtw6l0cmljYXMgZGVsIG1vZGVsYWRvLg0KDQo8YSBuYW1lPSJpdTE5LiI+PC9hPg0KDQojIyAzLjIgVHJhaW4tVGVzdCBzcGxpdA0KDQpQYXJhIGhhY2VyIGVsIHNwbGl0IGRlIGxvcyBkYXRvcywgc2Ugb3B0w7MgcG9yIHV0aWxpemFyIHVuYSBwcm9wb3JjacOzbiBkZWwgNzAlIHBhcmEgZWwgZW50cmVuYW1pZW50byB5IHVuIDMwJSBwYXJhIGVsIHRlc3RlbywgZWwgY3VhbCBlcyB1bmEgcHJvcG9yY2nDs24gZXN0w6FuZGFyIGVuIG1hY2hpbmUgbGVhcm5pbmcgKFN0b2ppbGprb3ZpYywgMjAyNSkuDQoNClNlIGhpem8gZWwgc3BsaXQgdXRpbGl6YW5kbyBsYSBzaWd1aWVudGUgcG9yY2nDs24gZGUgY8OzZGlnbzoNCg0KYGBge3B5dGhvbn0NCnkgPSBkZlsibG9hbl9zdGF0dXMiXS5hc3R5cGUoaW50KQ0KWCA9IGRmLmRyb3AoY29sdW1ucz1bImxvYW5fc3RhdHVzIl0pDQpYX3RyYWluLCBYX3Rlc3QsIHlfdHJhaW4sIHlfdGVzdCA9IHRyYWluX3Rlc3Rfc3BsaXQoDQogICAgWCwgeSwNCiAgICB0ZXN0X3NpemUgPSAwLjMsDQogICAgcmFuZG9tX3N0YXRlID0gMzUsDQogICAgc3RyYXRpZnkgPSB5LA0KICAgIHNodWZmbGU9VHJ1ZQ0KKQ0KYGBgDQoNCjxhIG5hbWU9Iml1MjAuIj48L2E+DQoNCiMjIDMuMy4gTW9kZWxvIDE6IFhHQm9vc3QNCg0KWEdCb29zdCBlcyB1bmEgbGlicmVyw61hIGRlIGPDs2RpZ28gYWJpZXJ0byBxdWUgZW1wbGVhIMOhcmJvbGVzIGRlIGRlY2lzaW9uZXMgcG90ZW5jaWFkb3MgcG9yIGdyYWRpZW50ZS4gKElCTSwgMjAyNCkuIFN1ZWxlIHNlciBtdXkgdmVsb3ogeSBlZmljaWVudGUgY29uIGNvbmp1bnRvcyBncmFuZGVzIGRlIGRhdG9zLiBTdWVsZSBzZXIgbXV5IHV0aWxpemFkbyBlbiBwcm9ibGVtYXMgZGUgY2xhc2lmaWNhY2nDs24geSByZWdyZXNpw7NuLg0KDQojIyMgMy4zLjEgRGVmaW5pY2nDs24gZGVsIG1vZGVsbw0KDQpFbCBtb2RlbG8gdXRpbGl6YWRvIHNlIGRlZmluacOzIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNCmBgYHtweXRob259DQp4Z2JfY2xhc3NpZmllciA9IFhHQkNsYXNzaWZpZXIoDQogICAgb2JqZWN0aXZlPSdtdWx0aTpzb2Z0bWF4JywgIyANCiAgICBudW1fY2xhc3M9MiwgICAgICAgDQogICAgbl9lc3RpbWF0b3JzPTUwMCwgICAgICAgICAgDQogICAgbGVhcm5pbmdfcmF0ZT0wLjEsICAgICAgICAgDQogICAgbWF4X2RlcHRoPTMsICAgICAgICAgICAgICAgDQogICAgc3Vic2FtcGxlPTAuOCwgICAgICAgICAgICAgDQogICAgY29sc2FtcGxlX2J5dHJlZT0wLjgsICAgICAgDQogICAgZ2FtbWE9MCwgICAgICAgICAgICAgICAgICAgDQogICAgcmVnX2xhbWJkYT0xLCAgICAgICAgICAgICAgDQogICAgdXNlX2xhYmVsX2VuY29kZXI9RmFsc2UsICAgDQogICAgZXZhbF9tZXRyaWM9J21sb2dsb3NzJywgICAgDQogICAgcmFuZG9tX3N0YXRlPTM1LA0KICAgIG5fam9icz0tMSAgICAgICAgICAgICAgICAgDQopDQpgYGANCg0KQSBjb250aW51YWNpw7NuIGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyByZWNvZ2lkYXMgcGFyYSBkZWZpbmlyIGVsIG1vZGVsbzoNCg0KLSAgIFNlIG9wdMOzIHBvciB1dGlsaXphciB1biBvYmpldGl2byBtdWx0aWNsYXNlIHBhcmEgcG9kZXIgdmVyIGPDs21vIGFmZWN0YWJhIGVzdG8gYSBsYSBjYWxpZGFkIGRlbCBtb2RlbG8sIHNhYmllbmRvIHF1ZSBsYSB0YXJlYSBlbiBjdWVzdGnDs24gZXMgZGUgY2xhc2lmaWNhY2nDs24gYmluYXJpYS4NCg0KLSAgIFNlIG9wdMOzIHBvciB1dGlsaXphciB1biBuw7ptZXJvIHJlbGF0aXZhbWVudGUgYWx0byBkZSBlc3RpbWFkb3JlcyBwYXJhIGdhcmFudGl6YXIgdGVuZXIgdW4gZGVzZW1wZcOxbyBkZXNjZW50ZSBkZWwgbW9kZWxvLCBjb25zaWRlcmFuZG8gcXVlIHNlIHRpZW5lIHVuIGFsdG8gbsO6bWVybyBkZSBmZWF0dXJlcy4NCg0KLSAgIFNlIG9wdMOzIHBvciB1biB2YWxvciBiYWpvIGRlIGxhIHRhc2EgZGUgYXByZW5kaXphamUgcGFyYSB0ZW5lciB1biBtb2RlbG8gbcOhcyByb2J1c3RvLg0KDQotICAgU2Ugb3B0w7MgcG9yIHVuYSBwcm9mdW5kaXphY2nDs24gZGUgMyBwYXJhIGV2aXRhciBzb2JyZWFqdXN0ZSB5IGF5dWRhciBhbCBtb2RlbG8gY29uIGxhIGdlbmVyYWxpemFjacOzbi4NCg0KLSAgIFNlIGludHJvZHVjZSB1bmEgcHJvcG9yY2nDs24gZGUgbXVlc3RyYXMgYWxlYXRvcmlhcyBkZSA4MCUgcGFyYSByZWR1Y2lyIGVsIHNvYnJlYWp1c3RlLg0KDQotICAgU2UgaW50cm9kdWNlIHVuYSBwcm9wb3JjacOzbiBkZSBmZWF0dXJlcyBwYXJhIGxhIGNvbnN0cnVjY2nDs24gZGUgbG9zIMOhcmJvbGVzIGRlIDAuOCBwYXJhIHJlZHVjaXIgZWwgc29icmUgYWp1c3RlLg0KDQotICAgU2UgbGUgcGFzYSB1biBnYW1tYSBpZ3VhbCBhIDAgcGFyYSBkYXJsZSBhbGdvIGRlIGZsZXhpYmlsaWRhZCBhbCBtb2RlbG8uDQoNCi0gICBTZSBvcHTDsyBwb3IgdXRpbGl6YXIgbXVsdGkgbG9nIGxvc3MgcGFyYSBsYSBmdW5jacOzbiBkZSBww6lyZGlkYSwgbGEgY3VhbCBlcyB2w6FsaWRhIHRhbnRvIHBhcmEgcHJvYmxlbWFzIG11bHRpY2xhc2UgY29tbyBkZSBjbGFzaWZpY2FjacOzbiBiaW5hcmlhLg0KDQojIyMgMy4zLjIgRXZhbHVhY2nDs24NCg0KTG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIGVuIGVsIGNvbmp1bnRvIGRlIGVudHJlbmFtaWVudG8gc2UgcmVzdW1lbiBlbiBsYSBzaWd1aWVudGUgdGFibGEgZ2VuZXJhZGEgcG9yIGVsIGPDs2RpZ28gZW5jYXJnYWRvIGRlIHJlYWxpemFyIGxhIGV2YWx1YWNpw7NuOg0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC00MTI5MDgzNDczLnBuZykNCg0KKipGaWd1cmEgNC4qKiBUYWJsYSBkZSByZXN1bHRhZG9zIGRlIFhHQm9vc3QgZW4gZWwgY29uanVudG8gZGUgZW50cmVuYW1pZW50bw0KDQpEZSBpZ3VhbCBmb3JtYSwgYSBjb250aW51YWNpw7NuIHNlIHRpZW5lIGxhIHRhYmxhIHJlc3BlY3RpdmEgcGFyYSBlbCBjb25qdW50byBkZSB0ZXN0aW5nLg0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC02MDkwMzYzNjUucG5nKQ0KDQoqKkZpZ3VyYSA1LioqIFRhYmxhIGRlIHJlc3VsdGFkb3MgZGUgWEdCb29zdCBlbiBlbCBjb25qdW50byBkZSB0ZXN0aW5nDQoNCiMjIyAzLjMuMy4gQ29uY2x1c2lvbmVzIG1vZGVsYWRvIFhHQm9vc3QNCg0KRGUgbG9zIGFudGVyaW9yZXMgcmVzdWx0YWRvcyBzZSBvYnR1dmllcm9uIGxhcyBzaWd1aWVudGVzIGNvbmNsdXNpb25lcyB5IGFwcmVuZGl6YWplczoNCg0KLSAgIFNvcnByZW5kZW50ZW1lbnRlLCBlbCBtb2RlbG8gdHV2byByZXN1bHRhZG9zIGV4Y2VsZW50ZXMgZW4gYW1ib3MgY29uanVudG9zIGRlIGRhdG9zLiBFc3RvIGVzIGFsZ28gc29zcGVjaG9zbywgZGViaWRvIGEgcXVlIHB1ZWRlIGhhYmVyIHVuYSBhbHRhIHByb2JhYmlsaWRhZCBkZSBkYXRhIGxlYWthZ2UgZGViaWRvIGEgbGEgZmFsdGEgZGUgcmV2aXNpw7NuIGVuIGFsZ8O6biBwdW50byBkdXJhbnRlIGxhIGxpbXBpZXphIGRlIGxvcyBkYXRvcy4NCg0KPGEgbmFtZT0iaXUyMS4iPjwvYT4NCg0KIyMgMy40LiBNb2RlbG8gMjogWEdCb29zdCB0cmFzIHJlc29sdmVyIHByb2JsZW1hIGRlIGRhdGEgbGVha2FnZQ0KDQpEZWJpZG8gYSBsbyBhbnRlcmlvciwgaGl6byBmYWx0YSByZXZpc2FyIG51ZXZhbWVudGUgbGFzIGNvbHVtbmFzIHV0aWxpemFkYXMgcGFyYSB2ZXJpZmljYXIgcXVlIG5vIGh1YmllcmEgbmluZ3VuYSBmdWdhIGRlIGRhdG9zLCBlcyBkZWNpciwgcXVlIG5vIGh1YmllcmEgbmluZ3VuYSBjb2x1bW5hIHF1ZSBubyBkZWJpZXJhIGFwYXJlY2VyIGFsIG1vbWVudG8gZGUgZW50cmVuYXIgeSBldmFsdWFyIGVsIG1vZGVsby4NCg0KRGVzcHXDqXMgZGUgdW5hIHJldmlzacOzbiBkZWwgZGljY2lvbmFyaW8gZGUgZGF0b3MsIHNlIGNvbmZpcm3DsyBxdWUgaGFiw61hIHVuIHByb2JsZW1hIGRlIGZ1Z2EgZGUgZGF0b3MsIGVzcGVjw61maWNhbWVudGUgY29uIGxhcyBzaWd1aWVudGVzIGNvbHVtbmFzIHF1ZSBzZSBlc3RhYmFuIHV0aWxpemFuZG86DQoNCi0gICAqKnRvdGFsX3JlY19wcm5jcDoqKiBQYWdvcyBwcmluY2lwYWxlcyByZWNpYmlkb3MgaGFzdGEgbGEgZmVjaGEuDQotICAgKip0b3RhbF9yZWNfaW50Kio6IEludGVyZXNlcyByZWNpYmlkb3MgaGFzdGEgbGEgZmVjaGEuDQotICAgKip0b3RhbF9yZWNfbGF0ZV9mZWUqKjogSW50ZXJlc2VzIHRhcmTDrW9zIHJlY2liaWRvcyBoYXN0YSBsYSBmZWNoYS4NCi0gICAqKnJlY292ZXJpZXMqKjogTW9udG8gdG90YWwgcmVjdXBlcmFkbyBwb3IgZWwgYWNyZWVkb3IgZGVzcHXDqXMgZGUgY29uc2lkZXJhciBsYSBkZXVkYSBjb21vIGluY29icmFibGUuDQotICAgKip0b3RhbF9weW1udDoqKiBQYWdvcyByZWNpYmlkb3MgaGFzdGEgbGEgZmVjaGEgZGUgbGEgdG90YWxpZGFkIGRlIGxvIHByZXN0YWRvLg0KLSAgICoqdG90YWxfcHltbnRfaW52Kio6IFBhZ29zIHJlY2liaWRvcyBoYXN0YSBsYSBmZWNoYSBlbiBwcm9wb3JjacOzbiBhIGxvIHBhZ2FkbyBwb3IgaW52ZXJzb3Jlcy4NCi0gICAqKmNvbGxlY3Rpb25fcmVjb3ZlcnlfZmVlOioqIE1vbnRvIGRlIHRhcmlmYXMgY29icmFkYXMgcG9yIHJlY3VwZXJhciBsYSBkZXVkYSBkZXNwdcOpcyBkZSBoYWJlciBzaWRvIGNvYnJhZGEuDQotICAgKipsYXN0X3B5bW50X2FtbnQ6KiogTW9udG8gdG90YWwgZGVsIMO6bHRpbW8gcGFnbyByZWNpYmlkby4NCg0KIyMjIDMuNC4yIEV2YWx1YWNpw7NuDQoNCkxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBlbiBlbCBjb25qdW50byBkZSBlbnRyZW5hbWllbnRvIHNlIHJlc3VtZW4gZW4gbGEgc2lndWllbnRlIHRhYmxhIGdlbmVyYWRhIHBvciBlbCBjw7NkaWdvIGVuY2FyZ2FkbyBkZSByZWFsaXphciBsYSBldmFsdWFjacOzbjoNCg0KIVtdKGltYWdlcy9pbWFnZS5wbmcpDQoNCioqRmlndXJhIDQuKiogVGFibGEgZGUgcmVzdWx0YWRvcyBkZSBYR0Jvb3N0IGVuIGVsIGNvbmp1bnRvIGRlIGVudHJlbmFtaWVudG8gY29ycmVnaWRvDQoNCkRlIGlndWFsIGZvcm1hLCBhIGNvbnRpbnVhY2nDs24gc2UgdGllbmUgbGEgdGFibGEgcmVzcGVjdGl2YSBwYXJhIGVsIGNvbmp1bnRvIGRlIHRlc3RpbmcuDQoNCiFbXShpbWFnZXMvaW1hZ2UtMDEucG5nKQ0KDQoqKkZpZ3VyYSA1LioqIFRhYmxhIGRlIHJlc3VsdGFkb3MgZGUgWEdCb29zdCBlbiBlbCBjb25qdW50byBkZSB0ZXN0aW5nIGNvcnJlZ2lkbw0KDQojIyMgMy40LjMuIENvbmNsdXNpb25lcyBtb2RlbGFkbyBYR0Jvb3N0DQoNCkRlIGxvcyBhbnRlcmlvcmVzIHJlc3VsdGFkb3Mgc2Ugb2J0dXZpZXJvbiBsYXMgc2lndWllbnRlcyBjb25jbHVzaW9uZXMgeSBhcHJlbmRpemFqZXM6DQoNCi0gICBBaG9yYSBzw60sIHNlIGN1ZW50YW4gY29uIHZhbG9yZXMgZGUgbGFzIG3DqXRyaWNhcyBtw6FzIHJhem9uYWJsZXMsIHkgcG9yIGxvIHRhbnRvIHNlIHB1ZWRlIGNvbmNsdWlyIHF1ZSBzZSBoYSByZXN1ZWx0byBlbCBwcm9ibGVtYSBkZWwgZGF0YSBsZWFrYWdlLg0KLSAgIERlYmlkbyBhbCBkZXNiYWxhbmNlIGRlIGNsYXNlcywgc2UgcHVlZGUgbm90YXIgcXVlIGVsIG1vZGVsbyB0aWVuZSB1biBidWVuIHJlbmRpbWllbnRvIGdlbmVyYWwgaWRlbnRpZmljYW5kbyBhIGxhcyBwZXJzb25hcyBxdWUgcGFnYW4gc3VzIGRldWRhcyAoZjEgc2NvcmUgMC45KSwgcGVybyBubyBsbyBlcyBhIGxhIGhvcmEgZGUgaWRlbnRpZmljYXIgbG9zIGNhc29zIGRlIHBlcnNvbmFzIHF1ZSBubyBwYWdhbiAoZjEgc2NvcmUgMC40KS4gRXN0byBlcyBjcsOtdGljbywgeWEgcXVlIGVsIGludGVyw6lzIHByaW5jaXBhbCBlc3TDoSBlbiBpZGVudGlmaWNhciBhIGVzdG9zIMO6bHRpbW9zIHBhcmEgbWl0aWdhciBlbCByaWVzZ28gZGUgZGFyIHByw6lzdGFtb3MgcXVlIG5vIHNlIHZhbiBhIHBhZ2FyIGRlc3B1w6lzLg0KDQo8YSBuYW1lPSJpdTIyLiI+PC9hPg0KDQojIyAzLjUgTW9kZWxvIDM6IE11bHRpTGF5ZXIgUGVyY2VwdHJvbg0KDQojIyMgMy41LjEgRGVmaW5pY2nDs24gZGVsIG1vZGVsbw0KDQpQYXJhIGNyZWFyIGVsIG1vZGVsbywgc2Ugb3B0w7MgcG9yIHV0aWxpemFyIGxhIGhlcnJhbWllbnRhIFB5VG9yY2ggcGFyYSBjcmVhciB1biBtb2RlbG8gbXVsdGlwZXJjZXB0cm9uLiBFbCBtb2RlbG8gY29tbyB0YWwgZXN0w6EgZGVmaW5pZG8gZW4gbGEgc2lndWllbnRlIGNsYXNlOg0KDQpgYGB7cHl0aG9ufQ0KY2xhc3MgTUxQKG5uLk1vZHVsZSk6DQogICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0X2RpbSwgbl9jbGFzc2VzKToNCiAgICAgICAgc3VwZXIoTUxQLCBzZWxmKS5fX2luaXRfXygpDQogICAgICAgIA0KICAgICAgICBzZWxmLm1vZGVsID0gbm4uU2VxdWVudGlhbCgNCiAgICAgICAgICAgIG5uLkxpbmVhcihpbnB1dF9kaW0sIDEyOCksDQogICAgICAgICAgICBubi5SZUxVKCksDQogICAgICAgICAgICBubi5CYXRjaE5vcm0xZCgxMjgpLA0KICAgICAgICAgICAgbm4uRHJvcG91dCgwLjMpLA0KICAgICAgICAgICAgbm4uTGluZWFyKDEyOCwgNjQpLA0KICAgICAgICAgICAgbm4uUmVMVSgpLA0KICAgICAgICAgICAgbm4uQmF0Y2hOb3JtMWQoNjQpLA0KICAgICAgICAgICAgbm4uRHJvcG91dCgwLjMpLA0KICAgICAgICAgICAgbm4uTGluZWFyKDY0LCBuX2NsYXNzZXMpDQogICAgICAgICkNCiAgICANCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4KToNCiAgICAgICAgcmV0dXJuIHNlbGYubW9kZWwoeCkNCg0KYGBgDQoNClBhcmEgZWwgZW50cmVuYW1pZW50bywgc2UgdXRpbGl6w7MgY29tbyBmdW5jacOzbiBkZSBww6lyZGlkYSBsYSBmdW5jacOzbiBDcm9zc0VudHJvcHlMb3NzLCB5IGNvbW8gb3B0aW16YWRvciwgc2Ugb3B0w7MgcG9yIHVzYXIgZWwgb3B0aW1pemFkb3IgQURBTS4gU2UgdXRpbGl6YXJvbiAxMCDDqXBvY2FzIHBhcmEgZW50cmVuYXIgZWwgcmVzcGVjdGl2byBtb2RlbG8NCg0KIyMjIDMuNS4yIEV2YWx1YWNpw7NuDQoNCkxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBlbiBlbCBjb25qdW50byBkZSBlbnRyZW5hbWllbnRvIHNlIHJlc3VtZW4gZW4gbGEgc2lndWllbnRlIHRhYmxhIGdlbmVyYWRhIHBvciBlbCBjw7NkaWdvIGVuY2FyZ2FkbyBkZSByZWFsaXphciBsYSBldmFsdWFjacOzbjoNCg0KIVtdKGltYWdlcy9pbWFnZS0wNC5wbmcpDQoNCioqRmlndXJhIDYuKiogVGFibGEgZGUgcmVzdWx0YWRvcyBkZSBNdWx0aWxheWVyIFBlcmNlcHRyb25lbiBlbCBjb25qdW50byBkZSBlbnRyZW5hbWllbnRvIGNvcnJlZ2lkbw0KDQpEZSBpZ3VhbCBmb3JtYSwgYSBjb250aW51YWNpw7NuIHNlIHRpZW5lIGxhIHRhYmxhIHJlc3BlY3RpdmEgcGFyYSBlbCBjb25qdW50byBkZSB0ZXN0aW5nLg0KDQohW10oaW1hZ2VzL2ltYWdlLTA1LnBuZykNCg0KKipGaWd1cmEgNy4qKiBUYWJsYSBkZSByZXN1bHRhZG9zIGRlIE11bHRpbGF5ZXIgUGVyY2VwdHJvbiBlbiBlbCBjb25qdW50byBkZSB0ZXN0aW5nIGNvcnJlZ2lkbw0KDQojIyMgMy41LjMgQ29uY2x1c2lvbmVzIG11bHRpbGF5ZXIgcGVyY2VwdHJvbg0KDQotICAgU2UgdGllbmUgdW5hIHNpdHVhY2nDs24gc2ltaWxhciBhIGNvbiBlbCBhbnRlcmlvciBtb2RlbG8sIHBlcm8gZXN0YSB2ZXogZWwgbW9kZWxvIHB1ZG8gY2xhc2lmaWNhciBsb3MgdmVyZGFkZXJvcyBwb3NpdGl2b3MgYSBsYSBwZXJmZWNjacOzbi4NCg0KLSAgIFNpbiBlbWJhcmdvLCBkZWJpZG8gYWwgZGVzYmFsYW5jZSBzaWd1ZSBlc3RhbmRvIGxhIGRpZmljdWx0YWQgY29uIGxhIHNlZ3VuZGEgY2F0ZWdvcsOtYSwgbG8gY3VhbCBzaWd1ZSBzaWVuZG8gbXV5IGNyw610aWNvLg0KDQotICAgVGFsdmV6IGNvbiBjYW1iaW9zIGJyZXZlcyBlbiBsYSByZWQgbmV1cm9uYWwgY3JlYWRhIHB1ZWRhIG1lam9yYXIgdW4gcG9jbywgcGVybyBzaSBubyBzZSB0cmF0YSBlbCBkZXNiYWxhbmNlIHNlIHRlbmRyw6EgZWwgbWlzbW8gcHJvYmxlbWEuDQoNCjxhIG5hbWU9Iml1MjMuIj48L2E+DQoNCiMjIDMuNiBDb25jbHVzaW9uZXMgcGFydGUgMw0KDQotICAgTGEgZGl2aXNpw7NuIDcwLzMwIGRlIGVudHJlbmFtaWVudG8geSBwcnVlYmEgcGVybWl0acOzIGdhcmFudGl6YXIgcXVlIGFtYmFzIHBhcnRpY2lvbmVzIHR1dmllcmFuIHVuYSByZXByZXNlbnRhY2nDs24gYmFsYW5jZWFkYSBkZSBsYXMgY2xhc2VzLCBsbyBjdWFsIGVzIGNydWNpYWwgcGFyYSBwcm9ibGVtYXMgZGUgY2xhc2lmaWNhY2nDs24gYmluYXJpYSB5IGVzcGVjaWFsbWVudGUgw7p0aWwgZW4gcHJlc2VuY2lhIGRlIGRlc2JhbGFuY2UuDQotICAgRWwgbW9kZWxvIGluaWNpYWwgZGUgWEdCb29zdCBvZnJlY2nDsyByZXN1bHRhZG9zIHByb21ldGVkb3JlcywgYXVucXVlIGluaWNpYWxtZW50ZSBkZW1hc2lhZG8gYnVlbm9zLCBsbyBjdWFsIGxsZXbDsyBhIHNvc3BlY2hhciBkZSB1biBwb3NpYmxlIHByb2JsZW1hIGRlIGRhdGEgbGVha2FnZS4gRXN0byBkZW11ZXN0cmEgbGEgdXRpbGlkYWQgZGUgZXN0ZSBtb2RlbG8gY29tbyB1biBiYXNlbGluZSBmdWVydGUgcGFyYSBldmFsdWFyIGNvbXBhcmF0aXZhbWVudGUgb3Ryb3MgZW5mb3F1ZXMgbcOhcyBjb21wbGVqb3MgY29tbyBsYXMgcmVkZXMgbmV1cm9uYWxlcy4NCi0gICBMYSBkZXRlY2Npw7NuIGRlIHZhcmlhYmxlcyByZWxhY2lvbmFkYXMgZGlyZWN0YW1lbnRlIGNvbiBlbCByZXN1bHRhZG8gYSBwcmVkZWNpciAoY29tbyBwYWdvcyByZWFsaXphZG9zLCBpbnRlcmVzZXMgcmVjaWJpZG9zLCBldGMuKSBjb25maXJtw7MgbGEgZXhpc3RlbmNpYSBkZSB1bmEgZnVnYSBkZSBpbmZvcm1hY2nDs24uIFN1IGV4Y2x1c2nDs24gZnVlIGZ1bmRhbWVudGFsIHBhcmEgb2J0ZW5lciByZXN1bHRhZG9zIHJlYWxpc3RhcyB5IGZpYWJsZXMsIGV2aWRlbmNpYW5kbyBsYSBpbXBvcnRhbmNpYSBkZSB1bmEgbGltcGllemEgcmlndXJvc2EgZGUgbG9zIGRhdG9zIGJhc2FkYSBlbiB1biBidWVuIGVudGVuZGltaWVudG8gZGVsIG5lZ29jaW8uDQotICAgQSBwZXNhciBkZSBjb3JyZWdpciBlbCBsZWFrYWdlLCBhbWJvcyBtb2RlbG9zIChYR0Jvb3N0IHkgTUxQKSBldmlkZW5jaWFyb24gZGlmaWN1bHRhZGVzIHBhcmEgaWRlbnRpZmljYXIgY29ycmVjdGFtZW50ZSBhIGxvcyBkZXVkb3JlcyAobGEgY2xhc2UgbWlub3JpdGFyaWEpLCBsb2dyYW5kbyB1biBGMSBzY29yZSBiYWpvIChjZXJjYW5vIGEgMC40KSBlbiBlc2EgY2xhc2UsIG1pZW50cmFzIHF1ZSBlbCBkZXNlbXBlw7FvIGVuIGxhIGNsYXNlIG1heW9yaXRhcmlhIGZ1ZSBtdWNobyBtZWpvci4gRXN0byBlcyBwcm9ibGVtw6F0aWNvIGRlc2RlIGVsIHB1bnRvIGRlIHZpc3RhIGRlIG5lZ29jaW8sIHlhIHF1ZSBlbCBmb2NvIGVzdMOhIGVuIGlkZW50aWZpY2FyIGNvcnJlY3RhbWVudGUgbG9zIGNhc29zIGRlIGFsdG8gcmllc2dvLg0KLSAgIEVsIG1vZGVsbyBkZSByZWQgbmV1cm9uYWwgbW9zdHLDsyB1biByZW5kaW1pZW50byBjb21wYXJhYmxlIGFsIGRlIFhHQm9vc3QsIGNvbiBpbmNsdXNvIG1lam9yIHByZWNpc2nDs24gcGFyYSB2ZXJkYWRlcm9zIHBvc2l0aXZvcy4gU2luIGVtYmFyZ28sIGVsIHByb2JsZW1hIGRlIGRlc2JhbGFuY2UgcGVyc2lzdGnDsywgbG8gcXVlIGluZGljYSBxdWUgYWp1c3RlcyBlbiBsYSBhcnF1aXRlY3R1cmEgcG9yIHPDrSBzb2xvcyBubyBzZXLDoW4gc3VmaWNpZW50ZXMuDQotICAgRWwgbW9kZWxhZG8gbm8gc29sbyBzaXJ2ZSBwYXJhIGFqdXN0YXIgaGlwZXJwYXLDoW1ldHJvcyB5IGFycXVpdGVjdHVyYXMsIHNpbm8gdGFtYmnDqW4gcGFyYSB2YWxpZGFyIHN1cHVlc3RvcywgZGV0ZWN0YXIgcHJvYmxlbWFzIGVuIGxvcyBkYXRvcyB5IGNvbXByZW5kZXIgbGFzIGxpbWl0YWNpb25lcyBkZSBsb3MgbW9kZWxvcyBhbnRlIGNhcmFjdGVyw61zdGljYXMgZGVsIGRhdGFzZXQgY29tbyBlbCBkZXNiYWxhbmNlIG8gbGEgY2FsaWRhZCBkZSBsYXMgZmVhdHVyZXMuDQoNCjxhIG5hbWU9Iml1MjQuIj48L2E+DQoNCiMgQ2Fzb3MgZGUgdXNvIGFsdGVybmF0aXZvcw0KDQpFbCBhbsOhbGlzaXMgeSBsYSBkZXRlY2Npw7NuIGRlIHBlcnNvbmFzIGNvbiBhbHRvIHJpZXNnbyBkZSBpbXBhZ28gY3JlZGl0aWNpbyBubyBzb2xvIHNvbiBmdW5kYW1lbnRhbGVzIHBhcmEgbGEgZ2VzdGnDs24gZmluYW5jaWVyYSBkZSBsYXMgZW50aWRhZGVzIHByZXN0YW1pc3Rhcywgc2lubyBxdWUgdGFtYmnDqW4gcHVlZGVuIGV4dHJhcG9sYXJzZSBhIG90cm9zIGRvbWluaW9zIG1lZGlhbnRlIGVsIGRlc2Fycm9sbG8gZGUgbW9kZWxvcyBwcmVkaWN0aXZvcyBzaW1pbGFyZXMuDQoNCkVzdGUgdGlwbyBkZSBlbmZvcXVlIGJhc2FkbyBlbiBkYXRvcyBwZXJtaXRlIGlkZW50aWZpY2FyIHBhdHJvbmVzIGRlIGNvbXBvcnRhbWllbnRvIHkgZmFjdG9yZXMgZGUgcmllc2dvIHF1ZSwgdW5hIHZleiBjb21wcmVuZGlkb3MsIHB1ZWRlbiBhcGxpY2Fyc2UgYSBwcm9ibGVtYXMgY29tbyBsYSBkZXRlY2Npw7NuIHRlbXByYW5hIGRlIGZyYXVkZXMgZmluYW5jaWVyb3MsIGxhIGV2YWx1YWNpw7NuIGRlIHJpZXNnbyBlbiBsYSBzdXNjcmlwY2nDs24gZGUgc2VndXJvcyBvIGxhIHByZWRpY2Npw7NuIGRlIGVuZmVybWVkYWRlcyBjcsOzbmljYXMgZW4gZWwgw6FtYml0byBkZSBsYSBzYWx1ZC4NCg0KPGEgbmFtZT0iaXUyNS4iPjwvYT4NCg0KIyBDb25jbHVzaW9uZXMgZmluYWxlcw0KDQpBIGxvIGxhcmdvIGRlbCBkZXNhcnJvbGxvIGRlbCBwcm95ZWN0bywgc2UgZXZpZGVuY2nDsyBxdWUgbGEgY2FsaWRhZCBkZWwgcHJlcHJvY2VzYW1pZW50byBlcyBkZXRlcm1pbmFudGUgcGFyYSBlbCDDqXhpdG8gZGVsIG1vZGVsYWRvLCB5YSBxdWUgbGFzIGRlY2lzaW9uZXMgdG9tYWRhcyBkdXJhbnRlIGxhIGluZ2VuaWVyw61hIGRlIGZlYXR1cmVzIOKAlGNvbW8gbGEgaW1wdXRhY2nDs24gZGUgdmFsb3JlcyBmYWx0YW50ZXMsIGVsIGVzY2FsYWRvIGRlIHZhcmlhYmxlcyBudW3DqXJpY2FzIHkgbGEgY29kaWZpY2FjacOzbiBhZGVjdWFkYSBkZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2Fz4oCUIHBlcm1pdGllcm9uIGNvbnN0cnVpciB1biBjb25qdW50byBkZSBkYXRvcyBzw7NsaWRvIHkgYXB0byBwYXJhIGVsIGVudHJlbmFtaWVudG8gZGUgbW9kZWxvcy4gTm8gb2JzdGFudGUsIGxhIGV4cGVyaWVuY2lhIGNvbiBlbCBwcmltZXIgbW9kZWxvIFhHQm9vc3QgdGFtYmnDqW4gZGVtb3N0csOzIHF1ZSBlbCBkYXRhIGxlYWthZ2UgcHVlZGUgaW52YWxpZGFyIGNvbXBsZXRhbWVudGUgbG9zIHJlc3VsdGFkb3MsIHJlc2FsdGFuZG8gbGEgbmVjZXNpZGFkIGRlIGNvbXByZW5kZXIgYSBwcm9mdW5kaWRhZCBlbCBzaWduaWZpY2FkbyB5IGxhIHRlbXBvcmFsaWRhZCBkZSBjYWRhIHZhcmlhYmxlIHBhcmEgZXZpdGFyIGZ1Z2FzIGRlIGluZm9ybWFjacOzbi4NCg0KVW5hIHZleiBjb3JyZWdpZG8gZXN0ZSBwcm9ibGVtYSwgbG9zIG1vZGVsb3MgZW50cmVuYWRvcyBkZWphcm9uIGVuIGV2aWRlbmNpYSBvdHJvIGdyYW4gZGVzYWbDrW86IGVsIGRlc2JhbGFuY2UgZGUgY2xhc2VzLiBBIHBlc2FyIGRlIG9idGVuZXIgYnVlbm9zIHJlc3VsdGFkb3MgZ2VuZXJhbGVzLCB0YW50byBYR0Jvb3N0IGNvbW8gZWwgbW9kZWxvIE11bHRpTGF5ZXIgUGVyY2VwdHJvbiBtb3N0cmFyb24gc2VyIGluZWZpY2llbnRlcyBwYXJhIGRldGVjdGFyIGNvcnJlY3RhbWVudGUgYSBsb3MgdXN1YXJpb3MgcXVlIG5vIHBhZ2FuIHN1cyBkZXVkYXMsIGxvIGN1YWwgZXMgY3LDrXRpY28gZGFkbyBlbCBvYmpldGl2byBkZWwgcHJvYmxlbWEuDQoNCkZpbmFsbWVudGUsIHNlIGNvbmNsdXllIHF1ZSB1dGlsaXphciBtb2RlbG9zIG3DoXMgY29tcGxlam9zIG5vIGdhcmFudGl6YSBtZWpvcmVzIHJlc3VsdGFkb3Mgc2kgbm8gc2UgYWJvcmRhIGRlIGZvcm1hIGFkZWN1YWRhIGxhIGVzdHJ1Y3R1cmEgZGVsIHByb2JsZW1hOyBwb3IgZWxsbywgZWwgZm9jbyBkZWJlIGVzdGFyIHRhbnRvIGVuIGxhIGNhbGlkYWQgZGUgbG9zIGRhdG9zIGNvbW8gZW4gZXN0cmF0ZWdpYXMgZXNwZWPDrWZpY2FzIHF1ZSByZXNwb25kYW4gYSBsb3MgcmV0b3MgcGFydGljdWxhcmVzIGRlbCBkb21pbmlvLCBjb21vIGVsIGJhbGFuY2VvIGRlIGNsYXNlcyBvIGVsIGFqdXN0ZSBmaW5vIGRlIG3DqXRyaWNhcy4NCg0KPGEgbmFtZT0iaXUyNi4iPjwvYT4NCg0KIyBSZXBvcnRlIGRlIGNvbnRyaWJ1Y2nDs24gaW5kaXZpZHVhbA0KDQojIyAtIExlb25hcmRvIEZlZGVyaWNvIENvcm9uYSBUb3JyZXMNCg0KLSAgIERlZmluaWNpw7NuIHkgZXNjcml0dXJhIGRlIGVzdHJ1Y3R1cmEgZGVsIHJlcG9ydGUuDQotICAgQ29sYWJvcmFjacOzbiBlbiBjcmVhY2nDs24gZGUgdmlkZW8gcHJvbW9jaW9uYWwuDQotICAgQXBvcnRlcyBlbnRyZWdhYmxlIGVzY3JpdG8uDQoNCiMjIC0gRGF2aWQgRXNjb2JhciBSdWl6DQoNCi0gICBSZWFsaXphY2nDs24gZGUgbGltcGllemEgZGUgZGF0b3MuDQoNCi0gICBSZWFsaXphY2nDs24gZGUgRURBLg0KDQotICAgUmVhbGl6YWNpw7NuIGRlIGluZ2VuaWVyw61hIGRlIGZlYXR1cmVzLg0KDQotICAgUmVhbGl6YWNpw7NuIGRlIHByb2Nlc28gZGUgbW9kZWxhZG8uDQoNCi0gICBDb2xhYm9yYWNpw7NuIGVuIGNyZWFjacOzbiBkZSB2aWRlbyBwcm9tb2Npb25hbC4NCg0KIyMgLSBKb2hhbiBTZWJhc3Rpw6FuIFJvYmxlcyBSaW5jw7NuDQoNCi0gICBEZXNhcnJvbGxvIGRlbCBiYWNrZW5kIGRlIGxhIGFwbGljYWNpw7NuIHdlYi4NCg0KLSAgIEFwb3lvIGVuIGRlc3BsaWVndWUgZGUgbGEgYXBsaWNhY2nDs24uDQoNCi0gICBBcG95byBlbiBkZXNhcnJvbGxvIGZyb250ZW5kLg0KDQotICAgQXBveW8gZW4gY29uZXhpw7NuIGRlIEFQSSBkZWwgbW9kZWxvIGNvbiB2aXN0YXMgZGUgRGphbmdvLg0KDQojIyAtIFNlYmFzdGlhbiBTb3RvIEFyY2lsYQ0KDQotICAgRGVzYXJyb2xsbyBmcm9udGVuZCBkZSBsYSBhcGxpY2FjacOzbiB3ZWIuDQoNCi0gICBBcG95byBlbiBjb25leGnDs24gZGUgQVBJIGRlbCBtb2RlbG8gY29uIHZpc3RhcyBkZSBEamFuZ28uDQoNCi0gICBBcG95byBlbiBkZXNwbGllZ3VlIGRlIGxhIGFwbGljYWNpw7NuLg0KDQotICAgQXBvcnRlcyBlbnRyZWdhYmxlIGVzY3JpdG8uDQoNCjxhIG5hbWU9Iml1MjcuIj48L2E+DQoNCiMgUmVwb3NpdG9yaW8gZGUgR2l0SHViIGRlbCBwcm95ZWN0bw0KDQpbaHR0cHM6Ly9naXRodWIuY29tL2RydWl6MzUvUk5BQkkyMDI1LTEtRXF1aXBvMy9dKGh0dHBzOi8vZ2l0aHViLmNvbS9kcnVpejM1L1JOQUJJMjAyNS0xLUVxdWlwbzMvdHJlZS9tYWluKXsudXJpfQ0KDQo8YSBuYW1lPSJpdTI4LiI+PC9hPg0KDQojIExpbmsgaGFjaWEgYXBwIHdlYiBkZWwgcHJveWVjdG8NCg0KPGh0dHA6Ly8zLjEwMS42Ni4xMjc6ODAwMC9wcmVkaWN0b3IvPg0KDQo8YSBuYW1lPSJpdTI5LiI+PC9hPg0KDQojIEJpYmxpb2dyYWbDrWENCg0KR2Vla3MgZm9yIEdlZWtzLiAoMjAyNSkuICpFdmFsdWF0aW9uIE1ldHJpY3MgaW4gTWFjaGluZSBMZWFybmluZyouIEdlZWtzIGZvciBHZWVrcy4gUmVjdXBlcmFkbyBlbCAxMiBkZSBqdW5pbyBkZSAyMDI1IGRlIDxodHRwczovL3d3dy5nZWVrc2ZvcmdlZWtzLm9yZy9tZXRyaWNzLWZvci1tYWNoaW5lLWxlYXJuaW5nLW1vZGVsLz4NCg0KSUJNLiAoMjAyNCkuICrCv1F1w6kgZXMgWEdCb29zdD8qIElCTS4gPGh0dHBzOi8vd3d3LmlibS5jb20vbXgtZXMvdGhpbmsvdG9waWNzL3hnYm9vc3Q+DQoNCkludGVyYWN0aXZlIENoYW9zLiAocy5mLikuICpSb2J1c3QgU2NhbGVyKi4gSW50ZXJhY3RpdmUgQ2hhb3MuIFJlY3VwZXJhZG8gZWwgMTIgZGUganVuaW8gZGUgMjAyNSBkZSA8aHR0cHM6Ly9pbnRlcmFjdGl2ZWNoYW9zLmNvbS9lcy9tYW51YWwvdHV0b3JpYWwtZGUtbWFjaGluZS1sZWFybmluZy9yb2J1c3RzY2FsZXI+DQoNCkthZ2dsZS4gKHMuZi4pLiAqQ3JlZGl0IFJpc2sgQW5hbHlzaXMqLiBLYWdnbGUuIFJlY3VwZXJhZG8gZWwgMTIgZGUganVuaW8gZGUgMjAyNSBkZSA8aHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9yYW5hZGVlcC9jcmVkaXQtcmlzay1kYXRhc2V0L2RhdGE+DQoNClN0b2ppbGprb3ZpYy4gKDIwMjUpLiAqU3BsaXQgWW91ciBEYXRhc2V0IFdpdGggc2Npa2l0LWxlYXJuJ3MgdHJhaW5fdGVzdF9zcGxpdCgpKi4gUmVhbCBQeXRob24uIDxodHRwczovL3JlYWxweXRob24uY29tL3RyYWluLXRlc3Qtc3BsaXQtcHl0aG9uLWRhdGE+DQoNClN3YXlhbS4gKDIwMjMpLiAqRXhwbG9yaW5nIERpZmZlcmVudCBFbmNvZGluZyBUZWNobmlxdWVzIGZvciBNYWNoaW5lIExlYXJuaW5nIE1vZGVscyouIE1lZGl1bS4gW2h0dHBzOi8vbWVkaXVtLmNvbS9cQHN3YXlhbXBhdGlsNzkxOC9leHBsb3JpbmctZGlmZmVyZW50LWVuY29kaW5nLXRlY2huaXF1ZXMtZm9yLW1hY2hpbmUtbGVhcm5pbmctbW9kZWxzLWI3NjJlM2I1NDZkYl0oaHR0cHM6Ly9tZWRpdW0uY29tL0Bzd2F5YW1wYXRpbDc5MTgvZXhwbG9yaW5nLWRpZmZlcmVudC1lbmNvZGluZy10ZWNobmlxdWVzLWZvci1tYWNoaW5lLWxlYXJuaW5nLW1vZGVscy1iNzYyZTNiNTQ2ZGIpDQoNClN5bmFwc2UtQW5hbHl0aWNzLiAocy5mLikuICpDcmVkaXQgU2NvcmluZyBFeHBsYWluZWQgLSBUaGUgUHJvYmxlbSBTdGF0ZW1lbnQqLiBTeW5hcHNlIEFuYWx5dGljcy4gUmVjdXBlcmFkbyBlbCAxMiBkZSBqdW5pbyBkZSAyMDI1IGRlIDxodHRwczovL3N5bmFwc2UtYW5hbHl0aWNzLmlvL2Jsb2cvZ3VpZGUtdG8tY3JlZGl0LXNjb3JpbmctcGFydC0xLXRoZS1wcm9ibGVtLXN0YXRlbWVudD4NCg0KV2lraXBlZGlhLiAocy5mLikuICpBcnRpZmljaWFsIE5ldXJhbCBOZXR3b3JrcyouIFdpa2lwZWRpYS4gUmVjdXBlcmFkbyBlbCAxMiBkZSBqdW5pbyBkZSAyMDI1IGRlIDxodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9SZWRfbmV1cm9uYWxfYXJ0aWZpY2lhbD4NCg==