Introduction
For this project, we will be creating a Poisson regression model. The
data set for this project looks at the daily total of cyclists on the
Williamsburg Bridge on a given day. This data set looks at the total
number of cyclists on the Williamsburg Bridge in Brooklyn, New York, in
order to keep track of the total number of cyclists entering and leaving
this cycling route on a specific day. We will look at the various
factors affecting the number of cyclists on each day, with factors such
as the weather conditions on that particular day.
Data Description
The data set in this project looks at the total number of cyclists on
the Williamsburg Bridge on a given day along with the weather conditions
of that day such as temperature and precipitation. This data set also
includes the total number of cyclists on all four of the major New York
bridges the Brooklyn Bridge, the Manhattan Bridge, the Williamsburg
Bridge, and the Queensboro Bridge.
First, let’s find the data set which will be used for this
assignment.
id=sample(1:10, 1)
dat <- read.xlsx("https://pengdsci.github.io/STA321/ww09/w09-AssignDataSet.xlsx", sheet = paste("data",id, sep = ""))
write.csv(dat, paste("C:\\Users\\josie\\Downloads\\",names(dat[6]), ".csv", sep=""))
When running this code, the data set I recieved was for the
Williamsburg Bridge, so that is what we will use for this Poisson
regression modeling project. The data set has been uploaded to Github
and now can be read in directly from the Github repository.
We will read in the data set from Github and we will call it
“cycling”.
cycling <- read.csv("https://raw.githubusercontent.com/JosieGallop/STA321/refs/heads/main/dataset/WilliamsburgBridge.csv", header = TRUE)
str(cycling)
'data.frame': 31 obs. of 8 variables:
$ X : int 1 2 3 4 5 6 7 8 9 10 ...
$ Date : int 42917 42918 42919 42920 42921 42922 42923 42924 42925 42926 ...
$ Day : int 42917 42918 42919 42920 42921 42922 42923 42924 42925 42926 ...
$ HighTemp : num 84.9 87.1 87.1 82.9 84.9 75 79 82.9 81 82.9 ...
$ LowTemp : num 72 73 71.1 70 71.1 71.1 68 70 69.1 71.1 ...
$ Precipitation : num 0.23 0 0.45 0 0 0 1.78 0 0 0 ...
$ WilliamsburgBridge: int 3845 4173 4924 3684 7308 7302 4421 5781 5782 8106 ...
$ Total : int 11867 13995 16067 13925 23110 21861 12805 17258 18320 24827 ...
We will use this cycling data set to create two Poisson regression
models, one for the frequency counts of cyclists on the Williamsburg
Bridge on a given observation, and another for the rates of cyclists
entering and leaving via the Williamsburg Bridge offset by the total
number of cyclists on all of the major New York bridges.
Variables
There are 8 total variables in the cycling data set. These variables
include:
X: The number of each observation. This is not a variable that is
useful for analysis, but rather is for listing each of the 31
observations in order, from observation 1 to observation 31. This
ordering was added when creating the .csv file, so it is not an
essential part of the dataset for our analysis.
Date: This represents the date on which a given observation was
collected. This is the observation ID number.
Day: This represents the day on which a given observation was
collected.
HighTemp: The high temperature on the given day, given in degrees
Fahrenheit.
LowTemp: The low temperature on the given day, given in degrees
Fahrenheit.
Precipitation: The amount of rain which occurred on the given
day, given in inches.
WilliamsburgBridge: The total number of cyclists on the
Williamsburg Bridge on a given observation.
Total: The total number of cyclists on all bridges on a given
observation.
For the Poisson regression model for the frequency counts, the
Williamsburg Bridge variable will serve as the response variable. For
the Poisson regression model for the rates, the Williamsburg Bridge
variable will again serve as the response variable, and it will be
offset by the Total variable for this model.
Research
Questions
The main goal for this project is to create a Poisson regression
model for both the frequency counts and the rates of the cyclists
entering and leaving Brooklyn, New York through the Williamsburg Bridge.
So, the focus for this project will be on creating two Poisson
regression models which can successfully predict the frequency counts
and the rates of the cyclists on the Williamsburg Bridge.
Some key questions for this project include:
Does the data set meet all of the necessary conditions required
for a Poisson regression model? If not, is there any potential
explanation for this discrepancy?
Can we create Poisson regression models which provide statistical
significance for predicting both the frequency counts and for the rates
of cyclists on the Williamsburg Bridge on a given day?
We will work on creating our Poisson regression models for both the
frequency counts and rates in order to see if we can in fact create
models which provide statistical significance in their predictive
ability.
Exploratory Data
Analysis
Let’s take a look at the first few entries within this cycling data
set for the Williamsburg Bridge.
kable(head(cycling), caption = "First Few Observations in the Data Set")
First Few Observations in the Data Set
1 |
42917 |
42917 |
84.9 |
72.0 |
0.23 |
3845 |
11867 |
2 |
42918 |
42918 |
87.1 |
73.0 |
0.00 |
4173 |
13995 |
3 |
42919 |
42919 |
87.1 |
71.1 |
0.45 |
4924 |
16067 |
4 |
42920 |
42920 |
82.9 |
70.0 |
0.00 |
3684 |
13925 |
5 |
42921 |
42921 |
84.9 |
71.1 |
0.00 |
7308 |
23110 |
6 |
42922 |
42922 |
75.0 |
71.1 |
0.00 |
7302 |
21861 |
This data set includes various factors which may have an influence on
the number of individuals cycling, along with the date on which this
data was collected. Additionally, this data set includes variables for
both the number of cyclists on the Williamsburg Bridge on that given
day, along with the total number of cyclists on all bridges on that
given day.
An observation I made while looking at the data set is that the
entries for the Date and the Day variables are in fact identical. This
means that both of these variables are representative of the observation
IDs and so, it would be redundant to include both variables in our
models as the entries for these two variables are identical for all 31
of the observations in the data set. We will just include the Date
variable in our Poisson regression models due to this observation that
was made while observing the data set.
Asumptions and
Conditions
There are four assumptions which must be met in order to create a
Poisson regression model. These assumptions include:
The response variable is a count described by a Poisson
distribution.
Observations are independent of one another.
The mean of the Poisson random variable is equal to the variance
of said Poisson random variable.
The log of the mean rate, log (λ), must be a linear function of
x.
We will check whether all of these four conditions have been
successfully met by our cycling data set before beginning with the model
building process for our Poisson regression model.
We will go through and check all four of the neccessary conditions
required for a Poisson Regression Model.
Condition 1: The
response variable is a count described by a Poisson distribution.
The response variable in this data set was stated to be the
WilliamsburgBridge variable, representing the total number of cyclists
on the Williamsburg Bridge on a given observation. This variable is
described as a count, representing the number of cyclists on a given
observation. This fits the criteria for this assumption, because we can
conclude that we have a response variable that is a count.
Condition 2:
Observations are independent of one another.
Each observation was collected on a given date, and we can safely
assume that the conditions of one day did not affect the conditions of
another day. The number of cyclists on the Williamsburg Bridge for a
given observation is independent on this number of a different
observation. So, we can safely conclude that that observations are all
independent and separate from one another.
Condition 3: The
mean of the Poisson random variable is equal to the variance of said
Poisson random variable.
In order for a variable to be a Poisson random variable, its mean
must be equal to its variance. We previously stated that the
WilliamsburgBridge variable will be our response variable. Therefore, we
must check that this variable meets the criteria for a Poisson random
variable, having a mean which is equal to its variance.
# Finding the mean.
mean <- mean(cycling$WilliamsburgBridge)
print(mean)
[1] 6073.677
The mean of the WilliamsburgBridge variable is 6,073.677. This
represents the mean number of individuals on the Williamsburg Bridge on
a given observation. This means that the mean number of individuals on
the Williamsburg Bridge on any given date is around 6,074 people. We
round this value because the number of individuals is a whole
number.
Next, let’s find the variance of our response variable.
# Finding the variance.
variance <- var(cycling$WilliamsburgBridge)
print(variance)
[1] 2482822
The variance of the WilliamsburgBridge variable is 2,482,822. This
does not match up with the value of the mean, and indicates a violation
of one the neccessary conditions for a Poisson regression model. This
implies that our response variable is in fact not a Poisson random
variable because the value of its mean is not equivalent to the value of
its variance.
Condition 4: The
log of the mean rate, log (λ), must be a linear function of x.
We will take a look at the plot of the mean rate against the
predictor variables to check this condition.
First, let’s look at the predictor variable of date vs our response
variable of WilliamsburgBridge.
plot(cycling$Date, cycling$WilliamsburgBridge, main = "Date vs. Williamsburg Bridge", xlab = "Date", ylab = "WilliamsburgBridge")

The scatterplot of these two variables shows a random distribution,
but it does not appear to follow a linear pattern. This could suggest a
possible violation of this condition due to the WilliamsburgBridge
variable not being a linear function of the Date predictor variable.
Next, let’s look at the predictor variable of high temperature vs our
response variable of WilliamsburgBridge.
plot(cycling$HighTemp, cycling$WilliamsburgBridge, main = "HighTemp vs. Williamsburg Bridge", xlab = "HighTemp", ylab = "WilliamsburgBridge")

The scatterplot of these two variables again shows a random
distribution, which it does not appear to follow a distinctly linear
pattern. This could suggest a possible violation of this condition due
to the WilliamsburgBridge variable not being a linear function of the
HighTemp predictor variable.
Next, let’s look at the predictor variable of low temperature vs our
response variable of WilliamsburgBridge.
plot(cycling$LowTemp, cycling$WilliamsburgBridge, main = "LowTemp vs. Williamsburg Bridge", xlab = "LowTemp", ylab = "WilliamsburgBridge")

The scatterplot of these two variables again shows a random
distribution, which it does not appear to follow a distinctly linear
pattern. This could suggest a possible violation of this condition due
to the WilliamsburgBridge variable not being a linear function of the
LowTemp predictor variable.
Lastly, let’s look at the predictor variable of precipitation vs our
response variable of WilliamsburgBridge.
plot(cycling$Precipitation, cycling$WilliamsburgBridge, main = "Precipitation vs. Williamsburg Bridge", xlab = "Precipitation", ylab = "WilliamsburgBridge")

The scatterplot of these two variables again shows a distribution
which does not appear to follow a distinctly linear pattern, it appears
the points are mostly centered around x = 0, with some outliers to the
right. This could suggest a possible violation of this condition due to
the WilliamsburgBridge variable not being a linear function of the
Precipitation predictor variable.
Overall, it seems that we do have some violations of the conditions
of a Poisson regression model, with the response variable not following
a linear function of the predictor variables in our model.
We will still continue with building the Poisson regression models,
but it is important to keep in mind that these violations may mean that
the Poisson regression model is not the best model choice for this data
set due to some of the neccessary conditions having been failed to have
been met.
Poisson Regression
Model on Frequency Counts
We will begin with creating a Poisson regression model of the
frequency counts. Specifically, this model will be on the frequency
counts of individuals on the Williamsburg Bridge for a given
observations. Our goal is to create a Poisson regression model which can
statistically significantly predict the count of the number of
individuals on the Williamsburg Bridge for a given observation, based
upon the various factors in this data set.
We will create our Poisson regression model on the frequency
counts.
# Poisson Regression Model of Counts
model.counts <- glm(WilliamsburgBridge ~ Date + HighTemp + LowTemp + Precipitation, family = poisson(link = "log"), data = cycling)
pois.count.coef = summary(model.counts)$coef
kable(pois.count.coef, caption = "Poisson Regression Model for the Counts of Cyclists \n on the Williamsburg Bridge")
Poisson Regression Model for the Counts of Cyclists on the
Williamsburg Bridge
(Intercept) |
-329.7412813 |
11.7142108 |
-28.148826 |
0 |
Date |
0.0078648 |
0.0002726 |
28.850990 |
0 |
HighTemp |
0.0035901 |
0.0006334 |
5.667892 |
0 |
LowTemp |
0.0075718 |
0.0009046 |
8.370178 |
0 |
Precipitation |
-0.3516535 |
0.0086431 |
-40.685836 |
0 |
The regression equation for the Poisson regression model on the
frequency counts is given as:
log(μ) = -329.7413 + 0.0079 * Date + 0.0036 * HighTemp + 0.0076 *
LowTemp - 0.3517 * Precipitation
All four of the predictor variables, Date, HighTemp, LowTemp, and
Precipitation, all have p-values of p < .001. This indicates that all
of the predictor in our model variables are statistically significant in
predicting the total expected counts of cyclists on the Williamsburg
Bridge on a given day.
The significance of these variables in regards to predicting the
expected counts can likely be attributed to potential adverse weather
conditions, such as excessive heat or cold, along with intense
precipitation and storms making cycling non ideal on those days with
poor conditions for outdoors activities such as cycling. These predictor
variables all being statistically significant shows that the weather and
temperature conditions do suggest a discrepancy in the number of
cyclists on the Williamsburg Bridge from day to day due to these changes
in temperature and precipitation.
Overall, this Poisson model of the frequency counts of the cyclists
on the Williamsburg Bridge showed statistical signficance in its
prediction of the expected log counts for the number of cyclists on the
Williamsburg Bridge for a given observation.
Regression
Coefficients Interpretation
The Poisson regression model on frequency counts was found to have
the following regression equation:
log(μ) = -329.7413 + 0.0079 * Date + 0.0036 * HighTemp + 0.0076 *
LowTemp - 0.3517 * Precipitation
We will analysis the regression coefficients for the variables in
this Poisson regression model on frequency counts.
The value of the y-intercept is given as -329.7413. This
represnts the baseline of the mean of log(μ) when all predictor
variables are equal to 0. However, the y-intercept does not have a
practical interpretation or meaning in this scenario so we are not
interested in its meaning for the Poisson regression model.
Date: The regression coefficient of the Date variable in this
model is 0.0079. This means that the mean log of the counts increases by
0.0079 units for every 1 day increase in the date on which the
observation was collected, holding all other variables
constant.
HighTemp: The regression coefficient of the HighTemp variable in
this model is 0.0036. This means that the mean log of the counts
increases by 0.0036 units for every 1 degree Fahrenheit increase in the
high temperature for the given observation, holding all other variables
constant.
LowTemp: The regression coefficient of the LowTemp variable in
this model is 0.0076. This means that the mean log of the counts
increases by 0.0076 units for every 1 degree Fahrenheit increase in the
low temperature for the given observation, holding all other variables
constant.
Precipitation: The regression coefficient of the Precipitation
variable in this model is -0.3517. This means that the mean log of the
counts decreases by 0.3517 units for every 1 inch increase in the amount
of precipitation for the given observation, holding all other variables
constant.
Poisson Regression
Model on Rates
Now, we will create a Poisson regression model of the rates at which
cyclists enter and leave via the Williamsburg Bridge offset by the total
number of cyclists on all four of the major New York bridges. This
model, unlike the previous model which just focused on the frequency
counts of cyclists on the Williamsburg Bridge, will also account for the
total number of cyclists on all four of the major New York bridges, the
Brooklyn Bridge, the Manhattan Bridge, the Williamsburg Bridge, and the
Queensboro Bridge. This Poisson model will look at the rates of the
number of cyclists on the Williamsburg Bridge for a given observation as
a rate out of the total number of cyclists on all four of these major
bridges for that specific observation.
We will build our Poisson regression model for the rates. This time,
we will still use the WilliamsburgBridge variable as our response
variable, but we will offset the model by the Total variable to make our
Poisson model for the rates of cyclists on the Williamsburg Bridge out
of the total number of cyclists on all four of the bridges.
# Poisson Model of Rates
model.rates <- glm(WilliamsburgBridge ~ Date + HighTemp + LowTemp + Precipitation, offset = log(Total),
family = poisson(link = "log"), data = cycling)
kable(summary(model.rates)$coef, caption = "Poisson Regression Model of the Rates of Cyclists \n on the Williamsburg Bridge out of all Four Bridges")
Poisson Regression Model of the Rates of Cyclists on the
Williamsburg Bridge out of all Four Bridges
(Intercept) |
-50.4101583 |
12.0801410 |
-4.172978 |
3.01e-05 |
Date |
0.0011422 |
0.0002811 |
4.063496 |
4.83e-05 |
HighTemp |
-0.0050794 |
0.0006460 |
-7.862790 |
0.00e+00 |
LowTemp |
0.0092517 |
0.0009198 |
10.057847 |
0.00e+00 |
Precipitation |
0.0356817 |
0.0078863 |
4.524499 |
6.10e-06 |
The regression equation for the Poisson regression model on the rates
is given as:
log(μ/t) = -50.4102 + 0.0011 * Date - 0.0051 * HighTemp + 0.0093 *
LowTemp - 0.0357 * Precipitation
All four of the predictor variables in this Poisson model, Date,
HighTemp, LowTemp, and Precipitation, all have p-values of p < .001.
This indicates that all of the predictor in our model variables are
statistically significant in predicting the total expected counts of
cyclists on the Williamsburg Bridge on a given day, offset by the total
number of cyclists on all four of the major New York bridges.
This model shows statistical significance in predicting the expected
counts of the cyclists on the Williamsburg Bridge by using the rates for
the prediction. This indicates that this model for the rates shows
statistical significance in its predictive power and provides good
utility for prediction and estimation.
Regression
Coefficients Interpretation
The value of the y-intercept is given as -50.4102 This represents
the baseline of the mean of the log counts multiplied by t, when all
predictor variables are equal to 0. However, the y-intercept does not
have a practical interpretation or meaning in this scenario so we are
not interested in its meaning for the Poisson regression model.
Date: The regression coefficient of the Date variable in this
model is 0.0011. This means that the mean of the log counts multipled by
t increases by 0.0011. units for every 1 day increase in the date on
which the observation was collected, holding all other variables
constant.
HighTemp: The regression coefficient of the HighTemp variable in
this model is -0.0051 This means that the mean of the log counts
multipled by t decreases by 0.0051 units for every 1 degree Fahrenheit
increase in the high temperature for the given observation, holding all
other variables constant.
LowTemp: The regression coefficient of the LowTemp variable in
this model is 0.0093. This means that the log counts multipled by t
increases by 0.0093 units for every 1 degree Fahrenheit increase in the
low temperature for the given observation, holding all other variables
constant.
Precipitation: The regression coefficient of the Precipitation
variable in this model is 0.0357. This means that the log counts
multipled by t increases by 0.0357 units for every 1 inch increase in
the amount of precipitation for the given observation, holding all other
variables constant.
Summary and Comparisons
of the Two Models
Both of the two Poisson regression model we created, the model for
the frequency counts and the model for the rates, provided statistical
significance for prediction and showed good utility overall. In both of
these models, we looked into the total number of cyclists on the
Williamsburg Bridge in New York for a specific observation, and we
looked into the various factors of that specific date. We looked at the
date of the observation along with some factors which may affect the
total number of cyclists out on that specific date. These factors
included the high temperature, the low temperature, and the amount of
precipitation for that given date. It turned out that all of these
factors were indeed statistically significant for both of the two
Poisson regression models, indicating that these weather related
conditions have a statistically significant impact on both the counts
and the rates of cyclists out on the Williamsburg Bridge for a given
observation. This can be attributed to certain weather conditions making
it more or less ideal for individuals to be cycling outdoors. For
instance, a day with incredibly high temperatures, incredibly cold
temperatures, or severe storms with heavy precipitation would be less
ideal and likely lead to less cyclists being out on that given day as
opposed to a day with pleasant weather.
Overall, both of the Poisson regression models showed statistical
significance and good utility in their prediction. However, as was
previously stated, there were some violations of this conditions for a
Poisson regression model within our data set. First, it was found that
the mean of the response variable, WilliamsburgBridge, was not equal to
its variance. This suggests that this response variable in fact is not
Poisson distributed, due to it failing to meet the condition for a
Poisson random variable of its mean being equal to its variance.
Additionally, all four predictor variables were checked, and it was
found that the response variable in fact was not a linear function of
any of these predictor variables. This indicates another major violation
of this data set. These violations suggest that perhaps a Poisson model
was not the best model choice for this data set, and that it is
important to be mindful of these violations when using either of the
Poisson regression models we created for prediction.
Conclusion
Overall, two Poisson regression models were created in this project.
Both of these models looked at the total number of cyclists on the
Williamsburg Bridge for a given day. The first model looked at the
counts of cyclists that were on the Williamsburg Bridge, and the second
model looked at the rates of the cyclists that were on the Williamsburg
Bridge offset by the total number of cyclists on all four of the major
New York bridges.
Both of these two Poisson regression models showed statistical
signicifance in their predictions, with all of the predictor variables
in both of these two models have p-values of p < .001. This indicates
that the factors in the data set of Date, HighTemp, LowTemp, and
Precipitation are statistically significnace in predicting the frequency
counts or the rates of the cyclists on the Williamsburg Bridge for a
given observation.
However, our data set failed to meet some of the neccessary
conditions for a Poisson regression model. The mean of the response
variable, WilliamsburgBridge, was not equal to its variance. This
suggests that this response variable in fact is not Poisson distributed.
Also, all four predictor variables were checked, and it was found that
the response variable in fact was not a linear function of any of these
predictor variables. These are two violations of the assumptions for a
Poisson regression model. These violations mean that perhaps a Poisson
regression model was not the best choice for this data set, and that
these violations should be kept in mind when using either of these
models for prediction.
Recommendations
Some recommendations I would suggest for further projects
include:
Look further into the violations that were found within this data
set and look into possible explanations for these violations of the
necessities of a Poisson regression model. Further consider whether the
Poisson regression model in fact is the best choice for this data set
and if it is sufficient to use this model for prediction despite these
violations.
Consider other variables which may affect the number of cyclists
out on a given observation. Perhaps there are other factors which may
provide further significance for model building which may strengthen the
regression model.
Further expand the data set to ensure the accuracy of the
predictions and to further strengthen the Poisson regression
models.
LS0tDQp0aXRsZTogIlBvaXNzb24gUmVncmVzc2lvbiBvZiB0aGUgQ291bnRzIGFuZCBSYXRlcyBvZiBDeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSINCmF1dGhvcjogIkpvc2llIEdhbGxvcCINCmRhdGU6ICIyMDI0LTEwLTI5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgZmlnX3dpZHRoOiA2DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBgez1odG1sfQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQovKiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIChDU1MpIGlzIGEgc3R5bGVzaGVldCBsYW5ndWFnZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBwcmVzZW50YXRpb24gb2YgYSBkb2N1bWVudCB3cml0dGVuIGluIEhUTUwgb3IgWE1MLiBpdCBpcyBhIHNpbXBsZSBtZWNoYW5pc20gZm9yIGFkZGluZyBzdHlsZSAoZS5nLiwgZm9udHMsIGNvbG9ycywgc3BhY2luZykgdG8gV2ViIGRvY3VtZW50cy4gKi8NCg0KaDEudGl0bGUgeyAgLyogVGl0bGUgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIHRoZSByZXBvcnQgdGl0bGUgKi8NCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovDQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBkYXRlICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDIycHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KPC9zdHlsZT4NCmBgYA0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIERldGVjdCwgaW5zdGFsbCwgYW5kIGxvYWQgcGFja2FnZXMgaWYgbmVlZGVkLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJsZWFmbGV0IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKQ0KICAgbGlicmFyeShsZWFmbGV0KQ0KfQ0KaWYgKCFyZXF1aXJlKCJFbnZTdGF0cyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJFbnZTdGF0cyIpDQogICBsaWJyYXJ5KEVudlN0YXRzKQ0KfQ0KaWYgKCFyZXF1aXJlKCJNQVNTIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQ0KICAgbGlicmFyeShNQVNTKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwaHl0b29scyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwaHl0b29scyIpDQogICBsaWJyYXJ5KHBoeXRvb2xzKQ0KfQ0KaWYoIXJlcXVpcmUoImRwbHlyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCiAgIGxpYnJhcnkoZHBseXIpDQp9DQppZighcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmKCFyZXF1aXJlKCJHR2FsbHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCiAgIGxpYnJhcnkoR0dhbGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJib290IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImJvb3QiKQ0KICAgbGlicmFyeShib290KQ0KfQ0KaWYoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQppZighcmVxdWlyZSgibWxiZW5jaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJtbGJlbmNoIikNCiAgIGxpYnJhcnkobWxiZW5jaCkNCn0NCmlmKCFyZXF1aXJlKCJwc3ljaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpDQogICBsaWJyYXJ5KHBzeWNoKQ0KfQ0KaWYoIXJlcXVpcmUoImJyb29tLm1peGVkIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImJyb29tLm1peGVkIikNCiAgIGxpYnJhcnkoYnJvb20ubWl4ZWQpDQp9DQppZighcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmICghcmVxdWlyZSgicFJPQyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwUk9DIikNCiAgIGxpYnJhcnkocFJPQykNCn0NCmlmICghcmVxdWlyZSgib3Blbnhsc3giKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygib3Blbnhsc3giKQ0KICAgbGlicmFyeShvcGVueGxzeCkNCn0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgIA0KICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICANCiAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICANCiAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgIA0KICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSAgIA0KICAgICAgICAgICAgICAgICAgICAgICkgICANCmBgYA0KDQoNCiMgSW50cm9kdWN0aW9uDQoNCkZvciB0aGlzIHByb2plY3QsIHdlIHdpbGwgYmUgY3JlYXRpbmcgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFRoZSBkYXRhIHNldCBmb3IgdGhpcyBwcm9qZWN0IGxvb2tzIGF0IHRoZSBkYWlseSB0b3RhbCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvbiBhIGdpdmVuIGRheS4gVGhpcyBkYXRhIHNldCBsb29rcyBhdCB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGluIEJyb29rbHluLCBOZXcgWW9yaywgaW4gb3JkZXIgdG8ga2VlcCB0cmFjayBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIGVudGVyaW5nIGFuZCBsZWF2aW5nIHRoaXMgY3ljbGluZyByb3V0ZSBvbiBhIHNwZWNpZmljIGRheS4gV2Ugd2lsbCBsb29rIGF0IHRoZSB2YXJpb3VzIGZhY3RvcnMgYWZmZWN0aW5nIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gZWFjaCBkYXksIHdpdGggZmFjdG9ycyBzdWNoIGFzIHRoZSB3ZWF0aGVyIGNvbmRpdGlvbnMgb24gdGhhdCBwYXJ0aWN1bGFyIGRheS4gDQoNCg0KIyMgRGF0YSBEZXNjcmlwdGlvbg0KDQpUaGUgZGF0YSBzZXQgaW4gdGhpcyBwcm9qZWN0IGxvb2tzIGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXkgYWxvbmcgd2l0aCB0aGUgd2VhdGhlciBjb25kaXRpb25zIG9mIHRoYXQgZGF5IHN1Y2ggYXMgdGVtcGVyYXR1cmUgYW5kIHByZWNpcGl0YXRpb24uIFRoaXMgZGF0YSBzZXQgYWxzbyBpbmNsdWRlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBmb3VyIG9mIHRoZSBtYWpvciBOZXcgWW9yayBicmlkZ2VzIHRoZSBCcm9va2x5biBCcmlkZ2UsIHRoZSBNYW5oYXR0YW4gQnJpZGdlLCB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgYW5kIHRoZSBRdWVlbnNib3JvIEJyaWRnZS4NCg0KRmlyc3QsIGxldCdzIGZpbmQgdGhlIGRhdGEgc2V0IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhpcyBhc3NpZ25tZW50LiANCg0KYGBge3J9DQppZD1zYW1wbGUoMToxMCwgMSkNCmRhdCA8LSByZWFkLnhsc3goImh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL1NUQTMyMS93dzA5L3cwOS1Bc3NpZ25EYXRhU2V0Lnhsc3giLCBzaGVldCA9IHBhc3RlKCJkYXRhIixpZCwgc2VwID0gIiIpKQ0Kd3JpdGUuY3N2KGRhdCwgcGFzdGUoIkM6XFxVc2Vyc1xcam9zaWVcXERvd25sb2Fkc1xcIixuYW1lcyhkYXRbNl0pLCAiLmNzdiIsIHNlcD0iIikpDQpgYGANCg0KV2hlbiBydW5uaW5nIHRoaXMgY29kZSwgdGhlIGRhdGEgc2V0IEkgcmVjaWV2ZWQgd2FzIGZvciB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgc28gdGhhdCBpcyB3aGF0IHdlIHdpbGwgdXNlIGZvciB0aGlzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbGluZyBwcm9qZWN0LiBUaGUgZGF0YSBzZXQgaGFzIGJlZW4gdXBsb2FkZWQgdG8gR2l0aHViIGFuZCBub3cgY2FuIGJlIHJlYWQgaW4gZGlyZWN0bHkgZnJvbSB0aGUgR2l0aHViIHJlcG9zaXRvcnkuIA0KDQpXZSB3aWxsIHJlYWQgaW4gdGhlIGRhdGEgc2V0IGZyb20gR2l0aHViIGFuZCB3ZSB3aWxsIGNhbGwgaXQgImN5Y2xpbmciLg0KDQpgYGB7cn0NCmN5Y2xpbmcgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Kb3NpZUdhbGxvcC9TVEEzMjEvcmVmcy9oZWFkcy9tYWluL2RhdGFzZXQvV2lsbGlhbXNidXJnQnJpZGdlLmNzdiIsIGhlYWRlciA9IFRSVUUpDQoNCnN0cihjeWNsaW5nKQ0KYGBgDQoNCldlIHdpbGwgdXNlIHRoaXMgY3ljbGluZyBkYXRhIHNldCB0byBjcmVhdGUgdHdvIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMsIG9uZSBmb3IgdGhlIGZyZXF1ZW5jeSBjb3VudHMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBvYnNlcnZhdGlvbiwgYW5kIGFub3RoZXIgZm9yIHRoZSByYXRlcyBvZiBjeWNsaXN0cyBlbnRlcmluZyBhbmQgbGVhdmluZyB2aWEgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb2Zmc2V0IGJ5IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIG9mIHRoZSBtYWpvciBOZXcgWW9yayBicmlkZ2VzLiANCg0KDQojIyBWYXJpYWJsZXMNCg0KDQpUaGVyZSBhcmUgOCB0b3RhbCB2YXJpYWJsZXMgaW4gdGhlIGN5Y2xpbmcgZGF0YSBzZXQuIFRoZXNlIHZhcmlhYmxlcyBpbmNsdWRlOg0KDQoqIFg6IFRoZSBudW1iZXIgb2YgZWFjaCBvYnNlcnZhdGlvbi4gVGhpcyBpcyBub3QgYSB2YXJpYWJsZSB0aGF0IGlzIHVzZWZ1bCBmb3IgYW5hbHlzaXMsIGJ1dCByYXRoZXIgaXMgZm9yIGxpc3RpbmcgZWFjaCBvZiB0aGUgMzEgb2JzZXJ2YXRpb25zIGluIG9yZGVyLCBmcm9tIG9ic2VydmF0aW9uIDEgdG8gb2JzZXJ2YXRpb24gMzEuIFRoaXMgb3JkZXJpbmcgd2FzIGFkZGVkIHdoZW4gY3JlYXRpbmcgdGhlIC5jc3YgZmlsZSwgc28gaXQgaXMgbm90IGFuIGVzc2VudGlhbCBwYXJ0IG9mIHRoZSBkYXRhc2V0IGZvciBvdXIgYW5hbHlzaXMuDQoNCiogRGF0ZTogVGhpcyByZXByZXNlbnRzIHRoZSBkYXRlIG9uIHdoaWNoIGEgZ2l2ZW4gb2JzZXJ2YXRpb24gd2FzIGNvbGxlY3RlZC4gVGhpcyBpcyB0aGUgb2JzZXJ2YXRpb24gSUQgbnVtYmVyLiANCg0KKiBEYXk6IFRoaXMgcmVwcmVzZW50cyB0aGUgZGF5IG9uIHdoaWNoIGEgZ2l2ZW4gb2JzZXJ2YXRpb24gd2FzIGNvbGxlY3RlZC4gDQoNCiogSGlnaFRlbXA6IFRoZSBoaWdoIHRlbXBlcmF0dXJlIG9uIHRoZSBnaXZlbiBkYXksIGdpdmVuIGluIGRlZ3JlZXMgRmFocmVuaGVpdC4gDQoNCiogTG93VGVtcDogVGhlIGxvdyB0ZW1wZXJhdHVyZSBvbiB0aGUgZ2l2ZW4gZGF5LCBnaXZlbiBpbiBkZWdyZWVzIEZhaHJlbmhlaXQuDQoNCiogUHJlY2lwaXRhdGlvbjogVGhlIGFtb3VudCBvZiByYWluIHdoaWNoIG9jY3VycmVkIG9uIHRoZSBnaXZlbiBkYXksIGdpdmVuIGluIGluY2hlcy4gDQoNCiogV2lsbGlhbXNidXJnQnJpZGdlOiBUaGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gb2JzZXJ2YXRpb24uDQoNCiogVG90YWw6IFRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGJyaWRnZXMgb24gYSBnaXZlbiBvYnNlcnZhdGlvbi4gDQoNCg0KRm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIHRoZSBmcmVxdWVuY3kgY291bnRzLCB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSB2YXJpYWJsZSB3aWxsIHNlcnZlIGFzIHRoZSByZXNwb25zZSB2YXJpYWJsZS4gRm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIHRoZSByYXRlcywgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgdmFyaWFibGUgd2lsbCBhZ2FpbiBzZXJ2ZSBhcyB0aGUgcmVzcG9uc2UgdmFyaWFibGUsIGFuZCBpdCB3aWxsIGJlIG9mZnNldCBieSB0aGUgVG90YWwgdmFyaWFibGUgZm9yIHRoaXMgbW9kZWwuIA0KDQoNCiMjIFJlc2VhcmNoIFF1ZXN0aW9ucw0KDQpUaGUgbWFpbiBnb2FsIGZvciB0aGlzIHByb2plY3QgaXMgdG8gY3JlYXRlIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGZvciBib3RoIHRoZSBmcmVxdWVuY3kgY291bnRzIGFuZCB0aGUgcmF0ZXMgb2YgdGhlIGN5Y2xpc3RzIGVudGVyaW5nIGFuZCBsZWF2aW5nIEJyb29rbHluLCBOZXcgWW9yayB0aHJvdWdoIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLiBTbywgdGhlIGZvY3VzIGZvciB0aGlzIHByb2plY3Qgd2lsbCBiZSBvbiBjcmVhdGluZyB0d28gUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyB3aGljaCBjYW4gc3VjY2Vzc2Z1bGx5IHByZWRpY3QgdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHRoZSByYXRlcyBvZiB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIA0KDQpTb21lIGtleSBxdWVzdGlvbnMgZm9yIHRoaXMgcHJvamVjdCBpbmNsdWRlOg0KDQoqIERvZXMgdGhlIGRhdGEgc2V0IG1lZXQgYWxsIG9mIHRoZSBuZWNlc3NhcnkgY29uZGl0aW9ucyByZXF1aXJlZCBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWw/IElmIG5vdCwgaXMgdGhlcmUgYW55IHBvdGVudGlhbCBleHBsYW5hdGlvbiBmb3IgdGhpcyBkaXNjcmVwYW5jeT8gDQoNCiogQ2FuIHdlIGNyZWF0ZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzIHdoaWNoIHByb3ZpZGUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGZvciBwcmVkaWN0aW5nIGJvdGggdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIGZvciB0aGUgcmF0ZXMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXk/DQoNCldlIHdpbGwgd29yayBvbiBjcmVhdGluZyBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyBmb3IgYm90aCB0aGUgZnJlcXVlbmN5IGNvdW50cyBhbmQgcmF0ZXMgaW4gb3JkZXIgdG8gc2VlIGlmIHdlIGNhbiBpbiBmYWN0IGNyZWF0ZSBtb2RlbHMgd2hpY2ggcHJvdmlkZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaW4gdGhlaXIgcHJlZGljdGl2ZSBhYmlsaXR5LiANCg0KDQoNCg0KIyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzDQoNCkxldCdzIHRha2UgYSBsb29rIGF0IHRoZSBmaXJzdCBmZXcgZW50cmllcyB3aXRoaW4gdGhpcyBjeWNsaW5nIGRhdGEgc2V0IGZvciB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZS4NCg0KYGBge3J9DQprYWJsZShoZWFkKGN5Y2xpbmcpLCBjYXB0aW9uID0gIkZpcnN0IEZldyBPYnNlcnZhdGlvbnMgaW4gdGhlIERhdGEgU2V0IikgDQpgYGANCg0KVGhpcyBkYXRhIHNldCBpbmNsdWRlcyB2YXJpb3VzIGZhY3RvcnMgd2hpY2ggbWF5IGhhdmUgYW4gaW5mbHVlbmNlIG9uIHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgY3ljbGluZywgYWxvbmcgd2l0aCB0aGUgZGF0ZSBvbiB3aGljaCB0aGlzIGRhdGEgd2FzIGNvbGxlY3RlZC4gQWRkaXRpb25hbGx5LCB0aGlzIGRhdGEgc2V0IGluY2x1ZGVzIHZhcmlhYmxlcyBmb3IgYm90aCB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIHRoYXQgZ2l2ZW4gZGF5LCBhbG9uZyB3aXRoIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGJyaWRnZXMgb24gdGhhdCBnaXZlbiBkYXkuICANCg0KQW4gb2JzZXJ2YXRpb24gSSBtYWRlIHdoaWxlIGxvb2tpbmcgYXQgdGhlIGRhdGEgc2V0IGlzIHRoYXQgdGhlIGVudHJpZXMgZm9yIHRoZSBEYXRlIGFuZCB0aGUgRGF5IHZhcmlhYmxlcyBhcmUgaW4gZmFjdCBpZGVudGljYWwuIFRoaXMgbWVhbnMgdGhhdCBib3RoIG9mIHRoZXNlIHZhcmlhYmxlcyBhcmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIG9ic2VydmF0aW9uIElEcyBhbmQgc28sIGl0IHdvdWxkIGJlIHJlZHVuZGFudCB0byBpbmNsdWRlIGJvdGggdmFyaWFibGVzIGluIG91ciBtb2RlbHMgYXMgdGhlIGVudHJpZXMgZm9yIHRoZXNlIHR3byB2YXJpYWJsZXMgYXJlIGlkZW50aWNhbCBmb3IgYWxsIDMxIG9mIHRoZSBvYnNlcnZhdGlvbnMgaW4gdGhlIGRhdGEgc2V0LiBXZSB3aWxsIGp1c3QgaW5jbHVkZSB0aGUgRGF0ZSB2YXJpYWJsZSBpbiBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyBkdWUgdG8gdGhpcyBvYnNlcnZhdGlvbiB0aGF0IHdhcyBtYWRlIHdoaWxlIG9ic2VydmluZyB0aGUgZGF0YSBzZXQuIA0KDQoNCg0KIyMgQXN1bXB0aW9ucyBhbmQgQ29uZGl0aW9ucw0KDQpUaGVyZSBhcmUgZm91ciBhc3N1bXB0aW9ucyB3aGljaCBtdXN0IGJlIG1ldCBpbiBvcmRlciB0byBjcmVhdGUgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFRoZXNlIGFzc3VtcHRpb25zIGluY2x1ZGU6DQoNCjEuIFRoZSByZXNwb25zZSB2YXJpYWJsZSBpcyBhIGNvdW50IGRlc2NyaWJlZCBieSBhIFBvaXNzb24gZGlzdHJpYnV0aW9uLg0KDQoyLiBPYnNlcnZhdGlvbnMgYXJlIGluZGVwZW5kZW50IG9mIG9uZSBhbm90aGVyLg0KDQozLiBUaGUgbWVhbiBvZiB0aGUgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgaXMgZXF1YWwgdG8gdGhlIHZhcmlhbmNlIG9mIHNhaWQgUG9pc3NvbiByYW5kb20gdmFyaWFibGUuDQoNCjQuIFRoZSBsb2cgb2YgdGhlIG1lYW4gcmF0ZSwgbG9nICjOuyksIG11c3QgYmUgYSBsaW5lYXIgZnVuY3Rpb24gb2YgeC4NCg0KDQpXZSB3aWxsIGNoZWNrIHdoZXRoZXIgYWxsIG9mIHRoZXNlIGZvdXIgY29uZGl0aW9ucyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IG1ldCBieSBvdXIgY3ljbGluZyBkYXRhIHNldCBiZWZvcmUgYmVnaW5uaW5nIHdpdGggdGhlIG1vZGVsIGJ1aWxkaW5nIHByb2Nlc3MgZm9yIG91ciBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCldlIHdpbGwgZ28gdGhyb3VnaCBhbmQgY2hlY2sgYWxsIGZvdXIgb2YgdGhlIG5lY2Nlc3NhcnkgY29uZGl0aW9ucyByZXF1aXJlZCBmb3IgYSBQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwuDQoNCg0KIyMjIENvbmRpdGlvbiAxOiBUaGUgcmVzcG9uc2UgdmFyaWFibGUgaXMgYSBjb3VudCBkZXNjcmliZWQgYnkgYSBQb2lzc29uIGRpc3RyaWJ1dGlvbi4NCg0KVGhlIHJlc3BvbnNlIHZhcmlhYmxlIGluIHRoaXMgZGF0YSBzZXQgd2FzIHN0YXRlZCB0byBiZSB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlLCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvbiBhIGdpdmVuIG9ic2VydmF0aW9uLiBUaGlzIHZhcmlhYmxlIGlzIGRlc2NyaWJlZCBhcyBhIGNvdW50LCByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhIGdpdmVuIG9ic2VydmF0aW9uLiBUaGlzIGZpdHMgdGhlIGNyaXRlcmlhIGZvciB0aGlzIGFzc3VtcHRpb24sIGJlY2F1c2Ugd2UgY2FuIGNvbmNsdWRlIHRoYXQgd2UgaGF2ZSBhIHJlc3BvbnNlIHZhcmlhYmxlIHRoYXQgaXMgYSBjb3VudC4NCg0KDQojIyMgQ29uZGl0aW9uIDI6IE9ic2VydmF0aW9ucyBhcmUgaW5kZXBlbmRlbnQgb2Ygb25lIGFub3RoZXIuDQoNCkVhY2ggb2JzZXJ2YXRpb24gd2FzIGNvbGxlY3RlZCBvbiBhIGdpdmVuIGRhdGUsIGFuZCB3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0IHRoZSBjb25kaXRpb25zIG9mIG9uZSBkYXkgZGlkIG5vdCBhZmZlY3QgdGhlIGNvbmRpdGlvbnMgb2YgYW5vdGhlciBkYXkuIFRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgZm9yIGEgZ2l2ZW4gb2JzZXJ2YXRpb24gaXMgaW5kZXBlbmRlbnQgb24gdGhpcyBudW1iZXIgb2YgYSBkaWZmZXJlbnQgb2JzZXJ2YXRpb24uIFNvLCB3ZSBjYW4gc2FmZWx5IGNvbmNsdWRlIHRoYXQgdGhhdCBvYnNlcnZhdGlvbnMgYXJlIGFsbCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgZnJvbSBvbmUgYW5vdGhlci4gDQoNCg0KIyMjIENvbmRpdGlvbiAzOiBUaGUgbWVhbiBvZiB0aGUgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgaXMgZXF1YWwgdG8gdGhlIHZhcmlhbmNlIG9mIHNhaWQgUG9pc3NvbiByYW5kb20gdmFyaWFibGUuDQoNCkluIG9yZGVyIGZvciBhIHZhcmlhYmxlIHRvIGJlIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUsIGl0cyBtZWFuIG11c3QgYmUgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBXZSBwcmV2aW91c2x5IHN0YXRlZCB0aGF0IHRoZSBXaWxsaWFtc2J1cmdCcmlkZ2UgdmFyaWFibGUgd2lsbCBiZSBvdXIgcmVzcG9uc2UgdmFyaWFibGUuIFRoZXJlZm9yZSwgd2UgbXVzdCBjaGVjayB0aGF0IHRoaXMgdmFyaWFibGUgbWVldHMgdGhlIGNyaXRlcmlhIGZvciBhIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlLCBoYXZpbmcgYSBtZWFuIHdoaWNoIGlzIGVxdWFsIHRvIGl0cyB2YXJpYW5jZS4NCg0KYGBge3J9DQojIEZpbmRpbmcgdGhlIG1lYW4uDQptZWFuIDwtIG1lYW4oY3ljbGluZyRXaWxsaWFtc2J1cmdCcmlkZ2UpDQpwcmludChtZWFuKQ0KYGBgDQoNClRoZSBtZWFuIG9mIHRoZSBXaWxsaWFtc2J1cmdCcmlkZ2UgdmFyaWFibGUgaXMgNiwwNzMuNjc3LiBUaGlzIHJlcHJlc2VudHMgdGhlIG1lYW4gbnVtYmVyIG9mIGluZGl2aWR1YWxzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gb2JzZXJ2YXRpb24uIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBudW1iZXIgb2YgaW5kaXZpZHVhbHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYW55IGdpdmVuIGRhdGUgaXMgYXJvdW5kIDYsMDc0IHBlb3BsZS4gV2Ugcm91bmQgdGhpcyB2YWx1ZSBiZWNhdXNlIHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgaXMgYSB3aG9sZSBudW1iZXIuIA0KDQpOZXh0LCBsZXQncyBmaW5kIHRoZSB2YXJpYW5jZSBvZiBvdXIgcmVzcG9uc2UgdmFyaWFibGUuDQoNCmBgYHtyfQ0KIyBGaW5kaW5nIHRoZSB2YXJpYW5jZS4NCnZhcmlhbmNlIDwtIHZhcihjeWNsaW5nJFdpbGxpYW1zYnVyZ0JyaWRnZSkNCnByaW50KHZhcmlhbmNlKQ0KYGBgDQoNClRoZSB2YXJpYW5jZSBvZiB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIGlzIDIsNDgyLDgyMi4gVGhpcyBkb2VzIG5vdCBtYXRjaCB1cCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgbWVhbiwgYW5kIGluZGljYXRlcyBhIHZpb2xhdGlvbiBvZiBvbmUgdGhlIG5lY2Nlc3NhcnkgY29uZGl0aW9ucyBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFRoaXMgaW1wbGllcyB0aGF0IG91ciByZXNwb25zZSB2YXJpYWJsZSBpcyBpbiBmYWN0IG5vdCBhIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlIGJlY2F1c2UgdGhlIHZhbHVlIG9mIGl0cyBtZWFuIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSB2YWx1ZSBvZiBpdHMgdmFyaWFuY2UuIA0KDQoNCiMjIyBDb25kaXRpb24gNDogVGhlIGxvZyBvZiB0aGUgbWVhbiByYXRlLCBsb2cgKM67KSwgbXVzdCBiZSBhIGxpbmVhciBmdW5jdGlvbiBvZiB4Lg0KDQpXZSB3aWxsIHRha2UgYSBsb29rIGF0IHRoZSBwbG90IG9mIHRoZSBtZWFuIHJhdGUgYWdhaW5zdCB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyB0byBjaGVjayB0aGlzIGNvbmRpdGlvbi4gDQoNCkZpcnN0LCBsZXQncyBsb29rIGF0IHRoZSBwcmVkaWN0b3IgdmFyaWFibGUgb2YgZGF0ZSB2cyBvdXIgcmVzcG9uc2UgdmFyaWFibGUgb2YgV2lsbGlhbXNidXJnQnJpZGdlLiANCg0KYGBge3J9DQpwbG90KGN5Y2xpbmckRGF0ZSwgY3ljbGluZyRXaWxsaWFtc2J1cmdCcmlkZ2UsIG1haW4gPSAiRGF0ZSB2cy4gV2lsbGlhbXNidXJnIEJyaWRnZSIsIHhsYWIgPSAiRGF0ZSIsIHlsYWIgPSAiV2lsbGlhbXNidXJnQnJpZGdlIikNCmBgYA0KDQpUaGUgc2NhdHRlcnBsb3Qgb2YgdGhlc2UgdHdvIHZhcmlhYmxlcyBzaG93cyBhIHJhbmRvbSBkaXN0cmlidXRpb24sIGJ1dCBpdCBkb2VzIG5vdCBhcHBlYXIgdG8gZm9sbG93IGEgbGluZWFyIHBhdHRlcm4uIFRoaXMgY291bGQgc3VnZ2VzdCBhIHBvc3NpYmxlIHZpb2xhdGlvbiBvZiB0aGlzIGNvbmRpdGlvbiBkdWUgdG8gdGhlIFdpbGxpYW1zYnVyZ0JyaWRnZSB2YXJpYWJsZSBub3QgYmVpbmcgYSBsaW5lYXIgZnVuY3Rpb24gb2YgdGhlIERhdGUgcHJlZGljdG9yIHZhcmlhYmxlLiANCg0KTmV4dCwgbGV0J3MgbG9vayBhdCB0aGUgcHJlZGljdG9yIHZhcmlhYmxlIG9mIGhpZ2ggdGVtcGVyYXR1cmUgdnMgb3VyIHJlc3BvbnNlIHZhcmlhYmxlIG9mIFdpbGxpYW1zYnVyZ0JyaWRnZS4gDQoNCmBgYHtyfQ0KcGxvdChjeWNsaW5nJEhpZ2hUZW1wLCBjeWNsaW5nJFdpbGxpYW1zYnVyZ0JyaWRnZSwgbWFpbiA9ICJIaWdoVGVtcCB2cy4gV2lsbGlhbXNidXJnIEJyaWRnZSIsIHhsYWIgPSAiSGlnaFRlbXAiLCB5bGFiID0gIldpbGxpYW1zYnVyZ0JyaWRnZSIpDQpgYGANCg0KVGhlIHNjYXR0ZXJwbG90IG9mIHRoZXNlIHR3byB2YXJpYWJsZXMgYWdhaW4gc2hvd3MgYSByYW5kb20gZGlzdHJpYnV0aW9uLCB3aGljaCBpdCBkb2VzIG5vdCBhcHBlYXIgdG8gZm9sbG93IGEgZGlzdGluY3RseSBsaW5lYXIgcGF0dGVybi4gVGhpcyBjb3VsZCBzdWdnZXN0IGEgcG9zc2libGUgdmlvbGF0aW9uIG9mIHRoaXMgY29uZGl0aW9uIGR1ZSB0byB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIG5vdCBiZWluZyBhIGxpbmVhciBmdW5jdGlvbiBvZiB0aGUgSGlnaFRlbXAgcHJlZGljdG9yIHZhcmlhYmxlLiANCg0KTmV4dCwgbGV0J3MgbG9vayBhdCB0aGUgcHJlZGljdG9yIHZhcmlhYmxlIG9mIGxvdyB0ZW1wZXJhdHVyZSB2cyBvdXIgcmVzcG9uc2UgdmFyaWFibGUgb2YgV2lsbGlhbXNidXJnQnJpZGdlLiANCg0KYGBge3J9DQpwbG90KGN5Y2xpbmckTG93VGVtcCwgY3ljbGluZyRXaWxsaWFtc2J1cmdCcmlkZ2UsIG1haW4gPSAiTG93VGVtcCB2cy4gV2lsbGlhbXNidXJnIEJyaWRnZSIsIHhsYWIgPSAiTG93VGVtcCIsIHlsYWIgPSAiV2lsbGlhbXNidXJnQnJpZGdlIikNCmBgYA0KDQpUaGUgc2NhdHRlcnBsb3Qgb2YgdGhlc2UgdHdvIHZhcmlhYmxlcyBhZ2FpbiBzaG93cyBhIHJhbmRvbSBkaXN0cmlidXRpb24sIHdoaWNoIGl0IGRvZXMgbm90IGFwcGVhciB0byBmb2xsb3cgYSBkaXN0aW5jdGx5IGxpbmVhciBwYXR0ZXJuLiBUaGlzIGNvdWxkIHN1Z2dlc3QgYSBwb3NzaWJsZSB2aW9sYXRpb24gb2YgdGhpcyBjb25kaXRpb24gZHVlIHRvIHRoZSBXaWxsaWFtc2J1cmdCcmlkZ2UgdmFyaWFibGUgbm90IGJlaW5nIGEgbGluZWFyIGZ1bmN0aW9uIG9mIHRoZSBMb3dUZW1wIHByZWRpY3RvciB2YXJpYWJsZS4gDQoNCkxhc3RseSwgbGV0J3MgbG9vayBhdCB0aGUgcHJlZGljdG9yIHZhcmlhYmxlIG9mIHByZWNpcGl0YXRpb24gdnMgb3VyIHJlc3BvbnNlIHZhcmlhYmxlIG9mIFdpbGxpYW1zYnVyZ0JyaWRnZS4gDQoNCmBgYHtyfQ0KcGxvdChjeWNsaW5nJFByZWNpcGl0YXRpb24sIGN5Y2xpbmckV2lsbGlhbXNidXJnQnJpZGdlLCBtYWluID0gIlByZWNpcGl0YXRpb24gdnMuIFdpbGxpYW1zYnVyZyBCcmlkZ2UiLCB4bGFiID0gIlByZWNpcGl0YXRpb24iLCB5bGFiID0gIldpbGxpYW1zYnVyZ0JyaWRnZSIpDQpgYGANCg0KVGhlIHNjYXR0ZXJwbG90IG9mIHRoZXNlIHR3byB2YXJpYWJsZXMgYWdhaW4gc2hvd3MgYSBkaXN0cmlidXRpb24gd2hpY2ggZG9lcyBub3QgYXBwZWFyIHRvIGZvbGxvdyBhIGRpc3RpbmN0bHkgbGluZWFyIHBhdHRlcm4sIGl0IGFwcGVhcnMgdGhlIHBvaW50cyBhcmUgbW9zdGx5IGNlbnRlcmVkIGFyb3VuZCB4ID0gMCwgd2l0aCBzb21lIG91dGxpZXJzIHRvIHRoZSByaWdodC4gVGhpcyBjb3VsZCBzdWdnZXN0IGEgcG9zc2libGUgdmlvbGF0aW9uIG9mIHRoaXMgY29uZGl0aW9uIGR1ZSB0byB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIG5vdCBiZWluZyBhIGxpbmVhciBmdW5jdGlvbiBvZiB0aGUgUHJlY2lwaXRhdGlvbiBwcmVkaWN0b3IgdmFyaWFibGUuIA0KDQoNCk92ZXJhbGwsIGl0IHNlZW1zIHRoYXQgd2UgZG8gaGF2ZSBzb21lIHZpb2xhdGlvbnMgb2YgdGhlIGNvbmRpdGlvbnMgb2YgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwsIHdpdGggdGhlIHJlc3BvbnNlIHZhcmlhYmxlIG5vdCBmb2xsb3dpbmcgYSBsaW5lYXIgZnVuY3Rpb24gb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgaW4gb3VyIG1vZGVsLiANCg0KV2Ugd2lsbCBzdGlsbCBjb250aW51ZSB3aXRoIGJ1aWxkaW5nIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzLCBidXQgaXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCB0aGF0IHRoZXNlIHZpb2xhdGlvbnMgbWF5IG1lYW4gdGhhdCB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGlzIG5vdCB0aGUgYmVzdCBtb2RlbCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQgZHVlIHRvIHNvbWUgb2YgdGhlIG5lY2Nlc3NhcnkgY29uZGl0aW9ucyBoYXZpbmcgYmVlbiBmYWlsZWQgdG8gaGF2ZSBiZWVuIG1ldC4gDQoNCg0KDQojIFBvaXNzb24gUmVncmVzc2lvbiBNb2RlbCBvbiBGcmVxdWVuY3kgQ291bnRzIA0KDQpXZSB3aWxsIGJlZ2luIHdpdGggY3JlYXRpbmcgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb2YgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFNwZWNpZmljYWxseSwgdGhpcyBtb2RlbCB3aWxsIGJlIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIGluZGl2aWR1YWxzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9ucy4gT3VyIGdvYWwgaXMgdG8gY3JlYXRlIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdoaWNoIGNhbiBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50bHkgcHJlZGljdCB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFscyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBvYnNlcnZhdGlvbiwgYmFzZWQgdXBvbiB0aGUgdmFyaW91cyBmYWN0b3JzIGluIHRoaXMgZGF0YSBzZXQuIA0KDQpXZSB3aWxsIGNyZWF0ZSBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzLg0KDQpgYGB7cn0NCiMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIG9mIENvdW50cw0KbW9kZWwuY291bnRzIDwtIGdsbShXaWxsaWFtc2J1cmdCcmlkZ2UgfiBEYXRlICsgSGlnaFRlbXAgKyBMb3dUZW1wICsgUHJlY2lwaXRhdGlvbiwgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gY3ljbGluZykNCnBvaXMuY291bnQuY29lZiA9IHN1bW1hcnkobW9kZWwuY291bnRzKSRjb2VmDQprYWJsZShwb2lzLmNvdW50LmNvZWYsIGNhcHRpb24gPSAiUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIGZvciB0aGUgQ291bnRzIG9mIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIikNCmBgYA0KDQpUaGUgcmVncmVzc2lvbiBlcXVhdGlvbiBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cyBpcyBnaXZlbiBhczoNCg0KbG9nKM68KSA9IC0zMjkuNzQxMyArIDAuMDA3OSAqIERhdGUgKyAwLjAwMzYgKiBIaWdoVGVtcCArIDAuMDA3NiAqIExvd1RlbXAgLSAwLjM1MTcgKiBQcmVjaXBpdGF0aW9uDQoNCg0KQWxsIGZvdXIgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMsIERhdGUsIEhpZ2hUZW1wLCBMb3dUZW1wLCBhbmQgUHJlY2lwaXRhdGlvbiwgYWxsIGhhdmUgcC12YWx1ZXMgb2YgcCA8IC4wMDEuIFRoaXMgaW5kaWNhdGVzIHRoYXQgYWxsIG9mIHRoZSBwcmVkaWN0b3IgaW4gb3VyIG1vZGVsIHZhcmlhYmxlcyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIHRoZSB0b3RhbCBleHBlY3RlZCBjb3VudHMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXkuIA0KDQpUaGUgc2lnbmlmaWNhbmNlIG9mIHRoZXNlIHZhcmlhYmxlcyBpbiByZWdhcmRzIHRvIHByZWRpY3RpbmcgdGhlIGV4cGVjdGVkIGNvdW50cyBjYW4gbGlrZWx5IGJlIGF0dHJpYnV0ZWQgdG8gcG90ZW50aWFsIGFkdmVyc2Ugd2VhdGhlciBjb25kaXRpb25zLCBzdWNoIGFzIGV4Y2Vzc2l2ZSBoZWF0IG9yIGNvbGQsIGFsb25nIHdpdGggaW50ZW5zZSBwcmVjaXBpdGF0aW9uIGFuZCBzdG9ybXMgbWFraW5nIGN5Y2xpbmcgbm9uIGlkZWFsIG9uIHRob3NlIGRheXMgd2l0aCBwb29yIGNvbmRpdGlvbnMgZm9yIG91dGRvb3JzIGFjdGl2aXRpZXMgc3VjaCBhcyBjeWNsaW5nLiBUaGVzZSBwcmVkaWN0b3IgdmFyaWFibGVzIGFsbCBiZWluZyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHNob3dzIHRoYXQgdGhlIHdlYXRoZXIgYW5kIHRlbXBlcmF0dXJlIGNvbmRpdGlvbnMgZG8gc3VnZ2VzdCBhIGRpc2NyZXBhbmN5IGluIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgZnJvbSBkYXkgdG8gZGF5IGR1ZSB0byB0aGVzZSBjaGFuZ2VzIGluIHRlbXBlcmF0dXJlIGFuZCBwcmVjaXBpdGF0aW9uLiANCg0KT3ZlcmFsbCwgdGhpcyBQb2lzc29uIG1vZGVsIG9mIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIHRoZSBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBzaG93ZWQgc3RhdGlzdGljYWwgc2lnbmZpY2FuY2UgaW4gaXRzIHByZWRpY3Rpb24gb2YgdGhlIGV4cGVjdGVkIGxvZyBjb3VudHMgZm9yIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgZm9yIGEgZ2l2ZW4gb2JzZXJ2YXRpb24uDQoNCg0KDQojIyBSZWdyZXNzaW9uIENvZWZmaWNpZW50cyBJbnRlcnByZXRhdGlvbg0KDQoNClRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gZnJlcXVlbmN5IGNvdW50cyB3YXMgZm91bmQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHJlZ3Jlc3Npb24gZXF1YXRpb246DQoNCmxvZyjOvCkgPSAtMzI5Ljc0MTMgKyAwLjAwNzkgKiBEYXRlICsgMC4wMDM2ICogSGlnaFRlbXAgKyAwLjAwNzYgKiBMb3dUZW1wIC0gMC4zNTE3ICogUHJlY2lwaXRhdGlvbg0KDQpXZSB3aWxsIGFuYWx5c2lzIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBmb3IgdGhlIHZhcmlhYmxlcyBpbiB0aGlzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiBmcmVxdWVuY3kgY291bnRzLg0KDQoqIFRoZSB2YWx1ZSBvZiB0aGUgeS1pbnRlcmNlcHQgaXMgZ2l2ZW4gYXMgLTMyOS43NDEzLiBUaGlzIHJlcHJlc250cyB0aGUgYmFzZWxpbmUgb2YgdGhlIG1lYW4gb2YgbG9nKM68KSB3aGVuIGFsbCBwcmVkaWN0b3IgdmFyaWFibGVzIGFyZSBlcXVhbCB0byAwLiBIb3dldmVyLCB0aGUgeS1pbnRlcmNlcHQgZG9lcyBub3QgaGF2ZSBhIHByYWN0aWNhbCBpbnRlcnByZXRhdGlvbiBvciBtZWFuaW5nIGluIHRoaXMgc2NlbmFyaW8gc28gd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGl0cyBtZWFuaW5nIGZvciB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsLg0KDQoqIERhdGU6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBEYXRlIHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDc5LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudHMgaW5jcmVhc2VzIGJ5IDAuMDA3OSB1bml0cyBmb3IgZXZlcnkgMSBkYXkgaW5jcmVhc2UgaW4gdGhlIGRhdGUgb24gd2hpY2ggdGhlIG9ic2VydmF0aW9uIHdhcyBjb2xsZWN0ZWQsIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBIaWdoVGVtcDogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIEhpZ2hUZW1wIHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDM2LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudHMgaW5jcmVhc2VzIGJ5IDAuMDAzNiB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgaGlnaCB0ZW1wZXJhdHVyZSBmb3IgdGhlIGdpdmVuIG9ic2VydmF0aW9uLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIExvd1RlbXA6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBMb3dUZW1wIHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDc2LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudHMgaW5jcmVhc2VzIGJ5IDAuMDA3NiB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgbG93IHRlbXBlcmF0dXJlIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogUHJlY2lwaXRhdGlvbjogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIFByZWNpcGl0YXRpb24gdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAtMC4zNTE3LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudHMgZGVjcmVhc2VzIGJ5IDAuMzUxNyB1bml0cyBmb3IgZXZlcnkgMSBpbmNoIGluY3JlYXNlIGluIHRoZSBhbW91bnQgb2YgcHJlY2lwaXRhdGlvbiBmb3IgdGhlIGdpdmVuIG9ic2VydmF0aW9uLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoNCg0KDQoNCiMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIG9uIFJhdGVzDQoNCk5vdywgd2Ugd2lsbCBjcmVhdGUgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb2YgdGhlIHJhdGVzIGF0IHdoaWNoIGN5Y2xpc3RzIGVudGVyIGFuZCBsZWF2ZSB2aWEgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb2Zmc2V0IGJ5IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGZvdXIgb2YgdGhlIG1ham9yIE5ldyBZb3JrIGJyaWRnZXMuIFRoaXMgbW9kZWwsIHVubGlrZSB0aGUgcHJldmlvdXMgbW9kZWwgd2hpY2gganVzdCBmb2N1c2VkIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLCB3aWxsIGFsc28gYWNjb3VudCBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcywgdGhlIEJyb29rbHluIEJyaWRnZSwgdGhlIE1hbmhhdHRhbiBCcmlkZ2UsIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLCBhbmQgdGhlIFF1ZWVuc2Jvcm8gQnJpZGdlLiBUaGlzIFBvaXNzb24gbW9kZWwgd2lsbCBsb29rIGF0IHRoZSByYXRlcyBvZiB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uIGFzIGEgcmF0ZSBvdXQgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGVzZSBtYWpvciBicmlkZ2VzIGZvciB0aGF0IHNwZWNpZmljIG9ic2VydmF0aW9uLg0KDQpXZSB3aWxsIGJ1aWxkIG91ciBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIHRoZSByYXRlcy4gVGhpcyB0aW1lLCB3ZSB3aWxsIHN0aWxsIHVzZSB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIGFzIG91ciByZXNwb25zZSB2YXJpYWJsZSwgYnV0IHdlIHdpbGwgb2Zmc2V0IHRoZSBtb2RlbCBieSB0aGUgVG90YWwgdmFyaWFibGUgdG8gbWFrZSBvdXIgUG9pc3NvbiBtb2RlbCBmb3IgdGhlIHJhdGVzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG91dCBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBmb3VyIG9mIHRoZSBicmlkZ2VzLiANCg0KDQpgYGB7cn0NCiMgUG9pc3NvbiBNb2RlbCBvZiBSYXRlcw0KbW9kZWwucmF0ZXMgPC0gZ2xtKFdpbGxpYW1zYnVyZ0JyaWRnZSB+IERhdGUgKyBIaWdoVGVtcCArIExvd1RlbXAgKyBQcmVjaXBpdGF0aW9uLCBvZmZzZXQgPSBsb2coVG90YWwpLCANCiAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBwb2lzc29uKGxpbmsgPSAibG9nIiksIGRhdGEgPSBjeWNsaW5nKQ0Ka2FibGUoc3VtbWFyeShtb2RlbC5yYXRlcykkY29lZiwgY2FwdGlvbiA9ICJQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwgb2YgdGhlIFJhdGVzIG9mIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG91dCBvZiBhbGwgRm91ciBCcmlkZ2VzIikNCmBgYA0KDQpUaGUgcmVncmVzc2lvbiBlcXVhdGlvbiBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgcmF0ZXMgaXMgZ2l2ZW4gYXM6DQoNCmxvZyjOvC90KSA9IC01MC40MTAyICsgMC4wMDExICogRGF0ZSAtIDAuMDA1MSAqIEhpZ2hUZW1wICsgMC4wMDkzICogTG93VGVtcCAtIDAuMDM1NyAqIFByZWNpcGl0YXRpb24NCg0KDQpBbGwgZm91ciBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBpbiB0aGlzIFBvaXNzb24gbW9kZWwsIERhdGUsIEhpZ2hUZW1wLCBMb3dUZW1wLCBhbmQgUHJlY2lwaXRhdGlvbiwgYWxsIGhhdmUgcC12YWx1ZXMgb2YgcCA8IC4wMDEuIFRoaXMgaW5kaWNhdGVzIHRoYXQgYWxsIG9mIHRoZSBwcmVkaWN0b3IgaW4gb3VyIG1vZGVsIHZhcmlhYmxlcyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIHRoZSB0b3RhbCBleHBlY3RlZCBjb3VudHMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXksIG9mZnNldCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBmb3VyIG9mIHRoZSBtYWpvciBOZXcgWW9yayBicmlkZ2VzLiANCg0KVGhpcyBtb2RlbCBzaG93cyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaW4gcHJlZGljdGluZyB0aGUgZXhwZWN0ZWQgY291bnRzIG9mIHRoZSBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBieSB1c2luZyB0aGUgcmF0ZXMgZm9yIHRoZSBwcmVkaWN0aW9uLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoaXMgbW9kZWwgZm9yIHRoZSByYXRlcyBzaG93cyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaW4gaXRzIHByZWRpY3RpdmUgcG93ZXIgYW5kIHByb3ZpZGVzIGdvb2QgdXRpbGl0eSBmb3IgcHJlZGljdGlvbiBhbmQgZXN0aW1hdGlvbi4gDQoNCg0KIyMgUmVncmVzc2lvbiBDb2VmZmljaWVudHMgSW50ZXJwcmV0YXRpb24NCg0KDQoqIFRoZSB2YWx1ZSBvZiB0aGUgeS1pbnRlcmNlcHQgaXMgZ2l2ZW4gYXMgLTUwLjQxMDIgVGhpcyByZXByZXNlbnRzIHRoZSBiYXNlbGluZSBvZiB0aGUgbWVhbiBvZiB0aGUgbG9nIGNvdW50cyBtdWx0aXBsaWVkIGJ5IHQsIHdoZW4gYWxsIHByZWRpY3RvciB2YXJpYWJsZXMgYXJlIGVxdWFsIHRvIDAuIEhvd2V2ZXIsIHRoZSB5LWludGVyY2VwdCBkb2VzIG5vdCBoYXZlIGEgcHJhY3RpY2FsIGludGVycHJldGF0aW9uIG9yIG1lYW5pbmcgaW4gdGhpcyBzY2VuYXJpbyBzbyB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaXRzIG1lYW5pbmcgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCiogRGF0ZTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERhdGUgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAwLjAwMTEuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBvZiB0aGUgbG9nIGNvdW50cyBtdWx0aXBsZWQgYnkgdCBpbmNyZWFzZXMgYnkgMC4wMDExLiB1bml0cyBmb3IgZXZlcnkgMSBkYXkgaW5jcmVhc2UgaW4gdGhlIGRhdGUgb24gd2hpY2ggdGhlIG9ic2VydmF0aW9uIHdhcyBjb2xsZWN0ZWQsIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBIaWdoVGVtcDogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIEhpZ2hUZW1wIHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgLTAuMDA1MSBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gb2YgdGhlIGxvZyBjb3VudHMgbXVsdGlwbGVkIGJ5IHQgZGVjcmVhc2VzIGJ5IDAuMDA1MSB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgaGlnaCB0ZW1wZXJhdHVyZSBmb3IgdGhlIGdpdmVuIG9ic2VydmF0aW9uLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIExvd1RlbXA6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBMb3dUZW1wIHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDkzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGxvZyBjb3VudHMgbXVsdGlwbGVkIGJ5IHQgaW5jcmVhc2VzIGJ5IDAuMDA5MyB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgbG93IHRlbXBlcmF0dXJlIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogUHJlY2lwaXRhdGlvbjogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIFByZWNpcGl0YXRpb24gdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAwLjAzNTcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbG9nIGNvdW50cyBtdWx0aXBsZWQgYnkgdCBpbmNyZWFzZXMgYnkgMC4wMzU3IHVuaXRzIGZvciBldmVyeSAxIGluY2ggaW5jcmVhc2UgaW4gdGhlIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KDQoNCg0KIyBTdW1tYXJ5IGFuZCBDb21wYXJpc29ucyBvZiB0aGUgVHdvIE1vZGVscw0KDQpCb3RoIG9mIHRoZSB0d28gUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdlIGNyZWF0ZWQsIHRoZSBtb2RlbCBmb3IgdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHRoZSBtb2RlbCBmb3IgdGhlIHJhdGVzLCBwcm92aWRlZCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgZm9yIHByZWRpY3Rpb24gYW5kIHNob3dlZCBnb29kIHV0aWxpdHkgb3ZlcmFsbC4gSW4gYm90aCBvZiB0aGVzZSBtb2RlbHMsIHdlIGxvb2tlZCBpbnRvIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgaW4gTmV3IFlvcmsgZm9yIGEgc3BlY2lmaWMgb2JzZXJ2YXRpb24sIGFuZCB3ZSBsb29rZWQgaW50byB0aGUgdmFyaW91cyBmYWN0b3JzIG9mIHRoYXQgc3BlY2lmaWMgZGF0ZS4gV2UgbG9va2VkIGF0IHRoZSBkYXRlIG9mIHRoZSBvYnNlcnZhdGlvbiBhbG9uZyB3aXRoIHNvbWUgZmFjdG9ycyB3aGljaCBtYXkgYWZmZWN0IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb3V0IG9uIHRoYXQgc3BlY2lmaWMgZGF0ZS4gVGhlc2UgZmFjdG9ycyBpbmNsdWRlZCB0aGUgaGlnaCB0ZW1wZXJhdHVyZSwgdGhlIGxvdyB0ZW1wZXJhdHVyZSwgYW5kIHRoZSBhbW91bnQgb2YgcHJlY2lwaXRhdGlvbiBmb3IgdGhhdCBnaXZlbiBkYXRlLiBJdCB0dXJuZWQgb3V0IHRoYXQgYWxsIG9mIHRoZXNlIGZhY3RvcnMgd2VyZSBpbmRlZWQgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmb3IgYm90aCBvZiB0aGUgdHdvIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMsIGluZGljYXRpbmcgdGhhdCB0aGVzZSB3ZWF0aGVyIHJlbGF0ZWQgY29uZGl0aW9ucyBoYXZlIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbXBhY3Qgb24gYm90aCB0aGUgY291bnRzIGFuZCB0aGUgcmF0ZXMgb2YgY3ljbGlzdHMgb3V0IG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uLiBUaGlzIGNhbiBiZSBhdHRyaWJ1dGVkIHRvIGNlcnRhaW4gd2VhdGhlciBjb25kaXRpb25zIG1ha2luZyBpdCBtb3JlIG9yIGxlc3MgaWRlYWwgZm9yIGluZGl2aWR1YWxzIHRvIGJlIGN5Y2xpbmcgb3V0ZG9vcnMuIEZvciBpbnN0YW5jZSwgYSBkYXkgd2l0aCBpbmNyZWRpYmx5IGhpZ2ggdGVtcGVyYXR1cmVzLCBpbmNyZWRpYmx5IGNvbGQgdGVtcGVyYXR1cmVzLCBvciBzZXZlcmUgc3Rvcm1zIHdpdGggaGVhdnkgcHJlY2lwaXRhdGlvbiB3b3VsZCBiZSBsZXNzIGlkZWFsIGFuZCBsaWtlbHkgbGVhZCB0byBsZXNzIGN5Y2xpc3RzIGJlaW5nIG91dCBvbiB0aGF0IGdpdmVuIGRheSBhcyBvcHBvc2VkIHRvIGEgZGF5IHdpdGggcGxlYXNhbnQgd2VhdGhlci4gDQoNCk92ZXJhbGwsIGJvdGggb2YgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgc2hvd2VkIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBhbmQgZ29vZCB1dGlsaXR5IGluIHRoZWlyIHByZWRpY3Rpb24uIEhvd2V2ZXIsIGFzIHdhcyBwcmV2aW91c2x5IHN0YXRlZCwgdGhlcmUgd2VyZSBzb21lIHZpb2xhdGlvbnMgb2YgdGhpcyBjb25kaXRpb25zIGZvciBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3aXRoaW4gb3VyIGRhdGEgc2V0LiBGaXJzdCwgaXQgd2FzIGZvdW5kIHRoYXQgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLCBXaWxsaWFtc2J1cmdCcmlkZ2UsIHdhcyBub3QgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhpcyByZXNwb25zZSB2YXJpYWJsZSBpbiBmYWN0IGlzIG5vdCBQb2lzc29uIGRpc3RyaWJ1dGVkLCBkdWUgdG8gaXQgZmFpbGluZyB0byBtZWV0IHRoZSBjb25kaXRpb24gZm9yIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgb2YgaXRzIG1lYW4gYmVpbmcgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBBZGRpdGlvbmFsbHksIGFsbCBmb3VyIHByZWRpY3RvciB2YXJpYWJsZXMgd2VyZSBjaGVja2VkLCBhbmQgaXQgd2FzIGZvdW5kIHRoYXQgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGluIGZhY3Qgd2FzIG5vdCBhIGxpbmVhciBmdW5jdGlvbiBvZiBhbnkgb2YgdGhlc2UgcHJlZGljdG9yIHZhcmlhYmxlcy4gVGhpcyBpbmRpY2F0ZXMgYW5vdGhlciBtYWpvciB2aW9sYXRpb24gb2YgdGhpcyBkYXRhIHNldC4gVGhlc2UgdmlvbGF0aW9ucyBzdWdnZXN0IHRoYXQgcGVyaGFwcyBhIFBvaXNzb24gbW9kZWwgd2FzIG5vdCB0aGUgYmVzdCBtb2RlbCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQsIGFuZCB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBiZSBtaW5kZnVsIG9mIHRoZXNlIHZpb2xhdGlvbnMgd2hlbiB1c2luZyBlaXRoZXIgb2YgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgd2UgY3JlYXRlZCBmb3IgcHJlZGljdGlvbi4gDQoNCg0KDQoNCiMgQ29uY2x1c2lvbg0KDQpPdmVyYWxsLCB0d28gUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyB3ZXJlIGNyZWF0ZWQgaW4gdGhpcyBwcm9qZWN0LiBCb3RoIG9mIHRoZXNlIG1vZGVscyBsb29rZWQgYXQgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBkYXkuIFRoZSBmaXJzdCBtb2RlbCBsb29rZWQgYXQgdGhlIGNvdW50cyBvZiBjeWNsaXN0cyB0aGF0IHdlcmUgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UsIGFuZCB0aGUgc2Vjb25kIG1vZGVsIGxvb2tlZCBhdCB0aGUgcmF0ZXMgb2YgdGhlIGN5Y2xpc3RzIHRoYXQgd2VyZSBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvZmZzZXQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcy4gDQoNCkJvdGggb2YgdGhlc2UgdHdvIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgc2hvd2VkIHN0YXRpc3RpY2FsIHNpZ25pY2lmYW5jZSBpbiB0aGVpciBwcmVkaWN0aW9ucywgd2l0aCBhbGwgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgaW4gYm90aCBvZiB0aGVzZSB0d28gbW9kZWxzIGhhdmUgcC12YWx1ZXMgb2YgcCA8IC4wMDEuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGZhY3RvcnMgaW4gdGhlIGRhdGEgc2V0IG9mIERhdGUsIEhpZ2hUZW1wLCBMb3dUZW1wLCBhbmQgUHJlY2lwaXRhdGlvbiBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY25hY2UgaW4gcHJlZGljdGluZyB0aGUgZnJlcXVlbmN5IGNvdW50cyBvciB0aGUgcmF0ZXMgb2YgdGhlIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uLiANCg0KSG93ZXZlciwgb3VyIGRhdGEgc2V0IGZhaWxlZCB0byBtZWV0IHNvbWUgb2YgdGhlIG5lY2Nlc3NhcnkgY29uZGl0aW9ucyBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFRoZSBtZWFuIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSwgV2lsbGlhbXNidXJnQnJpZGdlLCB3YXMgbm90IGVxdWFsIHRvIGl0cyB2YXJpYW5jZS4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoaXMgcmVzcG9uc2UgdmFyaWFibGUgaW4gZmFjdCBpcyBub3QgUG9pc3NvbiBkaXN0cmlidXRlZC4gQWxzbywgYWxsIGZvdXIgcHJlZGljdG9yIHZhcmlhYmxlcyB3ZXJlIGNoZWNrZWQsIGFuZCBpdCB3YXMgZm91bmQgdGhhdCB0aGUgcmVzcG9uc2UgdmFyaWFibGUgaW4gZmFjdCB3YXMgbm90IGEgbGluZWFyIGZ1bmN0aW9uIG9mIGFueSBvZiB0aGVzZSBwcmVkaWN0b3IgdmFyaWFibGVzLiBUaGVzZSBhcmUgdHdvIHZpb2xhdGlvbnMgb2YgdGhlIGFzc3VtcHRpb25zIGZvciBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gVGhlc2UgdmlvbGF0aW9ucyBtZWFuIHRoYXQgcGVyaGFwcyBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3YXMgbm90IHRoZSBiZXN0IGNob2ljZSBmb3IgdGhpcyBkYXRhIHNldCwgYW5kIHRoYXQgdGhlc2UgdmlvbGF0aW9ucyBzaG91bGQgYmUga2VwdCBpbiBtaW5kIHdoZW4gdXNpbmcgZWl0aGVyIG9mIHRoZXNlIG1vZGVscyBmb3IgcHJlZGljdGlvbi4NCg0KDQoNCg0KDQojIyBSZWNvbW1lbmRhdGlvbnMNCg0KU29tZSByZWNvbW1lbmRhdGlvbnMgSSB3b3VsZCBzdWdnZXN0IGZvciBmdXJ0aGVyIHByb2plY3RzIGluY2x1ZGU6DQoNCiogTG9vayBmdXJ0aGVyIGludG8gdGhlIHZpb2xhdGlvbnMgdGhhdCB3ZXJlIGZvdW5kIHdpdGhpbiB0aGlzIGRhdGEgc2V0IGFuZCBsb29rIGludG8gcG9zc2libGUgZXhwbGFuYXRpb25zIGZvciB0aGVzZSB2aW9sYXRpb25zIG9mIHRoZSBuZWNlc3NpdGllcyBvZiBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gRnVydGhlciBjb25zaWRlciB3aGV0aGVyIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaW4gZmFjdCBpcyB0aGUgYmVzdCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQgYW5kIGlmIGl0IGlzIHN1ZmZpY2llbnQgdG8gdXNlIHRoaXMgbW9kZWwgZm9yIHByZWRpY3Rpb24gZGVzcGl0ZSB0aGVzZSB2aW9sYXRpb25zLg0KDQoqIENvbnNpZGVyIG90aGVyIHZhcmlhYmxlcyB3aGljaCBtYXkgYWZmZWN0IHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb3V0IG9uIGEgZ2l2ZW4gb2JzZXJ2YXRpb24uIFBlcmhhcHMgdGhlcmUgYXJlIG90aGVyIGZhY3RvcnMgd2hpY2ggbWF5IHByb3ZpZGUgZnVydGhlciBzaWduaWZpY2FuY2UgZm9yIG1vZGVsIGJ1aWxkaW5nIHdoaWNoIG1heSBzdHJlbmd0aGVuIHRoZSByZWdyZXNzaW9uIG1vZGVsLg0KDQoqIEZ1cnRoZXIgZXhwYW5kIHRoZSBkYXRhIHNldCB0byBlbnN1cmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBwcmVkaWN0aW9ucyBhbmQgdG8gZnVydGhlciBzdHJlbmd0aGVuIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzLiANCg0KDQoNCg0K