Introduction
Data was collected to observe which factors have the greatest impact
on the area of land burned in a forest fire.
In the previous assignment, several regression models were created in
order to determine which one provides the best quality of prediction and
estimation for the area affected by a forest fire. For this project, we
will look at the method of bootstrapping the multiple regression model.
We will use the bootstrap method to find bootstrap confidence intervals
of the variables in the regression model.
Data Description
I found this data set on kaggle.com on the following webpage: https://www.kaggle.com/datasets/elikplim/forest-fires-data-set.
The data set is named as “forestfires.csv”.
This data set uses meteorological data to predict the approximated
area which will be burned in forest fires based upon these various
factors. This allows us to investigate the factors which have an impact
on the area of land which is burned by a forest fire. Such data is
incredibly useful in order to help know which factors have the greatest
significance on the area affected by a forest fire, because this could
help provide neccessary data to help minimize the area damaged by forest
fires.
The data in this data set was collected around the Montesinho Natural
Park which is located in Portugal. The data was collected from 517
observations of forest fires which occurred within this national park.
To further enhance the data collection, researchers divided up the
national park into a set of spatial coordinates to pinpoint the precise
location of the forest fires within Montesinho Natural Park. The
national park was divided into x-axis and y-axis spatial coordinates,
with the x-axis coordinates ranging from 1 to 9, and the y-axis
coordinates ranging from 2 to 9. Each observation was pinpointed to the
coordinate location of where the forest fire began.
Variables
There are 13 variables in the forestfires data set.
X: The x-axis spatial coordinate of the forest fire’s location
within Montesinho Natural Park. A numeric value ranging from 1 to
9.
Y: The y-axis spatial coordinate of the forest fire’s location
within Montesinho Natural Park. A numeric value ranging from 2 to
9.
month: The month of the year in which the forest fire occurred. A
categorical, character variable with the lowercase abbreviation of the
first three letters of the month. (For example: feb, oct, dec)
day: The day of the week on which the forest fire occurred. A
categorical, character variable with the lowercase abbreviation of the
first three letters of the month. (For example: mon, tue, sat)
FFMC: FFMC index from the FWI System. A numeric, quantitative
variable. The FWI System stands for the Fire Weather Index System and it
is a system that provides a numeric rating on a scale for the intensity
of a fire. FFMC stands for Fine Fuel Moisture Code and it is a measure
of the moisture content of litter and other fuels for a fire that are
present.
DMC: DMC index from the FWI System. A numeric, quantitative
variable. DMC stands for Deep Moist Convection and it is a measure of
decomposed organic material underneath the litter which fuels the
fire.
DC: DC index from the FWI System. A numeric, quantitative
variable. DC stands for Drought Code and is a measure of the moisture
content of compact organic layers in the area affected by the
fire.
ISI: ISI index from the FWI System. A numeric, quantitative
variable. ISI stands for Initial Spread Index and is a measure of the
expected rate of fire spread.
temp: The temperature given in degrees Celsius. A numeric,
quantitative variable.
RH: The relative humidity given as a percentage. A numeric,
quantitative variable.
wind: The speed of the wind given in kilometers per hour (km/h).
A numeric, quantitative variable.
rain: The rain occurring outside given in a measurement of
mm/m^2. A numeric, quantitative variable.
area: The area of the forest which was burned by the fire.
Measured in units of hectares (ha). A numeric, quantitative variable.
The response variable of this experimental study.
Research
Questions
For this project, our main goal is to create a model which uses the
various factors involved to provide significance for the prediction and
estimation of the area burned by a forest fire.
Some further research questions which I came up with over the past
few weeks of analyzing this data include:
Which factors have the greatest significance in predicting the
area burned by a forest fire?
Which factors have the highest correlation with each other? And,
what are some possible explanations for these factors have the greatest
correlation?
Are there any major outliers in the data set which would prompt
further examination to see what is going on in that occurrence?
Is this data set from Montesinho National Park applicable to the
overall scope of forest fires around the world? Is our data set
representative of forest fires of all locations?
How useful is the model we will create in predicting the area
affected by a forest fire? And, how can this data help with predicting
patterns of forest fires in order to minimize the damage they
cause?
We will use these research questions as a starting point for our
analysis of this experiment. We will come back to these questions in the
conclusion to see which research questions we have concluded an answer
to.
Data Preparation and
Exploratory Analysis
To begin, let’s read in the data set from Github.
'data.frame': 517 obs. of 13 variables:
$ X : int 7 7 7 8 8 8 8 8 8 7 ...
$ Y : int 5 4 4 6 6 6 6 6 6 5 ...
$ month: chr "mar" "oct" "oct" "mar" ...
$ day : chr "fri" "tue" "sat" "fri" ...
$ FFMC : num 86.2 90.6 90.6 91.7 89.3 92.3 92.3 91.5 91 92.5 ...
$ DMC : num 26.2 35.4 43.7 33.3 51.3 ...
$ DC : num 94.3 669.1 686.9 77.5 102.2 ...
$ ISI : num 5.1 6.7 6.7 9 9.6 14.7 8.5 10.7 7 7.1 ...
$ temp : num 8.2 18 14.6 8.3 11.4 22.2 24.1 8 13.1 22.8 ...
$ RH : int 51 33 33 97 99 29 27 86 63 40 ...
$ wind : num 6.7 0.9 1.3 4 1.8 5.4 3.1 2.2 5.4 4 ...
$ rain : num 0 0 0 0.2 0 0 0 0 0 0 ...
$ area : num 0 0 0 0 0 0 0 0 0 0 ...
The data was collected by pinpointing the forest fire’s location of
origin from a system of spatial coordinates around Montesinho Natural
Park. So, we will create a graph to help visualize the locations of the
occurrences.

As we can see, the forest fire occurrences are spread out throughout
the park. It appears that more forest fires were observed in the lower
half of the Y-coordinates, around 2-5, however the data still appears to
be spread out enough to continue with our investigation of the
model.
Refining the Data
set
While looking at the data set, something I noticed is that many
observations have an area of 0, meaning that none of the forest was
burned by a forest fire for those observations. This could provide for
some comparisons between what conditions caused a fire and what did not,
or lead to questions of why a fire occurred on a certain day but not
another. However, the purpose of this experiment is to see what factors
have a significant impact on the area burned in a forest fire. If we
were to include these observations with an area of 0 affected by the
fires, then this may lead to our observations being skewed or separated
into two groups: area of zero and area of nonzero, aka no fire damage
and fire damage. This could have a negative affect on our final
regression model, by clustering our data into two groups, zero and
nonzero area, which would cause for notable inaccuracy. After some
consideration, I believe it would be in the best interest of this
experiment to create a new data frame, one which only includes the
observations where there was in fact a forest fire which caused
damage.
Let’s create a new data set called “forestfires1” that includes only
the observations where the area affected is greater than 0.
X Y month day FFMC DMC DC ISI temp RH wind rain area
1 9 9 jul tue 85.8 48.3 313.4 3.9 18.0 42 2.7 0 0.36
2 1 4 sep tue 91.0 129.5 692.6 7.0 21.7 38 2.2 0 0.43
3 2 5 sep mon 90.9 126.5 686.5 7.0 21.9 39 1.8 0 0.47
4 1 2 aug wed 95.5 99.9 513.3 13.2 23.3 31 4.5 0 0.55
5 8 6 aug fri 90.1 108.0 529.8 12.5 21.2 51 8.9 0 0.61
6 1 2 jul sat 90.0 51.3 296.3 8.7 16.6 53 5.4 0 0.71
'data.frame': 270 obs. of 13 variables:
$ X : int 9 1 2 1 8 1 2 6 5 8 ...
$ Y : int 9 4 5 2 6 2 5 5 4 3 ...
$ month: chr "jul" "sep" "sep" "aug" ...
$ day : chr "tue" "tue" "mon" "wed" ...
$ FFMC : num 85.8 91 90.9 95.5 90.1 90 95.5 95.2 90.1 84.4 ...
$ DMC : num 48.3 129.5 126.5 99.9 108 ...
$ DC : num 313 693 686 513 530 ...
$ ISI : num 3.9 7 7 13.2 12.5 8.7 13.2 10.4 6.2 3.2 ...
$ temp : num 18 21.7 21.9 23.3 21.2 16.6 23.8 27.4 13.2 24.2 ...
$ RH : int 42 38 39 31 51 53 32 22 40 28 ...
$ wind : num 2.7 2.2 1.8 4.5 8.9 5.4 5.4 4 5.4 3.6 ...
$ rain : num 0 0 0 0 0 0 0 0 0 0 ...
$ area : num 0.36 0.43 0.47 0.55 0.61 0.71 0.77 0.9 0.95 0.96 ...
Let’s create another map for our refined data set to ensure
everything still looks alright.

The map appears very similar to the one created for the forestfires
data set, with the points spread out across the coordinates, so this is
good. Once again, it appears that more forest fires were observed in the
lower half of the Y-coordinates, around coordinates 2-5, but apart from
this, the points are spread out across the coordinate system.
Having a refined data set which focuses on the observations in which
forest fires did affect and cause damage to an area of the forest will
provide better insight and power for our purpose of this experiment,
which is to see which factors have significance in the amount of area
damaged by forest fires. By focusing only on the observations which were
affected by forest fires, this will be more useful for our goal and
allowing us to create a model for prediction and estimation without the
inclusion of redundant observations which do not help our model.
Let’s check for any imbalances in the categorical variable of
“month”.
apr aug dec feb jul jun mar may oct sep
4 99 9 10 18 8 19 1 5 97
It turns out that there is a very significant imbalance in the
variable month. The number of observations in August and September, 99
and 97 respectively drastically outweigh all of the other months, with
no other month having greater than 19 observations. This is a major
cause for concern as this categorical variable is very severely
imbalanced.
We will keep the month variable for now, as it seems like what month
it is does have significance in predicting area affected by forest
fires, but we will keep a close eye on it for the final model to
determine if it should be removed due to its imbalance. We will address
this variable later on to see if its removal will help improve our
model. This month variable is one we will keep a close watch on due to
this concern of imbalance.
Let’s check the other categorical variable “day” for potential
imbalances.
fri mon sat sun thu tue wed
43 39 42 47 31 36 32
The “day” variable does not show major imbalance, as all the days
have a significant number of observations with the difference between
the highest and lowest days being a total of 15 observations, Sunday
with 47 and Wednesday with 32. However, the day of the week does not
seem like it would have as major significance in predicting forest fire
damage then some of the other factors in question. This can be seen as
by how the days of the week are not very imbalanced in regards to their
total observations. This is unlike the month variable where it was shown
that the vast majority of the observations fall into either August or
September, evidencing that the majority of forest fires occur within
these warmer, end of summer months.
To avoid having too many or too redundant variables within our full
model, the categorical variable for “day” will not be included.
9 |
9 |
jul |
85.8 |
48.3 |
313.4 |
3.9 |
18.0 |
42 |
2.7 |
0 |
0.36 |
1 |
4 |
sep |
91.0 |
129.5 |
692.6 |
7.0 |
21.7 |
38 |
2.2 |
0 |
0.43 |
2 |
5 |
sep |
90.9 |
126.5 |
686.5 |
7.0 |
21.9 |
39 |
1.8 |
0 |
0.47 |
1 |
2 |
aug |
95.5 |
99.9 |
513.3 |
13.2 |
23.3 |
31 |
4.5 |
0 |
0.55 |
8 |
6 |
aug |
90.1 |
108.0 |
529.8 |
12.5 |
21.2 |
51 |
8.9 |
0 |
0.61 |
1 |
2 |
jul |
90.0 |
51.3 |
296.3 |
8.7 |
16.6 |
53 |
5.4 |
0 |
0.71 |
Model Building
For this project, we want to create a multiple linear regression
model that allows us to use the several factors in order to create a
model for the prediction and estimation of the area affected by forest
fires.
Full Model
We will begin with a full multiple linear regression model. We will
observe how this full model turns out to help decide whether we need to
apply any transformations to any of the variables.
Statistics of Regression Coefficients
(Intercept) |
-74.4004408 |
224.5630059 |
-0.3313121 |
0.7406863 |
X |
4.7819085 |
2.7221618 |
1.7566584 |
0.0802003 |
Y |
-2.2318912 |
5.4754358 |
-0.4076189 |
0.6839023 |
monthaug |
119.6584526 |
78.0476359 |
1.5331464 |
0.1265043 |
monthdec |
93.2179223 |
66.0743422 |
1.4108036 |
0.1595456 |
monthfeb |
2.9241777 |
51.9041602 |
0.0563380 |
0.9551175 |
monthjul |
66.9401095 |
66.5964018 |
1.0051611 |
0.3157912 |
monthjun |
21.2886426 |
63.0498198 |
0.3376480 |
0.7359118 |
monthmar |
-12.1109924 |
48.6547436 |
-0.2489170 |
0.8036294 |
monthmay |
7.9712044 |
98.5515997 |
0.0808836 |
0.9355993 |
monthoct |
168.8733920 |
94.7483285 |
1.7823364 |
0.0759079 |
monthsep |
174.9584210 |
87.6286192 |
1.9965900 |
0.0469541 |
FFMC |
0.7443619 |
2.4705591 |
0.3012929 |
0.7634416 |
DMC |
0.3982145 |
0.1627861 |
2.4462435 |
0.0151253 |
DC |
-0.3152171 |
0.1190645 |
-2.6474489 |
0.0086256 |
ISI |
-1.9149661 |
2.0946308 |
-0.9142261 |
0.3614790 |
temp |
2.5843307 |
1.9331153 |
1.3368736 |
0.1824792 |
RH |
-0.2528721 |
0.5528720 |
-0.4573792 |
0.6477957 |
wind |
3.3528858 |
3.3304720 |
1.0067299 |
0.3150380 |
rain |
-4.9594839 |
13.7861611 |
-0.3597436 |
0.7193425 |
Check for
Violations
Now, we will check the residual plots to look for potential
violations of our full model.

It appears that we do have some violations within our model. For
instance, variance is not constant as shown by how there are a few very
notable outliers to the right of the residual plot. Additionally, the
Q-Q Plot shows some violations as well as the right side of the data
appears to have some sort of curvature with these points not following a
normal distribution. Furthermore, the Cooke’s Distance plot shows that
we indeed do have some high leverage points in our model.
Let’s check the VIF for any potential multicollinearity issues in our
model.
GVIF Df GVIF^(1/(2*Df))
X 1.508460 1 1.228194
Y 1.472642 1 1.213525
month 117.881365 9 1.303408
FFMC 3.009177 1 1.734698
DMC 3.625445 1 1.904060
DC 26.871270 1 5.183751
ISI 2.704552 1 1.644552
temp 5.113912 1 2.261396
RH 2.491118 1 1.578327
wind 1.411811 1 1.188196
rain 1.081053 1 1.039737

It appears that we do have a few high VIF values present in our model
which leads to the likelihood of a multicollinearity issue.
Let’s use a correlation matrix to check which variables are causing
issues. We can only check the correlation of numeric variables so we
will create a temporary data set “cor.data” which does not include the
categorical variable of month.
X Y FFMC DMC DC ISI temp RH wind rain area
X 1.00 0.50 -0.07 -0.10 -0.16 -0.05 -0.08 0.06 0.04 0.06 0.07
Y 0.50 1.00 -0.02 0.04 -0.03 -0.07 0.03 -0.04 -0.04 0.03 0.05
FFMC -0.07 -0.02 1.00 0.48 0.41 0.70 0.56 -0.29 -0.16 0.08 0.05
DMC -0.10 0.04 0.48 1.00 0.67 0.33 0.50 0.03 -0.14 0.08 0.09
DC -0.16 -0.03 0.41 0.67 1.00 0.26 0.50 -0.08 -0.24 0.04 0.05
ISI -0.05 -0.07 0.70 0.33 0.26 1.00 0.47 -0.15 0.07 0.07 0.00
temp -0.08 0.03 0.56 0.50 0.50 0.47 1.00 -0.50 -0.32 0.08 0.11
RH 0.06 -0.04 -0.29 0.03 -0.08 -0.15 -0.50 1.00 0.14 0.10 -0.10
wind 0.04 -0.04 -0.16 -0.14 -0.24 0.07 -0.32 0.14 1.00 0.05 0.00
rain 0.06 0.03 0.08 0.08 0.04 0.07 0.08 0.10 0.05 1.00 -0.01
area 0.07 0.05 0.05 0.09 0.05 0.00 0.11 -0.10 0.00 -0.01 1.00
It appears that FFMC and ISI are highly correlated with a correlation
of 0.70. We will remove one of these variables to help avoid this
multicollinearity issue. We will keep FFMC, as it is the first variables
alphabetically of these two. Additionally, it appears that DMC and DC
are significantly correlated, with a correlation of 0.67. We will keep
DC as it is the first variable alphabetically of these two.
Now, let’s revise our final.data model with the variables adjusted to
address the multicollinearity issue that we encountered.
9 |
9 |
jul |
85.8 |
313.4 |
18.0 |
42 |
2.7 |
0 |
0.36 |
1 |
4 |
sep |
91.0 |
692.6 |
21.7 |
38 |
2.2 |
0 |
0.43 |
2 |
5 |
sep |
90.9 |
686.5 |
21.9 |
39 |
1.8 |
0 |
0.47 |
1 |
2 |
aug |
95.5 |
513.3 |
23.3 |
31 |
4.5 |
0 |
0.55 |
8 |
6 |
aug |
90.1 |
529.8 |
21.2 |
51 |
8.9 |
0 |
0.61 |
1 |
2 |
jul |
90.0 |
296.3 |
16.6 |
53 |
5.4 |
0 |
0.71 |
The adjusted final model is given as follows.
Statistics of Regression Coefficients
(Intercept) |
-75.1321207 |
182.9397173 |
-0.4106933 |
0.6816464 |
X |
3.8460358 |
2.7296652 |
1.4089772 |
0.1600746 |
Y |
0.3730475 |
5.4471380 |
0.0684851 |
0.9454538 |
monthaug |
43.5843177 |
73.6968537 |
0.5914000 |
0.5547826 |
monthdec |
42.3450183 |
63.7861600 |
0.6638590 |
0.5073874 |
monthfeb |
3.8319210 |
52.4571871 |
0.0730485 |
0.9418254 |
monthjul |
17.3621272 |
64.7226016 |
0.2682545 |
0.7887229 |
monthjun |
-10.9919974 |
62.5858539 |
-0.1756307 |
0.8607251 |
monthmar |
-12.1725199 |
49.1748282 |
-0.2475356 |
0.8046953 |
monthmay |
8.2755520 |
99.4698215 |
0.0831966 |
0.9337613 |
monthoct |
50.2980046 |
84.5434955 |
0.5949364 |
0.5524198 |
monthsep |
74.6973998 |
80.2226257 |
0.9311263 |
0.3526794 |
FFMC |
0.4424613 |
1.9435330 |
0.2276582 |
0.8200965 |
DC |
-0.1180168 |
0.0944542 |
-1.2494614 |
0.2126556 |
temp |
2.7700666 |
1.9310653 |
1.4344759 |
0.1526763 |
RH |
-0.0717121 |
0.5499241 |
-0.1304036 |
0.8963512 |
wind |
2.7234690 |
3.2044010 |
0.8499152 |
0.3961790 |
rain |
-5.5042055 |
13.9136960 |
-0.3955962 |
0.6927376 |
It is important to note that our full multiple linear regression
model has a p-value of p = 0.6816, which is greater than our alpha value
of 0.05. This indicates that this full model will likely not be our best
choice for prediction and estimation as this model was not statistically
significant in predicting the area burned by a forest fire.
Box Cox Models
Due to the violations in the residual plots of the model, we will use
the Box Cox transformations to adjust our data.
Comparison of Q-Q
Plots
Something which was made note of when performing the various
transformations was that there appeared to be some violations when
checking our residual conditions. One particular violation which
appeared to be very severe in certain cases was the failure of the Q-Q
Plot to indicate that the data appeared to follow a normal distribution.
Both the original linear model and the square root transformation model
especially had severe violations regarding their Q-Q Plots. However, the
logarithmic transformation model appeared to have a Q-Q Plot which was
much closer to indicting a normal distribution than the other two. While
there was still some slight deviation on the right hand side of the Q-Q
Plot for the logarithmic transformation, it was way less than either of
the other two models. Additionally, the logarithmic transformation was
the only Q-Q Plot which did not show blatant curvature in the right hand
side of it.

By comparing the Q-Q Plots of these three potential models, we can
see that the logarithmic model has the linear model and the square root
transformation model have very severe violations of normality in their
Q-Q Plot. While the logarthimic transformation model still does have
some deviation from normality, it is by far the least severe violation
of the three. This gives a strong point towards the logarithmic
transformation model being the best one to use for the prediction and
estimation of area.
Goodness of
Fit
We will now look at other goodness of fit methods for the final three
models of consideration. These methods for goodness of fit will include
useful tools for statistical analysis such as R-squared value, AIC, and
Mallow’s Cp.
We will create an output table to display the goodness of fit values
for each of the three models.
Goodness-of-fit Measures for the Three Candidate
Models
Linear Full Model |
1932593.5973 |
0.0398488 |
-0.0249233 |
18 |
2432.5069 |
Sqrt Area Log Temp |
3373.9333 |
0.0167906 |
-0.0094783 |
8 |
697.8614 |
Log Area |
620.3287 |
0.0106382 |
-0.0157952 |
8 |
240.5934 |
Overall, it appears that unfortunately all three models have very low
R squared values indicating low explained variance within their
respective models. The Mallow’s Cp value for the last two models, the
square root and logarithmic transformation models, is better than that
of the full linear model. The logarithmic transformation model has the
lowest AIC out of the three, which indicates that it is a better fit
model for the data.
All in all, the best model of the three appears to be the logarithmic
transformation. This has been shown by the goodness of fit measures that
were performed as well as by that it was the only model with a
statistically significant p-value, p = 0.0014, while the other two
models both had p-values that were greater than our alpha value of 0.05
indicating that the other two models were not statistically significant
in predicting area while the logarithmic model was.
So, we will select the logarithmic transformation model as our final
model to use.
Final Model
After our analysis of the three potential choices for a final model,
we decided that the best fit model to use is the logarithmic
transformation model. This model had the best goodness of fit measures
as well as it was the only one with a statistically significant
p-value.
Inferential Statistics of Final Model- Log Area
(Intercept) |
2.4834516 |
0.7666130 |
3.2395115 |
0.0013520 |
X |
0.0211869 |
0.0462344 |
0.4582490 |
0.6471534 |
Y |
-0.0367580 |
0.0928944 |
-0.3956964 |
0.6926510 |
DC |
0.0000890 |
0.0004891 |
0.1820437 |
0.8556892 |
temp |
-0.0181803 |
0.0213391 |
-0.8519727 |
0.3950073 |
RH |
-0.0098113 |
0.0074753 |
-1.3125061 |
0.1904980 |
wind |
0.0356783 |
0.0530221 |
0.6728946 |
0.5016074 |
rain |
0.0910809 |
0.2407878 |
0.3782623 |
0.7055421 |
Our overall model appears to be statistically significant for the
prediction and estimation of log(area). It appears that choosing the
logarithmic transformation as our final model was the best choice after
all.
The combined logarithmic model of X, Y, DC, temp, RH, wind, and rain,
statistically significantly predicted the log of area, p = 0.0014.
The regression equation for our final choice of the model is given as
follows:
log(area) = 2.4835 + 0.0212 * X - 0.0368 * Y + 0.0001 * DC - 0.0182 *
temp - 0.0098 * RH + 0.0357 * wind + 0.0911 * rain.
Included below are the inferential statistics of the final model.
Inferential Statistics of Final Model
(Intercept) |
2.4834516 |
0.7666130 |
3.2395115 |
0.0013520 |
X |
0.0211869 |
0.0462344 |
0.4582490 |
0.6471534 |
Y |
-0.0367580 |
0.0928944 |
-0.3956964 |
0.6926510 |
DC |
0.0000890 |
0.0004891 |
0.1820437 |
0.8556892 |
temp |
-0.0181803 |
0.0213391 |
-0.8519727 |
0.3950073 |
RH |
-0.0098113 |
0.0074753 |
-1.3125061 |
0.1904980 |
wind |
0.0356783 |
0.0530221 |
0.6728946 |
0.5016074 |
rain |
0.0910809 |
0.2407878 |
0.3782623 |
0.7055421 |
Final Model
Variable Interpretation
We will analyze the relationship of the independent variables in our
final regression model with their affect on area. As states previously
in the variable description section of this project, the measurements
for area are given in hectares. Additionally, since our final model
selected is a logarithmic transformation, these interpretations will be
looking at the effects of these independent variables on the log of
area.
X: For every additional 1 coordinate movement to the right, the
logarithmic transformation of area burned by a forest fire increases by
0.0212 hectares.
Y: For every additional 1 coordinate movement upwards,
logarithmic transformation of area burned by a forest fire decreases by
0.0368 hectare.
DC: For every additional 1 unit increase of DC, the measure of
the moisture content of compact organic layers in the area affected by
the fire, the logarithmic transformation of area burned by a forest fire
increases by 0.0001 hectare.
temp: For every 1 degree Celsius increase in temperature, the
logarithmic transformation of area burned by a forest fire decreases by
0.0182 hectare.
RH: For every 1 percentage increase in the relative humidity, the
logarithmic transformation of area burned by a forest fire decreases by
0.0098 hectare.
wind: For every 1 kilometer per hour increase in the speed of the
wind, the logarithmic transformation of area burned by a forest fire
increases by 0.0357.
rain: For every 1 mm/m^2 increase in the rain occurring, the
logarithmic transformation of area burned by a forest fire increases by
0.0911.
We can see that the variables that are positively associated with the
logarithmic transformation of area burned by a forest fire are X, DC,
wind, and rain. This indicates that as these variables increase, so does
the area burned by a forest fire. On the other hand, the variables that
are negatively associated with the logarithmic transformation of area
burned by a forest fire are Y, temp, and RH. This indicates that as
these variables increase, the area burned by a forest fire
decreases.
Bootstrapping the Final
Model
We chose the logarithmic transformation as our final model in the
previous section due to it being the model which both shows the greatest
statistical significance in the prediction of area, and has the fewest
violations of a multiple regression model of the models we
considered.
The equation of our final model is: log(area) = 2.4835 + 0.0212 * X -
0.0368 * Y + 0.0001 * DC - 0.0182 * temp - 0.0098 * RH + 0.0357 * wind +
0.0911 * rain.
Now, we will look at the process of bootstrapping this final model in
order to find the bootstrap confidence intervals of the coefficients in
our final model.
Bootstrap Cases
We will look at the bootstrap cases for our final model and use these
to help build the bootstrap confidence intervals of the regression
coefficients.
We will now use these bootstrap cases to create histograms of the
bootstrap regression coefficients.
The histograms of the bootstrap coefficients for the variables in the
model were created.
There are histograms for each of the independent variables in the
model, along with the intercept, except for the variable “rain”. The
variable “rain” contains several points with the value of zero. Since
the final model we chose to use is a logarithmic model, this results in
an error because log(0) is undefined. So, this variable was not included
in the histograms of the bootstrap coefficients due to it resulting in
this error. All of the other variables can be seen along with their
histograms.
Within the histograms, there are two different normal density curves
placed on them. The blue curve is a non-parametric density estimate of
the bootstrap sampling distribution. The bootstrap confidence intervals
we will calculate shortly are based upon this non-parametric bootstrap
sampling distribution. The purple curve is a measure of the estimate of
the regression coefficients and the corresponding value of their
standard error. The p-values given in the regression output are taken
from this curve.


Looking at the histograms of the regression coefficients, both the
blue and purple curves appear to be close and consistent with each
other. Additionally, the histograms of all of the regression
coefficients appear to follow distributions that are approximately
normal without any severe skew or outliers immediately noticeable.
Bootstrap
Confidence Intervals Using Bootstrapping Cases
Next, we will create the 95% Bootstrap Confidence Intervals for the
regression coefficients of the selected model.
Something to note is that as mentioned in the previous section, the
variable “rain” includes several entries with a value of zero. Since our
final model is a logarithmic transformation, we can not have a log of
zero because log(0) is an undefined value, so this leads to the
bootstrap method giving the variable rain a value of NA. However, the
other independent variables do not have this issue of having several
zero values in their entries, so we can observe their bootstrap
confidence intervals below.
Regression Coefficient Matrix
(Intercept) |
2.4835 |
0.7666 |
3.2395 |
0.0014 |
[ 0.8029 , 4.0016 ] |
X |
0.0212 |
0.0462 |
0.4582 |
0.6472 |
[ -0.0619 , 0.1082 ] |
Y |
-0.0368 |
0.0929 |
-0.3957 |
0.6927 |
[ -0.2263 , 0.1693 ] |
DC |
0.0001 |
0.0005 |
0.1820 |
0.8557 |
[ -7e-04 , 9e-04 ] |
temp |
-0.0182 |
0.0213 |
-0.8520 |
0.3950 |
[ -0.0577 , 0.0195 ] |
RH |
-0.0098 |
0.0075 |
-1.3125 |
0.1905 |
[ -0.0219 , 0.003 ] |
wind |
0.0357 |
0.0530 |
0.6729 |
0.5016 |
[ -0.0672 , 0.1367 ] |
rain |
0.0911 |
0.2408 |
0.3783 |
0.7055 |
[ -0.9978 , 0.2001 ] |
We can see the bootstrap confidence intervals of the variables along
with the intercept of the final logarithmic model of the data. These
confidence intervals use bootstrapping cases in order to find the
confidence intervals for the regression coefficients. In the above
table, we can see the test statistics and the p-values for each of the
regression coefficients. We can also see the 95% bootstrap confidence
intervals for each of the variables along with the intercept from the
use of bootstrapping cases.
Something interesting to note is that the variables X, Y, DC, temp,
RH, wind, and rain all contain zero in their 95% bootstrap confidence
intervals, meaning that on their own they are not statistically
significant. However, the 95% bootstrap confidence interval for the
intercept does contain zero, meaning that the combined logarithmic model
of all these variables in statistically significant which matches up
with what was shown earlier when constructing this final model. This
statistical significance of the overall model can be seen by the p-value
of p = 0.0014.
Bootstrap
Residuals
In this section, we will use the bootstrap residual method to
construct the bootstrap confidence intervals. We will first take a look
at the histogram of the residuals that are obtained from the bootstrap
method, and then we will construct the 95% bootstrap confidence
intervals for the data.
Residual
Histogram
Now let’s create a histogram to visualize the residuals obtained from
the bootstrap method.

The above histogram shows that the residual histogram appears like it
is close to being normally distributed, however it appears like there is
an ever-so-slightly skew to the left, with more of the residuals seeming
to occur on the left-side of the histogram. Additionally, there are some
observations which are slightly off to the end, specifically the two
observations to the right of x = 4 on the right-hand side and the one
observation to the very left of x = -4 on the left-hand side which could
be very slight potential outliers. However, these observations do not
look too severe so it is not a major cause for concern. Overall, the
residuals seems to fall close to that of a normal distribution,
In the following section, we will use these residuals to conduct the
process of taking residual bootstrap samples. We will use these samples
to estimate the bootstrap confidence intervals for the regression
coefficients in our final model.
Residual Bootstrap
Regression and Finding Bootstrap Confidence Intervals
Now, let’s create the 95% bootstrap confidence intervals of the
bootstrap regression coefficients.
We will create histograms for each of our regression coefficients to
help us visualize our bootstrap residuals for our model.
We will now create the residual bootstrap histograms for the
regression coefficients of our model.


We can see that the histograms mostly follow a normal distribution
for the regression coefficients of our model. Just like before when
creating histograms for the regression coefficients in the bootstrap
cases, there are two curves on these histograms, a blue and a purple
curve. The blue curve is a non-parametric density estimate of the
bootstrap sampling distribution. The bootstrap confidence intervals we
will calculate shortly are based upon this non-parametric bootstrap
sampling distribution. The purple curve is a measure of the estimate of
the regression coefficients and the corresponding value of their
standard error. The p-values given in the regression output are taken
from this curve.
Bootstrap
Confidence Intervals Using Bootstrap Residuals
Next, we will calculate the 95% bootstrap confidence intervals by the
use of the bootstrap residuals.
Regression Coefficient Matrix of 95% Residual Bootstrap
Confidence Intervals
(Intercept) |
2.4835 |
0.7666 |
3.2395 |
0.0014 |
[ 1.0459 , 4.0219 ] |
X |
0.0212 |
0.0462 |
0.4582 |
0.6472 |
[ -0.0702 , 0.1077 ] |
Y |
-0.0368 |
0.0929 |
-0.3957 |
0.6927 |
[ -0.2172 , 0.1382 ] |
DC |
0.0001 |
0.0005 |
0.1820 |
0.8557 |
[ -8e-04 , 0.001 ] |
temp |
-0.0182 |
0.0213 |
-0.8520 |
0.3950 |
[ -0.0628 , 0.0224 ] |
RH |
-0.0098 |
0.0075 |
-1.3125 |
0.1905 |
[ -0.0246 , 0.004 ] |
wind |
0.0357 |
0.0530 |
0.6729 |
0.5016 |
[ -0.0687 , 0.1355 ] |
rain |
0.0911 |
0.2408 |
0.3783 |
0.7055 |
[ -0.339 , 0.5911 ] |
Above we can see the output table for the 95% bootstrap confidence
intervals by the use of the bootstrap residuals method. This table
includes the 95% bootstrap confidence intervals for each of the
regression coefficients in our final model. Once again we can see that
all of the confidence intervals for the regression coefficients contain
zero except for that of the intercept. This matches up with our previous
analysis of the model that although the individual variables do not show
statistical significant, their combination in the overall logarithmic
model is statistically significant, which can be seen by the p-value of
p = 0.0014.
Combining the Results
of the Regular Model and the Bootstrap Results
Now that we have created both bootstrap confidence intervals using
bootstrap cases and using bootstrap residuals, let’s combine these
results into one table to show the combined inferential statistics.
Combined Inferential Statistics- Bootstrap Confidence Intervals
(Bootstrap Cases and Residuals) and p-values
(Intercept) |
2.4835 |
0.7666 |
0.0014 |
[ 0.8029 , 4.0016 ] |
[ 1.0459 , 4.0219 ] |
X |
0.0212 |
0.0462 |
0.6472 |
[ -0.0619 , 0.1082 ] |
[ -0.0702 , 0.1077 ] |
Y |
-0.0368 |
0.0929 |
0.6927 |
[ -0.2263 , 0.1693 ] |
[ -0.2172 , 0.1382 ] |
DC |
0.0001 |
0.0005 |
0.8557 |
[ -7e-04 , 9e-04 ] |
[ -8e-04 , 0.001 ] |
temp |
-0.0182 |
0.0213 |
0.3950 |
[ -0.0577 , 0.0195 ] |
[ -0.0628 , 0.0224 ] |
RH |
-0.0098 |
0.0075 |
0.1905 |
[ -0.0219 , 0.003 ] |
[ -0.0246 , 0.004 ] |
wind |
0.0357 |
0.0530 |
0.5016 |
[ -0.0672 , 0.1367 ] |
[ -0.0687 , 0.1355 ] |
rain |
0.0911 |
0.2408 |
0.7055 |
[ -0.9978 , 0.2001 ] |
[ -0.339 , 0.5911 ] |
The table above combines the results for the inferential statistics
of the bootstrap method. The table includes the p-values of the
regression coefficients and their bootstrap confidence intervals. This
includes both the bootstrap confidence intervals using bootstrap cases
(bootc.ci.95) and the bootstrap confidence intervals using bootstrap
residuals (bootr.ci.95).
We can see in this output table that both methods of bootstrap
confidence intervals yield the same results in regards to the
statistical significance of the overall model. As was stated previously
in the analysis of the log(area) model, although it seems that the
individual variables do not show notable statistical significance, as
all of their p-values are greater than our alpha of 0.05, their combined
effect in the overall model does show statistical significance with a
p-value of p = 0.0014. The bootstrap confidence intervals further
strengthen this point as all of the regression coefficients for the
variables include zero in their confidence intervals indicating that
they are not statistically significant on their own. However, the
confidence interval for the intercept does not include zero indicating
that it is statistically significant which can be seen by its p-value of
p = 0.0014. This validates our analysis of the final model and its
statistical significance.
We can create a table to show the widths of the 95% bootstrap
confidence intervals for both the bootstrap cases method and the
bootstrap residuals method.
95% Bootstrap Confidence Intervals Width- Bootstrap Cases and
Bootstrap Residuals
3.1987 |
2.9760 |
0.1701 |
0.1779 |
0.3955 |
0.3555 |
0.0016 |
0.0019 |
0.0772 |
0.0852 |
0.0249 |
0.0286 |
0.2039 |
0.2043 |
1.1979 |
0.9301 |
The table above shows the width for both of the bootstrap confidence
interval methods for the regression coefficients of the final model. For
both of these two methods for bootstrap confidence intervals, we can see
that the widths are similar for the two methods showing that they are
consistent with one another.
Final Model
Report
Now that we have looked at various methods of analyzing our final
regression model, let’s create a final table of the inferential
statistics.
Inferential Statistics of the Final Regression Model
(Intercept) |
2.4834516 |
0.7666130 |
3.2395115 |
0.0013520 |
X |
0.0211869 |
0.0462344 |
0.4582490 |
0.6471534 |
Y |
-0.0367580 |
0.0928944 |
-0.3956964 |
0.6926510 |
DC |
0.0000890 |
0.0004891 |
0.1820437 |
0.8556892 |
temp |
-0.0181803 |
0.0213391 |
-0.8519727 |
0.3950073 |
RH |
-0.0098113 |
0.0074753 |
-1.3125061 |
0.1904980 |
wind |
0.0356783 |
0.0530221 |
0.6728946 |
0.5016074 |
rain |
0.0910809 |
0.2407878 |
0.3782623 |
0.7055421 |
The table above shows the inferential statistics of our final model
which allows us to verify the statistical significance of it one more
time. Our model for the logarithmic transformation of area is
statistically significant.
The equation of our final model is: log(area) = 2.4835 + 0.0212 * X -
0.0368 * Y + 0.0001 * DC - 0.0182 * temp - 0.0098 * RH + 0.0357 * wind +
0.0911 * rain.
The combination of X, Y, DC, temp, temp, RH, wind, and rain
statistically significantly predicted the logarithmic transformation of
area, p = 0.0014. This model has good utility for predicition and
estimation.
Interpretations of
the Regression Coefficients
Using the final inferential statistics, we can analyze the
relationship of the independent variables in the final model with their
affect on area. As was stated previously in the variable description
section of this project, the measurements for area are given in
hectares. Additionally, since our final model selected is a logarithmic
transformation, these interpretations will be looking at the effects of
these independent variables on the log of area.
X: For every additional 1 coordinate movement to the right, the
logarithmic transformation of area burned by a forest fire increases by
0.0212 hectares.
Y: For every additional 1 coordinate movement upwards,
logarithmic transformation of area burned by a forest fire decreases by
0.0368 hectare.
DC: For every additional 1 unit increase of DC, the measure of
the moisture content of compact organic layers in the area affected by
the fire, the logarithmic transformation of area burned by a forest fire
increases by 0.0001 hectare.
temp: For every 1 degree Celsius increase in temperature, the
logarithmic transformation of area burned by a forest fire decreases by
0.0182 hectare.
RH: For every 1 percentage increase in the relative humidity, the
logarithmic transformation of area burned by a forest fire decreases by
0.0098 hectare.
wind: For every 1 kilometer per hour increase in the speed of the
wind, the logarithmic transformation of area burned by a forest fire
increases by 0.0357.
rain: For every 1 mm/m^2 increase in the rain occurring, the
logarithmic transformation of area burned by a forest fire increases by
0.0911.
We can see that the variables that are positively associated with the
logarithmic transformation of area burned by a forest fire are X, DC,
wind, and rain. This indicates that as these variables increase, so does
the area burned by a forest fire. On the other hand, the variables that
are negatively associated with the logarithmic transformation of area
burned by a forest fire are Y, temp, and RH. This indicates that as
these variables increase, the area burned by a forest fire
decreases.
Summary and
Discussion
Overall, through the creation of our final model, and through the use
of bootstrap confidence intervals, we were able to conclude the
statistical significance of our overall final model. The log(area) model
that was chosen showed itself to be statistically significant with a
p-value of p = 0.0014. This was verified through the creation of
bootstrap confidence intervals using both the methods of bootstrapping
cases and bootstrap residuals.
The equation of our final model is given by: log(area) = 2.4835 +
0.0212 * X - 0.0368 * Y + 0.0001 * DC - 0.0182 * temp - 0.0098 * RH +
0.0357 * wind + 0.0911 * rain.
This model showed itself to be statistically significant for the
prediction and estimation of the logarithmic transformation of the area
affected by forest fires with a statistically significant p-valye of p =
0.0014.
Answering the
Research Questions
Earlier in this report, some research questions were discussed and
these were considered while analyzing the data and its results. Now that
our model has been thoroughly analyzed, let’s go back and see if we can
now answer these research questions for this project.
- Which factors have the greatest significance in predicting the area
burned by a forest fire?
As was found through the analysis of our final model, the regression
coefficients themselves did not show statistical significance, but their
combined effect did. Out of the independent variables, RH was the most
significant with a p-value of 0.1905. However, this value is still above
our alpha value of 0.05. So, although the individual variables did not
show statistical significance in our final model, their combined effect
did show statistical significance with a p-value of p = 0.0014.
- Which factors have the highest correlation with each other? And,
what are some possible explanations for these factors have the greatest
correlation?
We did have some factors with notably high correlation with one
another. This led to us having to address and fix multicollinearity
issues within the original, full model. The variables FFMC and ISI were
highly correlated with each other and so were the variables DMC and DC.
These multicollinearity issues were addressed when creating our final
model.
- Are there any major outliers in the data set which would prompt
further examination to see what is going on in that occurrence?
Yes, this data does have some outliers within it. Additionally,
looking at the residual plots for our final model showed the presence of
some high leverage points as well. This is something which would be
worth looking into in further experimentation to see why there are these
extreme observations within the data set.
- Is this data set from Montesinho National Park applicable to the
overall scope of forest fires around the world? Is our data set
representative of forest fires of all locations?
This is a question which we do not have enough information to answer
with perfect accuracy because this project only looked at the data for
Montesinho National Park, not any other places affected by forest fires.
However, the data set was sufficiently large suggesting that it serves
significance in representing its population. We can not say with perfect
accuracy whether this data set does or does not represent every single
location affected by forest fires, but this data set provided great use
in creating a model which considers various factors which can affect the
area burned by a forest fire.
- How useful is the model we will create in predicting the area
affected by a forest fire? And, how can this data help with predicting
patterns of forest fires in order to minimize the damage they
cause?
Through the analysis and creation of the final model, we did find
that our model showed statistical significance in the prediction and
estimation of the area affected by forest fires with a p-value of p =
0.0014 in our final model, the logarithmic transformation of area.
Further
Discussion
Some of the major findings of this project was that the final model
that was created was in fact statistically significant. This indicates
that this final model can be useful in predicting the area that will be
affected by forest fires based upon the combined effect of the various
variables in this model. This could be helpful for calculating in
advance how much damage a forest fire could potentially cause based upon
the conditions of the environment in which it will occur. This could be
used to help minimize the damage by having knowledge in advance about
the damages which could occur based upon the known conditions.
Conclusions and
Recommendations
Overall, the final model of this project showed itself to be
statistically significant in its prediction and estimation of the area
of land affected by forest fires based upon a combination of factors.
This could provide use in the prevention of the damages caused by forest
fires if the conditions were known in advance. By having the knowledge
of the area of land which could be impacted by a forest fire based upon
the conditions at hand, this could provide rescuers with some knowledge
in advance to help fight the forest fires and hopefully minimize the
damage caused by having some knowledge in advance regarding the damage
potential of the forest fire.
Some recommendations I would suggest for further experimentation
are:
Since the data in this experiment was all collected within
Montesinho Natural Park, consider expanding the data collection to
include other places and others natural parks to determine whether the
conclusions drawn from this data truly are applicable to all forest
fires regardless of location.
Consider other factors which may have an impact on the area
affected by forest fires. Some ideas which come to mind include time it
takes to reach the nearest fire station, other weather conditions like
snow or fog, or volume, density, and size of the trees or forest in the
given area that is affected.
Due to the unpredictable nature of forest fires and other natural
disasters, it can be hard to have perfect accuracy in the data
collected, specifically the precise and exact area of forest that was
affected, so further experiments could consider expanding the sample
size to ensure the accuracy of the results and recordings in this
experiment.
Altogether, the final model for the logarithmic transformation of
area provides statistical significance in the prediction of the area
affected by forest fires which could provide use by having knowledge in
advance of which factors at hand could lead to more damage from the
forest fires.
LS0tDQp0aXRsZTogIkZhY3RvcnMgQWZmZWN0aW5nIEZvcmVzdCBGaXJlcyBNTFIgUHJvamVjdCBSZXBvcnQiDQphdXRob3I6ICJKb3NpZSBHYWxsb3AiDQpkYXRlOiAiMjAyNC0wOS0yMyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNg0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovDQoNCmgxLnRpdGxlIHsgIC8qIFRpdGxlIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiB0aGUgcmVwb3J0IHRpdGxlICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBhdXRob3JzICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGF0ZSAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAxIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCA0IHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCjwvc3R5bGU+DQpgYGANCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBEZXRlY3QsIGluc3RhbGwsIGFuZCBsb2FkIHBhY2thZ2VzIGlmIG5lZWRlZC4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJsZWFmbGV0IikNCiAgIGxpYnJhcnkobGVhZmxldCkNCn0NCmlmICghcmVxdWlyZSgiRW52U3RhdHMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiRW52U3RhdHMiKQ0KICAgbGlicmFyeShFbnZTdGF0cykNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikNCiAgIGxpYnJhcnkoTUFTUykNCn0NCmlmICghcmVxdWlyZSgicGh5dG9vbHMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGh5dG9vbHMiKQ0KICAgbGlicmFyeShwaHl0b29scykNCn0NCmlmKCFyZXF1aXJlKCJkcGx5ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQogICBsaWJyYXJ5KGRwbHlyKQ0KfQ0KaWYoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQppZighcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmKCFyZXF1aXJlKCJ1c2RtIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInVzZG0iKQ0KICAgbGlicmFyeSh1c2RtKQ0KfQ0KaWYoIXJlcXVpcmUoImNhciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjYXIiKQ0KICAgbGlicmFyeShjYXIpDQp9DQppZiAoIXJlcXVpcmUoImJvb3QiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiYm9vdCIpDQogICBsaWJyYXJ5KGJvb3QpDQp9DQppZighcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCiMgU3BlY2lmaWNhdGlvbnMgb2Ygb3V0cHV0cyBvZiBjb2RlIGluIGNvZGUgY2h1bmtzDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlDQogICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIyBTb21ldGltZXMsIHlvdXIgY29kZSBtYXkgcHJvZHVjZSBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlcywgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdhcm5pbmcgbWVzc2FnZXMgaW4gdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICANCiAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAjIFN1cHByZXNzIGhhc2gtdGFncyBpbiB0aGUgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuDQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KRGF0YSB3YXMgY29sbGVjdGVkIHRvIG9ic2VydmUgd2hpY2ggZmFjdG9ycyBoYXZlIHRoZSBncmVhdGVzdCBpbXBhY3Qgb24gdGhlIGFyZWEgb2YgbGFuZCBidXJuZWQgaW4gYSBmb3Jlc3QgZmlyZS4gDQoNCkluIHRoZSBwcmV2aW91cyBhc3NpZ25tZW50LCBzZXZlcmFsIHJlZ3Jlc3Npb24gbW9kZWxzIHdlcmUgY3JlYXRlZCBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hpY2ggb25lIHByb3ZpZGVzIHRoZSBiZXN0IHF1YWxpdHkgb2YgcHJlZGljdGlvbiBhbmQgZXN0aW1hdGlvbiBmb3IgdGhlIGFyZWEgYWZmZWN0ZWQgYnkgYSBmb3Jlc3QgZmlyZS4gRm9yIHRoaXMgcHJvamVjdCwgd2Ugd2lsbCBsb29rIGF0IHRoZSBtZXRob2Qgb2YgYm9vdHN0cmFwcGluZyB0aGUgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbC4gV2Ugd2lsbCB1c2UgdGhlIGJvb3RzdHJhcCBtZXRob2QgdG8gZmluZCBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgcmVncmVzc2lvbiBtb2RlbC4gIA0KDQoNCiMjIERhdGEgRGVzY3JpcHRpb24NCg0KSSBmb3VuZCB0aGlzIGRhdGEgc2V0IG9uIGthZ2dsZS5jb20gb24gdGhlIGZvbGxvd2luZyB3ZWJwYWdlOiBodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL2VsaWtwbGltL2ZvcmVzdC1maXJlcy1kYXRhLXNldC4gVGhlIGRhdGEgc2V0IGlzIG5hbWVkIGFzICJmb3Jlc3RmaXJlcy5jc3YiLg0KDQpUaGlzIGRhdGEgc2V0IHVzZXMgbWV0ZW9yb2xvZ2ljYWwgZGF0YSB0byBwcmVkaWN0IHRoZSBhcHByb3hpbWF0ZWQgYXJlYSB3aGljaCB3aWxsIGJlIGJ1cm5lZCBpbiBmb3Jlc3QgZmlyZXMgYmFzZWQgdXBvbiB0aGVzZSB2YXJpb3VzIGZhY3RvcnMuIFRoaXMgYWxsb3dzIHVzIHRvIGludmVzdGlnYXRlIHRoZSBmYWN0b3JzIHdoaWNoIGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBhcmVhIG9mIGxhbmQgd2hpY2ggaXMgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUuIFN1Y2ggZGF0YSBpcyBpbmNyZWRpYmx5IHVzZWZ1bCBpbiBvcmRlciB0byBoZWxwIGtub3cgd2hpY2ggZmFjdG9ycyBoYXZlIHRoZSBncmVhdGVzdCBzaWduaWZpY2FuY2Ugb24gdGhlIGFyZWEgYWZmZWN0ZWQgYnkgYSBmb3Jlc3QgZmlyZSwgYmVjYXVzZSB0aGlzIGNvdWxkIGhlbHAgcHJvdmlkZSBuZWNjZXNzYXJ5IGRhdGEgdG8gaGVscCBtaW5pbWl6ZSB0aGUgYXJlYSBkYW1hZ2VkIGJ5IGZvcmVzdCBmaXJlcy4gDQoNClRoZSBkYXRhIGluIHRoaXMgZGF0YSBzZXQgd2FzIGNvbGxlY3RlZCBhcm91bmQgdGhlIE1vbnRlc2luaG8gTmF0dXJhbCBQYXJrIHdoaWNoIGlzIGxvY2F0ZWQgaW4gUG9ydHVnYWwuIFRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgZnJvbSA1MTcgb2JzZXJ2YXRpb25zIG9mIGZvcmVzdCBmaXJlcyB3aGljaCBvY2N1cnJlZCB3aXRoaW4gdGhpcyBuYXRpb25hbCBwYXJrLiBUbyBmdXJ0aGVyIGVuaGFuY2UgdGhlIGRhdGEgY29sbGVjdGlvbiwgcmVzZWFyY2hlcnMgZGl2aWRlZCB1cCB0aGUgbmF0aW9uYWwgcGFyayBpbnRvIGEgc2V0IG9mIHNwYXRpYWwgY29vcmRpbmF0ZXMgdG8gcGlucG9pbnQgdGhlIHByZWNpc2UgbG9jYXRpb24gb2YgdGhlIGZvcmVzdCBmaXJlcyB3aXRoaW4gTW9udGVzaW5obyBOYXR1cmFsIFBhcmsuIFRoZSBuYXRpb25hbCBwYXJrIHdhcyBkaXZpZGVkIGludG8geC1heGlzIGFuZCB5LWF4aXMgc3BhdGlhbCBjb29yZGluYXRlcywgd2l0aCB0aGUgeC1heGlzIGNvb3JkaW5hdGVzIHJhbmdpbmcgZnJvbSAxIHRvIDksIGFuZCB0aGUgeS1heGlzIGNvb3JkaW5hdGVzIHJhbmdpbmcgZnJvbSAyIHRvIDkuIEVhY2ggb2JzZXJ2YXRpb24gd2FzIHBpbnBvaW50ZWQgdG8gdGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2Ygd2hlcmUgdGhlIGZvcmVzdCBmaXJlIGJlZ2FuLiANCg0KDQojIyBWYXJpYWJsZXMgDQoNClRoZXJlIGFyZSAxMyB2YXJpYWJsZXMgaW4gdGhlIGZvcmVzdGZpcmVzIGRhdGEgc2V0Lg0KDQoqIFg6IFRoZSB4LWF4aXMgc3BhdGlhbCBjb29yZGluYXRlIG9mIHRoZSBmb3Jlc3QgZmlyZSdzIGxvY2F0aW9uIHdpdGhpbiAgICAgIE1vbnRlc2luaG8gTmF0dXJhbCBQYXJrLiBBIG51bWVyaWMgdmFsdWUgcmFuZ2luZyBmcm9tIDEgdG8gOS4NCg0KKiBZOiBUaGUgeS1heGlzIHNwYXRpYWwgY29vcmRpbmF0ZSBvZiB0aGUgZm9yZXN0IGZpcmUncyBsb2NhdGlvbiB3aXRoaW4gICAgICBNb250ZXNpbmhvIE5hdHVyYWwgUGFyay4gQSBudW1lcmljIHZhbHVlIHJhbmdpbmcgZnJvbSAyIHRvIDkuDQoNCiogbW9udGg6IFRoZSBtb250aCBvZiB0aGUgeWVhciBpbiB3aGljaCB0aGUgZm9yZXN0IGZpcmUgb2NjdXJyZWQuIEEgICAgICAgICAgY2F0ZWdvcmljYWwsIGNoYXJhY3RlciB2YXJpYWJsZSB3aXRoIHRoZSBsb3dlcmNhc2UgYWJicmV2aWF0aW9uIG9mIHRoZSAgICAgZmlyc3QgdGhyZWUgbGV0dGVycyBvZiB0aGUgbW9udGguIChGb3IgZXhhbXBsZTogZmViLCBvY3QsIGRlYykNCg0KKiBkYXk6IFRoZSBkYXkgb2YgdGhlIHdlZWsgb24gd2hpY2ggdGhlIGZvcmVzdCBmaXJlIG9jY3VycmVkLiBBICAgICAgICAgICAgICBjYXRlZ29yaWNhbCwgY2hhcmFjdGVyIHZhcmlhYmxlIHdpdGggdGhlIGxvd2VyY2FzZSBhYmJyZXZpYXRpb24gb2YgdGhlICAgICBmaXJzdCB0aHJlZSBsZXR0ZXJzIG9mIHRoZSBtb250aC4gKEZvciBleGFtcGxlOiBtb24sIHR1ZSwgc2F0KQ0KDQoqIEZGTUM6IEZGTUMgaW5kZXggZnJvbSB0aGUgRldJIFN5c3RlbS4gQSBudW1lcmljLCBxdWFudGl0YXRpdmUgdmFyaWFibGUuICAgIFRoZSBGV0kgU3lzdGVtIHN0YW5kcyBmb3IgdGhlIEZpcmUgV2VhdGhlciBJbmRleCBTeXN0ZW0gYW5kIGl0IGlzIGEgICAgICAgIHN5c3RlbSB0aGF0IHByb3ZpZGVzIGEgbnVtZXJpYyByYXRpbmcgb24gYSBzY2FsZSBmb3IgdGhlIGludGVuc2l0eSBvZiBhICAgIGZpcmUuIEZGTUMgc3RhbmRzIGZvciBGaW5lIEZ1ZWwgTW9pc3R1cmUgQ29kZSBhbmQgaXQgaXMgYSBtZWFzdXJlIG9mICAgICAgIHRoZSBtb2lzdHVyZSBjb250ZW50IG9mIGxpdHRlciBhbmQgb3RoZXIgZnVlbHMgZm9yIGEgZmlyZSB0aGF0IGFyZSAgICAgICAgIHByZXNlbnQuDQoNCiogRE1DOiBETUMgaW5kZXggZnJvbSB0aGUgRldJIFN5c3RlbS4gQSBudW1lcmljLCBxdWFudGl0YXRpdmUgdmFyaWFibGUuIERNQyAgIHN0YW5kcyBmb3IgRGVlcCBNb2lzdCBDb252ZWN0aW9uIGFuZCBpdCBpcyBhIG1lYXN1cmUgb2YgZGVjb21wb3NlZCAgICAgICAgIG9yZ2FuaWMgbWF0ZXJpYWwgdW5kZXJuZWF0aCB0aGUgbGl0dGVyIHdoaWNoIGZ1ZWxzIHRoZSBmaXJlLiANCg0KKiBEQzogREMgaW5kZXggZnJvbSB0aGUgRldJIFN5c3RlbS4gQSBudW1lcmljLCBxdWFudGl0YXRpdmUgdmFyaWFibGUuIERDICAgICBzdGFuZHMgZm9yIERyb3VnaHQgQ29kZSBhbmQgaXMgYSBtZWFzdXJlIG9mIHRoZSBtb2lzdHVyZSBjb250ZW50IG9mICAgICAgICBjb21wYWN0IG9yZ2FuaWMgbGF5ZXJzIGluIHRoZSBhcmVhIGFmZmVjdGVkIGJ5IHRoZSBmaXJlLiANCg0KKiBJU0k6IElTSSBpbmRleCBmcm9tIHRoZSBGV0kgU3lzdGVtLiBBIG51bWVyaWMsIHF1YW50aXRhdGl2ZSB2YXJpYWJsZS4gSVNJICAgc3RhbmRzIGZvciBJbml0aWFsIFNwcmVhZCBJbmRleCBhbmQgaXMgYSBtZWFzdXJlIG9mIHRoZSBleHBlY3RlZCByYXRlIG9mICAgZmlyZSBzcHJlYWQuIA0KDQoqIHRlbXA6IFRoZSB0ZW1wZXJhdHVyZSBnaXZlbiBpbiBkZWdyZWVzIENlbHNpdXMuIEEgbnVtZXJpYywgcXVhbnRpdGF0aXZlICAgIHZhcmlhYmxlLg0KDQoqIFJIOiBUaGUgcmVsYXRpdmUgaHVtaWRpdHkgZ2l2ZW4gYXMgYSBwZXJjZW50YWdlLiBBIG51bWVyaWMsIHF1YW50aXRhdGl2ZSAgICB2YXJpYWJsZS4NCg0KKiB3aW5kOiBUaGUgc3BlZWQgb2YgdGhlIHdpbmQgZ2l2ZW4gaW4ga2lsb21ldGVycyBwZXIgaG91ciAoa20vaCkuIEEgICAgICAgICBudW1lcmljLCBxdWFudGl0YXRpdmUgdmFyaWFibGUuDQoNCiogcmFpbjogVGhlIHJhaW4gb2NjdXJyaW5nIG91dHNpZGUgZ2l2ZW4gaW4gYSBtZWFzdXJlbWVudCBvZiBtbS9tXjIuIEEgICAgICAgbnVtZXJpYywgcXVhbnRpdGF0aXZlIHZhcmlhYmxlLiANCg0KKiBhcmVhOiBUaGUgYXJlYSBvZiB0aGUgZm9yZXN0IHdoaWNoIHdhcyBidXJuZWQgYnkgdGhlIGZpcmUuIE1lYXN1cmVkIGluICAgICB1bml0cyBvZiBoZWN0YXJlcyAoaGEpLiBBIG51bWVyaWMsIHF1YW50aXRhdGl2ZSB2YXJpYWJsZS4gVGhlIHJlc3BvbnNlICAgICB2YXJpYWJsZSBvZiB0aGlzIGV4cGVyaW1lbnRhbCBzdHVkeS4gDQoNCg0KIyMgUmVzZWFyY2ggUXVlc3Rpb25zIA0KDQpGb3IgdGhpcyBwcm9qZWN0LCBvdXIgbWFpbiBnb2FsIGlzIHRvIGNyZWF0ZSBhIG1vZGVsIHdoaWNoIHVzZXMgdGhlIHZhcmlvdXMgZmFjdG9ycyBpbnZvbHZlZCB0byBwcm92aWRlIHNpZ25pZmljYW5jZSBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgdGhlIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUuIA0KDQpTb21lIGZ1cnRoZXIgcmVzZWFyY2ggcXVlc3Rpb25zIHdoaWNoIEkgY2FtZSB1cCB3aXRoIG92ZXIgdGhlIHBhc3QgZmV3IHdlZWtzIG9mIGFuYWx5emluZyB0aGlzIGRhdGEgaW5jbHVkZToNCg0KKiBXaGljaCBmYWN0b3JzIGhhdmUgdGhlIGdyZWF0ZXN0IHNpZ25pZmljYW5jZSBpbiBwcmVkaWN0aW5nIHRoZSBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlPw0KDQoqIFdoaWNoIGZhY3RvcnMgaGF2ZSB0aGUgaGlnaGVzdCBjb3JyZWxhdGlvbiB3aXRoIGVhY2ggb3RoZXI/IEFuZCwgd2hhdCBhcmUgc29tZSBwb3NzaWJsZSBleHBsYW5hdGlvbnMgZm9yIHRoZXNlIGZhY3RvcnMgaGF2ZSB0aGUgZ3JlYXRlc3QgY29ycmVsYXRpb24/IA0KDQoqIEFyZSB0aGVyZSBhbnkgbWFqb3Igb3V0bGllcnMgaW4gdGhlIGRhdGEgc2V0IHdoaWNoIHdvdWxkIHByb21wdCBmdXJ0aGVyIGV4YW1pbmF0aW9uIHRvIHNlZSB3aGF0IGlzIGdvaW5nIG9uIGluIHRoYXQgb2NjdXJyZW5jZT8gDQoNCiogSXMgdGhpcyBkYXRhIHNldCBmcm9tIE1vbnRlc2luaG8gTmF0aW9uYWwgUGFyayBhcHBsaWNhYmxlIHRvIHRoZSBvdmVyYWxsIHNjb3BlIG9mIGZvcmVzdCBmaXJlcyBhcm91bmQgdGhlIHdvcmxkPyBJcyBvdXIgZGF0YSBzZXQgcmVwcmVzZW50YXRpdmUgb2YgZm9yZXN0IGZpcmVzIG9mIGFsbCBsb2NhdGlvbnM/IA0KDQoqIEhvdyB1c2VmdWwgaXMgdGhlIG1vZGVsIHdlIHdpbGwgY3JlYXRlIGluIHByZWRpY3RpbmcgdGhlIGFyZWEgYWZmZWN0ZWQgYnkgYSBmb3Jlc3QgZmlyZT8gQW5kLCBob3cgY2FuIHRoaXMgZGF0YSBoZWxwIHdpdGggcHJlZGljdGluZyBwYXR0ZXJucyBvZiBmb3Jlc3QgZmlyZXMgaW4gb3JkZXIgdG8gbWluaW1pemUgdGhlIGRhbWFnZSB0aGV5IGNhdXNlPw0KDQpXZSB3aWxsIHVzZSB0aGVzZSByZXNlYXJjaCBxdWVzdGlvbnMgYXMgYSBzdGFydGluZyBwb2ludCBmb3Igb3VyIGFuYWx5c2lzIG9mIHRoaXMgZXhwZXJpbWVudC4gV2Ugd2lsbCBjb21lIGJhY2sgdG8gdGhlc2UgcXVlc3Rpb25zIGluIHRoZSBjb25jbHVzaW9uIHRvIHNlZSB3aGljaCByZXNlYXJjaCBxdWVzdGlvbnMgd2UgaGF2ZSBjb25jbHVkZWQgYW4gYW5zd2VyIHRvLiANCg0KDQoNCg0KIyBEYXRhIFByZXBhcmF0aW9uIGFuZCBFeHBsb3JhdG9yeSBBbmFseXNpcw0KDQpUbyBiZWdpbiwgbGV0J3MgcmVhZCBpbiB0aGUgZGF0YSBzZXQgZnJvbSBHaXRodWIuDQoNCmBgYHtyfQ0KZm9yZXN0ZmlyZXMgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Kb3NpZUdhbGxvcC9TVEEzMjEvbWFpbi9kYXRhc2V0L2ZvcmVzdGZpcmVzLmNzdiIsIGhlYWRlcj1UUlVFKQ0KDQpzdHIoZm9yZXN0ZmlyZXMpDQpgYGANCg0KVGhlIGRhdGEgd2FzIGNvbGxlY3RlZCBieSBwaW5wb2ludGluZyB0aGUgZm9yZXN0IGZpcmUncyBsb2NhdGlvbiBvZiBvcmlnaW4gZnJvbSBhIHN5c3RlbSBvZiBzcGF0aWFsIGNvb3JkaW5hdGVzIGFyb3VuZCBNb250ZXNpbmhvIE5hdHVyYWwgUGFyay4gU28sIHdlIHdpbGwgY3JlYXRlIGEgZ3JhcGggdG8gaGVscCB2aXN1YWxpemUgdGhlIGxvY2F0aW9ucyBvZiB0aGUgb2NjdXJyZW5jZXMuIA0KDQpgYGB7cn0NClggPC0gZm9yZXN0ZmlyZXMkWA0KWSA8LSBmb3Jlc3RmaXJlcyRZDQpwbG90KFgsIFksIG1haW4gPSAiRm9yZXN0IEZpcmUgT2NjdXJlbmNlcyBieSBTcGF0aWFsIENvb3JkaW5hdGVzIikNCmFibGluZSh2PTUsIGg9NSwgY29sPSJyZWQiLCBsdHk9MikNCmBgYA0KDQpBcyB3ZSBjYW4gc2VlLCB0aGUgZm9yZXN0IGZpcmUgb2NjdXJyZW5jZXMgYXJlIHNwcmVhZCBvdXQgdGhyb3VnaG91dCB0aGUgcGFyay4gSXQgYXBwZWFycyB0aGF0IG1vcmUgZm9yZXN0IGZpcmVzIHdlcmUgb2JzZXJ2ZWQgaW4gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIFktY29vcmRpbmF0ZXMsIGFyb3VuZCAyLTUsIGhvd2V2ZXIgdGhlIGRhdGEgc3RpbGwgYXBwZWFycyB0byBiZSBzcHJlYWQgb3V0IGVub3VnaCB0byBjb250aW51ZSB3aXRoIG91ciBpbnZlc3RpZ2F0aW9uIG9mIHRoZSBtb2RlbC4gDQoNCg0KIyMgUmVmaW5pbmcgdGhlIERhdGEgc2V0DQoNCldoaWxlIGxvb2tpbmcgYXQgdGhlIGRhdGEgc2V0LCBzb21ldGhpbmcgSSBub3RpY2VkIGlzIHRoYXQgbWFueSBvYnNlcnZhdGlvbnMgaGF2ZSBhbiBhcmVhIG9mIDAsIG1lYW5pbmcgdGhhdCBub25lIG9mIHRoZSBmb3Jlc3Qgd2FzIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGZvciB0aG9zZSBvYnNlcnZhdGlvbnMuIFRoaXMgY291bGQgcHJvdmlkZSBmb3Igc29tZSBjb21wYXJpc29ucyBiZXR3ZWVuIHdoYXQgY29uZGl0aW9ucyBjYXVzZWQgYSBmaXJlIGFuZCB3aGF0IGRpZCBub3QsIG9yIGxlYWQgdG8gcXVlc3Rpb25zIG9mIHdoeSBhIGZpcmUgb2NjdXJyZWQgb24gYSBjZXJ0YWluIGRheSBidXQgbm90IGFub3RoZXIuIEhvd2V2ZXIsIHRoZSBwdXJwb3NlIG9mIHRoaXMgZXhwZXJpbWVudCBpcyB0byBzZWUgd2hhdCBmYWN0b3JzIGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIGFyZWEgYnVybmVkIGluIGEgZm9yZXN0IGZpcmUuIElmIHdlIHdlcmUgdG8gaW5jbHVkZSB0aGVzZSBvYnNlcnZhdGlvbnMgd2l0aCBhbiBhcmVhIG9mIDAgYWZmZWN0ZWQgYnkgdGhlIGZpcmVzLCB0aGVuIHRoaXMgbWF5IGxlYWQgdG8gb3VyIG9ic2VydmF0aW9ucyBiZWluZyBza2V3ZWQgb3Igc2VwYXJhdGVkIGludG8gdHdvIGdyb3VwczogYXJlYSBvZiB6ZXJvIGFuZCBhcmVhIG9mIG5vbnplcm8sIGFrYSBubyBmaXJlIGRhbWFnZSBhbmQgZmlyZSBkYW1hZ2UuIFRoaXMgY291bGQgaGF2ZSBhIG5lZ2F0aXZlIGFmZmVjdCBvbiBvdXIgZmluYWwgcmVncmVzc2lvbiBtb2RlbCwgYnkgY2x1c3RlcmluZyBvdXIgZGF0YSBpbnRvIHR3byBncm91cHMsIHplcm8gYW5kIG5vbnplcm8gYXJlYSwgd2hpY2ggd291bGQgY2F1c2UgZm9yIG5vdGFibGUgaW5hY2N1cmFjeS4gQWZ0ZXIgc29tZSBjb25zaWRlcmF0aW9uLCBJIGJlbGlldmUgaXQgd291bGQgYmUgaW4gdGhlIGJlc3QgaW50ZXJlc3Qgb2YgdGhpcyBleHBlcmltZW50IHRvIGNyZWF0ZSBhIG5ldyBkYXRhIGZyYW1lLCBvbmUgd2hpY2ggb25seSBpbmNsdWRlcyB0aGUgb2JzZXJ2YXRpb25zIHdoZXJlIHRoZXJlIHdhcyBpbiBmYWN0IGEgZm9yZXN0IGZpcmUgd2hpY2ggY2F1c2VkIGRhbWFnZS4gDQoNCkxldCdzIGNyZWF0ZSBhIG5ldyBkYXRhIHNldCBjYWxsZWQgImZvcmVzdGZpcmVzMSIgdGhhdCBpbmNsdWRlcyBvbmx5IHRoZSBvYnNlcnZhdGlvbnMgd2hlcmUgdGhlIGFyZWEgYWZmZWN0ZWQgaXMgZ3JlYXRlciB0aGFuIDAuDQoNCmBgYHtyfQ0KIyBDcmVhdGUgYSBuZXcgZGF0YSBzZXQgY2FsbGVkICJmb3Jlc3RmaXJlczEiIHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhlIG9ic2VydmF0aW9ucyB3aGVyZSB0aGUgYXJlYSBhZmZlY3RlZCBpcyBncmVhdGVyIHRoYW4gMC4NCmhlYWQoZmlsdGVyKGZvcmVzdGZpcmVzLCBhcmVhID4gMCkpDQpmb3Jlc3RmaXJlczEgPC0gZmlsdGVyKGZvcmVzdGZpcmVzLCBhcmVhID4gMCkNCnN0cihmb3Jlc3RmaXJlczEpDQpgYGANCg0KTGV0J3MgY3JlYXRlIGFub3RoZXIgbWFwIGZvciBvdXIgcmVmaW5lZCBkYXRhIHNldCB0byBlbnN1cmUgZXZlcnl0aGluZyBzdGlsbCBsb29rcyBhbHJpZ2h0Lg0KDQpgYGB7cn0NClggPC0gZm9yZXN0ZmlyZXMxJFgNClkgPC0gZm9yZXN0ZmlyZXMxJFkNCnBsb3QoWCwgWSwgbWFpbiA9ICJGb3Jlc3QgRmlyZSBPY2N1cmVuY2VzIGJ5IFNwYXRpYWwgQ29vcmRpbmF0ZXMgXG4gb2YgTW9kaWZpZWQgRGF0YSIpDQphYmxpbmUodj01LCBoPTUsIGNvbD0icmVkIiwgbHR5PTIpDQpgYGANCg0KVGhlIG1hcCBhcHBlYXJzIHZlcnkgc2ltaWxhciB0byB0aGUgb25lIGNyZWF0ZWQgZm9yIHRoZSBmb3Jlc3RmaXJlcyBkYXRhIHNldCwgd2l0aCB0aGUgcG9pbnRzIHNwcmVhZCBvdXQgYWNyb3NzIHRoZSBjb29yZGluYXRlcywgc28gdGhpcyBpcyBnb29kLiBPbmNlIGFnYWluLCBpdCBhcHBlYXJzIHRoYXQgbW9yZSBmb3Jlc3QgZmlyZXMgd2VyZSBvYnNlcnZlZCBpbiB0aGUgbG93ZXIgaGFsZiBvZiB0aGUgWS1jb29yZGluYXRlcywgYXJvdW5kIGNvb3JkaW5hdGVzIDItNSwgYnV0IGFwYXJ0IGZyb20gdGhpcywgdGhlIHBvaW50cyBhcmUgc3ByZWFkIG91dCBhY3Jvc3MgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLg0KDQpIYXZpbmcgYSByZWZpbmVkIGRhdGEgc2V0IHdoaWNoIGZvY3VzZXMgb24gdGhlIG9ic2VydmF0aW9ucyBpbiB3aGljaCBmb3Jlc3QgZmlyZXMgZGlkIGFmZmVjdCBhbmQgY2F1c2UgZGFtYWdlIHRvIGFuIGFyZWEgb2YgdGhlIGZvcmVzdCB3aWxsIHByb3ZpZGUgYmV0dGVyIGluc2lnaHQgYW5kIHBvd2VyIGZvciBvdXIgcHVycG9zZSBvZiB0aGlzIGV4cGVyaW1lbnQsIHdoaWNoIGlzIHRvIHNlZSB3aGljaCBmYWN0b3JzIGhhdmUgc2lnbmlmaWNhbmNlIGluIHRoZSBhbW91bnQgb2YgYXJlYSBkYW1hZ2VkIGJ5IGZvcmVzdCBmaXJlcy4gQnkgZm9jdXNpbmcgb25seSBvbiB0aGUgb2JzZXJ2YXRpb25zIHdoaWNoIHdlcmUgYWZmZWN0ZWQgYnkgZm9yZXN0IGZpcmVzLCB0aGlzIHdpbGwgYmUgbW9yZSB1c2VmdWwgZm9yIG91ciBnb2FsIGFuZCBhbGxvd2luZyB1cyB0byBjcmVhdGUgYSBtb2RlbCBmb3IgcHJlZGljdGlvbiBhbmQgZXN0aW1hdGlvbiB3aXRob3V0IHRoZSBpbmNsdXNpb24gb2YgcmVkdW5kYW50IG9ic2VydmF0aW9ucyB3aGljaCBkbyBub3QgaGVscCBvdXIgbW9kZWwuDQoNCkxldCdzIGNoZWNrIGZvciBhbnkgaW1iYWxhbmNlcyBpbiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgb2YgIm1vbnRoIi4NCg0KYGBge3J9DQp0YWJsZShmb3Jlc3RmaXJlczEkbW9udGgpDQpgYGANCg0KSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgaXMgYSB2ZXJ5IHNpZ25pZmljYW50IGltYmFsYW5jZSBpbiB0aGUgdmFyaWFibGUgbW9udGguIFRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGluIEF1Z3VzdCBhbmQgU2VwdGVtYmVyLCA5OSBhbmQgOTcgcmVzcGVjdGl2ZWx5IGRyYXN0aWNhbGx5IG91dHdlaWdoIGFsbCBvZiB0aGUgb3RoZXIgbW9udGhzLCB3aXRoIG5vIG90aGVyIG1vbnRoIGhhdmluZyBncmVhdGVyIHRoYW4gMTkgb2JzZXJ2YXRpb25zLiBUaGlzIGlzIGEgbWFqb3IgY2F1c2UgZm9yIGNvbmNlcm4gYXMgdGhpcyBjYXRlZ29yaWNhbCB2YXJpYWJsZSBpcyB2ZXJ5IHNldmVyZWx5IGltYmFsYW5jZWQuDQoNCldlIHdpbGwga2VlcCB0aGUgbW9udGggdmFyaWFibGUgZm9yIG5vdywgYXMgaXQgc2VlbXMgbGlrZSB3aGF0IG1vbnRoIGl0IGlzIGRvZXMgaGF2ZSBzaWduaWZpY2FuY2UgaW4gcHJlZGljdGluZyBhcmVhIGFmZmVjdGVkIGJ5IGZvcmVzdCBmaXJlcywgYnV0IHdlIHdpbGwga2VlcCBhIGNsb3NlIGV5ZSBvbiBpdCBmb3IgdGhlIGZpbmFsIG1vZGVsIHRvIGRldGVybWluZSBpZiBpdCBzaG91bGQgYmUgcmVtb3ZlZCBkdWUgdG8gaXRzIGltYmFsYW5jZS4gV2Ugd2lsbCBhZGRyZXNzIHRoaXMgdmFyaWFibGUgbGF0ZXIgb24gdG8gc2VlIGlmIGl0cyByZW1vdmFsIHdpbGwgaGVscCBpbXByb3ZlIG91ciBtb2RlbC4gVGhpcyBtb250aCB2YXJpYWJsZSBpcyBvbmUgd2Ugd2lsbCBrZWVwIGEgY2xvc2Ugd2F0Y2ggb24gZHVlIHRvIHRoaXMgY29uY2VybiBvZiBpbWJhbGFuY2UuIA0KDQoNCkxldCdzIGNoZWNrIHRoZSBvdGhlciBjYXRlZ29yaWNhbCB2YXJpYWJsZSAiZGF5IiBmb3IgcG90ZW50aWFsIGltYmFsYW5jZXMuIA0KDQpgYGB7cn0NCnRhYmxlKGZvcmVzdGZpcmVzMSRkYXkpDQpgYGANCg0KVGhlICJkYXkiIHZhcmlhYmxlIGRvZXMgbm90IHNob3cgbWFqb3IgaW1iYWxhbmNlLCBhcyBhbGwgdGhlIGRheXMgaGF2ZSBhIHNpZ25pZmljYW50IG51bWJlciBvZiBvYnNlcnZhdGlvbnMgd2l0aCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgZGF5cyBiZWluZyBhIHRvdGFsIG9mIDE1IG9ic2VydmF0aW9ucywgU3VuZGF5IHdpdGggNDcgYW5kIFdlZG5lc2RheSB3aXRoIDMyLiBIb3dldmVyLCB0aGUgZGF5IG9mIHRoZSB3ZWVrIGRvZXMgbm90IHNlZW0gbGlrZSBpdCB3b3VsZCBoYXZlIGFzIG1ham9yIHNpZ25pZmljYW5jZSBpbiBwcmVkaWN0aW5nIGZvcmVzdCBmaXJlIGRhbWFnZSB0aGVuIHNvbWUgb2YgdGhlIG90aGVyIGZhY3RvcnMgaW4gcXVlc3Rpb24uIFRoaXMgY2FuIGJlIHNlZW4gYXMgYnkgaG93IHRoZSBkYXlzIG9mIHRoZSB3ZWVrIGFyZSBub3QgdmVyeSBpbWJhbGFuY2VkIGluIHJlZ2FyZHMgdG8gdGhlaXIgdG90YWwgb2JzZXJ2YXRpb25zLiBUaGlzIGlzIHVubGlrZSB0aGUgbW9udGggdmFyaWFibGUgd2hlcmUgaXQgd2FzIHNob3duIHRoYXQgdGhlIHZhc3QgbWFqb3JpdHkgb2YgdGhlIG9ic2VydmF0aW9ucyBmYWxsIGludG8gZWl0aGVyIEF1Z3VzdCBvciBTZXB0ZW1iZXIsIGV2aWRlbmNpbmcgdGhhdCB0aGUgbWFqb3JpdHkgb2YgZm9yZXN0IGZpcmVzIG9jY3VyIHdpdGhpbiB0aGVzZSB3YXJtZXIsIGVuZCBvZiBzdW1tZXIgbW9udGhzLiANCg0KVG8gYXZvaWQgaGF2aW5nIHRvbyBtYW55IG9yIHRvbyByZWR1bmRhbnQgdmFyaWFibGVzIHdpdGhpbiBvdXIgZnVsbCBtb2RlbCwgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlIGZvciAiZGF5IiB3aWxsIG5vdCBiZSBpbmNsdWRlZC4gDQoNCmBgYHtyfQ0KZmluYWwuZGF0YSA9IGZvcmVzdGZpcmVzMVssIC1jKDQpXSAgICAgICAgDQprYWJsZShoZWFkKGZpbmFsLmRhdGEpKQ0KYGBgDQoNCg0KDQoNCiMgTW9kZWwgQnVpbGRpbmcNCg0KRm9yIHRoaXMgcHJvamVjdCwgd2Ugd2FudCB0byBjcmVhdGUgYSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB0aGF0IGFsbG93cyB1cyB0byB1c2UgdGhlIHNldmVyYWwgZmFjdG9ycyBpbiBvcmRlciB0byBjcmVhdGUgYSBtb2RlbCBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgdGhlIGFyZWEgYWZmZWN0ZWQgYnkgZm9yZXN0IGZpcmVzLiANCg0KDQojIyBGdWxsIE1vZGVsIA0KDQpXZSB3aWxsIGJlZ2luIHdpdGggYSBmdWxsIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBXZSB3aWxsIG9ic2VydmUgaG93IHRoaXMgZnVsbCBtb2RlbCB0dXJucyBvdXQgdG8gaGVscCBkZWNpZGUgd2hldGhlciB3ZSBuZWVkIHRvIGFwcGx5IGFueSB0cmFuc2Zvcm1hdGlvbnMgdG8gYW55IG9mIHRoZSB2YXJpYWJsZXMuIA0KDQpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcid9DQpmdWxsLm1vZGVsID0gbG0oYXJlYSB+IC4sIGRhdGEgPSBmaW5hbC5kYXRhKQ0Ka2FibGUoc3VtbWFyeShmdWxsLm1vZGVsKSRjb2VmLCBjYXB0aW9uID0iU3RhdGlzdGljcyBvZiBSZWdyZXNzaW9uIENvZWZmaWNpZW50cyIpDQpgYGANCg0KDQojIyBDaGVjayBmb3IgVmlvbGF0aW9ucyANCg0KTm93LCB3ZSB3aWxsIGNoZWNrIHRoZSByZXNpZHVhbCBwbG90cyB0byBsb29rIGZvciBwb3RlbnRpYWwgdmlvbGF0aW9ucyBvZiBvdXIgZnVsbCBtb2RlbC4gDQoNCmBgYHtyfQ0KcGFyKG1mcm93PWMoMiwyKSkNCnBsb3QoZnVsbC5tb2RlbCkNCmBgYA0KDQpJdCBhcHBlYXJzIHRoYXQgd2UgZG8gaGF2ZSBzb21lIHZpb2xhdGlvbnMgd2l0aGluIG91ciBtb2RlbC4gRm9yIGluc3RhbmNlLCB2YXJpYW5jZSBpcyBub3QgY29uc3RhbnQgYXMgc2hvd24gYnkgaG93IHRoZXJlIGFyZSBhIGZldyB2ZXJ5IG5vdGFibGUgb3V0bGllcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSByZXNpZHVhbCBwbG90LiBBZGRpdGlvbmFsbHksIHRoZSBRLVEgUGxvdCBzaG93cyBzb21lIHZpb2xhdGlvbnMgYXMgd2VsbCBhcyB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZGF0YSBhcHBlYXJzIHRvIGhhdmUgc29tZSBzb3J0IG9mIGN1cnZhdHVyZSB3aXRoIHRoZXNlIHBvaW50cyBub3QgZm9sbG93aW5nIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gRnVydGhlcm1vcmUsIHRoZSBDb29rZSdzIERpc3RhbmNlIHBsb3Qgc2hvd3MgdGhhdCB3ZSBpbmRlZWQgZG8gaGF2ZSBzb21lIGhpZ2ggbGV2ZXJhZ2UgcG9pbnRzIGluIG91ciBtb2RlbC4gDQoNCkxldCdzIGNoZWNrIHRoZSBWSUYgZm9yIGFueSBwb3RlbnRpYWwgbXVsdGljb2xsaW5lYXJpdHkgaXNzdWVzIGluIG91ciBtb2RlbC4gDQpgYGB7cn0NCnZpZihmdWxsLm1vZGVsKQ0KYmFycGxvdCh2aWYoZnVsbC5tb2RlbCksIG1haW4gPSAiVklGIFZhbHVlcyIsIGhvcml6ID0gRkFMU0UsIGNvbCA9ICJzdGVlbGJsdWUiKQ0KYGBgDQoNCkl0IGFwcGVhcnMgdGhhdCB3ZSBkbyBoYXZlIGEgZmV3IGhpZ2ggVklGIHZhbHVlcyBwcmVzZW50IGluIG91ciBtb2RlbCB3aGljaCBsZWFkcyB0byB0aGUgbGlrZWxpaG9vZCBvZiBhIG11bHRpY29sbGluZWFyaXR5IGlzc3VlLg0KDQpMZXQncyB1c2UgYSBjb3JyZWxhdGlvbiBtYXRyaXggdG8gY2hlY2sgd2hpY2ggdmFyaWFibGVzIGFyZSBjYXVzaW5nIGlzc3Vlcy4gV2UgY2FuIG9ubHkgY2hlY2sgdGhlIGNvcnJlbGF0aW9uIG9mIG51bWVyaWMgdmFyaWFibGVzIHNvIHdlIHdpbGwgY3JlYXRlIGEgdGVtcG9yYXJ5IGRhdGEgc2V0ICJjb3IuZGF0YSIgd2hpY2ggZG9lcyBub3QgaW5jbHVkZSB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgb2YgbW9udGguDQoNCmBgYHtyfQ0KY29yLmRhdGEgPC0gZmluYWwuZGF0YVssIC1jKDMpXQ0KcmVzIDwtIGNvcihjb3IuZGF0YSkNCnJvdW5kKHJlcywgMikNCmBgYA0KDQpJdCBhcHBlYXJzIHRoYXQgRkZNQyBhbmQgSVNJIGFyZSBoaWdobHkgY29ycmVsYXRlZCB3aXRoIGEgY29ycmVsYXRpb24gb2YgMC43MC4gV2Ugd2lsbCByZW1vdmUgb25lIG9mIHRoZXNlIHZhcmlhYmxlcyB0byBoZWxwIGF2b2lkIHRoaXMgbXVsdGljb2xsaW5lYXJpdHkgaXNzdWUuIFdlIHdpbGwga2VlcCBGRk1DLCBhcyBpdCBpcyB0aGUgZmlyc3QgdmFyaWFibGVzIGFscGhhYmV0aWNhbGx5IG9mIHRoZXNlIHR3by4gQWRkaXRpb25hbGx5LCBpdCBhcHBlYXJzIHRoYXQgRE1DIGFuZCBEQyBhcmUgc2lnbmlmaWNhbnRseSBjb3JyZWxhdGVkLCB3aXRoIGEgY29ycmVsYXRpb24gb2YgMC42Ny4gV2Ugd2lsbCBrZWVwIERDIGFzIGl0IGlzIHRoZSBmaXJzdCB2YXJpYWJsZSBhbHBoYWJldGljYWxseSBvZiB0aGVzZSB0d28uDQoNCg0KTm93LCBsZXQncyByZXZpc2Ugb3VyIGZpbmFsLmRhdGEgbW9kZWwgd2l0aCB0aGUgdmFyaWFibGVzIGFkanVzdGVkIHRvIGFkZHJlc3MgdGhlIG11bHRpY29sbGluZWFyaXR5IGlzc3VlIHRoYXQgd2UgZW5jb3VudGVyZWQuDQoNCmBgYHtyfQ0KZmluYWwuZGF0YSA9IGZvcmVzdGZpcmVzMVssIC1jKDQsNiw4KV0gICAgICAgIA0Ka2FibGUoaGVhZChmaW5hbC5kYXRhKSkNCmBgYA0KDQpUaGUgYWRqdXN0ZWQgZmluYWwgbW9kZWwgaXMgZ2l2ZW4gYXMgZm9sbG93cy4NCg0KYGBge3IgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnVsbC5tb2RlbCA9IGxtKGFyZWEgfiAuLCBkYXRhID0gZmluYWwuZGF0YSkNCmthYmxlKHN1bW1hcnkoZnVsbC5tb2RlbCkkY29lZiwgY2FwdGlvbiA9IlN0YXRpc3RpY3Mgb2YgUmVncmVzc2lvbiBDb2VmZmljaWVudHMiKQ0KYGBgDQoNCkl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgb3VyIGZ1bGwgbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgaGFzIGEgcC12YWx1ZSBvZiBwID0gMC42ODE2LCB3aGljaCBpcyBncmVhdGVyIHRoYW4gb3VyIGFscGhhIHZhbHVlIG9mIDAuMDUuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhpcyBmdWxsIG1vZGVsIHdpbGwgbGlrZWx5IG5vdCBiZSBvdXIgYmVzdCBjaG9pY2UgZm9yIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gYXMgdGhpcyBtb2RlbCB3YXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW4gcHJlZGljdGluZyB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZS4gDQoNCg0KIyMgQm94IENveCBNb2RlbHMNCg0KRHVlIHRvIHRoZSB2aW9sYXRpb25zIGluIHRoZSByZXNpZHVhbCBwbG90cyBvZiB0aGUgbW9kZWwsIHdlIHdpbGwgdXNlIHRoZSBCb3ggQ294IHRyYW5zZm9ybWF0aW9ucyB0byBhZGp1c3Qgb3VyIGRhdGEuDQoNCg0KIyMjIEJveCBDb3ggVHJhbnNmb3JtYXRpb25zDQoNCldlIHdpbGwgdHJ5IG91dCBzZXZlcmFsIHRyYW5zZm9ybWF0aW9ucyBpbiBvcmRlciB0byBjaG9vc2UgdGhlIGJlc3Qgb25lIGZvciBvdXIgbW9kZWwuDQoNClRoZSB0cmFuc2Zvcm1hdGlvbnMgd2hpY2ggSSB0cmllZCB1c2VkIHNwZWNpZmljIHZhcmlhYmxlcy4gVGhlIEJveCBDb3ggdHJhbnNmb3JtYXRpb25zIEkgcGVyZm9ybWVkIGFyZSBsaXN0ZWQgYXMgZm9sbG93czoNCg0KKiBCb3ggQ294LSBMb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiB3aW5kLg0KDQoqIEJveCBDb3gtIHdpbmQuDQoNCiogQm94IENveC0gTG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgdGVtcGVyYXR1cmUgKHRlbXApLg0KDQoqIEJveCBDb3gtIExvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9ucyBvZiB3aW5kIGFuZCB0ZW1wZXJhdHVyZSAodGVtcCkuDQoNCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9Nn0NCnBhcihwdHkgPSAicyIsIG1mcm93ID0gYygyLCAyKSwgb21hPWMoLjEsLjEsLjEsLjEpLCBtYXI9Yyg0LCAwLCAyLCAwKSkNCg0KIyMgQm94IENveC0gTG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2Ygd2luZCB2YXJpYWJsZS4NCmJveGNveChhcmVhIH4gWCArIFkgKyBmYWN0b3IobW9udGgpICsgRkZNQyArIERDICsgdGVtcCArIFJIICsgbG9nKHdpbmQpICsgcmFpbiAsIGRhdGEgPSBmaW5hbC5kYXRhLCBsYW1iZGEgPSBzZXEoLTAuNCwgMC40LCBsZW5ndGggPSAxMCksIA0KICAgICAgIHhsYWI9ZXhwcmVzc2lvbihwYXN0ZShsYW1iZGEsICI6IGxvZyB3aW5kIikpKQ0KDQojIyBCb3ggQ294LSB3aW5kLg0KYm94Y294KGFyZWEgfiBYICsgWSArIGZhY3Rvcihtb250aCkgKyBGRk1DICsgREMgKyB0ZW1wICsgIFJIICArIHdpbmQgKyByYWluDQogICAgICAgLCBkYXRhID0gZmluYWwuZGF0YSwgbGFtYmRhID0gc2VxKC0wLjQsIDAuNCwgbGVuZ3RoID0gMTApLCANCiAgICAgICB4bGFiPWV4cHJlc3Npb24ocGFzdGUobGFtYmRhLCAiOiB3aW5kIikpKQ0KDQojI0JveCBDb3gtIExvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIHRlbXBlcmF0dXJlICh0ZW1wKSB2YXJpYWJsZS4NCmJveGNveChhcmVhIH4gWCArIFkgKyBmYWN0b3IobW9udGgpICsgRkZNQyArIERDICsgbG9nKHRlbXApICsgUkggKyB3aW5kICsgcmFpbiwgZGF0YSA9IGZpbmFsLmRhdGEsIGxhbWJkYSA9IHNlcSgtMC40LCAwLjQsIGxlbmd0aCA9IDEwKSwgDQogICAgICAgeGxhYj1leHByZXNzaW9uKHBhc3RlKGxhbWJkYSwgIjogbG9nLXRlbXAiKSkpDQoNCiMjIEJveCBDb3gtIExvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9ucyBvZiB3aW5kIGFuZCB0ZW1wZXJhdHVyZSAodGVtcCkuDQpib3hjb3goYXJlYSB+IFggKyBZICsgZmFjdG9yKG1vbnRoKSArIEZGTUMgKyBEQyArIGxvZyh0ZW1wKSArIFJIICsgbG9nKHdpbmQpICsgcmFpbiwgZGF0YSA9IGZpbmFsLmRhdGEsIGxhbWJkYSA9IHNlcSgtMC40LCAwLjQsIGxlbmd0aCA9IDEwKSwgDQogICAgICB4bGFiPWV4cHJlc3Npb24ocGFzdGUobGFtYmRhLCAiOiBsb2ctd2luZCwgbG9nLXRlbXAiKSkpDQpgYGANCg0KV2UgY2FuIHNlZSB0aGUgcGxvdHMgZm9yIHRoZSBCb3ggQ294IHRyYW5zZm9ybWF0aW9ucyB0aGF0IHdlcmUgcGVyZm9ybWVkIGFuZCB0aGVzZSB0cmFuc2Zvcm1hdGlvbiBwbG90cyBpbmRpY2F0ZSB0aGUgb3B0aW1hbCB2YWx1ZSBvZiBsYW1iYSBmb3IgdGhlIGRpZmZlcmVudCB0cmFuc2Zvcm1lZCBwcmVkaWN0b3IgdmFyaWFibGVzLiBTcGVjaWZpY2FsbHksIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uIHdlIGxvb2tlZCBhdCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgd2luZCBhbmQgdGVtcCwgYXMgdGhlc2UgdHdvIHF1YW50aWF0aXZlIHZhcmlhYmxlcyBjYW4gaGVscCB1cyBzZWUgaWYgd2UgY2FuIGltcHJvdmUgb3VyIG1vZGVsIGZvciBwcmVkaWN0aW5nIHRoZSBhcmVhIGJhc2VkIHVwb24gdGhlIHByZWRpY3RvcnMgd2UgaGF2ZS4NCg0KDQoNCiMjIyBTcXVhcmUtUm9vdCBUcmFuc2Zvcm1hdGlvbg0KDQpXZSB3aWxsIGNyZWF0ZSBhIHNxdWFyZS1yb290IHRyYW5zZm9ybWF0aW9uIG9mIG91ciBtb2RlbCB3aXRoIHRoZSBsb2cgdHJhbnNmb3JtZWQgdGVtcCB2YXJpYWJsZS4gDQoNClRvIGhlbHAgaW1wcm92ZSB0aGUgc2lnbmlmaWNhbmNlIG9mIHRoZSBtb2RlbCwgSSBkZWNpZGVkIHRvIGZvY3VzIGluIHRoZSB2YXJpYWJsZXMgd2hpY2ggcHJvdmlkZWQgdGhlIG1vc3Qgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHRvIG91ciBtb2RlbC4gVmFyaWFibGVzIHN1Y2ggYXMgRkZNQyBhbmQgbW9udGggZ3JlYXRseSBpbmNyZWFzZWQgdGhlIHAtdmFsdWUgb2YgdGhlIG1vZGVsLCBzbyBJIGRlY2lkZWQgdG8gaW1wcm92ZSB0aGUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9mIHRoZSBtdWx0aXBsZSByZWdyZXNzaW9uIG1vZGVsIGJ5IHJlbW92aW5nIHRoZXNlIHZhcmlhYmxlcyBmcm9tIHRoaXMgc3F1YXJlIHJvb3QgdHJhbnNmb3JtYXRpb24uIEhvd2V2ZXIsIHdoaWxlIGRvaW5nIHNvIGRpZCBkZWNyZWFzZSB0aGUgcC12YWx1ZSwgaXQgc3RpbGwgZGlkIG5vdCBsb3dlciBpdCBlbm91Z2ggdG8gYWNoaWV2ZSBhIGxldmVsIG9mIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBmb3IgdGhpcyBzcXVhcmUgcm9vdCB0cmFuc2Zvcm1hdGlvbiBtb2RlbC4gDQoNCmBgYHtyfQ0Kc3FydC5hcmVhLmxvZy50ZW1wPSBsbSgoYXJlYSleMC41IH4gWCArIFkgKyBEQyArIGxvZyh0ZW1wKSArIFJIICsgd2luZCArIHJhaW4sIGRhdGEgPSBmaW5hbC5kYXRhKQ0Ka2FibGUoc3VtbWFyeShzcXJ0LmFyZWEubG9nLnRlbXApJGNvZWYsIGNhcHRpb24gPSAiU3F1YXJlIFJvb3QgTG9nLVRyYW5zZm9ybWVkIE1vZGVsIikNCmBgYA0KDQpUaGUgcC12YWx1ZSBvZiB0aGlzIG1vZGVsIGlzIHAgPSAwLjI1MTQsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBvdXIgYWxwaGEgdmFsdWUgb2YgMC4wNS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNxdWFyZSByb290IHRyYW5zZm9ybWF0aW9uIG1heSBub3QgYmUgb3VyIGJlc3Qgb3B0aW9uIGFzIGl0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGZvciBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uIG9mIHRoZSBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlLiANCg0KTGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIHJlc2lkdWFsIHBsb3RzIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uLg0KDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3Qoc3FydC5hcmVhLmxvZy50ZW1wKQ0KYGBgDQoNClRoZSByZXNpZHVhbCBwbG90IGFwcGVhcnMgdG8gYmUgbW9zdGx5IHJhbmRvbSBleGNlcHQgZm9yIGEgZmV3IG91dGxpZXJzIHdoaWNoIGFwcGVhciBsaWtlIHRoZXkgYXJlIHNpZ25pZmljYW50LiBKdXN0IGxpa2UgaW4gdGhlIGxpbmVhciBtb2RlbCwgdGhlIFEtUSBQbG90IGFwcGVhcnMgdG8gc2hvdyBhIHZpb2xhdGlvbiBpbiB0aGF0IHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIHBsb3Qgc2hvd3MgdGhlIHBvaW50cyBkaXZlcmdpbmcgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoaXMgaXMgZXZpZGVuY2Ugb2YgYSB2aW9sYXRpb24gb2YgdGhpcyB0cmFuc2Zvcm1lZCBtb2RlbC4gRnVydGhlcm1vcmUsIHRoZSBDb29rZSdzIERpc3RhbmNlIHBsb3Qgc2hvd3MgdGhhdCB0aGVyZSBpcyBhIHZlcnkgaGlnaCBsZXZlcmFnZSBwb2ludCBpbiB0aGUgbW9kZWwgYWxvbmcgd2l0aCBzZXZlcmFsIG90aGVyIG91dGxpZXJzLCBpbmRpY2F0aW5nIGZ1cnRoZXIgdmlvbGF0aW9ucyBzdGlsbCBwcmVzZW50IHdpdGhpbiB0aGlzIHNxdWFyZS1yb290IHRyYW5zZm9ybWVkIG1vZGVsLg0KDQoNCg0KIyMjIExvZ2FyaXRobWljIFRyYW5zZm9ybWF0aW9uDQoNCldlIHdpbGwgY3JlYXRlIGEgbG9nYXJpdGhtaWMgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbCB1c2luZyB0aGUgbG9nIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSBhcmVhLiANCg0KVG8gaGVscCBpbXByb3ZlIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIG1vZGVsLCBJIGRlY2lkZWQgdG8gZm9jdXMgaW4gdGhlIHZhcmlhYmxlcyB3aGljaCBwcm92aWRlZCB0aGUgbW9zdCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgdG8gb3VyIG1vZGVsLiBWYXJpYWJsZXMgc3VjaCBhcyBGRk1DIGFuZCBtb250aCBncmVhdGx5IGluY3JlYXNlZCB0aGUgcC12YWx1ZSBvZiB0aGUgbW9kZWwsIHNvIEkgZGVjaWRlZCB0byBpbXByb3ZlIHRoZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgdGhlIG11bHRpcGxlIHJlZ3Jlc3Npb24gbW9kZWwgYnkgcmVtb3ZpbmcgdGhlc2UgdmFyaWFibGVzIGZyb20gdGhpcyBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbi4gRG9pbmcgc28gZ3JlYXRseSBpbXByb3ZlZCB0aGUgcC12YWx1ZSwgd2l0aCB0aGUgbXVjaCBsb3dlciBwLXZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGlzIG1vZGVsIG5vdyBkb2VzIGhhdmUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGZvciBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uIG9mIGFyZWEuIA0KDQpgYGB7cn0NCmxvZy5hcmVhID0gbG0obG9nKGFyZWEpIH4gWCArIFkgKyBEQyArIHRlbXAgKyBSSCArIHdpbmQgKyByYWluLCAgZGF0YSA9IGZpbmFsLmRhdGEpDQprYWJsZShzdW1tYXJ5KGxvZy5hcmVhKSRjb2VmLCBjYXB0aW9uID0gImxvZy10cmFuc2Zvcm1lZCBtb2RlbCIpDQpgYGANCg0KTGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIHJlc2lkdWFsIHBsb3RzIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uLg0KDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3QobG9nLmFyZWEpDQpgYGANCg0KV2l0aCB0aGUgbG9nYXJpdGhtaWMgbW9kZWwsIHRoZSByZXNpZHVhbHMgYXBwZWFyIG11Y2ggYmV0dGVyIHRoYW4gdGhleSBkaWQgZm9yIHRoZSBsaW5lYXIgbW9kZWwuIFRoZSByZXNpZHVhbCBwbG90IGFwcGVhcnMgbXVjaCBtb3JlIHJhbmRvbS4gV2hpbGUgdGhlIFEtUSBQbG90IGRvZXMgYXBwZWFyIHRvIGdvIHNsaWdodGx5IG9mZiBvZiB0aGUgbGluZSBmb3IgYSBub3JtYWwgZGlzdHJpYnV0aW9uIG9uIHRoZSByaWdodCBoYW5kIHNpZGUsIGl0IGlzIG11Y2ggbGVzcyBzZXZlcmUgdGhhbiBob3cgaXQgd2FzIGluIHRoZSByZXNpZHVhbCBwbG90IG9mIHRoZSBsaW5lYXIgbW9kZWwuIEFkZGl0aW9uYWxseSwgd2Ugc3RpbGwgZG8gaGF2ZSBzb21lIGhpZ2ggbGV2ZXJhZ2UgcG9pbnRzIGFzIHNlZW4gaW4gdGhlIENvb2tlJ3MgRGlzdGFuY2UgcGxvdCB3aGljaCB3b3VsZCBkZWZpbmV0bHkgYmUgd29ydGggaW52ZXN0aWdhdGluZyBmdXJ0aGVyIGluIGFkZGl0aW9uYWwgZXhwZXJpbWVudHMgdG8gZGV0ZXJtaW5lIHdoeSB3ZSBoYXZlIHRoZXNlIGhpZ2ggbGV2ZXJhZ2UgcG9pbnRzIGFuZCBvdXRsaWVycy4gSG93ZXZlciwgb3ZlcmFsbCB0aGUgbG9nYXJpdGhtaWMgbW9kZWwgaGFzIGZld2VyIHZpb2xhdGlvbnMgYW5kIG11Y2ggbGVzcyBzZXZlcmUgcHJvYmxlbXMgdGhhbiB0aGUgbGluZWFyIG1vZGVsIGhhZCByZWdhcmRpbmcgaXRzIHJlc2lkdWFscy4gDQoNCk92ZXJhbGwsIHRoaXMgbG9nYXJpdGhtaWMgdHJhbnNmb3JtZWQgbW9kZWwgYXBwZWFycyB0byBoYXZlIHRoZSBmZXdlc3QgdmlvbGF0aW9ucyBhbmQgYWxzbyBpcyB0aGUgb25seSBvbmUgd2l0aCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcC12YWx1ZSwgcCA9IDAuMDAxNC4gDQoNCg0KIyMjIENvbXBhcmlzb24gb2YgUS1RIFBsb3RzDQoNClNvbWV0aGluZyB3aGljaCB3YXMgbWFkZSBub3RlIG9mIHdoZW4gcGVyZm9ybWluZyB0aGUgdmFyaW91cyB0cmFuc2Zvcm1hdGlvbnMgd2FzIHRoYXQgdGhlcmUgYXBwZWFyZWQgdG8gYmUgc29tZSB2aW9sYXRpb25zIHdoZW4gY2hlY2tpbmcgb3VyIHJlc2lkdWFsIGNvbmRpdGlvbnMuIE9uZSBwYXJ0aWN1bGFyIHZpb2xhdGlvbiB3aGljaCBhcHBlYXJlZCB0byBiZSB2ZXJ5IHNldmVyZSBpbiBjZXJ0YWluIGNhc2VzIHdhcyB0aGUgZmFpbHVyZSBvZiB0aGUgUS1RIFBsb3QgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGF0YSBhcHBlYXJlZCB0byBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBCb3RoIHRoZSBvcmlnaW5hbCBsaW5lYXIgbW9kZWwgYW5kIHRoZSBzcXVhcmUgcm9vdCB0cmFuc2Zvcm1hdGlvbiBtb2RlbCBlc3BlY2lhbGx5IGhhZCBzZXZlcmUgdmlvbGF0aW9ucyByZWdhcmRpbmcgdGhlaXIgUS1RIFBsb3RzLiBIb3dldmVyLCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgYXBwZWFyZWQgdG8gaGF2ZSBhIFEtUSBQbG90IHdoaWNoIHdhcyBtdWNoIGNsb3NlciB0byBpbmRpY3RpbmcgYSBub3JtYWwgZGlzdHJpYnV0aW9uIHRoYW4gdGhlIG90aGVyIHR3by4gV2hpbGUgdGhlcmUgd2FzIHN0aWxsIHNvbWUgc2xpZ2h0IGRldmlhdGlvbiBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBRLVEgUGxvdCBmb3IgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uLCBpdCB3YXMgd2F5IGxlc3MgdGhhbiBlaXRoZXIgb2YgdGhlIG90aGVyIHR3byBtb2RlbHMuIEFkZGl0aW9uYWxseSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIHdhcyB0aGUgb25seSBRLVEgUGxvdCB3aGljaCBkaWQgbm90IHNob3cgYmxhdGFudCBjdXJ2YXR1cmUgaW4gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBpdC4gDQoNCmBgYHtyfQ0KcGFyKHB0eSA9ICJzIiwgbWZyb3cgPSBjKDEsIDMpKQ0KI1EtUSBwbG90IGZvciBsaW5lYXIgZnVsbCBtb2RlbA0KcXFub3JtKGZ1bGwubW9kZWwkcmVzaWR1YWxzLCBtYWluID0gIkxpbmVhciBGdWxsIE1vZGVsIikNCnFxbGluZShmdWxsLm1vZGVsJHJlc2lkdWFscykNCg0KIyBRLVEgcGxvdCBmb3Igc3F1YXJlIHJvb3QgdHJhbnNmb3JtYXRpb24gbW9kZWwNCnFxbm9ybShzcXJ0LmFyZWEubG9nLnRlbXAkcmVzaWR1YWxzLCBtYWluID0gIlNxdWFyZS1Sb290IEFyZWEgTG9nIFRlbXAgXG4gTW9kZWwiKQ0KcXFsaW5lKHNxcnQuYXJlYS5sb2cudGVtcCRyZXNpZHVhbHMpDQoNCiNRLVEgcGxvdCBmb3IgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgDQpxcW5vcm0obG9nLmFyZWEkcmVzaWR1YWxzLCBtYWluID0gIkxvZyBBcmVhIE1vZGVsIikNCnFxbGluZShsb2cuYXJlYSRyZXNpZHVhbHMpDQpgYGANCg0KQnkgY29tcGFyaW5nIHRoZSBRLVEgUGxvdHMgb2YgdGhlc2UgdGhyZWUgcG90ZW50aWFsIG1vZGVscywgd2UgY2FuIHNlZSB0aGF0IHRoZSBsb2dhcml0aG1pYyBtb2RlbCBoYXMgdGhlIGxpbmVhciBtb2RlbCBhbmQgdGhlIHNxdWFyZSByb290IHRyYW5zZm9ybWF0aW9uIG1vZGVsIGhhdmUgdmVyeSBzZXZlcmUgdmlvbGF0aW9ucyBvZiBub3JtYWxpdHkgaW4gdGhlaXIgUS1RIFBsb3QuIFdoaWxlIHRoZSBsb2dhcnRoaW1pYyB0cmFuc2Zvcm1hdGlvbiBtb2RlbCBzdGlsbCBkb2VzIGhhdmUgc29tZSBkZXZpYXRpb24gZnJvbSBub3JtYWxpdHksIGl0IGlzIGJ5IGZhciB0aGUgbGVhc3Qgc2V2ZXJlIHZpb2xhdGlvbiBvZiB0aGUgdGhyZWUuIFRoaXMgZ2l2ZXMgYSBzdHJvbmcgcG9pbnQgdG93YXJkcyB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgYmVpbmcgdGhlIGJlc3Qgb25lIHRvIHVzZSBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgYXJlYS4NCg0KDQojIyMgR29vZG5lc3Mgb2YgRml0IA0KDQpXZSB3aWxsIG5vdyBsb29rIGF0IG90aGVyIGdvb2RuZXNzIG9mIGZpdCBtZXRob2RzIGZvciB0aGUgZmluYWwgdGhyZWUgbW9kZWxzIG9mIGNvbnNpZGVyYXRpb24uIFRoZXNlIG1ldGhvZHMgZm9yIGdvb2RuZXNzIG9mIGZpdCB3aWxsIGluY2x1ZGUgdXNlZnVsIHRvb2xzIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcyBzdWNoIGFzIFItc3F1YXJlZCB2YWx1ZSwgQUlDLCBhbmQgTWFsbG93J3MgQ3AuIA0KDQpgYGB7cn0NCnNlbGVjdD1mdW5jdGlvbihtKXsgDQogZSA9IG0kcmVzaWQgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIG4wID0gbGVuZ3RoKGUpICAgDQogIyMgU3VtIFNxdWFyZWQgb2YgRXJyb3JzDQogU1NFPShtJGRmKSooc3VtbWFyeShtKSRzaWdtYSleMiAgIA0KDQogIyMgTXVsdGlwbGUgUi1zcXVhcmVkIA0KIFIuc3E9c3VtbWFyeShtKSRyLnNxdWFyZWQgICAgDQogDQogIyMgQWRqdXN0ZWQgUi1zcXVhcmVkDQogUi5hZGo9c3VtbWFyeShtKSRhZGoucg0KIA0KICMjIE1lYW4gU3F1YXJlZCBFcnJvcnMNCiBNU0U9KHN1bW1hcnkobSkkc2lnbWEpXjIgICAgICAgICAgICAgDQogDQogIyMgTWFsbG93J3MgQ3ANCiBDcD0oU1NFL01TRSktKG4wLTIqKG4wLW0kZGYpKSANCiANCiAjIyBBSUMgDQogQUlDPW4wKmxvZyhTU0UpLW4wKmxvZyhuMCkrMioobjAtbSRkZikgIA0KIA0KICMjIFRhYmxlIG9mIHRoZSB2YWx1ZXMgDQogWD1tb2RlbC5tYXRyaXgobSkgICAgICAgICAgICAgICAgICAgICANCiBIPVglKiVzb2x2ZSh0KFgpJSolWCklKiV0KFgpICAgICAgICAgDQogdGJsID0gYXMuZGF0YS5mcmFtZShjYmluZChTU0U9U1NFLCBSLnNxPVIuc3EsIFIuYWRqID0gUi5hZGosIENwID0gQ3AsIEFJQyA9IEFJQykpDQogbmFtZXModGJsKT1jKCJTU0UiLCAiUi5zcSIsICJSLmFkaiIsICJDcCIsICJBSUMiKQ0KIHRibA0KfQ0KYGBgDQoNCldlIHdpbGwgY3JlYXRlIGFuIG91dHB1dCB0YWJsZSB0byBkaXNwbGF5IHRoZSBnb29kbmVzcyBvZiBmaXQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBtb2RlbHMuDQoNCmBgYHtyfQ0Kb3V0cHV0LnN1bW1hcnkgPSByYmluZChzZWxlY3QoZnVsbC5tb2RlbCksIHNlbGVjdChzcXJ0LmFyZWEubG9nLnRlbXApLCBzZWxlY3QobG9nLmFyZWEpKQ0Kcm93Lm5hbWVzKG91dHB1dC5zdW1tYXJ5KSA9IGMoIkxpbmVhciBGdWxsIE1vZGVsIiwgIlNxcnQgQXJlYSBMb2cgVGVtcCIsICJMb2cgQXJlYSIpDQprYWJsZShvdXRwdXQuc3VtbWFyeSwgY2FwdGlvbiA9ICJHb29kbmVzcy1vZi1maXQgTWVhc3VyZXMgZm9yIHRoZSBUaHJlZSBDYW5kaWRhdGUgTW9kZWxzIikNCmBgYA0KDQpPdmVyYWxsLCBpdCBhcHBlYXJzIHRoYXQgdW5mb3J0dW5hdGVseSBhbGwgdGhyZWUgbW9kZWxzIGhhdmUgdmVyeSBsb3cgUiBzcXVhcmVkIHZhbHVlcyBpbmRpY2F0aW5nIGxvdyBleHBsYWluZWQgdmFyaWFuY2Ugd2l0aGluIHRoZWlyIHJlc3BlY3RpdmUgbW9kZWxzLiBUaGUgTWFsbG93J3MgQ3AgdmFsdWUgZm9yIHRoZSBsYXN0IHR3byBtb2RlbHMsIHRoZSBzcXVhcmUgcm9vdCBhbmQgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWxzLCBpcyBiZXR0ZXIgdGhhbiB0aGF0IG9mIHRoZSBmdWxsIGxpbmVhciBtb2RlbC4gVGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG1vZGVsIGhhcyB0aGUgbG93ZXN0IEFJQyBvdXQgb2YgdGhlIHRocmVlLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCBpdCBpcyBhIGJldHRlciBmaXQgbW9kZWwgZm9yIHRoZSBkYXRhLg0KDQpBbGwgaW4gYWxsLCB0aGUgYmVzdCBtb2RlbCBvZiB0aGUgdGhyZWUgYXBwZWFycyB0byBiZSB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24uIFRoaXMgaGFzIGJlZW4gc2hvd24gYnkgdGhlIGdvb2RuZXNzIG9mIGZpdCBtZWFzdXJlcyB0aGF0IHdlcmUgcGVyZm9ybWVkIGFzIHdlbGwgYXMgYnkgdGhhdCBpdCB3YXMgdGhlIG9ubHkgbW9kZWwgd2l0aCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcC12YWx1ZSwgcCA9IDAuMDAxNCwgd2hpbGUgdGhlIG90aGVyIHR3byBtb2RlbHMgYm90aCBoYWQgcC12YWx1ZXMgdGhhdCB3ZXJlIGdyZWF0ZXIgdGhhbiBvdXIgYWxwaGEgdmFsdWUgb2YgMC4wNSBpbmRpY2F0aW5nIHRoYXQgdGhlIG90aGVyIHR3byBtb2RlbHMgd2VyZSBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIGFyZWEgd2hpbGUgdGhlIGxvZ2FyaXRobWljIG1vZGVsIHdhcy4gDQoNClNvLCB3ZSB3aWxsIHNlbGVjdCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgYXMgb3VyIGZpbmFsIG1vZGVsIHRvIHVzZS4gDQoNCg0KIyMjIEZpbmFsIE1vZGVsDQoNCkFmdGVyIG91ciBhbmFseXNpcyBvZiB0aGUgdGhyZWUgcG90ZW50aWFsIGNob2ljZXMgZm9yIGEgZmluYWwgbW9kZWwsIHdlIGRlY2lkZWQgdGhhdCB0aGUgYmVzdCBmaXQgbW9kZWwgdG8gdXNlIGlzIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBtb2RlbC4gVGhpcyBtb2RlbCBoYWQgdGhlIGJlc3QgZ29vZG5lc3Mgb2YgZml0IG1lYXN1cmVzIGFzIHdlbGwgYXMgaXQgd2FzIHRoZSBvbmx5IG9uZSB3aXRoIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBwLXZhbHVlLg0KDQpgYGB7cn0NCmthYmxlKHN1bW1hcnkobG9nLmFyZWEpJGNvZWYsIGNhcHRpb24gPSAiSW5mZXJlbnRpYWwgU3RhdGlzdGljcyBvZiBGaW5hbCBNb2RlbC0gTG9nIEFyZWEiKQ0KYGBgDQoNCk91ciBvdmVyYWxsIG1vZGVsIGFwcGVhcnMgdG8gYmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgbG9nKGFyZWEpLiBJdCBhcHBlYXJzIHRoYXQgY2hvb3NpbmcgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIGFzIG91ciBmaW5hbCBtb2RlbCB3YXMgdGhlIGJlc3QgY2hvaWNlIGFmdGVyIGFsbC4NCg0KVGhlIGNvbWJpbmVkIGxvZ2FyaXRobWljIG1vZGVsIG9mIFgsIFksIERDLCB0ZW1wLCBSSCwgd2luZCwgYW5kIHJhaW4sIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnRseSBwcmVkaWN0ZWQgdGhlIGxvZyBvZiBhcmVhLCBwID0gMC4wMDE0Lg0KDQoNClRoZSByZWdyZXNzaW9uIGVxdWF0aW9uIGZvciBvdXIgZmluYWwgY2hvaWNlIG9mIHRoZSBtb2RlbCBpcyBnaXZlbiBhcyBmb2xsb3dzOg0KDQpsb2coYXJlYSkgPSAyLjQ4MzUgKyAwLjAyMTIgKiBYIC0gMC4wMzY4ICogWSArIDAuMDAwMSAqIERDIC0gMC4wMTgyICogdGVtcCAtIDAuMDA5OCAqIFJIICsgMC4wMzU3ICogd2luZCArIDAuMDkxMSAqIHJhaW4uDQoNCg0KSW5jbHVkZWQgYmVsb3cgYXJlIHRoZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzIG9mIHRoZSBmaW5hbCBtb2RlbC4NCg0KYGBge3J9DQpjbXRyeCA8LSBzdW1tYXJ5KGxvZy5hcmVhKSRjb2VmDQprYWJsZShjbXRyeCwgY2FwdGlvbiA9ICJJbmZlcmVudGlhbCBTdGF0aXN0aWNzIG9mIEZpbmFsIE1vZGVsIikNCmBgYA0KDQoNCiMjIyMgRmluYWwgTW9kZWwgVmFyaWFibGUgSW50ZXJwcmV0YXRpb24NCg0KV2Ugd2lsbCBhbmFseXplIHRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBpbiBvdXIgZmluYWwgcmVncmVzc2lvbiBtb2RlbCB3aXRoIHRoZWlyIGFmZmVjdCBvbiBhcmVhLiBBcyBzdGF0ZXMgcHJldmlvdXNseSBpbiB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb24gc2VjdGlvbiBvZiB0aGlzIHByb2plY3QsIHRoZSBtZWFzdXJlbWVudHMgZm9yIGFyZWEgYXJlIGdpdmVuIGluIGhlY3RhcmVzLiBBZGRpdGlvbmFsbHksIHNpbmNlIG91ciBmaW5hbCBtb2RlbCBzZWxlY3RlZCBpcyBhIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uLCB0aGVzZSBpbnRlcnByZXRhdGlvbnMgd2lsbCBiZSBsb29raW5nIGF0IHRoZSBlZmZlY3RzIG9mIHRoZXNlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBvbiB0aGUgbG9nIG9mIGFyZWEuIA0KDQoqIFg6IEZvciBldmVyeSBhZGRpdGlvbmFsIDEgY29vcmRpbmF0ZSBtb3ZlbWVudCB0byB0aGUgcmlnaHQsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAyMTIgaGVjdGFyZXMuDQoNCiogWTogRm9yIGV2ZXJ5IGFkZGl0aW9uYWwgMSBjb29yZGluYXRlIG1vdmVtZW50IHVwd2FyZHMsIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDM2OCBoZWN0YXJlLg0KDQoqIERDOiBGb3IgZXZlcnkgYWRkaXRpb25hbCAxIHVuaXQgaW5jcmVhc2Ugb2YgREMsIHRoZSBtZWFzdXJlIG9mIHRoZSBtb2lzdHVyZSBjb250ZW50IG9mIGNvbXBhY3Qgb3JnYW5pYyBsYXllcnMgaW4gdGhlIGFyZWEgYWZmZWN0ZWQgYnkgdGhlIGZpcmUsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAwMDEgaGVjdGFyZS4NCg0KKiB0ZW1wOiBGb3IgZXZlcnkgMSBkZWdyZWUgQ2Vsc2l1cyBpbmNyZWFzZSBpbiB0ZW1wZXJhdHVyZSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDE4MiBoZWN0YXJlLg0KDQoqIFJIOiBGb3IgZXZlcnkgMSBwZXJjZW50YWdlIGluY3JlYXNlIGluIHRoZSByZWxhdGl2ZSBodW1pZGl0eSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDA5OCBoZWN0YXJlLg0KDQoqIHdpbmQ6IEZvciBldmVyeSAxIGtpbG9tZXRlciBwZXIgaG91ciBpbmNyZWFzZSBpbiB0aGUgc3BlZWQgb2YgdGhlIHdpbmQsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAzNTcuDQoNCiogcmFpbjogRm9yIGV2ZXJ5IDEgbW0vbV4yIGluY3JlYXNlIGluIHRoZSByYWluIG9jY3VycmluZywgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgaW5jcmVhc2VzIGJ5IDAuMDkxMS4NCg0KV2UgY2FuIHNlZSB0aGF0IHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgcG9zaXRpdmVseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgYXJlIFgsIERDLCB3aW5kLCBhbmQgcmFpbi4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhcyB0aGVzZSB2YXJpYWJsZXMgaW5jcmVhc2UsIHNvIGRvZXMgdGhlIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIG5lZ2F0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGFyZSBZLCB0ZW1wLCBhbmQgUkguIFRoaXMgaW5kaWNhdGVzIHRoYXQgYXMgdGhlc2UgdmFyaWFibGVzIGluY3JlYXNlLCB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZSBkZWNyZWFzZXMuDQoNCg0KDQoNCiMgQm9vdHN0cmFwcGluZyB0aGUgRmluYWwgTW9kZWwNCg0KV2UgY2hvc2UgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIGFzIG91ciBmaW5hbCBtb2RlbCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiBkdWUgdG8gaXQgYmVpbmcgdGhlIG1vZGVsIHdoaWNoIGJvdGggc2hvd3MgdGhlIGdyZWF0ZXN0IHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBpbiB0aGUgcHJlZGljdGlvbiBvZiBhcmVhLCBhbmQgaGFzIHRoZSBmZXdlc3QgdmlvbGF0aW9ucyBvZiBhIG11bHRpcGxlIHJlZ3Jlc3Npb24gbW9kZWwgb2YgdGhlIG1vZGVscyB3ZSBjb25zaWRlcmVkLiANCg0KVGhlIGVxdWF0aW9uIG9mIG91ciBmaW5hbCBtb2RlbCBpczoNCmxvZyhhcmVhKSA9IDIuNDgzNSArIDAuMDIxMiAqIFggLSAwLjAzNjggKiBZICsgMC4wMDAxICogREMgLSAwLjAxODIgKiB0ZW1wIC0gMC4wMDk4ICogUkggKyAwLjAzNTcgKiB3aW5kICsgMC4wOTExICogcmFpbi4NCg0KTm93LCB3ZSB3aWxsIGxvb2sgYXQgdGhlIHByb2Nlc3Mgb2YgYm9vdHN0cmFwcGluZyB0aGlzIGZpbmFsIG1vZGVsIGluIG9yZGVyIHRvIGZpbmQgdGhlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBvZiB0aGUgY29lZmZpY2llbnRzIGluIG91ciBmaW5hbCBtb2RlbC4gDQoNCg0KDQojIyBCb290c3RyYXAgQ2FzZXMNCg0KV2Ugd2lsbCBsb29rIGF0IHRoZSBib290c3RyYXAgY2FzZXMgZm9yIG91ciBmaW5hbCBtb2RlbCBhbmQgdXNlIHRoZXNlIHRvIGhlbHAgYnVpbGQgdGhlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMuIA0KDQpgYGB7cn0NCmxvZy5hcmVhID0gbG0obG9nKGFyZWEpIH4gWCArIFkgKyBEQyArIHRlbXAgKyBSSCArIHdpbmQgKyByYWluLCAgZGF0YSA9IGZpbmFsLmRhdGEpDQojIFdlIHdpbGwgdXNlIDEsMDAwIGJvb3RzdHJhcCBzYW1wbGVzLiANCkIgPSAxMDAwICAgICAgDQpudW0ucGFyYW0gPSBkaW0obW9kZWwuZnJhbWUobG9nLmFyZWEpKVsyXSAgDQpzYW1wbGUuc2l6ZSA9IGRpbShtb2RlbC5mcmFtZShsb2cuYXJlYSkpWzFdIA0KY29lZi5tYXRyaXggPSBtYXRyaXgocmVwKDAsIEIqbnVtLnBhcmFtKSwgbmNvbCA9IG51bS5wYXJhbSkgICAgICAgDQpmb3IgKGkgaW4gMTpCKXsNCiAgYm9vdGMuaWQgPSBzYW1wbGUoMTpzYW1wbGUuc2l6ZSwgc2FtcGxlLnNpemUsIHJlcGxhY2UgPSBUUlVFKSANCiMgRml0dGluZyB0aGUgZmluYWwgbG9nIGFyZWEgbW9kZWwgdG8gdGhlIGJvb3RzdHJhcCBjYXNlcy4gDQogIGxvZy5hcmVhLmJ0YyA9IGxtKGxvZyhhcmVhKSB+IFggKyBZICsgREMgKyB0ZW1wICsgUkggKyB3aW5kICsgcmFpbiwgIGRhdGEgPSBmaW5hbC5kYXRhW2Jvb3RjLmlkLF0pICAgICANCiAgY29lZi5tYXRyaXhbaSxdID0gY29lZihsb2cuYXJlYS5idGMpIA0KfQ0KYGBgDQoNCldlIHdpbGwgbm93IHVzZSB0aGVzZSBib290c3RyYXAgY2FzZXMgdG8gY3JlYXRlIGhpc3RvZ3JhbXMgb2YgdGhlIGJvb3RzdHJhcCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cy4gDQoNCmBgYHtyfQ0KYm9vdC5oaXN0b2dyYW0gPSBmdW5jdGlvbihjbXRyeCwgYm9vdC5jb2VmLm1hdHJpeCwgdmFyLmlkLCB2YXIubmFtZSl7DQogIHgxLjEgPC0gc2VxKG1pbihib290LmNvZWYubWF0cml4Wyx2YXIuaWRdKSwgbWF4KGJvb3QuY29lZi5tYXRyaXhbLHZhci5pZF0pLCBsZW5ndGg9NTApDQogIHkxLjEgPC0gZG5vcm0oeDEuMSwgbWVhbihib290LmNvZWYubWF0cml4Wyx2YXIuaWRdKSwgc2QoYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSkpDQogIGhpZ2hlc3RiYXIgPSBtYXgoaGlzdChib290LmNvZWYubWF0cml4Wyx2YXIuaWRdLCBwbG90ID0gRkFMU0UpJGRlbnNpdHkpIA0KICB5bGltaXQgPC0gbWF4KGMoeTEuMSxoaWdoZXN0YmFyKSkNCiAgaGlzdChib290LmNvZWYubWF0cml4Wyx2YXIuaWRdLCBwcm9iYWJpbGl0eSA9IFRSVUUsIG1haW4gPSB2YXIubmFtZSwgeGxhYj0iIiwgY29sID0gImFsaWNlYmx1ZSIseWxpbT1jKDAseWxpbWl0KSwgYm9yZGVyPSJkZWVwcGluayIpDQogIGxpbmVzKHggPSB4MS4xLCB5ID0geTEuMSwgY29sID0gImRhcmtvcmNoaWQiKQ0KICBsaW5lcyhkZW5zaXR5KGJvb3QuY29lZi5tYXRyaXhbLHZhci5pZF0sIGFkanVzdD0yKSwgY29sPSJibHVlIikgDQp9DQpgYGANCg0KVGhlIGhpc3RvZ3JhbXMgb2YgdGhlIGJvb3RzdHJhcCBjb2VmZmljaWVudHMgZm9yIHRoZSB2YXJpYWJsZXMgaW4gdGhlIG1vZGVsIHdlcmUgY3JlYXRlZC4gDQoNClRoZXJlIGFyZSBoaXN0b2dyYW1zIGZvciBlYWNoIG9mIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgaW4gdGhlIG1vZGVsLCBhbG9uZyB3aXRoIHRoZSBpbnRlcmNlcHQsIGV4Y2VwdCBmb3IgdGhlIHZhcmlhYmxlICJyYWluIi4gVGhlIHZhcmlhYmxlICJyYWluIiBjb250YWlucyBzZXZlcmFsIHBvaW50cyB3aXRoIHRoZSB2YWx1ZSBvZiB6ZXJvLiBTaW5jZSB0aGUgZmluYWwgbW9kZWwgd2UgY2hvc2UgdG8gdXNlIGlzIGEgbG9nYXJpdGhtaWMgbW9kZWwsIHRoaXMgcmVzdWx0cyBpbiBhbiBlcnJvciBiZWNhdXNlIGxvZygwKSBpcyB1bmRlZmluZWQuIFNvLCB0aGlzIHZhcmlhYmxlIHdhcyBub3QgaW5jbHVkZWQgaW4gdGhlIGhpc3RvZ3JhbXMgb2YgdGhlIGJvb3RzdHJhcCBjb2VmZmljaWVudHMgZHVlIHRvIGl0IHJlc3VsdGluZyBpbiB0aGlzIGVycm9yLiBBbGwgb2YgdGhlIG90aGVyIHZhcmlhYmxlcyBjYW4gYmUgc2VlbiBhbG9uZyB3aXRoIHRoZWlyIGhpc3RvZ3JhbXMuDQoNCldpdGhpbiB0aGUgaGlzdG9ncmFtcywgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgbm9ybWFsIGRlbnNpdHkgY3VydmVzIHBsYWNlZCBvbiB0aGVtLiBUaGUgYmx1ZSBjdXJ2ZSBpcyBhIG5vbi1wYXJhbWV0cmljIGRlbnNpdHkgZXN0aW1hdGUgb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgd2Ugd2lsbCBjYWxjdWxhdGUgc2hvcnRseSBhcmUgYmFzZWQgdXBvbiB0aGlzIG5vbi1wYXJhbWV0cmljIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoZSBwdXJwbGUgY3VydmUgaXMgYSBtZWFzdXJlIG9mIHRoZSBlc3RpbWF0ZSBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mIHRoZWlyIHN0YW5kYXJkIGVycm9yLiBUaGUgcC12YWx1ZXMgZ2l2ZW4gaW4gdGhlIHJlZ3Jlc3Npb24gb3V0cHV0IGFyZSB0YWtlbiBmcm9tIHRoaXMgY3VydmUuICANCg0KYGBge3J9DQpwYXIobWZyb3c9YygyLDMpKSAgDQpib290Lmhpc3RvZ3JhbShib290LmNvZWYubWF0cml4PWNvZWYubWF0cml4LCB2YXIuaWQ9MSwgdmFyLm5hbWUgPSJJbnRlcmNlcHQiKQ0KYm9vdC5oaXN0b2dyYW0oYm9vdC5jb2VmLm1hdHJpeD1jb2VmLm1hdHJpeCwgdmFyLmlkPTIsIHZhci5uYW1lID0iWCIpDQpib290Lmhpc3RvZ3JhbShib290LmNvZWYubWF0cml4PWNvZWYubWF0cml4LCB2YXIuaWQ9MywgdmFyLm5hbWUgPSJZIikNCmJvb3QuaGlzdG9ncmFtKGJvb3QuY29lZi5tYXRyaXg9Y29lZi5tYXRyaXgsIHZhci5pZD00LCB2YXIubmFtZSA9IkRDIikNCmJvb3QuaGlzdG9ncmFtKGJvb3QuY29lZi5tYXRyaXg9Y29lZi5tYXRyaXgsIHZhci5pZD01LCB2YXIubmFtZSA9InRlbXAiKQ0KYm9vdC5oaXN0b2dyYW0oYm9vdC5jb2VmLm1hdHJpeD1jb2VmLm1hdHJpeCwgdmFyLmlkPTYsIHZhci5uYW1lID0iUkgiKQ0KYm9vdC5oaXN0b2dyYW0oYm9vdC5jb2VmLm1hdHJpeD1jb2VmLm1hdHJpeCwgdmFyLmlkPTcsIHZhci5uYW1lID0id2luZCIpDQojYm9vdC5oaXN0b2dyYW0oYm9vdC5jb2VmLm1hdHJpeD1jb2VmLm1hdHJpeCwgdmFyLmlkPTgsIHZhci5uYW1lID0icmFpbiIpDQpgYGANCg0KTG9va2luZyBhdCB0aGUgaGlzdG9ncmFtcyBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMsIGJvdGggdGhlIGJsdWUgYW5kIHB1cnBsZSBjdXJ2ZXMgYXBwZWFyIHRvIGJlIGNsb3NlIGFuZCBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci4gQWRkaXRpb25hbGx5LCB0aGUgaGlzdG9ncmFtcyBvZiBhbGwgb2YgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGFwcGVhciB0byBmb2xsb3cgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBhcHByb3hpbWF0ZWx5IG5vcm1hbCB3aXRob3V0IGFueSBzZXZlcmUgc2tldyBvciBvdXRsaWVycyBpbW1lZGlhdGVseSBub3RpY2VhYmxlLiANCg0KDQoNCiMjIyBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbHMgVXNpbmcgQm9vdHN0cmFwcGluZyBDYXNlcyANCg0KTmV4dCwgd2Ugd2lsbCBjcmVhdGUgdGhlIDk1JSBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBvZiB0aGUgc2VsZWN0ZWQgbW9kZWwuIA0KDQpTb21ldGhpbmcgdG8gbm90ZSBpcyB0aGF0IGFzIG1lbnRpb25lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGhlIHZhcmlhYmxlICJyYWluIiBpbmNsdWRlcyBzZXZlcmFsIGVudHJpZXMgd2l0aCBhIHZhbHVlIG9mIHplcm8uIFNpbmNlIG91ciBmaW5hbCBtb2RlbCBpcyBhIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uLCB3ZSBjYW4gbm90IGhhdmUgYSBsb2cgb2YgemVybyBiZWNhdXNlIGxvZygwKSBpcyBhbiB1bmRlZmluZWQgdmFsdWUsIHNvIHRoaXMgbGVhZHMgdG8gdGhlIGJvb3RzdHJhcCBtZXRob2QgZ2l2aW5nIHRoZSB2YXJpYWJsZSByYWluIGEgdmFsdWUgb2YgTkEuIEhvd2V2ZXIsIHRoZSBvdGhlciBpbmRlcGVuZGVudCB2YXJpYWJsZXMgZG8gbm90IGhhdmUgdGhpcyBpc3N1ZSBvZiBoYXZpbmcgc2V2ZXJhbCB6ZXJvIHZhbHVlcyBpbiB0aGVpciBlbnRyaWVzLCBzbyB3ZSBjYW4gb2JzZXJ2ZSB0aGVpciBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgYmVsb3cuIA0KDQpgYGB7cn0NCm51bS5wYXJhbSA9IGRpbShjb2VmLm1hdHJpeClbMl0gDQpib290Yy5jaSA9IE5VTEwNCmJvb3RjLndkID0gTlVMTA0KZm9yIChpIGluIDE6bnVtLnBhcmFtKXsNCiAgbGNpLjAyNSA9IHJvdW5kKHF1YW50aWxlKGNvZWYubWF0cml4WywgaV0sIDAuMDI1LCB0eXBlID0gMiwgbmEucm0gPSBUUlVFKSw4KQ0KICB1Y2kuOTc1ID0gcm91bmQocXVhbnRpbGUoY29lZi5tYXRyaXhbLCBpXSwwLjk3NSwgdHlwZSA9IDIsIG5hLnJtID0gVFJVRSApLDgpDQogIGJvb3RjLndkW2ldID0gIHVjaS45NzUgLSBsY2kuMDI1DQogIGJvb3RjLmNpW2ldID0gcGFzdGUoIlsiLCByb3VuZChsY2kuMDI1LDQpLCIsICIsIHJvdW5kKHVjaS45NzUsNCksIl0iKQ0KIH0NCmthYmxlKGFzLmRhdGEuZnJhbWUoY2JpbmQoZm9ybWF0QyhjbXRyeCw0LGZvcm1hdD0iZiIpLCBib290Yy5jaS45NT1ib290Yy5jaSkpLA0KICAgICAgY2FwdGlvbiA9ICJSZWdyZXNzaW9uIENvZWZmaWNpZW50IE1hdHJpeCIpDQpgYGANCg0KV2UgY2FuIHNlZSB0aGUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG9mIHRoZSB2YXJpYWJsZXMgYWxvbmcgd2l0aCB0aGUgaW50ZXJjZXB0IG9mIHRoZSBmaW5hbCBsb2dhcml0aG1pYyBtb2RlbCBvZiB0aGUgZGF0YS4gVGhlc2UgY29uZmlkZW5jZSBpbnRlcnZhbHMgdXNlIGJvb3RzdHJhcHBpbmcgY2FzZXMgaW4gb3JkZXIgdG8gZmluZCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cy4gSW4gdGhlIGFib3ZlIHRhYmxlLCB3ZSBjYW4gc2VlIHRoZSB0ZXN0IHN0YXRpc3RpY3MgYW5kIHRoZSBwLXZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMuIFdlIGNhbiBhbHNvIHNlZSB0aGUgOTUlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBmb3IgZWFjaCBvZiB0aGUgdmFyaWFibGVzIGFsb25nIHdpdGggdGhlIGludGVyY2VwdCBmcm9tIHRoZSB1c2Ugb2YgYm9vdHN0cmFwcGluZyBjYXNlcy4gDQoNClNvbWV0aGluZyBpbnRlcmVzdGluZyB0byBub3RlIGlzIHRoYXQgdGhlIHZhcmlhYmxlcyBYLCBZLCBEQywgdGVtcCwgUkgsIHdpbmQsIGFuZCByYWluIGFsbCBjb250YWluIHplcm8gaW4gdGhlaXIgOTUlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscywgbWVhbmluZyB0aGF0IG9uIHRoZWlyIG93biB0aGV5IGFyZSBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gSG93ZXZlciwgdGhlIDk1JSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIGludGVyY2VwdCBkb2VzIGNvbnRhaW4gemVybywgbWVhbmluZyB0aGF0IHRoZSBjb21iaW5lZCBsb2dhcml0aG1pYyBtb2RlbCBvZiBhbGwgdGhlc2UgdmFyaWFibGVzIGluIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgd2hpY2ggbWF0Y2hlcyB1cCB3aXRoIHdoYXQgd2FzIHNob3duIGVhcmxpZXIgd2hlbiBjb25zdHJ1Y3RpbmcgdGhpcyBmaW5hbCBtb2RlbC4gVGhpcyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgdGhlIG92ZXJhbGwgbW9kZWwgY2FuIGJlIHNlZW4gYnkgdGhlIHAtdmFsdWUgb2YgcCA9IDAuMDAxNC4gDQoNCg0KDQojIyBCb290c3RyYXAgUmVzaWR1YWxzDQoNCkluIHRoaXMgc2VjdGlvbiwgd2Ugd2lsbCB1c2UgdGhlIGJvb3RzdHJhcCByZXNpZHVhbCBtZXRob2QgdG8gY29uc3RydWN0IHRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFdlIHdpbGwgZmlyc3QgdGFrZSBhIGxvb2sgYXQgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcmVzaWR1YWxzIHRoYXQgYXJlIG9idGFpbmVkIGZyb20gdGhlIGJvb3RzdHJhcCBtZXRob2QsIGFuZCB0aGVuIHdlIHdpbGwgY29uc3RydWN0IHRoZSA5NSUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciB0aGUgZGF0YS4gIA0KDQoNCiMjIyBSZXNpZHVhbCBIaXN0b2dyYW0NCg0KTm93IGxldCdzIGNyZWF0ZSBhIGhpc3RvZ3JhbSB0byB2aXN1YWxpemUgdGhlIHJlc2lkdWFscyBvYnRhaW5lZCBmcm9tIHRoZSBib290c3RyYXAgbWV0aG9kLiANCg0KYGBge3J9DQpoaXN0KHNvcnQobG9nLmFyZWEkcmVzaWR1YWxzKSwgbiA9IDUwLA0KICAgICB4bGFiPSJSZXNpZHVhbHMiLA0KICAgICBjb2wgPSAibGlnaHRibHVlIiwNCiAgICAgYm9yZGVyPSJkYXJrb3JjaGlkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW0gb2YgdGhlIFJlc2lkdWFscyIpDQpgYGANCg0KVGhlIGFib3ZlIGhpc3RvZ3JhbSBzaG93cyB0aGF0IHRoZSByZXNpZHVhbCBoaXN0b2dyYW0gYXBwZWFycyBsaWtlIGl0IGlzIGNsb3NlIHRvIGJlaW5nIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBob3dldmVyIGl0IGFwcGVhcnMgbGlrZSB0aGVyZSBpcyBhbiBldmVyLXNvLXNsaWdodGx5IHNrZXcgdG8gdGhlIGxlZnQsIHdpdGggbW9yZSBvZiB0aGUgcmVzaWR1YWxzIHNlZW1pbmcgdG8gb2NjdXIgb24gdGhlIGxlZnQtc2lkZSBvZiB0aGUgaGlzdG9ncmFtLiBBZGRpdGlvbmFsbHksIHRoZXJlIGFyZSBzb21lIG9ic2VydmF0aW9ucyB3aGljaCBhcmUgc2xpZ2h0bHkgb2ZmIHRvIHRoZSBlbmQsIHNwZWNpZmljYWxseSB0aGUgdHdvIG9ic2VydmF0aW9ucyB0byB0aGUgcmlnaHQgb2YgeCA9IDQgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBhbmQgdGhlIG9uZSBvYnNlcnZhdGlvbiB0byB0aGUgdmVyeSBsZWZ0IG9mIHggPSAtNCBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgd2hpY2ggY291bGQgYmUgdmVyeSBzbGlnaHQgcG90ZW50aWFsIG91dGxpZXJzLiBIb3dldmVyLCB0aGVzZSBvYnNlcnZhdGlvbnMgZG8gbm90IGxvb2sgdG9vIHNldmVyZSBzbyBpdCBpcyBub3QgYSBtYWpvciBjYXVzZSBmb3IgY29uY2Vybi4gT3ZlcmFsbCwgdGhlIHJlc2lkdWFscyBzZWVtcyB0byBmYWxsIGNsb3NlIHRvIHRoYXQgb2YgYSBub3JtYWwgZGlzdHJpYnV0aW9uLA0KDQpJbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24sIHdlIHdpbGwgdXNlIHRoZXNlIHJlc2lkdWFscyB0byBjb25kdWN0IHRoZSBwcm9jZXNzIG9mIHRha2luZyByZXNpZHVhbCBib290c3RyYXAgc2FtcGxlcy4gV2Ugd2lsbCB1c2UgdGhlc2Ugc2FtcGxlcyB0byBlc3RpbWF0ZSB0aGUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgaW4gb3VyIGZpbmFsIG1vZGVsLiANCg0KDQojIyMgUmVzaWR1YWwgQm9vdHN0cmFwIFJlZ3Jlc3Npb24gYW5kIEZpbmRpbmcgQm9vdHN0cmFwIENvbmZpZGVuY2UgSW50ZXJ2YWxzDQoNCk5vdywgbGV0J3MgY3JlYXRlIHRoZSA5NSUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG9mIHRoZSBib290c3RyYXAgcmVncmVzc2lvbiBjb2VmZmljaWVudHMuIA0KDQpgYGB7cn0NCmxvZy5hcmVhID0gbG0obG9nKGFyZWEpIH4gWCArIFkgKyBEQyArIHRlbXAgKyBSSCArIHdpbmQgKyByYWluLCAgZGF0YSA9IGZpbmFsLmRhdGEpDQptb2RlbC5yZXNpZCA9IGxvZy5hcmVhJHJlc2lkdWFscw0KIyBXZSB3aWxsIHVzZSAxLDAwMCBib290c3RyYXAgc2FtcGxlcy4NCkI9MTAwMA0KbnVtLnBhcmFtID0gZGltKG1vZGVsLm1hdHJpeChsb2cuYXJlYSkpWzJdIA0Kc2FtcC5udW0gPSBkaW0obW9kZWwubWF0cml4KGxvZy5hcmVhKSlbMV0gIA0KYnRyLm10cnggPSBtYXRyaXgocmVwKDAsOCpCKSwgbmNvbD1udW0ucGFyYW0pDQpmb3IgKGkgaW4gMTpCKXsNCiAgYnQubG9nLmFyZWEgPSBsb2cuYXJlYSRmaXR0ZWQudmFsdWVzICsgDQogICAgICAgIHNhbXBsZShsb2cuYXJlYSRyZXNpZHVhbHMsIHNhbXAubnVtLCByZXBsYWNlID0gVFJVRSkgIA0KICBmaW5hbC5kYXRhJGJ0LmxvZy5hcmVhID0gIGJ0LmxvZy5hcmVhDQogIGJ0ci5tb2RlbCA9IGxtKGJ0LmxvZy5hcmVhIH4gWCArIFkgKyBEQyArIHRlbXAgKyBSSCArIHdpbmQgKyByYWluLCBkYXRhID0gZmluYWwuZGF0YSkNCiAgYnRyLm10cnhbaSxdPWJ0ci5tb2RlbCRjb2VmZmljaWVudHMNCn0NCmBgYA0KDQpXZSB3aWxsIGNyZWF0ZSBoaXN0b2dyYW1zIGZvciBlYWNoIG9mIG91ciByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyB0byBoZWxwIHVzIHZpc3VhbGl6ZSBvdXIgYm9vdHN0cmFwIHJlc2lkdWFscyBmb3Igb3VyIG1vZGVsLiANCg0KYGBge3J9DQpib290Lmhpc3QgPSBmdW5jdGlvbihib290LmNvZWYubWF0cml4LCB2YXIuaWQsIHZhci5ubSl7DQogIHgxLjEgPC0gc2VxKG1pbihib290LmNvZWYubWF0cml4Wyx2YXIuaWRdKSwgICBtYXgoYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSksIGxlbmd0aD0zMDAgKQ0KICB5MS4xIDwtIGRub3JtKHgxLjEsIG1lYW4oYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSksIHNkKGJvb3QuY29lZi5tYXRyaXhbLHZhci5pZF0pKQ0KICBoaWdoZXN0YmFyID0gbWF4KGhpc3QoYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSwgcGxvdCA9IEZBTFNFKSRkZW5zaXR5KSANCiAgeWxpbWl0IDwtIG1heChjKHkxLjEsaGlnaGVzdGJhcikpDQogIGhpc3QoYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSwgcHJvYmFiaWxpdHkgPSBUUlVFLCBtYWluID0gdmFyLm5tLCB4bGFiPSIiLCANCiAgICAgICBjb2wgPSAiYWxpY2VibHVlIix5bGltPWMoMCx5bGltaXQpLCBib3JkZXI9ImRlZXBwaW5rIikNCiAgbGluZXMoeCA9IHgxLjEsIHkgPSB5MS4xLCBjb2wgPSAiZGFya29yY2hpZCIpDQogIGxpbmVzKGRlbnNpdHkoYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSwgYWRqdXN0PTIpLCBjb2w9ImJsdWUiKSAgIA0KfSANCmBgYA0KDQpXZSB3aWxsIG5vdyBjcmVhdGUgdGhlIHJlc2lkdWFsIGJvb3RzdHJhcCBoaXN0b2dyYW1zIGZvciB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgb2Ygb3VyIG1vZGVsLiANCg0KYGBge3J9DQpwYXIobWZyb3c9YygyLDMpKQ0KIyBCb290c3RyYXAgaGlzdG9ncmFtcw0KYm9vdC5oaXN0KGJvb3QuY29lZi5tYXRyaXg9YnRyLm10cngsIHZhci5pZD0xLCB2YXIubm0gPSJJbnRlcmNlcHQiKQ0KYm9vdC5oaXN0KGJvb3QuY29lZi5tYXRyaXg9YnRyLm10cngsIHZhci5pZD0yLCB2YXIubm0gPSJYIikNCmJvb3QuaGlzdChib290LmNvZWYubWF0cml4PWJ0ci5tdHJ4LCB2YXIuaWQ9MywgdmFyLm5tID0iWSIpDQpib290Lmhpc3QoYm9vdC5jb2VmLm1hdHJpeD1idHIubXRyeCwgdmFyLmlkPTQsIHZhci5ubSA9IkRDIikNCmJvb3QuaGlzdChib290LmNvZWYubWF0cml4PWJ0ci5tdHJ4LCB2YXIuaWQ9NSwgdmFyLm5tID0idGVtcCIpDQpib290Lmhpc3QoYm9vdC5jb2VmLm1hdHJpeD1idHIubXRyeCwgdmFyLmlkPTYsIHZhci5ubSA9IlJIIikNCmJvb3QuaGlzdChib290LmNvZWYubWF0cml4PWJ0ci5tdHJ4LCB2YXIuaWQ9NywgdmFyLm5tID0id2luZCIpDQpib290Lmhpc3QoYm9vdC5jb2VmLm1hdHJpeD1idHIubXRyeCwgdmFyLmlkPTgsIHZhci5ubSA9InJhaW4iKQ0KYGBgDQoNCldlIGNhbiBzZWUgdGhhdCB0aGUgaGlzdG9ncmFtcyBtb3N0bHkgZm9sbG93IGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIG9mIG91ciBtb2RlbC4gSnVzdCBsaWtlIGJlZm9yZSB3aGVuIGNyZWF0aW5nIGhpc3RvZ3JhbXMgZm9yIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBpbiB0aGUgYm9vdHN0cmFwIGNhc2VzLCB0aGVyZSBhcmUgdHdvIGN1cnZlcyBvbiB0aGVzZSBoaXN0b2dyYW1zLCBhIGJsdWUgYW5kIGEgcHVycGxlIGN1cnZlLiBUaGUgYmx1ZSBjdXJ2ZSBpcyBhIG5vbi1wYXJhbWV0cmljIGRlbnNpdHkgZXN0aW1hdGUgb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgd2Ugd2lsbCBjYWxjdWxhdGUgc2hvcnRseSBhcmUgYmFzZWQgdXBvbiB0aGlzIG5vbi1wYXJhbWV0cmljIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoZSBwdXJwbGUgY3VydmUgaXMgYSBtZWFzdXJlIG9mIHRoZSBlc3RpbWF0ZSBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mIHRoZWlyIHN0YW5kYXJkIGVycm9yLiBUaGUgcC12YWx1ZXMgZ2l2ZW4gaW4gdGhlIHJlZ3Jlc3Npb24gb3V0cHV0IGFyZSB0YWtlbiBmcm9tIHRoaXMgY3VydmUuDQoNCg0KIyMjIEJvb3RzdHJhcCBDb25maWRlbmNlIEludGVydmFscyBVc2luZyBCb290c3RyYXAgUmVzaWR1YWxzDQoNCk5leHQsIHdlIHdpbGwgY2FsY3VsYXRlIHRoZSA5NSUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGJ5IHRoZSB1c2Ugb2YgdGhlIGJvb3RzdHJhcCByZXNpZHVhbHMuIA0KDQpgYGB7cn0NCm51bS5wYXJhbSA9IGRpbShjb2VmLm1hdHJpeClbMl0gIA0KYm9vdHIuY2kgPSBOVUxMDQpib290ci53ZCA9IE5VTEwNCmZvciAoaSBpbiAxOm51bS5wYXJhbSl7DQogIGxjaS4wMjUgPSByb3VuZChxdWFudGlsZShidHIubXRyeFssIGldLCAwLjAyNSwgdHlwZSA9IDIpLDgpDQogIHVjaS45NzUgPSByb3VuZChxdWFudGlsZShidHIubXRyeFssIGldLDAuOTc1LCB0eXBlID0gMiApLDgpDQogIGJvb3RyLndkW2ldID0gdWNpLjk3NSAtIGxjaS4wMjUNCiAgYm9vdHIuY2lbaV0gPSBwYXN0ZSgiWyIsIHJvdW5kKGxjaS4wMjUsNCksIiwgIiwgcm91bmQodWNpLjk3NSw0KSwiXSIpDQp9DQprYWJsZShhcy5kYXRhLmZyYW1lKGNiaW5kKGZvcm1hdEMoY210cngsNCxmb3JtYXQ9ImYiKSwgYm9vdHIuY2kuOTU9Ym9vdHIuY2kpKSwgDQogICAgICBjYXB0aW9uID0gIlJlZ3Jlc3Npb24gQ29lZmZpY2llbnQgTWF0cml4IG9mIDk1JSBSZXNpZHVhbCBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbHMiKQ0KYGBgDQoNCkFib3ZlIHdlIGNhbiBzZWUgdGhlIG91dHB1dCB0YWJsZSBmb3IgdGhlIDk1JSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgYnkgdGhlIHVzZSBvZiB0aGUgYm9vdHN0cmFwIHJlc2lkdWFscyBtZXRob2QuIFRoaXMgdGFibGUgaW5jbHVkZXMgdGhlIDk1JSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIGVhY2ggb2YgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGluIG91ciBmaW5hbCBtb2RlbC4gT25jZSBhZ2FpbiB3ZSBjYW4gc2VlIHRoYXQgYWxsIG9mIHRoZSBjb25maWRlbmNlIGludGVydmFscyBmb3IgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGNvbnRhaW4gemVybyBleGNlcHQgZm9yIHRoYXQgb2YgdGhlIGludGVyY2VwdC4gVGhpcyBtYXRjaGVzIHVwIHdpdGggb3VyIHByZXZpb3VzIGFuYWx5c2lzIG9mIHRoZSBtb2RlbCB0aGF0IGFsdGhvdWdoIHRoZSBpbmRpdmlkdWFsIHZhcmlhYmxlcyBkbyBub3Qgc2hvdyBzdGF0aXN0aWNhbCBzaWduaWZpY2FudCwgdGhlaXIgY29tYmluYXRpb24gaW4gdGhlIG92ZXJhbGwgbG9nYXJpdGhtaWMgbW9kZWwgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgd2hpY2ggY2FuIGJlIHNlZW4gYnkgdGhlIHAtdmFsdWUgb2YgcCA9IDAuMDAxNC4gDQoNCg0KDQoNCiMgQ29tYmluaW5nIHRoZSBSZXN1bHRzIG9mIHRoZSBSZWd1bGFyIE1vZGVsIGFuZCB0aGUgQm9vdHN0cmFwIFJlc3VsdHMNCg0KTm93IHRoYXQgd2UgaGF2ZSBjcmVhdGVkIGJvdGggYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHVzaW5nIGJvb3RzdHJhcCBjYXNlcyBhbmQgdXNpbmcgYm9vdHN0cmFwIHJlc2lkdWFscywgbGV0J3MgY29tYmluZSB0aGVzZSByZXN1bHRzIGludG8gb25lIHRhYmxlIHRvIHNob3cgdGhlIGNvbWJpbmVkIGluZmVyZW50aWFsIHN0YXRpc3RpY3MuIA0KDQpgYGB7cn0NCmthYmxlKGFzLmRhdGEuZnJhbWUoY2JpbmQoZm9ybWF0QyhjbXRyeFssLTNdLDQsZm9ybWF0PSJmIiksIGJvb3RjLmNpLjk1PWJvb3RjLmNpLGJvb3RyLmNpLjk1PWJvb3RyLmNpKSksIA0KICAgICAgY2FwdGlvbj0iQ29tYmluZWQgSW5mZXJlbnRpYWwgU3RhdGlzdGljcy0gQm9vdHN0cmFwIENvbmZpZGVuY2UgSW50ZXJ2YWxzIFxuIChCb290c3RyYXAgQ2FzZXMgYW5kIFJlc2lkdWFscykgYW5kIHAtdmFsdWVzIikNCmBgYA0KDQpUaGUgdGFibGUgYWJvdmUgY29tYmluZXMgdGhlIHJlc3VsdHMgZm9yIHRoZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzIG9mIHRoZSBib290c3RyYXAgbWV0aG9kLiBUaGUgdGFibGUgaW5jbHVkZXMgdGhlIHAtdmFsdWVzIG9mIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBhbmQgdGhlaXIgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyB1c2luZyBib290c3RyYXAgY2FzZXMgKGJvb3RjLmNpLjk1KSBhbmQgdGhlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyB1c2luZyBib290c3RyYXAgcmVzaWR1YWxzIChib290ci5jaS45NSkuIA0KDQpXZSBjYW4gc2VlIGluIHRoaXMgb3V0cHV0IHRhYmxlIHRoYXQgYm90aCBtZXRob2RzIG9mIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyB5aWVsZCB0aGUgc2FtZSByZXN1bHRzIGluIHJlZ2FyZHMgdG8gdGhlIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBvZiB0aGUgb3ZlcmFsbCBtb2RlbC4gQXMgd2FzIHN0YXRlZCBwcmV2aW91c2x5IGluIHRoZSBhbmFseXNpcyBvZiB0aGUgbG9nKGFyZWEpIG1vZGVsLCBhbHRob3VnaCBpdCBzZWVtcyB0aGF0IHRoZSBpbmRpdmlkdWFsIHZhcmlhYmxlcyBkbyBub3Qgc2hvdyBub3RhYmxlIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSwgYXMgYWxsIG9mIHRoZWlyIHAtdmFsdWVzIGFyZSBncmVhdGVyIHRoYW4gb3VyIGFscGhhIG9mIDAuMDUsIHRoZWlyIGNvbWJpbmVkIGVmZmVjdCBpbiB0aGUgb3ZlcmFsbCBtb2RlbCBkb2VzIHNob3cgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHdpdGggYSBwLXZhbHVlIG9mIHAgPSAwLjAwMTQuIFRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgZnVydGhlciBzdHJlbmd0aGVuIHRoaXMgcG9pbnQgYXMgYWxsIG9mIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBmb3IgdGhlIHZhcmlhYmxlcyBpbmNsdWRlIHplcm8gaW4gdGhlaXIgY29uZmlkZW5jZSBpbnRlcnZhbHMgaW5kaWNhdGluZyB0aGF0IHRoZXkgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IG9uIHRoZWlyIG93bi4gSG93ZXZlciwgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBpbnRlcmNlcHQgZG9lcyBub3QgaW5jbHVkZSB6ZXJvIGluZGljYXRpbmcgdGhhdCBpdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHdoaWNoIGNhbiBiZSBzZWVuIGJ5IGl0cyBwLXZhbHVlIG9mIHAgPSAwLjAwMTQuIFRoaXMgdmFsaWRhdGVzIG91ciBhbmFseXNpcyBvZiB0aGUgZmluYWwgbW9kZWwgYW5kIGl0cyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UuIA0KDQpXZSBjYW4gY3JlYXRlIGEgdGFibGUgdG8gc2hvdyB0aGUgd2lkdGhzIG9mIHRoZSA5NSUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciBib3RoIHRoZSBib290c3RyYXAgY2FzZXMgbWV0aG9kIGFuZCB0aGUgYm9vdHN0cmFwIHJlc2lkdWFscyBtZXRob2QuDQoNCmBgYHtyfQ0Ka2FibGUocm91bmQoY2JpbmQoYm9vdGMud2QsIGJvb3RyLndkKSw0KSwgY2FwdGlvbj0iOTUlIEJvb3RzdHJhcCBDb25maWRlbmNlIEludGVydmFscyBXaWR0aC0gXG4gQm9vdHN0cmFwIENhc2VzIGFuZCBCb290c3RyYXAgUmVzaWR1YWxzIikNCmBgYA0KDQpUaGUgdGFibGUgYWJvdmUgc2hvd3MgdGhlIHdpZHRoIGZvciBib3RoIG9mIHRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCBtZXRob2RzIGZvciB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgb2YgdGhlIGZpbmFsIG1vZGVsLiBGb3IgYm90aCBvZiB0aGVzZSB0d28gbWV0aG9kcyBmb3IgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIHdpZHRocyBhcmUgc2ltaWxhciBmb3IgdGhlIHR3byBtZXRob2RzIHNob3dpbmcgdGhhdCB0aGV5IGFyZSBjb25zaXN0ZW50IHdpdGggb25lIGFub3RoZXIuIA0KDQoNCiMjIEZpbmFsIE1vZGVsIFJlcG9ydA0KDQpOb3cgdGhhdCB3ZSBoYXZlIGxvb2tlZCBhdCB2YXJpb3VzIG1ldGhvZHMgb2YgYW5hbHl6aW5nIG91ciBmaW5hbCByZWdyZXNzaW9uIG1vZGVsLCBsZXQncyBjcmVhdGUgYSBmaW5hbCB0YWJsZSBvZiB0aGUgaW5mZXJlbnRpYWwgc3RhdGlzdGljcy4gDQoNCmBgYHtyfQ0Ka2FibGUoY210cngsIGNhcHRpb24gPSAiSW5mZXJlbnRpYWwgU3RhdGlzdGljcyBvZiB0aGUgRmluYWwgUmVncmVzc2lvbiBNb2RlbCIpDQpgYGANCg0KVGhlIHRhYmxlIGFib3ZlIHNob3dzIHRoZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzIG9mIG91ciBmaW5hbCBtb2RlbCB3aGljaCBhbGxvd3MgdXMgdG8gdmVyaWZ5IHRoZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgaXQgb25lIG1vcmUgdGltZS4gT3VyIG1vZGVsIGZvciB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgYXJlYSBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiANCg0KVGhlIGVxdWF0aW9uIG9mIG91ciBmaW5hbCBtb2RlbCBpczoNCmxvZyhhcmVhKSA9IDIuNDgzNSArIDAuMDIxMiAqIFggLSAwLjAzNjggKiBZICsgMC4wMDAxICogREMgLSAwLjAxODIgKiB0ZW1wIC0gMC4wMDk4ICogUkggKyAwLjAzNTcgKiB3aW5kICsgMC4wOTExICogcmFpbi4NCg0KVGhlIGNvbWJpbmF0aW9uIG9mIFgsIFksIERDLCB0ZW1wLCB0ZW1wLCBSSCwgd2luZCwgYW5kIHJhaW4gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudGx5IHByZWRpY3RlZCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgYXJlYSwgcCA9IDAuMDAxNC4gVGhpcyBtb2RlbCBoYXMgZ29vZCB1dGlsaXR5IGZvciBwcmVkaWNpdGlvbiBhbmQgZXN0aW1hdGlvbi4gDQoNCg0KIyMgSW50ZXJwcmV0YXRpb25zIG9mIHRoZSBSZWdyZXNzaW9uIENvZWZmaWNpZW50cyANCg0KVXNpbmcgdGhlIGZpbmFsIGluZmVyZW50aWFsIHN0YXRpc3RpY3MsIHdlIGNhbiBhbmFseXplIHRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBpbiB0aGUgZmluYWwgIG1vZGVsIHdpdGggdGhlaXIgYWZmZWN0IG9uIGFyZWEuIEFzIHdhcyBzdGF0ZWQgcHJldmlvdXNseSBpbiB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb24gc2VjdGlvbiBvZiB0aGlzIHByb2plY3QsIHRoZSBtZWFzdXJlbWVudHMgZm9yIGFyZWEgYXJlIGdpdmVuIGluIGhlY3RhcmVzLiBBZGRpdGlvbmFsbHksIHNpbmNlIG91ciBmaW5hbCBtb2RlbCBzZWxlY3RlZCBpcyBhIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uLCB0aGVzZSBpbnRlcnByZXRhdGlvbnMgd2lsbCBiZSBsb29raW5nIGF0IHRoZSBlZmZlY3RzIG9mIHRoZXNlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBvbiB0aGUgbG9nIG9mIGFyZWEuIA0KDQoqIFg6IEZvciBldmVyeSBhZGRpdGlvbmFsIDEgY29vcmRpbmF0ZSBtb3ZlbWVudCB0byB0aGUgcmlnaHQsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAyMTIgaGVjdGFyZXMuDQoNCiogWTogRm9yIGV2ZXJ5IGFkZGl0aW9uYWwgMSBjb29yZGluYXRlIG1vdmVtZW50IHVwd2FyZHMsIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDM2OCBoZWN0YXJlLg0KDQoqIERDOiBGb3IgZXZlcnkgYWRkaXRpb25hbCAxIHVuaXQgaW5jcmVhc2Ugb2YgREMsIHRoZSBtZWFzdXJlIG9mIHRoZSBtb2lzdHVyZSBjb250ZW50IG9mIGNvbXBhY3Qgb3JnYW5pYyBsYXllcnMgaW4gdGhlIGFyZWEgYWZmZWN0ZWQgYnkgdGhlIGZpcmUsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAwMDEgaGVjdGFyZS4NCg0KKiB0ZW1wOiBGb3IgZXZlcnkgMSBkZWdyZWUgQ2Vsc2l1cyBpbmNyZWFzZSBpbiB0ZW1wZXJhdHVyZSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDE4MiBoZWN0YXJlLg0KDQoqIFJIOiBGb3IgZXZlcnkgMSBwZXJjZW50YWdlIGluY3JlYXNlIGluIHRoZSByZWxhdGl2ZSBodW1pZGl0eSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDA5OCBoZWN0YXJlLg0KDQoqIHdpbmQ6IEZvciBldmVyeSAxIGtpbG9tZXRlciBwZXIgaG91ciBpbmNyZWFzZSBpbiB0aGUgc3BlZWQgb2YgdGhlIHdpbmQsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAzNTcuDQoNCiogcmFpbjogRm9yIGV2ZXJ5IDEgbW0vbV4yIGluY3JlYXNlIGluIHRoZSByYWluIG9jY3VycmluZywgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgaW5jcmVhc2VzIGJ5IDAuMDkxMS4NCg0KV2UgY2FuIHNlZSB0aGF0IHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgcG9zaXRpdmVseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgYXJlIFgsIERDLCB3aW5kLCBhbmQgcmFpbi4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhcyB0aGVzZSB2YXJpYWJsZXMgaW5jcmVhc2UsIHNvIGRvZXMgdGhlIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIG5lZ2F0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGFyZSBZLCB0ZW1wLCBhbmQgUkguIFRoaXMgaW5kaWNhdGVzIHRoYXQgYXMgdGhlc2UgdmFyaWFibGVzIGluY3JlYXNlLCB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZSBkZWNyZWFzZXMuDQoNCg0KDQoNCiMgU3VtbWFyeSBhbmQgRGlzY3Vzc2lvbg0KDQpPdmVyYWxsLCB0aHJvdWdoIHRoZSBjcmVhdGlvbiBvZiBvdXIgZmluYWwgbW9kZWwsIGFuZCB0aHJvdWdoIHRoZSB1c2Ugb2YgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCB3ZSB3ZXJlIGFibGUgdG8gY29uY2x1ZGUgdGhlIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBvZiBvdXIgb3ZlcmFsbCBmaW5hbCBtb2RlbC4gVGhlIGxvZyhhcmVhKSBtb2RlbCB0aGF0IHdhcyBjaG9zZW4gc2hvd2VkIGl0c2VsZiB0byBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHdpdGggYSBwLXZhbHVlIG9mIHAgPSAwLjAwMTQuIFRoaXMgd2FzIHZlcmlmaWVkIHRocm91Z2ggdGhlIGNyZWF0aW9uIG9mIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyB1c2luZyBib3RoIHRoZSBtZXRob2RzIG9mIGJvb3RzdHJhcHBpbmcgY2FzZXMgYW5kIGJvb3RzdHJhcCByZXNpZHVhbHMuIA0KDQpUaGUgZXF1YXRpb24gb2Ygb3VyIGZpbmFsIG1vZGVsIGlzIGdpdmVuIGJ5Og0KbG9nKGFyZWEpID0gMi40ODM1ICsgMC4wMjEyICogWCAtIDAuMDM2OCAqIFkgKyAwLjAwMDEgKiBEQyAtIDAuMDE4MiAqIHRlbXAgLSAwLjAwOTggKiBSSCArIDAuMDM1NyAqIHdpbmQgKyAwLjA5MTEgKiByYWluLg0KDQpUaGlzIG1vZGVsIHNob3dlZCBpdHNlbGYgdG8gYmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhcmVhIGFmZmVjdGVkIGJ5IGZvcmVzdCBmaXJlcyB3aXRoIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBwLXZhbHllIG9mIHAgPSAwLjAwMTQuDQoNCg0KDQojIyBBbnN3ZXJpbmcgdGhlIFJlc2VhcmNoIFF1ZXN0aW9ucw0KDQpFYXJsaWVyIGluIHRoaXMgcmVwb3J0LCBzb21lIHJlc2VhcmNoIHF1ZXN0aW9ucyB3ZXJlIGRpc2N1c3NlZCBhbmQgdGhlc2Ugd2VyZSBjb25zaWRlcmVkIHdoaWxlIGFuYWx5emluZyB0aGUgZGF0YSBhbmQgaXRzIHJlc3VsdHMuIE5vdyB0aGF0IG91ciBtb2RlbCBoYXMgYmVlbiB0aG9yb3VnaGx5IGFuYWx5emVkLCBsZXQncyBnbyBiYWNrIGFuZCBzZWUgaWYgd2UgY2FuIG5vdyBhbnN3ZXIgdGhlc2UgcmVzZWFyY2ggcXVlc3Rpb25zIGZvciB0aGlzIHByb2plY3QuIA0KDQoNCiogV2hpY2ggZmFjdG9ycyBoYXZlIHRoZSBncmVhdGVzdCBzaWduaWZpY2FuY2UgaW4gcHJlZGljdGluZyB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZT8NCg0KQXMgd2FzIGZvdW5kIHRocm91Z2ggdGhlIGFuYWx5c2lzIG9mIG91ciBmaW5hbCBtb2RlbCwgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIHRoZW1zZWx2ZXMgZGlkIG5vdCBzaG93IHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSwgYnV0IHRoZWlyIGNvbWJpbmVkIGVmZmVjdCBkaWQuIE91dCBvZiB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGVzLCBSSCB3YXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgd2l0aCBhIHAtdmFsdWUgb2YgMC4xOTA1LiBIb3dldmVyLCB0aGlzIHZhbHVlIGlzIHN0aWxsIGFib3ZlIG91ciBhbHBoYSB2YWx1ZSBvZiAwLjA1LiBTbywgYWx0aG91Z2ggdGhlIGluZGl2aWR1YWwgdmFyaWFibGVzIGRpZCBub3Qgc2hvdyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaW4gb3VyIGZpbmFsIG1vZGVsLCB0aGVpciBjb21iaW5lZCBlZmZlY3QgZGlkIHNob3cgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHdpdGggYSBwLXZhbHVlIG9mIHAgPSAwLjAwMTQuDQoNCg0KKiBXaGljaCBmYWN0b3JzIGhhdmUgdGhlIGhpZ2hlc3QgY29ycmVsYXRpb24gd2l0aCBlYWNoIG90aGVyPyBBbmQsIHdoYXQgYXJlIHNvbWUgcG9zc2libGUgZXhwbGFuYXRpb25zIGZvciB0aGVzZSBmYWN0b3JzIGhhdmUgdGhlIGdyZWF0ZXN0IGNvcnJlbGF0aW9uPyANCg0KV2UgZGlkIGhhdmUgc29tZSBmYWN0b3JzIHdpdGggbm90YWJseSBoaWdoIGNvcnJlbGF0aW9uIHdpdGggb25lIGFub3RoZXIuIFRoaXMgbGVkIHRvIHVzIGhhdmluZyB0byBhZGRyZXNzIGFuZCBmaXggbXVsdGljb2xsaW5lYXJpdHkgaXNzdWVzIHdpdGhpbiB0aGUgb3JpZ2luYWwsIGZ1bGwgbW9kZWwuIFRoZSB2YXJpYWJsZXMgRkZNQyBhbmQgSVNJIHdlcmUgaGlnaGx5IGNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyIGFuZCBzbyB3ZXJlIHRoZSB2YXJpYWJsZXMgRE1DIGFuZCBEQy4gVGhlc2UgbXVsdGljb2xsaW5lYXJpdHkgaXNzdWVzIHdlcmUgYWRkcmVzc2VkIHdoZW4gY3JlYXRpbmcgb3VyIGZpbmFsIG1vZGVsLg0KDQoNCiogQXJlIHRoZXJlIGFueSBtYWpvciBvdXRsaWVycyBpbiB0aGUgZGF0YSBzZXQgd2hpY2ggd291bGQgcHJvbXB0IGZ1cnRoZXIgZXhhbWluYXRpb24gdG8gc2VlIHdoYXQgaXMgZ29pbmcgb24gaW4gdGhhdCBvY2N1cnJlbmNlPyANCg0KWWVzLCB0aGlzIGRhdGEgZG9lcyBoYXZlIHNvbWUgb3V0bGllcnMgd2l0aGluIGl0LiBBZGRpdGlvbmFsbHksIGxvb2tpbmcgYXQgdGhlIHJlc2lkdWFsIHBsb3RzIGZvciBvdXIgZmluYWwgbW9kZWwgc2hvd2VkIHRoZSBwcmVzZW5jZSBvZiBzb21lIGhpZ2ggbGV2ZXJhZ2UgcG9pbnRzIGFzIHdlbGwuIFRoaXMgaXMgc29tZXRoaW5nIHdoaWNoIHdvdWxkIGJlIHdvcnRoIGxvb2tpbmcgaW50byBpbiBmdXJ0aGVyIGV4cGVyaW1lbnRhdGlvbiB0byBzZWUgd2h5IHRoZXJlIGFyZSB0aGVzZSBleHRyZW1lIG9ic2VydmF0aW9ucyB3aXRoaW4gdGhlIGRhdGEgc2V0LiANCg0KDQoqIElzIHRoaXMgZGF0YSBzZXQgZnJvbSBNb250ZXNpbmhvIE5hdGlvbmFsIFBhcmsgYXBwbGljYWJsZSB0byB0aGUgb3ZlcmFsbCBzY29wZSBvZiBmb3Jlc3QgZmlyZXMgYXJvdW5kIHRoZSB3b3JsZD8gSXMgb3VyIGRhdGEgc2V0IHJlcHJlc2VudGF0aXZlIG9mIGZvcmVzdCBmaXJlcyBvZiBhbGwgbG9jYXRpb25zPyANCg0KVGhpcyBpcyBhIHF1ZXN0aW9uIHdoaWNoIHdlIGRvIG5vdCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhbnN3ZXIgd2l0aCBwZXJmZWN0IGFjY3VyYWN5IGJlY2F1c2UgdGhpcyBwcm9qZWN0IG9ubHkgbG9va2VkIGF0IHRoZSBkYXRhIGZvciBNb250ZXNpbmhvIE5hdGlvbmFsIFBhcmssIG5vdCBhbnkgb3RoZXIgcGxhY2VzIGFmZmVjdGVkIGJ5IGZvcmVzdCBmaXJlcy4gSG93ZXZlciwgdGhlIGRhdGEgc2V0IHdhcyBzdWZmaWNpZW50bHkgbGFyZ2Ugc3VnZ2VzdGluZyB0aGF0IGl0IHNlcnZlcyBzaWduaWZpY2FuY2UgaW4gcmVwcmVzZW50aW5nIGl0cyBwb3B1bGF0aW9uLiBXZSBjYW4gbm90IHNheSB3aXRoIHBlcmZlY3QgYWNjdXJhY3kgd2hldGhlciB0aGlzIGRhdGEgc2V0IGRvZXMgb3IgZG9lcyBub3QgcmVwcmVzZW50IGV2ZXJ5IHNpbmdsZSBsb2NhdGlvbiBhZmZlY3RlZCBieSBmb3Jlc3QgZmlyZXMsIGJ1dCB0aGlzIGRhdGEgc2V0IHByb3ZpZGVkIGdyZWF0IHVzZSBpbiBjcmVhdGluZyBhIG1vZGVsIHdoaWNoIGNvbnNpZGVycyB2YXJpb3VzIGZhY3RvcnMgd2hpY2ggY2FuIGFmZmVjdCB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZS4NCg0KKiBIb3cgdXNlZnVsIGlzIHRoZSBtb2RlbCB3ZSB3aWxsIGNyZWF0ZSBpbiBwcmVkaWN0aW5nIHRoZSBhcmVhIGFmZmVjdGVkIGJ5IGEgZm9yZXN0IGZpcmU/IEFuZCwgaG93IGNhbiB0aGlzIGRhdGEgaGVscCB3aXRoIHByZWRpY3RpbmcgcGF0dGVybnMgb2YgZm9yZXN0IGZpcmVzIGluIG9yZGVyIHRvIG1pbmltaXplIHRoZSBkYW1hZ2UgdGhleSBjYXVzZT8NCg0KVGhyb3VnaCB0aGUgYW5hbHlzaXMgYW5kIGNyZWF0aW9uIG9mIHRoZSBmaW5hbCBtb2RlbCwgd2UgZGlkIGZpbmQgdGhhdCBvdXIgbW9kZWwgc2hvd2VkIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBpbiB0aGUgcHJlZGljdGlvbiBhbmQgZXN0aW1hdGlvbiBvZiB0aGUgYXJlYSBhZmZlY3RlZCBieSBmb3Jlc3QgZmlyZXMgd2l0aCBhIHAtdmFsdWUgb2YgcCA9IDAuMDAxNCBpbiBvdXIgZmluYWwgbW9kZWwsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhLiANCg0KDQoNCiMjIEZ1cnRoZXIgRGlzY3Vzc2lvbg0KDQpTb21lIG9mIHRoZSBtYWpvciBmaW5kaW5ncyBvZiB0aGlzIHByb2plY3Qgd2FzIHRoYXQgdGhlIGZpbmFsIG1vZGVsIHRoYXQgd2FzIGNyZWF0ZWQgd2FzIGluIGZhY3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGlzIGZpbmFsIG1vZGVsIGNhbiBiZSB1c2VmdWwgaW4gcHJlZGljdGluZyB0aGUgYXJlYSB0aGF0IHdpbGwgYmUgYWZmZWN0ZWQgYnkgZm9yZXN0IGZpcmVzIGJhc2VkIHVwb24gdGhlIGNvbWJpbmVkIGVmZmVjdCBvZiB0aGUgdmFyaW91cyB2YXJpYWJsZXMgaW4gdGhpcyBtb2RlbC4gVGhpcyBjb3VsZCBiZSBoZWxwZnVsIGZvciBjYWxjdWxhdGluZyBpbiBhZHZhbmNlIGhvdyBtdWNoIGRhbWFnZSBhIGZvcmVzdCBmaXJlIGNvdWxkIHBvdGVudGlhbGx5IGNhdXNlIGJhc2VkIHVwb24gdGhlIGNvbmRpdGlvbnMgb2YgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIGl0IHdpbGwgb2NjdXIuIFRoaXMgY291bGQgYmUgdXNlZCB0byBoZWxwIG1pbmltaXplIHRoZSBkYW1hZ2UgYnkgaGF2aW5nIGtub3dsZWRnZSBpbiBhZHZhbmNlIGFib3V0IHRoZSBkYW1hZ2VzIHdoaWNoIGNvdWxkIG9jY3VyIGJhc2VkIHVwb24gdGhlIGtub3duIGNvbmRpdGlvbnMuIA0KDQoNCg0KIyBDb25jbHVzaW9ucyBhbmQgUmVjb21tZW5kYXRpb25zDQoNCk92ZXJhbGwsIHRoZSBmaW5hbCBtb2RlbCBvZiB0aGlzIHByb2plY3Qgc2hvd2VkIGl0c2VsZiB0byBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGluIGl0cyBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uIG9mIHRoZSBhcmVhIG9mIGxhbmQgYWZmZWN0ZWQgYnkgZm9yZXN0IGZpcmVzIGJhc2VkIHVwb24gYSBjb21iaW5hdGlvbiBvZiBmYWN0b3JzLiBUaGlzIGNvdWxkIHByb3ZpZGUgdXNlIGluIHRoZSBwcmV2ZW50aW9uIG9mIHRoZSBkYW1hZ2VzIGNhdXNlZCBieSBmb3Jlc3QgZmlyZXMgaWYgdGhlIGNvbmRpdGlvbnMgd2VyZSBrbm93biBpbiBhZHZhbmNlLiBCeSBoYXZpbmcgdGhlIGtub3dsZWRnZSBvZiB0aGUgYXJlYSBvZiBsYW5kIHdoaWNoIGNvdWxkIGJlIGltcGFjdGVkIGJ5IGEgZm9yZXN0IGZpcmUgYmFzZWQgdXBvbiB0aGUgY29uZGl0aW9ucyBhdCBoYW5kLCB0aGlzIGNvdWxkIHByb3ZpZGUgcmVzY3VlcnMgd2l0aCBzb21lIGtub3dsZWRnZSBpbiBhZHZhbmNlIHRvIGhlbHAgZmlnaHQgdGhlIGZvcmVzdCBmaXJlcyBhbmQgaG9wZWZ1bGx5IG1pbmltaXplIHRoZSBkYW1hZ2UgY2F1c2VkIGJ5IGhhdmluZyBzb21lIGtub3dsZWRnZSBpbiBhZHZhbmNlIHJlZ2FyZGluZyB0aGUgZGFtYWdlIHBvdGVudGlhbCBvZiB0aGUgZm9yZXN0IGZpcmUuIA0KDQoNClNvbWUgcmVjb21tZW5kYXRpb25zIEkgd291bGQgc3VnZ2VzdCBmb3IgZnVydGhlciBleHBlcmltZW50YXRpb24gYXJlOg0KDQoqIFNpbmNlIHRoZSBkYXRhIGluIHRoaXMgZXhwZXJpbWVudCB3YXMgYWxsIGNvbGxlY3RlZCB3aXRoaW4gTW9udGVzaW5obyBOYXR1cmFsIFBhcmssIGNvbnNpZGVyIGV4cGFuZGluZyB0aGUgZGF0YSBjb2xsZWN0aW9uIHRvIGluY2x1ZGUgb3RoZXIgcGxhY2VzIGFuZCBvdGhlcnMgbmF0dXJhbCBwYXJrcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29uY2x1c2lvbnMgZHJhd24gZnJvbSB0aGlzIGRhdGEgdHJ1bHkgYXJlIGFwcGxpY2FibGUgdG8gYWxsIGZvcmVzdCBmaXJlcyByZWdhcmRsZXNzIG9mIGxvY2F0aW9uLg0KDQoqIENvbnNpZGVyIG90aGVyIGZhY3RvcnMgd2hpY2ggbWF5IGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBhcmVhIGFmZmVjdGVkIGJ5IGZvcmVzdCBmaXJlcy4gU29tZSBpZGVhcyB3aGljaCBjb21lIHRvIG1pbmQgaW5jbHVkZSB0aW1lIGl0IHRha2VzIHRvIHJlYWNoIHRoZSBuZWFyZXN0IGZpcmUgc3RhdGlvbiwgb3RoZXIgd2VhdGhlciBjb25kaXRpb25zIGxpa2Ugc25vdyBvciBmb2csIG9yIHZvbHVtZSwgZGVuc2l0eSwgYW5kIHNpemUgb2YgdGhlIHRyZWVzIG9yIGZvcmVzdCBpbiB0aGUgZ2l2ZW4gYXJlYSB0aGF0IGlzIGFmZmVjdGVkLg0KDQoqIER1ZSB0byB0aGUgdW5wcmVkaWN0YWJsZSBuYXR1cmUgb2YgZm9yZXN0IGZpcmVzIGFuZCBvdGhlciBuYXR1cmFsIGRpc2FzdGVycywgaXQgY2FuIGJlIGhhcmQgdG8gaGF2ZSBwZXJmZWN0IGFjY3VyYWN5IGluIHRoZSBkYXRhIGNvbGxlY3RlZCwgc3BlY2lmaWNhbGx5IHRoZSBwcmVjaXNlIGFuZCBleGFjdCBhcmVhIG9mIGZvcmVzdCB0aGF0IHdhcyBhZmZlY3RlZCwgc28gZnVydGhlciBleHBlcmltZW50cyBjb3VsZCBjb25zaWRlciBleHBhbmRpbmcgdGhlIHNhbXBsZSBzaXplIHRvIGVuc3VyZSB0aGUgYWNjdXJhY3kgb2YgdGhlIHJlc3VsdHMgYW5kIHJlY29yZGluZ3MgaW4gdGhpcyBleHBlcmltZW50LiANCg0KDQpBbHRvZ2V0aGVyLCB0aGUgZmluYWwgbW9kZWwgZm9yIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIHByb3ZpZGVzIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBpbiB0aGUgcHJlZGljdGlvbiBvZiB0aGUgYXJlYSBhZmZlY3RlZCBieSBmb3Jlc3QgZmlyZXMgd2hpY2ggY291bGQgcHJvdmlkZSB1c2UgYnkgaGF2aW5nIGtub3dsZWRnZSBpbiBhZHZhbmNlIG9mIHdoaWNoIGZhY3RvcnMgYXQgaGFuZCBjb3VsZCBsZWFkIHRvIG1vcmUgZGFtYWdlIGZyb20gdGhlIGZvcmVzdCBmaXJlcy4gDQoNCg0KIA0KIyBSZWZlcmVuY2VzDQoNClRoaXMgZGF0YSBzZXQgd2FzIGZvdW5kIG9uIHRoZSB3ZWJzaXRlIGthZ2dsZS5jb20gdW5kZXIgdGhlIGNvbGxlY3Rpb24gb2YgZGF0YSBzZXRzLiBJbmNsdWRlZCBiZWxvdyBpcyB0aGUgY2l0YXRpb24gb2YgdGhlIHdlYnBhZ2Ugb24gd2hpY2ggdGhlIGRhdGEgc2V0IGNhbiBiZSBmb3VuZCBhcyB3ZWxsIGFzIHRoZSB3ZWJwYWdlIHdoaWNoIEkgbG9va2VkIGF0IHRvIGhlbHAgbWUgZmluZCBhIGRhdGEgc2V0IHdoaWNoIGNhdWdodCBteSBpbnRlcmVzdC4NCg0KRGFybGluZ3RvbiwgQS4gKDIwMTcsIFNlcHRlbWJlciA0KS4gRm9yZXN0IGZpcmVzIGRhdGEgc2V0LiBLYWdnbGUuIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvZWxpa3BsaW0vZm9yZXN0LWZpcmVzLWRhdGEtc2V0IA0KDQoNCkt1bWFyIEEuICgyMDIzLCBOb3ZlbWJlciAxMCkuIExpbmVhciBSZWdyZXNzaW9uIERhdGFzZXRzOiBDU1YsIEV4Y2VsLg0KaHR0cHM6Ly92aXRhbGZsdXguY29tL2xpbmVhci1yZWdyZXNzaW9uLWRhdGFzZXRzLWNzdi1leGNlbC8jZ29vZ2xlX3ZpZ25ldHRlDQo=