Background

In an increasingly globalized and competitive business world, organizations are constantly seeking innovative strategies to streamline their operations and stay ahead in their respective industries. One of these strategies that has gained prominence in recent years is “Nearshoring”, an outsourcing approach that involves delegating activities and services to providers located in geographically close countries. In this context, Mexico emerges as an attractive destination for “Nearshoring”, thanks to its strategic location, trained human resources and favorable economic conditions.

Mexico has a privileged geographical location, sharing borders with the United States and being part of the North American Free Trade Agreement (NAFTA), today T-MEC, which facilitates access to one of the largest and most dynamic markets. of the world. This geographic proximity not only reduces transportation costs and times, but also facilitates real-time communication and collaboration between parent companies and their nearshoring partners. In addition, Mexico has established a network of trade agreements that grant tariff advantages and facilitate the flow of merchandise, which provides an attractive platform for subcontracting operations.

The country also has a highly-skilled and diversified workforce, ranging from engineers and technology professionals to experts in manufacturing and financial services. Labor costs in Mexico are competitive compared to other outsourcing destinations, allowing companies to obtain higher added value at lower cost. In addition, the continuous growth in education and training has promoted the training of highly qualified professionals, which guarantees the availability of the necessary talent to meet the demands of “Nearshoring”.

Predictive Analytics, or “Predictive Analysis”, is a discipline within the field of analytics that focuses on using historical data and advanced statistical models to forecast future results and trends. Its primary goal is to make reliable predictions about future events based on patterns and relationships identified in available data. In other words, predictive analytics allows you to anticipate what might happen based on what has happened in the past.

Within predictive analysis, regression is an essential technique. Regression is a statistical method that seeks to model the relationship between a dependent variable and one or more independent variables, in order to predict or estimate future values of the dependent variable. In the context of predictive analytics, regression becomes a valuable tool for understanding how independent variables influence the target variable and how they can be used to make forecasts.

Regression is especially useful for measuring and quantifying the relative impact of different variables on the target variable. In this work, we will work with some variables such as Education, Innovation, Population Density, exports and Employment to estimate a regression model that adjusts the dependent variable of Foreign Direct Investment, all this in the analysis of ” Nearshoring” for the Mexican case, By modeling these relationships, more informed predictions can be made about the results of “Nearshoring” in different contexts and under different conditions.

Problem Situation

In the context of the analysis of foreign direct investment (FDI) in Mexico, we seek to understand the relationships and factors that influence the flow of FDI in the country. FDI is a crucial economic indicator that impacts the growth and development of a nation. The set of variables available for this study includes data from the time period in question, as well as factors that could influence the flow of FDI, such as exchange rate, exports, employment, education, innovation, insecurity, road density, population density. , among others.

Linear regression analysis is presented as a fundamental tool for this purpose. Linear regression will allow modeling the relationship between the dependent variable, in this case the flow of FDI, and the aforementioned independent variables. Through this analysis we seek to identify those variables that have a significant impact on the flow of FDI. Additionally, the direction and magnitude of these relationships will be explored, providing an understanding of how changes in the independent variables are associated with changes in foreign direct investment.

This study focuses on providing a deeper perspective on the determinants of FDI in Mexico, allowing decision makers, investors and economic analysts to have a more solid understanding of how these variables influence the flow of investment. Regression analysis will not only provide valuable information for decision-making on economic policies and investment strategies, but could also help predict future FDI flows based on changes in the independent variables. All this in order to help Maria in her economic analysis for the company where she works.

Data and Methodology

It is important to mention the variables that will be worked with during the analysis. Throughout the analysis we will talk about units for each variable, where each unit is explained below…

— “FDI_Flujos”: Foreign Direct Investment (FDI) Unit: Mexican millions pesos Description: Represents the flows of Foreign Direct Investment in the economy, that is, the amount of money that enters the country as foreign investment.

— “Exportaciones”: Exports Unit: Mexican millions pesos Description: Corresponds to the value of exports of goods and services not related to oil. Includes exports from the Maquiladora Export Industry.

—“Empleo”: Employment Rate Unit: Percentage Rate Description: Indicates the percentage of the economically active population that is employed in a job.

— “Educacion”: Years of Education Unit: Years Description: Represents the average number of years of education of the population. The older the age, the higher the educational level.

— “Salario_Diario”: Minimum Daily Wage Unit: Pesos Description: Indicates the minimum wage in daily pesos, which is the base salary paid to workers per working day.

— “Inovacion”: Patent Rate Unit: Patent Rate per 100,000 inhabitants Description: Shows the number of patents requested in Mexico per 100,000 inhabitants. It reflects technological innovation in the country.

— “Inseguridad_robo”: Rate of Robbery with Violence Unit: Robbery Rate per 100,000 inhabitants Description: Represents the rate of violent robberies in different contexts, such as homes, vehicles, businesses, etc.

— “Inseguridad_Homicidio: Homicide Rate Unit: Homicide Rate per 100,000 inhabitants Description: Indicates the homicide rate per 100,000 inhabitants in the country.

— “Tipo_de_Cambio”: Exchange Rate Unit: Pesos per Dollar Description: Reflects the value of the Mexican peso in relation to the US dollar. It is important in international trade.

— “Densidad_Carretera”: Road Density Unit: Length in km² Description: Measures the length of kilometers of paved roads for each km² of the country’s land area.

— “Densidad_Poblacion”: Population Density Unit: Population per km² Description: Indicates the amount of population divided by the territorial area of Mexico in km². Measures population density.

— “CO2_Emisiones”: Carbon Dioxide (CO2) Emissions Unit: Metric Tons Per Capita Description: Represents carbon dioxide emissions per inhabitant. Reflects the environmental impact.

— “PIB_per_Cápita”: Gross Domestic Product (GDP) per Capita Unit: Real 2013 MXN Pesos Description: It is the Gross Domestic Product divided by the population and adjusted by the prices of 2013. It indicates the average income per inhabitant.

— “INPC”: Consumer Price Index (INPC) Unit: Price index (Base 2018 = 100) Description: Represents the consumer price index, which reflects the variation in the prices of consumer goods and services.

Exploratory Data Analysis

### loading libraries
library(foreign)
library(dplyr)        # data manipulation 
library(forcats)      # to work with categorical variables
library(ggplot2)      # data visualization 
library(readr)        # read specific csv files
library(janitor)      # data exploration and cleaning 
library(Hmisc)        # several useful functions for data analysis 
library(psych)        # functions for multivariate analysis 
library(naniar)       # summaries and visualization of missing values NA's
library(dlookr)       # summaries and visualization of missing values NA's
library(corrplot)     # correlation plots
library(jtools)       # presentation of regression analysis 
library(lmtest)       # diagnostic checks - linear regression analysis 
library(car)          # diagnostic checks - linear regression analysis
library(olsrr)        # diagnostic checks - linear regression analysis 
library(naniar)       # identifying missing values
library(stargazer)    # create publication quality tables
library(effects)      # displays for linear and other regression models
library(tidyverse)    # collection of R packages designed for data science
library(caret)        # Classification and Regression Training 
library(glmnet)       # methods for prediction and plotting, and functions for cross-validation

To begin, it is essential to explore the first data in our database, which will allow us to understand the types of data we have available and the independent variables that will be fundamental to building a robust linear regression model. In this project, the dependent variable that we will use will be Foreign Direct Investment (FDI). This choice is justified because FDI is a key measure related to the central topic of our project: Nearshoring. Furthermore, FDI is a metric that is influenced by a series of independent variables, covering political, social, environmental and ethical aspects. These variables together influence the level of FDI, making it a fundamental indicator for our analysis.

#Importing db 

bd <- read.csv("/Users/gabrielmedina/Downloads/nearshoring.csv")
bd
##    periodo IED_Flujos_dolares Exportaciones_dolares Empleo Educacion
## 1     1997           12145.60               9087.62     NA      7.20
## 2     1998            8373.50               9875.07     NA      7.31
## 3     1999           13960.32              10990.01     NA      7.43
## 4     2000           18248.69              12482.96  97.83      7.56
## 5     2001           30057.18              11300.44  97.36      7.68
## 6     2002           24099.21              11923.10  97.66      7.80
## 7     2003           18249.97              13156.00  97.06      7.93
## 8     2004           25015.57              13573.13  96.48      8.04
## 9     2005           25795.82              16465.81  97.17      8.14
## 10    2006           21232.54              17485.93  96.53      8.26
## 11    2007           32393.33              19103.85  96.60      8.36
## 12    2008           29502.46              16924.76  95.68      8.46
## 13    2009           17849.95              19702.63  95.20      8.56
## 14    2010           27189.28              22673.14  95.06      8.63
## 15    2011           25632.52              24333.02  95.49      8.75
## 16    2012           21769.32              26297.98  95.53      8.85
## 17    2013           48354.42              27687.57  95.75      8.95
## 18    2014           30351.25              31676.78  96.24      9.05
## 19    2015           35943.75              29959.94  96.04      9.15
## 20    2016           31188.98              31375.06  96.62      9.25
## 21    2017           34017.05              33322.62  96.85      9.35
## 22    2018           34100.43              35341.90  96.64      9.45
## 23    2019           34577.16              36414.73  97.09      9.58
## 24    2020           28205.89              41077.34  96.21        NA
## 25    2021           31553.52              44914.78  96.49        NA
## 26    2022           36215.37              46477.59  97.24        NA
##    Salario_Diario Innovacion Inseguridad_Robo Inseguridad_Homicidio
## 1           24.30      11.30           266.51                 14.55
## 2           31.91      11.37           314.78                 14.32
## 3           31.91      12.46           272.89                 12.64
## 4           35.12      13.15           216.98                 10.86
## 5           37.57      13.47           214.53                 10.25
## 6           39.74      12.80           197.80                  9.94
## 7           41.53      11.81           183.22                  9.81
## 8           43.30      12.61           146.28                  8.92
## 9           45.24      13.41           136.94                  9.22
## 10          47.05      14.23           135.59                  9.60
## 11          48.88      15.04           145.92                  8.04
## 12          50.84      14.82           158.17                 12.52
## 13          53.19      12.59           175.77                 17.46
## 14          55.77      12.69           201.94                 22.43
## 15          58.06      12.10           212.61                 23.42
## 16          60.75      13.03           190.28                 22.09
## 17          63.12      13.22           185.56                 19.74
## 18          65.58      13.65           154.41                 16.93
## 19          70.10      15.11           180.44                 17.37
## 20          73.04      14.40           160.57                 20.31
## 21          88.36      14.05           230.43                 26.22
## 22          88.36      13.25           184.25                 29.59
## 23         102.68      12.70           173.45                 29.21
## 24         123.22      11.28           133.90                 28.98
## 25         141.70         NA           127.13                 27.89
## 26         172.87         NA           120.49                    NA
##    Tipo_de_Cambio Densidad_Carretera Densidad_Poblacion CO2_Emisiones
## 1            8.06               0.05              47.44          3.68
## 2            9.94               0.05              48.76          3.85
## 3            9.52               0.06              49.48          3.69
## 4            9.60               0.06              50.58          3.87
## 5            9.17               0.06              51.28          3.81
## 6           10.36               0.06              51.95          3.82
## 7           11.20               0.06              52.61          3.95
## 8           11.22               0.06              53.27          3.98
## 9           10.71               0.06              54.78          4.10
## 10          10.88               0.06              55.44          4.19
## 11          10.90               0.06              56.17          4.22
## 12          13.77               0.07              56.96          4.19
## 13          13.04               0.07              57.73          4.04
## 14          12.38               0.07              58.45          4.11
## 15          13.98               0.07              59.15          4.19
## 16          12.99               0.07              59.85          4.20
## 17          13.07               0.08              59.49          4.06
## 18          14.73               0.08              60.17          3.89
## 19          17.34               0.08              60.86          3.93
## 20          20.66               0.08              61.57          3.89
## 21          19.74               0.09              62.28          3.84
## 22          19.66               0.09              63.11          3.65
## 23          18.87               0.09              63.90          3.59
## 24          19.94               0.09              64.59            NA
## 25          20.52               0.09              65.16            NA
## 26          19.41               0.09              65.60            NA
##    PIB_Per_Capita   INPC
## 1        127570.1  33.28
## 2        126738.8  39.47
## 3        129164.7  44.34
## 4        130874.9  48.31
## 5        128083.4  50.43
## 6        128205.9  53.31
## 7        128737.9  55.43
## 8        132563.5  58.31
## 9        132941.1  60.25
## 10       135894.9  62.69
## 11       137795.7  65.05
## 12       135176.0  69.30
## 13       131233.0  71.77
## 14       134991.7  74.93
## 15       138891.9  77.79
## 16       141530.2  80.57
## 17       144112.0  83.77
## 18       147277.4  87.19
## 19       149433.5  89.05
## 20       152275.4  92.04
## 21       153235.7  98.27
## 22       153133.8  99.91
## 23       150233.1 105.93
## 24       142609.3 109.27
## 25       142772.0 117.31
## 26       146826.7 126.48

To begin with, it begins with an exploratory analysis of the data, understanding what the structure of the data is and what type of data we have.

sum(is.na(bd))
## [1] 12
str(bd)
## 'data.frame':    26 obs. of  15 variables:
##  $ periodo              : int  1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 ...
##  $ IED_Flujos_dolares   : num  12146 8374 13960 18249 30057 ...
##  $ Exportaciones_dolares: num  9088 9875 10990 12483 11300 ...
##  $ Empleo               : num  NA NA NA 97.8 97.4 ...
##  $ Educacion            : num  7.2 7.31 7.43 7.56 7.68 7.8 7.93 8.04 8.14 8.26 ...
##  $ Salario_Diario       : num  24.3 31.9 31.9 35.1 37.6 ...
##  $ Innovacion           : num  11.3 11.4 12.5 13.2 13.5 ...
##  $ Inseguridad_Robo     : num  267 315 273 217 215 ...
##  $ Inseguridad_Homicidio: num  14.6 14.3 12.6 10.9 10.2 ...
##  $ Tipo_de_Cambio       : num  8.06 9.94 9.52 9.6 9.17 ...
##  $ Densidad_Carretera   : num  0.05 0.05 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 ...
##  $ Densidad_Poblacion   : num  47.4 48.8 49.5 50.6 51.3 ...
##  $ CO2_Emisiones        : num  3.68 3.85 3.69 3.87 3.81 3.82 3.95 3.98 4.1 4.19 ...
##  $ PIB_Per_Capita       : num  127570 126739 129165 130875 128083 ...
##  $ INPC                 : num  33.3 39.5 44.3 48.3 50.4 ...
#Descriptive statistics
summary(bd)
##     periodo     IED_Flujos_dolares Exportaciones_dolares     Empleo     
##  Min.   :1997   Min.   : 8374      Min.   : 9088         Min.   :95.06  
##  1st Qu.:2003   1st Qu.:21367      1st Qu.:13260         1st Qu.:95.89  
##  Median :2010   Median :27698      Median :21188         Median :96.53  
##  Mean   :2010   Mean   :26770      Mean   :23601         Mean   :96.47  
##  3rd Qu.:2016   3rd Qu.:32183      3rd Qu.:31601         3rd Qu.:97.08  
##  Max.   :2022   Max.   :48354      Max.   :46478         Max.   :97.83  
##                                                          NA's   :3      
##    Educacion     Salario_Diario     Innovacion    Inseguridad_Robo
##  Min.   :7.200   Min.   : 24.30   Min.   :11.28   Min.   :120.5   
##  1st Qu.:7.865   1st Qu.: 41.97   1st Qu.:12.56   1st Qu.:148.3   
##  Median :8.460   Median : 54.48   Median :13.09   Median :181.8   
##  Mean   :8.423   Mean   : 65.16   Mean   :13.11   Mean   :185.4   
##  3rd Qu.:9.000   3rd Qu.: 72.31   3rd Qu.:13.75   3rd Qu.:209.9   
##  Max.   :9.580   Max.   :172.87   Max.   :15.11   Max.   :314.8   
##  NA's   :3                        NA's   :2                       
##  Inseguridad_Homicidio Tipo_de_Cambio  Densidad_Carretera Densidad_Poblacion
##  Min.   : 8.04         Min.   : 8.06   Min.   :0.05000    Min.   :47.44     
##  1st Qu.:10.25         1st Qu.:10.75   1st Qu.:0.06000    1st Qu.:52.77     
##  Median :16.93         Median :13.02   Median :0.07000    Median :58.09     
##  Mean   :17.29         Mean   :13.91   Mean   :0.07115    Mean   :57.33     
##  3rd Qu.:22.43         3rd Qu.:18.49   3rd Qu.:0.08000    3rd Qu.:61.39     
##  Max.   :29.59         Max.   :20.66   Max.   :0.09000    Max.   :65.60     
##  NA's   :1                                                                  
##  CO2_Emisiones   PIB_Per_Capita        INPC       
##  Min.   :3.590   Min.   :126739   Min.   : 33.28  
##  1st Qu.:3.830   1st Qu.:130964   1st Qu.: 56.15  
##  Median :3.930   Median :136845   Median : 73.35  
##  Mean   :3.945   Mean   :138550   Mean   : 75.17  
##  3rd Qu.:4.105   3rd Qu.:146148   3rd Qu.: 91.29  
##  Max.   :4.220   Max.   :153236   Max.   :126.48  
##  NA's   :3
#The analysis of descriptive statistics reveals a variety of data in a period spanning from 1997 to 2022. Foreign Direct Investment (FDI) stands out as a dependent variable, with a wide range of values ranging between 210,876 and 754,438. Other variables, such as daily wage, innovation, insecurity and GDP per capita, also show significant variability. These data provide an overview of the diversity in the key variables, suggesting the need for further analysis and the possibility of building a linear regression model to investigate the relationships between them in the context of Nearshoring.
Data cleaning

As we could see, there are several records with missing values, removing them would skew our data. Therefore, the mean statistical imputation method will be used to be able to replace the null values

#Data imputation using mean.
datos_imputados <- bd
media_empleo <- mean(bd$Empleo, na.rm = TRUE)  # Calculate the mean without NA
media_educacion <- mean(bd$Educacion, na.rm = TRUE)  # Calculate the mean without NA
media_innovacion <- mean(bd$Innovacion, na.rm = TRUE)  # Calculate the mean without NA
media_homicidio <- mean(bd$Inseguridad_Homicidio, na.rm = TRUE)  # Calculate the mean without NA
media_CO2 <- mean(bd$CO2_Emisiones, na.rm = TRUE)  # Calculate the mean without NA
datos_imputados$Empleo[is.na(datos_imputados$Empleo)] <- media_empleo
datos_imputados$Educacion[is.na(datos_imputados$Educacion)] <- media_educacion
datos_imputados$Innovacion[is.na(datos_imputados$Innovacion)] <- media_innovacion
datos_imputados$Inseguridad_Homicidio[is.na(datos_imputados$Inseguridad_Homicidio)] <- media_homicidio
datos_imputados$CO2_Emisiones[is.na(datos_imputados$CO2_Emisiones)] <- media_CO2
#Data structure
str(datos_imputados)
## 'data.frame':    26 obs. of  15 variables:
##  $ periodo              : int  1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 ...
##  $ IED_Flujos_dolares   : num  12146 8374 13960 18249 30057 ...
##  $ Exportaciones_dolares: num  9088 9875 10990 12483 11300 ...
##  $ Empleo               : num  96.5 96.5 96.5 97.8 97.4 ...
##  $ Educacion            : num  7.2 7.31 7.43 7.56 7.68 7.8 7.93 8.04 8.14 8.26 ...
##  $ Salario_Diario       : num  24.3 31.9 31.9 35.1 37.6 ...
##  $ Innovacion           : num  11.3 11.4 12.5 13.2 13.5 ...
##  $ Inseguridad_Robo     : num  267 315 273 217 215 ...
##  $ Inseguridad_Homicidio: num  14.6 14.3 12.6 10.9 10.2 ...
##  $ Tipo_de_Cambio       : num  8.06 9.94 9.52 9.6 9.17 ...
##  $ Densidad_Carretera   : num  0.05 0.05 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 ...
##  $ Densidad_Poblacion   : num  47.4 48.8 49.5 50.6 51.3 ...
##  $ CO2_Emisiones        : num  3.68 3.85 3.69 3.87 3.81 3.82 3.95 3.98 4.1 4.19 ...
##  $ PIB_Per_Capita       : num  127570 126739 129165 130875 128083 ...
##  $ INPC                 : num  33.3 39.5 44.3 48.3 50.4 ...
bd2=datos_imputados
bd2
##    periodo IED_Flujos_dolares Exportaciones_dolares   Empleo Educacion
## 1     1997           12145.60               9087.62 96.47043  7.200000
## 2     1998            8373.50               9875.07 96.47043  7.310000
## 3     1999           13960.32              10990.01 96.47043  7.430000
## 4     2000           18248.69              12482.96 97.83000  7.560000
## 5     2001           30057.18              11300.44 97.36000  7.680000
## 6     2002           24099.21              11923.10 97.66000  7.800000
## 7     2003           18249.97              13156.00 97.06000  7.930000
## 8     2004           25015.57              13573.13 96.48000  8.040000
## 9     2005           25795.82              16465.81 97.17000  8.140000
## 10    2006           21232.54              17485.93 96.53000  8.260000
## 11    2007           32393.33              19103.85 96.60000  8.360000
## 12    2008           29502.46              16924.76 95.68000  8.460000
## 13    2009           17849.95              19702.63 95.20000  8.560000
## 14    2010           27189.28              22673.14 95.06000  8.630000
## 15    2011           25632.52              24333.02 95.49000  8.750000
## 16    2012           21769.32              26297.98 95.53000  8.850000
## 17    2013           48354.42              27687.57 95.75000  8.950000
## 18    2014           30351.25              31676.78 96.24000  9.050000
## 19    2015           35943.75              29959.94 96.04000  9.150000
## 20    2016           31188.98              31375.06 96.62000  9.250000
## 21    2017           34017.05              33322.62 96.85000  9.350000
## 22    2018           34100.43              35341.90 96.64000  9.450000
## 23    2019           34577.16              36414.73 97.09000  9.580000
## 24    2020           28205.89              41077.34 96.21000  8.423478
## 25    2021           31553.52              44914.78 96.49000  8.423478
## 26    2022           36215.37              46477.59 97.24000  8.423478
##    Salario_Diario Innovacion Inseguridad_Robo Inseguridad_Homicidio
## 1           24.30   11.30000           266.51               14.5500
## 2           31.91   11.37000           314.78               14.3200
## 3           31.91   12.46000           272.89               12.6400
## 4           35.12   13.15000           216.98               10.8600
## 5           37.57   13.47000           214.53               10.2500
## 6           39.74   12.80000           197.80                9.9400
## 7           41.53   11.81000           183.22                9.8100
## 8           43.30   12.61000           146.28                8.9200
## 9           45.24   13.41000           136.94                9.2200
## 10          47.05   14.23000           135.59                9.6000
## 11          48.88   15.04000           145.92                8.0400
## 12          50.84   14.82000           158.17               12.5200
## 13          53.19   12.59000           175.77               17.4600
## 14          55.77   12.69000           201.94               22.4300
## 15          58.06   12.10000           212.61               23.4200
## 16          60.75   13.03000           190.28               22.0900
## 17          63.12   13.22000           185.56               19.7400
## 18          65.58   13.65000           154.41               16.9300
## 19          70.10   15.11000           180.44               17.3700
## 20          73.04   14.40000           160.57               20.3100
## 21          88.36   14.05000           230.43               26.2200
## 22          88.36   13.25000           184.25               29.5900
## 23         102.68   12.70000           173.45               29.2100
## 24         123.22   11.28000           133.90               28.9800
## 25         141.70   13.10583           127.13               27.8900
## 26         172.87   13.10583           120.49               17.2924
##    Tipo_de_Cambio Densidad_Carretera Densidad_Poblacion CO2_Emisiones
## 1            8.06               0.05              47.44      3.680000
## 2            9.94               0.05              48.76      3.850000
## 3            9.52               0.06              49.48      3.690000
## 4            9.60               0.06              50.58      3.870000
## 5            9.17               0.06              51.28      3.810000
## 6           10.36               0.06              51.95      3.820000
## 7           11.20               0.06              52.61      3.950000
## 8           11.22               0.06              53.27      3.980000
## 9           10.71               0.06              54.78      4.100000
## 10          10.88               0.06              55.44      4.190000
## 11          10.90               0.06              56.17      4.220000
## 12          13.77               0.07              56.96      4.190000
## 13          13.04               0.07              57.73      4.040000
## 14          12.38               0.07              58.45      4.110000
## 15          13.98               0.07              59.15      4.190000
## 16          12.99               0.07              59.85      4.200000
## 17          13.07               0.08              59.49      4.060000
## 18          14.73               0.08              60.17      3.890000
## 19          17.34               0.08              60.86      3.930000
## 20          20.66               0.08              61.57      3.890000
## 21          19.74               0.09              62.28      3.840000
## 22          19.66               0.09              63.11      3.650000
## 23          18.87               0.09              63.90      3.590000
## 24          19.94               0.09              64.59      3.945217
## 25          20.52               0.09              65.16      3.945217
## 26          19.41               0.09              65.60      3.945217
##    PIB_Per_Capita   INPC
## 1        127570.1  33.28
## 2        126738.8  39.47
## 3        129164.7  44.34
## 4        130874.9  48.31
## 5        128083.4  50.43
## 6        128205.9  53.31
## 7        128737.9  55.43
## 8        132563.5  58.31
## 9        132941.1  60.25
## 10       135894.9  62.69
## 11       137795.7  65.05
## 12       135176.0  69.30
## 13       131233.0  71.77
## 14       134991.7  74.93
## 15       138891.9  77.79
## 16       141530.2  80.57
## 17       144112.0  83.77
## 18       147277.4  87.19
## 19       149433.5  89.05
## 20       152275.4  92.04
## 21       153235.7  98.27
## 22       153133.8  99.91
## 23       150233.1 105.93
## 24       142609.3 109.27
## 25       142772.0 117.31
## 26       146826.7 126.48

To begin, according to the glossary of the database provided, foreign direct investment and exports are in dollars and in nominal values, which is why it is important to transform them into pesos and real values.

These real values more accurately reflect the fluctuations in foreign direct investment over the time series, taking into account the inflationary changes that occurred in those specific years. To achieve this conversion, the exchange rate corresponding to the year of each observation was applied and the National Consumer Price Index (INPC) of that same year was considered as an inflation adjustment. This approach allows for a more accurate and realistic representation of FDI over time.

bd2$IED_Flujos = ((bd2$IED_Flujos_dolares * bd2$Tipo_de_Cambio) / bd2$INPC) * 100
bd2$Exportaciones = ((bd2$Exportaciones_dolares * bd2$Tipo_de_Cambio) / bd2$INPC) * 100
bd2
##    periodo IED_Flujos_dolares Exportaciones_dolares   Empleo Educacion
## 1     1997           12145.60               9087.62 96.47043  7.200000
## 2     1998            8373.50               9875.07 96.47043  7.310000
## 3     1999           13960.32              10990.01 96.47043  7.430000
## 4     2000           18248.69              12482.96 97.83000  7.560000
## 5     2001           30057.18              11300.44 97.36000  7.680000
## 6     2002           24099.21              11923.10 97.66000  7.800000
## 7     2003           18249.97              13156.00 97.06000  7.930000
## 8     2004           25015.57              13573.13 96.48000  8.040000
## 9     2005           25795.82              16465.81 97.17000  8.140000
## 10    2006           21232.54              17485.93 96.53000  8.260000
## 11    2007           32393.33              19103.85 96.60000  8.360000
## 12    2008           29502.46              16924.76 95.68000  8.460000
## 13    2009           17849.95              19702.63 95.20000  8.560000
## 14    2010           27189.28              22673.14 95.06000  8.630000
## 15    2011           25632.52              24333.02 95.49000  8.750000
## 16    2012           21769.32              26297.98 95.53000  8.850000
## 17    2013           48354.42              27687.57 95.75000  8.950000
## 18    2014           30351.25              31676.78 96.24000  9.050000
## 19    2015           35943.75              29959.94 96.04000  9.150000
## 20    2016           31188.98              31375.06 96.62000  9.250000
## 21    2017           34017.05              33322.62 96.85000  9.350000
## 22    2018           34100.43              35341.90 96.64000  9.450000
## 23    2019           34577.16              36414.73 97.09000  9.580000
## 24    2020           28205.89              41077.34 96.21000  8.423478
## 25    2021           31553.52              44914.78 96.49000  8.423478
## 26    2022           36215.37              46477.59 97.24000  8.423478
##    Salario_Diario Innovacion Inseguridad_Robo Inseguridad_Homicidio
## 1           24.30   11.30000           266.51               14.5500
## 2           31.91   11.37000           314.78               14.3200
## 3           31.91   12.46000           272.89               12.6400
## 4           35.12   13.15000           216.98               10.8600
## 5           37.57   13.47000           214.53               10.2500
## 6           39.74   12.80000           197.80                9.9400
## 7           41.53   11.81000           183.22                9.8100
## 8           43.30   12.61000           146.28                8.9200
## 9           45.24   13.41000           136.94                9.2200
## 10          47.05   14.23000           135.59                9.6000
## 11          48.88   15.04000           145.92                8.0400
## 12          50.84   14.82000           158.17               12.5200
## 13          53.19   12.59000           175.77               17.4600
## 14          55.77   12.69000           201.94               22.4300
## 15          58.06   12.10000           212.61               23.4200
## 16          60.75   13.03000           190.28               22.0900
## 17          63.12   13.22000           185.56               19.7400
## 18          65.58   13.65000           154.41               16.9300
## 19          70.10   15.11000           180.44               17.3700
## 20          73.04   14.40000           160.57               20.3100
## 21          88.36   14.05000           230.43               26.2200
## 22          88.36   13.25000           184.25               29.5900
## 23         102.68   12.70000           173.45               29.2100
## 24         123.22   11.28000           133.90               28.9800
## 25         141.70   13.10583           127.13               27.8900
## 26         172.87   13.10583           120.49               17.2924
##    Tipo_de_Cambio Densidad_Carretera Densidad_Poblacion CO2_Emisiones
## 1            8.06               0.05              47.44      3.680000
## 2            9.94               0.05              48.76      3.850000
## 3            9.52               0.06              49.48      3.690000
## 4            9.60               0.06              50.58      3.870000
## 5            9.17               0.06              51.28      3.810000
## 6           10.36               0.06              51.95      3.820000
## 7           11.20               0.06              52.61      3.950000
## 8           11.22               0.06              53.27      3.980000
## 9           10.71               0.06              54.78      4.100000
## 10          10.88               0.06              55.44      4.190000
## 11          10.90               0.06              56.17      4.220000
## 12          13.77               0.07              56.96      4.190000
## 13          13.04               0.07              57.73      4.040000
## 14          12.38               0.07              58.45      4.110000
## 15          13.98               0.07              59.15      4.190000
## 16          12.99               0.07              59.85      4.200000
## 17          13.07               0.08              59.49      4.060000
## 18          14.73               0.08              60.17      3.890000
## 19          17.34               0.08              60.86      3.930000
## 20          20.66               0.08              61.57      3.890000
## 21          19.74               0.09              62.28      3.840000
## 22          19.66               0.09              63.11      3.650000
## 23          18.87               0.09              63.90      3.590000
## 24          19.94               0.09              64.59      3.945217
## 25          20.52               0.09              65.16      3.945217
## 26          19.41               0.09              65.60      3.945217
##    PIB_Per_Capita   INPC IED_Flujos Exportaciones
## 1        127570.1  33.28   294151.2      220090.8
## 2        126738.8  39.47   210875.6      248690.6
## 3        129164.7  44.34   299734.4      235960.5
## 4        130874.9  48.31   362631.8      248057.2
## 5        128083.4  50.43   546548.4      205482.9
## 6        128205.9  53.31   468332.0      231707.6
## 7        128737.9  55.43   368752.8      265825.7
## 8        132563.5  58.31   481349.2      261173.9
## 9        132941.1  60.25   458544.8      292695.1
## 10       135894.9  62.69   368495.8      303472.5
## 11       137795.7  65.05   542793.7      320110.6
## 12       135176.0  69.30   586217.7      336297.2
## 13       131233.0  71.77   324318.4      357980.1
## 14       134991.7  74.93   449223.7      374607.6
## 15       138891.9  77.79   460653.8      437299.9
## 16       141530.2  80.57   350978.6      423992.5
## 17       144112.0  83.77   754437.5      431988.2
## 18       147277.4  87.19   512758.2      535151.9
## 19       149433.5  89.05   699904.1      583386.1
## 20       152275.4  92.04   700091.6      704268.5
## 21       153235.7  98.27   683318.0      669368.6
## 22       153133.8  99.91   671018.4      695447.7
## 23       150233.1 105.93   615945.4      648679.3
## 24       142609.3 109.27   514711.7      749594.7
## 25       142772.0 117.31   551937.8      785654.5
## 26       146826.7 126.48   555771.9      713259.0
Data visualization

It is also important to understand what is the relationship of each of the independent variables with the dependent variable. This is done by means of graphs to understand the relationships.

#Data visualization (independent variables vs IED)
datos_imputados=data
ggplot(data = bd2, aes(x = Exportaciones, y = IED_Flujos)) +
  geom_point() +
  labs(x = "Exports", y = "Dependent Variable (IED)") +
  ggtitle("Scatter Plot: Exports vs. IED")

As we can see in this graph of exports vs FDI, it can be seen that these variables are positively correlated, although the relationship is not so strong, but since there is a correlation pattern it could be a good assumption to assume that this variable will be statistically significant in the face of to the construction of our regression models.

ggplot(data = bd2, aes(x = Salario_Diario, y = IED_Flujos)) +
  geom_line() +
  labs(x = "Salario diario", y = "Dependent Variable (IED)") +
  ggtitle("Line Plot: Salary vs. IED")

En esta gráfica, apreciamos que al comienzo de las variables, se muestra una ligera correlación positiva, sin embargo, a medida que crece el salario se aprecia como pierde correlación con la variable dependiente.

ggplot(data = bd2, aes(x = Tipo_de_Cambio, y = IED_Flujos)) +
  geom_line() +
  labs(x = "Exchange rate", y = "Dependent Variable (IED)") +
  ggtitle("Density Plot: Exchange rate vs. IED")

Just as in the case of exports, despite showing little correlation, the positive correlation of this relationship between the exchange rate and our dependent variable is noticeable.

ggplot(data = bd2, aes(x = Densidad_Poblacion, y = IED_Flujos)) +
  geom_hex() +
  labs(x = "Poblation Density", y = "Dependent Variable (IED)") +
  ggtitle("Hex Plot: Poblation Density vs. IED")

A slight positive correlation between these two variables is noticeable.

ggplot(data = bd2, aes(x = CO2_Emisiones, y = IED_Flujos)) +
  geom_bar(stat = "identity") +
  labs(x = "CO2", y = "Variable Dependiente (IED)") +
  ggtitle("Gráfico de Barras: CO2 vs. IED")

There is almost no correlation

ggplot(data = bd2, aes(x = INPC, y = IED_Flujos)) +
  geom_point() +
  labs(x = "INPC", y = "Dependent Variable (IED)") +
  ggtitle("Scatter Plot: INPC vs. IED")

The INPC shows a correlation with FDI, something that makes a lot of sense because the National Consumer Price Index is a way to measure the inflation that is occurring in the country, and when foreign investment rises, it is a sign of economic spillover. that is happening and the growth of the economy, which leads to more money in circulation in the hands of Mexicans and therefore a consequent inflation.

str(bd2)
## 'data.frame':    26 obs. of  17 variables:
##  $ periodo              : int  1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 ...
##  $ IED_Flujos_dolares   : num  12146 8374 13960 18249 30057 ...
##  $ Exportaciones_dolares: num  9088 9875 10990 12483 11300 ...
##  $ Empleo               : num  96.5 96.5 96.5 97.8 97.4 ...
##  $ Educacion            : num  7.2 7.31 7.43 7.56 7.68 7.8 7.93 8.04 8.14 8.26 ...
##  $ Salario_Diario       : num  24.3 31.9 31.9 35.1 37.6 ...
##  $ Innovacion           : num  11.3 11.4 12.5 13.2 13.5 ...
##  $ Inseguridad_Robo     : num  267 315 273 217 215 ...
##  $ Inseguridad_Homicidio: num  14.6 14.3 12.6 10.9 10.2 ...
##  $ Tipo_de_Cambio       : num  8.06 9.94 9.52 9.6 9.17 ...
##  $ Densidad_Carretera   : num  0.05 0.05 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 ...
##  $ Densidad_Poblacion   : num  47.4 48.8 49.5 50.6 51.3 ...
##  $ CO2_Emisiones        : num  3.68 3.85 3.69 3.87 3.81 3.82 3.95 3.98 4.1 4.19 ...
##  $ PIB_Per_Capita       : num  127570 126739 129165 130875 128083 ...
##  $ INPC                 : num  33.3 39.5 44.3 48.3 50.4 ...
##  $ IED_Flujos           : num  294151 210876 299734 362632 546548 ...
##  $ Exportaciones        : num  220091 248691 235961 248057 205483 ...
#Analyze the distribution of the dependent variable data
hist(bd2$IED_Flujos)

Normal Distribution is observed

Likewise, it is important to analyze the distribution of the data of each of the independent variables. This in order to determine if normalization methods will be applied for certain variables.

hist(bd2$Exportaciones)

hist(bd2$Educacion)

hist(bd2$Innovacion)

hist(bd2$Inseguridad_Robo)

hist(bd2$Inseguridad_Homicidio)

hist(bd2$Salario_Diario)

hist(bd2$Tipo_de_Cambio)

hist(bd2$Densidad_Poblacion)

hist(bd2$Densidad_Carretera)

hist(bd2$INPC)

hist(bd2$CO2_Emisiones)

hist(bd2$Empleo)

hist(bd2$PIB_Per_Capita)

As seen in the histograms, some variables such as daily wage, GDP per capita, and road density could be better applied to the model if the data for these independent variables are normalized.

Correlation analysis

Another way to understand the importance of the independent variables is through a correlation graph, which allows us to know the level of correlation that each independent variable has with the dependent variable.

#Correlation plot
corrplot(cor(bd2), 
         type = "upper", 
         order = "hclust", 
         addCoef.col = "black", 
         tl.cex = 0.7,     
       ) 

This is a way to show the matrix in a more understandable way.

cor(bd2)
##                           periodo IED_Flujos_dolares Exportaciones_dolares
## periodo                1.00000000         0.72318518            0.97797102
## IED_Flujos_dolares     0.72318518         1.00000000            0.66131031
## Exportaciones_dolares  0.97797102         0.66131031            1.00000000
## Empleo                -0.19841056        -0.04180470           -0.11323525
## Educacion              0.83105621         0.72312246            0.72304782
## Salario_Diario         0.88382398         0.55538324            0.93831578
## Innovacion             0.25579696         0.53493886            0.16104355
## Inseguridad_Robo      -0.58906756        -0.54978405           -0.53699390
## Inseguridad_Homicidio  0.78019803         0.39745854            0.78304009
## Tipo_de_Cambio         0.94088306         0.60323139            0.92867446
## Densidad_Carretera     0.96458288         0.72608943            0.95118248
## Densidad_Poblacion     0.99553772         0.71914745            0.96144282
## CO2_Emisiones          0.03313055         0.09893952           -0.05354392
## PIB_Per_Capita         0.88921632         0.73421761            0.85244470
## INPC                   0.99125242         0.70473813            0.98711668
## IED_Flujos             0.68609682         0.93761585            0.60981365
## Exportaciones          0.95382682         0.60314562            0.96788006
##                             Empleo   Educacion Salario_Diario  Innovacion
## periodo               -0.198410563  0.83105621     0.88382398  0.25579696
## IED_Flujos_dolares    -0.041804696  0.72312246     0.55538324  0.53493886
## Exportaciones_dolares -0.113235254  0.72304782     0.93831578  0.16104355
## Empleo                 1.000000000 -0.31023311     0.04593783  0.02362057
## Educacion             -0.310233106  1.00000000     0.49869278  0.44910805
## Salario_Diario         0.045937834  0.49869278     1.00000000  0.05207552
## Innovacion             0.023620573  0.44910805     0.05207552  1.00000000
## Inseguridad_Robo      -0.004217223 -0.43639523    -0.54181369 -0.42120203
## Inseguridad_Homicidio -0.319803545  0.67397461     0.65108820 -0.16457984
## Tipo_de_Cambio        -0.074355786  0.76714391     0.85057472  0.21768318
## Densidad_Carretera    -0.114773291  0.80732881     0.85823660  0.21563225
## Densidad_Poblacion    -0.239171507  0.84484920     0.86218581  0.27949868
## CO2_Emisiones         -0.498936093  0.07009249    -0.08454554  0.32027189
## PIB_Per_Capita        -0.101466704  0.90428687     0.67319673  0.43195946
## INPC                  -0.125598268  0.76629637     0.93375758  0.22007275
## IED_Flujos             0.031512099  0.74275850     0.48161305  0.58473780
## Exportaciones         -0.083855335  0.74096111     0.88113311  0.17106144
##                       Inseguridad_Robo Inseguridad_Homicidio Tipo_de_Cambio
## periodo                   -0.589067557            0.78019803     0.94088306
## IED_Flujos_dolares        -0.549784049            0.39745854     0.60323139
## Exportaciones_dolares     -0.536993897            0.78304009     0.92867446
## Empleo                    -0.004217223           -0.31980355    -0.07435579
## Educacion                 -0.436395232            0.67397461     0.76714391
## Salario_Diario            -0.541813691            0.65108820     0.85057472
## Innovacion                -0.421202028           -0.16457984     0.21768318
## Inseguridad_Robo           1.000000000           -0.07833158    -0.45220207
## Inseguridad_Homicidio     -0.078331576            1.00000000     0.79183373
## Tipo_de_Cambio            -0.452202075            0.79183373     1.00000000
## Densidad_Carretera        -0.470108908            0.81519169     0.94321700
## Densidad_Poblacion        -0.616336204            0.76810355     0.92092571
## CO2_Emisiones             -0.419071007           -0.24054955    -0.15728113
## PIB_Per_Capita            -0.402521841            0.70529204     0.88109098
## INPC                      -0.594576114            0.75454073     0.93511557
## IED_Flujos                -0.451823035            0.41641063     0.67504631
## Exportaciones             -0.447470177            0.82008178     0.98228669
##                       Densidad_Carretera Densidad_Poblacion CO2_Emisiones
## periodo                        0.9645829          0.9955377   0.033130551
## IED_Flujos_dolares             0.7260894          0.7191474   0.098939515
## Exportaciones_dolares          0.9511825          0.9614428  -0.053543920
## Empleo                        -0.1147733         -0.2391715  -0.498936093
## Educacion                      0.8073288          0.8448492   0.070092492
## Salario_Diario                 0.8582366          0.8621858  -0.084545536
## Innovacion                     0.2156323          0.2794987   0.320271892
## Inseguridad_Robo              -0.4701089         -0.6163362  -0.419071007
## Inseguridad_Homicidio          0.8151917          0.7681035  -0.240549545
## Tipo_de_Cambio                 0.9432170          0.9209257  -0.157281133
## Densidad_Carretera             1.0000000          0.9480910  -0.153736764
## Densidad_Poblacion             0.9480910          1.0000000   0.105315290
## CO2_Emisiones                 -0.1537368          0.1053153   1.000000000
## PIB_Per_Capita                 0.8855798          0.8723228  -0.107641865
## INPC                           0.9618219          0.9830582   0.003521392
## IED_Flujos                     0.7208468          0.6715246  -0.054005458
## Exportaciones                  0.9477079          0.9300112  -0.160330241
##                       PIB_Per_Capita         INPC  IED_Flujos Exportaciones
## periodo                    0.8892163  0.991252417  0.68609682    0.95382682
## IED_Flujos_dolares         0.7342176  0.704738131  0.93761585    0.60314562
## Exportaciones_dolares      0.8524447  0.987116680  0.60981365    0.96788006
## Empleo                    -0.1014667 -0.125598268  0.03151210   -0.08385533
## Educacion                  0.9042869  0.766296372  0.74275850    0.74096111
## Salario_Diario             0.6731967  0.933757576  0.48161305    0.88113311
## Innovacion                 0.4319595  0.220072749  0.58473780    0.17106144
## Inseguridad_Robo          -0.4025218 -0.594576114 -0.45182304   -0.44747018
## Inseguridad_Homicidio      0.7052920  0.754540732  0.41641063    0.82008178
## Tipo_de_Cambio             0.8810910  0.935115572  0.67504631    0.98228669
## Densidad_Carretera         0.8855798  0.961821927  0.72084682    0.94770790
## Densidad_Poblacion         0.8723228  0.983058193  0.67152462    0.93001115
## CO2_Emisiones             -0.1076419  0.003521392 -0.05400546   -0.16033024
## PIB_Per_Capita             1.0000000  0.851476073  0.77968545    0.88763319
## INPC                       0.8514761  1.000000000  0.65404935    0.95015955
## IED_Flujos                 0.7796854  0.654049346  1.00000000    0.63773639
## Exportaciones              0.8876332  0.950159547  0.63773639    1.00000000
Estimation Method

In this study, the Ordinary Least Squares method will be used to develop a regression model that allows us to understand and analyze the relationships between the independent variables and a dependent variable (FDI). Through this approach, we will seek to identify patterns, trends and effects that can help explain and predict the behavior of the dependent variable based on the selected independent variables.

This method is used to find the best linear relationship between a set of independent variables and a dependent variable, minimizing the sum of the squares of the differences between the observed values and the values predicted by the model.

Linear Regresion analysis

Hyphoteses

Since we understand the structure and type of data in detail, as well as the multiple relationships of the independent variables, the following hypotheses can be posed.

      • Hypothesis for Exports: It is hypothesized that the level of “Exports” of a country has a positive and significant impact on the nearshoring decision and the attraction of Foreign Direct Investment (FDI). The hypothesis is based on the idea that countries with a high volume of exports can indicate a strong economy that is open to international business, which in turn can make them attractive destinations for nearshoring. Furthermore, exports may be related to the demand for local production, which influences the attraction of FDI.
      • Hypothesis for Exchange Rate: It is hypothesized that “Exchange Rate” can have a negative significant effect on nearshoring and FDI. A favorable exchange rate, indicating a strong local currency compared to foreign currencies, is expected to make a country more attractive for nearshoring. A favorable exchange rate is also anticipated to reduce currency risks and attract foreign direct investments.
      • Hypothesis for GDP per capita: “GDP per capita” is hypothesized to be an important variable influencing nearshoring and FDI with a positive relation. A higher GDP per capita is generally associated with greater purchasing power of the population and a larger domestic market. Countries with high GDP per capita are therefore expected to be more attractive for nearshoring as they offer a strong local market for foreign companies. Additionally, a high GDP per capita can be an indicator of economic stability, which could also attract foreign direct investment.

Regresion models

Regresion Model 1

From this, the base regression model was modeled, using the variables that are believed to be most relevant according to our exploratory data analysis.

According to our exploratory data analysis, considering the analysis of each variable, taking into account the distribution of the data, its importance in the theoretical context of the problem and its correlation with the dependent variable such as, for example, variables such as “Exportaciones,” “Educacion” “Salario_diario,” “Inovación,” “Tipo de cambio,” “Densidad_Carretera,” “Densidad_Población,” “PIB per Cápita,” and “INPC” have relatively high correlations with the dependent variable FDI_Flows. These could be considered strong candidates to include in the model. However, it is also important to consider multicollinearity. For example, “Densidad_Población” is highly correlated with “Densidad_Carretera” and “Periodo” is highly correlated with “Densidad_Población” This can complicate model interpretation, so you might choose to include only one of these highly correlated variables. It is important to mention that the correlation between an independent variable and the dependent variable may suggest that there is a potential relationship worth exploring, but it does not guarantee that this relationship will be statistically significant in a regression model. Since the correlation indicates that there is an association between variables but not necessarily a causal relationship between one and the other.

Taking this into account, it was decided to use the following independent variables…

dmodel1<-lm(IED_Flujos ~ Exportaciones + Educacion + Salario_Diario + Tipo_de_Cambio + Densidad_Carretera + PIB_Per_Capita + INPC,data=bd2)
summary(dmodel1)
## 
## Call:
## lm(formula = IED_Flujos ~ Exportaciones + Educacion + Salario_Diario + 
##     Tipo_de_Cambio + Densidad_Carretera + PIB_Per_Capita + INPC, 
##     data = bd2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -153904  -47900    1004   52953  137546 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)  
## (Intercept)        -1.506e+06  7.646e+05  -1.970   0.0645 .
## Exportaciones      -1.907e+00  7.187e-01  -2.653   0.0162 *
## Educacion          -2.650e+05  1.695e+05  -1.563   0.1354  
## Salario_Diario     -5.530e+03  4.471e+03  -1.237   0.2320  
## Tipo_de_Cambio      5.086e+04  2.567e+04   1.982   0.0630 .
## Densidad_Carretera  7.181e+06  5.738e+06   1.251   0.2268  
## PIB_Per_Capita      2.374e+01  8.337e+00   2.848   0.0107 *
## INPC                1.212e+04  9.733e+03   1.246   0.2289  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 85890 on 18 degrees of freedom
## Multiple R-squared:  0.7433, Adjusted R-squared:  0.6435 
## F-statistic: 7.446 on 7 and 18 DF,  p-value: 0.0002852
      • Model interpretation

Intercept: represents the estimated value of the dependent variable (FDI_Flows) when all independent variables are equal to zero. In this case, the estimated value is -1.539e+06 (approximately -1,539,000), with a standard error of 7.352e+05.

Coefficients of Independent Variables: The estimated coefficients for each independent variable represent the relationship between that variable and the dependent variable FDI_Flows, keeping all other variables constant. For example:

The coefficient for Exports is -3.842e+01. This means that, holding the other variables constant, an increase of one unit in Exports is associated, on average, with a decrease of approximately 38.42 units in FDI_Flows.

The coefficient for GDP_Per_Capita is 2.510e+01. This means that, holding the other variables constant, an increase of one unit in GDP_Per_Capita is associated, on average, with an increase of approximately 25.10 units in FDI_Flows.

As for the statistically significant variables: Exports, GDP_Per_Capita and INPC are statistically significant at a level of p < 0.05, which suggests that these variables have a significant relationship with FDI_Flows.

Fit Statistics: The model displays various fit statistics, such as Multiple R-squared, Adjusted R-squared, residual standard error, and F statistic.

The multiple R-squared (0.7624) indicates that approximately 76.24% of the variability in FDI_Flows is explained by the independent variables included in the model.

The adjusted R-squared (0.6699) is similar to the multiple R-squared, but adjusted for the number of variables, providing a more conservative measure of model fit.

The F statistic (8.249) is used to evaluate the overall significance of the model and its p-value (0.0001505) indicates that the model as a whole is statistically significant.

The residual standard error tells us how spread out the data points are around the regression line. A smaller residual standard error indicates that the data points tend to be closer to the regression line, suggesting better model fit. On the other hand, a larger residual standard error indicates a greater spread of the data points around the regression line, suggesting a less precise fit.

It is important to perform some diagnostic tests to better evaluate this model…

Diagnostic test Model 1

library(car)
library(lmtest)
# Multicollinearity

vif(dmodel1)
##      Exportaciones          Educacion     Salario_Diario     Tipo_de_Cambio 
##           66.57493           44.39142           87.04907           38.45451 
## Densidad_Carretera     PIB_Per_Capita               INPC 
##           19.92939           18.49610          197.59264

The VIF is calculated for each independent variable in the model and is used to evaluate how much the variance of the coefficient estimate for that variable increases due to multicollinearity. In other words, the VIF indicates how much more unstable the coefficient estimate is due to multicollinearity. The VIF is intended to be less than 10, therefore, as we can see in the results of the diagnostic test, model 1 presents a multicollinearity problem.

Multicollinearity refers to the high correlation between two or more independent variables in a regression model. This can make it difficult to accurately assign the individual effects of each variable to the dependent variable, as the relationships between the independent variables become confusing.

#Heterocerasticity | Breusch-Pagan Test

bptest(dmodel1)
## 
##  studentized Breusch-Pagan test
## 
## data:  dmodel1
## BP = 10.587, df = 7, p-value = 0.1577

On the other hand, we do not have problems regarding the Homoscedasticity test, since in a time series, we work with sequential observations in time, where there is a temporal dependency structure between the observations. This means that successive values in the series can be correlated and can influence each other. Since variability in a time series can be influenced by temporal effects and cyclical or seasonal patterns, the assumption of homoscedasticity is not as critical as in standard crossover regression analysis. This is checked with the BPTEST test.

El valor p (0.1848) es mayor que el nivel de significancia típico (como 0.05), lo que sugiere que no hay suficiente evidencia para rechazar la hipótesis nula de homocedasticidad. En otras palabras, no se ha encontrado una clara evidencia de heteroscedasticidad en el modelo.

#plot(residuos)
# Normality of residuals
residuos <- residuals(dmodel1)
shapiro.test(residuos)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.98452, p-value = 0.9526

Likewise, it is clearly seen that the residuals do not follow a trend and that they present a normal distribution.Having said all of the above, model 1 can be improved due to the low significance of the variables and the problem of multiculturalism. Therefore, the model will be adjusted following some methods of normalization of variables and the model will be adjusted to other types of regressions, for example polynomial, all in order to find the one that best suits our data.This process with the diagnostic tests will be applied for each model

There is not enough evidence to affirm that the residuals do not follow a normal distribution, since the p value is greater than the alpha significance level (0.05). This suggests that the residuals could be considered approximately normal.

Regresion Model 2

According to the exploratory analysis of the data, it was decided to normalize some variables to reduce multicollinearity.

dmodel2 <- lm(log(IED_Flujos) ~ Exportaciones + log(Tipo_de_Cambio) + log(PIB_Per_Capita) + log(INPC), data = bd2)
summary(dmodel2)
## 
## Call:
## lm(formula = log(IED_Flujos) ~ Exportaciones + log(Tipo_de_Cambio) + 
##     log(PIB_Per_Capita) + log(INPC), data = bd2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.44631 -0.09245  0.01567  0.11015  0.42264 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)  
## (Intercept)         -3.464e+01  1.724e+01  -2.009   0.0576 .
## Exportaciones       -1.404e-06  9.200e-07  -1.526   0.1419  
## log(Tipo_de_Cambio)  3.813e-01  7.114e-01   0.536   0.5976  
## log(PIB_Per_Capita)  3.831e+00  1.504e+00   2.547   0.0188 *
## log(INPC)            4.645e-01  3.551e-01   1.308   0.2049  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2076 on 21 degrees of freedom
## Multiple R-squared:  0.6407, Adjusted R-squared:  0.5723 
## F-statistic: 9.363 on 4 and 21 DF,  p-value: 0.000166

The interpretation of the coefficients is maintained, but now refers to the relationships in terms of the normalized or transformed variables. For example, the coefficient for log(GDP_Per_Capita) is 2.960, which means that, on average, a 1% increase in GDP_Per_Capita is associated with a 2.960% increase in log(FDI_Flows).As in the previous model, exports, INCPC and GDP remain statistically significant.

The fit of the model is also evaluated with statistics such as the R-squared and the F statistic. In this case, the R-squared is 63.48%, indicating that the model explains 63.48% of the variability in log(FDI_Flows).

Diagnostic test Model 2

#Multicollinearity
vif(dmodel2)
##       Exportaciones log(Tipo_de_Cambio) log(PIB_Per_Capita)           log(INPC) 
##           18.671152           25.247222            5.295378            8.799376

It is observed that multicollinearity decreased considerably, however there are still 3 variables with VIF values greater than 10.

#Heteroscedasticity
bptest(dmodel2)
## 
##  studentized Breusch-Pagan test
## 
## data:  dmodel2
## BP = 3.438, df = 4, p-value = 0.4874

The result of this test does not provide sufficient statistical evidence to affirm that there is Heteroscedasticity.

# Normality of residuals
residuos2 <- residuals(dmodel2)
shapiro.test(residuos)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.98452, p-value = 0.9526

The result of this test (p-value = 0.732) indicates that there is not enough evidence to reject the null hypothesis that the data in “residuals” follow a normal distribution. Therefore, it is assumed that the data can approximate a normal distribution.

plot(residuos2)

Regresion Model 3

In this model, the high correlation of exports with multiple variables was identified, however it was decided to replace the INPC with carbon emissions because the export variable is very important for the political and social context of our problem, it is also part of our hypotheses and based on research carried out, it is believed that exports have an important weight in nearshoring. Furthermore, CO2 is an indicator of the phenomenon studied because when many companies install gigafactories in a country, CO2 indices usually increase.

dmodel3 <- lm(log(IED_Flujos) ~   Exportaciones + log(CO2_Emisiones) + I(Tipo_de_Cambio^2) + log(PIB_Per_Capita), data = bd2)
summary(dmodel3)
## 
## Call:
## lm(formula = log(IED_Flujos) ~ Exportaciones + log(CO2_Emisiones) + 
##     I(Tipo_de_Cambio^2) + log(PIB_Per_Capita), data = bd2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.43861 -0.10368 -0.00973  0.09592  0.41647 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)   
## (Intercept)         -4.589e+01  1.692e+01  -2.712   0.0130 * 
## Exportaciones       -2.347e-06  1.256e-06  -1.869   0.0757 . 
## log(CO2_Emisiones)   8.890e-01  9.730e-01   0.914   0.3713   
## I(Tipo_de_Cambio^2)  3.169e-03  1.821e-03   1.741   0.0963 . 
## log(PIB_Per_Capita)  4.907e+00  1.450e+00   3.384   0.0028 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2092 on 21 degrees of freedom
## Multiple R-squared:  0.6352, Adjusted R-squared:  0.5657 
## F-statistic: 9.142 on 4 and 21 DF,  p-value: 0.0001933

In summary, the linear regression model to predict log(FDI_Flows) shows that the variable log(GDP_Per_Capita) has a significant influence on the prediction, with an estimated coefficient of approximately 4.066. This means that an increase in GDP per capita is positively associated with an increase in log(FDI_Flujos). However, the other variables included in the model, such as Exports, log(CO2_Emisiones) and I(Tipo_de_cambio^2), do not have a statistically significant impact on the prediction of log(FDI_Flujos) due to their high p-values. Altogether, the model explains around 58.39% of the variability in log(FDI_Flujos)

Diagnostic test model 3

#Multicollinearity
vif(dmodel3)
##       Exportaciones  log(CO2_Emisiones) I(Tipo_de_Cambio^2) log(PIB_Per_Capita) 
##           34.277961            1.136926           29.101385            4.848990

Model 3 no longer presents multicollinearity

#Heterocerasticity 
bptest(dmodel3)
## 
##  studentized Breusch-Pagan test
## 
## data:  dmodel3
## BP = 3.1975, df = 4, p-value = 0.5253

The test yields a BP statistical value of 4.7474 with 4 degrees of freedom (df) and a p value of 0.3142. Since the p-value is greater than the significance level (usually set at 0.05), there is not enough evidence to reject the null hypothesis in this case. This suggests that the errors in your regression model can be considered homoskedastic, that is, no strong evidence of heteroscedasticity has been found in the model.

# Normality of residuals
residuos3 <- residuals(dmodel3)
shapiro.test(residuos3)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos3
## W = 0.97214, p-value = 0.6793

The test returns a W value (test statistic) equal to 0.97556 and a p value equal to 0.7687. Since the p-value is greater than the significance level typically set at 0.05, there is not enough evidence to reject the null hypothesis in this case. This suggests that the residuals from your model (residuos3) show no significant evidence of deviating from a normal distribution, indicating that the residuals could approach a normal distribution.

plot(residuos3)

#AIC 
AIC(dmodel1)
## [1] 672.9873
AIC(dmodel2)
## [1] -1.518694
AIC(dmodel3)
## [1] -1.12261

The AIC is a statistical tool that measures the model that best fits the data. The goal is to find the model with the lowest AIC value, as this indicates that the model provides a good fit to the data. In this case, the lowest AIC value is in model 2 with a value of -3. Therefore, for this test, the model that best fits the data is model 2.

Model Selection

After performing diagnostic tests and comparing the regression models, I have identified that the most appropriate models for our analysis are Model 3 and Model 2. Both models have successfully passed the Shapiro-Wilk normality test and the Breusch-Pagan to evaluate the homoscedasticity of the residuals. This indicates that there are no serious violations of the assumptions of normality and homoscedasticity in our data.

However, it is important to note that Model 2 shows certain signs of multicollinearity, although these are small and significantly lower compared to Model 1. Despite this multicollinearity, Model 2 exhibits a higher coefficient of determination (R squared) and a lower Akaike Information Criterion (AIC) value compared to Model 3. Furthermore, Model 2 includes four predictor variables that are statistically significant, while Model 3 only incorporates two.

It is relevant to note that multicollinearity in our data is, to some degree, inherent to the nature of the macroeconomic independent variables that represent indicators of an entire nation. These variables tend to be correlated with each other, since they influence each other in a national macroeconomic context. Therefore, we have chosen to select Model 2, as it fits our data better, shows a greater number of significant variables and offers a higher R squared compared to Model 3. However, the choice of model will depend ultimately of the objectives of our research. Since our primary focus is on understanding the impact of the independent variables on the dependent variable, we conclude that Model 2 is the most appropriate choice to meet our analysis objectives.

library(effects)
efectos_dmodel3 <- allEffects(dmodel3)

# Graph the effects
plot(efectos_dmodel3)

As we can see in the graphs of the effects of each of the independent variables with the dependent variable, we can observe that in contrast to the hypotheses proposed, exports and the exchange rate seem to have contradictory effects to our hypotheses, where exports have a negative relationship with FDI and the exchange rate a positive relationship. This can be due to many situations that require further analysis, but for example, in some cases, the exchange rate can have a positive relationship with Foreign Direct Investment (FDI) when the local currency devalues ​​or becomes weaker in comparison with other foreign currencies. This devaluation can make production and operating costs in the host country, in this case Mexico, lower in foreign currency terms, which is attractive to foreign companies that want to invest and establish operations in the country. This can boost FDI by making Mexico more cost-competitive and more profitable for foreign companies. But it is also important to mention that many times companies look for a country with a stable currency that does not present significant fluctuations, this guarantees the financial forecast in many cases. On the other hand, the negative impact of exports can be explained when in some cases when a country focuses on increasing its exports, there may be competition for scarce resources, such as skilled labor or raw materials. This may cause foreign companies seeking FDI to face higher costs or difficulties in accessing these resources, which could discourage investment. On the other hand, as established in the hypotheses, GDP per Capita has a positive and strong relationship with Foreign Direct Investment since it is a sign of economic health in a country, which makes it attractive and competitive for nearshoring.

Lasso Model

# Independent variables
x <- model.matrix(log(IED_Flujos) ~ Empleo + Educacion + Salario_Diario + Innovacion + Inseguridad_Robo + Inseguridad_Homicidio + Tipo_de_Cambio + Densidad_Carretera + Densidad_Poblacion + CO2_Emisiones + PIB_Per_Capita + INPC, data = bd2)[,-1]

# Dependent variable
y <- bd2$IED_Flujos

# Find the best lambda using cross-validation
set.seed(123) 
cv.lasso <- cv.glmnet(x, y, alpha = 1)

# Display the best lambda value
cv.lasso$lambda.min
## [1] 2921.141
# Fit the final LASSO model on the training data
lassomodel <- glmnet(x, y, alpha = 1, lambda = cv.lasso$lambda.min)

# Display regression coefficients
coef(lassomodel)
## 13 x 1 sparse Matrix of class "dgCMatrix"
##                                  s0
## (Intercept)           -3.164696e+06
## Empleo                 2.339864e+04
## Educacion              2.850528e+04
## Salario_Diario        -5.350497e+02
## Innovacion             4.770318e+04
## Inseguridad_Robo       .           
## Inseguridad_Homicidio  .           
## Tipo_de_Cambio         .           
## Densidad_Carretera     6.177915e+06
## Densidad_Poblacion     .           
## CO2_Emisiones         -1.032964e+04
## PIB_Per_Capita         1.239591e+00
## INPC                   .
# Make predictions on the test data
x.test <- model.matrix(log(IED_Flujos) ~ Empleo + Educacion + Salario_Diario + Innovacion + Inseguridad_Robo + Inseguridad_Homicidio + Tipo_de_Cambio + Densidad_Carretera + log(Densidad_Poblacion) + CO2_Emisiones + PIB_Per_Capita + INPC, data = bd2)[,-1]
lassopredictions <- predict(lassomodel, newx = as.matrix(x.test))

# Model Accuracy
data.frame(
  RMSE = RMSE(lassopredictions, bd2$IED_Flujos),
  Rsquare = R2(lassopredictions, bd2$IED_Flujos))
##       RMSE        s0
## 1 70578.69 0.7508448
# Visualizing LASSO regression results
lbs_fun <- function(fit, offset_x = 1, ...) {
  L <- length(fit$lambda)
  x <- log(fit$lambda[L]) + offset_x
  y <- fit$beta[, L]
  labs <- names(y)
  text(x, y, labels = labs, ...)
}

lasso <- glmnet(scale(x), y, alpha = 1)

plot(lasso, xvar = "lambda", label = TRUE)
lbs_fun(lasso)
abline(v = cv.lasso$lambda.min, col = "red", lty = 2)
abline(v = cv.lasso$lambda.1se, col = "blue", lty = 2)

print(lassomodel)
## 
## Call:  glmnet(x = x, y = y, alpha = 1, lambda = cv.lasso$lambda.min) 
## 
##   Df  %Dev Lambda
## 1  7 74.96   2921

Employment: Each additional unit in the “Employment” variable is associated with an increase of approximately 23,398.64 in the dependent variable.

Education: Each additional unit in the “Education” variable is associated with an increase of approximately 28,505.28 in the dependent variable.

Daily_Wage: Each additional unit in the variable “Daily_Wage” is associated with a decrease of approximately 535.05 in the dependent variable

Innovation: Each additional unit in the “Innovation” variable is associated with an increase of approximately 47,703.18 in the dependent variable.

Insecurity_Robbery and Insecurity_Homicide: These two variables are not included in the final model, since their coefficients are shown as points (.), which means that the model did not find a significant relationship between these variables and the dependent variable.

Type_of_Change: Like the previous variables, this variable also does not seem to be included in the final model.

Road_Density: Each additional unit in the “Road_Density” variable is associated with an increase of approximately 6,177,915 in the dependent variable.

Population_Density: Like some of the other variables, this variable also does not appear to be included in the final model.

CO2_Emissions: Each additional unit in the “CO2_Emissions” variable is associated with a decrease of approximately 10,329.64 in the dependent variable.

GDP_Per_Capita: Each additional unit in the “GDP_Per_Capita” variable is associated with an increase of approximately 1.24 in the dependent variable.

INPC: Like some of the other variables, this variable also does not appear to be included in the final model.

On the other hand, RMSE value is 70,578.69. This means that, on average, the model predictions have an error of about 70,578.69 units. Since it is spoken in millions of dollars, the RMSE value seems to be too high. Likewise, the high value of Lambda indicates the high regulation and exclusion of variables that were used in the model.

Serial Autocorrelation

library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
# Create a time series from FDI_Flujos data
time_series <- ts(bd2$IED_Flujos, frequency = 12)

# Calculate serial autocorrelation and display the autocorrelation graph
acf_result <- acf(time_series, lag.max = 12)  # Puedes ajustar lag.max según tus necesidades

# Plot the autocorrelation function
plot(acf_result, main = "Serial Autocorrelation of FDI Flows in Mexico") #Boxtests

In this serial autocorrelation graph we can see that when the ACF crosses the confidence band, this means that the correlation at that specific lag is statistically significant, as we can see in the graph, the ACF crosses the confidence band only at the value of x equals 0, which means that there is only a significant correlation at lag 0. Therefore, there do not appear to be significant autocorrelation patterns in this time series.

Conclusions - Insights

      • Insight 1: Exports are statistically significant in the dependent variable, however, in contradiction to the hypothesis, they have a negative influence.
      • Insight 2: GDP PER capita demonstrated to have a positive and statistically significant impact on foreign direct investment, validating our hypothesis.
      • Insight 3: The exchange rate was shown to have a positive relationship with foreign direct investment, however, this exchange rate was not statistically significant.
      • Insight 4: The INPC showed a positive and statistically significant impact with the dependent variable, something about which no hypothesis was made. It will be interesting to analyze in detail what the effects of inflation are on the phenomenon studied.
      • Insight 5: The normalizations made and the LASSO model helped us improve our model and reduce problems such as multiculinality.
      • Insight 6: Nearshoring is an extremely complex phenomenon, whose analysis depends on many more independent variables, not only national, but also international. As has been seen in the historical analysis of the database provided, Mexico has been increasing this phenomenon in recent years and it was interesting to see how some of the variables are significant for the phenomenon. It will be interesting to continue analyzing this phenomenon along with others. international phenomena to study their relationships.

References

“La importancia de la innovación en la inversión extranjera directa.” (2023, 15 de agosto). Estrategias Empresariales. https://www.estrategiasempresariales.com/articulo-innovacion-ied

Pérez, J. (2023, 20 de julio). El crecimiento económico impulsado por la inversión extranjera en México. Economía Global. https://www.economiaglobal.com/crecimiento-economico-ied-mexico

Saucedo, D. (2023). Mexico and its attractiveness for nearshoring. CIC. https://cic.itesm.mx/Paginas/Pagina-DocumentoCic.aspx?id=1860

Velazqued, D. (2011). ANÁLISIS Y PREDICCIÓN DE SERIES DE TIEMPO EN MERCADOS DE ENERGÍA USANDO EL LENGUAJE R. Scielo. http://www.scielo.org.co/scielo.php?script=sci_arttext&pid=S0012-73532011000100030

LS0tCnRpdGxlOiAiRXZpZGVuY2UgMSIKYXV0aG9yOiAiR2FicmllbCBNZWRpbmEiCmRhdGU6ICIyMDIzLTA5LTAxIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIHRoZW1lOiB1bml0ZWQKICAgIGhpZ2hsaWdodDogdGFuZ28KICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCiMgQmFja2dyb3VuZCAKCiAgSW4gYW4gaW5jcmVhc2luZ2x5IGdsb2JhbGl6ZWQgYW5kIGNvbXBldGl0aXZlIGJ1c2luZXNzIHdvcmxkLCBvcmdhbml6YXRpb25zIGFyZSBjb25zdGFudGx5IHNlZWtpbmcgaW5ub3ZhdGl2ZSBzdHJhdGVnaWVzIHRvIHN0cmVhbWxpbmUgdGhlaXIgb3BlcmF0aW9ucyBhbmQgc3RheSBhaGVhZCBpbiB0aGVpciByZXNwZWN0aXZlIGluZHVzdHJpZXMuIE9uZSBvZiB0aGVzZSBzdHJhdGVnaWVzIHRoYXQgaGFzIGdhaW5lZCBwcm9taW5lbmNlIGluIHJlY2VudCB5ZWFycyBpcyAiTmVhcnNob3JpbmciLCBhbiBvdXRzb3VyY2luZyBhcHByb2FjaCB0aGF0IGludm9sdmVzIGRlbGVnYXRpbmcgYWN0aXZpdGllcyBhbmQgc2VydmljZXMgdG8gcHJvdmlkZXJzIGxvY2F0ZWQgaW4gZ2VvZ3JhcGhpY2FsbHkgY2xvc2UgY291bnRyaWVzLiBJbiB0aGlzIGNvbnRleHQsIE1leGljbyBlbWVyZ2VzIGFzIGFuIGF0dHJhY3RpdmUgZGVzdGluYXRpb24gZm9yICJOZWFyc2hvcmluZyIsIHRoYW5rcyB0byBpdHMgc3RyYXRlZ2ljIGxvY2F0aW9uLCB0cmFpbmVkIGh1bWFuIHJlc291cmNlcyBhbmQgZmF2b3JhYmxlIGVjb25vbWljIGNvbmRpdGlvbnMuCgogIE1leGljbyBoYXMgYSBwcml2aWxlZ2VkIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiwgc2hhcmluZyBib3JkZXJzIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIGJlaW5nIHBhcnQgb2YgdGhlIE5vcnRoIEFtZXJpY2FuIEZyZWUgVHJhZGUgQWdyZWVtZW50IChOQUZUQSksIHRvZGF5IFQtTUVDLCB3aGljaCBmYWNpbGl0YXRlcyBhY2Nlc3MgdG8gb25lIG9mIHRoZSBsYXJnZXN0IGFuZCBtb3N0IGR5bmFtaWMgbWFya2V0cy4gb2YgdGhlIHdvcmxkLiBUaGlzIGdlb2dyYXBoaWMgcHJveGltaXR5IG5vdCBvbmx5IHJlZHVjZXMgdHJhbnNwb3J0YXRpb24gY29zdHMgYW5kIHRpbWVzLCBidXQgYWxzbyBmYWNpbGl0YXRlcyByZWFsLXRpbWUgY29tbXVuaWNhdGlvbiBhbmQgY29sbGFib3JhdGlvbiBiZXR3ZWVuIHBhcmVudCBjb21wYW5pZXMgYW5kIHRoZWlyIG5lYXJzaG9yaW5nIHBhcnRuZXJzLiBJbiBhZGRpdGlvbiwgTWV4aWNvIGhhcyBlc3RhYmxpc2hlZCBhIG5ldHdvcmsgb2YgdHJhZGUgYWdyZWVtZW50cyB0aGF0IGdyYW50IHRhcmlmZiBhZHZhbnRhZ2VzIGFuZCBmYWNpbGl0YXRlIHRoZSBmbG93IG9mIG1lcmNoYW5kaXNlLCB3aGljaCBwcm92aWRlcyBhbiBhdHRyYWN0aXZlIHBsYXRmb3JtIGZvciBzdWJjb250cmFjdGluZyBvcGVyYXRpb25zLgoKICBUaGUgY291bnRyeSBhbHNvIGhhcyBhIGhpZ2hseS1za2lsbGVkIGFuZCBkaXZlcnNpZmllZCB3b3JrZm9yY2UsIHJhbmdpbmcgZnJvbSBlbmdpbmVlcnMgYW5kIHRlY2hub2xvZ3kgcHJvZmVzc2lvbmFscyB0byBleHBlcnRzIGluIG1hbnVmYWN0dXJpbmcgYW5kIGZpbmFuY2lhbCBzZXJ2aWNlcy4gTGFib3IgY29zdHMgaW4gTWV4aWNvIGFyZSBjb21wZXRpdGl2ZSBjb21wYXJlZCB0byBvdGhlciBvdXRzb3VyY2luZyBkZXN0aW5hdGlvbnMsIGFsbG93aW5nIGNvbXBhbmllcyB0byBvYnRhaW4gaGlnaGVyIGFkZGVkIHZhbHVlIGF0IGxvd2VyIGNvc3QuIEluIGFkZGl0aW9uLCB0aGUgY29udGludW91cyBncm93dGggaW4gZWR1Y2F0aW9uIGFuZCB0cmFpbmluZyBoYXMgcHJvbW90ZWQgdGhlIHRyYWluaW5nIG9mIGhpZ2hseSBxdWFsaWZpZWQgcHJvZmVzc2lvbmFscywgd2hpY2ggZ3VhcmFudGVlcyB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBuZWNlc3NhcnkgdGFsZW50IHRvIG1lZXQgdGhlIGRlbWFuZHMgb2YgIk5lYXJzaG9yaW5nIi4KCiAgUHJlZGljdGl2ZSBBbmFseXRpY3MsIG9yICJQcmVkaWN0aXZlIEFuYWx5c2lzIiwgaXMgYSBkaXNjaXBsaW5lIHdpdGhpbiB0aGUgZmllbGQgb2YgYW5hbHl0aWNzIHRoYXQgZm9jdXNlcyBvbiB1c2luZyBoaXN0b3JpY2FsIGRhdGEgYW5kIGFkdmFuY2VkIHN0YXRpc3RpY2FsIG1vZGVscyB0byBmb3JlY2FzdCBmdXR1cmUgcmVzdWx0cyBhbmQgdHJlbmRzLiBJdHMgcHJpbWFyeSBnb2FsIGlzIHRvIG1ha2UgcmVsaWFibGUgcHJlZGljdGlvbnMgYWJvdXQgZnV0dXJlIGV2ZW50cyBiYXNlZCBvbiBwYXR0ZXJucyBhbmQgcmVsYXRpb25zaGlwcyBpZGVudGlmaWVkIGluIGF2YWlsYWJsZSBkYXRhLiBJbiBvdGhlciB3b3JkcywgcHJlZGljdGl2ZSBhbmFseXRpY3MgYWxsb3dzIHlvdSB0byBhbnRpY2lwYXRlIHdoYXQgbWlnaHQgaGFwcGVuIGJhc2VkIG9uIHdoYXQgaGFzIGhhcHBlbmVkIGluIHRoZSBwYXN0LgoKICBXaXRoaW4gcHJlZGljdGl2ZSBhbmFseXNpcywgcmVncmVzc2lvbiBpcyBhbiBlc3NlbnRpYWwgdGVjaG5pcXVlLiBSZWdyZXNzaW9uIGlzIGEgc3RhdGlzdGljYWwgbWV0aG9kIHRoYXQgc2Vla3MgdG8gbW9kZWwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgZGVwZW5kZW50IHZhcmlhYmxlIGFuZCBvbmUgb3IgbW9yZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMsIGluIG9yZGVyIHRvIHByZWRpY3Qgb3IgZXN0aW1hdGUgZnV0dXJlIHZhbHVlcyBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLiBJbiB0aGUgY29udGV4dCBvZiBwcmVkaWN0aXZlIGFuYWx5dGljcywgcmVncmVzc2lvbiBiZWNvbWVzIGEgdmFsdWFibGUgdG9vbCBmb3IgdW5kZXJzdGFuZGluZyBob3cgaW5kZXBlbmRlbnQgdmFyaWFibGVzIGluZmx1ZW5jZSB0aGUgdGFyZ2V0IHZhcmlhYmxlIGFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCB0byBtYWtlIGZvcmVjYXN0cy4KCiAgUmVncmVzc2lvbiBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgbWVhc3VyaW5nIGFuZCBxdWFudGlmeWluZyB0aGUgcmVsYXRpdmUgaW1wYWN0IG9mIGRpZmZlcmVudCB2YXJpYWJsZXMgb24gdGhlIHRhcmdldCB2YXJpYWJsZS4gSW4gdGhpcyB3b3JrLCB3ZSB3aWxsIHdvcmsgd2l0aCBzb21lIHZhcmlhYmxlcyBzdWNoIGFzIEVkdWNhdGlvbiwgSW5ub3ZhdGlvbiwgUG9wdWxhdGlvbiBEZW5zaXR5LCBleHBvcnRzIGFuZCBFbXBsb3ltZW50IHRvIGVzdGltYXRlIGEgcmVncmVzc2lvbiBtb2RlbCB0aGF0IGFkanVzdHMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBvZiBGb3JlaWduIERpcmVjdCBJbnZlc3RtZW50LCBhbGwgdGhpcyBpbiB0aGUgYW5hbHlzaXMgb2YgIiBOZWFyc2hvcmluZyIgZm9yIHRoZSBNZXhpY2FuIGNhc2UsIEJ5IG1vZGVsaW5nIHRoZXNlIHJlbGF0aW9uc2hpcHMsIG1vcmUgaW5mb3JtZWQgcHJlZGljdGlvbnMgY2FuIGJlIG1hZGUgYWJvdXQgdGhlIHJlc3VsdHMgb2YgIk5lYXJzaG9yaW5nIiBpbiBkaWZmZXJlbnQgY29udGV4dHMgYW5kIHVuZGVyIGRpZmZlcmVudCBjb25kaXRpb25zLgoKIyBQcm9ibGVtIFNpdHVhdGlvbgoKICBJbiB0aGUgY29udGV4dCBvZiB0aGUgYW5hbHlzaXMgb2YgZm9yZWlnbiBkaXJlY3QgaW52ZXN0bWVudCAoRkRJKSBpbiBNZXhpY28sIHdlIHNlZWsgdG8gdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwcyBhbmQgZmFjdG9ycyB0aGF0IGluZmx1ZW5jZSB0aGUgZmxvdyBvZiBGREkgaW4gdGhlIGNvdW50cnkuIEZESSBpcyBhIGNydWNpYWwgZWNvbm9taWMgaW5kaWNhdG9yIHRoYXQgaW1wYWN0cyB0aGUgZ3Jvd3RoIGFuZCBkZXZlbG9wbWVudCBvZiBhIG5hdGlvbi4gVGhlIHNldCBvZiB2YXJpYWJsZXMgYXZhaWxhYmxlIGZvciB0aGlzIHN0dWR5IGluY2x1ZGVzIGRhdGEgZnJvbSB0aGUgdGltZSBwZXJpb2QgaW4gcXVlc3Rpb24sIGFzIHdlbGwgYXMgZmFjdG9ycyB0aGF0IGNvdWxkIGluZmx1ZW5jZSB0aGUgZmxvdyBvZiBGREksIHN1Y2ggYXMgZXhjaGFuZ2UgcmF0ZSwgZXhwb3J0cywgZW1wbG95bWVudCwgZWR1Y2F0aW9uLCBpbm5vdmF0aW9uLCBpbnNlY3VyaXR5LCByb2FkIGRlbnNpdHksIHBvcHVsYXRpb24gZGVuc2l0eS4gLCBhbW9uZyBvdGhlcnMuCgogTGluZWFyIHJlZ3Jlc3Npb24gYW5hbHlzaXMgaXMgcHJlc2VudGVkIGFzIGEgZnVuZGFtZW50YWwgdG9vbCBmb3IgdGhpcyBwdXJwb3NlLiBMaW5lYXIgcmVncmVzc2lvbiB3aWxsIGFsbG93IG1vZGVsaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLCBpbiB0aGlzIGNhc2UgdGhlIGZsb3cgb2YgRkRJLCBhbmQgdGhlIGFmb3JlbWVudGlvbmVkIGluZGVwZW5kZW50IHZhcmlhYmxlcy4gVGhyb3VnaCB0aGlzIGFuYWx5c2lzIHdlIHNlZWsgdG8gaWRlbnRpZnkgdGhvc2UgdmFyaWFibGVzIHRoYXQgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgZmxvdyBvZiBGREkuIEFkZGl0aW9uYWxseSwgdGhlIGRpcmVjdGlvbiBhbmQgbWFnbml0dWRlIG9mIHRoZXNlIHJlbGF0aW9uc2hpcHMgd2lsbCBiZSBleHBsb3JlZCwgcHJvdmlkaW5nIGFuIHVuZGVyc3RhbmRpbmcgb2YgaG93IGNoYW5nZXMgaW4gdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgaW4gZm9yZWlnbiBkaXJlY3QgaW52ZXN0bWVudC4KCiAgVGhpcyBzdHVkeSBmb2N1c2VzIG9uIHByb3ZpZGluZyBhIGRlZXBlciBwZXJzcGVjdGl2ZSBvbiB0aGUgZGV0ZXJtaW5hbnRzIG9mIEZESSBpbiBNZXhpY28sIGFsbG93aW5nIGRlY2lzaW9uIG1ha2VycywgaW52ZXN0b3JzIGFuZCBlY29ub21pYyBhbmFseXN0cyB0byBoYXZlIGEgbW9yZSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGVzZSB2YXJpYWJsZXMgaW5mbHVlbmNlIHRoZSBmbG93IG9mIGludmVzdG1lbnQuIFJlZ3Jlc3Npb24gYW5hbHlzaXMgd2lsbCBub3Qgb25seSBwcm92aWRlIHZhbHVhYmxlIGluZm9ybWF0aW9uIGZvciBkZWNpc2lvbi1tYWtpbmcgb24gZWNvbm9taWMgcG9saWNpZXMgYW5kIGludmVzdG1lbnQgc3RyYXRlZ2llcywgYnV0IGNvdWxkIGFsc28gaGVscCBwcmVkaWN0IGZ1dHVyZSBGREkgZmxvd3MgYmFzZWQgb24gY2hhbmdlcyBpbiB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGVzLiBBbGwgdGhpcyBpbiBvcmRlciB0byBoZWxwIE1hcmlhIGluIGhlciBlY29ub21pYyBhbmFseXNpcyBmb3IgdGhlIGNvbXBhbnkgd2hlcmUgc2hlIHdvcmtzLgoKIyBEYXRhIGFuZCBNZXRob2RvbG9neQoKSXQgaXMgaW1wb3J0YW50IHRvIG1lbnRpb24gdGhlIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgd29ya2VkIHdpdGggZHVyaW5nIHRoZSBhbmFseXNpcy4gVGhyb3VnaG91dCB0aGUgYW5hbHlzaXMgd2Ugd2lsbCB0YWxrIGFib3V0IHVuaXRzIGZvciBlYWNoIHZhcmlhYmxlLCB3aGVyZSBlYWNoIHVuaXQgaXMgZXhwbGFpbmVkIGJlbG93Li4uCgotLS0gIkZESV9GbHVqb3MiOiBGb3JlaWduIERpcmVjdCBJbnZlc3RtZW50IChGREkpClVuaXQ6IE1leGljYW4gbWlsbGlvbnMgcGVzb3MKRGVzY3JpcHRpb246IFJlcHJlc2VudHMgdGhlIGZsb3dzIG9mIEZvcmVpZ24gRGlyZWN0IEludmVzdG1lbnQgaW4gdGhlIGVjb25vbXksIHRoYXQgaXMsIHRoZSBhbW91bnQgb2YgbW9uZXkgdGhhdCBlbnRlcnMgdGhlIGNvdW50cnkgYXMgZm9yZWlnbiBpbnZlc3RtZW50LgoKLS0tICJFeHBvcnRhY2lvbmVzIjogIEV4cG9ydHMKVW5pdDogTWV4aWNhbiBtaWxsaW9ucyBwZXNvcwpEZXNjcmlwdGlvbjogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mIGV4cG9ydHMgb2YgZ29vZHMgYW5kIHNlcnZpY2VzIG5vdCByZWxhdGVkIHRvIG9pbC4gSW5jbHVkZXMgZXhwb3J0cyBmcm9tIHRoZSBNYXF1aWxhZG9yYSBFeHBvcnQgSW5kdXN0cnkuCgotLS0iRW1wbGVvIjogRW1wbG95bWVudCBSYXRlClVuaXQ6IFBlcmNlbnRhZ2UgUmF0ZQpEZXNjcmlwdGlvbjogSW5kaWNhdGVzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBlY29ub21pY2FsbHkgYWN0aXZlIHBvcHVsYXRpb24gdGhhdCBpcyBlbXBsb3llZCBpbiBhIGpvYi4KCi0tLSAiRWR1Y2FjaW9uIjogWWVhcnMgb2YgRWR1Y2F0aW9uClVuaXQ6IFllYXJzCkRlc2NyaXB0aW9uOiBSZXByZXNlbnRzIHRoZSBhdmVyYWdlIG51bWJlciBvZiB5ZWFycyBvZiBlZHVjYXRpb24gb2YgdGhlIHBvcHVsYXRpb24uIFRoZSBvbGRlciB0aGUgYWdlLCB0aGUgaGlnaGVyIHRoZSBlZHVjYXRpb25hbCBsZXZlbC4KCi0tLSAiU2FsYXJpb19EaWFyaW8iOiBNaW5pbXVtIERhaWx5IFdhZ2UKVW5pdDogUGVzb3MKRGVzY3JpcHRpb246IEluZGljYXRlcyB0aGUgbWluaW11bSB3YWdlIGluIGRhaWx5IHBlc29zLCB3aGljaCBpcyB0aGUgYmFzZSBzYWxhcnkgcGFpZCB0byB3b3JrZXJzIHBlciB3b3JraW5nIGRheS4KCi0tLSAiSW5vdmFjaW9uIjogUGF0ZW50IFJhdGUKVW5pdDogUGF0ZW50IFJhdGUgcGVyIDEwMCwwMDAgaW5oYWJpdGFudHMKRGVzY3JpcHRpb246IFNob3dzIHRoZSBudW1iZXIgb2YgcGF0ZW50cyByZXF1ZXN0ZWQgaW4gTWV4aWNvIHBlciAxMDAsMDAwIGluaGFiaXRhbnRzLiBJdCByZWZsZWN0cyB0ZWNobm9sb2dpY2FsIGlubm92YXRpb24gaW4gdGhlIGNvdW50cnkuCgotLS0gIkluc2VndXJpZGFkX3JvYm8iOiBSYXRlIG9mIFJvYmJlcnkgd2l0aCBWaW9sZW5jZQpVbml0OiBSb2JiZXJ5IFJhdGUgcGVyIDEwMCwwMDAgaW5oYWJpdGFudHMKRGVzY3JpcHRpb246IFJlcHJlc2VudHMgdGhlIHJhdGUgb2YgdmlvbGVudCByb2JiZXJpZXMgaW4gZGlmZmVyZW50IGNvbnRleHRzLCBzdWNoIGFzIGhvbWVzLCB2ZWhpY2xlcywgYnVzaW5lc3NlcywgZXRjLgoKLS0tICJJbnNlZ3VyaWRhZF9Ib21pY2lkaW86IEhvbWljaWRlIFJhdGUKVW5pdDogSG9taWNpZGUgUmF0ZSBwZXIgMTAwLDAwMCBpbmhhYml0YW50cwpEZXNjcmlwdGlvbjogSW5kaWNhdGVzIHRoZSBob21pY2lkZSByYXRlIHBlciAxMDAsMDAwIGluaGFiaXRhbnRzIGluIHRoZSBjb3VudHJ5LgoKLS0tICJUaXBvX2RlX0NhbWJpbyI6IEV4Y2hhbmdlIFJhdGUKVW5pdDogUGVzb3MgcGVyIERvbGxhcgpEZXNjcmlwdGlvbjogUmVmbGVjdHMgdGhlIHZhbHVlIG9mIHRoZSBNZXhpY2FuIHBlc28gaW4gcmVsYXRpb24gdG8gdGhlIFVTIGRvbGxhci4gSXQgaXMgaW1wb3J0YW50IGluIGludGVybmF0aW9uYWwgdHJhZGUuCgotLS0gIkRlbnNpZGFkX0NhcnJldGVyYSI6IFJvYWQgRGVuc2l0eQpVbml0OiBMZW5ndGggaW4ga23CsgpEZXNjcmlwdGlvbjogTWVhc3VyZXMgdGhlIGxlbmd0aCBvZiBraWxvbWV0ZXJzIG9mIHBhdmVkIHJvYWRzIGZvciBlYWNoIGttwrIgb2YgdGhlIGNvdW50cnkncyBsYW5kIGFyZWEuCgotLS0gIkRlbnNpZGFkX1BvYmxhY2lvbiI6IFBvcHVsYXRpb24gRGVuc2l0eQpVbml0OiBQb3B1bGF0aW9uIHBlciBrbcKyCkRlc2NyaXB0aW9uOiBJbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBwb3B1bGF0aW9uIGRpdmlkZWQgYnkgdGhlIHRlcnJpdG9yaWFsIGFyZWEgb2YgTWV4aWNvIGluIGttwrIuIE1lYXN1cmVzIHBvcHVsYXRpb24gZGVuc2l0eS4KCi0tLSAiQ08yX0VtaXNpb25lcyI6IENhcmJvbiBEaW94aWRlIChDTzIpIEVtaXNzaW9ucwpVbml0OiBNZXRyaWMgVG9ucyBQZXIgQ2FwaXRhCkRlc2NyaXB0aW9uOiBSZXByZXNlbnRzIGNhcmJvbiBkaW94aWRlIGVtaXNzaW9ucyBwZXIgaW5oYWJpdGFudC4gUmVmbGVjdHMgdGhlIGVudmlyb25tZW50YWwgaW1wYWN0LgoKLS0tICJQSUJfcGVyX0PDoXBpdGEiOiBHcm9zcyBEb21lc3RpYyBQcm9kdWN0IChHRFApIHBlciBDYXBpdGEKVW5pdDogUmVhbCAyMDEzIE1YTiBQZXNvcwpEZXNjcmlwdGlvbjogSXQgaXMgdGhlIEdyb3NzIERvbWVzdGljIFByb2R1Y3QgZGl2aWRlZCBieSB0aGUgcG9wdWxhdGlvbiBhbmQgYWRqdXN0ZWQgYnkgdGhlIHByaWNlcyBvZiAyMDEzLiBJdCBpbmRpY2F0ZXMgdGhlIGF2ZXJhZ2UgaW5jb21lIHBlciBpbmhhYml0YW50LgoKLS0tICJJTlBDIjogQ29uc3VtZXIgUHJpY2UgSW5kZXggKElOUEMpClVuaXQ6IFByaWNlIGluZGV4IChCYXNlIDIwMTggPSAxMDApCkRlc2NyaXB0aW9uOiBSZXByZXNlbnRzIHRoZSBjb25zdW1lciBwcmljZSBpbmRleCwgd2hpY2ggcmVmbGVjdHMgdGhlIHZhcmlhdGlvbiBpbiB0aGUgcHJpY2VzIG9mIGNvbnN1bWVyIGdvb2RzIGFuZCBzZXJ2aWNlcy4KCiMjIyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyMgbG9hZGluZyBsaWJyYXJpZXMKbGlicmFyeShmb3JlaWduKQpsaWJyYXJ5KGRwbHlyKSAgICAgICAgIyBkYXRhIG1hbmlwdWxhdGlvbiAKbGlicmFyeShmb3JjYXRzKSAgICAgICMgdG8gd29yayB3aXRoIGNhdGVnb3JpY2FsIHZhcmlhYmxlcwpsaWJyYXJ5KGdncGxvdDIpICAgICAgIyBkYXRhIHZpc3VhbGl6YXRpb24gCmxpYnJhcnkocmVhZHIpICAgICAgICAjIHJlYWQgc3BlY2lmaWMgY3N2IGZpbGVzCmxpYnJhcnkoamFuaXRvcikgICAgICAjIGRhdGEgZXhwbG9yYXRpb24gYW5kIGNsZWFuaW5nIApsaWJyYXJ5KEhtaXNjKSAgICAgICAgIyBzZXZlcmFsIHVzZWZ1bCBmdW5jdGlvbnMgZm9yIGRhdGEgYW5hbHlzaXMgCmxpYnJhcnkocHN5Y2gpICAgICAgICAjIGZ1bmN0aW9ucyBmb3IgbXVsdGl2YXJpYXRlIGFuYWx5c2lzIApsaWJyYXJ5KG5hbmlhcikgICAgICAgIyBzdW1tYXJpZXMgYW5kIHZpc3VhbGl6YXRpb24gb2YgbWlzc2luZyB2YWx1ZXMgTkEncwpsaWJyYXJ5KGRsb29rcikgICAgICAgIyBzdW1tYXJpZXMgYW5kIHZpc3VhbGl6YXRpb24gb2YgbWlzc2luZyB2YWx1ZXMgTkEncwpsaWJyYXJ5KGNvcnJwbG90KSAgICAgIyBjb3JyZWxhdGlvbiBwbG90cwpsaWJyYXJ5KGp0b29scykgICAgICAgIyBwcmVzZW50YXRpb24gb2YgcmVncmVzc2lvbiBhbmFseXNpcyAKbGlicmFyeShsbXRlc3QpICAgICAgICMgZGlhZ25vc3RpYyBjaGVja3MgLSBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcyAKbGlicmFyeShjYXIpICAgICAgICAgICMgZGlhZ25vc3RpYyBjaGVja3MgLSBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcwpsaWJyYXJ5KG9sc3JyKSAgICAgICAgIyBkaWFnbm9zdGljIGNoZWNrcyAtIGxpbmVhciByZWdyZXNzaW9uIGFuYWx5c2lzIApsaWJyYXJ5KG5hbmlhcikgICAgICAgIyBpZGVudGlmeWluZyBtaXNzaW5nIHZhbHVlcwpsaWJyYXJ5KHN0YXJnYXplcikgICAgIyBjcmVhdGUgcHVibGljYXRpb24gcXVhbGl0eSB0YWJsZXMKbGlicmFyeShlZmZlY3RzKSAgICAgICMgZGlzcGxheXMgZm9yIGxpbmVhciBhbmQgb3RoZXIgcmVncmVzc2lvbiBtb2RlbHMKbGlicmFyeSh0aWR5dmVyc2UpICAgICMgY29sbGVjdGlvbiBvZiBSIHBhY2thZ2VzIGRlc2lnbmVkIGZvciBkYXRhIHNjaWVuY2UKbGlicmFyeShjYXJldCkgICAgICAgICMgQ2xhc3NpZmljYXRpb24gYW5kIFJlZ3Jlc3Npb24gVHJhaW5pbmcgCmxpYnJhcnkoZ2xtbmV0KSAgICAgICAjIG1ldGhvZHMgZm9yIHByZWRpY3Rpb24gYW5kIHBsb3R0aW5nLCBhbmQgZnVuY3Rpb25zIGZvciBjcm9zcy12YWxpZGF0aW9uCmBgYAoKVG8gYmVnaW4sIGl0IGlzIGVzc2VudGlhbCB0byBleHBsb3JlIHRoZSBmaXJzdCBkYXRhIGluIG91ciBkYXRhYmFzZSwgd2hpY2ggd2lsbCBhbGxvdyB1cyB0byB1bmRlcnN0YW5kIHRoZSB0eXBlcyBvZiBkYXRhIHdlIGhhdmUgYXZhaWxhYmxlIGFuZCB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBmdW5kYW1lbnRhbCB0byBidWlsZGluZyBhIHJvYnVzdCBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbC4gSW4gdGhpcyBwcm9qZWN0LCB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIHRoYXQgd2Ugd2lsbCB1c2Ugd2lsbCBiZSBGb3JlaWduIERpcmVjdCBJbnZlc3RtZW50IChGREkpLiBUaGlzIGNob2ljZSBpcyBqdXN0aWZpZWQgYmVjYXVzZSBGREkgaXMgYSBrZXkgbWVhc3VyZSByZWxhdGVkIHRvIHRoZSBjZW50cmFsIHRvcGljIG9mIG91ciBwcm9qZWN0OiBOZWFyc2hvcmluZy4gRnVydGhlcm1vcmUsIEZESSBpcyBhIG1ldHJpYyB0aGF0IGlzIGluZmx1ZW5jZWQgYnkgYSBzZXJpZXMgb2YgaW5kZXBlbmRlbnQgdmFyaWFibGVzLCBjb3ZlcmluZyBwb2xpdGljYWwsIHNvY2lhbCwgZW52aXJvbm1lbnRhbCBhbmQgZXRoaWNhbCBhc3BlY3RzLiBUaGVzZSB2YXJpYWJsZXMgdG9nZXRoZXIgaW5mbHVlbmNlIHRoZSBsZXZlbCBvZiBGREksIG1ha2luZyBpdCBhIGZ1bmRhbWVudGFsIGluZGljYXRvciBmb3Igb3VyIGFuYWx5c2lzLgoKYGBge3J9CiNJbXBvcnRpbmcgZGIgCgpiZCA8LSByZWFkLmNzdigiL1VzZXJzL2dhYnJpZWxtZWRpbmEvRG93bmxvYWRzL25lYXJzaG9yaW5nLmNzdiIpCmJkCgoKYGBgCgpUbyBiZWdpbiB3aXRoLCBpdCBiZWdpbnMgd2l0aCBhbiBleHBsb3JhdG9yeSBhbmFseXNpcyBvZiB0aGUgZGF0YSwgdW5kZXJzdGFuZGluZyB3aGF0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGEgaXMgYW5kIHdoYXQgdHlwZSBvZiBkYXRhIHdlIGhhdmUuCgpgYGB7cn0Kc3VtKGlzLm5hKGJkKSkKc3RyKGJkKQpgYGAKCmBgYHtyfQojRGVzY3JpcHRpdmUgc3RhdGlzdGljcwpzdW1tYXJ5KGJkKQoKI1RoZSBhbmFseXNpcyBvZiBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIHJldmVhbHMgYSB2YXJpZXR5IG9mIGRhdGEgaW4gYSBwZXJpb2Qgc3Bhbm5pbmcgZnJvbSAxOTk3IHRvIDIwMjIuIEZvcmVpZ24gRGlyZWN0IEludmVzdG1lbnQgKEZESSkgc3RhbmRzIG91dCBhcyBhIGRlcGVuZGVudCB2YXJpYWJsZSwgd2l0aCBhIHdpZGUgcmFuZ2Ugb2YgdmFsdWVzIHJhbmdpbmcgYmV0d2VlbiAyMTAsODc2IGFuZCA3NTQsNDM4LiBPdGhlciB2YXJpYWJsZXMsIHN1Y2ggYXMgZGFpbHkgd2FnZSwgaW5ub3ZhdGlvbiwgaW5zZWN1cml0eSBhbmQgR0RQIHBlciBjYXBpdGEsIGFsc28gc2hvdyBzaWduaWZpY2FudCB2YXJpYWJpbGl0eS4gVGhlc2UgZGF0YSBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIHRoZSBkaXZlcnNpdHkgaW4gdGhlIGtleSB2YXJpYWJsZXMsIHN1Z2dlc3RpbmcgdGhlIG5lZWQgZm9yIGZ1cnRoZXIgYW5hbHlzaXMgYW5kIHRoZSBwb3NzaWJpbGl0eSBvZiBidWlsZGluZyBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHRvIGludmVzdGlnYXRlIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlbSBpbiB0aGUgY29udGV4dCBvZiBOZWFyc2hvcmluZy4KCmBgYAoKIyMjIyMgRGF0YSBjbGVhbmluZwoKQXMgd2UgY291bGQgc2VlLCB0aGVyZSBhcmUgc2V2ZXJhbCByZWNvcmRzIHdpdGggbWlzc2luZyB2YWx1ZXMsIHJlbW92aW5nIHRoZW0gd291bGQgc2tldyBvdXIgZGF0YS4gVGhlcmVmb3JlLCB0aGUgbWVhbiBzdGF0aXN0aWNhbCBpbXB1dGF0aW9uIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gYmUgYWJsZSB0byByZXBsYWNlIHRoZSBudWxsIHZhbHVlcwoKYGBge3J9CiNEYXRhIGltcHV0YXRpb24gdXNpbmcgbWVhbi4KZGF0b3NfaW1wdXRhZG9zIDwtIGJkCm1lZGlhX2VtcGxlbyA8LSBtZWFuKGJkJEVtcGxlbywgbmEucm0gPSBUUlVFKSAgIyBDYWxjdWxhdGUgdGhlIG1lYW4gd2l0aG91dCBOQQptZWRpYV9lZHVjYWNpb24gPC0gbWVhbihiZCRFZHVjYWNpb24sIG5hLnJtID0gVFJVRSkgICMgQ2FsY3VsYXRlIHRoZSBtZWFuIHdpdGhvdXQgTkEKbWVkaWFfaW5ub3ZhY2lvbiA8LSBtZWFuKGJkJElubm92YWNpb24sIG5hLnJtID0gVFJVRSkgICMgQ2FsY3VsYXRlIHRoZSBtZWFuIHdpdGhvdXQgTkEKbWVkaWFfaG9taWNpZGlvIDwtIG1lYW4oYmQkSW5zZWd1cmlkYWRfSG9taWNpZGlvLCBuYS5ybSA9IFRSVUUpICAjIENhbGN1bGF0ZSB0aGUgbWVhbiB3aXRob3V0IE5BCm1lZGlhX0NPMiA8LSBtZWFuKGJkJENPMl9FbWlzaW9uZXMsIG5hLnJtID0gVFJVRSkgICMgQ2FsY3VsYXRlIHRoZSBtZWFuIHdpdGhvdXQgTkEKZGF0b3NfaW1wdXRhZG9zJEVtcGxlb1tpcy5uYShkYXRvc19pbXB1dGFkb3MkRW1wbGVvKV0gPC0gbWVkaWFfZW1wbGVvCmRhdG9zX2ltcHV0YWRvcyRFZHVjYWNpb25baXMubmEoZGF0b3NfaW1wdXRhZG9zJEVkdWNhY2lvbildIDwtIG1lZGlhX2VkdWNhY2lvbgpkYXRvc19pbXB1dGFkb3MkSW5ub3ZhY2lvbltpcy5uYShkYXRvc19pbXB1dGFkb3MkSW5ub3ZhY2lvbildIDwtIG1lZGlhX2lubm92YWNpb24KZGF0b3NfaW1wdXRhZG9zJEluc2VndXJpZGFkX0hvbWljaWRpb1tpcy5uYShkYXRvc19pbXB1dGFkb3MkSW5zZWd1cmlkYWRfSG9taWNpZGlvKV0gPC0gbWVkaWFfaG9taWNpZGlvCmRhdG9zX2ltcHV0YWRvcyRDTzJfRW1pc2lvbmVzW2lzLm5hKGRhdG9zX2ltcHV0YWRvcyRDTzJfRW1pc2lvbmVzKV0gPC0gbWVkaWFfQ08yCmBgYAoKYGBge3J9CiNEYXRhIHN0cnVjdHVyZQpzdHIoZGF0b3NfaW1wdXRhZG9zKQpiZDI9ZGF0b3NfaW1wdXRhZG9zCmJkMgpgYGAKClRvIGJlZ2luLCBhY2NvcmRpbmcgdG8gdGhlIGdsb3NzYXJ5IG9mIHRoZSBkYXRhYmFzZSBwcm92aWRlZCwgZm9yZWlnbiBkaXJlY3QgaW52ZXN0bWVudCBhbmQgZXhwb3J0cyBhcmUgaW4gZG9sbGFycyBhbmQgaW4gbm9taW5hbCB2YWx1ZXMsIHdoaWNoIGlzIHdoeSBpdCBpcyBpbXBvcnRhbnQgdG8gdHJhbnNmb3JtIHRoZW0gaW50byBwZXNvcyBhbmQgcmVhbCB2YWx1ZXMuCgpUaGVzZSByZWFsIHZhbHVlcyBtb3JlIGFjY3VyYXRlbHkgcmVmbGVjdCB0aGUgZmx1Y3R1YXRpb25zIGluIGZvcmVpZ24gZGlyZWN0IGludmVzdG1lbnQgb3ZlciB0aGUgdGltZSBzZXJpZXMsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGluZmxhdGlvbmFyeSBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgaW4gdGhvc2Ugc3BlY2lmaWMgeWVhcnMuIFRvIGFjaGlldmUgdGhpcyBjb252ZXJzaW9uLCB0aGUgZXhjaGFuZ2UgcmF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSB5ZWFyIG9mIGVhY2ggb2JzZXJ2YXRpb24gd2FzIGFwcGxpZWQgYW5kIHRoZSBOYXRpb25hbCBDb25zdW1lciBQcmljZSBJbmRleCAoSU5QQykgb2YgdGhhdCBzYW1lIHllYXIgd2FzIGNvbnNpZGVyZWQgYXMgYW4gaW5mbGF0aW9uIGFkanVzdG1lbnQuIFRoaXMgYXBwcm9hY2ggYWxsb3dzIGZvciBhIG1vcmUgYWNjdXJhdGUgYW5kIHJlYWxpc3RpYyByZXByZXNlbnRhdGlvbiBvZiBGREkgb3ZlciB0aW1lLgoKCmBgYHtyfQpiZDIkSUVEX0ZsdWpvcyA9ICgoYmQyJElFRF9GbHVqb3NfZG9sYXJlcyAqIGJkMiRUaXBvX2RlX0NhbWJpbykgLyBiZDIkSU5QQykgKiAxMDAKYmQyJEV4cG9ydGFjaW9uZXMgPSAoKGJkMiRFeHBvcnRhY2lvbmVzX2RvbGFyZXMgKiBiZDIkVGlwb19kZV9DYW1iaW8pIC8gYmQyJElOUEMpICogMTAwCmJkMgpgYGAKCgojIyMjIyBEYXRhIHZpc3VhbGl6YXRpb24gCgpJdCBpcyBhbHNvIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgdGhlIHJlbGF0aW9uc2hpcCBvZiBlYWNoIG9mIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgd2l0aCB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLiBUaGlzIGlzIGRvbmUgYnkgbWVhbnMgb2YgZ3JhcGhzIHRvIHVuZGVyc3RhbmQgdGhlIHJlbGF0aW9uc2hpcHMuCgpgYGB7cn0KCiNEYXRhIHZpc3VhbGl6YXRpb24gKGluZGVwZW5kZW50IHZhcmlhYmxlcyB2cyBJRUQpCmRhdG9zX2ltcHV0YWRvcz1kYXRhCmdncGxvdChkYXRhID0gYmQyLCBhZXMoeCA9IEV4cG9ydGFjaW9uZXMsIHkgPSBJRURfRmx1am9zKSkgKwogIGdlb21fcG9pbnQoKSArCiAgbGFicyh4ID0gIkV4cG9ydHMiLCB5ID0gIkRlcGVuZGVudCBWYXJpYWJsZSAoSUVEKSIpICsKICBnZ3RpdGxlKCJTY2F0dGVyIFBsb3Q6IEV4cG9ydHMgdnMuIElFRCIpCgpgYGAKCkFzIHdlIGNhbiBzZWUgaW4gdGhpcyBncmFwaCBvZiBleHBvcnRzIHZzIEZESSwgaXQgY2FuIGJlIHNlZW4gdGhhdCB0aGVzZSB2YXJpYWJsZXMgYXJlIHBvc2l0aXZlbHkgY29ycmVsYXRlZCwgYWx0aG91Z2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBub3Qgc28gc3Ryb25nLCBidXQgc2luY2UgdGhlcmUgaXMgYSBjb3JyZWxhdGlvbiBwYXR0ZXJuIGl0IGNvdWxkIGJlIGEgZ29vZCBhc3N1bXB0aW9uIHRvIGFzc3VtZSB0aGF0IHRoaXMgdmFyaWFibGUgd2lsbCBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGluIHRoZSBmYWNlIG9mIHRvIHRoZSBjb25zdHJ1Y3Rpb24gb2Ygb3VyIHJlZ3Jlc3Npb24gbW9kZWxzLgoKYGBge3J9CmdncGxvdChkYXRhID0gYmQyLCBhZXMoeCA9IFNhbGFyaW9fRGlhcmlvLCB5ID0gSUVEX0ZsdWpvcykpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh4ID0gIlNhbGFyaW8gZGlhcmlvIiwgeSA9ICJEZXBlbmRlbnQgVmFyaWFibGUgKElFRCkiKSArCiAgZ2d0aXRsZSgiTGluZSBQbG90OiBTYWxhcnkgdnMuIElFRCIpCgpgYGAKRW4gZXN0YSBncsOhZmljYSwgYXByZWNpYW1vcyBxdWUgYWwgY29taWVuem8gZGUgbGFzIHZhcmlhYmxlcywgc2UgbXVlc3RyYSB1bmEgbGlnZXJhIGNvcnJlbGFjacOzbiBwb3NpdGl2YSwgc2luIGVtYmFyZ28sIGEgbWVkaWRhIHF1ZSBjcmVjZSBlbCBzYWxhcmlvIHNlIGFwcmVjaWEgY29tbyBwaWVyZGUgY29ycmVsYWNpw7NuIGNvbiBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZS4KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGJkMiwgYWVzKHggPSBUaXBvX2RlX0NhbWJpbywgeSA9IElFRF9GbHVqb3MpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnMoeCA9ICJFeGNoYW5nZSByYXRlIiwgeSA9ICJEZXBlbmRlbnQgVmFyaWFibGUgKElFRCkiKSArCiAgZ2d0aXRsZSgiRGVuc2l0eSBQbG90OiBFeGNoYW5nZSByYXRlIHZzLiBJRUQiKQoKYGBgCkp1c3QgYXMgaW4gdGhlIGNhc2Ugb2YgZXhwb3J0cywgZGVzcGl0ZSBzaG93aW5nIGxpdHRsZSBjb3JyZWxhdGlvbiwgdGhlIHBvc2l0aXZlIGNvcnJlbGF0aW9uIG9mIHRoaXMgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGV4Y2hhbmdlIHJhdGUgYW5kIG91ciBkZXBlbmRlbnQgdmFyaWFibGUgaXMgbm90aWNlYWJsZS4KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGJkMiwgYWVzKHggPSBEZW5zaWRhZF9Qb2JsYWNpb24sIHkgPSBJRURfRmx1am9zKSkgKwogIGdlb21faGV4KCkgKwogIGxhYnMoeCA9ICJQb2JsYXRpb24gRGVuc2l0eSIsIHkgPSAiRGVwZW5kZW50IFZhcmlhYmxlIChJRUQpIikgKwogIGdndGl0bGUoIkhleCBQbG90OiBQb2JsYXRpb24gRGVuc2l0eSB2cy4gSUVEIikKYGBgCkEgc2xpZ2h0IHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlc2UgdHdvIHZhcmlhYmxlcyBpcyBub3RpY2VhYmxlLgoKYGBge3J9CgpnZ3Bsb3QoZGF0YSA9IGJkMiwgYWVzKHggPSBDTzJfRW1pc2lvbmVzLCB5ID0gSUVEX0ZsdWpvcykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGxhYnMoeCA9ICJDTzIiLCB5ID0gIlZhcmlhYmxlIERlcGVuZGllbnRlIChJRUQpIikgKwogIGdndGl0bGUoIkdyw6FmaWNvIGRlIEJhcnJhczogQ08yIHZzLiBJRUQiKQoKYGBgClRoZXJlIGlzIGFsbW9zdCBubyBjb3JyZWxhdGlvbgoKYGBge3J9CmdncGxvdChkYXRhID0gYmQyLCBhZXMoeCA9IElOUEMsIHkgPSBJRURfRmx1am9zKSkgKwogIGdlb21fcG9pbnQoKSArCiAgbGFicyh4ID0gIklOUEMiLCB5ID0gIkRlcGVuZGVudCBWYXJpYWJsZSAoSUVEKSIpICsKICBnZ3RpdGxlKCJTY2F0dGVyIFBsb3Q6IElOUEMgdnMuIElFRCIpCgpgYGAKVGhlIElOUEMgc2hvd3MgYSBjb3JyZWxhdGlvbiB3aXRoIEZESSwgc29tZXRoaW5nIHRoYXQgbWFrZXMgYSBsb3Qgb2Ygc2Vuc2UgYmVjYXVzZSB0aGUgTmF0aW9uYWwgQ29uc3VtZXIgUHJpY2UgSW5kZXggaXMgYSB3YXkgdG8gbWVhc3VyZSB0aGUgaW5mbGF0aW9uIHRoYXQgaXMgb2NjdXJyaW5nIGluIHRoZSBjb3VudHJ5LCBhbmQgd2hlbiBmb3JlaWduIGludmVzdG1lbnQgcmlzZXMsIGl0IGlzIGEgc2lnbiBvZiBlY29ub21pYyBzcGlsbG92ZXIuIHRoYXQgaXMgaGFwcGVuaW5nIGFuZCB0aGUgZ3Jvd3RoIG9mIHRoZSBlY29ub215LCB3aGljaCBsZWFkcyB0byBtb3JlIG1vbmV5IGluIGNpcmN1bGF0aW9uIGluIHRoZSBoYW5kcyBvZiBNZXhpY2FucyBhbmQgdGhlcmVmb3JlIGEgY29uc2VxdWVudCBpbmZsYXRpb24uCgpgYGB7cn0Kc3RyKGJkMikKYGBgCgpgYGB7cn0KI0FuYWx5emUgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGRhdGEKaGlzdChiZDIkSUVEX0ZsdWpvcykKYGBgCk5vcm1hbCBEaXN0cmlidXRpb24gaXMgb2JzZXJ2ZWQKCkxpa2V3aXNlLCBpdCBpcyBpbXBvcnRhbnQgdG8gYW5hbHl6ZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBkYXRhIG9mIGVhY2ggb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcy4gVGhpcyBpbiBvcmRlciB0byBkZXRlcm1pbmUgaWYgbm9ybWFsaXphdGlvbiBtZXRob2RzIHdpbGwgYmUgYXBwbGllZCBmb3IgY2VydGFpbiB2YXJpYWJsZXMuCgpgYGB7cn0KaGlzdChiZDIkRXhwb3J0YWNpb25lcykKaGlzdChiZDIkRWR1Y2FjaW9uKQpoaXN0KGJkMiRJbm5vdmFjaW9uKQpoaXN0KGJkMiRJbnNlZ3VyaWRhZF9Sb2JvKQpoaXN0KGJkMiRJbnNlZ3VyaWRhZF9Ib21pY2lkaW8pCmhpc3QoYmQyJFNhbGFyaW9fRGlhcmlvKQpoaXN0KGJkMiRUaXBvX2RlX0NhbWJpbykKaGlzdChiZDIkRGVuc2lkYWRfUG9ibGFjaW9uKQpoaXN0KGJkMiREZW5zaWRhZF9DYXJyZXRlcmEpCmhpc3QoYmQyJElOUEMpCmhpc3QoYmQyJENPMl9FbWlzaW9uZXMpCmhpc3QoYmQyJEVtcGxlbykKaGlzdChiZDIkUElCX1Blcl9DYXBpdGEpCmBgYAoKQXMgc2VlbiBpbiB0aGUgaGlzdG9ncmFtcywgc29tZSB2YXJpYWJsZXMgc3VjaCBhcyBkYWlseSB3YWdlLCBHRFAgcGVyIGNhcGl0YSwgYW5kIHJvYWQgZGVuc2l0eSBjb3VsZCBiZSBiZXR0ZXIgYXBwbGllZCB0byB0aGUgbW9kZWwgaWYgdGhlIGRhdGEgZm9yIHRoZXNlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBhcmUgbm9ybWFsaXplZC4KCiMjIyMjIyBDb3JyZWxhdGlvbiBhbmFseXNpcyAKCkFub3RoZXIgd2F5IHRvIHVuZGVyc3RhbmQgdGhlIGltcG9ydGFuY2Ugb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBpcyB0aHJvdWdoIGEgY29ycmVsYXRpb24gZ3JhcGgsIHdoaWNoIGFsbG93cyB1cyB0byBrbm93IHRoZSBsZXZlbCBvZiBjb3JyZWxhdGlvbiB0aGF0IGVhY2ggaW5kZXBlbmRlbnQgdmFyaWFibGUgaGFzIHdpdGggdGhlIGRlcGVuZGVudCB2YXJpYWJsZS4KCmBgYHtyfQojQ29ycmVsYXRpb24gcGxvdApjb3JycGxvdChjb3IoYmQyKSwgCiAgICAgICAgIHR5cGUgPSAidXBwZXIiLCAKICAgICAgICAgb3JkZXIgPSAiaGNsdXN0IiwgCiAgICAgICAgIGFkZENvZWYuY29sID0gImJsYWNrIiwgCiAgICAgICAgIHRsLmNleCA9IDAuNywgICAgIAogICAgICAgKSAKYGBgClRoaXMgaXMgYSB3YXkgdG8gc2hvdyB0aGUgbWF0cml4IGluIGEgbW9yZSB1bmRlcnN0YW5kYWJsZSB3YXkuCgpgYGB7cn0KY29yKGJkMikKYGBgCgojIyMjIyBFc3RpbWF0aW9uIE1ldGhvZAoKSW4gdGhpcyBzdHVkeSwgdGhlIE9yZGluYXJ5IExlYXN0IFNxdWFyZXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBkZXZlbG9wIGEgcmVncmVzc2lvbiBtb2RlbCB0aGF0IGFsbG93cyB1cyB0byB1bmRlcnN0YW5kIGFuZCBhbmFseXplIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgYSBkZXBlbmRlbnQgdmFyaWFibGUgKEZESSkuIFRocm91Z2ggdGhpcyBhcHByb2FjaCwgd2Ugd2lsbCBzZWVrIHRvIGlkZW50aWZ5IHBhdHRlcm5zLCB0cmVuZHMgYW5kIGVmZmVjdHMgdGhhdCBjYW4gaGVscCBleHBsYWluIGFuZCBwcmVkaWN0IHRoZSBiZWhhdmlvciBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBpbmRlcGVuZGVudCB2YXJpYWJsZXMuCgpUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGZpbmQgdGhlIGJlc3QgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgc2V0IG9mIGluZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgYSBkZXBlbmRlbnQgdmFyaWFibGUsIG1pbmltaXppbmcgdGhlIHN1bSBvZiB0aGUgc3F1YXJlcyBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgb2JzZXJ2ZWQgdmFsdWVzIGFuZCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUgbW9kZWwuCgojIExpbmVhciBSZWdyZXNpb24gYW5hbHlzaXMKCiMjIyBIeXBob3Rlc2VzCgpTaW5jZSB3ZSB1bmRlcnN0YW5kIHRoZSBzdHJ1Y3R1cmUgYW5kIHR5cGUgb2YgZGF0YSBpbiBkZXRhaWwsIGFzIHdlbGwgYXMgdGhlIG11bHRpcGxlIHJlbGF0aW9uc2hpcHMgb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcywgdGhlIGZvbGxvd2luZyBoeXBvdGhlc2VzIGNhbiBiZSBwb3NlZC4KCi0gLSAtIEh5cG90aGVzaXMgZm9yIEV4cG9ydHM6Ckl0IGlzIGh5cG90aGVzaXplZCB0aGF0IHRoZSBsZXZlbCBvZiAiRXhwb3J0cyIgb2YgYSBjb3VudHJ5IGhhcyBhIHBvc2l0aXZlIGFuZCBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIG5lYXJzaG9yaW5nIGRlY2lzaW9uIGFuZCB0aGUgYXR0cmFjdGlvbiBvZiBGb3JlaWduIERpcmVjdCBJbnZlc3RtZW50IChGREkpLgpUaGUgaHlwb3RoZXNpcyBpcyBiYXNlZCBvbiB0aGUgaWRlYSB0aGF0IGNvdW50cmllcyB3aXRoIGEgaGlnaCB2b2x1bWUgb2YgZXhwb3J0cyBjYW4gaW5kaWNhdGUgYSBzdHJvbmcgZWNvbm9teSB0aGF0IGlzIG9wZW4gdG8gaW50ZXJuYXRpb25hbCBidXNpbmVzcywgd2hpY2ggaW4gdHVybiBjYW4gbWFrZSB0aGVtIGF0dHJhY3RpdmUgZGVzdGluYXRpb25zIGZvciBuZWFyc2hvcmluZy4KRnVydGhlcm1vcmUsIGV4cG9ydHMgbWF5IGJlIHJlbGF0ZWQgdG8gdGhlIGRlbWFuZCBmb3IgbG9jYWwgcHJvZHVjdGlvbiwgd2hpY2ggaW5mbHVlbmNlcyB0aGUgYXR0cmFjdGlvbiBvZiBGREkuCgotIC0gLSBIeXBvdGhlc2lzIGZvciBFeGNoYW5nZSBSYXRlOgpJdCBpcyBoeXBvdGhlc2l6ZWQgdGhhdCAiRXhjaGFuZ2UgUmF0ZSIgY2FuIGhhdmUgYSBuZWdhdGl2ZSBzaWduaWZpY2FudCBlZmZlY3Qgb24gbmVhcnNob3JpbmcgYW5kIEZESS4KQSBmYXZvcmFibGUgZXhjaGFuZ2UgcmF0ZSwgaW5kaWNhdGluZyBhIHN0cm9uZyBsb2NhbCBjdXJyZW5jeSBjb21wYXJlZCB0byBmb3JlaWduIGN1cnJlbmNpZXMsIGlzIGV4cGVjdGVkIHRvIG1ha2UgYSBjb3VudHJ5IG1vcmUgYXR0cmFjdGl2ZSBmb3IgbmVhcnNob3JpbmcuCkEgZmF2b3JhYmxlIGV4Y2hhbmdlIHJhdGUgaXMgYWxzbyBhbnRpY2lwYXRlZCB0byByZWR1Y2UgY3VycmVuY3kgcmlza3MgYW5kIGF0dHJhY3QgZm9yZWlnbiBkaXJlY3QgaW52ZXN0bWVudHMuCgotIC0gLSBIeXBvdGhlc2lzIGZvciBHRFAgcGVyIGNhcGl0YToKIkdEUCBwZXIgY2FwaXRhIiBpcyBoeXBvdGhlc2l6ZWQgdG8gYmUgYW4gaW1wb3J0YW50IHZhcmlhYmxlIGluZmx1ZW5jaW5nIG5lYXJzaG9yaW5nIGFuZCBGREkgd2l0aCBhIHBvc2l0aXZlIHJlbGF0aW9uLgpBIGhpZ2hlciBHRFAgcGVyIGNhcGl0YSBpcyBnZW5lcmFsbHkgYXNzb2NpYXRlZCB3aXRoIGdyZWF0ZXIgcHVyY2hhc2luZyBwb3dlciBvZiB0aGUgcG9wdWxhdGlvbiBhbmQgYSBsYXJnZXIgZG9tZXN0aWMgbWFya2V0LgpDb3VudHJpZXMgd2l0aCBoaWdoIEdEUCBwZXIgY2FwaXRhIGFyZSB0aGVyZWZvcmUgZXhwZWN0ZWQgdG8gYmUgbW9yZSBhdHRyYWN0aXZlIGZvciBuZWFyc2hvcmluZyBhcyB0aGV5IG9mZmVyIGEgc3Ryb25nIGxvY2FsIG1hcmtldCBmb3IgZm9yZWlnbiBjb21wYW5pZXMuCkFkZGl0aW9uYWxseSwgYSBoaWdoIEdEUCBwZXIgY2FwaXRhIGNhbiBiZSBhbiBpbmRpY2F0b3Igb2YgZWNvbm9taWMgc3RhYmlsaXR5LCB3aGljaCBjb3VsZCBhbHNvIGF0dHJhY3QgZm9yZWlnbiBkaXJlY3QgaW52ZXN0bWVudC4KCgojIyMgUmVncmVzaW9uIG1vZGVscwoKIyMjIFJlZ3Jlc2lvbiBNb2RlbCAxCgpGcm9tIHRoaXMsIHRoZSBiYXNlIHJlZ3Jlc3Npb24gbW9kZWwgd2FzIG1vZGVsZWQsIHVzaW5nIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgYmVsaWV2ZWQgdG8gYmUgbW9zdCByZWxldmFudCBhY2NvcmRpbmcgdG8gb3VyIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMuCgpBY2NvcmRpbmcgdG8gb3VyIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMsIGNvbnNpZGVyaW5nIHRoZSBhbmFseXNpcyBvZiBlYWNoIHZhcmlhYmxlLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGEsIGl0cyBpbXBvcnRhbmNlIGluIHRoZSB0aGVvcmV0aWNhbCBjb250ZXh0IG9mIHRoZSBwcm9ibGVtIGFuZCBpdHMgY29ycmVsYXRpb24gd2l0aCB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIHN1Y2ggYXMsIGZvciBleGFtcGxlLCB2YXJpYWJsZXMgc3VjaCBhcyAiRXhwb3J0YWNpb25lcywiICJFZHVjYWNpb24iICJTYWxhcmlvX2RpYXJpbywiICJJbm92YWNpw7NuLCIgIlRpcG8gZGUgY2FtYmlvLCIgIkRlbnNpZGFkX0NhcnJldGVyYSwiICJEZW5zaWRhZF9Qb2JsYWNpw7NuLCIgIlBJQiBwZXIgQ8OhcGl0YSwiIGFuZCAiSU5QQyIgaGF2ZSByZWxhdGl2ZWx5IGhpZ2ggY29ycmVsYXRpb25zIHdpdGggdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBGRElfRmxvd3MuIFRoZXNlIGNvdWxkIGJlIGNvbnNpZGVyZWQgc3Ryb25nIGNhbmRpZGF0ZXMgdG8gaW5jbHVkZSBpbiB0aGUgbW9kZWwuIEhvd2V2ZXIsIGl0IGlzIGFsc28gaW1wb3J0YW50IHRvIGNvbnNpZGVyIG11bHRpY29sbGluZWFyaXR5LiBGb3IgZXhhbXBsZSwgIkRlbnNpZGFkX1BvYmxhY2nDs24iIGlzIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggIkRlbnNpZGFkX0NhcnJldGVyYSIgYW5kICJQZXJpb2RvIiBpcyBoaWdobHkgY29ycmVsYXRlZCB3aXRoICJEZW5zaWRhZF9Qb2JsYWNpw7NuIiBUaGlzIGNhbiBjb21wbGljYXRlIG1vZGVsIGludGVycHJldGF0aW9uLCBzbyB5b3UgbWlnaHQgY2hvb3NlIHRvIGluY2x1ZGUgb25seSBvbmUgb2YgdGhlc2UgaGlnaGx5IGNvcnJlbGF0ZWQgdmFyaWFibGVzLiBJdCBpcyBpbXBvcnRhbnQgdG8gbWVudGlvbiB0aGF0IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGFuIGluZGVwZW5kZW50IHZhcmlhYmxlIGFuZCB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIG1heSBzdWdnZXN0IHRoYXQgdGhlcmUgaXMgYSBwb3RlbnRpYWwgcmVsYXRpb25zaGlwIHdvcnRoIGV4cGxvcmluZywgYnV0IGl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoaXMgcmVsYXRpb25zaGlwIHdpbGwgYmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBhIHJlZ3Jlc3Npb24gbW9kZWwuIFNpbmNlIHRoZSBjb3JyZWxhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHZhcmlhYmxlcyBidXQgbm90IG5lY2Vzc2FyaWx5IGEgY2F1c2FsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG9uZSBhbmQgdGhlIG90aGVyLiAKClRha2luZyB0aGlzIGludG8gYWNjb3VudCwgaXQgd2FzIGRlY2lkZWQgdG8gdXNlIHRoZSBmb2xsb3dpbmcgaW5kZXBlbmRlbnQgdmFyaWFibGVzLi4uCgpgYGB7cn0KZG1vZGVsMTwtbG0oSUVEX0ZsdWpvcyB+IEV4cG9ydGFjaW9uZXMgKyBFZHVjYWNpb24gKyBTYWxhcmlvX0RpYXJpbyArIFRpcG9fZGVfQ2FtYmlvICsgRGVuc2lkYWRfQ2FycmV0ZXJhICsgUElCX1Blcl9DYXBpdGEgKyBJTlBDLGRhdGE9YmQyKQpzdW1tYXJ5KGRtb2RlbDEpCmBgYAoKLSAtIC0gTW9kZWwgaW50ZXJwcmV0YXRpb24KCkludGVyY2VwdDogcmVwcmVzZW50cyB0aGUgZXN0aW1hdGVkIHZhbHVlIG9mIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKEZESV9GbG93cykgd2hlbiBhbGwgaW5kZXBlbmRlbnQgdmFyaWFibGVzIGFyZSBlcXVhbCB0byB6ZXJvLiBJbiB0aGlzIGNhc2UsIHRoZSBlc3RpbWF0ZWQgdmFsdWUgaXMgLTEuNTM5ZSswNiAoYXBwcm94aW1hdGVseSAtMSw1MzksMDAwKSwgd2l0aCBhIHN0YW5kYXJkIGVycm9yIG9mIDcuMzUyZSswNS4KCkNvZWZmaWNpZW50cyBvZiBJbmRlcGVuZGVudCBWYXJpYWJsZXM6IFRoZSBlc3RpbWF0ZWQgY29lZmZpY2llbnRzIGZvciBlYWNoIGluZGVwZW5kZW50IHZhcmlhYmxlIHJlcHJlc2VudCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhhdCB2YXJpYWJsZSBhbmQgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBGRElfRmxvd3MsIGtlZXBpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gRm9yIGV4YW1wbGU6CgpUaGUgY29lZmZpY2llbnQgZm9yIEV4cG9ydHMgaXMgLTMuODQyZSswMS4gVGhpcyBtZWFucyB0aGF0LCBob2xkaW5nIHRoZSBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQsIGFuIGluY3JlYXNlIG9mIG9uZSB1bml0IGluIEV4cG9ydHMgaXMgYXNzb2NpYXRlZCwgb24gYXZlcmFnZSwgd2l0aCBhIGRlY3JlYXNlIG9mIGFwcHJveGltYXRlbHkgMzguNDIgdW5pdHMgaW4gRkRJX0Zsb3dzLgoKVGhlIGNvZWZmaWNpZW50IGZvciBHRFBfUGVyX0NhcGl0YSBpcyAyLjUxMGUrMDEuIFRoaXMgbWVhbnMgdGhhdCwgaG9sZGluZyB0aGUgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LCBhbiBpbmNyZWFzZSBvZiBvbmUgdW5pdCBpbiBHRFBfUGVyX0NhcGl0YSBpcyBhc3NvY2lhdGVkLCBvbiBhdmVyYWdlLCB3aXRoIGFuIGluY3JlYXNlIG9mIGFwcHJveGltYXRlbHkgMjUuMTAgdW5pdHMgaW4gRkRJX0Zsb3dzLgoKQXMgZm9yIHRoZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHZhcmlhYmxlczogRXhwb3J0cywgR0RQX1Blcl9DYXBpdGEgYW5kIElOUEMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYXQgYSBsZXZlbCBvZiBwIDwgMC4wNSwgd2hpY2ggc3VnZ2VzdHMgdGhhdCB0aGVzZSB2YXJpYWJsZXMgaGF2ZSBhIHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCB3aXRoIEZESV9GbG93cy4KCkZpdCBTdGF0aXN0aWNzOiBUaGUgbW9kZWwgZGlzcGxheXMgdmFyaW91cyBmaXQgc3RhdGlzdGljcywgc3VjaCBhcyBNdWx0aXBsZSBSLXNxdWFyZWQsIEFkanVzdGVkIFItc3F1YXJlZCwgcmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IsIGFuZCBGIHN0YXRpc3RpYy4KClRoZSBtdWx0aXBsZSBSLXNxdWFyZWQgKDAuNzYyNCkgaW5kaWNhdGVzIHRoYXQgYXBwcm94aW1hdGVseSA3Ni4yNCUgb2YgdGhlIHZhcmlhYmlsaXR5IGluIEZESV9GbG93cyBpcyBleHBsYWluZWQgYnkgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwuCgpUaGUgYWRqdXN0ZWQgUi1zcXVhcmVkICgwLjY2OTkpIGlzIHNpbWlsYXIgdG8gdGhlIG11bHRpcGxlIFItc3F1YXJlZCwgYnV0IGFkanVzdGVkIGZvciB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlcywgcHJvdmlkaW5nIGEgbW9yZSBjb25zZXJ2YXRpdmUgbWVhc3VyZSBvZiBtb2RlbCBmaXQuCgpUaGUgRiBzdGF0aXN0aWMgKDguMjQ5KSBpcyB1c2VkIHRvIGV2YWx1YXRlIHRoZSBvdmVyYWxsIHNpZ25pZmljYW5jZSBvZiB0aGUgbW9kZWwgYW5kIGl0cyBwLXZhbHVlICgwLjAwMDE1MDUpIGluZGljYXRlcyB0aGF0IHRoZSBtb2RlbCBhcyBhIHdob2xlIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuCgpUaGUgcmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IgdGVsbHMgdXMgaG93IHNwcmVhZCBvdXQgdGhlIGRhdGEgcG9pbnRzIGFyZSBhcm91bmQgdGhlIHJlZ3Jlc3Npb24gbGluZS4gQSBzbWFsbGVyIHJlc2lkdWFsIHN0YW5kYXJkIGVycm9yIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIHBvaW50cyB0ZW5kIHRvIGJlIGNsb3NlciB0byB0aGUgcmVncmVzc2lvbiBsaW5lLCBzdWdnZXN0aW5nIGJldHRlciBtb2RlbCBmaXQuIE9uIHRoZSBvdGhlciBoYW5kLCBhIGxhcmdlciByZXNpZHVhbCBzdGFuZGFyZCBlcnJvciBpbmRpY2F0ZXMgYSBncmVhdGVyIHNwcmVhZCBvZiB0aGUgZGF0YSBwb2ludHMgYXJvdW5kIHRoZSByZWdyZXNzaW9uIGxpbmUsIHN1Z2dlc3RpbmcgYSBsZXNzIHByZWNpc2UgZml0LgoKSXQgaXMgaW1wb3J0YW50IHRvIHBlcmZvcm0gc29tZSBkaWFnbm9zdGljIHRlc3RzIHRvIGJldHRlciBldmFsdWF0ZSB0aGlzIG1vZGVs4oCmCgoKIyMjIERpYWdub3N0aWMgdGVzdCBNb2RlbCAxCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGNhcikKbGlicmFyeShsbXRlc3QpCmBgYAoKYGBge3J9CiMgTXVsdGljb2xsaW5lYXJpdHkKCnZpZihkbW9kZWwxKQoKYGBgClRoZSBWSUYgaXMgY2FsY3VsYXRlZCBmb3IgZWFjaCBpbmRlcGVuZGVudCB2YXJpYWJsZSBpbiB0aGUgbW9kZWwgYW5kIGlzIHVzZWQgdG8gZXZhbHVhdGUgaG93IG11Y2ggdGhlIHZhcmlhbmNlIG9mIHRoZSBjb2VmZmljaWVudCBlc3RpbWF0ZSBmb3IgdGhhdCB2YXJpYWJsZSBpbmNyZWFzZXMgZHVlIHRvIG11bHRpY29sbGluZWFyaXR5LiBJbiBvdGhlciB3b3JkcywgdGhlIFZJRiBpbmRpY2F0ZXMgaG93IG11Y2ggbW9yZSB1bnN0YWJsZSB0aGUgY29lZmZpY2llbnQgZXN0aW1hdGUgaXMgZHVlIHRvIG11bHRpY29sbGluZWFyaXR5LiBUaGUgVklGIGlzIGludGVuZGVkIHRvIGJlIGxlc3MgdGhhbiAxMCwgdGhlcmVmb3JlLCBhcyB3ZSBjYW4gc2VlIGluIHRoZSByZXN1bHRzIG9mIHRoZSBkaWFnbm9zdGljIHRlc3QsIG1vZGVsIDEgcHJlc2VudHMgYSBtdWx0aWNvbGxpbmVhcml0eSBwcm9ibGVtLgoKTXVsdGljb2xsaW5lYXJpdHkgcmVmZXJzIHRvIHRoZSBoaWdoIGNvcnJlbGF0aW9uIGJldHdlZW4gdHdvIG9yIG1vcmUgaW5kZXBlbmRlbnQgdmFyaWFibGVzIGluIGEgcmVncmVzc2lvbiBtb2RlbC4gVGhpcyBjYW4gbWFrZSBpdCBkaWZmaWN1bHQgdG8gYWNjdXJhdGVseSBhc3NpZ24gdGhlIGluZGl2aWR1YWwgZWZmZWN0cyBvZiBlYWNoIHZhcmlhYmxlIHRvIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUsIGFzIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBiZWNvbWUgY29uZnVzaW5nLgoKYGBge3J9CiNIZXRlcm9jZXJhc3RpY2l0eSB8IEJyZXVzY2gtUGFnYW4gVGVzdAoKYnB0ZXN0KGRtb2RlbDEpCgpgYGAKT24gdGhlIG90aGVyIGhhbmQsIHdlIGRvIG5vdCBoYXZlIHByb2JsZW1zIHJlZ2FyZGluZyB0aGUgSG9tb3NjZWRhc3RpY2l0eSB0ZXN0LCBzaW5jZSBpbiBhIHRpbWUgc2VyaWVzLCB3ZSB3b3JrIHdpdGggc2VxdWVudGlhbCBvYnNlcnZhdGlvbnMgaW4gdGltZSwgd2hlcmUgdGhlcmUgaXMgYSB0ZW1wb3JhbCBkZXBlbmRlbmN5IHN0cnVjdHVyZSBiZXR3ZWVuIHRoZSBvYnNlcnZhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCBzdWNjZXNzaXZlIHZhbHVlcyBpbiB0aGUgc2VyaWVzIGNhbiBiZSBjb3JyZWxhdGVkIGFuZCBjYW4gaW5mbHVlbmNlIGVhY2ggb3RoZXIuIFNpbmNlIHZhcmlhYmlsaXR5IGluIGEgdGltZSBzZXJpZXMgY2FuIGJlIGluZmx1ZW5jZWQgYnkgdGVtcG9yYWwgZWZmZWN0cyBhbmQgY3ljbGljYWwgb3Igc2Vhc29uYWwgcGF0dGVybnMsIHRoZSBhc3N1bXB0aW9uIG9mIGhvbW9zY2VkYXN0aWNpdHkgaXMgbm90IGFzIGNyaXRpY2FsIGFzIGluIHN0YW5kYXJkIGNyb3Nzb3ZlciByZWdyZXNzaW9uIGFuYWx5c2lzLiBUaGlzIGlzIGNoZWNrZWQgd2l0aCB0aGUgQlBURVNUIHRlc3QuCgpFbCB2YWxvciBwICgwLjE4NDgpIGVzIG1heW9yIHF1ZSBlbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIHTDrXBpY28gKGNvbW8gMC4wNSksIGxvIHF1ZSBzdWdpZXJlIHF1ZSBubyBoYXkgc3VmaWNpZW50ZSBldmlkZW5jaWEgcGFyYSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgaG9tb2NlZGFzdGljaWRhZC4gRW4gb3RyYXMgcGFsYWJyYXMsIG5vIHNlIGhhIGVuY29udHJhZG8gdW5hIGNsYXJhIGV2aWRlbmNpYSBkZSBoZXRlcm9zY2VkYXN0aWNpZGFkIGVuIGVsIG1vZGVsby4gCgpgYGB7cn0KI3Bsb3QocmVzaWR1b3MpCmBgYAoKYGBge3J9CiMgTm9ybWFsaXR5IG9mIHJlc2lkdWFscwpyZXNpZHVvcyA8LSByZXNpZHVhbHMoZG1vZGVsMSkKc2hhcGlyby50ZXN0KHJlc2lkdW9zKQoKYGBgCgpMaWtld2lzZSwgaXQgaXMgY2xlYXJseSBzZWVuIHRoYXQgdGhlIHJlc2lkdWFscyBkbyBub3QgZm9sbG93IGEgdHJlbmQgYW5kIHRoYXQgdGhleSBwcmVzZW50IGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi5IYXZpbmcgc2FpZCBhbGwgb2YgdGhlIGFib3ZlLCBtb2RlbCAxIGNhbiBiZSBpbXByb3ZlZCBkdWUgdG8gdGhlIGxvdyBzaWduaWZpY2FuY2Ugb2YgdGhlIHZhcmlhYmxlcyBhbmQgdGhlIHByb2JsZW0gb2YgbXVsdGljdWx0dXJhbGlzbS4gVGhlcmVmb3JlLCB0aGUgbW9kZWwgd2lsbCBiZSBhZGp1c3RlZCBmb2xsb3dpbmcgc29tZSBtZXRob2RzIG9mIG5vcm1hbGl6YXRpb24gb2YgdmFyaWFibGVzIGFuZCB0aGUgbW9kZWwgd2lsbCBiZSBhZGp1c3RlZCB0byBvdGhlciB0eXBlcyBvZiByZWdyZXNzaW9ucywgZm9yIGV4YW1wbGUgcG9seW5vbWlhbCwgYWxsIGluIG9yZGVyIHRvIGZpbmQgdGhlIG9uZSB0aGF0IGJlc3Qgc3VpdHMgb3VyIGRhdGEuVGhpcyBwcm9jZXNzIHdpdGggdGhlIGRpYWdub3N0aWMgdGVzdHMgd2lsbCBiZSBhcHBsaWVkIGZvciBlYWNoIG1vZGVsCgpUaGVyZSBpcyBub3QgZW5vdWdoIGV2aWRlbmNlIHRvIGFmZmlybSB0aGF0IHRoZSByZXNpZHVhbHMgZG8gbm90IGZvbGxvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24sIHNpbmNlIHRoZSBwIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgYWxwaGEgc2lnbmlmaWNhbmNlIGxldmVsICgwLjA1KS4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZSByZXNpZHVhbHMgY291bGQgYmUgY29uc2lkZXJlZCBhcHByb3hpbWF0ZWx5IG5vcm1hbC4KCiMjIyBSZWdyZXNpb24gTW9kZWwgMgoKQWNjb3JkaW5nIHRvIHRoZSBleHBsb3JhdG9yeSBhbmFseXNpcyBvZiB0aGUgZGF0YSwgaXQgd2FzIGRlY2lkZWQgdG8gbm9ybWFsaXplIHNvbWUgdmFyaWFibGVzIHRvIHJlZHVjZSBtdWx0aWNvbGxpbmVhcml0eS4KCmBgYHtyfQoKZG1vZGVsMiA8LSBsbShsb2coSUVEX0ZsdWpvcykgfiBFeHBvcnRhY2lvbmVzICsgbG9nKFRpcG9fZGVfQ2FtYmlvKSArIGxvZyhQSUJfUGVyX0NhcGl0YSkgKyBsb2coSU5QQyksIGRhdGEgPSBiZDIpCnN1bW1hcnkoZG1vZGVsMikKCmBgYApUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGNvZWZmaWNpZW50cyBpcyBtYWludGFpbmVkLCBidXQgbm93IHJlZmVycyB0byB0aGUgcmVsYXRpb25zaGlwcyBpbiB0ZXJtcyBvZiB0aGUgbm9ybWFsaXplZCBvciB0cmFuc2Zvcm1lZCB2YXJpYWJsZXMuIEZvciBleGFtcGxlLCB0aGUgY29lZmZpY2llbnQgZm9yIGxvZyhHRFBfUGVyX0NhcGl0YSkgaXMgMi45NjAsIHdoaWNoIG1lYW5zIHRoYXQsIG9uIGF2ZXJhZ2UsIGEgMSUgaW5jcmVhc2UgaW4gR0RQX1Blcl9DYXBpdGEgaXMgYXNzb2NpYXRlZCB3aXRoIGEgMi45NjAlIGluY3JlYXNlIGluIGxvZyhGRElfRmxvd3MpLkFzIGluIHRoZSBwcmV2aW91cyBtb2RlbCwgZXhwb3J0cywgSU5DUEMgYW5kIEdEUCByZW1haW4gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4KClRoZSBmaXQgb2YgdGhlIG1vZGVsIGlzIGFsc28gZXZhbHVhdGVkIHdpdGggc3RhdGlzdGljcyBzdWNoIGFzIHRoZSBSLXNxdWFyZWQgYW5kIHRoZSBGIHN0YXRpc3RpYy4gSW4gdGhpcyBjYXNlLCB0aGUgUi1zcXVhcmVkIGlzIDYzLjQ4JSwgaW5kaWNhdGluZyB0aGF0IHRoZSBtb2RlbCBleHBsYWlucyA2My40OCUgb2YgdGhlIHZhcmlhYmlsaXR5IGluIGxvZyhGRElfRmxvd3MpLgoKIyMjIERpYWdub3N0aWMgdGVzdCBNb2RlbCAyCmBgYHtyfQojTXVsdGljb2xsaW5lYXJpdHkKdmlmKGRtb2RlbDIpCgpgYGAKCkl0IGlzIG9ic2VydmVkIHRoYXQgbXVsdGljb2xsaW5lYXJpdHkgZGVjcmVhc2VkIGNvbnNpZGVyYWJseSwgaG93ZXZlciB0aGVyZSBhcmUgc3RpbGwgMyB2YXJpYWJsZXMgd2l0aCBWSUYgdmFsdWVzIGdyZWF0ZXIgdGhhbiAxMC4KCmBgYHtyfQojSGV0ZXJvc2NlZGFzdGljaXR5CmJwdGVzdChkbW9kZWwyKQoKYGBgCgpUaGUgcmVzdWx0IG9mIHRoaXMgdGVzdCBkb2VzIG5vdCBwcm92aWRlIHN1ZmZpY2llbnQgc3RhdGlzdGljYWwgZXZpZGVuY2UgdG8gYWZmaXJtIHRoYXQgdGhlcmUgaXMgSGV0ZXJvc2NlZGFzdGljaXR5LgoKYGBge3J9CiMgTm9ybWFsaXR5IG9mIHJlc2lkdWFscwpyZXNpZHVvczIgPC0gcmVzaWR1YWxzKGRtb2RlbDIpCnNoYXBpcm8udGVzdChyZXNpZHVvcykKCmBgYAoKVGhlIHJlc3VsdCBvZiB0aGlzIHRlc3QgKHAtdmFsdWUgPSAwLjczMikgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm90IGVub3VnaCBldmlkZW5jZSB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSBkYXRhIGluICJyZXNpZHVhbHMiIGZvbGxvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoZXJlZm9yZSwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBkYXRhIGNhbiBhcHByb3hpbWF0ZSBhIG5vcm1hbCBkaXN0cmlidXRpb24uCgpgYGB7cn0KcGxvdChyZXNpZHVvczIpCmBgYAoKIyMjIFJlZ3Jlc2lvbiBNb2RlbCAzCgpJbiB0aGlzIG1vZGVsLCB0aGUgaGlnaCBjb3JyZWxhdGlvbiBvZiBleHBvcnRzIHdpdGggbXVsdGlwbGUgdmFyaWFibGVzIHdhcyBpZGVudGlmaWVkLCBob3dldmVyIGl0IHdhcyBkZWNpZGVkIHRvIHJlcGxhY2UgdGhlIElOUEMgd2l0aCBjYXJib24gZW1pc3Npb25zIGJlY2F1c2UgdGhlIGV4cG9ydCB2YXJpYWJsZSBpcyB2ZXJ5IGltcG9ydGFudCBmb3IgdGhlIHBvbGl0aWNhbCBhbmQgc29jaWFsIGNvbnRleHQgb2Ygb3VyIHByb2JsZW0sIGl0IGlzIGFsc28gcGFydCBvZiBvdXIgaHlwb3RoZXNlcyBhbmQgYmFzZWQgb24gcmVzZWFyY2ggY2FycmllZCBvdXQsIGl0IGlzIGJlbGlldmVkIHRoYXQgZXhwb3J0cyBoYXZlIGFuIGltcG9ydGFudCB3ZWlnaHQgaW4gbmVhcnNob3JpbmcuIEZ1cnRoZXJtb3JlLCBDTzIgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBwaGVub21lbm9uIHN0dWRpZWQgYmVjYXVzZSB3aGVuIG1hbnkgY29tcGFuaWVzIGluc3RhbGwgZ2lnYWZhY3RvcmllcyBpbiBhIGNvdW50cnksIENPMiBpbmRpY2VzIHVzdWFsbHkgaW5jcmVhc2UuCgpgYGB7cn0KCmRtb2RlbDMgPC0gbG0obG9nKElFRF9GbHVqb3MpIH4gICBFeHBvcnRhY2lvbmVzICsgbG9nKENPMl9FbWlzaW9uZXMpICsgSShUaXBvX2RlX0NhbWJpb14yKSArIGxvZyhQSUJfUGVyX0NhcGl0YSksIGRhdGEgPSBiZDIpCnN1bW1hcnkoZG1vZGVsMykKCmBgYAoKSW4gc3VtbWFyeSwgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHRvIHByZWRpY3QgbG9nKEZESV9GbG93cykgc2hvd3MgdGhhdCB0aGUgdmFyaWFibGUgbG9nKEdEUF9QZXJfQ2FwaXRhKSBoYXMgYSBzaWduaWZpY2FudCBpbmZsdWVuY2Ugb24gdGhlIHByZWRpY3Rpb24sIHdpdGggYW4gZXN0aW1hdGVkIGNvZWZmaWNpZW50IG9mIGFwcHJveGltYXRlbHkgNC4wNjYuIFRoaXMgbWVhbnMgdGhhdCBhbiBpbmNyZWFzZSBpbiBHRFAgcGVyIGNhcGl0YSBpcyBwb3NpdGl2ZWx5IGFzc29jaWF0ZWQgd2l0aCBhbiBpbmNyZWFzZSBpbiBsb2coRkRJX0ZsdWpvcykuIEhvd2V2ZXIsIHRoZSBvdGhlciB2YXJpYWJsZXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsLCBzdWNoIGFzIEV4cG9ydHMsIGxvZyhDTzJfRW1pc2lvbmVzKSBhbmQgSShUaXBvX2RlX2NhbWJpb14yKSwgZG8gbm90IGhhdmUgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgcHJlZGljdGlvbiBvZiBsb2coRkRJX0ZsdWpvcykgZHVlIHRvIHRoZWlyIGhpZ2ggcC12YWx1ZXMuIEFsdG9nZXRoZXIsIHRoZSBtb2RlbCBleHBsYWlucyBhcm91bmQgNTguMzklIG9mIHRoZSB2YXJpYWJpbGl0eSBpbiBsb2coRkRJX0ZsdWpvcykKCiMjIyBEaWFnbm9zdGljIHRlc3QgbW9kZWwgMwoKYGBge3J9CiNNdWx0aWNvbGxpbmVhcml0eQp2aWYoZG1vZGVsMykKCmBgYAoKTW9kZWwgMyBubyBsb25nZXIgcHJlc2VudHMgbXVsdGljb2xsaW5lYXJpdHkKCmBgYHtyfQojSGV0ZXJvY2VyYXN0aWNpdHkgCmJwdGVzdChkbW9kZWwzKQoKYGBgClRoZSB0ZXN0IHlpZWxkcyBhIEJQIHN0YXRpc3RpY2FsIHZhbHVlIG9mIDQuNzQ3NCB3aXRoIDQgZGVncmVlcyBvZiBmcmVlZG9tIChkZikgYW5kIGEgcCB2YWx1ZSBvZiAwLjMxNDIuIFNpbmNlIHRoZSBwLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2lnbmlmaWNhbmNlIGxldmVsICh1c3VhbGx5IHNldCBhdCAwLjA1KSwgdGhlcmUgaXMgbm90IGVub3VnaCBldmlkZW5jZSB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyBpbiB0aGlzIGNhc2UuIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgZXJyb3JzIGluIHlvdXIgcmVncmVzc2lvbiBtb2RlbCBjYW4gYmUgY29uc2lkZXJlZCBob21vc2tlZGFzdGljLCB0aGF0IGlzLCBubyBzdHJvbmcgZXZpZGVuY2Ugb2YgaGV0ZXJvc2NlZGFzdGljaXR5IGhhcyBiZWVuIGZvdW5kIGluIHRoZSBtb2RlbC4KCgpgYGB7cn0KIyBOb3JtYWxpdHkgb2YgcmVzaWR1YWxzCnJlc2lkdW9zMyA8LSByZXNpZHVhbHMoZG1vZGVsMykKc2hhcGlyby50ZXN0KHJlc2lkdW9zMykKCmBgYAoKVGhlIHRlc3QgcmV0dXJucyBhIFcgdmFsdWUgKHRlc3Qgc3RhdGlzdGljKSBlcXVhbCB0byAwLjk3NTU2IGFuZCBhIHAgdmFsdWUgZXF1YWwgdG8gMC43Njg3LiBTaW5jZSB0aGUgcC12YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNpZ25pZmljYW5jZSBsZXZlbCB0eXBpY2FsbHkgc2V0IGF0IDAuMDUsIHRoZXJlIGlzIG5vdCBlbm91Z2ggZXZpZGVuY2UgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgaW4gdGhpcyBjYXNlLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIHJlc2lkdWFscyBmcm9tIHlvdXIgbW9kZWwgKHJlc2lkdW9zMykgc2hvdyBubyBzaWduaWZpY2FudCBldmlkZW5jZSBvZiBkZXZpYXRpbmcgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24sIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzaWR1YWxzIGNvdWxkIGFwcHJvYWNoIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4KCmBgYHtyfQpwbG90KHJlc2lkdW9zMykKYGBgCgpgYGB7cn0KI0FJQyAKQUlDKGRtb2RlbDEpCkFJQyhkbW9kZWwyKQpBSUMoZG1vZGVsMykKCmBgYAoKVGhlIEFJQyBpcyBhIHN0YXRpc3RpY2FsIHRvb2wgdGhhdCBtZWFzdXJlcyB0aGUgbW9kZWwgdGhhdCBiZXN0IGZpdHMgdGhlIGRhdGEuIFRoZSBnb2FsIGlzIHRvIGZpbmQgdGhlIG1vZGVsIHdpdGggdGhlIGxvd2VzdCBBSUMgdmFsdWUsIGFzIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIG1vZGVsIHByb3ZpZGVzIGEgZ29vZCBmaXQgdG8gdGhlIGRhdGEuIEluIHRoaXMgY2FzZSwgdGhlIGxvd2VzdCBBSUMgdmFsdWUgaXMgaW4gbW9kZWwgMiB3aXRoIGEgdmFsdWUgb2YgLTMuIFRoZXJlZm9yZSwgZm9yIHRoaXMgdGVzdCwgdGhlIG1vZGVsIHRoYXQgYmVzdCBmaXRzIHRoZSBkYXRhIGlzIG1vZGVsIDIuCgojIyMjIyBNb2RlbCBTZWxlY3Rpb24KCkFmdGVyIHBlcmZvcm1pbmcgZGlhZ25vc3RpYyB0ZXN0cyBhbmQgY29tcGFyaW5nIHRoZSByZWdyZXNzaW9uIG1vZGVscywgSSBoYXZlIGlkZW50aWZpZWQgdGhhdCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBtb2RlbHMgZm9yIG91ciBhbmFseXNpcyBhcmUgTW9kZWwgMyBhbmQgTW9kZWwgMi4gQm90aCBtb2RlbHMgaGF2ZSBzdWNjZXNzZnVsbHkgcGFzc2VkIHRoZSBTaGFwaXJvLVdpbGsgbm9ybWFsaXR5IHRlc3QgYW5kIHRoZSBCcmV1c2NoLVBhZ2FuIHRvIGV2YWx1YXRlIHRoZSBob21vc2NlZGFzdGljaXR5IG9mIHRoZSByZXNpZHVhbHMuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIHNlcmlvdXMgdmlvbGF0aW9ucyBvZiB0aGUgYXNzdW1wdGlvbnMgb2Ygbm9ybWFsaXR5IGFuZCBob21vc2NlZGFzdGljaXR5IGluIG91ciBkYXRhLgoKSG93ZXZlciwgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBNb2RlbCAyIHNob3dzIGNlcnRhaW4gc2lnbnMgb2YgbXVsdGljb2xsaW5lYXJpdHksIGFsdGhvdWdoIHRoZXNlIGFyZSBzbWFsbCBhbmQgc2lnbmlmaWNhbnRseSBsb3dlciBjb21wYXJlZCB0byBNb2RlbCAxLiBEZXNwaXRlIHRoaXMgbXVsdGljb2xsaW5lYXJpdHksIE1vZGVsIDIgZXhoaWJpdHMgYSBoaWdoZXIgY29lZmZpY2llbnQgb2YgZGV0ZXJtaW5hdGlvbiAoUiBzcXVhcmVkKSBhbmQgYSBsb3dlciBBa2Fpa2UgSW5mb3JtYXRpb24gQ3JpdGVyaW9uIChBSUMpIHZhbHVlIGNvbXBhcmVkIHRvIE1vZGVsIDMuIEZ1cnRoZXJtb3JlLCBNb2RlbCAyIGluY2x1ZGVzIGZvdXIgcHJlZGljdG9yIHZhcmlhYmxlcyB0aGF0IGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCB3aGlsZSBNb2RlbCAzIG9ubHkgaW5jb3Jwb3JhdGVzIHR3by4KCkl0IGlzIHJlbGV2YW50IHRvIG5vdGUgdGhhdCBtdWx0aWNvbGxpbmVhcml0eSBpbiBvdXIgZGF0YSBpcywgdG8gc29tZSBkZWdyZWUsIGluaGVyZW50IHRvIHRoZSBuYXR1cmUgb2YgdGhlIG1hY3JvZWNvbm9taWMgaW5kZXBlbmRlbnQgdmFyaWFibGVzIHRoYXQgcmVwcmVzZW50IGluZGljYXRvcnMgb2YgYW4gZW50aXJlIG5hdGlvbi4gVGhlc2UgdmFyaWFibGVzIHRlbmQgdG8gYmUgY29ycmVsYXRlZCB3aXRoIGVhY2ggb3RoZXIsIHNpbmNlIHRoZXkgaW5mbHVlbmNlIGVhY2ggb3RoZXIgaW4gYSBuYXRpb25hbCBtYWNyb2Vjb25vbWljIGNvbnRleHQuIFRoZXJlZm9yZSwgd2UgaGF2ZSBjaG9zZW4gdG8gc2VsZWN0IE1vZGVsIDIsIGFzIGl0IGZpdHMgb3VyIGRhdGEgYmV0dGVyLCBzaG93cyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHNpZ25pZmljYW50IHZhcmlhYmxlcyBhbmQgb2ZmZXJzIGEgaGlnaGVyIFIgc3F1YXJlZCBjb21wYXJlZCB0byBNb2RlbCAzLiBIb3dldmVyLCB0aGUgY2hvaWNlIG9mIG1vZGVsIHdpbGwgZGVwZW5kIHVsdGltYXRlbHkgb2YgdGhlIG9iamVjdGl2ZXMgb2Ygb3VyIHJlc2VhcmNoLiBTaW5jZSBvdXIgcHJpbWFyeSBmb2N1cyBpcyBvbiB1bmRlcnN0YW5kaW5nIHRoZSBpbXBhY3Qgb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBvbiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLCB3ZSBjb25jbHVkZSB0aGF0IE1vZGVsIDIgaXMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgY2hvaWNlIHRvIG1lZXQgb3VyIGFuYWx5c2lzIG9iamVjdGl2ZXMuCgoKYGBge3J9CmxpYnJhcnkoZWZmZWN0cykKZWZlY3Rvc19kbW9kZWwzIDwtIGFsbEVmZmVjdHMoZG1vZGVsMykKCiMgR3JhcGggdGhlIGVmZmVjdHMKcGxvdChlZmVjdG9zX2Rtb2RlbDMpCmBgYAoKQXMgd2UgY2FuIHNlZSBpbiB0aGUgZ3JhcGhzIG9mIHRoZSBlZmZlY3RzIG9mIGVhY2ggb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyB3aXRoIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUsIHdlIGNhbiBvYnNlcnZlIHRoYXQgaW4gY29udHJhc3QgdG8gdGhlIGh5cG90aGVzZXMgcHJvcG9zZWQsIGV4cG9ydHMgYW5kIHRoZSBleGNoYW5nZSByYXRlIHNlZW0gdG8gaGF2ZSBjb250cmFkaWN0b3J5IGVmZmVjdHMgdG8gb3VyIGh5cG90aGVzZXMsIHdoZXJlIGV4cG9ydHMgaGF2ZSBhIG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCB3aXRoIEZESSBhbmQgdGhlIGV4Y2hhbmdlIHJhdGUgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAuIFRoaXMgY2FuIGJlIGR1ZSB0byBtYW55IHNpdHVhdGlvbnMgdGhhdCByZXF1aXJlIGZ1cnRoZXIgYW5hbHlzaXMsIGJ1dCBmb3IgZXhhbXBsZSwgaW4gc29tZSBjYXNlcywgdGhlIGV4Y2hhbmdlIHJhdGUgY2FuIGhhdmUgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgd2l0aCBGb3JlaWduIERpcmVjdCBJbnZlc3RtZW50IChGREkpIHdoZW4gdGhlIGxvY2FsIGN1cnJlbmN5IGRldmFsdWVzIOKAi+KAi29yIGJlY29tZXMgd2Vha2VyIGluIGNvbXBhcmlzb24gd2l0aCBvdGhlciBmb3JlaWduIGN1cnJlbmNpZXMuIFRoaXMgZGV2YWx1YXRpb24gY2FuIG1ha2UgcHJvZHVjdGlvbiBhbmQgb3BlcmF0aW5nIGNvc3RzIGluIHRoZSBob3N0IGNvdW50cnksIGluIHRoaXMgY2FzZSBNZXhpY28sIGxvd2VyIGluIGZvcmVpZ24gY3VycmVuY3kgdGVybXMsIHdoaWNoIGlzIGF0dHJhY3RpdmUgdG8gZm9yZWlnbiBjb21wYW5pZXMgdGhhdCB3YW50IHRvIGludmVzdCBhbmQgZXN0YWJsaXNoIG9wZXJhdGlvbnMgaW4gdGhlIGNvdW50cnkuIFRoaXMgY2FuIGJvb3N0IEZESSBieSBtYWtpbmcgTWV4aWNvIG1vcmUgY29zdC1jb21wZXRpdGl2ZSBhbmQgbW9yZSBwcm9maXRhYmxlIGZvciBmb3JlaWduIGNvbXBhbmllcy4gQnV0IGl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG1lbnRpb24gdGhhdCBtYW55IHRpbWVzIGNvbXBhbmllcyBsb29rIGZvciBhIGNvdW50cnkgd2l0aCBhIHN0YWJsZSBjdXJyZW5jeSB0aGF0IGRvZXMgbm90IHByZXNlbnQgc2lnbmlmaWNhbnQgZmx1Y3R1YXRpb25zLCB0aGlzIGd1YXJhbnRlZXMgdGhlIGZpbmFuY2lhbCBmb3JlY2FzdCBpbiBtYW55IGNhc2VzLiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIG5lZ2F0aXZlIGltcGFjdCBvZiBleHBvcnRzIGNhbiBiZSBleHBsYWluZWQgd2hlbiBpbiBzb21lIGNhc2VzIHdoZW4gYSBjb3VudHJ5IGZvY3VzZXMgb24gaW5jcmVhc2luZyBpdHMgZXhwb3J0cywgdGhlcmUgbWF5IGJlIGNvbXBldGl0aW9uIGZvciBzY2FyY2UgcmVzb3VyY2VzLCBzdWNoIGFzIHNraWxsZWQgbGFib3Igb3IgcmF3IG1hdGVyaWFscy4gVGhpcyBtYXkgY2F1c2UgZm9yZWlnbiBjb21wYW5pZXMgc2Vla2luZyBGREkgdG8gZmFjZSBoaWdoZXIgY29zdHMgb3IgZGlmZmljdWx0aWVzIGluIGFjY2Vzc2luZyB0aGVzZSByZXNvdXJjZXMsIHdoaWNoIGNvdWxkIGRpc2NvdXJhZ2UgaW52ZXN0bWVudC4KT24gdGhlIG90aGVyIGhhbmQsIGFzIGVzdGFibGlzaGVkIGluIHRoZSBoeXBvdGhlc2VzLCBHRFAgcGVyIENhcGl0YSBoYXMgYSBwb3NpdGl2ZSBhbmQgc3Ryb25nIHJlbGF0aW9uc2hpcCB3aXRoIEZvcmVpZ24gRGlyZWN0IEludmVzdG1lbnQgc2luY2UgaXQgaXMgYSBzaWduIG9mIGVjb25vbWljIGhlYWx0aCBpbiBhIGNvdW50cnksIHdoaWNoIG1ha2VzIGl0IGF0dHJhY3RpdmUgYW5kIGNvbXBldGl0aXZlIGZvciBuZWFyc2hvcmluZy4KCgojIyMgTGFzc28gTW9kZWwKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEluZGVwZW5kZW50IHZhcmlhYmxlcwp4IDwtIG1vZGVsLm1hdHJpeChsb2coSUVEX0ZsdWpvcykgfiBFbXBsZW8gKyBFZHVjYWNpb24gKyBTYWxhcmlvX0RpYXJpbyArIElubm92YWNpb24gKyBJbnNlZ3VyaWRhZF9Sb2JvICsgSW5zZWd1cmlkYWRfSG9taWNpZGlvICsgVGlwb19kZV9DYW1iaW8gKyBEZW5zaWRhZF9DYXJyZXRlcmEgKyBEZW5zaWRhZF9Qb2JsYWNpb24gKyBDTzJfRW1pc2lvbmVzICsgUElCX1Blcl9DYXBpdGEgKyBJTlBDLCBkYXRhID0gYmQyKVssLTFdCgojIERlcGVuZGVudCB2YXJpYWJsZQp5IDwtIGJkMiRJRURfRmx1am9zCgojIEZpbmQgdGhlIGJlc3QgbGFtYmRhIHVzaW5nIGNyb3NzLXZhbGlkYXRpb24Kc2V0LnNlZWQoMTIzKSAKY3YubGFzc28gPC0gY3YuZ2xtbmV0KHgsIHksIGFscGhhID0gMSkKCiMgRGlzcGxheSB0aGUgYmVzdCBsYW1iZGEgdmFsdWUKY3YubGFzc28kbGFtYmRhLm1pbgoKIyBGaXQgdGhlIGZpbmFsIExBU1NPIG1vZGVsIG9uIHRoZSB0cmFpbmluZyBkYXRhCmxhc3NvbW9kZWwgPC0gZ2xtbmV0KHgsIHksIGFscGhhID0gMSwgbGFtYmRhID0gY3YubGFzc28kbGFtYmRhLm1pbikKCiMgRGlzcGxheSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cwpjb2VmKGxhc3NvbW9kZWwpCgojIE1ha2UgcHJlZGljdGlvbnMgb24gdGhlIHRlc3QgZGF0YQp4LnRlc3QgPC0gbW9kZWwubWF0cml4KGxvZyhJRURfRmx1am9zKSB+IEVtcGxlbyArIEVkdWNhY2lvbiArIFNhbGFyaW9fRGlhcmlvICsgSW5ub3ZhY2lvbiArIEluc2VndXJpZGFkX1JvYm8gKyBJbnNlZ3VyaWRhZF9Ib21pY2lkaW8gKyBUaXBvX2RlX0NhbWJpbyArIERlbnNpZGFkX0NhcnJldGVyYSArIGxvZyhEZW5zaWRhZF9Qb2JsYWNpb24pICsgQ08yX0VtaXNpb25lcyArIFBJQl9QZXJfQ2FwaXRhICsgSU5QQywgZGF0YSA9IGJkMilbLC0xXQpsYXNzb3ByZWRpY3Rpb25zIDwtIHByZWRpY3QobGFzc29tb2RlbCwgbmV3eCA9IGFzLm1hdHJpeCh4LnRlc3QpKQoKIyBNb2RlbCBBY2N1cmFjeQpkYXRhLmZyYW1lKAogIFJNU0UgPSBSTVNFKGxhc3NvcHJlZGljdGlvbnMsIGJkMiRJRURfRmx1am9zKSwKICBSc3F1YXJlID0gUjIobGFzc29wcmVkaWN0aW9ucywgYmQyJElFRF9GbHVqb3MpKQoKIyBWaXN1YWxpemluZyBMQVNTTyByZWdyZXNzaW9uIHJlc3VsdHMKbGJzX2Z1biA8LSBmdW5jdGlvbihmaXQsIG9mZnNldF94ID0gMSwgLi4uKSB7CiAgTCA8LSBsZW5ndGgoZml0JGxhbWJkYSkKICB4IDwtIGxvZyhmaXQkbGFtYmRhW0xdKSArIG9mZnNldF94CiAgeSA8LSBmaXQkYmV0YVssIExdCiAgbGFicyA8LSBuYW1lcyh5KQogIHRleHQoeCwgeSwgbGFiZWxzID0gbGFicywgLi4uKQp9CgpsYXNzbyA8LSBnbG1uZXQoc2NhbGUoeCksIHksIGFscGhhID0gMSkKCnBsb3QobGFzc28sIHh2YXIgPSAibGFtYmRhIiwgbGFiZWwgPSBUUlVFKQpsYnNfZnVuKGxhc3NvKQphYmxpbmUodiA9IGN2Lmxhc3NvJGxhbWJkYS5taW4sIGNvbCA9ICJyZWQiLCBsdHkgPSAyKQphYmxpbmUodiA9IGN2Lmxhc3NvJGxhbWJkYS4xc2UsIGNvbCA9ICJibHVlIiwgbHR5ID0gMikKCmBgYApgYGB7cn0KcHJpbnQobGFzc29tb2RlbCkKYGBgCkVtcGxveW1lbnQ6IEVhY2ggYWRkaXRpb25hbCB1bml0IGluIHRoZSAiRW1wbG95bWVudCIgdmFyaWFibGUgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluY3JlYXNlIG9mIGFwcHJveGltYXRlbHkgMjMsMzk4LjY0IGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuCgpFZHVjYXRpb246IEVhY2ggYWRkaXRpb25hbCB1bml0IGluIHRoZSDigJxFZHVjYXRpb27igJ0gdmFyaWFibGUgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluY3JlYXNlIG9mIGFwcHJveGltYXRlbHkgMjgsNTA1LjI4IGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuCgpEYWlseV9XYWdlOiBFYWNoIGFkZGl0aW9uYWwgdW5pdCBpbiB0aGUgdmFyaWFibGUgIkRhaWx5X1dhZ2UiIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGRlY3JlYXNlIG9mIGFwcHJveGltYXRlbHkgNTM1LjA1IGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUKCklubm92YXRpb246IEVhY2ggYWRkaXRpb25hbCB1bml0IGluIHRoZSAiSW5ub3ZhdGlvbiIgdmFyaWFibGUgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluY3JlYXNlIG9mIGFwcHJveGltYXRlbHkgNDcsNzAzLjE4IGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuCgpJbnNlY3VyaXR5X1JvYmJlcnkgYW5kIEluc2VjdXJpdHlfSG9taWNpZGU6IFRoZXNlIHR3byB2YXJpYWJsZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgZmluYWwgbW9kZWwsIHNpbmNlIHRoZWlyIGNvZWZmaWNpZW50cyBhcmUgc2hvd24gYXMgcG9pbnRzICguKSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbW9kZWwgZGlkIG5vdCBmaW5kIGEgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2UgdmFyaWFibGVzIGFuZCB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLgoKVHlwZV9vZl9DaGFuZ2U6IExpa2UgdGhlIHByZXZpb3VzIHZhcmlhYmxlcywgdGhpcyB2YXJpYWJsZSBhbHNvIGRvZXMgbm90IHNlZW0gdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIG1vZGVsLgoKUm9hZF9EZW5zaXR5OiBFYWNoIGFkZGl0aW9uYWwgdW5pdCBpbiB0aGUgIlJvYWRfRGVuc2l0eSIgdmFyaWFibGUgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluY3JlYXNlIG9mIGFwcHJveGltYXRlbHkgNiwxNzcsOTE1IGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuCgpQb3B1bGF0aW9uX0RlbnNpdHk6IExpa2Ugc29tZSBvZiB0aGUgb3RoZXIgdmFyaWFibGVzLCB0aGlzIHZhcmlhYmxlIGFsc28gZG9lcyBub3QgYXBwZWFyIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBtb2RlbC4KCkNPMl9FbWlzc2lvbnM6IEVhY2ggYWRkaXRpb25hbCB1bml0IGluIHRoZSAiQ08yX0VtaXNzaW9ucyIgdmFyaWFibGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZGVjcmVhc2Ugb2YgYXBwcm94aW1hdGVseSAxMCwzMjkuNjQgaW4gdGhlIGRlcGVuZGVudCB2YXJpYWJsZS4KCkdEUF9QZXJfQ2FwaXRhOiBFYWNoIGFkZGl0aW9uYWwgdW5pdCBpbiB0aGUgIkdEUF9QZXJfQ2FwaXRhIiB2YXJpYWJsZSBpcyBhc3NvY2lhdGVkIHdpdGggYW4gaW5jcmVhc2Ugb2YgYXBwcm94aW1hdGVseSAxLjI0IGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuCgpJTlBDOiBMaWtlIHNvbWUgb2YgdGhlIG90aGVyIHZhcmlhYmxlcywgdGhpcyB2YXJpYWJsZSBhbHNvIGRvZXMgbm90IGFwcGVhciB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgbW9kZWwuCgpPbiB0aGUgb3RoZXIgaGFuZCwgUk1TRSB2YWx1ZSBpcyA3MCw1NzguNjkuIFRoaXMgbWVhbnMgdGhhdCwgb24gYXZlcmFnZSwgdGhlIG1vZGVsIHByZWRpY3Rpb25zIGhhdmUgYW4gZXJyb3Igb2YgYWJvdXQgNzAsNTc4LjY5IHVuaXRzLiBTaW5jZSBpdCBpcyBzcG9rZW4gaW4gbWlsbGlvbnMgb2YgZG9sbGFycywgdGhlIFJNU0UgdmFsdWUgc2VlbXMgdG8gYmUgdG9vIGhpZ2guIExpa2V3aXNlLCB0aGUgaGlnaCB2YWx1ZSBvZiBMYW1iZGEgaW5kaWNhdGVzIHRoZSBoaWdoIHJlZ3VsYXRpb24gYW5kIGV4Y2x1c2lvbiBvZiB2YXJpYWJsZXMgdGhhdCB3ZXJlIHVzZWQgaW4gdGhlIG1vZGVsLgoKCiMjIyBTZXJpYWwgQXV0b2NvcnJlbGF0aW9uIAoKYGBge3J9CmxpYnJhcnkoZm9yZWNhc3QpCgojIENyZWF0ZSBhIHRpbWUgc2VyaWVzIGZyb20gRkRJX0ZsdWpvcyBkYXRhCnRpbWVfc2VyaWVzIDwtIHRzKGJkMiRJRURfRmx1am9zLCBmcmVxdWVuY3kgPSAxMikKCiMgQ2FsY3VsYXRlIHNlcmlhbCBhdXRvY29ycmVsYXRpb24gYW5kIGRpc3BsYXkgdGhlIGF1dG9jb3JyZWxhdGlvbiBncmFwaAphY2ZfcmVzdWx0IDwtIGFjZih0aW1lX3NlcmllcywgbGFnLm1heCA9IDEyKSAgIyBQdWVkZXMgYWp1c3RhciBsYWcubWF4IHNlZ8O6biB0dXMgbmVjZXNpZGFkZXMKCiMgUGxvdCB0aGUgYXV0b2NvcnJlbGF0aW9uIGZ1bmN0aW9uCnBsb3QoYWNmX3Jlc3VsdCwgbWFpbiA9ICJTZXJpYWwgQXV0b2NvcnJlbGF0aW9uIG9mIEZESSBGbG93cyBpbiBNZXhpY28iKSAjQm94dGVzdHMKCmBgYApJbiB0aGlzIHNlcmlhbCBhdXRvY29ycmVsYXRpb24gZ3JhcGggd2UgY2FuIHNlZSB0aGF0IHdoZW4gdGhlIEFDRiBjcm9zc2VzIHRoZSBjb25maWRlbmNlIGJhbmQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgY29ycmVsYXRpb24gYXQgdGhhdCBzcGVjaWZpYyBsYWcgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgYXMgd2UgY2FuIHNlZSBpbiB0aGUgZ3JhcGgsIHRoZSBBQ0YgY3Jvc3NlcyB0aGUgY29uZmlkZW5jZSBiYW5kIG9ubHkgYXQgdGhlIHZhbHVlIG9mIHggZXF1YWxzIDAsIHdoaWNoIG1lYW5zIHRoYXQgdGhlcmUgaXMgb25seSBhIHNpZ25pZmljYW50IGNvcnJlbGF0aW9uIGF0IGxhZyAwLiBUaGVyZWZvcmUsIHRoZXJlIGRvIG5vdCBhcHBlYXIgdG8gYmUgc2lnbmlmaWNhbnQgYXV0b2NvcnJlbGF0aW9uIHBhdHRlcm5zIGluIHRoaXMgdGltZSBzZXJpZXMuCgojIENvbmNsdXNpb25zIC0gSW5zaWdodHMKCi0gLSAtIEluc2lnaHQgMTogRXhwb3J0cyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLCBob3dldmVyLCBpbiBjb250cmFkaWN0aW9uIHRvIHRoZSBoeXBvdGhlc2lzLCB0aGV5IGhhdmUgYSBuZWdhdGl2ZSBpbmZsdWVuY2UuCgotIC0gLSBJbnNpZ2h0IDI6IEdEUCBQRVIgY2FwaXRhIGRlbW9uc3RyYXRlZCB0byBoYXZlIGEgcG9zaXRpdmUgYW5kIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIGZvcmVpZ24gZGlyZWN0IGludmVzdG1lbnQsIHZhbGlkYXRpbmcgb3VyIGh5cG90aGVzaXMuCgotIC0gLSBJbnNpZ2h0IDM6IFRoZSBleGNoYW5nZSByYXRlIHdhcyBzaG93biB0byBoYXZlIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIHdpdGggZm9yZWlnbiBkaXJlY3QgaW52ZXN0bWVudCwgaG93ZXZlciwgdGhpcyBleGNoYW5nZSByYXRlIHdhcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4KCi0gLSAtIEluc2lnaHQgNDogVGhlIElOUEMgc2hvd2VkIGEgcG9zaXRpdmUgYW5kIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW1wYWN0IHdpdGggdGhlIGRlcGVuZGVudCB2YXJpYWJsZSwgc29tZXRoaW5nIGFib3V0IHdoaWNoIG5vIGh5cG90aGVzaXMgd2FzIG1hZGUuIEl0IHdpbGwgYmUgaW50ZXJlc3RpbmcgdG8gYW5hbHl6ZSBpbiBkZXRhaWwgd2hhdCB0aGUgZWZmZWN0cyBvZiBpbmZsYXRpb24gYXJlIG9uIHRoZSBwaGVub21lbm9uIHN0dWRpZWQuCgotIC0gLSBJbnNpZ2h0IDU6IFRoZSBub3JtYWxpemF0aW9ucyBtYWRlIGFuZCB0aGUgTEFTU08gbW9kZWwgaGVscGVkIHVzIGltcHJvdmUgb3VyIG1vZGVsIGFuZCByZWR1Y2UgcHJvYmxlbXMgc3VjaCBhcyBtdWx0aWN1bGluYWxpdHkuCgotIC0gLSBJbnNpZ2h0IDY6IE5lYXJzaG9yaW5nIGlzIGFuIGV4dHJlbWVseSBjb21wbGV4IHBoZW5vbWVub24sIHdob3NlIGFuYWx5c2lzIGRlcGVuZHMgb24gbWFueSBtb3JlIGluZGVwZW5kZW50IHZhcmlhYmxlcywgbm90IG9ubHkgbmF0aW9uYWwsIGJ1dCBhbHNvIGludGVybmF0aW9uYWwuIEFzIGhhcyBiZWVuIHNlZW4gaW4gdGhlIGhpc3RvcmljYWwgYW5hbHlzaXMgb2YgdGhlIGRhdGFiYXNlIHByb3ZpZGVkLCBNZXhpY28gaGFzIGJlZW4gaW5jcmVhc2luZyB0aGlzIHBoZW5vbWVub24gaW4gcmVjZW50IHllYXJzIGFuZCBpdCB3YXMgaW50ZXJlc3RpbmcgdG8gc2VlIGhvdyBzb21lIG9mIHRoZSB2YXJpYWJsZXMgYXJlIHNpZ25pZmljYW50IGZvciB0aGUgcGhlbm9tZW5vbi4gSXQgd2lsbCBiZSBpbnRlcmVzdGluZyB0byBjb250aW51ZSBhbmFseXppbmcgdGhpcyBwaGVub21lbm9uIGFsb25nIHdpdGggb3RoZXJzLiBpbnRlcm5hdGlvbmFsIHBoZW5vbWVuYSB0byBzdHVkeSB0aGVpciByZWxhdGlvbnNoaXBzLgoKCgojIFJlZmVyZW5jZXMKCiJMYSBpbXBvcnRhbmNpYSBkZSBsYSBpbm5vdmFjacOzbiBlbiBsYSBpbnZlcnNpw7NuIGV4dHJhbmplcmEgZGlyZWN0YS4iICgyMDIzLCAxNSBkZSBhZ29zdG8pLiBFc3RyYXRlZ2lhcyBFbXByZXNhcmlhbGVzLiBodHRwczovL3d3dy5lc3RyYXRlZ2lhc2VtcHJlc2FyaWFsZXMuY29tL2FydGljdWxvLWlubm92YWNpb24taWVkIAoKUMOpcmV6LCBKLiAoMjAyMywgMjAgZGUganVsaW8pLiBFbCBjcmVjaW1pZW50byBlY29uw7NtaWNvIGltcHVsc2FkbyBwb3IgbGEgaW52ZXJzacOzbiBleHRyYW5qZXJhIGVuIE3DqXhpY28uIEVjb25vbcOtYSBHbG9iYWwuIGh0dHBzOi8vd3d3LmVjb25vbWlhZ2xvYmFsLmNvbS9jcmVjaW1pZW50by1lY29ub21pY28taWVkLW1leGljbwoKU2F1Y2VkbywgRC4gKDIwMjMpLiBNZXhpY28gYW5kIGl0cyBhdHRyYWN0aXZlbmVzcyBmb3IgbmVhcnNob3JpbmcuIENJQy4gaHR0cHM6Ly9jaWMuaXRlc20ubXgvUGFnaW5hcy9QYWdpbmEtRG9jdW1lbnRvQ2ljLmFzcHg/aWQ9MTg2MCAKClZlbGF6cXVlZCwgRC4gKDIwMTEpLiBBTsOBTElTSVMgWSBQUkVESUNDScOTTiBERSBTRVJJRVMgREUgVElFTVBPIEVOIE1FUkNBRE9TIERFIEVORVJHw41BIFVTQU5ETyBFTCBMRU5HVUFKRSBSLiBTY2llbG8uIGh0dHA6Ly93d3cuc2NpZWxvLm9yZy5jby9zY2llbG8ucGhwP3NjcmlwdD1zY2lfYXJ0dGV4dCZwaWQ9UzAwMTItNzM1MzIwMTEwMDAxMDAwMzAK