Notes
- This workbook is intended to load and prepare the key data for analysis for the archive incubation project.
- in general, this is an updated version of script “./src/arc_inc_master.R”
- all code chunk options are set to “echo = FALSE”; see raw .Rmd file for data wrangling code.
Introduction
The laboratory soil incubation is a commonly used technique for
understanding soil carbon dynamics. Soil carbon is a heterogeneous
mixture of organic matter, some of which persists in the soil for months
or years, while some persists for centuries or millenia. The
persistence of soil carbon can be understood through the concept of
different “pools” of carbon that are defined by the mechanism by which
they persist in the soil and are characterized by distinct age
distributions.
Natural abundance radiocarbon provides information about carbon
dynamics on the scale of centuries to millenia, while insight into
decadal scale dynamics can be gained from tracing the pulse of
radiocarbon introduced into the biosphere from nuclear weapons testing
(“bomb-C”) in the mid-20th century. The bomb-C pulse peaked
in the atmosphere in the 1950s (Fig. 1), but due to differential rates
of abiotic incorporation and biological processing, the peak is lagged
in time and dampened in soils. The relative enrichment in bomb-C in
different pools of soil carbon is a useful tool for inferring the
relative rate at which carbon enters and leaves the pool, and for a
homogenous pool it is functionally equivalent to the intrinsic
decomposition rate.
Extracting and measuring the radiocarbon content of specific soil
carbon pools is hampered by spatial and temporal heterogeneity of the
mechanisms that lead to soil carbon persistence, such as physical
occlusion in aggregates, association with minerals, or thermodynamics.
Defining soil carbon pools empirically with techniques such as density,
size, or resistance to chemical attack can be useful, but these methods
also introduce artifacts and likely result in mixtures of pools with
different age distributions. In contrast, although they also introduce
artifacts due to disturbance and potential alteration of the microbial
community, laboratory soil incubations make use of the same
fractionation agent as is found in situ: the microbial community. Measuring the radiocarbon signal of CO2 (Δ14C-CO2)
released in laboratory incubations of bulk soils is a powerful tool for
understanding the relative processing rate of carbon in soil (or
transit time) as it provides an integrated measure of the weighted
contribution to the release flux from pools of soil carbon with distinct
processing rates.
Interpreting Δ14C-CO2
from laboratory soil incubations requires the use of a model. However,
parameterizing these models is challenging, both due to the uncertainty
of the persistence mechanisms themselves as well as a lack of
observational constraints. Radiocarbon observations at a single point in
time are very useful, but due to the curvature of the bomb-C peak there
are two points in time with the same atmospheric radiocarbon value,
leading to multiple model solutions. Adding additional observations of Δ14C-CO2 at multiple points in time can greatly reduce model uncertainty.
Soil archives have already proven to be a valuable source of data for
constraining soil carbon models by providing time series of the change
in soil carbon 14C content. The promise of improving models further by obtaining 14C-CO2
measurements from archived soils is tantalizing, but first the possible
effects of air-drying and rewetting, as well as the effect of the
duration of storage, must be quantified.
We designed an experiment to assess these effects, preliminary results of which are presented in the following report.
Hypotheses and conceptual understanding
If the null hypothesis is disproved, i.e. air-drying and
rewetting (air-dry) or air-drying, rewetting, and storage (air-dry +
storage) have a significant effect on Δ14C-CO2 relative to control samples, there are two possible outcomes: enrichment of the respiration flux or depletion.
In a simple two-pool soil carbon model, the treatment effect can be
conceptualized as a relative change in the contribution of “slower” or
“faster” cycling carbon to the respiration flux observed in control
samples.
Trajectories of the change in Δ14C over time for “slow” and “fast” soil carbon pools are shown below (Fig. 1) in relationship to the Δ14C of the atmosphere and respired CO2 for a theoretical model system.

Fig 1. Modeled trajectories of Δ14C over time in soil carbon pools (fast, slow, respiration flux) in relationship to observed atmospheric Δ14C
Caption: Modeled curves derived from a conceptual two-pool
parallel model system in which inputs are partitioned between faster and
more slowly cycling pools without any tranfers between the pools.
Carbon stocks and pool sizes are based on density fraction data for the
Hainich Forest (Schrumpf et al. 2013); decomposition rates are
chosen to be realistic but are arbitrary. Atmospheric Δ14C
data up to the year 2015 are from Graven et al. (2017), while data
points beyond 2015 use the extrapolation method from Sierra (2018). All
atmospheric data is for the northern hemisphere (zone 2).
The simplest two-pool model is a parallel system: one in which carbon
entering the soil is partitioned between the two pools without any
transfers from one pool to the other. However, even in this simple
system, the same treatment effect can result in either enrichment or
depletion depending on the year the sample was collected. The direction
of change will be dependent on system dynamics, specifically the
intrinsic decomposition rates of the slow and fast pools, while in more
complicated sytems the amount of mixing between the pools will play a
role as well. Potential treatment effects for the same parallel two-pool
model system shown in Fig. 1 are shown below at two points in time
(Fig. 2).

Fig 2. Potential shifts in Δ14C of respired CO2 in response to air-drying and rewetting, or air-drying and rewetting + storage
Caption: Blue and magenta lines show modeled trajectories of Δ14C in fast and slow cycling soil carbon pools (same model as Fig 1), and Δ14C of respired CO2 is shown in yellow. Solid circles show hypothetical observations of 14C or respired CO2 from control incubations, while the open symbols represent two possible scenarios in which 14C-CO2
shifts due to increased contribution from the fast pool (open circles),
or shifts due to increassed contribution from the slow pool (open
squares). Due to the crossing of the blue and magenta lines in 2009,
increased contribution of the slow pool to respiration following
treatment leads to relative depletion of 14C-CO2 in 1991, but relative enrichment of 14C-CO2 in 2019, while the opposite is observed for increased fast pool contribution.
In the above plot (Fig. 2), increased contribution from the slow pool leads to depletion in Δ14C of respiration relative to the control observation in 1991 but relative enrichment in 2019.
Methods and materials
Radiocarbon corrections
Although differences were small, radiocarbon data for archived
samples were first corrected for decay since the year of collection
before assessing treatment effects.
Decay correction formula: 1000⋅((FM⋅e−yearsampled+19508267)−1)
where FM is the fraction modern, and 8267 is the inverse of the product of the natural log of two and the true half life of 14C (5730 y).
Results
Respiration rates
Experiment 1 (air-dry + storage treatment)
Respiration rates increased dramatically following rewetting for the
air-dry + storage treatment in comparison to control samples, similar to
what has been observed in other air-dry/rewetting studies [cite].
However, the magnitude and timing of the peak in respiration rates was
significantly different between grassland and forest sites [statistics;
other forest/grassland studies for comparison?] (Fig. 3).
Among the air-dry + storage samples, respiration rates were more than
twice as high in grassland soils than in forest soils, reaching a
maximum of 3.8 mg CO2 g soil C-1 d-1 after 92 h, followed by a sharp decline. Mean respiration rates in forest sites peaked at 1.5 mg CO2 g soil C-1 d-1
after 166 h, followed by a much more gradual decline than in grassland
sites. Control samples responded more weakly and more gradually to
rewetting, although as in the treatment samples respiration was greater
in grassland soils than in forest soils. Peak respiration rates for
control incubations were 1.9 and 0.6 mg CO2 g soil C-1 d-1 after 115 h for grassland and forest soils, respectively.
Experiment 2 (air-dry treatment, 2019 samples)
Respiration rates for the air-dry only treatment samples showed a
similarly dramatic increase in comparison to the controls as was
observed for the air-dry + storage treatment samples in Experiment 1.
However, unlike the air-dry + storage treatment, peak respiration rates
were not significantly different (p > 0.05) between forest and
grassland soils in Experiment 2, peaking at 3.0 and 3.3 mg CO2 g soil C-1 d-1 after 95 h for grassland and forest soils, respectively (Fig. 3).

Fig. 3. Respiration rates for Experiment 1 (air-dry + storage treatment) and Experiment 2 (air-dry only treatment)
Caption: Top panel shows data from Experiment 1 (air-dry +
storage treatment), bottom panel shows data from Experiment 2 (air-dry
only treatment). Solid lines show mean respiration rates for control
samples and dotted lines show mean respiration rates for treatment
samples. Shaded ribbons show the standard error. The final measurement
points for a few samples which took >18 days to reach CO2
targets are excluded for display reasons. Respiration rates for those
samples remained flat. While daily measurements were made during the
pre-incubation period for the majority of samples, only the cumulative
pre-incubation flux was measued for the 2011 control samples.
Consequently, the respiration rate for the pre-incubation period was
calculated cumulatively for all samples.
Supplemental respiration rates figure:

Fig 4. Respiration rates (daily pre-incubation period measurements)
Caption: Daily measurements made for the treatment samples
in Experiment 1 and for both control and treatment samples in Experiment
2 show that treatment sample respiration rates peaked more rapidly in
grassland soils than in forest soils and was of significantly greater
magnitude in both experiments. Control sample data not shown for
Experiment 1 as only the four day average rate was measured. [Thinking
this plot should go in SI, if we decide to include].
Radiocarbon data
Pre-incubation versus equilibrium respiration 14C-CO2
Despite the significant differences in respiration, and in contrast
to hypothesis 1, we did not observe significant differences between 14C-CO2 respired during the pre-incubation period and 14C-CO2
respired during the equilibrium respiration period: neither for the
air-dry + storage treatment nor for the air-dry treatment alone (Fig. 5).
The interactions with land use was not significant nor was the
interaction with experiment, so all data were pooled for statistical
analysis.

Fig. 5. Pre-incubation period Δ14C against equilibrium respiration period Δ14C
Caption: Points are means of laboratory duplicates and error
bars are the min and max (except for Experiment 1 control samples,
which were not replicated). Note that pre-incubation Δ14C
was not measured for the Experiment 1 control samples; additionally
samples from three of the forest plots of the Experiment 1 treatment
samples (air-dry + storage) failed to accumulate enough CO2 during the pre-incubation period to measure 14C. The outlier point with the substantially depleted pre-incubation Δ14C is from Experiment 2 (control).
Note the one outlier (forest, control) for which the pre-incubation CO2
was substantially depleted relative to equilibrium period respiration.
However, even when this outlier was included in the statistical analysis
the difference between pre-incubation 14C-CO2 and equilibrium 14C-CO2
was not significant. For clarity, this point will be excluded from the
future plots. Due to lower respiration rates during pre-incubation, only
three of the six forest samples in Experiment 1 generated enough CO2 to measure radiocarbon, and additionally, it was not possible to compare pre-incubation and equilibrium respiration 14C-CO2 for the control samples in Experiment 1 since pre-incubation 14C-CO2 was not measured for these samples in 2011.
Treatment effects on observed equilibrium period 14C-CO2
Relative to the controls the air-dry + storage treatment (Experiment 1, open squares in Fig. 6)
led to enrichment in grassland samples, but depletion in forest
samples. In contrast, the air-dry only treatment (Experiment 2, open
circles, Fig. 6) led to enrichment for both forest and grassland samples (2019 points). Treatment effects on 14C-CO2 were signifcant for both forests and grassland soils in Experiment 1 (2011 points, Fig 6), and significant for grassland samples but not forest samples in Experiment 2 (2019 points, Fig. 6). The mean difference in 14C-CO2 between control and treatment samples was greater in grassland samples than in forest samples for both experiments (stats?).
Δ14C of respired CO2 was enriched relative to the atmosphere for all samples in both experiments. Looking across experiments, the decline in 14C-CO2 between 2011 and 2019 paralleled that of atmospheric 14C
for forest control samples and both control and treatment grassland
samples, but was much smaller for the forest treatment samples.

Fig 6. Treatment effect on observed Δ14C-CO2 over time (Experiments 1 and 2)
Caption: Filled circles show 14C-CO2 observed for control samples, while open symbols show 14C-CO2
observed for treament samples (open squares = air-dry + storage
treatment, Experiment 1; open circles = air-dry only treatment,
Experiment 2). Arrows show the direction of change in 14C-CO2 relative to the controls. Points are means and error bars show 2x standard error. The gray line shows Δ14C of the atmosphere.
Effect of cumulative respired carbon on 14CO2
[maybe expand with stats for other explanatory factors? e.g. texture, N content, etc…]
We looked at the possible effect of the amount of carbon respired on the differences between control and treatment 14C-CO2 with a linear regression model and found that the difference in respired carbon (mg CO2-C
g soil C^-1) was not a significant predictor. This can also be seen by
the relatively flat slope of the lines connecting pairs of points in Fig. 7.

Fig. 7. Change in 14C-CO2 in relation to cumulative soil carbon respired
Caption:
- First figure shows data averaged by plot
- (Note that pre-incubation Δ14C was not measured for the 2011 control samples)
- Limits exclude outlier point (HEW22 control pre-incubation) for improved legibility
Storage duration effect on 14C-CO2 (Experiment 3)
- Show the effect of storage duration by plotting the difference between control and treatment 14C
as a function of storage duration. However, the expected Ctl-Trt
difference would also likely have a trend over time. Perhaps plot an
expected trend…? Not sure how much this matters.
- As previously, dashed and dotted lines are plotted to give a sense
of error introduced by the treatment by showing a difference of 20‰ and
40‰ (roughly equivalent to the atmospheric decline over five and 10
years respectively for the period 2000 to 2020)
- Position of points jittered to avoid overplotting; storage duration has been rounded down to the nearest whole year
- In general, the trend in the differences due to treatment for the
highly enriched samples from Oak Ridge, TN suggest losses of the most
recently fixed carbon over the duration of storage
- These samples were included primarily because it was assumed that
they would be more sensitive to potential losses of recently fixed
carbon, as the label should only be present in this pool of soil C
- However, in contrast, there does not seem to be evidence for a storage duration effect in the samples that only contain bomb-C

Fig. 8. Change in 14C-CO2 in relation to cumulative soil carbon respired
Caption:
Treatment effect on 14C-CO2 for all samples (Experiments 1, 2, and 3)
Notes: Show overall effect of treatment on whole data set. * Notes: +
Control data shown on x-axis, treatment data shown on y-axis + Solid
line is 1:1, dashed line is a 20 ‰ offset, and dotted line is a 40‰
offset (roughly equivalent to the atmospheric decline over five and 10
years respectively for the period 2000 to 2020) + Data from all three
experiments conducted in this study are shown, as well as a handful of
additional data points for which both control and treatment
(i.e. after air-drying + storage) incubations were conducted in
another laboratory (Harvard points) + Only A horizon data are shown
here, as owing to sample availabilityonly three samples were analyzed
for organic and B horizons (respectively) + Points are means of
replicates and error bars are min and max of replicates (number of
replicates varies from 1 to 3); note that error bars are not visible at
this scale for most points * Key messages: + Difference between control
and treatment samples is within a 5 year range for the majority of
points + Grassland samples tend to be above 1:1 line, forest samples
below, regardless of site + The three German forest samples above 1:1
line were analyzed in 2019 (air-dry only treatment, this study), lending
support to the interpretation that slow and fast soil C pool curves for
northern hemisphere forest samples have only recently crossed or may
have yet to cross.

Fig. 9. Change in 14C-CO2 in relation to cumulative soil carbon respired
Caption:
Discussion
Random notes here…
Effect of C respired
Several studies have shown that the radiocarbon signature of respired CO2
changes over the duration of an incubation in relationship to the
amount of carbon respired (Bol et al. 2003; Cusack et
al. 2010; Schimel et al. 2011; Mueller et al. 2014).
Incubations in this study were controlled so that the amount of the
total soil C pool respired as CO2 in treatment incubations
was as close as possible to what was respired in control incubations,
but as respiration rates were much higher in treatment sample
incubations, this was only partially feasible.
While both the air-dry + storage (Experiment 1) and air-dry (Experiment 2) treatments had a significant effect on Δ14C-CO2, these changes were not driven by differences in the amount of carbon respired (Fig 7).
LS0tCnRpdGxlOiAiQXJjaGl2ZWQgU29pbCBJbmN1YmF0aW9ucyBQcm9qZWN0IgphdXRob3I6ICJKLiBCZWVtLU1pbGxlciIKZGF0ZTogIjMwIEFwciAyMDIwIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIGNzczogY3VzdG9tLmNzcwogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogICAgY3NzOiBjdXN0b20uY3NzCmhlYWRlcl9pbmNsdWRlczoKICAtIFx1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQogIC0gXHVzZXBhY2thZ2V7ZmxvYXR9Ci0tLQpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICdjZW50ZXInLCBkZXYgPSAnY2Fpcm9fcGRmJykKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoU29pbFIpCmxpYnJhcnkoY29ycnBsb3QpCmxpYnJhcnkob3Blbnhsc3gpCmxpYnJhcnkoSVNSYUQpCmBgYAojIyBOb3RlcwoqIFRoaXMgd29ya2Jvb2sgaXMgaW50ZW5kZWQgdG8gbG9hZCBhbmQgcHJlcGFyZSB0aGUga2V5IGRhdGEgZm9yIGFuYWx5c2lzIGZvciB0aGUgYXJjaGl2ZSBpbmN1YmF0aW9uIHByb2plY3QuCiogaW4gZ2VuZXJhbCwgdGhpcyBpcyBhbiB1cGRhdGVkIHZlcnNpb24gb2Ygc2NyaXB0ICIuL3NyYy9hcmNfaW5jX21hc3Rlci5SIgoqIGFsbCBjb2RlIGNodW5rIG9wdGlvbnMgYXJlIHNldCB0byAiZWNobyA9IEZBTFNFIjsgc2VlIHJhdyAuUm1kIGZpbGUgZm9yIGRhdGEgd3JhbmdsaW5nIGNvZGUuCgojIEludHJvZHVjdGlvbgpUaGUgbGFib3JhdG9yeSBzb2lsIGluY3ViYXRpb24gaXMgYSBjb21tb25seSB1c2VkIHRlY2huaXF1ZSBmb3IgdW5kZXJzdGFuZGluZyBzb2lsIGNhcmJvbiBkeW5hbWljcy4gU29pbCBjYXJib24gaXMgYSBoZXRlcm9nZW5lb3VzIG1peHR1cmUgb2Ygb3JnYW5pYyBtYXR0ZXIsIHNvbWUgb2Ygd2hpY2ggcGVyc2lzdHMgaW4gdGhlIHNvaWwgZm9yIG1vbnRocyBvciB5ZWFycywgd2hpbGUgc29tZSBwZXJzaXN0cyBmb3IgY2VudHVyaWVzIG9yIG1pbGxlbmlhLiBUaGUgcGVyc2lzdGVuY2Ugb2Ygc29pbCBjYXJib24gY2FuIGJlIHVuZGVyc3Rvb2QgdGhyb3VnaCB0aGUgY29uY2VwdCBvZiBkaWZmZXJlbnQgInBvb2xzIiBvZiBjYXJib24gdGhhdCBhcmUgZGVmaW5lZCBieSB0aGUgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZXkgcGVyc2lzdCBpbiB0aGUgc29pbCBhbmQgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgZGlzdGluY3QgYWdlIGRpc3RyaWJ1dGlvbnMuIAoKTmF0dXJhbCBhYnVuZGFuY2UgcmFkaW9jYXJib24gcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgY2FyYm9uIGR5bmFtaWNzIG9uIHRoZSBzY2FsZSBvZiBjZW50dXJpZXMgdG8gbWlsbGVuaWEsIHdoaWxlIGluc2lnaHQgaW50byBkZWNhZGFsIHNjYWxlIGR5bmFtaWNzIGNhbiBiZSBnYWluZWQgZnJvbSB0cmFjaW5nIHRoZSBwdWxzZSBvZiByYWRpb2NhcmJvbiBpbnRyb2R1Y2VkIGludG8gdGhlIGJpb3NwaGVyZSBmcm9tIG51Y2xlYXIgd2VhcG9ucyB0ZXN0aW5nICgiYm9tYi1DIikgaW4gdGhlIG1pZC0yMF50aF4gY2VudHVyeS4gVGhlIGJvbWItQyBwdWxzZSBwZWFrZWQgaW4gdGhlIGF0bW9zcGhlcmUgaW4gdGhlIDE5NTBzIChGaWcuIDEpLCBidXQgZHVlIHRvIGRpZmZlcmVudGlhbCByYXRlcyBvZiBhYmlvdGljIGluY29ycG9yYXRpb24gYW5kIGJpb2xvZ2ljYWwgcHJvY2Vzc2luZywgdGhlIHBlYWsgaXMgbGFnZ2VkIGluIHRpbWUgYW5kIGRhbXBlbmVkIGluIHNvaWxzLiBUaGUgcmVsYXRpdmUgZW5yaWNobWVudCBpbiBib21iLUMgaW4gZGlmZmVyZW50IHBvb2xzIG9mIHNvaWwgY2FyYm9uIGlzIGEgdXNlZnVsIHRvb2wgZm9yIGluZmVycmluZyB0aGUgcmVsYXRpdmUgcmF0ZSBhdCB3aGljaCBjYXJib24gZW50ZXJzIGFuZCBsZWF2ZXMgdGhlIHBvb2wsIGFuZCBmb3IgYSBob21vZ2Vub3VzIHBvb2wgaXQgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gdGhlIGludHJpbnNpYyBkZWNvbXBvc2l0aW9uIHJhdGUuCgpFeHRyYWN0aW5nIGFuZCBtZWFzdXJpbmcgdGhlIHJhZGlvY2FyYm9uIGNvbnRlbnQgb2Ygc3BlY2lmaWMgc29pbCBjYXJib24gcG9vbHMgaXMgaGFtcGVyZWQgYnkgc3BhdGlhbCBhbmQgdGVtcG9yYWwgaGV0ZXJvZ2VuZWl0eSBvZiB0aGUgbWVjaGFuaXNtcyB0aGF0IGxlYWQgdG8gc29pbCBjYXJib24gcGVyc2lzdGVuY2UsIHN1Y2ggYXMgcGh5c2ljYWwgb2NjbHVzaW9uIGluIGFnZ3JlZ2F0ZXMsIGFzc29jaWF0aW9uIHdpdGggbWluZXJhbHMsIG9yIHRoZXJtb2R5bmFtaWNzLiBEZWZpbmluZyBzb2lsIGNhcmJvbiBwb29scyBlbXBpcmljYWxseSB3aXRoIHRlY2huaXF1ZXMgc3VjaCBhcyBkZW5zaXR5LCBzaXplLCBvciByZXNpc3RhbmNlIHRvIGNoZW1pY2FsIGF0dGFjayBjYW4gYmUgdXNlZnVsLCBidXQgdGhlc2UgbWV0aG9kcyBhbHNvIGludHJvZHVjZSBhcnRpZmFjdHMgYW5kIGxpa2VseSByZXN1bHQgaW4gbWl4dHVyZXMgb2YgcG9vbHMgd2l0aCBkaWZmZXJlbnQgYWdlIGRpc3RyaWJ1dGlvbnMuIEluIGNvbnRyYXN0LCBhbHRob3VnaCB0aGV5IGFsc28gaW50cm9kdWNlIGFydGlmYWN0cyBkdWUgdG8gZGlzdHVyYmFuY2UgYW5kIHBvdGVudGlhbCBhbHRlcmF0aW9uIG9mIHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5LCBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgbWFrZSB1c2Ugb2YgdGhlIHNhbWUgZnJhY3Rpb25hdGlvbiBhZ2VudCBhcyBpcyBmb3VuZCAqaW4gc2l0dSo6IHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5LiBNZWFzdXJpbmcgdGhlIHJhZGlvY2FyYm9uIHNpZ25hbCBvZiBDT34yfiAoJFxEZWx0YSReMTReQy1DT34yfikgcmVsZWFzZWQgaW4gbGFib3JhdG9yeSBpbmN1YmF0aW9ucyBvZiBidWxrIHNvaWxzIGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgcmVsYXRpdmUgcHJvY2Vzc2luZyByYXRlIG9mIGNhcmJvbiBpbiBzb2lsIChvciB0cmFuc2l0IHRpbWUpIGFzIGl0IHByb3ZpZGVzIGFuIGludGVncmF0ZWQgbWVhc3VyZSBvZiB0aGUgd2VpZ2h0ZWQgY29udHJpYnV0aW9uIHRvIHRoZSByZWxlYXNlIGZsdXggZnJvbSBwb29scyBvZiBzb2lsIGNhcmJvbiB3aXRoIGRpc3RpbmN0IHByb2Nlc3NpbmcgcmF0ZXMuIAoKSW50ZXJwcmV0aW5nICRcRGVsdGEkXjE0XkMtQ09+Mn4gZnJvbSBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgcmVxdWlyZXMgdGhlIHVzZSBvZiBhIG1vZGVsLiBIb3dldmVyLCBwYXJhbWV0ZXJpemluZyB0aGVzZSBtb2RlbHMgaXMgY2hhbGxlbmdpbmcsIGJvdGggZHVlIHRvIHRoZSB1bmNlcnRhaW50eSBvZiB0aGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtcyB0aGVtc2VsdmVzIGFzIHdlbGwgYXMgYSBsYWNrIG9mIG9ic2VydmF0aW9uYWwgY29uc3RyYWludHMuIFJhZGlvY2FyYm9uIG9ic2VydmF0aW9ucyBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aW1lIGFyZSB2ZXJ5IHVzZWZ1bCwgYnV0IGR1ZSB0byB0aGUgY3VydmF0dXJlIG9mIHRoZSBib21iLUMgcGVhayB0aGVyZSBhcmUgdHdvIHBvaW50cyBpbiB0aW1lIHdpdGggdGhlIHNhbWUgYXRtb3NwaGVyaWMgcmFkaW9jYXJib24gdmFsdWUsIGxlYWRpbmcgdG8gbXVsdGlwbGUgbW9kZWwgc29sdXRpb25zLiBBZGRpbmcgYWRkaXRpb25hbCBvYnNlcnZhdGlvbnMgb2YgJFxEZWx0YSReMTReQy1DT34yfiBhdCBtdWx0aXBsZSBwb2ludHMgaW4gdGltZSBjYW4gZ3JlYXRseSByZWR1Y2UgbW9kZWwgdW5jZXJ0YWludHkuCgpTb2lsIGFyY2hpdmVzIGhhdmUgYWxyZWFkeSBwcm92ZW4gdG8gYmUgYSB2YWx1YWJsZSBzb3VyY2Ugb2YgZGF0YSBmb3IgY29uc3RyYWluaW5nIHNvaWwgY2FyYm9uIG1vZGVscyBieSBwcm92aWRpbmcgdGltZSBzZXJpZXMgb2YgdGhlIGNoYW5nZSBpbiBzb2lsIGNhcmJvbiBeMTReQyBjb250ZW50LiBUaGUgcHJvbWlzZSBvZiBpbXByb3ZpbmcgbW9kZWxzIGZ1cnRoZXIgYnkgb2J0YWluaW5nIF4xNF5DLUNPfjJ+IG1lYXN1cmVtZW50cyBmcm9tIGFyY2hpdmVkIHNvaWxzIGlzIHRhbnRhbGl6aW5nLCBidXQgZmlyc3QgdGhlIHBvc3NpYmxlIGVmZmVjdHMgb2YgYWlyLWRyeWluZyBhbmQgcmV3ZXR0aW5nLCBhcyB3ZWxsIGFzIHRoZSBlZmZlY3Qgb2YgdGhlIGR1cmF0aW9uIG9mIHN0b3JhZ2UsIG11c3QgYmUgcXVhbnRpZmllZC4KCldlIGRlc2lnbmVkIGFuIGV4cGVyaW1lbnQgdG8gYXNzZXNzIHRoZXNlIGVmZmVjdHMsIHByZWxpbWluYXJ5IHJlc3VsdHMgb2Ygd2hpY2ggYXJlIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHJlcG9ydC4KCiMgSHlwb3RoZXNlcyBhbmQgY29uY2VwdHVhbCB1bmRlcnN0YW5kaW5nCklmIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgZGlzcHJvdmVkLCBpLmUuIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZyAoYWlyLWRyeSkgb3IgYWlyLWRyeWluZywgcmV3ZXR0aW5nLCBhbmQgc3RvcmFnZSAoYWlyLWRyeSArIHN0b3JhZ2UpIGhhdmUgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gJFxEZWx0YSReMTReQy1DT34yfiByZWxhdGl2ZSB0byBjb250cm9sIHNhbXBsZXMsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgb3V0Y29tZXM6IGVucmljaG1lbnQgb2YgdGhlIHJlc3BpcmF0aW9uIGZsdXggb3IgZGVwbGV0aW9uLiAKCkluIGEgc2ltcGxlIHR3by1wb29sIHNvaWwgY2FyYm9uIG1vZGVsLCB0aGUgdHJlYXRtZW50IGVmZmVjdCBjYW4gYmUgY29uY2VwdHVhbGl6ZWQgYXMgYSByZWxhdGl2ZSBjaGFuZ2UgaW4gdGhlIGNvbnRyaWJ1dGlvbiBvZiAic2xvd2VyIiBvciAiZmFzdGVyIiBjeWNsaW5nIGNhcmJvbiB0byB0aGUgcmVzcGlyYXRpb24gZmx1eCBvYnNlcnZlZCBpbiBjb250cm9sIHNhbXBsZXMuCgpUcmFqZWN0b3JpZXMgb2YgdGhlIGNoYW5nZSBpbiAkXERlbHRhJF4xNF5DIG92ZXIgdGltZSBmb3IgInNsb3ciIGFuZCAiZmFzdCIgc29pbCBjYXJib24gcG9vbHMgYXJlIHNob3duIGJlbG93IChGaWcuIDEpIGluIHJlbGF0aW9uc2hpcCB0byB0aGUgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBhbmQgcmVzcGlyZWQgQ09+Mn4gZm9yIGEgdGhlb3JldGljYWwgbW9kZWwgc3lzdGVtLgoKYGBge3IgY29uY2VwdHVhbC1tb2RlbC1jYWxjcywgaW5jbHVkZSA9IEZBTFNFfQojIGluaXRpYWwgcGFyYW1ldGVyIHNldApEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQpEYXRtIDwtIERhdG1bRGF0bSREYXRlID4gMTkwMCwgYygiRGF0ZSIsICJOSGMxNCIpXQp5cnMgPC0gRGF0bSREYXRlCgojIGhlbHBlciBmeHMKbGFtYmRhIDwtICgxLzgyNjcpCgprIDwtIGZ1bmN0aW9uKEZtKSB7CiAgKEZtKmxhbWJkYSkvKDEtRm0pCn0KZm0gPC0gZnVuY3Rpb24oayl7CiAgay8oaytsYW1iZGEpCn0KZm1fMTRjIDwtIGZ1bmN0aW9uKGZtLCBkYXRlKSB7CiAgKGZtKmV4cChsYW1iZGEqKDE5NTAgLSBkYXRlKSkgLSAxKSoxMDAwCn0KCiMgZm9yZXN0cwpmLmMgPC0gMzguOTYxMDQgIyBmb3Jlc3QgQyBwb29sLCB0b3RhbCAobWVhbiBIYWluaWNoIGZvcmVzdCBDICA9IDI0IGcga2deLTEpOyBuYiBAIHNzID0gc3VtKC0xKnNvbHZlKEEpJSolYyhmLmluKmYuZ2FtLCBmLmluKigxLWYuZ2FtKSkpCmYuaW4gPC0gMSAjIGlucHV0cyAoMTIuNT1tZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIGdDIHlyLTEsIDIwMTEgaW5jdWJhdGlvbiBkYXRhKTsgdHJ5IG11Y2ggbGVzcy4uLgpmLmZyYyA8LSAuMSAjIEMtc3RvY2sgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChmcm9tIFNjaHJ1bXBmIDIwMTMsIEhhaW5pY2ggMC01LCBmcmVlIGxpZ2h0KQpmLkNmYXN0IDwtIGYuZnJjKmYuYwpmLkNzbG93IDwtIGYuYy1mLkNmYXN0CmYua2Zhc3QgPC0gMS82ICMgdW5rbm93bgpmLmtzbG93IDwtIDEvMTAwICMgdW5rbm93bgpmLmZhc3QuZm0gPC0gZm0oZi5rZmFzdCkKZi5zbG93LmZtIDwtIGZtKGYua3Nsb3cpCmYuRjBfRGVsdGExNEMgPC0gZm1fMTRjKGMoZi5mYXN0LmZtLCBmLnNsb3cuZm0pLCBkYXRlID0gYygxOTAwLCAxOTAwKSkKZi5nYW0gPC0gKGYuYypmLkNmYXN0KmYua2Zhc3QpLyhmLmMqZi5DZmFzdCpmLmtmYXN0K2YuYypmLkNzbG93KmYua3Nsb3cpICMgaW5wdXQgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChwcm9wb3J0aW9uIHRvIGZhc3QgcG9vbCwgZnVuY3Rpb24gb2Yga3MpCiAgCiMgZ3Jhc3NsYW5kcwpnLmMgPC0gNDIgIyBDIHBvb2wsIHRvdGFsIChtZWFuIEhhaW5pY2ggZ3Jhc3NsYW5kIEMgZyBrZ14tMSkKZy5pbiA8LSA2My40ICMgaW5wdXRzIChtZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIDIwMTEgaW5jdWJhdGlvbiBkYXRhKQpnLmZyYyA8LSAuMyAjIEMtc3RvY2sgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChmcm9tIFNjaHJ1bXBmIDIwMTMsIGF2ZXJhZ2Ugb2YgTGFjcXVldmlsbGUsIEVhc3RlciBCdXNoLCBCdWdhYywgMC01LCBmcmVlIGxpZ2h0KQpnLkNmYXN0IDwtIGcuZnJjKmcuYwpnLkNzbG93IDwtIGcuYy1nLkNmYXN0Cmcua2Zhc3QgPC0gMS8xMCAjIHVua25vd24KZy5rc2xvdyA8LSAxLzEwMCAjIHVua25vd24KZy5mYXN0LmZtIDwtIGZtKGcua2Zhc3QpCmcuc2xvdy5mbSA8LSBmbShnLmtzbG93KQpnLkYwX0RlbHRhMTRDIDwtIGZtXzE0YyhjKGcuZmFzdC5mbSwgZy5zbG93LmZtKSwgZGF0ZSA9IGMoMTkwMCwgMTkwMCkpCmcuZ2FtIDwtIChnLmMqZy5DZmFzdCpnLmtmYXN0KS8oZy5jKmcuQ2Zhc3QqZy5rZmFzdCtnLmMqZy5Dc2xvdypnLmtzbG93KSAjIGlucHV0IHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCAocHJvcG9ydGlvbiB0byBmYXN0IHBvb2wsIGZ1bmN0aW9uIG9mIGtzKQoKIyAycG9vbCBwYXJhbGxlbCBtb2RlbApmLjJwIDwtIFR3b3BQYXJhbGxlbE1vZGVsMTQodCA9IHlycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gYyhmLmtmYXN0LCBmLmtzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMwID0gYyhmLkNmYXN0LCBmLkNzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDID0gZi5GMF9EZWx0YTE0QywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gZi5pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IGYuZ2FtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGYyA9IERhdG0pCgpmLjJwLkMxNCA8LSBnZXRGMTQoZi4ycCkKZi4ycC5IUiA8LSBnZXRGMTRSKGYuMnApCmYuMnAuQ3RvdCA8LSBnZXRDKGYuMnApCgojIHNvbHZlIGZvciBzdGVhZHktc3RhdGUgQyBzdG9ja3MKQSA8LSAtMSpkaWFnKGMoZi5rZmFzdCwgZi5rc2xvdykpCnN1bSgtMSpzb2x2ZShBKSUqJWMoZi5pbipmLmdhbSwgZi5pbiooMS1mLmdhbSkpKQoKZi4ycC5DMTQuZGYgPC0gZGF0YS5mcmFtZSgKICB5ZWFycyA9IHJlcChEYXRtJERhdGUsIDQpLAogIGQxNEMgPSBjKGYuMnAuQzE0WywxXSwgZi4ycC5DMTRbLDJdLCBmLjJwLkhSLCBEYXRtJE5IYzE0KSwKICBwb29sID0gcmVwKGMoImZhc3QiLCAic2xvdyIsICJyZXNwaXJhdGlvbiIsICJhdG0iKSwgZWFjaCA9IG5yb3coZi4ycC5DMTQpKQogICkKCiMgIyBQbG90IEMgc3RvY2tzIHRvIGNvbmZpcm0gZmxhdAojIHBsb3QoeXJzLCB4bGltID0gYygxOTAwLDIwMjIpLCB5bGltID0gYygwLDYwKSkKIyBsaW5lcyh5cnMsIGYuMnAuQ3RvdFssIDFdLCBjb2wgPSAyKQojIGxpbmVzKHlycywgZi4ycC5DdG90WywgMl0sIGNvbCA9IDQpCgojIGNhbGN1bGF0ZSByZXNwIGZsdXggcG9pbnRzIGF0IDE5OTEgYW5kIDIwMTkgYW5kIHB1dCBpbiBkYXRhIGZyYW1lCm9icy5wdHMgPC0gZGF0YS5mcmFtZShwb29sID0gcmVwKCJyZXNwaXJhdGlvbiIsIDYpLAogICAgICAgICAgICAgICAgICAgICAgeWVhcnMgPSByZXAoYygxOTkxLDIwMTkpLDMpLAogICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IGMobWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDE5OTAgJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDE5OTIgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDIwMTggJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDIwMjAgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwLCA2MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MCwgMzApLAogICAgICAgICAgICAgICAgICAgICAgT2JzZXJ2YXRpb24gPSByZXAoYygiY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgc2xvdyBwb29sIGNvbnRyaWJ1dGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgZmFzdCBwb29sIGNvbnRyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IDIpKQpvYnMucHRzLnIgPC0gb2JzLnB0c1tvYnMucHRzJE9ic2VydmF0aW9uID09ICJjb250cm9sIiwgXQpgYGAKCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtZmlnMX0KZ2dwbG90KGYuMnAuQzE0LmRmLCBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCkpICsKICBnZW9tX3BhdGgoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSwKICAgIGxhYmVscyA9IGMoImF0bSIgPSAiYXRtb3NwaGVyZSIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICJmYXN0IiwKICAgICAgICAgICAgICAgInNsb3ciID0gInNsb3ciKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnIGByIHsoZmlnLm4gPC0gMSl9YC4gTW9kZWxlZCB0cmFqZWN0b3JpZXMgb2YgJFxEZWx0YSReMTReQyBvdmVyIHRpbWUgaW4gc29pbCBjYXJib24gcG9vbHMgKGZhc3QsIHNsb3csIHJlc3BpcmF0aW9uIGZsdXgpIGluIHJlbGF0aW9uc2hpcCB0byBvYnNlcnZlZCBhdG1vc3BoZXJpYyAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIE1vZGVsZWQgY3VydmVzIGRlcml2ZWQgZnJvbSBhIGNvbmNlcHR1YWwgdHdvLXBvb2wgcGFyYWxsZWwgbW9kZWwgc3lzdGVtIGluIHdoaWNoIGlucHV0cyBhcmUgcGFydGl0aW9uZWQgYmV0d2VlbiBmYXN0ZXIgYW5kIG1vcmUgc2xvd2x5IGN5Y2xpbmcgcG9vbHMgd2l0aG91dCBhbnkgdHJhbmZlcnMgYmV0d2VlbiB0aGUgcG9vbHMuIENhcmJvbiBzdG9ja3MgYW5kIHBvb2wgc2l6ZXMgYXJlIGJhc2VkIG9uIGRlbnNpdHkgZnJhY3Rpb24gZGF0YSBmb3IgdGhlIEhhaW5pY2ggRm9yZXN0IChTY2hydW1wZiBldCBhbC4gMjAxMyk7IGRlY29tcG9zaXRpb24gcmF0ZXMgYXJlIGNob3NlbiB0byBiZSByZWFsaXN0aWMgYnV0IGFyZSBhcmJpdHJhcnkuIEF0bW9zcGhlcmljICRcRGVsdGEkXjE0XkMgZGF0YSB1cCB0byB0aGUgeWVhciAyMDE1IGFyZSBmcm9tIEdyYXZlbiBldCBhbC4gKDIwMTcpLCB3aGlsZSBkYXRhIHBvaW50cyBiZXlvbmQgMjAxNSB1c2UgdGhlIGV4dHJhcG9sYXRpb24gbWV0aG9kIGZyb20gU2llcnJhICgyMDE4KS4gQWxsIGF0bW9zcGhlcmljIGRhdGEgaXMgZm9yIHRoZSBub3J0aGVybiBoZW1pc3BoZXJlICh6b25lIDIpLgoKVGhlIHNpbXBsZXN0IHR3by1wb29sIG1vZGVsIGlzIGEgcGFyYWxsZWwgc3lzdGVtOiBvbmUgaW4gd2hpY2ggY2FyYm9uIGVudGVyaW5nIHRoZSBzb2lsIGlzIHBhcnRpdGlvbmVkIGJldHdlZW4gdGhlIHR3byBwb29scyB3aXRob3V0IGFueSB0cmFuc2ZlcnMgZnJvbSBvbmUgcG9vbCB0byB0aGUgb3RoZXIuIEhvd2V2ZXIsIGV2ZW4gaW4gdGhpcyBzaW1wbGUgc3lzdGVtLCB0aGUgc2FtZSB0cmVhdG1lbnQgZWZmZWN0IGNhbiByZXN1bHQgaW4gZWl0aGVyIGVucmljaG1lbnQgb3IgZGVwbGV0aW9uIGRlcGVuZGluZyBvbiB0aGUgeWVhciB0aGUgc2FtcGxlIHdhcyBjb2xsZWN0ZWQuIFRoZSBkaXJlY3Rpb24gb2YgY2hhbmdlIHdpbGwgYmUgZGVwZW5kZW50IG9uIHN5c3RlbSBkeW5hbWljcywgc3BlY2lmaWNhbGx5IHRoZSBpbnRyaW5zaWMgZGVjb21wb3NpdGlvbiByYXRlcyBvZiB0aGUgc2xvdyBhbmQgZmFzdCBwb29scywgd2hpbGUgaW4gbW9yZSBjb21wbGljYXRlZCBzeXRlbXMgdGhlIGFtb3VudCBvZiBtaXhpbmcgYmV0d2VlbiB0aGUgcG9vbHMgd2lsbCBwbGF5IGEgcm9sZSBhcyB3ZWxsLiBQb3RlbnRpYWwgdHJlYXRtZW50IGVmZmVjdHMgZm9yIHRoZSBzYW1lIHBhcmFsbGVsIHR3by1wb29sIG1vZGVsIHN5c3RlbSBzaG93biBpbiBGaWcuIDEgYXJlIHNob3duIGJlbG93IGF0IHR3byBwb2ludHMgaW4gdGltZSAoRmlnLiAyKS4KCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtZmlnMWJ9CiMgem9vbSAody8gYXRtLCB0byAyMDIyKQpmLjJwLkMxNC5kZiAlPiUgCiAgZmlsdGVyKHllYXJzID4gMTk4NykgJT4lCiAgZmlsdGVyKHBvb2wgIT0gImF0bSIpICU+JQogIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMpKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBvb2wpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gb2JzLnB0cywgYWVzKHllYXJzLCBkMTRjLCBzaGFwZSA9IE9ic2VydmF0aW9uKSwgY29sb3IgPSAiI0ZGQzEwNyIsIHN0cm9rZSA9IDEsIHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSwKICAgIGxhYmVscyA9IGMoImF0bSIgPSAiYXRtb3NwaGVyZSIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICJmYXN0IiwKICAgICAgICAgICAgICAgInNsb3ciID0gInNsb3ciKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCgKICAgIG5hbWUgPSAiT2JzZXJ2ZWQgcmVzcGlyYXRpb24iLAogICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgImluY3JlYXNlZCBzbG93IHBvb2wgY29udHJpYnV0aW9uIiA9IDAsCiAgICAgICAgICAgICAgICJpbmNyZWFzZWQgZmFzdCBwb29sIGNvbnRyaWJ1dGlvbiIgPSAxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDI2NSkpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgo+KipGaWcgYHIgeyhmaWcubiArIDEpfWAuIFBvdGVudGlhbCBzaGlmdHMgaW4gJFxEZWx0YSReMTReQyBvZiByZXNwaXJlZCBDT34yfiBpbiByZXNwb25zZSB0byBhaXItZHJ5aW5nIGFuZCByZXdldHRpbmcsIG9yIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZyArIHN0b3JhZ2UqKgoKPipDYXB0aW9uOiogQmx1ZSBhbmQgbWFnZW50YSBsaW5lcyBzaG93IG1vZGVsZWQgdHJhamVjdG9yaWVzIG9mICRcRGVsdGEkXjE0XkMgaW4gZmFzdCBhbmQgc2xvdyBjeWNsaW5nIHNvaWwgY2FyYm9uIHBvb2xzIChzYW1lIG1vZGVsIGFzIEZpZyAxKSwgYW5kICRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyZWQgQ09+Mn4gaXMgc2hvd24gaW4geWVsbG93LiBTb2xpZCBjaXJjbGVzIHNob3cgaHlwb3RoZXRpY2FsIG9ic2VydmF0aW9ucyBvZiBeMTReQyBvciByZXNwaXJlZCBDT34yfiBmcm9tIGNvbnRyb2wgaW5jdWJhdGlvbnMsIHdoaWxlIHRoZSBvcGVuIHN5bWJvbHMgcmVwcmVzZW50IHR3byBwb3NzaWJsZSBzY2VuYXJpb3MgaW4gd2hpY2ggXjE0XkMtQ09+Mn4gc2hpZnRzIGR1ZSB0byBpbmNyZWFzZWQgY29udHJpYnV0aW9uIGZyb20gdGhlIGZhc3QgcG9vbCAob3BlbiBjaXJjbGVzKSwgb3Igc2hpZnRzIGR1ZSB0byBpbmNyZWFzc2VkIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBzbG93IHBvb2wgKG9wZW4gc3F1YXJlcykuIER1ZSB0byB0aGUgY3Jvc3Npbmcgb2YgdGhlIGJsdWUgYW5kIG1hZ2VudGEgbGluZXMgaW4gMjAwOSwgaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBvZiB0aGUgc2xvdyBwb29sIHRvIHJlc3BpcmF0aW9uIGZvbGxvd2luZyB0cmVhdG1lbnQgbGVhZHMgdG8gcmVsYXRpdmUgZGVwbGV0aW9uIG9mIF4xNF5DLUNPfjJ+IGluIDE5OTEsIGJ1dCByZWxhdGl2ZSBlbnJpY2htZW50IG9mIF4xNF5DLUNPfjJ+IGluIDIwMTksIHdoaWxlIHRoZSBvcHBvc2l0ZSBpcyBvYnNlcnZlZCBmb3IgaW5jcmVhc2VkIGZhc3QgcG9vbCBjb250cmlidXRpb24uCgpJbiB0aGUgYWJvdmUgcGxvdCAoRmlnLiAyKSwgaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBzbG93IHBvb2wgbGVhZHMgdG8gZGVwbGV0aW9uIGluICRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyYXRpb24gcmVsYXRpdmUgdG8gdGhlIGNvbnRyb2wgb2JzZXJ2YXRpb24gaW4gMTk5MSBidXQgcmVsYXRpdmUgZW5yaWNobWVudCBpbiAyMDE5LgoKIyBNZXRob2RzIGFuZCBtYXRlcmlhbHMKCipSYWRpb2NhcmJvbiBjb3JyZWN0aW9ucyoKCkFsdGhvdWdoIGRpZmZlcmVuY2VzIHdlcmUgc21hbGwsIHJhZGlvY2FyYm9uIGRhdGEgZm9yIGFyY2hpdmVkIHNhbXBsZXMgd2VyZSBmaXJzdCBjb3JyZWN0ZWQgZm9yIGRlY2F5IHNpbmNlIHRoZSB5ZWFyIG9mIGNvbGxlY3Rpb24gYmVmb3JlIGFzc2Vzc2luZyB0cmVhdG1lbnQgZWZmZWN0cy4KCkRlY2F5IGNvcnJlY3Rpb24gZm9ybXVsYToKJCQxMDAwIFxjZG90IFxsZWZ0KCAoRk0gXGNkb3QgZV57XGZyYWN7LXllYXJfe3NhbXBsZWR9ICsgMTk1MH17ODI2N319KSAtIDEgXHJpZ2h0KSQkCgp3aGVyZSBGTSBpcyB0aGUgZnJhY3Rpb24gbW9kZXJuLCBhbmQgODI2NyBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgcHJvZHVjdCBvZiB0aGUgbmF0dXJhbCBsb2cgb2YgdHdvIGFuZCB0aGUgdHJ1ZSBoYWxmIGxpZmUgb2YgXjE0XkMgKDU3MzAgeSkuCgpgYGB7ciAxNEMgaGVscGVyIGZ4c30KIyA1LiBDcmVhdGUgaGVscGVyIGZ1bmN0aW9ucwojIGRlY2F5IGNvcnJlY3Rpb24gZnVuY3Rpb24gIApkZWNheS5jb3JyLmZ4IDwtIGZ1bmN0aW9uKHllYXJfc2FtcGxlZCwgZnJhY3Rpb25fbW9kZXJuKSB7CiAgaWZlbHNlKGlzLm5hKGZyYWN0aW9uX21vZGVybiksIE5BLCAxMDAwKigoZnJhY3Rpb25fbW9kZXJuKmV4cCgoLXllYXJfc2FtcGxlZCArIDE5NTApLzgyNjcpKS0xKSkKfQoKIyBkMTRDIHRvIGZyYWN0aW9uIG1vZGVybiBmdW5jdGlvbgpkMTRjLmZtLmZ4IDwtIGZ1bmN0aW9uKHllYXJfc2FtcGxlZCwgZDE0YykgewogICgoZDE0YyAvIDEwMDApICsgMSkgLyBleHAoMC4wMDAxMjA5NyAqICgxOTUwIC0geWVhcl9zYW1wbGVkKSkKICB9CgojIGRlZmluZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHN0cmlwcGluZyBvdXQgIk5BIiBhbmQgbm9uLUV4cGxvcmF0b3JpZXMgZGF0YQpleHRyYS5jbGVhbi5meCA8LSBmdW5jdGlvbihkZikgewogIGRmIDwtIGRmW3doaWNoKGdyZXBsKCJIRUciLCBkZiRQcm9iZSkgfAogICAgICAgICAgICAgICAgICAgZ3JlcGwoIkhFVyIsIGRmJFByb2JlKSB8CiAgICAgICAgICAgICAgICAgICBncmVwbCgiU0VHIiwgZGYkUHJvYmUpIHwKICAgICAgICAgICAgICAgICAgIGdyZXBsKCJTRVciLCBkZiRQcm9iZSkpLCBdCiAgaWYobGVuZ3RoKGdyZXAoIkV4cGVyaW1lbnQiLCBuYW1lcyhkZikpKSA+IDApIHsKICAgICBkZiA8LSBkZlt3aGljaChkZiRFeHBlcmltZW50ICE9ICJ0bWUiKSwgXSAKICB9CiAgaXggPC0gd2hpY2goaXMubmEoZGYkRjE0QykgJiBpcy5uYShkZiRg4oiGMTRDLijigLApYCkpCiAgaWYobGVuZ3RoKGl4KSA+IDEpIHsKICAgIGRmIDwtIGRmWy1peCwgXQogIH0KICByZXR1cm4oZGYpCn0KCiMgZXh0cmFjdCBzdG9yYWdlIGR1cmF0aW9uIGRhdGEgc2VwYXJhdGVseQp0bWUuMTRjLmZ4IDwtIGZ1bmN0aW9uKGRmKSB7CiAgZGYkU2FtcGxlTmFtZSA8LSBkZiRQcm9iZQogIGRmJFBlcmlvZCA8LSAiaW5jIgogIGlmKGxlbmd0aChncmVwKCJFeHBlcmltZW50IiwgbmFtZXMoZGYpKSkgPiAwKSB7CiAgICAgZGYgPC0gZGZbd2hpY2goZGYkRXhwZXJpbWVudCA9PSAidG1lIiksIF0gCiAgfQogIHJldHVybihkZikKfQpgYGAKCgpgYGB7ciByZWFkIHdpZGUgdHMgZGF0YX0KIyAxLiBMb2FkIGZsdXggZGF0YSBmcm9tIGFpci1kcnkgKyBzdG9yYWdlIChleHBlcmltZW50IDEpIGFuZCBzdG9yYWdlIGR1cmF0aW9uIChleHBlcmltZW50IDMpIGNvbnRyb2wgc2FtcGxlcywgYW5kIGNvbnZlcnQgZnJvbSAid2lkZSIgdG8gImxvbmciIGZvcm1hdCBzbyBhcyB0byBtYXRjaCBvdGhlciBkYXRhLiAKIyBSZWFkIGFpci1kcnkgKyBzdG9yYWdlIHJlc3BpcmF0aW9uIGNvbnRyb2wgZGF0YQphcmNoaXZlLmN0bC50cy53aWRlIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXN0b3JhZ2UtdDEtZmx1eC9hcmMtaW5jX3hwbHJfYXJjLXN0b3JhZ2UtdDEtZmx1eF8yMDIwLTA0LTI5LmNzdiIpCgojIENvbnZlcnQgdGltZSBkYXRhIGZyb20gd2lkZSB0byBsb25nCmFyY2hpdmUuY3RsLnRzLmQgPC0gc2VsZWN0KGFyY2hpdmUuY3RsLnRzLndpZGUsIHN0YXJ0c193aXRoKCJpbmNfdGltZV9kIikpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4ID0gImluY190aW1lX2RfIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInRpbWVfZCIpCiMgc29ydCBieSB0aW1lcG9pbnRfY210dgphcmNoaXZlLmN0bC50cy5kIDwtIGRhdGEuZnJhbWUoYXJjaGl2ZS5jdGwudHMuZFtvcmRlcihhcmNoaXZlLmN0bC50cy5kJHRpbWVwb2ludF9jbXR2KSxdKQoKIyBDb252ZXJ0IG1nQ08yIGRhdGEgZnJvbSB3aWRlIHRvIGxvbmcKYXJjaGl2ZS5jdGwudHMuY28yIDwtIHNlbGVjdChhcmNoaXZlLmN0bC50cy53aWRlLCBzdGFydHNfd2l0aCgiaW5jX21nQ08yX2phcl8iKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidGltZXBvaW50X2NtdHYiLAogICAgICAgICAgICAgICBuYW1lc19wcmVmaXggPSAiaW5jX21nQ08yX2phcl8iLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibWdDTzJfamFyIikKIyBzb3J0IGJ5IHRpbWVwb2ludF9jbXR2CmFyY2hpdmUuY3RsLnRzLmNvMiA8LSBhcmNoaXZlLmN0bC50cy5jbzJbb3JkZXIoYXJjaGl2ZS5jdGwudHMuY28yJHRpbWVwb2ludF9jbXR2KSxdCgojIGFzc2VtYmxlIGluIGxvbmcgZGF0YWZyYW1lIAphcmNoaXZlLmN0bC50cyA8LSBkYXRhLmZyYW1lKElEID0gcmVwKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kID0gImluYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXBvaW50X2NtdHYgPSByZXAoc2VxKGZyb20gPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IGxlbmd0aChhcmNoaXZlLmN0bC50cy53aWRlJElEKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9kID0gYXJjaGl2ZS5jdGwudHMuZCR0aW1lX2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWdDTzJfamFyID0gYXJjaGl2ZS5jdGwudHMuY28yJG1nQ08yX2phcikKCiMgYWRkIHByZWluY3ViYXRpb24gZGF0YQphcmNoaXZlLmN0bC50cy5wcmUgPC0gYXJjaGl2ZS5jdGwudHMud2lkZVsxOmxlbmd0aCh1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJJRCIsICJwcmVpbmNfdGltZV9kIiwgInByZWluY19tZ0NPMl9qYXIiKV0KYXJjaGl2ZS5jdGwudHMucHJlIDwtIHJlbmFtZShhcmNoaXZlLmN0bC50cy5wcmUsIHRpbWVfZCA9IHByZWluY190aW1lX2QsIG1nQ08yX2phciA9IHByZWluY19tZ0NPMl9qYXIpCmFyY2hpdmUuY3RsLnRzLnByZSR0aW1lcG9pbnRfY210diA8LSAxCmFyY2hpdmUuY3RsLnRzLnByZSRQZXJpb2QgPC0gInByZSIKYXJjaGl2ZS5jdGwudHMucHJlJHRpbWVfZF9jbXR2IDwtIGFyY2hpdmUuY3RsLnRzLnByZSR0aW1lX2QKICAKIyBDYWxjdWxhdGUgdGltZV9kX2NtdHYKYXJjaGl2ZS5jdGwudHMgPC0gYmluZF9yb3dzKAogIGxhcHBseSgKICAgIHNwbGl0KGFyY2hpdmUuY3RsLnRzLCBhcmNoaXZlLmN0bC50cyR0aW1lcG9pbnRfY210diksCiAgICBmdW5jdGlvbih4KSB7CiAgICAgIHgkdGltZV9kX2NtdHYgPC0geCR0aW1lX2QgKyAKICAgICAgICBhcmNoaXZlLmN0bC50cy5wcmVbbWF0Y2goeCRJRCwgYXJjaGl2ZS5jdGwudHMucHJlJElEKSwgInRpbWVfZCJdCiAgICAgIHJldHVybih4KQogICAgfQogICAgKQogICkKCiMgcmJpbmQgcHJlaW5jIGFuZCBpbmMgZGF0YQphcmNoaXZlLmN0bC50cyA8LSByYmluZChhcmNoaXZlLmN0bC50cy5wcmUsIGFyY2hpdmUuY3RsLnRzKQoKIyBhZGQgU2FtcGxlTmFtZSBjb2x1bW4gYW5kIHJlc3RvcmUgRXhwZXJpbWVudCBjb2x1bW4KYXJjaGl2ZS5jdGwudHMkU2FtcGxlTmFtZSA8LSBhcmNoaXZlLmN0bC50cyRJRAphcmNoaXZlLmN0bC50cyRFeHBlcmltZW50IDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbbWF0Y2goYXJjaGl2ZS5jdGwudHMkSUQsIGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpLCAiRXhwZXJpbWVudCJdCgojIHJlbW92ZSBpbnRlcm1lZGlhdGUgZmlsZXMKcm0oYXJjaGl2ZS5jdGwudHMuZCwgYXJjaGl2ZS5jdGwudHMuY28yLCBhcmNoaXZlLmN0bC50cy5wcmUpCmBgYAoKYGBge3IgcmVhZC1sb25nLXRzLWRhdGF9CiMgMi4gTG9hZCBmbHV4IGRhdGEgZnJvbSBhaXItZHJ5ICsgc3RvcmFnZSBzYW1wbGVzIGFuZCBmcm9tIGFpci1kcnkgZXhwZXJpbWVudCAoY3RsICYgdHJlYXRtZW50KSwgQyAmIE4gZGF0YSBmb3IgYWxsIHRoZSBFeHBsb3JhdG9yaWVzIHNhbXBsZXMgKG1lYXN1cmVkIGluIDIwMTEpLCBhbmQgc29pbCBtYXNzIGFuZCBtb2lzdHVyZSBkYXRhIGZvciBhbGwgZXhwZXJpbWVudHMuCiMgUmVhZCBYcGxyIEMgYW5kIE4gZGF0YQp4cGxyLmNuIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2V4dGVybmFsL2V4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ19zb2lsY25fMjAxMS8xNzA0MDdfQ05fY29uY2VudHJhdGlvbnNfRXhwbG9yYXRvcmllc19FUF9QbG90c18yMDExLmNzdiIpCgojIFJlYWQgWHBsciAxNEMgZGF0YSBmb3IgY29udHJvbCBzYW1wbGVzICgidG1lIiBhbmQgImFyYyIgRXhwZXJpbWVudHMpCnhwbHIuY3RsLmlzbyA8LSByZWFkLnhsc3goIi4uL2RhdGEvZXh0ZXJuYWwvZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy1jbzJfMjAxMS8xNzAyMjhfMTRDX1Jlc3BpcmF0aW9uLnhsc3giKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3IgYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50IHNhbXBsZXMKamFyaW5mby5hcmMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtc3RvcmFnZS10Mi1qYXJJbmZvL2phcl9pbmZvcm1hdGlvbi5jc3YiKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3IgYWlyLWRyeSBkYXRhCmphcmluZm8ucmV3ZXQgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9haXItZHJ5LTIwMTktd2hjL2Fpci1kcnktMjAxOS13aGNfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3Igc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgc2FtcGxlcwojIHJlbW92ZSB1bml0IHJvdyBhbmQgY29udmVydCB0byBhcHByb3ByaWF0ZSB0eXBlcwpqYXJpbmZvLnRtZSA8LSB0eXBlLmNvbnZlcnQocmVhZC54bHN4KCIuLi9kYXRhL3Jhdy9sYWJfamVuYV9yZXN1bHRzLWNvMl8yMDE4LTA3LTMwL0FyY0luY19JbmNEYXRhXzIwMTgueGxzeCIsIHNoZWV0ID0gMSlbLTEsIF0pCgojIFJlYWQgRHVrZSBpc28gYW5kIGZsdXggZGF0YQp0bWUuY3RsLmR1ayA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtZHVrZS9hcmMtdG1lLWR1a2VfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIFNpZXJyYSBOZXZhZGEgKEp1bidzKSBzb2lsIGRhdGEKdG1lLmN0bC5zb2lsLnNyYSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtc2llcnJhL2FyYy10bWUtc2llcnJhLXNvaWxfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIE9hayBSaWRnZSBDIGRhdGEKdG1lLmN0bC5vcm5sIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1vcm5sL2FyYy10bWUtb3JubF8yMDIwLTA0LTMwLmNzdiIpCgojIFJlYWQgYWlyLWRyeSArIHN0b3JhZ2UgcmVzcGlyYXRpb24gZGF0YQphcmNoaXZlLmFyYy50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy1zdG9yYWdlLXQyLWZsdXgvYXJjaGl2ZS1mbHV4LXQyXzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCBjb250cm9sIHJlc3BpcmF0aW9uIGRhdGEgZnJvbSAyMDE5IGFpci1kcnkgZXhwZXJpbWVudApyZXdldC5jdGwudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9mcmVzaC0yMDE5LWZsdXgvZnJlc2gtMjAxOS1mbHV4XzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCB0cmVhdG1lbnQgcmVzcGlyYXRpb24gZGF0YSBmcm9tIDIwMTkgYWlyLWRyeSBleHBlcmltZW50CnJld2V0LmRyeS50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2RyaWVkLTIwMTktZmx1eC9kcmllZC0yMDE5LWZsdXhfMjAyMC0wNC0yNC5jc3YiKQoKIyBSZWFkIFNpZXJyYSBOZXZhZGEgKEp1bidzKSBmbHV4IGRhdGEKdG1lLmN0bC5mbHguc3JhIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1zaWVycmEvYXJjLXRtZS1zaWVycmEtZmx1eF8yMDIwLTA0LTI5LmNzdiIpCgojIFJlYWQgc3RvcmFnZSBkdXJhdGlvbiByZXNwaXJhdGlvbiBkYXRhCnRtZS50cnQudHMgPC0gcmJpbmQocmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXQyLWZsdXgvYXJjLXRtZS10Mi1mbHV4LTFfMjAyMC0wNC0yNy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgICAgICByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtdDItZmx1eC9hcmMtdG1lLXQyLWZsdXgtMl8yMDIwLTA0LTI3LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkpCgojIFJlYWQgbWlzY2VsbGFuZW91cyBzdG9yYWdlIHRyZWF0bWVudCBkYXRhCnRtZS5taXNjIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1taXNjL2FyYy10bWUtbWlzYy1pc29fMjAyMC0wNC0yOS5jc3YiKQpgYGAKCmBgYHtyIHN1bW1hcml6ZSBkYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgMy4gQ29tYmluZSBhbmQgc3VtbWFyaXplIGRhdGEgaW4gbG9uZyBmb3JtYXQgdG8gY2FsY3VsYXRlIHJlc3BpcmF0aW9uIHJhdGVzIGFuZCBwbG90IG92ZXIgdGltZQojIE5COiBzZXQgImluY2x1ZGUiIHRvIGZhbHNlIHRvIHN1cHByZXNzIGJpbmRfcm93cyB3YXJuaW5nIGFib3V0IGNvZXJjaW5nIGZhY3RvciB0byBjaGFyCiMgcmVtb3ZlIGZvcm11bGFfY2hlY2sgY29sdW1ucwppbnZpc2libGUobGlzdDJlbnYobGFwcGx5KGxpc3QoYXJjaGl2ZS5hcmMudHMgPSBhcmNoaXZlLmFyYy50cywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdldC5jdGwudHMgPSByZXdldC5jdGwudHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3ZXQuZHJ5LnRzID0gcmV3ZXQuZHJ5LnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLnRydC50cyA9IHRtZS50cnQudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgkZm9ybXVsYV9jaGVjayA8LSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgZW52aXIgPSAuR2xvYmFsRW52KQogICAgICAgICAgKQoKIyBBZGQgVHJlYXRtZW50IGNvbHVtbnMgdG8gZWFjaCBkYXRhc2V0CmFyY2hpdmUuYXJjLnRzJFRyZWF0bWVudCA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCmFyY2hpdmUuY3RsLnRzJFRyZWF0bWVudCA8LSAiY29udHJvbCIKdG1lLnRydC50cyRUcmVhdG1lbnQgPC0gInN0b3JhZ2UgZHVyYXRpb24iCnJld2V0LmN0bC50cyRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnJld2V0LmRyeS50cyRUcmVhdG1lbnQgPC0gImFpci1kcnkiCgojIGNvbWJpbmUgcmV3ZXQgZGF0YQpyZXdldC50cyA8LSByYmluZChyZXdldC5jdGwudHMsIHJld2V0LmRyeS50cykKcmV3ZXQudHMkRXhwZXJpbWVudCA8LSAicmV3ZXQiCgojIGFkZCBzb2lsIGRyeSB3dCBkYXRhCmFyY2hpdmUuYXJjLnRzJGR3X2cgPC0gamFyaW5mby5hcmNbbWF0Y2goYXJjaGl2ZS5hcmMudHMkU2FtcGxlTmFtZSwgamFyaW5mby5hcmMkU2FtcGxlKSwgIlNvaWwuZHJ5LndlaWdodF8uZy4iXQphcmNoaXZlLmN0bC50cyRkd19nIDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbbWF0Y2goYXJjaGl2ZS5jdGwudHMkSUQsIGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpLCAiZHJ5X3NvaWxfd3RfY29ycmVjdGVkX2ciXQpyZXdldC50cyA8LSBtZXJnZShyZXdldC50cywgamFyaW5mby5yZXdldFsgLCBjKCJJRCIsICJUcmVhdG1lbnQiLCAiZHdfZyIpXSwgYnkgPSBjKCJJRCIsICJUcmVhdG1lbnQiKSkKdG1lLnRydC50cyA8LSBtZXJnZSh0bWUudHJ0LnRzLCBqYXJpbmZvLnRtZVsgLCBjKCJOci4iLCAiZHJ5LnNvaWwiKV0sIGJ5LnggPSAiU2FtcGxlTmFtZSIsIGJ5LnkgPSAiTnIuIikKY29sbmFtZXModG1lLnRydC50cylbd2hpY2gobmFtZXModG1lLnRydC50cykgPT0gImRyeS5zb2lsIildIDwtICJkd19nIgoKIyBhZGQgZXhwZXJpbWVudCBjb2wgdG8gYXJjaGl2ZS5hcmMudHMsIHN0b3JhZ2UudHJ0LnRzCmFyY2hpdmUuYXJjLnRzJEV4cGVyaW1lbnQgPC0gImFyYyIKdG1lLnRydC50cyRFeHBlcmltZW50IDwtICJ0bWUiCgojIGNvbWJpbmUgYXJjaGl2ZSBkYXRhIGFuZCBFeHBsb3JhdG9yaWVzIHN0b3JhZ2UgZHVyYXRpb24gZGF0YQphcmNoaXZlLnRzIDwtIHJiaW5kKGFyY2hpdmUuY3RsLnRzW3doaWNoKGFyY2hpdmUuY3RsLnRzJFRyZWF0bWVudCAhPSAic3RvcmFnZSBkdXJhdGlvbiIpLCBdLCAKICAgICAgICAgICAgICAgICAgICBhcmNoaXZlLmFyYy50c1sgLCBuYW1lcyhhcmNoaXZlLmN0bC50cyldKQp0bWUudHMgPC0gcmJpbmQoYXJjaGl2ZS5jdGwudHNbd2hpY2goYXJjaGl2ZS5jdGwudHMkVHJlYXRtZW50ID09ICJzdG9yYWdlIGR1cmF0aW9uIiksIF0sCiAgICAgICAgICAgICAgICB0bWUudHJ0LnRzWyAsIG5hbWVzKGFyY2hpdmUuY3RsLnRzKV0pCgojIGJpbmQgdG1lLmN0bC5mbHguc3JhIGRhdGEgdG8gdG1lLnRzCiMgYWxsIG90aGVyIHRtZS5mbHggZGF0YSBpcyBhbHJlYWR5IHN1bW1hcml6ZWQKdG1lLmN0bC5mbHguc3JhJEV4cGVyaW1lbnQgPC0gInRtZSIKdG1lLmN0bC5mbHguc3JhJFRyZWF0bWVudCA8LSAiY29udHJvbCIKdG1lLmN0bC5mbHguc3JhJGR3X2cgPC0gdG1lLmN0bC5zb2lsLnNyYVttYXRjaCh0bWUuY3RsLmZseC5zcmEkSmFyX0lELCB0bWUuY3RsLnNvaWwuc3JhJEphcl9JRCksICJkd19nIl0KdG1lLnRzIDwtIHJiaW5kKHRtZS50cywgdG1lLmN0bC5mbHguc3JhWyAsIG5hbWVzKHRtZS50cyldKQoKIyBUZXN0IHRoYXQgcmVxdWlyZWQgbmFtZXMgYXJlIHByZXNlbnQKbm1zIDwtIGMoIlNhbXBsZU5hbWUiLCAiSUQiLCAiRXhwZXJpbWVudCIsICJUcmVhdG1lbnQiLCAiUGVyaW9kIiwgInRpbWVwb2ludF9jbXR2IiwgICJ0aW1lX2QiLCAidGltZV9kX2NtdHYiLCAibWdDTzJfamFyIiwgImR3X2ciKQppbnZpc2libGUobGFwcGx5KGxpc3QoYXJjaGl2ZS50cyA9IGFyY2hpdmUudHMsCiAgICAgICAgICAgICAgICAgICAgICByZXdldC50cyA9IHJld2V0LnRzLAogICAgICAgICAgICAgICAgICAgICAgdG1lLnRzKSwKICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgaWZlbHNlKCFpcy5uYShtYXRjaChubXMsIG5hbWVzKHgpKSksICJ5ZXMiLCAibm8iKQogICAgICAgfQogICAgICAgKSkKCiMgY29tYmluZSBhbGwgZGF0YSBhbmQgcmVtb3ZlIHRpbWUgcG9pbnRzIHdpdGhvdXQgQ08yIG1lYXN1cmVtZW50cwp0cyA8LSBiaW5kX3Jvd3MoYXJjaGl2ZS50c1sgLCBubXNdLCByZXdldC50c1sgLCBubXNdLCB0bWUudHNbICwgbm1zXSkKaWYobGVuZ3RoKHdoaWNoKGlzLm5hKHRzJG1nQ08yX2phcikpKSA+IDApIHsKICB0cyA8LSB0c1std2hpY2goaXMubmEodHMkbWdDTzJfamFyKSksIF0KfQoKIyBhZGQgQyBjb250ZW50CiMgeHBscgp0cyRnQ19nUyA8LSB4cGxyLmNuW21hdGNoKHRzJElELCB4cGxyLmNuJEVQX1Bsb3RpZCksICJUb3RhbF9DIl0qMTBeLTMKIyBkdWtlCnRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJnQ19nUyJdIDwtIHRtZS5jdGwuZHVrW21hdGNoKHRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJJRCJdLCB0bWUuY3RsLmR1ayRJRCksICJDX2dfa2ciXSoxMF4tMwojIHNpZXJyYXMKdHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgImdDX2dTIl0gPC0gdG1lLmN0bC5zb2lsLnNyYVttYXRjaCh0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiSUQiXSwgdG1lLmN0bC5zb2lsLnNyYSRJRCksICJnQ19rZ1MiXSoxMF4tMwojIG9hayByaWRnZQp0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiZ0NfZ1MiXSA8LSB0bWUuY3RsLm9ybmxbbWF0Y2godHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgIklEIl0sIHRtZS5jdGwub3JubCRJRCksICJDX2dfa2ciXSoxMF4tMwoKIyBhZGQgVHlwZQp0cyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHRzJElEKSwgIkciLCAiRiIpCgojIGNhbGN1bGF0ZSBDTzIgcmVzcGlyYXRpb24gaW4gbWdDTzItQyBwZXIgZyBzb2lsIEMKIyBOQjogMTIvNDQgPSBtYXNzIHJhdGlvIG9mIEMgaW4gQ08yCnRzJG1nQ08yLkNfZ0MgPC0gKHRzJG1nQ08yX2phciooMTIvNDQpKS8odHMkZHdfZyp0cyRnQ19nUykKdHMkbWdDTzIuQ19nQ19kIDwtIHRzJG1nQ08yLkNfZ0MvdHMkdGltZV9kCgojIHN1bW1hcml6ZSBDTzIgcmVsZWFzZSBkYXRhIGZvciBlYWNoIHRpbWVwb2ludCwgYnkgZXhwZXJpbWVudCwgdHJlYXRtZW50LCBhbmQgdHlwZQp0cy5hdmcgPC0gZGF0YS5mcmFtZShuYS5vbWl0KHRzKSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKSkKCiMgYWRkIHRpbWVwb2ludCB6ZXJvIGRhdGEKdHAwLmYgPC0gZnVuY3Rpb24oZGYpIHsKICB0cDAgPC0gZGZbMSwgXQogIHRwMFsgLCAtd2hpY2gobmFtZXModHAwKSA9PSAiRXhwZXJpbWVudCIgfCBuYW1lcyh0cDApID09ICJUcmVhdG1lbnQiIHwgbmFtZXModHAwKSA9PSAiVHlwZSIgfCBuYW1lcyh0cDApID09ICJuIildIDwtIDAKICByYmluZCh0cDAsIGRmKQp9CnRzLmF2ZyR0cmVhdC5FeHAgPC0gcGFzdGUodHMuYXZnJFRyZWF0bWVudCwgdHMuYXZnJEV4cGVyaW1lbnQpCnRzLmF2ZyA8LSBsYXBwbHkoc3BsaXQodHMuYXZnLCB0cy5hdmckdHJlYXQuRXhwKSwgZnVuY3Rpb24oeCkgewogIGxhcHBseShzcGxpdCh4LCB4JFR5cGUpLCB0cDAuZikKICB9KQp0cy5hdmcgPC0gYmluZF9yb3dzKGxhcHBseSh0cy5hdmcsIGJpbmRfcm93cykpCgojIHJlc3RvcmUgY2xhc3Nlcwp0cy5hdmcgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkodHMuYXZnLCB0eXBlLmNvbnZlcnQpKQpgYGAKCiMgUmVzdWx0cwojIyBSZXNwaXJhdGlvbiByYXRlcwoKKkV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSoKClJlc3BpcmF0aW9uIHJhdGVzIGluY3JlYXNlZCBkcmFtYXRpY2FsbHkgZm9sbG93aW5nIHJld2V0dGluZyBmb3IgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCBpbiBjb21wYXJpc29uIHRvIGNvbnRyb2wgc2FtcGxlcywgc2ltaWxhciB0byB3aGF0IGhhcyBiZWVuIG9ic2VydmVkIGluIG90aGVyIGFpci1kcnkvcmV3ZXR0aW5nIHN0dWRpZXMgW2NpdGVdLiBIb3dldmVyLCB0aGUgbWFnbml0dWRlIGFuZCB0aW1pbmcgb2YgdGhlIHBlYWsgaW4gcmVzcGlyYXRpb24gcmF0ZXMgd2FzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGJldHdlZW4gZ3Jhc3NsYW5kIGFuZCBmb3Jlc3Qgc2l0ZXMgW3N0YXRpc3RpY3M7IG90aGVyIGZvcmVzdC9ncmFzc2xhbmQgc3R1ZGllcyBmb3IgY29tcGFyaXNvbj9dICoqKEZpZy4gMykqKi4KCkFtb25nIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSBzYW1wbGVzLCByZXNwaXJhdGlvbiByYXRlcyB3ZXJlIG1vcmUgdGhhbiB0d2ljZSBhcyBoaWdoIGluIGdyYXNzbGFuZCBzb2lscyB0aGFuIGluIGZvcmVzdCBzb2lscywgcmVhY2hpbmcgYSBtYXhpbXVtIG9mIGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoLCBmb2xsb3dlZCBieSBhIHNoYXJwIGRlY2xpbmUuIE1lYW4gcmVzcGlyYXRpb24gcmF0ZXMgaW4gZm9yZXN0IHNpdGVzIHBlYWtlZCBhdCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCwgZm9sbG93ZWQgYnkgYSBtdWNoIG1vcmUgZ3JhZHVhbCBkZWNsaW5lIHRoYW4gaW4gZ3Jhc3NsYW5kIHNpdGVzLiBDb250cm9sIHNhbXBsZXMgcmVzcG9uZGVkIG1vcmUgd2Vha2x5IGFuZCBtb3JlIGdyYWR1YWxseSB0byByZXdldHRpbmcsIGFsdGhvdWdoIGFzIGluIHRoZSB0cmVhdG1lbnQgc2FtcGxlcyByZXNwaXJhdGlvbiB3YXMgZ3JlYXRlciBpbiBncmFzc2xhbmQgc29pbHMgdGhhbiBpbiBmb3Jlc3Qgc29pbHMuIFBlYWsgcmVzcGlyYXRpb24gcmF0ZXMgZm9yIGNvbnRyb2wgaW5jdWJhdGlvbnMgd2VyZSBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgYW5kIGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCBmb3IgZ3Jhc3NsYW5kIGFuZCBmb3Jlc3Qgc29pbHMsIHJlc3BlY3RpdmVseS4KCipFeHBlcmltZW50IDIgKGFpci1kcnkgdHJlYXRtZW50LCAyMDE5IHNhbXBsZXMpKgoKUmVzcGlyYXRpb24gcmF0ZXMgZm9yIHRoZSBhaXItZHJ5IG9ubHkgdHJlYXRtZW50IHNhbXBsZXMgc2hvd2VkIGEgc2ltaWxhcmx5IGRyYW1hdGljIGluY3JlYXNlIGluIGNvbXBhcmlzb24gdG8gdGhlIGNvbnRyb2xzIGFzIHdhcyBvYnNlcnZlZCBmb3IgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCBzYW1wbGVzIGluIEV4cGVyaW1lbnQgMS4gSG93ZXZlciwgdW5saWtlIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQsIHBlYWsgcmVzcGlyYXRpb24gcmF0ZXMgd2VyZSBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgKHAgPiAwLjA1KSBiZXR3ZWVuIGZvcmVzdCBhbmQgZ3Jhc3NsYW5kIHNvaWxzIGluIEV4cGVyaW1lbnQgMiwgcGVha2luZyBhdCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YC4wIGFuZCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoIGZvciBncmFzc2xhbmQgYW5kIGZvcmVzdCBzb2lscywgcmVzcGVjdGl2ZWx5ICoqKEZpZy4gMykqKi4KCmBgYHtyIENPMi1mbHV4LXBsb3RzfQojIFBsb3QgcmVzcCByYXRlcyBvdmVyIHRpbWUKdHMucHJlIDwtIHRzW3RzJFBlcmlvZCA9PSAicHJlIiwgXQp0cy5wcmUuYXZnIDwtIHRzLnByZSAlPiUKICBmaWx0ZXIodGltZV9kX2NtdHYgPiAzLjUpICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2LCBTYW1wbGVOYW1lLCBtZ0NPMi5DX2dDLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIFNhbXBsZU5hbWUpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKG1nQ08yLkNfZ0NfZCA9IG1nQ08yLkNfZ0NfbWVhbi90aW1lX2RfY210dl9tZWFuKSAlPiUKICBzZWxlY3QoLVNhbXBsZU5hbWUsIC1tZ0NPMi5DX2dDX21lYW4sIEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dl9tZWFuKSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKQoKdHMuaW5jLmF2ZyA8LSB0cyAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKQoKY29sbmFtZXModHMucHJlLmF2Zylbd2hpY2gobmFtZXModHMucHJlLmF2ZykgJWluJSBjKCJ0aW1lcG9pbnRfY210dl9tZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAidGltZV9kX2NtdHZfbWVhbl9tZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAidGltZV9kX2NtdHZfbWVhbl9zZCIpKV0gPC0gYygidGltZXBvaW50X2NtdHYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X21lYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X3NkIikKCnRzLnByZS5hdmcgPC0gdHMucHJlLmF2Z1sgLCAtd2hpY2goIW5hbWVzKHRzLnByZS5hdmcpICVpbiUgbmFtZXModHMuaW5jLmF2ZykpXQoKdHMuYXZnMiA8LSBkYXRhLmZyYW1lKHJiaW5kKHRzLnByZS5hdmcsIHRzLmluYy5hdmcpKQp0cy5hdmcyIDwtIHRzLmF2ZzJbY29tcGxldGUuY2FzZXModHMuYXZnMiksIF0KCiMgYWRkIHRpbWVwb2ludCB6ZXJvIGRhdGEKdHMuYXZnMiR0cmVhdC5FeHAgPC0gcGFzdGUodHMuYXZnMiRUcmVhdG1lbnQsIHRzLmF2ZzIkRXhwZXJpbWVudCkKdHMuYXZnMiA8LSBsYXBwbHkoc3BsaXQodHMuYXZnMiwgdHMuYXZnMiR0cmVhdC5FeHApLCBmdW5jdGlvbih4KSB7CiAgbGFwcGx5KHNwbGl0KHgsIHgkVHlwZSksIHRwMC5mKQogIH0pCnRzLmF2ZzIgPC0gYmluZF9yb3dzKGxhcHBseSh0cy5hdmcyLCBiaW5kX3Jvd3MpKQoKIyByZXN0b3JlIGNsYXNzZXMKdHMuYXZnMiA8LSBhcy5kYXRhLmZyYW1lKGxhcHBseSh0cy5hdmcyLCB0eXBlLmNvbnZlcnQpKQoKdHMuYXZnMiAlPiUgCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIGdncGxvdCguLCBhZXModGltZV9kX2NtdHZfbWVhbiwgbWdDTzIuQ19nQ19kX21lYW4pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNCwgY29sb3I9ImdyYXkiKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBzZV9zbG9wZV9sLCB5bWF4ID0gc2Vfc2xvcGVfdSwgZmlsbCA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50LCBhbHBoYSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoRXhwZXJpbWVudCA9IGMoImFyYyIgPSAiMjAxMSIsICJyZXdldCIgPSAiMjAxOSIpKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RkLiBFcnIuJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IC4yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAuMikpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAnZGFzaGVkJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0nc29saWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9ICJkYXNoZWQiKSkgKwogIHlsYWIoZXhwcmVzc2lvbignUmVzcGlyYXRpb24gUmF0ZSAobWdDTydbMl0qJy1DIGdDJ14tMSonZCdeLTEqJyknKSkgKwogIHhsYWIoIlRpbWUgKGRheXMpIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnLiBgciB7KGZpZy5uICsgMil9YC4gUmVzcGlyYXRpb24gcmF0ZXMgZm9yIEV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSBhbmQgRXhwZXJpbWVudCAyIChhaXItZHJ5IG9ubHkgdHJlYXRtZW50KSoqCgo+KkNhcHRpb246KiBUb3AgcGFuZWwgc2hvd3MgZGF0YSBmcm9tIEV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSwgYm90dG9tIHBhbmVsIHNob3dzIGRhdGEgZnJvbSBFeHBlcmltZW50IDIgKGFpci1kcnkgb25seSB0cmVhdG1lbnQpLiBTb2xpZCBsaW5lcyBzaG93IG1lYW4gcmVzcGlyYXRpb24gcmF0ZXMgZm9yIGNvbnRyb2wgc2FtcGxlcyBhbmQgZG90dGVkIGxpbmVzIHNob3cgbWVhbiByZXNwaXJhdGlvbiByYXRlcyBmb3IgdHJlYXRtZW50IHNhbXBsZXMuIFNoYWRlZCByaWJib25zIHNob3cgdGhlIHN0YW5kYXJkIGVycm9yLiBUaGUgZmluYWwgbWVhc3VyZW1lbnQgcG9pbnRzIGZvciBhIGZldyBzYW1wbGVzIHdoaWNoIHRvb2sgPjE4IGRheXMgdG8gcmVhY2ggQ09+Mn4gdGFyZ2V0cyBhcmUgZXhjbHVkZWQgZm9yIGRpc3BsYXkgcmVhc29ucy4gUmVzcGlyYXRpb24gcmF0ZXMgZm9yIHRob3NlIHNhbXBsZXMgcmVtYWluZWQgZmxhdC4gV2hpbGUgZGFpbHkgbWVhc3VyZW1lbnRzIHdlcmUgbWFkZSBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBmb3IgdGhlIG1ham9yaXR5IG9mIHNhbXBsZXMsIG9ubHkgdGhlIGN1bXVsYXRpdmUgcHJlLWluY3ViYXRpb24gZmx1eCB3YXMgbWVhc3VlZCBmb3IgdGhlIDIwMTEgY29udHJvbCBzYW1wbGVzLiBDb25zZXF1ZW50bHksIHRoZSByZXNwaXJhdGlvbiByYXRlIGZvciB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIHdhcyBjYWxjdWxhdGVkIGN1bXVsYXRpdmVseSBmb3IgYWxsIHNhbXBsZXMuCgoqU3VwcGxlbWVudGFsIHJlc3BpcmF0aW9uIHJhdGVzIGZpZ3VyZToqCgpgYGB7ciByZXNwLXJhdGUtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyByZXdldCBtYXggcmVzcCByYXRlcwp0LnRlc3QodGFwcGx5KHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZCJdLHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJHIiwgIlNhbXBsZU5hbWUiXSwgbWF4LCBuYS5ybSA9IFRSVUUpLAp0YXBwbHkodHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kIl0sdHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkYiLCAiU2FtcGxlTmFtZSJdLCBtYXgsIG5hLnJtID0gVFJVRSkpCmBgYAoKYGBge3IgQ08yIGZsdXhlcyBwbG90c30KIyBkYWlseSBwbG90CnRzLmF2ZyAlPiUgCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIG11dGF0ZSh0cnRFeHAgPSBwYXN0ZTAoVHJlYXRtZW50LCBFeHBlcmltZW50KSkgJT4lCiAgZmlsdGVyKHRydEV4cCAhPSAiY29udHJvbGFyYyIpICU+JQogIGZpbHRlcih0aW1lX2RfY210dl9tZWFuIDwgNSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh0aW1lX2RfY210dl9tZWFuLCBtZ0NPMi5DX2dDX2RfbWVhbikpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHNlX3Nsb3BlX2wsIHltYXggPSBzZV9zbG9wZV91LCBmaWxsID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQsIGFscGhhID0gVHJlYXRtZW50KSkgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKEV4cGVyaW1lbnQpLAogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihFeHBlcmltZW50ID0gYygiYXJjIiA9ICIyMDExIiwgInJld2V0IiA9ICIyMDE5IikpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCw0KSkgKwogICMgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwzMCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICdTdGQuIEVyci4nLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gLjIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IC4yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9ICdkYXNoZWQnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSdzb2xpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gImRhc2hlZCIpKSArCiAgeWxhYihleHByZXNzaW9uKCdSZXNwaXJhdGlvbiBSYXRlIChtZ0NPJ1syXSonLUMgZ0MnXi0xKidkJ14tMSonKScpKSArCiAgeGxhYigiVGltZSAoZGF5cykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZyBgciB7KGZpZy5uICsgMyl9YC4gUmVzcGlyYXRpb24gcmF0ZXMgKGRhaWx5IHByZS1pbmN1YmF0aW9uIHBlcmlvZCBtZWFzdXJlbWVudHMpKioKCj4qQ2FwdGlvbjoqIERhaWx5IG1lYXN1cmVtZW50cyBtYWRlIGZvciB0aGUgdHJlYXRtZW50IHNhbXBsZXMgaW4gRXhwZXJpbWVudCAxIGFuZCBmb3IgYm90aCBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyBpbiBFeHBlcmltZW50IDIgc2hvdyB0aGF0IHRyZWF0bWVudCBzYW1wbGUgcmVzcGlyYXRpb24gcmF0ZXMgcGVha2VkIG1vcmUgcmFwaWRseSBpbiBncmFzc2xhbmQgc29pbHMgdGhhbiBpbiBmb3Jlc3Qgc29pbHMgYW5kIHdhcyBvZiBzaWduaWZpY2FudGx5IGdyZWF0ZXIgbWFnbml0dWRlIGluIGJvdGggZXhwZXJpbWVudHMuIENvbnRyb2wgc2FtcGxlIGRhdGEgbm90IHNob3duIGZvciBFeHBlcmltZW50IDEgYXMgb25seSB0aGUgZm91ciBkYXkgYXZlcmFnZSByYXRlIHdhcyBtZWFzdXJlZC4gW1RoaW5raW5nIHRoaXMgcGxvdCBzaG91bGQgZ28gaW4gU0ksIGlmIHdlIGRlY2lkZSB0byBpbmNsdWRlXS4KCgojIyBSYWRpb2NhcmJvbiBkYXRhCgpgYGB7ciBsb2FkIGFtcy1qZW5hLWluZ2VzdCBmeH0KIyAxLiBSZWFkIGluIGlzb3RvcGUgZGF0YSBmcm9tIHZhcmlvdXMgc291cmNlcwojIEZpcnN0IGxvYWQgaGVscGVyIGZ1bmN0aW9uICdyZWFkX2plbmFfYW1zX3Jlc3VsdHMuUiIKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2Ftc19pbmdlc3QuUiIpCmBgYAoKYGBge3IgcmVhZCBpc28gZGF0YX0KIyAyLiBOZXh0IHJlYWQgaW4gZGF0YSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcmllcyBpbiAnZGF0YS9yYXcnCiMgaWRlbnRpZnkgc3ViZGlyZWN0b3JpZXMgaW4gJ3JhdycgZGlyZWN0b3J5IHdpdGggImFtc19qZW5hIiBpbiBuYW1lCmFtc19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiYW1zX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQphbXNfcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGFtc19qZW5hX3Jlc3VsdHNfZGlycyksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfYW1zX3Jlc3VsdHMoYW1zX2plbmFfcmVzdWx0c19kaXJzW2ldKQp9KQpuYW1lcyhhbXNfcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiKQpgYGAKCmBgYHtyIGFyYyBhbmQgcmV3ZXQgZXhwZXJpbWVudCB0ZW1wbGF0ZX0KIyAzLiBDcmVhdGUgYSAidGlkeSIgc3R5bGUgdGVtcGxhdGUgZm9yIHRoZSBkYXRhLCBpLmUuIHZhcmlhYmxlcyBpbiBjb2x1bW5zLiAKIyBLZXkgdmFyaWFibGVzIGFyZSBhcyBmb2xsb3dzOgojICAgKiBTYW1wbGVOYW1lIChpbmNvcnBvcmF0ZXMgbGFiIHJlcCBhbmQgdHJlYXRtZW50LCBlLmcuICJIRUcxMC0xX2RyeSIpCiMgICAqIElEIChwbG90IElEcywgZS5nLiBmb3IgIkhFRzEwIiBmb3IgRXhwbG9yYXRvcnkgc2FtcGxlcykKIyAgICogVHJlYXRtZW50ICgzIHRyZWF0bWVudHM6IGFpci1kcnksIGFpci1kcnkgKyBzdG9yYWdlLCBzdG9yYWdlIGR1cmF0aW9uOyArIGNvbnRyb2xzKQojICAgKiBUeXBlICgyIGxldmVsczogRiA9IGZvcmVzdCwgRyA9IGdyYXNzbGFuZCkKIyAgICogUGVyaW9kIChpbmN1YmF0aW9uIHBlcmlvZCwgMiBsZXZlbHM6IHByZSA9IHByZWluY3ViYXRpb24sIGluYyA9IGVxdWlsaWJyaXVtIGluY3ViYXRpb24pCiMgICAqIEV4cGVyaW1lbnQgKDMgbGV2ZWxzOiBhcmMgPSBhaXItZHJ5ICsgc3RvcmFnZSwgcmV3ZXQgPSBhaXItZHJ5L3Jld2V0LCB0aW1lID0gc3RvcmFnZSBkdXJhdGlvbikKIyAKIyAqIE9ic2VydmF0aW9uYWwgY29sdW1ucyBpbmNsdWRlOgojICAgKiBkMTRjICgkXERlbHRhJF4xNF5DLUNPfjJ+KQojICAgKiBkMTNjICgkXGRlbHRhJF4xM15DLUNPfjJ+KQojICAgKiBDX2dfa2cgKEMgY29udGVudCkKIyAgICogZHdfZyAoZHJ5IHdlaWdodCkKIyAgICogbWdDTzIuQ19nUyAobWcgQ09+Mn4tQyByZXNwaXJlZCBnXi0xXiBzb2lsIFBlcmlvZF4tMV4pCiMgICAqIHRpbWVfZCAoZGF5cyBpbiBpbmN1YmF0aW9uIHBlcmlvZCBwcmlvciB0byBtZWFzdXJlbWVudCkKIyAgICogZEgyT19ncmF2IChwZXJjZW50IGNoYW5nZSBpbiBncmF2aW1ldHJpYyB3YXRlciBjb250ZW50IGR1ZSB0byBsYWJvcmF0b3J5IG1vaXN0dXJlIGFkanVzdG1lbnQpCiMgICAqIGRIMk9fd2hjIChwZXJjZW50IGNoYW5nZSBpbiB3YXRlciBob2xkaW5nIGNhcGFjaXR5IGR1ZSB0byBsYWJvcmF0b3J5IG1vaXN0dXJlIGFkanVzdG1lbnQpCiAgCnVuaXF1ZS5pZC5uIDwtIGMobGVuZ3RoKHVuaXF1ZShhcmNoaXZlLmN0bC50cyRJRCkpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUoYXJjaGl2ZS5hcmMudHMkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUocmV3ZXQuY3RsLnRzJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHJld2V0LmRyeS50cyRTYW1wbGVOYW1lKSkpCnByZS4xNGMgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gYyhhcy5jaGFyYWN0ZXIodW5pcXVlKGFyY2hpdmUuY3RsLnRzJElEKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKGFyY2hpdmUuYXJjLnRzJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUocmV3ZXQuY3RsLnRzJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUocmV3ZXQuZHJ5LnRzJFNhbXBsZU5hbWUpKSkpCnByZS4xNGMkSUQgPC0gc3Vic3RyKHByZS4xNGMkU2FtcGxlTmFtZSwgMSwgNSkKcHJlLjE0YyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHByZS4xNGMkSUQpLCAiRyIsICJGIikKcHJlLjE0YyRFeHBlcmltZW50IDwtIGMocmVwKCJhcmMiLCB1bmlxdWUuaWQublsxXSArIHVuaXF1ZS5pZC5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICByZXAoInJld2V0IiwgdW5pcXVlLmlkLm5bM10gKyB1bmlxdWUuaWQubls0XSkpCnByZS4xNGMkVHJlYXRtZW50IDwtIGMocmVwKCJjb250cm9sIiwgdW5pcXVlLmlkLm5bMV0pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYWlyLWRyeSArIHN0b3JhZ2UiLCB1bmlxdWUuaWQublsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJjb250cm9sIiwgdW5pcXVlLmlkLm5bM10pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYWlyLWRyeSIsIHVuaXF1ZS5pZC5uWzRdKSkKcHJlLjE0YyRQZXJpb2QgPC0gInByZSIKCiMgY3JlYXRlIGluYyBwZXJpb2QgZGYgYXMgZHVwbGljYXRlIG9mIHByZS1pbmMgZGYsIGJ1dCB0ZXN0IHRoYXQgaXQgaXMgdGhlIHJpZ2h0IHNoYXBlIGZpcnN0CmlmKG5yb3cocHJlLjE0YykgPT0gc3VtKHVuaXF1ZS5pZC5uKSAmIG5jb2wocHJlLjE0YykgPT0gNikgewogIGluYy4xNGMgPC0gcHJlLjE0YwogIGluYy4xNGMkUGVyaW9kIDwtICJpbmMiCn0gZWxzZSB7CiAgInByZS4xNGMgZGF0YSBmcmFtZSBtYWxmb3JtZWQiCn0KYWxsLjE0Yy50ZW1wbGF0ZSA8LSByYmluZChwcmUuMTRjLCBpbmMuMTRjKQpgYGAKCmBgYHtyIHRtZSBleHBlcmltZW50IHRlbXBsYXRlfQp1bmlxdWUuaWQudG1lLm4gPC0gYyhsZW5ndGgodW5pcXVlKHRtZS5jdGwuZHVrJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZSh0bWUuY3RsLm9ybmwkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS5jdGwuZmx4LnNyYSRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUodG1lLm1pc2MkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKGFyY2hpdmUuY3RsLnRzLndpZGVbYXJjaGl2ZS5jdGwudHMud2lkZSRFeHBlcmltZW50ID09ICJ0bWUiLCAiSUQiXSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpKQpwcmUudG1lLmN0bCA8LSBkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSBjKGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5kdWskU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5vcm5sJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHRtZS5jdGwuZmx4LnNyYSRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZSh0bWUubWlzYyRTYW1wbGVOYW1lKSksICAgYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlW2FyY2hpdmUuY3RsLnRzLndpZGUkRXhwZXJpbWVudCA9PSAidG1lIiwgIklEIl0pKSkpCnByZS50bWUuY3RsJFNpdGUgPC0gYyhyZXAoIkR1a2UiLCB1bmlxdWUuaWQudG1lLm5bMV0pLAogICAgICAgICAgICAgICAgICAgICAgcmVwKCJPUk5MIiwgdW5pcXVlLmlkLnRtZS5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgiU2llcnJhIiwgdW5pcXVlLmlkLnRtZS5uWzNdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgibWlzYyIsIHVuaXF1ZS5pZC50bWUubls0XSksCiAgICAgICAgICAgICAgICAgICAgICByZXAoIlhwbHIiLCB1bmlxdWUuaWQudG1lLm5bNV0pKQoKCiMgRHVrZSwgT1JOTCwgbWlzYywgYW5kIFhwbHIgSURzCnByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIkR1a2UiIHwgCiAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiIHwKICAgICAgICAgICAgcHJlLnRtZS5jdGwkU2l0ZSA9PSAibWlzYyIgfAogICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJYcGxyIiwgIklEIl0gPC0gYXMuY2hhcmFjdGVyKHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIkR1a2UiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIm1pc2MiIHwKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJYcGxyIiwgIlNhbXBsZU5hbWUiXSkKCiMgU2llcnJhIElEcwpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSA8LQogIHN1YnN0cihwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiU2FtcGxlTmFtZSJdLCAxMCwgMTEpCgojIHN1YmRpdmlkZSBPUk5MIGludG8gV0IgYW5kIFRWQQpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJPUk5MIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIlRWQSIsIHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiLCAiSUQiXSksICJUZW5uZXNzZWUgVmFsbGV5IiwgIldhbGtlciBCcmFuY2giKQoKIyBzdWJkaXZpZGUgU2llcnJhIGludG8gTXVzaWNrIGFuZCBTaGF2ZXIKcHJlLnRtZS5jdGxbcHJlLnRtZS5jdGwkU2l0ZSA9PSAiU2llcnJhIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIk0iLCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSksICJNdXNpY2siLCAiU2hhdmVyIikKCiMgYWRkIHRyZWF0bWVudCBjb2wKcHJlLnRtZS5jdGwkVHJlYXRtZW50IDwtICJjb250cm9sIgoKcHJlLnRtZS50cnQgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gdW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpCnByZS50bWUudHJ0JElEIDwtIHN1YnN0cihwcmUudG1lLnRydCRTYW1wbGVOYW1lLCAxLCBuY2hhcihhcy5jaGFyYWN0ZXIocHJlLnRtZS50cnQkU2FtcGxlTmFtZSkpLTIpCnByZS50bWUudHJ0IDwtIHJiaW5kKHByZS50bWUudHJ0LCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJtaXNjIiwgYygiSUQiLCAiU2FtcGxlTmFtZSIpXSkKcHJlLnRtZS50cnQkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgpwcmUudG1lLnRydCRTaXRlIDwtIHByZS50bWUuY3RsW21hdGNoKHByZS50bWUudHJ0JElELCBwcmUudG1lLmN0bCRJRCksICJTaXRlIl0KCnByZS50bWUuMTRjIDwtIHJiaW5kKHByZS50bWUuY3RsLCBwcmUudG1lLnRydCkKcHJlLnRtZS4xNGMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBwcmUudG1lLjE0YyRTYW1wbGVOYW1lKSwgIkciLCAiRiIpCnByZS50bWUuMTRjJFBlcmlvZCA8LSAicHJlIgpwcmUudG1lLjE0YyRFeHBlcmltZW50IDwtICJ0bWUiCgojIGNyZWF0ZSBpbmMgcGVyaW9kIGRmCmluYy50bWUuMTRjIDwtIHByZS50bWUuMTRjCmluYy50bWUuMTRjJFBlcmlvZCA8LSAiaW5jIgp0bWUuMTRjLnRlbXBsYXRlIDwtIHJiaW5kKHByZS50bWUuMTRjLCBpbmMudG1lLjE0YykKYGBgCgpgYGB7ciBjb21iaW5lIHNvaWwgb2JzIGRhdGF9CiMgNC4gU3VtbWFyaXplIG9ic2VydmF0aW9uYWwgZGF0YSBmcm9tIHRpbWVzZXJpZXMgZGF0YSBieSB1bmlxdWUgSURzIChTYW1wbGVOYW1lKQojIHN1bW1hcml6ZSB0aW1lIGFuZCBjbzIgZGF0YSBieSBleHBlcmltZW50LCBwZXJpb2QsIHRyZWF0bWVudCwgYW5kIHNhbXBsZSBuYW1lCnRzLmVwc24uYXZnIDwtIHRzICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBJRCwgUGVyaW9kLCBUcmVhdG1lbnQsIFNhbXBsZU5hbWUsIGdDX2dTLCBkd19nLCBtZ0NPMi5DX2dDLCB0aW1lX2QsIHRpbWVfZF9jbXR2KSAgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgSUQsIFBlcmlvZCwgVHJlYXRtZW50LCBTYW1wbGVOYW1lKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWF4ID0gbWF4KSwgbmEucm0gPSBUUlVFKQp0cy5lcHNuLmF2ZyA8LSByZW5hbWVfYXQodHMuZXBzbi5hdmcsIHZhcnMoY29udGFpbnMoJ21heCcpKSwgbGlzdCh+c3ViKCJfbWF4IiwgIiIsIC4pKSkKYGBgCgpgYGB7ciBjbGVhbiB1cCAxNEMgZGF0YX0KIyA2LiBDbGVhbiB1cCBeMTReQyBkYXRhIGFuZCBhZGQgZXh0ZXJuYWwgZGF0YSBwb2ludHMgKHRtZSBleHBlcmltZW50LCBYcGxyIGNvbnRyb2wgc2FtcGxlcykKIyBOZWVkIHRvIGFkZCBTYW1wbGVOYW1lIGNvbCBhbmQgdmFyaWFibGUgY29sdW1ucyBUcmVhdG1lbnQsIFBlcmlvZCwgYW5kIEV4cGVyaW1lbnQgdG8gYWxsIGRhdGEgZnJhbWVzIGluIGFtc19yZXN1bHRzX2xzIAoKIyBGaXJzdCBhZGQgMTRDIGFuZCAxM0MgZGF0YSBmcm9tIEV4cGxvcmF0b3JpZXMgY29udHJvbCBzYW1wbGVzIHRvIGFtc19yZXN1bHRzX2xzCiMgbm90ZSB0aGF0IG5laXRoZXIgMTNDIG5vciAxNEMgd2FzIG1lYXN1cmVkIGZvciB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGZvciB0aGVzZSBzYW1wbGVzCiMgZ2V0IG5hbWVzIGZvciBhbXNfcmVzdWx0cyBkYXRhIGZyYW1lcwpyZXN1bHRzLjE0Yy5ubXMgPC0gbmFtZXMoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgKQojIGdldCBuYW1lcyBmb3IgcmVsZXZhbnQgRXhwZXJpbWVudC9UcmVhdG1lbnQvUGVyaW9kIGNvbWJpbmF0aW9uCmFyY19jdGxfaW5jX1NOIDwtIGFzLmNoYXJhY3RlcihhbGwuMTRjLnRlbXBsYXRlW2FsbC4xNGMudGVtcGxhdGUkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFsbC4xNGMudGVtcGxhdGUkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGFsbC4xNGMudGVtcGxhdGUkUGVyaW9kID09ICJpbmMiLCAiU2FtcGxlTmFtZSJdKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHVubGlzdChsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24oeCkgdW5saXN0KGxhcHBseSh4LCAiW1siLCAiUHJvYmUiKSkpKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHRtZV9jdGxfaW5jX3hwbHJfU05bZ3JlcCgiSEUiLCB0bWVfY3RsX2luY194cGxyX1NOKV0KaWYobGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pID09IDE0KSB7CiAgdG1lX2N0bF9pbmNfeHBscl9TTiA8LSB1bmlxdWUoc3Vic3RyKHRtZV9jdGxfaW5jX3hwbHJfU04sIDEsIG5jaGFyKHRtZV9jdGxfaW5jX3hwbHJfU04pLTIpKQp9CgojIGFkZCBzdWJsaXN0IGZvciBFeHBsb3JhdG9yaWVzIDIwMTEgKGNvbnRyb2wpIGRhdGEgYW5kIGRhdGEgZnJhbWVzIGZvciBhYm92ZSBzdWJzZXRzCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IGxlbmd0aChhcmNfY3RsX2luY19TTiksIG5jb2wgPSBsZW5ndGgocmVzdWx0cy4xNGMubm1zKSkpCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsciA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gbGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pLCBuY29sID0gbGVuZ3RoKHJlc3VsdHMuMTRjLm5tcykpKQoKIyBhZGQgbmFtZXMgYW5kIGZpbGwgU2FtcGxlTmFtZXMgZm9yIG5ldyBkYXRhIGZyYW1lcwphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExIDwtIGxhcHBseShhbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExLCBmdW5jdGlvbih4KSB7CiAgbmFtZXMoeCkgPC0gcmVzdWx0cy4xNGMubm1zCiAgcmV0dXJuKHgpCiAgfSkgCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmNbICwgYygiU2FtcGxlTmFtZSIsIlByb2JlIildIDwtIGFyY19jdGxfaW5jX1NOCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsclsgLCBjKCJTYW1wbGVOYW1lIiwiUHJvYmUiKV0gPC0gdG1lX2N0bF9pbmNfeHBscl9TTgoKIyBmaWxsIDE0QyBkYXRhCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEgPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkYOKIhjE0Qy4o4oCwKWAgPC0geHBsci5jdGwuaXNvW21hdGNoKGRmJFByb2JlLCB4cGxyLmN0bC5pc28kRVBfUGxvdGlkKSwgIjE0Y19DTzIiXQogIGRmJFRyZWF0bWVudCA8LSAiY29udHJvbCIKICBkZiRQZXJpb2QgPC0gImluYyIKICByZXR1cm4oZGYpCn0pCgojIGFkZCBFeHBlcmltZW50CmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMkRXhwZXJpbWVudCA8LSAiYXJjIgphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJHRtZV9jdGxfaW5jX3hwbHIkRXhwZXJpbWVudCA8LSAidG1lIgoKCiMgYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTgtMTAtMTJgIGFuZCBgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOC0xMS0wOWAKIyBgQmVlbS1NaWxsZXJfNC54bHN4YCwgYEJlZW0tTWlsbGVyXzUueGxzeGA7IGBCZWVtLU1pbGxlcl82Lnhsc3hgLCBgQmVlbS1NaWxsZXJfNy54bHN4YAojIEFkZCB0cmVhdG1lbnQsIGV4cGVyaW1lbnQsIHBlcmlvZCBjb2xzCiMgRXhwZXJpbWVudCA9IHRtZQojIFRyZWF0bWVudCA9IHN0b3JhZ2UgZHVyYXRpb24KIyBQZXJpb2QgPSBpbmMKYW1zX3Jlc3VsdHNfbHNbMToyXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24obHMpIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICBkZiRFeHBlcmltZW50IDwtICJ0bWUiCiAgZGYkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgogIGRmJFBlcmlvZCA8LSAiaW5jIgogIHJldHVybihkZikKICB9KQopCgojIGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YAojIGBCZWVtLU1pbGxlcl85Lnhsc3hgCiMgRXhwZXJpbWVudCA9IGFyYwojIFRyZWF0bWVudCA9IGFpci1kcnkgKyBzdG9yYWdlCiMgUGVyaW9kID0gcHJlCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRTYW1wbGVOYW1lIDwtIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRQcm9iZQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJFBlcmlvZCA8LSAicHJlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkRXhwZXJpbWVudCA8LSAiYXJjIgoKIyBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkCiMgQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IGluYwphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRQcm9iZSwgMSwgOSkKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkUGVyaW9kIDwtICJpbmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JEV4cGVyaW1lbnQgPC0gImFyYyIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgCiMgYFJvc3RfMzEtMi54bHN4YAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IGluYywgcHJlIChTRVcxMS0yLTIpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFByb2JlLCAxLCA5KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRFeHBlcmltZW50IDwtICJhcmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgWzI6OSwgIlBlcmlvZCJdIDwtICJpbmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgWzEwLCAiUGVyaW9kIl0gPC0gInByZSIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgCiMgUm9zdF80Ny54bHN4IAojIEV4cGVyaW1lbnQgPSByZXdldAojIFRyZWF0bWVudCA9IGNvbnRyb2wKIyBQZXJpb2QgPSBwcmUKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFByb2JlLCAxLCA3KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFRyZWF0bWVudCA8LSAiY29udHJvbCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRFeHBlcmltZW50IDwtICJyZXdldCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRQZXJpb2QgPC0gInByZSIKIyBSb3N0XzUwLnhsc3gKIyBFeHBlcmltZW50ID0gcmV3ZXQKIyBUcmVhdG1lbnQgPSBjb250cm9sCiMgUGVyaW9kID0gaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRQcm9iZSwgMSwgNykKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkRXhwZXJpbWVudCA8LSAicmV3ZXQiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkUGVyaW9kIDwtICJpbmMiCiMgUm9zdF81Mi54bHN4CiMgRXhwZXJpbWVudCA9IHJld2V0CiMgVHJlYXRtZW50ID0gYWlyLWRyeQojIFBlcmlvZCA9IHByZSwgaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRQcm9iZSwgMSwgMTEpCnByZS5peCA8LSB3aGljaChncmVwbCgiUFJFIiwgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRQcm9iZSkpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkVHJlYXRtZW50IDwtICJhaXItZHJ5IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JEV4cGVyaW1lbnQgPC0gInJld2V0IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4W3ByZS5peCwgIlBlcmlvZCJdIDwtICJwcmUiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3hbLXByZS5peCwgIlBlcmlvZCJdIDwtICJpbmMiCmBgYAoKYGBge3IgY29tYmluZSAxNEMgc29pbCBvYnMgZGF0YX0KIyA3LiBDb21iaW5lIGRhdGEuCiMgZmxhdHRlbiBsaXN0IGFuZCByZW1vdmUgQU1TIGJsYW5rcywgTkEgc2FtcGxlcywgYW5kIG5vbi1FeHBsb3JhdG9yeSBkYXRhCmFtc19yZXN1bHRzX2FyY19yZXdldCA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMzo3XSwgZnVuY3Rpb24oeCkgYmluZF9yb3dzKHgpKQphbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYgPC0gYmluZF9yb3dzKGxhcHBseShhbXNfcmVzdWx0c19hcmNfcmV3ZXQsIGZ1bmN0aW9uKHgpIGV4dHJhLmNsZWFuLmZ4KHgpKSkKCiMgZmxhdHRlbiBleHRlcm5hbCBkYXRhIGxpc3QKYW1zX3Jlc3VsdHNfdG1lIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc1tjKDE6Miw3KV0sIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCB0bWUuMTRjLmZ4KSkKYW1zX3Jlc3VsdHNfdG1lLmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoYW1zX3Jlc3VsdHNfdG1lLCBmdW5jdGlvbih4KSBiaW5kX3Jvd3MoeCkpKQoKIyBjdXQgb3V0IG5vbi1yZWxldmFudCBBTVMgcmVzdWx0cyBjb2x1bW5zCm5tcy5hbXMudmFycyA8LSBjKCJGMTRDIiwgImVyciIsICLiiIYxNEMuKOKAsCkiLCAiZXJyLijigLApIiwKICAgICAgICAgICAgICAgICAiU2FtcGxlTmFtZSIsICJUcmVhdG1lbnQiLCAiUGVyaW9kIiwgIkV4cGVyaW1lbnQiKQphbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYgPC0gYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmWyAsIG5tcy5hbXMudmFyc10KY29sbmFtZXMoYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmKSA8LSBjKCJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIsIG5tcy5hbXMudmFyc1s1OjhdKQoKYW1zX3Jlc3VsdHNfdG1lLmRmIDwtIGFtc19yZXN1bHRzX3RtZS5kZlsgLCBubXMuYW1zLnZhcnNdCmNvbG5hbWVzKGFtc19yZXN1bHRzX3RtZS5kZikgPC0gYygiZm0iLCAiZm1fZXJyIiwgImQxNGMiLCAiZDE0Y19lcnIiLCBubXMuYW1zLnZhcnNbNTo4XSkKYW1zX3Jlc3VsdHNfdG1lLmRmJElEIDwtIHN1YnN0cihhbXNfcmVzdWx0c190bWUuZGYkU2FtcGxlTmFtZSwgMSwgbmNoYXIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUpLTIpCmFtc19yZXN1bHRzX3RtZS5kZiRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIGFtc19yZXN1bHRzX3RtZS5kZiRJRCksICJHIiwgIkYiKQoKIyBtZXJnZSBhcmMgYW5kIHJld2V0IDE0QyBkYXRhIHdpdGggdGVtcGxhdGUKaWYobnJvdyhtZXJnZShhbGwuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYsIGFsbC54ID0gVFJVRSkpID09IG5yb3coYWxsLjE0Yy50ZW1wbGF0ZSkpIHsKICBhbGwuMTRjIDwtIG1lcmdlKGFsbC4xNGMudGVtcGxhdGUsIGFtc19yZXN1bHRzX2FyY19yZXdldC5kZiwgYWxsLnggPSBUUlVFKQp9IGVsc2UgewogIGNhdCgiZHVwbGljYXRlIHNhbXBsZSBtZXJnZSBlcnJvciIpCn0KCiMgbWVyZ2Ugc29pbCBvYnMgZGF0YSB3aXRoIDE0YyBkYXRhCmlmKG5yb3cobWVyZ2UoYWxsLjE0YywgdHMuZXBzbi5hdmcsIGJ5ID0gYygiU2FtcGxlTmFtZSIsICJQZXJpb2QiKSkpID09IG5yb3coYWxsLjE0YykpIHsKICBhbGwuMTRjIDwtIG1lcmdlKGFsbC4xNGMsIHRzLmVwc24uYXZnLCBhbGwueCA9IFRSVUUpCn0gZWxzZSB7CiAgY2F0KCJkdXBsaWNhdGUgc2FtcGxlIG1lcmdlIGVycm9yIikKfQoKIyBtZXJnZSB0bWUgMTRDIGRhdGEgd2l0aCB0ZW1wbGF0ZSBhbmQgdHMuZXBzbi5hdmcKdG1lLjE0YyA8LSBtZXJnZSh0bWUuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c190bWUuZGYsIGFsbC54ID0gVFJVRSkKCiMgYWRkIGN0bCBzYW1wbGUgMTRDIGRhdGEgdG8gdG1lLjE0YwojIGZpcnN0IHJlbW92ZSBOQSB2YWx1ZXMKdG1lLjE0Yy5jbGVhbiA8LSB0bWUuMTRjW3doaWNoKCFpcy5uYSh0bWUuMTRjJGQxNGMpIHwgIWlzLm5hKHRtZS4xNGMkZm0pKSwgXQojIGRlZmluZSBtZXJnZSBmeAp0bWUubXJnLmZ4IDwtIGZ1bmN0aW9uKHgsIHkpIHsKICBtcmcubm1zIDwtIGMoIlNhbXBsZU5hbWUiLCAiSUQiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIpCiAgdmFyLm5tcyA8LSBjKCJZZWFyU2FtcGxlZCIsICJTaXRlIiwgIkhvcml6b24iLCAgImQxNGMiLCAiZm0iKQogIGlmKGxlbmd0aChncmVwKCJmbSIsIG5hbWVzKHkpKSkgPiAwKSB7CiAgICBkZiA8LSBtZXJnZSh4WyAsIG1yZy5ubXNdLCB5WyAsIGMobXJnLm5tcywgdmFyLm5tcyldKQogIH0gZWxzZSB7CiAgICBkZiA8LSBtZXJnZSh4WyAsIG1yZy5ubXNdLCB5WyAsIGMobXJnLm5tcywgdmFyLm5tc1sxOjRdKV0pCiAgICBkZiRmbSA8LSBOQQogIH0KICByZXR1cm4oZGYpCn0KCnRtZS4xNGMuZGYgPC0gYmluZF9yb3dzKGxhcHBseShsaXN0KHRtZS5jdGwuZHVrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLmN0bC5mbHguc3JhW3doaWNoKCFpcy5uYSh0bWUuY3RsLmZseC5zcmEkZDE0YykpLCBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLmN0bC5vcm5sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLm1pc2MpLCBmdW5jdGlvbihpKSB0bWUubXJnLmZ4KHRtZS4xNGMsIGkpKSkKCiMgYWRkIHN0b3JhZ2UgZHVyYXRpb24gZGF0YSBmb3IgdHJlYXRtZW50IHNhbXBsZXMgYW5hbHl6ZWQgZXh0ZXJuYWxseQp0bWUuMTRjLmRmJFR5cGUgPC0gIkYiCgojIGFkZCBZZWFyU2FtcGxlZCBmb3IgdG1lLjE0Yy5jbGVhbiBzYW1wbGVzCmZvcihpIGluIDE6bnJvdyh0bWUuMTRjLmNsZWFuKSkgewogIGlmKHRtZS4xNGMuY2xlYW5baSwgIlNpdGUiXSA9PSAiRHVrZSIpIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAwOAogIH0gZWxzZSBpZih0bWUuMTRjLmNsZWFuW2ksICJTaXRlIl0gPT0gIlhwbHIiKSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMTEKICB9IGVsc2UgaWYodG1lLjE0Yy5jbGVhbltpLCAiU2l0ZSJdID09ICJTaWVycmEiKSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMDkKICB9IGVsc2UgewogICAgdG1lLjE0Yy5jbGVhbltpLCAiWWVhclNhbXBsZWQiXSA8LSAyMDA0CiAgfQp9CgojIEFkZCBIb3Jpem9uIHRvIHRtZS4xNGMuY2xlYW4KdG1lLjE0Yy5jbGVhbiRIb3Jpem9uIDwtIGlmZWxzZSh0bWUuMTRjLmNsZWFuJElEID09ICJNQiIgfCB0bWUuMTRjLmNsZWFuJElEID09ICJTQiIsICJCIiwgIkEiKQoKIyBjb21iaW5lIHRtZSBkYXRhCnRtZS4xNGMgPC0gYmluZF9yb3dzKHRtZS4xNGMuY2xlYW5bICwgbmFtZXModG1lLjE0Yy5kZildLCB0bWUuMTRjLmRmKQp0bWUuMTRjJEV4cGVyaW1lbnQgPC0gInRtZSIKCiMgcmVtb3ZlIG91dGxpZXIgKE1BLTEpCiMgKioqIE5lZWQgdG8gY2xhcmlmeSBtZXRob2QgZm9yIGRldGVybWluaW5nIHRoYXQgdGhpcyBpcyBhbiBvdXRsaWVyICoqKiAKdG1lLjE0YyA8LSB0bWUuMTRjWy13aGljaCh0bWUuMTRjJFNhbXBsZU5hbWUgPT0gIk1BLTEiIHwgdG1lLjE0YyRTYW1wbGVOYW1lID09ICJIRVc0OS0xIiB8IHRtZS4xNGMkU2FtcGxlTmFtZSA9PSAiSEVXMjYtMSIpLCBdCgoKIyBBZGQgbWlzc2luZyB2YXJpYWJsZSBjb2x1bW5zIHRvIGFsbC4xNGMKIyBhZGQgWWVhclNhbXBsZWQgY29sdW1uCmFsbC4xNGMkWWVhclNhbXBsZWQgPC0gaWZlbHNlKGFsbC4xNGMkRXhwZXJpbWVudCA9PSAiYXJjIiwgMjAxMSwgMjAxOSkKCiMgYWRkIFNpdGUgYW5kIEhvcml6b24gY29sdW1ucwphbGwuMTRjJFNpdGUgPC0gaWZlbHNlKGdyZXBsKCJIRSIsIGFsbC4xNGMkSUQpLCAiSGFpbmljaCIsICJTY2hvcmZoZWlkZSIpCmFsbC4xNGMkSG9yaXpvbiA8LSAiQSIKCgojIGNvbWJpbmUgdG1lLjE0YyBhbmQgYWxsLjE0YyBpbnRvIGEgbGlzdCBhbmQgY2FsY3VsYXRlIGZyYWN0aW9uIG1vZGVybiBmcm9tIGQxNEMgYXMgbmVlZGVkCmFsbC4xNGMubHMgPC0gbGFwcGx5KGxpc3QodG1lLjE0YywgYWxsLjE0YyksIGZ1bmN0aW9uKGRmKSB7CiAgZGYkZm0gPC0gaWZlbHNlKGlzLm5hKGRmJGZtKSwKICAgICAgICAgICAgICAgICAgZDE0Yy5mbS5meChkZiRZZWFyU2FtcGxlZCwgZGYkZDE0YyksCiAgICAgICAgICAgICAgICAgIGRmJGZtKQogIGRmJGQxNGNfY29yciA8LSBkZWNheS5jb3JyLmZ4KGRmJFllYXJTYW1wbGVkLCBkZiRmbSkKICByZXR1cm4oZGYpCn0pCgphbGwuMTRjLnN1bSA8LSBsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBkZi5zdW0gPC0gc2VsZWN0KGRmLCAtU2FtcGxlTmFtZSkgJT4lCiAgICBncm91cF9ieShJRCwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFNpdGUsIEhvcml6b24sIFllYXJTYW1wbGVkKSAlPiUKICAgIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgbWF4ID0gbWF4LCBtaW4gPSBtaW4pLCBuYS5ybSA9IFRSVUUpCiAgZGYuc3VtW21hcHBseShpcy5pbmZpbml0ZSwgZGYuc3VtKV0gPC0gTkEKICByZXR1cm4oZGYuc3VtKQp9KQphbGwuMTRjLnN1bSA8LSByYXBwbHkoYWxsLjE0Yy5zdW0sIGYgPSBmdW5jdGlvbih4KSBpZmVsc2UoaXMubmFuKHgpLCBOQSAsIHgpLCBob3cgPSAicmVwbGFjZSIpCmFsbC4xNGMuc3VtLmRmIDwtIGJpbmRfcm93cyhhbGwuMTRjLnN1bSkKCiMgcmVtb3ZlIHVubmVjZXNzYXJ5IG9iamVjdHMKYGBgCgpgYGB7ciBjb3VudHMgZm9yIGNoZWNraW5nIHBsb3RzLCBpbmNsdWRlID0gRkFMU0V9CiMgOC4gQ291bnQgbnVtYmVyIG9mIF4xNF5DIG9ic2VydmF0aW9ucyBmb3IgY2hlY2tpbmcgcGxvdHMuCiMgY291bnQgIWlzLm5hKDE0QykgY2FzZXMgYnkgU2FtcGxlTmFtZQphbGwuMTRjWy13aGljaChpcy5uYShhbGwuMTRjJGQxNGNfY29ycikpLF0gJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBQZXJpb2QsIFR5cGUpICU+JQogIGNvdW50KCkKIyBieSBJRAphbGwuMTRjWy13aGljaChpcy5uYShhbGwuMTRjJGQxNGNfY29ycikpLF0gJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBQZXJpb2QsIFR5cGUpICU+JQogIGRpc3RpbmN0KElEKSAlPiUKICBjb3VudCgpCmBgYAoKKlByZS1pbmN1YmF0aW9uIHZlcnN1cyBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBeMTReQy1DT34yfioKCkRlc3BpdGUgdGhlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIHJlc3BpcmF0aW9uLCBhbmQgaW4gY29udHJhc3QgdG8gaHlwb3RoZXNpcyAxLCB3ZSBkaWQgbm90IG9ic2VydmUgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiBeMTReQy1DT34yfiByZXNwaXJlZCBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBhbmQgXjE0XkMtQ09+Mn4gcmVzcGlyZWQgZHVyaW5nIHRoZSBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBwZXJpb2Q6IG5laXRoZXIgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgbm9yIGZvciB0aGUgYWlyLWRyeSB0cmVhdG1lbnQgYWxvbmUgKiooRmlnLiA1KSoqLiBUaGUgaW50ZXJhY3Rpb25zIHdpdGggbGFuZCB1c2Ugd2FzIG5vdCBzaWduaWZpY2FudCBub3Igd2FzIHRoZSBpbnRlcmFjdGlvbiB3aXRoIGV4cGVyaW1lbnQsIHNvIGFsbCBkYXRhIHdlcmUgcG9vbGVkIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcy4KCmBgYHtyIHByZS1pbmMtMTRjLXBsb3R9CmFsbC4xNGMucHJlLmluYyA8LSBtZXJnZShhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gInByZSIsIGMoIklEIiwgIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJUcmVhdG1lbnQiLCAiZDE0Y19jb3JyX21lYW4iLCAiZDE0Y19jb3JyX21pbiIsICJkMTRjX2NvcnJfbWF4IildLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiwgImQxNGNfY29ycl9tZWFuIiwgImQxNGNfY29ycl9taW4iLCAiZDE0Y19jb3JyX21heCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ZXMgPSBjKCJfcHJlIiwgIl9pbmMiKSkKYWxsLjE0Yy5wcmUuaW5jJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnByZS5pbmMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKCmFsbC4xNGMucHJlLmluYyAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9wcmUsIGQxNGNfY29ycl9tZWFuX2luYywgY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5faW5jLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF9pbmMsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19jb3JyX21pbl9wcmUsIAogICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X3ByZSwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmR1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgeGxhYihleHByZXNzaW9uKCdQcmUtaW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ0VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5uICsgNH1gLiBQcmUtaW5jdWJhdGlvbiBwZXJpb2QgJFxEZWx0YSReMTReQyBhZ2FpbnN0IGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZCAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBhcmUgbWVhbnMgb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzIGFuZCBlcnJvciBiYXJzIGFyZSB0aGUgbWluIGFuZCBtYXggKGV4Y2VwdCBmb3IgRXhwZXJpbWVudCAxIGNvbnRyb2wgc2FtcGxlcywgd2hpY2ggd2VyZSBub3QgcmVwbGljYXRlZCkuIE5vdGUgdGhhdCBwcmUtaW5jdWJhdGlvbiAkXERlbHRhJF4xNF5DIHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZSBFeHBlcmltZW50IDEgY29udHJvbCBzYW1wbGVzOyBhZGRpdGlvbmFsbHkgc2FtcGxlcyBmcm9tIHRocmVlIG9mIHRoZSBmb3Jlc3QgcGxvdHMgb2YgdGhlIEV4cGVyaW1lbnQgMSB0cmVhdG1lbnQgc2FtcGxlcyAoYWlyLWRyeSArIHN0b3JhZ2UpIGZhaWxlZCB0byBhY2N1bXVsYXRlIGVub3VnaCBDT34yfiBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCB0byBtZWFzdXJlIF4xNF5DLiBUaGUgb3V0bGllciBwb2ludCB3aXRoIHRoZSBzdWJzdGFudGlhbGx5IGRlcGxldGVkIHByZS1pbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMgaXMgZnJvbSBFeHBlcmltZW50IDIgKGNvbnRyb2wpLgoKTm90ZSB0aGUgb25lIG91dGxpZXIgKGZvcmVzdCwgY29udHJvbCkgZm9yIHdoaWNoIHRoZSBwcmUtaW5jdWJhdGlvbiBDT34yfiB3YXMgc3Vic3RhbnRpYWxseSBkZXBsZXRlZCByZWxhdGl2ZSB0byBlcXVpbGlicml1bSBwZXJpb2QgcmVzcGlyYXRpb24uIEhvd2V2ZXIsIGV2ZW4gd2hlbiB0aGlzIG91dGxpZXIgd2FzIGluY2x1ZGVkIGluIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHByZS1pbmN1YmF0aW9uIF4xNF5DLUNPfjJ+IGFuZCBlcXVpbGlicml1bSBeMTReQy1DT34yfiB3YXMgbm90IHNpZ25pZmljYW50LiBGb3IgY2xhcml0eSwgdGhpcyBwb2ludCB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGZ1dHVyZSBwbG90cy4gRHVlIHRvIGxvd2VyIHJlc3BpcmF0aW9uIHJhdGVzIGR1cmluZyBwcmUtaW5jdWJhdGlvbiwgb25seSB0aHJlZSBvZiB0aGUgc2l4IGZvcmVzdCBzYW1wbGVzIGluIEV4cGVyaW1lbnQgMSBnZW5lcmF0ZWQgZW5vdWdoIENPfjJ+IHRvIG1lYXN1cmUgcmFkaW9jYXJib24sIGFuZCBhZGRpdGlvbmFsbHksIGl0IHdhcyBub3QgcG9zc2libGUgdG8gY29tcGFyZSBwcmUtaW5jdWJhdGlvbiBhbmQgZXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gXjE0XkMtQ09+Mn4gZm9yIHRoZSBjb250cm9sIHNhbXBsZXMgaW4gRXhwZXJpbWVudCAxIHNpbmNlIHByZS1pbmN1YmF0aW9uIF4xNF5DLUNPfjJ+IHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZXNlIHNhbXBsZXMgaW4gMjAxMS4KCmBgYHtyIHByZS1lcXUtMTRjLXN0YXRzLCBpbmNsdWRlID0gRkFMU0V9CiMgZ2F0aGVyIHByZSBhbmQgaW5jIGRhdGEgZnJvbSBhbGwgcmVwcywgYXJjIGFuZCByZXdldCBleHAgb25seQpqLnZhcnMgPC0gYygiU2FtcGxlTmFtZSIsICJJRCIsICJFeHBlcmltZW50IiwgIlRyZWF0bWVudCIsICJUeXBlIiwgImQxNGNfY29yciIsICJtZ0NPMi5DX2dDIikKYXJjLnJld2V0LnByZS4xNGMgPC0gYmluZF9yb3dzKGxhcHBseShhbGwuMTRjLmxzLCBmdW5jdGlvbihkZikgewogIGlmKCFpcy5udWxsKGRmJG1nQ08yLkNfZ0MpKSB7CiAgICAgIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAicHJlIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC5pbmMuMTRjIDwtIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBpZighaXMubnVsbChkZiRtZ0NPMi5DX2dDKSkgewogIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAiaW5jIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC4xNGMgPC0gbGVmdF9qb2luKGFyYy5yZXdldC5wcmUuMTRjLCBhcmMucmV3ZXQuaW5jLjE0YywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gai52YXJzWzE6NV0pCmNvbG5hbWVzKGFyYy5yZXdldC4xNGMpIDwtIGMoai52YXJzWzE6NV0sICJkMTRjX2NvcnJfcHJlIiwgImQxNGNfY29ycl9pbmMiLCAibWdDTzIuQ19nQ19wcmUiLCAibWdDTzIuQ19nQ19pbmMiKQoKYXJjLnJld2V0LjE0YyR0cmVhdC5iaSA8LSBpZmVsc2UoYXJjLnJld2V0LjE0YyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyMgbG9vayBhdCBpbnRlcmFjdGlvbnMKIyBFeHBlcmltZW50IDEKIyBpbnRlcmFjdGlvbiB3aXRoIFR5cGUgbnMKc3VtbWFyeShsbShkMTRjX2NvcnJfaW5jIH4gZDE0Y19jb3JyX3ByZSAqIFR5cGUsIGFyYy5yZXdldC4xNGNbYXJjLnJld2V0LjE0YyRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKCiMgRXhwZXJpbWVudCAyCiMgaW50ZXJhY3Rpb24gd2l0aCBUeXBlICogVHJlYXRtZW50IHNpZ25pZmljYW50IGR1ZSB0byBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiLCBdKSkKIyBidXQgZGlzYXBwZWFycyB3aGVuIGV4Y2x1ZGVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW3doaWNoKGFyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0YyRJRCAhPSAiSEVXMjIiKSwgXSkpCgojIGNvbWJpbmVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCBhcmMucmV3ZXQuMTRjKSkgIyBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCAKICAgICAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCBdKSkgIyB3L28gSEVXMjIKCiMgdC50ZXN0CnQudGVzdChhcmMucmV3ZXQuMTRjJGQxNGNfY29ycl9wcmUsIGFyYy5yZXdldC4xNGMkZDE0Y19jb3JyX2luYykgIyB3LyBIRVcyMgp0LnRlc3QoYXJjLnJld2V0LjE0Y1std2hpY2goYXJjLnJld2V0LjE0YyRJRCA9PSAiSEVXMjIiKSwgImQxNGNfY29ycl9wcmUiXSwgCiAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCAiZDE0Y19jb3JyX2luYyJdKSAjIHcvbyBIRVcyMgpgYGAKCipUcmVhdG1lbnQgZWZmZWN0cyBvbiBvYnNlcnZlZCBlcXVpbGlicml1bSBwZXJpb2QgXjE0XkMtQ09+Mn4qCgpSZWxhdGl2ZSB0byB0aGUgY29udHJvbHMgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCAoRXhwZXJpbWVudCAxLCBvcGVuIHNxdWFyZXMgaW4gKipGaWcuIDYqKikgbGVkIHRvIGVucmljaG1lbnQgaW4gZ3Jhc3NsYW5kIHNhbXBsZXMsIGJ1dCBkZXBsZXRpb24gaW4gZm9yZXN0IHNhbXBsZXMuIEluIGNvbnRyYXN0LCB0aGUgYWlyLWRyeSBvbmx5IHRyZWF0bWVudCAoRXhwZXJpbWVudCAyLCBvcGVuIGNpcmNsZXMsICoqRmlnLiA2KiopIGxlZCB0byBlbnJpY2htZW50IGZvciBib3RoIGZvcmVzdCBhbmQgZ3Jhc3NsYW5kIHNhbXBsZXMgKDIwMTkgcG9pbnRzKS4gVHJlYXRtZW50IGVmZmVjdHMgb24gXjE0XkMtQ09+Mn4gd2VyZSBzaWduaWZjYW50IGZvciBib3RoIGZvcmVzdHMgYW5kIGdyYXNzbGFuZCBzb2lscyBpbiBFeHBlcmltZW50IDEgKDIwMTEgcG9pbnRzLCAqKkZpZyA2KiopLCBhbmQgc2lnbmlmaWNhbnQgZm9yIGdyYXNzbGFuZCBzYW1wbGVzIGJ1dCBub3QgZm9yZXN0IHNhbXBsZXMgaW4gRXhwZXJpbWVudCAyICgyMDE5IHBvaW50cywgKipGaWcuIDYqKikuIFRoZSBtZWFuIGRpZmZlcmVuY2UgaW4gXjE0XkMtQ09+Mn4gYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyB3YXMgZ3JlYXRlciBpbiBncmFzc2xhbmQgc2FtcGxlcyB0aGFuIGluIGZvcmVzdCBzYW1wbGVzIGZvciBib3RoIGV4cGVyaW1lbnRzIChzdGF0cz8pLiAKCiRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyZWQgQ09+Mn4gd2FzIGVucmljaGVkIHJlbGF0aXZlIHRvIHRoZSBhdG1vc3BoZXJlIGZvciBhbGwgc2FtcGxlcyBpbiBib3RoIGV4cGVyaW1lbnRzLiBMb29raW5nIGFjcm9zcyBleHBlcmltZW50cywgdGhlIGRlY2xpbmUgaW4gXjE0XkMtQ09+Mn4gYmV0d2VlbiAyMDExIGFuZCAyMDE5IHBhcmFsbGVsZWQgdGhhdCBvZiBhdG1vc3BoZXJpYyBeMTReQyBmb3IgZm9yZXN0IGNvbnRyb2wgc2FtcGxlcyBhbmQgYm90aCBjb250cm9sIGFuZCB0cmVhdG1lbnQgZ3Jhc3NsYW5kIHNhbXBsZXMsIGJ1dCB3YXMgbXVjaCBzbWFsbGVyIGZvciB0aGUgZm9yZXN0IHRyZWF0bWVudCBzYW1wbGVzLgoKYGBge3IgdHJlYXRtZW50IGVmZmVjdHMgYnkgdGltZX0KIyBmaXJzdCBsb2FkIGF0bW9zcGhlcmljIGRhdGEgZnJvbSBJU1JhRCBhbmQgYmluZCBmdXR1cmUgcHJvamVjdGlvbgpEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQpEYXRtIDwtIERhdG1bRGF0bSREYXRlID4gMTkwMCwgYygiRGF0ZSIsICJOSGMxNCIpXQoKIyAjIGNvZGUgZm9yIHBsb3R0aW5nIGRhdGEgYnkgSUQKIyBhbGwuMTRjLnN1bSAlPiUKIyAgIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQojICAgZmlsdGVyKCFncmVwbCgiUyIsIElEKSkgJT4lCiMgICBtdXRhdGUoeWVhci5JRCA9IHBhc3RlKFllYXJTYW1wbGVkLCBJRCkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMpICsKIyAgIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLklEKSwgCiMgICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAibGFzdCIpLAojICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKIyAgIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0KSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gYygyMDEzLCAyMDE2LCAyMDE5KSkgKwojICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiMgICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICBmYWNldF93cmFwKH4gSUQsIG5jb2wgPSAzKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIHBsb3Qgb3ZlciB0aW1lLCBhdmVyYWdlZCBieSBUeXBlCmFsbC4xNGMuc3VtMiAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBtdXRhdGUoeWVhci5UeXBlID0gcGFzdGUoWWVhclNhbXBsZWQsIFR5cGUpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMsIHN0cm9rZSA9IDEuNSkgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLlR5cGUpLCAKICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAiZmlyc3QiKSwKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDIsIHByZXNlcnZlID0gInNpbmdsZSIpLAogICAgICAgICAgICBzaXplID0gMS4yKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQpLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl91LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjUsCiAgICBhbHBoYSA9IC4zKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZCB1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTMsIDIwMTYsIDIwMTkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiAgeGxhYignWWVhciBzYW1wbGVkJykgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKIyBGaWcuIDEgc2hvd3MgdGhlIGRpcmVjdGlvbiBvZiBtZWFuIHRyZWF0bWVudCBlZmZlY3RzIG92ZXIgdGltZSBpbiByZWZlcmVuY2UgdG8gdGhlIGF0bW9zcGhlcmUgKGdyYXkgbGluZSkuIFBvaW50cyBhcmUgbWVhbnMgKG4gPSAxMiBmb3IgMjAxMSB0cmVhdG1lbnQgcG9pbnRzLCBuID0gOSBmb3IgMjAxMSBjb250cm9sIHBvaW50czsgbiA9IDYgZm9yIGFsbCAyMDE5IHBvaW50cyk7IGVycm9yIGJhcnMgPSAyeCBzdGQuIGVyci4gb2YgdGhlIG1lYW4uCgpgYGAKPioqRmlnIGByIHtmaWcubiArIDV9YC4gVHJlYXRtZW50IGVmZmVjdCBvbiBvYnNlcnZlZCAkXERlbHRhJF4xNF5DLUNPfjJ+IG92ZXIgdGltZSAoRXhwZXJpbWVudHMgMSBhbmQgMikqKgoKPipDYXB0aW9uOiogRmlsbGVkIGNpcmNsZXMgc2hvdyBeMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgY29udHJvbCBzYW1wbGVzLCB3aGlsZSBvcGVuIHN5bWJvbHMgc2hvdyBeMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgdHJlYW1lbnQgc2FtcGxlcyAob3BlbiBzcXVhcmVzID0gYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50LCBFeHBlcmltZW50IDE7IG9wZW4gY2lyY2xlcyA9IGFpci1kcnkgb25seSB0cmVhdG1lbnQsIEV4cGVyaW1lbnQgMikuIEFycm93cyBzaG93IHRoZSBkaXJlY3Rpb24gb2YgY2hhbmdlIGluIF4xNF5DLUNPfjJ+IHJlbGF0aXZlIHRvIHRoZSBjb250cm9scy4gUG9pbnRzIGFyZSBtZWFucyBhbmQgZXJyb3IgYmFycyBzaG93IDJ4IHN0YW5kYXJkIGVycm9yLiBUaGUgZ3JheSBsaW5lIHNob3dzICRcRGVsdGEkXjE0XkMgb2YgdGhlIGF0bW9zcGhlcmUuCgpgYGB7ciBzaWRlLWJ5LXNpZGUgcGxvdCwgaW5jbHVkZSA9IEZBTFNFfQojIHBsb3QgYXMgc2lkZS1ieS1zaWRlIG1lYW5zIHcvIDJ4U0UKIyB3aWxsIGNoYW5nZSB0byA5NSVDSXMgYXQgc29tZSBwb2ludCwgYnV0IG5lZWQgdG8gY2FsY3VsYXRlIHRlc3Qgc3RhdGlzdGljIHdpdGggYXBwcm9wcmlhdGUgZGYKYWxsLjE0Yy5zdW0yICU+JQogIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQogIGdncGxvdCguLCBhZXModHJlYXQuYmksIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl91LCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmQgdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNikpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCgoqRWZmZWN0IG9mIGN1bXVsYXRpdmUgcmVzcGlyZWQgY2FyYm9uIG9uIF4xNF5DT34yfioKCmBgYHtyIGMtcmVzcGlyZWQtMTRjLWRpZi1zdGF0cywgaW5jbHVkZSA9IEZBTFNFfQphcmMucmV3ZXQuMTRjLnRydCA8LSBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkdHJlYXQuYmkgPT0gInRyZWF0bWVudCIsIF0KYXJjLnJld2V0LjE0Yy5jdGwgPC0gYXJjLnJld2V0LjE0Y1thcmMucmV3ZXQuMTRjJHRyZWF0LmJpID09ICJjb250cm9sIiwgXQphcmMucmV3ZXQuMTRjLjIgPC0gYXJjLnJld2V0LjE0Y1ssIGMoMTozLCA0KV0KYXJjLnJld2V0LjE0Yy4yJGRpZi4xNGMgPC0gYXJjLnJld2V0LjE0Yy50cnQkZDE0Y19jb3JyX2luYyAtIGFyYy5yZXdldC4xNGMuY3RsJGQxNGNfY29ycl9pbmMKCmBgYApbbWF5YmUgZXhwYW5kIHdpdGggc3RhdHMgZm9yIG90aGVyIGV4cGxhbmF0b3J5IGZhY3RvcnM/IGUuZy4gdGV4dHVyZSwgTiBjb250ZW50LCBldGMuLi5dCgpXZSBsb29rZWQgYXQgdGhlIHBvc3NpYmxlIGVmZmVjdCBvZiB0aGUgYW1vdW50IG9mIGNhcmJvbiByZXNwaXJlZCBvbiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgXjE0XkMtQ09+Mn4gd2l0aCBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIGFuZCBmb3VuZCB0aGF0IHRoZSBkaWZmZXJlbmNlIGluIHJlc3BpcmVkIGNhcmJvbiAobWcgQ09+Mn4tQyBnIHNvaWwgQ14tMSkgd2FzIG5vdCBhIHNpZ25pZmljYW50IHByZWRpY3Rvci4gVGhpcyBjYW4gYWxzbyBiZSBzZWVuIGJ5IHRoZSByZWxhdGl2ZWx5IGZsYXQgc2xvcGUgb2YgdGhlIGxpbmVzIGNvbm5lY3RpbmcgcGFpcnMgb2YgcG9pbnRzIGluICoqRmlnLiA3KiouCgpgYGB7ciBwbG90LTE0Yy1ieS1jLXJlc3B9CiMgMTAuIFBsb3QgJFxEZWx0YSReMTReQyBhZ2FpbnN0IHByb3BvcnRpb24gb2Ygc29pbCBDIHJlc3BpcmVkIGJ5IGV4cGVyaW1lbnQsIGxhbmQgY292ZXIsIGFuZCBzYW1wbGluZyBwZXJpb2QuCiMgY29sbGFwc2UgdHJlYXRtZW50IHZhcmlhYmxlIGludG8gYmluYXJ5IGNvbnRyb2wvdHJlYXRtZW50CmFsbC4xNGMuc3VtLmRmJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bS5kZiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyBIRVcyMiBjb250cm9sIHByZSBwb2ludCBleGNsdWRlZCB0byBtYWtlIGZpZ3VyZSBtb3JlIHJlYWRhYmxlIAphbGwuMTRjLnN1bS5kZiAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgbXV0YXRlKElELnRyZWF0ID0gcGFzdGUoSUQsIFRyZWF0bWVudCkpICU+JQogIG11dGF0ZShJRC50cmVhdC5QZXJpb2QgPSBwYXN0ZShJRC50cmVhdCwgUGVyaW9kKSkgJT4lCiAgZmlsdGVyKElELnRyZWF0LlBlcmlvZCAhPSAiSEVXMjIgY29udHJvbCBwcmUiKSAlPiUKICBtdXRhdGUodHJlYXQuUGVyaW9kID0gcGFzdGUodHJlYXQuYmksIFBlcmlvZCkpICU+JQogIGdncGxvdCguLCBhZXMobWdDTzIuQ19nQ19tZWFuLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IHRyZWF0LlBlcmlvZCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IElELnRyZWF0KSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW4sIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IG1nQ08yLkNfZ0NfbWluLCAKICAgICAgICB4bWF4ID0gbWdDTzIuQ19nQ19tYXgsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnU2FtcGxpbmcgcGVyaW9kICh0cmVhdG1lbnQpJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKDE2LCAxNywgMSwgMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGNvbnRyb2wpJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGNvbnRyb2wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IHByZSIgPSAncHJlLWluY3ViYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksIHJvd3MgPSB2YXJzKFllYXJTYW1wbGVkKSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmVzcGlyZWQgQyAobWdDTydbMl0qJy1DJyonIGcgc29pbCBDJ14tMSonKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIikpCmBgYAoKPioqRmlnLiBgciB7ZmlnLm4gKyA2fWAuIENoYW5nZSBpbiBeMTReQy1DT34yfiBpbiByZWxhdGlvbiB0byBjdW11bGF0aXZlIHNvaWwgY2FyYm9uIHJlc3BpcmVkKioKCj4qQ2FwdGlvbjoqIAoKCiogRmlyc3QgZmlndXJlIHNob3dzIGRhdGEgYXZlcmFnZWQgYnkgcGxvdAoqIChOb3RlIHRoYXQgcHJlLWluY3ViYXRpb24gJFxEZWx0YSReMTReQyB3YXMgbm90IG1lYXN1cmVkIGZvciB0aGUgMjAxMSBjb250cm9sIHNhbXBsZXMpCiogTGltaXRzIGV4Y2x1ZGUgb3V0bGllciBwb2ludCAoSEVXMjIgY29udHJvbCBwcmUtaW5jdWJhdGlvbikgZm9yIGltcHJvdmVkIGxlZ2liaWxpdHkKCmBgYHtyIHBsb3QgQyByZXNwIHZzIDE0QyBhdmVyYWdlZCBieSBsYW5kIHVzZSBhbmQgdHJlYXRtZW50LCBpbmNsdWRlID0gRkFMU0V9CiMgQWx0ZXJuYXRlIEMtcmVzcCB4IDE0YyBmaWc6IGRhdGEgYXZlcmFnZWQgYnkgbGFuZCB1c2UgYW5kIHRyZWF0bWVudCB3aXRoaW4gc2FtcGxpbmcgcGVyaW9kcwoKIyBhdmVyYWdlIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBkYXRhCiMgcmVtb3ZlIEhFVzIyIGNvbnRyb2wgcHJlCiMgbm90ZSB0aGF0IHVwcGVyL2xvd2VyIGxpbWl0cyA9IDJ4U0UKYWxsLjE0Yy5zdW0yIDwtIGFsbC4xNGMubHNbWzJdXSAlPiUKICBtdXRhdGUoSUQudHJlYXQuUGVyaW9kID0gcGFzdGUoSUQsIFRyZWF0bWVudCwgUGVyaW9kKSkgJT4lCiAgZmlsdGVyKElELnRyZWF0LlBlcmlvZCAhPSAiSEVXMjIgY29udHJvbCBwcmUiKSAlPiUKICBzZWxlY3QoVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkLCBkMTRjX2NvcnIsIG1nQ08yLkNfZ0MpICU+JQogIGdyb3VwX2J5KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDE0Y19jb3JyX3NlID0gZDE0Y19jb3JyX3NkL25fbWVhbiwKICAgICAgICAgZDE0Y19jb3JyX3UgPSBkMTRjX2NvcnJfbWVhbiArIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBkMTRjX2NvcnJfbCA9IGQxNGNfY29ycl9tZWFuIC0gZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0Nfc2UgPSBtZ0NPMi5DX2dDX3NkL25fbWVhbiwKICAgICAgICAgbWdDTzIuQ19nQ191ID0gbWdDTzIuQ19nQ19tZWFuICsgbWdDTzIuQ19nQ19zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX2wgPSBtZ0NPMi5DX2dDX21lYW4gLSBtZ0NPMi5DX2dDX3NlKjIpIAoKYWxsLjE0Yy5zdW0yJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bTIkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCJ0cmVhdG1lbnQiKQphbGwuMTRjLnN1bTIgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogICMgZ2VvbV9wYXRoKGFlcyhncm91cCA9IFRyZWF0bWVudCkpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfdSwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl9sLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IG1nQ08yLkNfZ0NfdSwgCiAgICAgICAgeG1heCA9IG1nQ08yLkNfZ0NfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmR1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXNwaXJlZCBDIChtZ0NPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgpgYGB7ciBwbG90IDE0YyBieSBjIHJlc3Agd2l0aCBvdXRsaWVyLCBpbmNsdWRlID0gRkFMU0V9CiMgQ29kZSBmb3IgYSB0aGlyZCBwbG90IHdpdGggb3V0bGllciBkYXRhCiMgYXZlcmFnZSBjb250cm9sIGFuZCB0cmVhdG1lbnQgZGF0YQphbGwuMTRjLnN1bTMgPC0gc2VsZWN0KGFsbC4xNGMubHNbWzJdXSwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkLCBkMTRjX2NvcnIsIG1nQ08yLkNfZ0MpICU+JQogIGdyb3VwX2J5KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDE0Y19jb3JyX3NlID0gZDE0Y19jb3JyX3NkL25fbWVhbiwKICAgICAgICAgZDE0Y19jb3JyX3UgPSBkMTRjX2NvcnJfbWVhbiArIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBkMTRjX2NvcnJfbCA9IGQxNGNfY29ycl9tZWFuIC0gZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0Nfc2UgPSBtZ0NPMi5DX2dDX3NkL25fbWVhbiwKICAgICAgICAgbWdDTzIuQ19nQ191ID0gbWdDTzIuQ19nQ19tZWFuICsgbWdDTzIuQ19nQ19zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX2wgPSBtZ0NPMi5DX2dDX21lYW4gLSBtZ0NPMi5DX2dDX3NlKjIpIAoKYWxsLjE0Yy5zdW0zJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bTMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCJ0cmVhdG1lbnQiKQphbGwuMTRjLnN1bTMgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX3UsIAogICAgICAgIHhtYXggPSBtZ0NPMi5DX2dDX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnU2FtcGxpbmcgcGVyaW9kICh0cmVhdG1lbnQpJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKDE2LCAxNywgMSwgMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGNvbnRyb2wpJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGNvbnRyb2wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IHByZSIgPSAncHJlLWluY3ViYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksIHJvd3MgPSB2YXJzKFllYXJTYW1wbGVkKSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmVzcGlyZWQgQyAobWdDTydbMl0qJy1DJyonIGcgc29pbCBDJ14tMSonKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIikpCmBgYAoKIyMgU3RvcmFnZSBkdXJhdGlvbiBlZmZlY3Qgb24gXjE0XkMtQ09+Mn4gKEV4cGVyaW1lbnQgMykKCjE2LiBTaG93IHRoZSBlZmZlY3Qgb2Ygc3RvcmFnZSBkdXJhdGlvbiBieSBwbG90dGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBeMTReQyBhcyBhIGZ1bmN0aW9uIG9mIHN0b3JhZ2UgZHVyYXRpb24uIEhvd2V2ZXIsIHRoZSBleHBlY3RlZCBDdGwtVHJ0IGRpZmZlcmVuY2Ugd291bGQgYWxzbyBsaWtlbHkgaGF2ZSBhIHRyZW5kIG92ZXIgdGltZS4gUGVyaGFwcyBwbG90IGFuIGV4cGVjdGVkIHRyZW5kLi4uPyBOb3Qgc3VyZSBob3cgbXVjaCB0aGlzIG1hdHRlcnMuCiogQXMgcHJldmlvdXNseSwgZGFzaGVkIGFuZCBkb3R0ZWQgbGluZXMgYXJlIHBsb3R0ZWQgdG8gZ2l2ZSBhIHNlbnNlIG9mIGVycm9yIGludHJvZHVjZWQgYnkgdGhlIHRyZWF0bWVudCBieSBzaG93aW5nIGEgZGlmZmVyZW5jZSBvZiAyMOKAsCBhbmQgNDDigLAgKHJvdWdobHkgZXF1aXZhbGVudCB0byB0aGUgYXRtb3NwaGVyaWMgZGVjbGluZSBvdmVyIGZpdmUgYW5kIDEwIHllYXJzIHJlc3BlY3RpdmVseSBmb3IgdGhlIHBlcmlvZCAyMDAwIHRvIDIwMjApCiogUG9zaXRpb24gb2YgcG9pbnRzIGppdHRlcmVkIHRvIGF2b2lkIG92ZXJwbG90dGluZzsgc3RvcmFnZSBkdXJhdGlvbiBoYXMgYmVlbiByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3Qgd2hvbGUgeWVhcgoqIEluIGdlbmVyYWwsIHRoZSB0cmVuZCBpbiB0aGUgZGlmZmVyZW5jZXMgZHVlIHRvIHRyZWF0bWVudCBmb3IgdGhlIGhpZ2hseSBlbnJpY2hlZCBzYW1wbGVzIGZyb20gT2FrIFJpZGdlLCBUTiBzdWdnZXN0IGxvc3NlcyBvZiB0aGUgbW9zdCByZWNlbnRseSBmaXhlZCBjYXJib24gb3ZlciB0aGUgZHVyYXRpb24gb2Ygc3RvcmFnZQogICAgKyBUaGVzZSBzYW1wbGVzIHdlcmUgaW5jbHVkZWQgcHJpbWFyaWx5IGJlY2F1c2UgaXQgd2FzIGFzc3VtZWQgdGhhdCB0aGV5IHdvdWxkIGJlIG1vcmUgc2Vuc2l0aXZlIHRvIHBvdGVudGlhbCBsb3NzZXMgb2YgcmVjZW50bHkgZml4ZWQgY2FyYm9uLCBhcyB0aGUgbGFiZWwgc2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpbiB0aGlzIHBvb2wgb2Ygc29pbCBDCiAgICArIEhvd2V2ZXIsIGluIGNvbnRyYXN0LCB0aGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGV2aWRlbmNlIGZvciBhIHN0b3JhZ2UgZHVyYXRpb24gZWZmZWN0IGluIHRoZSBzYW1wbGVzIHRoYXQgb25seSBjb250YWluIGJvbWItQwpgYGB7cn0KIyBGaXJzdCBhZGQgWWVhclNhbXBsZWQgYW5kIFllYXJNZWFzdXJlZCBjb2x1bW5zCmFsbC4xNGMuY3RsLnRydCRZZWFyU2FtcGxlZCA8LSB1bmxpc3QoYWxsLjE0Yy5zdW0uZGZbbWF0Y2goYWxsLjE0Yy5jdGwudHJ0JElELCBhbGwuMTRjLnN1bS5kZiRJRCksICJZZWFyU2FtcGxlZCJdKQojIGNvcnJlY3QgYXJjaGl2ZSBzYW1wbGUgWWVhclNhbXBsZWQKYWxsLjE0Yy5jdGwudHJ0W2FsbC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJhcmMiICYgYWxsLjE0Yy5jdGwudHJ0JFNpdGUgPT0gIkhhaW5pY2giLCAiWWVhclNhbXBsZWQiXSA8LSAyMDExCgojIGFkZCB5ZWFyIG1lYXN1cmVkIGNvbHVtbiwgbW9kaWZ5IGZvciB0bWUubWlzYyBzYW1wbGVzLCByZXdldCBzYW1wbGVzCmFsbC4xNGMuY3RsLnRydCRZZWFyTWVhc3VyZWQgPC0gMjAxOAphbGwuMTRjLmN0bC50cnRbYWxsLjE0Yy5jdGwudHJ0JEV4cGVyaW1lbnQgPT0gInJld2V0IiwgIlllYXJNZWFzdXJlZCJdIDwtIDIwMTkKYWxsLjE0Yy5jdGwudHJ0W3doaWNoKGFsbC4xNGMuY3RsLnRydCRJRCAlaW4lIHRtZS5taXNjJElEKSwgIlllYXJNZWFzdXJlZCJdIDwtIDIwMDkKCiMgY2FsY3VsYXRlIHN0b3JhZ2UgZHVyYXRpb24gbnVtZXJpY2FsbHkgYW5kIGFzIGZhY3RvcgphbGwuMTRjLmN0bC50cnQkdG1lIDwtIHVubGlzdChhbGwuMTRjLmN0bC50cnQkWWVhck1lYXN1cmVkIC0gYWxsLjE0Yy5jdGwudHJ0JFllYXJTYW1wbGVkKQphbGwuMTRjLmN0bC50cnQkdG1lLmYgPC0gZmFjdG9yKGFsbC4xNGMuY3RsLnRydCR0bWUpCgojIGFkZCBkaWZmZXJlbmNlIGNvbHVtbgojIChleHByZXNzZWQgYXMgZGlmZmVyZW5jZSBvZiBtZWFucykKYWxsLjE0Yy5jdGwudHJ0JGN0bC50cnQuZDE0IDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl9jdGwgLSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fdHJ0CgojICMgYWRkIGF0bSAxNEMgZm9yIHllYXIgc2FtcGxlZCBhbmQgY2FsY3VsYXRlIGRlbHRhLWRlbHRhCiMgYWxsLjE0Yy5jdGwudHJ0JGF0bS55ci5zYW1wbGVkIDwtIERhdG1bbWF0Y2goYWxsLjE0Yy5jdGwudHJ0JFllYXJTYW1wbGVkLCBmbG9vcihEYXRtJERhdGUpKSwgIk5IYzE0Il0KIyBhbGwuMTRjLmN0bC50cnQkZGQuY3RsIDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl9jdGwgLSBhbGwuMTRjLmN0bC50cnQkYXRtLnlyLnNhbXBsZWQKIyBhbGwuMTRjLmN0bC50cnQkZGQudHJ0IDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl90cnQgLSBhbGwuMTRjLmN0bC50cnQkYXRtLnlyLnNhbXBsZWQKIyBhbGwuMTRjLmN0bC50cnQkY3RsLnRydC5kZDE0IDwtIGFsbC4xNGMuY3RsLnRydCRkZC5jdGwgLSBhbGwuMTRjLmN0bC50cnQkZGQudHJ0CgojIFBsb3Qgc3RvcmFnZSBkdXJhdGlvbgpzdXBwcmVzc1dhcm5pbmdzKAogIGFsbC4xNGMuY3RsLnRydCAlPiUKICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJyZXdldCIpICU+JQogIHNlbGVjdChUeXBlLCB0bWUuZiwgU2l0ZSwgY3RsLnRydC5kMTQsIHRtZSkgJT4lCiAgZ3JvdXBfYnkoVHlwZSwgdG1lLmYsIFNpdGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGRpZl9zZSA9IGN0bC50cnQuZDE0X3NkL25fbWVhbiwKICAgICAgICAgZGlmX3UgPSBjdGwudHJ0LmQxNF9tZWFuICsgZGlmX3NlKjIsCiAgICAgICAgIGRpZl9sID0gY3RsLnRydC5kMTRfbWVhbiAtIGRpZl9zZSoyKSAlPiUKICBtdXRhdGUoTG9jYXRpb24gPSBmYWN0b3IocmVjb2RlKFNpdGUsICEhIWxvYyksIGV4Y2x1ZGUgPSBUUlVFKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh0bWVfbWVhbiwgY3RsLnRydC5kMTRfbWVhbiwgY29sb3IgPSBMb2NhdGlvbiwgc2hhcGUgPSBUeXBlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIod2lkdGggPSAuNywgcHJlc2VydmUgPSAic2luZ2xlIikpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkaWZfbCwKICAgICAgICB5bWF4ID0gZGlmX3UsIAogICAgICAgIGNvbG9yID0gTG9jYXRpb24pLAogICAgd2lkdGggPSAuNywKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjcsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoJ0R1a2UsIE5DJyA9ICcjMDFCQjk3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2llcnJhIE5ldmFkYSwgQ0EnID0gJyNGRkMxMDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDZW50cmFsIEdlcm1hbnknID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGFydmFyZCwgTUEnID0gJyMxRTg4RTUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPYWsgUmlkZ2UsIFROJyA9ICcjRDgxQjYwJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnPSAxNywnRycgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgeWxhYihleHByZXNzaW9uKCdDb250cm9sIC0gVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoIlN0b3JhZ2UgZHVyYXRpb24gKHllYXJzKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQogICkKYGBgCgo+KipGaWcuIGByIHtmaWcubiArIDd9YC4gQ2hhbmdlIGluIF4xNF5DLUNPfjJ+IGluIHJlbGF0aW9uIHRvIGN1bXVsYXRpdmUgc29pbCBjYXJib24gcmVzcGlyZWQqKgoKPipDYXB0aW9uOiogCgojIyBUcmVhdG1lbnQgZWZmZWN0IG9uIDE0Qy1DTzIgZm9yIGFsbCBzYW1wbGVzIChFeHBlcmltZW50cyAxLCAyLCBhbmQgMykKCk5vdGVzOiAKU2hvdyBvdmVyYWxsIGVmZmVjdCBvZiB0cmVhdG1lbnQgb24gd2hvbGUgZGF0YSBzZXQuCiogTm90ZXM6CiAgICArIENvbnRyb2wgZGF0YSBzaG93biBvbiB4LWF4aXMsIHRyZWF0bWVudCBkYXRhIHNob3duIG9uIHktYXhpcwogICAgKyBTb2xpZCBsaW5lIGlzIDE6MSwgZGFzaGVkIGxpbmUgaXMgYSAyMCDigLAgb2Zmc2V0LCBhbmQgZG90dGVkIGxpbmUgaXMgYSA0MOKAsCBvZmZzZXQgKHJvdWdobHkgZXF1aXZhbGVudCB0byB0aGUgYXRtb3NwaGVyaWMgZGVjbGluZSBvdmVyIGZpdmUgYW5kIDEwIHllYXJzIHJlc3BlY3RpdmVseSBmb3IgdGhlIHBlcmlvZCAyMDAwIHRvIDIwMjApCiAgICArIERhdGEgZnJvbSBhbGwgdGhyZWUgZXhwZXJpbWVudHMgY29uZHVjdGVkIGluIHRoaXMgc3R1ZHkgYXJlIHNob3duLCBhcyB3ZWxsIGFzIGEgaGFuZGZ1bCBvZiBhZGRpdGlvbmFsIGRhdGEgcG9pbnRzIGZvciB3aGljaCBib3RoIGNvbnRyb2wgYW5kIHRyZWF0bWVudCAoaS5lLiBhZnRlciBhaXItZHJ5aW5nICsgc3RvcmFnZSkgaW5jdWJhdGlvbnMgd2VyZSBjb25kdWN0ZWQgaW4gYW5vdGhlciBsYWJvcmF0b3J5IChIYXJ2YXJkIHBvaW50cykKICAgICsgT25seSBBIGhvcml6b24gZGF0YSBhcmUgc2hvd24gaGVyZSwgYXMgb3dpbmcgdG8gc2FtcGxlIGF2YWlsYWJpbGl0eW9ubHkgdGhyZWUgc2FtcGxlcyB3ZXJlIGFuYWx5emVkIGZvciBvcmdhbmljIGFuZCBCIGhvcml6b25zIChyZXNwZWN0aXZlbHkpIAogICAgKyBQb2ludHMgYXJlIG1lYW5zIG9mIHJlcGxpY2F0ZXMgYW5kIGVycm9yIGJhcnMgYXJlIG1pbiBhbmQgbWF4IG9mIHJlcGxpY2F0ZXMgKG51bWJlciBvZiByZXBsaWNhdGVzIHZhcmllcyBmcm9tIDEgdG8gMyk7IG5vdGUgdGhhdCBlcnJvciBiYXJzIGFyZSBub3QgdmlzaWJsZSBhdCB0aGlzIHNjYWxlIGZvciBtb3N0IHBvaW50cyAKKiBLZXkgbWVzc2FnZXM6CiAgICArIERpZmZlcmVuY2UgYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyBpcyB3aXRoaW4gYSA1IHllYXIgcmFuZ2UgZm9yIHRoZSBtYWpvcml0eSBvZiBwb2ludHMKICAgICsgR3Jhc3NsYW5kIHNhbXBsZXMgdGVuZCB0byBiZSBhYm92ZSAxOjEgbGluZSwgZm9yZXN0IHNhbXBsZXMgYmVsb3csIHJlZ2FyZGxlc3Mgb2Ygc2l0ZQogICAgKyBUaGUgdGhyZWUgR2VybWFuIGZvcmVzdCBzYW1wbGVzIGFib3ZlIDE6MSBsaW5lIHdlcmUgYW5hbHl6ZWQgaW4gMjAxOSAoYWlyLWRyeSBvbmx5IHRyZWF0bWVudCwgdGhpcyBzdHVkeSksIGxlbmRpbmcgc3VwcG9ydCB0byB0aGUgaW50ZXJwcmV0YXRpb24gdGhhdCBzbG93IGFuZCBmYXN0IHNvaWwgQyBwb29sIGN1cnZlcyBmb3Igbm9ydGhlcm4gaGVtaXNwaGVyZSBmb3Jlc3Qgc2FtcGxlcyBoYXZlIG9ubHkgcmVjZW50bHkgY3Jvc3NlZCBvciBtYXkgaGF2ZSB5ZXQgdG8gY3Jvc3MuCmBgYHtyIHBsb3QgY3RsIHZzIHRydH0KIyBGaWx0ZXIgdG8gImluYyIsIHNwbGl0IGJ5IGJpbmFyeSB0cmVhdG1lbnQgdmFyaWFibGUsIHRoZW4gbWVyZ2UKYWxsLjE0Yy5jdGwgPC0gYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkdHJlYXQuYmkgPT0gImNvbnRyb2wiICYgYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBdCmFsbC4xNGMuY3RsIDwtIHJlbmFtZV9hdChhbGwuMTRjLmN0bCwgdmFycyhjb250YWlucygnZDE0YycpKSwgbGlzdCh+cGFzdGUwKC4sICJfY3RsIikpKQphbGwuMTRjLnRydCA8LSBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiR0cmVhdC5iaSA9PSAidHJlYXRtZW50IiAmIGFsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAiaW5jIiwgXQphbGwuMTRjLnRydCA8LSByZW5hbWVfYXQoYWxsLjE0Yy50cnQsIHZhcnMoY29udGFpbnMoJ2QxNGMnKSksIGxpc3QofnBhc3RlMCguLCAiX3RydCIpKSkKYWxsLjE0Yy5jdGwudHJ0IDwtIGlubmVyX2pvaW4oZGF0YS5mcmFtZShhbGwuMTRjLmN0bCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChJRCwgRXhwZXJpbWVudCwgVHlwZSwgU2l0ZSwgSG9yaXpvbiwgY29udGFpbnMoImQxNGNfY29yciIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShhbGwuMTRjLnRydCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChJRCwgRXhwZXJpbWVudCwgVHlwZSwgU2l0ZSwgSG9yaXpvbiwgY29udGFpbnMoImQxNGNfY29yciIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiU2l0ZSIsICJIb3Jpem9uIikpCgojIFBsb3Qgb24gMToxIGxpbmUgdy8gZGlhZ29uYWwgbGluZXMgc2hvd2luZyDigLAgb2Zmc2V0cwojIGZpcnN0IGNvbGxhcHNlIHNpdGVzIGZvciBiZXR0ZXIgdmlzdWFscwoKbG9jIDwtIGxpc3QoCiAgICAiRHVrZSIgPSAiRHVrZSwgTkMiLAogICAgIkhvd2xhbmQiID0gIkhvd2xhbmQsIE1FIiwKICAgICJIYXJ2YXJkIiA9ICJIYXJ2YXJkLCBNQSIsCiAgICAiSGFpbmljaCIgPSAiQ2VudHJhbCBHZXJtYW55IiwKICAgICJTY2hvcmZoZWlkZSIgPSAiQ2VudHJhbCBHZXJtYW55IiwKICAgICJNdXNpY2siID0gIlNpZXJyYSBOZXZhZGEsIENBIiwKICAgICJTaGF2ZXIiID0gIlNpZXJyYSBOZXZhZGEsIENBIiwKICAgICJXYWxrZXIgQnJhbmNoIiA9ICJPYWsgUmlkZ2UsIFROIiwKICAgICJUZW5uZXNzZWUgVmFsbGV5IiA9ICJPYWsgUmlkZ2UsIFROIikKCmFsbC4xNGMuY3RsLnRydCAlPiUKICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQogIG11dGF0ZShMb2NhdGlvbiA9IHJlY29kZShTaXRlLCAhISFsb2MpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGNfY29ycl9tZWFuX2N0bCwgZDE0Y19jb3JyX21lYW5fdHJ0LCBjb2xvciA9IExvY2F0aW9uLCBzaGFwZSA9IFR5cGUpKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDIwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtNDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluX3RydCwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl9tYXhfdHJ0LCAKICAgICAgICBjb2xvciA9IExvY2F0aW9uKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2NvcnJfbWluX2N0bCwgCiAgICAgICAgeG1heCA9IGQxNGNfY29ycl9tYXhfY3RsLCAKICAgICAgICBjb2xvciA9IExvY2F0aW9uKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCdEdWtlLCBOQycgPSAnIzAxQkI5NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NpZXJyYSBOZXZhZGEsIENBJyA9ICcjRkZDMTA3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudHJhbCBHZXJtYW55JyA9ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hhcnZhcmQsIE1BJyA9ICcjMUU4OEU1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2FrIFJpZGdlLCBUTicgPSAnI0Q4MUI2MCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnTGFuZCB1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJz0gMTcsJ0cnID0gMTYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHhsYWIoZXhwcmVzc2lvbignQ29udHJvbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ1RyZWF0bWVudCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0PXVuaXQoLjgsICJjbSIpLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCgojIGZvciBwbG90dGluZyB3aXRoIGNvbG9yID0gVHlwZSAoY3VycmVudGx5IHN1cHByZXNzZWQpCiMgYWxsLjE0Yy5jdGwudHJ0ICU+JQojICAgZmlsdGVyKEhvcml6b24gPT0gIkEiKSAlPiUKIyAgIG11dGF0ZShMb2NhdGlvbiA9IGZhY3RvcihyZWNvZGUoU2l0ZSwgISEhbG9jKSwgZXhjbHVkZSA9IFRSVUUpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0Y19jb3JyX21lYW5fY3RsLCBkMTRjX2NvcnJfbWVhbl90cnQsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBMb2NhdGlvbikpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLTQwLCBsaW5ldHlwZSA9ICJkb3RkYXNoIikgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSA0MCwgbGluZXR5cGUgPSAiZG90ZGFzaCIpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwojICAgZ2VvbV9wb2ludChzaXplID0gMykgKwojICAgZ2VvbV9lcnJvcmJhcigKIyAgICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluX3RydCwgCiMgICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF90cnQsIAojICAgICAgICAgY29sb3IgPSBUeXBlKSwgCiMgICAgIHdpZHRoID0gLjI1KSArCiMgICBnZW9tX2Vycm9yYmFyaCgKIyAgICAgYWVzKHhtaW4gPSBkMTRjX2NvcnJfbWluX2N0bCwgCiMgICAgICAgICB4bWF4ID0gZDE0Y19jb3JyX21heF9jdGwsIAojICAgICAgICAgY29sb3IgPSBUeXBlKSwgCiMgICAgIGhlaWdodCA9IC45KSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKIyAgIHhsYWIoZXhwcmVzc2lvbignQ29udHJvbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiMgICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQpgYGAKPioqRmlnLiBgciB7ZmlnLm4gKyA4fWAuIENoYW5nZSBpbiBeMTReQy1DT34yfiBpbiByZWxhdGlvbiB0byBjdW11bGF0aXZlIHNvaWwgY2FyYm9uIHJlc3BpcmVkKioKCj4qQ2FwdGlvbjoqIAoKCiMgRGlzY3Vzc2lvbgoKKlJhbmRvbSBub3RlcyBoZXJlLi4uKgoKKkVmZmVjdCBvZiBDIHJlc3BpcmVkKgoKU2V2ZXJhbCBzdHVkaWVzIGhhdmUgc2hvd24gdGhhdCB0aGUgcmFkaW9jYXJib24gc2lnbmF0dXJlIG9mIHJlc3BpcmVkIENPfjJ+IGNoYW5nZXMgb3ZlciB0aGUgZHVyYXRpb24gb2YgYW4gaW5jdWJhdGlvbiBpbiByZWxhdGlvbnNoaXAgdG8gdGhlIGFtb3VudCBvZiBjYXJib24gcmVzcGlyZWQgKEJvbCBldCBhbC4gMjAwMzsgQ3VzYWNrIGV0IGFsLiAyMDEwOyBTY2hpbWVsIGV0IGFsLiAyMDExOyBNdWVsbGVyIGV0IGFsLiAyMDE0KS4gSW5jdWJhdGlvbnMgaW4gdGhpcyBzdHVkeSB3ZXJlIGNvbnRyb2xsZWQgc28gdGhhdCB0aGUgYW1vdW50IG9mIHRoZSB0b3RhbCBzb2lsIEMgcG9vbCByZXNwaXJlZCBhcyBDT34yfiBpbiB0cmVhdG1lbnQgaW5jdWJhdGlvbnMgd2FzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHdoYXQgd2FzIHJlc3BpcmVkIGluIGNvbnRyb2wgaW5jdWJhdGlvbnMsIGJ1dCBhcyByZXNwaXJhdGlvbiByYXRlcyB3ZXJlIG11Y2ggaGlnaGVyIGluIHRyZWF0bWVudCBzYW1wbGUgaW5jdWJhdGlvbnMsIHRoaXMgd2FzIG9ubHkgcGFydGlhbGx5IGZlYXNpYmxlLgoKV2hpbGUgYm90aCB0aGUgYWlyLWRyeSArIHN0b3JhZ2UgKEV4cGVyaW1lbnQgMSkgYW5kIGFpci1kcnkgKEV4cGVyaW1lbnQgMikgdHJlYXRtZW50cyBoYWQgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gJFxEZWx0YSReMTReQy1DT34yfiwgdGhlc2UgY2hhbmdlcyB3ZXJlIG5vdCBkcml2ZW4gYnkgZGlmZmVyZW5jZXMgaW4gdGhlIGFtb3VudCBvZiBjYXJib24gcmVzcGlyZWQgKCoqRmlnIDcqKikuIA==