Executive Summary
This comprehensive statistical analysis investigates various aspects
of gender and income dynamics in the United States spanning several
decades. Four distinct parts explore different dimensions of the
relationship between gender and income, utilizing different statistical
tests to derive meaningful conclusions.
Part 1: Female Income Trends (1967 -
2021)
Research Question: Has there been a
significant increase in Median Female Income from 1967 to 2021?
Statistical Test: Linear Regression
Key Findings: The analysis reveals a
significant increase in median female income over the specified period,
as indicated by a highly significant p-value (< 0.05). This suggests
a positive trend in female income over time, contributing to an enhanced
standard of living for women in the US.
Part 2: Gender Income Disparity (1967 -
2021)
Research Question: Is there a significant
difference in Median Male and Female Income from 1967 to 2021?
Statistical Test: T-Test for Independent
Samples
Key Findings: The study uncovers a
significant disparity in incomes between genders in the US, as the
resultant p-value (< 0.05) and the median income for males has
consistently been than that of females over the period examined. Despite
legislative efforts such as the Equal Pay Act, a substantial gender pay
gap persists, indicative of underlying structural and societal factors
influencing income distribution.
Part 3: Gender, Income, and Degrees (1991 -
2021)
Research Question: Is there an interaction
between Gender and Degree Type on Median Income Level from 1991 to
2021?
Statistical Test: Two-Way ANOVA
Key Findings: This analysis reveals a
significant p-value (< 0.05) with regards to median income levels in
both the main effects—gender and degree type—as well as their
interactions. While educational attainment demonstrates a positive
influence on income, significant gender disparities persist across
degree types, suggesting the presence of complex factors beyond
education contributing to income differentials.
Part 4: Employment Status and Gender (1991 -
2021)
Research Question: Is there an association
between Gender and Employment Status for those with a Bachelor’s Degree
or higher from 1991 to 2021?
Statistical Test: Chi-Square Test for
Independence
Key Findings: The study identifies a
significant p-value (< 0.05) indicating an association between gender
and employment status, particularly in the context of unemployment.
While gender alone may not determine employment outcomes, social factors
and norms are likely to be contributing factors in the observed
disparities. Which underscores the imperative for further exploration
into the multifaceted determinants of workforce participation.
Overall Implications:
These findings collectively highlight the persistence of gender-based
income disparities in the US despite legislative efforts and societal
advancements. While educational attainment positively correlates with
income, significant gender differences persist across educational levels
and employment statuses. This emphasizes the necessity for ongoing
endeavors aimed at address the underlying societal inequalities. Further
research into external factors influencing income dynamics and workforce
participation is imperative to elucidate the reasons behind the
persistence of the wage gap in the United States. Such insights are
essential for developing targeted interventions that promote gender
equity in income distribution and economic opportunities.
Part 1 - Female Income in the US from 1967 -
2021.
Introduction
Since the early 1900s in the US women have gained more of an equal
standing in society. 1920 was a major year for Woman’s rights, the
nineteenth amendment to the U.S constitution was ratified (NWHP, 2023),
this amendment gave women the right to vote. Further progress was made
towards an equal society throughout the 1900s, for example in 1978 the
court ruled into effect the Pregnancy Discrimination Act (NWHP, 2023).
Which banned employment discrimination against pregnant women.
Women stormed through the 1960s as a part of the feminist movement.
1967 in particular was part of the second wave of feminism (Binghamton
University, 2024). This movement was set out to fight for equal rights
between genders as previously in history women have gone through much
hardship.
Part one of this study is therefore set out to determine whether any
progress has been made since the second wave of feminism in 1967. This
will be done by analyzing whether there has been a significant increase
in Median Female Income in the US from 1967 - 2021.
Therefore, the research question to be answered in this study is:
Has there been a significant increase in Median Female Income from
1967 - 2021?
Linear Regression:
The statistical test which will be used in this study is linear
regression, as we are looking to determine whether there is a
significant relationship between our two variables:
Time in Years
Median Female Income ($)
The formula for Linear regression is:
Where:
Y is the dependent variable
X is the explanatory variable
β0 is the intercept, the value of Y when X = 0
β1 is the slope of the linear regression line
Our Formula:
- Median Female Income = β0 + β1(Time in Years)
Hypothesis:
In order to answer this question we need to set our Null and Research
Hypothesis, and level of significance.
Null Hypothesis:
β1 represents the slope coefficient associated with Y (Median Female
Income).
Our Null Hypothesis is that the slop is equal to 0. Meaning that
there is no relationship between X (Time in Years) and Y
Research Hypothesis:
Since we are testing whether there has been a significant increase in
Median Female Income from 1967-2021. We are testing with our Research
Hypothesis that the slope coefficient β1 is greater than 0.
For this study we set a significance level of 0.05, which means we
are willing to say that the there is a 5% chance that the results will
occur due to chance alone. Only when our p-value is lower than our
significance level of 0.05 can we reject the Null Hypothesis and
determine that the Research Hypothesis is more attractive.
Method
To start our analysis the relevant packages are loaded into R
Studio.
#Packages
library(knitr)
library(kableExtra)
library(ggplot2)
library(dplyr)
Then the data is sourced and downloaded from www.census.gov. Table
A-7: Number of Real Median Earnings of Total Workers and Full time,
Year-Round Workers by Sex and Female-to-Male Earnings Ratio: 1960 -
2021.
For purpose of understanding: The word “Earnings” will be used
interchangeably with “Income” as they are both used to describe the
money earned from direct employment. Furthermore, the data used in this
study is for Total Workers not Full-Time, Year-Round Workers.
The data was subsequently transformed in Excel for data cleaning
purposes and ease of loading into R.
Rows for 2017 and 2013 have been repeated in the data set downloaded
from US Census, so when imported into excel I have calculated the
average of these rows instead of allowing two instances for the same
year.
After further data cleaning in R, a number was given to each year
value starting at 1967 as 1, 1968 as 2, and so on. In order to make more
sense of the X value when conducting linear regression and not skew our
analysis.
Table 1.1: US Census data regarding Median earnings for Total Female Workers from 1967 - 2021. The Years are numbered in order to not skew the analysis later. Median female Earnings in Dollars US ($).
| Year |
Female.Earnings |
YearNum |
| 1967 |
16721 |
1 |
| 1968 |
17192 |
2 |
| 1969 |
16799 |
3 |
| 1970 |
17046 |
4 |
| 1971 |
17862 |
5 |
| 1972 |
18481 |
6 |
| ... |
... |
... |
| 2016 |
34867 |
50 |
| 2017 |
35091 |
51 |
| 2018 |
35232 |
52 |
| 2019 |
37967 |
53 |
| 2020 |
37527 |
54 |
| 2021 |
39201 |
55 |
From first glance of our data we can see that the Median Female
Earnings is a lot higher in 2021 that in 1967, with values of $39,201
and $16,721 respectively.
In order to determine whether there has been a significant increase
or not a linear regression model will be made and the assumptions will
be tested to determine the fit of the model.
Model 1:
Our Linear Regression Model, follows our original formula of Y = β0 +
β1X. Where Y is Median Female Income and X is Time in years.
The coefficients for Model 1 are as
follows:
Table 1.2: Linear Regression Model 1. The intercept (constant) β0 and the slope (coefficient) β1, which are used with the predictor X to achieve the response variable Y.
| β0 (Intercept) |
β1 (Slope) |
| 15383.08 |
406.6405 |
For our Linear Regression Model 1 our constant β0 (Intercept) is
15383.08 and the slope (coefficient) β1 is 405.6405.
Making our Formula:
Predicted Y = 15383.08 + 405.6405(X)
Where:
This means that β1 is the amount in $ added to Median Female Income
for each unit increase in Year from 1967, with the starting value equal
to the (intercept) β0 value of 15383.03.
Visualizing model 1:

Figure 1.1: Scatter Plot of our US Census data regarding Median
Earnings for Women plotted over Time in Years. With a Regression line or
line of best fit. This graph shows a linear relationship between our X
and Y variables.
In order to determine whether this model can be used for our data we
must check whether the assumptions of linear regression are met.
From our graph we can determine that the relationship between our two
variables is linear. Yet, we must further check for homoscedasticity
(variance of residuals is constant) and normality of residuals
(residuals follow a normal distribution). These checks can be done with
diagnostic plots.
Diagnostic Plots

Figure 1.2: Diagnostic plots for our Linear Regression Model 1: With
Y equal to Median Female Earnings and X equal to Time in Years. The plot
is done to check for the assumptions of homoscedasticity and normality
of residuals. The Residuals vs fitted shows a slight pattern, yet could
be considered homoscedastic. Whereas the QQ Plot shows that the
residuals are normally distributed.
The Residuals vs Fitted plot is used to visualize the
homoscedasticity of our model, which we have described as the variance
of our residuals, which we want to be constant. Our residuals are the Y
value - the Predicted Y value. This plot shows our residuals as a
function of the fitted values.
Here we want to see that the Residuals bounce randomly around the 0
line and should be roughly equally spaced around the regression
line.
The QQ Plot is used to visualize the normality of the residuals, a
straight line indicates that the residuals are normally distributed.
Here the Residuals vs Fitted plot shows somewhat of a pattern, but
the QQ Plot shows us a normal distribution. We will transform the data
the and create a new model to see if we can improve this before we
continue with our analysis.
Model 2:
Our second Linear Regression Model, Model 2 follows a new formula of
Y = β0 + β1(log10(X)). Where Y is Median Female Income and X is Time in
years.
The coefficients for Model 2 are as
follows:
Table 1.3: Linear Regression Model 2 with log10() transformation. The intercept (constant) β0 and the slope (coefficient) β1, which are used with the predictor X to achieve the response variable Y.
| β0 (Intercept) |
β1 (Slope) |
| 4.221912 |
0.0068563 |
For our Linear Regression Model 2 our constant β0 (Intercept) is
4.221912 and the slope (coefficient) β1 is 0.0068563.
Making our Formula:
log10(Predicted Y) = 4.221912 + 0.0068563(X)
Where:
Using a log10 Transformation on our Y variable means that β1 is the
percentage change to income with 1 unit increase in our scale, with the
starting percentage increase equal to the (intercept) β0 value of
4.221912.
Diagnostic plots 2:

Figure 1.3: Diagnostic plots for our Linear Regression Model 2: With
a logarithmic transformation of our Y variable equal to log10(Median
Female Earnings) and X equal to Time in Years. The plot is done to check
for the assumptions of homoscedasticity and normality of
residuals.
The Residuals vs fitted shows the same pattern as before, yet again
it could be considered homoscedastic. Whereas the QQ Plot shows that the
residuals are normally distributed.
Since the same outcome or almost the same outcome has been shown with
a logarithmic transformation. We will see if adding another variable
will make any improvements our model.
Model 3:
Inflation is added to the model and the data is scaled before the
model is created. This is done by subtracting the mean of each variable
and dividing by the standard deviation for each observation.
The coefficients for Model 3 are as
follows:
Table 1.4: Linear Regression Model 3 with new predictor Inflation (x2) . The intercept (constant) β0 and the slope (coefficient) β1 + β2, which are used with the scaled predictors x1 + x2 to achieve the response variable Y.
| β0 (Intercept) |
β1 (Slope for x1) |
β2 (Slope for x2) |
| 26769.02 |
6656.602 |
-230.7875 |
For our Linear Regression Model 3 our constant β0 (Intercept) is
26769.02 and the slope (coefficient for x1) β1 is 6656.602, and the
slope (coefficient for x2) β2 is -230.7875.
Making our Formula:
Predicted Y = 26769.02 + 6656.602(X1) + -230.7875(X2)
Where:
Predicted Y Predicted Median Female Income Given X
X1 is the Scaled Transformation of Year Number starting with 1967
as 1
X2 is the Scaled Transformation of Inflation for each year
Diagnostic plots 3:

Figure 1.4: Diagnostic plots for our Linear Regression Model 3: With
our Y variable equal to Median Female Earnings and X1 equal to Time in
Years. An additional Predictor (X2) variable has been added to our
model, inflation. Making our model multilinear. The plot is done to
check for the assumptions of homoscedasticity and normality of
residuals.
The Residuals vs fitted again shows the same pattern as before, yet
again it could be considered homoscedastic, meaning there has not been
improvements on homoscedasticity when adding the variable of inflation
to our model. The QQ Plot shows that the residuals are normally
distributed.
Since the same pattern has been visible the third time, we will
determine which model to use by comparing the Multiple R squared and
Adjusted R squared values.
R Squared Values
Table 1.5: Comparing the Multiple R Sqaured and Adjusted R Squared of Model 1 and 2 to determine whcih is best fit for our data.
| |
Model 1 |
Model 2 |
Model 3 |
| MultipleR^2 |
0.9697445 |
0.9639512 |
0.9705015 |
| AdjustedR^2 |
0.9691736 |
0.9632710 |
0.9693669 |
Multiple R squared is used to determine how much variance in Y can be
determined by X. Adjusted R squared is a modified version which takes
into account the number of predictors in the model.
The R squared values are highest in Model 1 and 3. When adding
Inflation to Model 1 (Model 3), we get an increase in both values.
To determine whether we will use this extra predictor in our model or
not we will conduct an ANOVA.
ANOVA
Analysis of Variance Table
Model 1: Female.Earnings ~ YearNum
Model 2: Female.Earnings ~ YearScaled + InflationScaled
Res.Df RSS Df Sum of Sq F Pr(>F)
1 53 71504295
2 52 69715240 1 1789056 1.3344 0.2533
The p-value of 0.2533 is greater than 0.05 our level of significance
and we can determine that the variance of the two models is not
significantly different.
Therefore, we will conduct our analysis with our linear regression
Model 1.
Results
We have determined that we will be using our linear regression Model
1.
Model 1:
Predicted Y = 15383.08 + 405.6405(X)
Where:
Report: F(1,53) = 1699, P-Value < 0.05
Call:
lm(formula = Female.Earnings ~ YearNum, data = FemaleEarnings)
Residuals:
Min 1Q Median 3Q Max
-2385.19 -780.07 -40.66 753.00 2766.14
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 15383.085 317.560 48.44 <2e-16 ***
YearNum 406.640 9.866 41.22 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1162 on 53 degrees of freedom
Multiple R-squared: 0.9697, Adjusted R-squared: 0.9692
F-statistic: 1699 on 1 and 53 DF, p-value: < 2.2e-16
Residual Standard Error: 1162
Standard Error: 9.866
Multiple R-Squared: 0.9697 and Adjusted R-Squared: 0.9692
The output of the model shows us the p-value to be a very significant
value lower than 0.05, with an F stat of 1699 on 1 and 53 Degrees of
Freedom.
As we are looking at whether there has been a significant increase in
Median Female Income from 1967 - 2021 this a is a one tailed test.
P-Value for this test is as follows:
[1] 3.035456e-42
Meaning we can determine that on any one test of the Null Hypothesis
we can say that there is a less than 5% probability that the results
will be due to chance alone. Therefore we can reject the Null Hypothesis
and determine that the Research Hypothesis is more attractive.
Discussion
As we have rejected the Null Hypothesis, we can say that there has
been a significant increase in Median Female Income in the US from 1967
- 2021.
With our new formula (Predicted Y = 15383.08 + 405.6405(X)) we can
also predict the value of Y if we know the value of X. As we have used
Year Number as a count starting from 1967, to predict Median Female
Income in the US for 2024, we would simply have to replace X with 57
(for 2024).
Visualization:

Figure 1.5: Median Female Earnings plotted against time in Years,
with line of best fit and Residuals plotted to the predicted values.
With higher residual values shown with red and a larger circle and the
smaller values shown with a smaller circle and blue.
The Multiple R squared value of 0.9697 for the regression Model 1
indicates that the predictor X (Time in Years) explains 97% of the
variation in Median Female Income in the US. The Adjusted R squared
value provides a more conservative value but still indicates a similar
result of 0.9691.
The Residual Standard Error of 1162 means that there is a 95% the
predicted value will fall between the mean of all Median Female Income
and 1162
The Std.Error β1 of 9.866 shows the precision of the slope. The small
value indicates less variability in the slope coefficient for this
linear regression model.
As we have determined that Median Female Income has significantly
increased over the years in the US from 1967-2021, we can say that
things are going in the right direction as compared to how they were in
the late 1800s. One can say that from this analysis he standard of
living has increased for women in the US over these years.
However this study does not account for inflation, as this was
determined to not be relevant enough for our regression model due to
output of our anova test. Unemployment, and other socioeconomic factors
have also not been accounted for.
This study has only analysed the total working population, so to
analyse the standard of living for those without work could also be an
interesting topic.
Further analysis and research should be conducted to get a better
understanding of how equality is evolving in society and the effect is
has on Female quality of life. Not simply through their economical gain
but other factors such as education, life expectancy etc.
Part 2 - Gender and Income in the US from 1967 -
2021.
Introduction
Feminism can be defined as the advocacy of Woman’s rights on the
basis of gender equality (Future Learn, 2021). To further understand the
positive impact feminism has had on womens rights and on society in the
US from 1967-2021, the difference of median incomes by gender will be an
interesting topic to cover.
From Part 1 of this study we revealed that there had been a
significant increase in Female Median Income in the US from 1967-2021.
This is a step in the right direction, showing that women fighting for
their rights has not gone unnoticed over the years. Yet, looking deeper
into the equality between genders. How does this figure compare to what
Men had earnt during the same time period?
In 1963, the Equal Pay Act was put in place, which was set out to
protect against wage discrimination based on sex (DOL, 2024). With this
act in place, women, by law should be paid the same as men for the same
work. It is stated by the US Department of Labour website (2024) that
employers must raise wages to equalize pay but may not reduce the wages
of other individuals. Meaning two people working the same job should be
paid the higher amount and not the lower.
Part two of this study is therefore set out to determine whether
there is a significant difference in Male and Female Median Income from
the years of 1967 - 2021.
Therefore, the research question to be answered in this study is as
follows:
Is there a significant difference in Median Male and Female
Income from 1967 - 2021?
If there is a significant difference in the Median Income by
Gender from 1967 - 2021 in the US and men are earning more,
then we can determine that there is a pay gap between the two
genders during this time period.
Since the Equal Pay Act was put into place before the time period
that the data was recorded (put into place in 1963). The reason for a
pay gap would therefore not be due to the law itself but rather other
outside factors at play which have had a negative effect on the Median
Income of Females.
If there is not a significant difference in the Median
Income between the two Genders or if there is but it shows that
women are earning more, then we can say that the Equal Pay Act
of 1963 solved the issues regarding equal pay based on sex in the
US.
T-Test for Independent Samples
The statistical test which will be used in this study is a t-test for
independent samples, as we are looking to compare the central tendencies
of the two independent groups
Hypothesis:
In order to answer this question we need to set our Null and Research
Hypothesis and level of significance.
As we are only interested to see if there is a difference this will
be a two tailed test.
Null Hypothesis:
H0: Female Median Income US 1967-2021 (Central Tendency) = Female
Median Income US 1967-2021 (Central Tendency)
Research Hypothesis:
H1: Female Median Income US 1967-2021 (Central Tendency) ≠ Male
Median Income Us 1967-2021 (Central Tendency)
For this study we set a significance level of 0.05, which means we
are willing to say that the there is a 5% chance that the results will
occur due to chance alone. Only when our p-value is lower than our
significance level of 0.05 can we reject the Null Hypothesis and
determine that the Research Hypothesis is more attractive.
Method
To start our analysis the relevant packages are loaded into R
Studio.
#Packages
library(ggplot2)
library(ggpubr)
library(knitr)
library(kableExtra)
library(Rcmdr)
RcmdrMsg: [1] NOTE: R Commander Version 2.9-0: Wed Feb 7 17:46:52 2024
RcmdrMsg: [2] NOTE: R Version 4.3.1
RcmdrMsg: [3] NOTE: Hello edren
library(dplyr)
library(rstatix)
Then the data is sourced and downloaded from www.census.gov. Table
P-8. Age–All People, by Median Income and Sex: 1947 to 2022. The data
used in this study are in 2022 dollars, so inflation is accounted for
and the table used out of the multiple available in this data set (P-8)
is for all people 15 years and older.
The data is then loaded and transformed into excel, only keeping the
necessary values and columns along with the values for each year. As
before, rows for 2017 and 2013 have been repeated in the data set
downloaded from US Census, so when imported into excel I have calculated
the average of these rows instead of allowing two instances for the same
year.
Summary of the Data:
Table 2.1: Initial look at how our data is laid out. Providing the Median Income for both Genders 15 Years and Over in the US from 1967 - 2021. The Income in this dataset accounts for inflation and is in 2022 Dollars ($).
| |
Year |
Gender |
Median.Income |
| 1 |
2021 |
Male |
49520 |
| 2 |
2020 |
Male |
48130 |
| 3 |
2019 |
Male |
50470 |
| 4 |
2018 |
Male |
48100 |
| 5 |
2017 |
Male |
47630 |
| 6 |
2016 |
Male |
46640 |
| 7 |
... |
... |
... |
| 105 |
1972 |
Female |
15320 |
| 106 |
1971 |
Female |
14670 |
| 107 |
1970 |
Female |
14210 |
| 108 |
1969 |
Female |
14210 |
| 109 |
1968 |
Female |
14020 |
| 110 |
1967 |
Female |
13000 |
The data is laid out with the different genders in one columns and
the “Median.Income” in its own column. This being the case the Year
values will therefore be repeated going from 2021-1967 twice to match
the two genders, making our n = 110, or 55 for each. Double what is was
in the previous study. Degrees of freedom for this study is therefore,
(n1 + n2) - 2 = 108.
Table 2.2: Summary Statistics for our data regarding Median Income for the seperate Genders 15 Years and Over in the US from 1967-2021. The count is the number of years in the study which is our n, median of the median income is provided for each, and the interquartile range.
| Gender |
count |
median |
IQR |
| Female |
55 |
21160 |
10785 |
| Male |
55 |
42510 |
3735 |
The Summary Statistics here confirm the n1 and n2 = 55. Therefore our
DF is 108. The Median of Median Income is seen to be a lot higher for
Males than Females in the US, it works out to be over double. For
Females there is also a high Interquartile Range (IQR), which means that
there is a high range where most of the values lie. As we are working
with Yearly data we can only hope that this large Interquartile range is
due to improvements over the years in Median Female Income which has
caused this large spread.
In order to determine whether the difference between the two genders
is significant a T Test for Independent samples will be conducted to
measure whether there is statistical evidence that the central
tendencies of our two groups are statistically different.
Assumptions Check:
Firstly, we must check that all the assumptions are met before we can
continue with our analysis. For a T Test for Independent Samples, as
stated by Amanda J. Shaker (2024) the assumptions required to conduct
the parametric version of this test are that the data are independent
(which they are), the data is normally distributed and that there are
equal variances between groups.
Normality:
Using a Histogram, Density Plot, QQ-Plot we can determine whether the
data is normally distributed or not. There should be equal distribution
around the mean for the first two plots (Histogram and Density plot) and
the QQ-Plot show should the data in a straight line.
[1] 110 109

Figure 2.1: Histogram, Density Plot and QQ-Plot combined to check the
assumption of normal distribution for our data set. The histogram shows
the median further to the right than the mean which suggests a negative
skew. The Density plot also shows the that the data is more centered
around the right hand side rather than the mean, again showing that the
data is skewed and not normally distributed. The QQ-Plot does not follow
a straight line and is therefore not showing normal distribution.
Shapiro-Wilk Test
Looking at the three different plots visualizing our data, we can
determine that the data does not follow a normal distribution. One
further can check this with the Shapiro Wilk Test which is a test of
normality. The Null Hypothesis states that the data is not different
(equal to) a normal distribution. Therefore if we reject the Null we
must determine that the data is not normally distributed. For this test
we will use a significance level of 0.05.
Shapiro-Wilk normality test
data: MaleFemaleEarnings$Median.Income
W = 0.89134, p-value = 0.0000001983
The output of this test is a p-value is extremely low and < 0.05.
Therefore, we must conclude that our data is not normally
distributed.
Equal Variances:
The next assumption for the parametric version of this test is Equal
Variances between groups. We do not need to do this assumption check as
we already know the data is not normally distributed, and will continue
with the non-parametric version of the test the Mann-Whitney U Test.
Yet, we will do it anyway as it is very simple. Using the Levene Test
for equal variances the output is similar, the Null Hypothesis for this
test is that there is equal variances between groups. Therefore a
p-value < 0.05 (our level of significance) means that we can
determine that there is no equal variance between the groups in our
sample.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 1 42.683 0.000000002178 ***
108
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
The p-value here is extremely low and < 0.05. Therefore, we can
confirm that there is not equal variances between the two groups in our
sample.
Mann-Whitney U test:
The Mann-Whitney U test is used as a non-parametric version of the
T-test for Independent samples, it is also known as the Wilcoxon rank
sum test. As we did not meet the assumptions needed for the parametric
version of our test, we will continue with the non-parametric version of
our test.
Results
Report: W = 0, P-Value < 0.05
Wilcoxon rank sum test with continuity correction
data: Median.Income by Gender
W = 0, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
The output of our non parametric test does not include degrees of
freedom as we are working with median values and the purpose of this
test is to evaluate whether or not the median of the differences is
equal to 0.
The P-Value for this test is < 0.05, which means we can reject the
Null Hypothesis that there is no difference between the central
tendencies of Median Income of Male and Females 15 years and Over in the
US from 1967 - 2021, and determine that the Research Hypothesis that
there is a significant difference is more attractive.
Discussion
The median value of the Median Income for 15 Years and Over in the US
from 1967-2021 was $21,160 and $42,510 for Women and Men respectively.
We previously determined that this was a large difference but now we can
say the difference is significant as the P-Value < 0.05 and on any
one test of the Null Hypothesis we can say that there is a less than 5%
probability that the results will be due to chance alone.
Visualization

Figure 2.2: Box Plot for Median Income by Gender in the US between
throughout the years of 1967-2021, for all people aged 15 years and
Older in 2022 Dollars (Inflation accounted for). Interquartile range
shown as the box and the whiskers are the total range. With the line
through the middle as the median. Female plot shows a larger
interquartile range, which shows a larger spread of values. Where as the
Male plot does not.
Comparing both these both of these plots shows that Women have had a
larger increase over the years, which is visualized by the greater
overall range (minimum and maximum values). Also the interquartile range
for Females is larger than that of the Males which shows a greater
spread of values, which also indicate progressions over the years as
there is more variability.
Yet, the plot for Males is much more clustered together showing less
change but also more concentration around a higher value. The minimum
value for Males is also higher than that of the Females maximum. Since
we are looking at this data in 2022 Dollars, we see that Female Median
Income is yet to catch up to the Males Minimum Income from
1967-2021.
Effect Size
The effects size tells us the magnitude of the difference between the
two groups with regards to our y variable which is Median.Income in this
case. With an r less than 0.3 there is a small effect, between 0.3 and
0.5 is a medium effect and greater than 0.5 shows a large effect
(DATAtab, 2024).
The effect size for our test is r=0.862 meaning that there is a large
magnitude of effect size. Which shows a substantial strength of
difference between the two groups Male and Female by the variable Median
Income. The difference we have already stated to be significant, and now
the effect of which gender has on the difference in Median Income we can
explain to be of a large magnitude.
The significant difference of Median Income between the two Genders
can be concluded to show that there is still a pay gap even with the
Equal Pay Act in place. Which we therefore determine to be due to other
factors rather than law of equal pay itself.
One may consider that, women are likely to have a lower risk
tolerance than men which may cause them to not take on higher paying
jobs. Yet, with risk there is also failure and that should lead to
greater variability in the median income for men.
Other factors which should be considered are segregation in the work
place and work experience (Aragao, 2023). Since, the improvements
regarding Woman’s rights are not super new (Equal Pay Act only happened
61 years ago in time of writing this paper), there may still be some
prejudice in certain fields towards women which make it hard for them to
find work. More research should be done to analyse this topic.
Educational attainment is another outside factor which will have an
effect on the pay gap between Men and Women as stated by Carolina Aragao
(2023). Socially-constructed norms that define the roles that Men and
Women should play is a reason why girls are more likely to be out of
school than boys across the world (Sida, 2017). Pressures of society and
life outside of work have an effect on both men and women but could also
be a reason why women have a lower Median Income than Men in the US
during these years.
Further data collection and analysis regarding; educational
attainment for both genders, differences in social pressures (both in
and out of work) by gender, and the differences in risk tolerance for
both genders, may help us further answer the “why?” to our pay gap
question.
Part 3 - Gender, Income and Degrees in the US from 1991 -
2021.
Introduction
The previous studies in this project have provided us with more of an
understanding about Feminism and its positive effect on the Female
Median Income in the US. As shown in part one of this study, the
improvements in society in the US regarding Woman’s rights have led to a
significant increase in Median Female Income.
Part two of this study finished off with an analysis detailing that
even though according to The U.S. Department of Labor (2024) the Equal
pay act was put in place in 1963, there was still a significant
difference between the median income between the two genders in the
US.
Therefore, this study will look to delve deeper into the pay gap
between genders in the US and analyse more of the factors that might
have had an effect on the difference in median income in the US. One
factor in particular being educational attainment, specifically that of
a degree.
With more laws being put into place in the US to foster a better
learning environment for women, such as The Women’s Educational Equity
Act of 1974 (NWHP, 2023) which was set out to encourage full educational
opportunities for girls and women, and the Gender Equity Act of 1994
(NWHP, 2023) which was created to promote gender equality and eliminate
discrimination. One would suspect that more women are likely to take on
a degree than before.
With data for both genders and the different degree types we will be
able to uncover which degree type is the highest paying and whether
there is still a difference in medium income between the genders when
both gender have the same degree type.
Therefore, part three of this project will cover an analysis of the
median income for men and women in the US from 1991-2021, across three
different types of degrees; bachelors, masters and doctorate.
Professional degree will not be included in this study as there was
lacking data for 2007 and 2008.
Our research question for this study is as follows:
Is there an interaction between Gender and Degree Type on Median
Income Level in the US from 1991-2021?
Two-Way ANOVA:
This research question will be answered with a Two-Way ANOVA. The
Two-Way Analysis of Variance will be used as we are comparing the effect
our two independent variables (Gender, Degree Type) have on a dependent
variable (Median Income in the US).
Firstly, we will be able to analyse whether Median income is equal
across the two genders, which we discovered in part 2 that is is not for
the total population of men and women 15 years and over in the US. Yet,
now we will be analyzing whether there is a difference in median income
for those who specifically have a bachelors degree or over (not
including professional degree).
With our Two-Way anova, we will also be able to analyse whether the
median income is equal across the different degrees, or whether there is
a significant difference.
Furthermore, we can do a cross treatment analysis to uncover the
differences in median income between genders across the different
degrees and also between the different degrees across the different
genders
Hypothesis 1, 2 + 3:
1st Hypothesis and Research Question:
2nd Hypothesis and Research Question:
3rd Hypothesis and Research Question:
For this study we set a significance level of 0.05, which means we
are willing to say that the there is a 5% chance that the results will
occur due to chance alone. Only when our p-value is lower than our
significance level of 0.05 can we reject the Null Hypothesis and
determine that the Research Hypothesis is more attractive.
Method
To start our analysis the relevant packages are loaded into R
Studio.
#Loading Packages
library(knitr)
library(kableExtra)
library(psych)
library(car)
library(ggplot2)
library(multcomp)
library(ggeffects)
library(phia)
library(effects)
Then the data is sourced and downloaded from www.census.gov. Table
P-16. Educational Attainment–People 25 Years Old and Over by Median
Income and Sex: 1991 to 2022. The data used in this study are in 2022
dollars, so that inflation is accounted for over the different years.
The three tables used out of the multiple available in this data set
(P-16) is for both genders, with a bachelors degree, masters degree and
doctorate degree.
As previously stated the Professional Degree table will not be used
as it was missing data for 2007 and 2008. The data is then loaded and
transformed into excel, only keeping the necessary values and columns
along with the values for each year.
As in both part one and two of this study, the rows for 2017 and 2013
have been repeated in the data set downloaded from US Census, so when
imported into excel I have calculated the average of these rows instead
of allowing two instances for the same year.
Lastly, further data cleaning was performed in R transforming the
variables Gender and Degree to factors and Median.Income to
integer.
Summary of the Data:
Table 3.1: Initial look at how our data is laid out. Providing Income data for both Genders and 3 different degree types in the US from 1991 - 2022. The Income in this dataset accounts for inflation and is in 2022 Dollars ($).
| |
Year |
Gender |
Median.Income |
Degree |
| 1 |
2021 |
Male |
127500 |
Doctorate |
| 2 |
2020 |
Male |
127700 |
Doctorate |
| 3 |
2019 |
Male |
121300 |
Doctorate |
| 4 |
2018 |
Male |
116300 |
Doctorate |
| 5 |
... |
NA |
... |
NA |
| 63 |
2021 |
Male |
101300 |
Masters |
| 64 |
2020 |
Male |
98350 |
Masters |
| 123 |
1992 |
Female |
58310 |
Masters |
| 124 |
1991 |
Female |
58950 |
Masters |
| 10 |
... |
NA |
... |
NA |
| 183 |
1994 |
Female |
43200 |
Bachelors |
| 184 |
1993 |
Female |
42350 |
Bachelors |
| 185 |
1992 |
Female |
43260 |
Bachelors |
| 186 |
1991 |
Female |
41550 |
Bachelors |
The data is separated into four columns, providing information for
both Genders and their median income in the US from the years 1991-2021
with regards to the three Degree types we have selected for this study;
Bachelors, Masters, Doctorate.
Again, as we are analyzing two Genders and three Degree types, the
year values have been repeated six times as we are matching the Median
Income data for each year to each Gender and each Degree type.
Table 3.2: Summary Statistics of the median income data for both Genders and 3 degree types in the US from 1991-2021.
| |
n |
mean |
sd |
median |
min |
max |
range |
skew |
kurtosis |
se |
| F:Bachelors |
31 |
47420.48 |
2849.075 |
47590 |
41550 |
52830 |
11280 |
-0.1154015 |
-0.4021528 |
511.7090 |
| F:Doctorate |
31 |
82704.84 |
6444.466 |
81910 |
71800 |
98010 |
26210 |
0.5315128 |
-0.4469547 |
1157.4603 |
| F:Masters |
31 |
63353.23 |
3061.564 |
63240 |
58310 |
69020 |
10710 |
0.1741897 |
-0.8611165 |
549.8731 |
| M:Bachelors |
31 |
74872.26 |
3286.385 |
75470 |
69610 |
80190 |
10580 |
-0.0434888 |
-1.5008370 |
590.2521 |
| M:Doctorate |
31 |
114628.71 |
7326.512 |
114500 |
99890 |
127700 |
27810 |
-0.1151121 |
-0.7865415 |
1315.8805 |
| M:Masters |
31 |
93255.48 |
4456.962 |
93810 |
85470 |
101300 |
15830 |
-0.1752641 |
-0.9594464 |
800.4940 |
The n values of each group show the total number of observations for
each, which is 31 as this is the number of years of data we have for
each pairing of group 1991-2021. The mean values for the Doctorate
Degree type have shown to be the highest from our summary statistics for
both males and females with values of 114628.71 and 82704.84
respectively and lowest for the Bachelors Degree type for both males and
females with values of 74872.26 and 47420.48 respectively.
By comparing the means of each group pairing, we not only see that
Bachelors is the lowest and Doctorate is the highest. We also can see
that Males have a higher mean than Females for each Degree Type. Whether
this difference is significant or not is what we will further analyse in
this study.
The standard deviation (sd), is highest in Males meaning there is
more variability around the mean of the data. When comparing the sd and
range of both genders who have a Bachelors degree, you can see that
Males have an sd value of 3286.385 and Females have a sd value of
2849.075 but the ranges are 10580 and 11280 respectively. Showing that
Males who have a Bachelors Degree have an income less concentrated
around the mean than Females with the same degree, but is less spread
out.
The higher range for Females with a Bachelors degree shows that there
is a larger gap between the highest and lowest values. Yet, the lower sd
also indicates that most of the values are closer to the mean than that
of Males.
When comparing the sd values and range for both Genders and for the
Doctorate and Masters Degree, we can see that both the sd and range is
higher for Males with regards to these pairings, showing that the data
is concentrated for Females with Masters and Doctorate Degrees and less
spread out.
Females have a positive skew for both Doctorate and Masters Degrees,
whereas the rest of the pairings indicate a negative skew. A skew value
from -0.5 to 0.5 indicates symmetry (Gawali, 2023). Most of the parings
are therefore symmetrical except the Females with a Doctorate Degree
group, which has slightly above 0.5 with a skew value of 0.5315, showing
that the outliers are towards the upper quartile, meaning that there are
a few higher incomes for this pairing which has skewed the data towards
the right.
The kurtosis values < 3 indicate that the distribution is
platykurtic which is less peaked when compared to a normal distribution,
which is what we see for each pairing in this data set.
Lastly, the standard error (se) is larger in both groupings of the
Doctorate Degree meaning the data here is less precise than that of the
other groupings of Degree types.
Assumptions Check:
Firstly the model is created using R, with Median Income as our
Independent variable and Gender and Degree as our Dependent variables.
In order to continue with our Two-Way Anova model, we must check first
that the required assumptions are met.
Independent observations (which we have)
Homoscedasticity - Residuals have equal variance
Normality of Residuals - Residuals follow a normal
distribution
Homoscedasticity:

Figure 3.1: Diagnostic plot of our Two-Way ANOVA model. Residuals vs
Fitted plot is used to check for the assumption of homoscedasticity. The
Residuals should have an equal variance when plotted against the fitted
values. The Q-Q Residuals plot is used to check for the normality of
residuals, which is indicated by a straight line.
The Residuals vs Fitted plot here shows homoscedasticity of our
Two-Way ANOVA model as the largest spread is not three times the size of
the smallest. The Q-Q Residuals plot also shows that the Residuals are
normally distributed.
Normality of residuals:
We can further check the normality of residuals with the Shapiro Wilk
test, with the residuals taken from our Two-Way ANOVA test. The Null
Hypothesis here is that the data follows a normal distribution.
Therefore, a P-Value < 0.05 means that we reject the Null Hypothesis
and determine that the data is not normally distributed.
Shapiro Wilk test
Shapiro-Wilk normality test
data: Res_Epsilon
W = 0.98875, p-value = 0.1488
The P-Value from the Shapiro-Wilk test is 0.1488, which is > 0.05.
Therefore we do not reject the Null Hypothesis that the data is normally
distributed.
Histogram

Figure 3.2: Histogram plot of the Residuals from our Two-Way ANOVA
Model 1. A normal distribution shows symmetry around the mean, which is
what we can see here.
Since checking that all assumptions have been met we do not need to
transform our data or change our model and can therefore continue with
our analysis.
Results
Analysis of Variance Table
Response: Median.Income
Df Sum Sq Mean Sq F value Pr(>F)
Gender 1 41181144023 41181144023 1723.4910 < 2e-16 ***
Degree 2 43747307275 21873653637 915.4444 < 2e-16 ***
Gender:Degree 2 155472437 77736219 3.2534 0.04093 *
Residuals 180 4300925127 23894028
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Report 3: F(Gender:Degree, 2,180) = 3.2534, P-Value <
0.05
Firstly looking at the interaction, the significance level is 0.04.
Meaning we can reject the 3rd Null Hypothesis that “all six groups
created by cross treatment have equal means” and that they are all
significantly different. The interaction being significant does not
particularly mean that the main effects Gender and Degree will also be
significant.
Report 1: F(Gender, 1,180) = 1723.4910, P-Value <
0.05
Report 2: F(Degree, 2,180) = 915.4444, P-Value < 0.05
In this case the P-Value < 0.05 for each Main Effect Gender and
Degree. Meaning we can reject the 1st and the 2nd Null Hypothesis that
“Median Income is equal across genders with a bachelors or over” and
“Median Income is equal across the degree types”, and determine that the
Research Hypothesis is the most attractive for all the Main Effects and
the Interaction.
A P-Value lower than 0.05 allows us to determine that the differences
we have seen in this data are statistically significant and that the
probability that these results will occur due to chance alone is less
than 5%.
Discussion
Post-Hoc Analysis
Table 3.3: Pairwise tests to test for interaction between Genders within Degree type (adjustment = Holms test).
| |
Value |
Df |
Sum of Sq |
F |
Pr(>F) |
| Female-Male : Bachelors |
-27451.77 |
1 |
11680798549 |
488.8585 |
3.43e-53 |
| Female-Male : Doctorate |
-31923.87 |
1 |
15796569832 |
661.1095 |
1.10e-61 |
| Female-Male : Masters |
-29902.26 |
1 |
13859248079 |
580.0298 |
6.80e-58 |
| Residuals |
NA |
180 |
4300925127 |
NA |
NA |
This Post-Hoc Analysis shows values for differences between Genders
within the different Degree Types we have used in this study. We can say
that there is a significant difference (P-Value < 0.05) in Median
Income in the US for each Interaction.
Since the order goes Female - Male, the values in the “Value” column
are relevant to Female as they come first. Meaning the negative value
for each interaction shows that the difference lies with Men having a
higher average with regards to Median Income in the US, for our three
Degree Types.
Table 3.4: Pairwise tests to test for interaction between Degree type within Genders (adjustment = Holms test).
| |
Value |
Df |
Sum of Sq |
F |
Pr(>F) |
| Bachelors-Doctorate : Female |
-35284.35 |
1 |
19297278294 |
807.6193 |
9.49e-68 |
| Bachelors-Masters : Female |
-15932.74 |
1 |
3934710117 |
164.6734 |
3.46e-27 |
| Doctorate-Masters : Female |
19351.61 |
1 |
5804516290 |
242.9275 |
9.55e-35 |
| Bachelors-Doctorate : Male |
-39756.45 |
1 |
24498919395 |
1025.3156 |
1.83e-75 |
| Bachelors-Masters : Male |
-18383.23 |
1 |
5238116361 |
219.2228 |
1.17e-32 |
| Doctorate-Masters : Male |
21373.23 |
1 |
7080629111 |
296.3347 |
2.75e-39 |
| Residuals |
NA |
180 |
4300925127 |
NA |
NA |
Furthermore, this Post-Hoc Analysis with regards to the differences
between Degrees within Genders shows negative values for
Bachelors-Doctorate and Bachelors-Masters within each Gender type. Since
the rules regarding the order are the same this shows that for both
Genders, the Median Income for those with a Bachelors Degree has a lower
mean value than the mean value of Median Income for those with a Masters
or Doctorate Degree (for the same Gender).
Doctorate-Masters shows a positive value, meaning that for both
Genders, the Median Income for those with a Doctorate Degree has a
higher mean value than the mean value of Median Income for those with a
Masters Degree (for the same Gender).
As all of the interactions show a significance level where P-Value
< 0.05, we determine them to all be statistically significant
differences and with less than a 5% probability to occur due to chance
alone.
Effect Plot

Figure 3.3: An Effect plot showing the mean values for each grouping
of Median Income by two categorical variables, Gender and Degree. With
the mean values for Females by Degree type as a red line and blue for
Males. With points plotted for each value.
As stated by (Jawaid, Thariq and Saba, 2019) an Effect Plot shows the
mean response values at each level of a design parameter or process
variable. We can see from our Effect Plot that the mean values are
higher for each individual Degree Type if the Gender is male. The
difference between the median income of genders (with bachelors or over)
is one of our main effects, which we have determined to be statistically
significant and not due to chance alone.
For each Gender we can see that Bachelors Degree have the lowest
values and Doctorate has the highest. Which would make sense as the
level of difficulty and time required to get one of these Degrees goes
in order from Bachelors, Masters and then Doctorate. The difference
between the different levels of Degree is our second main effect which
we again determined to be statistically significant and not due to
chance alone.
We can also see from our Effect Plot that there is a cross over where
Females who achieve a Doctorate Degree have a higher mean value than
that of Males who have a Bachelors.
Predicted Values

Figure 3.4: Predicted values plot, showing the mean values for Median
Income ($) for each Gender and Degree type. With Bachelors as red,
Doctorate as blue and Masters as green.
If there is a significant interaction the predicted value is the
value of the response variable (Median Income) which is equal to the
mean of all observations having that combination of factor levels
(Owens, 2022). Which means that since we have a significant interaction
(P-Value < 0.05) the predicted value for each pairing is equal to the
mean of each pairing of independent variables (Gender and Degree).
This plot allows us to see more of a clearer picture as to how the
values only cross over at the lowest mean value for Males and the
highest mean value for Females. As we can see where the point for the
Female side overtakes the lowest on the Male side.
We can determine that there is a significant interaction between
Gender and Degree Type on Median income in the US from 1991-2021, yet
the results were not quite as expected as it has only uncovered more
that needs to be answered with regards to the “why?”. The significance
of the interaction mainly shows that men are earning more when comparing
the central tendencies of our pairings of groups, with only one cross
over (being that of Female:Doctorate - Male:Bachelors).
One would expect from that on average a Doctorate Degree meant that
you would earn more than someone with a Bachelors, but the data is
interesting in that this is the only time the mean of Median Female
Income surpasses that of the mean of Median Male Income.
If this is the case for mean values for Females with Doctorate
degrees compared to Males with Bachelors then why is mean of Median
Income for Females with a Masters Degree not higher than that of the
mean value of Males with a Bachelors degree? A significant difference
between Degree type itself is one main effect, but since there is also a
significant difference between gender and the interaction between
both.
On one hand, one may conclude that when looking at the interaction of
our two independent variables, there must be more factors at play which
have an effect of Median Income in the US which cause women to earn less
despite their degree level.
On the other hand, it may not be the degree level itself that affects
the Median Income Level in the US, but rather the number of years in
education as a Doctorate Degree can take a further 5-8 years to achieve
after completing a Masters Degree. Yet, this would not explain why
Females with a Doctorate Degree have only slightly higher mean values
than the mean values of Males with a Bachelors.
Further research and analysis of other factors which have an effect
on Median Income levels in the US will help us uncover our question for
the “why?”. Since we have determined that education attainment does not
guarantee equal pay for both Genders, as there is a significant
difference between and within both combinations of our interactions
(between Genders within Degree, between Degree Type within Genders).
Other factors which may affect Median Income in the US are for
e.g. social pressures in and outside of the workplace and would be an
interesting topic to uncover. Unemployment rate for those people with a
bachelors degree or higher could as lead us into the right direction as
to answering why the significant difference in Median Income occurs
between Genders in the US.
Part 4 - Employment Status and Gender for those with a
Degree in the US from 1991 - 2021.
Introduction
The final part of this project will be a continuation of what we have
looked at so far. As we have discovered that there has been a
significant rise in Median Female Income in the US, which has seen to be
significantly different from that of Males.
During the previous part of this project we found a significant
interaction between the Degree and Genders which has shown that Females
earn less than Males for every Degree Type out of Bachelors, Masters and
Doctorate, except for the one mean value for Females Median Income with
a Doctorate which was a higher mean of Median Income that of a Male with
Bachelors
We will look deeper into the numbers regarding Males and Females over
the age of 25 in the US with a Bachelors Degree or higher (Including
professional degree in this part of the study), and the counts of the
population regarding their employment status for each of the years.
As stated by Carey and Hacket (2022). In 2021 in the US, the ratio by
Gender was 98 males per 100 females. From this ratio, we would expect
more Females 25 and over, who have a Bachelors or higher to be in
employment in comparison to males.
The Research Question for this study is as follows:
Is there an association between Gender and Employment Status for
those who are 25 and over, with a Bachelor’s Degree or higher in the US
from 1991-2021?
To answer the question whether there is any significant association
between the Gender of those who have a Bachelors Degree or higher and
their Employment Status. A hypothesis will be made and analysed using
the relevant test statistic
Chi-Square Test:
As we are working with population data, we will use the population as
counts for each pairings of category. Our data consists of two
categorical variables. Gender: Male, Female. Employment Status:
Employed, Unemployed.
The Chi Square Test of Independence is a nonparametric test which
determines whether there are associations or differences between two
categorical or nominal variables. In this case of our data set, the
expected counts are unknown and therefore a test of association will be
done to determine whether the character frequencies of our two groups
Gender and Employment Status, have a significant association with one
another.
Hypothesis:
H0: There is no association between Gender and Employment Status
for those 25 and over, with a Bachelor’s Degree or higher in the
US.
H1: There is an association between Gender and Employment Status
for those 25 and over, with a Bachelor’s Degree or higher in the
US.
For this study we set a significance level of 0.05, which means we
are willing to say that the there is a 5% chance that the results will
occur due to chance alone. Only when our p-value is lower than our
significance level of 0.05 can we reject the Null Hypothesis and
determine that the Research Hypothesis is more attractive.
Method
To start our analysis the relevant packages are loaded into R
Studio.
#Loading Packages
library(kableExtra)
library(dplyr)
library(knitr)
library(ggplot2)
library(corrplot)
library(vcd)
Then the data has been sourced from www.beta.bls.gov. Multiple tables
have been downloaded for both Genders with the key words of “25 Years
and Over”, “Bachelors Degree”, “Employed”, “Unemployed”. Since the
tables were separated by Gender, Employment Status and for the Female
Data by race. Once downloaded the data was transformed in Excel and
loaded into R studio for analysis.
Data Set
Population Data
Table 4.1: BLS Beta Labs data regarding Total Employed/Unemployed from 2015-2021 (Q1-Q4) by Gender. The count of this data is in thousands
| Year |
Q |
Emp.Status |
Gender |
Total.Count |
| 2015 |
Q1 |
Unemployed |
Male |
485 |
| 2015 |
Q2 |
Unemployed |
Male |
78 |
| 2015 |
Q3 |
Unemployed |
Male |
71 |
| 2015 |
Q4 |
Unemployed |
Male |
71 |
| 2016 |
Q1 |
Unemployed |
Male |
504 |
| 2016 |
Q2 |
Unemployed |
Male |
70 |
| ... |
NA |
NA |
NA |
... |
| 2020 |
Q3 |
Employed |
Female |
22868 |
| 2020 |
Q4 |
Employed |
Female |
22886 |
| 2021 |
Q1 |
Employed |
Female |
22932 |
| 2021 |
Q2 |
Employed |
Female |
23380 |
| 2021 |
Q3 |
Employed |
Female |
23579 |
| 2021 |
Q4 |
Employed |
Female |
23746 |
This is how the data looked once it was transformed and loaded into R
Studio. It provides count data of the total population in the US (in
thousands), for those 25 Years and Over with a Bachelors Degree or
higher. Separated into Q1-4 (quarter) for each year, and by Gender and
Employment Status.
In order for keep our Chi-Square Test of Independence fair and since
we are looking at population data throughout the different years, we
will take a sample of this data set by looking specifically at one year
and one quarter. This will be done by using R to filter the data by a
random year and quarter
Sample Data
Table 4.2: Random Year and Q selected to generate a Sample from our original data from BLS Beta Labs data. Showing Total Employed/Unemployed by Gender. The count of this data is in thousands (K)
| Year |
Q |
Emp.Status |
Gender |
Total.Count |
| 2016 |
Q2 |
Unemployed |
Male |
70 |
| 2016 |
Q2 |
Unemployed |
Female |
106 |
| 2016 |
Q2 |
Employed |
Male |
21386 |
| 2016 |
Q2 |
Employed |
Female |
19867 |
Our sample data is for 2016 in Q2.
Contingency Table
Table 4.3: Contingency Table taken from our Random Sample, for the year 2016 and Q2, showing counts (in thousands) for the pair of our categorical vairables.
| |
Female |
Male |
| Employed |
19867 |
21386 |
| Unemployed |
106 |
70 |
From the initial look at our table we can that for the year 2016 Q2,
there are more Males who are employed than Females, 21,386 for Employed
males and 19867 for Employed Females (in thousands). More Females are
seen to be Unemployed than Males for those 25 years and Over with a
Bachelors Degree or higher, with values of 106 for Females and 70 for
Males (in thousands).
Since this data is in thousands, when converting it back to real
numbers the difference in Employment status can seem a lot more
substantial. With the numbers of Employed 21,386,000 and 19,867,000 for
Males and Females Respectively. Whether this difference of over
1,000,000 is a sign of a significant association or not is what we will
determine in this study.
Observed Values
Yates Correction
Observed values are the values which are seen in our data within each
category pair.
To determine whether we should use Yates Correction or not we need to
determine if the total N of our population is lower than 40. As stated
by (Giannini, 2005) Yates correction is used to compensated for
deviation from the theoretical probability distribution when the total N
for a 2x2 Chi-Square table is less than 40. When the sum of all our
observed values is less than 40 Yates correction is used to make a more
accurate analysis.
There is no need to calculate this number, as we can clearly see the
N is larger than 40. Since each group is larger than 40. Therefore we
can continue with the next stage of our analysis.
Expected Values
Fishers Exact Test
To determine whether we should use Fishers exact test or not we will
check the Expected Values. Expected Values are the frequency that we
would expect in a cell on average if the variables are independent
(Minitab, 2023).
Fishers exact test is used when 20% or more of the Expected Values
have a count of 5 or lower (Nowacki, 2017). Again, it is used to make a
more statistically accurate analysis when comparing the Observed and
Expected values.
Therefore, we run a Chi-Square Test with our contingency table and
plot the expected values to determine whether we should use Fishers
Exact Test or not.
Table 4.4: Expected Values of our random sample of the population data. The count of this data is in thousands (K)
Employment |
Expected Values |
| |
Female |
Male |
| Employed |
19888.15 |
21364.85 |
| Unemployed |
84.85 |
91.15 |
None of the Expected values are lower than 5 and all the assumptions
of the Chi-Square Test of Independence are met, so we continue we will
continue our analysis with the regular Chi-Square Test of Independence
to analyse whether there is an association or not between our two
categorical variables.
Results
Report: X-squared(1) = 10.223, P Value < 0.05
Pearson's Chi-squared test
data: ContingencyTable
X-squared = 10.223, df = 1, p-value = 0.001387
From our results of Pearson’s Chi-Sqaured Test of Independence we get
the result of a P-Value < 0.05. Therefore we are able to reject the
Null Hypothesis that there is a significant association between Gender
and Employment Status for those 25 and over, with a Bachelors Degree or
higher in the US from 1991-2021.
Discussion
Observed Values, Expected Values and Chi-Square
Components
Table 4.5: Observed Values, Expected Values and the Chi-Square Components of our random sample of the population data. The count of this data is in thousands (K)
|
Observed Values |
Expected Values |
Chi-Squared Components |
| |
Female |
Male |
Female |
Male |
Female |
Male |
| Employed |
19867 |
21386 |
19888.15 |
21364.85 |
0.0225 |
0.0209 |
| Unemployed |
106 |
70 |
84.85 |
91.15 |
5.2720 |
4.9076 |
When comparing the Values of our Chi-Square Test it is good to look
first at the Chi-Squared Components. Chi Square Components are the
residuals of our test squared. The residuals are how much the Observed
Values differ from the Expected Values.
For Females a Chi-Squared Component value of 5.2720 in the Unemployed
Row, shows that the Observed Values for Unemployed Females are very
different from what is Expected Values. When looking at the same row but
for Males, we see a Chi-Squared Component of 4.9, which provides the
same explanation of a large difference between Observed and Expected
Values for Males.
Since the Employed column shows Chi-Squared Values of 0.0225 and
0.0209 for Men and Women respectively, we will not worry about this
column as this will not be where the significant association lies.
Although, Chi-Squared Components do not show the direction by which
the difference occurs. This can simply be done by comparing the Observed
and Expected values of each categorical variable.
Again just looking at Unemployed for both Gender, we can see that for
Females the Observed Value is 106,000 (106, Translated to real world
numbers) as compared to the Expected Value of 84,950 (or 84.85). Showing
a Positive Correlation between Females and Unemployment.Since our
P-Value < 0.05 this means that there are significantly more
Unemployed Females than we would Expect and are due to factors other
than chance alone.
The reverse is shown to be true for Males, with an Observed Value of
70,000 (70) and an Expected Value of 91,150 (91.15), this shows that
there are significantly less Unemployed Males than we would Expect. A
negative correlation. Which again we can conclude that these results are
due to factors other than chance alone (P-Value < 0.05).
Visualization

Figure 4.1: Association Plot showing Pearson residuals for our Chi
Squared test of the association between Gender and Employment Status. A
positive association between Gender and Employment status is indicated
with a bar above the dotted line, A negative association between Gender
and Employment status is indicated with a bar below the dotted line. The
strength of the association is indicated by the size of the bar.
This plot shows the Pearson Residuals for our Chi-Square Test for
each pair of our two categorical variables Gender and Employment Status.
It allows us to get more of a visual understanding as to where the
association lies between Gender and Employment Status for our sample
data set.
The line above the bar shows that more Females are Observed to be
Unemployed than Expected, and the line below the bar shows that less
Males are Observed to be Unemployed than expected.
The P-Value of 0.001387 shows a high significance in the correlation
between Gender and Employment status. As highlighted by the blue and red
bars, we can see that the the significance lies in Unemployment. The
grey highlights than there is no significant association in these
results with regards to those who are Employed.
The line above the bar shows that more Females are Observed to be
Unemployed than Expected, and the line below the bar shows that less
Males are Observed to be Unemployed than expected.
Conclusion
From our results we conclude that there is a significant association
(P-Value < 0.05) between Gender and Employment Status in the US for
those who are 25 and over, with a Bachelors Degree or higher.
Although, the significance of our association only shows on the
Unemployed side. We will not use Gender as a determining factor which
decides whether or whether gets gets a job (If they have a degree).
Which is still a positive result from a societal point of view.
Furthermore, there is still a significant positive correlation between
Females and Unemployed.
Yet, we must realize that these results alone do not explain all the
factors at play. Simply they show a correlation within our sample of the
population data, rather than the cause of unemployment is due to the
fact that they are Female
We conclude from this analysis that the reason “why?” this might
occur would not be due to Gender alone, but due to more social factors
and norms which Females face in society. Further analysis should be done
to test these social factors on an index, determine if they have a
significant association to Employment Status and make a comparison by
Gender.
One must also consider our differences in nature, such as having a
baby. Which may cause some more women to leave Employment. This can also
be studied by comparing Unemployed Females to due to being fired/quit to
those who have left for maternal reasons. If these studies prove that
maternal reasons are why there is a correlation, then hopefully as time
goes on and more people can work remotely, we won’t see a significant
correlation anymore.
Also, from this study we have not concluded that one
Gender is more likely to get a degree than the other gender. Our results
could have possibly be skewed simply due to the fact that there a less
Females with a Bachelors Degree or higher than Male. Therefore, further
research could be done to test the significance of differences in
educational attainment by gender.
Even though the Educational Equity Act was put in place in 1974, and
Gender Equity Act in 1994 (NWHP, 2023), we still observed a lot more
Males with a Bachelors than Females observed in our sample data set
(Employed or Unemployed). More research could therefore be done to
determine what social factors the different genders may face on an index
and compare this number to their educational attainment.
References
Aragao, Carolina. (2023). Gender pay gap in the U.S. hasn’t
changed much in two decades. Pew Research Center. [Website] [Available
online at: https://www.pewresearch.org/short-reads/2023/03/01/gender-pay-gap-facts/#:~:text=In%202021%2C%20full%2Dtime%2C,occupational%20segregation%20and%20work%20experience]
Amanda, J., Shaker. (2024). 1.1 Assumptions: Independent samples
t-test. STM1001 Topic 6: t-tests for two-sample hypothesis testing.
bookdown. [Website] [Available online at: https://bookdown.org/content/f9d035ed-86ea-4779-ad01-31acc973f0dd/]
Binghamton, University. (2024). Women’s Rights: Then and now.
Summer of Love Exhibit: Social movements of 1967. Library guides.
[Website] [Available online at: https://libraryguides.binghamton.edu/exhibitsummeroflove/society#tab_s-lib-ctab-15570871-0]
Carey, W., Isabel. Hacket, Conrad. (2022). Global population
skews male, but UN projects parity between sexes by 2050. Pewresearch.
[Website] [Available online at: https://www.pewresearch.org/short-reads/2022/08/31/global-population-skews-male-but-un-projects-parity-between-sexes-by-2050/#:~:text=The%20United%20States%20has%20had,is%20expected%20to%20be%2099]
DATAtab. (2024). Mann-Whitney U-Test. [Website] [Available online
at: https://datatab.net/tutorial/mann-whitney-u-test]
Future, Learn. (2021). Exploring Gender Inequality: What is
Feminism? [Blog] [Available online at: https://www.futurelearn.com/info/blog/what-is-feminism#:~:text=Feminism%20can%20be%20defined%20as,everyone%2C%20regardless%20of%20gender%20identity]
Gawali, Suvarna. (2023). Skewness and Kurtosis: Quick Guide
(Updated 2024). [Website] [Available online at: https://www.analyticsvidhya.com/blog/2021/05/shape-of-data-skewness-and-kurtosis/]
Gianni, H,. Edward. (2005). Textbook of Pediatric Rheumatology.
Fifth Edition. [Book]
Jawaid, Mohammad. Thariq, Mohamed. Saba, Naheed. (2019). Failure
Analysis in Biocomposites, Fibre-Reinforced Composites and Hybrid
Composites. A volume in Woodhead Publishing Series in Composites Science
and Engineering. [Book]
National, Woman’s, History, Project, NWHP. (2023). Women’s Rights
History in the US. Your Dream blog. [Website] [Available online at: https://yourdream.liveyourdream.org/2023/02/history-of-womens-rights-in-the-us/?utm_term=womens%20rights&utm_campaign=&utm_source=adwords&utm_medium=ppc&hsa_acc=3468286777&hsa_cam=1743277637&hsa_mt=b&hsa_net=adwords&hsa_src=g&hsa_ver=3&hsa_ad=678717233754&hsa_tgt=kwd-10106450&hsa_grp=155232623899&hsa_kw=womens%20rights&gad_source=1&gclid=CjwKCAiAqY6tBhAtEiwAHeRopdcUDOA0wa6zqrPKAYAYJw0mzXNBNRzWJNU6tnPDZpL5Kijs0vfGzxoCtSoQAvD_BwE]
Nowacki, Amy (2017). Chi-square and Fisher’s exact tests.
Cleveland Clinic Journal of Medicine. [Website] [Available online at: https://www.ccjm.org/content/84/9_suppl_2/e20#:~:text=For%20simplicity%2C%20most%20researchers%20adhere,that%20the%20observations%20are%20independent]
Minitab (2023). Interpret all statistics for Chi-Square Test of
Association. Chi-Square Test for Association. [Website] [Available
online at: https://support.minitab.com/en-us/minitab/21/help-and-how-to/statistics/tables/how-to/chi-square-test-for-association/interpret-the-results/all-statistics/#:~:text=The%20expected%20count%20is%20the,the%20total%20number%20of%20observations]
Owens, Anita. (2022). How to forecast with two-way ANOVA in R.
[blog] [Available online at: https://medium.com/mlearning-ai/how-to-forecast-with-two-way-anova-in-r-33d1c09790b3]
The, Swedish, International, Development, Corporation, Agency.
Sida. (2017). Gender and Educational Attainment. [Website] [Available
online at: https://www.sida.se/en/publications/gender-and-educational-attainment]
U.S., Department, OF, LABOR,. DOL (2024). Equal Pay for Equal
Work. [Website] [Available online at: [[https://www.dol.gov/agencies/oasam/centers-offices/civil-rights-center/internal/policies/equal-pay-for-equalwork#:\\](https://www.dol.gov/agencies/oasam/centers-offices/civil-rights-center/internal/policies/equal-pay-for-equalwork#:){.uri}~:text=The%20Equal%20Pay%20Act%20of,wage%20discrimination%20based%20on%20sex.&text=The%20Equal%20Pay%20Act%20(EPA)%20protects%20individuals%20of%20all%20sexes]
LS0tDQp0aXRsZTogIkdlbmRlciBhbmQgSW5jb21lIGluIHRoZSBVUyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KCkNCmBgYA0KDQpcDQoNCiMjIyBbKipFeGVjdXRpdmUgU3VtbWFyeSoqXXsudW5kZXJsaW5lfQ0KDQpUaGlzIGNvbXByZWhlbnNpdmUgc3RhdGlzdGljYWwgYW5hbHlzaXMgaW52ZXN0aWdhdGVzIHZhcmlvdXMgYXNwZWN0cyBvZiBnZW5kZXIgYW5kIGluY29tZSBkeW5hbWljcyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBzcGFubmluZyBzZXZlcmFsIGRlY2FkZXMuIEZvdXIgZGlzdGluY3QgcGFydHMgZXhwbG9yZSBkaWZmZXJlbnQgZGltZW5zaW9ucyBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZ2VuZGVyIGFuZCBpbmNvbWUsIHV0aWxpemluZyBkaWZmZXJlbnQgc3RhdGlzdGljYWwgdGVzdHMgdG8gZGVyaXZlIG1lYW5pbmdmdWwgY29uY2x1c2lvbnMuXA0KXA0KDQojIyMjIFsqKlBhcnQgMTogRmVtYWxlIEluY29tZSBUcmVuZHMgKDE5NjcgLSAyMDIxKSoqXXsudW5kZXJsaW5lfSANCg0KKioqUmVzZWFyY2ggUXVlc3Rpb246KioqIEhhcyB0aGVyZSBiZWVuIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gTWVkaWFuIEZlbWFsZSBJbmNvbWUgZnJvbSAxOTY3IHRvIDIwMjE/DQoNCioqKlN0YXRpc3RpY2FsIFRlc3Q6KioqIExpbmVhciBSZWdyZXNzaW9uDQoNCioqKktleSBGaW5kaW5nczoqKiogVGhlIGFuYWx5c2lzIHJldmVhbHMgYSBzaWduaWZpY2FudCBpbmNyZWFzZSBpbiBtZWRpYW4gZmVtYWxlIGluY29tZSBvdmVyIHRoZSBzcGVjaWZpZWQgcGVyaW9kLCBhcyBpbmRpY2F0ZWQgYnkgYSBoaWdobHkgc2lnbmlmaWNhbnQgcC12YWx1ZSAoXDwgMC4wNSkuIFRoaXMgc3VnZ2VzdHMgYSBwb3NpdGl2ZSB0cmVuZCBpbiBmZW1hbGUgaW5jb21lIG92ZXIgdGltZSwgY29udHJpYnV0aW5nIHRvIGFuIGVuaGFuY2VkIHN0YW5kYXJkIG9mIGxpdmluZyBmb3Igd29tZW4gaW4gdGhlIFVTLlwNClwNCg0KIyMjIyBbKipQYXJ0IDI6IEdlbmRlciBJbmNvbWUgRGlzcGFyaXR5ICgxOTY3IC0gMjAyMSkqKl17LnVuZGVybGluZX0gDQoNCioqKlJlc2VhcmNoIFF1ZXN0aW9uOioqKiBJcyB0aGVyZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gTWVkaWFuIE1hbGUgYW5kIEZlbWFsZSBJbmNvbWUgZnJvbSAxOTY3IHRvIDIwMjE/DQoNCioqKlN0YXRpc3RpY2FsIFRlc3Q6KioqIFQtVGVzdCBmb3IgSW5kZXBlbmRlbnQgU2FtcGxlcw0KDQoqKipLZXkgRmluZGluZ3M6KioqIFRoZSBzdHVkeSB1bmNvdmVycyBhIHNpZ25pZmljYW50IGRpc3Bhcml0eSBpbiBpbmNvbWVzIGJldHdlZW4gZ2VuZGVycyBpbiB0aGUgVVMsIGFzIHRoZSByZXN1bHRhbnQgcC12YWx1ZSAoXDwgMC4wNSkgYW5kIHRoZSBtZWRpYW4gaW5jb21lIGZvciBtYWxlcyBoYXMgY29uc2lzdGVudGx5IGJlZW4gdGhhbiB0aGF0IG9mIGZlbWFsZXMgb3ZlciB0aGUgcGVyaW9kIGV4YW1pbmVkLiBEZXNwaXRlIGxlZ2lzbGF0aXZlIGVmZm9ydHMgc3VjaCBhcyB0aGUgRXF1YWwgUGF5IEFjdCwgYSBzdWJzdGFudGlhbCBnZW5kZXIgcGF5IGdhcCBwZXJzaXN0cywgaW5kaWNhdGl2ZSBvZiB1bmRlcmx5aW5nIHN0cnVjdHVyYWwgYW5kIHNvY2lldGFsIGZhY3RvcnMgaW5mbHVlbmNpbmcgaW5jb21lIGRpc3RyaWJ1dGlvbi5cDQpcDQoNCiMjIyMgWyoqUGFydCAzOiBHZW5kZXIsIEluY29tZSwgYW5kIERlZ3JlZXMgKDE5OTEgLSAyMDIxKSoqXXsudW5kZXJsaW5lfSANCg0KKioqUmVzZWFyY2ggUXVlc3Rpb246KioqIElzIHRoZXJlIGFuIGludGVyYWN0aW9uIGJldHdlZW4gR2VuZGVyIGFuZCBEZWdyZWUgVHlwZSBvbiBNZWRpYW4gSW5jb21lIExldmVsIGZyb20gMTk5MSB0byAyMDIxPw0KDQoqKipTdGF0aXN0aWNhbCBUZXN0OioqKiBUd28tV2F5IEFOT1ZBDQoNCioqKktleSBGaW5kaW5nczoqKiogVGhpcyBhbmFseXNpcyByZXZlYWxzIGEgc2lnbmlmaWNhbnQgcC12YWx1ZSAoXDwgMC4wNSkgd2l0aCByZWdhcmRzIHRvIG1lZGlhbiBpbmNvbWUgbGV2ZWxzIGluIGJvdGggdGhlIG1haW4gZWZmZWN0cy0tLWdlbmRlciBhbmQgZGVncmVlIHR5cGUtLS1hcyB3ZWxsIGFzIHRoZWlyIGludGVyYWN0aW9ucy4gV2hpbGUgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBkZW1vbnN0cmF0ZXMgYSBwb3NpdGl2ZSBpbmZsdWVuY2Ugb24gaW5jb21lLCBzaWduaWZpY2FudCBnZW5kZXIgZGlzcGFyaXRpZXMgcGVyc2lzdCBhY3Jvc3MgZGVncmVlIHR5cGVzLCBzdWdnZXN0aW5nIHRoZSBwcmVzZW5jZSBvZiBjb21wbGV4IGZhY3RvcnMgYmV5b25kIGVkdWNhdGlvbiBjb250cmlidXRpbmcgdG8gaW5jb21lIGRpZmZlcmVudGlhbHMuXA0KXA0KDQojIyMjIFsqKlBhcnQgNDogRW1wbG95bWVudCBTdGF0dXMgYW5kIEdlbmRlciAoMTk5MSAtIDIwMjEpKipdey51bmRlcmxpbmV9IA0KDQoqKipSZXNlYXJjaCBRdWVzdGlvbjoqKiogSXMgdGhlcmUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgU3RhdHVzIGZvciB0aG9zZSB3aXRoIGEgQmFjaGVsb3IncyBEZWdyZWUgb3IgaGlnaGVyIGZyb20gMTk5MSB0byAyMDIxPw0KDQoqKipTdGF0aXN0aWNhbCBUZXN0OioqKiBDaGktU3F1YXJlIFRlc3QgZm9yIEluZGVwZW5kZW5jZQ0KDQoqKipLZXkgRmluZGluZ3M6KioqIFRoZSBzdHVkeSBpZGVudGlmaWVzIGEgc2lnbmlmaWNhbnQgcC12YWx1ZSAoXDwgMC4wNSkgaW5kaWNhdGluZyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGdlbmRlciBhbmQgZW1wbG95bWVudCBzdGF0dXMsIHBhcnRpY3VsYXJseSBpbiB0aGUgY29udGV4dCBvZiB1bmVtcGxveW1lbnQuIFdoaWxlIGdlbmRlciBhbG9uZSBtYXkgbm90IGRldGVybWluZSBlbXBsb3ltZW50IG91dGNvbWVzLCBzb2NpYWwgZmFjdG9ycyBhbmQgbm9ybXMgYXJlIGxpa2VseSB0byBiZSBjb250cmlidXRpbmcgZmFjdG9ycyBpbiB0aGUgb2JzZXJ2ZWQgZGlzcGFyaXRpZXMuIFdoaWNoIHVuZGVyc2NvcmVzIHRoZSBpbXBlcmF0aXZlIGZvciBmdXJ0aGVyIGV4cGxvcmF0aW9uIGludG8gdGhlIG11bHRpZmFjZXRlZCBkZXRlcm1pbmFudHMgb2Ygd29ya2ZvcmNlIHBhcnRpY2lwYXRpb24uXA0KXA0KDQojIyMjIFsqKk92ZXJhbGwgSW1wbGljYXRpb25zOioqXXsudW5kZXJsaW5lfQ0KDQpUaGVzZSBmaW5kaW5ncyBjb2xsZWN0aXZlbHkgaGlnaGxpZ2h0IHRoZSBwZXJzaXN0ZW5jZSBvZiBnZW5kZXItYmFzZWQgaW5jb21lIGRpc3Bhcml0aWVzIGluIHRoZSBVUyBkZXNwaXRlIGxlZ2lzbGF0aXZlIGVmZm9ydHMgYW5kIHNvY2lldGFsIGFkdmFuY2VtZW50cy4gV2hpbGUgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBwb3NpdGl2ZWx5IGNvcnJlbGF0ZXMgd2l0aCBpbmNvbWUsIHNpZ25pZmljYW50IGdlbmRlciBkaWZmZXJlbmNlcyBwZXJzaXN0IGFjcm9zcyBlZHVjYXRpb25hbCBsZXZlbHMgYW5kIGVtcGxveW1lbnQgc3RhdHVzZXMuIFRoaXMgZW1waGFzaXplcyB0aGUgbmVjZXNzaXR5IGZvciBvbmdvaW5nIGVuZGVhdm9ycyBhaW1lZCBhdCBhZGRyZXNzIHRoZSB1bmRlcmx5aW5nIHNvY2lldGFsIGluZXF1YWxpdGllcy4gRnVydGhlciByZXNlYXJjaCBpbnRvIGV4dGVybmFsIGZhY3RvcnMgaW5mbHVlbmNpbmcgaW5jb21lIGR5bmFtaWNzIGFuZCB3b3JrZm9yY2UgcGFydGljaXBhdGlvbiBpcyBpbXBlcmF0aXZlIHRvIGVsdWNpZGF0ZSB0aGUgcmVhc29ucyBiZWhpbmQgdGhlIHBlcnNpc3RlbmNlIG9mIHRoZSB3YWdlIGdhcCBpbiB0aGUgVW5pdGVkIFN0YXRlcy4gU3VjaCBpbnNpZ2h0cyBhcmUgZXNzZW50aWFsIGZvciBkZXZlbG9waW5nIHRhcmdldGVkIGludGVydmVudGlvbnMgdGhhdCBwcm9tb3RlIGdlbmRlciBlcXVpdHkgaW4gaW5jb21lIGRpc3RyaWJ1dGlvbiBhbmQgZWNvbm9taWMgb3Bwb3J0dW5pdGllcy5cDQpcDQpcDQpcDQpcDQpcDQpcDQpcDQoNCiMjIyBbKipQYXJ0IDEgLSBGZW1hbGUgSW5jb21lIGluIHRoZSBVUyBmcm9tIDE5NjcgLSAyMDIxLioqXXsudW5kZXJsaW5lfQ0KDQojIyMgWyoqSW50cm9kdWN0aW9uKipdey51bmRlcmxpbmV9DQoNClNpbmNlIHRoZSBlYXJseSAxOTAwcyBpbiB0aGUgVVMgd29tZW4gaGF2ZSBnYWluZWQgbW9yZSBvZiBhbiBlcXVhbCBzdGFuZGluZyBpbiBzb2NpZXR5LiAxOTIwIHdhcyBhIG1ham9yIHllYXIgZm9yIFdvbWFuJ3MgcmlnaHRzLCB0aGUgbmluZXRlZW50aCBhbWVuZG1lbnQgdG8gdGhlIFUuUyBjb25zdGl0dXRpb24gd2FzIHJhdGlmaWVkIChOV0hQLCAyMDIzKSwgdGhpcyBhbWVuZG1lbnQgZ2F2ZSB3b21lbiB0aGUgcmlnaHQgdG8gdm90ZS4gRnVydGhlciBwcm9ncmVzcyB3YXMgbWFkZSB0b3dhcmRzIGFuIGVxdWFsIHNvY2lldHkgdGhyb3VnaG91dCB0aGUgMTkwMHMsIGZvciBleGFtcGxlIGluIDE5NzggdGhlIGNvdXJ0IHJ1bGVkIGludG8gZWZmZWN0IHRoZSBQcmVnbmFuY3kgRGlzY3JpbWluYXRpb24gQWN0IChOV0hQLCAyMDIzKS4gV2hpY2ggYmFubmVkIGVtcGxveW1lbnQgZGlzY3JpbWluYXRpb24gYWdhaW5zdCBwcmVnbmFudCB3b21lbi4NCg0KV29tZW4gc3Rvcm1lZCB0aHJvdWdoIHRoZSAxOTYwcyBhcyBhIHBhcnQgb2YgdGhlIGZlbWluaXN0IG1vdmVtZW50LiAxOTY3IGluIHBhcnRpY3VsYXIgd2FzIHBhcnQgb2YgdGhlIHNlY29uZCB3YXZlIG9mIGZlbWluaXNtIChCaW5naGFtdG9uIFVuaXZlcnNpdHksIDIwMjQpLiBUaGlzIG1vdmVtZW50IHdhcyBzZXQgb3V0IHRvIGZpZ2h0IGZvciBlcXVhbCByaWdodHMgYmV0d2VlbiBnZW5kZXJzIGFzIHByZXZpb3VzbHkgaW4gaGlzdG9yeSB3b21lbiBoYXZlIGdvbmUgdGhyb3VnaCBtdWNoIGhhcmRzaGlwLg0KDQpQYXJ0IG9uZSBvZiB0aGlzIHN0dWR5IGlzIHRoZXJlZm9yZSBzZXQgb3V0IHRvIGRldGVybWluZSB3aGV0aGVyIGFueSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIHNpbmNlIHRoZSBzZWNvbmQgd2F2ZSBvZiBmZW1pbmlzbSBpbiAxOTY3LiBUaGlzIHdpbGwgYmUgZG9uZSBieSBhbmFseXppbmcgd2hldGhlciB0aGVyZSBoYXMgYmVlbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGluIHRoZSBVUyBmcm9tIDE5NjcgLSAyMDIxLlwNClwNClRoZXJlZm9yZSwgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uIHRvIGJlIGFuc3dlcmVkIGluIHRoaXMgc3R1ZHkgaXM6XA0KXA0KKkhhcyB0aGVyZSBiZWVuIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gTWVkaWFuIEZlbWFsZSBJbmNvbWUgZnJvbSAxOTY3IC0gMjAyMT8qXA0KXA0KDQojIyMjIFtMaW5lYXIgUmVncmVzc2lvbjpdey51bmRlcmxpbmV9DQoNClRoZSBzdGF0aXN0aWNhbCB0ZXN0IHdoaWNoIHdpbGwgYmUgdXNlZCBpbiB0aGlzIHN0dWR5IGlzIGxpbmVhciByZWdyZXNzaW9uLCBhcyB3ZSBhcmUgbG9va2luZyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG91ciB0d28gdmFyaWFibGVzOg0KDQotICAgVGltZSBpbiBZZWFycw0KDQotICAgTWVkaWFuIEZlbWFsZSBJbmNvbWUgKFwkKQ0KDQpUaGUgZm9ybXVsYSBmb3IgTGluZWFyIHJlZ3Jlc3Npb24gaXM6DQoNCi0gICBZID0gzrIwICsgzrIxWA0KDQpXaGVyZToNCg0KLSAgIFkgaXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZQ0KDQotICAgWCBpcyB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUNCg0KLSAgIM6yMCBpcyB0aGUgaW50ZXJjZXB0LCB0aGUgdmFsdWUgb2YgWSB3aGVuIFggPSAwDQoNCi0gICDOsjEgaXMgdGhlIHNsb3BlIG9mIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBsaW5lDQoNCk91ciBGb3JtdWxhOg0KDQotICAgTWVkaWFuIEZlbWFsZSBJbmNvbWUgPSDOsjAgKyDOsjEoVGltZSBpbiBZZWFycylcDQogICAgXA0KDQojIyMjIFtIeXBvdGhlc2lzOl17LnVuZGVybGluZX0NCg0KSW4gb3JkZXIgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24gd2UgbmVlZCB0byBzZXQgb3VyIE51bGwgYW5kIFJlc2VhcmNoIEh5cG90aGVzaXMsIGFuZCBsZXZlbCBvZiBzaWduaWZpY2FuY2UuDQoNCk51bGwgSHlwb3RoZXNpczoNCg0KLSAgIEgwOiDOsjEgPSAwDQoNCs6yMSByZXByZXNlbnRzIHRoZSBzbG9wZSBjb2VmZmljaWVudCBhc3NvY2lhdGVkIHdpdGggWSAoTWVkaWFuIEZlbWFsZSBJbmNvbWUpLg0KDQpPdXIgTnVsbCBIeXBvdGhlc2lzIGlzIHRoYXQgdGhlIHNsb3AgaXMgZXF1YWwgdG8gMC4gTWVhbmluZyB0aGF0IHRoZXJlIGlzIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFggKFRpbWUgaW4gWWVhcnMpIGFuZCBZDQoNClJlc2VhcmNoIEh5cG90aGVzaXM6DQoNCi0gICBIMTogzrIxIFw+IDANCg0KU2luY2Ugd2UgYXJlIHRlc3Rpbmcgd2hldGhlciB0aGVyZSBoYXMgYmVlbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGZyb20gMTk2Ny0yMDIxLiBXZSBhcmUgdGVzdGluZyB3aXRoIG91ciBSZXNlYXJjaCBIeXBvdGhlc2lzIHRoYXQgdGhlIHNsb3BlIGNvZWZmaWNpZW50IM6yMSBpcyAqZ3JlYXRlciB0aGFuKiAwLg0KDQpGb3IgdGhpcyBzdHVkeSB3ZSBzZXQgYSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgMC4wNSwgd2hpY2ggbWVhbnMgd2UgYXJlIHdpbGxpbmcgdG8gc2F5IHRoYXQgdGhlIHRoZXJlIGlzIGEgNSUgY2hhbmNlIHRoYXQgdGhlIHJlc3VsdHMgd2lsbCBvY2N1ciBkdWUgdG8gY2hhbmNlIGFsb25lLiBPbmx5IHdoZW4gb3VyIHAtdmFsdWUgaXMgbG93ZXIgdGhhbiBvdXIgc2lnbmlmaWNhbmNlIGxldmVsIG9mIDAuMDUgY2FuIHdlIHJlamVjdCB0aGUgTnVsbCBIeXBvdGhlc2lzIGFuZCBkZXRlcm1pbmUgdGhhdCB0aGUgUmVzZWFyY2ggSHlwb3RoZXNpcyBpcyBtb3JlIGF0dHJhY3RpdmUuXA0KXA0KDQojIyMgWyoqTWV0aG9kKipdey51bmRlcmxpbmV9DQoNClRvIHN0YXJ0IG91ciBhbmFseXNpcyB0aGUgcmVsZXZhbnQgcGFja2FnZXMgYXJlIGxvYWRlZCBpbnRvIFIgU3R1ZGlvLg0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojUGFja2FnZXMNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNClRoZW4gdGhlIGRhdGEgaXMgc291cmNlZCBhbmQgZG93bmxvYWRlZCBmcm9tIHd3dy5jZW5zdXMuZ292LiBUYWJsZSBBLTc6IE51bWJlciBvZiBSZWFsIE1lZGlhbiBFYXJuaW5ncyBvZiBUb3RhbCBXb3JrZXJzIGFuZCBGdWxsIHRpbWUsIFllYXItUm91bmQgV29ya2VycyBieSBTZXggYW5kIEZlbWFsZS10by1NYWxlIEVhcm5pbmdzIFJhdGlvOiAxOTYwIC0gMjAyMS4NCg0KRm9yIHB1cnBvc2Ugb2YgdW5kZXJzdGFuZGluZzogVGhlIHdvcmQgIkVhcm5pbmdzIiB3aWxsIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggIkluY29tZSIgYXMgdGhleSBhcmUgYm90aCB1c2VkIHRvIGRlc2NyaWJlIHRoZSBtb25leSBlYXJuZWQgZnJvbSBkaXJlY3QgZW1wbG95bWVudC4gRnVydGhlcm1vcmUsIHRoZSBkYXRhIHVzZWQgaW4gdGhpcyBzdHVkeSBpcyBmb3IgVG90YWwgV29ya2VycyBub3QgRnVsbC1UaW1lLCBZZWFyLVJvdW5kIFdvcmtlcnMuDQoNClRoZSBkYXRhIHdhcyBzdWJzZXF1ZW50bHkgdHJhbnNmb3JtZWQgaW4gRXhjZWwgZm9yIGRhdGEgY2xlYW5pbmcgcHVycG9zZXMgYW5kIGVhc2Ugb2YgbG9hZGluZyBpbnRvIFIuDQoNClJvd3MgZm9yIDIwMTcgYW5kIDIwMTMgaGF2ZSBiZWVuIHJlcGVhdGVkIGluIHRoZSBkYXRhIHNldCBkb3dubG9hZGVkIGZyb20gVVMgQ2Vuc3VzLCBzbyB3aGVuIGltcG9ydGVkIGludG8gZXhjZWwgSSBoYXZlIGNhbGN1bGF0ZWQgdGhlIGF2ZXJhZ2Ugb2YgdGhlc2Ugcm93cyBpbnN0ZWFkIG9mIGFsbG93aW5nIHR3byBpbnN0YW5jZXMgZm9yIHRoZSBzYW1lIHllYXIuDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpGZW1hbGVFYXJuaW5ncyA8LSByZWFkLmNzdigiQzovVXNlcnMvZWRyZW4vT25lRHJpdmUvRGVza3RvcC9EYXRhIEFuYWx5c2lzL1IgV29ya2luZyBEaXJlY3RvcnkvRmluYWwgUHJvamVjdCBBc3NpZ25tZW50L0RhdGFzZXRzL0RhdGFTZXRzL0ZlbWFsZSBFYXJuaW5ncyBUcmFuc2Zvcm1lZC5jc3YiKQ0KDQoNCiNDbGVhbiB1cA0KDQpuYW1lcyhGZW1hbGVFYXJuaW5ncykgPC0gYygiWWVhciIsICJGZW1hbGUuRWFybmluZ3MiKQ0KDQojQWRkaW5nIGEgTnVtYmVyIHRvIHllYXINCg0KRmVtYWxlRWFybmluZ3MgPC0gRmVtYWxlRWFybmluZ3MgJT4lDQogIGFycmFuZ2UoWWVhcikgJT4lDQogIG11dGF0ZShZZWFyTnVtID0gcm93X251bWJlcigpKQ0KYGBgDQoNCkFmdGVyIGZ1cnRoZXIgZGF0YSBjbGVhbmluZyBpbiBSLCBhIG51bWJlciB3YXMgZ2l2ZW4gdG8gZWFjaCB5ZWFyIHZhbHVlIHN0YXJ0aW5nIGF0IDE5NjcgYXMgMSwgMTk2OCBhcyAyLCBhbmQgc28gb24uIEluIG9yZGVyIHRvIG1ha2UgbW9yZSBzZW5zZSBvZiB0aGUgWCB2YWx1ZSB3aGVuIGNvbmR1Y3RpbmcgbGluZWFyIHJlZ3Jlc3Npb24gYW5kIG5vdCBza2V3IG91ciBhbmFseXNpcy4NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNJbml0aWFsIGxvb2sgYXQgdGhlIGRhdGENCg0KaGVhZChGZW1hbGVFYXJuaW5ncykNCg0KdGFpbChGZW1hbGVFYXJuaW5ncykNCg0KVGFibGVFYXJuaW5nczEgPC0gcmJpbmQoaGVhZChGZW1hbGVFYXJuaW5ncyksICIuLi4iLCB0YWlsKEZlbWFsZUVhcm5pbmdzKSkNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0Ka2FibGUoVGFibGVFYXJuaW5nczEsIHJvdy5uYW1lcyA9IEYsIGNhcHRpb24gPSAiVGFibGUgMS4xOiBVUyBDZW5zdXMgZGF0YSByZWdhcmRpbmcgTWVkaWFuIGVhcm5pbmdzIGZvciBUb3RhbCBGZW1hbGUgV29ya2VycyBmcm9tIDE5NjcgLSAyMDIxLiBUaGUgWWVhcnMgYXJlIG51bWJlcmVkIGluIG9yZGVyIHRvIG5vdCBza2V3IHRoZSBhbmFseXNpcyBsYXRlci4gTWVkaWFuIGZlbWFsZSBFYXJuaW5ncyBpbiBEb2xsYXJzIFVTICgkKS4iKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIikgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBmb250X3NpemUgPSAxNSkNCmBgYA0KDQpGcm9tIGZpcnN0IGdsYW5jZSBvZiBvdXIgZGF0YSB3ZSBjYW4gc2VlIHRoYXQgdGhlIE1lZGlhbiBGZW1hbGUgRWFybmluZ3MgaXMgYSBsb3QgaGlnaGVyIGluIDIwMjEgdGhhdCBpbiAxOTY3LCB3aXRoIHZhbHVlcyBvZiBcJDM5LDIwMSBhbmQgXCQxNiw3MjEgcmVzcGVjdGl2ZWx5Lg0KDQpJbiBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBoYXMgYmVlbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIG9yIG5vdCBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHdpbGwgYmUgbWFkZSBhbmQgdGhlIGFzc3VtcHRpb25zIHdpbGwgYmUgdGVzdGVkIHRvIGRldGVybWluZSB0aGUgZml0IG9mIHRoZSBtb2RlbC5cDQpcDQoNCiMjIyMgW01vZGVsIDE6XXsudW5kZXJsaW5lfQ0KDQpPdXIgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwsIGZvbGxvd3Mgb3VyIG9yaWdpbmFsIGZvcm11bGEgb2YgWSA9IM6yMCArIM6yMVguIFdoZXJlIFkgaXMgTWVkaWFuIEZlbWFsZSBJbmNvbWUgYW5kIFggaXMgVGltZSBpbiB5ZWFycy4NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNDcmVhdGluZyB0aGUgaW5pdGlhbCByZWdyZXNzaW9uIG1vZGVsDQoNClJlZy5Nb2RlbDEgPC0gbG0oRmVtYWxlLkVhcm5pbmdzflllYXJOdW0sIGRhdGEgPSBGZW1hbGVFYXJuaW5ncykNCg0KI0NvZWZmaWNpZW50IFRhYmxlDQoNCk1vZGVsMVRhYmxlIDwtIFJlZy5Nb2RlbDEkY29lZmZpY2llbnRzDQoNCmBgYA0KDQoqKipUaGUgY29lZmZpY2llbnRzIGZvciBNb2RlbCAxIGFyZSBhcyBmb2xsb3dzOioqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQprYWJsZSh0KE1vZGVsMVRhYmxlKSwgY2FwdGlvbiA9ICJUYWJsZSAxLjI6IExpbmVhciBSZWdyZXNzaW9uIE1vZGVsIDEuIFRoZSBpbnRlcmNlcHQgKGNvbnN0YW50KSDOsjAgYW5kIHRoZSBzbG9wZSAoY29lZmZpY2llbnQpIM6yMSwgd2hpY2ggYXJlIHVzZWQgd2l0aCB0aGUgcHJlZGljdG9yIFggdG8gYWNoaWV2ZSB0aGUgcmVzcG9uc2UgdmFyaWFibGUgWS4iLCBjb2wubmFtZXMgPSBjKCLOsjAgKEludGVyY2VwdCkiLCAizrIxIChTbG9wZSkiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KRm9yIG91ciBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbCAxIG91ciBjb25zdGFudCDOsjAgKEludGVyY2VwdCkgaXMgMTUzODMuMDggYW5kIHRoZSBzbG9wZSAoY29lZmZpY2llbnQpIM6yMSBpcyA0MDUuNjQwNS4NCg0KTWFraW5nIG91ciBGb3JtdWxhOg0KDQpQcmVkaWN0ZWQgWSA9IDE1MzgzLjA4ICsgNDA1LjY0MDUoWCkNCg0KV2hlcmU6DQoNCi0gICBQcmVkaWN0ZWQgWSBpcyB0aGUgUHJlZGljdGVkIE1lZGlhbiBGZW1hbGUgSW5jb21lIEdpdmVuIFgNCg0KLSAgIFggaXMgdGhlIFllYXIgTnVtYmVyIHN0YXJ0aW5nIHdpdGggMTk2NyBhcyAxDQoNClRoaXMgbWVhbnMgdGhhdCDOsjEgaXMgdGhlIGFtb3VudCBpbiBcJCBhZGRlZCB0byBNZWRpYW4gRmVtYWxlIEluY29tZSBmb3IgZWFjaCB1bml0IGluY3JlYXNlIGluIFllYXIgZnJvbSAxOTY3LCB3aXRoIHRoZSBzdGFydGluZyB2YWx1ZSBlcXVhbCB0byB0aGUgKGludGVyY2VwdCkgzrIwIHZhbHVlIG9mIDE1MzgzLjAzLlwNClwNCg0KKioqVmlzdWFsaXppbmcgbW9kZWwgMToqKioNCg0KYGBge3IgZWNobz1GQUxTRX0NCiNsaW5lYXJpdHkgY2hlY2sgMQ0KDQpnZ3Bsb3QoRmVtYWxlRWFybmluZ3MsIGFlcyh4ID0gWWVhciwgeSA9IEZlbWFsZS5FYXJuaW5ncykpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCBjb2xvciA9ICJibHVlIikgKw0KICBnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCAgdmp1c3QgPSAtNCwgaGp1c3QgPSAwLjQzKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgdmp1c3QgPSA2LCBoanVzdCA9IDAuNiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCB2anVzdCA9IDYpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwgImNtIikpICsNCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24odW5kZXJsaW5lKCJNZWRpYW4gRmVtYWxlIEVhcm5pbmdzIGluIHRoZSBVUyBmcm9tIDE5NjctMjAyMSIpKSkgKw0KICB5bGFiKCJNZWRpYW4gRmVtYWxlIEVhcm5pbmdzICgkKSIpICsNCiAgeGxhYigiVGltZSBpbiBZZWFycyIpDQpgYGANCg0KRmlndXJlIDEuMTogU2NhdHRlciBQbG90IG9mIG91ciBVUyBDZW5zdXMgZGF0YSByZWdhcmRpbmcgTWVkaWFuIEVhcm5pbmdzIGZvciBXb21lbiBwbG90dGVkIG92ZXIgVGltZSBpbiBZZWFycy4gV2l0aCBhIFJlZ3Jlc3Npb24gbGluZSBvciBsaW5lIG9mIGJlc3QgZml0LiBUaGlzIGdyYXBoIHNob3dzIGEgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG91ciBYIGFuZCBZIHZhcmlhYmxlcy5cDQpcDQoNCkluIG9yZGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgbW9kZWwgY2FuIGJlIHVzZWQgZm9yIG91ciBkYXRhIHdlIG11c3QgY2hlY2sgd2hldGhlciB0aGUgYXNzdW1wdGlvbnMgb2YgbGluZWFyIHJlZ3Jlc3Npb24gYXJlIG1ldC4NCg0KRnJvbSBvdXIgZ3JhcGggd2UgY2FuIGRldGVybWluZSB0aGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBvdXIgdHdvIHZhcmlhYmxlcyBpcyBsaW5lYXIuIFlldCwgd2UgbXVzdCBmdXJ0aGVyIGNoZWNrIGZvciBob21vc2NlZGFzdGljaXR5ICh2YXJpYW5jZSBvZiByZXNpZHVhbHMgaXMgY29uc3RhbnQpIGFuZCBub3JtYWxpdHkgb2YgcmVzaWR1YWxzIChyZXNpZHVhbHMgZm9sbG93IGEgbm9ybWFsIGRpc3RyaWJ1dGlvbikuIFRoZXNlIGNoZWNrcyBjYW4gYmUgZG9uZSB3aXRoIGRpYWdub3N0aWMgcGxvdHMuXA0KXA0KDQoqKipEaWFnbm9zdGljIFBsb3RzKioqDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpwYXIobWZyb3cgPSBjKDIsMikpDQoNCnBsb3QoUmVnLk1vZGVsMSkNCg0KcGFyKG1mcm93ID0gYygxLDEpKQ0KYGBgDQoNCkZpZ3VyZSAxLjI6IERpYWdub3N0aWMgcGxvdHMgZm9yIG91ciBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbCAxOiBXaXRoIFkgZXF1YWwgdG8gTWVkaWFuIEZlbWFsZSBFYXJuaW5ncyBhbmQgWCBlcXVhbCB0byBUaW1lIGluIFllYXJzLiBUaGUgcGxvdCBpcyBkb25lIHRvIGNoZWNrIGZvciB0aGUgYXNzdW1wdGlvbnMgb2YgaG9tb3NjZWRhc3RpY2l0eSBhbmQgbm9ybWFsaXR5IG9mIHJlc2lkdWFscy4gVGhlIFJlc2lkdWFscyB2cyBmaXR0ZWQgc2hvd3MgYSBzbGlnaHQgcGF0dGVybiwgeWV0IGNvdWxkIGJlIGNvbnNpZGVyZWQgaG9tb3NjZWRhc3RpYy4gV2hlcmVhcyB0aGUgUVEgUGxvdCBzaG93cyB0aGF0IHRoZSByZXNpZHVhbHMgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLlwNClwNCg0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBpcyB1c2VkIHRvIHZpc3VhbGl6ZSB0aGUgaG9tb3NjZWRhc3RpY2l0eSBvZiBvdXIgbW9kZWwsIHdoaWNoIHdlIGhhdmUgZGVzY3JpYmVkIGFzIHRoZSB2YXJpYW5jZSBvZiBvdXIgcmVzaWR1YWxzLCB3aGljaCB3ZSB3YW50IHRvIGJlIGNvbnN0YW50LiBPdXIgcmVzaWR1YWxzIGFyZSB0aGUgWSB2YWx1ZSAtIHRoZSBQcmVkaWN0ZWQgWSB2YWx1ZS4gVGhpcyBwbG90IHNob3dzIG91ciByZXNpZHVhbHMgYXMgYSBmdW5jdGlvbiBvZiB0aGUgZml0dGVkIHZhbHVlcy4NCg0KSGVyZSB3ZSB3YW50IHRvIHNlZSB0aGF0IHRoZSBSZXNpZHVhbHMgYm91bmNlIHJhbmRvbWx5IGFyb3VuZCB0aGUgMCBsaW5lIGFuZCBzaG91bGQgYmUgcm91Z2hseSBlcXVhbGx5IHNwYWNlZCBhcm91bmQgdGhlIHJlZ3Jlc3Npb24gbGluZS4NCg0KVGhlIFFRIFBsb3QgaXMgdXNlZCB0byB2aXN1YWxpemUgdGhlIG5vcm1hbGl0eSBvZiB0aGUgcmVzaWR1YWxzLCBhIHN0cmFpZ2h0IGxpbmUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlc2lkdWFscyBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuDQoNCkhlcmUgdGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBzaG93cyBzb21ld2hhdCBvZiBhIHBhdHRlcm4sIGJ1dCB0aGUgUVEgUGxvdCBzaG93cyB1cyBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFdlIHdpbGwgdHJhbnNmb3JtIHRoZSBkYXRhIHRoZSBhbmQgY3JlYXRlIGEgbmV3IG1vZGVsIHRvIHNlZSBpZiB3ZSBjYW4gaW1wcm92ZSB0aGlzIGJlZm9yZSB3ZSBjb250aW51ZSB3aXRoIG91ciBhbmFseXNpcy5cDQpcDQoNCiMjIyMgW01vZGVsIDI6XXsudW5kZXJsaW5lfQ0KDQpPdXIgc2Vjb25kIExpbmVhciBSZWdyZXNzaW9uIE1vZGVsLCBNb2RlbCAyIGZvbGxvd3MgYSBuZXcgZm9ybXVsYSBvZiBZID0gzrIwICsgzrIxKGxvZzEwKFgpKS4gV2hlcmUgWSBpcyBNZWRpYW4gRmVtYWxlIEluY29tZSBhbmQgWCBpcyBUaW1lIGluIHllYXJzLg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KUmVnLk1vZGVsMiA8LSBsbShsb2cxMChGZW1hbGUuRWFybmluZ3MpflllYXJOdW0sIGRhdGEgPSBGZW1hbGVFYXJuaW5ncykNCiNUYWJsZSBGb3IgQ29lZmZpY2llbnRzDQoNCk1vZGVsMlRhYmxlIDwtIFJlZy5Nb2RlbDIkY29lZmZpY2llbnRzDQpgYGANCg0KKioqVGhlIGNvZWZmaWNpZW50cyBmb3IgTW9kZWwgMiBhcmUgYXMgZm9sbG93czoqKioNCg0KYGBge3IgZWNobz1GQUxTRX0NCmthYmxlKHQoTW9kZWwyVGFibGUpLCBjYXB0aW9uID0gIlRhYmxlIDEuMzogTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwgMiB3aXRoIGxvZzEwKCkgdHJhbnNmb3JtYXRpb24uIFRoZSBpbnRlcmNlcHQgKGNvbnN0YW50KSDOsjAgYW5kIHRoZSBzbG9wZSAoY29lZmZpY2llbnQpIM6yMSwgd2hpY2ggYXJlIHVzZWQgd2l0aCB0aGUgcHJlZGljdG9yIFggdG8gYWNoaWV2ZSB0aGUgcmVzcG9uc2UgdmFyaWFibGUgWS4iLCBjb2wubmFtZXMgPSBjKCLOsjAgKEludGVyY2VwdCkiLCAizrIxIChTbG9wZSkiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KRm9yIG91ciBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbCAyIG91ciBjb25zdGFudCDOsjAgKEludGVyY2VwdCkgaXMgNC4yMjE5MTIgYW5kIHRoZSBzbG9wZSAoY29lZmZpY2llbnQpIM6yMSBpcyAwLjAwNjg1NjMuDQoNCk1ha2luZyBvdXIgRm9ybXVsYToNCg0KbG9nMTAoUHJlZGljdGVkIFkpID0gNC4yMjE5MTIgKyAwLjAwNjg1NjMoWCkNCg0KV2hlcmU6DQoNCi0gICBsb2cxMChQcmVkaWN0ZWQgWSkgaXMgdGhlIGxvZ2FyaXRobWljIGV4cG9uZW50cyBvZiBQcmVkaWN0ZWQgTWVkaWFuIEZlbWFsZSBJbmNvbWUgR2l2ZW4gWA0KDQotICAgWCBpcyB0aGUgWWVhciBOdW1iZXIgc3RhcnRpbmcgd2l0aCAxOTY3IGFzIDENCg0KVXNpbmcgYSBsb2cxMCBUcmFuc2Zvcm1hdGlvbiBvbiBvdXIgWSB2YXJpYWJsZSBtZWFucyB0aGF0IM6yMSBpcyB0aGUgcGVyY2VudGFnZSBjaGFuZ2UgdG8gaW5jb21lIHdpdGggMSB1bml0IGluY3JlYXNlIGluIG91ciBzY2FsZSwgd2l0aCB0aGUgc3RhcnRpbmcgcGVyY2VudGFnZSBpbmNyZWFzZSBlcXVhbCB0byB0aGUgKGludGVyY2VwdCkgzrIwIHZhbHVlIG9mIDQuMjIxOTEyLlwNClwNCg0KKioqRGlhZ25vc3RpYyBwbG90cyAyOioqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcGFyKG1mcm93ID0gYygyLDIpKQ0KDQpwbG90KFJlZy5Nb2RlbDIpDQoNCnBhcihtZnJvdyA9IGMoMSwxKSkNCmBgYA0KDQpGaWd1cmUgMS4zOiBEaWFnbm9zdGljIHBsb3RzIGZvciBvdXIgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwgMjogV2l0aCBhIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIG91ciBZIHZhcmlhYmxlIGVxdWFsIHRvIGxvZzEwKE1lZGlhbiBGZW1hbGUgRWFybmluZ3MpIGFuZCBYIGVxdWFsIHRvIFRpbWUgaW4gWWVhcnMuIFRoZSBwbG90IGlzIGRvbmUgdG8gY2hlY2sgZm9yIHRoZSBhc3N1bXB0aW9ucyBvZiBob21vc2NlZGFzdGljaXR5IGFuZCBub3JtYWxpdHkgb2YgcmVzaWR1YWxzLlwNClwNCg0KVGhlIFJlc2lkdWFscyB2cyBmaXR0ZWQgc2hvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBiZWZvcmUsIHlldCBhZ2FpbiBpdCBjb3VsZCBiZSBjb25zaWRlcmVkIGhvbW9zY2VkYXN0aWMuIFdoZXJlYXMgdGhlIFFRIFBsb3Qgc2hvd3MgdGhhdCB0aGUgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZC4NCg0KU2luY2UgdGhlIHNhbWUgb3V0Y29tZSBvciBhbG1vc3QgdGhlIHNhbWUgb3V0Y29tZSBoYXMgYmVlbiBzaG93biB3aXRoIGEgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24uIFdlIHdpbGwgc2VlIGlmIGFkZGluZyBhbm90aGVyIHZhcmlhYmxlIHdpbGwgbWFrZSBhbnkgaW1wcm92ZW1lbnRzIG91ciBtb2RlbC5cDQpcDQoNCiMjIyMgW01vZGVsIDM6XXsudW5kZXJsaW5lfQ0KDQpJbmZsYXRpb24gaXMgYWRkZWQgdG8gdGhlIG1vZGVsIGFuZCB0aGUgZGF0YSBpcyBzY2FsZWQgYmVmb3JlIHRoZSBtb2RlbCBpcyBjcmVhdGVkLiBUaGlzIGlzIGRvbmUgYnkgc3VidHJhY3RpbmcgdGhlIG1lYW4gb2YgZWFjaCB2YXJpYWJsZSBhbmQgZGl2aWRpbmcgYnkgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgZWFjaCBvYnNlcnZhdGlvbi4NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNTaW5jZSB3ZSBhcmUgbG9va2luZyBhdCBob3cgaW5jb21lIGhhcyBpbmNyZWFzZWQgb3ZlciB0aGUgeWVhcnMsIGluZmxhdGlvbiB3aWxsIGJlIGEgZ29vZCB2YXJpYWJsZSB0byBhZGQgdG8gb3VyIG1vZGVsIGFzIGl0IGRpcmVjdGx5IGhhcyBhbiBlZmZlY3Qgb24gaW5jb21lLg0KDQpJbmZsYXRpb25EYXRhIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9lZHJlbi9PbmVEcml2ZS9EZXNrdG9wL0RhdGEgQW5hbHlzaXMvUiBXb3JraW5nIERpcmVjdG9yeS9GaW5hbCBQcm9qZWN0IEFzc2lnbm1lbnQvRGF0YXNldHMvRGF0YVNldHMvSW5mbGF0aW9uLmNzdiIpDQoNCkZlbWFsZUVhcm5pbmdzTmV3IDwtIGNiaW5kKEZlbWFsZUVhcm5pbmdzLCBJbmZsYXRpb25EYXRhJEluZmxhdGlvbikNCg0KbmFtZXMoRmVtYWxlRWFybmluZ3NOZXcpIDwtIGMoIlllYXIiLCAiRmVtYWxlLkVhcm5pbmdzIiwgIlllYXJOdW0iLCAiSW5mbGF0aW9uIikNCiANCg0KDQogDQoNCiNTY2FsZSBCb3RoIFllYXIgTnVtIGFuZCBJbmZsYXRpb24gaW4gb3JkZXIgdG8gY3JlYXRlIGEgbW9kZWwuDQoNClllYXJOdW1TY2FsZWQgPC0gc2NhbGUoRmVtYWxlRWFybmluZ3NOZXckWWVhck51bSwgY2VudGVyID0gVCwgc2NhbGUgPSBUKQ0KDQpJbmZsYXRpb25TY2FsZWQgPC0gc2NhbGUoRmVtYWxlRWFybmluZ3NOZXckSW5mbGF0aW9uLCBjZW50ZXIgPSBULCBzY2FsZSA9IFQpDQoNCkZlbWFsZUVhcm5pbmdzTmV3JFllYXJTY2FsZWQgPC0gc2NhbGUoRmVtYWxlRWFybmluZ3NOZXckWWVhck51bSwgY2VudGVyID0gVCwgc2NhbGUgPSBUKQ0KDQpGZW1hbGVFYXJuaW5nc05ldyRJbmZsYXRpb25TY2FsZWQgPC0gc2NhbGUoRmVtYWxlRWFybmluZ3NOZXckSW5mbGF0aW9uLCBjZW50ZXIgPSBULCBzY2FsZSA9IFQpDQoNClJlZy5Nb2RlbDMgPC0gbG0oRmVtYWxlLkVhcm5pbmdzIH4gWWVhclNjYWxlZCArIEluZmxhdGlvblNjYWxlZCwgZGF0YSA9IEZlbWFsZUVhcm5pbmdzTmV3KQ0KDQoNCk1vZGVsM1RhYmxlIDwtIFJlZy5Nb2RlbDMkY29lZmZpY2llbnRzDQpgYGANCg0KKioqVGhlIGNvZWZmaWNpZW50cyBmb3IgTW9kZWwgMyBhcmUgYXMgZm9sbG93czoqKioNCg0KYGBge3IgZWNobz1GQUxTRX0NCmthYmxlKHQoTW9kZWwzVGFibGUpLCBjYXB0aW9uID0gIlRhYmxlIDEuNDogTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwgMyB3aXRoIG5ldyBwcmVkaWN0b3IgSW5mbGF0aW9uICh4MikgLiBUaGUgaW50ZXJjZXB0IChjb25zdGFudCkgzrIwIGFuZCB0aGUgc2xvcGUgKGNvZWZmaWNpZW50KSDOsjEgKyDOsjIsIHdoaWNoIGFyZSB1c2VkIHdpdGggdGhlIHNjYWxlZCBwcmVkaWN0b3JzIHgxICsgeDIgdG8gYWNoaWV2ZSB0aGUgcmVzcG9uc2UgdmFyaWFibGUgWS4iLCBjb2wubmFtZXMgPSBjKCLOsjAgKEludGVyY2VwdCkiLCAizrIxIChTbG9wZSBmb3IgeDEpIiwgICLOsjIgKFNsb3BlIGZvciB4MikiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KRm9yIG91ciBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbCAzIG91ciBjb25zdGFudCDOsjAgKEludGVyY2VwdCkgaXMgMjY3NjkuMDIgYW5kIHRoZSBzbG9wZSAoY29lZmZpY2llbnQgZm9yIHgxKSDOsjEgaXMgNjY1Ni42MDIsIGFuZCB0aGUgc2xvcGUgKGNvZWZmaWNpZW50IGZvciB4MikgzrIyIGlzIC0yMzAuNzg3NS4NCg0KTWFraW5nIG91ciBGb3JtdWxhOg0KDQpQcmVkaWN0ZWQgWSA9IDI2NzY5LjAyICsgNjY1Ni42MDIoWDEpICsgLTIzMC43ODc1KFgyKQ0KDQpXaGVyZToNCg0KLSAgIFByZWRpY3RlZCBZIFByZWRpY3RlZCBNZWRpYW4gRmVtYWxlIEluY29tZSBHaXZlbiBYDQoNCi0gICBYMSBpcyB0aGUgU2NhbGVkIFRyYW5zZm9ybWF0aW9uIG9mIFllYXIgTnVtYmVyIHN0YXJ0aW5nIHdpdGggMTk2NyBhcyAxDQoNCi0gICBYMiBpcyB0aGUgU2NhbGVkIFRyYW5zZm9ybWF0aW9uIG9mIEluZmxhdGlvbiBmb3IgZWFjaCB5ZWFyXA0KICAgIFwNCg0KKioqRGlhZ25vc3RpYyBwbG90cyAzOioqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcGFyKG1mcm93ID0gYygyLDIpKQ0KDQpwbG90KFJlZy5Nb2RlbDMpDQoNCnBhcihtZnJvdyA9IGMoMSwxKSkNCmBgYA0KDQpGaWd1cmUgMS40OiBEaWFnbm9zdGljIHBsb3RzIGZvciBvdXIgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwgMzogV2l0aCBvdXIgWSB2YXJpYWJsZSBlcXVhbCB0byBNZWRpYW4gRmVtYWxlIEVhcm5pbmdzIGFuZCBYMSBlcXVhbCB0byBUaW1lIGluIFllYXJzLiBBbiBhZGRpdGlvbmFsIFByZWRpY3RvciAoWDIpIHZhcmlhYmxlIGhhcyBiZWVuIGFkZGVkIHRvIG91ciBtb2RlbCwgaW5mbGF0aW9uLiBNYWtpbmcgb3VyIG1vZGVsIG11bHRpbGluZWFyLiBUaGUgcGxvdCBpcyBkb25lIHRvIGNoZWNrIGZvciB0aGUgYXNzdW1wdGlvbnMgb2YgaG9tb3NjZWRhc3RpY2l0eSBhbmQgbm9ybWFsaXR5IG9mIHJlc2lkdWFscy4NCg0KVGhlIFJlc2lkdWFscyB2cyBmaXR0ZWQgYWdhaW4gc2hvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBiZWZvcmUsIHlldCBhZ2FpbiBpdCBjb3VsZCBiZSBjb25zaWRlcmVkIGhvbW9zY2VkYXN0aWMsIG1lYW5pbmcgdGhlcmUgaGFzIG5vdCBiZWVuIGltcHJvdmVtZW50cyBvbiBob21vc2NlZGFzdGljaXR5IHdoZW4gYWRkaW5nIHRoZSB2YXJpYWJsZSBvZiBpbmZsYXRpb24gdG8gb3VyIG1vZGVsLiBUaGUgUVEgUGxvdCBzaG93cyB0aGF0IHRoZSByZXNpZHVhbHMgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLg0KDQpTaW5jZSB0aGUgc2FtZSBwYXR0ZXJuIGhhcyBiZWVuIHZpc2libGUgdGhlIHRoaXJkIHRpbWUsIHdlIHdpbGwgZGV0ZXJtaW5lIHdoaWNoIG1vZGVsIHRvIHVzZSBieSBjb21wYXJpbmcgdGhlIE11bHRpcGxlIFIgc3F1YXJlZCBhbmQgQWRqdXN0ZWQgUiBzcXVhcmVkIHZhbHVlcy5cDQpcDQoNCioqKlIgU3F1YXJlZCBWYWx1ZXMqKioNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCnN1bW1hcnkoUmVnLk1vZGVsMSkkci5zcXVhcmVkDQpzdW1tYXJ5KFJlZy5Nb2RlbDEpJGFkai5yLnNxdWFyZWQNCg0KTW9kZWwxclNxdWFyZWQ8LSBjYmluZC5kYXRhLmZyYW1lKHN1bW1hcnkoUmVnLk1vZGVsMSkkci5zcXVhcmVkLCBzdW1tYXJ5KFJlZy5Nb2RlbDEpJGFkai5yLnNxdWFyZWQpDQoNCm5hbWVzKE1vZGVsMXJTcXVhcmVkKSA8LSBjKCJNdWx0aXBsZVJeMiIsICJBZGp1c3RlZFJeMiIpDQoNCiMjDQoNCk1vZGVsMnJTcXVhcmVkPC0gY2JpbmQuZGF0YS5mcmFtZShzdW1tYXJ5KFJlZy5Nb2RlbDIpJHIuc3F1YXJlZCwgc3VtbWFyeShSZWcuTW9kZWwyKSRhZGouci5zcXVhcmVkKQ0KDQpuYW1lcyhNb2RlbDJyU3F1YXJlZCkgPC0gYygiTXVsdGlwbGVSXjIiLCAiQWRqdXN0ZWRSXjIiKQ0KDQojIw0KDQpNb2RlbDNyU3F1YXJlZDwtIGNiaW5kLmRhdGEuZnJhbWUoc3VtbWFyeShSZWcuTW9kZWwzKSRyLnNxdWFyZWQsIHN1bW1hcnkoUmVnLk1vZGVsMykkYWRqLnIuc3F1YXJlZCkNCg0KbmFtZXMoTW9kZWwzclNxdWFyZWQpIDwtIGMoIk11bHRpcGxlUl4yIiwgIkFkanVzdGVkUl4yIikNCg0KIyMNCg0KUlNxdWFyZWRUYWJsZSA8LXJiaW5kKE1vZGVsMXJTcXVhcmVkLCBNb2RlbDJyU3F1YXJlZCwgTW9kZWwzclNxdWFyZWQpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCmthYmxlKHQoUlNxdWFyZWRUYWJsZSksIGNhcHRpb24gPSAiVGFibGUgMS41OiBDb21wYXJpbmcgdGhlIE11bHRpcGxlIFIgU3FhdXJlZCBhbmQgQWRqdXN0ZWQgUiBTcXVhcmVkIG9mIE1vZGVsIDEgYW5kIDIgdG8gZGV0ZXJtaW5lIHdoY2loIGlzIGJlc3QgZml0IGZvciBvdXIgZGF0YS4iLCBjb2wubmFtZXMgPSBjKCJNb2RlbCAxIiwgIk1vZGVsIDIiLCAiTW9kZWwgMyIpLCAgdGFibGUuYXR0ciA9ICJzdHlsZT0nd2lkdGg6ODAlOyciKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIikgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBmb250X3NpemUgPSAxNSkNCmBgYA0KDQpNdWx0aXBsZSBSIHNxdWFyZWQgaXMgdXNlZCB0byBkZXRlcm1pbmUgaG93IG11Y2ggdmFyaWFuY2UgaW4gWSBjYW4gYmUgZGV0ZXJtaW5lZCBieSBYLiBBZGp1c3RlZCBSIHNxdWFyZWQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIHRha2VzIGludG8gYWNjb3VudCB0aGUgbnVtYmVyIG9mIHByZWRpY3RvcnMgaW4gdGhlIG1vZGVsLg0KDQpUaGUgUiBzcXVhcmVkIHZhbHVlcyBhcmUgaGlnaGVzdCBpbiBNb2RlbCAxIGFuZCAzLiBXaGVuIGFkZGluZyBJbmZsYXRpb24gdG8gTW9kZWwgMSAoTW9kZWwgMyksIHdlIGdldCBhbiBpbmNyZWFzZSBpbiBib3RoIHZhbHVlcy4NCg0KVG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugd2lsbCB1c2UgdGhpcyBleHRyYSBwcmVkaWN0b3IgaW4gb3VyIG1vZGVsIG9yIG5vdCB3ZSB3aWxsIGNvbmR1Y3QgYW4gQU5PVkEuXA0KXA0KDQoqKipBTk9WQSoqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KYW5vdmEoUmVnLk1vZGVsMSwgUmVnLk1vZGVsMykNCmBgYA0KDQpUaGUgcC12YWx1ZSBvZiAwLjI1MzMgaXMgZ3JlYXRlciB0aGFuIDAuMDUgb3VyIGxldmVsIG9mIHNpZ25pZmljYW5jZSBhbmQgd2UgY2FuIGRldGVybWluZSB0aGF0IHRoZSB2YXJpYW5jZSBvZiB0aGUgdHdvIG1vZGVscyBpcyBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuDQoNClRoZXJlZm9yZSwgd2Ugd2lsbCBjb25kdWN0IG91ciBhbmFseXNpcyB3aXRoIG91ciBsaW5lYXIgcmVncmVzc2lvbiBNb2RlbCAxLlwNClwNCg0KIyMjIFsqKlJlc3VsdHMqKl17LnVuZGVybGluZX0NCg0KV2UgaGF2ZSBkZXRlcm1pbmVkIHRoYXQgd2Ugd2lsbCBiZSB1c2luZyBvdXIgbGluZWFyIHJlZ3Jlc3Npb24gTW9kZWwgMS4NCg0KTW9kZWwgMToNCg0KUHJlZGljdGVkIFkgPSAxNTM4My4wOCArIDQwNS42NDA1KFgpDQoNCldoZXJlOg0KDQotICAgWSBpcyBlcXVhbCB0byBNZWRpYW4gRmVtYWxlIEluY29tZQ0KDQotICAgWCBpcyBlcXVhbCB0byBZZWFyIE51bWJlciBzdGFydGluZyBhdCAxIGZvciAxOTY3IG9ud2FyZC5cDQogICAgXA0KDQojIyMjIFtSZXBvcnQ6IEYoMSw1MykgPSAxNjk5LCBQLVZhbHVlIFw8IDAuMDVdey51bmRlcmxpbmV9DQoNCmBgYHtyIGVjaG89RkFMU0V9DQpzdW1tYXJ5KFJlZy5Nb2RlbDEpDQpgYGANCg0KUmVzaWR1YWwgU3RhbmRhcmQgRXJyb3I6IDExNjINCg0KU3RhbmRhcmQgRXJyb3I6IDkuODY2DQoNCk11bHRpcGxlIFItU3F1YXJlZDogMC45Njk3IGFuZCBBZGp1c3RlZCBSLVNxdWFyZWQ6IDAuOTY5Mg0KDQpUaGUgb3V0cHV0IG9mIHRoZSBtb2RlbCBzaG93cyB1cyB0aGUgcC12YWx1ZSB0byBiZSBhIHZlcnkgc2lnbmlmaWNhbnQgdmFsdWUgbG93ZXIgdGhhbiAwLjA1LCB3aXRoIGFuIEYgc3RhdCBvZiAxNjk5IG9uIDEgYW5kIDUzIERlZ3JlZXMgb2YgRnJlZWRvbS4NCg0KQXMgd2UgYXJlIGxvb2tpbmcgYXQgd2hldGhlciB0aGVyZSBoYXMgYmVlbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGZyb20gMTk2NyAtIDIwMjEgdGhpcyBhIGlzIGEgb25lIHRhaWxlZCB0ZXN0LlwNClwNCg0KKioqUC1WYWx1ZSBmb3IgdGhpcyB0ZXN0IGlzIGFzIGZvbGxvd3M6KioqDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojUCAtIFZhbHVlIC0gVXBwZXIgVGFpbCB0ZXN0DQoNCnBfdmFsdWUgPC0gcHQocSA9IDQxLjIyLCBkZiA9IDUzLCBsb3dlci50YWlsPUZBTFNFKQ0KDQpwX3ZhbHVlDQpgYGANCg0KTWVhbmluZyB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgb24gYW55IG9uZSB0ZXN0IG9mIHRoZSBOdWxsIEh5cG90aGVzaXMgd2UgY2FuIHNheSB0aGF0IHRoZXJlIGlzIGEgbGVzcyB0aGFuIDUlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHJlc3VsdHMgd2lsbCBiZSBkdWUgdG8gY2hhbmNlIGFsb25lLiBUaGVyZWZvcmUgd2UgY2FuIHJlamVjdCB0aGUgTnVsbCBIeXBvdGhlc2lzIGFuZCBkZXRlcm1pbmUgdGhhdCB0aGUgUmVzZWFyY2ggSHlwb3RoZXNpcyBpcyBtb3JlIGF0dHJhY3RpdmUuXA0KXA0KDQojIyMgWyoqRGlzY3Vzc2lvbioqXXsudW5kZXJsaW5lfQ0KDQpBcyB3ZSBoYXZlIHJlamVjdGVkIHRoZSBOdWxsIEh5cG90aGVzaXMsIHdlIGNhbiBzYXkgdGhhdCB0aGVyZSBoYXMgYmVlbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGluIHRoZSBVUyBmcm9tIDE5NjcgLSAyMDIxLg0KDQpXaXRoIG91ciBuZXcgZm9ybXVsYSAoUHJlZGljdGVkIFkgPSAxNTM4My4wOCArIDQwNS42NDA1KFgpKSB3ZSBjYW4gYWxzbyBwcmVkaWN0IHRoZSB2YWx1ZSBvZiBZIGlmIHdlIGtub3cgdGhlIHZhbHVlIG9mIFguIEFzIHdlIGhhdmUgdXNlZCBZZWFyIE51bWJlciBhcyBhIGNvdW50IHN0YXJ0aW5nIGZyb20gMTk2NywgdG8gcHJlZGljdCBNZWRpYW4gRmVtYWxlIEluY29tZSBpbiB0aGUgVVMgZm9yIDIwMjQsIHdlIHdvdWxkIHNpbXBseSBoYXZlIHRvIHJlcGxhY2UgWCB3aXRoIDU3IChmb3IgMjAyNCkuXA0KXA0KDQojIyMjIFtWaXN1YWxpemF0aW9uOl17LnVuZGVybGluZX0NCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQbG90dGluZyBSZXNpZHVhbHMNCg0KRmVtYWxlRWFybmluZ3MkcHJlZGljdGVkIDwtIHByZWRpY3QoUmVnLk1vZGVsMSkNCg0KRmVtYWxlRWFybmluZ3MkcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhSZWcuTW9kZWwxKQ0KDQpnZ3Bsb3QoRmVtYWxlRWFybmluZ3MsIGFlcyh4ID0gWWVhciwgeSA9IEZlbWFsZS5FYXJuaW5ncykpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCBjb2xvciA9ICJibHVlIikgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFicyhyZXNpZHVhbHMpLCBzaXplID0gYWJzKHJlc2lkdWFscykpKSArDQogIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsNCiAgZ3VpZGVzKGNvbG9yID0gRiwgc2l6ZSA9IEYpICsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4ZW5kID0gWWVhciwgeWVuZCA9IHByZWRpY3RlZCksIGFscGhhID0gLjIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCAgdmp1c3QgPSAtNCwgaGp1c3QgPSAwLjQzKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgdmp1c3QgPSA2LCBoanVzdCA9IDAuNiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCB2anVzdCA9IDYpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwgImNtIikpICsNCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24odW5kZXJsaW5lKCJNZWRpYW4gRmVtYWxlIEVhcm5pbmdzICgkKSBpbiB0aGUgVVMgZnJvbSAxOTY3LTIwMjEiKSkpICsNCiAgeWxhYigiTWVkaWFuIEZlbWFsZSBFYXJuaW5ncyAoJCkiKSArDQogIHhsYWIoIlRpbWUgaW4gWWVhcnMiKQ0KI0ZpZ3VyZSAxLjI6IE1lZGlhbiBGZW1hbGUgRWFybmluZ3MgcGxvdHRlZCBhZ2FpbnN0IHRpbWUgaW4gWWVhcnMsIHdpdGggbGluZSBvZiBiZXN0IGZpdCBhbmQgUmVzaWR1YWxzIHBsb3R0ZWQgdG8gdGhlIHByZWRpY3RlZCB2YWx1ZXMuDQpgYGANCg0KRmlndXJlIDEuNTogTWVkaWFuIEZlbWFsZSBFYXJuaW5ncyBwbG90dGVkIGFnYWluc3QgdGltZSBpbiBZZWFycywgd2l0aCBsaW5lIG9mIGJlc3QgZml0IGFuZCBSZXNpZHVhbHMgcGxvdHRlZCB0byB0aGUgcHJlZGljdGVkIHZhbHVlcy4gV2l0aCBoaWdoZXIgcmVzaWR1YWwgdmFsdWVzIHNob3duIHdpdGggcmVkIGFuZCBhIGxhcmdlciBjaXJjbGUgYW5kIHRoZSBzbWFsbGVyIHZhbHVlcyBzaG93biB3aXRoIGEgc21hbGxlciBjaXJjbGUgYW5kIGJsdWUuXA0KXA0KDQpUaGUgTXVsdGlwbGUgUiBzcXVhcmVkIHZhbHVlIG9mIDAuOTY5NyBmb3IgdGhlIHJlZ3Jlc3Npb24gTW9kZWwgMSBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJlZGljdG9yIFggKFRpbWUgaW4gWWVhcnMpIGV4cGxhaW5zIDk3JSBvZiB0aGUgdmFyaWF0aW9uIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGluIHRoZSBVUy4gVGhlIEFkanVzdGVkIFIgc3F1YXJlZCB2YWx1ZSBwcm92aWRlcyBhIG1vcmUgY29uc2VydmF0aXZlIHZhbHVlIGJ1dCBzdGlsbCBpbmRpY2F0ZXMgYSBzaW1pbGFyIHJlc3VsdCBvZiAwLjk2OTEuDQoNClRoZSBSZXNpZHVhbCBTdGFuZGFyZCBFcnJvciBvZiAxMTYyIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSA5NSUgdGhlIHByZWRpY3RlZCB2YWx1ZSB3aWxsIGZhbGwgYmV0d2VlbiB0aGUgbWVhbiBvZiBhbGwgTWVkaWFuIEZlbWFsZSBJbmNvbWUgYW5kIDExNjINCg0KVGhlIFN0ZC5FcnJvciDOsjEgb2YgOS44NjYgc2hvd3MgdGhlIHByZWNpc2lvbiBvZiB0aGUgc2xvcGUuIFRoZSBzbWFsbCB2YWx1ZSBpbmRpY2F0ZXMgbGVzcyB2YXJpYWJpbGl0eSBpbiB0aGUgc2xvcGUgY29lZmZpY2llbnQgZm9yIHRoaXMgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCkFzIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGF0IE1lZGlhbiBGZW1hbGUgSW5jb21lIGhhcyBzaWduaWZpY2FudGx5IGluY3JlYXNlZCBvdmVyIHRoZSB5ZWFycyBpbiB0aGUgVVMgZnJvbSAxOTY3LTIwMjEsIHdlIGNhbiBzYXkgdGhhdCB0aGluZ3MgYXJlIGdvaW5nIGluIHRoZSByaWdodCBkaXJlY3Rpb24gYXMgY29tcGFyZWQgdG8gaG93IHRoZXkgd2VyZSBpbiB0aGUgbGF0ZSAxODAwcy4gT25lIGNhbiBzYXkgdGhhdCBmcm9tIHRoaXMgYW5hbHlzaXMgaGUgc3RhbmRhcmQgb2YgbGl2aW5nIGhhcyBpbmNyZWFzZWQgZm9yIHdvbWVuIGluIHRoZSBVUyBvdmVyIHRoZXNlIHllYXJzLg0KDQpIb3dldmVyIHRoaXMgc3R1ZHkgZG9lcyBub3QgYWNjb3VudCBmb3IgaW5mbGF0aW9uLCBhcyB0aGlzIHdhcyBkZXRlcm1pbmVkIHRvIG5vdCBiZSByZWxldmFudCBlbm91Z2ggZm9yIG91ciByZWdyZXNzaW9uIG1vZGVsIGR1ZSB0byBvdXRwdXQgb2Ygb3VyIGFub3ZhIHRlc3QuIFVuZW1wbG95bWVudCwgYW5kIG90aGVyIHNvY2lvZWNvbm9taWMgZmFjdG9ycyBoYXZlIGFsc28gbm90IGJlZW4gYWNjb3VudGVkIGZvci4NCg0KVGhpcyBzdHVkeSBoYXMgb25seSBhbmFseXNlZCB0aGUgdG90YWwgd29ya2luZyBwb3B1bGF0aW9uLCBzbyB0byBhbmFseXNlIHRoZSBzdGFuZGFyZCBvZiBsaXZpbmcgZm9yIHRob3NlIHdpdGhvdXQgd29yayBjb3VsZCBhbHNvIGJlIGFuIGludGVyZXN0aW5nIHRvcGljLg0KDQpGdXJ0aGVyIGFuYWx5c2lzIGFuZCByZXNlYXJjaCBzaG91bGQgYmUgY29uZHVjdGVkIHRvIGdldCBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyBlcXVhbGl0eSBpcyBldm9sdmluZyBpbiBzb2NpZXR5IGFuZCB0aGUgZWZmZWN0IGlzIGhhcyBvbiBGZW1hbGUgcXVhbGl0eSBvZiBsaWZlLiBOb3Qgc2ltcGx5IHRocm91Z2ggdGhlaXIgZWNvbm9taWNhbCBnYWluIGJ1dCBvdGhlciBmYWN0b3JzIHN1Y2ggYXMgZWR1Y2F0aW9uLCBsaWZlIGV4cGVjdGFuY3kgZXRjLlwNClwNClwNClwNClwNClwNClwNClwNCg0KIyMjIFsqKlBhcnQgMiAtIEdlbmRlciBhbmQgSW5jb21lIGluIHRoZSBVUyBmcm9tIDE5NjcgLSAyMDIxLioqXXsudW5kZXJsaW5lfQ0KDQojIyMgWyoqSW50cm9kdWN0aW9uKipdey51bmRlcmxpbmV9DQoNCkZlbWluaXNtIGNhbiBiZSBkZWZpbmVkIGFzIHRoZSBhZHZvY2FjeSBvZiBXb21hbidzIHJpZ2h0cyBvbiB0aGUgYmFzaXMgb2YgZ2VuZGVyIGVxdWFsaXR5IChGdXR1cmUgTGVhcm4sIDIwMjEpLiBUbyBmdXJ0aGVyIHVuZGVyc3RhbmQgdGhlIHBvc2l0aXZlIGltcGFjdCBmZW1pbmlzbSBoYXMgaGFkIG9uIHdvbWVucyByaWdodHMgYW5kIG9uIHNvY2lldHkgaW4gdGhlIFVTIGZyb20gMTk2Ny0yMDIxLCB0aGUgZGlmZmVyZW5jZSBvZiBtZWRpYW4gaW5jb21lcyBieSBnZW5kZXIgd2lsbCBiZSBhbiBpbnRlcmVzdGluZyB0b3BpYyB0byBjb3Zlci4NCg0KRnJvbSBQYXJ0IDEgb2YgdGhpcyBzdHVkeSB3ZSByZXZlYWxlZCB0aGF0IHRoZXJlIGhhZCBiZWVuIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gRmVtYWxlIE1lZGlhbiBJbmNvbWUgaW4gdGhlIFVTIGZyb20gMTk2Ny0yMDIxLiBUaGlzIGlzIGEgc3RlcCBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLCBzaG93aW5nIHRoYXQgd29tZW4gZmlnaHRpbmcgZm9yIHRoZWlyIHJpZ2h0cyBoYXMgbm90IGdvbmUgdW5ub3RpY2VkIG92ZXIgdGhlIHllYXJzLiBZZXQsIGxvb2tpbmcgZGVlcGVyIGludG8gdGhlIGVxdWFsaXR5IGJldHdlZW4gZ2VuZGVycy4gSG93IGRvZXMgdGhpcyBmaWd1cmUgY29tcGFyZSB0byB3aGF0IE1lbiBoYWQgZWFybnQgZHVyaW5nIHRoZSBzYW1lIHRpbWUgcGVyaW9kPw0KDQpJbiAxOTYzLCB0aGUgRXF1YWwgUGF5IEFjdCB3YXMgcHV0IGluIHBsYWNlLCB3aGljaCB3YXMgc2V0IG91dCB0byBwcm90ZWN0IGFnYWluc3Qgd2FnZSBkaXNjcmltaW5hdGlvbiBiYXNlZCBvbiBzZXggKERPTCwgMjAyNCkuIFdpdGggdGhpcyBhY3QgaW4gcGxhY2UsIHdvbWVuLCBieSBsYXcgc2hvdWxkIGJlIHBhaWQgdGhlIHNhbWUgYXMgbWVuIGZvciB0aGUgc2FtZSB3b3JrLiBJdCBpcyBzdGF0ZWQgYnkgdGhlIFVTIERlcGFydG1lbnQgb2YgTGFib3VyIHdlYnNpdGUgKDIwMjQpIHRoYXQgZW1wbG95ZXJzIG11c3QgcmFpc2Ugd2FnZXMgdG8gZXF1YWxpemUgcGF5IGJ1dCBtYXkgbm90IHJlZHVjZSB0aGUgd2FnZXMgb2Ygb3RoZXIgaW5kaXZpZHVhbHMuIE1lYW5pbmcgdHdvIHBlb3BsZSB3b3JraW5nIHRoZSBzYW1lIGpvYiBzaG91bGQgYmUgcGFpZCB0aGUgaGlnaGVyIGFtb3VudCBhbmQgbm90IHRoZSBsb3dlci4NCg0KUGFydCB0d28gb2YgdGhpcyBzdHVkeSBpcyB0aGVyZWZvcmUgc2V0IG91dCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gTWFsZSBhbmQgRmVtYWxlIE1lZGlhbiBJbmNvbWUgZnJvbSB0aGUgeWVhcnMgb2YgMTk2NyAtIDIwMjEuXA0KXA0KDQpUaGVyZWZvcmUsIHRoZSByZXNlYXJjaCBxdWVzdGlvbiB0byBiZSBhbnN3ZXJlZCBpbiB0aGlzIHN0dWR5IGlzIGFzIGZvbGxvd3M6DQoNCipJcyB0aGVyZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gTWVkaWFuIE1hbGUgYW5kIEZlbWFsZSBJbmNvbWUgZnJvbSAxOTY3IC0gMjAyMT8qXA0KXA0KDQpJZiAqdGhlcmUgaXMqIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgTWVkaWFuIEluY29tZSBieSBHZW5kZXIgZnJvbSAxOTY3IC0gMjAyMSBpbiB0aGUgVVMgYW5kICptZW4gYXJlIGVhcm5pbmcgbW9yZSosIHRoZW4gd2UgY2FuIGRldGVybWluZSB0aGF0ICp0aGVyZSBpcyogYSBwYXkgZ2FwIGJldHdlZW4gdGhlIHR3byBnZW5kZXJzIGR1cmluZyB0aGlzIHRpbWUgcGVyaW9kLg0KDQpTaW5jZSB0aGUgRXF1YWwgUGF5IEFjdCB3YXMgcHV0IGludG8gcGxhY2UgYmVmb3JlIHRoZSB0aW1lIHBlcmlvZCB0aGF0IHRoZSBkYXRhIHdhcyByZWNvcmRlZCAocHV0IGludG8gcGxhY2UgaW4gMTk2MykuIFRoZSByZWFzb24gZm9yIGEgcGF5IGdhcCB3b3VsZCB0aGVyZWZvcmUgbm90IGJlIGR1ZSB0byB0aGUgbGF3IGl0c2VsZiBidXQgcmF0aGVyIG90aGVyIG91dHNpZGUgZmFjdG9ycyBhdCBwbGF5IHdoaWNoIGhhdmUgaGFkIGEgbmVnYXRpdmUgZWZmZWN0IG9uIHRoZSBNZWRpYW4gSW5jb21lIG9mIEZlbWFsZXMuDQoNCklmICp0aGVyZSBpcyBub3QqIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgTWVkaWFuIEluY29tZSBiZXR3ZWVuIHRoZSB0d28gR2VuZGVycyBvciBpZiAqdGhlcmUgaXMqIGJ1dCBpdCBzaG93cyB0aGF0ICp3b21lbiBhcmUgZWFybmluZyBtb3JlLCogdGhlbiB3ZSBjYW4gc2F5IHRoYXQgdGhlIEVxdWFsIFBheSBBY3Qgb2YgMTk2MyBzb2x2ZWQgdGhlIGlzc3VlcyByZWdhcmRpbmcgZXF1YWwgcGF5IGJhc2VkIG9uIHNleCBpbiB0aGUgVVMuXA0KXA0KDQojIyMjIFtULVRlc3QgZm9yIEluZGVwZW5kZW50IFNhbXBsZXNdey51bmRlcmxpbmV9DQoNClRoZSBzdGF0aXN0aWNhbCB0ZXN0IHdoaWNoIHdpbGwgYmUgdXNlZCBpbiB0aGlzIHN0dWR5IGlzIGEgdC10ZXN0IGZvciBpbmRlcGVuZGVudCBzYW1wbGVzLCBhcyB3ZSBhcmUgbG9va2luZyB0byBjb21wYXJlIHRoZSBjZW50cmFsIHRlbmRlbmNpZXMgb2YgdGhlIHR3byBpbmRlcGVuZGVudCBncm91cHMNCg0KLSAgIEdyb3VwIDE6IE1lZGlhbiBNYWxlIEluY29tZSAoXCQpIDE5NjctMjAyMQ0KDQotICAgR3JvdXAgMjogTWVkaWFuIEZlbWFsZSBJbmNvbWUgKFwkKSAxOTY3LTIwMjFcDQogICAgXA0KDQojIyMjIFtIeXBvdGhlc2lzOl17LnVuZGVybGluZX0NCg0KSW4gb3JkZXIgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24gd2UgbmVlZCB0byBzZXQgb3VyIE51bGwgYW5kIFJlc2VhcmNoIEh5cG90aGVzaXMgYW5kIGxldmVsIG9mIHNpZ25pZmljYW5jZS4NCg0KQXMgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCB0byBzZWUgaWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIHRoaXMgd2lsbCBiZSBhIHR3byB0YWlsZWQgdGVzdC4NCg0KTnVsbCBIeXBvdGhlc2lzOg0KDQpIMDogRmVtYWxlIE1lZGlhbiBJbmNvbWUgVVMgMTk2Ny0yMDIxIChDZW50cmFsIFRlbmRlbmN5KSA9IEZlbWFsZSBNZWRpYW4gSW5jb21lIFVTIDE5NjctMjAyMSAoQ2VudHJhbCBUZW5kZW5jeSkNCg0KUmVzZWFyY2ggSHlwb3RoZXNpczoNCg0KSDE6IEZlbWFsZSBNZWRpYW4gSW5jb21lIFVTIDE5NjctMjAyMSAoQ2VudHJhbCBUZW5kZW5jeSkg4omgIE1hbGUgTWVkaWFuIEluY29tZSBVcyAxOTY3LTIwMjEgKENlbnRyYWwgVGVuZGVuY3kpDQoNCkZvciB0aGlzIHN0dWR5IHdlIHNldCBhIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAwLjA1LCB3aGljaCBtZWFucyB3ZSBhcmUgd2lsbGluZyB0byBzYXkgdGhhdCB0aGUgdGhlcmUgaXMgYSA1JSBjaGFuY2UgdGhhdCB0aGUgcmVzdWx0cyB3aWxsIG9jY3VyIGR1ZSB0byBjaGFuY2UgYWxvbmUuIE9ubHkgd2hlbiBvdXIgcC12YWx1ZSBpcyBsb3dlciB0aGFuIG91ciBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgMC4wNSBjYW4gd2UgcmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMgYW5kIGRldGVybWluZSB0aGF0IHRoZSBSZXNlYXJjaCBIeXBvdGhlc2lzIGlzIG1vcmUgYXR0cmFjdGl2ZS5cDQpcDQoNCiMjIyBbKipNZXRob2QqKl17LnVuZGVybGluZX0NCg0KVG8gc3RhcnQgb3VyIGFuYWx5c2lzIHRoZSByZWxldmFudCBwYWNrYWdlcyBhcmUgbG9hZGVkIGludG8gUiBTdHVkaW8uDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQYWNrYWdlcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShSY21kcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJzdGF0aXgpDQpgYGANCg0KVGhlbiB0aGUgZGF0YSBpcyBzb3VyY2VkIGFuZCBkb3dubG9hZGVkIGZyb20gd3d3LmNlbnN1cy5nb3YuIFRhYmxlIFAtOC4gQWdlLS1BbGwgUGVvcGxlLCBieSBNZWRpYW4gSW5jb21lIGFuZCBTZXg6IDE5NDcgdG8gMjAyMi4gVGhlIGRhdGEgdXNlZCBpbiB0aGlzIHN0dWR5IGFyZSBpbiAyMDIyIGRvbGxhcnMsIHNvIGluZmxhdGlvbiBpcyBhY2NvdW50ZWQgZm9yIGFuZCB0aGUgdGFibGUgdXNlZCBvdXQgb2YgdGhlIG11bHRpcGxlIGF2YWlsYWJsZSBpbiB0aGlzIGRhdGEgc2V0IChQLTgpIGlzIGZvciBhbGwgcGVvcGxlIDE1IHllYXJzIGFuZCBvbGRlci4NCg0KVGhlIGRhdGEgaXMgdGhlbiBsb2FkZWQgYW5kIHRyYW5zZm9ybWVkIGludG8gZXhjZWwsIG9ubHkga2VlcGluZyB0aGUgbmVjZXNzYXJ5IHZhbHVlcyBhbmQgY29sdW1ucyBhbG9uZyB3aXRoIHRoZSB2YWx1ZXMgZm9yIGVhY2ggeWVhci4gQXMgYmVmb3JlLCByb3dzIGZvciAyMDE3IGFuZCAyMDEzIGhhdmUgYmVlbiByZXBlYXRlZCBpbiB0aGUgZGF0YSBzZXQgZG93bmxvYWRlZCBmcm9tIFVTIENlbnN1cywgc28gd2hlbiBpbXBvcnRlZCBpbnRvIGV4Y2VsIEkgaGF2ZSBjYWxjdWxhdGVkIHRoZSBhdmVyYWdlIG9mIHRoZXNlIHJvd3MgaW5zdGVhZCBvZiBhbGxvd2luZyB0d28gaW5zdGFuY2VzIGZvciB0aGUgc2FtZSB5ZWFyLlwNClwNCg0KIyMjIyBbU3VtbWFyeSBvZiB0aGUgRGF0YTpdey51bmRlcmxpbmV9DQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojSW1wb3J0DQpNYWxlRmVtYWxlRWFybmluZ3MgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2VkcmVuL09uZURyaXZlL0Rlc2t0b3AvRGF0YSBBbmFseXNpcy9SIFdvcmtpbmcgRGlyZWN0b3J5L0ZpbmFsIFByb2plY3QgQXNzaWdubWVudC9EYXRhc2V0cy9EYXRhU2V0cy9NRkVhcm5pbmdzLmNzdiIpDQoNCiNDbGVhbiBVcA0KbmFtZXMoTWFsZUZlbWFsZUVhcm5pbmdzKSA8LSBjKCJZZWFyIiwgIkdlbmRlciIsICJNZWRpYW4uSW5jb21lIikNCg0KI0luaXRpYWwgTG9vayBhdCBvdXIgZGF0YQ0KaGVhZChNYWxlRmVtYWxlRWFybmluZ3MpDQoNCnRhaWwoTWFsZUZlbWFsZUVhcm5pbmdzKQ0KDQpUYWJsZUVhcm5pbmdzMiA8LSByYmluZChoZWFkKE1hbGVGZW1hbGVFYXJuaW5ncyksICIuLi4iLCB0YWlsKE1hbGVGZW1hbGVFYXJuaW5ncykpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0Ka2FibGUoVGFibGVFYXJuaW5nczIsDQogICAgICBjYXB0aW9uID0gIlRhYmxlIDIuMTogSW5pdGlhbCBsb29rIGF0IGhvdyBvdXIgZGF0YSBpcyBsYWlkIG91dC4gUHJvdmlkaW5nIHRoZSBNZWRpYW4gSW5jb21lIGZvciBib3RoIEdlbmRlcnMgMTUgWWVhcnMgYW5kIE92ZXIgaW4gdGhlIFVTIGZyb20gMTk2NyAtIDIwMjEuIFRoZSBJbmNvbWUgaW4gdGhpcyBkYXRhc2V0IGFjY291bnRzIGZvciBpbmZsYXRpb24gYW5kIGlzIGluIDIwMjIgRG9sbGFycyAoJCkuIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KVGhlIGRhdGEgaXMgbGFpZCBvdXQgd2l0aCB0aGUgZGlmZmVyZW50IGdlbmRlcnMgaW4gb25lIGNvbHVtbnMgYW5kIHRoZSAiTWVkaWFuLkluY29tZSIgaW4gaXRzIG93biBjb2x1bW4uIFRoaXMgYmVpbmcgdGhlIGNhc2UgdGhlIFllYXIgdmFsdWVzIHdpbGwgdGhlcmVmb3JlIGJlIHJlcGVhdGVkIGdvaW5nIGZyb20gMjAyMS0xOTY3IHR3aWNlIHRvIG1hdGNoIHRoZSB0d28gZ2VuZGVycywgbWFraW5nIG91ciBuID0gMTEwLCBvciA1NSBmb3IgZWFjaC4gRG91YmxlIHdoYXQgaXMgd2FzIGluIHRoZSBwcmV2aW91cyBzdHVkeS4gRGVncmVlcyBvZiBmcmVlZG9tIGZvciB0aGlzIHN0dWR5IGlzIHRoZXJlZm9yZSwgKG4xICsgbjIpIC0gMiA9IDEwOC5cDQpcDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojU3VtbWFyeSBTdGF0aXN0aWNzIGJ5IEdlbmRlcg0KDQpCeUdlbmRlciA8LWdyb3VwX2J5KE1hbGVGZW1hbGVFYXJuaW5ncywgR2VuZGVyKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGNvdW50ID0gbigpLA0KICAgIG1lZGlhbiA9IG1lZGlhbihNZWRpYW4uSW5jb21lLCBuYS5ybSA9IFQpLA0KICAgIElRUiA9IElRUihNZWRpYW4uSW5jb21lLCBuYS5ybSA9IFQpDQogICkNCg0Ka2FibGUoQnlHZW5kZXIsY2FwdGlvbiA9ICAiVGFibGUgMi4yOiBTdW1tYXJ5IFN0YXRpc3RpY3MgZm9yIG91ciBkYXRhIHJlZ2FyZGluZyBNZWRpYW4gSW5jb21lIGZvciB0aGUgc2VwZXJhdGUgR2VuZGVycyAxNSBZZWFycyBhbmQgT3ZlciBpbiB0aGUgVVMgZnJvbSAxOTY3LTIwMjEuIFRoZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIHllYXJzIGluIHRoZSBzdHVkeSB3aGljaCBpcyBvdXIgbiwgbWVkaWFuIG9mIHRoZSBtZWRpYW4gaW5jb21lIGlzIHByb3ZpZGVkIGZvciBlYWNoLCBhbmQgdGhlIGludGVycXVhcnRpbGUgcmFuZ2UuIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KVGhlIFN1bW1hcnkgU3RhdGlzdGljcyBoZXJlIGNvbmZpcm0gdGhlIG4xIGFuZCBuMiA9IDU1LiBUaGVyZWZvcmUgb3VyIERGIGlzIDEwOC4gVGhlIE1lZGlhbiBvZiBNZWRpYW4gSW5jb21lIGlzIHNlZW4gdG8gYmUgYSBsb3QgaGlnaGVyIGZvciBNYWxlcyB0aGFuIEZlbWFsZXMgaW4gdGhlIFVTLCBpdCB3b3JrcyBvdXQgdG8gYmUgb3ZlciBkb3VibGUuIEZvciBGZW1hbGVzIHRoZXJlIGlzIGFsc28gYSBoaWdoIEludGVycXVhcnRpbGUgUmFuZ2UgKElRUiksIHdoaWNoIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBoaWdoIHJhbmdlIHdoZXJlIG1vc3Qgb2YgdGhlIHZhbHVlcyBsaWUuIEFzIHdlIGFyZSB3b3JraW5nIHdpdGggWWVhcmx5IGRhdGEgd2UgY2FuIG9ubHkgaG9wZSB0aGF0IHRoaXMgbGFyZ2UgSW50ZXJxdWFydGlsZSByYW5nZSBpcyBkdWUgdG8gaW1wcm92ZW1lbnRzIG92ZXIgdGhlIHllYXJzIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIHdoaWNoIGhhcyBjYXVzZWQgdGhpcyBsYXJnZSBzcHJlYWQuDQoNCkluIG9yZGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBnZW5kZXJzIGlzIHNpZ25pZmljYW50IGEgVCBUZXN0IGZvciBJbmRlcGVuZGVudCBzYW1wbGVzIHdpbGwgYmUgY29uZHVjdGVkIHRvIG1lYXN1cmUgd2hldGhlciB0aGVyZSBpcyBzdGF0aXN0aWNhbCBldmlkZW5jZSB0aGF0IHRoZSBjZW50cmFsIHRlbmRlbmNpZXMgb2Ygb3VyIHR3byBncm91cHMgYXJlIHN0YXRpc3RpY2FsbHkgZGlmZmVyZW50LlwNClwNCg0KIyMjIyBbQXNzdW1wdGlvbnMgQ2hlY2s6XXsudW5kZXJsaW5lfQ0KDQpGaXJzdGx5LCB3ZSBtdXN0IGNoZWNrIHRoYXQgYWxsIHRoZSBhc3N1bXB0aW9ucyBhcmUgbWV0IGJlZm9yZSB3ZSBjYW4gY29udGludWUgd2l0aCBvdXIgYW5hbHlzaXMuIEZvciBhIFQgVGVzdCBmb3IgSW5kZXBlbmRlbnQgU2FtcGxlcywgYXMgc3RhdGVkIGJ5IEFtYW5kYSBKLiBTaGFrZXIgKDIwMjQpIHRoZSBhc3N1bXB0aW9ucyByZXF1aXJlZCB0byBjb25kdWN0IHRoZSBwYXJhbWV0cmljIHZlcnNpb24gb2YgdGhpcyB0ZXN0IGFyZSB0aGF0IHRoZSBkYXRhIGFyZSBpbmRlcGVuZGVudCAod2hpY2ggdGhleSBhcmUpLCB0aGUgZGF0YSBpcyBub3JtYWxseSBkaXN0cmlidXRlZCBhbmQgdGhhdCB0aGVyZSBhcmUgZXF1YWwgdmFyaWFuY2VzIGJldHdlZW4gZ3JvdXBzLlwNClwNCg0KKioqTm9ybWFsaXR5OioqKg0KDQpVc2luZyBhIEhpc3RvZ3JhbSwgRGVuc2l0eSBQbG90LCBRUS1QbG90IHdlIGNhbiBkZXRlcm1pbmUgd2hldGhlciB0aGUgZGF0YSBpcyBub3JtYWxseSBkaXN0cmlidXRlZCBvciBub3QuIFRoZXJlIHNob3VsZCBiZSBlcXVhbCBkaXN0cmlidXRpb24gYXJvdW5kIHRoZSBtZWFuIGZvciB0aGUgZmlyc3QgdHdvIHBsb3RzIChIaXN0b2dyYW0gYW5kIERlbnNpdHkgcGxvdCkgYW5kIHRoZSBRUS1QbG90IHNob3cgc2hvdWxkIHRoZSBkYXRhIGluIGEgc3RyYWlnaHQgbGluZS4NCg0KYGBge3IgZWNobz1GQUxTRX0NCg0KI1Bsb3RzIHRvIGNoZWNrIGZvciBub3JtYWwgZGlzdHJpYnV0aW9uLCBmb3IgYWxsIG1lZGlhbiBpbmNvbWUgZGF0YQ0KDQpwYXIobWZyb3c9YygxLDMpKQ0KDQp7d2l0aChNYWxlRmVtYWxlRWFybmluZ3MsIEhpc3QoTWVkaWFuLkluY29tZSwgc2NhbGU9InBlcmNlbnQiLCB5bGFiPSAiUGVyY2VudCIsIG1haW49ICJIaXN0b2dyYW0gZm9yIEluY29tZSIsIGJyZWFrcz0iU3R1cmdlcyIsY29sPSJsaWdodGdyYXkiKSkNCiAgYWJsaW5lKHYgPSBtZWFuKE1hbGVGZW1hbGVFYXJuaW5ncyRNZWRpYW4uSW5jb21lKSwgY29sID0gInJlZCIsIGx3ZCA9IDMpDQogIGFibGluZSh2ID0gbWVkaWFuKE1hbGVGZW1hbGVFYXJuaW5ncyRNZWRpYW4uSW5jb21lKSwgY29sID0gInllbGxvdyIsIGx3ZCA9IDMpDQogIGxlZ2VuZCgidG9wcmlnaHQiLCBjKCJNZWFuIiwgIk1lZGlhbiIpLCBjb2wgPSBjKCJyZWQiLCAieWVsbG93IiksIGx3ZCA9IDMpfQ0KDQpkZW5zaXR5UGxvdCggfiBNZWRpYW4uSW5jb21lLCBkYXRhID0gTWFsZUZlbWFsZUVhcm5pbmdzLCBtYWluID0gIkRlbnNpdHkgUGxvdCBmb3IgSW5jb21lIiwgYnc9YncuU0osIGFkanVzdD0xLCBrZXJuZWw9ZG5vcm0sIG1ldGhvZD0iYWRhcHRpdmUiKQ0KDQp3aXRoKE1hbGVGZW1hbGVFYXJuaW5ncywgcXFQbG90KE1lZGlhbi5JbmNvbWUsIGRpc3Q9Im5vcm0iLCBtYWluID0gIlFRIFBsb3QgZm9yIEluY29tZSIsIGlkPWxpc3QobWV0aG9kPSJ5Iiwgbj0yLCBsYWJlbHM9cm93bmFtZXMoTWFsZUZlbWFsZUVhcm5pbmdzKSkpKQ0KDQpwYXIobWZyb3c9YygxLDEpKQ0KDQojRmlndXJlIDIuMSAuLi5Qb3NpdGl2ZSBza2V3IGluIEhpc3RvZ3JhbSBhbmQgZGVuc2l0eSBwbG90LiANCmBgYA0KDQpGaWd1cmUgMi4xOiBIaXN0b2dyYW0sIERlbnNpdHkgUGxvdCBhbmQgUVEtUGxvdCBjb21iaW5lZCB0byBjaGVjayB0aGUgYXNzdW1wdGlvbiBvZiBub3JtYWwgZGlzdHJpYnV0aW9uIGZvciBvdXIgZGF0YSBzZXQuIFRoZSBoaXN0b2dyYW0gc2hvd3MgdGhlIG1lZGlhbiBmdXJ0aGVyIHRvIHRoZSByaWdodCB0aGFuIHRoZSBtZWFuIHdoaWNoIHN1Z2dlc3RzIGEgbmVnYXRpdmUgc2tldy4gVGhlIERlbnNpdHkgcGxvdCBhbHNvIHNob3dzIHRoZSB0aGF0IHRoZSBkYXRhIGlzIG1vcmUgY2VudGVyZWQgYXJvdW5kIHRoZSByaWdodCBoYW5kIHNpZGUgcmF0aGVyIHRoYW4gdGhlIG1lYW4sIGFnYWluIHNob3dpbmcgdGhhdCB0aGUgZGF0YSBpcyBza2V3ZWQgYW5kIG5vdCBub3JtYWxseSBkaXN0cmlidXRlZC4gVGhlIFFRLVBsb3QgZG9lcyBub3QgZm9sbG93IGEgc3RyYWlnaHQgbGluZSBhbmQgaXMgdGhlcmVmb3JlIG5vdCBzaG93aW5nIG5vcm1hbCBkaXN0cmlidXRpb24uXA0KXA0KDQoqKipTaGFwaXJvLVdpbGsgVGVzdCoqKg0KDQpMb29raW5nIGF0IHRoZSB0aHJlZSBkaWZmZXJlbnQgcGxvdHMgdmlzdWFsaXppbmcgb3VyIGRhdGEsIHdlIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGUgZGF0YSBkb2VzIG5vdCBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBPbmUgZnVydGhlciBjYW4gY2hlY2sgdGhpcyB3aXRoIHRoZSBTaGFwaXJvIFdpbGsgVGVzdCB3aGljaCBpcyBhIHRlc3Qgb2Ygbm9ybWFsaXR5LiBUaGUgTnVsbCBIeXBvdGhlc2lzIHN0YXRlcyB0aGF0IHRoZSBkYXRhIGlzIG5vdCBkaWZmZXJlbnQgKGVxdWFsIHRvKSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoZXJlZm9yZSBpZiB3ZSByZWplY3QgdGhlIE51bGwgd2UgbXVzdCBkZXRlcm1pbmUgdGhhdCB0aGUgZGF0YSBpcyBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIEZvciB0aGlzIHRlc3Qgd2Ugd2lsbCB1c2UgYSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgMC4wNS4NCg0KYGBge3IgZWNobz1GQUxTRX0NCnNoYXBpcm8udGVzdChNYWxlRmVtYWxlRWFybmluZ3MkTWVkaWFuLkluY29tZSkNCmBgYA0KDQpUaGUgb3V0cHV0IG9mIHRoaXMgdGVzdCBpcyBhIHAtdmFsdWUgaXMgZXh0cmVtZWx5IGxvdyBhbmQgXDwgMC4wNS4gVGhlcmVmb3JlLCB3ZSBtdXN0IGNvbmNsdWRlIHRoYXQgb3VyIGRhdGEgaXMgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLlwNClwNCg0KKioqRXF1YWwgVmFyaWFuY2VzOioqKg0KDQpUaGUgbmV4dCBhc3N1bXB0aW9uIGZvciB0aGUgcGFyYW1ldHJpYyB2ZXJzaW9uIG9mIHRoaXMgdGVzdCBpcyBFcXVhbCBWYXJpYW5jZXMgYmV0d2VlbiBncm91cHMuIFdlIGRvIG5vdCBuZWVkIHRvIGRvIHRoaXMgYXNzdW1wdGlvbiBjaGVjayBhcyB3ZSBhbHJlYWR5IGtub3cgdGhlIGRhdGEgaXMgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBhbmQgd2lsbCBjb250aW51ZSB3aXRoIHRoZSBub24tcGFyYW1ldHJpYyB2ZXJzaW9uIG9mIHRoZSB0ZXN0IHRoZSBNYW5uLVdoaXRuZXkgVSBUZXN0Lg0KDQpZZXQsIHdlIHdpbGwgZG8gaXQgYW55d2F5IGFzIGl0IGlzIHZlcnkgc2ltcGxlLiBVc2luZyB0aGUgTGV2ZW5lIFRlc3QgZm9yIGVxdWFsIHZhcmlhbmNlcyB0aGUgb3V0cHV0IGlzIHNpbWlsYXIsIHRoZSBOdWxsIEh5cG90aGVzaXMgZm9yIHRoaXMgdGVzdCBpcyB0aGF0IHRoZXJlIGlzIGVxdWFsIHZhcmlhbmNlcyBiZXR3ZWVuIGdyb3Vwcy4gVGhlcmVmb3JlIGEgcC12YWx1ZSBcPCAwLjA1IChvdXIgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlKSBtZWFucyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBubyBlcXVhbCB2YXJpYW5jZSBiZXR3ZWVuIHRoZSBncm91cHMgaW4gb3VyIHNhbXBsZS4NCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNMZXZlbmUgdGVzdCBmb3IgZXF1YWwgdmFyaWFuY2VzDQoNCmxldmVuZVRlc3QoTWVkaWFuLkluY29tZX5HZW5kZXIsIE1hbGVGZW1hbGVFYXJuaW5ncykNCg0KI0VxdWFsIHZhcmlhbmNlcyBub3Qgc2VlbiBoZXJlIGFzIHAtdmFsdWUgPCAwLjA1IC0gU2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YXJpYW5jZXMNCmBgYA0KDQpUaGUgcC12YWx1ZSBoZXJlIGlzIGV4dHJlbWVseSBsb3cgYW5kIFw8IDAuMDUuIFRoZXJlZm9yZSwgd2UgY2FuIGNvbmZpcm0gdGhhdCB0aGVyZSBpcyBub3QgZXF1YWwgdmFyaWFuY2VzIGJldHdlZW4gdGhlIHR3byBncm91cHMgaW4gb3VyIHNhbXBsZS5cDQpcDQoNCiMjIyMgW01hbm4tV2hpdG5leSBVIHRlc3Q6XXsudW5kZXJsaW5lfQ0KDQpUaGUgTWFubi1XaGl0bmV5IFUgdGVzdCBpcyB1c2VkIGFzIGEgbm9uLXBhcmFtZXRyaWMgdmVyc2lvbiBvZiB0aGUgVC10ZXN0IGZvciBJbmRlcGVuZGVudCBzYW1wbGVzLCBpdCBpcyBhbHNvIGtub3duIGFzIHRoZSBXaWxjb3hvbiByYW5rIHN1bSB0ZXN0LiBBcyB3ZSBkaWQgbm90IG1lZXQgdGhlIGFzc3VtcHRpb25zIG5lZWRlZCBmb3IgdGhlIHBhcmFtZXRyaWMgdmVyc2lvbiBvZiBvdXIgdGVzdCwgd2Ugd2lsbCBjb250aW51ZSB3aXRoIHRoZSBub24tcGFyYW1ldHJpYyB2ZXJzaW9uIG9mIG91ciB0ZXN0LlwNClwNCg0KIyMjIFsqKlJlc3VsdHMqKl17LnVuZGVybGluZX0NCg0KIyMjIyBbUmVwb3J0OiBXID0gMCwgUC1WYWx1ZSBcPCAwLjA1XXsudW5kZXJsaW5lfQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI0NvbnRpbnVlIHdpdGggbm9uLXBhcmFtZXRyaWMgdmVyc2lvbiBvZiB0aGUgdGVzdC4NCiNXaWxjb3hvbiB0ZXN0DQoNCndpbGNveC50ZXN0KE1lZGlhbi5JbmNvbWUgfiBHZW5kZXIsIGRhdGEgPSBNYWxlRmVtYWxlRWFybmluZ3MsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IEYpDQoNCiNQLXZhbHVlIDwgMC4wNSByZWplY3QgdGhlIG51bGwgYW5kIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBtZWRpYW4gaW5jb21lDQoNCmBgYA0KDQpUaGUgb3V0cHV0IG9mIG91ciBub24gcGFyYW1ldHJpYyB0ZXN0IGRvZXMgbm90IGluY2x1ZGUgZGVncmVlcyBvZiBmcmVlZG9tIGFzIHdlIGFyZSB3b3JraW5nIHdpdGggbWVkaWFuIHZhbHVlcyBhbmQgdGhlIHB1cnBvc2Ugb2YgdGhpcyB0ZXN0IGlzIHRvIGV2YWx1YXRlIHdoZXRoZXIgb3Igbm90IHRoZSBtZWRpYW4gb2YgdGhlIGRpZmZlcmVuY2VzIGlzIGVxdWFsIHRvIDAuDQoNClRoZSBQLVZhbHVlIGZvciB0aGlzIHRlc3QgaXMgXDwgMC4wNSwgd2hpY2ggbWVhbnMgd2UgY2FuIHJlamVjdCB0aGUgTnVsbCBIeXBvdGhlc2lzIHRoYXQgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjZW50cmFsIHRlbmRlbmNpZXMgb2YgTWVkaWFuIEluY29tZSBvZiBNYWxlIGFuZCBGZW1hbGVzIDE1IHllYXJzIGFuZCBPdmVyIGluIHRoZSBVUyBmcm9tIDE5NjcgLSAyMDIxLCBhbmQgZGV0ZXJtaW5lIHRoYXQgdGhlIFJlc2VhcmNoIEh5cG90aGVzaXMgdGhhdCB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaXMgbW9yZSBhdHRyYWN0aXZlLlwNClwNCg0KIyMjIFsqKkRpc2N1c3Npb24qKl17LnVuZGVybGluZX0NCg0KVGhlIG1lZGlhbiB2YWx1ZSBvZiB0aGUgTWVkaWFuIEluY29tZSBmb3IgMTUgWWVhcnMgYW5kIE92ZXIgaW4gdGhlIFVTIGZyb20gMTk2Ny0yMDIxIHdhcyBcJDIxLDE2MCBhbmQgXCQ0Miw1MTAgZm9yIFdvbWVuIGFuZCBNZW4gcmVzcGVjdGl2ZWx5LiBXZSBwcmV2aW91c2x5IGRldGVybWluZWQgdGhhdCB0aGlzIHdhcyBhIGxhcmdlIGRpZmZlcmVuY2UgYnV0IG5vdyB3ZSBjYW4gc2F5IHRoZSBkaWZmZXJlbmNlIGlzIHNpZ25pZmljYW50IGFzIHRoZSBQLVZhbHVlIFw8IDAuMDUgYW5kIG9uIGFueSBvbmUgdGVzdCBvZiB0aGUgTnVsbCBIeXBvdGhlc2lzIHdlIGNhbiBzYXkgdGhhdCB0aGVyZSBpcyBhIGxlc3MgdGhhbiA1JSBwcm9iYWJpbGl0eSB0aGF0IHRoZSByZXN1bHRzIHdpbGwgYmUgZHVlIHRvIGNoYW5jZSBhbG9uZS5cDQpcDQoNCiMjIyMgW1Zpc3VhbGl6YXRpb25dey51bmRlcmxpbmV9DQoNCmBgYHtyIGVjaG89RkFMU0V9DQojdmlzdWFsaXNhdGlvbg0KZ2dwbG90KGRhdGEgPSBNYWxlRmVtYWxlRWFybmluZ3MsIGFlcyh4PUdlbmRlciwgeT1NZWRpYW4uSW5jb21lLCBjb2xvciA9IEdlbmRlcikpICsNCiAgZ2VvbV9ib3hwbG90KGxpbmV3aWR0aCA9IDAuOCwgd2lkdGggPSAwLjgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwMDBGRiIsICIjRkYwMDAwIikpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCAgdmp1c3QgPSAtNSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIHZqdXN0ID0gNSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCB2anVzdCA9IDUpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwgImNtIikpICsNCiAgeGxhYigiR2VuZGVyIikgKw0KICB5bGFiKCJNZWRpYW4gSW5jb21lICgkKSIpICsNCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24odW5kZXJsaW5lKCJNZWRpYW4gSW5jb21lKCQpIGJ5IEdlbmRlciBpbiB0aGUgVVMgMTk2NyAtIDIwMjEiKSkpDQojRmlndXJlIDIuMiAuLi4NCmBgYA0KDQpGaWd1cmUgMi4yOiBCb3ggUGxvdCBmb3IgTWVkaWFuIEluY29tZSBieSBHZW5kZXIgaW4gdGhlIFVTIGJldHdlZW4gdGhyb3VnaG91dCB0aGUgeWVhcnMgb2YgMTk2Ny0yMDIxLCBmb3IgYWxsIHBlb3BsZSBhZ2VkIDE1IHllYXJzIGFuZCBPbGRlciBpbiAyMDIyIERvbGxhcnMgKEluZmxhdGlvbiBhY2NvdW50ZWQgZm9yKS4gSW50ZXJxdWFydGlsZSByYW5nZSBzaG93biBhcyB0aGUgYm94IGFuZCB0aGUgd2hpc2tlcnMgYXJlIHRoZSB0b3RhbCByYW5nZS4gV2l0aCB0aGUgbGluZSB0aHJvdWdoIHRoZSBtaWRkbGUgYXMgdGhlIG1lZGlhbi4gRmVtYWxlIHBsb3Qgc2hvd3MgYSBsYXJnZXIgaW50ZXJxdWFydGlsZSByYW5nZSwgd2hpY2ggc2hvd3MgYSBsYXJnZXIgc3ByZWFkIG9mIHZhbHVlcy4gV2hlcmUgYXMgdGhlIE1hbGUgcGxvdCBkb2VzIG5vdC5cDQpcDQoNCkNvbXBhcmluZyBib3RoIHRoZXNlIGJvdGggb2YgdGhlc2UgcGxvdHMgc2hvd3MgdGhhdCBXb21lbiBoYXZlIGhhZCBhIGxhcmdlciBpbmNyZWFzZSBvdmVyIHRoZSB5ZWFycywgd2hpY2ggaXMgdmlzdWFsaXplZCBieSB0aGUgZ3JlYXRlciBvdmVyYWxsIHJhbmdlIChtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcykuIEFsc28gdGhlIGludGVycXVhcnRpbGUgcmFuZ2UgZm9yIEZlbWFsZXMgaXMgbGFyZ2VyIHRoYW4gdGhhdCBvZiB0aGUgTWFsZXMgd2hpY2ggc2hvd3MgYSBncmVhdGVyIHNwcmVhZCBvZiB2YWx1ZXMsIHdoaWNoIGFsc28gaW5kaWNhdGUgcHJvZ3Jlc3Npb25zIG92ZXIgdGhlIHllYXJzIGFzIHRoZXJlIGlzIG1vcmUgdmFyaWFiaWxpdHkuDQoNCllldCwgdGhlIHBsb3QgZm9yIE1hbGVzIGlzIG11Y2ggbW9yZSBjbHVzdGVyZWQgdG9nZXRoZXIgc2hvd2luZyBsZXNzIGNoYW5nZSBidXQgYWxzbyBtb3JlIGNvbmNlbnRyYXRpb24gYXJvdW5kIGEgaGlnaGVyIHZhbHVlLiBUaGUgbWluaW11bSB2YWx1ZSBmb3IgTWFsZXMgaXMgYWxzbyBoaWdoZXIgdGhhbiB0aGF0IG9mIHRoZSBGZW1hbGVzIG1heGltdW0uIFNpbmNlIHdlIGFyZSBsb29raW5nIGF0IHRoaXMgZGF0YSBpbiAyMDIyIERvbGxhcnMsIHdlIHNlZSB0aGF0IEZlbWFsZSBNZWRpYW4gSW5jb21lIGlzIHlldCB0byBjYXRjaCB1cCB0byB0aGUgTWFsZXMgTWluaW11bSBJbmNvbWUgZnJvbSAxOTY3LTIwMjEuXA0KXA0KDQojIyMjIFtFZmZlY3QgU2l6ZV17LnVuZGVybGluZX0NCg0KVGhlIGVmZmVjdHMgc2l6ZSB0ZWxscyB1cyB0aGUgbWFnbml0dWRlIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBncm91cHMgd2l0aCByZWdhcmRzIHRvIG91ciB5IHZhcmlhYmxlIHdoaWNoIGlzIE1lZGlhbi5JbmNvbWUgaW4gdGhpcyBjYXNlLiBXaXRoIGFuIHIgbGVzcyB0aGFuIDAuMyB0aGVyZSBpcyBhIHNtYWxsIGVmZmVjdCwgYmV0d2VlbiAwLjMgYW5kIDAuNSBpcyBhIG1lZGl1bSBlZmZlY3QgYW5kIGdyZWF0ZXIgdGhhbiAwLjUgc2hvd3MgYSBsYXJnZSBlZmZlY3QgKERBVEF0YWIsIDIwMjQpLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI0VmZmVjdCBzaXplDQoNCndpbGNveF9lZmZzaXplKE1hbGVGZW1hbGVFYXJuaW5ncywgTWVkaWFuLkluY29tZSB+IEdlbmRlciwgcGFpcmVkID0gRikNCg0KI0xhcmdlIG1hZ25pdHVkZSwgZWZmc2l6ZSA9IDAuODYyLg0KYGBgDQoNClRoZSBlZmZlY3Qgc2l6ZSBmb3Igb3VyIHRlc3QgaXMgcj0wLjg2MiBtZWFuaW5nIHRoYXQgdGhlcmUgaXMgYSBsYXJnZSBtYWduaXR1ZGUgb2YgZWZmZWN0IHNpemUuIFdoaWNoIHNob3dzIGEgc3Vic3RhbnRpYWwgc3RyZW5ndGggb2YgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZ3JvdXBzIE1hbGUgYW5kIEZlbWFsZSBieSB0aGUgdmFyaWFibGUgTWVkaWFuIEluY29tZS4gVGhlIGRpZmZlcmVuY2Ugd2UgaGF2ZSBhbHJlYWR5IHN0YXRlZCB0byBiZSBzaWduaWZpY2FudCwgYW5kIG5vdyB0aGUgZWZmZWN0IG9mIHdoaWNoIGdlbmRlciBoYXMgb24gdGhlIGRpZmZlcmVuY2UgaW4gTWVkaWFuIEluY29tZSB3ZSBjYW4gZXhwbGFpbiB0byBiZSBvZiBhIGxhcmdlIG1hZ25pdHVkZS4NCg0KVGhlIHNpZ25pZmljYW50IGRpZmZlcmVuY2Ugb2YgTWVkaWFuIEluY29tZSBiZXR3ZWVuIHRoZSB0d28gR2VuZGVycyBjYW4gYmUgY29uY2x1ZGVkIHRvIHNob3cgdGhhdCB0aGVyZSBpcyBzdGlsbCBhIHBheSBnYXAgZXZlbiB3aXRoIHRoZSBFcXVhbCBQYXkgQWN0IGluIHBsYWNlLiBXaGljaCB3ZSB0aGVyZWZvcmUgZGV0ZXJtaW5lIHRvIGJlIGR1ZSB0byBvdGhlciBmYWN0b3JzIHJhdGhlciB0aGFuIGxhdyBvZiBlcXVhbCBwYXkgaXRzZWxmLg0KDQpPbmUgbWF5IGNvbnNpZGVyIHRoYXQsIHdvbWVuIGFyZSBsaWtlbHkgdG8gaGF2ZSBhIGxvd2VyIHJpc2sgdG9sZXJhbmNlIHRoYW4gbWVuIHdoaWNoIG1heSBjYXVzZSB0aGVtIHRvIG5vdCB0YWtlIG9uIGhpZ2hlciBwYXlpbmcgam9icy4gWWV0LCB3aXRoIHJpc2sgdGhlcmUgaXMgYWxzbyBmYWlsdXJlIGFuZCB0aGF0IHNob3VsZCBsZWFkIHRvIGdyZWF0ZXIgdmFyaWFiaWxpdHkgaW4gdGhlIG1lZGlhbiBpbmNvbWUgZm9yIG1lbi4NCg0KT3RoZXIgZmFjdG9ycyB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcmUgc2VncmVnYXRpb24gaW4gdGhlIHdvcmsgcGxhY2UgYW5kIHdvcmsgZXhwZXJpZW5jZSAoQXJhZ2FvLCAyMDIzKS4gU2luY2UsIHRoZSBpbXByb3ZlbWVudHMgcmVnYXJkaW5nIFdvbWFuJ3MgcmlnaHRzIGFyZSBub3Qgc3VwZXIgbmV3IChFcXVhbCBQYXkgQWN0IG9ubHkgaGFwcGVuZWQgNjEgeWVhcnMgYWdvIGluIHRpbWUgb2Ygd3JpdGluZyB0aGlzIHBhcGVyKSwgdGhlcmUgbWF5IHN0aWxsIGJlIHNvbWUgcHJlanVkaWNlIGluIGNlcnRhaW4gZmllbGRzIHRvd2FyZHMgd29tZW4gd2hpY2ggbWFrZSBpdCBoYXJkIGZvciB0aGVtIHRvIGZpbmQgd29yay4gTW9yZSByZXNlYXJjaCBzaG91bGQgYmUgZG9uZSB0byBhbmFseXNlIHRoaXMgdG9waWMuDQoNCkVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgaXMgYW5vdGhlciBvdXRzaWRlIGZhY3RvciB3aGljaCB3aWxsIGhhdmUgYW4gZWZmZWN0IG9uIHRoZSBwYXkgZ2FwIGJldHdlZW4gTWVuIGFuZCBXb21lbiBhcyBzdGF0ZWQgYnkgQ2Fyb2xpbmEgQXJhZ2FvICgyMDIzKS4gU29jaWFsbHktY29uc3RydWN0ZWQgbm9ybXMgdGhhdCBkZWZpbmUgdGhlIHJvbGVzIHRoYXQgTWVuIGFuZCBXb21lbiBzaG91bGQgcGxheSBpcyBhIHJlYXNvbiB3aHkgZ2lybHMgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIG91dCBvZiBzY2hvb2wgdGhhbiBib3lzIGFjcm9zcyB0aGUgd29ybGQgKFNpZGEsIDIwMTcpLiBQcmVzc3VyZXMgb2Ygc29jaWV0eSBhbmQgbGlmZSBvdXRzaWRlIG9mIHdvcmsgaGF2ZSBhbiBlZmZlY3Qgb24gYm90aCBtZW4gYW5kIHdvbWVuIGJ1dCBjb3VsZCBhbHNvIGJlIGEgcmVhc29uIHdoeSB3b21lbiBoYXZlIGEgbG93ZXIgTWVkaWFuIEluY29tZSB0aGFuIE1lbiBpbiB0aGUgVVMgZHVyaW5nIHRoZXNlIHllYXJzLg0KDQpGdXJ0aGVyIGRhdGEgY29sbGVjdGlvbiBhbmQgYW5hbHlzaXMgcmVnYXJkaW5nOyBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGZvciBib3RoIGdlbmRlcnMsIGRpZmZlcmVuY2VzIGluIHNvY2lhbCBwcmVzc3VyZXMgKGJvdGggaW4gYW5kIG91dCBvZiB3b3JrKSBieSBnZW5kZXIsIGFuZCB0aGUgZGlmZmVyZW5jZXMgaW4gcmlzayB0b2xlcmFuY2UgZm9yIGJvdGggZ2VuZGVycywgbWF5IGhlbHAgdXMgZnVydGhlciBhbnN3ZXIgdGhlICJ3aHk/IiB0byBvdXIgcGF5IGdhcCBxdWVzdGlvbi5cDQpcDQpcDQpcDQpcDQpcDQpcDQpcDQoNCiMjIyBbKipQYXJ0IDMgLSBHZW5kZXIsIEluY29tZSBhbmQgRGVncmVlcyBpbiB0aGUgVVMgZnJvbSAxOTkxIC0gMjAyMS4qKl17LnVuZGVybGluZX0NCg0KIyMjIFsqKkludHJvZHVjdGlvbioqXXsudW5kZXJsaW5lfQ0KDQpUaGUgcHJldmlvdXMgc3R1ZGllcyBpbiB0aGlzIHByb2plY3QgaGF2ZSBwcm92aWRlZCB1cyB3aXRoIG1vcmUgb2YgYW4gdW5kZXJzdGFuZGluZyBhYm91dCBGZW1pbmlzbSBhbmQgaXRzIHBvc2l0aXZlIGVmZmVjdCBvbiB0aGUgRmVtYWxlIE1lZGlhbiBJbmNvbWUgaW4gdGhlIFVTLiBBcyBzaG93biBpbiBwYXJ0IG9uZSBvZiB0aGlzIHN0dWR5LCB0aGUgaW1wcm92ZW1lbnRzIGluIHNvY2lldHkgaW4gdGhlIFVTIHJlZ2FyZGluZyBXb21hbidzIHJpZ2h0cyBoYXZlIGxlZCB0byBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lLg0KDQpQYXJ0IHR3byBvZiB0aGlzIHN0dWR5IGZpbmlzaGVkIG9mZiB3aXRoIGFuIGFuYWx5c2lzIGRldGFpbGluZyB0aGF0IGV2ZW4gdGhvdWdoIGFjY29yZGluZyB0byBUaGUgVS5TLiBEZXBhcnRtZW50IG9mIExhYm9yICgyMDI0KSB0aGUgRXF1YWwgcGF5IGFjdCB3YXMgcHV0IGluIHBsYWNlIGluIDE5NjMsIHRoZXJlIHdhcyBzdGlsbCBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWVkaWFuIGluY29tZSBiZXR3ZWVuIHRoZSB0d28gZ2VuZGVycyBpbiB0aGUgVVMuDQoNClRoZXJlZm9yZSwgdGhpcyBzdHVkeSB3aWxsIGxvb2sgdG8gZGVsdmUgZGVlcGVyIGludG8gdGhlIHBheSBnYXAgYmV0d2VlbiBnZW5kZXJzIGluIHRoZSBVUyBhbmQgYW5hbHlzZSBtb3JlIG9mIHRoZSBmYWN0b3JzIHRoYXQgbWlnaHQgaGF2ZSBoYWQgYW4gZWZmZWN0IG9uIHRoZSBkaWZmZXJlbmNlIGluIG1lZGlhbiBpbmNvbWUgaW4gdGhlIFVTLiBPbmUgZmFjdG9yIGluIHBhcnRpY3VsYXIgYmVpbmcgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCwgc3BlY2lmaWNhbGx5IHRoYXQgb2YgYSBkZWdyZWUuDQoNCldpdGggbW9yZSBsYXdzIGJlaW5nIHB1dCBpbnRvIHBsYWNlIGluIHRoZSBVUyB0byBmb3N0ZXIgYSBiZXR0ZXIgbGVhcm5pbmcgZW52aXJvbm1lbnQgZm9yIHdvbWVuLCBzdWNoIGFzIFRoZSBXb21lbidzIEVkdWNhdGlvbmFsIEVxdWl0eSBBY3Qgb2YgMTk3NCAoTldIUCwgMjAyMykgd2hpY2ggd2FzIHNldCBvdXQgdG8gZW5jb3VyYWdlIGZ1bGwgZWR1Y2F0aW9uYWwgb3Bwb3J0dW5pdGllcyBmb3IgZ2lybHMgYW5kIHdvbWVuLCBhbmQgdGhlIEdlbmRlciBFcXVpdHkgQWN0IG9mIDE5OTQgKE5XSFAsIDIwMjMpIHdoaWNoIHdhcyBjcmVhdGVkIHRvIHByb21vdGUgZ2VuZGVyIGVxdWFsaXR5IGFuZCBlbGltaW5hdGUgZGlzY3JpbWluYXRpb24uIE9uZSB3b3VsZCBzdXNwZWN0IHRoYXQgbW9yZSB3b21lbiBhcmUgbGlrZWx5IHRvIHRha2Ugb24gYSBkZWdyZWUgdGhhbiBiZWZvcmUuDQoNCldpdGggZGF0YSBmb3IgYm90aCBnZW5kZXJzIGFuZCB0aGUgZGlmZmVyZW50IGRlZ3JlZSB0eXBlcyB3ZSB3aWxsIGJlIGFibGUgdG8gdW5jb3ZlciB3aGljaCBkZWdyZWUgdHlwZSBpcyB0aGUgaGlnaGVzdCBwYXlpbmcgYW5kIHdoZXRoZXIgdGhlcmUgaXMgc3RpbGwgYSBkaWZmZXJlbmNlIGluIG1lZGl1bSBpbmNvbWUgYmV0d2VlbiB0aGUgZ2VuZGVycyB3aGVuIGJvdGggZ2VuZGVyIGhhdmUgdGhlIHNhbWUgZGVncmVlIHR5cGUuDQoNClRoZXJlZm9yZSwgcGFydCB0aHJlZSBvZiB0aGlzIHByb2plY3Qgd2lsbCBjb3ZlciBhbiBhbmFseXNpcyBvZiB0aGUgbWVkaWFuIGluY29tZSBmb3IgbWVuIGFuZCB3b21lbiBpbiB0aGUgVVMgZnJvbSAxOTkxLTIwMjEsIGFjcm9zcyB0aHJlZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGVncmVlczsgYmFjaGVsb3JzLCBtYXN0ZXJzIGFuZCBkb2N0b3JhdGUuIFByb2Zlc3Npb25hbCBkZWdyZWUgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhpcyBzdHVkeSBhcyB0aGVyZSB3YXMgbGFja2luZyBkYXRhIGZvciAyMDA3IGFuZCAyMDA4LlwNClwNCg0KT3VyIHJlc2VhcmNoIHF1ZXN0aW9uIGZvciB0aGlzIHN0dWR5IGlzIGFzIGZvbGxvd3M6DQoNCipJcyB0aGVyZSBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIEdlbmRlciBhbmQgRGVncmVlIFR5cGUgb24gTWVkaWFuIEluY29tZSBMZXZlbCBpbiB0aGUgVVMgZnJvbSAxOTkxLTIwMjE/KlwNClwNCg0KIyMjIyBbVHdvLVdheSBBTk9WQTpdey51bmRlcmxpbmV9DQoNClRoaXMgcmVzZWFyY2ggcXVlc3Rpb24gd2lsbCBiZSBhbnN3ZXJlZCB3aXRoIGEgVHdvLVdheSBBTk9WQS4gVGhlIFR3by1XYXkgQW5hbHlzaXMgb2YgVmFyaWFuY2Ugd2lsbCBiZSB1c2VkIGFzIHdlIGFyZSBjb21wYXJpbmcgdGhlIGVmZmVjdCBvdXIgdHdvIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoR2VuZGVyLCBEZWdyZWUgVHlwZSkgaGF2ZSBvbiBhIGRlcGVuZGVudCB2YXJpYWJsZSAoTWVkaWFuIEluY29tZSBpbiB0aGUgVVMpLg0KDQpGaXJzdGx5LCB3ZSB3aWxsIGJlIGFibGUgdG8gYW5hbHlzZSB3aGV0aGVyIE1lZGlhbiBpbmNvbWUgaXMgZXF1YWwgYWNyb3NzIHRoZSB0d28gZ2VuZGVycywgd2hpY2ggd2UgZGlzY292ZXJlZCBpbiBwYXJ0IDIgdGhhdCBpcyBpcyBub3QgZm9yIHRoZSB0b3RhbCBwb3B1bGF0aW9uIG9mIG1lbiBhbmQgd29tZW4gMTUgeWVhcnMgYW5kIG92ZXIgaW4gdGhlIFVTLiBZZXQsIG5vdyB3ZSB3aWxsIGJlIGFuYWx5emluZyB3aGV0aGVyIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpbiBtZWRpYW4gaW5jb21lIGZvciB0aG9zZSB3aG8gc3BlY2lmaWNhbGx5IGhhdmUgYSBiYWNoZWxvcnMgZGVncmVlIG9yIG92ZXIgKG5vdCBpbmNsdWRpbmcgcHJvZmVzc2lvbmFsIGRlZ3JlZSkuDQoNCldpdGggb3VyIFR3by1XYXkgYW5vdmEsIHdlIHdpbGwgYWxzbyBiZSBhYmxlIHRvIGFuYWx5c2Ugd2hldGhlciB0aGUgbWVkaWFuIGluY29tZSBpcyBlcXVhbCBhY3Jvc3MgdGhlIGRpZmZlcmVudCBkZWdyZWVzLCBvciB3aGV0aGVyIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4NCg0KRnVydGhlcm1vcmUsIHdlIGNhbiBkbyBhIGNyb3NzIHRyZWF0bWVudCBhbmFseXNpcyB0byB1bmNvdmVyIHRoZSBkaWZmZXJlbmNlcyBpbiBtZWRpYW4gaW5jb21lIGJldHdlZW4gZ2VuZGVycyBhY3Jvc3MgdGhlIGRpZmZlcmVudCBkZWdyZWVzIGFuZCBhbHNvIGJldHdlZW4gdGhlIGRpZmZlcmVudCBkZWdyZWVzIGFjcm9zcyB0aGUgZGlmZmVyZW50IGdlbmRlcnNcDQpcDQoNCiMjIyMgW0h5cG90aGVzaXMgMSwgMiArIDM6XXsudW5kZXJsaW5lfQ0KDQoxc3QgSHlwb3RoZXNpcyBhbmQgUmVzZWFyY2ggUXVlc3Rpb246DQoNCi0gICBIMDogTWVkaWFuIEluY29tZSBpcyBlcXVhbCBhY3Jvc3MgZ2VuZGVycyB3aXRoIGEgYmFjaGVsb3JzIG9yIG92ZXIuDQoNCi0gICBIMTogTWVkaWFuIEluY29tZSBpcyBkaWZmZXJlbnQgYWNyb3NzIGdlbmRlcnMgd2l0aCBhIGJhY2hlbG9ycyBvciBvdmVyDQoNCjJuZCBIeXBvdGhlc2lzIGFuZCBSZXNlYXJjaCBRdWVzdGlvbjoNCg0KLSAgIEgwOiBNZWRpYW4gSW5jb21lIGlzIGVxdWFsIGFjcm9zcyB0aGUgZGVncmVlIHR5cGVzDQoNCi0gICBIMTogTWVkaWFuIEluY29tZSBpcyBlcXVhbCBhY3Jvc3MgdGhlIGRlZ3JlZSB0eXBlcw0KDQozcmQgSHlwb3RoZXNpcyBhbmQgUmVzZWFyY2ggUXVlc3Rpb246DQoNCi0gICBIMDogQWxsIDYgZ3JvdXBzIGNyZWF0ZWQgYnkgY3Jvc3MgdHJlYXRtZW50IGhhdmUgZXF1YWwgbWVhbnMNCg0KLSAgIEgxOiBBbGwgNiBncm91cHMgY3JlYXRlZCBieSBjcm9zcyB0cmVhdG1lbnQgZG8gbm90IGhhdmUgZXF1YWwgbWVhbnMNCg0KRm9yIHRoaXMgc3R1ZHkgd2Ugc2V0IGEgc2lnbmlmaWNhbmNlIGxldmVsIG9mIDAuMDUsIHdoaWNoIG1lYW5zIHdlIGFyZSB3aWxsaW5nIHRvIHNheSB0aGF0IHRoZSB0aGVyZSBpcyBhIDUlIGNoYW5jZSB0aGF0IHRoZSByZXN1bHRzIHdpbGwgb2NjdXIgZHVlIHRvIGNoYW5jZSBhbG9uZS4gT25seSB3aGVuIG91ciBwLXZhbHVlIGlzIGxvd2VyIHRoYW4gb3VyIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAwLjA1IGNhbiB3ZSByZWplY3QgdGhlIE51bGwgSHlwb3RoZXNpcyBhbmQgZGV0ZXJtaW5lIHRoYXQgdGhlIFJlc2VhcmNoIEh5cG90aGVzaXMgaXMgbW9yZSBhdHRyYWN0aXZlLlwNClwNCg0KIyMjIFsqKk1ldGhvZCoqXXsudW5kZXJsaW5lfQ0KDQpUbyBzdGFydCBvdXIgYW5hbHlzaXMgdGhlIHJlbGV2YW50IHBhY2thZ2VzIGFyZSBsb2FkZWQgaW50byBSIFN0dWRpby4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNMb2FkaW5nIFBhY2thZ2VzDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShtdWx0Y29tcCkNCmxpYnJhcnkoZ2dlZmZlY3RzKQ0KbGlicmFyeShwaGlhKQ0KbGlicmFyeShlZmZlY3RzKQ0KYGBgDQoNClRoZW4gdGhlIGRhdGEgaXMgc291cmNlZCBhbmQgZG93bmxvYWRlZCBmcm9tIHd3dy5jZW5zdXMuZ292LiBUYWJsZSBQLTE2LiBFZHVjYXRpb25hbCBBdHRhaW5tZW50LS1QZW9wbGUgMjUgWWVhcnMgT2xkIGFuZCBPdmVyIGJ5IE1lZGlhbiBJbmNvbWUgYW5kIFNleDogMTk5MSB0byAyMDIyLiBUaGUgZGF0YSB1c2VkIGluIHRoaXMgc3R1ZHkgYXJlIGluIDIwMjIgZG9sbGFycywgc28gdGhhdCBpbmZsYXRpb24gaXMgYWNjb3VudGVkIGZvciBvdmVyIHRoZSBkaWZmZXJlbnQgeWVhcnMuIFRoZSB0aHJlZSB0YWJsZXMgdXNlZCBvdXQgb2YgdGhlIG11bHRpcGxlIGF2YWlsYWJsZSBpbiB0aGlzIGRhdGEgc2V0IChQLTE2KSBpcyBmb3IgYm90aCBnZW5kZXJzLCB3aXRoIGEgYmFjaGVsb3JzIGRlZ3JlZSwgbWFzdGVycyBkZWdyZWUgYW5kIGRvY3RvcmF0ZSBkZWdyZWUuDQoNCkFzIHByZXZpb3VzbHkgc3RhdGVkIHRoZSBQcm9mZXNzaW9uYWwgRGVncmVlIHRhYmxlIHdpbGwgbm90IGJlIHVzZWQgYXMgaXQgd2FzIG1pc3NpbmcgZGF0YSBmb3IgMjAwNyBhbmQgMjAwOC4gVGhlIGRhdGEgaXMgdGhlbiBsb2FkZWQgYW5kIHRyYW5zZm9ybWVkIGludG8gZXhjZWwsIG9ubHkga2VlcGluZyB0aGUgbmVjZXNzYXJ5IHZhbHVlcyBhbmQgY29sdW1ucyBhbG9uZyB3aXRoIHRoZSB2YWx1ZXMgZm9yIGVhY2ggeWVhci4NCg0KQXMgaW4gYm90aCBwYXJ0IG9uZSBhbmQgdHdvIG9mIHRoaXMgc3R1ZHksIHRoZSByb3dzIGZvciAyMDE3IGFuZCAyMDEzIGhhdmUgYmVlbiByZXBlYXRlZCBpbiB0aGUgZGF0YSBzZXQgZG93bmxvYWRlZCBmcm9tIFVTIENlbnN1cywgc28gd2hlbiBpbXBvcnRlZCBpbnRvIGV4Y2VsIEkgaGF2ZSBjYWxjdWxhdGVkIHRoZSBhdmVyYWdlIG9mIHRoZXNlIHJvd3MgaW5zdGVhZCBvZiBhbGxvd2luZyB0d28gaW5zdGFuY2VzIGZvciB0aGUgc2FtZSB5ZWFyLg0KDQpMYXN0bHksIGZ1cnRoZXIgZGF0YSBjbGVhbmluZyB3YXMgcGVyZm9ybWVkIGluIFIgdHJhbnNmb3JtaW5nIHRoZSB2YXJpYWJsZXMgR2VuZGVyIGFuZCBEZWdyZWUgdG8gZmFjdG9ycyBhbmQgTWVkaWFuLkluY29tZSB0byBpbnRlZ2VyLlwNClwNCg0KIyMjIyBbU3VtbWFyeSBvZiB0aGUgRGF0YTpdey51bmRlcmxpbmV9DQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojSW1wb3J0aW5nIHRoZSBkYXRhDQpHZW5kZXJJbmNvbWVEZWdyZWUgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2VkcmVuL09uZURyaXZlL0Rlc2t0b3AvRGF0YSBBbmFseXNpcy9SIFdvcmtpbmcgRGlyZWN0b3J5L0ZpbmFsIFByb2plY3QgQXNzaWdubWVudC9EYXRhc2V0cy9EYXRhU2V0cy9HZW5kZXJJbmNvbWVEZWdyZWUuY3N2IikNCg0KbmFtZXMoR2VuZGVySW5jb21lRGVncmVlKSA8LSBjKCJZZWFyIiwgIkdlbmRlciIsICJNZWRpYW4uSW5jb21lIiwgIkRlZ3JlZSIpDQoNCiNjaGVja2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhDQoNCnN0cihHZW5kZXJJbmNvbWVEZWdyZWUpDQoNCkdlbmRlckluY29tZURlZ3JlZSRHZW5kZXIgPC0gYXMuZmFjdG9yKEdlbmRlckluY29tZURlZ3JlZSRHZW5kZXIpDQoNCkdlbmRlckluY29tZURlZ3JlZSREZWdyZWUgPC0gYXMuZmFjdG9yKEdlbmRlckluY29tZURlZ3JlZSREZWdyZWUpDQoNCkdlbmRlckluY29tZURlZ3JlZSRNZWRpYW4uSW5jb21lIDwtIGFzLmludGVnZXIoR2VuZGVySW5jb21lRGVncmVlJE1lZGlhbi5JbmNvbWUpDQoNCnN0cihHZW5kZXJJbmNvbWVEZWdyZWUpDQoNCiNJbml0aWFsIGxvb2sgYXQgdGhlIGRhdGENCg0KaGVhZChHZW5kZXJJbmNvbWVEZWdyZWUpDQoNCmhlYWQoR2VuZGVySW5jb21lRGVncmVlW0dlbmRlckluY29tZURlZ3JlZSREZWdyZWUgPT0gIk1hc3RlcnMiLF0pDQoNClRhYmxlSW5jb21lRGVncmVlIDwtIHJiaW5kKGhlYWQoR2VuZGVySW5jb21lRGVncmVlLDQpLCAiLi4uIiwgaGVhZChHZW5kZXJJbmNvbWVEZWdyZWVbR2VuZGVySW5jb21lRGVncmVlJERlZ3JlZSA9PSAiTWFzdGVycyIsXSwyKSwgdGFpbChHZW5kZXJJbmNvbWVEZWdyZWVbR2VuZGVySW5jb21lRGVncmVlJERlZ3JlZSA9PSAiTWFzdGVycyIsXSwyKSwgIi4uLiIsIHRhaWwoR2VuZGVySW5jb21lRGVncmVlLDQpKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCmthYmxlKFRhYmxlSW5jb21lRGVncmVlLA0KICAgICAgY2FwdGlvbiA9ICJUYWJsZSAzLjE6IEluaXRpYWwgbG9vayBhdCBob3cgb3VyIGRhdGEgaXMgbGFpZCBvdXQuIFByb3ZpZGluZyBJbmNvbWUgZGF0YSBmb3IgYm90aCBHZW5kZXJzIGFuZCAzIGRpZmZlcmVudCBkZWdyZWUgdHlwZXMgaW4gdGhlIFVTIGZyb20gMTk5MSAtIDIwMjIuIFRoZSBJbmNvbWUgaW4gdGhpcyBkYXRhc2V0IGFjY291bnRzIGZvciBpbmZsYXRpb24gYW5kIGlzIGluIDIwMjIgRG9sbGFycyAoJCkuIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KVGhlIGRhdGEgaXMgc2VwYXJhdGVkIGludG8gZm91ciBjb2x1bW5zLCBwcm92aWRpbmcgaW5mb3JtYXRpb24gZm9yIGJvdGggR2VuZGVycyBhbmQgdGhlaXIgbWVkaWFuIGluY29tZSBpbiB0aGUgVVMgZnJvbSB0aGUgeWVhcnMgMTk5MS0yMDIxIHdpdGggcmVnYXJkcyB0byB0aGUgdGhyZWUgRGVncmVlIHR5cGVzIHdlIGhhdmUgc2VsZWN0ZWQgZm9yIHRoaXMgc3R1ZHk7IEJhY2hlbG9ycywgTWFzdGVycywgRG9jdG9yYXRlLg0KDQpBZ2FpbiwgYXMgd2UgYXJlIGFuYWx5emluZyB0d28gR2VuZGVycyBhbmQgdGhyZWUgRGVncmVlIHR5cGVzLCB0aGUgeWVhciB2YWx1ZXMgaGF2ZSBiZWVuIHJlcGVhdGVkIHNpeCB0aW1lcyBhcyB3ZSBhcmUgbWF0Y2hpbmcgdGhlIE1lZGlhbiBJbmNvbWUgZGF0YSBmb3IgZWFjaCB5ZWFyIHRvIGVhY2ggR2VuZGVyIGFuZCBlYWNoIERlZ3JlZSB0eXBlLlwNClwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNTdW1tYXJ5IFN0YXRpc3RpY3MgVHdvIFdheQ0KDQpTdW1tYXJ5U3RhdHNUYWJsZSA8LSBkZXNjcmliZUJ5KEdlbmRlckluY29tZURlZ3JlZSRNZWRpYW4uSW5jb21lLCBncm91cCA9IEdlbmRlckluY29tZURlZ3JlZSRHZW5kZXIgOiBHZW5kZXJJbmNvbWVEZWdyZWUkRGVncmVlLCBtYXQgPSBUKQ0KDQpLYWJsZVN0YXRzVGFibGUgPC0gYXMuZGF0YS5mcmFtZShyYmluZCgoU3VtbWFyeVN0YXRzVGFibGUkZ3JvdXAxKSwoU3VtbWFyeVN0YXRzVGFibGUkbiksKFN1bW1hcnlTdGF0c1RhYmxlJG1lYW4pLChTdW1tYXJ5U3RhdHNUYWJsZSRzZCksKFN1bW1hcnlTdGF0c1RhYmxlJG1lZGlhbiksKFN1bW1hcnlTdGF0c1RhYmxlJG1pbiksKFN1bW1hcnlTdGF0c1RhYmxlJG1heCksKFN1bW1hcnlTdGF0c1RhYmxlJHJhbmdlKSwoU3VtbWFyeVN0YXRzVGFibGUkc2tldyksKFN1bW1hcnlTdGF0c1RhYmxlJGt1cnRvc2lzKSwoU3VtbWFyeVN0YXRzVGFibGUkc2UpKSkNCg0KbmFtZXMoS2FibGVTdGF0c1RhYmxlKSA8LSBjKCJGOkJhY2hlbG9ycyIsIkY6RG9jdG9yYXRlIiwiRjpNYXN0ZXJzIiwgIk06QmFjaGVsb3JzIiwiTTpEb2N0b3JhdGUiLCJNOk1hc3RlcnMiKQ0KDQpLYWJsZVN0YXRzVGFibGUgPC0gS2FibGVTdGF0c1RhYmxlWy0xLCBdDQoNCkthYmxlU3RhdHNUYWJsZTIgPC0gYXMuZGF0YS5mcmFtZSh0KEthYmxlU3RhdHNUYWJsZSkpDQoNCm5hbWVzKEthYmxlU3RhdHNUYWJsZTIpIDwtIGMoIm4iLCAibWVhbiIsICJzZCIsICJtZWRpYW4iLCAibWluIiwgIm1heCIsICJyYW5nZSIsICJza2V3IiwgImt1cnRvc2lzIiwgInNlIikNCg0KDQoNCiNjaGFuZ2luZyBzb21lIHR5cGVzDQoNCkthYmxlU3RhdHNUYWJsZTIkbiA8LSBhcy5pbnRlZ2VyKEthYmxlU3RhdHNUYWJsZTIkbikNCg0KS2FibGVTdGF0c1RhYmxlMiRtZWFuIDwtIGFzLm51bWVyaWMoS2FibGVTdGF0c1RhYmxlMiRtZWFuKQ0KDQpLYWJsZVN0YXRzVGFibGUyJHNkIDwtIGFzLm51bWVyaWMoS2FibGVTdGF0c1RhYmxlMiRzZCkNCg0KS2FibGVTdGF0c1RhYmxlMiRtZWRpYW4gPC0gYXMubnVtZXJpYyhLYWJsZVN0YXRzVGFibGUyJG1lZGlhbikNCg0KS2FibGVTdGF0c1RhYmxlMiRtaW4gPC0gYXMubnVtZXJpYyhLYWJsZVN0YXRzVGFibGUyJG1pbikNCg0KS2FibGVTdGF0c1RhYmxlMiRtYXggPC0gYXMubnVtZXJpYyhLYWJsZVN0YXRzVGFibGUyJG1heCkNCg0KS2FibGVTdGF0c1RhYmxlMiRyYW5nZSA8LSBhcy5udW1lcmljKEthYmxlU3RhdHNUYWJsZTIkcmFuZ2UpDQoNCkthYmxlU3RhdHNUYWJsZTIkc2tldyA8LSBhcy5udW1lcmljKEthYmxlU3RhdHNUYWJsZTIkc2tldykNCg0KS2FibGVTdGF0c1RhYmxlMiRrdXJ0b3NpcyA8LSBhcy5udW1lcmljKEthYmxlU3RhdHNUYWJsZTIka3VydG9zaXMpDQoNCkthYmxlU3RhdHNUYWJsZTIkc2UgPC0gYXMubnVtZXJpYyhLYWJsZVN0YXRzVGFibGUyJHNlKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCiNLYWJsZSBTdGF0aXN0aWNzIHRhYmxlDQoNCmthYmxlKEthYmxlU3RhdHNUYWJsZTIsIGNhcHRpb24gPSAiVGFibGUgMy4yOiBTdW1tYXJ5IFN0YXRpc3RpY3Mgb2YgdGhlIG1lZGlhbiBpbmNvbWUgZGF0YSBmb3IgYm90aCBHZW5kZXJzIGFuZCAzIGRlZ3JlZSB0eXBlcyBpbiB0aGUgVVMgZnJvbSAxOTkxLTIwMjEuIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGZvbnRfc2l6ZSA9IDE1KQ0KYGBgDQoNClRoZSBuIHZhbHVlcyBvZiBlYWNoIGdyb3VwIHNob3cgdGhlIHRvdGFsIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgZm9yIGVhY2gsIHdoaWNoIGlzIDMxIGFzIHRoaXMgaXMgdGhlIG51bWJlciBvZiB5ZWFycyBvZiBkYXRhIHdlIGhhdmUgZm9yIGVhY2ggcGFpcmluZyBvZiBncm91cCAxOTkxLTIwMjEuIFRoZSBtZWFuIHZhbHVlcyBmb3IgdGhlIERvY3RvcmF0ZSBEZWdyZWUgdHlwZSBoYXZlIHNob3duIHRvIGJlIHRoZSBoaWdoZXN0IGZyb20gb3VyIHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgYm90aCBtYWxlcyBhbmQgZmVtYWxlcyB3aXRoIHZhbHVlcyBvZiAxMTQ2MjguNzEgYW5kIDgyNzA0Ljg0IHJlc3BlY3RpdmVseSBhbmQgbG93ZXN0IGZvciB0aGUgQmFjaGVsb3JzIERlZ3JlZSB0eXBlIGZvciBib3RoIG1hbGVzIGFuZCBmZW1hbGVzIHdpdGggdmFsdWVzIG9mIDc0ODcyLjI2IGFuZCA0NzQyMC40OCByZXNwZWN0aXZlbHkuDQoNCkJ5IGNvbXBhcmluZyB0aGUgbWVhbnMgb2YgZWFjaCBncm91cCBwYWlyaW5nLCB3ZSBub3Qgb25seSBzZWUgdGhhdCBCYWNoZWxvcnMgaXMgdGhlIGxvd2VzdCBhbmQgRG9jdG9yYXRlIGlzIHRoZSBoaWdoZXN0LiBXZSBhbHNvIGNhbiBzZWUgdGhhdCBNYWxlcyBoYXZlIGEgaGlnaGVyIG1lYW4gdGhhbiBGZW1hbGVzIGZvciBlYWNoIERlZ3JlZSBUeXBlLiBXaGV0aGVyIHRoaXMgZGlmZmVyZW5jZSBpcyBzaWduaWZpY2FudCBvciBub3QgaXMgd2hhdCB3ZSB3aWxsIGZ1cnRoZXIgYW5hbHlzZSBpbiB0aGlzIHN0dWR5Lg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIChzZCksIGlzIGhpZ2hlc3QgaW4gTWFsZXMgbWVhbmluZyB0aGVyZSBpcyBtb3JlIHZhcmlhYmlsaXR5IGFyb3VuZCB0aGUgbWVhbiBvZiB0aGUgZGF0YS4gV2hlbiBjb21wYXJpbmcgdGhlIHNkIGFuZCByYW5nZSBvZiBib3RoIGdlbmRlcnMgd2hvIGhhdmUgYSBCYWNoZWxvcnMgZGVncmVlLCB5b3UgY2FuIHNlZSB0aGF0IE1hbGVzIGhhdmUgYW4gc2QgdmFsdWUgb2YgMzI4Ni4zODUgYW5kIEZlbWFsZXMgaGF2ZSBhIHNkIHZhbHVlIG9mIDI4NDkuMDc1IGJ1dCB0aGUgcmFuZ2VzIGFyZSAxMDU4MCBhbmQgMTEyODAgcmVzcGVjdGl2ZWx5LiBTaG93aW5nIHRoYXQgTWFsZXMgd2hvIGhhdmUgYSBCYWNoZWxvcnMgRGVncmVlIGhhdmUgYW4gaW5jb21lIGxlc3MgY29uY2VudHJhdGVkIGFyb3VuZCB0aGUgbWVhbiB0aGFuIEZlbWFsZXMgd2l0aCB0aGUgc2FtZSBkZWdyZWUsIGJ1dCBpcyBsZXNzIHNwcmVhZCBvdXQuDQoNClRoZSBoaWdoZXIgcmFuZ2UgZm9yIEZlbWFsZXMgd2l0aCBhIEJhY2hlbG9ycyBkZWdyZWUgc2hvd3MgdGhhdCB0aGVyZSBpcyBhIGxhcmdlciBnYXAgYmV0d2VlbiB0aGUgaGlnaGVzdCBhbmQgbG93ZXN0IHZhbHVlcy4gWWV0LCB0aGUgbG93ZXIgc2QgYWxzbyBpbmRpY2F0ZXMgdGhhdCBtb3N0IG9mIHRoZSB2YWx1ZXMgYXJlIGNsb3NlciB0byB0aGUgbWVhbiB0aGFuIHRoYXQgb2YgTWFsZXMuDQoNCldoZW4gY29tcGFyaW5nIHRoZSBzZCB2YWx1ZXMgYW5kIHJhbmdlIGZvciBib3RoIEdlbmRlcnMgYW5kIGZvciB0aGUgRG9jdG9yYXRlIGFuZCBNYXN0ZXJzIERlZ3JlZSwgd2UgY2FuIHNlZSB0aGF0IGJvdGggdGhlIHNkIGFuZCByYW5nZSBpcyBoaWdoZXIgZm9yIE1hbGVzIHdpdGggcmVnYXJkcyB0byB0aGVzZSBwYWlyaW5ncywgc2hvd2luZyB0aGF0IHRoZSBkYXRhIGlzIGNvbmNlbnRyYXRlZCBmb3IgRmVtYWxlcyB3aXRoIE1hc3RlcnMgYW5kIERvY3RvcmF0ZSBEZWdyZWVzIGFuZCBsZXNzIHNwcmVhZCBvdXQuDQoNCkZlbWFsZXMgaGF2ZSBhIHBvc2l0aXZlIHNrZXcgZm9yIGJvdGggRG9jdG9yYXRlIGFuZCBNYXN0ZXJzIERlZ3JlZXMsIHdoZXJlYXMgdGhlIHJlc3Qgb2YgdGhlIHBhaXJpbmdzIGluZGljYXRlIGEgbmVnYXRpdmUgc2tldy4gQSBza2V3IHZhbHVlIGZyb20gLTAuNSB0byAwLjUgaW5kaWNhdGVzIHN5bW1ldHJ5IChHYXdhbGksIDIwMjMpLiBNb3N0IG9mIHRoZSBwYXJpbmdzIGFyZSB0aGVyZWZvcmUgc3ltbWV0cmljYWwgZXhjZXB0IHRoZSBGZW1hbGVzIHdpdGggYSBEb2N0b3JhdGUgRGVncmVlIGdyb3VwLCB3aGljaCBoYXMgc2xpZ2h0bHkgYWJvdmUgMC41IHdpdGggYSBza2V3IHZhbHVlIG9mIDAuNTMxNSwgc2hvd2luZyB0aGF0IHRoZSBvdXRsaWVycyBhcmUgdG93YXJkcyB0aGUgdXBwZXIgcXVhcnRpbGUsIG1lYW5pbmcgdGhhdCB0aGVyZSBhcmUgYSBmZXcgaGlnaGVyIGluY29tZXMgZm9yIHRoaXMgcGFpcmluZyB3aGljaCBoYXMgc2tld2VkIHRoZSBkYXRhIHRvd2FyZHMgdGhlIHJpZ2h0Lg0KDQpUaGUga3VydG9zaXMgdmFsdWVzIFw8IDMgaW5kaWNhdGUgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHBsYXR5a3VydGljIHdoaWNoIGlzIGxlc3MgcGVha2VkIHdoZW4gY29tcGFyZWQgdG8gYSBub3JtYWwgZGlzdHJpYnV0aW9uLCB3aGljaCBpcyB3aGF0IHdlIHNlZSBmb3IgZWFjaCBwYWlyaW5nIGluIHRoaXMgZGF0YSBzZXQuDQoNCkxhc3RseSwgdGhlIHN0YW5kYXJkIGVycm9yIChzZSkgaXMgbGFyZ2VyIGluIGJvdGggZ3JvdXBpbmdzIG9mIHRoZSBEb2N0b3JhdGUgRGVncmVlIG1lYW5pbmcgdGhlIGRhdGEgaGVyZSBpcyBsZXNzIHByZWNpc2UgdGhhbiB0aGF0IG9mIHRoZSBvdGhlciBncm91cGluZ3Mgb2YgRGVncmVlIHR5cGVzLlwNClwNCg0KIyMjIyBbQXNzdW1wdGlvbnMgQ2hlY2s6XXsudW5kZXJsaW5lfQ0KDQpGaXJzdGx5IHRoZSBtb2RlbCBpcyBjcmVhdGVkIHVzaW5nIFIsIHdpdGggTWVkaWFuIEluY29tZSBhcyBvdXIgSW5kZXBlbmRlbnQgdmFyaWFibGUgYW5kIEdlbmRlciBhbmQgRGVncmVlIGFzIG91ciBEZXBlbmRlbnQgdmFyaWFibGVzLiBJbiBvcmRlciB0byBjb250aW51ZSB3aXRoIG91ciBUd28tV2F5IEFub3ZhIG1vZGVsLCB3ZSBtdXN0IGNoZWNrIGZpcnN0IHRoYXQgdGhlIHJlcXVpcmVkIGFzc3VtcHRpb25zIGFyZSBtZXQuDQoNCi0gICBJbmRlcGVuZGVudCBvYnNlcnZhdGlvbnMgKHdoaWNoIHdlIGhhdmUpDQoNCi0gICBIb21vc2NlZGFzdGljaXR5IC0gUmVzaWR1YWxzIGhhdmUgZXF1YWwgdmFyaWFuY2UNCg0KLSAgIE5vcm1hbGl0eSBvZiBSZXNpZHVhbHMgLSBSZXNpZHVhbHMgZm9sbG93IGEgbm9ybWFsIGRpc3RyaWJ1dGlvblwNCiAgICBcDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojQW5vdmEgTW9kZWwgLSBUd28gd2F5DQoNClR3b1dheU0xIDwtIGFvdihNZWRpYW4uSW5jb21lIH4gR2VuZGVyICogRGVncmVlLCBkYXRhID0gR2VuZGVySW5jb21lRGVncmVlKQ0KDQpUd29XYXlNMQ0KDQoNCmBgYA0KDQoqKipIb21vc2NlZGFzdGljaXR5OioqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI0RpYWdub3N0aWMgQ2hlY2tzDQoNCiNob21vc2NlZGFzdGljaXR5IA0KDQpwYXIobWZyb3cgPSBjKDIsMikpDQoNCnBsb3QoVHdvV2F5TTEpDQoNCnBhcihtZnJvdyA9IGMoMSwxKSkNCiNGaWd1cmUgMy4xOi4uLg0KDQoNCiNObyBtb3JlIHRoYW4gMyB0aW1lcyBzbWFsbGVzdCwgbG9va3MgZmluZSBoZXJlDQpgYGANCg0KRmlndXJlIDMuMTogRGlhZ25vc3RpYyBwbG90IG9mIG91ciBUd28tV2F5IEFOT1ZBIG1vZGVsLiBSZXNpZHVhbHMgdnMgRml0dGVkIHBsb3QgaXMgdXNlZCB0byBjaGVjayBmb3IgdGhlIGFzc3VtcHRpb24gb2YgaG9tb3NjZWRhc3RpY2l0eS4gVGhlIFJlc2lkdWFscyBzaG91bGQgaGF2ZSBhbiBlcXVhbCB2YXJpYW5jZSB3aGVuIHBsb3R0ZWQgYWdhaW5zdCB0aGUgZml0dGVkIHZhbHVlcy4gVGhlIFEtUSBSZXNpZHVhbHMgcGxvdCBpcyB1c2VkIHRvIGNoZWNrIGZvciB0aGUgbm9ybWFsaXR5IG9mIHJlc2lkdWFscywgd2hpY2ggaXMgaW5kaWNhdGVkIGJ5IGEgc3RyYWlnaHQgbGluZS5cDQpcDQoNClRoZSBSZXNpZHVhbHMgdnMgRml0dGVkIHBsb3QgaGVyZSBzaG93cyBob21vc2NlZGFzdGljaXR5IG9mIG91ciBUd28tV2F5IEFOT1ZBIG1vZGVsIGFzIHRoZSBsYXJnZXN0IHNwcmVhZCBpcyBub3QgdGhyZWUgdGltZXMgdGhlIHNpemUgb2YgdGhlIHNtYWxsZXN0LiBUaGUgUS1RIFJlc2lkdWFscyBwbG90IGFsc28gc2hvd3MgdGhhdCB0aGUgUmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZC5cDQpcDQoNCioqKk5vcm1hbGl0eSBvZiByZXNpZHVhbHM6KioqDQoNCldlIGNhbiBmdXJ0aGVyIGNoZWNrIHRoZSBub3JtYWxpdHkgb2YgcmVzaWR1YWxzIHdpdGggdGhlIFNoYXBpcm8gV2lsayB0ZXN0LCB3aXRoIHRoZSByZXNpZHVhbHMgdGFrZW4gZnJvbSBvdXIgVHdvLVdheSBBTk9WQSB0ZXN0LiBUaGUgTnVsbCBIeXBvdGhlc2lzIGhlcmUgaXMgdGhhdCB0aGUgZGF0YSBmb2xsb3dzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gVGhlcmVmb3JlLCBhIFAtVmFsdWUgXDwgMC4wNSBtZWFucyB0aGF0IHdlIHJlamVjdCB0aGUgTnVsbCBIeXBvdGhlc2lzIGFuZCBkZXRlcm1pbmUgdGhhdCB0aGUgZGF0YSBpcyBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuXA0KXA0KDQoqKipTaGFwaXJvIFdpbGsgdGVzdCoqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KUmVzX0Vwc2lsb24gPC0gVHdvV2F5TTEkcmVzaWR1YWxzDQoNCnNoYXBpcm8udGVzdChSZXNfRXBzaWxvbikNCmBgYA0KDQpUaGUgUC1WYWx1ZSBmcm9tIHRoZSBTaGFwaXJvLVdpbGsgdGVzdCBpcyAwLjE0ODgsIHdoaWNoIGlzIFw+IDAuMDUuIFRoZXJlZm9yZSB3ZSBkbyBub3QgcmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMgdGhhdCB0aGUgZGF0YSBpcyBub3JtYWxseSBkaXN0cmlidXRlZC5cDQpcDQoNCioqKkhpc3RvZ3JhbSoqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZ2dwbG90KEdlbmRlckluY29tZURlZ3JlZSwgYWVzKHggPSBSZXNfRXBzaWxvbikpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLA0KICAgICAgICAgICAgICAgICBjb2xvdXIgPSAxLCBmaWxsID0gIndoaXRlIiwgYmlucyA9IDE0KSArDQogIGdlb21fZGVuc2l0eShsd2QgPSAxLCBjb2xvdXIgPSA0LCBmaWxsID0gNCwgYWxwaGEgPSAwLjI1KSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgIHZqdXN0ID0gLTUsIGhqdXN0ID0gMC40NyksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIHZqdXN0ID0gNSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCB2anVzdCA9IDUpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwgImNtIikpICsNCiAgeGxhYigiUmVzaWR1YWxzIikgKw0KICB5bGFiKCJSZXNpZHVhbCBGcmVxdWVuY3kiKSArDQogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKHVuZGVybGluZSgiSGlzdG9ncmFtIG9mIFJlc2lkdWFscyB8IFR3byBXYXkgQU5PVkEgTW9kZWwgMSIpKSkNCg0KI1Jlc2lkdWFscyBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQNCg0KYGBgDQoNCkZpZ3VyZSAzLjI6IEhpc3RvZ3JhbSBwbG90IG9mIHRoZSBSZXNpZHVhbHMgZnJvbSBvdXIgVHdvLVdheSBBTk9WQSBNb2RlbCAxLiBBIG5vcm1hbCBkaXN0cmlidXRpb24gc2hvd3Mgc3ltbWV0cnkgYXJvdW5kIHRoZSBtZWFuLCB3aGljaCBpcyB3aGF0IHdlIGNhbiBzZWUgaGVyZS5cDQpcDQoNClNpbmNlIGNoZWNraW5nIHRoYXQgYWxsIGFzc3VtcHRpb25zIGhhdmUgYmVlbiBtZXQgd2UgZG8gbm90IG5lZWQgdG8gdHJhbnNmb3JtIG91ciBkYXRhIG9yIGNoYW5nZSBvdXIgbW9kZWwgYW5kIGNhbiB0aGVyZWZvcmUgY29udGludWUgd2l0aCBvdXIgYW5hbHlzaXMuXA0KXA0KDQojIyMgWyoqUmVzdWx0cyoqXXsudW5kZXJsaW5lfQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KYW5vdmEoVHdvV2F5TTEpDQpgYGANCg0KIyMjIyBbUmVwb3J0IDM6IEYoR2VuZGVyOkRlZ3JlZSwgMiwxODApID0gMy4yNTM0LCBQLVZhbHVlIFw8IDAuMDVdey51bmRlcmxpbmV9DQoNCkZpcnN0bHkgbG9va2luZyBhdCB0aGUgaW50ZXJhY3Rpb24sIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwgaXMgMC4wNC4gTWVhbmluZyB3ZSBjYW4gcmVqZWN0IHRoZSAzcmQgTnVsbCBIeXBvdGhlc2lzIHRoYXQgImFsbCBzaXggZ3JvdXBzIGNyZWF0ZWQgYnkgY3Jvc3MgdHJlYXRtZW50IGhhdmUgZXF1YWwgbWVhbnMiIGFuZCB0aGF0IHRoZXkgYXJlIGFsbCBzaWduaWZpY2FudGx5IGRpZmZlcmVudC4gVGhlIGludGVyYWN0aW9uIGJlaW5nIHNpZ25pZmljYW50IGRvZXMgbm90IHBhcnRpY3VsYXJseSBtZWFuIHRoYXQgdGhlIG1haW4gZWZmZWN0cyBHZW5kZXIgYW5kIERlZ3JlZSB3aWxsIGFsc28gYmUgc2lnbmlmaWNhbnQuXA0KXA0KDQojIyMjIFtSZXBvcnQgMTogRihHZW5kZXIsIDEsMTgwKSA9IDE3MjMuNDkxMCwgUC1WYWx1ZSBcPCAwLjA1XXsudW5kZXJsaW5lfQ0KDQojIyMjIFtSZXBvcnQgMjogRihEZWdyZWUsIDIsMTgwKSA9IDkxNS40NDQ0LCBQLVZhbHVlIFw8IDAuMDVdey51bmRlcmxpbmV9DQoNCkluIHRoaXMgY2FzZSB0aGUgUC1WYWx1ZSBcPCAwLjA1IGZvciBlYWNoIE1haW4gRWZmZWN0IEdlbmRlciBhbmQgRGVncmVlLiBNZWFuaW5nIHdlIGNhbiByZWplY3QgdGhlIDFzdCBhbmQgdGhlIDJuZCBOdWxsIEh5cG90aGVzaXMgdGhhdCAiTWVkaWFuIEluY29tZSBpcyBlcXVhbCBhY3Jvc3MgZ2VuZGVycyB3aXRoIGEgYmFjaGVsb3JzIG9yIG92ZXIiIGFuZCAiTWVkaWFuIEluY29tZSBpcyBlcXVhbCBhY3Jvc3MgdGhlIGRlZ3JlZSB0eXBlcyIsIGFuZCBkZXRlcm1pbmUgdGhhdCB0aGUgUmVzZWFyY2ggSHlwb3RoZXNpcyBpcyB0aGUgbW9zdCBhdHRyYWN0aXZlIGZvciBhbGwgdGhlIE1haW4gRWZmZWN0cyBhbmQgdGhlIEludGVyYWN0aW9uLg0KDQpBIFAtVmFsdWUgbG93ZXIgdGhhbiAwLjA1IGFsbG93cyB1cyB0byBkZXRlcm1pbmUgdGhhdCB0aGUgZGlmZmVyZW5jZXMgd2UgaGF2ZSBzZWVuIGluIHRoaXMgZGF0YSBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhbmQgdGhhdCB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0aGVzZSByZXN1bHRzIHdpbGwgb2NjdXIgZHVlIHRvIGNoYW5jZSBhbG9uZSBpcyBsZXNzIHRoYW4gNSUuXA0KXA0KDQojIyMgWyoqRGlzY3Vzc2lvbioqXXsudW5kZXJsaW5lfQ0KDQojIyMjIFtQb3N0LUhvYyBBbmFseXNpc117LnVuZGVybGluZX0NCg0KYGBge3IgZWNobz1GQUxTRX0NCiNUdWtleSBIU0QNCg0KI1Rlc3QgMSAtIFBvc3QgSG9jIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gR2VuZGVycyB3aXRoaW4gRGVncmVlcw0KDQp0MSA8LSB0ZXN0SW50ZXJhY3Rpb25zKFR3b1dheU0xLCBwYWlyd2lzZSA9ICJHZW5kZXIiLCBmaXhlZCA9ICJEZWdyZWUiLCBhZGp1c3RtZW50ID0gImhvbG0iKQ0KDQp0MSRgUHIoPkYpYCA8LSBhcy5udW1lcmljKHQxJGBQcig+RilgKQ0KDQp0MSRgUHIoPkYpYCA8LSBmb3JtYXRDKHQxJGBQcig+RilgLCBmb3JtYXQgPSAiZSIsIGRpZ2l0cyA9IDIpDQoNCmthYmxlKHQxLCBjYXB0aW9uID0gIlRhYmxlIDMuMzogUGFpcndpc2UgdGVzdHMgdG8gdGVzdCBmb3IgaW50ZXJhY3Rpb24gYmV0d2VlbiBHZW5kZXJzIHdpdGhpbiBEZWdyZWUgdHlwZSAoYWRqdXN0bWVudCA9IEhvbG1zIHRlc3QpLiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBmb250X3NpemUgPSAxNSkNCmBgYA0KDQpUaGlzIFBvc3QtSG9jIEFuYWx5c2lzIHNob3dzIHZhbHVlcyBmb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBHZW5kZXJzIHdpdGhpbiB0aGUgZGlmZmVyZW50IERlZ3JlZSBUeXBlcyB3ZSBoYXZlIHVzZWQgaW4gdGhpcyBzdHVkeS4gV2UgY2FuIHNheSB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSAoUC1WYWx1ZSBcPCAwLjA1KSBpbiBNZWRpYW4gSW5jb21lIGluIHRoZSBVUyBmb3IgZWFjaCBJbnRlcmFjdGlvbi4NCg0KU2luY2UgdGhlIG9yZGVyIGdvZXMgRmVtYWxlIC0gTWFsZSwgdGhlIHZhbHVlcyBpbiB0aGUgIlZhbHVlIiBjb2x1bW4gYXJlIHJlbGV2YW50IHRvIEZlbWFsZSBhcyB0aGV5IGNvbWUgZmlyc3QuIE1lYW5pbmcgdGhlIG5lZ2F0aXZlIHZhbHVlIGZvciBlYWNoIGludGVyYWN0aW9uIHNob3dzIHRoYXQgdGhlIGRpZmZlcmVuY2UgbGllcyB3aXRoIE1lbiBoYXZpbmcgYSBoaWdoZXIgYXZlcmFnZSB3aXRoIHJlZ2FyZHMgdG8gTWVkaWFuIEluY29tZSBpbiB0aGUgVVMsIGZvciBvdXIgdGhyZWUgRGVncmVlIFR5cGVzLlwNClwNCg0KYGBge3IgZWNobz1GQUxTRX0NCiNUZXN0IDIgLSBQb3N0IEhvYyB0ZXN0IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIERlZ3JlZXMgd2l0aGluIEdlbmRlcnMNCg0KdDIgPC0gdGVzdEludGVyYWN0aW9ucyhUd29XYXlNMSwgcGFpcndpc2UgPSAiRGVncmVlIiwgZml4ZWQgPSAiR2VuZGVyIiwgYWRqdXN0bWVudCA9ICJob2xtIikNCg0KdDIkYFByKD5GKWAgPC0gYXMubnVtZXJpYyh0MiRgUHIoPkYpYCkNCg0KdDIkYFByKD5GKWAgPC0gZm9ybWF0Qyh0MiRgUHIoPkYpYCwgZm9ybWF0ID0gImUiLCBkaWdpdHMgPSAyKQ0KDQprYWJsZSh0MiwgY2FwdGlvbiA9ICJUYWJsZSAzLjQ6IFBhaXJ3aXNlIHRlc3RzIHRvIHRlc3QgZm9yIGludGVyYWN0aW9uIGJldHdlZW4gRGVncmVlIHR5cGUgd2l0aGluIEdlbmRlcnMgKGFkanVzdG1lbnQgPSBIb2xtcyB0ZXN0KS4iKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KRnVydGhlcm1vcmUsIHRoaXMgUG9zdC1Ib2MgQW5hbHlzaXMgd2l0aCByZWdhcmRzIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIERlZ3JlZXMgd2l0aGluIEdlbmRlcnMgc2hvd3MgbmVnYXRpdmUgdmFsdWVzIGZvciBCYWNoZWxvcnMtRG9jdG9yYXRlIGFuZCBCYWNoZWxvcnMtTWFzdGVycyB3aXRoaW4gZWFjaCBHZW5kZXIgdHlwZS4gU2luY2UgdGhlIHJ1bGVzIHJlZ2FyZGluZyB0aGUgb3JkZXIgYXJlIHRoZSBzYW1lIHRoaXMgc2hvd3MgdGhhdCBmb3IgYm90aCBHZW5kZXJzLCB0aGUgTWVkaWFuIEluY29tZSBmb3IgdGhvc2Ugd2l0aCBhIEJhY2hlbG9ycyBEZWdyZWUgaGFzIGEgbG93ZXIgbWVhbiB2YWx1ZSB0aGFuIHRoZSBtZWFuIHZhbHVlIG9mIE1lZGlhbiBJbmNvbWUgZm9yIHRob3NlIHdpdGggYSBNYXN0ZXJzIG9yIERvY3RvcmF0ZSBEZWdyZWUgKGZvciB0aGUgc2FtZSBHZW5kZXIpLg0KDQpEb2N0b3JhdGUtTWFzdGVycyBzaG93cyBhIHBvc2l0aXZlIHZhbHVlLCBtZWFuaW5nIHRoYXQgZm9yIGJvdGggR2VuZGVycywgdGhlIE1lZGlhbiBJbmNvbWUgZm9yIHRob3NlIHdpdGggYSBEb2N0b3JhdGUgRGVncmVlIGhhcyBhIGhpZ2hlciBtZWFuIHZhbHVlIHRoYW4gdGhlIG1lYW4gdmFsdWUgb2YgTWVkaWFuIEluY29tZSBmb3IgdGhvc2Ugd2l0aCBhIE1hc3RlcnMgRGVncmVlIChmb3IgdGhlIHNhbWUgR2VuZGVyKS4NCg0KQXMgYWxsIG9mIHRoZSBpbnRlcmFjdGlvbnMgc2hvdyBhIHNpZ25pZmljYW5jZSBsZXZlbCB3aGVyZSBQLVZhbHVlIFw8IDAuMDUsIHdlIGRldGVybWluZSB0aGVtIHRvIGFsbCBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGFuZCB3aXRoIGxlc3MgdGhhbiBhIDUlIHByb2JhYmlsaXR5IHRvIG9jY3VyIGR1ZSB0byBjaGFuY2UgYWxvbmUuXA0KXA0KDQojIyMjIFtFZmZlY3QgUGxvdF17LnVuZGVybGluZX0NCg0KYGBge3IgZWNobz1GQUxTRX0NCiNJbnRlcmFjdGlvbiBiZXR3ZWVuIHZhcmlhYmxlcyAgDQojRWZmZWN0IFBsb3QgIA0KcGxvdChhbGxFZmZlY3RzKFR3b1dheU0xKSwgeWxhYj17Ik1lZGlhbiBJbmNvbWUgKCQpIn0sbWFpbj17IkVmZmVjdCBQbG90IG9mIE1lZGlhbiBJbmNvbWUgKCQpIHwgVVMgMTk5MS0yMDIxICJ9LCBsd2QgPSAyLCBsdHkgPSA1LCBtdWx0aWxpbmUgPSBULCBydWcgPSBULCBjb2xvcnMgPSBjKCJSZWQiLCAiRGVlcFNreUJsdWUiKSkNCmBgYA0KDQpGaWd1cmUgMy4zOiBBbiBFZmZlY3QgcGxvdCBzaG93aW5nIHRoZSBtZWFuIHZhbHVlcyBmb3IgZWFjaCBncm91cGluZyBvZiBNZWRpYW4gSW5jb21lIGJ5IHR3byBjYXRlZ29yaWNhbCB2YXJpYWJsZXMsIEdlbmRlciBhbmQgRGVncmVlLiBXaXRoIHRoZSBtZWFuIHZhbHVlcyBmb3IgRmVtYWxlcyBieSBEZWdyZWUgdHlwZSBhcyBhIHJlZCBsaW5lIGFuZCBibHVlIGZvciBNYWxlcy4gV2l0aCBwb2ludHMgcGxvdHRlZCBmb3IgZWFjaCB2YWx1ZS5cDQpcDQoNCkFzIHN0YXRlZCBieSAoSmF3YWlkLCBUaGFyaXEgYW5kIFNhYmEsIDIwMTkpIGFuIEVmZmVjdCBQbG90IHNob3dzIHRoZSBtZWFuIHJlc3BvbnNlIHZhbHVlcyBhdCBlYWNoIGxldmVsIG9mIGEgZGVzaWduIHBhcmFtZXRlciBvciBwcm9jZXNzIHZhcmlhYmxlLiBXZSBjYW4gc2VlIGZyb20gb3VyIEVmZmVjdCBQbG90IHRoYXQgdGhlIG1lYW4gdmFsdWVzIGFyZSBoaWdoZXIgZm9yIGVhY2ggaW5kaXZpZHVhbCBEZWdyZWUgVHlwZSBpZiB0aGUgR2VuZGVyIGlzIG1hbGUuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1lZGlhbiBpbmNvbWUgb2YgZ2VuZGVycyAod2l0aCBiYWNoZWxvcnMgb3Igb3ZlcikgaXMgb25lIG9mIG91ciBtYWluIGVmZmVjdHMsIHdoaWNoIHdlIGhhdmUgZGV0ZXJtaW5lZCB0byBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGFuZCBub3QgZHVlIHRvIGNoYW5jZSBhbG9uZS4NCg0KRm9yIGVhY2ggR2VuZGVyIHdlIGNhbiBzZWUgdGhhdCBCYWNoZWxvcnMgRGVncmVlIGhhdmUgdGhlIGxvd2VzdCB2YWx1ZXMgYW5kIERvY3RvcmF0ZSBoYXMgdGhlIGhpZ2hlc3QuIFdoaWNoIHdvdWxkIG1ha2Ugc2Vuc2UgYXMgdGhlIGxldmVsIG9mIGRpZmZpY3VsdHkgYW5kIHRpbWUgcmVxdWlyZWQgdG8gZ2V0IG9uZSBvZiB0aGVzZSBEZWdyZWVzIGdvZXMgaW4gb3JkZXIgZnJvbSBCYWNoZWxvcnMsIE1hc3RlcnMgYW5kIHRoZW4gRG9jdG9yYXRlLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgbGV2ZWxzIG9mIERlZ3JlZSBpcyBvdXIgc2Vjb25kIG1haW4gZWZmZWN0IHdoaWNoIHdlIGFnYWluIGRldGVybWluZWQgdG8gYmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhbmQgbm90IGR1ZSB0byBjaGFuY2UgYWxvbmUuDQoNCldlIGNhbiBhbHNvIHNlZSBmcm9tIG91ciBFZmZlY3QgUGxvdCB0aGF0IHRoZXJlIGlzIGEgY3Jvc3Mgb3ZlciB3aGVyZSBGZW1hbGVzIHdobyBhY2hpZXZlIGEgRG9jdG9yYXRlIERlZ3JlZSBoYXZlIGEgaGlnaGVyIG1lYW4gdmFsdWUgdGhhbiB0aGF0IG9mIE1hbGVzIHdobyBoYXZlIGEgQmFjaGVsb3JzLlwNClwNCg0KIyMjIyBbUHJlZGljdGVkIFZhbHVlc117LnVuZGVybGluZX0NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KVHdvV2F5UGxvdCA8LSBnZ2VmZmVjdChUd29XYXlNMSwgdGVybXMgPSBjKCJHZW5kZXIiLCAiRGVncmVlIikpDQoNCnBsb3QoVHdvV2F5UGxvdCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gYygiRmVtYWxlIiwgIk1hbGUiKSwgYnJlYWtzID0gYygxLDIpKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgIHZqdXN0ID0gLTQpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCB2anVzdCA9IDYpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgdmp1c3QgPSA2KSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwxLDEsMSksICJjbSIpKSArDQogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKHVuZGVybGluZSgiUHJlZGljdGVkIFZhbHVlcyBvZiBNZWRpYW4gSW5jb21lICgkKSIpKSkgKw0KICB5bGFiKCJNZWRpYW4gSW5jb21lICgkKSIpICsNCiAgeGxhYigiR2VuZGVyIikNCmBgYA0KDQpGaWd1cmUgMy40OiBQcmVkaWN0ZWQgdmFsdWVzIHBsb3QsIHNob3dpbmcgdGhlIG1lYW4gdmFsdWVzIGZvciBNZWRpYW4gSW5jb21lIChcJCkgZm9yIGVhY2ggR2VuZGVyIGFuZCBEZWdyZWUgdHlwZS4gV2l0aCBCYWNoZWxvcnMgYXMgcmVkLCBEb2N0b3JhdGUgYXMgYmx1ZSBhbmQgTWFzdGVycyBhcyBncmVlbi5cDQpcDQoNCklmIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gdGhlIHByZWRpY3RlZCB2YWx1ZSBpcyB0aGUgdmFsdWUgb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIChNZWRpYW4gSW5jb21lKSB3aGljaCBpcyBlcXVhbCB0byB0aGUgbWVhbiBvZiBhbGwgb2JzZXJ2YXRpb25zIGhhdmluZyB0aGF0IGNvbWJpbmF0aW9uIG9mIGZhY3RvciBsZXZlbHMgKE93ZW5zLCAyMDIyKS4gV2hpY2ggbWVhbnMgdGhhdCBzaW5jZSB3ZSBoYXZlIGEgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gKFAtVmFsdWUgXDwgMC4wNSkgdGhlIHByZWRpY3RlZCB2YWx1ZSBmb3IgZWFjaCBwYWlyaW5nIGlzIGVxdWFsIHRvIHRoZSBtZWFuIG9mIGVhY2ggcGFpcmluZyBvZiBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKEdlbmRlciBhbmQgRGVncmVlKS4NCg0KVGhpcyBwbG90IGFsbG93cyB1cyB0byBzZWUgbW9yZSBvZiBhIGNsZWFyZXIgcGljdHVyZSBhcyB0byBob3cgdGhlIHZhbHVlcyBvbmx5IGNyb3NzIG92ZXIgYXQgdGhlIGxvd2VzdCBtZWFuIHZhbHVlIGZvciBNYWxlcyBhbmQgdGhlIGhpZ2hlc3QgbWVhbiB2YWx1ZSBmb3IgRmVtYWxlcy4gQXMgd2UgY2FuIHNlZSB3aGVyZSB0aGUgcG9pbnQgZm9yIHRoZSBGZW1hbGUgc2lkZSBvdmVydGFrZXMgdGhlIGxvd2VzdCBvbiB0aGUgTWFsZSBzaWRlLg0KDQpXZSBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBpbnRlcmFjdGlvbiBiZXR3ZWVuIEdlbmRlciBhbmQgRGVncmVlIFR5cGUgb24gTWVkaWFuIGluY29tZSBpbiB0aGUgVVMgZnJvbSAxOTkxLTIwMjEsIHlldCB0aGUgcmVzdWx0cyB3ZXJlIG5vdCBxdWl0ZSBhcyBleHBlY3RlZCBhcyBpdCBoYXMgb25seSB1bmNvdmVyZWQgbW9yZSB0aGF0IG5lZWRzIHRvIGJlIGFuc3dlcmVkIHdpdGggcmVnYXJkcyB0byB0aGUgIndoeT8iLiBUaGUgc2lnbmlmaWNhbmNlIG9mIHRoZSBpbnRlcmFjdGlvbiBtYWlubHkgc2hvd3MgdGhhdCBtZW4gYXJlIGVhcm5pbmcgbW9yZSB3aGVuIGNvbXBhcmluZyB0aGUgY2VudHJhbCB0ZW5kZW5jaWVzIG9mIG91ciBwYWlyaW5ncyBvZiBncm91cHMsIHdpdGggb25seSBvbmUgY3Jvc3Mgb3ZlciAoYmVpbmcgdGhhdCBvZiBGZW1hbGU6RG9jdG9yYXRlIC0gTWFsZTpCYWNoZWxvcnMpLg0KDQpPbmUgd291bGQgZXhwZWN0IGZyb20gdGhhdCBvbiBhdmVyYWdlIGEgRG9jdG9yYXRlIERlZ3JlZSBtZWFudCB0aGF0IHlvdSB3b3VsZCBlYXJuIG1vcmUgdGhhbiBzb21lb25lIHdpdGggYSBCYWNoZWxvcnMsIGJ1dCB0aGUgZGF0YSBpcyBpbnRlcmVzdGluZyBpbiB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgdGltZSB0aGUgbWVhbiBvZiBNZWRpYW4gRmVtYWxlIEluY29tZSBzdXJwYXNzZXMgdGhhdCBvZiB0aGUgbWVhbiBvZiBNZWRpYW4gTWFsZSBJbmNvbWUuDQoNCklmIHRoaXMgaXMgdGhlIGNhc2UgZm9yIG1lYW4gdmFsdWVzIGZvciBGZW1hbGVzIHdpdGggRG9jdG9yYXRlIGRlZ3JlZXMgY29tcGFyZWQgdG8gTWFsZXMgd2l0aCBCYWNoZWxvcnMgdGhlbiB3aHkgaXMgbWVhbiBvZiBNZWRpYW4gSW5jb21lIGZvciBGZW1hbGVzIHdpdGggYSBNYXN0ZXJzIERlZ3JlZSBub3QgaGlnaGVyIHRoYW4gdGhhdCBvZiB0aGUgbWVhbiB2YWx1ZSBvZiBNYWxlcyB3aXRoIGEgQmFjaGVsb3JzIGRlZ3JlZT8gQSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gRGVncmVlIHR5cGUgaXRzZWxmIGlzIG9uZSBtYWluIGVmZmVjdCwgYnV0IHNpbmNlIHRoZXJlIGlzIGFsc28gYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gZ2VuZGVyIGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBib3RoLg0KDQpPbiBvbmUgaGFuZCwgb25lIG1heSBjb25jbHVkZSB0aGF0IHdoZW4gbG9va2luZyBhdCB0aGUgaW50ZXJhY3Rpb24gb2Ygb3VyIHR3byBpbmRlcGVuZGVudCB2YXJpYWJsZXMsIHRoZXJlIG11c3QgYmUgbW9yZSBmYWN0b3JzIGF0IHBsYXkgd2hpY2ggaGF2ZSBhbiBlZmZlY3Qgb2YgTWVkaWFuIEluY29tZSBpbiB0aGUgVVMgd2hpY2ggY2F1c2Ugd29tZW4gdG8gZWFybiBsZXNzIGRlc3BpdGUgdGhlaXIgZGVncmVlIGxldmVsLg0KDQpPbiB0aGUgb3RoZXIgaGFuZCwgaXQgbWF5IG5vdCBiZSB0aGUgZGVncmVlIGxldmVsIGl0c2VsZiB0aGF0IGFmZmVjdHMgdGhlIE1lZGlhbiBJbmNvbWUgTGV2ZWwgaW4gdGhlIFVTLCBidXQgcmF0aGVyIHRoZSBudW1iZXIgb2YgeWVhcnMgaW4gZWR1Y2F0aW9uIGFzIGEgRG9jdG9yYXRlIERlZ3JlZSBjYW4gdGFrZSBhIGZ1cnRoZXIgNS04IHllYXJzIHRvIGFjaGlldmUgYWZ0ZXIgY29tcGxldGluZyBhIE1hc3RlcnMgRGVncmVlLiBZZXQsIHRoaXMgd291bGQgbm90IGV4cGxhaW4gd2h5IEZlbWFsZXMgd2l0aCBhIERvY3RvcmF0ZSBEZWdyZWUgaGF2ZSBvbmx5IHNsaWdodGx5IGhpZ2hlciBtZWFuIHZhbHVlcyB0aGFuIHRoZSBtZWFuIHZhbHVlcyBvZiBNYWxlcyB3aXRoIGEgQmFjaGVsb3JzLg0KDQpGdXJ0aGVyIHJlc2VhcmNoIGFuZCBhbmFseXNpcyBvZiBvdGhlciBmYWN0b3JzIHdoaWNoIGhhdmUgYW4gZWZmZWN0IG9uIE1lZGlhbiBJbmNvbWUgbGV2ZWxzIGluIHRoZSBVUyB3aWxsIGhlbHAgdXMgdW5jb3ZlciBvdXIgcXVlc3Rpb24gZm9yIHRoZSAid2h5PyIuIFNpbmNlIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGF0IGVkdWNhdGlvbiBhdHRhaW5tZW50IGRvZXMgbm90IGd1YXJhbnRlZSBlcXVhbCBwYXkgZm9yIGJvdGggR2VuZGVycywgYXMgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gYW5kIHdpdGhpbiBib3RoIGNvbWJpbmF0aW9ucyBvZiBvdXIgaW50ZXJhY3Rpb25zIChiZXR3ZWVuIEdlbmRlcnMgd2l0aGluIERlZ3JlZSwgYmV0d2VlbiBEZWdyZWUgVHlwZSB3aXRoaW4gR2VuZGVycykuDQoNCk90aGVyIGZhY3RvcnMgd2hpY2ggbWF5IGFmZmVjdCBNZWRpYW4gSW5jb21lIGluIHRoZSBVUyBhcmUgZm9yIGUuZy4gc29jaWFsIHByZXNzdXJlcyBpbiBhbmQgb3V0c2lkZSBvZiB0aGUgd29ya3BsYWNlIGFuZCB3b3VsZCBiZSBhbiBpbnRlcmVzdGluZyB0b3BpYyB0byB1bmNvdmVyLiBVbmVtcGxveW1lbnQgcmF0ZSBmb3IgdGhvc2UgcGVvcGxlIHdpdGggYSBiYWNoZWxvcnMgZGVncmVlIG9yIGhpZ2hlciBjb3VsZCBhcyBsZWFkIHVzIGludG8gdGhlIHJpZ2h0IGRpcmVjdGlvbiBhcyB0byBhbnN3ZXJpbmcgd2h5IHRoZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIE1lZGlhbiBJbmNvbWUgb2NjdXJzIGJldHdlZW4gR2VuZGVycyBpbiB0aGUgVVMuXA0KXA0KXA0KXA0KXA0KXA0KXA0KXA0KDQojIyMgWyoqUGFydCA0IC0gRW1wbG95bWVudCBTdGF0dXMgYW5kIEdlbmRlciBmb3IgdGhvc2Ugd2l0aCBhIERlZ3JlZSBpbiB0aGUgVVMgZnJvbSAxOTkxIC0gMjAyMS4qKl17LnVuZGVybGluZX0NCg0KIyMjIFsqKkludHJvZHVjdGlvbioqXXsudW5kZXJsaW5lfQ0KDQpUaGUgZmluYWwgcGFydCBvZiB0aGlzIHByb2plY3Qgd2lsbCBiZSBhIGNvbnRpbnVhdGlvbiBvZiB3aGF0IHdlIGhhdmUgbG9va2VkIGF0IHNvIGZhci4gQXMgd2UgaGF2ZSBkaXNjb3ZlcmVkIHRoYXQgdGhlcmUgaGFzIGJlZW4gYSBzaWduaWZpY2FudCByaXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGluIHRoZSBVUywgd2hpY2ggaGFzIHNlZW4gdG8gYmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIE1hbGVzLg0KDQpEdXJpbmcgdGhlIHByZXZpb3VzIHBhcnQgb2YgdGhpcyBwcm9qZWN0IHdlIGZvdW5kIGEgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgRGVncmVlIGFuZCBHZW5kZXJzIHdoaWNoIGhhcyBzaG93biB0aGF0IEZlbWFsZXMgZWFybiBsZXNzIHRoYW4gTWFsZXMgZm9yIGV2ZXJ5IERlZ3JlZSBUeXBlIG91dCBvZiBCYWNoZWxvcnMsIE1hc3RlcnMgYW5kIERvY3RvcmF0ZSwgZXhjZXB0IGZvciB0aGUgb25lIG1lYW4gdmFsdWUgZm9yIEZlbWFsZXMgTWVkaWFuIEluY29tZSB3aXRoIGEgRG9jdG9yYXRlIHdoaWNoIHdhcyBhIGhpZ2hlciBtZWFuIG9mIE1lZGlhbiBJbmNvbWUgdGhhdCBvZiBhIE1hbGUgd2l0aCBCYWNoZWxvcnMNCg0KV2Ugd2lsbCBsb29rIGRlZXBlciBpbnRvIHRoZSBudW1iZXJzIHJlZ2FyZGluZyBNYWxlcyBhbmQgRmVtYWxlcyBvdmVyIHRoZSBhZ2Ugb2YgMjUgaW4gdGhlIFVTIHdpdGggYSBCYWNoZWxvcnMgRGVncmVlIG9yIGhpZ2hlciAoSW5jbHVkaW5nIHByb2Zlc3Npb25hbCBkZWdyZWUgaW4gdGhpcyBwYXJ0IG9mIHRoZSBzdHVkeSksIGFuZCB0aGUgY291bnRzIG9mIHRoZSBwb3B1bGF0aW9uIHJlZ2FyZGluZyB0aGVpciBlbXBsb3ltZW50IHN0YXR1cyBmb3IgZWFjaCBvZiB0aGUgeWVhcnMuDQoNCkFzIHN0YXRlZCBieSBDYXJleSBhbmQgSGFja2V0ICgyMDIyKS4gSW4gMjAyMSBpbiB0aGUgVVMsIHRoZSByYXRpbyBieSBHZW5kZXIgd2FzIDk4IG1hbGVzIHBlciAxMDAgZmVtYWxlcy4gRnJvbSB0aGlzIHJhdGlvLCB3ZSB3b3VsZCBleHBlY3QgbW9yZSBGZW1hbGVzIDI1IGFuZCBvdmVyLCB3aG8gaGF2ZSBhIEJhY2hlbG9ycyBvciBoaWdoZXIgdG8gYmUgaW4gZW1wbG95bWVudCBpbiBjb21wYXJpc29uIHRvIG1hbGVzLlwNClwNCg0KVGhlIFJlc2VhcmNoIFF1ZXN0aW9uIGZvciB0aGlzIHN0dWR5IGlzIGFzIGZvbGxvd3M6DQoNCipJcyB0aGVyZSBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMgZm9yIHRob3NlIHdobyBhcmUgMjUgYW5kIG92ZXIsIHdpdGggYSBCYWNoZWxvcidzIERlZ3JlZSBvciBoaWdoZXIgaW4gdGhlIFVTIGZyb20gMTk5MS0yMDIxPypcDQpcDQoNClRvIGFuc3dlciB0aGUgcXVlc3Rpb24gd2hldGhlciB0aGVyZSBpcyBhbnkgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgR2VuZGVyIG9mIHRob3NlIHdobyBoYXZlIGEgQmFjaGVsb3JzIERlZ3JlZSBvciBoaWdoZXIgYW5kIHRoZWlyIEVtcGxveW1lbnQgU3RhdHVzLiBBIGh5cG90aGVzaXMgd2lsbCBiZSBtYWRlIGFuZCBhbmFseXNlZCB1c2luZyB0aGUgcmVsZXZhbnQgdGVzdCBzdGF0aXN0aWNcDQpcDQoNCiMjIyMgW0NoaS1TcXVhcmUgVGVzdDpdey51bmRlcmxpbmV9DQoNCkFzIHdlIGFyZSB3b3JraW5nIHdpdGggcG9wdWxhdGlvbiBkYXRhLCB3ZSB3aWxsIHVzZSB0aGUgcG9wdWxhdGlvbiBhcyBjb3VudHMgZm9yIGVhY2ggcGFpcmluZ3Mgb2YgY2F0ZWdvcnkuIE91ciBkYXRhIGNvbnNpc3RzIG9mIHR3byBjYXRlZ29yaWNhbCB2YXJpYWJsZXMuIEdlbmRlcjogTWFsZSwgRmVtYWxlLiBFbXBsb3ltZW50IFN0YXR1czogRW1wbG95ZWQsIFVuZW1wbG95ZWQuDQoNClRoZSBDaGkgU3F1YXJlIFRlc3Qgb2YgSW5kZXBlbmRlbmNlIGlzIGEgbm9ucGFyYW1ldHJpYyB0ZXN0IHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGVyZSBhcmUgYXNzb2NpYXRpb25zIG9yIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIGNhdGVnb3JpY2FsIG9yIG5vbWluYWwgdmFyaWFibGVzLiBJbiB0aGlzIGNhc2Ugb2Ygb3VyIGRhdGEgc2V0LCB0aGUgZXhwZWN0ZWQgY291bnRzIGFyZSB1bmtub3duIGFuZCB0aGVyZWZvcmUgYSB0ZXN0IG9mIGFzc29jaWF0aW9uIHdpbGwgYmUgZG9uZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY2hhcmFjdGVyIGZyZXF1ZW5jaWVzIG9mIG91ciB0d28gZ3JvdXBzIEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMsIGhhdmUgYSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiB3aXRoIG9uZSBhbm90aGVyLlwNClwNCg0KIyMjIyBbSHlwb3RoZXNpczpdey51bmRlcmxpbmV9DQoNCi0gICBIMDogVGhlcmUgaXMgbm8gYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgU3RhdHVzIGZvciB0aG9zZSAyNSBhbmQgb3Zlciwgd2l0aCBhIEJhY2hlbG9yJ3MgRGVncmVlIG9yIGhpZ2hlciBpbiB0aGUgVVMuDQoNCi0gICBIMTogVGhlcmUgaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgU3RhdHVzIGZvciB0aG9zZSAyNSBhbmQgb3Zlciwgd2l0aCBhIEJhY2hlbG9yJ3MgRGVncmVlIG9yIGhpZ2hlciBpbiB0aGUgVVMuDQoNCkZvciB0aGlzIHN0dWR5IHdlIHNldCBhIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAwLjA1LCB3aGljaCBtZWFucyB3ZSBhcmUgd2lsbGluZyB0byBzYXkgdGhhdCB0aGUgdGhlcmUgaXMgYSA1JSBjaGFuY2UgdGhhdCB0aGUgcmVzdWx0cyB3aWxsIG9jY3VyIGR1ZSB0byBjaGFuY2UgYWxvbmUuIE9ubHkgd2hlbiBvdXIgcC12YWx1ZSBpcyBsb3dlciB0aGFuIG91ciBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgMC4wNSBjYW4gd2UgcmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMgYW5kIGRldGVybWluZSB0aGF0IHRoZSBSZXNlYXJjaCBIeXBvdGhlc2lzIGlzIG1vcmUgYXR0cmFjdGl2ZS5cDQpcDQoNCiMjIyBbKipNZXRob2QqKl17LnVuZGVybGluZX0NCg0KVG8gc3RhcnQgb3VyIGFuYWx5c2lzIHRoZSByZWxldmFudCBwYWNrYWdlcyBhcmUgbG9hZGVkIGludG8gUiBTdHVkaW8uDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojTG9hZGluZyBQYWNrYWdlcw0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeSh2Y2QpDQpgYGANCg0KVGhlbiB0aGUgZGF0YSBoYXMgYmVlbiBzb3VyY2VkIGZyb20gd3d3LmJldGEuYmxzLmdvdi4gTXVsdGlwbGUgdGFibGVzIGhhdmUgYmVlbiBkb3dubG9hZGVkIGZvciBib3RoIEdlbmRlcnMgd2l0aCB0aGUga2V5IHdvcmRzIG9mICIyNSBZZWFycyBhbmQgT3ZlciIsICJCYWNoZWxvcnMgRGVncmVlIiwgIkVtcGxveWVkIiwgIlVuZW1wbG95ZWQiLiBTaW5jZSB0aGUgdGFibGVzIHdlcmUgc2VwYXJhdGVkIGJ5IEdlbmRlciwgRW1wbG95bWVudCBTdGF0dXMgYW5kIGZvciB0aGUgRmVtYWxlIERhdGEgYnkgcmFjZS4gT25jZSBkb3dubG9hZGVkIHRoZSBkYXRhIHdhcyB0cmFuc2Zvcm1lZCBpbiBFeGNlbCBhbmQgbG9hZGVkIGludG8gUiBzdHVkaW8gZm9yIGFuYWx5c2lzLlwNClwNCg0KIyMjIyBbRGF0YSBTZXRdey51bmRlcmxpbmV9DQoNCioqKlBvcHVsYXRpb24gRGF0YSoqKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KI0RhdGENCkVtcFN0YXR1c0dlbmRlciA8LSByZWFkLmNzdigiQzovVXNlcnMvZWRyZW4vT25lRHJpdmUvRGVza3RvcC9EYXRhIEFuYWx5c2lzL1IgV29ya2luZyBEaXJlY3RvcnkvRmluYWwgUHJvamVjdCBBc3NpZ25tZW50L0RhdGFzZXRzL0RhdGFTZXRzL0VtcFN0YXR1c0dlbmRlcl8yNWFuZE92ZXJCYWNoZWxvcnNPckhpZ2hlci5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzPVRSVUUpDQoNCg0KI0NsZWFuDQoNCm5hbWVzKEVtcFN0YXR1c0dlbmRlcikgPC0gYygiWWVhciIsICJRIiwgIkVtcC5TdGF0dXMiLCAiR2VuZGVyIiwgIlRvdGFsLkNvdW50IikNCg0KI0luaXRpYWwgTG9vayBhdCBvdXIgRGF0YQ0KDQpoZWFkKEVtcFN0YXR1c0dlbmRlcikNCg0KdGFpbChFbXBTdGF0dXNHZW5kZXIpDQoNClRhYmxlRW1wR2VuZGVyMSA8LSByYmluZChoZWFkKEVtcFN0YXR1c0dlbmRlciksICIuLi4iLCB0YWlsKEVtcFN0YXR1c0dlbmRlcikpDQoNClRhYmxlRW1wR2VuZGVyMQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCmthYmxlKFRhYmxlRW1wR2VuZGVyMSwgcm93Lm5hbWVzID0gRiwgY2FwdGlvbiA9ICJUYWJsZSA0LjE6IEJMUyBCZXRhIExhYnMgZGF0YSByZWdhcmRpbmcgVG90YWwgRW1wbG95ZWQvVW5lbXBsb3llZCBmcm9tIDIwMTUtMjAyMSAoUTEtUTQpIGJ5IEdlbmRlci4gVGhlIGNvdW50IG9mIHRoaXMgZGF0YSBpcyBpbiB0aG91c2FuZHMiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIikgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBmb250X3NpemUgPSAxNSkNCmBgYA0KDQpUaGlzIGlzIGhvdyB0aGUgZGF0YSBsb29rZWQgb25jZSBpdCB3YXMgdHJhbnNmb3JtZWQgYW5kIGxvYWRlZCBpbnRvIFIgU3R1ZGlvLiBJdCBwcm92aWRlcyBjb3VudCBkYXRhIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGluIHRoZSBVUyAoaW4gdGhvdXNhbmRzKSwgZm9yIHRob3NlIDI1IFllYXJzIGFuZCBPdmVyIHdpdGggYSBCYWNoZWxvcnMgRGVncmVlIG9yIGhpZ2hlci4gU2VwYXJhdGVkIGludG8gUTEtNCAocXVhcnRlcikgZm9yIGVhY2ggeWVhciwgYW5kIGJ5IEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMuDQoNCkluIG9yZGVyIGZvciBrZWVwIG91ciBDaGktU3F1YXJlIFRlc3Qgb2YgSW5kZXBlbmRlbmNlIGZhaXIgYW5kIHNpbmNlIHdlIGFyZSBsb29raW5nIGF0IHBvcHVsYXRpb24gZGF0YSB0aHJvdWdob3V0IHRoZSBkaWZmZXJlbnQgeWVhcnMsIHdlIHdpbGwgdGFrZSBhIHNhbXBsZSBvZiB0aGlzIGRhdGEgc2V0IGJ5IGxvb2tpbmcgc3BlY2lmaWNhbGx5IGF0IG9uZSB5ZWFyIGFuZCBvbmUgcXVhcnRlci4gVGhpcyB3aWxsIGJlIGRvbmUgYnkgdXNpbmcgUiB0byBmaWx0ZXIgdGhlIGRhdGEgYnkgYSByYW5kb20geWVhciBhbmQgcXVhcnRlclwNClwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNTZWxlY3QgUmFuZG9tIFllYXIgYW5kIFENCg0Kc2VsZWN0ZWRfeWVhciA8LSBzYW1wbGUodW5pcXVlKEVtcFN0YXR1c0dlbmRlciRZZWFyKSwgMSkNCg0Kc2VsZWN0ZWRfcXVhcnRlciA8LSBzYW1wbGUodW5pcXVlKEVtcFN0YXR1c0dlbmRlciRRKSwgMSkNCg0KUmFuZG9tU2FtcGxlIDwtIEVtcFN0YXR1c0dlbmRlciAlPiUNCiAgZmlsdGVyKFllYXIgPT0gIjIwMTYiLCBRID09ICJRMiIpDQpgYGANCg0KKioqU2FtcGxlIERhdGEqKioNCg0KYGBge3IgZWNobz1GQUxTRX0NCiNTYW1wbGUNCg0KI0xvb2tpbmcgYXQgb3VyIFNhbXBsZQ0KDQprYWJsZShSYW5kb21TYW1wbGUsIHJvdy5uYW1lcyA9IEYsIGNhcHRpb24gPSAiVGFibGUgNC4yOiBSYW5kb20gWWVhciBhbmQgUSBzZWxlY3RlZCB0byBnZW5lcmF0ZSBhIFNhbXBsZSBmcm9tIG91ciBvcmlnaW5hbCBkYXRhIGZyb20gQkxTIEJldGEgTGFicyBkYXRhLiBTaG93aW5nIFRvdGFsIEVtcGxveWVkL1VuZW1wbG95ZWQgYnkgR2VuZGVyLiBUaGUgY291bnQgb2YgdGhpcyBkYXRhIGlzIGluIHRob3VzYW5kcyAoSykiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KT3VyIHNhbXBsZSBkYXRhIGlzIGZvciAyMDE2IGluIFEyLlwNClwNCg0KIyMjIyBbQ29udGluZ2VuY3kgVGFibGVdey51bmRlcmxpbmV9DQoNCmBgYHtyIGVjaG89RkFMU0V9DQojQ29udGluZ2VuY3kgVGFibGUNCg0KR3JvdXBlZERhdGEgPC0geHRhYnMoVG90YWwuQ291bnQgfiBFbXAuU3RhdHVzICsgR2VuZGVyLCBkYXRhID0gUmFuZG9tU2FtcGxlKQ0KDQpDb250aW5nZW5jeVRhYmxlIDwtIGFzLmRhdGEuZnJhbWUubWF0cml4KEdyb3VwZWREYXRhKQ0KDQprYWJsZShDb250aW5nZW5jeVRhYmxlLCBjYXB0aW9uID0gIlRhYmxlIDQuMzogQ29udGluZ2VuY3kgVGFibGUgdGFrZW4gZnJvbSBvdXIgUmFuZG9tIFNhbXBsZSwgZm9yIHRoZSB5ZWFyIDIwMTYgYW5kIFEyLCBzaG93aW5nIGNvdW50cyAoaW4gdGhvdXNhbmRzKSBmb3IgdGhlIHBhaXIgb2Ygb3VyIGNhdGVnb3JpY2FsIHZhaXJhYmxlcy4iKSAlPiUNCiAgICAgICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQoNCmBgYA0KDQpGcm9tIHRoZSBpbml0aWFsIGxvb2sgYXQgb3VyIHRhYmxlIHdlIGNhbiB0aGF0IGZvciB0aGUgeWVhciAyMDE2IFEyLCB0aGVyZSBhcmUgbW9yZSBNYWxlcyB3aG8gYXJlIGVtcGxveWVkIHRoYW4gRmVtYWxlcywgMjEsMzg2IGZvciBFbXBsb3llZCBtYWxlcyBhbmQgMTk4NjcgZm9yIEVtcGxveWVkIEZlbWFsZXMgKGluIHRob3VzYW5kcykuIE1vcmUgRmVtYWxlcyBhcmUgc2VlbiB0byBiZSBVbmVtcGxveWVkIHRoYW4gTWFsZXMgZm9yIHRob3NlIDI1IHllYXJzIGFuZCBPdmVyIHdpdGggYSBCYWNoZWxvcnMgRGVncmVlIG9yIGhpZ2hlciwgd2l0aCB2YWx1ZXMgb2YgMTA2IGZvciBGZW1hbGVzIGFuZCA3MCBmb3IgTWFsZXMgKGluIHRob3VzYW5kcykuDQoNClNpbmNlIHRoaXMgZGF0YSBpcyBpbiB0aG91c2FuZHMsIHdoZW4gY29udmVydGluZyBpdCBiYWNrIHRvIHJlYWwgbnVtYmVycyB0aGUgZGlmZmVyZW5jZSBpbiBFbXBsb3ltZW50IHN0YXR1cyBjYW4gc2VlbSBhIGxvdCBtb3JlIHN1YnN0YW50aWFsLiBXaXRoIHRoZSBudW1iZXJzIG9mIEVtcGxveWVkIDIxLDM4NiwwMDAgYW5kIDE5LDg2NywwMDAgZm9yIE1hbGVzIGFuZCBGZW1hbGVzIFJlc3BlY3RpdmVseS4gV2hldGhlciB0aGlzIGRpZmZlcmVuY2Ugb2Ygb3ZlciAxLDAwMCwwMDAgaXMgYSBzaWduIG9mIGEgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb24gb3Igbm90IGlzIHdoYXQgd2Ugd2lsbCBkZXRlcm1pbmUgaW4gdGhpcyBzdHVkeS5cDQpcDQoNCiMjIyMgW09ic2VydmVkIFZhbHVlc117LnVuZGVybGluZX0NCg0KKioqWWF0ZXMgQ29ycmVjdGlvbioqKg0KDQpPYnNlcnZlZCB2YWx1ZXMgYXJlIHRoZSB2YWx1ZXMgd2hpY2ggYXJlIHNlZW4gaW4gb3VyIGRhdGEgd2l0aGluIGVhY2ggY2F0ZWdvcnkgcGFpci4NCg0KVG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBZYXRlcyBDb3JyZWN0aW9uIG9yIG5vdCB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGUgdG90YWwgTiBvZiBvdXIgcG9wdWxhdGlvbiBpcyBsb3dlciB0aGFuIDQwLiBBcyBzdGF0ZWQgYnkgKEdpYW5uaW5pLCAyMDA1KSBZYXRlcyBjb3JyZWN0aW9uIGlzIHVzZWQgdG8gY29tcGVuc2F0ZWQgZm9yIGRldmlhdGlvbiBmcm9tIHRoZSB0aGVvcmV0aWNhbCBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gd2hlbiB0aGUgdG90YWwgTiBmb3IgYSAyeDIgQ2hpLVNxdWFyZSB0YWJsZSBpcyBsZXNzIHRoYW4gNDAuIFdoZW4gdGhlIHN1bSBvZiBhbGwgb3VyIG9ic2VydmVkIHZhbHVlcyBpcyBsZXNzIHRoYW4gNDAgWWF0ZXMgY29ycmVjdGlvbiBpcyB1c2VkIHRvIG1ha2UgYSBtb3JlIGFjY3VyYXRlIGFuYWx5c2lzLg0KDQpUaGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSB0aGlzIG51bWJlciwgYXMgd2UgY2FuIGNsZWFybHkgc2VlIHRoZSBOIGlzIGxhcmdlciB0aGFuIDQwLiBTaW5jZSBlYWNoIGdyb3VwIGlzIGxhcmdlciB0aGFuIDQwLiBUaGVyZWZvcmUgd2UgY2FuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgc3RhZ2Ugb2Ygb3VyIGFuYWx5c2lzLlwNClwNCg0KIyMjIyBbRXhwZWN0ZWQgVmFsdWVzXXsudW5kZXJsaW5lfQ0KDQoqKipGaXNoZXJzIEV4YWN0IFRlc3QqKioNCg0KVG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBGaXNoZXJzIGV4YWN0IHRlc3Qgb3Igbm90IHdlIHdpbGwgY2hlY2sgdGhlIEV4cGVjdGVkIFZhbHVlcy4gRXhwZWN0ZWQgVmFsdWVzIGFyZSB0aGUgZnJlcXVlbmN5IHRoYXQgd2Ugd291bGQgZXhwZWN0IGluIGEgY2VsbCBvbiBhdmVyYWdlIGlmIHRoZSB2YXJpYWJsZXMgYXJlIGluZGVwZW5kZW50IChNaW5pdGFiLCAyMDIzKS4NCg0KRmlzaGVycyBleGFjdCB0ZXN0IGlzIHVzZWQgd2hlbiAyMCUgb3IgbW9yZSBvZiB0aGUgRXhwZWN0ZWQgVmFsdWVzIGhhdmUgYSBjb3VudCBvZiA1IG9yIGxvd2VyIChOb3dhY2tpLCAyMDE3KS4gQWdhaW4sIGl0IGlzIHVzZWQgdG8gbWFrZSBhIG1vcmUgc3RhdGlzdGljYWxseSBhY2N1cmF0ZSBhbmFseXNpcyB3aGVuIGNvbXBhcmluZyB0aGUgT2JzZXJ2ZWQgYW5kIEV4cGVjdGVkIHZhbHVlcy4NCg0KVGhlcmVmb3JlLCB3ZSBydW4gYSBDaGktU3F1YXJlIFRlc3Qgd2l0aCBvdXIgY29udGluZ2VuY3kgdGFibGUgYW5kIHBsb3QgdGhlIGV4cGVjdGVkIHZhbHVlcyB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgdXNlIEZpc2hlcnMgRXhhY3QgVGVzdCBvciBub3QuXA0KXA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KI0Rvbid0IFNIb3cgb3V0cHV0IGZvciB0aGlzLg0KDQpUZXN0MSA8LSBjaGlzcS50ZXN0KENvbnRpbmdlbmN5VGFibGUsIGNvcnJlY3QgPSBGQUxTRSkNCg0KVGVzdDENCg0KI04gPiA0MCwgbm90IHVzaW5nIFlhdGVzIENvcnJlY3Rpb24NCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyNFeHBlY3RlZCBWYWx1ZXMNCg0Ka2FibGUocm91bmQoVGVzdDEkZXhwZWN0ZWQsMyksIGNhcHRpb24gPSAiVGFibGUgNC40OiBFeHBlY3RlZCBWYWx1ZXMgb2Ygb3VyIHJhbmRvbSBzYW1wbGUgb2YgdGhlIHBvcHVsYXRpb24gZGF0YS4gVGhlIGNvdW50IG9mIHRoaXMgZGF0YSBpcyBpbiB0aG91c2FuZHMgKEspIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGZvbnRfc2l6ZSA9IDE1KSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJFbXBsb3ltZW50IiA9IDEsICJFeHBlY3RlZCBWYWx1ZXMiID0gMikpDQoNCiNNb3JlIHRoYW4gMjAlIG9mIGV4cGVjdGVkIHZhbHVlcyBhcmUgbm90IGxlc3MgdGhhbiA1LiB3b24ndCB1c2UgZmlzaGVyDQpgYGANCg0KTm9uZSBvZiB0aGUgRXhwZWN0ZWQgdmFsdWVzIGFyZSBsb3dlciB0aGFuIDUgYW5kIGFsbCB0aGUgYXNzdW1wdGlvbnMgb2YgdGhlIENoaS1TcXVhcmUgVGVzdCBvZiBJbmRlcGVuZGVuY2UgYXJlIG1ldCwgc28gd2UgY29udGludWUgd2Ugd2lsbCBjb250aW51ZSBvdXIgYW5hbHlzaXMgd2l0aCB0aGUgcmVndWxhciBDaGktU3F1YXJlIFRlc3Qgb2YgSW5kZXBlbmRlbmNlIHRvIGFuYWx5c2Ugd2hldGhlciB0aGVyZSBpcyBhbiBhc3NvY2lhdGlvbiBvciBub3QgYmV0d2VlbiBvdXIgdHdvIGNhdGVnb3JpY2FsIHZhcmlhYmxlcy5cDQpcDQoNCiMjIyBbUmVzdWx0c117LnVuZGVybGluZX0NCg0KIyMjIyBbUmVwb3J0OiBYLXNxdWFyZWQoMSkgPSAxMC4yMjMsIFAgVmFsdWUgXDwgMC4wNV17LnVuZGVybGluZX0NCg0KYGBge3IgZWNobz1GQUxTRX0NCiNUZXN0IG91dHB1dA0KDQpUZXN0MQ0KYGBgDQoNCkZyb20gb3VyIHJlc3VsdHMgb2YgUGVhcnNvbidzIENoaS1TcWF1cmVkIFRlc3Qgb2YgSW5kZXBlbmRlbmNlIHdlIGdldCB0aGUgcmVzdWx0IG9mIGEgUC1WYWx1ZSBcPCAwLjA1LiBUaGVyZWZvcmUgd2UgYXJlIGFibGUgdG8gcmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMgdGhhdCB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGFzc29jaWF0aW9uIGJldHdlZW4gR2VuZGVyIGFuZCBFbXBsb3ltZW50IFN0YXR1cyBmb3IgdGhvc2UgMjUgYW5kIG92ZXIsIHdpdGggYSBCYWNoZWxvcnMgRGVncmVlIG9yIGhpZ2hlciBpbiB0aGUgVVMgZnJvbSAxOTkxLTIwMjEuXA0KXA0KDQojIyMgWyoqRGlzY3Vzc2lvbioqXXsudW5kZXJsaW5lfQ0KDQojIyMjIFtPYnNlcnZlZCBWYWx1ZXMsIEV4cGVjdGVkIFZhbHVlcyBhbmQgQ2hpLVNxdWFyZSBDb21wb25lbnRzXXsudW5kZXJsaW5lfQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI1RhYmxlIGZvciBEaXNjdXNzaW9uDQoNCiNPYnNlcnZlZCBWYWx1ZXMsIEV4cGVjdGVkLCBDaGkgU3F1YXJlZCBDb21wb25lbnRzIGluIDEgdGFibGUNCg0KbWVyZ2VkX3RhYmxlcyA8LSBjYmluZChUZXN0MSRvYnNlcnZlZCwgcm91bmQoVGVzdDEkZXhwZWN0ZWQsMyksIHJvdW5kKFRlc3QxJHJlc2lkdWFsc14yLDQpKQ0KDQprYWJsZShtZXJnZWRfdGFibGVzLCBjYXB0aW9uID0gIlRhYmxlIDQuNTogT2JzZXJ2ZWQgVmFsdWVzLCBFeHBlY3RlZCBWYWx1ZXMgYW5kIHRoZSBDaGktU3F1YXJlIENvbXBvbmVudHMgb2Ygb3VyIHJhbmRvbSBzYW1wbGUgb2YgdGhlIHBvcHVsYXRpb24gZGF0YS4gVGhlIGNvdW50IG9mIHRoaXMgZGF0YSBpcyBpbiB0aG91c2FuZHMgKEspIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGZvbnRfc2l6ZSA9IDE1KSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJPYnNlcnZlZCBWYWx1ZXMiID0gMiwgIkV4cGVjdGVkIFZhbHVlcyIgPSAyLCAiQ2hpLVNxdWFyZWQgQ29tcG9uZW50cyIgPSAyKSkNCg0KDQpgYGANCg0KV2hlbiBjb21wYXJpbmcgdGhlIFZhbHVlcyBvZiBvdXIgQ2hpLVNxdWFyZSBUZXN0IGl0IGlzIGdvb2QgdG8gbG9vayBmaXJzdCBhdCB0aGUgQ2hpLVNxdWFyZWQgQ29tcG9uZW50cy4gQ2hpIFNxdWFyZSBDb21wb25lbnRzIGFyZSB0aGUgcmVzaWR1YWxzIG9mIG91ciB0ZXN0IHNxdWFyZWQuIFRoZSByZXNpZHVhbHMgYXJlIGhvdyBtdWNoIHRoZSBPYnNlcnZlZCBWYWx1ZXMgZGlmZmVyIGZyb20gdGhlIEV4cGVjdGVkIFZhbHVlcy4NCg0KRm9yIEZlbWFsZXMgYSBDaGktU3F1YXJlZCBDb21wb25lbnQgdmFsdWUgb2YgNS4yNzIwIGluIHRoZSBVbmVtcGxveWVkIFJvdywgc2hvd3MgdGhhdCB0aGUgT2JzZXJ2ZWQgVmFsdWVzIGZvciBVbmVtcGxveWVkIEZlbWFsZXMgYXJlIHZlcnkgZGlmZmVyZW50IGZyb20gd2hhdCBpcyBFeHBlY3RlZCBWYWx1ZXMuIFdoZW4gbG9va2luZyBhdCB0aGUgc2FtZSByb3cgYnV0IGZvciBNYWxlcywgd2Ugc2VlIGEgQ2hpLVNxdWFyZWQgQ29tcG9uZW50IG9mIDQuOSwgd2hpY2ggcHJvdmlkZXMgdGhlIHNhbWUgZXhwbGFuYXRpb24gb2YgYSBsYXJnZSBkaWZmZXJlbmNlIGJldHdlZW4gT2JzZXJ2ZWQgYW5kIEV4cGVjdGVkIFZhbHVlcyBmb3IgTWFsZXMuDQoNClNpbmNlIHRoZSBFbXBsb3llZCBjb2x1bW4gc2hvd3MgQ2hpLVNxdWFyZWQgVmFsdWVzIG9mIDAuMDIyNSBhbmQgMC4wMjA5IGZvciBNZW4gYW5kIFdvbWVuIHJlc3BlY3RpdmVseSwgd2Ugd2lsbCBub3Qgd29ycnkgYWJvdXQgdGhpcyBjb2x1bW4gYXMgdGhpcyB3aWxsIG5vdCBiZSB3aGVyZSB0aGUgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb24gbGllcy4NCg0KQWx0aG91Z2gsIENoaS1TcXVhcmVkIENvbXBvbmVudHMgZG8gbm90IHNob3cgdGhlIGRpcmVjdGlvbiBieSB3aGljaCB0aGUgZGlmZmVyZW5jZSBvY2N1cnMuIFRoaXMgY2FuIHNpbXBseSBiZSBkb25lIGJ5IGNvbXBhcmluZyB0aGUgT2JzZXJ2ZWQgYW5kIEV4cGVjdGVkIHZhbHVlcyBvZiBlYWNoIGNhdGVnb3JpY2FsIHZhcmlhYmxlLg0KDQpBZ2FpbiBqdXN0IGxvb2tpbmcgYXQgVW5lbXBsb3llZCBmb3IgYm90aCBHZW5kZXIsIHdlIGNhbiBzZWUgdGhhdCBmb3IgRmVtYWxlcyB0aGUgT2JzZXJ2ZWQgVmFsdWUgaXMgMTA2LDAwMCAoMTA2LCBUcmFuc2xhdGVkIHRvIHJlYWwgd29ybGQgbnVtYmVycykgYXMgY29tcGFyZWQgdG8gdGhlIEV4cGVjdGVkIFZhbHVlIG9mIDg0LDk1MCAob3IgODQuODUpLiBTaG93aW5nIGEgUG9zaXRpdmUgQ29ycmVsYXRpb24gYmV0d2VlbiBGZW1hbGVzIGFuZCBVbmVtcGxveW1lbnQuU2luY2Ugb3VyIFAtVmFsdWUgXDwgMC4wNSB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIHNpZ25pZmljYW50bHkgbW9yZSBVbmVtcGxveWVkIEZlbWFsZXMgdGhhbiB3ZSB3b3VsZCBFeHBlY3QgYW5kIGFyZSBkdWUgdG8gZmFjdG9ycyBvdGhlciB0aGFuIGNoYW5jZSBhbG9uZS4NCg0KVGhlIHJldmVyc2UgaXMgc2hvd24gdG8gYmUgdHJ1ZSBmb3IgTWFsZXMsIHdpdGggYW4gT2JzZXJ2ZWQgVmFsdWUgb2YgNzAsMDAwICg3MCkgYW5kIGFuIEV4cGVjdGVkIFZhbHVlIG9mIDkxLDE1MCAoOTEuMTUpLCB0aGlzIHNob3dzIHRoYXQgdGhlcmUgYXJlIHNpZ25pZmljYW50bHkgbGVzcyBVbmVtcGxveWVkIE1hbGVzIHRoYW4gd2Ugd291bGQgRXhwZWN0LiBBIG5lZ2F0aXZlIGNvcnJlbGF0aW9uLiBXaGljaCBhZ2FpbiB3ZSBjYW4gY29uY2x1ZGUgdGhhdCB0aGVzZSByZXN1bHRzIGFyZSBkdWUgdG8gZmFjdG9ycyBvdGhlciB0aGFuIGNoYW5jZSBhbG9uZSAoUC1WYWx1ZSBcPCAwLjA1KS5cDQpcDQoNCiMjIyMgW1Zpc3VhbGl6YXRpb25dey51bmRlcmxpbmV9DQoNCmBgYHtyIGVjaG89RkFMU0V9DQphc3NvY2lhdGlvbl9wbG90IDwtIGFzc29jKEdyb3VwZWREYXRhLCBzaGFkZSA9IFQsIGxhcyA9IDMsIG1haW4gPSAiQXNzb2NpYXRpb24gUGxvdCBvZiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgU3RhdHVzIikNCg0KDQojRmlndXJlOiA0LjE6IEFzc29jaWF0aW9uIFBsb3Qgc2hvd2luZyBQZWFyc29uIHJlc2lkdWFscyBmb3Igb3VyIENoaSBTcXVhcmVkIHRlc3Qgb2YgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gR2VuZGVyIGFuZCBFbXBsb3ltZW50IFN0YXR1cy4gDQojIEEgcG9zaXRpdmUgYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgc3RhdHVzIGlzIGluZGljYXRlZCB3aXRoIGEgYmFyIGFib3ZlIHRoZSBkb3R0ZWQgbGluZSwgDQojIEEgbmVnYXRpdmUgYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgc3RhdHVzIGlzIGluZGljYXRlZCB3aXRoIGEgYmFyIGJlbG93IHRoZSBkb3R0ZWQgbGluZS4NCiMgVGhlIHN0cmVuZ3RoIG9mIHRoZSBhc3NvY2lhdGlvbiBpcyBpbmRpY2F0ZWQgYnkgdGhlIHNpemUgb2YgdGhlIGJhci4NCmBgYA0KDQpGaWd1cmUgNC4xOiBBc3NvY2lhdGlvbiBQbG90IHNob3dpbmcgUGVhcnNvbiByZXNpZHVhbHMgZm9yIG91ciBDaGkgU3F1YXJlZCB0ZXN0IG9mIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMuIEEgcG9zaXRpdmUgYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgc3RhdHVzIGlzIGluZGljYXRlZCB3aXRoIGEgYmFyIGFib3ZlIHRoZSBkb3R0ZWQgbGluZSwgQSBuZWdhdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIEdlbmRlciBhbmQgRW1wbG95bWVudCBzdGF0dXMgaXMgaW5kaWNhdGVkIHdpdGggYSBiYXIgYmVsb3cgdGhlIGRvdHRlZCBsaW5lLiBUaGUgc3RyZW5ndGggb2YgdGhlIGFzc29jaWF0aW9uIGlzIGluZGljYXRlZCBieSB0aGUgc2l6ZSBvZiB0aGUgYmFyLlwNClwNCg0KVGhpcyBwbG90IHNob3dzIHRoZSBQZWFyc29uIFJlc2lkdWFscyBmb3Igb3VyIENoaS1TcXVhcmUgVGVzdCBmb3IgZWFjaCBwYWlyIG9mIG91ciB0d28gY2F0ZWdvcmljYWwgdmFyaWFibGVzIEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMuIEl0IGFsbG93cyB1cyB0byBnZXQgbW9yZSBvZiBhIHZpc3VhbCB1bmRlcnN0YW5kaW5nIGFzIHRvIHdoZXJlIHRoZSBhc3NvY2lhdGlvbiBsaWVzIGJldHdlZW4gR2VuZGVyIGFuZCBFbXBsb3ltZW50IFN0YXR1cyBmb3Igb3VyIHNhbXBsZSBkYXRhIHNldC4NCg0KVGhlIGxpbmUgYWJvdmUgdGhlIGJhciBzaG93cyB0aGF0IG1vcmUgRmVtYWxlcyBhcmUgT2JzZXJ2ZWQgdG8gYmUgVW5lbXBsb3llZCB0aGFuIEV4cGVjdGVkLCBhbmQgdGhlIGxpbmUgYmVsb3cgdGhlIGJhciBzaG93cyB0aGF0IGxlc3MgTWFsZXMgYXJlIE9ic2VydmVkIHRvIGJlIFVuZW1wbG95ZWQgdGhhbiBleHBlY3RlZC4NCg0KVGhlIFAtVmFsdWUgb2YgMC4wMDEzODcgc2hvd3MgYSBoaWdoIHNpZ25pZmljYW5jZSBpbiB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgc3RhdHVzLiBBcyBoaWdobGlnaHRlZCBieSB0aGUgYmx1ZSBhbmQgcmVkIGJhcnMsIHdlIGNhbiBzZWUgdGhhdCB0aGUgdGhlIHNpZ25pZmljYW5jZSBsaWVzIGluIFVuZW1wbG95bWVudC4gVGhlIGdyZXkgaGlnaGxpZ2h0cyB0aGFuIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGFzc29jaWF0aW9uIGluIHRoZXNlIHJlc3VsdHMgd2l0aCByZWdhcmRzIHRvIHRob3NlIHdobyBhcmUgRW1wbG95ZWQuDQoNClRoZSBsaW5lIGFib3ZlIHRoZSBiYXIgc2hvd3MgdGhhdCBtb3JlIEZlbWFsZXMgYXJlIE9ic2VydmVkIHRvIGJlIFVuZW1wbG95ZWQgdGhhbiBFeHBlY3RlZCwgYW5kIHRoZSBsaW5lIGJlbG93IHRoZSBiYXIgc2hvd3MgdGhhdCBsZXNzIE1hbGVzIGFyZSBPYnNlcnZlZCB0byBiZSBVbmVtcGxveWVkIHRoYW4gZXhwZWN0ZWQuXA0KXA0KDQojIyMjIFtDb25jbHVzaW9uXXsudW5kZXJsaW5lfQ0KDQpGcm9tIG91ciByZXN1bHRzIHdlIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiAoUC1WYWx1ZSBcPCAwLjA1KSBiZXR3ZWVuIEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMgaW4gdGhlIFVTIGZvciB0aG9zZSB3aG8gYXJlIDI1IGFuZCBvdmVyLCB3aXRoIGEgQmFjaGVsb3JzIERlZ3JlZSBvciBoaWdoZXIuDQoNCkFsdGhvdWdoLCB0aGUgc2lnbmlmaWNhbmNlIG9mIG91ciBhc3NvY2lhdGlvbiBvbmx5IHNob3dzIG9uIHRoZSBVbmVtcGxveWVkIHNpZGUuIFdlIHdpbGwgbm90IHVzZSBHZW5kZXIgYXMgYSBkZXRlcm1pbmluZyBmYWN0b3Igd2hpY2ggZGVjaWRlcyB3aGV0aGVyIG9yIHdoZXRoZXIgZ2V0cyBnZXRzIGEgam9iIChJZiB0aGV5IGhhdmUgYSBkZWdyZWUpLiBXaGljaCBpcyBzdGlsbCBhIHBvc2l0aXZlIHJlc3VsdCBmcm9tIGEgc29jaWV0YWwgcG9pbnQgb2Ygdmlldy4gRnVydGhlcm1vcmUsIHRoZXJlIGlzIHN0aWxsIGEgc2lnbmlmaWNhbnQgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBGZW1hbGVzIGFuZCBVbmVtcGxveWVkLg0KDQpZZXQsIHdlIG11c3QgcmVhbGl6ZSB0aGF0IHRoZXNlIHJlc3VsdHMgYWxvbmUgZG8gbm90IGV4cGxhaW4gYWxsIHRoZSBmYWN0b3JzIGF0IHBsYXkuIFNpbXBseSB0aGV5IHNob3cgYSBjb3JyZWxhdGlvbiB3aXRoaW4gb3VyIHNhbXBsZSBvZiB0aGUgcG9wdWxhdGlvbiBkYXRhLCByYXRoZXIgdGhhbiB0aGUgY2F1c2Ugb2YgdW5lbXBsb3ltZW50IGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZXkgYXJlIEZlbWFsZQ0KDQpXZSBjb25jbHVkZSBmcm9tIHRoaXMgYW5hbHlzaXMgdGhhdCB0aGUgcmVhc29uICJ3aHk/IiB0aGlzIG1pZ2h0IG9jY3VyIHdvdWxkIG5vdCBiZSBkdWUgdG8gR2VuZGVyIGFsb25lLCBidXQgZHVlIHRvIG1vcmUgc29jaWFsIGZhY3RvcnMgYW5kIG5vcm1zIHdoaWNoIEZlbWFsZXMgZmFjZSBpbiBzb2NpZXR5LiBGdXJ0aGVyIGFuYWx5c2lzIHNob3VsZCBiZSBkb25lIHRvIHRlc3QgdGhlc2Ugc29jaWFsIGZhY3RvcnMgb24gYW4gaW5kZXgsIGRldGVybWluZSBpZiB0aGV5IGhhdmUgYSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiB0byBFbXBsb3ltZW50IFN0YXR1cyBhbmQgbWFrZSBhIGNvbXBhcmlzb24gYnkgR2VuZGVyLg0KDQpPbmUgbXVzdCBhbHNvIGNvbnNpZGVyIG91ciBkaWZmZXJlbmNlcyBpbiBuYXR1cmUsIHN1Y2ggYXMgaGF2aW5nIGEgYmFieS4gV2hpY2ggbWF5IGNhdXNlIHNvbWUgbW9yZSB3b21lbiB0byBsZWF2ZSBFbXBsb3ltZW50LiBUaGlzIGNhbiBhbHNvIGJlIHN0dWRpZWQgYnkgY29tcGFyaW5nIFVuZW1wbG95ZWQgRmVtYWxlcyB0byBkdWUgdG8gYmVpbmcgZmlyZWQvcXVpdCB0byB0aG9zZSB3aG8gaGF2ZSBsZWZ0IGZvciBtYXRlcm5hbCByZWFzb25zLiBJZiB0aGVzZSBzdHVkaWVzIHByb3ZlIHRoYXQgbWF0ZXJuYWwgcmVhc29ucyBhcmUgd2h5IHRoZXJlIGlzIGEgY29ycmVsYXRpb24sIHRoZW4gaG9wZWZ1bGx5IGFzIHRpbWUgZ29lcyBvbiBhbmQgbW9yZSBwZW9wbGUgY2FuIHdvcmsgcmVtb3RlbHksIHdlIHdvbid0IHNlZSBhIHNpZ25pZmljYW50IGNvcnJlbGF0aW9uIGFueW1vcmUuDQoNCkFsc28sIGZyb20gdGhpcyBzdHVkeSB3ZSBoYXZlICoqbm90KiogY29uY2x1ZGVkIHRoYXQgb25lIEdlbmRlciBpcyBtb3JlIGxpa2VseSB0byBnZXQgYSBkZWdyZWUgdGhhbiB0aGUgb3RoZXIgZ2VuZGVyLiBPdXIgcmVzdWx0cyBjb3VsZCBoYXZlIHBvc3NpYmx5IGJlIHNrZXdlZCBzaW1wbHkgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlcmUgYSBsZXNzIEZlbWFsZXMgd2l0aCBhIEJhY2hlbG9ycyBEZWdyZWUgb3IgaGlnaGVyIHRoYW4gTWFsZS4gVGhlcmVmb3JlLCBmdXJ0aGVyIHJlc2VhcmNoIGNvdWxkIGJlIGRvbmUgdG8gdGVzdCB0aGUgc2lnbmlmaWNhbmNlIG9mIGRpZmZlcmVuY2VzIGluIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYnkgZ2VuZGVyLg0KDQpFdmVuIHRob3VnaCB0aGUgRWR1Y2F0aW9uYWwgRXF1aXR5IEFjdCB3YXMgcHV0IGluIHBsYWNlIGluIDE5NzQsIGFuZCBHZW5kZXIgRXF1aXR5IEFjdCBpbiAxOTk0IChOV0hQLCAyMDIzKSwgd2Ugc3RpbGwgb2JzZXJ2ZWQgYSBsb3QgbW9yZSBNYWxlcyB3aXRoIGEgQmFjaGVsb3JzIHRoYW4gRmVtYWxlcyBvYnNlcnZlZCBpbiBvdXIgc2FtcGxlIGRhdGEgc2V0IChFbXBsb3llZCBvciBVbmVtcGxveWVkKS4gTW9yZSByZXNlYXJjaCBjb3VsZCB0aGVyZWZvcmUgYmUgZG9uZSB0byBkZXRlcm1pbmUgd2hhdCBzb2NpYWwgZmFjdG9ycyB0aGUgZGlmZmVyZW50IGdlbmRlcnMgbWF5IGZhY2Ugb24gYW4gaW5kZXggYW5kIGNvbXBhcmUgdGhpcyBudW1iZXIgdG8gdGhlaXIgZWR1Y2F0aW9uYWwgYXR0YWlubWVudC5cDQpcDQpcDQpcDQpcDQpcDQpcDQpcDQoNCiMjIyBbKipSZWZlcmVuY2VzKipdey51bmRlcmxpbmV9DQoNCi0gICBBcmFnYW8sIENhcm9saW5hLiAoMjAyMykuIEdlbmRlciBwYXkgZ2FwIGluIHRoZSBVLlMuIGhhc24ndCBjaGFuZ2VkIG11Y2ggaW4gdHdvIGRlY2FkZXMuIFBldyBSZXNlYXJjaCBDZW50ZXIuIFtXZWJzaXRlXSBbQXZhaWxhYmxlIG9ubGluZSBhdDogPGh0dHBzOi8vd3d3LnBld3Jlc2VhcmNoLm9yZy9zaG9ydC1yZWFkcy8yMDIzLzAzLzAxL2dlbmRlci1wYXktZ2FwLWZhY3RzLyM6fjp0ZXh0PUluJTIwMjAyMSUyQyUyMGZ1bGwlMkR0aW1lJTJDLG9jY3VwYXRpb25hbCUyMHNlZ3JlZ2F0aW9uJTIwYW5kJTIwd29yayUyMGV4cGVyaWVuY2U+XQ0KDQotICAgQW1hbmRhLCBKLiwgU2hha2VyLiAoMjAyNCkuIDEuMSBBc3N1bXB0aW9uczogSW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3QuIFNUTTEwMDEgVG9waWMgNjogdC10ZXN0cyBmb3IgdHdvLXNhbXBsZSBoeXBvdGhlc2lzIHRlc3RpbmcuIGJvb2tkb3duLiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL2Jvb2tkb3duLm9yZy9jb250ZW50L2Y5ZDAzNWVkLTg2ZWEtNDc3OS1hZDAxLTMxYWNjOTczZjBkZC8+XQ0KDQotICAgQmluZ2hhbXRvbiwgVW5pdmVyc2l0eS4gKDIwMjQpLiBXb21lbidzIFJpZ2h0czogVGhlbiBhbmQgbm93LiBTdW1tZXIgb2YgTG92ZSBFeGhpYml0OiBTb2NpYWwgbW92ZW1lbnRzIG9mIDE5NjcuIExpYnJhcnkgZ3VpZGVzLiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL2xpYnJhcnlndWlkZXMuYmluZ2hhbXRvbi5lZHUvZXhoaWJpdHN1bW1lcm9mbG92ZS9zb2NpZXR5I3RhYl9zLWxpYi1jdGFiLTE1NTcwODcxLTA+XQ0KDQotICAgQ2FyZXksIFcuLCBJc2FiZWwuIEhhY2tldCwgQ29ucmFkLiAoMjAyMikuIEdsb2JhbCBwb3B1bGF0aW9uIHNrZXdzIG1hbGUsIGJ1dCBVTiBwcm9qZWN0cyBwYXJpdHkgYmV0d2VlbiBzZXhlcyBieSAyMDUwLiBQZXdyZXNlYXJjaC4gW1dlYnNpdGVdIFtBdmFpbGFibGUgb25saW5lIGF0OiA8aHR0cHM6Ly93d3cucGV3cmVzZWFyY2gub3JnL3Nob3J0LXJlYWRzLzIwMjIvMDgvMzEvZ2xvYmFsLXBvcHVsYXRpb24tc2tld3MtbWFsZS1idXQtdW4tcHJvamVjdHMtcGFyaXR5LWJldHdlZW4tc2V4ZXMtYnktMjA1MC8jPjpcfjp0ZXh0PVRoZSUyMFVuaXRlZCUyMFN0YXRlcyUyMGhhcyUyMGhhZCxpcyUyMGV4cGVjdGVkJTIwdG8lMjBiZSUyMDk5XQ0KDQotICAgREFUQXRhYi4gKDIwMjQpLiBNYW5uLVdoaXRuZXkgVS1UZXN0LiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL2RhdGF0YWIubmV0L3R1dG9yaWFsL21hbm4td2hpdG5leS11LXRlc3Q+XQ0KDQotICAgRnV0dXJlLCBMZWFybi4gKDIwMjEpLiBFeHBsb3JpbmcgR2VuZGVyIEluZXF1YWxpdHk6IFdoYXQgaXMgRmVtaW5pc20/IFtCbG9nXSBbQXZhaWxhYmxlIG9ubGluZSBhdDogPGh0dHBzOi8vd3d3LmZ1dHVyZWxlYXJuLmNvbS9pbmZvL2Jsb2cvd2hhdC1pcy1mZW1pbmlzbSM6fjp0ZXh0PUZlbWluaXNtJTIwY2FuJTIwYmUlMjBkZWZpbmVkJTIwYXMsZXZlcnlvbmUlMkMlMjByZWdhcmRsZXNzJTIwb2YlMjBnZW5kZXIlMjBpZGVudGl0eT5dDQoNCi0gICBHYXdhbGksIFN1dmFybmEuICgyMDIzKS4gU2tld25lc3MgYW5kIEt1cnRvc2lzOiBRdWljayBHdWlkZSAoVXBkYXRlZCAyMDI0KS4gW1dlYnNpdGVdIFtBdmFpbGFibGUgb25saW5lIGF0OiA8aHR0cHM6Ly93d3cuYW5hbHl0aWNzdmlkaHlhLmNvbS9ibG9nLzIwMjEvMDUvc2hhcGUtb2YtZGF0YS1za2V3bmVzcy1hbmQta3VydG9zaXMvPl0NCg0KLSAgIEdpYW5uaSwgSCwuIEVkd2FyZC4gKDIwMDUpLiBUZXh0Ym9vayBvZiBQZWRpYXRyaWMgUmhldW1hdG9sb2d5LiBGaWZ0aCBFZGl0aW9uLiBbQm9va10NCg0KLSAgIEphd2FpZCwgTW9oYW1tYWQuIFRoYXJpcSwgTW9oYW1lZC4gU2FiYSwgTmFoZWVkLiAoMjAxOSkuIEZhaWx1cmUgQW5hbHlzaXMgaW4gQmlvY29tcG9zaXRlcywgRmlicmUtUmVpbmZvcmNlZCBDb21wb3NpdGVzIGFuZCBIeWJyaWQgQ29tcG9zaXRlcy4gQSB2b2x1bWUgaW4gV29vZGhlYWQgUHVibGlzaGluZyBTZXJpZXMgaW4gQ29tcG9zaXRlcyBTY2llbmNlIGFuZCBFbmdpbmVlcmluZy4gW0Jvb2tdDQoNCi0gICBOYXRpb25hbCwgV29tYW4ncywgSGlzdG9yeSwgUHJvamVjdCwgTldIUC4gKDIwMjMpLiBXb21lbidzIFJpZ2h0cyBIaXN0b3J5IGluIHRoZSBVUy4gWW91ciBEcmVhbSBibG9nLiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL3lvdXJkcmVhbS5saXZleW91cmRyZWFtLm9yZy8yMDIzLzAyL2hpc3Rvcnktb2Ytd29tZW5zLXJpZ2h0cy1pbi10aGUtdXMvP3V0bV90ZXJtPXdvbWVucyUyMHJpZ2h0cyZ1dG1fY2FtcGFpZ249JnV0bV9zb3VyY2U9YWR3b3JkcyZ1dG1fbWVkaXVtPXBwYyZoc2FfYWNjPTM0NjgyODY3NzcmaHNhX2NhbT0xNzQzMjc3NjM3JmhzYV9tdD1iJmhzYV9uZXQ9YWR3b3JkcyZoc2Ffc3JjPWcmaHNhX3Zlcj0zJmhzYV9hZD02Nzg3MTcyMzM3NTQmaHNhX3RndD1rd2QtMTAxMDY0NTAmaHNhX2dycD0xNTUyMzI2MjM4OTkmaHNhX2t3PXdvbWVucyUyMHJpZ2h0cyZnYWRfc291cmNlPTEmZ2NsaWQ9Q2p3S0NBaUFxWTZ0QmhBdEVpd0FIZVJvcGRjVURPQTB3YTZ6cXJQS0FZQVlKdzBtelhOQk5SeldKTlU2dG5QRFpwTDVLaWpzMHZmR3p4b0N0U29RQXZEX0J3RT5dDQoNCi0gICBOb3dhY2tpLCBBbXkgKDIwMTcpLiBDaGktc3F1YXJlIGFuZCBGaXNoZXIncyBleGFjdCB0ZXN0cy4gQ2xldmVsYW5kIENsaW5pYyBKb3VybmFsIG9mIE1lZGljaW5lLiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL3d3dy5jY2ptLm9yZy9jb250ZW50Lzg0Lzlfc3VwcGxfMi9lMjAjPjpcfjp0ZXh0PUZvciUyMHNpbXBsaWNpdHklMkMlMjBtb3N0JTIwcmVzZWFyY2hlcnMlMjBhZGhlcmUsdGhhdCUyMHRoZSUyMG9ic2VydmF0aW9ucyUyMGFyZSUyMGluZGVwZW5kZW50XQ0KDQotICAgTWluaXRhYiAoMjAyMykuIEludGVycHJldCBhbGwgc3RhdGlzdGljcyBmb3IgQ2hpLVNxdWFyZSBUZXN0IG9mIEFzc29jaWF0aW9uLiBDaGktU3F1YXJlIFRlc3QgZm9yIEFzc29jaWF0aW9uLiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL3N1cHBvcnQubWluaXRhYi5jb20vZW4tdXMvbWluaXRhYi8yMS9oZWxwLWFuZC1ob3ctdG8vc3RhdGlzdGljcy90YWJsZXMvaG93LXRvL2NoaS1zcXVhcmUtdGVzdC1mb3ItYXNzb2NpYXRpb24vaW50ZXJwcmV0LXRoZS1yZXN1bHRzL2FsbC1zdGF0aXN0aWNzLyM+Olx+OnRleHQ9VGhlJTIwZXhwZWN0ZWQlMjBjb3VudCUyMGlzJTIwdGhlLHRoZSUyMHRvdGFsJTIwbnVtYmVyJTIwb2YlMjBvYnNlcnZhdGlvbnNdDQoNCi0gICBPd2VucywgQW5pdGEuICgyMDIyKS4gSG93IHRvIGZvcmVjYXN0IHdpdGggdHdvLXdheSBBTk9WQSBpbiBSLiBbYmxvZ10gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL21lZGl1bS5jb20vbWxlYXJuaW5nLWFpL2hvdy10by1mb3JlY2FzdC13aXRoLXR3by13YXktYW5vdmEtaW4tci0zM2QxYzA5NzkwYjM+XQ0KDQotICAgVGhlLCBTd2VkaXNoLCBJbnRlcm5hdGlvbmFsLCBEZXZlbG9wbWVudCwgQ29ycG9yYXRpb24sIEFnZW5jeS4gU2lkYS4gKDIwMTcpLiBHZW5kZXIgYW5kIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQuIFtXZWJzaXRlXSBbQXZhaWxhYmxlIG9ubGluZSBhdDogPGh0dHBzOi8vd3d3LnNpZGEuc2UvZW4vcHVibGljYXRpb25zL2dlbmRlci1hbmQtZWR1Y2F0aW9uYWwtYXR0YWlubWVudD5dDQoNCi0gICBVLlMuLCBEZXBhcnRtZW50LCBPRiwgTEFCT1IsLiBET0wgKDIwMjQpLiBFcXVhbCBQYXkgZm9yIEVxdWFsIFdvcmsuIFtXZWJzaXRlXSBbQXZhaWxhYmxlIG9ubGluZSBhdDogW1tbaHR0cHM6Ly93d3cuZG9sLmdvdi9hZ2VuY2llcy9vYXNhbS9jZW50ZXJzLW9mZmljZXMvY2l2aWwtcmlnaHRzLWNlbnRlci9pbnRlcm5hbC9wb2xpY2llcy9lcXVhbC1wYXktZm9yLWVxdWFsd29yayM6XFxcXF0oaHR0cHM6Ly93d3cuZG9sLmdvdi9hZ2VuY2llcy9vYXNhbS9jZW50ZXJzLW9mZmljZXMvY2l2aWwtcmlnaHRzLWNlbnRlci9pbnRlcm5hbC9wb2xpY2llcy9lcXVhbC1wYXktZm9yLWVxdWFsd29yayM6KXsudXJpfV0oJTVCaHR0cHM6Ly93d3cuZG9sLmdvdi9hZ2VuY2llcy9vYXNhbS9jZW50ZXJzLW9mZmljZXMvY2l2aWwtcmlnaHRzLWNlbnRlci9pbnRlcm5hbC9wb2xpY2llcy9lcXVhbC1wYXktZm9yLWVxdWFsd29yayM6JTVEKGh0dHBzOi8vd3d3LmRvbC5nb3YvYWdlbmNpZXMvb2FzYW0vY2VudGVycy1vZmZpY2VzL2NpdmlsLXJpZ2h0cy1jZW50ZXIvaW50ZXJuYWwvcG9saWNpZXMvZXF1YWwtcGF5LWZvci1lcXVhbHdvcmsjOiklN0IudXJpJTdEKXsudXJpfVx+OnRleHQ9VGhlJTIwRXF1YWwlMjBQYXklMjBBY3QlMjBvZix3YWdlJTIwZGlzY3JpbWluYXRpb24lMjBiYXNlZCUyMG9uJTIwc2V4LiZ0ZXh0PVRoZSUyMEVxdWFsJTIwUGF5JTIwQWN0JTIwKEVQQSklMjBwcm90ZWN0cyUyMGluZGl2aWR1YWxzJTIwb2YlMjBhbGwlMjBzZXhlc10NCg==