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
which leads to multiple model solutions. Adding observations of Δ14C-CO2 at more than one point in time can greatly reduce model uncertainty by adding additioanl constraints.
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.
Air-drying and rewetting of soils stimulates the release of CO2…[expand]
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 1a. 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 1b. 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. 2. 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). Vertical gray line demarcates the pre-incubation period
from the equilibrium respiration period. Points show measurements and
lines show trends in mean respiration rates. Shaded ribbons represent
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. Note that CO2
concentrations for control sample incubations in Experiment 1 were only
measured once during the pre-incubation period, so rates are shown as
the cumulative average. For purposes of comparison, Supplemental Figure 1
shows all data plotted with pre-incubation respiration rates calculated
as a cumulative average.
Supplemental respiration rates figure:

Supplemental Fig 1. Respiration rates for Experiment 1 and
Experiment 2 shown with all pre-incubation data calculated as cumulative
averages
Caption: CO2 concentrations for Experiment 1
control samples were only measured once during the pre-incubation
period, in contrast to daily measurements for all other samples.
Pre-incubation respiration rates are shown here calculated as cumulative
averages for the purpose of fair comparison across all treatments.
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. 3. 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. 5)
led to enrichment in grassland samples, but depletion in forest
samples. In contrast, the air-dry only treatment (Experiment 2, open
circles, Fig. 5) 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 5), and significant for grassland samples but not forest samples in Experiment 2 (2019 points, Fig. 5). The absolute mean difference in 14C-CO2
between control and treatment samples was greater in grassland samples
(21.4‰) than in forest samples (12.1‰) for both experiments.
Mean 14C-CO2 showed enrichment relative to the atmosphere for all samples in both experiments. Control sample 14C-CO2
respired from grassland soils was generally closer to the atmosphere
than that from forest soil controls, but the difference from the
atmosphere (ΔΔ14C) increased slightly between 2011 and 2019 in grassland soils while it stayed about the same in forest soils.

Fig 4. 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 14C-CO2
[maybe expand with stats for other explanatory factors? e.g. texture, N content, change in moisture upon rewetting, etc…]
We looked at the possible effect of the difference in the amount of carbon respired (mg CO2-C g soil C-1) on the differences between control and treatment 14C-CO2
using a linear regression model, but it was not significant overall.
When data from Experiment 1 and Experiment 2 were considered separately,
we observed a slight positive trend between the difference in respired
carbon and the difference in 14C-CO2 within Experiment 2, but it was only marginally significant (p = 0.063).

Supplementary Fig. 2. Change in 14C-CO2 in relation to cumulative soil carbon respired
Caption: Note that pre-incubation Δ14C
was not measured for the 2011 control samples. Limits exclude outlier
point (HEW22 control pre-incubation) for improved legibility. [Not
planning to include this figure in the main text as I think it is
difficult to interpret].
Treatment effect on 14C-CO2 for all samples (Experiments 1, 2, and 3)
Difference between control and treatment samples from all experiments
show that treatment effects, i.e. air-drying followed by rewetting
or air-drying followed by storage and subsequent rewetting, typically
result in changes in 14C-CO2 between ±20‰ to ±40‰,
with the majority within ±20‰. These difference are equivalent to the
decline in atmospheric radiocarbon over 5 and 10 years, respectively,
during the period of 2000 to 2020. The samples from Tennessee (magenta
points) are an exception. However, these points do not show only bomb-C
enrichment, but rather the results of exposure to a localized plume of 14C enriched CO2 from a nearby incinerator four years prior to sample collection (Trumbore et al., 2002). Treatment 14C-CO2 for these highly enriched samples were more depleted relative to the controls than were the samples only labeled with bomb-C.
Grassland samples tend to be above 1:1 line, while forest samples are
generally below, regardless of origin. One exception to this trend is
the three German forest samples that are above 1:1 line, which were
analyzed in 2019 (air-dry only treatment).

Fig. 5. Effect of air-drying and rewetting + storage on 14C-CO2
Caption: Points show data from all three experiments. Points
are the mean of laboratory replicates (for replicated samples); error
bars are 2x standard error of the mean. Solid line is 1:1, while the
dashed and dotted lines show differences of ±20‰ and ±$40‰, equivalent
to the decline in atmospheric CO2 over 5 and 10 years respectively during the period of 2000 to 2020.
Storage duration effect on 14C-CO2 (Experiment 3)
There does not seem to be evidence for a storage duration effect in
the samples that only contain bomb-C, although 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.

Fig. 6. Change in 14C-CO2 in relation to storage duration
Caption: Points show data from both Experiment 1 (in black)
and Experiment 3 (all other points). Dashed and dotted lines show a
difference of 20‰ and 40‰, 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.
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. The TN 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.
Discussion
Random notes here…
Effect of C respired
LS0tCnRpdGxlOiAiQXJjaGl2ZWQgU29pbCBJbmN1YmF0aW9ucyBQcm9qZWN0IgphdXRob3I6ICJKLiBCZWVtLU1pbGxlciIKZGF0ZTogIjMwIEFwciAyMDIwIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIGNzczogY3VzdG9tLmNzcwogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogICAgY3NzOiBjdXN0b20uY3NzCmhlYWRlcl9pbmNsdWRlczoKICAtIFx1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQogIC0gXHVzZXBhY2thZ2V7ZmxvYXR9Ci0tLQpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICdjZW50ZXInLCBkZXYgPSAnY2Fpcm9fcGRmJykKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoU29pbFIpCmxpYnJhcnkoY29ycnBsb3QpCmxpYnJhcnkob3Blbnhsc3gpCmxpYnJhcnkoSVNSYUQpCmBgYAojIyBOb3RlcwoqIFRoaXMgd29ya2Jvb2sgaXMgaW50ZW5kZWQgdG8gbG9hZCBhbmQgcHJlcGFyZSB0aGUga2V5IGRhdGEgZm9yIGFuYWx5c2lzIGZvciB0aGUgYXJjaGl2ZSBpbmN1YmF0aW9uIHByb2plY3QuCiogaW4gZ2VuZXJhbCwgdGhpcyBpcyBhbiB1cGRhdGVkIHZlcnNpb24gb2Ygc2NyaXB0ICIuL3NyYy9hcmNfaW5jX21hc3Rlci5SIgoqIGFsbCBjb2RlIGNodW5rIG9wdGlvbnMgYXJlIHNldCB0byAiZWNobyA9IEZBTFNFIjsgc2VlIHJhdyAuUm1kIGZpbGUgZm9yIGRhdGEgd3JhbmdsaW5nIGNvZGUuCgojIEludHJvZHVjdGlvbgpUaGUgbGFib3JhdG9yeSBzb2lsIGluY3ViYXRpb24gaXMgYSBjb21tb25seSB1c2VkIHRlY2huaXF1ZSBmb3IgdW5kZXJzdGFuZGluZyBzb2lsIGNhcmJvbiBkeW5hbWljcy4gU29pbCBjYXJib24gaXMgYSBoZXRlcm9nZW5lb3VzIG1peHR1cmUgb2Ygb3JnYW5pYyBtYXR0ZXIsIHNvbWUgb2Ygd2hpY2ggcGVyc2lzdHMgaW4gdGhlIHNvaWwgZm9yIG1vbnRocyBvciB5ZWFycywgd2hpbGUgc29tZSBwZXJzaXN0cyBmb3IgY2VudHVyaWVzIG9yIG1pbGxlbmlhLiBUaGUgcGVyc2lzdGVuY2Ugb2Ygc29pbCBjYXJib24gY2FuIGJlIHVuZGVyc3Rvb2QgdGhyb3VnaCB0aGUgY29uY2VwdCBvZiBkaWZmZXJlbnQgInBvb2xzIiBvZiBjYXJib24gdGhhdCBhcmUgZGVmaW5lZCBieSB0aGUgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZXkgcGVyc2lzdCBpbiB0aGUgc29pbCBhbmQgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgZGlzdGluY3QgYWdlIGRpc3RyaWJ1dGlvbnMuIAoKTmF0dXJhbCBhYnVuZGFuY2UgcmFkaW9jYXJib24gcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgY2FyYm9uIGR5bmFtaWNzIG9uIHRoZSBzY2FsZSBvZiBjZW50dXJpZXMgdG8gbWlsbGVuaWEsIHdoaWxlIGluc2lnaHQgaW50byBkZWNhZGFsIHNjYWxlIGR5bmFtaWNzIGNhbiBiZSBnYWluZWQgZnJvbSB0cmFjaW5nIHRoZSBwdWxzZSBvZiByYWRpb2NhcmJvbiBpbnRyb2R1Y2VkIGludG8gdGhlIGJpb3NwaGVyZSBmcm9tIG51Y2xlYXIgd2VhcG9ucyB0ZXN0aW5nICgiYm9tYi1DIikgaW4gdGhlIG1pZC0yMF50aF4gY2VudHVyeS4gVGhlIGJvbWItQyBwdWxzZSBwZWFrZWQgaW4gdGhlIGF0bW9zcGhlcmUgaW4gdGhlIDE5NTBzIChGaWcuIDEpLCBidXQgZHVlIHRvIGRpZmZlcmVudGlhbCByYXRlcyBvZiBhYmlvdGljIGluY29ycG9yYXRpb24gYW5kIGJpb2xvZ2ljYWwgcHJvY2Vzc2luZywgdGhlIHBlYWsgaXMgbGFnZ2VkIGluIHRpbWUgYW5kIGRhbXBlbmVkIGluIHNvaWxzLiBUaGUgcmVsYXRpdmUgZW5yaWNobWVudCBpbiBib21iLUMgaW4gZGlmZmVyZW50IHBvb2xzIG9mIHNvaWwgY2FyYm9uIGlzIGEgdXNlZnVsIHRvb2wgZm9yIGluZmVycmluZyB0aGUgcmVsYXRpdmUgcmF0ZSBhdCB3aGljaCBjYXJib24gZW50ZXJzIGFuZCBsZWF2ZXMgdGhlIHBvb2wsIGFuZCBmb3IgYSBob21vZ2Vub3VzIHBvb2wgaXQgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gdGhlIGludHJpbnNpYyBkZWNvbXBvc2l0aW9uIHJhdGUuCgpFeHRyYWN0aW5nIGFuZCBtZWFzdXJpbmcgdGhlIHJhZGlvY2FyYm9uIGNvbnRlbnQgb2Ygc3BlY2lmaWMgc29pbCBjYXJib24gcG9vbHMgaXMgaGFtcGVyZWQgYnkgc3BhdGlhbCBhbmQgdGVtcG9yYWwgaGV0ZXJvZ2VuZWl0eSBvZiB0aGUgbWVjaGFuaXNtcyB0aGF0IGxlYWQgdG8gc29pbCBjYXJib24gcGVyc2lzdGVuY2UsIHN1Y2ggYXMgcGh5c2ljYWwgb2NjbHVzaW9uIGluIGFnZ3JlZ2F0ZXMsIGFzc29jaWF0aW9uIHdpdGggbWluZXJhbHMsIG9yIHRoZXJtb2R5bmFtaWNzLiBEZWZpbmluZyBzb2lsIGNhcmJvbiBwb29scyBlbXBpcmljYWxseSB3aXRoIHRlY2huaXF1ZXMgc3VjaCBhcyBkZW5zaXR5LCBzaXplLCBvciByZXNpc3RhbmNlIHRvIGNoZW1pY2FsIGF0dGFjayBjYW4gYmUgdXNlZnVsLCBidXQgdGhlc2UgbWV0aG9kcyBhbHNvIGludHJvZHVjZSBhcnRpZmFjdHMgYW5kIGxpa2VseSByZXN1bHQgaW4gbWl4dHVyZXMgb2YgcG9vbHMgd2l0aCBkaWZmZXJlbnQgYWdlIGRpc3RyaWJ1dGlvbnMuIEluIGNvbnRyYXN0LCBhbHRob3VnaCB0aGV5IGFsc28gaW50cm9kdWNlIGFydGlmYWN0cyBkdWUgdG8gZGlzdHVyYmFuY2UgYW5kIHBvdGVudGlhbCBhbHRlcmF0aW9uIG9mIHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5LCBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgbWFrZSB1c2Ugb2YgdGhlIHNhbWUgZnJhY3Rpb25hdGlvbiBhZ2VudCBhcyBpcyBmb3VuZCAqaW4gc2l0dSo6IHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5LiBNZWFzdXJpbmcgdGhlIHJhZGlvY2FyYm9uIHNpZ25hbCBvZiBDT34yfiAoJFxEZWx0YSReMTReQy1DT34yfikgcmVsZWFzZWQgaW4gbGFib3JhdG9yeSBpbmN1YmF0aW9ucyBvZiBidWxrIHNvaWxzIGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgcmVsYXRpdmUgcHJvY2Vzc2luZyByYXRlIG9mIGNhcmJvbiBpbiBzb2lsIChvciB0cmFuc2l0IHRpbWUpIGFzIGl0IHByb3ZpZGVzIGFuIGludGVncmF0ZWQgbWVhc3VyZSBvZiB0aGUgd2VpZ2h0ZWQgY29udHJpYnV0aW9uIHRvIHRoZSByZWxlYXNlIGZsdXggZnJvbSBwb29scyBvZiBzb2lsIGNhcmJvbiB3aXRoIGRpc3RpbmN0IHByb2Nlc3NpbmcgcmF0ZXMuIAoKSW50ZXJwcmV0aW5nICRcRGVsdGEkXjE0XkMtQ09+Mn4gZnJvbSBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgcmVxdWlyZXMgdGhlIHVzZSBvZiBhIG1vZGVsLiBIb3dldmVyLCBwYXJhbWV0ZXJpemluZyB0aGVzZSBtb2RlbHMgaXMgY2hhbGxlbmdpbmcsIGJvdGggZHVlIHRvIHRoZSB1bmNlcnRhaW50eSBvZiB0aGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtcyB0aGVtc2VsdmVzIGFzIHdlbGwgYXMgYSBsYWNrIG9mIG9ic2VydmF0aW9uYWwgY29uc3RyYWludHMuIFJhZGlvY2FyYm9uIG9ic2VydmF0aW9ucyBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aW1lIGFyZSB2ZXJ5IHVzZWZ1bCwgYnV0IGR1ZSB0byB0aGUgY3VydmF0dXJlIG9mIHRoZSBib21iLUMgcGVhayB0aGVyZSBhcmUgdHdvIHBvaW50cyBpbiB0aW1lIHdpdGggdGhlIHNhbWUgYXRtb3NwaGVyaWMgcmFkaW9jYXJib24gdmFsdWUgd2hpY2ggbGVhZHMgdG8gbXVsdGlwbGUgbW9kZWwgc29sdXRpb25zLiBBZGRpbmcgb2JzZXJ2YXRpb25zIG9mICRcRGVsdGEkXjE0XkMtQ09+Mn4gYXQgbW9yZSB0aGFuIG9uZSBwb2ludCBpbiB0aW1lIGNhbiBncmVhdGx5IHJlZHVjZSBtb2RlbCB1bmNlcnRhaW50eSBieSBhZGRpbmcgYWRkaXRpb2FubCBjb25zdHJhaW50cy4KClNvaWwgYXJjaGl2ZXMgaGF2ZSBhbHJlYWR5IHByb3ZlbiB0byBiZSBhIHZhbHVhYmxlIHNvdXJjZSBvZiBkYXRhIGZvciBjb25zdHJhaW5pbmcgc29pbCBjYXJib24gbW9kZWxzIGJ5IHByb3ZpZGluZyB0aW1lIHNlcmllcyBvZiB0aGUgY2hhbmdlIGluIHNvaWwgY2FyYm9uIF4xNF5DIGNvbnRlbnQuIFRoZSBwcm9taXNlIG9mIGltcHJvdmluZyBtb2RlbHMgZnVydGhlciBieSBvYnRhaW5pbmcgXjE0XkMtQ09+Mn4gbWVhc3VyZW1lbnRzIGZyb20gYXJjaGl2ZWQgc29pbHMgaXMgdGFudGFsaXppbmcsIGJ1dCBmaXJzdCB0aGUgcG9zc2libGUgZWZmZWN0cyBvZiBhaXItZHJ5aW5nIGFuZCByZXdldHRpbmcsIGFzIHdlbGwgYXMgdGhlIGVmZmVjdCBvZiB0aGUgZHVyYXRpb24gb2Ygc3RvcmFnZSwgbXVzdCBiZSBxdWFudGlmaWVkLgoKQWlyLWRyeWluZyBhbmQgcmV3ZXR0aW5nIG9mIHNvaWxzIHN0aW11bGF0ZXMgdGhlIHJlbGVhc2Ugb2YgQ09+Mn4uLi5bZXhwYW5kXSAKCldlIGRlc2lnbmVkIGFuIGV4cGVyaW1lbnQgdG8gYXNzZXNzIHRoZXNlIGVmZmVjdHMsIHByZWxpbWluYXJ5IHJlc3VsdHMgb2Ygd2hpY2ggYXJlIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHJlcG9ydC4KCiMgSHlwb3RoZXNlcyBhbmQgY29uY2VwdHVhbCB1bmRlcnN0YW5kaW5nCklmIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgZGlzcHJvdmVkLCBpLmUuIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZyAoYWlyLWRyeSkgb3IgYWlyLWRyeWluZywgcmV3ZXR0aW5nLCBhbmQgc3RvcmFnZSAoYWlyLWRyeSArIHN0b3JhZ2UpIGhhdmUgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gJFxEZWx0YSReMTReQy1DT34yfiByZWxhdGl2ZSB0byBjb250cm9sIHNhbXBsZXMsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgb3V0Y29tZXM6IGVucmljaG1lbnQgb2YgdGhlIHJlc3BpcmF0aW9uIGZsdXggb3IgZGVwbGV0aW9uLiAKCkluIGEgc2ltcGxlIHR3by1wb29sIHNvaWwgY2FyYm9uIG1vZGVsLCB0aGUgdHJlYXRtZW50IGVmZmVjdCBjYW4gYmUgY29uY2VwdHVhbGl6ZWQgYXMgYSByZWxhdGl2ZSBjaGFuZ2UgaW4gdGhlIGNvbnRyaWJ1dGlvbiBvZiAic2xvd2VyIiBvciAiZmFzdGVyIiBjeWNsaW5nIGNhcmJvbiB0byB0aGUgcmVzcGlyYXRpb24gZmx1eCBvYnNlcnZlZCBpbiBjb250cm9sIHNhbXBsZXMuCgpUcmFqZWN0b3JpZXMgb2YgdGhlIGNoYW5nZSBpbiAkXERlbHRhJF4xNF5DIG92ZXIgdGltZSBmb3IgInNsb3ciIGFuZCAiZmFzdCIgc29pbCBjYXJib24gcG9vbHMgYXJlIHNob3duIGJlbG93IChGaWcuIDEpIGluIHJlbGF0aW9uc2hpcCB0byB0aGUgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBhbmQgcmVzcGlyZWQgQ09+Mn4gZm9yIGEgdGhlb3JldGljYWwgbW9kZWwgc3lzdGVtLgoKYGBge3IgY29uY2VwdHVhbC1tb2RlbC1jYWxjcywgaW5jbHVkZSA9IEZBTFNFfQojIGluaXRpYWwgcGFyYW1ldGVyIHNldApEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQpEYXRtIDwtIERhdG1bRGF0bSREYXRlID4gMTkwMCwgYygiRGF0ZSIsICJOSGMxNCIpXQp5cnMgPC0gRGF0bSREYXRlCgojIGhlbHBlciBmeHMKbGFtYmRhIDwtICgxLzgyNjcpCgprIDwtIGZ1bmN0aW9uKEZtKSB7CiAgKEZtKmxhbWJkYSkvKDEtRm0pCn0KZm0gPC0gZnVuY3Rpb24oayl7CiAgay8oaytsYW1iZGEpCn0KZm1fMTRjIDwtIGZ1bmN0aW9uKGZtLCBkYXRlKSB7CiAgKGZtKmV4cChsYW1iZGEqKDE5NTAgLSBkYXRlKSkgLSAxKSoxMDAwCn0KCiMgZm9yZXN0cwpmLmMgPC0gMzguOTYxMDQgIyBmb3Jlc3QgQyBwb29sLCB0b3RhbCAobWVhbiBIYWluaWNoIGZvcmVzdCBDICA9IDI0IGcga2deLTEpOyBuYiBAIHNzID0gc3VtKC0xKnNvbHZlKEEpJSolYyhmLmluKmYuZ2FtLCBmLmluKigxLWYuZ2FtKSkpCmYuaW4gPC0gMSAjIGlucHV0cyAoMTIuNT1tZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIGdDIHlyLTEsIDIwMTEgaW5jdWJhdGlvbiBkYXRhKTsgdHJ5IG11Y2ggbGVzcy4uLgpmLmZyYyA8LSAuMSAjIEMtc3RvY2sgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChmcm9tIFNjaHJ1bXBmIDIwMTMsIEhhaW5pY2ggMC01LCBmcmVlIGxpZ2h0KQpmLkNmYXN0IDwtIGYuZnJjKmYuYwpmLkNzbG93IDwtIGYuYy1mLkNmYXN0CmYua2Zhc3QgPC0gMS82ICMgdW5rbm93bgpmLmtzbG93IDwtIDEvMTAwICMgdW5rbm93bgpmLmZhc3QuZm0gPC0gZm0oZi5rZmFzdCkKZi5zbG93LmZtIDwtIGZtKGYua3Nsb3cpCmYuRjBfRGVsdGExNEMgPC0gZm1fMTRjKGMoZi5mYXN0LmZtLCBmLnNsb3cuZm0pLCBkYXRlID0gYygxOTAwLCAxOTAwKSkKZi5nYW0gPC0gKGYuYypmLkNmYXN0KmYua2Zhc3QpLyhmLmMqZi5DZmFzdCpmLmtmYXN0K2YuYypmLkNzbG93KmYua3Nsb3cpICMgaW5wdXQgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChwcm9wb3J0aW9uIHRvIGZhc3QgcG9vbCwgZnVuY3Rpb24gb2Yga3MpCiAgCiMgIyBncmFzc2xhbmRzCiMgZy5jIDwtIDQyICMgQyBwb29sLCB0b3RhbCAobWVhbiBIYWluaWNoIGdyYXNzbGFuZCBDIGcga2deLTEpCiMgZy5pbiA8LSA2My40ICMgaW5wdXRzIChtZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIDIwMTEgaW5jdWJhdGlvbiBkYXRhKQojIGcuZnJjIDwtIC4zICMgQy1zdG9jayBwYXJ0aXRpb25pbmcgY29lZmZpY2llbnQgKGZyb20gU2NocnVtcGYgMjAxMywgYXZlcmFnZSBvZiBMYWNxdWV2aWxsZSwgRWFzdGVyIEJ1c2gsIEJ1Z2FjLCAwLTUsIGZyZWUgbGlnaHQpCiMgZy5DZmFzdCA8LSBnLmZyYypnLmMKIyBnLkNzbG93IDwtIGcuYy1nLkNmYXN0CiMgZy5rZmFzdCA8LSAxLzEwICMgdW5rbm93bgojIGcua3Nsb3cgPC0gMS8xMDAgIyB1bmtub3duCiMgZy5mYXN0LmZtIDwtIGZtKGcua2Zhc3QpCiMgZy5zbG93LmZtIDwtIGZtKGcua3Nsb3cpCiMgZy5GMF9EZWx0YTE0QyA8LSBmbV8xNGMoYyhnLmZhc3QuZm0sIGcuc2xvdy5mbSksIGRhdGUgPSBjKDE5MDAsIDE5MDApKQojIGcuZ2FtIDwtIChnLmMqZy5DZmFzdCpnLmtmYXN0KS8oZy5jKmcuQ2Zhc3QqZy5rZmFzdCtnLmMqZy5Dc2xvdypnLmtzbG93KSAjIGlucHV0IHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCAocHJvcG9ydGlvbiB0byBmYXN0IHBvb2wsIGZ1bmN0aW9uIG9mIGtzKQoKIyAycG9vbCBwYXJhbGxlbCBtb2RlbCwgZm9yZXN0cwpmLjJwIDwtIFR3b3BQYXJhbGxlbE1vZGVsMTQodCA9IHlycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gYyhmLmtmYXN0LCBmLmtzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMwID0gYyhmLkNmYXN0LCBmLkNzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDID0gZi5GMF9EZWx0YTE0QywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gZi5pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IGYuZ2FtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGYyA9IERhdG0pCgpmLjJwLkMxNCA8LSBnZXRGMTQoZi4ycCkKZi4ycC5IUiA8LSBnZXRGMTRSKGYuMnApCmYuMnAuQ3RvdCA8LSBnZXRDKGYuMnApCgojIHNvbHZlIGZvciBzdGVhZHktc3RhdGUgQyBzdG9ja3MKQSA8LSAtMSpkaWFnKGMoZi5rZmFzdCwgZi5rc2xvdykpCnN1bSgtMSpzb2x2ZShBKSUqJWMoZi5pbipmLmdhbSwgZi5pbiooMS1mLmdhbSkpKQoKZi4ycC5DMTQuZGYgPC0gZGF0YS5mcmFtZSgKICB5ZWFycyA9IHJlcChEYXRtJERhdGUsIDQpLAogIGQxNEMgPSBjKGYuMnAuQzE0WywxXSwgZi4ycC5DMTRbLDJdLCBmLjJwLkhSLCBEYXRtJE5IYzE0KSwKICBwb29sID0gcmVwKGMoImZhc3QiLCAic2xvdyIsICJyZXNwaXJhdGlvbiIsICJhdG0iKSwgZWFjaCA9IG5yb3coZi4ycC5DMTQpKQogICkKCiMgIyBQbG90IEMgc3RvY2tzIHRvIGNvbmZpcm0gZmxhdAojIHBsb3QoeXJzLCB4bGltID0gYygxOTAwLDIwMjIpLCB5bGltID0gYygwLDYwKSkKIyBsaW5lcyh5cnMsIGYuMnAuQ3RvdFssIDFdLCBjb2wgPSAyKQojIGxpbmVzKHlycywgZi4ycC5DdG90WywgMl0sIGNvbCA9IDQpCgojIGNhbGN1bGF0ZSByZXNwIGZsdXggcG9pbnRzIGF0IDE5OTEgYW5kIDIwMTkgYW5kIHB1dCBpbiBkYXRhIGZyYW1lCm9icy5wdHMgPC0gZGF0YS5mcmFtZShwb29sID0gcmVwKCJyZXNwaXJhdGlvbiIsIDYpLAogICAgICAgICAgICAgICAgICAgICAgeWVhcnMgPSByZXAoYygxOTkxLDIwMTkpLDMpLAogICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IGMobWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDE5OTAgJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDE5OTIgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDIwMTggJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDIwMjAgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwLCA2MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MCwgMzApLAogICAgICAgICAgICAgICAgICAgICAgT2JzZXJ2YXRpb24gPSByZXAoYygiY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgc2xvdyBwb29sIGNvbnRyaWJ1dGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgZmFzdCBwb29sIGNvbnRyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IDIpKQpvYnMucHRzLnIgPC0gb2JzLnB0c1tvYnMucHRzJE9ic2VydmF0aW9uID09ICJjb250cm9sIiwgXQpgYGAKCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtZmlnMX0KZ2dwbG90KGYuMnAuQzE0LmRmLCBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCkpICsKICBnZW9tX3BhdGgoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSwKICAgIGxhYmVscyA9IGMoImF0bSIgPSAiYXRtb3NwaGVyZSIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICJmYXN0IiwKICAgICAgICAgICAgICAgInNsb3ciID0gInNsb3ciKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnIGByIHsoZmlnLm4gPC0gMSl9YGEuIE1vZGVsZWQgdHJhamVjdG9yaWVzIG9mICRcRGVsdGEkXjE0XkMgb3ZlciB0aW1lIGluIHNvaWwgY2FyYm9uIHBvb2xzIChmYXN0LCBzbG93LCByZXNwaXJhdGlvbiBmbHV4KSBpbiByZWxhdGlvbnNoaXAgdG8gb2JzZXJ2ZWQgYXRtb3NwaGVyaWMgJFxEZWx0YSReMTReQyoqCgo+KkNhcHRpb246KiBNb2RlbGVkIGN1cnZlcyBkZXJpdmVkIGZyb20gYSBjb25jZXB0dWFsIHR3by1wb29sIHBhcmFsbGVsIG1vZGVsIHN5c3RlbSBpbiB3aGljaCBpbnB1dHMgYXJlIHBhcnRpdGlvbmVkIGJldHdlZW4gZmFzdGVyIGFuZCBtb3JlIHNsb3dseSBjeWNsaW5nIHBvb2xzIHdpdGhvdXQgYW55IHRyYW5mZXJzIGJldHdlZW4gdGhlIHBvb2xzLiBDYXJib24gc3RvY2tzIGFuZCBwb29sIHNpemVzIGFyZSBiYXNlZCBvbiBkZW5zaXR5IGZyYWN0aW9uIGRhdGEgZm9yIHRoZSBIYWluaWNoIEZvcmVzdCAoU2NocnVtcGYgZXQgYWwuIDIwMTMpOyBkZWNvbXBvc2l0aW9uIHJhdGVzIGFyZSBjaG9zZW4gdG8gYmUgcmVhbGlzdGljIGJ1dCBhcmUgYXJiaXRyYXJ5LiBBdG1vc3BoZXJpYyAkXERlbHRhJF4xNF5DIGRhdGEgdXAgdG8gdGhlIHllYXIgMjAxNSBhcmUgZnJvbSBHcmF2ZW4gZXQgYWwuICgyMDE3KSwgd2hpbGUgZGF0YSBwb2ludHMgYmV5b25kIDIwMTUgdXNlIHRoZSBleHRyYXBvbGF0aW9uIG1ldGhvZCBmcm9tIFNpZXJyYSAoMjAxOCkuIEFsbCBhdG1vc3BoZXJpYyBkYXRhIGlzIGZvciB0aGUgbm9ydGhlcm4gaGVtaXNwaGVyZSAoem9uZSAyKS4KClRoZSBzaW1wbGVzdCB0d28tcG9vbCBtb2RlbCBpcyBhIHBhcmFsbGVsIHN5c3RlbTogb25lIGluIHdoaWNoIGNhcmJvbiBlbnRlcmluZyB0aGUgc29pbCBpcyBwYXJ0aXRpb25lZCBiZXR3ZWVuIHRoZSB0d28gcG9vbHMgd2l0aG91dCBhbnkgdHJhbnNmZXJzIGZyb20gb25lIHBvb2wgdG8gdGhlIG90aGVyLiBIb3dldmVyLCBldmVuIGluIHRoaXMgc2ltcGxlIHN5c3RlbSwgdGhlIHNhbWUgdHJlYXRtZW50IGVmZmVjdCBjYW4gcmVzdWx0IGluIGVpdGhlciBlbnJpY2htZW50IG9yIGRlcGxldGlvbiBkZXBlbmRpbmcgb24gdGhlIHllYXIgdGhlIHNhbXBsZSB3YXMgY29sbGVjdGVkLiBUaGUgZGlyZWN0aW9uIG9mIGNoYW5nZSB3aWxsIGJlIGRlcGVuZGVudCBvbiBzeXN0ZW0gZHluYW1pY3MsIHNwZWNpZmljYWxseSB0aGUgaW50cmluc2ljIGRlY29tcG9zaXRpb24gcmF0ZXMgb2YgdGhlIHNsb3cgYW5kIGZhc3QgcG9vbHMsIHdoaWxlIGluIG1vcmUgY29tcGxpY2F0ZWQgc3l0ZW1zIHRoZSBhbW91bnQgb2YgbWl4aW5nIGJldHdlZW4gdGhlIHBvb2xzIHdpbGwgcGxheSBhIHJvbGUgYXMgd2VsbC4gUG90ZW50aWFsIHRyZWF0bWVudCBlZmZlY3RzIGZvciB0aGUgc2FtZSBwYXJhbGxlbCB0d28tcG9vbCBtb2RlbCBzeXN0ZW0gc2hvd24gaW4gRmlnLiAxIGFyZSBzaG93biBiZWxvdyBhdCB0d28gcG9pbnRzIGluIHRpbWUgKEZpZy4gMikuCgpgYGB7ciBjb25jZXB0dWFsLW1vZGVsLWZpZzFifQojIHpvb20gKHcvIGF0bSwgdG8gMjAyMikKZi4ycC5DMTQuZGYgJT4lIAogIGZpbHRlcih5ZWFycyA+IDE5ODcpICU+JQogIGZpbHRlcihwb29sICE9ICJhdG0iKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDKSkgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBwb29sKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IG9icy5wdHMsIGFlcyh5ZWFycywgZDE0Yywgc2hhcGUgPSBPYnNlcnZhdGlvbiksIGNvbG9yID0gIiNGRkMxMDciLCBzdHJva2UgPSAxLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiTW9kZWwgcG9vbCIsCiAgICB2YWx1ZXMgPSBjKCJhdG0iID0gOCwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLCAKICAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9ICIjRkZDMTA3IiwgCiAgICAgICAgICAgICAgICJzbG93IiA9ICIjMUU4OEU1IiksCiAgICBsYWJlbHMgPSBjKCJhdG0iID0gImF0bW9zcGhlcmUiLAogICAgICAgICAgICAgICAiZmFzdCIgPSAiZmFzdCIsCiAgICAgICAgICAgICAgICJzbG93IiA9ICJzbG93IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwoCiAgICBuYW1lID0gIk9ic2VydmVkIHJlc3BpcmF0aW9uIiwKICAgIHZhbHVlcyA9IGMoImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICJpbmNyZWFzZWQgc2xvdyBwb29sIGNvbnRyaWJ1dGlvbiIgPSAwLAogICAgICAgICAgICAgICAiaW5jcmVhc2VkIGZhc3QgcG9vbCBjb250cmlidXRpb24iID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAyNjUpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnIGByIHsoZmlnLm4pfWBiLiBQb3RlbnRpYWwgc2hpZnRzIGluICRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyZWQgQ09+Mn4gaW4gcmVzcG9uc2UgdG8gYWlyLWRyeWluZyBhbmQgcmV3ZXR0aW5nLCBvciBhaXItZHJ5aW5nIGFuZCByZXdldHRpbmcgKyBzdG9yYWdlKioKCj4qQ2FwdGlvbjoqIEJsdWUgYW5kIG1hZ2VudGEgbGluZXMgc2hvdyBtb2RlbGVkIHRyYWplY3RvcmllcyBvZiAkXERlbHRhJF4xNF5DIGluIGZhc3QgYW5kIHNsb3cgY3ljbGluZyBzb2lsIGNhcmJvbiBwb29scyAoc2FtZSBtb2RlbCBhcyBGaWcgMSksIGFuZCAkXERlbHRhJF4xNF5DIG9mIHJlc3BpcmVkIENPfjJ+IGlzIHNob3duIGluIHllbGxvdy4gU29saWQgY2lyY2xlcyBzaG93IGh5cG90aGV0aWNhbCBvYnNlcnZhdGlvbnMgb2YgXjE0XkMgb3IgcmVzcGlyZWQgQ09+Mn4gZnJvbSBjb250cm9sIGluY3ViYXRpb25zLCB3aGlsZSB0aGUgb3BlbiBzeW1ib2xzIHJlcHJlc2VudCB0d28gcG9zc2libGUgc2NlbmFyaW9zIGluIHdoaWNoIF4xNF5DLUNPfjJ+IHNoaWZ0cyBkdWUgdG8gaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmYXN0IHBvb2wgKG9wZW4gY2lyY2xlcyksIG9yIHNoaWZ0cyBkdWUgdG8gaW5jcmVhc3NlZCBjb250cmlidXRpb24gZnJvbSB0aGUgc2xvdyBwb29sIChvcGVuIHNxdWFyZXMpLiBEdWUgdG8gdGhlIGNyb3NzaW5nIG9mIHRoZSBibHVlIGFuZCBtYWdlbnRhIGxpbmVzIGluIDIwMDksIGluY3JlYXNlZCBjb250cmlidXRpb24gb2YgdGhlIHNsb3cgcG9vbCB0byByZXNwaXJhdGlvbiBmb2xsb3dpbmcgdHJlYXRtZW50IGxlYWRzIHRvIHJlbGF0aXZlIGRlcGxldGlvbiBvZiBeMTReQy1DT34yfiBpbiAxOTkxLCBidXQgcmVsYXRpdmUgZW5yaWNobWVudCBvZiBeMTReQy1DT34yfiBpbiAyMDE5LCB3aGlsZSB0aGUgb3Bwb3NpdGUgaXMgb2JzZXJ2ZWQgZm9yIGluY3JlYXNlZCBmYXN0IHBvb2wgY29udHJpYnV0aW9uLgoKSW4gdGhlIGFib3ZlIHBsb3QgKEZpZy4gMiksIGluY3JlYXNlZCBjb250cmlidXRpb24gZnJvbSB0aGUgc2xvdyBwb29sIGxlYWRzIHRvIGRlcGxldGlvbiBpbiAkXERlbHRhJF4xNF5DIG9mIHJlc3BpcmF0aW9uIHJlbGF0aXZlIHRvIHRoZSBjb250cm9sIG9ic2VydmF0aW9uIGluIDE5OTEgYnV0IHJlbGF0aXZlIGVucmljaG1lbnQgaW4gMjAxOS4KCiMgTWV0aG9kcyBhbmQgbWF0ZXJpYWxzCgoqUmFkaW9jYXJib24gY29ycmVjdGlvbnMqCgpBbHRob3VnaCBkaWZmZXJlbmNlcyB3ZXJlIHNtYWxsLCByYWRpb2NhcmJvbiBkYXRhIGZvciBhcmNoaXZlZCBzYW1wbGVzIHdlcmUgZmlyc3QgY29ycmVjdGVkIGZvciBkZWNheSBzaW5jZSB0aGUgeWVhciBvZiBjb2xsZWN0aW9uIGJlZm9yZSBhc3Nlc3NpbmcgdHJlYXRtZW50IGVmZmVjdHMuCgpEZWNheSBjb3JyZWN0aW9uIGZvcm11bGE6CiQkMTAwMCBcY2RvdCBcbGVmdCggKEZNIFxjZG90IGVee1xmcmFjey15ZWFyX3tzYW1wbGVkfSArIDE5NTB9ezgyNjd9fSkgLSAxIFxyaWdodCkkJAoKd2hlcmUgRk0gaXMgdGhlIGZyYWN0aW9uIG1vZGVybiwgYW5kIDgyNjcgaXMgdGhlIGludmVyc2Ugb2YgdGhlIHByb2R1Y3Qgb2YgdGhlIG5hdHVyYWwgbG9nIG9mIHR3byBhbmQgdGhlIHRydWUgaGFsZiBsaWZlIG9mIF4xNF5DICg1NzMwIHkpLgoKYGBge3IgMTRDIGhlbHBlciBmeHN9CiMgNS4gQ3JlYXRlIGhlbHBlciBmdW5jdGlvbnMKIyBkZWNheSBjb3JyZWN0aW9uIGZ1bmN0aW9uICAKZGVjYXkuY29yci5meCA8LSBmdW5jdGlvbih5ZWFyX3NhbXBsZWQsIGZyYWN0aW9uX21vZGVybikgewogIGlmZWxzZShpcy5uYShmcmFjdGlvbl9tb2Rlcm4pLCBOQSwgMTAwMCooKGZyYWN0aW9uX21vZGVybipleHAoKC15ZWFyX3NhbXBsZWQgKyAxOTUwKS84MjY3KSktMSkpCn0KCiMgZDE0QyB0byBmcmFjdGlvbiBtb2Rlcm4gZnVuY3Rpb24KZDE0Yy5mbS5meCA8LSBmdW5jdGlvbih5ZWFyX3NhbXBsZWQsIGQxNGMpIHsKICAoKGQxNGMgLyAxMDAwKSArIDEpIC8gZXhwKDAuMDAwMTIwOTcgKiAoMTk1MCAtIHllYXJfc2FtcGxlZCkpCiAgfQoKIyBkZWZpbmUgaGVscGVyIGZ1bmN0aW9uIGZvciBzdHJpcHBpbmcgb3V0ICJOQSIgYW5kIG5vbi1FeHBsb3JhdG9yaWVzIGRhdGEKZXh0cmEuY2xlYW4uZnggPC0gZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBkZlt3aGljaChncmVwbCgiSEVHIiwgZGYkUHJvYmUpIHwKICAgICAgICAgICAgICAgICAgIGdyZXBsKCJIRVciLCBkZiRQcm9iZSkgfAogICAgICAgICAgICAgICAgICAgZ3JlcGwoIlNFRyIsIGRmJFByb2JlKSB8CiAgICAgICAgICAgICAgICAgICBncmVwbCgiU0VXIiwgZGYkUHJvYmUpKSwgXQogIGlmKGxlbmd0aChncmVwKCJFeHBlcmltZW50IiwgbmFtZXMoZGYpKSkgPiAwKSB7CiAgICAgZGYgPC0gZGZbd2hpY2goZGYkRXhwZXJpbWVudCAhPSAidG1lIiksIF0gCiAgfQogIGl4IDwtIHdoaWNoKGlzLm5hKGRmJEYxNEMpICYgaXMubmEoZGYkYOKIhjE0Qy4o4oCwKWApKQogIGlmKGxlbmd0aChpeCkgPiAxKSB7CiAgICBkZiA8LSBkZlstaXgsIF0KICB9CiAgcmV0dXJuKGRmKQp9CgojIGV4dHJhY3Qgc3RvcmFnZSBkdXJhdGlvbiBkYXRhIHNlcGFyYXRlbHkKdG1lLjE0Yy5meCA8LSBmdW5jdGlvbihkZikgewogIGRmJFNhbXBsZU5hbWUgPC0gZGYkUHJvYmUKICBkZiRQZXJpb2QgPC0gImluYyIKICBpZihsZW5ndGgoZ3JlcCgiRXhwZXJpbWVudCIsIG5hbWVzKGRmKSkpID4gMCkgewogICAgIGRmIDwtIGRmW3doaWNoKGRmJEV4cGVyaW1lbnQgPT0gInRtZSIpLCBdIAogIH0KICByZXR1cm4oZGYpCn0KYGBgCgoKYGBge3IgcmVhZCB3aWRlIHRzIGRhdGF9CiMgMS4gTG9hZCBmbHV4IGRhdGEgZnJvbSBhaXItZHJ5ICsgc3RvcmFnZSAoZXhwZXJpbWVudCAxKSBhbmQgc3RvcmFnZSBkdXJhdGlvbiAoZXhwZXJpbWVudCAzKSBjb250cm9sIHNhbXBsZXMsIGFuZCBjb252ZXJ0IGZyb20gIndpZGUiIHRvICJsb25nIiBmb3JtYXQgc28gYXMgdG8gbWF0Y2ggb3RoZXIgZGF0YS4gCiMgUmVhZCBhaXItZHJ5ICsgc3RvcmFnZSByZXNwaXJhdGlvbiBjb250cm9sIGRhdGEKYXJjaGl2ZS5jdGwudHMud2lkZSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy1zdG9yYWdlLXQxLWZsdXgvYXJjLWluY194cGxyX2FyYy1zdG9yYWdlLXQxLWZsdXhfMjAyMC0wNC0yOS5jc3YiKQoKIyBDb252ZXJ0IHRpbWUgZGF0YSBmcm9tIHdpZGUgdG8gbG9uZwphcmNoaXZlLmN0bC50cy5kIDwtIHNlbGVjdChhcmNoaXZlLmN0bC50cy53aWRlLCBzdGFydHNfd2l0aCgiaW5jX3RpbWVfZCIpKSAlPiUKICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ0aW1lcG9pbnRfY210diIsCiAgICAgICAgICAgICAgIG5hbWVzX3ByZWZpeCA9ICJpbmNfdGltZV9kXyIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ0aW1lX2QiKQojIHNvcnQgYnkgdGltZXBvaW50X2NtdHYKYXJjaGl2ZS5jdGwudHMuZCA8LSBkYXRhLmZyYW1lKGFyY2hpdmUuY3RsLnRzLmRbb3JkZXIoYXJjaGl2ZS5jdGwudHMuZCR0aW1lcG9pbnRfY210diksXSkKCiMgQ29udmVydCBtZ0NPMiBkYXRhIGZyb20gd2lkZSB0byBsb25nCmFyY2hpdmUuY3RsLnRzLmNvMiA8LSBzZWxlY3QoYXJjaGl2ZS5jdGwudHMud2lkZSwgc3RhcnRzX3dpdGgoImluY19tZ0NPMl9qYXJfIikpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4ID0gImluY19tZ0NPMl9qYXJfIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIm1nQ08yX2phciIpCiMgc29ydCBieSB0aW1lcG9pbnRfY210dgphcmNoaXZlLmN0bC50cy5jbzIgPC0gYXJjaGl2ZS5jdGwudHMuY28yW29yZGVyKGFyY2hpdmUuY3RsLnRzLmNvMiR0aW1lcG9pbnRfY210diksXQoKIyBhc3NlbWJsZSBpbiBsb25nIGRhdGFmcmFtZSAKYXJjaGl2ZS5jdGwudHMgPC0gZGF0YS5mcmFtZShJRCA9IHJlcCh1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCksIDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlvZCA9ICJpbmMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVwb2ludF9jbXR2ID0gcmVwKHNlcShmcm9tID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gNSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggPSBsZW5ndGgoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfZCA9IGFyY2hpdmUuY3RsLnRzLmQkdGltZV9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nQ08yX2phciA9IGFyY2hpdmUuY3RsLnRzLmNvMiRtZ0NPMl9qYXIpCgojIGFkZCBwcmVpbmN1YmF0aW9uIGRhdGEKYXJjaGl2ZS5jdGwudHMucHJlIDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbMTpsZW5ndGgodW5pcXVlKGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiSUQiLCAicHJlaW5jX3RpbWVfZCIsICJwcmVpbmNfbWdDTzJfamFyIildCmFyY2hpdmUuY3RsLnRzLnByZSA8LSByZW5hbWUoYXJjaGl2ZS5jdGwudHMucHJlLCB0aW1lX2QgPSBwcmVpbmNfdGltZV9kLCBtZ0NPMl9qYXIgPSBwcmVpbmNfbWdDTzJfamFyKQphcmNoaXZlLmN0bC50cy5wcmUkdGltZXBvaW50X2NtdHYgPC0gMQphcmNoaXZlLmN0bC50cy5wcmUkUGVyaW9kIDwtICJwcmUiCmFyY2hpdmUuY3RsLnRzLnByZSR0aW1lX2RfY210diA8LSBhcmNoaXZlLmN0bC50cy5wcmUkdGltZV9kCiAgCiMgQ2FsY3VsYXRlIHRpbWVfZF9jbXR2CmFyY2hpdmUuY3RsLnRzIDwtIGJpbmRfcm93cygKICBsYXBwbHkoCiAgICBzcGxpdChhcmNoaXZlLmN0bC50cywgYXJjaGl2ZS5jdGwudHMkdGltZXBvaW50X2NtdHYpLAogICAgZnVuY3Rpb24oeCkgewogICAgICB4JHRpbWVfZF9jbXR2IDwtIHgkdGltZV9kICsgCiAgICAgICAgYXJjaGl2ZS5jdGwudHMucHJlW21hdGNoKHgkSUQsIGFyY2hpdmUuY3RsLnRzLnByZSRJRCksICJ0aW1lX2QiXQogICAgICByZXR1cm4oeCkKICAgIH0KICAgICkKICApCgojIHJiaW5kIHByZWluYyBhbmQgaW5jIGRhdGEKYXJjaGl2ZS5jdGwudHMgPC0gcmJpbmQoYXJjaGl2ZS5jdGwudHMucHJlLCBhcmNoaXZlLmN0bC50cykKCiMgYWRkIFNhbXBsZU5hbWUgY29sdW1uIGFuZCByZXN0b3JlIEV4cGVyaW1lbnQgY29sdW1uCmFyY2hpdmUuY3RsLnRzJFNhbXBsZU5hbWUgPC0gYXJjaGl2ZS5jdGwudHMkSUQKYXJjaGl2ZS5jdGwudHMkRXhwZXJpbWVudCA8LSBhcmNoaXZlLmN0bC50cy53aWRlW21hdGNoKGFyY2hpdmUuY3RsLnRzJElELCBhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgIkV4cGVyaW1lbnQiXQoKIyByZW1vdmUgaW50ZXJtZWRpYXRlIGZpbGVzCnJtKGFyY2hpdmUuY3RsLnRzLmQsIGFyY2hpdmUuY3RsLnRzLmNvMiwgYXJjaGl2ZS5jdGwudHMucHJlKQpgYGAKCmBgYHtyIHJlYWQtbG9uZy10cy1kYXRhfQojIDIuIExvYWQgZmx1eCBkYXRhIGZyb20gYWlyLWRyeSArIHN0b3JhZ2Ugc2FtcGxlcyBhbmQgZnJvbSBhaXItZHJ5IGV4cGVyaW1lbnQgKGN0bCAmIHRyZWF0bWVudCksIEMgJiBOIGRhdGEgZm9yIGFsbCB0aGUgRXhwbG9yYXRvcmllcyBzYW1wbGVzIChtZWFzdXJlZCBpbiAyMDExKSwgYW5kIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgZGF0YSBmb3IgYWxsIGV4cGVyaW1lbnRzLgojIFJlYWQgWHBsciBDIGFuZCBOIGRhdGEKeHBsci5jbiA8LSByZWFkLmNzdigiLi4vZGF0YS9leHRlcm5hbC9leHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfc29pbGNuXzIwMTEvMTcwNDA3X0NOX2NvbmNlbnRyYXRpb25zX0V4cGxvcmF0b3JpZXNfRVBfUGxvdHNfMjAxMS5jc3YiKQoKIyBSZWFkIFhwbHIgMTRDIGRhdGEgZm9yIGNvbnRyb2wgc2FtcGxlcyAoInRtZSIgYW5kICJhcmMiIEV4cGVyaW1lbnRzKQp4cGxyLmN0bC5pc28gPC0gcmVhZC54bHN4KCIuLi9kYXRhL2V4dGVybmFsL2V4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMtY28yXzIwMTEvMTcwMjI4XzE0Q19SZXNwaXJhdGlvbi54bHN4IikKCiMgUmVhZCBzb2lsIG1hc3MgYW5kIG1vaXN0dXJlIGluZm8gZm9yIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCBzYW1wbGVzCmphcmluZm8uYXJjIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXN0b3JhZ2UtdDItamFySW5mby9qYXJfaW5mb3JtYXRpb24uY3N2IikKCiMgUmVhZCBzb2lsIG1hc3MgYW5kIG1vaXN0dXJlIGluZm8gZm9yIGFpci1kcnkgZGF0YQpqYXJpbmZvLnJld2V0IDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYWlyLWRyeS0yMDE5LXdoYy9haXItZHJ5LTIwMTktd2hjXzIwMjAtMDQtMjkuY3N2IikKCiMgUmVhZCBzb2lsIG1hc3MgYW5kIG1vaXN0dXJlIGluZm8gZm9yIHN0b3JhZ2UgZHVyYXRpb24gdHJlYXRtZW50IHNhbXBsZXMKIyByZW1vdmUgdW5pdCByb3cgYW5kIGNvbnZlcnQgdG8gYXBwcm9wcmlhdGUgdHlwZXMKamFyaW5mby50bWUgPC0gdHlwZS5jb252ZXJ0KHJlYWQueGxzeCgiLi4vZGF0YS9yYXcvbGFiX2plbmFfcmVzdWx0cy1jbzJfMjAxOC0wNy0zMC9BcmNJbmNfSW5jRGF0YV8yMDE4Lnhsc3giLCBzaGVldCA9IDEpWy0xLCBdKQoKIyBSZWFkIER1a2UgaXNvIGFuZCBmbHV4IGRhdGEKdG1lLmN0bC5kdWsgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLWR1a2UvYXJjLXRtZS1kdWtlXzIwMjAtMDQtMjkuY3N2IikKCiMgUmVhZCBTaWVycmEgTmV2YWRhIChKdW4ncykgc29pbCBkYXRhCnRtZS5jdGwuc29pbC5zcmEgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXNpZXJyYS9hcmMtdG1lLXNpZXJyYS1zb2lsXzIwMjAtMDQtMjkuY3N2IikKCiMgUmVhZCBPYWsgUmlkZ2UgQyBkYXRhCnRtZS5jdGwub3JubCA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtb3JubC9hcmMtdG1lLW9ybmxfMjAyMC0wNC0zMC5jc3YiKQoKIyBSZWFkIGFpci1kcnkgKyBzdG9yYWdlIHJlc3BpcmF0aW9uIGRhdGEKYXJjaGl2ZS5hcmMudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtc3RvcmFnZS10Mi1mbHV4L2FyY2hpdmUtZmx1eC10Ml8yMDIwLTA0LTI0LmNzdiIpCgojIFJlYWQgY29udHJvbCByZXNwaXJhdGlvbiBkYXRhIGZyb20gMjAxOSBhaXItZHJ5IGV4cGVyaW1lbnQKcmV3ZXQuY3RsLnRzIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvZnJlc2gtMjAxOS1mbHV4L2ZyZXNoLTIwMTktZmx1eF8yMDIwLTA0LTI0LmNzdiIpCgojIFJlYWQgdHJlYXRtZW50IHJlc3BpcmF0aW9uIGRhdGEgZnJvbSAyMDE5IGFpci1kcnkgZXhwZXJpbWVudApyZXdldC5kcnkudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9kcmllZC0yMDE5LWZsdXgvZHJpZWQtMjAxOS1mbHV4XzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCBTaWVycmEgTmV2YWRhIChKdW4ncykgZmx1eCBkYXRhCnRtZS5jdGwuZmx4LnNyYSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtc2llcnJhL2FyYy10bWUtc2llcnJhLWZsdXhfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIHN0b3JhZ2UgZHVyYXRpb24gcmVzcGlyYXRpb24gZGF0YQp0bWUudHJ0LnRzIDwtIHJiaW5kKHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS10Mi1mbHV4L2FyYy10bWUtdDItZmx1eC0xXzIwMjAtMDQtMjcuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXQyLWZsdXgvYXJjLXRtZS10Mi1mbHV4LTJfMjAyMC0wNC0yNy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpKQoKIyBSZWFkIG1pc2NlbGxhbmVvdXMgc3RvcmFnZSB0cmVhdG1lbnQgZGF0YQp0bWUubWlzYyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtbWlzYy9hcmMtdG1lLW1pc2MtaXNvXzIwMjAtMDQtMjkuY3N2IikKYGBgCgpgYGB7ciBzdW1tYXJpemUgZGF0YSwgaW5jbHVkZSA9IEZBTFNFfQojIDMuIENvbWJpbmUgYW5kIHN1bW1hcml6ZSBkYXRhIGluIGxvbmcgZm9ybWF0IHRvIGNhbGN1bGF0ZSByZXNwaXJhdGlvbiByYXRlcyBhbmQgcGxvdCBvdmVyIHRpbWUKIyBOQjogc2V0ICJpbmNsdWRlIiB0byBmYWxzZSB0byBzdXBwcmVzcyBiaW5kX3Jvd3Mgd2FybmluZyBhYm91dCBjb2VyY2luZyBmYWN0b3IgdG8gY2hhcgojIHJlbW92ZSBmb3JtdWxhX2NoZWNrIGNvbHVtbnMKaW52aXNpYmxlKGxpc3QyZW52KGxhcHBseShsaXN0KGFyY2hpdmUuYXJjLnRzID0gYXJjaGl2ZS5hcmMudHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3ZXQuY3RsLnRzID0gcmV3ZXQuY3RsLnRzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld2V0LmRyeS50cyA9IHJld2V0LmRyeS50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtZS50cnQudHMgPSB0bWUudHJ0LnRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4JGZvcm11bGFfY2hlY2sgPC0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgIGVudmlyID0gLkdsb2JhbEVudikKICAgICAgICAgICkKCiMgQWRkIFRyZWF0bWVudCBjb2x1bW5zIHRvIGVhY2ggZGF0YXNldAphcmNoaXZlLmFyYy50cyRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphcmNoaXZlLmN0bC50cyRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnRtZS50cnQudHMkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgpyZXdldC5jdGwudHMkVHJlYXRtZW50IDwtICJjb250cm9sIgpyZXdldC5kcnkudHMkVHJlYXRtZW50IDwtICJhaXItZHJ5IgoKIyBjb21iaW5lIHJld2V0IGRhdGEKcmV3ZXQudHMgPC0gcmJpbmQocmV3ZXQuY3RsLnRzLCByZXdldC5kcnkudHMpCnJld2V0LnRzJEV4cGVyaW1lbnQgPC0gInJld2V0IgoKIyBhZGQgc29pbCBkcnkgd3QgZGF0YQphcmNoaXZlLmFyYy50cyRkd19nIDwtIGphcmluZm8uYXJjW21hdGNoKGFyY2hpdmUuYXJjLnRzJFNhbXBsZU5hbWUsIGphcmluZm8uYXJjJFNhbXBsZSksICJTb2lsLmRyeS53ZWlnaHRfLmcuIl0KYXJjaGl2ZS5jdGwudHMkZHdfZyA8LSBhcmNoaXZlLmN0bC50cy53aWRlW21hdGNoKGFyY2hpdmUuY3RsLnRzJElELCBhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgImRyeV9zb2lsX3d0X2NvcnJlY3RlZF9nIl0KcmV3ZXQudHMgPC0gbWVyZ2UocmV3ZXQudHMsIGphcmluZm8ucmV3ZXRbICwgYygiSUQiLCAiVHJlYXRtZW50IiwgImR3X2ciKV0sIGJ5ID0gYygiSUQiLCAiVHJlYXRtZW50IikpCnRtZS50cnQudHMgPC0gbWVyZ2UodG1lLnRydC50cywgamFyaW5mby50bWVbICwgYygiTnIuIiwgImRyeS5zb2lsIildLCBieS54ID0gIlNhbXBsZU5hbWUiLCBieS55ID0gIk5yLiIpCmNvbG5hbWVzKHRtZS50cnQudHMpW3doaWNoKG5hbWVzKHRtZS50cnQudHMpID09ICJkcnkuc29pbCIpXSA8LSAiZHdfZyIKCiMgYWRkIGV4cGVyaW1lbnQgY29sIHRvIGFyY2hpdmUuYXJjLnRzLCBzdG9yYWdlLnRydC50cwphcmNoaXZlLmFyYy50cyRFeHBlcmltZW50IDwtICJhcmMiCnRtZS50cnQudHMkRXhwZXJpbWVudCA8LSAidG1lIgoKIyBjb21iaW5lIGFyY2hpdmUgZGF0YSBhbmQgRXhwbG9yYXRvcmllcyBzdG9yYWdlIGR1cmF0aW9uIGRhdGEKYXJjaGl2ZS50cyA8LSByYmluZChhcmNoaXZlLmN0bC50c1t3aGljaChhcmNoaXZlLmN0bC50cyRFeHBlcmltZW50ICE9ICJ0bWUiKSwgXSwgCiAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZS5hcmMudHNbICwgbmFtZXMoYXJjaGl2ZS5jdGwudHMpXSkKdG1lLnRzIDwtIHJiaW5kKGFyY2hpdmUuY3RsLnRzW3doaWNoKGFyY2hpdmUuY3RsLnRzJEV4cGVyaW1lbnQgPT0gInRtZSIpLCBdLAogICAgICAgICAgICAgICAgdG1lLnRydC50c1sgLCBuYW1lcyhhcmNoaXZlLmN0bC50cyldKQoKIyBiaW5kIHRtZS5jdGwuZmx4LnNyYSBkYXRhIHRvIHRtZS50cwojIGFsbCBvdGhlciB0bWUuZmx4IGRhdGEgaXMgYWxyZWFkeSBzdW1tYXJpemVkCnRtZS5jdGwuZmx4LnNyYSRFeHBlcmltZW50IDwtICJ0bWUiCnRtZS5jdGwuZmx4LnNyYSRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnRtZS5jdGwuZmx4LnNyYSRkd19nIDwtIHRtZS5jdGwuc29pbC5zcmFbbWF0Y2godG1lLmN0bC5mbHguc3JhJEphcl9JRCwgdG1lLmN0bC5zb2lsLnNyYSRKYXJfSUQpLCAiZHdfZyJdCnRtZS50cyA8LSByYmluZCh0bWUudHMsIHRtZS5jdGwuZmx4LnNyYVsgLCBuYW1lcyh0bWUudHMpXSkKCiMgVGVzdCB0aGF0IHJlcXVpcmVkIG5hbWVzIGFyZSBwcmVzZW50Cm5tcyA8LSBjKCJTYW1wbGVOYW1lIiwgIklEIiwgIkV4cGVyaW1lbnQiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIsICJ0aW1lcG9pbnRfY210diIsICAidGltZV9kIiwgInRpbWVfZF9jbXR2IiwgIm1nQ08yX2phciIsICJkd19nIikKaW52aXNpYmxlKGxhcHBseShsaXN0KGFyY2hpdmUudHMgPSBhcmNoaXZlLnRzLAogICAgICAgICAgICAgICAgICAgICAgcmV3ZXQudHMgPSByZXdldC50cywKICAgICAgICAgICAgICAgICAgICAgIHRtZS50cyksCiAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgIGlmZWxzZSghaXMubmEobWF0Y2gobm1zLCBuYW1lcyh4KSkpLCAieWVzIiwgIm5vIikKICAgICAgIH0KICAgICAgICkpCgojIGNvbWJpbmUgYWxsIGRhdGEgYW5kIHJlbW92ZSB0aW1lIHBvaW50cyB3aXRob3V0IENPMiBtZWFzdXJlbWVudHMKdHMgPC0gYmluZF9yb3dzKGFyY2hpdmUudHNbICwgbm1zXSwgcmV3ZXQudHNbICwgbm1zXSwgdG1lLnRzWyAsIG5tc10pCmlmKGxlbmd0aCh3aGljaChpcy5uYSh0cyRtZ0NPMl9qYXIpKSkgPiAwKSB7CiAgdHMgPC0gdHNbLXdoaWNoKGlzLm5hKHRzJG1nQ08yX2phcikpLCBdCn0KCiMgYWRkIEMgY29udGVudAojIHhwbHIKdHMkZ0NfZ1MgPC0geHBsci5jblttYXRjaCh0cyRJRCwgeHBsci5jbiRFUF9QbG90aWQpLCAiVG90YWxfQyJdKjEwXi0zCiMgZHVrZQp0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiZ0NfZ1MiXSA8LSB0bWUuY3RsLmR1a1ttYXRjaCh0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiSUQiXSwgdG1lLmN0bC5kdWskSUQpLCAiQ19nX2tnIl0qMTBeLTMKIyBzaWVycmFzCnRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJnQ19nUyJdIDwtIHRtZS5jdGwuc29pbC5zcmFbbWF0Y2godHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgIklEIl0sIHRtZS5jdGwuc29pbC5zcmEkSUQpLCAiZ0Nfa2dTIl0qMTBeLTMKIyBvYWsgcmlkZ2UKdHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgImdDX2dTIl0gPC0gdG1lLmN0bC5vcm5sW21hdGNoKHRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJJRCJdLCB0bWUuY3RsLm9ybmwkSUQpLCAiQ19nX2tnIl0qMTBeLTMKCiMgYWRkIFR5cGUKdHMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCB0cyRJRCksICJHIiwgIkYiKQoKIyBjYWxjdWxhdGUgQ08yIHJlc3BpcmF0aW9uIGluIG1nQ08yLUMgcGVyIGcgc29pbCBDCiMgTkI6IDEyLzQ0ID0gbWFzcyByYXRpbyBvZiBDIGluIENPMgp0cyRtZ0NPMi5DX2dDIDwtICh0cyRtZ0NPMl9qYXIqKDEyLzQ0KSkvKHRzJGR3X2cqdHMkZ0NfZ1MpCnRzJG1nQ08yLkNfZ0NfZCA8LSB0cyRtZ0NPMi5DX2dDL3RzJHRpbWVfZAoKIyBzdW1tYXJpemUgQ08yIHJlbGVhc2UgZGF0YSBmb3IgZWFjaCB0aW1lcG9pbnQsIGJ5IGV4cGVyaW1lbnQsIHRyZWF0bWVudCwgYW5kIHR5cGUKdHMuYXZnIDwtIGRhdGEuZnJhbWUobmEub21pdCh0cykgJT4lCiAgc2VsZWN0KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIG1nQ08yLkNfZ0NfZCwgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2KSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShzZV9zbG9wZSA9IG1nQ08yLkNfZ0NfZF9zZC9zcXJ0KG5fbWVhbiksCiAgICAgICAgIHNlX3Nsb3BlX2wgPSBtZ0NPMi5DX2dDX2RfbWVhbiAtIHNlX3Nsb3BlLAogICAgICAgICBzZV9zbG9wZV91ID0gbWdDTzIuQ19nQ19kX21lYW4gKyBzZV9zbG9wZSkpCgojIGFkZCB0aW1lcG9pbnQgemVybyBkYXRhCnRwMC5mIDwtIGZ1bmN0aW9uKGRmKSB7CiAgdHAwIDwtIGRmWzEsIF0KICB0cDBbICwgLXdoaWNoKG5hbWVzKHRwMCkgPT0gIkV4cGVyaW1lbnQiIHwgbmFtZXModHAwKSA9PSAiVHJlYXRtZW50IiB8IG5hbWVzKHRwMCkgPT0gIlR5cGUiIHwgbmFtZXModHAwKSA9PSAibiIpXSA8LSAwCiAgcmJpbmQodHAwLCBkZikKfQp0cy5hdmckdHJlYXQuRXhwIDwtIHBhc3RlKHRzLmF2ZyRUcmVhdG1lbnQsIHRzLmF2ZyRFeHBlcmltZW50KQp0cy5hdmcgPC0gbGFwcGx5KHNwbGl0KHRzLmF2ZywgdHMuYXZnJHRyZWF0LkV4cCksIGZ1bmN0aW9uKHgpIHsKICBsYXBwbHkoc3BsaXQoeCwgeCRUeXBlKSwgdHAwLmYpCiAgfSkKdHMuYXZnIDwtIGJpbmRfcm93cyhsYXBwbHkodHMuYXZnLCBiaW5kX3Jvd3MpKQoKIyByZXN0b3JlIGNsYXNzZXMKdHMuYXZnIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KHRzLmF2ZywgdHlwZS5jb252ZXJ0KSkKYGBgCgojIFJlc3VsdHMKIyMgUmVzcGlyYXRpb24gcmF0ZXMKCmBgYHtyIHJlc3AtcmF0ZS1zdGF0cywgaW5jbHVkZSA9IEZBTFNFfQojIHJld2V0IG1heCByZXNwIHJhdGVzCnQudGVzdCgKICB0YXBwbHkodHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kIl0sdHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkciLCAiU2FtcGxlTmFtZSJdLCBtYXgsIG5hLnJtID0gVFJVRSksCiAgdGFwcGx5KHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZCJdLHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJGIiwgIlNhbXBsZU5hbWUiXSwgbWF4LCBuYS5ybSA9IFRSVUUpKQpgYGAKCipFeHBlcmltZW50IDEgKGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCkqCgpSZXNwaXJhdGlvbiByYXRlcyBpbmNyZWFzZWQgZHJhbWF0aWNhbGx5IGZvbGxvd2luZyByZXdldHRpbmcgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgaW4gY29tcGFyaXNvbiB0byBjb250cm9sIHNhbXBsZXMsIHNpbWlsYXIgdG8gd2hhdCBoYXMgYmVlbiBvYnNlcnZlZCBpbiBvdGhlciBhaXItZHJ5L3Jld2V0dGluZyBzdHVkaWVzIFtjaXRlXS4gSG93ZXZlciwgdGhlIG1hZ25pdHVkZSBhbmQgdGltaW5nIG9mIHRoZSBwZWFrIGluIHJlc3BpcmF0aW9uIHJhdGVzIHdhcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBiZXR3ZWVuIGdyYXNzbGFuZCBhbmQgZm9yZXN0IHNpdGVzIFtzdGF0aXN0aWNzOyBvdGhlciBmb3Jlc3QvZ3Jhc3NsYW5kIHN0dWRpZXMgZm9yIGNvbXBhcmlzb24/XSAqKihGaWcuIDMpKiouCgpBbW9uZyB0aGUgYWlyLWRyeSArIHN0b3JhZ2Ugc2FtcGxlcywgcmVzcGlyYXRpb24gcmF0ZXMgd2VyZSBtb3JlIHRoYW4gdHdpY2UgYXMgaGlnaCBpbiBncmFzc2xhbmQgc29pbHMgdGhhbiBpbiBmb3Jlc3Qgc29pbHMsIHJlYWNoaW5nIGEgbWF4aW11bSBvZiBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCwgZm9sbG93ZWQgYnkgYSBzaGFycCBkZWNsaW5lLiBNZWFuIHJlc3BpcmF0aW9uIHJhdGVzIGluIGZvcmVzdCBzaXRlcyBwZWFrZWQgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGgsIGZvbGxvd2VkIGJ5IGEgbXVjaCBtb3JlIGdyYWR1YWwgZGVjbGluZSB0aGFuIGluIGdyYXNzbGFuZCBzaXRlcy4gQ29udHJvbCBzYW1wbGVzIHJlc3BvbmRlZCBtb3JlIHdlYWtseSBhbmQgbW9yZSBncmFkdWFsbHkgdG8gcmV3ZXR0aW5nLCBhbHRob3VnaCBhcyBpbiB0aGUgdHJlYXRtZW50IHNhbXBsZXMgcmVzcGlyYXRpb24gd2FzIGdyZWF0ZXIgaW4gZ3Jhc3NsYW5kIHNvaWxzIHRoYW4gaW4gZm9yZXN0IHNvaWxzLiBQZWFrIHJlc3BpcmF0aW9uIHJhdGVzIGZvciBjb250cm9sIGluY3ViYXRpb25zIHdlcmUgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIGFuZCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGggZm9yIGdyYXNzbGFuZCBhbmQgZm9yZXN0IHNvaWxzLCByZXNwZWN0aXZlbHkuCgoqRXhwZXJpbWVudCAyIChhaXItZHJ5IHRyZWF0bWVudCwgMjAxOSBzYW1wbGVzKSoKClJlc3BpcmF0aW9uIHJhdGVzIGZvciB0aGUgYWlyLWRyeSBvbmx5IHRyZWF0bWVudCBzYW1wbGVzIHNob3dlZCBhIHNpbWlsYXJseSBkcmFtYXRpYyBpbmNyZWFzZSBpbiBjb21wYXJpc29uIHRvIHRoZSBjb250cm9scyBhcyB3YXMgb2JzZXJ2ZWQgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgc2FtcGxlcyBpbiBFeHBlcmltZW50IDEuIEhvd2V2ZXIsIHVubGlrZSB0aGUgYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50LCBwZWFrIHJlc3BpcmF0aW9uIHJhdGVzIHdlcmUgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IChwID4gMC4wNSkgYmV0d2VlbiBmb3Jlc3QgYW5kIGdyYXNzbGFuZCBzb2lscyBpbiBFeHBlcmltZW50IDIsIHBlYWtpbmcgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAuMCBhbmQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCBmb3IgZ3Jhc3NsYW5kIGFuZCBmb3Jlc3Qgc29pbHMsIHJlc3BlY3RpdmVseSAqKihGaWcuIDMpKiouCgpgYGB7ciBDTzItcmVzcC1yYXRlc30KIyBwbG90dGVkIGFzIG1lYXN1cmVkCnRzLmF2ZyAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh0aW1lX2RfY210dl9tZWFuLCBtZ0NPMi5DX2dDX2RfbWVhbikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA0LCBjb2xvcj0iZ3JheSIpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHNlX3Nsb3BlX2wsIHltYXggPSBzZV9zbG9wZV91LCBmaWxsID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQsIGFscGhhID0gVHJlYXRtZW50KSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gVHlwZSwgc2hhcGUgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoRXhwZXJpbWVudCksCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKEV4cGVyaW1lbnQgPSBjKCJhcmMiID0gIjIwMTEiLCAicmV3ZXQiID0gIjIwMTkiKSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE4KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmR1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gJ1N0ZC4gRXJyLicsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9hbHBoYV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAuMikpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAnZGFzaGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSdzb2xpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gImRhc2hlZCIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAxKSkgKwogIHlsYWIoZXhwcmVzc2lvbignUmVzcGlyYXRpb24gUmF0ZSAobWdDTydbMl0qJy1DIGdDJ14tMSonZCdeLTEqJyknKSkgKwogIHhsYWIoIlRpbWUgKGRheXMpIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnLiBgciB7KGZpZy5uICsgMSl9YC4gUmVzcGlyYXRpb24gcmF0ZXMgZm9yIEV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSBhbmQgRXhwZXJpbWVudCAyIChhaXItZHJ5IG9ubHkgdHJlYXRtZW50KSoqCgo+KkNhcHRpb246KiBUb3AgcGFuZWwgc2hvd3MgZGF0YSBmcm9tIEV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSwgYm90dG9tIHBhbmVsIHNob3dzIGRhdGEgZnJvbSBFeHBlcmltZW50IDIgKGFpci1kcnkgb25seSB0cmVhdG1lbnQpLiBWZXJ0aWNhbCBncmF5IGxpbmUgZGVtYXJjYXRlcyB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGZyb20gdGhlIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZC4gUG9pbnRzIHNob3cgbWVhc3VyZW1lbnRzIGFuZCBsaW5lcyBzaG93IHRyZW5kcyBpbiBtZWFuIHJlc3BpcmF0aW9uIHJhdGVzLiBTaGFkZWQgcmliYm9ucyByZXByZXNlbnQgdGhlIHN0YW5kYXJkIGVycm9yLiBUaGUgZmluYWwgbWVhc3VyZW1lbnQgcG9pbnRzIGZvciBhIGZldyBzYW1wbGVzIHdoaWNoIHRvb2sgPjE4IGRheXMgdG8gcmVhY2ggQ09+Mn4gdGFyZ2V0cyBhcmUgZXhjbHVkZWQgZm9yIGRpc3BsYXkgcmVhc29ucy4gUmVzcGlyYXRpb24gcmF0ZXMgZm9yIHRob3NlIHNhbXBsZXMgcmVtYWluZWQgZmxhdC4gTm90ZSB0aGF0IENPfjJ+IGNvbmNlbnRyYXRpb25zIGZvciBjb250cm9sIHNhbXBsZSBpbmN1YmF0aW9ucyBpbiBFeHBlcmltZW50IDEgd2VyZSBvbmx5IG1lYXN1cmVkIG9uY2UgZHVyaW5nIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QsIHNvIHJhdGVzIGFyZSBzaG93biBhcyB0aGUgY3VtdWxhdGl2ZSBhdmVyYWdlLiBGb3IgcHVycG9zZXMgb2YgY29tcGFyaXNvbiwgU3VwcGxlbWVudGFsIEZpZ3VyZSAxIHNob3dzIGFsbCBkYXRhIHBsb3R0ZWQgd2l0aCBwcmUtaW5jdWJhdGlvbiByZXNwaXJhdGlvbiByYXRlcyBjYWxjdWxhdGVkIGFzIGEgY3VtdWxhdGl2ZSBhdmVyYWdlLgoKKlN1cHBsZW1lbnRhbCByZXNwaXJhdGlvbiByYXRlcyBmaWd1cmU6KgoKYGBge3IgQ08yLWZsdXgtcGxvdHMtU0l9CiMgTm90ZTogdGhpcyBjb2RlIHBsb3RzIGRhdGEgd2l0aCBwcmUtaW5jdWJhdGlvbiBvYnNlcnZhdGlvbnMgYXZlcmFnZWQKIyBQbG90IHJlc3AgcmF0ZXMgb3ZlciB0aW1lCnRzLnByZSA8LSB0c1t0cyRQZXJpb2QgPT0gInByZSIsIF0KdHMucHJlLmF2ZyA8LSB0cy5wcmUgJT4lCiAgZmlsdGVyKHRpbWVfZF9jbXR2ID4gMy41KSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgU2FtcGxlTmFtZSwgbWdDTzIuQ19nQywgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2LCBTYW1wbGVOYW1lKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4pLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShtZ0NPMi5DX2dDX2QgPSBtZ0NPMi5DX2dDX21lYW4vdGltZV9kX2NtdHZfbWVhbikgJT4lCiAgc2VsZWN0KC1TYW1wbGVOYW1lLCAtbWdDTzIuQ19nQ19tZWFuLCBFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIG1nQ08yLkNfZ0NfZCwgdGltZV9kX2NtdHZfbWVhbikgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlKSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShzZV9zbG9wZSA9IG1nQ08yLkNfZ0NfZF9zZC9zcXJ0KG5fbWVhbiksCiAgICAgICAgIHNlX3Nsb3BlX2wgPSBtZ0NPMi5DX2dDX2RfbWVhbiAtIHNlX3Nsb3BlLAogICAgICAgICBzZV9zbG9wZV91ID0gbWdDTzIuQ19nQ19kX21lYW4gKyBzZV9zbG9wZSkKCnRzLmluYy5hdmcgPC0gdHMgJT4lCiAgZmlsdGVyKFBlcmlvZCA9PSAiaW5jIikgJT4lCiAgc2VsZWN0KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIG1nQ08yLkNfZ0NfZCwgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2KSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShzZV9zbG9wZSA9IG1nQ08yLkNfZ0NfZF9zZC9zcXJ0KG5fbWVhbiksCiAgICAgICAgIHNlX3Nsb3BlX2wgPSBtZ0NPMi5DX2dDX2RfbWVhbiAtIHNlX3Nsb3BlLAogICAgICAgICBzZV9zbG9wZV91ID0gbWdDTzIuQ19nQ19kX21lYW4gKyBzZV9zbG9wZSkKCmNvbG5hbWVzKHRzLnByZS5hdmcpW3doaWNoKG5hbWVzKHRzLnByZS5hdmcpICVpbiUgYygidGltZXBvaW50X2NtdHZfbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X21lYW5fbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X21lYW5fc2QiKSldIDwtIGMoInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lX2RfY210dl9tZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lX2RfY210dl9zZCIpCgp0cy5wcmUuYXZnIDwtIHRzLnByZS5hdmdbICwgLXdoaWNoKCFuYW1lcyh0cy5wcmUuYXZnKSAlaW4lIG5hbWVzKHRzLmluYy5hdmcpKV0KCnRzLmF2ZzIgPC0gZGF0YS5mcmFtZShyYmluZCh0cy5wcmUuYXZnLCB0cy5pbmMuYXZnKSkKdHMuYXZnMiA8LSB0cy5hdmcyW2NvbXBsZXRlLmNhc2VzKHRzLmF2ZzIpLCBdCgojIGFkZCB0aW1lcG9pbnQgemVybyBkYXRhCnRzLmF2ZzIkdHJlYXQuRXhwIDwtIHBhc3RlKHRzLmF2ZzIkVHJlYXRtZW50LCB0cy5hdmcyJEV4cGVyaW1lbnQpCnRzLmF2ZzIgPC0gbGFwcGx5KHNwbGl0KHRzLmF2ZzIsIHRzLmF2ZzIkdHJlYXQuRXhwKSwgZnVuY3Rpb24oeCkgewogIGxhcHBseShzcGxpdCh4LCB4JFR5cGUpLCB0cDAuZikKICB9KQp0cy5hdmcyIDwtIGJpbmRfcm93cyhsYXBwbHkodHMuYXZnMiwgYmluZF9yb3dzKSkKCiMgcmVzdG9yZSBjbGFzc2VzCnRzLmF2ZzIgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkodHMuYXZnMiwgdHlwZS5jb252ZXJ0KSkKCiMgcGxvdAp0cy5hdmcyICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHRpbWVfZF9jbXR2X21lYW4sIG1nQ08yLkNfZ0NfZF9tZWFuKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQsIGNvbG9yPSJncmF5IikgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gc2Vfc2xvcGVfbCwgeW1heCA9IHNlX3Nsb3BlX3UsIGZpbGwgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCwgYWxwaGEgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoRXhwZXJpbWVudCA9IGMoImFyYyIgPSAiMjAxMSIsICJyZXdldCIgPSAiMjAxOSIpKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RkLiBFcnIuJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IC4yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9ICdkYXNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9J3NvbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiZGFzaGVkIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEpKSArCiAgeWxhYihleHByZXNzaW9uKCdSZXNwaXJhdGlvbiBSYXRlIChtZ0NPJ1syXSonLUMgZ0MnXi0xKidkJ14tMSonKScpKSArCiAgeGxhYigiVGltZSAoZGF5cykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgo+KipTdXBwbGVtZW50YWwgRmlnIGByIHsoc2ZpZy5uIDwtIDEpfWAuIFJlc3BpcmF0aW9uIHJhdGVzIGZvciBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMiBzaG93biB3aXRoIGFsbCBwcmUtaW5jdWJhdGlvbiBkYXRhIGNhbGN1bGF0ZWQgYXMgY3VtdWxhdGl2ZSBhdmVyYWdlcyoqCgo+KkNhcHRpb246KiBDT34yfiBjb25jZW50cmF0aW9ucyBmb3IgRXhwZXJpbWVudCAxIGNvbnRyb2wgc2FtcGxlcyB3ZXJlIG9ubHkgbWVhc3VyZWQgb25jZSBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCwgaW4gY29udHJhc3QgdG8gZGFpbHkgbWVhc3VyZW1lbnRzIGZvciBhbGwgb3RoZXIgc2FtcGxlcy4gUHJlLWluY3ViYXRpb24gcmVzcGlyYXRpb24gcmF0ZXMgYXJlIHNob3duIGhlcmUgY2FsY3VsYXRlZCBhcyBjdW11bGF0aXZlIGF2ZXJhZ2VzIGZvciB0aGUgcHVycG9zZSBvZiBmYWlyIGNvbXBhcmlzb24gYWNyb3NzIGFsbCB0cmVhdG1lbnRzLgoKCiMjIFJhZGlvY2FyYm9uIGRhdGEKCmBgYHtyIGxvYWQgYW1zLWplbmEtaW5nZXN0IGZ4fQojIDEuIFJlYWQgaW4gaXNvdG9wZSBkYXRhIGZyb20gdmFyaW91cyBzb3VyY2VzCiMgRmlyc3QgbG9hZCBoZWxwZXIgZnVuY3Rpb24gJ3JlYWRfamVuYV9hbXNfcmVzdWx0cy5SIgpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfYW1zX2luZ2VzdC5SIikKYGBgCgpgYGB7ciByZWFkIGlzbyBkYXRhfQojIDIuIE5leHQgcmVhZCBpbiBkYXRhIGZyb20gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzIGluICdkYXRhL3JhdycKIyBpZGVudGlmeSBzdWJkaXJlY3RvcmllcyBpbiAncmF3JyBkaXJlY3Rvcnkgd2l0aCAiYW1zX2plbmEiIGluIG5hbWUKYW1zX2plbmFfcmVzdWx0c19kaXJzIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpCmFtc19yZXN1bHRzX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoYW1zX2plbmFfcmVzdWx0c19kaXJzKSwgZnVuY3Rpb24oaSkgewogIHJlYWRfamVuYV9hbXNfcmVzdWx0cyhhbXNfamVuYV9yZXN1bHRzX2RpcnNbaV0pCn0pCm5hbWVzKGFtc19yZXN1bHRzX2xzKSA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiYW1zX2plbmFfcmVzdWx0cyIpCmBgYAoKYGBge3IgYXJjIGFuZCByZXdldCBleHBlcmltZW50IHRlbXBsYXRlfQojIDMuIENyZWF0ZSBhICJ0aWR5IiBzdHlsZSB0ZW1wbGF0ZSBmb3IgdGhlIGRhdGEsIGkuZS4gdmFyaWFibGVzIGluIGNvbHVtbnMuIAojIEtleSB2YXJpYWJsZXMgYXJlIGFzIGZvbGxvd3M6CiMgICAqIFNhbXBsZU5hbWUgKGluY29ycG9yYXRlcyBsYWIgcmVwIGFuZCB0cmVhdG1lbnQsIGUuZy4gIkhFRzEwLTFfZHJ5IikKIyAgICogSUQgKHBsb3QgSURzLCBlLmcuIGZvciAiSEVHMTAiIGZvciBFeHBsb3JhdG9yeSBzYW1wbGVzKQojICAgKiBUcmVhdG1lbnQgKDMgdHJlYXRtZW50czogYWlyLWRyeSwgYWlyLWRyeSArIHN0b3JhZ2UsIHN0b3JhZ2UgZHVyYXRpb247ICsgY29udHJvbHMpCiMgICAqIFR5cGUgKDIgbGV2ZWxzOiBGID0gZm9yZXN0LCBHID0gZ3Jhc3NsYW5kKQojICAgKiBQZXJpb2QgKGluY3ViYXRpb24gcGVyaW9kLCAyIGxldmVsczogcHJlID0gcHJlaW5jdWJhdGlvbiwgaW5jID0gZXF1aWxpYnJpdW0gaW5jdWJhdGlvbikKIyAgICogRXhwZXJpbWVudCAoMyBsZXZlbHM6IGFyYyA9IGFpci1kcnkgKyBzdG9yYWdlLCByZXdldCA9IGFpci1kcnkvcmV3ZXQsIHRpbWUgPSBzdG9yYWdlIGR1cmF0aW9uKQojIAojICogT2JzZXJ2YXRpb25hbCBjb2x1bW5zIGluY2x1ZGU6CiMgICAqIGQxNGMgKCRcRGVsdGEkXjE0XkMtQ09+Mn4pCiMgICAqIGQxM2MgKCRcZGVsdGEkXjEzXkMtQ09+Mn4pCiMgICAqIENfZ19rZyAoQyBjb250ZW50KQojICAgKiBkd19nIChkcnkgd2VpZ2h0KQojICAgKiBtZ0NPMi5DX2dTIChtZyBDT34yfi1DIHJlc3BpcmVkIGdeLTFeIHNvaWwgUGVyaW9kXi0xXikKIyAgICogdGltZV9kIChkYXlzIGluIGluY3ViYXRpb24gcGVyaW9kIHByaW9yIHRvIG1lYXN1cmVtZW50KQojICAgKiBkSDJPX2dyYXYgKHBlcmNlbnQgY2hhbmdlIGluIGdyYXZpbWV0cmljIHdhdGVyIGNvbnRlbnQgZHVlIHRvIGxhYm9yYXRvcnkgbW9pc3R1cmUgYWRqdXN0bWVudCkKIyAgICogZEgyT193aGMgKHBlcmNlbnQgY2hhbmdlIGluIHdhdGVyIGhvbGRpbmcgY2FwYWNpdHkgZHVlIHRvIGxhYm9yYXRvcnkgbW9pc3R1cmUgYWRqdXN0bWVudCkKICAKdW5pcXVlLmlkLm4gPC0gYyhsZW5ndGgodW5pcXVlKGFyY2hpdmUudHNbYXJjaGl2ZS50cyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiU2FtcGxlTmFtZSJdKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIsICJTYW1wbGVOYW1lIl0pKSwKICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHJld2V0LmN0bC50cyRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShyZXdldC5kcnkudHMkU2FtcGxlTmFtZSkpKQpwcmUuMTRjIDwtIGRhdGEuZnJhbWUoU2FtcGxlTmFtZSA9IGMoYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgIlNhbXBsZU5hbWUiXSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIsICJTYW1wbGVOYW1lIl0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUocmV3ZXQuY3RsLnRzJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUocmV3ZXQuZHJ5LnRzJFNhbXBsZU5hbWUpKSkpCnByZS4xNGMkSUQgPC0gc3Vic3RyKHByZS4xNGMkU2FtcGxlTmFtZSwgMSwgNSkKcHJlLjE0YyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHByZS4xNGMkSUQpLCAiRyIsICJGIikKcHJlLjE0YyRFeHBlcmltZW50IDwtIGMocmVwKCJhcmMiLCB1bmlxdWUuaWQublsxXSArIHVuaXF1ZS5pZC5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICByZXAoInJld2V0IiwgdW5pcXVlLmlkLm5bM10gKyB1bmlxdWUuaWQubls0XSkpCnByZS4xNGMkVHJlYXRtZW50IDwtIGMocmVwKCJjb250cm9sIiwgdW5pcXVlLmlkLm5bMV0pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYWlyLWRyeSArIHN0b3JhZ2UiLCB1bmlxdWUuaWQublsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJjb250cm9sIiwgdW5pcXVlLmlkLm5bM10pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYWlyLWRyeSIsIHVuaXF1ZS5pZC5uWzRdKSkKcHJlLjE0YyRQZXJpb2QgPC0gInByZSIKCiMgY3JlYXRlIGluYyBwZXJpb2QgZGYgYXMgZHVwbGljYXRlIG9mIHByZS1pbmMgZGYsIGJ1dCB0ZXN0IHRoYXQgaXQgaXMgdGhlIHJpZ2h0IHNoYXBlIGZpcnN0CmlmKG5yb3cocHJlLjE0YykgPT0gc3VtKHVuaXF1ZS5pZC5uKSAmIG5jb2wocHJlLjE0YykgPT0gNikgewogIGluYy4xNGMgPC0gcHJlLjE0YwogIGluYy4xNGMkUGVyaW9kIDwtICJpbmMiCn0gZWxzZSB7CiAgInByZS4xNGMgZGF0YSBmcmFtZSBtYWxmb3JtZWQiCn0KYWxsLjE0Yy50ZW1wbGF0ZSA8LSByYmluZChwcmUuMTRjLCBpbmMuMTRjKQpgYGAKCmBgYHtyIHRtZSBleHBlcmltZW50IHRlbXBsYXRlfQp1bmlxdWUuaWQudG1lLm4gPC0gYyhsZW5ndGgodW5pcXVlKHRtZS5jdGwuZHVrJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZSh0bWUuY3RsLm9ybmwkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS5jdGwuZmx4LnNyYSRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUodG1lLm1pc2MkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKGFyY2hpdmUuY3RsLnRzLndpZGVbYXJjaGl2ZS5jdGwudHMud2lkZSRFeHBlcmltZW50ID09ICJ0bWUiLCAiSUQiXSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpKQpwcmUudG1lLmN0bCA8LSBkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSBjKGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5kdWskU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5vcm5sJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHRtZS5jdGwuZmx4LnNyYSRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZSh0bWUubWlzYyRTYW1wbGVOYW1lKSksICAgYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlW2FyY2hpdmUuY3RsLnRzLndpZGUkRXhwZXJpbWVudCA9PSAidG1lIiwgIklEIl0pKSkpCnByZS50bWUuY3RsJFNpdGUgPC0gYyhyZXAoIkR1a2UiLCB1bmlxdWUuaWQudG1lLm5bMV0pLAogICAgICAgICAgICAgICAgICAgICAgcmVwKCJPUk5MIiwgdW5pcXVlLmlkLnRtZS5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgiU2llcnJhIiwgdW5pcXVlLmlkLnRtZS5uWzNdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgibWlzYyIsIHVuaXF1ZS5pZC50bWUubls0XSksCiAgICAgICAgICAgICAgICAgICAgICByZXAoIlhwbHIiLCB1bmlxdWUuaWQudG1lLm5bNV0pKQoKCiMgRHVrZSwgT1JOTCwgbWlzYywgYW5kIFhwbHIgSURzCnByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIkR1a2UiIHwgCiAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiIHwKICAgICAgICAgICAgcHJlLnRtZS5jdGwkU2l0ZSA9PSAibWlzYyIgfAogICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJYcGxyIiwgIklEIl0gPC0gYXMuY2hhcmFjdGVyKHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIkR1a2UiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIm1pc2MiIHwKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJYcGxyIiwgIlNhbXBsZU5hbWUiXSkKCiMgU2llcnJhIElEcwpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSA8LQogIHN1YnN0cihwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiU2FtcGxlTmFtZSJdLCAxMCwgMTEpCgojIHN1YmRpdmlkZSBPUk5MIGludG8gV0IgYW5kIFRWQQpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJPUk5MIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIlRWQSIsIHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiLCAiSUQiXSksICJUZW5uZXNzZWUgVmFsbGV5IiwgIldhbGtlciBCcmFuY2giKQoKIyBzdWJkaXZpZGUgU2llcnJhIGludG8gTXVzaWNrIGFuZCBTaGF2ZXIKcHJlLnRtZS5jdGxbcHJlLnRtZS5jdGwkU2l0ZSA9PSAiU2llcnJhIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIk0iLCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSksICJNdXNpY2siLCAiU2hhdmVyIikKCiMgYWRkIHRyZWF0bWVudCBjb2wKcHJlLnRtZS5jdGwkVHJlYXRtZW50IDwtICJjb250cm9sIgoKcHJlLnRtZS50cnQgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gdW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpCnByZS50bWUudHJ0JElEIDwtIHN1YnN0cihwcmUudG1lLnRydCRTYW1wbGVOYW1lLCAxLCBuY2hhcihhcy5jaGFyYWN0ZXIocHJlLnRtZS50cnQkU2FtcGxlTmFtZSkpLTIpCnByZS50bWUudHJ0IDwtIHJiaW5kKHByZS50bWUudHJ0LCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJtaXNjIiwgYygiSUQiLCAiU2FtcGxlTmFtZSIpXSkKcHJlLnRtZS50cnQkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgpwcmUudG1lLnRydCRTaXRlIDwtIHByZS50bWUuY3RsW21hdGNoKHByZS50bWUudHJ0JElELCBwcmUudG1lLmN0bCRJRCksICJTaXRlIl0KCnByZS50bWUuMTRjIDwtIHJiaW5kKHByZS50bWUuY3RsLCBwcmUudG1lLnRydCkKcHJlLnRtZS4xNGMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBwcmUudG1lLjE0YyRTYW1wbGVOYW1lKSwgIkciLCAiRiIpCnByZS50bWUuMTRjJFBlcmlvZCA8LSAicHJlIgpwcmUudG1lLjE0YyRFeHBlcmltZW50IDwtICJ0bWUiCgojIGNyZWF0ZSBpbmMgcGVyaW9kIGRmCmluYy50bWUuMTRjIDwtIHByZS50bWUuMTRjCmluYy50bWUuMTRjJFBlcmlvZCA8LSAiaW5jIgp0bWUuMTRjLnRlbXBsYXRlIDwtIHJiaW5kKHByZS50bWUuMTRjLCBpbmMudG1lLjE0YykKYGBgCgpgYGB7ciBjb21iaW5lIHNvaWwgb2JzIGRhdGF9CiMgNC4gU3VtbWFyaXplIG9ic2VydmF0aW9uYWwgZGF0YSBmcm9tIHRpbWVzZXJpZXMgZGF0YSBieSB1bmlxdWUgSURzIChTYW1wbGVOYW1lKQojIHN1bW1hcml6ZSB0aW1lIGFuZCBjbzIgZGF0YSBieSBleHBlcmltZW50LCBwZXJpb2QsIHRyZWF0bWVudCwgYW5kIHNhbXBsZSBuYW1lCnRzLmVwc24uYXZnIDwtIHRzICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBJRCwgUGVyaW9kLCBUcmVhdG1lbnQsIFNhbXBsZU5hbWUsIGdDX2dTLCBkd19nLCBtZ0NPMi5DX2dDLCB0aW1lX2QsIHRpbWVfZF9jbXR2KSAgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgSUQsIFBlcmlvZCwgVHJlYXRtZW50LCBTYW1wbGVOYW1lKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWF4ID0gbWF4KSwgbmEucm0gPSBUUlVFKQp0cy5lcHNuLmF2ZyA8LSByZW5hbWVfYXQodHMuZXBzbi5hdmcsIHZhcnMoY29udGFpbnMoJ21heCcpKSwgbGlzdCh+c3ViKCJfbWF4IiwgIiIsIC4pKSkKYGBgCgpgYGB7ciBjbGVhbiB1cCAxNEMgZGF0YX0KIyA2LiBDbGVhbiB1cCBeMTReQyBkYXRhIGFuZCBhZGQgZXh0ZXJuYWwgZGF0YSBwb2ludHMgKHRtZSBleHBlcmltZW50LCBYcGxyIGNvbnRyb2wgc2FtcGxlcykKIyBOZWVkIHRvIGFkZCBTYW1wbGVOYW1lIGNvbCBhbmQgdmFyaWFibGUgY29sdW1ucyBUcmVhdG1lbnQsIFBlcmlvZCwgYW5kIEV4cGVyaW1lbnQgdG8gYWxsIGRhdGEgZnJhbWVzIGluIGFtc19yZXN1bHRzX2xzIAoKIyBGaXJzdCBhZGQgMTRDIGFuZCAxM0MgZGF0YSBmcm9tIEV4cGxvcmF0b3JpZXMgY29udHJvbCBzYW1wbGVzIHRvIGFtc19yZXN1bHRzX2xzCiMgbm90ZSB0aGF0IG5laXRoZXIgMTNDIG5vciAxNEMgd2FzIG1lYXN1cmVkIGZvciB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGZvciB0aGVzZSBzYW1wbGVzCiMgZ2V0IG5hbWVzIGZvciBhbXNfcmVzdWx0cyBkYXRhIGZyYW1lcwpyZXN1bHRzLjE0Yy5ubXMgPC0gbmFtZXMoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgKQojIGdldCBuYW1lcyBmb3IgcmVsZXZhbnQgRXhwZXJpbWVudC9UcmVhdG1lbnQvUGVyaW9kIGNvbWJpbmF0aW9uCmFyY19jdGxfaW5jX1NOIDwtIGFzLmNoYXJhY3RlcihhbGwuMTRjLnRlbXBsYXRlW2FsbC4xNGMudGVtcGxhdGUkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFsbC4xNGMudGVtcGxhdGUkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGFsbC4xNGMudGVtcGxhdGUkUGVyaW9kID09ICJpbmMiLCAiU2FtcGxlTmFtZSJdKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHVubGlzdChsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24oeCkgdW5saXN0KGxhcHBseSh4LCAiW1siLCAiUHJvYmUiKSkpKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHRtZV9jdGxfaW5jX3hwbHJfU05bZ3JlcCgiSEUiLCB0bWVfY3RsX2luY194cGxyX1NOKV0KaWYobGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pID09IDE0KSB7CiAgdG1lX2N0bF9pbmNfeHBscl9TTiA8LSB1bmlxdWUoc3Vic3RyKHRtZV9jdGxfaW5jX3hwbHJfU04sIDEsIG5jaGFyKHRtZV9jdGxfaW5jX3hwbHJfU04pLTIpKQp9CgojIGFkZCBzdWJsaXN0IGZvciBFeHBsb3JhdG9yaWVzIDIwMTEgKGNvbnRyb2wpIGRhdGEgYW5kIGRhdGEgZnJhbWVzIGZvciBhYm92ZSBzdWJzZXRzCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IGxlbmd0aChhcmNfY3RsX2luY19TTiksIG5jb2wgPSBsZW5ndGgocmVzdWx0cy4xNGMubm1zKSkpCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsciA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gbGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pLCBuY29sID0gbGVuZ3RoKHJlc3VsdHMuMTRjLm5tcykpKQoKIyBhZGQgbmFtZXMgYW5kIGZpbGwgU2FtcGxlTmFtZXMgZm9yIG5ldyBkYXRhIGZyYW1lcwphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExIDwtIGxhcHBseShhbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExLCBmdW5jdGlvbih4KSB7CiAgbmFtZXMoeCkgPC0gcmVzdWx0cy4xNGMubm1zCiAgcmV0dXJuKHgpCiAgfSkgCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmNbICwgYygiU2FtcGxlTmFtZSIsIlByb2JlIildIDwtIGFyY19jdGxfaW5jX1NOCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsclsgLCBjKCJTYW1wbGVOYW1lIiwiUHJvYmUiKV0gPC0gdG1lX2N0bF9pbmNfeHBscl9TTgoKIyBmaWxsIDE0QyBkYXRhCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEgPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkYOKIhjE0Qy4o4oCwKWAgPC0geHBsci5jdGwuaXNvW21hdGNoKGRmJFByb2JlLCB4cGxyLmN0bC5pc28kRVBfUGxvdGlkKSwgIjE0Y19DTzIiXQogIGRmJFRyZWF0bWVudCA8LSAiY29udHJvbCIKICBkZiRQZXJpb2QgPC0gImluYyIKICByZXR1cm4oZGYpCn0pCgojIGFkZCBFeHBlcmltZW50CmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMkRXhwZXJpbWVudCA8LSAiYXJjIgphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJHRtZV9jdGxfaW5jX3hwbHIkRXhwZXJpbWVudCA8LSAidG1lIgoKCiMgYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTgtMTAtMTJgIGFuZCBgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOC0xMS0wOWAKIyBgQmVlbS1NaWxsZXJfNC54bHN4YCwgYEJlZW0tTWlsbGVyXzUueGxzeGA7IGBCZWVtLU1pbGxlcl82Lnhsc3hgLCBgQmVlbS1NaWxsZXJfNy54bHN4YAojIEFkZCB0cmVhdG1lbnQsIGV4cGVyaW1lbnQsIHBlcmlvZCBjb2xzCiMgRXhwZXJpbWVudCA9IHRtZQojIFRyZWF0bWVudCA9IHN0b3JhZ2UgZHVyYXRpb24KIyBQZXJpb2QgPSBpbmMKYW1zX3Jlc3VsdHNfbHNbMToyXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24obHMpIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICBkZiRFeHBlcmltZW50IDwtICJ0bWUiCiAgZGYkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgogIGRmJFBlcmlvZCA8LSAiaW5jIgogIHJldHVybihkZikKICB9KQopCgojIGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YAojIGBCZWVtLU1pbGxlcl85Lnhsc3hgCiMgRXhwZXJpbWVudCA9IGFyYwojIFRyZWF0bWVudCA9IGFpci1kcnkgKyBzdG9yYWdlCiMgUGVyaW9kID0gcHJlCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRTYW1wbGVOYW1lIDwtIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRQcm9iZQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJFBlcmlvZCA8LSAicHJlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkRXhwZXJpbWVudCA8LSAiYXJjIgoKIyBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkCiMgQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IGluYwphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRQcm9iZSwgMSwgOSkKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkUGVyaW9kIDwtICJpbmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JEV4cGVyaW1lbnQgPC0gImFyYyIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgCiMgYFJvc3RfMzEtMi54bHN4YAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IGluYywgcHJlIChTRVcxMS0yLTIpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFByb2JlLCAxLCA5KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRFeHBlcmltZW50IDwtICJhcmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgWzI6OSwgIlBlcmlvZCJdIDwtICJpbmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgWzEwLCAiUGVyaW9kIl0gPC0gInByZSIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgCiMgUm9zdF80Ny54bHN4IAojIEV4cGVyaW1lbnQgPSByZXdldAojIFRyZWF0bWVudCA9IGNvbnRyb2wKIyBQZXJpb2QgPSBwcmUKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFByb2JlLCAxLCA3KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFRyZWF0bWVudCA8LSAiY29udHJvbCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRFeHBlcmltZW50IDwtICJyZXdldCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRQZXJpb2QgPC0gInByZSIKIyBSb3N0XzUwLnhsc3gKIyBFeHBlcmltZW50ID0gcmV3ZXQKIyBUcmVhdG1lbnQgPSBjb250cm9sCiMgUGVyaW9kID0gaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRQcm9iZSwgMSwgNykKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkRXhwZXJpbWVudCA8LSAicmV3ZXQiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkUGVyaW9kIDwtICJpbmMiCiMgUm9zdF81Mi54bHN4CiMgRXhwZXJpbWVudCA9IHJld2V0CiMgVHJlYXRtZW50ID0gYWlyLWRyeQojIFBlcmlvZCA9IHByZSwgaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRQcm9iZSwgMSwgMTEpCnByZS5peCA8LSB3aGljaChncmVwbCgiUFJFIiwgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRQcm9iZSkpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkVHJlYXRtZW50IDwtICJhaXItZHJ5IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JEV4cGVyaW1lbnQgPC0gInJld2V0IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4W3ByZS5peCwgIlBlcmlvZCJdIDwtICJwcmUiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3hbLXByZS5peCwgIlBlcmlvZCJdIDwtICJpbmMiCmBgYAoKYGBge3IgY29tYmluZSAxNEMgc29pbCBvYnMgZGF0YX0KIyA3LiBDb21iaW5lIGRhdGEuCiMgZmxhdHRlbiBsaXN0IGFuZCByZW1vdmUgQU1TIGJsYW5rcywgTkEgc2FtcGxlcywgYW5kIG5vbi1FeHBsb3JhdG9yeSBkYXRhCmFtc19yZXN1bHRzX2FyY19yZXdldCA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMzo3XSwgZnVuY3Rpb24oeCkgYmluZF9yb3dzKHgpKQphbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYgPC0gYmluZF9yb3dzKGxhcHBseShhbXNfcmVzdWx0c19hcmNfcmV3ZXQsIGZ1bmN0aW9uKHgpIGV4dHJhLmNsZWFuLmZ4KHgpKSkKCiMgZmxhdHRlbiBleHRlcm5hbCBkYXRhIGxpc3QKYW1zX3Jlc3VsdHNfdG1lIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc1tjKDE6Miw3KV0sIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCB0bWUuMTRjLmZ4KSkKYW1zX3Jlc3VsdHNfdG1lLmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoYW1zX3Jlc3VsdHNfdG1lLCBmdW5jdGlvbih4KSBiaW5kX3Jvd3MoeCkpKQoKIyBjdXQgb3V0IG5vbi1yZWxldmFudCBBTVMgcmVzdWx0cyBjb2x1bW5zCm5tcy5hbXMudmFycyA8LSBjKCJGMTRDIiwgImVyciIsICLiiIYxNEMuKOKAsCkiLCAiZXJyLijigLApIiwKICAgICAgICAgICAgICAgICAiU2FtcGxlTmFtZSIsICJUcmVhdG1lbnQiLCAiUGVyaW9kIiwgIkV4cGVyaW1lbnQiKQphbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYgPC0gYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmWyAsIG5tcy5hbXMudmFyc10KY29sbmFtZXMoYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmKSA8LSBjKCJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIsIG5tcy5hbXMudmFyc1s1OjhdKQoKYW1zX3Jlc3VsdHNfdG1lLmRmIDwtIGFtc19yZXN1bHRzX3RtZS5kZlsgLCBubXMuYW1zLnZhcnNdCmNvbG5hbWVzKGFtc19yZXN1bHRzX3RtZS5kZikgPC0gYygiZm0iLCAiZm1fZXJyIiwgImQxNGMiLCAiZDE0Y19lcnIiLCBubXMuYW1zLnZhcnNbNTo4XSkKYW1zX3Jlc3VsdHNfdG1lLmRmJElEIDwtIHN1YnN0cihhbXNfcmVzdWx0c190bWUuZGYkU2FtcGxlTmFtZSwgMSwgbmNoYXIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUpLTIpCmFtc19yZXN1bHRzX3RtZS5kZiRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIGFtc19yZXN1bHRzX3RtZS5kZiRJRCksICJHIiwgIkYiKQoKIyBtZXJnZSBhcmMgYW5kIHJld2V0IDE0QyBkYXRhIHdpdGggdGVtcGxhdGUKaWYobnJvdyhtZXJnZShhbGwuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYsIGFsbC54ID0gVFJVRSkpID09IG5yb3coYWxsLjE0Yy50ZW1wbGF0ZSkpIHsKICBhbGwuMTRjIDwtIG1lcmdlKGFsbC4xNGMudGVtcGxhdGUsIGFtc19yZXN1bHRzX2FyY19yZXdldC5kZiwgYWxsLnggPSBUUlVFKQp9IGVsc2UgewogIGNhdCgiZHVwbGljYXRlIHNhbXBsZSBtZXJnZSBlcnJvciIpCn0KCiMgbWVyZ2Ugc29pbCBvYnMgZGF0YSB3aXRoIDE0YyBkYXRhCmlmKG5yb3cobWVyZ2UoYWxsLjE0YywgdHMuZXBzbi5hdmcsIGJ5ID0gYygiU2FtcGxlTmFtZSIsICJQZXJpb2QiKSkpID09IG5yb3coYWxsLjE0YykpIHsKICBhbGwuMTRjIDwtIG1lcmdlKGFsbC4xNGMsIHRzLmVwc24uYXZnLCBhbGwueCA9IFRSVUUpCn0gZWxzZSB7CiAgY2F0KCJkdXBsaWNhdGUgc2FtcGxlIG1lcmdlIGVycm9yIikKfQoKIyBtZXJnZSB0bWUgMTRDIGRhdGEgd2l0aCB0ZW1wbGF0ZSBhbmQgdHMuZXBzbi5hdmcKdG1lLjE0YyA8LSBtZXJnZSh0bWUuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c190bWUuZGYsIGFsbC54ID0gVFJVRSkKCiMgYWRkIGN0bCBzYW1wbGUgMTRDIGRhdGEgdG8gdG1lLjE0YwojIGZpcnN0IHJlbW92ZSBOQSB2YWx1ZXMKdG1lLjE0Yy5jbGVhbiA8LSB0bWUuMTRjW3doaWNoKCFpcy5uYSh0bWUuMTRjJGQxNGMpIHwgIWlzLm5hKHRtZS4xNGMkZm0pKSwgXQojIGRlZmluZSBtZXJnZSBmeAp0bWUubXJnLmZ4IDwtIGZ1bmN0aW9uKHgsIHkpIHsKICBtcmcubm1zIDwtIGMoIlNhbXBsZU5hbWUiLCAiSUQiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIpCiAgdmFyLm5tcyA8LSBjKCJZZWFyU2FtcGxlZCIsICJTaXRlIiwgIkhvcml6b24iLCAgImQxNGMiLCAiZm0iKQogIGlmKGxlbmd0aChncmVwKCJmbSIsIG5hbWVzKHkpKSkgPiAwKSB7CiAgICBkZiA8LSBtZXJnZSh4WyAsIG1yZy5ubXNdLCB5WyAsIGMobXJnLm5tcywgdmFyLm5tcyldKQogIH0gZWxzZSB7CiAgICBkZiA8LSBtZXJnZSh4WyAsIG1yZy5ubXNdLCB5WyAsIGMobXJnLm5tcywgdmFyLm5tc1sxOjRdKV0pCiAgICBkZiRmbSA8LSBOQQogIH0KICByZXR1cm4oZGYpCn0KCnRtZS4xNGMuZGYgPC0gYmluZF9yb3dzKGxhcHBseShsaXN0KHRtZS5jdGwuZHVrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLmN0bC5mbHguc3JhW3doaWNoKCFpcy5uYSh0bWUuY3RsLmZseC5zcmEkZDE0YykpLCBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLmN0bC5vcm5sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLm1pc2MpLCBmdW5jdGlvbihpKSB0bWUubXJnLmZ4KHRtZS4xNGMsIGkpKSkKCiMgYWRkIHN0b3JhZ2UgZHVyYXRpb24gZGF0YSBmb3IgdHJlYXRtZW50IHNhbXBsZXMgYW5hbHl6ZWQgZXh0ZXJuYWxseQp0bWUuMTRjLmRmJFR5cGUgPC0gIkYiCgojIGFkZCBZZWFyU2FtcGxlZCBmb3IgdG1lLjE0Yy5jbGVhbiBzYW1wbGVzCmZvcihpIGluIDE6bnJvdyh0bWUuMTRjLmNsZWFuKSkgewogIGlmKHRtZS4xNGMuY2xlYW5baSwgIlNpdGUiXSA9PSAiRHVrZSIpIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAwOAogIH0gZWxzZSBpZih0bWUuMTRjLmNsZWFuW2ksICJTaXRlIl0gPT0gIlhwbHIiKSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMTEKICB9IGVsc2UgaWYodG1lLjE0Yy5jbGVhbltpLCAiU2l0ZSJdID09ICJTaWVycmEiKSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMDkKICB9IGVsc2UgewogICAgdG1lLjE0Yy5jbGVhbltpLCAiWWVhclNhbXBsZWQiXSA8LSAyMDA0CiAgfQp9CgojIEFkZCBIb3Jpem9uIHRvIHRtZS4xNGMuY2xlYW4KdG1lLjE0Yy5jbGVhbiRIb3Jpem9uIDwtIGlmZWxzZSh0bWUuMTRjLmNsZWFuJElEID09ICJNQiIgfCB0bWUuMTRjLmNsZWFuJElEID09ICJTQiIsICJCIiwgIkEiKQoKIyBjb21iaW5lIHRtZSBkYXRhCnRtZS4xNGMgPC0gYmluZF9yb3dzKHRtZS4xNGMuY2xlYW5bICwgbmFtZXModG1lLjE0Yy5kZildLCB0bWUuMTRjLmRmKQp0bWUuMTRjJEV4cGVyaW1lbnQgPC0gInRtZSIKCiMgcmVtb3ZlIG91dGxpZXIgKE1BLTEpCiMgKioqIE5lZWQgdG8gY2xhcmlmeSBtZXRob2QgZm9yIGRldGVybWluaW5nIHRoYXQgdGhpcyBpcyBhbiBvdXRsaWVyICoqKiAKdG1lLjE0YyA8LSB0bWUuMTRjWy13aGljaCh0bWUuMTRjJFNhbXBsZU5hbWUgPT0gIk1BLTEiIHwgdG1lLjE0YyRTYW1wbGVOYW1lID09ICJIRVc0OS0xIiB8IHRtZS4xNGMkU2FtcGxlTmFtZSA9PSAiSEVXMjYtMSIpLCBdCgoKIyBBZGQgbWlzc2luZyB2YXJpYWJsZSBjb2x1bW5zIHRvIGFsbC4xNGMKIyBhZGQgWWVhclNhbXBsZWQgY29sdW1uCmFsbC4xNGMkWWVhclNhbXBsZWQgPC0gaWZlbHNlKGFsbC4xNGMkRXhwZXJpbWVudCA9PSAiYXJjIiwgMjAxMSwgMjAxOSkKCiMgYWRkIFNpdGUgYW5kIEhvcml6b24gY29sdW1ucwphbGwuMTRjJFNpdGUgPC0gaWZlbHNlKGdyZXBsKCJIRSIsIGFsbC4xNGMkSUQpLCAiSGFpbmljaCIsICJTY2hvcmZoZWlkZSIpCmFsbC4xNGMkSG9yaXpvbiA8LSAiQSIKCgojIGNvbWJpbmUgdG1lLjE0YyBhbmQgYWxsLjE0YyBpbnRvIGEgbGlzdCBhbmQgY2FsY3VsYXRlIGZyYWN0aW9uIG1vZGVybiBmcm9tIGQxNEMgYXMgbmVlZGVkCmFsbC4xNGMubHMgPC0gbGFwcGx5KGxpc3QodG1lLjE0YywgYWxsLjE0YyksIGZ1bmN0aW9uKGRmKSB7CiAgZGYkZm0gPC0gaWZlbHNlKGlzLm5hKGRmJGZtKSwKICAgICAgICAgICAgICAgICAgZDE0Yy5mbS5meChkZiRZZWFyU2FtcGxlZCwgZGYkZDE0YyksCiAgICAgICAgICAgICAgICAgIGRmJGZtKQogIGRmJGQxNGNfY29yciA8LSBkZWNheS5jb3JyLmZ4KGRmJFllYXJTYW1wbGVkLCBkZiRmbSkKICByZXR1cm4oZGYpCn0pCgphbGwuMTRjLnN1bSA8LSBsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBkZi5zdW0gPC0gc2VsZWN0KGRmLCAtU2FtcGxlTmFtZSkgJT4lCiAgICBncm91cF9ieShJRCwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFNpdGUsIEhvcml6b24sIFllYXJTYW1wbGVkKSAlPiUKICAgIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgbWF4ID0gbWF4LCBtaW4gPSBtaW4pLCBuYS5ybSA9IFRSVUUpCiAgZGYuc3VtW21hcHBseShpcy5pbmZpbml0ZSwgZGYuc3VtKV0gPC0gTkEKICByZXR1cm4oZGYuc3VtKQp9KQphbGwuMTRjLnN1bSA8LSByYXBwbHkoYWxsLjE0Yy5zdW0sIGYgPSBmdW5jdGlvbih4KSBpZmVsc2UoaXMubmFuKHgpLCBOQSAsIHgpLCBob3cgPSAicmVwbGFjZSIpCmFsbC4xNGMuc3VtLmRmIDwtIGJpbmRfcm93cyhhbGwuMTRjLnN1bSkKCiMgcmVtb3ZlIHVubmVjZXNzYXJ5IG9iamVjdHMKYGBgCgpgYGB7ciBjb3VudHMgZm9yIGNoZWNraW5nIHBsb3RzLCBpbmNsdWRlID0gRkFMU0V9CiMgOC4gQ291bnQgbnVtYmVyIG9mIF4xNF5DIG9ic2VydmF0aW9ucyBmb3IgY2hlY2tpbmcgcGxvdHMuCiMgY291bnQgIWlzLm5hKDE0QykgY2FzZXMgYnkgU2FtcGxlTmFtZQphbGwuMTRjWy13aGljaChpcy5uYShhbGwuMTRjJGQxNGNfY29ycikpLF0gJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBQZXJpb2QsIFR5cGUpICU+JQogIGNvdW50KCkKIyBieSBJRAphbGwuMTRjWy13aGljaChpcy5uYShhbGwuMTRjJGQxNGNfY29ycikpLF0gJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBQZXJpb2QsIFR5cGUpICU+JQogIGRpc3RpbmN0KElEKSAlPiUKICBjb3VudCgpCmBgYAoKKlByZS1pbmN1YmF0aW9uIHZlcnN1cyBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBeMTReQy1DT34yfioKCkRlc3BpdGUgdGhlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIHJlc3BpcmF0aW9uLCBhbmQgaW4gY29udHJhc3QgdG8gaHlwb3RoZXNpcyAxLCB3ZSBkaWQgbm90IG9ic2VydmUgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiBeMTReQy1DT34yfiByZXNwaXJlZCBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBhbmQgXjE0XkMtQ09+Mn4gcmVzcGlyZWQgZHVyaW5nIHRoZSBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBwZXJpb2Q6IG5laXRoZXIgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgbm9yIGZvciB0aGUgYWlyLWRyeSB0cmVhdG1lbnQgYWxvbmUgKiooRmlnLiA1KSoqLiBUaGUgaW50ZXJhY3Rpb25zIHdpdGggbGFuZCB1c2Ugd2FzIG5vdCBzaWduaWZpY2FudCBub3Igd2FzIHRoZSBpbnRlcmFjdGlvbiB3aXRoIGV4cGVyaW1lbnQsIHNvIGFsbCBkYXRhIHdlcmUgcG9vbGVkIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcy4KCmBgYHtyIHByZS1pbmMtMTRjLXBsb3R9CmFsbC4xNGMucHJlLmluYyA8LSBtZXJnZShhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gInByZSIsIGMoIklEIiwgIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJUcmVhdG1lbnQiLCAiZDE0Y19jb3JyX21lYW4iLCAiZDE0Y19jb3JyX21pbiIsICJkMTRjX2NvcnJfbWF4IildLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiwgImQxNGNfY29ycl9tZWFuIiwgImQxNGNfY29ycl9taW4iLCAiZDE0Y19jb3JyX21heCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ZXMgPSBjKCJfcHJlIiwgIl9pbmMiKSkKYWxsLjE0Yy5wcmUuaW5jJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnByZS5pbmMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKCmFsbC4xNGMucHJlLmluYyAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9wcmUsIGQxNGNfY29ycl9tZWFuX2luYywgY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5faW5jLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF9pbmMsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19jb3JyX21pbl9wcmUsIAogICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X3ByZSwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmR1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgeGxhYihleHByZXNzaW9uKCdQcmUtaW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ0VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5uICsgMn1gLiBQcmUtaW5jdWJhdGlvbiBwZXJpb2QgJFxEZWx0YSReMTReQyBhZ2FpbnN0IGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZCAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBhcmUgbWVhbnMgb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzIGFuZCBlcnJvciBiYXJzIGFyZSB0aGUgbWluIGFuZCBtYXggKGV4Y2VwdCBmb3IgRXhwZXJpbWVudCAxIGNvbnRyb2wgc2FtcGxlcywgd2hpY2ggd2VyZSBub3QgcmVwbGljYXRlZCkuIE5vdGUgdGhhdCBwcmUtaW5jdWJhdGlvbiAkXERlbHRhJF4xNF5DIHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZSBFeHBlcmltZW50IDEgY29udHJvbCBzYW1wbGVzOyBhZGRpdGlvbmFsbHkgc2FtcGxlcyBmcm9tIHRocmVlIG9mIHRoZSBmb3Jlc3QgcGxvdHMgb2YgdGhlIEV4cGVyaW1lbnQgMSB0cmVhdG1lbnQgc2FtcGxlcyAoYWlyLWRyeSArIHN0b3JhZ2UpIGZhaWxlZCB0byBhY2N1bXVsYXRlIGVub3VnaCBDT34yfiBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCB0byBtZWFzdXJlIF4xNF5DLiBUaGUgb3V0bGllciBwb2ludCB3aXRoIHRoZSBzdWJzdGFudGlhbGx5IGRlcGxldGVkIHByZS1pbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMgaXMgZnJvbSBFeHBlcmltZW50IDIgKGNvbnRyb2wpLgoKTm90ZSB0aGUgb25lIG91dGxpZXIgKGZvcmVzdCwgY29udHJvbCkgZm9yIHdoaWNoIHRoZSBwcmUtaW5jdWJhdGlvbiBDT34yfiB3YXMgc3Vic3RhbnRpYWxseSBkZXBsZXRlZCByZWxhdGl2ZSB0byBlcXVpbGlicml1bSBwZXJpb2QgcmVzcGlyYXRpb24uIEhvd2V2ZXIsIGV2ZW4gd2hlbiB0aGlzIG91dGxpZXIgd2FzIGluY2x1ZGVkIGluIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHByZS1pbmN1YmF0aW9uIF4xNF5DLUNPfjJ+IGFuZCBlcXVpbGlicml1bSBeMTReQy1DT34yfiB3YXMgbm90IHNpZ25pZmljYW50LiBGb3IgY2xhcml0eSwgdGhpcyBwb2ludCB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGZ1dHVyZSBwbG90cy4gRHVlIHRvIGxvd2VyIHJlc3BpcmF0aW9uIHJhdGVzIGR1cmluZyBwcmUtaW5jdWJhdGlvbiwgb25seSB0aHJlZSBvZiB0aGUgc2l4IGZvcmVzdCBzYW1wbGVzIGluIEV4cGVyaW1lbnQgMSBnZW5lcmF0ZWQgZW5vdWdoIENPfjJ+IHRvIG1lYXN1cmUgcmFkaW9jYXJib24sIGFuZCBhZGRpdGlvbmFsbHksIGl0IHdhcyBub3QgcG9zc2libGUgdG8gY29tcGFyZSBwcmUtaW5jdWJhdGlvbiBhbmQgZXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gXjE0XkMtQ09+Mn4gZm9yIHRoZSBjb250cm9sIHNhbXBsZXMgaW4gRXhwZXJpbWVudCAxIHNpbmNlIHByZS1pbmN1YmF0aW9uIF4xNF5DLUNPfjJ+IHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZXNlIHNhbXBsZXMgaW4gMjAxMS4KCmBgYHtyIHByZS1lcXUtMTRjLXN0YXRzLCBpbmNsdWRlID0gRkFMU0V9CiMgZ2F0aGVyIHByZSBhbmQgaW5jIGRhdGEgZnJvbSBhbGwgcmVwcywgYXJjIGFuZCByZXdldCBleHAgb25seQpqLnZhcnMgPC0gYygiU2FtcGxlTmFtZSIsICJJRCIsICJFeHBlcmltZW50IiwgIlRyZWF0bWVudCIsICJUeXBlIiwgImQxNGNfY29yciIsICJtZ0NPMi5DX2dDIikKYXJjLnJld2V0LnByZS4xNGMgPC0gYmluZF9yb3dzKGxhcHBseShhbGwuMTRjLmxzLCBmdW5jdGlvbihkZikgewogIGlmKCFpcy5udWxsKGRmJG1nQ08yLkNfZ0MpKSB7CiAgICAgIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAicHJlIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC5pbmMuMTRjIDwtIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBpZighaXMubnVsbChkZiRtZ0NPMi5DX2dDKSkgewogIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAiaW5jIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC4xNGMgPC0gbWVyZ2UoYXJjLnJld2V0LnByZS4xNGMsIGFyYy5yZXdldC5pbmMuMTRjLCBieSA9IGoudmFyc1sxOjVdLCBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQoKYXJjLnJld2V0LjE0YyR0cmVhdC5iaSA8LSBpZmVsc2UoYXJjLnJld2V0LjE0YyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyMgbG9vayBhdCBpbnRlcmFjdGlvbnMKIyBFeHBlcmltZW50IDEKIyBpbnRlcmFjdGlvbiB3aXRoIFR5cGUgbnMKc3VtbWFyeShsbShkMTRjX2NvcnJfaW5jIH4gZDE0Y19jb3JyX3ByZSAqIFR5cGUsIGFyYy5yZXdldC4xNGNbYXJjLnJld2V0LjE0YyRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKCiMgRXhwZXJpbWVudCAyCiMgaW50ZXJhY3Rpb24gd2l0aCBUeXBlICogVHJlYXRtZW50IHNpZ25pZmljYW50IGR1ZSB0byBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiLCBdKSkKIyBidXQgZGlzYXBwZWFycyB3aGVuIGV4Y2x1ZGVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW3doaWNoKGFyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0YyRJRCAhPSAiSEVXMjIiKSwgXSkpCgojIGNvbWJpbmVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCBhcmMucmV3ZXQuMTRjKSkgIyBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCAKICAgICAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCBdKSkgIyB3L28gSEVXMjIKCiMgdC50ZXN0CnQudGVzdChhcmMucmV3ZXQuMTRjJGQxNGNfY29ycl9wcmUsIGFyYy5yZXdldC4xNGMkZDE0Y19jb3JyX2luYykgIyB3LyBIRVcyMgp0LnRlc3QoYXJjLnJld2V0LjE0Y1std2hpY2goYXJjLnJld2V0LjE0YyRJRCA9PSAiSEVXMjIiKSwgImQxNGNfY29ycl9wcmUiXSwgCiAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCAiZDE0Y19jb3JyX2luYyJdKSAjIHcvbyBIRVcyMgpybShqLnZhcnMpCmBgYAoKKlRyZWF0bWVudCBlZmZlY3RzIG9uIG9ic2VydmVkIGVxdWlsaWJyaXVtIHBlcmlvZCBeMTReQy1DT34yfioKCmBgYHtyIGN0bC10cnQtZGlmcywgaW5jbHVkZSA9IEZBTFNFfQojIGF2ZXJhZ2UgY29udHJvbCBhbmQgdHJlYXRtZW50IGRhdGEKIyByZW1vdmUgSEVXMjIgY29udHJvbCBwcmUKIyBub3RlIHRoYXQgdXBwZXIvbG93ZXIgbGltaXRzID0gMnhTRQphbGwuMTRjLnN1bTIgPC0gYWxsLjE0Yy5sc1tbMl1dICU+JQogIG11dGF0ZShJRC50cmVhdC5QZXJpb2QgPSBwYXN0ZShJRCwgVHJlYXRtZW50LCBQZXJpb2QpKSAlPiUKICBmaWx0ZXIoSUQudHJlYXQuUGVyaW9kICE9ICJIRVcyMiBjb250cm9sIHByZSIpICU+JQogIHNlbGVjdChUeXBlLCBQZXJpb2QsIFRyZWF0bWVudCwgRXhwZXJpbWVudCwgWWVhclNhbXBsZWQsIGQxNGNfY29yciwgbWdDTzIuQ19nQykgJT4lCiAgZ3JvdXBfYnkoVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkKSAlPiUKICBhZGRfY291bnQoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShkMTRjX2NvcnJfc2UgPSBkMTRjX2NvcnJfc2Qvbl9tZWFuLAogICAgICAgICBkMTRjX2NvcnJfdSA9IGQxNGNfY29ycl9tZWFuICsgZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIGQxNGNfY29ycl9sID0gZDE0Y19jb3JyX21lYW4gLSBkMTRjX2NvcnJfc2UqMiwKICAgICAgICAgbWdDTzIuQ19nQ19zZSA9IG1nQ08yLkNfZ0Nfc2Qvbl9tZWFuLAogICAgICAgICBtZ0NPMi5DX2dDX3UgPSBtZ0NPMi5DX2dDX21lYW4gKyBtZ0NPMi5DX2dDX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0NfbCA9IG1nQ08yLkNfZ0NfbWVhbiAtIG1nQ08yLkNfZ0Nfc2UqMikgCgphbGwuMTRjLnN1bTIkdHJlYXQuYmkgPC0gaWZlbHNlKGFsbC4xNGMuc3VtMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsInRyZWF0bWVudCIpCgojIHN1bW1hcml6ZQp0cnQuY3RsLmRmIDwtIG1lcmdlKAogIGFsbC4xNGMuc3VtMlt3aGljaChhbGwuMTRjLnN1bTIkdHJlYXQuYmkgPT0gImNvbnRyb2wiICYgYWxsLjE0Yy5zdW0yJFBlcmlvZCA9PSAiaW5jIiksIGMoIlR5cGUiLCAiRXhwZXJpbWVudCIsICJkMTRjX2NvcnJfbWVhbiIsICJkMTRjX2NvcnJfc2QiLCAibl9tZWFuIildLAogIGFsbC4xNGMuc3VtMlt3aGljaChhbGwuMTRjLnN1bTIkdHJlYXQuYmkgIT0gImNvbnRyb2wiICYgYWxsLjE0Yy5zdW0yJFBlcmlvZCA9PSAiaW5jIiksIGMoIlR5cGUiLCAiRXhwZXJpbWVudCIsICJkMTRjX2NvcnJfbWVhbiIsICJkMTRjX2NvcnJfc2QiLCAibl9tZWFuIildLAogIGJ5ID0gYygiVHlwZSIsICJFeHBlcmltZW50IiksCiAgc3VmZml4ZXMgPSBjKCIuY3RsIiwgIi50cnQiKSkKdHJ0LmN0bC5kZiRkaWYgPC0gdHJ0LmN0bC5kZiRkMTRjX2NvcnJfbWVhbi5jdGwgLSB0cnQuY3RsLmRmJGQxNGNfY29ycl9tZWFuLnRydAp0cnQuY3RsLmRmJGRpZi5zZSA8LSBzYXBwbHkoc3BsaXQodHJ0LmN0bC5kZiwgMTpucm93KHRydC5jdGwuZGYpKSwgZnVuY3Rpb24oeCkgewogIHNxcnQoc3VtKCh4JGQxNGNfY29ycl9zZC5jdGwpXjIvc3FydCh4JG5fbWVhbi5jdGwpLAogICAgICAoeCRkMTRjX2NvcnJfc2QudHJ0KV4yL3NxcnQoeCRuX21lYW4udHJ0KSkpCiAgfSkKYGBgCgpSZWxhdGl2ZSB0byB0aGUgY29udHJvbHMgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCAoRXhwZXJpbWVudCAxLCBvcGVuIHNxdWFyZXMgaW4gKipGaWcuIDUqKikgbGVkIHRvIGVucmljaG1lbnQgaW4gZ3Jhc3NsYW5kIHNhbXBsZXMsIGJ1dCBkZXBsZXRpb24gaW4gZm9yZXN0IHNhbXBsZXMuIEluIGNvbnRyYXN0LCB0aGUgYWlyLWRyeSBvbmx5IHRyZWF0bWVudCAoRXhwZXJpbWVudCAyLCBvcGVuIGNpcmNsZXMsICoqRmlnLiA1KiopIGxlZCB0byBlbnJpY2htZW50IGZvciBib3RoIGZvcmVzdCBhbmQgZ3Jhc3NsYW5kIHNhbXBsZXMgKDIwMTkgcG9pbnRzKS4gVHJlYXRtZW50IGVmZmVjdHMgb24gXjE0XkMtQ09+Mn4gd2VyZSBzaWduaWZjYW50IGZvciBib3RoIGZvcmVzdHMgYW5kIGdyYXNzbGFuZCBzb2lscyBpbiBFeHBlcmltZW50IDEgKDIwMTEgcG9pbnRzLCAqKkZpZyA1KiopLCBhbmQgc2lnbmlmaWNhbnQgZm9yIGdyYXNzbGFuZCBzYW1wbGVzIGJ1dCBub3QgZm9yZXN0IHNhbXBsZXMgaW4gRXhwZXJpbWVudCAyICgyMDE5IHBvaW50cywgKipGaWcuIDUqKikuIFRoZSBhYnNvbHV0ZSBtZWFuIGRpZmZlcmVuY2UgaW4gXjE0XkMtQ09+Mn4gYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyB3YXMgZ3JlYXRlciBpbiBncmFzc2xhbmQgc2FtcGxlcyAoYHIge3JvdW5kKG1lYW4oYWJzKHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9tZWFuLmN0bCJdIC0gdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAiZDE0Y19jb3JyX21lYW4udHJ0Il0pKSwgMSl9YOKAsCkgdGhhbiBpbiBmb3Jlc3Qgc2FtcGxlcyAoYHIge3JvdW5kKG1lYW4oYWJzKHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9tZWFuLmN0bCJdIC0gdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX21lYW4udHJ0Il0pKSwgMSl9YOKAsCkgZm9yIGJvdGggZXhwZXJpbWVudHMuIAoKTWVhbiBeMTReQy1DT34yfiBzaG93ZWQgZW5yaWNobWVudCByZWxhdGl2ZSB0byB0aGUgYXRtb3NwaGVyZSBmb3IgYWxsIHNhbXBsZXMgaW4gYm90aCBleHBlcmltZW50cy4gQ29udHJvbCBzYW1wbGUgXjE0XkMtQ09+Mn4gcmVzcGlyZWQgZnJvbSBncmFzc2xhbmQgc29pbHMgd2FzIGdlbmVyYWxseSBjbG9zZXIgdG8gdGhlIGF0bW9zcGhlcmUgdGhhbiB0aGF0IGZyb20gZm9yZXN0IHNvaWwgY29udHJvbHMsIGJ1dCB0aGUgZGlmZmVyZW5jZSBmcm9tIHRoZSBhdG1vc3BoZXJlICgkXERlbHRhJCRcRGVsdGEkXjE0XkMpIGluY3JlYXNlZCBzbGlnaHRseSBiZXR3ZWVuIDIwMTEgYW5kIDIwMTkgaW4gZ3Jhc3NsYW5kIHNvaWxzIHdoaWxlIGl0IHN0YXllZCBhYm91dCB0aGUgc2FtZSBpbiBmb3Jlc3Qgc29pbHMuIAoKYGBge3IgdHJlYXRtZW50IGVmZmVjdHMgYnkgdGltZX0KIyBmaXJzdCBsb2FkIGF0bW9zcGhlcmljIGRhdGEgZnJvbSBJU1JhRCBhbmQgYmluZCBmdXR1cmUgcHJvamVjdGlvbgpEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQpEYXRtIDwtIERhdG1bRGF0bSREYXRlID4gMTkwMCwgYygiRGF0ZSIsICJOSGMxNCIpXQoKIyAjIGNvZGUgZm9yIHBsb3R0aW5nIGRhdGEgYnkgSUQKIyBhbGwuMTRjLnN1bSAlPiUKIyAgIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQojICAgZmlsdGVyKCFncmVwbCgiUyIsIElEKSkgJT4lCiMgICBtdXRhdGUoeWVhci5JRCA9IHBhc3RlKFllYXJTYW1wbGVkLCBJRCkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMpICsKIyAgIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLklEKSwgCiMgICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAibGFzdCIpLAojICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKIyAgIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0KSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gYygyMDEzLCAyMDE2LCAyMDE5KSkgKwojICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiMgICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICBmYWNldF93cmFwKH4gSUQsIG5jb2wgPSAzKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIHBsb3Qgb3ZlciB0aW1lLCBhdmVyYWdlZCBieSBUeXBlCmFsbC4xNGMuc3VtMiAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBtdXRhdGUoeWVhci5UeXBlID0gcGFzdGUoWWVhclNhbXBsZWQsIFR5cGUpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMsIHN0cm9rZSA9IDEuNSkgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLlR5cGUpLCAKICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAiZmlyc3QiKSwKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDIsIHByZXNlcnZlID0gInNpbmdsZSIpLAogICAgICAgICAgICBzaXplID0gMS4yKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQpLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl91LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjUsCiAgICBhbHBoYSA9IC4zKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZCB1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTMsIDIwMTYsIDIwMTkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiAgeGxhYignWWVhciBzYW1wbGVkJykgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKIyBGaWcuIDEgc2hvd3MgdGhlIGRpcmVjdGlvbiBvZiBtZWFuIHRyZWF0bWVudCBlZmZlY3RzIG92ZXIgdGltZSBpbiByZWZlcmVuY2UgdG8gdGhlIGF0bW9zcGhlcmUgKGdyYXkgbGluZSkuIFBvaW50cyBhcmUgbWVhbnMgKG4gPSAxMiBmb3IgMjAxMSB0cmVhdG1lbnQgcG9pbnRzLCBuID0gOSBmb3IgMjAxMSBjb250cm9sIHBvaW50czsgbiA9IDYgZm9yIGFsbCAyMDE5IHBvaW50cyk7IGVycm9yIGJhcnMgPSAyeCBzdGQuIGVyci4gb2YgdGhlIG1lYW4uCgojIGNhbGMgZGVsdGEgZGVsdGEKYWxsLjE0Yy5zdW0yJGF0bTE0YyA8LSBpZmVsc2UoYWxsLjE0Yy5zdW0yJFllYXJTYW1wbGVkID09IDIwMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdG1bd2hpY2goRGF0bSREYXRlID09IDIwMTEuNSksICJOSGMxNCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRtW3doaWNoKERhdG0kRGF0ZSA9PSAyMDE5LjUpLCAiTkhjMTQiXSkKYWxsLjE0Yy5zdW0yJGRkMTRjIDwtIGFsbC4xNGMuc3VtMiRkMTRjX2NvcnJfbWVhbiAtIGFsbC4xNGMuc3VtMiRhdG0xNGMKIyBhbGwuMTRjLnN1bTIgJT4lCiMgICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKIyAgIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSkgJT4lCiMgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oZGQxNGMpKQpgYGAKPioqRmlnIGByIHtmaWcubiArIDN9YC4gVHJlYXRtZW50IGVmZmVjdCBvbiBvYnNlcnZlZCAkXERlbHRhJF4xNF5DLUNPfjJ+IG92ZXIgdGltZSAoRXhwZXJpbWVudHMgMSBhbmQgMikqKgoKPipDYXB0aW9uOiogRmlsbGVkIGNpcmNsZXMgc2hvdyBeMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgY29udHJvbCBzYW1wbGVzLCB3aGlsZSBvcGVuIHN5bWJvbHMgc2hvdyBeMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgdHJlYW1lbnQgc2FtcGxlcyAob3BlbiBzcXVhcmVzID0gYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50LCBFeHBlcmltZW50IDE7IG9wZW4gY2lyY2xlcyA9IGFpci1kcnkgb25seSB0cmVhdG1lbnQsIEV4cGVyaW1lbnQgMikuIEFycm93cyBzaG93IHRoZSBkaXJlY3Rpb24gb2YgY2hhbmdlIGluIF4xNF5DLUNPfjJ+IHJlbGF0aXZlIHRvIHRoZSBjb250cm9scy4gUG9pbnRzIGFyZSBtZWFucyBhbmQgZXJyb3IgYmFycyBzaG93IDJ4IHN0YW5kYXJkIGVycm9yLiBUaGUgZ3JheSBsaW5lIHNob3dzICRcRGVsdGEkXjE0XkMgb2YgdGhlIGF0bW9zcGhlcmUuCgpgYGB7ciBzaWRlLWJ5LXNpZGUgcGxvdCwgaW5jbHVkZSA9IEZBTFNFfQojIHBsb3QgYXMgc2lkZS1ieS1zaWRlIG1lYW5zIHcvIDJ4U0UKIyB3aWxsIGNoYW5nZSB0byA5NSVDSXMgYXQgc29tZSBwb2ludCwgYnV0IG5lZWQgdG8gY2FsY3VsYXRlIHRlc3Qgc3RhdGlzdGljIHdpdGggYXBwcm9wcmlhdGUgZGYKYWxsLjE0Yy5zdW0yICU+JQogIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQogIGdncGxvdCguLCBhZXModHJlYXQuYmksIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl91LCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmQgdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNikpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCgoqRWZmZWN0IG9mIGN1bXVsYXRpdmUgcmVzcGlyZWQgY2FyYm9uIG9uIF4xNF5DLUNPfjJ+KgoKYGBge3IgY3RsLXRydC1zdGF0cywgaW5jbHVkZSA9IEZBTFNFfQojIGNhbGN1bGF0ZSBkaWZzIGN0bC10cnQsIGxvb2sgYXQgZWZmZWN0IG9mIEMgcmVzcAphcmMucmV3ZXQuaW5jLjE0YyR0cmVhdC5iaSA8LSBpZmVsc2UoYXJjLnJld2V0LmluYy4xNGMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKYXJjLnJld2V0LmluYy4xNGMuc3VtIDwtIGFyYy5yZXdldC5pbmMuMTRjICU+JQogIGdyb3VwX2J5KElELCBFeHBlcmltZW50LCBUeXBlLCB0cmVhdC5iaSkgJT4lCiAgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSkKCmoudmFycyA8LSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiZDE0Y19jb3JyIiwgIm1nQ08yLkNfZ0MiKQphcmMucmV3ZXQuMTRjLmN0bC50cnQgPC0gbGVmdF9qb2luKAogIGFyYy5yZXdldC5pbmMuMTRjLnN1bVthcmMucmV3ZXQuaW5jLjE0Yy5zdW0kdHJlYXQuYmkgPT0gImNvbnRyb2wiLCBqLnZhcnNdLAogIGFyYy5yZXdldC5pbmMuMTRjLnN1bVthcmMucmV3ZXQuaW5jLjE0Yy5zdW0kdHJlYXQuYmkgIT0gImNvbnRyb2wiLCBqLnZhcnNdLAogIGJ5ID0gYyhqLnZhcnNbMTozXSksCiAgc3VmZml4ID0gYygiLmN0bCIsICIudHJ0IikpCgoKYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGQxNGNfZGlmIDwtIGFyYy5yZXdldC4xNGMuY3RsLnRydCRkMTRjX2NvcnIuY3RsIC0gYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGQxNGNfY29yci50cnQKYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGNfZGlmIDwtIGFyYy5yZXdldC4xNGMuY3RsLnRydCRtZ0NPMi5DX2dDLmN0bCAtIGFyYy5yZXdldC4xNGMuY3RsLnRydCRtZ0NPMi5DX2dDLnRydAoKIyMgTG9vayBhdCBlZmZlY3Qgb2YgY19kaWYgYnkgZXhwZXJpbWVudCBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0eXBlCiMgYWlyLWRyeSArIHN0b3JhZ2UKc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKIyBlZmZlY3Qgb2YgY19kaWYgb24gZDE0Y19kaWYgbnM7IGludGVyYWN0aW9uIGFsc28gbnMKCiMgcmV3ZXQKc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJyZXdldCIsIF0pKQojIGVmZmVjdCBvZiBjX2RpZiBtYXJnaW5hbGx5IHNpZ25pZmljYW50IChwID0gMC4wNjMyKQoKIyBMb29rIGF0IGVmZmVjdCBvZiBjX2RpZiBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0eXBlIG92ZXJhbGwKc3VtbWFyeShsbShkMTRjX2RpZiB+IFR5cGUgKiBjX2RpZiAqIEV4cGVyaW1lbnQsIGFyYy5yZXdldC4xNGMuY3RsLnRydCkpCiMgbm8gc2lnbmlmaWNhbmNlIG9mIGNfZGlmIG92ZXJhbGwKcm0oai52YXJzKQpgYGAKCmBgYHtyIHBsb3QtY2RpZi1kMTRjLCBpbmNsdWRlID0gRkFMU0V9CmdncGxvdChhcmMucmV3ZXQuMTRjLmN0bC50cnQsIGFlcyhjX2RpZiwgZDE0Y19kaWYsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBFeHBlcmltZW50KSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmQgdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpbbWF5YmUgZXhwYW5kIHdpdGggc3RhdHMgZm9yIG90aGVyIGV4cGxhbmF0b3J5IGZhY3RvcnM/IGUuZy4gdGV4dHVyZSwgTiBjb250ZW50LCBjaGFuZ2UgaW4gbW9pc3R1cmUgdXBvbiByZXdldHRpbmcsIGV0Yy4uLl0KCldlIGxvb2tlZCBhdCB0aGUgcG9zc2libGUgZWZmZWN0IG9mIHRoZSBkaWZmZXJlbmNlIGluIHRoZSBhbW91bnQgb2YgY2FyYm9uIHJlc3BpcmVkIChtZyBDT34yfi1DIGcgc29pbCBDXi0xXikgb24gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gY29udHJvbCBhbmQgdHJlYXRtZW50IF4xNF5DLUNPfjJ+IHVzaW5nIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwsIGJ1dCBpdCB3YXMgbm90IHNpZ25pZmljYW50IG92ZXJhbGwuIFdoZW4gZGF0YSBmcm9tIEV4cGVyaW1lbnQgMSBhbmQgRXhwZXJpbWVudCAyIHdlcmUgY29uc2lkZXJlZCBzZXBhcmF0ZWx5LCB3ZSBvYnNlcnZlZCBhIHNsaWdodCBwb3NpdGl2ZSB0cmVuZCBiZXR3ZWVuIHRoZSBkaWZmZXJlbmNlIGluIHJlc3BpcmVkIGNhcmJvbiBhbmQgdGhlIGRpZmZlcmVuY2UgaW4gXjE0XkMtQ09+Mn4gd2l0aGluIEV4cGVyaW1lbnQgMiwgYnV0IGl0IHdhcyBvbmx5IG1hcmdpbmFsbHkgc2lnbmlmaWNhbnQgKHAgPSBgciB7cm91bmQoc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJyZXdldCIsIF0pKSRjb2VmWzIsNF0sMyl9YCkuIAoKYGBge3IgcGxvdC0xNGMtYnktYy1yZXNwfQojIDEwLiBQbG90ICRcRGVsdGEkXjE0XkMgYWdhaW5zdCBwcm9wb3J0aW9uIG9mIHNvaWwgQyByZXNwaXJlZCBieSBleHBlcmltZW50LCBsYW5kIGNvdmVyLCBhbmQgc2FtcGxpbmcgcGVyaW9kLgojIGNvbGxhcHNlIHRyZWF0bWVudCB2YXJpYWJsZSBpbnRvIGJpbmFyeSBjb250cm9sL3RyZWF0bWVudAphbGwuMTRjLnN1bS5kZiR0cmVhdC5iaSA8LSBpZmVsc2UoYWxsLjE0Yy5zdW0uZGYkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKCiMgSEVXMjIgY29udHJvbCBwcmUgcG9pbnQgZXhjbHVkZWQgdG8gbWFrZSBmaWd1cmUgbW9yZSByZWFkYWJsZSAKYWxsLjE0Yy5zdW0uZGYgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIG11dGF0ZShJRC50cmVhdCA9IHBhc3RlKElELCBUcmVhdG1lbnQpKSAlPiUKICBtdXRhdGUoSUQudHJlYXQuUGVyaW9kID0gcGFzdGUoSUQudHJlYXQsIFBlcmlvZCkpICU+JQogIGZpbHRlcihJRC50cmVhdC5QZXJpb2QgIT0gIkhFVzIyIGNvbnRyb2wgcHJlIikgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBJRC50cmVhdCkpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX21pbiwgCiAgICAgICAgeG1heCA9IG1nQ08yLkNfZ0NfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIGhlaWdodCA9IC45KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1NhbXBsaW5nIHBlcmlvZCAodHJlYXRtZW50KScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygxNiwgMTcsIDEsIDIpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJjb250cm9sIHByZSIgPSAncHJlLWluY3ViYXRpb25cbihjb250cm9sKScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihjb250cm9sKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpLCByb3dzID0gdmFycyhZZWFyU2FtcGxlZCkpICsKICB4bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmVkIEMgKG1nQ08nWzJdKictQycqJyBnIHNvaWwgQydeLTEqJyknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0PXVuaXQoLjgsICJjbSIpKQpgYGAKCj4qKlN1cHBsZW1lbnRhcnkgRmlnLiBgciB7c2ZpZy5uICsgMX1gLiBDaGFuZ2UgaW4gXjE0XkMtQ09+Mn4gaW4gcmVsYXRpb24gdG8gY3VtdWxhdGl2ZSBzb2lsIGNhcmJvbiByZXNwaXJlZCoqCgo+KkNhcHRpb246KiBOb3RlIHRoYXQgcHJlLWluY3ViYXRpb24gJFxEZWx0YSReMTReQyB3YXMgbm90IG1lYXN1cmVkIGZvciB0aGUgMjAxMSBjb250cm9sIHNhbXBsZXMuIExpbWl0cyBleGNsdWRlIG91dGxpZXIgcG9pbnQgKEhFVzIyIGNvbnRyb2wgcHJlLWluY3ViYXRpb24pIGZvciBpbXByb3ZlZCBsZWdpYmlsaXR5LiBbTm90IHBsYW5uaW5nIHRvIGluY2x1ZGUgdGhpcyBmaWd1cmUgaW4gdGhlIG1haW4gdGV4dCBhcyBJIHRoaW5rIGl0IGlzIGRpZmZpY3VsdCB0byBpbnRlcnByZXRdLgoKYGBge3IgcGxvdCBDIHJlc3AgdnMgMTRDIGF2ZXJhZ2VkIGJ5IGxhbmQgdXNlIGFuZCB0cmVhdG1lbnQsIGluY2x1ZGUgPSBGQUxTRX0KIyBBbHRlcm5hdGUgQy1yZXNwIHggMTRjIGZpZzogZGF0YSBhdmVyYWdlZCBieSBsYW5kIHVzZSBhbmQgdHJlYXRtZW50IHdpdGhpbiBzYW1wbGluZyBwZXJpb2RzCmFsbC4xNGMuc3VtMiAlPiUKICBtdXRhdGUodHJlYXQuUGVyaW9kID0gcGFzdGUodHJlYXQuYmksIFBlcmlvZCkpICU+JQogIGdncGxvdCguLCBhZXMobWdDTzIuQ19nQ19tZWFuLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IHRyZWF0LlBlcmlvZCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IFRyZWF0bWVudCkpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfdSwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl9sLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IG1nQ08yLkNfZ0NfdSwgCiAgICAgICAgeG1heCA9IG1nQ08yLkNfZ0NfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmR1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXNwaXJlZCBDIChtZ0NPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgpgYGB7ciBwbG90IDE0YyBieSBjIHJlc3Agd2l0aCBvdXRsaWVyLCBpbmNsdWRlID0gRkFMU0V9CiMgQ29kZSBmb3IgYSB0aGlyZCBwbG90IHdpdGggb3V0bGllciBkYXRhCiMgYXZlcmFnZSBjb250cm9sIGFuZCB0cmVhdG1lbnQgZGF0YQphbGwuMTRjLnN1bTMgPC0gc2VsZWN0KGFsbC4xNGMubHNbWzJdXSwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkLCBkMTRjX2NvcnIsIG1nQ08yLkNfZ0MpICU+JQogIGdyb3VwX2J5KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDE0Y19jb3JyX3NlID0gZDE0Y19jb3JyX3NkL25fbWVhbiwKICAgICAgICAgZDE0Y19jb3JyX3UgPSBkMTRjX2NvcnJfbWVhbiArIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBkMTRjX2NvcnJfbCA9IGQxNGNfY29ycl9tZWFuIC0gZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0Nfc2UgPSBtZ0NPMi5DX2dDX3NkL25fbWVhbiwKICAgICAgICAgbWdDTzIuQ19nQ191ID0gbWdDTzIuQ19nQ19tZWFuICsgbWdDTzIuQ19nQ19zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX2wgPSBtZ0NPMi5DX2dDX21lYW4gLSBtZ0NPMi5DX2dDX3NlKjIpIAoKYWxsLjE0Yy5zdW0zJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bTMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCJ0cmVhdG1lbnQiKQphbGwuMTRjLnN1bTMgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX3UsIAogICAgICAgIHhtYXggPSBtZ0NPMi5DX2dDX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnU2FtcGxpbmcgcGVyaW9kICh0cmVhdG1lbnQpJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKDE2LCAxNywgMSwgMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGNvbnRyb2wpJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGNvbnRyb2wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IHByZSIgPSAncHJlLWluY3ViYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksIHJvd3MgPSB2YXJzKFllYXJTYW1wbGVkKSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmVzcGlyZWQgQyAobWdDTydbMl0qJy1DJyonIGcgc29pbCBDJ14tMSonKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIikpCmBgYAoKIyMgVHJlYXRtZW50IGVmZmVjdCBvbiBeMTReQy1DT34yfiBmb3IgYWxsIHNhbXBsZXMgKEV4cGVyaW1lbnRzIDEsIDIsIGFuZCAzKQoKRGlmZmVyZW5jZSBiZXR3ZWVuIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBzYW1wbGVzIGZyb20gYWxsIGV4cGVyaW1lbnRzIHNob3cgdGhhdCB0cmVhdG1lbnQgZWZmZWN0cywgaS5lLiBhaXItZHJ5aW5nIGZvbGxvd2VkIGJ5IHJld2V0dGluZyBvciBhaXItZHJ5aW5nIGZvbGxvd2VkIGJ5IHN0b3JhZ2UgYW5kIHN1YnNlcXVlbnQgcmV3ZXR0aW5nLCB0eXBpY2FsbHkgcmVzdWx0IGluIGNoYW5nZXMgaW4gXjE0XkMtQ09+Mn4gYmV0d2VlbiDCsTIw4oCwIHRvIMKxNDDigLAsIHdpdGggdGhlIG1ham9yaXR5IHdpdGhpbiDCsTIw4oCwLiBUaGVzZSBkaWZmZXJlbmNlIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBkZWNsaW5lIGluIGF0bW9zcGhlcmljIHJhZGlvY2FyYm9uIG92ZXIgNSBhbmQgMTAgeWVhcnMsIHJlc3BlY3RpdmVseSwgZHVyaW5nIHRoZSBwZXJpb2Qgb2YgMjAwMCB0byAyMDIwLiBUaGUgc2FtcGxlcyBmcm9tIFRlbm5lc3NlZSAobWFnZW50YSBwb2ludHMpIGFyZSBhbiBleGNlcHRpb24uIEhvd2V2ZXIsIHRoZXNlIHBvaW50cyBkbyBub3Qgc2hvdyBvbmx5IGJvbWItQyBlbnJpY2htZW50LCBidXQgcmF0aGVyIHRoZSByZXN1bHRzIG9mIGV4cG9zdXJlIHRvIGEgbG9jYWxpemVkIHBsdW1lIG9mIF4xNF5DIGVucmljaGVkIENPfjJ+IGZyb20gYSBuZWFyYnkgaW5jaW5lcmF0b3IgZm91ciB5ZWFycyBwcmlvciB0byBzYW1wbGUgY29sbGVjdGlvbiAoVHJ1bWJvcmUgZXQgYWwuLCAyMDAyKS4gVHJlYXRtZW50IF4xNF5DLUNPfjJ+IGZvciB0aGVzZSBoaWdobHkgZW5yaWNoZWQgc2FtcGxlcyB3ZXJlIG1vcmUgZGVwbGV0ZWQgcmVsYXRpdmUgdG8gdGhlIGNvbnRyb2xzIHRoYW4gd2VyZSB0aGUgc2FtcGxlcyBvbmx5IGxhYmVsZWQgd2l0aCBib21iLUMuCgpHcmFzc2xhbmQgc2FtcGxlcyB0ZW5kIHRvIGJlIGFib3ZlIDE6MSBsaW5lLCB3aGlsZSBmb3Jlc3Qgc2FtcGxlcyBhcmUgZ2VuZXJhbGx5IGJlbG93LCByZWdhcmRsZXNzIG9mIG9yaWdpbi4gT25lIGV4Y2VwdGlvbiB0byB0aGlzIHRyZW5kIGlzIHRoZSB0aHJlZSBHZXJtYW4gZm9yZXN0IHNhbXBsZXMgdGhhdCBhcmUgYWJvdmUgMToxIGxpbmUsIHdoaWNoIHdlcmUgYW5hbHl6ZWQgaW4gMjAxOSAoYWlyLWRyeSBvbmx5IHRyZWF0bWVudCkuCmBgYHtyIHBsb3QgY3RsIHZzIHRydH0KIyBQbG90IG9uIDE6MSBsaW5lIHcvIGRpYWdvbmFsIGxpbmVzIHNob3dpbmcg4oCwIG9mZnNldHMKIyBmaXJzdCBjb2xsYXBzZSBzaXRlcyBmb3IgYmV0dGVyIHZpc3VhbHMKYWxsLjE0Yy5jdGwudHJ0ICU+JQogIGZpbHRlcihIb3Jpem9uID09ICJBIikgJT4lCiAgbXV0YXRlKExvY2F0aW9uID0gcmVjb2RlKFNpdGUsICEhIWxvYykpICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19jb3JyX21lYW5fY3RsLCBkMTRjX2NvcnJfbWVhbl90cnQsIGNvbG9yID0gTG9jYXRpb24sIHNoYXBlID0gVHlwZSkpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC0yMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC00MCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5fdHJ0LCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF90cnQsIAogICAgICAgIGNvbG9yID0gTG9jYXRpb24pLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfY29ycl9taW5fY3RsLCAKICAgICAgICB4bWF4ID0gZDE0Y19jb3JyX21heF9jdGwsIAogICAgICAgIGNvbG9yID0gTG9jYXRpb24pLCAKICAgIGhlaWdodCA9IC45KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoJ0R1a2UsIE5DJyA9ICcjMDFCQjk3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2llcnJhIE5ldmFkYSwgQ0EnID0gJyNGRkMxMDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDZW50cmFsIEdlcm1hbnknID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGFydmFyZCwgTUEnID0gJyMxRTg4RTUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPYWsgUmlkZ2UsIFROJyA9ICcjRDgxQjYwJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnPSAxNywnRycgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgeGxhYihleHByZXNzaW9uKCdDb250cm9sICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKCiMgZm9yIHBsb3R0aW5nIHdpdGggY29sb3IgPSBUeXBlIChjdXJyZW50bHkgc3VwcHJlc3NlZCkKIyBhbGwuMTRjLmN0bC50cnQgJT4lCiMgICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQojICAgbXV0YXRlKExvY2F0aW9uID0gZmFjdG9yKHJlY29kZShTaXRlLCAhISFsb2MpLCBleGNsdWRlID0gVFJVRSkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9jdGwsIGQxNGNfY29ycl9tZWFuX3RydCwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IExvY2F0aW9uKSkgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC0yMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtNDAsIGxpbmV0eXBlID0gImRvdGRhc2giKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3RkYXNoIikgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiMgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiMgICBnZW9tX2Vycm9yYmFyKAojICAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5fdHJ0LCAKIyAgICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4X3RydCwgCiMgICAgICAgICBjb2xvciA9IFR5cGUpLCAKIyAgICAgd2lkdGggPSAuMjUpICsKIyAgIGdlb21fZXJyb3JiYXJoKAojICAgICBhZXMoeG1pbiA9IGQxNGNfY29ycl9taW5fY3RsLCAKIyAgICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X2N0bCwgCiMgICAgICAgICBjb2xvciA9IFR5cGUpLCAKIyAgICAgaGVpZ2h0ID0gLjkpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmQgdXNlJywKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwojICAgeGxhYihleHByZXNzaW9uKCdDb250cm9sICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeWxhYihleHByZXNzaW9uKCdUcmVhdG1lbnQgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSwKIyAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCmBgYAo+KipGaWcuIGByIHtmaWcubiArIDR9YC4gRWZmZWN0IG9mIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZyArIHN0b3JhZ2Ugb24gXjE0XkMtQ09+Mn4qKgoKPipDYXB0aW9uOiogUG9pbnRzIHNob3cgZGF0YSBmcm9tIGFsbCB0aHJlZSBleHBlcmltZW50cy4gUG9pbnRzIGFyZSB0aGUgbWVhbiBvZiBsYWJvcmF0b3J5IHJlcGxpY2F0ZXMgKGZvciByZXBsaWNhdGVkIHNhbXBsZXMpOyBlcnJvciBiYXJzIGFyZSAyeCBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhbi4gU29saWQgbGluZSBpcyAxOjEsIHdoaWxlIHRoZSBkYXNoZWQgYW5kIGRvdHRlZCBsaW5lcyBzaG93IGRpZmZlcmVuY2VzIG9mIMKxMjDigLAgYW5kIMKxJDQw4oCwLCBlcXVpdmFsZW50IHRvIHRoZSBkZWNsaW5lIGluIGF0bW9zcGhlcmljIENPfjJ+IG92ZXIgNSBhbmQgMTAgeWVhcnMgcmVzcGVjdGl2ZWx5IGR1cmluZyB0aGUgcGVyaW9kIG9mIDIwMDAgdG8gMjAyMC4KCiMjIFN0b3JhZ2UgZHVyYXRpb24gZWZmZWN0IG9uIF4xNF5DLUNPfjJ+IChFeHBlcmltZW50IDMpCgpUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGV2aWRlbmNlIGZvciBhIHN0b3JhZ2UgZHVyYXRpb24gZWZmZWN0IGluIHRoZSBzYW1wbGVzIHRoYXQgb25seSBjb250YWluIGJvbWItQywgYWx0aG91Z2ggdGhlIHRyZW5kIGluIHRoZSBkaWZmZXJlbmNlcyBkdWUgdG8gdHJlYXRtZW50IGZvciB0aGUgaGlnaGx5IGVucmljaGVkIHNhbXBsZXMgZnJvbSBPYWsgUmlkZ2UsIFROIHN1Z2dlc3QgbG9zc2VzIG9mIHRoZSBtb3N0IHJlY2VudGx5IGZpeGVkIGNhcmJvbiBvdmVyIHRoZSBkdXJhdGlvbiBvZiBzdG9yYWdlLiBUaGVzZSBzYW1wbGVzIHdlcmUgaW5jbHVkZWQgcHJpbWFyaWx5IGJlY2F1c2UgaXQgd2FzIGFzc3VtZWQgdGhhdCB0aGV5IHdvdWxkIGJlIG1vcmUgc2Vuc2l0aXZlIHRvIHBvdGVudGlhbCBsb3NzZXMgb2YgcmVjZW50bHkgZml4ZWQgY2FyYm9uLCBhcyB0aGUgbGFiZWwgc2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpbiB0aGlzIHBvb2wgb2Ygc29pbCBDLiAKYGBge3J9CiMgRmlsdGVyIGRhdGEgdG8gImluYyIsIHNwbGl0IGJ5IGJpbmFyeSB0cmVhdG1lbnQgdmFyaWFibGUsIHRoZW4gbWVyZ2UKYWxsLjE0Yy5jdGwgPC0gYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkdHJlYXQuYmkgPT0gImNvbnRyb2wiICYgYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBdCmFsbC4xNGMuY3RsIDwtIHJlbmFtZV9hdChhbGwuMTRjLmN0bCwgdmFycyhjb250YWlucygnZDE0YycpKSwgbGlzdCh+cGFzdGUwKC4sICJfY3RsIikpKQphbGwuMTRjLnRydCA8LSBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiR0cmVhdC5iaSA9PSAidHJlYXRtZW50IiAmIGFsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAiaW5jIiwgXQphbGwuMTRjLnRydCA8LSByZW5hbWVfYXQoYWxsLjE0Yy50cnQsIHZhcnMoY29udGFpbnMoJ2QxNGMnKSksIGxpc3QofnBhc3RlMCguLCAiX3RydCIpKSkKYWxsLjE0Yy5jdGwudHJ0IDwtIGlubmVyX2pvaW4oZGF0YS5mcmFtZShhbGwuMTRjLmN0bCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChJRCwgRXhwZXJpbWVudCwgVHlwZSwgU2l0ZSwgSG9yaXpvbiwgY29udGFpbnMoImQxNGNfY29yciIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShhbGwuMTRjLnRydCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChJRCwgRXhwZXJpbWVudCwgVHlwZSwgU2l0ZSwgSG9yaXpvbiwgY29udGFpbnMoImQxNGNfY29yciIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiU2l0ZSIsICJIb3Jpem9uIikpCgojIEZpcnN0IGFkZCBZZWFyU2FtcGxlZCBhbmQgWWVhck1lYXN1cmVkIGNvbHVtbnMKYWxsLjE0Yy5jdGwudHJ0JFllYXJTYW1wbGVkIDwtIHVubGlzdChhbGwuMTRjLnN1bS5kZlttYXRjaChhbGwuMTRjLmN0bC50cnQkSUQsIGFsbC4xNGMuc3VtLmRmJElEKSwgIlllYXJTYW1wbGVkIl0pCiMgY29ycmVjdCBhcmNoaXZlIHNhbXBsZSBZZWFyU2FtcGxlZAphbGwuMTRjLmN0bC50cnRbYWxsLjE0Yy5jdGwudHJ0JEV4cGVyaW1lbnQgPT0gImFyYyIgJiBhbGwuMTRjLmN0bC50cnQkU2l0ZSA9PSAiSGFpbmljaCIsICJZZWFyU2FtcGxlZCJdIDwtIDIwMTEKCiMgYWRkIHllYXIgbWVhc3VyZWQgY29sdW1uLCBtb2RpZnkgZm9yIHRtZS5taXNjIHNhbXBsZXMsIHJld2V0IHNhbXBsZXMKYWxsLjE0Yy5jdGwudHJ0JFllYXJNZWFzdXJlZCA8LSAyMDE4CmFsbC4xNGMuY3RsLnRydFthbGwuMTRjLmN0bC50cnQkRXhwZXJpbWVudCA9PSAicmV3ZXQiLCAiWWVhck1lYXN1cmVkIl0gPC0gMjAxOQphbGwuMTRjLmN0bC50cnRbd2hpY2goYWxsLjE0Yy5jdGwudHJ0JElEICVpbiUgdG1lLm1pc2MkSUQpLCAiWWVhck1lYXN1cmVkIl0gPC0gMjAwOQoKIyBjYWxjdWxhdGUgc3RvcmFnZSBkdXJhdGlvbiBudW1lcmljYWxseSBhbmQgYXMgZmFjdG9yCmFsbC4xNGMuY3RsLnRydCR0bWUgPC0gdW5saXN0KGFsbC4xNGMuY3RsLnRydCRZZWFyTWVhc3VyZWQgLSBhbGwuMTRjLmN0bC50cnQkWWVhclNhbXBsZWQpCmFsbC4xNGMuY3RsLnRydCR0bWUuZiA8LSBmYWN0b3IoYWxsLjE0Yy5jdGwudHJ0JHRtZSkKCiMgYWRkIGRpZmZlcmVuY2UgY29sdW1uCiMgKGV4cHJlc3NlZCBhcyBkaWZmZXJlbmNlIG9mIG1lYW5zKQphbGwuMTRjLmN0bC50cnQkY3RsLnRydC5kMTQgPC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX2N0bCAtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl90cnQKCiMgIyBhZGQgYXRtIDE0QyBmb3IgeWVhciBzYW1wbGVkIGFuZCBjYWxjdWxhdGUgZGVsdGEtZGVsdGEKIyBhbGwuMTRjLmN0bC50cnQkYXRtLnlyLnNhbXBsZWQgPC0gRGF0bVttYXRjaChhbGwuMTRjLmN0bC50cnQkWWVhclNhbXBsZWQsIGZsb29yKERhdG0kRGF0ZSkpLCAiTkhjMTQiXQojIGFsbC4xNGMuY3RsLnRydCRkZC5jdGwgPC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX2N0bCAtIGFsbC4xNGMuY3RsLnRydCRhdG0ueXIuc2FtcGxlZAojIGFsbC4xNGMuY3RsLnRydCRkZC50cnQgPC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX3RydCAtIGFsbC4xNGMuY3RsLnRydCRhdG0ueXIuc2FtcGxlZAojIGFsbC4xNGMuY3RsLnRydCRjdGwudHJ0LmRkMTQgPC0gYWxsLjE0Yy5jdGwudHJ0JGRkLmN0bCAtIGFsbC4xNGMuY3RsLnRydCRkZC50cnQKCiMgbGlzdCBvZiBsb2NhdGlvbnMgZm9yIHJlY29kaW5nCmxvYyA8LSBsaXN0KAogICAgIkR1a2UiID0gIkR1a2UsIE5DIiwKICAgICJIb3dsYW5kIiA9ICJIb3dsYW5kLCBNRSIsCiAgICAiSGFydmFyZCIgPSAiSGFydmFyZCwgTUEiLAogICAgIkhhaW5pY2giID0gIkNlbnRyYWwgR2VybWFueSIsCiAgICAiU2Nob3JmaGVpZGUiID0gIkNlbnRyYWwgR2VybWFueSIsCiAgICAiTXVzaWNrIiA9ICJTaWVycmEgTmV2YWRhLCBDQSIsCiAgICAiU2hhdmVyIiA9ICJTaWVycmEgTmV2YWRhLCBDQSIsCiAgICAiV2Fsa2VyIEJyYW5jaCIgPSAiT2FrIFJpZGdlLCBUTiIsCiAgICAiVGVubmVzc2VlIFZhbGxleSIgPSAiT2FrIFJpZGdlLCBUTiIpCgojIFBsb3Qgc3RvcmFnZSBkdXJhdGlvbgpzdXBwcmVzc1dhcm5pbmdzKAogIGFsbC4xNGMuY3RsLnRydCAlPiUKICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJyZXdldCIpICU+JQogIHNlbGVjdChUeXBlLCB0bWUuZiwgU2l0ZSwgY3RsLnRydC5kMTQsIHRtZSkgJT4lCiAgZ3JvdXBfYnkoVHlwZSwgdG1lLmYsIFNpdGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGRpZl9zZSA9IGN0bC50cnQuZDE0X3NkL25fbWVhbiwKICAgICAgICAgZGlmX3UgPSBjdGwudHJ0LmQxNF9tZWFuICsgZGlmX3NlKjIsCiAgICAgICAgIGRpZl9sID0gY3RsLnRydC5kMTRfbWVhbiAtIGRpZl9zZSoyKSAlPiUKICBtdXRhdGUoTG9jYXRpb24gPSBmYWN0b3IocmVjb2RlKFNpdGUsICEhIWxvYyksIGV4Y2x1ZGUgPSBUUlVFKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh0bWVfbWVhbiwgY3RsLnRydC5kMTRfbWVhbiwgY29sb3IgPSBMb2NhdGlvbiwgc2hhcGUgPSBUeXBlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIod2lkdGggPSAuNywgcHJlc2VydmUgPSAic2luZ2xlIikpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkaWZfbCwKICAgICAgICB5bWF4ID0gZGlmX3UsIAogICAgICAgIGNvbG9yID0gTG9jYXRpb24pLAogICAgd2lkdGggPSAuNywKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjcsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoJ0R1a2UsIE5DJyA9ICcjMDFCQjk3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2llcnJhIE5ldmFkYSwgQ0EnID0gJyNGRkMxMDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDZW50cmFsIEdlcm1hbnknID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGFydmFyZCwgTUEnID0gJyMxRTg4RTUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPYWsgUmlkZ2UsIFROJyA9ICcjRDgxQjYwJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnPSAxNywnRycgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgeWxhYihleHByZXNzaW9uKCdDb250cm9sIC0gVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoIlN0b3JhZ2UgZHVyYXRpb24gKHllYXJzKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQogICkKYGBgCgo+KipGaWcuIGByIHtmaWcubiArIDV9YC4gQ2hhbmdlIGluIF4xNF5DLUNPfjJ+IGluIHJlbGF0aW9uIHRvIHN0b3JhZ2UgZHVyYXRpb24qKgoKPipDYXB0aW9uOiogUG9pbnRzIHNob3cgZGF0YSBmcm9tIGJvdGggRXhwZXJpbWVudCAxIChpbiBibGFjaykgYW5kIEV4cGVyaW1lbnQgMyAoYWxsIG90aGVyIHBvaW50cykuIERhc2hlZCBhbmQgZG90dGVkIGxpbmVzIHNob3cgYSBkaWZmZXJlbmNlIG9mIDIw4oCwIGFuZCA0MOKAsCwgZXF1aXZhbGVudCB0byB0aGUgYXRtb3NwaGVyaWMgZGVjbGluZSBvdmVyIGZpdmUgYW5kIDEwIHllYXJzIHJlc3BlY3RpdmVseSBmb3IgdGhlIHBlcmlvZCAyMDAwIHRvIDIwMjAuIFBvc2l0aW9uIG9mIHBvaW50cyBqaXR0ZXJlZCB0byBhdm9pZCBvdmVycGxvdHRpbmc7IHN0b3JhZ2UgZHVyYXRpb24gaGFzIGJlZW4gcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IHdob2xlIHllYXIuCgpUaGUgdHJlbmQgaW4gdGhlIGRpZmZlcmVuY2VzIGR1ZSB0byB0cmVhdG1lbnQgZm9yIHRoZSBoaWdobHkgZW5yaWNoZWQgc2FtcGxlcyBmcm9tIE9hayBSaWRnZSwgVE4gc3VnZ2VzdCBsb3NzZXMgb2YgdGhlIG1vc3QgcmVjZW50bHkgZml4ZWQgY2FyYm9uIG92ZXIgdGhlIGR1cmF0aW9uIG9mIHN0b3JhZ2UuIFRoZSBUTiBzYW1wbGVzIHdlcmUgaW5jbHVkZWQgcHJpbWFyaWx5IGJlY2F1c2UgaXQgd2FzIGFzc3VtZWQgdGhhdCB0aGV5IHdvdWxkIGJlIG1vcmUgc2Vuc2l0aXZlIHRvIHBvdGVudGlhbCBsb3NzZXMgb2YgcmVjZW50bHkgZml4ZWQgY2FyYm9uLCBhcyB0aGUgbGFiZWwgc2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpbiB0aGlzIHBvb2wgb2Ygc29pbCBDLiBIb3dldmVyLCBpbiBjb250cmFzdCwgdGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZSBldmlkZW5jZSBmb3IgYSBzdG9yYWdlIGR1cmF0aW9uIGVmZmVjdCBpbiB0aGUgc2FtcGxlcyB0aGF0IG9ubHkgY29udGFpbiBib21iLUMuCgoKIyBEaXNjdXNzaW9uCgoqUmFuZG9tIG5vdGVzIGhlcmUuLi4qCgoqRWZmZWN0IG9mIEMgcmVzcGlyZWQqCmBgYHtyIHNvbS0xNGMtY2FsY3MsIGluY2x1ZGUgPSBGQUxTRX0KIyByZWFkIDE0QyBTT00gZGF0YQpleHAuc29tMTRjIDwtIHJlYWQueGxzeCgiLi4vZGF0YS9leHRlcm5hbC9leHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLXNvbV8yMDExLzE3MDIyOF8xNENfU09NLnhsc3giKQpleHAuc29tMTRjICU+JSAKICBmaWx0ZXIoRXhwbG9yYXRvcnkgIT0gIkEiKSAlPiUKICBncm91cF9ieShFeHBsb3JhdG9yeSwgVHlwZSkgJT4lCiAgc3VtbWFyaXplKG1lYW4gPSBtZWFuKGAxNENfU09NYCkpCmBgYAo=